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

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 (223) 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/config/canonicalize-agent-options.d.ts +17 -0
  13. package/dist/config/global-settings.d.ts +33 -0
  14. package/dist/config/migrate-grok-mode.d.ts +6 -0
  15. package/dist/config/model-compat.d.ts +31 -0
  16. package/dist/config/models.generated.d.ts +37 -0
  17. package/dist/config/models.remote.d.ts +1 -0
  18. package/dist/config/overdrive.d.ts +7 -0
  19. package/dist/config/pricing.d.ts +8 -5
  20. package/dist/config/pricing.generated.d.ts +4 -0
  21. package/dist/config/pricing.types.d.ts +4 -10
  22. package/dist/config/timeout.config.d.ts +3 -0
  23. package/dist/config/wi-boards.d.ts +19 -0
  24. package/dist/context-budget/continuity.d.ts +61 -0
  25. package/dist/context-budget/index.d.ts +140 -0
  26. package/dist/conversation/index.d.ts +1 -1
  27. package/dist/conversation/sqlite-provider.d.ts +5 -1
  28. package/dist/conversation/to-template-messages.d.ts +9 -0
  29. package/dist/conversation/types.d.ts +44 -0
  30. package/dist/desktop/command-runner.d.ts +4 -0
  31. package/dist/desktop/default-adapters.d.ts +4 -0
  32. package/dist/desktop/global-install.d.ts +19 -0
  33. package/dist/desktop/index.d.ts +3 -0
  34. package/dist/desktop/index.js +3 -0
  35. package/dist/desktop/install.d.ts +5 -0
  36. package/dist/desktop/lnk.d.ts +22 -0
  37. package/dist/desktop/manifest.d.ts +21 -0
  38. package/dist/desktop/types.d.ts +67 -0
  39. package/dist/desktop/version.d.ts +1 -0
  40. package/dist/desktop/windows-paths.d.ts +21 -0
  41. package/dist/desktop/wrapper.d.ts +18 -0
  42. package/dist/esm/account/index.js +2 -0
  43. package/dist/esm/desktop/index.js +3 -0
  44. package/dist/esm/index.js +620 -111
  45. package/dist/esm/plugins/index.js +252 -111
  46. package/dist/esm/process/index.js +1 -0
  47. package/dist/esm/publish/index.js +1 -0
  48. package/dist/esm/repository/index.js +319 -101
  49. package/dist/esm/testing/index.js +1 -1
  50. package/dist/events/types.d.ts +5 -0
  51. package/dist/facade/Crewx.d.ts +41 -2
  52. package/dist/highlight/thread-highlight-prompt.d.ts +2 -0
  53. package/dist/highlight/thread-highlighter.d.ts +326 -0
  54. package/dist/index.browser.d.ts +11 -1
  55. package/dist/index.browser.js +6 -2
  56. package/dist/index.d.ts +91 -13
  57. package/dist/index.js +620 -111
  58. package/dist/internal/console-decoder.d.ts +38 -0
  59. package/dist/internal/windows-spawn.d.ts +10 -0
  60. package/dist/layout/types.d.ts +17 -1
  61. package/dist/lifecycle/task-heartbeat.d.ts +41 -0
  62. package/dist/lifecycle/task-stop.d.ts +60 -0
  63. package/dist/local-server/base-url.d.ts +18 -0
  64. package/dist/local-server/index.d.ts +8 -0
  65. package/dist/local-server/opencode.d.ts +8 -0
  66. package/dist/local-server/probe.d.ts +3 -0
  67. package/dist/local-server/runtime.d.ts +26 -0
  68. package/dist/local-server/types.d.ts +43 -0
  69. package/dist/mcp-app/errors.d.ts +7 -0
  70. package/dist/mcp-app/index.d.ts +8 -0
  71. package/dist/mcp-app/installed-app-ref.d.ts +25 -0
  72. package/dist/mcp-app/projection.d.ts +12 -0
  73. package/dist/mcp-app/registry.d.ts +7 -0
  74. package/dist/mcp-app/types.d.ts +165 -0
  75. package/dist/migrations/0008_careful_black_bird.sql +17 -0
  76. package/dist/migrations/0009_hot_dark_phoenix.sql +1 -0
  77. package/dist/migrations/0010_analyze_stats.sql +6 -0
  78. package/dist/migrations/0011_far_black_tarantula.sql +1 -0
  79. package/dist/migrations/0012_blue_turbo.sql +23 -0
  80. package/dist/migrations/0013_hesitant_adam_destine.sql +15 -0
  81. package/dist/migrations/0014_organic_mongu.sql +73 -0
  82. package/dist/migrations/0015_panoramic_gorilla_man.sql +71 -0
  83. package/dist/migrations/0016_fuzzy_hemingway.sql +14 -0
  84. package/dist/migrations/0017_project_stage_sdk_migration.sql +29 -0
  85. package/dist/migrations/0018_bored_jackal.sql +33 -0
  86. package/dist/migrations/0019_backfill_task_thread_ids.sql +74 -0
  87. package/dist/migrations/0020_useful_iron_lad.sql +55 -0
  88. package/dist/migrations/0021_dashing_peter_quill.sql +51 -0
  89. package/dist/migrations/0022_wandering_bucky.sql +1 -0
  90. package/dist/migrations/0023_red_payback.sql +1 -0
  91. package/dist/migrations/0024_storage_metadata.sql +262 -0
  92. package/dist/migrations/0025_task_heartbeat.sql +8 -0
  93. package/dist/migrations/0025_thread_app_instance_ledger.sql +2 -0
  94. package/dist/migrations/0026_mcp_action_source.sql +47 -0
  95. package/dist/migrations/meta/0008_snapshot.json +1327 -0
  96. package/dist/migrations/meta/0009_snapshot.json +1335 -0
  97. package/dist/migrations/meta/0010_snapshot.json +1335 -0
  98. package/dist/migrations/meta/0011_snapshot.json +1342 -0
  99. package/dist/migrations/meta/0012_snapshot.json +1494 -0
  100. package/dist/migrations/meta/0013_snapshot.json +1592 -0
  101. package/dist/migrations/meta/0014_snapshot.json +1975 -0
  102. package/dist/migrations/meta/0015_snapshot.json +2315 -0
  103. package/dist/migrations/meta/0016_snapshot.json +2419 -0
  104. package/dist/migrations/meta/0017_snapshot.json +2419 -0
  105. package/dist/migrations/meta/0018_snapshot.json +2570 -0
  106. package/dist/migrations/meta/0020_snapshot.json +2895 -0
  107. package/dist/migrations/meta/0021_snapshot.json +3031 -0
  108. package/dist/migrations/meta/0022_snapshot.json +3039 -0
  109. package/dist/migrations/meta/0023_snapshot.json +3047 -0
  110. package/dist/migrations/meta/_journal.json +141 -1
  111. package/dist/paths.d.ts +1 -0
  112. package/dist/plugin/types.d.ts +1 -0
  113. package/dist/plugins/index.d.ts +1 -1
  114. package/dist/plugins/index.js +252 -111
  115. package/dist/plugins/sqlite-tracing.d.ts +33 -0
  116. package/dist/process/index.d.ts +2 -0
  117. package/dist/process/index.js +1 -0
  118. package/dist/process/process-control.d.ts +41 -0
  119. package/dist/prompt/tag-names.d.ts +18 -0
  120. package/dist/provider/acp/connection.d.ts +6 -0
  121. package/dist/provider/acp/meta.d.ts +11 -0
  122. package/dist/provider/bridge.d.ts +6 -0
  123. package/dist/provider/classify-task-error.d.ts +2 -0
  124. package/dist/provider/cli/adapter.types.d.ts +8 -1
  125. package/dist/provider/cli/adapters/agent-call.util.d.ts +1 -1
  126. package/dist/provider/cli/adapters/cli-knob.util.d.ts +7 -0
  127. package/dist/provider/cli/adapters/event-timestamp.util.d.ts +1 -0
  128. package/dist/provider/cli/adapters/grok.d.ts +2 -0
  129. package/dist/provider/cli/adapters/index.d.ts +1 -0
  130. package/dist/provider/cli/index.d.ts +1 -1
  131. package/dist/provider/cli/meta.d.ts +5 -0
  132. package/dist/provider/cli/protocol-envelope.d.ts +2 -0
  133. package/dist/provider/errors.d.ts +1 -0
  134. package/dist/provider/idle-watchdog.d.ts +19 -0
  135. package/dist/provider/models.d.ts +17 -12
  136. package/dist/provider/order.d.ts +1 -1
  137. package/dist/provider/parse-usage.d.ts +6 -0
  138. package/dist/provider/provider-selection.d.ts +8 -0
  139. package/dist/provider/redact-technical-message.d.ts +1 -0
  140. package/dist/provider/task-error.types.d.ts +17 -0
  141. package/dist/publish/constants.d.ts +6 -0
  142. package/dist/publish/index.d.ts +26 -0
  143. package/dist/publish/index.js +1 -0
  144. package/dist/publish/manifest.d.ts +17 -0
  145. package/dist/publish/marketplace-api.constants.d.ts +1 -0
  146. package/dist/publish/pack.d.ts +2 -0
  147. package/dist/publish/scan.d.ts +9 -0
  148. package/dist/publish/secrets.d.ts +6 -0
  149. package/dist/publish/upload.d.ts +18 -0
  150. package/dist/remote/execution-profile.d.ts +9 -0
  151. package/dist/remote/index.d.ts +1 -0
  152. package/dist/remote/types.d.ts +28 -0
  153. package/dist/repository/agent-suggestion.repository.d.ts +34 -0
  154. package/dist/repository/base-sqlite-repository.d.ts +1 -0
  155. package/dist/repository/common-code.repository.d.ts +45 -0
  156. package/dist/repository/db.d.ts +12 -1
  157. package/dist/repository/index.d.ts +38 -5
  158. package/dist/repository/index.js +319 -101
  159. package/dist/repository/notification.repository.d.ts +58 -0
  160. package/dist/repository/project.repository.d.ts +90 -0
  161. package/dist/repository/request-log.repository.d.ts +1 -0
  162. package/dist/repository/storage-metadata.repository.d.ts +64 -0
  163. package/dist/repository/task-log-migration.d.ts +74 -0
  164. package/dist/repository/task-log.repository.d.ts +44 -0
  165. package/dist/repository/task-status.d.ts +14 -0
  166. package/dist/repository/task.repository.d.ts +206 -7
  167. package/dist/repository/thread-history.repository.d.ts +193 -0
  168. package/dist/repository/thread-title.types.d.ts +29 -0
  169. package/dist/repository/thread.repository.d.ts +21 -2
  170. package/dist/repository/usage-backfill.d.ts +62 -0
  171. package/dist/repository/usage-from-logs.d.ts +21 -0
  172. package/dist/repository/usage-report.repository.d.ts +27 -0
  173. package/dist/repository/workspace.repository.d.ts +3 -0
  174. package/dist/schema/agent-suggestions.d.ts +199 -0
  175. package/dist/schema/common-codes.d.ts +216 -0
  176. package/dist/schema/index.d.ts +10 -0
  177. package/dist/schema/notifications.d.ts +303 -0
  178. package/dist/schema/projects.d.ts +610 -0
  179. package/dist/schema/storage-metadata.d.ts +181 -0
  180. package/dist/schema/task-log-events.d.ts +119 -0
  181. package/dist/schema/tasks.d.ts +108 -0
  182. package/dist/schema/thread-history.d.ts +734 -0
  183. package/dist/schema/threads.d.ts +2 -0
  184. package/dist/schema/ui-action-receipts.d.ts +303 -0
  185. package/dist/schema/ui-instances.d.ts +286 -0
  186. package/dist/schema/usage-reports.d.ts +252 -0
  187. package/dist/schema/workspaces.d.ts +17 -0
  188. package/dist/task-log/anchor-child-tasks.d.ts +7 -0
  189. package/dist/task-log/delegation-trailer.d.ts +34 -0
  190. package/dist/template/engine.d.ts +2 -2
  191. package/dist/template/helpers/exec.browser.d.ts +4 -3
  192. package/dist/template/helpers/exec.d.ts +4 -3
  193. package/dist/template/types.d.ts +13 -0
  194. package/dist/testing/index.js +1 -1
  195. package/dist/types/index.d.ts +1541 -3
  196. package/dist/types/task-log.types.d.ts +2 -0
  197. package/dist/ui-card/index.d.ts +2 -0
  198. package/dist/ui-card/legacy-card-parser.d.ts +11 -0
  199. package/dist/ui-instance/definition.d.ts +6 -0
  200. package/dist/ui-instance/errors.d.ts +17 -0
  201. package/dist/ui-instance/index.d.ts +9 -0
  202. package/dist/ui-instance/json.d.ts +5 -0
  203. package/dist/ui-instance/runtime.d.ts +13 -0
  204. package/dist/ui-instance/store.d.ts +98 -0
  205. package/dist/ui-instance/types.d.ts +206 -0
  206. package/dist/ui-plugin/index.d.ts +3 -0
  207. package/dist/ui-plugin/manifest.d.ts +3 -0
  208. package/dist/ui-plugin/types.d.ts +76 -0
  209. package/dist/ui-plugin/validator.d.ts +9 -0
  210. package/dist/utils/crewx-executable.d.ts +54 -0
  211. package/dist/utils/crewx-home.d.ts +1 -0
  212. package/dist/utils/env-defaults.d.ts +2 -0
  213. package/dist/utils/id.d.ts +1 -1
  214. package/dist/utils/runner-env.d.ts +3 -0
  215. package/dist/utils/timestamp.d.ts +1 -0
  216. package/dist/wi/create.d.ts +48 -0
  217. package/dist/wi/select.d.ts +20 -0
  218. package/package.json +33 -2
  219. package/templates/agents/default.yaml +266 -127
  220. package/templates/documents/crewx-manual.md +138 -138
  221. package/templates/documents/crewx-quick-guide.md +1 -1
  222. package/templates/workflows/wi-default-flow.yaml +65 -0
  223. package/templates/workflows/wi-plan-flow.yaml +140 -0
