@crewx/sdk 0.9.0-rc.10 → 0.9.0-rc.101

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (224) hide show
  1. package/README.md +1 -1
  2. package/dist/account/auth-client.d.ts +61 -0
  3. package/dist/account/auth-json-v2.d.ts +1 -0
  4. package/dist/account/auth-json.d.ts +30 -0
  5. package/dist/account/config.d.ts +37 -0
  6. package/dist/account/env-bootstrap.d.ts +5 -0
  7. package/dist/account/errors.d.ts +24 -0
  8. package/dist/account/index.d.ts +12 -0
  9. package/dist/account/index.js +2 -0
  10. package/dist/account/session-manager.d.ts +47 -0
  11. package/dist/activity-log/builder.d.ts +55 -6
  12. package/dist/agent/agent-list-view.d.ts +19 -0
  13. package/dist/config/canonicalize-agent-options.d.ts +17 -0
  14. package/dist/config/global-settings.d.ts +33 -0
  15. package/dist/config/migrate-grok-mode.d.ts +6 -0
  16. package/dist/config/model-compat.d.ts +31 -0
  17. package/dist/config/models.generated.d.ts +37 -0
  18. package/dist/config/models.remote.d.ts +1 -0
  19. package/dist/config/overdrive.d.ts +7 -0
  20. package/dist/config/pricing.d.ts +8 -5
  21. package/dist/config/pricing.generated.d.ts +4 -0
  22. package/dist/config/pricing.types.d.ts +4 -10
  23. package/dist/config/timeout.config.d.ts +3 -0
  24. package/dist/config/wi-boards.d.ts +19 -0
  25. package/dist/context-budget/continuity.d.ts +61 -0
  26. package/dist/context-budget/index.d.ts +140 -0
  27. package/dist/conversation/index.d.ts +1 -1
  28. package/dist/conversation/sqlite-provider.d.ts +5 -1
  29. package/dist/conversation/to-template-messages.d.ts +9 -0
  30. package/dist/conversation/types.d.ts +44 -0
  31. package/dist/desktop/command-runner.d.ts +4 -0
  32. package/dist/desktop/default-adapters.d.ts +4 -0
  33. package/dist/desktop/global-install.d.ts +19 -0
  34. package/dist/desktop/index.d.ts +3 -0
  35. package/dist/desktop/index.js +3 -0
  36. package/dist/desktop/install.d.ts +5 -0
  37. package/dist/desktop/lnk.d.ts +22 -0
  38. package/dist/desktop/manifest.d.ts +21 -0
  39. package/dist/desktop/types.d.ts +67 -0
  40. package/dist/desktop/version.d.ts +1 -0
  41. package/dist/desktop/windows-paths.d.ts +21 -0
  42. package/dist/desktop/wrapper.d.ts +18 -0
  43. package/dist/esm/account/index.js +2 -0
  44. package/dist/esm/desktop/index.js +3 -0
  45. package/dist/esm/index.js +623 -111
  46. package/dist/esm/plugins/index.js +252 -111
  47. package/dist/esm/process/index.js +1 -0
  48. package/dist/esm/publish/index.js +1 -0
  49. package/dist/esm/repository/index.js +319 -101
  50. package/dist/esm/testing/index.js +1 -1
  51. package/dist/events/types.d.ts +5 -0
  52. package/dist/facade/Crewx.d.ts +51 -3
  53. package/dist/highlight/thread-highlight-prompt.d.ts +2 -0
  54. package/dist/highlight/thread-highlighter.d.ts +326 -0
  55. package/dist/index.browser.d.ts +11 -1
  56. package/dist/index.browser.js +6 -2
  57. package/dist/index.d.ts +94 -13
  58. package/dist/index.js +623 -111
  59. package/dist/internal/console-decoder.d.ts +38 -0
  60. package/dist/internal/windows-spawn.d.ts +10 -0
  61. package/dist/layout/types.d.ts +17 -1
  62. package/dist/lifecycle/task-heartbeat.d.ts +41 -0
  63. package/dist/lifecycle/task-stop.d.ts +79 -0
  64. package/dist/local-server/base-url.d.ts +18 -0
  65. package/dist/local-server/index.d.ts +8 -0
  66. package/dist/local-server/opencode.d.ts +8 -0
  67. package/dist/local-server/probe.d.ts +3 -0
  68. package/dist/local-server/runtime.d.ts +26 -0
  69. package/dist/local-server/types.d.ts +43 -0
  70. package/dist/mcp-app/errors.d.ts +7 -0
  71. package/dist/mcp-app/index.d.ts +8 -0
  72. package/dist/mcp-app/installed-app-ref.d.ts +25 -0
  73. package/dist/mcp-app/projection.d.ts +12 -0
  74. package/dist/mcp-app/registry.d.ts +7 -0
  75. package/dist/mcp-app/types.d.ts +165 -0
  76. package/dist/migrations/0008_careful_black_bird.sql +17 -0
  77. package/dist/migrations/0009_hot_dark_phoenix.sql +1 -0
  78. package/dist/migrations/0010_analyze_stats.sql +6 -0
  79. package/dist/migrations/0011_far_black_tarantula.sql +1 -0
  80. package/dist/migrations/0012_blue_turbo.sql +23 -0
  81. package/dist/migrations/0013_hesitant_adam_destine.sql +15 -0
  82. package/dist/migrations/0014_organic_mongu.sql +73 -0
  83. package/dist/migrations/0015_panoramic_gorilla_man.sql +71 -0
  84. package/dist/migrations/0016_fuzzy_hemingway.sql +14 -0
  85. package/dist/migrations/0017_project_stage_sdk_migration.sql +29 -0
  86. package/dist/migrations/0018_bored_jackal.sql +33 -0
  87. package/dist/migrations/0019_backfill_task_thread_ids.sql +74 -0
  88. package/dist/migrations/0020_useful_iron_lad.sql +55 -0
  89. package/dist/migrations/0021_dashing_peter_quill.sql +51 -0
  90. package/dist/migrations/0022_wandering_bucky.sql +1 -0
  91. package/dist/migrations/0023_red_payback.sql +1 -0
  92. package/dist/migrations/0024_storage_metadata.sql +262 -0
  93. package/dist/migrations/0025_task_heartbeat.sql +8 -0
  94. package/dist/migrations/0025_thread_app_instance_ledger.sql +2 -0
  95. package/dist/migrations/0026_mcp_action_source.sql +47 -0
  96. package/dist/migrations/meta/0008_snapshot.json +1327 -0
  97. package/dist/migrations/meta/0009_snapshot.json +1335 -0
  98. package/dist/migrations/meta/0010_snapshot.json +1335 -0
  99. package/dist/migrations/meta/0011_snapshot.json +1342 -0
  100. package/dist/migrations/meta/0012_snapshot.json +1494 -0
  101. package/dist/migrations/meta/0013_snapshot.json +1592 -0
  102. package/dist/migrations/meta/0014_snapshot.json +1975 -0
  103. package/dist/migrations/meta/0015_snapshot.json +2315 -0
  104. package/dist/migrations/meta/0016_snapshot.json +2419 -0
  105. package/dist/migrations/meta/0017_snapshot.json +2419 -0
  106. package/dist/migrations/meta/0018_snapshot.json +2570 -0
  107. package/dist/migrations/meta/0020_snapshot.json +2895 -0
  108. package/dist/migrations/meta/0021_snapshot.json +3031 -0
  109. package/dist/migrations/meta/0022_snapshot.json +3039 -0
  110. package/dist/migrations/meta/0023_snapshot.json +3047 -0
  111. package/dist/migrations/meta/_journal.json +141 -1
  112. package/dist/paths.d.ts +1 -0
  113. package/dist/plugin/types.d.ts +1 -0
  114. package/dist/plugins/index.d.ts +1 -1
  115. package/dist/plugins/index.js +252 -111
  116. package/dist/plugins/sqlite-tracing.d.ts +44 -0
  117. package/dist/process/index.d.ts +2 -0
  118. package/dist/process/index.js +1 -0
  119. package/dist/process/process-control.d.ts +41 -0
  120. package/dist/prompt/tag-names.d.ts +18 -0
  121. package/dist/provider/acp/connection.d.ts +6 -0
  122. package/dist/provider/acp/meta.d.ts +11 -0
  123. package/dist/provider/bridge.d.ts +6 -0
  124. package/dist/provider/classify-task-error.d.ts +2 -0
  125. package/dist/provider/cli/adapter.types.d.ts +8 -1
  126. package/dist/provider/cli/adapters/agent-call.util.d.ts +1 -1
  127. package/dist/provider/cli/adapters/cli-knob.util.d.ts +7 -0
  128. package/dist/provider/cli/adapters/event-timestamp.util.d.ts +1 -0
  129. package/dist/provider/cli/adapters/grok.d.ts +2 -0
  130. package/dist/provider/cli/adapters/index.d.ts +1 -0
  131. package/dist/provider/cli/index.d.ts +1 -1
  132. package/dist/provider/cli/meta.d.ts +5 -0
  133. package/dist/provider/cli/protocol-envelope.d.ts +2 -0
  134. package/dist/provider/errors.d.ts +1 -0
  135. package/dist/provider/idle-watchdog.d.ts +19 -0
  136. package/dist/provider/models.d.ts +17 -12
  137. package/dist/provider/order.d.ts +1 -1
  138. package/dist/provider/parse-usage.d.ts +6 -0
  139. package/dist/provider/provider-selection.d.ts +8 -0
  140. package/dist/provider/redact-technical-message.d.ts +1 -0
  141. package/dist/provider/task-error.types.d.ts +17 -0
  142. package/dist/publish/constants.d.ts +6 -0
  143. package/dist/publish/index.d.ts +26 -0
  144. package/dist/publish/index.js +1 -0
  145. package/dist/publish/manifest.d.ts +17 -0
  146. package/dist/publish/marketplace-api.constants.d.ts +1 -0
  147. package/dist/publish/pack.d.ts +2 -0
  148. package/dist/publish/scan.d.ts +9 -0
  149. package/dist/publish/secrets.d.ts +6 -0
  150. package/dist/publish/upload.d.ts +18 -0
  151. package/dist/remote/execution-profile.d.ts +9 -0
  152. package/dist/remote/index.d.ts +1 -0
  153. package/dist/remote/types.d.ts +28 -0
  154. package/dist/repository/agent-suggestion.repository.d.ts +34 -0
  155. package/dist/repository/base-sqlite-repository.d.ts +1 -0
  156. package/dist/repository/common-code.repository.d.ts +45 -0
  157. package/dist/repository/db.d.ts +12 -1
  158. package/dist/repository/index.d.ts +38 -5
  159. package/dist/repository/index.js +319 -101
  160. package/dist/repository/notification.repository.d.ts +58 -0
  161. package/dist/repository/project.repository.d.ts +90 -0
  162. package/dist/repository/request-log.repository.d.ts +1 -0
  163. package/dist/repository/storage-metadata.repository.d.ts +64 -0
  164. package/dist/repository/task-log-migration.d.ts +74 -0
  165. package/dist/repository/task-log.repository.d.ts +44 -0
  166. package/dist/repository/task-status.d.ts +14 -0
  167. package/dist/repository/task.repository.d.ts +215 -7
  168. package/dist/repository/thread-history.repository.d.ts +193 -0
  169. package/dist/repository/thread-title.types.d.ts +29 -0
  170. package/dist/repository/thread.repository.d.ts +21 -2
  171. package/dist/repository/usage-backfill.d.ts +62 -0
  172. package/dist/repository/usage-from-logs.d.ts +21 -0
  173. package/dist/repository/usage-report.repository.d.ts +27 -0
  174. package/dist/repository/workspace.repository.d.ts +3 -0
  175. package/dist/schema/agent-suggestions.d.ts +199 -0
  176. package/dist/schema/common-codes.d.ts +216 -0
  177. package/dist/schema/index.d.ts +10 -0
  178. package/dist/schema/notifications.d.ts +303 -0
  179. package/dist/schema/projects.d.ts +610 -0
  180. package/dist/schema/storage-metadata.d.ts +181 -0
  181. package/dist/schema/task-log-events.d.ts +119 -0
  182. package/dist/schema/tasks.d.ts +108 -0
  183. package/dist/schema/thread-history.d.ts +734 -0
  184. package/dist/schema/threads.d.ts +2 -0
  185. package/dist/schema/ui-action-receipts.d.ts +303 -0
  186. package/dist/schema/ui-instances.d.ts +286 -0
  187. package/dist/schema/usage-reports.d.ts +252 -0
  188. package/dist/schema/workspaces.d.ts +17 -0
  189. package/dist/task-log/anchor-child-tasks.d.ts +7 -0
  190. package/dist/task-log/delegation-trailer.d.ts +34 -0
  191. package/dist/template/engine.d.ts +2 -2
  192. package/dist/template/helpers/exec.browser.d.ts +4 -3
  193. package/dist/template/helpers/exec.d.ts +4 -3
  194. package/dist/template/types.d.ts +20 -0
  195. package/dist/testing/index.js +1 -1
  196. package/dist/types/index.d.ts +1541 -3
  197. package/dist/types/task-log.types.d.ts +2 -0
  198. package/dist/ui-card/index.d.ts +2 -0
  199. package/dist/ui-card/legacy-card-parser.d.ts +11 -0
  200. package/dist/ui-instance/definition.d.ts +6 -0
  201. package/dist/ui-instance/errors.d.ts +17 -0
  202. package/dist/ui-instance/index.d.ts +9 -0
  203. package/dist/ui-instance/json.d.ts +5 -0
  204. package/dist/ui-instance/runtime.d.ts +13 -0
  205. package/dist/ui-instance/store.d.ts +98 -0
  206. package/dist/ui-instance/types.d.ts +206 -0
  207. package/dist/ui-plugin/index.d.ts +3 -0
  208. package/dist/ui-plugin/manifest.d.ts +3 -0
  209. package/dist/ui-plugin/types.d.ts +76 -0
  210. package/dist/ui-plugin/validator.d.ts +9 -0
  211. package/dist/utils/crewx-executable.d.ts +54 -0
  212. package/dist/utils/crewx-home.d.ts +1 -0
  213. package/dist/utils/env-defaults.d.ts +2 -0
  214. package/dist/utils/id.d.ts +1 -1
  215. package/dist/utils/runner-env.d.ts +3 -0
  216. package/dist/utils/timestamp.d.ts +1 -0
  217. package/dist/wi/create.d.ts +48 -0
  218. package/dist/wi/select.d.ts +20 -0
  219. package/package.json +33 -2
  220. package/templates/agents/default.yaml +266 -127
  221. package/templates/documents/crewx-manual.md +138 -138
  222. package/templates/documents/crewx-quick-guide.md +1 -1
  223. package/templates/workflows/wi-default-flow.yaml +65 -0
  224. package/templates/workflows/wi-plan-flow.yaml +140 -0
