@@ -730,6 +730,19 @@ func (r *remoteReporter) createSnapshot() (*Snapshot, error) {
730730}
731731return nil
732732})
733+ eg .Go (func ()error {
734+ dbTasks ,err := r .options .Database .ListTasks (ctx , database.ListTasksParams {
735+ OwnerID :uuid .Nil ,
736+ OrganizationID :uuid .Nil ,
737+ })
738+ if err != nil {
739+ return err
740+ }
741+ for _ ,dbTask := range dbTasks {
742+ snapshot .Tasks = append (snapshot .Tasks ,ConvertTask (dbTask ))
743+ }
744+ return nil
745+ })
733746
734747err := eg .Wait ()
735748if err != nil {
@@ -1205,6 +1218,7 @@ type Snapshot struct {
12051218Workspaces []Workspace `json:"workspaces"`
12061219NetworkEvents []NetworkEvent `json:"network_events"`
12071220Organizations []Organization `json:"organizations"`
1221+ Tasks []Task `json:"tasks"`
12081222TelemetryItems []TelemetryItem `json:"telemetry_items"`
12091223UserTailnetConnections []UserTailnetConnection `json:"user_tailnet_connections"`
12101224PrebuiltWorkspaces []PrebuiltWorkspace `json:"prebuilt_workspaces"`
@@ -1753,6 +1767,35 @@ type Organization struct {
17531767CreatedAt time.Time `json:"created_at"`
17541768}
17551769
1770+ type Task struct {
1771+ ID uuid.UUID `json:"id"`
1772+ OrganizationID uuid.UUID `json:"organization_id"`
1773+ OwnerID uuid.UUID `json:"owner_id"`
1774+ Name string `json:"name"`
1775+ WorkspaceID uuid.NullUUID `json:"workspace_id"`
1776+ TemplateVersionID uuid.UUID `json:"template_version_id"`
1777+ TemplateParametersHash string `json:"template_parameters_hash"` // Parameters are hashed for privacy.
1778+ PromptHash string `json:"hashed_prompt"` // Prompt is hashed for privacy.
1779+ CreatedAt time.Time `json:"created_at"`
1780+ Status string `json:"status"`
1781+ }
1782+
1783+ // ConvertTask anonymizes a Task.
1784+ func ConvertTask (task database.Task )Task {
1785+ return Task {
1786+ ID :task .ID ,
1787+ OrganizationID :task .OrganizationID ,
1788+ OwnerID :task .OwnerID ,
1789+ Name :task .Name ,
1790+ WorkspaceID :task .WorkspaceID ,
1791+ TemplateVersionID :task .TemplateVersionID ,
1792+ TemplateParametersHash :fmt .Sprintf ("%x" ,sha256 .New ().Sum (task .TemplateParameters )),
1793+ PromptHash :fmt .Sprintf ("%x" ,sha256 .New ().Sum ([]byte (task .Prompt ))),
1794+ CreatedAt :task .CreatedAt ,
1795+ Status :string (task .Status ),
1796+ }
1797+ }
1798+
17561799type telemetryItemKey string
17571800
17581801// The comment below gets rid of the warning that the name "TelemetryItemKey" has