@@ -0,0 +1,38 @@
1
+ export interface ConsoleDecoderOptions {
2
+ platform?: NodeJS.Platform;
3
+ detectCodePage?: () => Promise<number | null>;
4
+ codePage?: number | null;
5
+ }
6
+ export interface ConsoleBufferDecodeOptions {
7
+ platform?: NodeJS.Platform;
8
+ codePage?: number | null;
9
+ }
10
+ type ConsoleByteChunk = Buffer | Uint8Array<ArrayBufferLike>;
11
+ export declare function parseWindowsConsoleCodePage(output: string): number | null;
12
+ export declare function getWindowsConsoleCodePage(): Promise<number | null>;
13
+ export declare function primeWindowsConsoleCodePage(): void;
14
+ export declare class ConsoleDecoder {
15
+ private readonly platform;
16
+ private readonly detectCodePage;
17
+ private utf8Decoder;
18
+ private codePage;
19
+ private fallbackDecoder;
20
+ private replayTail;
21
+ private pendingUtf8;
22
+ private pendingFallback;
23
+ private pendingBytes;
24
+ private queue;
25
+ private ended;
26
+ constructor(options?: ConsoleDecoderOptions);
27
+ write(chunk: ConsoleByteChunk): Promise<string>;
28
+ end(): Promise<string>;
29
+ private enqueue;
30
+ private clearPendingCandidate;
31
+ private resolveCodePage;
32
+ private getFallbackDecoder;
33
+ private decodeChunk;
34
+ private finish;
35
+ }
36
+ export declare function decodeConsoleBuffer(input: ConsoleByteChunk, options?: ConsoleBufferDecodeOptions): string;
37
+ export declare function decodeConsoleBufferAsync(input: ConsoleByteChunk, options?: ConsoleDecoderOptions): Promise<string>;
38
+ export {};
@@ -20,15 +20,25 @@ export type WindowsSpawnInvocation = {
20
20
  shell?: boolean;
21
21
  windowsHide?: boolean;
22
22
  };