@@ -0,0 +1,58 @@
1
+ import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
+ import { notifications, notification_reads } from '../schema/index.js';
3
+ export declare const DEFAULT_NOTIFICATION_CAP = 500;
4
+ export type NotificationRow = typeof notifications.$inferSelect;
5
+ export type NewNotification = typeof notifications.$inferInsert;
6
+ export type NotificationReadRow = typeof notification_reads.$inferSelect;
7
+ export type NotificationLevel = 'info' | 'warning' | 'critical';
8
+ export type NotificationSource = 'agent' | 'system';
9
+ export interface CreateNotificationInput {
10
+ workspaceId: string;
11
+ agentId?: string | null;
12
+ taskId?: string | null;
13
+ threadId?: string | null;
14
+ source?: NotificationSource;
15
+ level?: NotificationLevel;
16
+ title: string;
17
+ body?: string | null;
18
+ targetUserId?: string | null;
19
+ metadata?: string | null;
20
+ }
21
+ export interface NotificationListItem extends NotificationRow {
22
+ read: boolean;
23
+ read_at: string | null;
24
+ }
25
+ export interface ListNotificationsParams {
26
+ workspaceId: string;
27
+ userId: string;
28
+ limit?: number;
29
+ }
30
+ export interface UserScope {
31
+ workspaceId: string;
32
+ userId: string;
33
+ }
34
+ export interface MarkReadParams {
35
+ notificationId: string;
36
+ workspaceId: string;
37
+ userId: string;
38
+ }
39
+ export declare const DEFAULT_LIST_LIMIT = 50;
40
+ export declare class NotificationRepository extends BaseSqliteRepository {
41
+ private readonly dbPath?;
42
+ private readonly cap;
43
+ constructor(opts?: {
44
+ dbPath?: string;
45
+ dbRoot?: string;
46
+ cap?: number;
47
+ });
48
+ resolveDbPath(): string;
49
+ private openHandle;
50
+ create(input: CreateNotificationInput): {
51
+ id: string;
52
+ };
53
+ private enforceCap;
54
+ list(params: ListNotificationsParams): NotificationListItem[];
55
+ unreadCount(params: UserScope): number;
56
+ markRead(params: MarkReadParams): boolean;
57
+ markAllRead(params: UserScope): number;
58
+ }
@@ -0,0 +1,90 @@
1
+ import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
+ import type { Project as ProjectLedgerRow, ProjectCriterion as ProjectCriterionRow, ProjectEvent as ProjectEventRow } from '../schema/index.js';
3
+ export type ProjectScene = 'planning' | 'plan_review' | 'running' | 'human_wait' | 'limit_wait' | 'failed_stop' | 'analyzing_feedback' | 'replanned' | 'awaiting_review' | 'accepted';
4
+ export type CriterionVerifyStatus = 'pending' | 'verifying' | 'passed' | 'failed';
5
+ export type ProjectActorType = 'user' | 'project_manager' | 'system';
6
+ export type ProjectEventType = 'created' | 'plan_proposed' | 'plan_approved' | 'decision_requested' | 'decision_answered' | 'replanned' | 'stage_advanced' | 'criterion_verified' | 'scene_changed' | 'result_submitted' | 'accepted';
7
+ export type ProjectEvidenceKind = 'task' | 'wi' | 'url';
8
+ export interface ProjectStage {
9
+ key: string;
10
+ labelOverride: string | null;
11
+ }
12
+ export declare const DEFAULT_PROJECT_STAGE_KEYS: readonly ["outcome_plan", "contract_check", "feature_link", "use_verify", "result_review"];
13
+ export declare const DEFAULT_PROJECT_STAGES: readonly ProjectStage[];
14
+ export interface ProjectEvidence {
15
+ kind: ProjectEvidenceKind;
16
+ ref: string;
17
+ label?: string;
18
+ }
19
+ export interface ProjectActorInput {
20
+ actorType?: ProjectActorType;
21
+ actorId?: string | null;
22
+ }
23
+ export interface CreateProjectInput {
24
+ workspaceId: string;
25
+ name: string;
26
+ outcome: string;
27
+ dueDate?: string | null;
28
+ stages?: readonly ProjectStage[];
29
+ criteria: readonly string[];
30
+ }
31
+ export interface ListProjectsOptions {
32
+ includeArchived?: boolean;
33
+ }
34
+ export interface ListProjectEventsOptions {
35
+ afterSeq?: number;
36
+ limit?: number;
37
+ }
38
+ export interface AppendProjectEventInput extends ProjectActorInput {
39
+ projectId: string;
40
+ type: ProjectEventType;
41
+ title: string;
42
+ summary?: string | null;
43
+ payload?: Record<string, unknown>;
44
+ }
45
+ export interface SetCriterionVerifyInput extends ProjectActorInput {
46
+ projectId?: string;
47
+ criterionId: string;
48
+ verifyStatus?: CriterionVerifyStatus;
49
+ status?: CriterionVerifyStatus;
50
+ }
51
+ export interface SetCriterionEvidenceInput extends ProjectActorInput {
52
+ projectId?: string;
53
+ criterionId: string;
54
+ evidence: readonly ProjectEvidence[];
55
+ }
56
+ export interface AcceptProjectInput extends ProjectActorInput {
57
+ remainingRisks: unknown;
58
+ nextPlan: unknown;
59
+ lessons: unknown;
60
+ evidenceRefs: unknown;
61
+ }
62
+ export interface ProjectDetail extends ProjectLedgerRow {
63
+ stages: ProjectStage[];
64
+ criteria: ProjectCriterionRow[];
65
+ }
66
+ export declare class ProjectRepository extends BaseSqliteRepository {
67
+ private readonly dbPath?;
68
+ constructor(opts?: {
69
+ dbPath?: string;
70
+ dbRoot?: string;
71
+ });
72
+ resolveDbPath(): string;
73
+ private openHandle;
74
+ private getDetailFromHandle;
75
+ private getDetailOrThrow;
76
+ createProject(input: CreateProjectInput): ProjectDetail;
77
+ getProject(id: string): ProjectDetail | undefined;
78
+ listProjectsByWorkspace(workspaceId: string, options?: ListProjectsOptions): ProjectDetail[];
79
+ archiveProject(id: string): ProjectDetail;
80
+ setScene(id: string, scene: ProjectScene, actor?: ProjectActorInput): ProjectDetail;
81
+ setStageIndex(id: string, index: number, actor?: ProjectActorInput): ProjectDetail;
82
+ setCriterionVerify(input: SetCriterionVerifyInput): ProjectCriterionRow;
83
+ setCriterionVerify(projectId: string, criterionId: string, status: CriterionVerifyStatus, actor?: ProjectActorInput): ProjectCriterionRow;
84
+ setCriterionEvidence(input: SetCriterionEvidenceInput): ProjectCriterionRow;
85
+ setCriterionEvidence(projectId: string, criterionId: string, evidence: readonly ProjectEvidence[], actor?: ProjectActorInput): ProjectCriterionRow;
86
+ appendEvent(input: AppendProjectEventInput): ProjectEventRow;
87
+ appendEvent(projectId: string, input: Omit<AppendProjectEventInput, 'projectId'>): ProjectEventRow;
88
+ listEvents(projectId: string, options?: ListProjectEventsOptions): ProjectEventRow[];
89
+ acceptProject(id: string, input: AcceptProjectInput): ProjectDetail;
90
+ }
@@ -16,6 +16,7 @@ export interface RequestLogEntry {
16
16
  userId?: string;
17
17
  projectId?: string;
18
18
  partitionKey?: string;
19
+ timestamp?: string;
19
20
  metadata?: string;
20
21
  }