23
+ export type BinResolutionMode = 'global_first' | 'local_first';
24
+ export type ResolveExecutablePathOptions = {
25
+ cwd?: string;
26
+ env?: NodeJS.ProcessEnv;
27
+ platform?: NodeJS.Platform;
28
+ resolution?: BinResolutionMode;
29
+ };
23
30
  export type ResolveWindowsSpawnProgramParams = {
24
31
  command: string;
25
32
  platform?: NodeJS.Platform;
26
33
  env?: NodeJS.ProcessEnv;
27
34
  execPath?: string;
28
35
  packageName?: string;
36
+ cwd?: string;
37
+ resolution?: BinResolutionMode;
29
38
  allowShellFallback?: boolean;
30
39
  };
31
40
  export type ResolveWindowsSpawnProgramCandidateParams = Omit<ResolveWindowsSpawnProgramParams, 'allowShellFallback'>;
41
+ export declare function resolveExecutablePath(command: string, options?: ResolveExecutablePathOptions): string;
32
42
  export declare function resolveWindowsExecutablePath(command: string, env: NodeJS.ProcessEnv): string;
33
43
  export declare function resolveWindowsSpawnProgramCandidate(params: ResolveWindowsSpawnProgramCandidateParams): WindowsSpawnProgramCandidate;
34
44
  export declare function applyWindowsSpawnProgramPolicy(params: {
@@ -25,6 +25,13 @@ export interface LayoutDefinition {
25
25
  template: string;
26
26
  propsSchema: Record<string, PropSchema>;
27
27
  defaultProps: Record<string, any>;
28
+ capabilities?: LayoutCapabilities;
29
+ }
30
+ export interface LayoutCapabilities {
31
+ semanticContinuity?: boolean;
32
+ continuity?: boolean;
33
+ continuitySlot?: string;
34
+ slot?: string;
28
35
  }
29
36
  export interface CustomLayoutDefinition {
30
37
  template: string;
@@ -32,10 +39,15 @@ export interface CustomLayoutDefinition {
32
39
  version?: string;
33
40
  propsSchema?: Record<string, any>;
34
41
  defaultProps?: Record<string, any>;
42
+ capabilities?: LayoutCapabilities;
35
43
  }
36
44
  export type InlineLayoutSpec = string | {
37
45
  id: string;
38
46
  props?: Record<string, any>;
47
+ capabilities?: LayoutCapabilities;
48
+ } | {
49
+ template: string;
50
+ capabilities?: LayoutCapabilities;
39
51
  };
40
52
  export interface ValidationResult {
41
53
  valid: boolean;
@@ -97,6 +109,9 @@ export interface RenderContext {
97
109
  [key: string]: any;
98
110
  };
99
111
  context?: Record<string, any>;
112
+ semanticContinuity?: import('../conversation/types.js').SemanticContinuityContext;
113
+ thread_state?: import('../conversation/types.js').ConversationThreadState;
114
+ threadState?: import('../conversation/types.js').ConversationThreadState;
100
115
  contextOptions?: {
101
116
  goals: boolean | string | string[];
102
117
  daily: boolean;
@@ -109,7 +124,8 @@ export interface RawLayoutYaml {
109
124
  description?: string;
110
125
  propsSchema?: Record<string, any>;
111
126
  template?: string;
112
- layouts?: Record<string, string>;
127
+ layouts?: Record<string, any>;
128
+ capabilities?: LayoutCapabilities;
113
129
  }
114
130
  export declare class LayoutLoadError extends Error {
115
131
  readonly layoutId?: string | undefined;
@@ -0,0 +1,41 @@
1
+ import type { TaskRepository } from '../repository/task.repository.js';
2
+ export declare const TASK_HEARTBEAT_INTERVAL_MS = 10000;
3
+ export declare const TASK_HEARTBEAT_STALE_MS = 30000;
4
+ export declare const TASK_HEARTBEAT_HARD_STALE_MS: number;
5
+ export declare const TASK_STOP_POLL_INTERVAL_MS = 1000;
6
+ export declare function resolveTaskHeartbeatIntervalMs(): number;
7
+ export declare function resolveTaskHeartbeatStaleMs(): number;
8
+ export declare function resolveTaskHeartbeatHardStaleMs(): number;
9
+ export interface TaskHeartbeatRow {
10
+ id?: string;
11
+ status: string;
12
+ run_epoch: number | null;
13
+ stop_requested_at: string | null;
14
+ stop_requested_epoch: number | null;
15
+ pid?: number | null;
16
+ metadata?: string | null;
17
+ started_at?: string;
18
+ duration_ms?: number | null;
19
+ }
20
+ export interface HeartbeatTickResult {
21
+ accepted: boolean;
22
+ row: TaskHeartbeatRow | null;
23
+ }
24
+ export interface TaskHeartbeatOptions {
25
+ taskId: string;
26
+ runEpoch: number;
27
+ onStopRequested?: (row: TaskHeartbeatRow) => void | Promise<void>;
28
+ }
29
+ export interface TaskHeartbeatHandle {
30
+ timer: ReturnType<typeof setInterval>;
31
+ runEpoch: number;
32
+ stopRequested: boolean;
33
+ lastHeartbeatAt: number;
34
+ heartbeatElapsedMs: number;
35
+ }
36
+ export declare const taskHeartbeatRegistry: Map<string, TaskHeartbeatHandle>;
37
+ export declare function runHeartbeatTick(repo: Pick<TaskRepository, 'heartbeatTask' | 'getTask'>, options: TaskHeartbeatOptions & {
38
+ writeHeartbeat?: boolean;
39
+ }): HeartbeatTickResult;
40
+ export declare function stopTaskHeartbeat(taskId: string, runEpoch?: number | null): boolean;
41
+ export declare function startTaskHeartbeat(repo: Pick<TaskRepository, 'heartbeatTask' | 'getTask'>, options: TaskHeartbeatOptions): boolean;
@@ -0,0 +1,60 @@
1
+ import type { FinalizeTaskStopOptions, TaskRepository, TaskRow, TaskStopRequestResult } from '../repository/task.repository.js';
2
+ import { checkProcessOwnershipAsync as defaultCheckProcessOwnershipAsync, terminateProcessTree as defaultTerminateProcessTree, type ProcessControlOptions } from '../process/process-control.js';
3
+ export declare const TASK_STOP_DEFAULT_GRACE_MS = 5000;
4
+ export declare const TASK_STOP_DEFAULT_POLL_MS = 250;
5
+ export declare function resolveTaskStopMethod(requestedAt: string | null | undefined, completedAt?: string | number, graceMs?: number): 'cooperative' | 'forced';
6
+ export declare const TASK_STOP_OWNED_PROCESS_MARKERS: readonly ["crewx", "claude", "codex", "opencode", "grok", "node"];
7
+ export type StopTaskStatus = 'stopped' | 'not_running' | 'already_requested' | 'ownership_unverified' | 'failed';
8
+ export interface StopTaskResult {
9
+ status: StopTaskStatus;
10
+ method?: 'cooperative' | 'forced';
11
+ finalStatus: string | null;
12
+ pid?: number;
13
+ error?: string;
14
+ }
15
+ export interface StopTaskProcessControl {
16
+ checkProcessOwnershipAsync?: typeof defaultCheckProcessOwnershipAsync;
17
+ terminateProcessTree?: typeof defaultTerminateProcessTree;
18
+ }
19
+ export interface StopTaskOptions {
20
+ graceMs?: number;
21
+ pollMs?: number;
22
+ platform?: NodeJS.Platform;
23
+ ownershipMarkers?: readonly string[];
24
+ processControl?: StopTaskProcessControl;
25
+ processControlOptions?: ProcessControlOptions;
26
+ }
27
+ export interface StopTaskGenerationForInstructionOptions {
28
+ taskId: string;
29
+ targetPid: number | null | undefined;
30
+ sourceRunEpoch: number;
31
+ settleRunEpoch: number;
32
+ workspaceId?: string | null;
33
+ platform?: NodeJS.Platform;
34
+ ownershipMarkers?: readonly string[];
35
+ processControl?: StopTaskProcessControl;
36
+ processControlOptions?: ProcessControlOptions;
37
+ }
38
+ export declare const INSTRUCTION_STOP_TARGET_PID_MISSING = "INSTRUCTION_STOP_TARGET_PID_MISSING";
39
+ export declare const INSTRUCTION_STOP_EPOCH_MISMATCH = "INSTRUCTION_STOP_EPOCH_MISMATCH";
40
+ export declare const INSTRUCTION_STOP_WORKSPACE_MISMATCH = "INSTRUCTION_STOP_WORKSPACE_MISMATCH";
41
+ export declare const INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED = "INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED";
42
+ export declare const INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED = "INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED";
43
+ export declare const INSTRUCTION_STOP_SETTLE_CAS_FAILED = "INSTRUCTION_STOP_SETTLE_CAS_FAILED";
44
+ export declare const INSTRUCTION_STOP_REQUEST_FAILED = "INSTRUCTION_STOP_REQUEST_FAILED";
45
+ type StopTaskRepository = Pick<TaskRepository, 'requestTaskStop' | 'stopPendingTask' | 'getTask' | 'finalizeTaskStop'>;
46
+ interface InstructionStopRepository {
47
+ requestTaskStop: (options: {
48
+ id: string;
49
+ requestedAt: string;
50
+ sourceRunEpoch: number;
51
+ settleRunEpoch: number;
52
+ workspaceId?: string | null;
53
+ }) => TaskStopRequestResult;
54
+ getTask: (taskId: string) => TaskRow | undefined;
55
+ finalizeTaskStop: (options: FinalizeTaskStopOptions) => boolean;
56
+ }
57
+ export declare function stopTaskGenerationForInstruction(repo: InstructionStopRepository, options: StopTaskGenerationForInstructionOptions): Promise<StopTaskResult>;
58
+ export declare function stopTask(taskId: string, options?: StopTaskOptions): Promise<StopTaskResult>;
59
+ export declare function stopTask(repo: StopTaskRepository, taskId: string, options?: StopTaskOptions): Promise<StopTaskResult>;
60
+ export {};
@@ -0,0 +1,18 @@
1
+ export declare const LOCAL_SERVER_BASE_URL_MAX_LENGTH = 2048;
2
+ export type LocalServerHostClass = 'loopback' | 'private-ipv4' | 'cgnat' | 'unique-local-ipv6';
3
+ export type LocalServerBaseUrlErrorCode = 'invalid_input' | 'url_too_long' | 'invalid_scheme' | 'invalid_url' | 'userinfo_not_allowed' | 'query_not_allowed' | 'fragment_not_allowed' | 'invalid_port' | 'host_not_ip_literal' | 'zone_id' | 'loopback_not_allowed' | 'metadata_address' | 'link_local' | 'multicast' | 'unspecified' | 'ipv4_mapped_ipv6' | 'ip_not_allowed';
4
+ export interface LocalServerBaseUrlOptions {
5
+ allowLoopback?: boolean;
6
+ }
7
+ export interface LocalServerBaseUrlSuccess {
8
+ ok: true;
9
+ normalizedBaseUrl: string;
10
+ hostClass: LocalServerHostClass;
11
+ }
12
+ export interface LocalServerBaseUrlFailure {
13
+ ok: false;
14
+ code: LocalServerBaseUrlErrorCode;
15
+ }
16
+ export type LocalServerBaseUrlResult = LocalServerBaseUrlSuccess | LocalServerBaseUrlFailure;
17
+ export declare function parseLocalServerBaseUrl(value: unknown, options?: LocalServerBaseUrlOptions): LocalServerBaseUrlResult;
18
+ export declare function isAllowedLocalServerIp(value: string, options?: LocalServerBaseUrlOptions): boolean;
@@ -0,0 +1,8 @@
1
+ export { isAllowedLocalServerIp, parseLocalServerBaseUrl, } from './base-url';
2
+ export type { LocalServerBaseUrlErrorCode, LocalServerBaseUrlFailure, LocalServerBaseUrlOptions, LocalServerBaseUrlResult, LocalServerBaseUrlSuccess, LocalServerHostClass, } from './base-url';
3
+ export { DEFAULT_LOCAL_SERVER_PROBE_TIMEOUT_MS, probeLocalServer } from './probe';
4
+ export type { LocalServerDefinition, LocalServerFetch, LocalServerKind, LocalServerModel, LocalServerOpenCodeOverlay, LocalServerProbeOptions, LocalServerProbeReason, LocalServerProbeResponse, LocalServerProbeResult, LocalServerSettings, } from './types';
5
+ export { buildLocalServerOpenCodeOverlay, LocalServerOpenCodeOverlayError, } from './opencode';
6
+ export type { LocalServerOpenCodeOverlayErrorCode } from './opencode';
7
+ export { isLocalServerRuntimeEligible, resolveLocalServerRuntime, LocalServerRuntimeError, LOCAL_AI_SERVER_CONFIG_INVALID, } from './runtime';
8
+ export type { LocalServerRuntimeMetadata, LocalServerRuntimeOptions, LocalServerRuntimeResolution, } from './runtime';
@@ -0,0 +1,8 @@
1
+ import type { LocalServerOpenCodeOverlay, LocalServerSettings } from './types';
2
+ export type LocalServerOpenCodeOverlayErrorCode = 'missing_default_model' | 'invalid_default_model' | 'invalid_label' | 'invalid_provider_id' | 'invalid_api_key_env' | 'invalid_base_url';
3
+ export declare class LocalServerOpenCodeOverlayError extends Error {
4
+ readonly code: LocalServerOpenCodeOverlayErrorCode;
5
+ readonly name = "LocalServerOpenCodeOverlayError";
6
+ constructor(code: LocalServerOpenCodeOverlayErrorCode);
7
+ }
8
+ export declare function buildLocalServerOpenCodeOverlay(settings: LocalServerSettings): LocalServerOpenCodeOverlay;
@@ -0,0 +1,3 @@
1
+ import type { LocalServerProbeOptions, LocalServerProbeResult } from './types.js';
2
+ export declare const DEFAULT_LOCAL_SERVER_PROBE_TIMEOUT_MS = 3000;
3
+ export declare function probeLocalServer(baseUrl: string, options?: LocalServerProbeOptions): Promise<LocalServerProbeResult>;
@@ -0,0 +1,26 @@
1
+ import type { GlobalSettingsStore } from '../config/global-settings';
2
+ export declare const LOCAL_AI_SERVER_CONFIG_INVALID: "LOCAL_AI_SERVER_CONFIG_INVALID";
3
+ export interface LocalServerRuntimeMetadata {
4
+ providerId: string;
5
+ model: string;
6
+ source: 'global_settings';
7
+ }
8
+ export interface LocalServerRuntimeResolution {
9
+ model?: string;
10
+ env?: {
11
+ OPENCODE_CONFIG_CONTENT: string;
12
+ };
13
+ metadata?: LocalServerRuntimeMetadata;
14
+ }
15
+ export interface LocalServerRuntimeOptions {
16
+ effectiveProviderStr: string;
17
+ effectiveModel?: string;
18
+ globalSettings?: GlobalSettingsStore;
19
+ }
20
+ export declare class LocalServerRuntimeError extends Error {
21
+ readonly name = "LocalServerRuntimeError";
22
+ readonly code: "LOCAL_AI_SERVER_CONFIG_INVALID";
23
+ constructor();
24
+ }
25
+ export declare function isLocalServerRuntimeEligible(effectiveProviderStr: string, effectiveModel: string | undefined): boolean;
26
+ export declare function resolveLocalServerRuntime(options: LocalServerRuntimeOptions): LocalServerRuntimeResolution;
@@ -0,0 +1,43 @@
1
+ export type LocalServerKind = 'ollama' | 'lm-studio' | 'unsloth-desktop';
2
+ export interface LocalServerDefinition {
3
+ id: string;
4
+ label: string;
5
+ kind: LocalServerKind;
6
+ baseUrl: string;
7
+ discovery: 'tailscale' | 'manual';
8
+ defaultModel?: string;
9
+ auth?: {
10
+ apiKeyEnv: string;
11
+ };
12
+ }
13
+ export interface LocalServerSettings {
14
+ version: 1;
15
+ definition: LocalServerDefinition;
16
+ verifiedAt: string;
17
+ }
18
+ export interface LocalServerOpenCodeOverlay {
19
+ env: {
20
+ OPENCODE_CONFIG_CONTENT: string;
21
+ };
22
+ model: string;
23
+ providerId: string;
24
+ }
25
+ export interface LocalServerModel {
26
+ id: string;
27
+ }
28
+ export type LocalServerProbeReason = 'http_error' | 'timeout' | 'network_error' | 'invalid_json' | 'invalid_envelope';
29
+ export interface LocalServerProbeResponse {
30
+ readonly ok: boolean;
31
+ json(): Promise<unknown>;
32
+ }
33
+ export type LocalServerFetch = (url: string, init?: RequestInit) => Promise<LocalServerProbeResponse>;
34
+ export interface LocalServerProbeOptions {
35
+ timeoutMs?: number;
36
+ fetch?: LocalServerFetch;
37
+ }
38
+ export interface LocalServerProbeResult {
39
+ ok: boolean;
40
+ models: LocalServerModel[];
41
+ latencyMs: number;
42
+ reason?: LocalServerProbeReason;
43
+ }
@@ -0,0 +1,7 @@
1
+ export type McpAppContractErrorCode = 'APP_ID_INVALID' | 'APP_ID_CONFLICT' | 'TOOL_ID_INVALID' | 'TOOL_ID_CONFLICT' | 'RESOURCE_URI_INVALID' | 'RESOURCE_NOT_FOUND' | 'HTML_INVALID' | 'TOOL_INVALID' | 'STATE_INVALID' | 'STATE_PROJECTION_INVALID' | 'BUTTON_INVALID' | 'SERIALIZATION_INVALID';
2
+ export declare class McpAppContractError extends Error {
3
+ readonly code: McpAppContractErrorCode;
4
+ readonly name = "McpAppContractError";
5
+ constructor(code: McpAppContractErrorCode, message?: string);
6
+ }
7
+ export declare function rejectMcpApp(code: McpAppContractErrorCode, message?: string): never;
@@ -0,0 +1,8 @@
1
+ export type { McpAppContractErrorCode } from './errors.js';
2
+ export { McpAppContractError } from './errors.js';
3
+ export { INSTALLED_APP_ENTRY, InstalledAppRefError, buildInstalledAppRef, validateInstalledAppRef, } from './installed-app-ref.js';
4
+ export type { BuildInstalledAppRefInput, InstalledAppPackageFile, InstalledAppRef, InstalledAppRefErrorCode, } from './installed-app-ref.js';
5
+ export { createMcpAppRegistry, createBuiltinMcpAppRegistry, registerMcpApp, resolveMcpAppResource, requireMcpAppResource, toMcpAppToolRegistration, } from './registry.js';
6
+ export { buildMcpAppStateDescriptor, buildMcpAppStateProjections, buildTerminalMcpAppStateDescriptor, buildTerminalMcpAppStateProjections, createMcpAppToolResult, serializeMcpAppStateJson, serializeMcpAppStateXml, } from './projection.js';
7
+ export { MCP_APP_HOST_TOOL_ALLOWLIST, MCP_APP_RESOURCE_MIME_TYPE, MCP_APP_RESOURCE_URI_PREFIX, } from './types.js';
8
+ export type { McpAppActionDispatcherToolInput, McpAppActionToolDescriptor, McpAppActionToolInput, McpAppButtonDescriptor, McpAppButtonInput, McpAppDescriptor, McpAppDescriptorInput, McpAppInputSchema, McpAppTone, McpUiResourceCsp, McpAppRegistry, McpAppResource, McpAppServerStateInput, McpAppStateDescriptor, McpAppStateProjections, McpAppHostToolInput, McpAppHostToolName, McpAppReadToolInput, McpAppSingleActionToolInput, McpAppToolCommonInput, McpAppToolDescriptor, McpAppToolInput, McpAppToolMetadata, McpAppToolRegistration, McpAppToolResult, McpAppToolVisibility, } from './types.js';
@@ -0,0 +1,25 @@
1
+ import type { UiDefinition, UiDefinitionRef } from '../ui-instance/types.js';
2
+ export declare const INSTALLED_APP_ENTRY: "ui/index.html";
3
+ export type InstalledAppRefErrorCode = 'APP_ID_INVALID' | 'DEFINITION_REF_INVALID' | 'ENTRY_DUPLICATE' | 'ENTRY_PATH_INVALID' | 'ENTRY_MISSING' | 'ENTRY_HASH_INVALID' | 'INSTALLED_APP_REF_INVALID';
4
+ export declare class InstalledAppRefError extends Error {
5
+ readonly code: InstalledAppRefErrorCode;
6
+ readonly name = "InstalledAppRefError";
7
+ constructor(code: InstalledAppRefErrorCode, message?: string);
8
+ }
9
+ export interface InstalledAppRef {
10
+ readonly appId: string;
11
+ readonly definition: UiDefinitionRef;
12
+ readonly entry: typeof INSTALLED_APP_ENTRY;
13
+ readonly entryHash: string;
14
+ }
15
+ export interface InstalledAppPackageFile {
16
+ readonly path: string;
17
+ readonly sha256: string;
18
+ }
19
+ export interface BuildInstalledAppRefInput {
20
+ readonly appId: string;
21
+ readonly definition: UiDefinition;
22
+ readonly packageFiles: readonly InstalledAppPackageFile[];
23
+ }
24
+ export declare function validateInstalledAppRef(value: unknown): InstalledAppRef;
25
+ export declare function buildInstalledAppRef(input: BuildInstalledAppRefInput): InstalledAppRef;
@@ -0,0 +1,12 @@
1
+ import type { JsonObject } from '../ui-instance/types.js';
2
+ import type { McpAppServerStateInput, McpAppStateDescriptor, McpAppStateProjections, McpAppToolDescriptor, McpAppToolResult } from './types.js';
3
+ export declare function buildMcpAppStateDescriptor(input: McpAppServerStateInput): McpAppStateDescriptor;
4
+ export declare function buildTerminalMcpAppStateDescriptor(input: McpAppServerStateInput): McpAppStateDescriptor;
5
+ export declare function serializeMcpAppStateJson(descriptor: McpAppStateDescriptor): string;
6
+ export declare function serializeMcpAppStateXml(descriptor: McpAppStateDescriptor): string;
7
+ export declare function buildMcpAppStateProjections(input: McpAppServerStateInput): McpAppStateProjections;
8
+ export declare function buildTerminalMcpAppStateProjections(input: McpAppServerStateInput): McpAppStateProjections;
9
+ export declare function createMcpAppToolResult(tool: Pick<McpAppToolDescriptor, 'textFallback'>, options?: {
10
+ structuredContent?: JsonObject;
11
+ meta?: JsonObject;
12
+ }): McpAppToolResult;
@@ -0,0 +1,7 @@
1
+ import { type McpAppDescriptor, type McpAppDescriptorInput, type McpAppRegistry, type McpAppResource, type McpAppToolDescriptor, type McpAppToolRegistration } from './types.js';
2
+ export declare function createMcpAppRegistry(): McpAppRegistry;
3
+ export declare function createBuiltinMcpAppRegistry(): McpAppRegistry;
4
+ export declare function registerMcpApp(registry: McpAppRegistry, input: McpAppDescriptorInput): McpAppDescriptor;
5
+ export declare function resolveMcpAppResource(registry: McpAppRegistry, uri: string): McpAppResource | null;
6
+ export declare function requireMcpAppResource(registry: McpAppRegistry, uri: string): McpAppResource;
7
+ export declare function toMcpAppToolRegistration(tool: McpAppToolDescriptor): McpAppToolRegistration;
@@ -0,0 +1,165 @@
1
+ import type { JsonObject, UiDefinition, UiDefinitionRef, UiInstance, UiInstanceStatus, UiActionConfirmation } from '../ui-instance/types.js';
2
+ export declare const MCP_APP_RESOURCE_MIME_TYPE: "text/html;profile=mcp-app";
3
+ export declare const MCP_APP_RESOURCE_URI_PREFIX = "ui://crewx/";
4
+ export type McpAppToolVisibility = 'model' | 'app';
5
+ export type McpAppTone = 'blue' | 'violet' | 'emerald' | 'amber' | 'rose' | 'sky' | 'slate' | 'indigo';
6
+ export declare const MCP_APP_HOST_TOOL_ALLOWLIST: readonly ["crewx_app_terminal_connect"];
7
+ export type McpAppHostToolName = typeof MCP_APP_HOST_TOOL_ALLOWLIST[number];
8
+ export interface McpUiResourceCsp {
9
+ readonly connectDomains?: readonly string[];
10
+ readonly resourceDomains?: readonly string[];
11
+ readonly frameDomains?: readonly string[];
12
+ readonly baseUriDomains?: readonly string[];
13
+ }
14
+ export type McpAppInputSchema = JsonObject;
15
+ export interface McpAppToolCommonInput {
16
+ readonly name: string;
17
+ readonly description: string;
18
+ readonly inputSchema: McpAppInputSchema;
19
+ readonly textFallback: string;
20
+ readonly visibility: readonly McpAppToolVisibility[];
21
+ }
22
+ export interface McpAppReadToolInput extends McpAppToolCommonInput {
23
+ readonly kind: 'read';
24
+ readonly actionId?: never;
25
+ }
26
+ export interface McpAppSingleActionToolInput extends McpAppToolCommonInput {
27
+ readonly kind: 'action';
28
+ readonly actionId: string;
29
+ readonly actionIds?: never;
30
+ }
31
+ export interface McpAppActionDispatcherToolInput extends McpAppToolCommonInput {
32
+ readonly kind: 'action';
33
+ readonly actionId?: never;
34
+ readonly actionIds: readonly string[];
35
+ }
36
+ export type McpAppActionToolInput = McpAppSingleActionToolInput | McpAppActionDispatcherToolInput;
37
+ export type McpAppActionToolDescriptor = (Omit<McpAppSingleActionToolInput, 'actionIds'> & {
38
+ readonly actionIds: readonly string[];
39
+ }) | (Omit<McpAppActionDispatcherToolInput, 'actionId'> & {
40
+ readonly actionIds: readonly string[];
41
+ });
42
+ type McpAppToolDescriptorMetadata = {
43
+ readonly resourceUri: string;
44
+ readonly _meta: McpAppToolMetadata;
45
+ };
46
+ export interface McpAppHostToolInput extends Omit<McpAppToolCommonInput, 'name' | 'visibility'> {
47
+ readonly name: McpAppHostToolName;
48
+ readonly kind: 'host';
49
+ readonly visibility: readonly ['app'];
50
+ readonly actionId?: never;
51
+ }
52
+ export type McpAppToolInput = McpAppReadToolInput | McpAppActionToolInput | McpAppHostToolInput;
53
+ export interface McpAppDescriptorInput {
54
+ readonly appId: string;
55
+ readonly html: string;
56
+ readonly name?: string;
57
+ readonly description?: string;
58
+ readonly icon?: string;
59
+ readonly tone?: McpAppTone;
60
+ readonly builtinOnly?: boolean;
61
+ readonly csp?: McpUiResourceCsp;
62
+ readonly tools: readonly McpAppToolInput[];
63
+ readonly definition?: UiDefinition;
64
+ }
65
+ export interface McpAppResource {
66
+ readonly uri: string;
67
+ readonly mimeType: typeof MCP_APP_RESOURCE_MIME_TYPE;
68
+ readonly text: string;
69
+ readonly _meta?: {
70
+ readonly ui?: {
71
+ readonly csp?: McpUiResourceCsp;
72
+ };
73
+ };
74
+ }
75
+ export interface McpAppToolMetadata {
76
+ readonly ui: {
77
+ readonly resourceUri: string;
78
+ readonly visibility: readonly McpAppToolVisibility[];
79
+ };
80
+ }
81
+ export type McpAppToolDescriptor = (McpAppReadToolInput & McpAppToolDescriptorMetadata) | (McpAppActionToolDescriptor & McpAppToolDescriptorMetadata) | (McpAppHostToolInput & McpAppToolDescriptorMetadata);
82
+ export interface McpAppToolRegistration {
83
+ readonly name: string;
84
+ readonly description: string;
85
+ readonly inputSchema: McpAppInputSchema;
86
+ readonly _meta: McpAppToolMetadata;
87
+ }
88
+ export interface McpAppDescriptor {
89
+ readonly appId: string;
90
+ readonly name: string;
91
+ readonly description: string;
92
+ readonly icon?: string;
93
+ readonly tone?: McpAppTone;
94
+ readonly builtinOnly: boolean;
95
+ readonly csp?: McpUiResourceCsp;
96
+ readonly uiUri: string;
97
+ readonly html: string;
98
+ readonly definition?: UiDefinition;
99
+ readonly tools: readonly McpAppToolDescriptor[];
100
+ }
101
+ export interface McpAppToolResult {
102
+ readonly content: readonly [{
103
+ readonly type: 'text';
104
+ readonly text: string;
105
+ }];
106
+ readonly structuredContent?: JsonObject;
107
+ readonly _meta?: JsonObject;
108
+ }
109
+ export interface McpAppButtonInput {
110
+ readonly id: string;
111
+ readonly label: string;
112
+ readonly enabled: boolean;
113
+ readonly confirmation?: UiActionConfirmation;
114
+ readonly requiresHumanConfirmation?: boolean;
115
+ readonly disabledReason?: string;
116
+ readonly inputSchema: McpAppInputSchema;
117
+ }
118
+ export interface McpAppServerStateInput {
119
+ readonly source: 'server';
120
+ readonly instance: Pick<UiInstance, 'id' | 'definition' | 'revision' | 'status' | 'state'>;
121
+ readonly definition: UiDefinition;
122
+ readonly buttons: readonly McpAppButtonInput[];
123
+ }
124
+ export interface McpAppButtonDescriptor {
125
+ readonly id: string;
126
+ readonly label: string;
127
+ readonly enabled: boolean;
128
+ readonly confirmation: UiActionConfirmation;
129
+ readonly requiresHumanConfirmation?: boolean;
130
+ readonly disabledReason: string | null;
131
+ readonly inputSchema: McpAppInputSchema;
132
+ }
133
+ export interface McpAppStateDescriptor {
134
+ readonly schemaVersion: 1;
135
+ readonly source: 'server';
136
+ readonly instanceId: string;
137
+ readonly definition: UiDefinitionRef;
138
+ readonly revision: number;
139
+ readonly status: UiInstanceStatus;
140
+ readonly state: JsonObject;
141
+ readonly buttons: readonly McpAppButtonDescriptor[];
142
+ }
143
+ export interface McpAppStateProjections {
144
+ readonly descriptor: McpAppStateDescriptor;
145
+ readonly card: McpAppStateDescriptor;
146
+ readonly developer: {
147
+ readonly descriptor: McpAppStateDescriptor;
148
+ readonly json: string;
149
+ };
150
+ readonly ai: {
151
+ readonly descriptor: McpAppStateDescriptor;
152
+ readonly json: string;
153
+ readonly xml: string;
154
+ };
155
+ }
156
+ export interface McpAppRegistry {
157
+ registerMcpApp(input: McpAppDescriptorInput): McpAppDescriptor;
158
+ getMcpApp(appId: string): McpAppDescriptor | null;
159
+ listMcpApps(): readonly McpAppDescriptor[];
160
+ listMcpAppTools(): readonly McpAppToolDescriptor[];
161
+ resolveMcpAppTool(toolName: string): McpAppToolDescriptor | null;
162
+ resolveMcpAppResource(uri: string): McpAppResource | null;
163
+ requireMcpAppResource(uri: string): McpAppResource;
164
+ }
165
+ export {};
@@ -0,0 +1,17 @@
1
+ CREATE TABLE IF NOT EXISTS `usage_reports` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `workspace_id` text NOT NULL,
4
+ `month` text NOT NULL,
5
+ `generated_at` text NOT NULL,
6
+ `source_range` text NOT NULL,
7
+ `tier` text NOT NULL,
8
+ `total_tokens` integer NOT NULL,
9
+ `total_cost_usd` real NOT NULL,
10
+ `payload` text NOT NULL,
11
+ `payload_hash` text,
12
+ `signature` text,
13
+ `signed_at` text,
14
+ `issuer` text
15
+ );
16
+ --> statement-breakpoint
17
+ CREATE UNIQUE INDEX IF NOT EXISTS `uniq_usage_reports_ws_month` ON `usage_reports` (`workspace_id`,`month`);
@@ -0,0 +1 @@
1
+ CREATE INDEX IF NOT EXISTS `idx_threads_ws_updated` ON `threads` (`workspace_id`,`updated_at`);
@@ -0,0 +1,6 @@
1
+ -- Custom SQL migration file, put your code below! --
2
+ -- WI-20260706-006: seed sqlite_stat1 so the query planner has index
3
+ -- selectivity data from the very first run on a fresh DB (idempotent).
4
+ PRAGMA analysis_limit = 400;
5
+ --> statement-breakpoint
6
+ ANALYZE;
@@ -0,0 +1 @@
1
+ CREATE INDEX IF NOT EXISTS `idx_threads_title` ON `threads` (`title`);
@@ -0,0 +1,23 @@
1
+ CREATE TABLE IF NOT EXISTS `notification_reads` (
2
+ `notification_id` text NOT NULL,
3
+ `user_id` text NOT NULL,
4
+ `read_at` text NOT NULL,
5
+ PRIMARY KEY(`notification_id`, `user_id`)
6
+ );
7
+ --> statement-breakpoint
8
+ CREATE TABLE IF NOT EXISTS `notifications` (
9
+ `id` text PRIMARY KEY NOT NULL,
10
+ `workspace_id` text NOT NULL,
11
+ `agent_id` text,
12
+ `task_id` text,
13
+ `thread_id` text,
14
+ `source` text DEFAULT 'agent' NOT NULL,
15
+ `level` text DEFAULT 'info' NOT NULL,
16
+ `title` text NOT NULL,
17
+ `body` text,
18
+ `target_user_id` text,
19
+ `created_at` text NOT NULL,
20
+ `metadata` text
21
+ );
22
+ --> statement-breakpoint
23
+ CREATE INDEX IF NOT EXISTS `idx_notifications_ws_created` ON `notifications` (`workspace_id`,"created_at" DESC);
@@ -0,0 +1,15 @@
1
+ CREATE TABLE IF NOT EXISTS `agent_suggestions` (
2
+ `id` text PRIMARY KEY NOT NULL,
3
+ `workspace_id` text NOT NULL,
4
+ `agent_id` text NOT NULL,
5
+ `task_id` text,
6
+ `type` text NOT NULL,
7
+ `status` text DEFAULT 'pending' NOT NULL,
8
+ `payload` text NOT NULL,
9
+ `applied_commit_sha` text,
10
+ `created_at` text NOT NULL,
11
+ `updated_at` text NOT NULL
12
+ );
13
+ --> statement-breakpoint
14
+ CREATE INDEX IF NOT EXISTS `idx_agent_suggestions_ws_agent` ON `agent_suggestions` (`workspace_id`,`agent_id`);--> statement-breakpoint
15
+ CREATE INDEX IF NOT EXISTS `idx_agent_suggestions_ws_created` ON `agent_suggestions` (`workspace_id`,`created_at`);