21
22
  export declare class RequestLogRepository extends BaseSqliteRepository {
@@ -0,0 +1,64 @@
1
+ import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
+ export declare const STORAGE_METADATA_KINDS: readonly ["taskLogs", "requestLogs", "prompts", "threadsLedger", "tasksLedger"];
3
+ export declare const STORAGE_METADATA_UNITS: readonly ["task_log_events", "request_logs", "tasks", "threads"];
4
+ export type StorageMetadataKind = (typeof STORAGE_METADATA_KINDS)[number];
5
+ export type StorageMetadataUnit = (typeof STORAGE_METADATA_UNITS)[number];
6
+ export type StorageMetadataAge = 'over6m' | 'm3to6' | 'm1to3' | 'recent1m';
7
+ export interface StorageMetadataAggregateRow {
8
+ sourceKind: StorageMetadataKind;
9
+ age: StorageMetadataAge;
10
+ count: number;
11
+ bytes: number;
12
+ }
13
+ export interface StorageMetadataCutoffs {
14
+ cutoff6: string;
15
+ cutoff3: string;
16
+ cutoff1: string;
17
+ }
18
+ export interface StorageMetadataUnitReadiness {
19
+ cursorRowid: number;
20
+ endRowid: number | null;
21
+ complete: boolean;
22
+ }
23
+ export interface StorageMetadataReadiness {
24
+ ready: boolean;
25
+ units: Record<StorageMetadataUnit, StorageMetadataUnitReadiness>;
26
+ }
27
+ export interface StorageMetadataSnapshot {
28
+ readiness: StorageMetadataReadiness;
29
+ rows: StorageMetadataAggregateRow[];
30
+ }
31
+ export interface StorageMetadataBatchResult {
32
+ unit: StorageMetadataUnit | null;
33
+ rowsScanned: number;
34
+ rowsWritten: number;
35
+ cursorRowid: number;
36
+ complete: boolean;
37
+ ready: boolean;
38
+ elapsedMs: number;
39
+ }
40
+ export interface StorageMetadataVerificationMismatch {
41
+ sourceId: string;
42
+ metaBytes: number;
43
+ sourceBytes: number;
44
+ }
45
+ export declare class StorageMetadataRepository extends BaseSqliteRepository {
46
+ private readonly dbPath?;
47
+ constructor(opts?: {
48
+ dbPath?: string;
49
+ dbRoot?: string;
50
+ });
51
+ resolveDbPath(): string;
52
+ private hasReadableDatabase;
53
+ private openWritableDatabase;
54
+ private readReadiness;
55
+ private readAggregate;
56
+ getReadiness(): StorageMetadataReadiness;
57
+ aggregate(cutoffs: StorageMetadataCutoffs): StorageMetadataAggregateRow[];
58
+ readSnapshot(cutoffs: StorageMetadataCutoffs): StorageMetadataSnapshot;
59
+ runBackfillBatch(opts?: {
60
+ batchSize?: number;
61
+ unit?: StorageMetadataUnit;
62
+ }): StorageMetadataBatchResult;
63
+ verifySample(kind: StorageMetadataKind, limit: number): StorageMetadataVerificationMismatch[];
64
+ }
@@ -0,0 +1,74 @@
1
+ export type TaskLogMigrationMode = 'dry-run' | 'apply' | 'verify';
2
+ export declare const TASK_LOG_MIGRATION_TERMINAL_STATUSES: readonly ["success", "failed", "completed"];
3
+ export declare const TASK_LOG_MIGRATION_MIN_FREE_SPACE_BYTES: number;
4
+ export declare const TASK_LOG_MIGRATION_EVENT_ROW_BYTES = 256;
5
+ export type TaskLogVerificationIssueKind = 'malformed-blob' | 'mixed-source' | 'seq-gap' | 'duplicate-seq' | 'orphan-event' | 'count-mismatch' | 'source-invariant' | 'invalid-event';
6
+ export type TaskLogMigrationFailureKind = 'malformed' | 'mixed-source' | 'metadata' | 'invalid-source';
7
+ export interface TaskLogMigrationOptions {
8
+ mode: TaskLogMigrationMode;
9
+ dbPath?: string;
10
+ batchTasks?: number;
11
+ backupPath?: string;
12
+ }
13
+ export interface TaskLogMigrationFailure {
14
+ taskId: string;
15
+ reason: string;
16
+ kind?: TaskLogMigrationFailureKind;
17
+ }
18
+ export interface TaskLogVerificationIssue {
19
+ taskId: string | null;
20
+ kind: TaskLogVerificationIssueKind;
21
+ reason: string;
22
+ expected?: number;
23
+ actual?: number;
24
+ seq?: number;
25
+ }
26
+ export interface TaskLogVerificationReport {
27
+ checkedTasks: number;
28
+ eventSourceTasks: number;
29
+ blobSourceTasks: number;
30
+ eventCount: number;
31
+ orphanEventCount: number;
32
+ failedTasks: number;
33
+ issues: TaskLogVerificationIssue[];
34
+ }
35
+ export interface TaskLogMigrationReport {
36
+ mode: TaskLogMigrationMode;
37
+ ok: boolean;
38
+ dbPath: string;
39
+ backupPath?: string;
40
+ backupMethod?: 'sqlite-online-backup';
41
+ blockedReason?: string;
42
+ activeTaskCount: number;
43
+ taskCount: number;
44
+ candidateTaskCount: number;
45
+ eligibleTaskCount: number;
46
+ statusCounts: Record<string, number>;
47
+ deferredTaskCount: number;
48
+ deferredStatusCounts: Record<string, number>;
49
+ entryCount: number;
50
+ sourceBytes: number;
51
+ estimatedFreeSpaceBytes: number;
52
+ requiredFreeSpaceBytes: number;
53
+ availableFreeSpaceBytes: number;
54
+ minimumFreeSpaceReserveBytes: number;
55
+ freeSpaceGatePassed: boolean;
56
+ migratedTasks: number;
57
+ migratedEntries: number;
58
+ skippedTasks: number;
59
+ failedTasks: number;
60
+ malformedRows: TaskLogMigrationFailure[];
61
+ failures: TaskLogMigrationFailure[];
62
+ logicalSourceBytesRemoved: number;
63
+ warnings: string[];
64
+ remainingTaskCount: number;
65
+ verification?: TaskLogVerificationReport;
66
+ }
67
+ export declare function resolveTaskLogMigrationDbPath(dbPath?: string): string;
68
+ export declare function hasSufficientTaskLogMigrationFreeSpace(availableFreeSpaceBytes: number, estimatedFreeSpaceBytes: number): boolean;
69
+ export interface TaskLogWalCheckpointConnection {
70
+ pragma(pragma: string): unknown;
71
+ }
72
+ export declare function tryCheckpointTaskLogWal(db: TaskLogWalCheckpointConnection): string | undefined;
73
+ export declare function runTaskLogMigration(options: TaskLogMigrationOptions): Promise<TaskLogMigrationReport>;
74
+ export declare function taskLogBackupName(backupPath: string): string;
@@ -0,0 +1,44 @@
1
+ import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
+ export type TaskLogStorage = 'blob' | 'events';
3
+ export interface TaskLogEntry {
4
+ timestamp: string;
5
+ level: string;
6
+ message: string;
7
+ }
8
+ export type RawTaskLogEntry = TaskLogEntry;
9
+ export type TaskLogRawEntry = TaskLogEntry;
10
+ export interface TaskLogState {
11
+ taskId: string;
12
+ source: TaskLogStorage;
13
+ revision: number;
14
+ lastSeq: number;
15
+ }
16
+ export interface TaskLogReadResult extends TaskLogState {
17
+ entries: TaskLogEntry[];
18
+ }
19
+ export interface TaskLogRepositoryContract {
20
+ appendLog(taskId: string, entry: TaskLogEntry): TaskLogState;
21
+ appendLogs(taskId: string, entries: readonly TaskLogEntry[]): TaskLogState;
22
+ readLogs(taskId: string): TaskLogReadResult | undefined;
23
+ readLogsTail(taskId: string, limit: number): TaskLogReadResult | undefined;
24
+ getLogState(taskId: string): TaskLogState | undefined;
25
+ }
26
+ export declare class TaskLogRepository extends BaseSqliteRepository implements TaskLogRepositoryContract {
27
+ private readonly dbPath?;
28
+ constructor(opts?: {
29
+ dbPath?: string;
30
+ dbRoot?: string;
31
+ });
32
+ resolveDbPath(): string;
33
+ private openHandle;
34
+ private findStateRow;
35
+ private findStateRowInTransaction;
36
+ private requireStateRowInTransaction;
37
+ appendLog(taskId: string, entry: TaskLogEntry): TaskLogState;
38
+ appendLogs(taskId: string, entries: readonly TaskLogEntry[]): TaskLogState;
39
+ getLogState(taskId: string): TaskLogState | undefined;
40
+ readLogs(taskId: string): TaskLogReadResult | undefined;
41
+ readLogsTail(taskId: string, limit: number): TaskLogReadResult | undefined;
42
+ readTail(taskId: string, limit: number): TaskLogReadResult | undefined;
43
+ private readLogsInternal;
44
+ }
@@ -0,0 +1,14 @@
1
+ export type TaskStatus = 'pending' | 'running' | 'paused' | 'success' | 'failed' | 'stopped' | 'runner_lost';
2
+ export declare const TASK_TERMINAL_STATUSES: readonly ["success", "failed", "stopped", "runner_lost"];
3
+ export type TaskTerminalStatus = (typeof TASK_TERMINAL_STATUSES)[number];
4
+ export type TaskTerminalReason = 'user_stop' | 'runner_lost' | 'launch_failed';
5
+ export declare const LEGACY_TASK_TERMINAL_ERROR_PATTERNS: {
6
+ readonly stopped: RegExp;
7
+ readonly runnerLost: RegExp;
8
+ };
9
+ export interface TaskStatusInput {
10
+ status: string;
11
+ error?: string | null;
12
+ metadata?: string | null;
13
+ }
14
+ export declare function normalizeTaskStatus(row: TaskStatusInput): TaskStatus;
@@ -1,11 +1,78 @@
1
1
  import { BaseSqliteRepository } from './base-sqlite-repository.js';
2
2
  import { tasks } from '../schema/index.js';
3
- export type TaskRow = typeof tasks.$inferSelect;
3
+ import type { TaskLogEntry, TaskLogReadResult, TaskLogState } from './task-log.repository.js';
4
+ import { type TaskStatus, type TaskTerminalReason } from './task-status.js';
5
+ import { type StopTaskOptions, type StopTaskGenerationForInstructionOptions, type StopTaskResult } from '../lifecycle/task-stop.js';
6
+ export { TASK_HEARTBEAT_HARD_STALE_MS, TASK_HEARTBEAT_INTERVAL_MS, TASK_HEARTBEAT_STALE_MS, resolveTaskHeartbeatHardStaleMs, resolveTaskHeartbeatIntervalMs, resolveTaskHeartbeatStaleMs, } from '../lifecycle/task-heartbeat.js';
7
+ type RawTaskRow = typeof tasks.$inferSelect;
8
+ export type TaskRow = Omit<RawTaskRow, 'status'> & {
9
+ status: TaskStatus;
10
+ };
4
11
  export type NewTask = typeof tasks.$inferInsert;
12
+ export type TaskKillStatus = 'terminated' | 'not_found' | 'failed' | 'not_running';
13
+ export interface TaskKillResult {
14
+ status: TaskKillStatus;
15
+ killed: boolean;
16
+ pid?: number;
17
+ error?: string;
18
+ }
19
+ export interface TaskStopRequestResult {
20
+ accepted: boolean;
21
+ status: string | null;
22
+ runEpoch: number;
23
+ alreadyRequestedAt?: string;
24
+ }
25
+ export type TaskStopMethod = 'cooperative' | 'forced';
26
+ export interface FinalizeTaskStopOptions {
27
+ id: string;
28
+ runEpoch: number;
29
+ completedAt?: string;
30
+ method: TaskStopMethod;
31
+ error?: string;
32
+ terminalReason?: TaskTerminalReason;
33
+ durationMs?: number | null;
34
+ }
35
+ export interface FinalizeTaskForHostShutdownOptions {
36
+ id: string;
37
+ expectedRunEpoch: number;
38
+ workspaceId?: string | null;
39
+ completedAt?: string;
40
+ }
41
+ export type FinalizeTaskForHostShutdownOutcome = 'settled' | 'not_running' | 'epoch_mismatch' | 'workspace_mismatch';
42
+ export type TaskListRow = Pick<TaskRow, 'id' | 'thread_id' | 'agent_id' | 'status' | 'parent_task_id' | 'started_at' | 'completed_at' | 'duration_ms' | 'input_tokens' | 'output_tokens' | 'cost_usd' | 'error'>;
43
+ export type TaskActivityLogRow = Pick<TaskRow, 'id' | 'thread_id' | 'agent_id' | 'parent_task_id' | 'started_at' | 'completed_at'>;
44
+ export type FindTasksByThreadOptions = {
45
+ projection: 'activity-log';
46
+ };
47
+ export interface WorkflowCardRow {
48
+ taskId: string;
49
+ workflowRunId?: string;
50
+ raw?: string;
51
+ }
52
+ export interface WorkflowParentTaskRow {
53
+ id: string;
54
+ agent_id: string;
55
+ thread_id: string | null;
56
+ workspace_id: string | null;
57
+ platform: string | null;
58
+ status: string;
59
+ error: string | null;
60
+ completed_at: string | null;
61
+ duration_ms: number | null;
62
+ started_at: string;
63
+ metadata: string | null;
64
+ }
65
+ export type WorkflowParentTaskKind = 'workflow_card' | 'workflow_ui_instance';
66
+ export interface WorkflowParentTaskLookup {
67
+ workspaceId: string;
68
+ workflowRunId: string;
69
+ kind: WorkflowParentTaskKind;
70
+ }
5
71
  export interface AgentUsageRow {
6
72
  agentId: string;
7
73
  workspaceId: string | null;
8
74
  totalTasks: number;
75
+ unavailableTaskCount?: number;
9
76
  inputTokens: number;
10
77
  outputTokens: number;
11
78
  cachedInputTokens: number;
@@ -15,6 +82,7 @@ export interface AgentUsageRow {
15
82
  export interface TrendRow {
16
83
  date: string;
17
84
  agentId: string;
85
+ unavailableTaskCount?: number;
18
86
  inputTokens: number;
19
87
  outputTokens: number;
20
88
  cachedInputTokens: number;
@@ -24,6 +92,7 @@ export interface TrendRow {
24
92
  export interface ProviderUsageRow {
25
93
  provider: string;
26
94
  totalTasks: number;
95
+ unavailableTaskCount?: number;
27
96
  inputTokens: number;
28
97
  outputTokens: number;
29
98
  cachedInputTokens: number;
@@ -32,14 +101,88 @@ export interface ProviderUsageRow {
32
101
  activeDurationMs: number;
33
102
  lastActiveAt: string | null;
34
103
  }
104
+ export interface ModelUsageRow {
105
+ model: string;
106
+ provider: string;
107
+ totalTasks: number;
108
+ unavailableTaskCount?: number;
109
+ inputTokens: number;
110
+ outputTokens: number;
111
+ cachedInputTokens: number;
112
+ costUsd: number;
113
+ totalTokens: number;
114
+ activeDurationMs: number;
115
+ lastActiveAt: string | null;
116
+ }
117
+ export interface ReportTaskRow {
118
+ threadId: string | null;
119
+ agentId: string;
120
+ startedAt: string;
121
+ status: string;
122
+ error: string | null;
123
+ exitCode: number | null;
124
+ }
125
+ export interface DelegationEdge {
126
+ callerAgentId: string | null;
127
+ agentId: string;
128
+ taskCount: number;
129
+ totalTokens: number;
130
+ outputTokens: number;
131
+ }
132
+ export interface DelegationMatrixResult {
133
+ edges: DelegationEdge[];
134
+ truncated: boolean;
135
+ }
136
+ export type TaskEvidenceRow = Pick<TaskRow, 'id' | 'agent_id' | 'status' | 'prompt' | 'started_at' | 'completed_at' | 'thread_id'>;
137
+ export interface ThreadChainTurn {
138
+ id: string;
139
+ agentId: string;
140
+ status: string;
141
+ prompt: string;
142
+ startedAt: string;
143
+ completedAt: string | null;
144
+ }
145
+ export interface ThreadChain {
146
+ threadId: string;
147
+ targetAgentTurnCount: number;
148
+ turns: ThreadChainTurn[];
149
+ }
150
+ export declare const HOST_SHUTDOWN_TERMINAL_ERROR = "Stopped by app shutdown";
151
+ type TaskUsageColumns = Pick<TaskRow, 'input_tokens' | 'output_tokens' | 'cached_input_tokens' | 'cost_usd'>;
152
+ export declare function mergeTerminalReason(metadataJson: string | null | undefined, reason: TaskTerminalReason): string;
153
+ export declare function hasRecordedUsage(task: TaskUsageColumns): boolean;
154
+ export declare const PID_NULL_REAP_GRACE_MS: number;
155
+ export declare const PENDING_ADOPT_GRACE_MS: number;
156
+ export declare const DEFAULT_TASK_REAPER_TICK_INTERVAL_MS: number;
157
+ export interface ReapOrphanedTasksOptions {
158
+ tickIntervalMs?: number;
159
+ }
35
160
  export declare class TaskRepository extends BaseSqliteRepository {
36
161
  private readonly dbPath?;
162
+ private readonly clock;
163
+ private readonly taskLogRepository;
164
+ private lastReaperTickAt?;
165
+ private readonly pidNullObservedSince;
37
166
  constructor(opts?: {
38
167
  dbPath?: string;
39
168
  dbRoot?: string;
169
+ clock?: () => number;
40
170
  });
41
171
  resolveDbPath(): string;
42
172
  private openHandle;
173
+ heartbeatTask(opts: {
174
+ id: string;
175
+ runEpoch: number;
176
+ }): boolean;
177
+ requestTaskStop(opts: {
178
+ id: string;
179
+ requestedAt: string;
180
+ }): TaskStopRequestResult;
181
+ private requestTaskStopForInstruction;
182
+ finalizeTaskStop(opts: FinalizeTaskStopOptions): boolean;
183
+ finalizeTaskForHostShutdown(opts: FinalizeTaskForHostShutdownOptions): FinalizeTaskForHostShutdownOutcome;
184
+ stopTask(id: string, options?: StopTaskOptions): Promise<StopTaskResult>;
185
+ stopTaskGenerationForInstruction(options: StopTaskGenerationForInstructionOptions): Promise<StopTaskResult>;
43
186
  startTask(opts: {
44
187
  id: string;
45
188
  agentId: string;
@@ -54,6 +197,7 @@ export declare class TaskRepository extends BaseSqliteRepository {
54
197
  command?: string | null;
55
198
  metadata?: string | null;
56
199
  workspaceId?: string | null;
200
+ projectId?: string | null;
57
201
  platform?: string | null;
58
202
  crewxVersion?: string | null;
59
203
  threadId?: string | null;
@@ -61,6 +205,16 @@ export declare class TaskRepository extends BaseSqliteRepository {
61
205
  renderedPrompt?: string | null;
62
206
  codingAgentCommand?: string | null;
63
207
  }): void;
208
+ updateTaskOwnership(opts: {
209
+ id: string;
210
+ runEpoch: number;
211
+ ownership: 'runner' | 'caller';
212
+ providerPid?: number | null;
213
+ }): boolean;
214
+ adoptPendingTask(id: string): boolean;
215
+ failPendingTask(id: string, error: string, completedAt?: string): boolean;
216
+ stopPendingTask(id: string, error?: string, completedAt?: string): boolean;
217
+ listTasksByProjectId(projectId: string): TaskRow[];
64
218
  finishTask(opts: {
65
219
  id: string;
66
220
  status: string;
@@ -75,20 +229,33 @@ export declare class TaskRepository extends BaseSqliteRepository {
75
229
  costUsd?: number;
76
230
  model?: string | null;
77
231
  runEpoch?: number | null;
232
+ partialResultRecovered?: boolean;
233
+ }): void;
234
+ updateTaskLifecycle(opts: {
235
+ id: string;
236
+ status: TaskStatus;
237
+ error: string | null;
238
+ completedAt: string | null;
239
+ durationMs: number | null;
240
+ workspaceId: string;
241
+ terminalReason?: TaskTerminalReason;
78
242
  }): void;
79
243
  appendLog(taskId: string, entry: {
80
244
  timestamp: string;
81
245
  level: string;
82
246
  message: string;
83
247
  }): void;
248
+ appendLogs(taskId: string, entries: readonly TaskLogEntry[]): void;
249
+ readLogs(taskId: string): TaskLogReadResult | undefined;
250
+ readLogsTail(taskId: string, limit: number): TaskLogReadResult | undefined;
251
+ getLogState(taskId: string): TaskLogState | undefined;
84
252
  getRunningTasks(): TaskRow[];
253
+ getActiveTasks(): TaskRow[];
85
254
  getAllTasks(): TaskRow[];
86
255
  getTask(id: string): TaskRow | undefined;
87
- killTask(id: string): {
88
- killed: boolean;
89
- pid?: number;
90
- };
91
- reapOrphanedTasks(): number;
256
+ killTask(id: string): Promise<TaskKillResult>;
257
+ reapOrphanedTasks(options?: ReapOrphanedTasksOptions): number;
258
+ reapRunningWorkflowTasks(graceMs?: number): number;
92
259
  findTaskStatus(taskId: string, workspaceId?: string): TaskRow | undefined;
93
260
  findChildTasks(parentTaskId: string, workspaceId?: string): TaskRow[];
94
261
  getWorkspaceUsageSummary(workspaceId?: string): Array<{
@@ -103,7 +270,13 @@ export declare class TaskRepository extends BaseSqliteRepository {
103
270
  outputTokens: number;
104
271
  costUsd: number;
105
272
  };
273
+ findTasksByThread(threadId: string, workspaceId: string | undefined, options: FindTasksByThreadOptions): TaskActivityLogRow[];
106
274
  findTasksByThread(threadId: string, workspaceId?: string): TaskRow[];
275
+ private parseWorkflowCardMetadata;
276
+ private extractThreadIdFromCommand;
277
+ findRunningWorkflowParentTasks(): WorkflowParentTaskRow[];
278
+ findWorkflowParentTask(opts: WorkflowParentTaskLookup): WorkflowParentTaskRow | undefined;
279
+ batchFetchWorkflowCards(threadIds: string[], workspaceId?: string): Map<string, WorkflowCardRow>;
107
280
  findAllTasks(params: {
108
281
  workspaceId?: string;
109
282
  agentId?: string;
@@ -124,7 +297,42 @@ export declare class TaskRepository extends BaseSqliteRepository {
124
297
  getAgentUsage(from: string, to: string, workspace?: string): AgentUsageRow[];
125
298
  getAgentUsageTrendRaw(from: string, to: string, workspace?: string): TrendRow[];
126
299
  findTaskForStop(taskId: string, workspaceId: string): TaskRow | undefined;
127
- markTaskFailed(taskId: string, error: string, workspaceId?: string): void;
300
+ findLatestTaskByMetadata(opts: {
301
+ agentId: string;
302
+ workspaceId: string;
303
+ metaKey: string;
304
+ metaValue: string;
305
+ }): {
306
+ id: string;
307
+ thread_id: string | null;
308
+ status: string;
309
+ result: string | null;
310
+ error: string | null;
311
+ started_at: string;
312
+ completed_at: string | null;
313
+ metadata: string | null;
314
+ } | null;
315
+ markTaskFailed(taskId: string, error: string, workspaceId?: string, status?: TaskStatus, terminalReason?: TaskTerminalReason): void;
128
316
  findTasksByPromptHint(hint: string, workspaceId?: string): TaskRow[];
129
317
  getProviderUsage(from: string, to: string, workspace?: string): ProviderUsageRow[];
318
+ getModelUsage(from: string, to: string, workspace?: string): ModelUsageRow[];
319
+ getTasksForReport(from: string, to: string, workspace?: string): ReportTaskRow[];
320
+ getDelegationMatrix(from: string, to: string, workspace?: string): DelegationMatrixResult;
321
+ findTaskEvidence(params: {
322
+ workspaceId?: string;
323
+ agents?: string[];
324
+ statuses?: string[];
325
+ from?: string;
326
+ to?: string;
327
+ limit?: number;
328
+ order?: 'ASC' | 'DESC';
329
+ }): TaskEvidenceRow[];
330
+ findThreadChains(params: {
331
+ targetAgentId: string;
332
+ workspaceId?: string;
333
+ from?: string;
334
+ to?: string;
335
+ maxThreads?: number;
336
+ maxTurnsPerThread?: number;
337
+ }): ThreadChain[];
130
338
  }