@crewx/sdk 0.9.0-rc.19 → 0.9.0-rc.191

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 (397) 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 +11 -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 +59 -6
  12. package/dist/agent/agent-list-view.d.ts +19 -0
  13. package/dist/agent-interceptor/chain.d.ts +25 -0
  14. package/dist/agent-interceptor/index.d.ts +6 -0
  15. package/dist/agent-interceptor/model-runner.d.ts +19 -0
  16. package/dist/agent-interceptor/program-runner.d.ts +13 -0
  17. package/dist/agent-interceptor/protocol.d.ts +68 -0
  18. package/dist/agent-interceptor/run-stop.d.ts +3 -0
  19. package/dist/agent-interceptor/schema.d.ts +267 -0
  20. package/dist/agent-interceptor/types.d.ts +88 -0
  21. package/dist/app/app-files/args.d.ts +12 -0
  22. package/dist/app/app-files/errors.d.ts +6 -0
  23. package/dist/app/app-files/index.d.ts +35 -0
  24. package/dist/app/app-files/lock.d.ts +26 -0
  25. package/dist/app/app-files/root.d.ts +22 -0
  26. package/dist/app/app-files/store.d.ts +48 -0
  27. package/dist/app/app-files/write.child.d.ts +1 -0
  28. package/dist/app/app.d.ts +168 -0
  29. package/dist/app/backend-env.d.ts +3 -0
  30. package/dist/app/content-media-types.d.ts +2 -0
  31. package/dist/app/context.d.ts +2 -0
  32. package/dist/app/entry.d.ts +9 -0
  33. package/dist/app/frame.d.ts +55 -0
  34. package/dist/app/index.d.ts +20 -0
  35. package/dist/app/index.js +13 -0
  36. package/dist/app/job-bridge.child.d.ts +1 -0
  37. package/dist/app/job-bridge.d.ts +67 -0
  38. package/dist/app/job-bridge.drain.child.d.ts +1 -0
  39. package/dist/app/job-bridge.example.d.ts +11 -0
  40. package/dist/app/job-contract.d.ts +40 -0
  41. package/dist/app/job-wire.d.ts +149 -0
  42. package/dist/app/protocol.d.ts +9 -0
  43. package/dist/app/runtime.d.ts +23 -0
  44. package/dist/app/schedule-contract.d.ts +59 -0
  45. package/dist/app/tool-mode.d.ts +3 -0
  46. package/dist/app-artifact-policy/check.d.ts +2 -0
  47. package/dist/app-artifact-policy/contract.d.ts +54 -0
  48. package/dist/app-artifact-policy/helper.d.ts +15 -0
  49. package/dist/app-artifact-policy/index.d.ts +3 -0
  50. package/dist/app-artifact-policy/index.js +18 -0
  51. package/dist/app-artifact-policy/paths.d.ts +24 -0
  52. package/dist/app-artifact-policy/scan.d.ts +47 -0
  53. package/dist/app-ui/index.d.ts +83 -0
  54. package/dist/app-ui/index.js +1 -0
  55. package/dist/attachment-receive/index.d.ts +76 -0
  56. package/dist/attachment-receive/index.js +2 -0
  57. package/dist/boxing/box.types.d.ts +4 -0
  58. package/dist/config/canonicalize-agent-options.d.ts +18 -0
  59. package/dist/config/default-agent-models.d.ts +11 -0
  60. package/dist/config/global-settings.d.ts +33 -0
  61. package/dist/config/migrate-grok-mode.d.ts +6 -0
  62. package/dist/config/model-compat.d.ts +31 -0
  63. package/dist/config/models.generated.d.ts +37 -0
  64. package/dist/config/models.remote.d.ts +1 -0
  65. package/dist/config/overdrive.d.ts +7 -0
  66. package/dist/config/pricing.d.ts +6 -3
  67. package/dist/config/pricing.generated.d.ts +4 -0
  68. package/dist/config/pricing.types.d.ts +4 -0
  69. package/dist/config/timeout.config.d.ts +4 -0
  70. package/dist/config/wi-boards.d.ts +19 -0
  71. package/dist/context-budget/continuity.d.ts +64 -0
  72. package/dist/context-budget/index.d.ts +158 -0
  73. package/dist/conversation/index.d.ts +1 -1
  74. package/dist/conversation/sqlite-provider.d.ts +6 -3
  75. package/dist/conversation/to-template-messages.d.ts +9 -0
  76. package/dist/conversation/types.d.ts +86 -1
  77. package/dist/desktop/command-runner.d.ts +4 -0
  78. package/dist/desktop/default-adapters.d.ts +4 -0
  79. package/dist/desktop/global-install.d.ts +19 -0
  80. package/dist/desktop/index.d.ts +3 -0
  81. package/dist/desktop/index.js +3 -0
  82. package/dist/desktop/install.d.ts +5 -0
  83. package/dist/desktop/lnk.d.ts +22 -0
  84. package/dist/desktop/manifest.d.ts +21 -0
  85. package/dist/desktop/types.d.ts +67 -0
  86. package/dist/desktop/version.d.ts +1 -0
  87. package/dist/desktop/windows-paths.d.ts +21 -0
  88. package/dist/desktop/wrapper.d.ts +18 -0
  89. package/dist/esm/account/index.js +2 -0
  90. package/dist/esm/app/index.js +13 -0
  91. package/dist/esm/app-artifact-policy/index.js +18 -0
  92. package/dist/esm/attachment-receive/index.js +2 -0
  93. package/dist/esm/desktop/index.js +3 -0
  94. package/dist/esm/history-snapshot/index.js +16 -0
  95. package/dist/esm/index.js +1350 -224
  96. package/dist/esm/node/index.js +2 -0
  97. package/dist/esm/plugins/index.js +532 -214
  98. package/dist/esm/process/index.js +1 -0
  99. package/dist/esm/publish/index.js +2 -0
  100. package/dist/esm/repository/index.js +792 -207
  101. package/dist/esm/skills/index.js +2 -0
  102. package/dist/esm/testing/index.js +1 -1
  103. package/dist/events/types.d.ts +44 -0
  104. package/dist/facade/Crewx.d.ts +74 -5
  105. package/dist/facade/task-ticket.d.ts +14 -0
  106. package/dist/highlight/thread-highlight-prompt.d.ts +2 -0
  107. package/dist/highlight/thread-highlighter.d.ts +326 -0
  108. package/dist/history-snapshot/index.d.ts +82 -0
  109. package/dist/history-snapshot/index.js +16 -0
  110. package/dist/index.browser.d.ts +25 -1
  111. package/dist/index.browser.js +6 -2
  112. package/dist/index.d.ts +164 -17
  113. package/dist/index.js +1350 -224
  114. package/dist/internal/console-decoder.d.ts +38 -0
  115. package/dist/internal/windows-spawn.d.ts +10 -0
  116. package/dist/layout/types.d.ts +18 -1
  117. package/dist/lifecycle/process-lease.d.ts +80 -0
  118. package/dist/lifecycle/process-owner.d.ts +20 -0
  119. package/dist/lifecycle/task-heartbeat.d.ts +41 -0
  120. package/dist/lifecycle/task-stop.d.ts +108 -0
  121. package/dist/lifecycle/update-admission.d.ts +45 -0
  122. package/dist/local-server/base-url.d.ts +18 -0
  123. package/dist/local-server/index.d.ts +8 -0
  124. package/dist/local-server/opencode.d.ts +8 -0
  125. package/dist/local-server/probe.d.ts +3 -0
  126. package/dist/local-server/runtime.d.ts +26 -0
  127. package/dist/local-server/types.d.ts +43 -0
  128. package/dist/mcp-app/agent-access.d.ts +33 -0
  129. package/dist/mcp-app/app-handoff.d.ts +109 -0
  130. package/dist/mcp-app/app-icon-read.d.ts +7 -0
  131. package/dist/mcp-app/app-job-bridge.d.ts +30 -0
  132. package/dist/mcp-app/app-job-bridge.example.d.ts +36 -0
  133. package/dist/mcp-app/app-job.d.ts +168 -0
  134. package/dist/mcp-app/app-schedule.d.ts +85 -0
  135. package/dist/mcp-app/apps-context.d.ts +32 -0
  136. package/dist/mcp-app/bundle-provenance.d.ts +3 -0
  137. package/dist/mcp-app/candidate-registration.d.ts +4 -0
  138. package/dist/mcp-app/card-handler.d.ts +7 -0
  139. package/dist/mcp-app/catalog.d.ts +7 -0
  140. package/dist/mcp-app/content-channel.d.ts +86 -0
  141. package/dist/mcp-app/content-declarations.d.ts +31 -0
  142. package/dist/mcp-app/dev-checks.d.ts +31 -0
  143. package/dist/mcp-app/diagnostic-reason.d.ts +3 -0
  144. package/dist/mcp-app/discovery.d.ts +164 -0
  145. package/dist/mcp-app/errors.d.ts +7 -0
  146. package/dist/mcp-app/index.d.ts +46 -0
  147. package/dist/mcp-app/installed-app-ref.d.ts +25 -0
  148. package/dist/mcp-app/model-context.d.ts +29 -0
  149. package/dist/mcp-app/node-app-discovery-fs.d.ts +23 -0
  150. package/dist/mcp-app/product-bundle-assets.d.ts +27 -0
  151. package/dist/mcp-app/product-bundle-loader.d.ts +53 -0
  152. package/dist/mcp-app/projection.d.ts +14 -0
  153. package/dist/mcp-app/prompt-cards.d.ts +28 -0
  154. package/dist/mcp-app/registry.d.ts +28 -0
  155. package/dist/mcp-app/skill-backend.d.ts +141 -0
  156. package/dist/mcp-app/state-set.d.ts +9 -0
  157. package/dist/mcp-app/types.d.ts +501 -0
  158. package/dist/mcp-app/view-call.d.ts +7 -0
  159. package/dist/mcp-app/workspace-app-assets.d.ts +42 -0
  160. package/dist/mcp-app/workspace-app-scan-cache.d.ts +27 -0
  161. package/dist/mcp-app/workspace-snapshot.d.ts +81 -0
  162. package/dist/migrations/0011_far_black_tarantula.sql +1 -0
  163. package/dist/migrations/0012_blue_turbo.sql +23 -0
  164. package/dist/migrations/0013_hesitant_adam_destine.sql +15 -0
  165. package/dist/migrations/0014_organic_mongu.sql +73 -0
  166. package/dist/migrations/0015_panoramic_gorilla_man.sql +71 -0
  167. package/dist/migrations/0016_fuzzy_hemingway.sql +14 -0
  168. package/dist/migrations/0017_project_stage_sdk_migration.sql +29 -0
  169. package/dist/migrations/0018_bored_jackal.sql +33 -0
  170. package/dist/migrations/0019_backfill_task_thread_ids.sql +74 -0
  171. package/dist/migrations/0020_useful_iron_lad.sql +55 -0
  172. package/dist/migrations/0021_dashing_peter_quill.sql +51 -0
  173. package/dist/migrations/0022_wandering_bucky.sql +1 -0
  174. package/dist/migrations/0023_red_payback.sql +1 -0
  175. package/dist/migrations/0024_storage_metadata.sql +262 -0
  176. package/dist/migrations/0025_task_heartbeat.sql +8 -0
  177. package/dist/migrations/0025_thread_app_instance_ledger.sql +2 -0
  178. package/dist/migrations/0026_mcp_action_source.sql +47 -0
  179. package/dist/migrations/0027_task_stop_scope_cleanup.sql +5 -0
  180. package/dist/migrations/0027_ui_instance_active_unique.sql +2 -0
  181. package/dist/migrations/0029_nice_rhino.sql +1 -0
  182. package/dist/migrations/0031_petite_arclight.sql +6 -0
  183. package/dist/migrations/0032_ui_instance_opened_by.sql +1 -0
  184. package/dist/migrations/0033_thread_creator_boundary_guard.sql +38 -0
  185. package/dist/migrations/0034_keen_fallen_one.sql +36 -0
  186. package/dist/migrations/0035_request_log_daily.sql +11 -0
  187. package/dist/migrations/0036_ui_definition_archive.sql +8 -0
  188. package/dist/migrations/0037_ui_instance_agent_open_request.sql +1 -0
  189. package/dist/migrations/0038_task_rating.sql +3 -0
  190. package/dist/migrations/0039_aspiring_purifiers.sql +9 -0
  191. package/dist/migrations/0040_task_provider_inputs.sql +53 -0
  192. package/dist/migrations/0041_tranquil_vivisector.sql +54 -0
  193. package/dist/migrations/0042_breezy_blue_shield.sql +31 -0
  194. package/dist/migrations/0043_nervous_darkstar.sql +1 -0
  195. package/dist/migrations/0044_military_galactus.sql +8 -0
  196. package/dist/migrations/0045_task_pid_started_at.sql +1 -0
  197. package/dist/migrations/0046_acoustic_karnak.sql +49 -0
  198. package/dist/migrations/0047_doc_sync_connect_requests.sql +18 -0
  199. package/dist/migrations/meta/0011_snapshot.json +1342 -0
  200. package/dist/migrations/meta/0012_snapshot.json +1494 -0
  201. package/dist/migrations/meta/0013_snapshot.json +1592 -0
  202. package/dist/migrations/meta/0014_snapshot.json +1975 -0
  203. package/dist/migrations/meta/0015_snapshot.json +2315 -0
  204. package/dist/migrations/meta/0016_snapshot.json +2419 -0
  205. package/dist/migrations/meta/0017_snapshot.json +2419 -0
  206. package/dist/migrations/meta/0018_snapshot.json +2570 -0
  207. package/dist/migrations/meta/0020_snapshot.json +2895 -0
  208. package/dist/migrations/meta/0021_snapshot.json +3031 -0
  209. package/dist/migrations/meta/0022_snapshot.json +3039 -0
  210. package/dist/migrations/meta/0023_snapshot.json +3047 -0
  211. package/dist/migrations/meta/0029_snapshot.json +3206 -0
  212. package/dist/migrations/meta/0031_snapshot.json +3251 -0
  213. package/dist/migrations/meta/0034_snapshot.json +3473 -0
  214. package/dist/migrations/meta/0035_snapshot.json +3547 -0
  215. package/dist/migrations/meta/0036_snapshot.json +3591 -0
  216. package/dist/migrations/meta/0037_snapshot.json +3598 -0
  217. package/dist/migrations/meta/0038_snapshot.json +3626 -0
  218. package/dist/migrations/meta/0039_snapshot.json +3684 -0
  219. package/dist/migrations/meta/0040_snapshot.json +3759 -0
  220. package/dist/migrations/meta/0041_snapshot.json +4156 -0
  221. package/dist/migrations/meta/0042_snapshot.json +4383 -0
  222. package/dist/migrations/meta/0043_snapshot.json +4390 -0
  223. package/dist/migrations/meta/0044_snapshot.json +4435 -0
  224. package/dist/migrations/meta/0045_snapshot.json +4442 -0
  225. package/dist/migrations/meta/0046_snapshot.json +4733 -0
  226. package/dist/migrations/meta/0047_snapshot.json +4832 -0
  227. package/dist/migrations/meta/_journal.json +259 -0
  228. package/dist/node/index.d.ts +1 -0
  229. package/dist/node/index.js +2 -0
  230. package/dist/paths.d.ts +1 -0
  231. package/dist/plugin/types.d.ts +1 -0
  232. package/dist/plugins/index.d.ts +1 -1
  233. package/dist/plugins/index.js +532 -214
  234. package/dist/plugins/sqlite-tracing.d.ts +46 -0
  235. package/dist/process/index.d.ts +2 -0
  236. package/dist/process/index.js +1 -0
  237. package/dist/process/process-control.d.ts +74 -0
  238. package/dist/prompt/tag-names.d.ts +22 -0
  239. package/dist/provider/acp/adapter.d.ts +37 -2
  240. package/dist/provider/acp/adapters/antigravity-account.d.ts +4 -0
  241. package/dist/provider/acp/completion-observer.d.ts +24 -0
  242. package/dist/provider/acp/connection.d.ts +69 -3
  243. package/dist/provider/acp/index.d.ts +3 -3
  244. package/dist/provider/acp/meta.d.ts +11 -0
  245. package/dist/provider/acp/register.d.ts +1 -0
  246. package/dist/provider/acp/runtime.d.ts +1 -0
  247. package/dist/provider/acp/types.d.ts +31 -4
  248. package/dist/provider/bridge.browser.d.ts +3 -0
  249. package/dist/provider/bridge.d.ts +25 -3
  250. package/dist/provider/classify-task-error.d.ts +2 -0
  251. package/dist/provider/claude-agent-env.d.ts +1 -0
  252. package/dist/provider/cli/adapter.types.d.ts +26 -2
  253. package/dist/provider/cli/adapters/agent-call.util.d.ts +1 -1
  254. package/dist/provider/cli/adapters/antigravity-stream.d.ts +27 -0
  255. package/dist/provider/cli/adapters/antigravity.d.ts +1 -0
  256. package/dist/provider/cli/adapters/cli-knob.util.d.ts +7 -0
  257. package/dist/provider/cli/adapters/codex-item.d.ts +1 -0
  258. package/dist/provider/cli/adapters/event-timestamp.util.d.ts +1 -0
  259. package/dist/provider/cli/adapters/grok.d.ts +2 -0
  260. package/dist/provider/cli/adapters/index.d.ts +5 -0
  261. package/dist/provider/cli/index.d.ts +3 -2
  262. package/dist/provider/cli/meta.d.ts +5 -0
  263. package/dist/provider/cli/protocol-envelope.d.ts +3 -0
  264. package/dist/provider/errors.d.ts +5 -1
  265. package/dist/provider/idle-watchdog.d.ts +19 -0
  266. package/dist/provider/models.d.ts +17 -12
  267. package/dist/provider/order.d.ts +1 -1
  268. package/dist/provider/parse-usage.d.ts +6 -0
  269. package/dist/provider/provider-selection.d.ts +8 -0
  270. package/dist/provider/redact-technical-message.d.ts +1 -0
  271. package/dist/provider/task-error.types.d.ts +17 -0
  272. package/dist/provider-account/accounts.d.ts +15 -0
  273. package/dist/provider-account/antigravity-acp/auth.d.ts +29 -0
  274. package/dist/provider-account/antigravity-acp/browser.d.ts +4 -0
  275. package/dist/provider-account/antigravity-acp/install.d.ts +42 -0
  276. package/dist/provider-account/antigravity-acp/lease.d.ts +23 -0
  277. package/dist/provider-account/antigravity-acp/lifecycle.d.ts +76 -0
  278. package/dist/provider-account/antigravity-acp/manifest.d.ts +76 -0
  279. package/dist/provider-account/antigravity-acp/profile.d.ts +4 -0
  280. package/dist/provider-account/capabilities.d.ts +6 -0
  281. package/dist/provider-account/index.d.ts +13 -0
  282. package/dist/provider-account/registry.d.ts +30 -0
  283. package/dist/provider-account/types.d.ts +47 -0
  284. package/dist/publish/constants.d.ts +6 -0
  285. package/dist/publish/errors.d.ts +7 -0
  286. package/dist/publish/index.d.ts +55 -0
  287. package/dist/publish/index.js +2 -0
  288. package/dist/publish/manifest.d.ts +47 -0
  289. package/dist/publish/marketplace-api.constants.d.ts +1 -0
  290. package/dist/publish/pack.d.ts +6 -0
  291. package/dist/publish/scan.d.ts +10 -0
  292. package/dist/publish/secrets.d.ts +6 -0
  293. package/dist/publish/upload.d.ts +19 -0
  294. package/dist/remote/execution-profile.d.ts +9 -0
  295. package/dist/remote/index.d.ts +1 -0
  296. package/dist/remote/types.d.ts +28 -0
  297. package/dist/repository/agent-send-history.repository.d.ts +23 -0
  298. package/dist/repository/agent-suggestion.repository.d.ts +34 -0
  299. package/dist/repository/base-sqlite-repository.d.ts +1 -0
  300. package/dist/repository/common-code.repository.d.ts +45 -0
  301. package/dist/repository/db.d.ts +13 -1
  302. package/dist/repository/index.d.ts +62 -6
  303. package/dist/repository/index.js +792 -207
  304. package/dist/repository/logs-db.d.ts +12 -0
  305. package/dist/repository/notification.repository.d.ts +58 -0
  306. package/dist/repository/project.repository.d.ts +90 -0
  307. package/dist/repository/public-task-answer.d.ts +24 -0
  308. package/dist/repository/request-log-mover.d.ts +70 -0
  309. package/dist/repository/request-log.repository.d.ts +7 -3
  310. package/dist/repository/run-columns.d.ts +10 -0
  311. package/dist/repository/run-history.repository.d.ts +112 -0
  312. package/dist/repository/schedule-run.repository.d.ts +103 -0
  313. package/dist/repository/sidebar-tab.repository.d.ts +86 -0
  314. package/dist/repository/storage-metadata.repository.d.ts +64 -0
  315. package/dist/repository/task-log-migration.d.ts +74 -0
  316. package/dist/repository/task-log.repository.d.ts +47 -0
  317. package/dist/repository/task-status.d.ts +21 -0
  318. package/dist/repository/task.repository.d.ts +320 -8
  319. package/dist/repository/thread-history.repository.d.ts +193 -0
  320. package/dist/repository/thread-origin-verdict.d.ts +27 -0
  321. package/dist/repository/thread-title.types.d.ts +29 -0
  322. package/dist/repository/thread.repository.d.ts +134 -5
  323. package/dist/repository/usage-backfill.d.ts +62 -0
  324. package/dist/repository/usage-from-logs.d.ts +22 -0
  325. package/dist/repository/workflow-anchor-kinds.d.ts +4 -0
  326. package/dist/repository/workspace.repository.d.ts +3 -0
  327. package/dist/schema/agent-send-history.d.ts +85 -0
  328. package/dist/schema/agent-suggestions.d.ts +199 -0
  329. package/dist/schema/common-codes.d.ts +216 -0
  330. package/dist/schema/doc-sync-connect-requests.d.ts +140 -0
  331. package/dist/schema/doc-sync-links.d.ts +481 -0
  332. package/dist/schema/index.d.ts +20 -0
  333. package/dist/schema/notifications.d.ts +303 -0
  334. package/dist/schema/projects.d.ts +610 -0
  335. package/dist/schema/request-log-daily.d.ts +151 -0
  336. package/dist/schema/run-column-backfill.d.ts +81 -0
  337. package/dist/schema/schedule-runs.d.ts +451 -0
  338. package/dist/schema/sidebar-tabs.d.ts +466 -0
  339. package/dist/schema/storage-metadata.d.ts +181 -0
  340. package/dist/schema/task-log-events.d.ts +119 -0
  341. package/dist/schema/task-provider-inputs.d.ts +100 -0
  342. package/dist/schema/tasks.d.ts +1172 -1
  343. package/dist/schema/thread-creator-unverified.d.ts +45 -0
  344. package/dist/schema/thread-history.d.ts +734 -0
  345. package/dist/schema/threads.d.ts +59 -0
  346. package/dist/schema/ui-action-receipts.d.ts +358 -0
  347. package/dist/schema/ui-definition-archive.d.ts +63 -0
  348. package/dist/schema/ui-instance-repins.d.ts +222 -0
  349. package/dist/schema/ui-instances.d.ts +324 -0
  350. package/dist/schema/workspaces.d.ts +17 -0
  351. package/dist/skills/index.d.ts +15 -0
  352. package/dist/skills/index.js +2 -0
  353. package/dist/skills/types.d.ts +18 -0
  354. package/dist/task-log/anchor-child-tasks.d.ts +7 -0
  355. package/dist/task-log/delegation-trailer.d.ts +34 -0
  356. package/dist/template/engine.d.ts +2 -2
  357. package/dist/template/helpers/exec.browser.d.ts +4 -3
  358. package/dist/template/helpers/exec.d.ts +4 -3
  359. package/dist/template/helpers/format-conversation.d.ts +1 -0
  360. package/dist/template/types.d.ts +20 -0
  361. package/dist/testing/index.js +1 -1
  362. package/dist/types/index.d.ts +1619 -3
  363. package/dist/types/task-log.types.d.ts +6 -1
  364. package/dist/ui-card/index.d.ts +2 -0
  365. package/dist/ui-card/legacy-card-parser.d.ts +11 -0
  366. package/dist/ui-instance/definition.d.ts +6 -0
  367. package/dist/ui-instance/errors.d.ts +18 -0
  368. package/dist/ui-instance/index.d.ts +11 -0
  369. package/dist/ui-instance/json.d.ts +19 -0
  370. package/dist/ui-instance/lineage.d.ts +24 -0
  371. package/dist/ui-instance/runtime.d.ts +19 -0
  372. package/dist/ui-instance/store.d.ts +216 -0
  373. package/dist/ui-instance/types.d.ts +384 -0
  374. package/dist/ui-plugin/app-icon.d.ts +50 -0
  375. package/dist/ui-plugin/app-manifest.d.ts +64 -0
  376. package/dist/ui-plugin/csp.d.ts +28 -0
  377. package/dist/ui-plugin/index.d.ts +8 -0
  378. package/dist/ui-plugin/limits.d.ts +27 -0
  379. package/dist/ui-plugin/manifest.d.ts +3 -0
  380. package/dist/ui-plugin/types.d.ts +220 -0
  381. package/dist/ui-plugin/validator.d.ts +18 -0
  382. package/dist/utils/crewx-executable.d.ts +76 -0
  383. package/dist/utils/crewx-home.d.ts +1 -0
  384. package/dist/utils/env-defaults.d.ts +3 -0
  385. package/dist/utils/id.d.ts +1 -1
  386. package/dist/utils/local-identity.d.ts +2 -0
  387. package/dist/utils/runner-env.d.ts +3 -0
  388. package/dist/utils/timestamp.d.ts +1 -0
  389. package/dist/utils/workspace.d.ts +1 -0
  390. package/dist/wi/create.d.ts +48 -0
  391. package/dist/wi/select.d.ts +20 -0
  392. package/package.json +83 -3
  393. package/templates/agents/default.yaml +311 -128
  394. package/templates/documents/crewx-manual.md +138 -138
  395. package/templates/documents/crewx-quick-guide.md +8 -7
  396. package/templates/workflows/wi-default-flow.yaml +65 -0
  397. package/templates/workflows/wi-plan-flow.yaml +140 -0
@@ -1,19 +1,147 @@
1
- import*as I from'path';import I__default,{join,dirname}from'path';import {fileURLToPath}from'url';import {existsSync,mkdirSync,writeFileSync,appendFileSync,readFileSync}from'fs';import Jt,{homedir}from'os';import {createHash}from'crypto';import {sql,eq,desc,and,or,isNull,like,asc,inArray,gte,lt as lt$1}from'drizzle-orm';import {sqliteTable,text,integer,real,index,unique,uniqueIndex}from'drizzle-orm/sqlite-core';var et=(d=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(d,{get:(t,e)=>(typeof require<"u"?require:t)[e]}):d)(function(d){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+d+'" is not supported')});var Bt=()=>fileURLToPath(import.meta.url),zt=()=>I__default.dirname(Bt()),k=zt();var H=class{detach(t){}};function Rt(d){let t=e=>String(e).padStart(2,"0");return `${d.getFullYear()}${t(d.getMonth()+1)}${t(d.getDate())}T${t(d.getHours())}${t(d.getMinutes())}${t(d.getSeconds())}`}var pt=class extends H{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(t){super(),this.logsDir=join(t?.workspaceRoot??process.cwd(),".crewx","logs"),this.version=t?.version??"unknown";}attach(t){this.unsubs.push(t.on("task:start",e=>{try{existsSync(this.logsDir)||mkdirSync(this.logsDir,{recursive:!0});let n=Rt(e.timestamp),s=join(this.logsDir,`${n}_${e.traceId}.log`);this.logFiles.set(e.traceId,s);let o=`=== TASK LOG: ${e.traceId} ===
2
- CrewX Version: ${this.version}
3
- Mode: ${e.mode}
4
- Agent: ${e.agentRef}
5
- Started: ${e.timestamp.toLocaleString()}
6
- Message: ${e.message}
1
+ import*as he from'path';import he__default,{join,dirname,resolve}from'path';import {fileURLToPath}from'url';import {existsSync,mkdirSync,writeFileSync,appendFileSync,lstatSync,readFileSync,statSync,realpathSync}from'fs';import Fi,{homedir}from'os';import {createHash,randomBytes,randomUUID}from'crypto';import {sqliteTable,text,integer,index,check,primaryKey,real,uniqueIndex,unique}from'drizzle-orm/sqlite-core';import {sql,and,eq,inArray,or as or$1,isNull,ne as ne$1,desc,lt as lt$1,asc,like,gte,isNotNull,notLike,getTableColumns}from'drizzle-orm';import {spawnSync,spawn}from'child_process';var Lc=Object.defineProperty;var Zt=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(e,n)=>(typeof require<"u"?require:e)[n]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var v=(t,e)=>()=>(t&&(e=t(t=0)),e);var Mc=(t,e)=>{for(var n in e)Lc(t,n,{get:e[n],enumerable:true});};var Uc,Fc,A,_=v(()=>{Uc=()=>fileURLToPath(import.meta.url),Fc=()=>he__default.dirname(Uc()),A=Fc();});var f,mt=v(()=>{_();f=class extends Error{code;cause;constructor(e,n,r){super(n),this.name="RepositoryError",this.code=e,this.cause=r,Object.setPrototypeOf(this,new.target.prototype);}};});function Hi(t){if(t===":memory:")return t;let e=resolve(t),n=e,r=[];for(;!existsSync(n);){let o=dirname(n);if(o===n)return e;r.unshift(n.slice(o.length+1)),n=o;}let s=realpathSync(n);for(let o of r)s=join(s,o);return resolve(s)}function Yc(t,e){let n=Hi(t),r=Hi(e);return process.platform==="win32"?n.toLowerCase()===r.toLowerCase():n===r}function xt(t){if((process.env.NODE_ENV==="test"||process.env.VITEST!==void 0)&&Qc.some(e=>Yc(t,join(Fi.homedir(),".crewx",e))))throw new Error(`${Xc}: ${t}. Set CREWX_DB to an isolated temporary path or :memory:.`);return t}var Xc,Qc,Re,kt=v(()=>{_();Xc="[crewx] Refusing to open the real CrewX database from a test process";Qc=["crewx.db","logs.db"];Re=class{resolveDbPath(){if(process.env.CREWX_TRACES_DB!==void 0)throw new Error(`CREWX_TRACES_DB is removed. Use CREWX_DB instead. (got: ${process.env.CREWX_TRACES_DB})`);let e=process.env.CREWX_DB||join(Fi.homedir(),".crewx","crewx.db");return xt(e)}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(e){return e instanceof Error&&/no such table:/i.test(e.message)}dbExists(e){return existsSync(e??this.resolveDbPath())}};});function $(t,e={}){let n=xt(t),r=Zt("better-sqlite3"),{drizzle:s}=Zt("drizzle-orm/better-sqlite3"),o=e.readOnly?new r(n,{readonly:true,fileMustExist:true}):new r(n);return e.readOnly||(o.exec("PRAGMA journal_mode = WAL"),o.exec(`PRAGMA journal_size_limit = ${el}`),o.exec("PRAGMA busy_timeout = 5000"),o.exec("PRAGMA foreign_keys = ON"),o.exec("PRAGMA analysis_limit = 400")),{db:s(o),sqlite:o,runRaw:(i,u=[])=>o.prepare(i).run(...u),close:()=>o.close()}}var el,Ct=v(()=>{_();kt();el=32*1024*1024;});function tn(t,e){return (t.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${e}'`)?.cnt??0)>0}function nl(t,e){if(e>0||!tn(t,"tasks"))return;let n=t.all("PRAGMA table_info(tasks)"),r=new Set(n.map(s=>s.name));for(let[s,o]of Object.entries(tl))r.has(s)||t.run(`ALTER TABLE tasks ADD COLUMN ${s} ${o}`);}function sl(t,e,n){if(!tn(t,"__drizzle_migrations")||!tn(t,"tasks"))return;let r=t.all(n`SELECT hash FROM __drizzle_migrations`),s=new Set(r.map(i=>i.hash)),o=JSON.parse(readFileSync(he__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of o.entries){let u=rl[i.tag];if(!u)continue;let d=he__default.join(e,`${i.tag}.sql`);if(!existsSync(d))continue;let c=readFileSync(d,"utf-8"),l=createHash("sha256").update(c).digest("hex");if(s.has(l))continue;let p=t.all("PRAGMA table_info(tasks)"),g=new Set(p.map(h=>h.name));for(let[h,m]of Object.entries(u))g.has(h)||(t.run(`ALTER TABLE tasks ADD COLUMN ${h} ${m}`),g.add(h));}}function Wi(t){let e=t.trim().replace(/;+\s*$/,"").trim(),n=e.match(/^ALTER\s+TABLE\s+[`"]?([A-Za-z_][\w$]*)[`"]?\s+ADD\s+(?:COLUMN\s+)?[`"]?([A-Za-z_][\w$]*)[`"]?/i);if(n)return {kind:"add-column",table:n[1],column:n[2]};let r=e.match(/^CREATE\s+(?:UNIQUE\s+)?INDEX(?:\s+IF\s+NOT\s+EXISTS)?\s+[`"]?([A-Za-z_][\w$]*)[`"]?\s+ON\s+/i);if(r)return {kind:"create-index",name:r[1]};let s=e.match(/^DROP\s+INDEX\s+IF\s+EXISTS\s+[`"]?([A-Za-z_][\w$]*)[`"]?/i);if(s)return {kind:"drop-index",name:s[1]}}function Gi(t){return t.split(/-->\s*statement-breakpoint/).map(e=>e.trim()).filter(Boolean)}function ol(t,e,n){return t.all(`PRAGMA table_info("${e}")`).some(o=>o.name===n)}function il(t,e){return t.all(`SELECT name FROM sqlite_master WHERE type = 'index' AND name = '${e}'`).length>0}function Er(t,e){return e.kind==="add-column"?ol(t,e.table,e.column):il(t,e.name)}function ji(t,e,n){let r=t;for(let s of Gi(e)){let o=Wi(s);o?.kind==="add-column"&&Er(r,o)||o?.kind==="create-index"&&Er(r,o)||o?.kind==="drop-index"&&!Er(r,o)||r.run(n.raw(s));}}function al(t,e,n){let r=t.all(n`SELECT hash FROM __drizzle_migrations`),s=new Set(r.map(i=>i.hash)),o=JSON.parse(readFileSync(he__default.join(e,"meta/_journal.json"),"utf-8"));for(let i of o.entries){let u=he__default.join(e,`${i.tag}.sql`);if(!existsSync(u))continue;let d=readFileSync(u,"utf-8"),c=createHash("sha256").update(d).digest("hex");if(s.has(c))continue;let p=Gi(d).map(Wi);if(p.some(h=>!h))continue;let g=p;g.some(h=>h.kind==="add-column")&&g.some(h=>Er(t,h))&&(t.transaction(h=>{ji(h,d,n),h.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${c}, ${i.when})`);},{behavior:"immediate"}),s.add(c),console.error(`[crewx] Reconciled additive migration ${i.tag} from existing schema objects.`));}}function dl(t,e){let{sql:n}=Zt("drizzle-orm"),r=JSON.parse(readFileSync(he__default.join(e,"meta/_journal.json"),"utf-8")),o=["0025_task_heartbeat","0025_thread_app_instance_ledger","0026_mcp_action_source","0027_ui_instance_active_unique"].map(i=>{let u=r.entries.find(c=>c.tag===i);if(!u)throw new Error(`Missing release/App compatibility migration: ${i}`);let d=readFileSync(he__default.join(e,`${i}.sql`),"utf-8");return {entry:u,content:d,hash:createHash("sha256").update(d).digest("hex")}});t.transaction(i=>{let u=new Set(i.all(n`SELECT hash FROM __drizzle_migrations`).map(d=>d.hash));if(u.has(o[0].hash))for(let d of o.slice(1))u.has(d.hash)||(ji(i,d.content,n),i.run(n`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${d.hash}, ${d.entry.when})`),u.add(d.hash),console.error(`[crewx] Replayed release/App migration ${d.entry.tag} safely.`));},{behavior:"immediate"});}function pl(t,e,n,r){let o=JSON.parse(readFileSync(he__default.join(e,"meta/_journal.json"),"utf-8")).entries.find(({tag:p})=>p===ul);if(!o)return;let i=he__default.join(e,`${o.tag}.sql`);if(!existsSync(i))return;let u=createHash("sha256").update(readFileSync(i,"utf-8")).digest("hex");if(r&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===u))return;if(!tn(t,"tasks"))return {hash:u,affectedRows:0};let d=t.all("PRAGMA table_info(tasks)"),c=new Set(d.map(p=>p.name));if(!c.has("stop_requested_at")||!c.has("stop_requested_epoch"))return {hash:u,affectedRows:0};let l=t.get(n`
2
+ SELECT count(*) AS count
3
+ FROM tasks
4
+ WHERE status IN ('success', 'failed')
5
+ AND (stop_requested_at IS NOT NULL OR stop_requested_epoch IS NOT NULL)
6
+ `);return {hash:u,affectedRows:l?.count??0}}function fl(t,e,n,r){let o=JSON.parse(readFileSync(he__default.join(e,"meta/_journal.json"),"utf-8")).entries.find(({tag:p})=>p===cl);if(!o)return;let i=he__default.join(e,`${o.tag}.sql`);if(!existsSync(i))return;let u=createHash("sha256").update(readFileSync(i,"utf-8")).digest("hex");if(r&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===u))return;if(!tn(t,"threads"))return {hash:u,markedPointers:0};if(!t.all("PRAGMA table_info(threads)").some(p=>p.name==="created_by_task_id"))return {hash:u,markedPointers:0};let c=tn(t,Bi)?`AND NOT EXISTS (
7
+ SELECT 1
8
+ FROM ${Bi} AS marked
9
+ WHERE marked.thread_id = current.id
10
+ AND marked.created_by_task_id = current.created_by_task_id
11
+ )`:"",l=t.get(`SELECT count(*) AS count
12
+ FROM threads AS current
13
+ WHERE current.created_by_task_id IS NOT NULL
14
+ AND NOT EXISTS (
15
+ SELECT 1
16
+ FROM sqlite_master
17
+ WHERE type = 'trigger'
18
+ AND name = '${ll}'
19
+ )
20
+ ${c}`);return {hash:u,markedPointers:l?.count??0}}function gl(t){let{migrate:e}=Zt("drizzle-orm/better-sqlite3/migrator"),{sql:n}=Zt("drizzle-orm"),r=[he__default.join(A,"../migrations"),he__default.join(A,"migrations"),he__default.join(A,"../../../../drizzle/migrations"),he__default.join(process.cwd(),"drizzle/migrations")],s=r.find(p=>existsSync(he__default.join(p,"meta/_journal.json")));if(!s)throw new Error(`migrations folder not found. Searched:
21
+ ${r.join(`
22
+ `)}`);let o=t.get(n`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;o?.cnt&&(i=t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),nl(t,i),o?.cnt&&(dl(t,s),al(t,s,n),sl(t,s,n));let u=pl(t,s,n,!!o?.cnt),d=fl(t,s,n,!!o?.cnt);e(t,{migrationsFolder:s});let l=(t.get(n`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(l>0){let p=o?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${p} (${l} migration${l>1?"s":""} applied).`);}u&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===u.hash)&&console.error(`[crewx] Task stop-marker cleanup (${u.affectedRows} success/failed row(s) affected).`),d&&t.all(n`SELECT hash FROM __drizzle_migrations`).some(g=>g.hash===d.hash)&&console.error(`[crewx] Thread creator pointer migration (${d.markedPointers} pointer(s) marked unverified).`);}function Pe(t,e){qi.has(e)||(gl(t),qi.add(e));}var qi,tl,rl,ul,cl,ll,Bi,Dt=v(()=>{_();qi=new Set,tl={agent_id:"TEXT",status:"TEXT DEFAULT 'running'",started_at:"TEXT",trace_id:"TEXT",parent_task_id:"TEXT",crewx_version:"TEXT",pid:"INTEGER",thread_id:"TEXT",workspace_id:"TEXT",workspace_ref:"TEXT",workspace_name:"TEXT",project_id:"TEXT",project_name:"TEXT",command:"TEXT",metadata:"TEXT"};rl={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"},"0015_panoramic_gorilla_man":{project_id:"TEXT",workspace_id:"TEXT"},"0019_backfill_task_thread_ids":{command:"TEXT",thread_id:"TEXT"},"0024_storage_metadata":{prompt:"TEXT",rendered_prompt:"TEXT",result:"TEXT",input_tokens:"INTEGER DEFAULT 0",output_tokens:"INTEGER DEFAULT 0",cost_usd:"REAL DEFAULT 0"},"0044_clammy_bruce_banner":{metadata:"TEXT"}};ul="0027_task_stop_scope_cleanup",cl="0033_thread_creator_boundary_guard",ll="trg_threads_creator_late_fill_guard",Bi="thread_creator_unverified";});var ne,Rr=v(()=>{_();ne=sqliteTable("workspaces",{id:text("id").primaryKey(),slug:text("slug").notNull().unique(),name:text("name").notNull(),workspace_path:text("workspace_path"),description:text("description"),is_active:integer("is_active").notNull().default(1),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),starred:integer("starred").notNull().default(0)});});var a,Em,Tl,re,nn=v(()=>{_();a=sqliteTable("tasks",{id:text("id").primaryKey(),agent_id:text("agent_id").notNull(),user_id:text("user_id"),actor_kind:text("actor_kind",{enum:["human","agent","system","unknown"]}),actor_id:text("actor_id"),prompt:text("prompt").notNull(),mode:text("mode").notNull().default("execute"),status:text("status").notNull().default("running"),result:text("result"),error:text("error"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),metadata:text("metadata"),workspace_id:text("workspace_id"),trace_id:text("trace_id"),parent_task_id:text("parent_task_id"),caller_agent_id:text("caller_agent_id"),model:text("model"),platform:text("platform").default("cli"),crewx_version:text("crewx_version"),input_tokens:integer("input_tokens").default(0),output_tokens:integer("output_tokens").default(0),cost_usd:real("cost_usd").default(0),pid:integer("pid"),pid_started_at:text("pid_started_at"),heartbeat_at:text("heartbeat_at"),stop_requested_at:text("stop_requested_at"),stop_requested_epoch:integer("stop_requested_epoch"),rendered_prompt:text("rendered_prompt"),security_key:text("security_key"),command:text("command"),coding_agent_command:text("coding_agent_command"),exit_code:integer("exit_code"),logs:text("logs"),log_storage:text("log_storage",{enum:["blob","events"]}).notNull().default("blob"),last_log_seq:integer("last_log_seq").notNull().default(0),log_revision:integer("log_revision").notNull().default(0),thread_id:text("thread_id"),workspace_ref:text("workspace_ref"),cwd:text("cwd"),project_id:text("project_id"),project_ref:text("project_ref"),cached_input_tokens:integer("cached_input_tokens").default(0),run_epoch:integer("run_epoch").default(0),rating:text("rating",{enum:["up","down"]}),rated_at:text("rated_at"),workflow_run_id:text("workflow_run_id"),schedule_id:text("schedule_id")},t=>({log_storage_check:check("tasks_log_storage_ck",sql`${t.log_storage} IN ('blob', 'events')`),rating_check:check("tasks_rating_ck",sql`${t.rating} IN ('up', 'down')`),idx_tasks_agent_id:index("idx_tasks_agent_id").on(t.agent_id),idx_tasks_status:index("idx_tasks_status").on(t.status),idx_tasks_started_at:index("idx_tasks_started_at").on(t.started_at),idx_tasks_trace_id:index("idx_tasks_trace_id").on(t.trace_id),idx_tasks_parent_task_id:index("idx_tasks_parent_task_id").on(t.parent_task_id),idx_tasks_crewx_version:index("idx_tasks_crewx_version").on(t.crewx_version),idx_tasks_pid:index("idx_tasks_pid").on(t.pid),idx_tasks_status_heartbeat:index("idx_tasks_status_heartbeat").on(t.status,t.heartbeat_at),idx_tasks_thread_id:index("idx_tasks_thread_id").on(t.thread_id),idx_tasks_thread_creator:index("idx_tasks_thread_creator").on(t.id,t.thread_id,t.actor_kind,t.actor_id),idx_tasks_workspace_id:index("idx_tasks_workspace_id").on(t.workspace_id),idx_tasks_workspace_ref:index("idx_tasks_workspace_ref").on(t.workspace_ref),idx_tasks_project_id:index("idx_tasks_project_id").on(t.project_id),idx_tasks_ws_started:index("idx_tasks_ws_started").on(t.workspace_id,t.started_at),idx_tasks_ws_rated:index("idx_tasks_ws_rated").on(t.workspace_id,t.rating,t.rated_at).where(sql`${t.rating} IS NOT NULL`)})),{security_key:Em,...Tl}=getTableColumns(a),re=Tl;});var lt,Vi=v(()=>{_();nn();lt=sqliteTable("task_provider_inputs",{task_id:text("task_id").notNull().references(()=>a.id,{onDelete:"cascade"}),run_epoch:integer("run_epoch").notNull(),input:text("input").notNull(),key_wrap_skipped:integer("key_wrap_skipped").notNull().default(0),recorded_at:text("recorded_at").notNull()},t=>({pk:primaryKey({columns:[t.task_id,t.run_epoch]})}));});var rt,Yi=v(()=>{_();nn();rt=sqliteTable("task_log_events",{id:integer("id").primaryKey(),task_id:text("task_id").notNull().references(()=>a.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),timestamp:text("timestamp").notNull(),level:text("level").notNull(),message:text("message").notNull()},t=>({taskSeqUnique:uniqueIndex("task_log_events_task_seq_uq").on(t.task_id,t.seq),timestampIdIndex:index("task_log_events_timestamp_id_idx").on(t.timestamp,t.id)}));});var Al,Ol,k,Ln=v(()=>{_();Rr();Al="json_extract(metadata, '$.threadTitle.state')",Ol="json_extract(metadata, '$.threadTitle.priority')",k=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>ne.id,{onDelete:"set null"}),created_by_kind:text("created_by_kind",{enum:["human","agent","system","unknown"]}),created_by_id:text("created_by_id"),created_by_task_id:text("created_by_task_id"),platform:text("platform").notNull().default("cli"),title:text("title"),first_message:text("first_message"),last_message:text("last_message"),message_count:integer("message_count").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),metadata:text("metadata"),title_locked:integer("title_locked").notNull().default(0),pinned:integer("pinned").notNull().default(0),starred:integer("starred").notNull().default(0)},t=>({idx_threads_updated_at:index("idx_threads_updated_at").on(t.updated_at),idx_threads_workspace_id:index("idx_threads_workspace_id").on(t.workspace_id),idx_threads_ws_updated:index("idx_threads_ws_updated").on(t.workspace_id,t.updated_at),idx_threads_workspace_created_by_kind_updated_at:index("idx_threads_workspace_created_by_kind_updated_at").on(t.workspace_id,t.created_by_kind,t.updated_at),idx_threads_title:index("idx_threads_title").on(t.title),idx_threads_workspace_thread_state:index("idx_threads_workspace_thread_state").on(t.workspace_id,sql.raw(Al)),idx_threads_workspace_thread_priority:index("idx_threads_workspace_thread_priority").on(t.workspace_id,sql.raw(Ol))}));});var ea=v(()=>{_();sqliteTable("thread_creator_unverified",{thread_id:text("thread_id").notNull(),created_by_task_id:text("created_by_task_id").notNull()},t=>({pk:primaryKey({columns:[t.thread_id,t.created_by_task_id]})}));});var Cl,na=v(()=>{_();nn();Cl=sqliteTable("spans",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>a.id,{onDelete:"set null"}),parent_span_id:text("parent_span_id").references(()=>Cl.id,{onDelete:"set null"}),name:text("name").notNull(),kind:text("kind").notNull().default("internal"),status:text("status").notNull().default("ok"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),input:text("input"),output:text("output"),error:text("error"),attributes:text("attributes")},t=>({idx_spans_task_id:index("idx_spans_task_id").on(t.task_id),idx_spans_parent_span_id:index("idx_spans_parent_span_id").on(t.parent_span_id)}));});var ra=v(()=>{_();nn();sqliteTable("tool_calls",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>a.id,{onDelete:"cascade"}),session_id:text("session_id"),tool_name:text("tool_name").notNull(),files:text("files"),input:text("input"),output:text("output"),duration_ms:integer("duration_ms"),timestamp:text("timestamp").notNull()},t=>({idx_tool_calls_task_id:index("idx_tool_calls_task_id").on(t.task_id),idx_tool_calls_tool_name:index("idx_tool_calls_tool_name").on(t.tool_name),idx_tool_calls_timestamp:index("idx_tool_calls_timestamp").on(t.timestamp)}));});var oa=v(()=>{_();Ln();sqliteTable("thread_boxes",{id:text("id").primaryKey(),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),first_task_id:text("first_task_id").notNull(),mid_task_id:text("mid_task_id").notNull(),last_task_id:text("last_task_id").notNull(),task_count:integer("task_count").notNull(),summary:text("summary"),source_tokens:integer("source_tokens").notNull(),summary_tokens:integer("summary_tokens"),created_at:text("created_at").notNull()},t=>({idx_thread_boxes_thread_id:index("idx_thread_boxes_thread_id").on(t.thread_id),idx_thread_boxes_seq:index("idx_thread_boxes_seq").on(t.thread_id,t.seq),uniq_thread_boxes_thread_seq:unique().on(t.thread_id,t.seq)}));});var aa=v(()=>{_();sqliteTable("request_logs",{id:text("id").primaryKey(),path:text("path").notNull(),method:text("method").notNull(),status_code:integer("status_code").notNull(),duration_ms:integer("duration_ms").notNull(),ip:text("ip"),request_headers:text("request_headers"),response_headers:text("response_headers"),request_body:text("request_body"),response_body:text("response_body"),query:text("query"),user_id:text("user_id"),project_id:text("project_id"),partition_key:text("partition_key").notNull(),timestamp:text("timestamp").notNull().default(sql`(datetime('now'))`),metadata:text("metadata")},t=>({idx_request_logs_timestamp:index("idx_request_logs_timestamp").on(t.timestamp),idx_request_logs_path:index("idx_request_logs_path").on(t.path),idx_request_logs_status_code:index("idx_request_logs_status_code").on(t.status_code),idx_request_logs_partition_key:index("idx_request_logs_partition_key").on(t.partition_key)}));});var da=v(()=>{_();sqliteTable("request_log_daily",{day:text("day").notNull(),scope:text("scope").notNull(),ok:integer("ok").notNull(),client:integer("client").notNull(),server:integer("server").notNull(),p50_ms:integer("p50_ms"),p95_ms:integer("p95_ms"),computed_at:text("computed_at").notNull()},t=>({pk:primaryKey({columns:[t.day,t.scope]})}));});var la=v(()=>{_();sqliteTable("usage_limit_snapshots",{id:text("id").primaryKey(),provider:text("provider").notNull(),account_ref:text("account_ref").notNull().default("default"),limit_window:text("limit_window").notNull(),bucket_start:text("bucket_start").notNull(),captured_at:text("captured_at").notNull(),used_percent:integer("used_percent").notNull(),remaining_percent:integer("remaining_percent").notNull(),resets_at:text("resets_at"),source:text("source").notNull(),metadata:text("metadata")},t=>({uniq_usage_limit_snapshots_bucket:uniqueIndex("uniq_usage_limit_snapshots_bucket").on(t.provider,t.account_ref,t.limit_window,t.bucket_start),idx_usage_limit_snapshots_window_bucket:index("idx_usage_limit_snapshots_window_bucket").on(t.limit_window,t.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:index("idx_usage_limit_snapshots_provider_window_bucket").on(t.provider,t.limit_window,t.bucket_start)}));});var pa=v(()=>{_();sqliteTable("usage_reports",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),month:text("month").notNull(),generated_at:text("generated_at").notNull(),source_range:text("source_range").notNull(),tier:text("tier").notNull(),total_tokens:integer("total_tokens").notNull(),total_cost_usd:real("total_cost_usd").notNull(),payload:text("payload").notNull(),payload_hash:text("payload_hash"),signature:text("signature"),signed_at:text("signed_at"),issuer:text("issuer")},t=>({uniq_usage_reports_ws_month:uniqueIndex("uniq_usage_reports_ws_month").on(t.workspace_id,t.month)}));});var ga=v(()=>{_();sqliteTable("notifications",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),agent_id:text("agent_id"),task_id:text("task_id"),thread_id:text("thread_id"),source:text("source").notNull().default("agent"),level:text("level").notNull().default("info"),title:text("title").notNull(),body:text("body"),target_user_id:text("target_user_id"),created_at:text("created_at").notNull(),metadata:text("metadata")},t=>({idx_notifications_ws_created:index("idx_notifications_ws_created").on(t.workspace_id,sql`${t.created_at} DESC`)})),sqliteTable("notification_reads",{notification_id:text("notification_id").notNull(),user_id:text("user_id").notNull(),read_at:text("read_at").notNull()},t=>({pk:primaryKey({columns:[t.notification_id,t.user_id]})}));});var ha=v(()=>{_();sqliteTable("agent_suggestions",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),agent_id:text("agent_id").notNull(),task_id:text("task_id"),type:text("type").notNull(),status:text("status").notNull().default("pending"),payload:text("payload").notNull(),applied_commit_sha:text("applied_commit_sha"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({idx_agent_suggestions_ws_agent:index("idx_agent_suggestions_ws_agent").on(t.workspace_id,t.agent_id),idx_agent_suggestions_ws_created:index("idx_agent_suggestions_ws_created").on(t.workspace_id,t.created_at)}));});var ma=v(()=>{_();sqliteTable("ui_instances",{id:text("id").primaryKey().notNull(),definition_id:text("definition_id").notNull(),definition_version:integer("definition_version").notNull(),definition_hash:text("definition_hash").notNull(),workspace_id:text("workspace_id").notNull(),thread_id:text("thread_id").notNull(),app_id:text("app_id"),anchor_task_id:text("anchor_task_id"),domain_ref_json:text("domain_ref_json").notNull(),state_json:text("state_json").notNull(),revision:integer("revision").notNull().default(0),status:text("status").notNull().default("active"),granted_capabilities_json:text("granted_capabilities_json").notNull().default("[]"),opened_by_json:text("opened_by_json"),agent_open_request_json:text("agent_open_request_json"),created_at:integer("created_at").notNull(),updated_at:integer("updated_at").notNull()},t=>({idCheck:check("ui_instances_id_ck",sql`length(${t.id}) BETWEEN 5 AND 128 AND ${t.id} GLOB 'uic_*'`),definitionIdCheck:check("ui_instances_definition_id_ck",sql`length(${t.definition_id}) BETWEEN 1 AND 128`),definitionVersionCheck:check("ui_instances_definition_version_ck",sql`${t.definition_version} >= 1`),definitionHashCheck:check("ui_instances_definition_hash_ck",sql`length(${t.definition_hash}) = 64 AND ${t.definition_hash} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:check("ui_instances_workspace_id_ck",sql`length(${t.workspace_id}) BETWEEN 1 AND 256`),threadIdCheck:check("ui_instances_thread_id_ck",sql`length(${t.thread_id}) BETWEEN 1 AND 256`),appIdCheck:check("ui_instances_app_id_ck",sql`${t.app_id} IS NULL OR length(${t.app_id}) BETWEEN 1 AND 128`),domainRefJsonCheck:check("ui_instances_domain_ref_json_ck",sql`json_valid(${t.domain_ref_json}) AND json_type(${t.domain_ref_json}) = 'object'`),stateJsonCheck:check("ui_instances_state_json_ck",sql`json_valid(${t.state_json}) AND json_type(${t.state_json}) = 'object'`),revisionCheck:check("ui_instances_revision_ck",sql`${t.revision} >= 0`),statusCheck:check("ui_instances_status_ck",sql`${t.status} IN ('active', 'completed', 'expired', 'revoked', 'unsupported')`),grantedCapabilitiesJsonCheck:check("ui_instances_granted_capabilities_json_ck",sql`json_valid(${t.granted_capabilities_json}) AND json_type(${t.granted_capabilities_json}) = 'array'`),openedByJsonCheck:check("ui_instances_opened_by_json_ck",sql`${t.opened_by_json} IS NULL OR (json_valid(${t.opened_by_json}) AND json_type(${t.opened_by_json}) = 'object')`),createdAtCheck:check("ui_instances_created_at_ck",sql`${t.created_at} >= 0`),updatedAtCheck:check("ui_instances_updated_at_ck",sql`${t.updated_at} >= ${t.created_at}`),workspaceThreadIdx:index("ui_instances_workspace_thread_idx").on(t.workspace_id,t.thread_id),workspaceThreadAppUnique:uniqueIndex("ui_instances_workspace_thread_app_uq").on(t.workspace_id,t.thread_id,t.app_id).where(sql`${t.status} = 'active'`)}));});var Ta=v(()=>{_();sqliteTable("ui_action_receipts",{id:text("id").primaryKey().notNull(),instance_id:text("instance_id").notNull(),definition_id:text("definition_id"),definition_version:integer("definition_version"),definition_hash:text("definition_hash"),request_id:text("request_id").notNull(),action_id:text("action_id").notNull(),actor_json:text("actor_json").notNull(),source:text("source").notNull(),expected_revision:integer("expected_revision").notNull(),before_revision:integer("before_revision").notNull(),after_revision:integer("after_revision"),status:text("status").notNull(),outcome:text("outcome"),input_json:text("input_json").notNull(),result_json:text("result_json"),error_code:text("error_code"),requested_at:integer("requested_at").notNull(),settled_at:integer("settled_at")},t=>({idCheck:check("ui_action_receipts_id_ck",sql`length(${t.id}) BETWEEN 5 AND 128`),instanceIdCheck:check("ui_action_receipts_instance_id_ck",sql`length(${t.instance_id}) BETWEEN 1 AND 128`),requestIdCheck:check("ui_action_receipts_request_id_ck",sql`length(${t.request_id}) BETWEEN 1 AND 128`),actionIdCheck:check("ui_action_receipts_action_id_ck",sql`length(${t.action_id}) BETWEEN 1 AND 128`),actorJsonCheck:check("ui_action_receipts_actor_json_ck",sql`json_valid(${t.actor_json}) AND json_type(${t.actor_json}) = 'object'`),sourceCheck:check("ui_action_receipts_source_ck",sql`${t.source} IN ('ui_host', 'cli', 'system', 'mcp')`),expectedRevisionCheck:check("ui_action_receipts_expected_revision_ck",sql`${t.expected_revision} >= 0`),beforeRevisionCheck:check("ui_action_receipts_before_revision_ck",sql`${t.before_revision} >= 0`),afterRevisionCheck:check("ui_action_receipts_after_revision_ck",sql`${t.after_revision} IS NULL OR ${t.after_revision} >= 0`),statusCheck:check("ui_action_receipts_status_ck",sql`${t.status} IN ('requested', 'settled')`),outcomeCheck:check("ui_action_receipts_outcome_ck",sql`${t.outcome} IS NULL OR ${t.outcome} IN ('succeeded', 'rejected', 'failed', 'conflicted', 'expired')`),inputJsonCheck:check("ui_action_receipts_input_json_ck",sql`json_valid(${t.input_json}) AND json_type(${t.input_json}) = 'object'`),resultJsonCheck:check("ui_action_receipts_result_json_ck",sql`${t.result_json} IS NULL OR (json_valid(${t.result_json}) AND json_type(${t.result_json}) = 'object')`),requestedAtCheck:check("ui_action_receipts_requested_at_ck",sql`${t.requested_at} >= 0`),settledAtCheck:check("ui_action_receipts_settled_at_ck",sql`${t.settled_at} IS NULL OR ${t.settled_at} >= ${t.requested_at}`),statusTransitionCheck:check("ui_action_receipts_status_transition_ck",sql`(
23
+ (${t.status} = 'requested' AND ${t.after_revision} IS NULL AND ${t.outcome} IS NULL AND ${t.settled_at} IS NULL)
24
+ OR
25
+ (${t.status} = 'settled' AND ${t.after_revision} IS NOT NULL AND ${t.outcome} IS NOT NULL AND ${t.settled_at} IS NOT NULL)
26
+ )`),instanceRequestUnique:uniqueIndex("ui_action_receipts_instance_request_uq").on(t.instance_id,t.request_id),instanceIdIdx:index("ui_action_receipts_instance_id_idx").on(t.instance_id),requestedAtIdx:index("ui_action_receipts_requested_at_idx").on(t.requested_at)}));});var ya=v(()=>{_();sqliteTable("ui_instance_repins",{instance_id:text("instance_id").notNull(),from_version:integer("from_version").notNull(),from_hash:text("from_hash").notNull(),to_version:integer("to_version").notNull(),to_hash:text("to_hash").notNull(),from_revision:integer("from_revision").notNull(),to_revision:integer("to_revision"),status:text("status").notNull(),code:text("code"),attempts:integer("attempts").notNull().default(1),first_at:integer("first_at").notNull(),last_at:integer("last_at").notNull()},t=>({pk:primaryKey({columns:[t.instance_id,t.to_hash],name:"ui_instance_repins_pk"}),instanceIdCheck:check("ui_instance_repins_instance_id_ck",sql`length(${t.instance_id}) BETWEEN 5 AND 128 AND ${t.instance_id} GLOB 'uic_*'`),fromVersionCheck:check("ui_instance_repins_from_version_ck",sql`${t.from_version} >= 1`),toVersionCheck:check("ui_instance_repins_to_version_ck",sql`${t.to_version} >= 1`),fromHashCheck:check("ui_instance_repins_from_hash_ck",sql`length(${t.from_hash}) = 64 AND ${t.from_hash} NOT GLOB '*[^0-9a-f]*'`),toHashCheck:check("ui_instance_repins_to_hash_ck",sql`length(${t.to_hash}) = 64 AND ${t.to_hash} NOT GLOB '*[^0-9a-f]*'`),fromRevisionCheck:check("ui_instance_repins_from_revision_ck",sql`${t.from_revision} >= 0`),toRevisionCheck:check("ui_instance_repins_to_revision_ck",sql`${t.to_revision} IS NULL OR ${t.to_revision} >= 0`),statusCheck:check("ui_instance_repins_status_ck",sql`${t.status} IN ('applied', 'deferred', 'failed')`),attemptsCheck:check("ui_instance_repins_attempts_ck",sql`${t.attempts} >= 1`),datesCheck:check("ui_instance_repins_dates_ck",sql`${t.first_at} >= 0 AND ${t.last_at} >= ${t.first_at}`),resultCheck:check("ui_instance_repins_result_ck",sql`(
27
+ (${t.status} = 'applied' AND ${t.code} IS NULL
28
+ AND ${t.to_revision} = ${t.from_revision} + 1)
29
+ OR
30
+ (${t.status} IN ('deferred', 'failed') AND ${t.code} IS NOT NULL
31
+ AND ${t.to_revision} IS NULL)
32
+ )`)}));});var Ea=v(()=>{_();sqliteTable("ui_definition_archive",{definition_hash:text("definition_hash").primaryKey().notNull(),definition_json:text("definition_json").notNull(),created_at:integer("created_at").notNull()},t=>({definitionHashCheck:check("ui_definition_archive_definition_hash_ck",sql`length(${t.definition_hash}) = 64 AND ${t.definition_hash} NOT GLOB '*[^0-9a-f]*'`),definitionJsonCheck:check("ui_definition_archive_definition_json_ck",sql`json_valid(${t.definition_json}) AND json_type(${t.definition_json}) = 'object'`),createdAtCheck:check("ui_definition_archive_created_at_ck",sql`${t.created_at} >= 0`)}));});var Sa,Ia=v(()=>{_();Sa=sqliteTable("projects",{id:text("id").primaryKey().notNull(),workspace_id:text("workspace_id").notNull(),name:text("name").notNull(),outcome:text("outcome").notNull(),due_date:text("due_date"),scene:text("scene").notNull().default("planning"),stages_json:text("stages_json").notNull(),stage_index:integer("stage_index").notNull(),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),accepted_at:text("accepted_at"),archived_at:text("archived_at")},t=>({idCheck:check("projects_id_ck",sql`${t.id} GLOB 'prj_*'`),sceneCheck:check("projects_scene_ck",sql`${t.scene} IN ('planning', 'plan_review', 'running', 'human_wait', 'limit_wait', 'failed_stop', 'analyzing_feedback', 'replanned', 'awaiting_review', 'accepted')`),stagesJsonCheck:check("projects_stages_json_ck",sql`json_valid(${t.stages_json}) AND json_type(${t.stages_json}) = 'array'`),stageIndexCheck:check("projects_stage_index_ck",sql`${t.stage_index} >= 1`)})),sqliteTable("project_criteria",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>Sa.id,{onDelete:"cascade"}),position:integer("position").notNull(),statement:text("statement").notNull(),verify_status:text("verify_status").notNull().default("pending"),verified_at:text("verified_at"),evidence_json:text("evidence_json").notNull().default("[]"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({idCheck:check("project_criteria_id_ck",sql`${t.id} GLOB 'pjc_*'`),verifyStatusCheck:check("project_criteria_verify_status_ck",sql`${t.verify_status} IN ('pending', 'verifying', 'passed', 'failed')`),evidenceJsonCheck:check("project_criteria_evidence_json_ck",sql`json_valid(${t.evidence_json}) AND json_type(${t.evidence_json}) = 'array'`),projectPositionUnique:uniqueIndex("project_criteria_project_position_uq").on(t.project_id,t.position)})),sqliteTable("project_events",{id:text("id").primaryKey().notNull(),project_id:text("project_id").notNull().references(()=>Sa.id,{onDelete:"restrict"}),seq:integer("seq").notNull(),actor_type:text("actor_type").notNull(),actor_id:text("actor_id"),type:text("type").notNull(),title:text("title").notNull(),summary:text("summary"),payload_json:text("payload_json").notNull().default("{}"),created_at:text("created_at").notNull()},t=>({idCheck:check("project_events_id_ck",sql`${t.id} GLOB 'pje_*'`),actorTypeCheck:check("project_events_actor_type_ck",sql`${t.actor_type} IN ('user', 'project_manager', 'system')`),payloadJsonCheck:check("project_events_payload_json_ck",sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),projectSeqUnique:uniqueIndex("project_events_project_seq_uq").on(t.project_id,t.seq)}));});var Ws,Gs,C,js=v(()=>{_();Ws=["THREAD_STATE","THREAD_PRIORITY"],Gs=["gray","blue","violet","green","amber","orange","red","pink"],C=sqliteTable("common_codes",{code_group:text("code_group").notNull(),code:text("code").notNull(),code_name:text("code_name"),color:text("color").notNull().default("gray"),sort_order:integer("sort_order").notNull(),workspace_id:text("workspace_id"),is_builtin:integer("is_builtin").notNull().default(0),is_archived:integer("is_archived").notNull().default(0),metadata:text("metadata"),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()},t=>({pk:primaryKey({columns:[t.code_group,t.code]}),metadataCheck:check("common_codes_metadata_ck",sql`${t.metadata} IS NULL OR (json_valid(${t.metadata}) AND json_type(${t.metadata}) = 'object')`),builtinCheck:check("common_codes_builtin_ck",sql`${t.is_builtin} IN (0, 1)`),archivedCheck:check("common_codes_archived_ck",sql`${t.is_archived} IN (0, 1)`),idxCommonCodesSelection:index("idx_common_codes_group_archived_order").on(t.code_group,t.is_archived,t.sort_order)}));});var Aa,Oa,Na,ba,va,G,q,U,xa=v(()=>{_();Ln();Aa=["thread.snapshot.imported","thread.title.changed","thread.priority.changed","thread.state.changed","thread.highlight.created","thread.highlight.updated","thread.highlight.deleted","thread.highlights.regenerated"],Oa=["user","agent","system"],Na=["auto","manual"],ba=["decision","judgment","issue","result","pivot"],va=["queued","running","completed","failed"],G=sqliteTable("thread_events",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),type:text("type").notNull(),actor_type:text("actor_type").notNull(),payload_json:text("payload_json").notNull(),created_at:text("created_at").notNull(),actor_id:text("actor_id"),task_id:text("task_id"),highlight_id:text("highlight_id")},t=>({typeCheck:check("thread_events_type_ck",sql`${t.type} IN ('thread.snapshot.imported', 'thread.title.changed', 'thread.priority.changed', 'thread.state.changed', 'thread.highlight.created', 'thread.highlight.updated', 'thread.highlight.deleted', 'thread.highlights.regenerated')`),actorTypeCheck:check("thread_events_actor_type_ck",sql`${t.actor_type} IN ('user', 'agent', 'system')`),payloadJsonCheck:check("thread_events_payload_json_ck",sql`json_valid(${t.payload_json}) AND json_type(${t.payload_json}) = 'object'`),threadSeqIndex:index("idx_thread_events_thread_seq").on(t.thread_id,t.seq),threadCreatedIndex:index("idx_thread_events_thread_created").on(t.thread_id,t.created_at),threadSeqUnique:uniqueIndex("thread_events_thread_seq_uq").on(t.thread_id,t.seq)})),q=sqliteTable("thread_highlight_runs",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),request_id:text("request_id").notNull(),status:text("status").notNull(),detector_version:text("detector_version").notNull(),requested_at:text("requested_at").notNull(),started_at:text("started_at"),completed_at:text("completed_at"),error_code:text("error_code"),previous_auto_count:integer("previous_auto_count"),new_auto_count:integer("new_auto_count")},t=>({statusCheck:check("thread_highlight_runs_status_ck",sql`${t.status} IN ('queued', 'running', 'completed', 'failed')`),countCheck:check("thread_highlight_runs_counts_ck",sql`(${t.previous_auto_count} IS NULL OR ${t.previous_auto_count} >= 0) AND (${t.new_auto_count} IS NULL OR ${t.new_auto_count} >= 0)`),threadRequestUnique:uniqueIndex("thread_highlight_runs_thread_request_uq").on(t.thread_id,t.request_id),inProgressThreadUnique:uniqueIndex("thread_highlight_runs_in_progress_thread_uq").on(t.thread_id).where(sql`${t.status} IN ('queued', 'running')`),threadStatusRequestedIndex:index("idx_thread_highlight_runs_thread_status_requested").on(t.thread_id,t.status,t.requested_at)})),U=sqliteTable("thread_highlights",{id:text("id").primaryKey().notNull(),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),source:text("source").notNull(),kind:text("kind").notNull(),status:text("status").notNull().default("active"),text:text("text"),covers_from_task_id:text("covers_from_task_id").notNull(),covers_to_task_id:text("covers_to_task_id").notNull(),revision:integer("revision").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),agent_id:text("agent_id"),source_task_id:text("source_task_id"),detector_version:text("detector_version"),content_fingerprint:text("content_fingerprint"),dismissed_at:text("dismissed_at")},t=>({sourceCheck:check("thread_highlights_source_ck",sql`${t.source} IN ('auto', 'manual')`),kindCheck:check("thread_highlights_kind_ck",sql`${t.kind} IN ('decision', 'judgment', 'issue', 'result', 'pivot')`),statusCheck:check("thread_highlights_status_ck",sql`${t.status} IN ('active', 'dismissed')`),activeTextCheck:check("thread_highlights_active_text_ck",sql`${t.status} = 'dismissed' OR (${t.text} IS NOT NULL AND length(${t.text}) > 0)`),coversCheck:check("thread_highlights_covers_ck",sql`length(${t.covers_from_task_id}) > 0 AND length(${t.covers_to_task_id}) > 0`),autoKeyCheck:check("thread_highlights_auto_key_ck",sql`${t.source} = 'manual' OR (${t.source} = 'auto' AND ${t.source_task_id} IS NOT NULL AND ${t.detector_version} IS NOT NULL AND ${t.content_fingerprint} IS NOT NULL AND length(${t.source_task_id}) > 0 AND length(${t.detector_version}) > 0 AND length(${t.content_fingerprint}) > 0)`),threadStatusCreatedIndex:index("idx_thread_highlights_thread_status_created").on(t.thread_id,t.status,t.created_at),threadCoversIndex:index("idx_thread_highlights_thread_covers").on(t.thread_id,t.covers_from_task_id,t.covers_to_task_id),autoIdempotencyUnique:uniqueIndex("thread_highlights_auto_idempotency_uq").on(t.thread_id,t.source_task_id,t.detector_version,t.content_fingerprint).where(sql`${t.source} = 'auto'`)}));});var Da=v(()=>{_();sqliteTable("storage_metadata",{source_kind:text("source_kind").notNull(),source_id:text("source_id").notNull(),utc_ts:text("utc_ts"),bytes:integer("bytes").notNull()},t=>({pk:primaryKey({columns:[t.source_kind,t.source_id]}),kindTimestampBytesIndex:index("idx_storage_metadata_kind_ts_bytes").on(t.source_kind,t.utc_ts,t.bytes)})),sqliteTable("storage_metadata_state",{unit:text("unit").primaryKey().notNull(),cursor_rowid:integer("cursor_rowid").notNull().default(0),end_rowid:integer("end_rowid"),complete:integer("complete").notNull().default(0),updated_at:text("updated_at").notNull()});});var be,Pa=v(()=>{_();be=sqliteTable("agent_send_history",{workspace_id:text("workspace_id").notNull(),actor_id:text("actor_id").notNull(),agent_id:text("agent_id").notNull(),last_accepted_at:text("last_accepted_at").notNull()},t=>({pk:primaryKey({columns:[t.workspace_id,t.actor_id,t.agent_id]}),recentIndex:index("idx_agent_send_history_recent").on(t.workspace_id,t.actor_id,t.last_accepted_at,t.agent_id)}));});var $a,Ha=v(()=>{_();Ln();Rr();sqliteTable("sidebar_states",{workspace_id:text("workspace_id").primaryKey().references(()=>ne.id,{onDelete:"cascade"}),revision:integer("revision").notNull().default(0),rail_collapsed:integer("rail_collapsed").notNull().default(0),seeded_at:text("seeded_at").notNull()},t=>({railCollapsedCheck:check("sidebar_states_rail_collapsed_ck",sql`${t.rail_collapsed} IN (0, 1)`)})),$a=sqliteTable("sidebar_groups",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull().references(()=>ne.id,{onDelete:"cascade"}),name:text("name").notNull(),color:text("color").notNull(),collapsed:integer("collapsed").notNull().default(0),position:integer("position").notNull()},t=>({colorCheck:check("sidebar_groups_color_ck",sql`${t.color} IN ('cyan', 'orange', 'purple', 'blue')`),collapsedCheck:check("sidebar_groups_collapsed_ck",sql`${t.collapsed} IN (0, 1)`),idxSidebarGroupsWorkspacePosition:index("idx_sidebar_groups_workspace_position").on(t.workspace_id,t.position)})),sqliteTable("sidebar_tabs",{workspace_id:text("workspace_id").notNull().references(()=>ne.id,{onDelete:"cascade"}),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),group_id:text("group_id").references(()=>$a.id,{onDelete:"set null"}),position:integer("position").notNull()},t=>({pk:primaryKey({columns:[t.workspace_id,t.thread_id]})})),sqliteTable("sidebar_closed_tabs",{id:integer("id").primaryKey({autoIncrement:true}),workspace_id:text("workspace_id").notNull().references(()=>ne.id,{onDelete:"cascade"}),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),group_id:text("group_id").references(()=>$a.id,{onDelete:"set null"}),position:integer("position").notNull(),closed_at:text("closed_at").notNull()},t=>({idxSidebarClosedTabsWorkspaceId:index("idx_sidebar_closed_tabs_workspace_id").on(t.workspace_id,t.id)})),sqliteTable("thread_reads",{workspace_id:text("workspace_id").notNull().references(()=>ne.id,{onDelete:"cascade"}),thread_id:text("thread_id").notNull().references(()=>k.id,{onDelete:"cascade"}),read_through_at:text("read_through_at").notNull()},t=>({pk:primaryKey({columns:[t.workspace_id,t.thread_id]})}));});var Ua=v(()=>{_();sqliteTable("schedule_runs",{id:text("id").primaryKey(),schedule_id:text("schedule_id").notNull(),workspace_id:text("workspace_id").notNull(),mode:text("mode").notNull(),trigger:text("trigger").notNull(),occurrence_key:text("occurrence_key"),task_id:text("task_id"),app_id:text("app_id"),schedule_name:text("schedule_name"),builtin_id:text("builtin_id"),command:text("command"),high_frequency:integer("high_frequency").notNull().default(0),status:text("status").notNull(),error_code:text("error_code"),exit_code:integer("exit_code"),signal:text("signal"),started_at:text("started_at").notNull(),finished_at:text("finished_at"),duration_ms:integer("duration_ms"),pid:integer("pid"),host_pid:integer("host_pid"),output_tail:text("output_tail"),output_bytes:integer("output_bytes"),output_truncated:integer("output_truncated").notNull().default(0)},t=>({idx_schedule_runs_workspace_started:index("idx_schedule_runs_workspace_started").on(t.workspace_id,sql`${t.started_at} DESC`),idx_schedule_runs_schedule_started:index("idx_schedule_runs_schedule_started").on(t.schedule_id,sql`${t.started_at} DESC`),idx_schedule_runs_task_id:index("idx_schedule_runs_task_id").on(t.task_id),idx_schedule_runs_running:index("idx_schedule_runs_running").on(t.workspace_id,t.started_at).where(sql`${t.status} = 'running'`)}));});var Fa=v(()=>{_();sqliteTable("run_column_backfill",{name:text("name").primaryKey(),cursor:integer("cursor"),anchor_id:text("anchor_id"),completed_at:text("completed_at")});});var qa=v(()=>{_();sqliteTable("doc_sync_connect_requests",{request_id:text("request_id").primaryKey().notNull(),account_key:text("account_key").notNull(),workspace_id:text("workspace_id").notNull(),app_id:text("app_id").notNull(),ref:text("ref").notNull(),sent_hash:text("sent_hash").notNull(),created_at:integer("created_at").notNull()},t=>({requestIdCheck:check("doc_sync_connect_requests_request_id_ck",sql`length(${t.request_id}) = 36`),accountKeyCheck:check("doc_sync_connect_requests_account_key_ck",sql`length(${t.account_key}) = 64 AND ${t.account_key} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:check("doc_sync_connect_requests_workspace_id_ck",sql`length(${t.workspace_id}) BETWEEN 1 AND 256`),appIdCheck:check("doc_sync_connect_requests_app_id_ck",sql`length(${t.app_id}) BETWEEN 1 AND 128`),refCheck:check("doc_sync_connect_requests_ref_ck",sql`length(${t.ref}) BETWEEN 1 AND 256`),sentHashCheck:check("doc_sync_connect_requests_sent_hash_ck",sql`length(${t.sent_hash}) = 71 AND substr(${t.sent_hash}, 1, 7) = 'sha256:' AND substr(${t.sent_hash}, 8) NOT GLOB '*[^0-9a-f]*'`),createdAtCheck:check("doc_sync_connect_requests_created_at_ck",sql`${t.created_at} >= 0`),connectUnique:uniqueIndex("doc_sync_connect_requests_connect_uq").on(t.account_key,t.workspace_id,t.app_id,t.ref)}));});var Wa=v(()=>{_();sqliteTable("doc_sync_links",{doc_id:text("doc_id").primaryKey().notNull(),account_key:text("account_key").notNull(),workspace_id:text("workspace_id").notNull(),app_id:text("app_id").notNull(),root_segments:text("root_segments").notNull(),ref:text("ref").notNull(),cloud_ref:text("cloud_ref").notNull(),origin:text("origin").notNull().default("own"),sync_state:text("sync_state").notNull().default("ok"),end_reason:text("end_reason"),file_state:text("file_state").notNull().default("present"),synced_revision:integer("synced_revision").notNull(),synced_hash:text("synced_hash").notNull(),synced_at:integer("synced_at").notNull(),file_dev_ino:text("file_dev_ino"),conflict_revision:integer("conflict_revision"),conflict_hash:text("conflict_hash"),conflict_at:integer("conflict_at"),remote_revision:integer("remote_revision"),remote_checked_at:integer("remote_checked_at"),published_revision:integer("published_revision"),bundle_sha256:text("bundle_sha256"),missing_since:integer("missing_since"),connected_at:integer("connected_at").notNull(),created_at:integer("created_at").notNull(),updated_at:integer("updated_at").notNull()},t=>({docIdCheck:check("doc_sync_links_doc_id_ck",sql`length(${t.doc_id}) BETWEEN 1 AND 128`),accountKeyCheck:check("doc_sync_links_account_key_ck",sql`length(${t.account_key}) = 64 AND ${t.account_key} NOT GLOB '*[^0-9a-f]*'`),workspaceIdCheck:check("doc_sync_links_workspace_id_ck",sql`length(${t.workspace_id}) BETWEEN 1 AND 256`),appIdCheck:check("doc_sync_links_app_id_ck",sql`length(${t.app_id}) BETWEEN 1 AND 128`),rootSegmentsCheck:check("doc_sync_links_root_segments_ck",sql`json_valid(${t.root_segments}) AND json_type(${t.root_segments}) = 'array'`),refCheck:check("doc_sync_links_ref_ck",sql`length(${t.ref}) BETWEEN 1 AND 256`),cloudRefCheck:check("doc_sync_links_cloud_ref_ck",sql`length(${t.cloud_ref}) BETWEEN 1 AND 256`),originCheck:check("doc_sync_links_origin_ck",sql`${t.origin} IN ('own', 'received')`),syncStateCheck:check("doc_sync_links_sync_state_ck",sql`${t.sync_state} IN ('ok', 'conflict', 'ended')`),endReasonCheck:check("doc_sync_links_end_reason_ck",sql`${t.end_reason} IS NULL OR ${t.end_reason} IN ('disconnected', 'cloud_deleted')`),endedMatchesReasonCheck:check("doc_sync_links_ended_reason_ck",sql`(${t.sync_state} = 'ended') = (${t.end_reason} IS NOT NULL)`),fileStateCheck:check("doc_sync_links_file_state_ck",sql`${t.file_state} IN ('present', 'missing', 'root_unavailable')`),syncedRevisionCheck:check("doc_sync_links_synced_revision_ck",sql`${t.synced_revision} >= 0`),syncedHashCheck:check("doc_sync_links_synced_hash_ck",sql`length(${t.synced_hash}) = 71 AND substr(${t.synced_hash}, 1, 7) = 'sha256:' AND substr(${t.synced_hash}, 8) NOT GLOB '*[^0-9a-f]*'`),connectedAtCheck:check("doc_sync_links_connected_at_ck",sql`${t.connected_at} >= 0`),createdAtCheck:check("doc_sync_links_created_at_ck",sql`${t.created_at} >= 0`),updatedAtCheck:check("doc_sync_links_updated_at_ck",sql`${t.updated_at} >= ${t.created_at}`),liveRefUnique:uniqueIndex("doc_sync_links_live_ref_uq").on(t.workspace_id,t.app_id,t.ref).where(sql`${t.sync_state} <> 'ended'`),accountStateIdx:index("doc_sync_links_account_state_idx").on(t.account_key,t.sync_state),workspaceAppIdx:index("doc_sync_links_workspace_app_idx").on(t.workspace_id,t.app_id)}));});var Bt=v(()=>{_();Rr();nn();Vi();Yi();Ln();ea();na();ra();oa();aa();da();la();pa();ga();ha();ma();Ta();ya();Ea();Ia();js();xa();Da();Pa();Ha();Ua();Fa();qa();Wa();});function qn(t){return typeof t=="string"&&wt.includes(t)}function Ga(t){if(!t||!t.includes("workflow"))return null;let e;try{e=JSON.parse(t);}catch{return null}if(typeof e!="object"||e===null||Array.isArray(e))return null;let n=e,r=n.workflowRunId;if(typeof r=="string"&&r!=="")return r;let s=n.workflow;if(typeof s=="object"&&s!==null&&!Array.isArray(s)){let o=s.exec_id;if(typeof o=="string"&&o!=="")return o}return null}var wt,Pr=v(()=>{_();wt=["workflow_card","workflow_ui_instance","workflow_run"];});var on,Ys,ja,Qs=v(()=>{_();on={"claude-fable-5-1":{input:10,cachedInput:.25,output:50},"claude-fable-5":{input:10,cachedInput:1,output:50},"claude-opus-5-5":{input:4,cachedInput:.2,output:20},"claude-opus-5-5-medium":{input:4,cachedInput:.2,output:20},"claude-opus-5":{input:5,cachedInput:.5,output:25},"claude-opus-4-8":{input:5,cachedInput:.5,output:25},"claude-opus-4-7":{input:5,cachedInput:.5,output:25},"claude-opus-4-6":{input:5,cachedInput:.5,output:25},"claude-sonnet-5-5":{input:2,cachedInput:.1,output:10},"claude-sonnet-5-5-medium":{input:2,cachedInput:.1,output:10},"claude-sonnet-5":{input:2,cachedInput:.2,output:10},"claude-sonnet-4-6":{input:3,cachedInput:.3,output:15},"claude-haiku-5-5":{input:.1,cachedInput:.01,output:.5},"claude-haiku-4-5":{input:1,cachedInput:.1,output:5},"gpt-6-astra":{input:10,cachedInput:1,output:50},"gpt-6.1-sol":{input:2,cachedInput:.1,output:10},"gpt-6.1-terra":{input:1,cachedInput:.05,output:5},"gpt-6-sol":{input:2,cachedInput:.2,output:10},"gpt-6-luna":{input:.1,cachedInput:.01,output:.5},"gpt-5.6-sol":{input:4,cachedInput:.4,output:20},"gpt-5.6-terra":{input:2,cachedInput:.2,output:12},"gpt-5.6-luna":{input:.2,cachedInput:.02,output:1.2},"gpt-5.5":{input:5,cachedInput:.5,output:30},"gpt-5.4":{input:2.5,cachedInput:.25,output:15},"gpt-5.4-mini":{input:.75,cachedInput:.075,output:4.5},"gpt-5.3-codex":{input:1.75,cachedInput:.175,output:14},"gpt-5-mini":{input:.4,cachedInput:.1,output:1.6},"gpt-4.1":{input:2,cachedInput:.5,output:8},"gpt-4o":{input:2.5,cachedInput:1.25,output:10},"glm-5.2":{input:1.4,cachedInput:.26,output:4.4},"glm-5.1":{input:1.4,cachedInput:.26,output:4.4},"gemini-3.7-flash":{input:1.5,cachedInput:.15,output:7.5},"gemini-3.6-flash":{input:1.5,cachedInput:.15,output:7.5},"grok-4.7":{input:2,cachedInput:.5,output:6},"grok-4.6":{input:2,cachedInput:.5,output:6},"grok-4.5":{input:2,cachedInput:.3,output:6}},Ys=new Set(["gpt-5.3-codex-spark","claude-opus-4-6-thinking","gpt-oss-120b"]),ja=new Set(["auto","claude-fable-5","claude-fable-5-1","claude-haiku-4-5","claude-haiku-5-5","claude-opus-4-6","claude-opus-4-6-thinking","claude-opus-4-6[1m]","claude-opus-4-7","claude-opus-4-7[1m]","claude-opus-4-8","claude-opus-4-8[1m]","claude-opus-5","claude-opus-5-5","claude-opus-5-5-medium","claude-sonnet-4-6","claude-sonnet-4-6[1m]","claude-sonnet-5","claude-sonnet-5-5","claude-sonnet-5-5-medium","gemini-3.1-pro","gemini-3.6-flash","gemini-3.7-flash","gemini-3.8-flash","gemini-4-argon","glm-5.1","glm-5.2","gpt-4.1","gpt-4o","gpt-5-mini","gpt-5.3-codex","gpt-5.3-codex-spark","gpt-5.4","gpt-5.4-mini","gpt-5.5","gpt-5.6-luna","gpt-5.6-sol","gpt-5.6-terra","gpt-6-astra","gpt-6-luna","gpt-6-sol","gpt-6.1-sol","gpt-6.1-terra","gpt-oss-120b","grok-4.5","grok-4.6","grok-4.7"]);});function Zs(t){let e=t.toLowerCase().trim();e=e.replace(/\[[^\]]*\]$/g,"");let n=e.lastIndexOf("/");return n>=0&&(e=e.slice(n+1)),e=e.replace(/-\d{8}$/,""),e}function Rp(t){if(!t)return console.warn("[pricing] missing model id; cost is being recorded as 0"),Bn;let e=Zs(t),n=Ep[e];if(n)return Lr[n]??on[n]??Bn;if(Lr[e])return Lr[e];if(on[e])return on[e];if(Ys.has(e))return console.warn(`[pricing] unpublished model pricing: ${t}, cost_usd=0`),Bn;if(ja.has(e))return console.warn(`[pricing] missing catalog pricing: ${t}, cost_usd=0`),Bn;let r={...on,...Lr};for(let s of Object.keys(r))if(e.includes(s))return r[s];return console.warn(`[pricing] Unknown model: ${t}, cost_usd=0`),Bn}function Sp(t,e,n,r=0,s){let o=Rp(n),i=Math.min(r,t),d=(t-i)*o.input/1e6,c=i*o.cachedInput/1e6,l=e*o.output/1e6;return d+c+l}function za(t,e,n,r,s,o){return t&&t>0?t:!e&&!n?0:Sp(e??0,n??0,s,r??0)}var Ep,Bn,Lr,Mr=v(()=>{_();Qs();Qs();Ep={opus:"claude-opus-4-8",sonnet:"claude-sonnet-4-6",haiku:"claude-haiku-4-5","codex-mini":"gpt-5.3-codex",codex:"gpt-5.3-codex"},Bn={input:0,cachedInput:0,output:0},Lr={};});function Xa(t){if(!t||!t.includes("schedule_id"))return null;let e;try{e=JSON.parse(t);}catch{return null}if(typeof e!="object"||e===null||Array.isArray(e))return null;let n=e,r=n.trigger;if(typeof r!="string"||!Ip.includes(r))return null;let s=n.schedule_id;return typeof s=="string"&&s!==""?s:null}var Ip,Ya=v(()=>{_();Ip=["cron","cron_manual"];});function to(t){return t instanceof Error?t:t===void 0?void 0:new Error(String(t))}function Qa(t){return typeof t=="object"&&t!==null&&"code"in t?String(t.code):void 0}function $r(t){return Number.isSafeInteger(t)&&t>0}function xp(t,e){try{let n=spawnSync(t,e,{encoding:"utf8",timeout:eo,windowsHide:!0});return {status:n.status,stdout:typeof n.stdout=="string"?n.stdout:"",stderr:typeof n.stderr=="string"?n.stderr:"",error:n.error}}catch(n){return {status:null,stdout:"",stderr:"",error:to(n)}}}function Cp(t,e){return new Promise(n=>{let r;try{r=spawn(t,e,{windowsHide:!0});}catch(c){n({status:null,stdout:"",stderr:"",error:to(c)});return}let s="",o="",i=false,u,d=setTimeout(()=>{try{r.kill();}catch{}u({status:null,stdout:s,stderr:o,error:new Error(`Command timed out after ${eo}ms`)});},eo);u=c=>{i||(i=true,clearTimeout(d),n(c));},r.stdout?.setEncoding("utf8"),r.stderr?.setEncoding("utf8"),r.stdout?.on("data",c=>{s+=String(c);}),r.stderr?.on("data",c=>{o+=String(c);}),r.once("error",c=>{u({status:null,stdout:s,stderr:o,error:c});}),r.once("close",c=>{u({status:c,stdout:s,stderr:o});});})}async function no(t,e,n){return n.runCommandAsync?n.runCommandAsync(t,e):n.runCommand?n.runCommand(t,e):Cp(t,e)}function Dp(t){return new Promise(e=>{setTimeout(e,Math.max(0,t));})}function Pp(){return new Promise(t=>{setImmediate(t);})}function Et(t,e=process.kill){try{return e(t,0),"alive"}catch(n){return Qa(n)==="ESRCH"?"not_found":Qa(n)==="EPERM"?"alive":"unknown"}}function Lp(t,e){let n=Et(-t,e),r=Et(t,e);return n==="alive"||r==="alive"?"alive":n==="unknown"||r==="unknown"?"unknown":"not_found"}async function ed(t,e,n,r){let s=Math.max(0,n),o=Math.max(1,r.pollIntervalMs??bp),i=Date.now()+s,u,d=s===0,c=r.sleep?Promise.resolve().then(()=>r.sleep(s)).then(()=>{},()=>{}):new Promise(l=>{u=setTimeout(l,s);});c.then(()=>{d=true;});try{for(await Pp();;){let l=Lp(t,e);if(l==="not_found")return l;let p=i-Date.now();if(d||p<=0)return l;await Promise.race([c,Dp(Math.min(o,p))]);}}finally{u!==void 0&&clearTimeout(u);}}async function Za(t,e,n,r,s){let o=await ed(t,e,s.hardConfirmMs??vp,{...s,sleep:void 0});return o==="not_found"?n?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r}:o==="alive"?{status:"failed",pid:t,method:r,error:"Process is still running after termination attempt"}:{status:"failed",pid:t,method:r,error:"Unable to verify process termination"}}async function td(t,e,n={}){if(!$r(t))return "unknown";let r=n.platform??process.platform,s=r==="win32"?"powershell.exe":"ps",o=r==="win32"?["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`$p = Get-CimInstance -ClassName Win32_Process -Filter 'ProcessId = ${t}' -ErrorAction Stop; if ($null -ne $p) { [Console]::Write([string]$p.CommandLine) }`]:["-p",String(t),"-o","command="],i;try{i=await no(s,o,n);}catch{return "unknown"}if(i.error||i.status!==0)return "unknown";let u=i.stdout.trim();if(!u)return "not_found";let d=r==="win32"?u.toLowerCase():u;return e.filter(l=>l.trim().length>0).some(l=>{let p=r==="win32"?l.toLowerCase():l;return d.includes(p)})?"owned":"not_owned"}function Up(t){let e=Mp.exec(t.trim());if(!e)return;let[,n="0",r="0",s="0",o="0"]=e;return ((Number(n)*24+Number(r))*60+Number(s))*60+Number(o)}function Fp(t){let e=t.trim(),n=Hp.exec(e);if(n){let[,s,o,i,u,d,c,l,p]=n;return Date.UTC(Number(s),Number(o)-1,Number(i),Number(u),Number(d),Number(c),Math.trunc(Number(l)/1e3))-Number(p)*6e4}let r=Date.parse(e);return Number.isFinite(r)?r:void 0}function nd(t,e){return e==="win32"?{command:"powershell.exe",args:["-NoLogo","-NoProfile","-NonInteractive","-ExecutionPolicy","Bypass","-Command",`$p = Get-CimInstance -ClassName Win32_Process -Filter 'ProcessId = ${t}' -ErrorAction Stop; if ($null -ne $p) { [Console]::Write($p.CreationDate.ToUniversalTime().ToString('o')) }`]}:{command:"ps",args:["-p",String(t),"-o","pgid=","-o","etime=","-o","stat="]}}function rd(t,e,n){if(t.error)return {status:"unknown"};let r=t.stdout.trim();if(!r)return t.status===0||t.status===1?{status:"not_found"}:{status:"unknown"};if(t.status!==0)return {status:"unknown"};if(e==="win32"){let i=Fp(r);return i===void 0?{status:"unknown"}:{status:"found",startedAtMs:i,groupId:null}}let s=$p.exec(r),o=s?Up(s[2]):void 0;return !s||o===void 0?{status:"unknown"}:s[3].startsWith("Z")?{status:"unknown"}:{status:"found",startedAtMs:n-o*1e3,groupId:Number(s[1])}}function sd(t,e={}){if(!$r(t))return {status:"unknown"};let n=e.platform??process.platform,{command:r,args:s}=nd(t,n),o=e.runCommand??xp,i;try{i=o(r,s);}catch{return {status:"unknown"}}return rd(i,n,Date.now())}async function od(t,e={}){if(!$r(t))return {status:"unknown"};let n=e.platform??process.platform,{command:r,args:s}=nd(t,n),o;try{o=await no(r,s,e);}catch{return {status:"unknown"}}return rd(o,n,Date.now())}async function St(t,e={}){let n=e.platform??process.platform,r=n==="win32"?"taskkill":"process-group",s=g=>({status:"failed",pid:t,method:r,error:g});if(!$r(t))return s("Invalid process ID");let o=e.kill??process.kill,i=Et(t,o);if(i==="not_found")return {status:"not_found",pid:t,method:r};if(i!=="alive")return s("Unable to determine whether the process is alive");if(n==="win32"){let g;try{g=await no("taskkill",["/PID",String(t),"/T","/F"],e);}catch(m){g={status:null,stdout:"",stderr:"",error:to(m)};}let h=Et(t,o);return h==="not_found"?g.status===0&&!g.error?{status:"terminated",pid:t,method:r}:{status:"not_found",pid:t,method:r}:s(h==="alive"?"Process is still running after termination attempt":"Unable to verify process termination")}let u,d=e.signal??"SIGKILL";try{o(-t,d);}catch(g){u=g;}if(d==="SIGKILL")return Za(t,o,u,r,e);if(await ed(t,o,e.graceMs??Np,e)==="not_found")return u?{status:"not_found",pid:t,method:r}:{status:"terminated",pid:t,method:r};let l;try{o(-t,"SIGKILL");}catch(g){l=g;}let p=await Za(t,o,l,r,e);return p.status==="terminated"?p:p.status==="not_found"?u?p:{status:"terminated",pid:t,method:r}:s(p.error??"Process termination failed")}var eo,Rt,Np,bp,vp,Hr,Mp,$p,Hp,Ur=v(()=>{_();eo=3e3,Rt="SIGINT",Np=2e3,bp=25,vp=100;Hr=3e3,Mp=/^(?:(\d+)-)?(?:(\d+):)?(\d{1,2}):(\d{2})$/,$p=/^\s*(\d+)\s+(\S+)\s+(\S+)\s*$/,Hp=/^(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})\.(\d{6})([+-]\d{3})$/;});function cd(t,e){let n=e===void 0?"":` at index ${e}`;if(!t||typeof t!="object")throw new f("VALIDATION",`Task log entry${n} must be an object`);if(typeof t.timestamp!="string"||typeof t.level!="string"||typeof t.message!="string")throw new f("VALIDATION",`Task log entry${n} must contain string timestamp, level, and message fields`);return {timestamp:t.timestamp,level:t.level,message:t.message}}function dd(t,e){if(e===null||e.trim()==="")return [];let n;try{n=JSON.parse(e);}catch(r){throw new f("DB_ERROR",`Malformed legacy task logs: ${t}`,r)}if(!Array.isArray(n))throw new f("DB_ERROR",`Malformed legacy task logs: ${t} (expected an array)`);try{return n.map((r,s)=>cd(r,s))}catch(r){throw r instanceof f?new f("DB_ERROR",`Malformed legacy task logs: ${t}`,r):r}}function ld(t){if(t.log_storage!=="blob"&&t.log_storage!=="events")throw new f("DB_ERROR",`Invalid task log storage for task: ${t.id}`);if(!Number.isInteger(t.last_log_seq)||t.last_log_seq<0)throw new f("DB_ERROR",`Invalid task log sequence for task: ${t.id}`);if(!Number.isInteger(t.log_revision)||t.log_revision<0)throw new f("DB_ERROR",`Invalid task log revision for task: ${t.id}`);return t.log_storage}function ud(t){return {taskId:t.id,source:ld(t),revision:t.log_revision,lastSeq:t.last_log_seq}}function zp(t){if(!Number.isInteger(t)||t<0)throw new f("VALIDATION","Task log tail limit must be a non-negative integer")}var Fr,pd=v(()=>{_();kt();Ct();Dt();mt();Bt();Fr=class extends Re{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?xt(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let s=dirname(n);existsSync(s)||mkdirSync(s,{recursive:true});}else if(!existsSync(n))throw new f("NOT_FOUND","Database not found");let r=$(n);if(e)try{Pe(r.db,n);}catch(s){throw r.close(),s}return r}findStateRow(e,n){return e.db.select({id:a.id,log_storage:a.log_storage,last_log_seq:a.last_log_seq,log_revision:a.log_revision,logs:a.logs}).from(a).where(eq(a.id,n)).limit(1).get()}findStateRowInTransaction(e,n){return e.select({id:a.id,log_storage:a.log_storage,last_log_seq:a.last_log_seq,log_revision:a.log_revision,logs:a.logs}).from(a).where(eq(a.id,n)).limit(1).get()}requireStateRowInTransaction(e,n){let r=this.findStateRowInTransaction(e,n);if(!r)throw new f("NOT_FOUND",`Task not found: ${n}`);return r}appendLog(e,n){return this.appendLogs(e,[n])}appendLogs(e,n){let r=n.map((o,i)=>cd(o,i));if(r.length===0){let o=this.getLogState(e);if(!o)throw new f("NOT_FOUND",`Task not found: ${e}`);return o}let s=this.openHandle(true);try{return s.db.transaction(i=>{let u=this.requireStateRowInTransaction(i,e),d=ld(u);if(d==="blob"){let g=dd(e,u.logs);if(i.update(a).set({logs:JSON.stringify([...g,...r]),log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new f("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:d,revision:u.log_revision+1,lastSeq:u.last_log_seq}}let c=u.last_log_seq+1,l=u.last_log_seq+r.length;if(i.insert(rt).values(r.map((g,h)=>({task_id:e,seq:c+h,timestamp:g.timestamp,level:g.level,message:g.message}))).run(),i.update(a).set({last_log_seq:l,log_revision:sql`${a.log_revision} + 1`}).where(eq(a.id,e)).run().changes!==1)throw new f("NOT_FOUND",`Task not found: ${e}`);return {taskId:e,source:d,revision:u.log_revision+1,lastSeq:l}},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to append task log",o)}finally{s.close();}}getLogState(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=this.findStateRow(n,e);return r?ud(r):void 0}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to read task log state",r)}finally{n.close();}}readLogs(e){return this.readLogsInternal(e)}readLogsTail(e,n){return zp(n),this.readLogsInternal(e,n)}readTail(e,n){return this.readLogsTail(e,n)}readLogsInternal(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{return r.db.transaction(s=>{let o=this.findStateRowInTransaction(s,e);if(!o)return;let i=ud(o);if(i.source==="blob"){let l=dd(e,o.logs).map((p,g)=>({...p,seq:g+1}));return {...i,entries:n===void 0?l:l.slice(Math.max(0,l.length-n))}}let u=s.select({seq:rt.seq,timestamp:rt.timestamp,level:rt.level,message:rt.message}).from(rt).where(eq(rt.task_id,e)).orderBy(n===void 0?asc(rt.seq):desc(rt.seq)),c=(n===void 0?u.all():u.limit(n).all()).map(({seq:l,timestamp:p,level:g,message:h})=>({seq:l,timestamp:p,level:g,message:h}));return n!==void 0&&c.reverse(),{...i,entries:c}},{behavior:"deferred"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to read task logs",s)}finally{r.close();}}};});var Yp,qr,gd=v(()=>{_();kt();Ct();Dt();mt();Bt();Yp=50,qr=class extends Re{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=`${e.dbRoot}/.crewx/crewx.db`);}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(){let e=this.resolveDbPath(),n=$(e);try{return Pe(n.db,e),n}catch(r){throw n.close(),r}}recordAccepted(e){if(e.actorKind!=="human"||!e.workspaceId||!e.actorId||!e.agentId)return false;let n;try{n=this.openHandle();let r=e.acceptedAt??new Date().toISOString();return n.db.insert(be).values({workspace_id:e.workspaceId,actor_id:e.actorId,agent_id:e.agentId,last_accepted_at:r}).onConflictDoUpdate({target:[be.workspace_id,be.actor_id,be.agent_id],set:{last_accepted_at:sql`MAX(${be.last_accepted_at}, excluded.last_accepted_at)`}}).run(),!0}catch(r){return console.error("[AgentSendHistoryRepository] Failed to record accepted agent send",r),false}finally{n?.close();}}findRecentAgents(e,n){let r;try{return r=this.openHandle(),r.db.select({agentId:be.agent_id,lastAcceptedAt:be.last_accepted_at}).from(be).where(and(eq(be.workspace_id,e),eq(be.actor_id,n))).orderBy(desc(be.last_accepted_at),asc(be.agent_id)).limit(Yp).all()}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to find recent agent sends",s)}finally{r?.close();}}};});var _d=v(()=>{_();});var V,Wt=v(()=>{_();V=class extends Error{constructor(n,r,s){super(n);this.providerStr=r;this.name="ProviderError",this.code=s?.code??"UNKNOWN",this.kind=s?.kind??(this.code==="UNKNOWN"?"transient":void 0),this.retryAfterMs=s?.retryAfterMs;}providerStr;code;kind;retryAfterMs;stdout};});var Gt,ro=v(()=>{_();Wt();Gt=class extends V{name="RateLimitError";constructor(e,n="cli/claude"){super(e,n,{code:"QUOTA_EXHAUSTED",kind:"transient"});}};});function Br(t){if(typeof t!="string")return;let e=t.trim();if(e)return e=e.replace(/^\s*at\s+[^\r\n]+(?:\r?\n|$)/gim,""),e=e.replace(/(^|[\r\n])\s*(?:authorization|proxy-authorization|x-api-key|x-goog-api-key|x-auth-token|cookie|set-cookie)\s*:\s*[^\r\n]*/gim,`$1[HTTP HEADER ${we}]`),e=Zp(e),e=e.replace(/\b(?:Bearer|Basic)\s+[A-Za-z0-9._~+\-/]+=*/gi,`${we}`),e=e.replace(/\bsk-[A-Za-z0-9][A-Za-z0-9_-]*/g,we),e=e.replace(/\bghp_[A-Za-z0-9][A-Za-z0-9_-]*/g,we),e=e.replace(/\bxoxb-[A-Za-z0-9-]+/g,we),e=e.replace(/\bxoxp-[A-Za-z0-9-]+/g,we),e=e.replace(/\bAKIA[0-9A-Z]{12,}\b/g,we),e=e.replace(/\bgithub_pat_[A-Za-z0-9_]+/g,we),e=e.replace(/\bgho_[A-Za-z0-9_]+/g,we),e=e.replace(/\bAIza[A-Za-z0-9_-]{20,}\b/g,we),e=e.replace(/\beyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+\b/g,we),e=e.replace(/\b(?:authorization|api[_ -]?key|access[_ -]?token|auth[_ -]?token|refresh[_ -]?token|token|secret|password)\s*([:=])\s*["']?[^\s,;&"']+/gi,(n,r)=>`${we}${r}${we}`),e=e.replace(/([?&](?:api[_-]?key|access[_-]?token|token)=)[^&\s]+/gi,`$1${we}`),e=e.replace(/(?:\/(?:Users|home|private|var\/folders|tmp|workspace|workspaces|Volumes|opt|etc|srv|Applications)\/[^\s"'`),;]+)/g,hd),e=e.replace(/\b[A-Z]:\\(?:Users|home|Windows|Program Files|workspace|workspaces)\\[^\s"'`),;]*/gi,hd),e=e.replace(/[\r\n]{3,}/g,`
33
+
34
+ `).trim(),Qp(e,1024)||void 0}function Qp(t,e){let n=new TextEncoder;if(n.encode(t).byteLength<=e)return t;let r="",s=0;for(let o of t){let i=n.encode(o).byteLength;if(s+i>e)break;r+=o,s+=i;}return r}function Zp(t){let e=/\b(?:request|response|http)?\s*body\s*[:=]\s*/gim,n="",r=0,s;for(;(s=e.exec(t))!==null;){if(s.index<r)continue;let o=s.index+s[0].length,i=ef(t,o),u=i>=0?i:t.indexOf(`
35
+ `,o)>=0?t.indexOf(`
36
+ `,o):t.length;n+=t.slice(r,s.index),n+=`[HTTP BODY ${we}]`,r=u;}return n+t.slice(r)}function ef(t,e){let n=t[e];if(n==='"'||n==="'")return tf(t,e,n);if(n!=="{"&&n!=="[")return -1;let r=[],s,o=false;for(let i=e;i<t.length;i+=1){let u=t[i];if(s){o?o=false:u==="\\"?o=true:u===s&&(s=void 0);continue}if(u==='"'||u==="'"){s=u;continue}if(u==="{"||u==="["){r.push(u);continue}if(u!=="}"&&u!=="]")continue;let d=r.pop();if(u==="}"&&d!=="{"||u==="]"&&d!=="[")return -1;if(r.length===0)return i+1}return -1}function tf(t,e,n){let r=false;for(let s=e+1;s<t.length;s+=1){let o=t[s];if(r)r=false;else if(o==="\\")r=true;else if(o===n)return s+1}return -1}var we,hd,so=v(()=>{_();we="[REDACTED]",hd="[PATH]";});function io(t){if(!Wr(t)||t.type!=="item.started"||!kd(t)||!md(t))return false;let e=t.item;return !Wr(e)||!kd(e)||!md(e)||!oo(e.id)?false:e.type==="web_search"?e.query===""&&Wr(e.action)&&e.action.type==="other":e.type==="file_change"?e.status!=="in_progress"||!Array.isArray(e.changes)||e.changes.length===0?false:e.changes.every(n=>Wr(n)&&oo(n.path)&&oo(n.kind)):false}function Wr(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function Td(t,e){return Object.prototype.hasOwnProperty.call(t,e)}function oo(t){return typeof t=="string"&&t.trim().length>0}function md(t){return !Td(t,"status")||t.status==="in_progress"}function kd(t){for(let e of ["error","errors","isError","is_error"])if(Td(t,e))return false;return true}var ao=v(()=>{_();});function an(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function dn(t){return typeof t=="string"&&t.trim().length>0}function uo(t){return typeof t=="string"?t.trim().length>0:an(t)?dn(t.code)||dn(t.message)||dn(t.error)||dn(t.reason):false}function Gn(t){let e;try{e=JSON.parse(t);}catch{return}if(an(e))switch(e.event){case "init":return an(e.init)?{kind:"init",envelope:e,init:e.init}:void 0;case "step_update":{if(!an(e.step_update))return;let n=e.step_update;return !dn(n.conversation_id)||!Number.isSafeInteger(n.step_index)||n.state!=="ACTIVE"&&n.state!=="DONE"&&!(n.state==="ERROR"&&n.step_type==="tool")||!dn(n.step_type)?void 0:{kind:"step_update",envelope:e,step:n}}case "result":return an(e.result)?{kind:"result",envelope:e,result:e.result}:void 0;case "AGY_ERROR":{let n=uo(e)?e:e.error;return uo(n)?{kind:"agy_error",envelope:e,error:n}:void 0}default:return (e.status==="SUCCESS"||e.status==="ERROR")&&typeof e.response=="string"&&(typeof e.conversation_id=="string"||uo(e.error)||an(e.usage))?{kind:"legacy_result",envelope:e,result:e}:void 0}}function yd(t){return Gn(t)!==void 0}function jn(t){let e=[];for(let n of t.split(/\r?\n/)){if(!n.trim())continue;let r=Gn(n);r&&e.push(r);}return e}var co=v(()=>{_();});function nf(t,e){let n=t.trimStart();if(!n.startsWith("{"))return false;let r;try{r=JSON.parse(n);}catch{return false}let s=typeof r.type=="string"?r.type:"",o=e?lf[e]:void 0;return o?o(r,s):s?Object.values(Ed).some(i=>i(r,s)):false}function at(t,e){let n=t.split(`
37
+ `).filter(r=>r.trim());return n.length===0?false:n.every(r=>nf(r,e))}function ve(t){return typeof t=="object"&&t!==null}function wd(t,e){if(e==="assistant"||e==="user"){let n=t.message;return ve(n)&&Array.isArray(n.content)}return e==="system"?typeof t.subtype=="string"||typeof t.session_id=="string":e==="result"?typeof t.result=="string"||ve(t.usage)||typeof t.total_cost_usd=="number"||typeof t.is_error=="boolean":e==="rate_limit_event"?ve(t.rate_limit_info):e==="tool_progress"?t.heartbeat===true&&typeof t.tool_use_id=="string":false}function rf(t,e){return typeof t.session_id=="string"||typeof t.uuid=="string"?true:wd(t,e)}function sf(t,e){if(e==="error")return typeof t.message=="string"||typeof t.errorMessage=="string"||typeof t.error=="string"||ve(t.error);if(e==="item.updated"||e.startsWith("thread.")||e.startsWith("turn."))return true;if(e==="item.started"||e==="item.completed"){let n=t.item;return ve(n)&&typeof n.type=="string"}return false}function of(t,e){return e==="step_start"||e==="step_finish"?typeof t.stepID=="string"||typeof t.sessionID=="string"||ve(t.part):e==="text"||e==="tool_use"?ve(t.part):e==="result"?typeof t.result=="string":false}function af(t,e){return !!(typeof t.stepID=="string"||typeof t.sessionID=="string"||ve(t.part)||e==="result"&&typeof t.result=="string")}function df(t,e){return e.startsWith("assistant.")||e.startsWith("tool.execution")||e==="user.message"?ve(t.data):e==="result"?typeof t.result=="string":false}function uf(t,e){return e==="message"?typeof t.role=="string":e==="tool_use"?typeof t.tool_name=="string"||typeof t.tool_id=="string":e==="tool_result"?typeof t.tool_id=="string"||typeof t.status=="string":false}function cf(t,e){return e==="available_commands"?ve(t.tools)||ve(t.commands):e==="usage"?ve(t.usage):e==="end"?typeof t.sessionId=="string"||typeof t.stopReason=="string"||ve(t.usage):e==="tool_call_update"?typeof t.toolCallId=="string"||typeof t.status=="string":false}var Ed,lf,un=v(()=>{_();ao();co();Ed={claude:wd,codex:sf,opencode:of,copilot:df,gemini:uf},lf={...Ed,claude:rf,opencode:af,grok:cf,antigravity:t=>yd(JSON.stringify(t))};});function dt(t){return /crewx\s+(q|query|x|execute)\s/.test(t)}function ut(t,e,n){let r=e.match(/@(\S+)/);return {timestamp:t,type:"agent_call",targetAgent:r?.[1]?.replace(/["']/g,""),toolInput:e,...typeof n=="string"&&n.length>0?{toolUseId:n}:{}}}var cn=v(()=>{_();});function gf(t){let e=_f(t),n=e.map((o,i)=>({line:o,index:i})).filter(({line:o})=>mf(o.value)),r=hf(e);return {result:n.length===1&&n[0].index===r?kf(n[0].line.value):null,resultPreview:wf(e,n),hasReservedLine:n.length>0}}function Ge(t,e){let n=gf(t);return {resultPreview:n.resultPreview,isError:e||n.result?.isError===true,...n.hasReservedLine?{delegationResult:n.result}:{}}}function _f(t){let e=[],n=0;for(let r=0;r<t.length;r++){let s=t[r];if(s!==`
38
+ `&&s!=="\r")continue;let o=s==="\r"&&t[r+1]===`
39
+ `?`\r
40
+ `:s;e.push({value:t.slice(n,r),separator:o}),r+=o.length-1,n=r+1;}return e.push({value:t.slice(n),separator:""}),e}function hf(t){for(let e=t.length-1;e>=0;e--)if(t[e].value.trim())return e;return -1}function mf(t){return t.trimStart().startsWith(pf)}function kf(t){let e=t.trim();if(!e.startsWith(Rd)||!e.endsWith("]]"))return null;let n=e.slice(Rd.length,-2);if(!n)return null;try{return Tf(JSON.parse(n))}catch{return null}}function Tf(t){return yf(t)?Object.prototype.hasOwnProperty.call(t,"taskId")?{schema:1,taskId:t.taskId,agentId:t.agentId,isError:t.isError}:{schema:1,isError:true}:null}function yf(t){if(!Ef(t)||Object.keys(t).some(r=>!ff.has(r))||t.schema!==1||typeof t.isError!="boolean")return false;let e=Object.prototype.hasOwnProperty.call(t,"taskId"),n=Object.prototype.hasOwnProperty.call(t,"agentId");return e!==n?false:e?Sd(t.taskId)&&Sd(t.agentId):t.isError===true}function wf(t,e){if(e.length===0)return t.map(r=>r.value+r.separator).join("");let n=new Set(e.map(({index:r})=>r));return t.map((r,s)=>n.has(s)?"":r.value+r.separator).join("")}function Sd(t){return typeof t=="string"&&t.trim().length>0}function Ef(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}var Rd,pf,ff,ln=v(()=>{_();Rd="[[crewx:delegation-result ",pf="[[crewx:delegation-result",ff=new Set(["schema","taskId","agentId","isError"]);});function je(t){if(typeof t=="string")return t;if(!t||typeof t!="object")return JSON.stringify(t??{});let e=t;return typeof e.command=="string"?e.command:typeof e.file_path=="string"?e.file_path:typeof e.filePath=="string"?e.filePath:typeof e.path=="string"?e.path:typeof e.query=="string"?e.query:typeof e.pattern=="string"?e.pattern:typeof e.url=="string"?e.url:typeof e.prompt=="string"?e.prompt.length>200?e.prompt.slice(0,200)+"\u2026":e.prompt:typeof e.description=="string"?e.description:JSON.stringify(e)}var pn=v(()=>{_();});var Id,Gr,lo,jr=v(()=>{_();Id=["none","minimal","low","medium","high","xhigh","max","ultra"],Gr={claude:["low","medium","high","xhigh","max"],codex:["none","minimal","low","medium","high","xhigh","max","ultra"],opencode:[],copilot:["none","low","medium","high","xhigh","max"],antigravity:["low","medium","high"],grok:["low","medium","high","xhigh"]},lo={claude:{models:[{id:"claude-fable-5-1",name:"Claude Fable 5.1",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-fable-5",name:"Claude Fable 5",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-5-5",name:"Claude Opus 5.5",contextWindowTokens:1e6,tier:"flagship",recommended:true},{id:"claude-opus-5",name:"Claude Opus 5",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-sonnet-5-5",name:"Claude Sonnet 5.5",contextWindowTokens:1e6,tier:"balanced",recommended:true},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-opus-4-8[1m]",name:"Claude Opus 4.8",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-7[1m]",name:"Claude Opus 4.7",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-opus-4-6[1m]",name:"Claude Opus 4.6",contextWindowTokens:1e6,tier:"flagship"},{id:"claude-sonnet-4-6[1m]",name:"Claude Sonnet 4.6",contextWindowTokens:1e6,tier:"balanced"},{id:"claude-haiku-5-5",name:"Claude Haiku 5.5",contextWindowTokens:1e6,tier:"speed"},{id:"claude-haiku-4-5",name:"Claude Haiku 4.5",contextWindowTokens:2e5,tier:"speed"}],modes:[{id:"default",name:"Default",description:"Uses Claude's default permission handling with normal approval prompts."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without approval; other permission checks remain in place."},{id:"plan",name:"Plan",description:"Keeps Claude in plan mode so it can inspect and propose changes without applying them."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permissions; only pre-approved tool actions can proceed."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Claude permission checks so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"claude-fable-5-1":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-fable-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-5-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"medium"},"claude-opus-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-sonnet-5-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-sonnet-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-8[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-7[1m]":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"claude-opus-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-sonnet-4-6[1m]":{effort:["low","medium","high","max"],defaultEffort:"high"},"claude-haiku-5-5":{effort:["low","medium","high","xhigh","max"],defaultEffort:"medium"},"claude-haiku-4-5":{effort:[]}},providerOptions:[]},codex:{models:[{id:"gpt-6-astra",name:"GPT-6 Astra",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-6.1-sol",name:"GPT-6.1 Sol",contextWindowTokens:105e4,tier:"balanced",recommended:true},{id:"gpt-6.1-terra",name:"GPT-6.1 Terra",contextWindowTokens:5e5,tier:"balanced"},{id:"gpt-6-sol",name:"GPT-6 Sol",contextWindowTokens:105e4,tier:"balanced"},{id:"gpt-6-luna",name:"GPT-6 Luna",contextWindowTokens:105e4,tier:"speed",recommended:true},{id:"gpt-5.6-sol",name:"GPT-5.6 Sol",contextWindowTokens:105e4,tier:"flagship"},{id:"gpt-5.6-terra",name:"GPT-5.6 Terra",contextWindowTokens:105e4,tier:"balanced"},{id:"gpt-5.6-luna",name:"GPT-5.6 Luna",contextWindowTokens:105e4,tier:"speed"}],modes:[{id:"agent",name:"Agent",description:"Uses the workspace-write sandbox; can read and modify workspace files without full machine access."},{id:"read-only",name:"Read Only",description:"Uses the read-only sandbox; can inspect files but cannot write to the workspace."},{id:"plan",name:"Plan",description:"Uses the read-only sandbox for planning and inspection; cannot write to the workspace."},{id:"agent-full-access",name:"Agent Full Access",description:"Bypasses approvals and the sandbox; can access and modify files beyond the workspace."},{id:"yolo",name:"YOLO",description:"Bypasses approvals and the sandbox for unrestricted execution and full filesystem access."}],effort:["minimal","low","medium","high"],modelOverrides:{"gpt-6-astra":{effort:["low","medium","high","xhigh","max"],defaultEffort:"xhigh"},"gpt-6.1-sol":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-6.1-terra":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"max"},"gpt-6-sol":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"max"},"gpt-6-luna":{effort:["none","low","medium","high","xhigh","max"],defaultEffort:"medium"},"gpt-5.6-sol":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"xhigh"},"gpt-5.6-terra":{effort:["low","medium","high","xhigh","max","ultra"],defaultEffort:"high"},"gpt-5.6-luna":{effort:["low","medium","high","xhigh","max"],defaultEffort:"high"},"gpt-5.5":{effort:["low","medium","high","xhigh"],defaultEffort:"high"}},providerOptions:[]},opencode:{models:[],modes:[{id:"plan",name:"Plan",description:"Uses the plan agent without --auto; planning follows standard approval behavior."},{id:"plan-auto",name:"Plan \xB7 Auto",description:"Uses the plan agent with --auto; planning uses automatic approvals."},{id:"build",name:"Build",description:"Uses the build agent without --auto; work follows standard approval behavior."},{id:"build-auto",name:"Build \xB7 Auto",description:"Uses the build agent with --auto; work uses automatic approvals."}],effort:[],modelOverrides:{},providerOptions:[]},copilot:{models:[{id:"auto",name:"Auto"},{id:"claude-sonnet-5",name:"Claude Sonnet 5",contextWindowTokens:1e6,tier:"balanced"}],modes:[{id:"interactive",name:"Interactive",description:"Passes --mode interactive; tool access follows Copilot's interactive mode behavior."},{id:"plan",name:"Plan",description:"Passes --mode plan; planning and permission behavior follow Copilot's plan mode."},{id:"autopilot",name:"Autopilot",description:"Passes --mode autopilot; execution behavior follows Copilot's autonomous mode."}],effort:["none","low","medium","high","xhigh","max"],modelOverrides:{},providerOptions:[]},antigravity:{models:[{id:"gemini-3.8-flash",name:"Gemini 3.8 Flash",tier:"balanced"},{id:"gemini-3.7-flash",name:"Gemini 3.7 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.6-flash",name:"Gemini 3.6 Flash",contextWindowTokens:1048576,tier:"balanced"},{id:"gemini-3.1-pro",name:"Gemini 3.1 Pro",contextWindowTokens:1048576,tier:"flagship"},{id:"claude-sonnet-5-5-medium",name:"Claude Sonnet 5.5",tier:"balanced"},{id:"claude-opus-5-5-medium",name:"Claude Opus 5.5",tier:"flagship"},{id:"gemini-4-argon",name:"Gemini 4 Argon",tier:"flagship"}],modes:[{id:"default",name:"Default",description:"Uses Antigravity's default permission handling. No extra permission flags are passed."},{id:"plan",name:"Plan",description:"Passes --mode plan. This turns on /plan; it is not a Claude-style permission mode."},{id:"acceptEdits",name:"Accept Edits",description:"Passes --mode accept-edits."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Passes --dangerously-skip-permissions so tools can run without approval prompts."}],effort:["low","medium","high"],modelOverrides:{"gemini-3.8-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.7-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.6-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.5-flash":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-3.1-pro":{effort:["low","high"],defaultEffort:"high"},"claude-sonnet-5-5-medium":{effort:["low","medium","high"],defaultEffort:"medium"},"claude-opus-5-5-medium":{effort:["low","medium","high"],defaultEffort:"medium"},"gemini-4-argon":{effort:["low","medium","high"],defaultEffort:"high"},"claude-sonnet-4-6":{effort:[]},"claude-opus-4-6-thinking":{effort:[]},"gpt-oss-120b":{effort:["medium"],defaultEffort:"medium"}},providerOptions:[]},grok:{models:[{id:"grok-4.7",name:"Grok 4.7",contextWindowTokens:5e5,tier:"flagship",recommended:true},{id:"grok-4.6",name:"Grok 4.6",contextWindowTokens:5e5,tier:"flagship"},{id:"grok-4.5",name:"Grok 4.5",contextWindowTokens:5e5,tier:"flagship"}],modes:[{id:"default",name:"Default",description:"Uses Grok's default permission handling."},{id:"acceptEdits",name:"Accept Edits",description:"Allows file edits without changing the selected sandbox profile."},{id:"auto",name:"Auto",description:"Uses Grok automatic permission handling."},{id:"dontAsk",name:"Don't Ask",description:"Does not ask for permission before tool execution."},{id:"bypassPermissions",name:"Bypass Permissions",description:"Bypasses Grok permission checks for tool execution."},{id:"plan",name:"Plan",description:"Keeps Grok in planning mode without applying changes."}],effort:["low","medium","high"],modelOverrides:{"grok-4.7":{effort:["low","medium","high","xhigh"],defaultEffort:"high"},"grok-4.6":{effort:["low","medium","high","xhigh"],defaultEffort:"high"},"grok-4.5":{effort:["low","medium","high"],defaultEffort:"high"}},providerOptions:[{key:"alwaysApprove",type:"boolean"},{key:"sandbox",type:"enum",values:["workspace","read-only","off"]}]}},Object.fromEntries(Object.entries(lo).map(([t,e])=>[t,e.models]));});function po(t){return Sf[t]??t}function Af(t){return If.get(t)??t}function fo(t){if(!t)return {};let e=Nf.get(t);return e?{...e}:{model:t}}function go(t,e){return t==="antigravity"||t==="cli/antigravity"?fo(e):e===void 0?{}:{model:Af(e)}}var Rf,Sf,If,Of,Nf,zn=v(()=>{_();Rf=[{baseModelId:"claude-opus-4-8",catalogModelId:"claude-opus-4-8[1m]"},{baseModelId:"claude-opus-4-7",catalogModelId:"claude-opus-4-7[1m]"},{baseModelId:"claude-opus-4-6",catalogModelId:"claude-opus-4-6[1m]"},{baseModelId:"claude-sonnet-4-6",catalogModelId:"claude-sonnet-4-6[1m]"}],Sf={"accept-edits":"acceptEdits",yolo:"bypassPermissions","agent-full-access":"bypassPermissions"};If=new Map(Rf.map(({baseModelId:t,catalogModelId:e})=>[t,e]));Of=[{legacyId:"Gemini 3.7 Flash (High)",model:"gemini-3.7-flash",effort:"high"},{legacyId:"Gemini 3.7 Flash (Medium)",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"Gemini 3.7 Flash (Low)",model:"gemini-3.7-flash",effort:"low"},{legacyId:"Gemini 3.6 Flash (High)",model:"gemini-3.6-flash",effort:"high"},{legacyId:"Gemini 3.6 Flash (Medium)",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"Gemini 3.6 Flash (Low)",model:"gemini-3.6-flash",effort:"low"},{legacyId:"Gemini 3.5 Flash (Medium)",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"Gemini 3.5 Flash (High)",model:"gemini-3.5-flash",effort:"high"},{legacyId:"Gemini 3.5 Flash (Low)",model:"gemini-3.5-flash",effort:"low"},{legacyId:"Gemini 3.1 Pro (Low)",model:"gemini-3.1-pro",effort:"low"},{legacyId:"Gemini 3.1 Pro (High)",model:"gemini-3.1-pro",effort:"high"},{legacyId:"Claude Sonnet 4.6 (Thinking)",model:"claude-sonnet-4-6"},{legacyId:"Claude Opus 4.6 (Thinking)",model:"claude-opus-4-6-thinking"},{legacyId:"GPT-OSS 120B (Medium)",model:"gpt-oss-120b",effort:"medium"},{legacyId:"gemini-3.7-flash-high",model:"gemini-3.7-flash",effort:"high"},{legacyId:"gemini-3.7-flash-medium",model:"gemini-3.7-flash",effort:"medium"},{legacyId:"gemini-3.7-flash-low",model:"gemini-3.7-flash",effort:"low"},{legacyId:"gemini-3.6-flash-high",model:"gemini-3.6-flash",effort:"high"},{legacyId:"gemini-3.6-flash-medium",model:"gemini-3.6-flash",effort:"medium"},{legacyId:"gemini-3.6-flash-low",model:"gemini-3.6-flash",effort:"low"},{legacyId:"gemini-3.5-flash-high",model:"gemini-3.5-flash",effort:"high"},{legacyId:"gemini-3.5-flash-medium",model:"gemini-3.5-flash",effort:"medium"},{legacyId:"gemini-3.5-flash-low",model:"gemini-3.5-flash",effort:"low"},{legacyId:"gemini-3.1-pro-high",model:"gemini-3.1-pro",effort:"high"},{legacyId:"gemini-3.1-pro-low",model:"gemini-3.1-pro",effort:"low"},{legacyId:"gpt-oss-120b-medium",model:"gpt-oss-120b",effort:"medium"}],Nf=new Map(Of.map(({legacyId:t,model:e,effort:n})=>[t,n===void 0?{model:e}:{model:e,effort:n}]));});function vf(){return {models:[],modes:[],effort:[],modelOverrides:{},providerOptions:[]}}function It(t){return zr(t).models}function zr(t){return bf[t]??lo[t]??vf()}function Kn(t,e){let n=zr(t);if(e){if(Object.prototype.hasOwnProperty.call(n.modelOverrides,e))return n.modelOverrides[e]?.effort??n.effort;let r=go(t,e);return r.model===void 0?n.effort:n.modelOverrides[r.model]?.effort??n.effort}return n.effort}function Ad(t){return zr(t).modelOverrides}function Od(){return It("claude")}function Nd(){return It("codex")}function bd(){return It("copilot")}function vd(){return It("antigravity")}var bf,jt=v(()=>{_();jr();Mr();zn();bf={};});function xd(t){return xf[t]??t}var xf,Cd=v(()=>{_();jt();zn();xf={auto:"default"};});function Kr(t,e){return (Gr[t]??[]).includes(e)}function At(t){if(!t)return {};let e=t.match(/^(.+?)\[([^\]]+)\]$/);if(e){let n=e[2].toLowerCase();return Cf.has(n)?{model:e[1],effort:n}:{model:t}}return {model:t}}function Dd(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["--sandbox","read-only"];case "agent":return ["-c","sandbox_mode=workspace-write"];default:return []}}function Pd(t){switch(t){case "agent-full-access":case "yolo":return ["--dangerously-bypass-approvals-and-sandbox"];case "read-only":case "plan":return ["-c","sandbox_mode=read-only"];case "agent":return ["-c","sandbox_mode=workspace-write"];default:return []}}function Ld(t){return !t||!Kr("codex",t)?[]:["-c",`model_reasoning_effort=${t}`]}function Md(t){if(!t)return [];let e=new Set(["acceptEdits","bypassPermissions","default","delegate","dontAsk","plan"]),n=xd(t);return e.has(n)?["--permission-mode",n]:[]}function $d(t){return t?Kr("claude",t)?["--effort",t]:[]:[]}function Hd(t){return t==="default"?[]:t&&Df.has(t)?["--permission-mode",t]:[]}function Ud(t){return t===true?["--always-approve"]:[]}function Fd(t,e=n=>console.warn(n)){return t===void 0?[]:t==="workspace"||t==="read-only"||t==="off"?["--sandbox",t]:(e(`[grok] Invalid sandbox value ${JSON.stringify(t)}; using workspace.`),["--sandbox","workspace"])}function qd(t){return t?Kr("grok",t)?["--effort",t]:[]:[]}function Bd(t){if(!t)return [];switch(po(t)){case "default":return [];case "plan":return ["--mode","plan"];case "acceptEdits":return ["--mode","accept-edits"];case "bypassPermissions":return ["--dangerously-skip-permissions"];default:return []}}function Wd(t){return t?Kr("antigravity",t)?["--effort",t]:[]:[]}var Cf,Df,Jn=v(()=>{_();Cd();zn();jr();Cf=new Set(Id);Df=new Set(["default","acceptEdits","auto","dontAsk","bypassPermissions","plan"]);});function Pf(t){if(t.type!=="usage"||!("input_tokens"in t))return null;let e=Number(t.input_tokens??0),n=Number(t.output_tokens??0),s="cache_read_input_tokens"in t?Number(t.cache_read_input_tokens):void 0,o="cached_input_tokens"in t?Number(t.cached_input_tokens):void 0,i=s!==void 0?s:o??0;return {inputTokens:s!==void 0?e+s:e,outputTokens:n,cachedInputTokens:i}}function Lf(t){let e=t.usage;if(!e||typeof e!="object"||Array.isArray(e))return null;let n=e;if(!("input_tokens"in n))return null;let r=Number(n.input_tokens??0),s=Number(n.output_tokens??0),i="cache_read_input_tokens"in n?Number(n.cache_read_input_tokens):void 0,u="cached_input_tokens"in n?Number(n.cached_input_tokens):void 0,d=i!==void 0?i:u??0;return {inputTokens:i!==void 0?r+i:r,outputTokens:s,cachedInputTokens:d}}function Mf(t){if(t.type!=="step_finish")return null;let n=t.part?.tokens;if(!n)return null;let r=Number(n.input??0),s=Number(n.output??0),o=n.cache,i=o?Number(o.read??0):0;return {inputTokens:r+i,outputTokens:s,cachedInputTokens:i}}function Gd(t){let e=new Map,n;for(let o of t.split(`
41
+ `))if(o.trim())try{let i=JSON.parse(o);if(i.type!=="assistant")continue;let u=i.message,d=u?.id,c=u?.usage;if(typeof d!="string"||!c)continue;let l=Number(c.input_tokens??0),p=Number(c.cache_read_input_tokens??0);e.set(d,{inputTokens:l+p,cachedInputTokens:p});let g=u?.model;typeof g=="string"&&g&&(n=g);}catch{}if(e.size===0)return;let r=0,s=0;for(let o of e.values())r+=o.inputTokens,s+=o.cachedInputTokens;return {inputTokens:r,cachedInputTokens:s,model:n}}function fn(t){if(!t||!t.trim())return;let e=null,n=null;for(let r of t.split(`
42
+ `))if(r.trim())try{let s=JSON.parse(r),o=Mf(s);if(o){n||(n={inputTokens:0,outputTokens:0,cachedInputTokens:0}),n.inputTokens+=o.inputTokens,n.outputTokens+=o.outputTokens,n.cachedInputTokens+=o.cachedInputTokens;continue}let i=Pf(s)??Lf(s);i&&(e=i);}catch{}return n||(e??void 0)}var Vn=v(()=>{_();});function ze(t,e){if(typeof t!="object"||t===null||Array.isArray(t))return e;let n=t.timestamp;return typeof n!="string"||!Number.isFinite(Date.parse(n))?e:new Date(n).toISOString()}var zt=v(()=>{_();});var Jr,jd=v(()=>{_();Jr=Object.freeze({CLAUDE_CODE_DISABLE_AUTO_MEMORY:"1"});});function zd(t){let e=t.split(`
43
+ `).filter(s=>s.trim()),n=[],r=null;for(let s of e)try{let o=JSON.parse(s);if(o.type==="assistant"&&Array.isArray(o.message?.content))for(let i of o.message.content)i.type==="text"&&typeof i.text=="string"&&i.text.trim()&&n.push(i.text.trim());o.type==="result"&&typeof o.result=="string"&&(r=o.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function Kd(t){let e=t.split(`
44
+ `).filter(n=>n.trim());for(let n of e.reverse())try{let r=JSON.parse(n);if(typeof r=="object"&&r!==null&&r.type==="result")return r}catch{}}function gn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)?t:void 0}function Qd(t){let e=gn(t.rate_limit_info);if(t.type==="rate_limit_event"&&e?.status==="rejected")return `Claude rate limit: ${typeof e.rateLimitType=="string"?e.rateLimitType:"unknown"} (status: rejected)`;if(t.error==="rate_limit"){let n=Bf(t);return n?`Claude rate limit: ${n}`:"Claude rate limit"}if(t.type==="result"&&t.is_error===true){let n=typeof t.result=="string"?t.result:"";if(Wf(n))return `Claude rate limit: ${n}`}}function Uf(t){for(let e of t.split(`
45
+ `)){let n=e.trim();if(n){if(n.startsWith("Not logged in"))return n;try{let r=gn(JSON.parse(n));if(r?.type==="result"&&r.is_error===!0&&typeof r.result=="string"&&r.result.startsWith("Not logged in"))return r.result}catch{}}}}function Ff(t){let e=gn(t);if(e?.type!=="rate_limit_event")return;let n=gn(gn(e.rate_limit_info)?.unifiedWindows);if(!n)return;let r=Jd(n.five_hour),s=Jd(n.seven_day);if(!(!r&&!s))return {...r?{five_hour:r}:{},...s?{seven_day:s}:{}}}function Jd(t){let e=gn(t);if(!(typeof e?.utilization!="number"||typeof e.resetsAt!="number"))return {utilization:e.utilization,resetsAt:e.resetsAt}}function Vd(t){if(t?.is_error===true)return Br(t.result)}function qf(t){let e=Qd(t);if(e)return e;if(t.type!=="result"||t.is_error!==true)return;let n=typeof t.result=="string"?t.result:"";if(n.trim())return n;let r=typeof t.subtype=="string"?t.subtype:"unknown",s=typeof t.terminal_reason=="string"?t.terminal_reason:"unknown";return `Claude ended without an answer (subtype=${r}, terminal_reason=${s})`}function Bf(t){let n=t.message?.content;return Array.isArray(n)?n.map(r=>typeof r.text=="string"?r.text.trim():"").filter(Boolean).join(`
7
46
 
8
- `;writeFileSync(s,o,{encoding:"utf8",mode:384});}catch{}}),t.on("task:output",e=>{try{let n=this.logFiles.get(e.traceId);if(!n)return;let s=new Date().toISOString();appendFileSync(n,`[${s}] STDOUT: ${e.output}
9
- `,"utf8");}catch{}}),t.on("task:end",e=>{try{let n=this.logFiles.get(e.traceId);if(!n)return;let s=new Date().toLocaleString(),o=e.error?`failed: ${e.error.message}`:"completed successfully",i=`[${s}] INFO: Task ${o} in ${e.durationMs}ms
10
- [${s}] INFO: Process closed with exit code: ${e.error?1:0}
11
- `;appendFileSync(n,i,"utf8"),this.logFiles.delete(e.traceId);}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[],this.logFiles.clear();}};function Gt(d){let t=I.resolve(d);return process.platform==="win32"&&(t=t.replace(/\\/g,"/"),t=t.replace(/^([A-Z]):/,(e,n)=>`${n.toLowerCase()}:`)),t.length>1&&!/^[a-zA-Z]:\/$/.test(t)&&(t=t.replace(/\/+$/,"")),t}function xt(d){let t=Gt(d);return createHash("sha256").update(t).digest("hex")}var Y=class{resolveDbPath(){return process.env.CREWX_DB?process.env.CREWX_DB:process.env.CREWX_TRACES_DB?process.env.CREWX_TRACES_DB:join(Jt.homedir(),".crewx","crewx.db")}resolveDbPaths(){return [this.resolveDbPath()]}isMissingTableError(t){return t instanceof Error&&/no such table:/i.test(t.message)}dbExists(t){return existsSync(t??this.resolveDbPath())}};function R(d){let t=et("better-sqlite3"),{drizzle:e}=et("drizzle-orm/better-sqlite3"),n=new t(d);return n.exec("PRAGMA journal_mode = WAL"),n.exec("PRAGMA busy_timeout = 5000"),n.exec("PRAGMA foreign_keys = ON"),n.exec("PRAGMA analysis_limit = 400"),n.exec("PRAGMA optimize"),{db:e(n),runRaw:(s,o=[])=>n.prepare(s).run(...o),close:()=>n.close()}}var Ct=new Set,Vt={agent_id:"TEXT",status:"TEXT DEFAULT 'running'",started_at:"TEXT",trace_id:"TEXT",parent_task_id:"TEXT",crewx_version:"TEXT",pid:"INTEGER",thread_id:"TEXT",workspace_id:"TEXT",workspace_ref:"TEXT",workspace_name:"TEXT",project_id:"TEXT",project_name:"TEXT"};function _t(d,t){return (d.get(`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='${t}'`)?.cnt??0)>0}function Qt(d,t){if(t>0||!_t(d,"tasks"))return;let e=d.all("PRAGMA table_info(tasks)"),n=new Set(e.map(s=>s.name));for(let[s,o]of Object.entries(Vt))n.has(s)||d.run(`ALTER TABLE tasks ADD COLUMN ${s} ${o}`);}var Zt={"0002_normalize_task_names":{workspace_name:"TEXT",project_name:"TEXT"}};function te(d,t,e){if(!_t(d,"__drizzle_migrations")||!_t(d,"tasks"))return;let n=d.all(e`SELECT hash FROM __drizzle_migrations`),s=new Set(n.map(i=>i.hash)),o=JSON.parse(readFileSync(I__default.join(t,"meta/_journal.json"),"utf-8"));for(let i of o.entries){let a=Zt[i.tag];if(!a)continue;let c=I__default.join(t,`${i.tag}.sql`);if(!existsSync(c))continue;let l=readFileSync(c,"utf-8"),u=createHash("sha256").update(l).digest("hex");if(s.has(u))continue;let f=d.all("PRAGMA table_info(tasks)"),m=new Set(f.map(T=>T.name));for(let[T,X]of Object.entries(a))m.has(T)||(d.run(`ALTER TABLE tasks ADD COLUMN ${T} ${X}`),m.add(T));}}function ee(d,t,e){let n=d.all(e`SELECT hash FROM __drizzle_migrations`),s=new Set(n.map(i=>i.hash)),o=JSON.parse(readFileSync(I__default.join(t,"meta/_journal.json"),"utf-8"));for(let i of o.entries){let a=I__default.join(t,`${i.tag}.sql`);if(!existsSync(a))continue;let c=readFileSync(a,"utf-8"),l=createHash("sha256").update(c).digest("hex");if(s.has(l))continue;let u=/ALTER\s+TABLE\s+[`"]?(\w+)[`"]?\s+ADD\s+[`"]?(\w+)[`"]?/gi,f=[],m;for(;(m=u.exec(c))!==null;)f.push({table:m[1],column:m[2]});if(f.length===0||!c.split(/-->\s*statement-breakpoint/).map(U=>U.trim()).filter(Boolean).every(U=>/^ALTER\s+TABLE\s+.+\s+ADD\s+/i.test(U)))continue;f.every(({table:U,column:O})=>d.all(`PRAGMA table_info("${U}")`).some(L=>L.name===O))&&d.run(e`INSERT INTO __drizzle_migrations (hash, created_at) VALUES (${l}, ${i.when})`);}}function ne(d){let{migrate:t}=et("drizzle-orm/better-sqlite3/migrator"),{sql:e}=et("drizzle-orm"),n=[I__default.join(k,"../migrations"),I__default.join(k,"migrations"),I__default.join(k,"../../../../drizzle/migrations"),I__default.join(process.cwd(),"drizzle/migrations")],s=n.find(l=>existsSync(I__default.join(l,"meta/_journal.json")));if(!s)throw new Error(`migrations folder not found. Searched:
12
- ${n.join(`
13
- `)}`);let o=d.get(e`SELECT count(*) as cnt FROM sqlite_master WHERE type='table' AND name='__drizzle_migrations'`),i=0;o?.cnt&&(i=d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0),Qt(d,i),o?.cnt&&(ee(d,s,e),te(d,s,e)),t(d,{migrationsFolder:s});let c=(d.get(e`SELECT count(*) as cnt FROM __drizzle_migrations`)?.cnt??0)-i;if(c>0){let l=o?.cnt?"Database migrated":"Database initialized";console.error(`[crewx] ${l} (${c} migration${c>1?"s":""} applied).`);}}function st(d,t){Ct.has(t)||(ne(d),Ct.add(t));}var _=class extends Error{code;cause;constructor(t,e,n){super(e),this.name="RepositoryError",this.code=t,this.cause=n,Object.setPrototypeOf(this,new.target.prototype);}};var J=sqliteTable("workspaces",{id:text("id").primaryKey(),slug:text("slug").notNull().unique(),name:text("name").notNull(),workspace_path:text("workspace_path"),description:text("description"),is_active:integer("is_active").notNull().default(1),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull()});var r=sqliteTable("tasks",{id:text("id").primaryKey(),agent_id:text("agent_id").notNull(),user_id:text("user_id"),prompt:text("prompt").notNull(),mode:text("mode").notNull().default("execute"),status:text("status").notNull().default("running"),result:text("result"),error:text("error"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),metadata:text("metadata"),workspace_id:text("workspace_id"),trace_id:text("trace_id"),parent_task_id:text("parent_task_id"),caller_agent_id:text("caller_agent_id"),model:text("model"),platform:text("platform").default("cli"),crewx_version:text("crewx_version"),input_tokens:integer("input_tokens").default(0),output_tokens:integer("output_tokens").default(0),cost_usd:real("cost_usd").default(0),pid:integer("pid"),rendered_prompt:text("rendered_prompt"),command:text("command"),coding_agent_command:text("coding_agent_command"),exit_code:integer("exit_code"),logs:text("logs"),thread_id:text("thread_id"),workspace_ref:text("workspace_ref"),project_id:text("project_id"),project_ref:text("project_ref"),cached_input_tokens:integer("cached_input_tokens").default(0),run_epoch:integer("run_epoch").default(0)},d=>({idx_tasks_agent_id:index("idx_tasks_agent_id").on(d.agent_id),idx_tasks_status:index("idx_tasks_status").on(d.status),idx_tasks_started_at:index("idx_tasks_started_at").on(d.started_at),idx_tasks_trace_id:index("idx_tasks_trace_id").on(d.trace_id),idx_tasks_parent_task_id:index("idx_tasks_parent_task_id").on(d.parent_task_id),idx_tasks_crewx_version:index("idx_tasks_crewx_version").on(d.crewx_version),idx_tasks_pid:index("idx_tasks_pid").on(d.pid),idx_tasks_thread_id:index("idx_tasks_thread_id").on(d.thread_id),idx_tasks_workspace_id:index("idx_tasks_workspace_id").on(d.workspace_id),idx_tasks_workspace_ref:index("idx_tasks_workspace_ref").on(d.workspace_ref),idx_tasks_project_id:index("idx_tasks_project_id").on(d.project_id),idx_tasks_ws_started:index("idx_tasks_ws_started").on(d.workspace_id,d.started_at)}));var p=sqliteTable("threads",{id:text("id").primaryKey(),workspace_id:text("workspace_id").references(()=>J.id,{onDelete:"set null"}),platform:text("platform").notNull().default("cli"),title:text("title"),first_message:text("first_message"),last_message:text("last_message"),message_count:integer("message_count").notNull().default(0),created_at:text("created_at").notNull(),updated_at:text("updated_at").notNull(),metadata:text("metadata"),title_locked:integer("title_locked").notNull().default(0),pinned:integer("pinned").notNull().default(0),starred:integer("starred").notNull().default(0)},d=>({idx_threads_updated_at:index("idx_threads_updated_at").on(d.updated_at),idx_threads_workspace_id:index("idx_threads_workspace_id").on(d.workspace_id),idx_threads_ws_updated:index("idx_threads_ws_updated").on(d.workspace_id,d.updated_at)}));var ce=sqliteTable("spans",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>r.id,{onDelete:"set null"}),parent_span_id:text("parent_span_id").references(()=>ce.id,{onDelete:"set null"}),name:text("name").notNull(),kind:text("kind").notNull().default("internal"),status:text("status").notNull().default("ok"),started_at:text("started_at").notNull(),completed_at:text("completed_at"),duration_ms:integer("duration_ms"),input:text("input"),output:text("output"),error:text("error"),attributes:text("attributes")},d=>({idx_spans_task_id:index("idx_spans_task_id").on(d.task_id),idx_spans_parent_span_id:index("idx_spans_parent_span_id").on(d.parent_span_id)}));sqliteTable("tool_calls",{id:text("id").primaryKey(),task_id:text("task_id").references(()=>r.id,{onDelete:"cascade"}),session_id:text("session_id"),tool_name:text("tool_name").notNull(),files:text("files"),input:text("input"),output:text("output"),duration_ms:integer("duration_ms"),timestamp:text("timestamp").notNull()},d=>({idx_tool_calls_task_id:index("idx_tool_calls_task_id").on(d.task_id),idx_tool_calls_tool_name:index("idx_tool_calls_tool_name").on(d.tool_name),idx_tool_calls_timestamp:index("idx_tool_calls_timestamp").on(d.timestamp)}));sqliteTable("thread_boxes",{id:text("id").primaryKey(),thread_id:text("thread_id").notNull().references(()=>p.id,{onDelete:"cascade"}),seq:integer("seq").notNull(),first_task_id:text("first_task_id").notNull(),mid_task_id:text("mid_task_id").notNull(),last_task_id:text("last_task_id").notNull(),task_count:integer("task_count").notNull(),summary:text("summary"),source_tokens:integer("source_tokens").notNull(),summary_tokens:integer("summary_tokens"),created_at:text("created_at").notNull()},d=>({idx_thread_boxes_thread_id:index("idx_thread_boxes_thread_id").on(d.thread_id),idx_thread_boxes_seq:index("idx_thread_boxes_seq").on(d.thread_id,d.seq),uniq_thread_boxes_thread_seq:unique().on(d.thread_id,d.seq)}));sqliteTable("request_logs",{id:text("id").primaryKey(),path:text("path").notNull(),method:text("method").notNull(),status_code:integer("status_code").notNull(),duration_ms:integer("duration_ms").notNull(),ip:text("ip"),request_headers:text("request_headers"),response_headers:text("response_headers"),request_body:text("request_body"),response_body:text("response_body"),query:text("query"),user_id:text("user_id"),project_id:text("project_id"),partition_key:text("partition_key").notNull(),timestamp:text("timestamp").notNull().default(sql`(datetime('now'))`),metadata:text("metadata")},d=>({idx_request_logs_timestamp:index("idx_request_logs_timestamp").on(d.timestamp),idx_request_logs_path:index("idx_request_logs_path").on(d.path),idx_request_logs_status_code:index("idx_request_logs_status_code").on(d.status_code),idx_request_logs_partition_key:index("idx_request_logs_partition_key").on(d.partition_key)}));sqliteTable("usage_limit_snapshots",{id:text("id").primaryKey(),provider:text("provider").notNull(),account_ref:text("account_ref").notNull().default("default"),limit_window:text("limit_window").notNull(),bucket_start:text("bucket_start").notNull(),captured_at:text("captured_at").notNull(),used_percent:integer("used_percent").notNull(),remaining_percent:integer("remaining_percent").notNull(),resets_at:text("resets_at"),source:text("source").notNull(),metadata:text("metadata")},d=>({uniq_usage_limit_snapshots_bucket:uniqueIndex("uniq_usage_limit_snapshots_bucket").on(d.provider,d.account_ref,d.limit_window,d.bucket_start),idx_usage_limit_snapshots_window_bucket:index("idx_usage_limit_snapshots_window_bucket").on(d.limit_window,d.bucket_start),idx_usage_limit_snapshots_provider_window_bucket:index("idx_usage_limit_snapshots_provider_window_bucket").on(d.provider,d.limit_window,d.bucket_start)}));sqliteTable("usage_reports",{id:text("id").primaryKey(),workspace_id:text("workspace_id").notNull(),month:text("month").notNull(),generated_at:text("generated_at").notNull(),source_range:text("source_range").notNull(),tier:text("tier").notNull(),total_tokens:integer("total_tokens").notNull(),total_cost_usd:real("total_cost_usd").notNull(),payload:text("payload").notNull(),payload_hash:text("payload_hash"),signature:text("signature"),signed_at:text("signed_at"),issuer:text("issuer")},d=>({uniq_usage_reports_ws_month:uniqueIndex("uniq_usage_reports_ws_month").on(d.workspace_id,d.month)}));function It(d){let t=d.toLowerCase().trim();t=t.replace(/\[[^\]]*\]$/g,"");let e=t.lastIndexOf("/");return e>=0&&(t=t.slice(e+1)),t=t.replace(/-\d{8}$/,""),t}var B="2026-05-09",Oe="0.8.9-rc.13",z=10,q=parseInt(Oe.split("rc.")[1]),Ne=new Set(["workflow","mcp"]),De=600*1e3,lt=class extends Y{dbPath;pidNullObservedSince=new Map;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let s=dirname(e);existsSync(s)||mkdirSync(s,{recursive:true});}else if(!existsSync(e))throw new _("NOT_FOUND","Database not found");let n=R(e);if(t)try{st(n.db,e);}catch(s){throw n.close(),s}return n}startTask(t){let e=this.openHandle(true);try{e.db.insert(r).values({id:t.id,agent_id:t.agentId,prompt:t.prompt,mode:t.mode,status:t.status,started_at:t.startedAt,pid:t.pid??null,parent_task_id:t.parentTaskId??null,caller_agent_id:t.callerAgentId??null,trace_id:t.traceId??null,command:t.command??null,metadata:t.metadata??null,workspace_id:t.workspaceId??null,platform:t.platform??"cli",crewx_version:t.crewxVersion??null,thread_id:t.threadId??null,model:t.model??null,rendered_prompt:t.renderedPrompt??null,coding_agent_command:t.codingAgentCommand??null}).onConflictDoUpdate({target:r.id,set:{pid:sql`COALESCE(excluded.pid, ${r.pid})`},setWhere:eq(r.status,"running")}).run();}catch(n){throw n instanceof _?n:new _("DB_ERROR","Failed to start task",n)}finally{e.close();}}finishTask(t){let e=this.openHandle(true);try{let n=t.runEpoch??null;e.runRaw(`UPDATE tasks SET status=?, result=?, error=?, completed_at=?, duration_ms=?,
14
- exit_code=?, input_tokens=?, output_tokens=?, cached_input_tokens=?, cost_usd=?,
15
- model=COALESCE(?, model)
16
- WHERE id=? AND status='running' AND COALESCE(run_epoch, 0) = COALESCE(?, 0)`,[t.status,t.result??null,t.error??null,t.completedAt,t.durationMs??null,t.exitCode??null,t.inputTokens??0,t.outputTokens??0,t.cachedInputTokens??0,t.costUsd??0,t.model??null,t.id,n]);}catch(n){throw n instanceof _?n:new _("DB_ERROR","Failed to finish task",n)}finally{e.close();}}appendLog(t,e){let n=this.openHandle(true);try{n.db.transaction(s=>{let o=s.select({logs:r.logs}).from(r).where(eq(r.id,t)).limit(1).get(),i=o?.logs?JSON.parse(o.logs):[];i.push(e),s.update(r).set({logs:JSON.stringify(i)}).where(eq(r.id,t)).run();},{behavior:"immediate"});}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to append log",s)}finally{n.close();}}getRunningTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(r).where(eq(r.status,"running")).orderBy(desc(r.started_at)).all()}catch(e){throw new _("DB_ERROR","Failed to get running tasks",e)}finally{t.close();}}getAllTasks(){if(!this.dbExists())return [];let t=this.openHandle(false);try{return t.db.select().from(r).orderBy(desc(r.started_at)).limit(100).all()}catch(e){throw new _("DB_ERROR","Failed to get all tasks",e)}finally{t.close();}}getTask(t){if(!this.dbExists())return;let e=this.openHandle(false);try{return e.db.select().from(r).where(eq(r.id,t)).limit(1).get()??void 0}catch(n){throw new _("DB_ERROR","Failed to get task",n)}finally{e.close();}}killTask(t){if(!this.dbExists())return {killed:false};let e=this.openHandle(true);try{let n=e.db.select({id:r.id,status:r.status,pid:r.pid}).from(r).where(eq(r.id,t)).limit(1).get();if(!n||n.status!=="running")return {killed:!1};if(n.pid)try{process.kill(n.pid,"SIGTERM");}catch{}return e.db.update(r).set({status:"failed",error:"Killed by user",completed_at:new Date().toISOString()}).where(and(eq(r.id,t),eq(r.status,"running"))).run(),{killed:!0,pid:n.pid??void 0}}catch(n){throw n instanceof _?n:new _("DB_ERROR","Failed to kill task",n)}finally{e.close();}}reapOrphanedTasks(){if(!this.dbExists())return 0;let t=this.openHandle(true);try{let e=t.db.select({id:r.id,pid:r.pid,platform:r.platform,run_epoch:r.run_epoch}).from(r).where(eq(r.status,"running")).all(),n=Date.now(),s=new Set,o=0;for(let i of e){if(i.pid){let l=!1;try{process.kill(i.pid,0),l=!0;}catch{}l||(t.db.update(r).set({status:"failed",error:"Reaped: process not found (orphaned task)",completed_at:new Date().toISOString()}).where(and(eq(r.id,i.id),eq(r.status,"running"))).run(),o++);continue}if(Ne.has(i.platform??"cli"))continue;let a=`${i.id}:${i.run_epoch??0}`;s.add(a);let c=this.pidNullObservedSince.get(a);if(c===void 0){this.pidNullObservedSince.set(a,n);continue}n-c>=De&&(t.db.update(r).set({status:"failed",error:"Reaped: pid never recorded after resume (stale running_instruction)",completed_at:new Date().toISOString()}).where(and(eq(r.id,i.id),eq(r.status,"running"))).run(),o++,this.pidNullObservedSince.delete(a));}for(let i of Array.from(this.pidNullObservedSince.keys()))s.has(i)||this.pidNullObservedSince.delete(i);return o}finally{t.close();}}findTaskStatus(t,e){let n=this.resolveDbPaths();for(let s of n){if(!existsSync(s))continue;let o=R(s);try{let i=e?eq(r.workspace_id,e):void 0,a=i?and(eq(r.id,t),i):eq(r.id,t),c=o.db.select().from(r).where(a).limit(1).get()??void 0;if(!c){let l=or(eq(r.thread_id,t),and(isNull(r.thread_id),like(r.command,`%--thread=${t}%`))),u=i?and(l,i):l;c=o.db.select().from(r).where(u).orderBy(desc(r.started_at)).limit(1).get()??void 0;}if(c)return c}catch(i){throw new _("DB_ERROR","Failed to find task status",i)}finally{o.close();}}}findChildTasks(t,e){let n=this.resolveDbPaths(),s=new Set,o=[];for(let i of n){if(!existsSync(i))continue;let a=R(i);try{let c=e?and(eq(r.parent_task_id,t),eq(r.workspace_id,e)):eq(r.parent_task_id,t),l=a.db.select().from(r).where(c).orderBy(asc(r.started_at)).all();for(let u of l)s.has(u.id)||(s.add(u.id),o.push(u));}catch(c){throw new _("DB_ERROR","Failed to find child tasks",c)}finally{a.close();}}return o}getWorkspaceUsageSummary(t){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.all(t?sql`
47
+ `):""}function Wf(t){let e=t.toLowerCase();return e.includes("out of extra usage")||e.includes("rate limit")||e.includes("quota")}function Yd(t){return t.replace(/\s+/g," ").trim()}function Gf(t,e){let n=t?.description;if(typeof n!="string")return;let r=Yd(n);if(!r||r===Yd(e))return;if(r.length<=Xd)return r;let s=r.slice(0,Xd-1);return /[\uD800-\uDBFF]$/.test(s)&&(s=s.slice(0,-1)),`${s}\u2026`}function jf(t,e){let n=e.type;if(n==="text"){let r=String(e.text||"");return r?{timestamp:t,type:"text",content:r}:null}if(n==="thinking"){let r=typeof e.thinking=="string"?e.thinking.trim():"";return r?{timestamp:t,type:"thinking",content:r}:null}if(n==="tool_use"){let r=String(e.name||""),s=e.id,o=e.input,i=je(o);if(r==="Bash"&&dt(i))return ut(t,i,s);let u=Gf(o,i);return {timestamp:t,type:"tool_use",toolUseId:s,toolName:r,toolInput:i,...u?{toolTitle:u}:{}}}if(n==="tool_result"){let r=!!e.is_error,s=e.tool_use_id,o=e.output??e.content??"",i;return typeof o=="string"?i=o:Array.isArray(o)?i=o.filter(u=>u.type==="text"&&typeof u.text=="string").map(u=>u.text).join(`
48
+ `):i=JSON.stringify(o),{timestamp:t,type:"tool_result",toolUseId:s,...Ge(i,r)}}return null}var $f,Hf,Vr,Xd,_o=v(()=>{_();ro();Wt();so();un();cn();ln();pn();Jn();jt();Vn();zt();jd();$f=new Set(["tool_progress"]),Hf="cli/claude";Vr={command:"claude",meta:{displayName:"Claude",models:Od(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:s}=At(e.model),o=e.effort??s,i=Md(e.mode),u=$d(o),d=r?["--model",r]:[],c=e.resumeSessionId?["--resume",e.resumeSessionId]:[];if(e.additionalArgs!==void 0){let p=[...e.additionalArgs];return p.indexOf("-p")!==-1?{args:["--output-format","stream-json","--verbose",...c,...i,...u,...d,...p],stdinMessage:t,env:Jr}:{args:["--output-format","stream-json","--verbose",...c,...i,...u,...d,...p],stdinMessage:t,env:Jr}}return {args:["-p","--output-format","stream-json","--verbose",...c,...i,...u,...d],stdinMessage:t,env:Jr}},extractText(t){let e=Kd(t);if(e?.is_error===true){let s=Vr.extractFailure(JSON.stringify(e));if(s)throw s;let o=typeof e.subtype=="string"?e.subtype:"unknown",i=typeof e.terminal_reason=="string"?e.terminal_reason:"unknown";throw new V(Vd(e)??`Claude ended without an answer (subtype=${o}, terminal_reason=${i})`,Hf,{code:"EMPTY_OUTPUT",kind:"permanent"})}let n=zd(t);if(n)return n;let r=t.trim();return at(r,"claude")?"":r},extractPartialText(t){return zd(t)},extractFailure(t){try{let e=JSON.parse(t),n=Qd(e);if(n)return new Gt(n)}catch{}return null},interpretExit(t,e,n){let r=Uf(n??"");if(r)return new V(`Claude is not logged in (exit ${t}): ${r}. Sign in to this account with the official "claude auth login".`,"cli/claude",{code:"AUTH_REQUIRED",kind:"config"});let s=Vd(Kd(n??""));return s?new V(s,"cli/claude"):null},observeRateLimit(t){try{let e=JSON.parse(t);return Ff(e)}catch{return}},parseResultMeta(t){let e=t.split(`
49
+ `);for(let r of e)if(r.trim())try{let s=JSON.parse(r);if(s.type==="result"){let o=s.usage,i=o?{inputTokens:Number(o.input_tokens??0)+Number(o.cache_read_input_tokens??0),outputTokens:Number(o.output_tokens??0),cachedInputTokens:Number(o.cache_read_input_tokens??0),costUsd:Number(s.total_cost_usd??0)}:null,u=s.modelUsage,d=u?Object.keys(u)[0]??null:null;return {usage:i,model:d}}}catch{}let n=Gd(t);return n?{usage:{inputTokens:n.inputTokens,outputTokens:0,cachedInputTokens:n.cachedInputTokens,costUsd:0},model:n.model??null}:{usage:null,model:null}},parseEvent(t,e){let n;try{n=JSON.parse(t);}catch{return []}let r=n.type;if(!r)return [];let s=ze(n,e??new Date().toISOString()),o=qf(n);if(o)return [{timestamp:s,type:"error",content:o,errorMessage:o}];let i=n.output_file,u=n.summary;if(r==="system"&&n.subtype==="task_notification"&&n.status==="completed"&&typeof i=="string"&&i.trim().length>0&&typeof u=="string"&&u.trim().length>0)return [{timestamp:s,type:"text",content:u}];if(r!=="assistant"&&r!=="user")return [];let c=n.message?.content;if(!Array.isArray(c))return [];let l=[];for(let p of c){let g=jf(s,p);g&&l.push(g);}return l},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?$f.has(r):!1}catch{return false}}};Xd=200;});function Zd(t){let e=t.split(`
50
+ `).filter(s=>s.trim()),n=[],r=null;for(let s of e)try{let o=JSON.parse(s);if(o.type==="assistant.message"&&typeof o.data?.content=="string"){let i=o.data.content;i.trim()&&n.push(i.trim());}o.type==="result"&&typeof o.result=="string"&&(r=o.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}var zf,ho,mo=v(()=>{_();un();Vn();cn();pn();ln();jt();jr();zt();zf=new Set(["interactive","plan","autopilot"]);ho={command:"copilot",meta:{displayName:"Copilot",models:bd()},buildArgs(t,e,n){let r=e.additionalArgs?[...e.additionalArgs]:[];return e.model&&r.push("--model",e.model),e.mode&&zf.has(e.mode)&&r.push("--mode",e.mode),e.effort&&(Gr.copilot??[]).includes(e.effort)&&r.push("--effort",e.effort),{args:r,stdinMessage:t}},extractText(t){let e=Zd(t);if(e)return e;let n=t.trim();return at(n,"copilot")?"":n},extractPartialText(t){return Zd(t)},parseResultMeta(t){let e=fn(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n;try{n=JSON.parse(t);}catch{return []}let r=n.type;if(!r)return [];if(!r.startsWith("tool.execution")&&!r.startsWith("assistant.")&&r!=="user.message")return [];let s=n.data;if(!s)return [];let o=ze(n,e??new Date().toISOString()),i=s.toolCallId;if(r==="tool.execution_start"){let u=String(s.toolName||""),d=s.arguments,c=je(d);return (u==="bash"||u==="Bash")&&dt(c)?[ut(o,c,i)]:[{timestamp:o,type:"tool_use",toolName:u,toolInput:c,...i&&{toolUseId:i}}]}if(r==="tool.execution_complete"){let u=s.error;if(u)return [{timestamp:o,type:"tool_result",...i&&{toolUseId:i},...Ge(String(u.message||""),true)}];let d=s.result,c=String(d?.content||"");return [{timestamp:o,type:"tool_result",...i&&{toolUseId:i},...Ge(c,false)}]}if(r==="assistant.message"){let u=String(s.content||"");return u?[{timestamp:o,type:"text",content:u}]:[]}return []}};});function Vf(t){let e=[],n=0,r=false,s=false,o=0;for(let u=0;u<t.length;u++){let d=t[u];if(s){s=false;continue}if(d==="\\"&&r){s=true;continue}if(d==='"'){r=!r;continue}if(!r){if(d==="{")n++;else if(d==="}"&&(n--,n===0)){let c=t.slice(o,u+1).trim();c&&e.push(c),o=u+1;}}}let i=t.slice(o).trim();return i&&e.push(i),e}function Xf(t){return t[0]==="exec"?t.slice(1):t}function eu(t){let e=t.split(`
51
+ `).map(s=>s.trim()).filter(Boolean),n=[],r=null;for(let s of e)try{let o=JSON.parse(s);if(o.type==="item.completed"&&(o.item?.type==="message"||o.item?.type==="agent_message")&&typeof o.item?.text=="string"){let i=o.item.text;i.trim()&&n.push(i.trim());}o.type==="result"&&typeof o.result=="string"&&(r=o.result);}catch{}if(n.length>0)return n[n.length-1];if(r)return r}function Ot(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function nu(t){return t.type==="turn.failed"?true:t.type!=="error"?false:typeof t.message=="string"||typeof t.errorMessage=="string"||typeof t.error=="string"||Ot(t.error)}function ru(t){let e=Ot(t.error)?t.error:void 0,n=[t.message,t.errorMessage,e?.message,e?.detail,typeof t.error=="string"?t.error:void 0];for(let r of n)if(typeof r=="string"&&r.trim())return r;return t.type==="turn.failed"?"Codex turn failed.":"Codex CLI reported an error."}function Yf(t){for(let e of t.split(/\r?\n/)){if(!e.trim())continue;let n;try{n=JSON.parse(e);}catch{continue}if(Ot(n)&&nu(n))return ru(n)}}function tu(t,e,n,r){if(!n||t.type!=="command_execution"&&t.type!=="mcp_tool_call"||typeof t.id!="string"||!t.id.trim()||t.type==="mcp_tool_call"&&e==="item.started"&&(typeof t.server!="string"||typeof t.tool!="string"))return;let s=n.state.get("codex.pending");s||(s=new Map,n.state.set("codex.pending",s));let o=JSON.stringify([t.type,t.id]);if(e==="item.started"){let d=`codex:${JSON.stringify(t.id)}#${n.rowIndex}:${r}`,c=s.get(o)??[];return c.push(d),s.set(o,c),d}let i=s.get(o),u=i?.pop();return i?.length||s.delete(o),u}function Qf(t,e,n){let r=e.type;if(r==="command_execution"){let s=String(e.command||"");return dt(s)?[ut(t,s,n)]:[{timestamp:t,type:"tool_use",toolName:"Bash",toolInput:s,...n?{toolUseId:n}:{}}]}return r==="mcp_tool_call"?typeof e.server!="string"||typeof e.tool!="string"?[]:[{timestamp:t,type:"tool_use",toolName:`${e.server}/${e.tool}`,toolInput:je(e.arguments),...n?{toolUseId:n}:{}}]:[]}function Zf(t,e,n){let r=e.type;if(r==="message"||r==="text"){let s=e.content;if(Array.isArray(s))for(let o of s){let i=eg(t,o);if(i)return i}if(typeof e.text=="string")return {timestamp:t,type:"text",content:e.text}}if(r==="agent_message"&&typeof e.text=="string")return {timestamp:t,type:"text",content:e.text};if(r==="reasoning"){let s=typeof e.text=="string"?e.text.trim():"";return s?{timestamp:t,type:"thinking",content:s}:null}if(r==="command_execution"){let s=String(e.aggregated_output||e.output||""),o=!!e.is_error;return {timestamp:t,type:"tool_result",...Ge(s,o),...n?{toolUseId:n}:{}}}if(r==="mcp_tool_call"){let s=Ot(e.result)?e.result:void 0,i=(Array.isArray(s?.content)?s.content:[]).filter(d=>Ot(d)&&d.type==="text"&&typeof d.text=="string").map(d=>d.text).join(`
52
+ `),u=typeof e.error=="string"?e.error:Ot(e.error)&&typeof e.error.message=="string"?e.error.message:"";return {timestamp:t,type:"tool_result",resultPreview:i||u,isError:e.status==="failed"||e.status==="error"||e.is_error===true||e.error!=null,...n?{toolUseId:n}:{}}}if(r==="tool_use"){let s=String(e.name||e.tool_name||""),o=e.input,i=je(o);return s==="Bash"&&dt(i)?ut(t,i):{timestamp:t,type:"tool_use",toolName:s,toolInput:i}}if(r==="tool_result"){let s=!!e.is_error,o=String(e.output||e.content||"");return {timestamp:t,type:"tool_result",...Ge(o,s)}}if(r==="web_search"){let s=e.action,o;if(s?.type==="search"){let i=s.queries;o=String(s.query||"")||(i?.length?i.join(", "):"")||String(e.query||"");}else o=e.query?"open: "+String(e.query):"";return !o&&!(Ot(s)&&s.type==="other"&&e.query==="")?null:{timestamp:t,type:"tool_use",toolName:"WebSearch",toolInput:o}}if(r==="file_change"){let s=e.changes;if(!Array.isArray(s)||s.length===0)return null;let o=s.map(u=>String(u.path||"")).filter(Boolean);if(o.length===0)return null;let i=o.length===1?o[0]:`${o.slice(0,2).join(", ")}${o.length>2?` (+${o.length-2})`:""}`;return {timestamp:t,type:"tool_use",toolName:"Edit",toolInput:i}}return null}function eg(t,e){let n=e.type;if(n==="text")return {timestamp:t,type:"text",content:String(e.text||"")};if(n==="tool_use"){let r=String(e.name||""),s=e.input,o=je(s);return r==="Bash"&&dt(o)?ut(t,o):{timestamp:t,type:"tool_use",toolName:r,toolInput:o}}return null}var Kf,Jf,ko,To=v(()=>{_();Wt();un();Vn();cn();pn();ao();ln();Jn();jt();zt();Kf=new Set(["turn.started","turn.completed","item.updated"]),Jf="cli/codex";ko={command:"codex",meta:{displayName:"Codex",models:Nd(),capabilities:{resume:true}},buildArgs(t,e,n){let{model:r,effort:s}=At(e.model),o=e.effort??s,i=e.resumeSessionId?Pd(e.mode):Dd(e.mode),u=Ld(o),d=r?["-m",r]:[],c=Xf(e.additionalArgs??[]),p=c.includes("--json")||c.includes("--experimental-json")?[]:["--json"];return e.resumeSessionId?{args:["exec","resume",...p,...i,...u,...d,...c,e.resumeSessionId,"-"],stdinMessage:t}:{args:["exec",...p,...i,...u,...d,...c],stdinMessage:t}},extractText(t){let e=Yf(t);if(e)throw new V(e,Jf);let n=eu(t);if(n)return n;let r=t.trim();return at(r,"codex")?"":r},extractPartialText(t){return eu(t)},parseResultMeta(t){let e=fn(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e,n){let r=e??new Date().toISOString(),s=[],o;try{JSON.parse(t),o=[t];}catch{o=Vf(t),o.length>1&&console.warn("[codex] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let[i,u]of o.entries()){let d;try{d=JSON.parse(u);}catch{continue}if(!Ot(d))continue;let c=d.type;if(!c)continue;let l=ze(d,r);if(nu(d)){let g=ru(d);s.push({timestamp:l,type:"error",content:g,errorMessage:g});continue}if(!c.startsWith("item.")&&!c.startsWith("turn.")&&!c.startsWith("thread.")||io(d))continue;c==="thread.started"&&n&&n.state.delete("codex.pending");let p=d.item;if(p){if(c==="item.started"){s.push(...Qf(l,p,tu(p,c,n,i)));continue}if(c==="item.completed"){let g=Zf(l,p,tu(p,c,n,i));g&&s.push(g);continue}}}return s},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?Kf.has(r):!1}catch{return false}}};});function rg(t){return t?ng[t]??{agent:"build",autoApprove:false}:{agent:void 0,autoApprove:false}}function Xr(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function du(t){let e=[],n=0,r=false,s=false,o=0;for(let u=0;u<t.length;u++){let d=t[u];if(s){s=false;continue}if(d==="\\"&&r){s=true;continue}if(d==='"'){r=!r;continue}if(!r){if(d==="{")n++;else if(d==="}"&&(n--,n===0)){let c=t.slice(o,u+1).trim();c&&e.push(c),o=u+1;}}}let i=t.slice(o).trim();return i&&e.push(i),e}function hn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function sg(t){let e=[],n=false;for(let r of t.split(/\r?\n/)){let s=r.trim();if(!s)continue;try{let i=JSON.parse(s);hn(i)?e.push(i):n=!0;continue}catch{}let o=du(s);o.length>1&&console.warn("[opencode] extractText: falling back to concatenated-JSON split for a malformed line");for(let i of o)try{let u=JSON.parse(i);hn(u)?e.push(u):n=!0;}catch{n=true;}}return {events:e,malformed:n}}function Kt(t){if(typeof t!="string")return;let e=t.split(/\r?\n/).map(n=>n.trim()).find(n=>n&&!/^at\s+/.test(n));if(e)return e.replace(/\u001b\[[0-?]*[ -/]*[@-~]/g,"").replace(/(?:[A-Za-z]:[\\/]|\/)(?:[^\s"'`()\[\]{}]+[\\/])*[^\s"'`()\[\]{}]+/g,"[path]").slice(0,au).trim()}function uu(t){let e=hn(t.error)?t.error:void 0,n=e&&hn(e.data)?e.data:void 0,r=Kt(e?.name),s=Kt(n?.message)??Kt(e?.message)??Kt(t.message)??Kt(t.errorMessage)??Kt(t.error),o=Kt(t.ref),i=r&&s&&r!==s?`${r}: ${s}`:r??s??iu;return (o?`${i} (ref: ${o})`:i).slice(0,au)}function su(t){let e=sg(t),n=[],r=null,s=0,o=[],i,u=false;for(let d of e.events){let c=typeof d.type=="string"?d.type:void 0;if(c){if(c==="text"){let l=hn(d.part)?d.part:void 0,p=typeof l?.text=="string"?l.text:void 0;p?.trim()&&n.push(p.trim());continue}if(c==="result"){typeof d.result=="string"&&(r=d.result);continue}if(c==="tool_use"){s++;continue}if(c==="error"){o.push(uu(d));continue}if(c==="step_finish"){u=true;let l=hn(d.part)?d.part:void 0;i=typeof l?.reason=="string"?l.reason:void 0;}}}return {...e,texts:n,resultText:r,toolUseCount:s,errorMessages:o,terminalReason:i,hasTerminal:u}}function cu(t){return (t??"unknown").trim().toLowerCase().replace(/_/g,"-")}function Yr(){return new V("OpenCode returned no assistant output.",_n,{code:"EMPTY_OUTPUT",kind:"transient"})}function og(){return new V("OpenCode emitted malformed JSON output.",_n,{code:"PROVIDER_CRASHED",kind:"transient"})}function ou(t,e){switch(cu(t)){case "length":return new V("OpenCode stopped because the context window was exceeded.",_n,{code:"UNKNOWN",kind:"permanent"});case "content-filter":return new V("OpenCode stopped because the content filter blocked the response.",_n,{code:"UNKNOWN",kind:"permanent"});case "error":return new V(e?`OpenCode error: ${e}`:`${iu} while generating a response.`,_n,{code:"PROVIDER_CRASHED",kind:"transient"});default:return null}}var tg,_n,iu,au,ng,yo,wo=v(()=>{_();Wt();Vn();pn();zt();tg=new Set(["step_start","step_finish"]),_n="cli/opencode",iu="OpenCode provider error",au=240,ng={build:{agent:"build",autoApprove:false},"build-auto":{agent:"build",autoApprove:true},plan:{agent:"plan",autoApprove:false},"plan-auto":{agent:"plan",autoApprove:true}};yo={command:"opencode",meta:{displayName:"OpenCode",capabilities:{resume:true}},buildArgs(t,e,n){let r=e.additionalArgs,s=r!==void 0?[...r]:["run"];Xr(s,"--format")||s.push("--format","json"),e.resumeSessionId&&!s.includes("-s")&&!s.includes("--session")&&s.push("-s",e.resumeSessionId);let{agent:o,autoApprove:i}=rg(e.mode);Xr(s,"--agent")||o!==void 0&&s.push("--agent",o),i&&!Xr(s,"--auto")&&s.push("--auto"),e.effort!==void 0&&!Xr(s,"--variant")&&s.push("--variant",e.effort),e.model&&s.push("--model",e.model);let u;return !n&&!i&&!e.env?.OPENCODE_PERMISSION&&(u={OPENCODE_PERMISSION:JSON.stringify({external_directory:"allow"})}),{args:s,stdinMessage:t,env:u}},extractText(t){let e=su(t),n=e.errorMessages[0];if(n){let i=ou("error",n);if(i)throw i}let r=ou(e.terminalReason??"",void 0);if(r)throw r;let s=e.texts.length>0?e.texts[e.texts.length-1]:void 0;if(s!==void 0){if(!e.hasTerminal)throw Yr();return s}if(e.resultText?.trim()){if(!e.hasTerminal)throw Yr();return e.resultText}if(e.malformed)throw og();if(!e.hasTerminal)throw Yr();let o=cu(e.terminalReason);if((o==="stop"||o==="tool-calls")&&e.toolUseCount>0)return "";throw Yr()},interpretExit(t,e,n=""){if(t===0)return null;let s=su(n).errorMessages[0];return s?new V(`OpenCode error: ${s}`,_n,{code:"PROVIDER_CRASHED",kind:"transient"}):null},parseResultMeta(t){let e=fn(t);return e?{usage:{inputTokens:e.inputTokens,outputTokens:e.outputTokens,cachedInputTokens:e.cachedInputTokens,costUsd:0},model:null}:{usage:null,model:null}},parseEvent(t,e){let n=e??new Date().toISOString(),r=[],s;try{JSON.parse(t),s=[t];}catch{s=du(t),s.length>1&&console.warn("[opencode] parseEvent: falling back to concatenated-JSON split for a malformed line");}for(let o of s){let i;try{i=JSON.parse(o);}catch{continue}let u=ze(i,n),d=i.type;if(d){if(d==="text"){let l=i.part?.text;l&&r.push({timestamp:u,type:"text",content:l});continue}if(d==="tool_use"){let c=i.part;if(!c)continue;let l=String(c.tool||""),p=String(c.callID||""),g=c.state,h=String(g?.status||""),m=g?.input,E=je(m);if(r.push({timestamp:u,type:"tool_use",toolName:l,toolUseId:p,toolInput:E}),h==="completed"&&g?.output!==void 0){let S=g.output,D=typeof S=="string"?S:JSON.stringify(S);r.push({timestamp:u,type:"tool_result",toolUseId:p,resultPreview:D,isError:false});}else h==="error"&&r.push({timestamp:u,type:"tool_result",toolUseId:p,resultPreview:String(g?.error||"tool error"),isError:true});continue}if(d==="error"){let c=uu(i);r.push({timestamp:u,type:"error",content:c,errorMessage:c});continue}}}return r},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let r=JSON.parse(e).type;return r?tg.has(r):!1}catch{return false}}};});var lu=v(()=>{_();});function Qr(t,e){return t.some(n=>n===e||n.startsWith(`${e}=`))}function cg(t,e){let n=[];for(let r=0;r<t.length;r+=1){let s=t[r],o=[...e].find(i=>s===i||s.startsWith(`${i}=`));o?s===o&&r+1<t.length&&(r+=1):n.push(s);}return n}function lg(t){let e=[];for(let n=0;n<t.length;n+=1){let r=t[n],s=r.indexOf("="),o=s>0?r.slice(0,s):r;if(!dg.has(o)){e.push(r);continue}r===o&&n+1<t.length&&!t[n+1].startsWith("-")&&(n+=1);}return e}function $e(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function pg(t,e){if(!(t?ag.has(t)||It(Eo).some(o=>o.id===t):false)||!t)return e;let r=Kn(Eo,t),s=Ad(Eo)[t]?.defaultEffort;if(r.length!==0)return e?r.includes(e)?e:s&&r.includes(s)?s:void 0:s}function ft(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>=0?t:void 0}function Io(t){return t.kind==="step_update"?typeof t.step.conversation_id=="string"?t.step.conversation_id:void 0:typeof t.envelope.conversation_id=="string"?t.envelope.conversation_id:void 0}function Ao(t){return t.step.step_index}function ee(t){if(typeof t!="string")return;let e=t.split(/\r?\n/,1)[0]?.trim();return e&&Br(e)?.slice(0,500).trim()||void 0}function fg(t,e){let n=(t??"").trim().toUpperCase().replace(/[^A-Z0-9]+/g,"_");if(n!=="UNKNOWN"&&ug.has(n))return n;let r=`${n} ${e??""}`.toLowerCase();return /quota|resource_exhausted|usage[ _-]?limit|credits?.{0,20}exhaust/.test(r)?"QUOTA_EXHAUSTED":/rate[ _-]?limit|throttl/.test(r)?"RATE_LIMITED":/auth|sign[ _-]?in|log(?:ged)?[ _-]?in|unauthori[sz]ed|credential/.test(r)?"AUTH_REQUIRED":[/unknown (?:flag|option)/,/flag provided but not defined/,/unrecognized (?:flag|option)/,/invalid (?:value for )?(?:flag|option|argument)/].some(o=>o.test(r))?"INVALID_PROVIDER_FORMAT":/invalid.{0,24}model|model.{0,24}(unknown|unavailable|not found|not recognized)|config/.test(r)?"MODEL_UNAVAILABLE":"UNKNOWN"}function gg(t){return t==="AUTH_REQUIRED"||t==="TIMEOUT_IDLE"||t==="TIMEOUT_TOTAL"||t==="TIMEOUT_RESUME"||t==="PROVIDER_CRASHED"?"permanent":t==="MODEL_UNAVAILABLE"||t==="INVALID_PROVIDER_FORMAT"||t==="PROVIDER_NOT_FOUND"?"config":"transient"}function gu(t){let e=$e(t)?t:void 0,n=e&&$e(e.error)?e.error:void 0,r=e?ee(e.code)??ee(e.error_code)??ee(n?.code)??ee(n?.error_code):void 0,s=typeof t=="string"?ee(t):e?ee(e.message)??ee(e.error)??ee(e.reason)??ee(n?.message)??ee(n?.error)??ee(n?.reason):void 0,o=fg(r,s),i=e?ft(e.retry_after_ms)??ft(e.retryAfterMs)??ft(n?.retry_after_ms)??ft(n?.retryAfterMs):void 0;return {code:o,kind:gg(o),message:s??"Antigravity reported a terminal error.",...i===void 0?{}:{retryAfterMs:i}}}function es(t){let e=gu(t);return new V(e.message,"cli/antigravity",{code:e.code,kind:e.kind,...e.retryAfterMs===void 0?{}:{retryAfterMs:e.retryAfterMs}})}function Oo(t){return new V(t,"cli/antigravity",{code:"INVALID_PROVIDER_FORMAT",kind:"config"})}function _g(t){let e=new TextEncoder().encode(t).byteLength;if(!(e<=So))throw new V(`Input is too large: final provider initial input is ${e} UTF-8 bytes; budget is ${So} bytes.`,"cli/antigravity",{code:"UNKNOWN",kind:"config"})}function Ro(){return new V("Antigravity CLI returned empty output with exit code 0. agy may have hidden an auth/quota/model error in its log file; inspect ~/.gemini/antigravity-cli/log for details.","cli/antigravity",{code:"EMPTY_OUTPUT",kind:"transient"})}function ts(t){if(t.kind==="result"||t.kind==="legacy_result")return t.result}function ns(t){for(let e=t.length-1;e>=0;e-=1){let n=t[e];if(n&&(n.kind==="result"||n.kind==="legacy_result"||n.kind==="agy_error"))return {event:n,index:e}}}function hg(t){let e=ns(t);if(!e||e.event.kind==="agy_error"||e.index!==t.length-1||ts(e.event)?.status!=="SUCCESS"||Zr(t))return false;let r=new Map;for(let s of t){if(s.kind!=="step_update"||s.step.step_type!=="agent_response")continue;let o=Io(s),i=Ao(s);!o||!Number.isSafeInteger(i)||r.set(JSON.stringify([o,i]),s.step);}if(r.size===0)return false;for(let s of r.values())if(s.state!=="DONE"||!$e(s.usage)||ft(s.usage.input_tokens)===void 0||ft(s.usage.output_tokens)===void 0)return false;return true}function mg(t,e){for(let n=e-1;n>=0;n-=1){let r=t[n];if(r?.kind==="agy_error")return r.error}}function kg(t,e){return $e(t)&&$e(e)?{...e,...t}:$e(t)&&typeof e=="string"?{...t,message:e}:typeof t=="string"&&$e(e)?{...e,message:t}:t??e}function Tg(t){let e=Array.isArray(t.denied_actions)?t.denied_actions:[],n=[];for(let o of e){let i=$e(o)?o:void 0,u=typeof o=="string"?ee(o):ee(i?.display_name)??ee(i?.action);u&&!n.includes(u)&&n.length<5&&n.push(u.slice(0,80));}let r=Math.max(0,e.length-n.length),s=n.length>0?` (${n.join(", ")}${r>0?`, +${r} more`:""})`:"";return new V(`Permission denied: Antigravity blocked ${e.length} requested action${e.length===1?"":"s"}${s}.`,"cli/antigravity",{code:"UNKNOWN",kind:"permanent"})}function Zr(t){let e=ns(t);if(!e)return;if(e.event.kind==="agy_error")return es(e.event.error);let n=ts(e.event);if(!n)return;if(Array.isArray(n.denied_actions)&&n.denied_actions.length>0)return Tg(n);if(n.status==="SUCCESS")return;if(n.status!=="ERROR")return Oo("Antigravity returned a result with an unsupported status.");let r=n.error,s=kg(r==null||r===""?n:r,mg(t,e.index));return es(s)}function _u(t){if(typeof t=="string")return t;if(t!=null)try{return JSON.stringify(t)}catch{return}}function yg(t){return `agy:${String(t.conversation_id)}:${String(t.step_index)}`}function wg(t,e){let n=typeof e?.name=="string"?e.name:t.tool_name;return typeof n=="string"&&n.trim()?n:void 0}function hu(t){let e=_u(t);if(e)return e.length<=2e3?e:`${e.slice(0,1999)}\u2026`}function Eg(t){let e=$e(t)?t:void 0,n=e&&$e(e.error)?e.error:void 0,r=typeof t=="string"?t.trim().match(/^([A-Z][A-Z0-9_]*)(?:[:\s]|$)/)?.[1]:void 0,s=(ee(e?.type)??ee(e?.code)??ee(e?.error_type)??ee(n?.type)??ee(n?.code)??ee(n?.error_type)??ee(r)??"TOOL_ERROR").slice(0,60),o=gu(t).message.slice(0,250);return hu({type:s,message:o})??"Antigravity reported a tool error."}function pu(t,e){return t?t.state.has(e)?true:(t.state.set(e,true),false):false}function fu(t,e){return {timestamp:t,type:"error",content:e.message,errorMessage:e.message,isError:true}}var Eo,ag,dg,So,ug,No,bo=v(()=>{_();Wt();lu();so();zn();jt();Jn();co();Eo="antigravity",ag=new Set(["claude-sonnet-4-6","claude-opus-4-6-thinking","gpt-oss-120b"]),dg=new Set(["--conversation","--resume","--continue"]),So=18e4,ug=new Set(["QUOTA_EXHAUSTED","RATE_LIMITED","EMPTY_OUTPUT","AUTH_REQUIRED","MODEL_UNAVAILABLE","TIMEOUT_IDLE","TIMEOUT_TOTAL","TIMEOUT_RESUME","PROVIDER_NOT_FOUND","INVALID_PROVIDER_FORMAT","PROVIDER_CRASHED","UNKNOWN"]);No={command:"agy",maxInitialInputBytes:So,meta:{displayName:"Antigravity",models:vd(),defaultIdleMs:6e5,capabilities:{resume:true,usageCompleteness:true}},extractSessionId(t){let e=Gn(t);if(e?.kind!=="init")return null;let n=e.envelope.conversation_id;return typeof n=="string"&&n.trim().length>0?n.trim():null},buildArgs(t,e,n){_g(t);let{model:r,effort:s}=At(e.model),o=fo(r),i=o.model,u=e.effort??s??o.effort,d=pg(i,u),c=e.additionalArgs??[],l=lg(cg(c,new Set(["--input-format","--output-format"]))),p=i&&!Qr(c,"--model")?["--model",i]:[],g=Qr(c,"--effort")?[]:Wd(d),h=Qr(c,"--mode")||Qr(c,"--dangerously-skip-permissions")?[]:Bd(e.mode),m=typeof e.resumeSessionId=="string"&&e.resumeSessionId.trim().length>0?["--conversation",e.resumeSessionId]:[];return {args:["--input-format","stream-json","--output-format","stream-json",...p,...g,...h,...m,...l],stdinMessage:`${JSON.stringify({event:"user",message:{content:t}})}
53
+ `,env:{AGY_CLI_DISABLE_AUTO_UPDATE:"true"}}},extractText(t){let e=jn(t),n=ns(e)?.event,r=Zr(e);if(r)throw r;let s=n?ts(n):void 0;if(s){if(s.status!=="SUCCESS")throw Oo("Antigravity returned a result with an unsupported status.");if(typeof s.response!="string")throw Oo("Antigravity returned a successful result without a response string.");if(!s.response.trim())throw Ro();return s.response}if(e.length>0)throw Ro();let o=t.trim();if(!o)throw Ro();return o},extractPartialText(t){let e=jn(t),n=ns(e)?.event;if(!n||n.kind==="agy_error")return;let r=ts(n);return r&&typeof r.response=="string"&&r.response.trim()?r.response:void 0},interpretExit(t,e,n){let r=jn(n??""),s=Zr(r);return s||(t!==0&&e.trim()?es(e):null)},parseResultMeta(t){let e=jn(t),n=0,r=0,s=0,o=0,i=new Set;for(let d of e){if(d.kind!=="step_update"||d.step.state!=="DONE"||!$e(d.step.usage))continue;let c=Io(d),l=Ao(d);if(!c||!Number.isSafeInteger(l))continue;let p=JSON.stringify([c,l]);if(i.has(p))continue;let g=d.step.usage,h=ft(g.input_tokens),m=ft(g.output_tokens);h===void 0||m===void 0||(i.add(p),n+=h,r+=m,s+=ft(g.cache_read_tokens)??0,o+=1);}return {usage:o===0?null:{inputTokens:n,outputTokens:r,cachedInputTokens:s,costUsd:0,complete:hg(e)},model:null}},parseEvent(t,e,n){let r=Gn(t);if(!r)return [];let s=e??new Date().toISOString();if(r.kind==="agy_error")return [fu(s,es(r.error))];if(r.kind==="legacy_result"||r.kind==="result"){let h=Zr([r]);return h?[fu(s,h)]:[]}if(r.kind!=="step_update")return [];let{step:o}=r,i=Io(r)??"unknown",u=Ao(r),d=`${i}:${u}`;if((o.state==="DONE"||o.state==="ERROR")&&pu(n,`antigravity:terminal:${d}`))return [];if(o.step_type==="agent_response")return typeof o.text_delta=="string"&&o.text_delta.length>0?[{timestamp:s,type:"text",content:o.text_delta}]:[];if(o.step_type!=="tool")return [];let c=$e(o.tool_info)?o.tool_info:void 0,l=wg(o,c);if(!l)return [];let p=yg(o);if(o.state==="ACTIVE"){if(pu(n,`antigravity:active:${d}`))return [];let h=_u(c?.parameters);return [{timestamp:s,type:"tool_use",toolName:l,toolUseId:p,...h===void 0?{}:{toolInput:h}}]}let g=o.state==="ERROR"?Eg(c?.error):hu(c?.output);return [{timestamp:s,type:"tool_result",toolName:l,toolUseId:p,...g===void 0?{}:{resultPreview:g},...o.state==="ERROR"?{isError:true}:{}}]}};});var mu=v(()=>{_();cn();pn();ln();zt();});function mn(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function kn(t){return mn(t)?t:void 0}function Ie(t){return typeof t=="string"?t:void 0}function Vt(t){let e=typeof t=="number"?t:Number(t??0);return Number.isFinite(e)?e:0}function Og(t){let e=[],n=-1,r=0,s=false,o=false;for(let i=0;i<t.length;i+=1){let u=t[i];if(n===-1){(u==="{"||u==="[")&&(n=i,r=1);continue}if(o){o=false;continue}if(u==="\\"&&s){o=true;continue}if(u==='"'){s=!s;continue}s||(u==="{"||u==="["?r+=1:(u==="}"||u==="]")&&(r-=1,r===0&&(e.push(t.slice(n,i+1)),n=-1)));}return n!==-1&&e.push(t.slice(n)),e}function Xn(t){let e=t.trim();if(!e)return [];try{let n=JSON.parse(e);return mn(n)?[n]:[]}catch{return Og(e).flatMap(n=>{try{let r=JSON.parse(n);return mn(r)?[r]:[]}catch{return []}})}}function Eu(t){let e=JSON.stringify(t);return e===void 0?String(t):e}function Jt(t){if(typeof t=="string")return t;if(Array.isArray(t)){let e=t.map(Jt).filter(n=>n!==void 0);return e.length>0?e.join(`
54
+ `):void 0}if(mn(t)){if(typeof t.text=="string")return t.text;if(typeof t.message=="string")return t.message;if(typeof t.error=="string")return t.error;if(t.type==="text"&&typeof t.data=="string")return t.data;for(let e of ["content","FileContent","rawOutput"]){let n=Jt(t[e]);if(n!==void 0)return n}}}function Ng(t){let e=i=>Array.isArray(i)&&i.every(u=>Number.isInteger(u)&&u>=0&&u<=255),n=i=>typeof i=="string"&&i.trim().length>0?i:void 0,r=i=>new TextDecoder("utf-8",{fatal:false}).decode(Uint8Array.from(i)),s=i=>{let u=JSON.stringify(i,(d,c)=>e(c)?`<bytes:${c.length}>`:c);return u===void 0?String(i):u},o=t.rawOutput;if(o!=null){let i=kn(o);if(!i)return n(Jt(o))??s(o);let u;if(e(i.output)&&i.output.length>0&&(u=n(r(i.output))),!u&&e(i.stdout)&&i.stdout.length>0&&(u=n(r(i.stdout))),!u){let l=kn(i.Result);u=n(i.output)??n(l?.output)??n(Jt(o));}let d=e(i.stderr)&&i.stderr.length>0?r(i.stderr):void 0;if(d!==void 0)if(u){let l=u.endsWith(`
55
+ `)||u.endsWith("\r")?"":`
56
+ `;u=`${u}${l}${d}`;}else u=n(d);if(u)return u;let c=n(i.summary)??n(Jt(t.content))??n(i.output_for_prompt);return c!==void 0?c:s(o)}if(t.content!==null&&t.content!==void 0)return Jt(t.content)??s(t.content);if(t.result!==null&&t.result!==void 0)return Jt(t.result)??s(t.result)}function Ru(t){let e=kn(t.error),n=[t.message,t.errorMessage,e?.message,e?.detail,typeof t.error=="string"?t.error:void 0].find(r=>typeof r=="string"&&r.trim().length>0);return n?Su(n):"Grok CLI reported an error."}function Su(t){return (t.replace(Ag,"").split(/\r?\n/).map(n=>n.trim()).filter(Boolean)[0]??t.trim()).slice(0,500)}function wu(t){return Ig.test(t)}function bg(t){let e=kn(t.modelUsage);return e?Object.keys(e)[0]??null:null}function vg(t){let e=kn(t.usage);if(!e)return null;let n=Vt(e.cache_read_input_tokens);return {inputTokens:Vt(e.input_tokens)+n,cachedInputTokens:n,outputTokens:Vt(e.output_tokens),costUsd:Vt(t.total_cost_usd)}}function xg(t){let e=0,n=0,r=0,s=false,o=new Set;for(let i of t.split(`
57
+ `).flatMap(Xn)){if(i.type!=="usage")continue;let u=kn(i.usage);if(!u)continue;let d=Ie(i.signature);if(d&&d.length>0){let l=`signature:${d}`;if(o.has(l))continue;o.add(l);}let c=Vt(u.cache_read_input_tokens);e+=Vt(u.input_tokens)+c,n+=c,r+=Vt(u.output_tokens),s=true;}return s?{inputTokens:e,cachedInputTokens:n,outputTokens:r,costUsd:0}:null}function Cg(t,e){if(!Array.isArray(e.entries)||e.entries.length===0)return [];let n=[];for(let o of e.entries.slice(0,ku)){if(!mn(o))continue;let i=Ie(o.content)?.trim();if(!i)continue;let u=Ie(o.status)?.trim(),d=Ie(o.priority)?.trim(),c=[u?`status=${u}`:void 0,d?`priority=${d}`:void 0].filter(p=>!!p),l=c.length>0?` (${c.join(", ")})`:"";n.push(`- ${i}${l}`);}if(n.length===0)return [];e.entries.length>ku&&n.push(yu);let r=n.join(`
58
+ `),s=r.length>Tu?`${r.slice(0,Tu-1)}${yu}`:r;return [{timestamp:t,type:"info",content:s}]}function Dg(t,e){let n=Ie(e.type);if(n==="thought"){let r=Ie(e.data);return r===void 0?[]:[{timestamp:t,type:"thinking",content:r}]}if(n==="text"){let r=Ie(e.data);return r===void 0?[]:[{timestamp:t,type:"text",content:r}]}if(n==="plan")return Cg(t,e);if(n==="tool_call"){let r=Ie(e.toolCallId),s=Ie(e.toolName)??Ie(e.title),o=e.rawInput===void 0?void 0:Eu(e.rawInput);return [{timestamp:t,type:"tool_use",toolUseId:r,toolName:s,toolInput:o}]}if(n==="tool_call_update"){let r=Ie(e.status);if(r!=="completed"&&r!=="failed"&&r!=="error")return [];let s=Ng(e),o=r!=="completed"||e.isError===true;return [{timestamp:t,type:"tool_result",toolUseId:Ie(e.toolCallId),toolName:Ie(e.toolName)??Ie(e.title),...s!==void 0?Ge(s,o):{isError:o}}]}if(n==="error"){let r=Ru(e);return [{timestamp:t,type:"error",content:r,errorMessage:r}]}return []}function Pg(t){return process.platform==="win32"?{flags:["--single",t]}:{flags:["--prompt-file","/dev/stdin"],stdinMessage:t}}var rs,Sg,Ig,Ag,ku,Tu,yu,vo,xo=v(()=>{_();Wt();ro();jt();ln();Jn();zt();rs="cli/grok",Sg=new Set(["available_commands","usage","end"]),Ig=/(?:rate[\s_-]*limit|quota|usage[\s_-]*limit|too many requests|limit(?:ed|ing)?\s+(?:exceeded|reached))/i,Ag=/\u001b\[[0-?]*[ -/]*[@-~]/g,ku=20,Tu=4e3,yu="\u2026";vo={command:"grok",createSessionId:()=>randomUUID(),meta:{displayName:"Grok",capabilities:{resume:true}},buildArgs(t,e){let{model:n,effort:r}=At(e.model),s=e.effort??r,o=e.resumeSessionId?["--resume",e.resumeSessionId]:e.providerSessionId?["--session-id",e.providerSessionId]:[],i=n?["--model",n]:[],u=n?It("grok").some(N=>N.id===n):false,d=n&&u?Kn("grok",n):[],c=!s||d.length===0||d.includes(s)?s:void 0,l=qd(c),p=e.additionalArgs??[],g=N=>p.some(R=>R===N||R.startsWith(`${N}=`)),h=e.providerOptions,m=h?.alwaysApprove,E=h?.sandbox,S=g("--permission-mode")?[]:Hd(e.mode),D=g("--always-approve")?[]:Ud(m),y=g("--sandbox")?[]:Fd(E),x=g("--verbatim")?[]:["--verbatim"],I=Pg(t);return {args:["--no-auto-update",...o,...I.flags,...x,"--output-format","streaming-json","--no-alt-screen",...i,...l,...S,...D,...y,...p],stdinMessage:I.stdinMessage}},extractText(t){let e=[],n=false;for(let r of t.split(`
59
+ `).flatMap(Xn))typeof r.type=="string"&&(n=true),r.type==="text"&&typeof r.data=="string"&&e.push(r.data);return e.length>0?e.join(""):n?"":t.trim()},extractFailure(t){for(let e of Xn(t))if(e.type==="error"){let n=Ru(e);return wu(Eu(e))?new Gt(n,rs):new V(n,rs)}return null},interpretExit(t,e){if(t===0)return null;let n=Su(e)||`Grok CLI exited with code ${t}.`;return wu(e)?new Gt(n,rs):new V(n,rs)},parseResultMeta(t){let n=t.split(`
60
+ `).flatMap(Xn).find(r=>r.type==="end");return n?{usage:vg(n),model:bg(n)}:{usage:xg(t),model:null}},parseEvent(t,e){let n=e??new Date().toISOString();return Xn(t).flatMap(r=>Dg(ze(r,n),r))},suppressOutputLine(t){let e=t.trim();if(!e.startsWith("{")||!e.endsWith("}"))return false;try{let n=JSON.parse(e);return mn(n)&&typeof n.type=="string"?Sg.has(n.type):!1}catch{return false}}};});var Iu,Au=v(()=>{_();_o();mo();To();wo();bo();mu();xo();_o();mo();To();wo();bo();xo();cn();Iu={codex:ko,claude:Vr,opencode:yo,antigravity:No,copilot:ho,grok:vo};});function Ou(t){if(t.startsWith("cli/"))return Iu[t.slice(4)]}var Nu=v(()=>{_();_d();Au();});function ss(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function Lg(t,e){return typeof t=="string"&&t.length>0?t:typeof e=="string"&&e.length>0?e:null}function os(t){if(typeof t.provider!="string"||t.provider.length===0)return;let n=t.taskLogRepository.readLogs(t.taskId)?.entries.filter(g=>g.level==="stdout").map(g=>g.message).join(`
61
+ `)??"";if(!n.trim())return;let r=Ou(t.provider);if(!r)return;let s;try{s=r.parseResultMeta?.(n);}catch{return {stdout:n,adapter:r}}let o=Lg(s?.model,t.model),i=s?.usage;if(!i)return {stdout:n,adapter:r};let u=ss(i.inputTokens),d=ss(i.outputTokens),c=ss(i.cachedInputTokens),l=za(ss(i.costUsd),u,d,c,o);return u!==0||d!==0||c!==0||l!==0?{stdout:n,adapter:r,usage:{inputTokens:u,outputTokens:d,cachedInputTokens:c,costUsd:l,model:o,...i.complete===void 0?{}:{complete:i.complete}}}:{stdout:n,adapter:r}}var Co=v(()=>{_();Nu();Mr();});function Po(t){let e=new Set;for(let n of t)for(let r of Mg.get(n)??[n])e.add(r);return [...e]}function Lo(t){if(t)try{let e=JSON.parse(t);if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.terminalReason;return typeof n=="string"&&$g.has(n)?n:void 0}catch{return}}function Ke(t){let e=Lo(t.metadata);if(e)return e;if(t.status==="runner_lost")return "runner_lost";if(t.status==="stopped")return "user_stop";if(t.status==="failed"&&typeof t.error=="string"){if(Do.stopped.test(t.error))return "user_stop";if(Do.runnerLost.test(t.error))return "runner_lost"}}function xe(t){switch(t.status){case "stopped":case "pending":case "running":case "paused":case "success":return t.status;case "completed":case "done":return "success";case "error":case "runner_lost":return "failed";case "failed":{let e=Lo(t.metadata);return e==="user_stop"?"stopped":e?"failed":typeof t.error=="string"&&Do.stopped.test(t.error)?"stopped":"failed"}default:return t.status}}function Hg(t){if(!t)return {};try{let e=JSON.parse(t);return typeof e=="object"&&e!==null&&!Array.isArray(e)?e:{}}catch{return {}}}function Yn(t){let e=xe(t);return t.status==="runner_lost"&&Lo(t.metadata)===void 0?{...t,status:e,metadata:JSON.stringify({...Hg(t.metadata),terminalReason:"runner_lost"})}:{...t,status:e}}var Xt,Mg,Do,$g,Qn=v(()=>{_();Xt=["success","completed","done","failed","error","stopped","runner_lost"],Mg=new Map([["success",["success","completed","done"]],["failed",["failed","error","runner_lost"]]]);Do={stopped:/^(Killed by user|Stopped by user|Cancelled by user|사용자에 의해 중지됨)/,runnerLost:/^Reaped: (process not found|pid never recorded|stale workflow run)/},$g=new Set(["user_stop","runner_lost","launch_failed"]);});function Mo(t,e,n=1){let r=process.env[t];if(r===void 0||r==="")return e;let s=Number(r);return !Number.isFinite(s)||s<=0?e:Math.max(n,Math.trunc(s))}function er(){return Mo("CREWX_TASK_HEARTBEAT_MS",1e4,200)}function yn(){return Mo("CREWX_TASK_HEARTBEAT_STALE_MS",3e4)}function as(){return Mo("CREWX_TASK_HEARTBEAT_HARD_STALE_MS",18e5)}function Tn(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function is(t){let e=typeof t=="object"&&t!==null&&"code"in t?String(t.code):t instanceof Error?t.name:typeof t;console.warn(`[crewx] task heartbeat write failed (${e}); execution continues`);}function Ug(t){return t?{id:t.id,status:t.status,run_epoch:t.run_epoch,stop_requested_at:t.stop_requested_at,stop_requested_epoch:t.stop_requested_epoch,pid:t.pid,metadata:t.metadata,started_at:t.started_at,duration_ms:t.duration_ms}:null}function bu(t,e){return !!t.stop_requested_at&&Tn(t.stop_requested_epoch)===Tn(e)}function vu(t,e){let n=Tn(e.runEpoch);if(!(e.writeHeartbeat===false?true:t.heartbeatTask({id:e.taskId,runEpoch:n})))return {accepted:false,row:null};let s=Ug(t.getTask(e.taskId));return !s||s.status!=="running"||Tn(s.run_epoch)!==n?{accepted:false,row:s}:{accepted:true,row:s}}function Pu(t,e){let n=Zn.get(t);return !n||e&&n!==e?false:(clearInterval(n.timer),Zn.delete(t),true)}function tr(t,e){let n=Zn.get(t);return !n||e!==void 0&&n.runEpoch!==Tn(e)?false:Pu(t,n)}function Lu(t,e){let n=Tn(e.runEpoch);tr(e.taskId);let r=true,s=null;try{let c=vu(t,{...e,runEpoch:n});r=c.accepted,s=c.row;}catch(c){is(c);}if(!r)return false;let o=er(),i=Math.min(o,1e3),u=setInterval(()=>{let c=Zn.get(e.taskId);if(!(!c||c.timer!==u))try{c.heartbeatElapsedMs+=i;let l=c.heartbeatElapsedMs>=o,p=vu(t,{taskId:e.taskId,runEpoch:n,writeHeartbeat:l});if(!p.accepted){Pu(e.taskId,c);return}l&&(c.heartbeatElapsedMs%=o,c.lastHeartbeatAt=Date.now()),p.row&&bu(p.row,n)&&!c.stopRequested&&(c.stopRequested=!0,e.onStopRequested&&Promise.resolve(e.onStopRequested(p.row)).catch(is));}catch(l){is(l);}},i),d={timer:u,runEpoch:n,stopRequested:false,lastHeartbeatAt:Date.now(),heartbeatElapsedMs:0};return Zn.set(e.taskId,d),typeof u=="object"&&u!==null&&"unref"in u&&u.unref(),s&&bu(s,n)&&e.onStopRequested&&(d.stopRequested=true,Promise.resolve(e.onStopRequested(s)).catch(is)),true}var xu,Cu,Du,Zn,nr=v(()=>{_();xu=1e4,Cu=3e4,Du=18e5;Zn=new Map;});function ds(t,e=Date.now(),n=Fo){let r=t?Date.parse(t):Number.NaN,s=typeof e=="number"?e:Date.parse(e),o=Wo(n,Fo,0);return Number.isFinite(r)&&Number.isFinite(s)&&s-r>o?"forced":"cooperative"}function zo(t){let e=[],n=typeof t.pid=="number"&&t.pid>0?t.pid:void 0;n!==void 0&&e.push({pid:n,startedAt:t.pid_started_at});let r=Fu(t.metadata),s=r.ownership==="runner"&&typeof r.providerPid=="number"&&Number.isSafeInteger(r.providerPid)&&r.providerPid>0?r.providerPid:void 0;if(s!==void 0&&s!==n){let o=r.providerPidStartedAt;e.push({pid:s,startedAt:typeof o=="string"?o:null});}return e}async function Ko(t,e={}){if(t.pid===process.pid||t.pid===process.ppid)return {verdict:"unproven",ownership:"not_owned",reason:"pid is this process or its parent"};let n=typeof t.startedAt=="string"?Date.parse(t.startedAt):Number.NaN,r=Number.isFinite(n),s=e.legacyStartBoundaryMs;if(!r&&s===void 0)return {verdict:"unproven",ownership:"unknown",reason:"no start time recorded"};let o=e.processControlOptions??{},i=e.processControl?.checkProcessOwnershipAsync??td,u=e.processControl?.readProcessIdentityAsync??od,d;try{d=await i(t.pid,e.ownershipMarkers??qg,o);}catch{d="unknown";}let c;try{c=await u(t.pid,o);}catch{c={status:"unknown"};}if(c.status==="not_found")return {verdict:"unproven",ownership:"not_found",reason:"process is no longer running"};if(c.status!=="found")return {verdict:"unproven",ownership:"unknown",reason:"start time could not be read"};let l=new Date(c.startedAtMs).toISOString();if(r){if(Math.abs(c.startedAtMs-n)>Hr)return {verdict:"reused",reason:`started ${l}, not the recorded ${t.startedAt}`}}else return s!==void 0&&c.startedAtMs>s?{verdict:"reused",reason:`started ${l}, after the row's last heartbeat`}:{verdict:"unproven",ownership:"unknown",reason:"no start time recorded and it started before the row's last heartbeat"};return d!=="owned"?{verdict:"unproven",ownership:d,reason:"command line has no owned marker"}:c.groupId!==null&&c.groupId!==t.pid?{verdict:"unproven",ownership:"not_owned",reason:"pid does not lead its process group"}:{verdict:"owned"}}async function Jo(t,e={}){let n=await Ko(t,e);return n.verdict==="owned"?"owned":n.verdict==="reused"?"not_owned":n.ownership}function Wo(t,e,n){return t===void 0||!Number.isFinite(t)?e:Math.max(n,Math.trunc(t))}function Fu(t){if(!t)return {};try{let e=JSON.parse(t);if(typeof e=="object"&&e!==null&&!Array.isArray(e))return e}catch{}return {}}function Jg(t){if(!t)return;let e=Fu(t.metadata).stopMethod;return e==="cooperative"||e==="forced"?e:void 0}function Ce(t,e){if(!t)return {status:"not_running",finalStatus:"not_running",...e?{pid:e}:{}};let n=typeof t.pid=="number"&&t.pid>0?t.pid:e;if(t.status==="stopped"){let r=Jg(t);return {status:"stopped",finalStatus:t.status,...r?{method:r}:{},...n?{pid:n}:{}}}return {status:"not_running",finalStatus:t.status,...n?{pid:n}:{}}}function Vo(t,e,n="Process owner could not be verified"){let r=e??(t.pid&&t.pid>0?t.pid:void 0);return {status:"ownership_unverified",finalStatus:t.status,...r?{pid:r}:{},error:n}}function X(t,e,n){let r=n??(t?.pid&&t.pid>0?t.pid:void 0);return {status:"failed",finalStatus:t?.status??null,...r?{pid:r}:{},error:e}}function Uo(t,e){return X(t,Wg,e)}function Vg(t,e){if(!t.heartbeat_at)return false;let n=Date.parse(t.heartbeat_at);return Number.isFinite(n)?e-n<=yn():false}function Xg(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function Yg(t,e,n){let r=t.getTask(e);if(!r||r.status!=="running")return Ce(r,n)}async function Qg(t,e,n,r){let s=Date.now()+n;for(;;){let o=Yg(t,e);if(o)return o;let i=s-Date.now();if(i<=0)return;await new Promise(u=>{setTimeout(u,Math.min(r,i));});}}async function Uu(t,e,n){let r=new Date().toISOString(),s={origin:n.origin??"internal",...n.callerPid!==void 0?{callerPid:n.callerPid}:{},...n.callerTaskId!==void 0?{callerTaskId:n.callerTaskId}:{}},o=t.requestTaskStop({id:e,requestedAt:r,...s}),i=t.getTask(e);if(!o.accepted){if(o.status==="pending"){let x=t.stopPendingTask(e,void 0,void 0,{...s,at:r}),I=t.getTask(e);if(x||!I||I.status!=="running")return Ce(I);if(o=t.requestTaskStop({id:e,requestedAt:r,...s}),!o.accepted&&o.status!=="running"||!o.accepted&&!o.alreadyRequestedAt)return Ce(t.getTask(e))}else if(!(o.status==="running"&&o.alreadyRequestedAt))return Ce(i)}let u=o.runEpoch,d=Wo(n.graceMs,Fo,0),c=Wo(n.pollMs,Fg,1),l=await Qg(t,e,d,c);if(l)return l;let p=t.getTask(e);if(!p||p.status!=="running")return Ce(p);let g=zo(p),h=g.map(x=>x.pid),m=h[0];if(!m){let x=t.finalizeTaskStop({id:e,runEpoch:u,method:"forced"}),I=t.getTask(e);return x||I?.status!=="running"?Ce(I):X(I,"Failed to finalize task stop")}let E=Xg(n);if(!Vg(p,Date.now())){for(let x of g)if(await Jo(x,{ownershipMarkers:n.ownershipMarkers,processControl:n.processControl,processControlOptions:E})!=="owned")return Vo(p)}let S=n.processControl?.terminateProcessTree??St;for(let x of h){let I;try{I=await S(x,{...E,signal:Rt});}catch(N){I={status:"failed",pid:x,method:E.platform==="win32"?"taskkill":"process-group",error:N instanceof Error?N.message:String(N)};}if(I.status==="failed")return X(t.getTask(e),I.error??"Failed to terminate process tree")}let D=t.finalizeTaskStop({id:e,runEpoch:u,method:"forced"}),y=t.getTask(e);return D||y?.status!=="running"?Ce(y,m):X(y,"Task changed before stop was finalized")}function Go(t){return typeof t=="number"&&Number.isSafeInteger(t)&&t>0}function jo(t){return Number.isSafeInteger(t)&&t>=0}function rr(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Zg(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function e_(t){return {...t.processControlOptions,...t.platform?{platform:t.platform}:{}}}function t_(t,e){let n=t?.pid&&t.pid>0?t.pid:e;return {status:"stopped",method:"forced",finalStatus:t?.status??"failed",...n?{pid:n}:{}}}function n_(t){switch(t){case "epoch_mismatch":return qo;case "workspace_mismatch":return Bo;default:return}}async function qu(t,e){let n=t.getTask(e.taskId);if(!n||n.status!=="running")return Uo(n,Go(e.targetPid)?e.targetPid:void 0);if(!jo(e.sourceRunEpoch)||!jo(e.settleRunEpoch)||rr(n.run_epoch)!==e.settleRunEpoch)return X(n,$o,e.targetPid);if(e.workspaceId!==void 0&&n.workspace_id!==e.workspaceId)return X(n,Ho,e.targetPid);let r=new Date().toISOString(),s;try{s=t.requestTaskStop({id:e.taskId,requestedAt:r,sourceRunEpoch:e.sourceRunEpoch,settleRunEpoch:e.settleRunEpoch,...e.workspaceId!==void 0?{workspaceId:e.workspaceId}:{}});}catch{return X(n,Gg,e.targetPid)}let o=t.getTask(e.taskId);if(!o||o.status!=="running")return Uo(o,e.targetPid);if(s.runEpoch!==e.settleRunEpoch||rr(o.run_epoch)!==e.settleRunEpoch)return X(o,$o,e.targetPid);if(e.workspaceId!==void 0&&o.workspace_id!==e.workspaceId)return X(o,Ho,e.targetPid);if(!Go(e.targetPid))return X(o,Bg);let i=Zg(e);if(await Jo({pid:e.targetPid,startedAt:o.pid_started_at},{ownershipMarkers:e.ownershipMarkers,processControl:e.processControl,processControlOptions:i})!=="owned")return Vo(o,e.targetPid);let d=t.getTask(e.taskId);if(!d||d.status!=="running")return Uo(d,e.targetPid);if(rr(d.run_epoch)!==e.settleRunEpoch)return X(d,$o,e.targetPid);if(e.workspaceId!==void 0&&d.workspace_id!==e.workspaceId)return X(d,Ho,e.targetPid);let c=e.processControl?.terminateProcessTree??St,l;try{l=await c(e.targetPid,{...i,signal:Rt});}catch{return X(t.getTask(e.taskId),Mu,e.targetPid)}if(l.status==="failed")return X(t.getTask(e.taskId),Mu,e.targetPid);let p;try{p=t.finalizeTaskStop({id:e.taskId,runEpoch:e.settleRunEpoch,method:"forced"});}catch{return X(t.getTask(e.taskId),$u,e.targetPid)}return p?Ce(t.getTask(e.taskId),e.targetPid):X(t.getTask(e.taskId),$u,e.targetPid)}async function Bu(t,e){let n=t.getTask(e.taskId);if(!n||n.status!=="running")return Ce(n);if(!jo(e.expectedRunEpoch)||rr(n.run_epoch)!==e.expectedRunEpoch)return X(n,qo);if(e.workspaceId!==void 0&&n.workspace_id!==e.workspaceId)return X(n,Bo);let r=n.pid;if(!Go(r))return X(n,jg);let s=e_(e);if(await Jo({pid:r,startedAt:n.pid_started_at},{ownershipMarkers:e.ownershipMarkers,processControl:e.processControl,processControlOptions:s})!=="owned")return Vo(n,r,zg);let i=e.processControl?.terminateProcessTree??St,u;try{u=await i(r,{...s,signal:Rt});}catch{return X(t.getTask(e.taskId),Hu,r)}if(u.status==="failed")return X(t.getTask(e.taskId),Hu,r);let d=t.getTask(e.taskId);if(!d||d.status!=="running")return Ce(d,r);if(rr(d.run_epoch)!==e.expectedRunEpoch)return X(d,qo,r);if(e.workspaceId!==void 0&&d.workspace_id!==e.workspaceId)return X(d,Bo,r);let c;try{c=t.finalizeTaskForHostShutdown({id:e.taskId,expectedRunEpoch:e.expectedRunEpoch,...e.workspaceId!==void 0?{workspaceId:e.workspaceId}:{}});}catch{return X(t.getTask(e.taskId),Kg,r)}let l=n_(c);return l?X(t.getTask(e.taskId),l,r):c!=="settled"?Ce(t.getTask(e.taskId),r):t_(t.getTask(e.taskId),r)}function Wu(t,e,n={}){if(typeof t=="string"){let r=t,s=e??{};return Promise.resolve().then(()=>(Yo(),Gu)).then(({TaskRepository:o})=>Uu(new o,r,s))}return Uu(t,e,n)}var Fo,Fg,qg,Bg,$o,Ho,Wg,Mu,$u,Gg,qo,Bo,jg,zg,Hu,Kg,Xo=v(()=>{_();Ur();nr();Fo=5e3,Fg=250;qg=["crewx","claude","codex","opencode","grok","node"];Bg="INSTRUCTION_STOP_TARGET_PID_MISSING",$o="INSTRUCTION_STOP_EPOCH_MISMATCH",Ho="INSTRUCTION_STOP_WORKSPACE_MISMATCH",Wg="INSTRUCTION_STOP_GENERATION_ALREADY_SETTLED",Mu="INSTRUCTION_STOP_PROCESS_TERMINATION_FAILED",$u="INSTRUCTION_STOP_SETTLE_CAS_FAILED",Gg="INSTRUCTION_STOP_REQUEST_FAILED",qo="HOST_SHUTDOWN_EPOCH_MISMATCH",Bo="HOST_SHUTDOWN_WORKSPACE_MISMATCH",jg="HOST_SHUTDOWN_TARGET_PID_MISSING",zg="HOST_SHUTDOWN_OWNERSHIP_UNVERIFIED",Hu="HOST_SHUTDOWN_PROCESS_TERMINATION_FAILED",Kg="HOST_SHUTDOWN_SETTLE_CAS_FAILED";});var Gu={};Mc(Gu,{CANONICAL_USER_STOP_ERROR:()=>ai,DEFAULT_TASK_REAPER_TICK_INTERVAL_MS:()=>Zu,HOST_SHUTDOWN_TERMINAL_ERROR:()=>Vu,PENDING_ADOPT_GRACE_MS:()=>Qu,PID_NULL_REAP_GRACE_MS:()=>li,RATED_TASK_EXCERPT_MAX_CHARS:()=>pi,RATED_TASK_LIST_MAX_LIMIT:()=>tc,TASK_HEARTBEAT_HARD_STALE_MS:()=>Du,TASK_HEARTBEAT_INTERVAL_MS:()=>xu,TASK_HEARTBEAT_STALE_MS:()=>Cu,TASK_RATINGS:()=>ec,TaskRatingError:()=>ur,TaskRepository:()=>dr,WORKFLOW_ANCHOR_TASK_KINDS:()=>wt,buildRatedTasksCountQuery:()=>rc,buildRatedTasksQuery:()=>nc,countRatedTasks:()=>w_,hasRecordedUsage:()=>ui,isWorkflowAnchorTaskKind:()=>qn,listRatedTasks:()=>y_,mergeTerminalReason:()=>di,resolveTaskHeartbeatHardStaleMs:()=>as,resolveTaskHeartbeatIntervalMs:()=>er,resolveTaskHeartbeatStaleMs:()=>yn,setTaskRating:()=>T_});function Ve(t){return Yn(t)}function Zo(t){return Yn(t)}function ei(){return or$1(...wt.map(t=>like(a.metadata,`%"kind":"${t}"%`)))}function ju(){return and(...wt.map(t=>notLike(a.metadata,`%"kind":"${t}"%`)))}function ni(t=a.model,e=a.metadata){let n=sql`
62
+ CASE
63
+ WHEN ${t} LIKE 'claude-%' OR ${t} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
64
+ WHEN ${t} LIKE 'gpt-%' OR ${t} LIKE 'codex-%' THEN 'codex'
65
+ WHEN ${t} LIKE 'gemini-%' THEN 'gemini'
66
+ WHEN ${t} LIKE 'grok-%' THEN 'grok'
67
+ WHEN ${t} LIKE 'zai-%' OR ${t} LIKE 'openrouter/z-ai/%' THEN 'opencode'
68
+ WHEN ${t} LIKE 'minimax/%' THEN 'minimax'
69
+ WHEN ${t} LIKE 'qwen%' THEN 'qwen'
70
+ ELSE 'unknown'
71
+ END
72
+ `,r=sql`json_extract(${e}, '$.provider')`,s=sql`trim(${r})`,o=sql`substr(${s}, 1, instr(${s}, '/') - 1)`,i=sql`
73
+ CASE
74
+ WHEN instr(${s}, '/') > 0
75
+ AND ${o} IN ('cli', 'acp', 'api', 'plugin', 'remote')
76
+ THEN substr(${s}, instr(${s}, '/') + 1)
77
+ ELSE ${s}
78
+ END
79
+ `;return sql`
80
+ CASE
81
+ WHEN ${e} IS NULL THEN ${n}
82
+ WHEN json_valid(${e}) = 0 THEN 'unknown'
83
+ WHEN json_type(${e}, '$') IS NOT 'object' THEN 'unknown'
84
+ WHEN json_type(${e}, '$.provider') IS NULL THEN ${n}
85
+ WHEN json_type(${e}, '$.provider') IS NOT 'text' THEN 'unknown'
86
+ WHEN ${s} = '' THEN 'unknown'
87
+ WHEN trim(${i}) = '' THEN 'unknown'
88
+ ELSE ${i}
89
+ END
90
+ `}function c_(t){let e={status:t.status,metadata:t.metadata},n=xe(e);return n==="stopped"||n==="failed"&&Ke(e)==="runner_lost"}function ir(t){return sql`${t} NOT IN (${sql.join(l_.map(e=>sql`${e}`),sql`, `)})`}function us(t){let e=sql`
91
+ CASE
92
+ WHEN json_valid(${t}) = 1
93
+ THEN json_extract(${t}, '$.usageAccounting')
94
+ ELSE NULL
95
+ END
96
+ `;return sql`
97
+ COALESCE(SUM(
98
+ CASE WHEN ${e} = 'unavailable' THEN 1 ELSE 0 END
99
+ ), 0)
100
+ `}function Yt(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function oe(t){if(!t)return {};try{let e=JSON.parse(t);return Yt(e)?{...e}:{}}catch{return {}}}function gs(t){return t==null||t===""}function cs(t,e){return gs(t)&&!gs(e)?e:t}function p_(t,e){let n=oe(t);if(!e)return n;for(let[r,s]of Object.entries(e))gs(n[r])&&!gs(s)&&(n[r]=s);return n}function ls(t,e){let n=t.origin&&Xu.has(t.origin)?t.origin:"internal",r=t.callerPid!==void 0&&Number.isInteger(t.callerPid)&&t.callerPid>0?t.callerPid:process.pid;return {origin:n,at:t.at??e,callerPid:r,...t.callerTaskId?{callerTaskId:t.callerTaskId}:{}}}function f_(t){let e=oe(t).stopRequest;if(Yt(e)&&!(typeof e.origin!="string"||!Xu.has(e.origin)||typeof e.at!="string"||typeof e.callerPid!="number"))return {...e}}function zu(){return or$1(isNull(a.stop_requested_at),ne$1(sql`COALESCE(${a.stop_requested_epoch}, 0)`,sql`COALESCE(${a.run_epoch}, 0)`))}function di(t,e){let n=oe(t??null);return n.terminalReason=e,JSON.stringify(n)}function si(t,e){let n={...t,terminalReason:"user_stop"},r=e?.trim();return r&&r!==ai&&(n[u_]=e),{error:ai,metadata:n}}function pe(t){return typeof t=="number"&&Number.isFinite(t)?t:0}function ui(t){return pe(t.input_tokens)!==0||pe(t.output_tokens)!==0||pe(t.cached_input_tokens)!==0||pe(t.cost_usd)!==0}function W(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}function Ku(t){return {inputTokens:pe(t.inputTokens??0),outputTokens:pe(t.outputTokens??0),cachedInputTokens:pe(t.cachedInputTokens??0),costUsd:pe(t.costUsd??0)}}function Yu(t){if(Yt(t))return {inputTokens:pe(t.inputTokens),outputTokens:pe(t.outputTokens),cachedInputTokens:pe(t.cachedInputTokens),costUsd:pe(t.costUsd)}}function ar(t){if(!Yt(t))return;let e=t.accounting;return e==="recorded"||e==="partial"||e==="unavailable"?e:void 0}function ci(t){return t.inputTokens!==0||t.outputTokens!==0||t.cachedInputTokens!==0||t.costUsd!==0}function g_(t){let e=ar(t);if(e==="recorded"||e==="partial")return true;if(e==="unavailable")return false;let n=Yu(t);return n!==void 0&&ci(n)}function __(t){return Object.values(t).some(e=>{let n=ar(e);return n==="partial"||n==="unavailable"})}function h_(t){let e={inputTokens:0,outputTokens:0,cachedInputTokens:0,costUsd:0};for(let n of Object.values(t)){if(ar(n)==="unavailable")continue;let r=Yu(n);r&&(e.inputTokens+=r.inputTokens,e.outputTokens+=r.outputTokens,e.cachedInputTokens+=r.cachedInputTokens,e.costUsd+=r.costUsd);}return e}function ps(t,e,n){let r=Date.parse(t),s=Date.parse(e);return Number.isFinite(r)&&Number.isFinite(s)?s-r:n??null}function oi(t,e){if(typeof t!="number"||!Number.isSafeInteger(t)||t<=0)return null;let n=sd(t,e);return n.status==="found"?new Date(n.startedAtMs).toISOString():null}function Sn(t,e){if(typeof t!="string"||t.length===0)throw new f("VALIDATION",`${e} is required`);return t}function fi(t,e){let n=Date.parse(t);if(!Number.isFinite(n))throw new f("VALIDATION",`${e} is not a valid ISO time: ${t}`);return new Date(n).toISOString()}function T_(t,e){let n=Sn(e.workspaceId,"workspaceId"),r=Sn(e.taskId,"taskId"),s=e.rating;if(s!==null&&!ec.includes(s))throw new f("VALIDATION","rating must be 'up', 'down' or null");let o=e.now===void 0?new Date().toISOString():fi(e.now,"now");try{return t.transaction(i=>{let u=and(eq(a.id,r),eq(a.workspace_id,n),inArray(a.status,[...Xt])),d=i.update(a).set({rating:s,rated_at:s===null?null:o}).where(and(u,sql`${a.rating} IS NOT ${s}`)).returning({rating:a.rating,ratedAt:a.rated_at}).all();if(d.length>0)return {taskId:r,rating:d[0].rating,ratedAt:d[0].ratedAt,changed:!0};let c=i.select({status:a.status,rating:a.rating,rated_at:a.rated_at}).from(a).where(and(eq(a.id,r),eq(a.workspace_id,n))).limit(1).get();if(!c)throw new ur("TASK_NOT_FOUND",r);if(!k_.has(c.status))throw new ur("TASK_RATING_NOT_TERMINAL",r);return {taskId:r,rating:c.rating,ratedAt:c.rated_at,changed:!1}},{behavior:"immediate"})}catch(i){throw i instanceof f?i:new f("DB_ERROR","Failed to set task rating",i)}}function nc(t){let e=sql`
101
+ SELECT id, rated_at FROM tasks
102
+ WHERE workspace_id = ${t.workspaceId}
103
+ AND rating IS NOT NULL
104
+ ${t.agentId!==void 0?sql`AND agent_id = ${t.agentId}`:sql``}
105
+ ${t.sinceIso!==void 0?sql`AND rated_at >= ${t.sinceIso}`:sql``}
106
+ ORDER BY rated_at DESC, id DESC
107
+ LIMIT ${t.limit}
108
+ `;return sql`
109
+ SELECT t.id AS taskId, t.agent_id AS agentId, t.thread_id AS threadId, t.status AS status,
110
+ substr(t.error, 1, ${m_}) AS errorHead,
111
+ CASE WHEN json_valid(t.metadata) THEN json_extract(t.metadata, '$.terminalReason') END AS terminalReason,
112
+ t.rating AS rating, t.rated_at AS ratedAt,
113
+ NULLIF(substr(t.prompt, 1, ${pi}), '') AS promptExcerpt,
114
+ NULLIF(substr(t.result, 1, ${pi}), '') AS resultExcerpt
115
+ FROM (${e}) AS page
116
+ JOIN tasks t ON t.id = page.id
117
+ ORDER BY page.rated_at DESC, page.id DESC
118
+ `}function y_(t,e){let n=Sn(e.workspaceId,"workspaceId");if(e.agentId!==void 0&&Sn(e.agentId,"agentId"),!Number.isFinite(e.limit)||Math.trunc(e.limit)<1)throw new f("VALIDATION","limit must be a positive integer");let r=Math.min(Math.trunc(e.limit),tc),s=e.sinceIso===void 0?void 0:fi(e.sinceIso,"sinceIso");try{return t.all(nc({workspaceId:n,agentId:e.agentId,sinceIso:s,limit:r})).map(i=>({taskId:i.taskId,agentId:i.agentId,threadId:i.threadId,status:xe({status:i.status,error:i.errorHead,metadata:i.terminalReason===null?null:JSON.stringify({terminalReason:i.terminalReason})}),rating:i.rating,ratedAt:i.ratedAt,promptExcerpt:i.promptExcerpt,resultExcerpt:i.resultExcerpt}))}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to list rated tasks",o)}}function rc(t){return sql`
119
+ SELECT COUNT(*) AS total FROM tasks
120
+ WHERE workspace_id = ${t.workspaceId}
121
+ AND rating IS NOT NULL
122
+ ${t.agentId!==void 0?sql`AND agent_id = ${t.agentId}`:sql``}
123
+ ${t.sinceIso!==void 0?sql`AND rated_at >= ${t.sinceIso}`:sql``}
124
+ `}function w_(t,e){let n=Sn(e.workspaceId,"workspaceId");e.agentId!==void 0&&Sn(e.agentId,"agentId");let r=e.sinceIso===void 0?void 0:fi(e.sinceIso,"sinceIso");try{return t.all(rc({workspaceId:n,agentId:e.agentId,sinceIso:r}))[0]?.total??0}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to count rated tasks",s)}}var ti,wn,a_,En,Rn,d_,ri,or,He,ai,Vu,u_,l_,Xu,li,Qu,Zu,dr,ec,pi,tc,m_,ur,k_,Yo=v(()=>{_();kt();Ct();Dt();mt();Bt();Pr();Mr();Ya();Ur();pd();gd();Co();Qn();nr();Xo();nr();Pr();ti=40,wn="2026-05-09",a_="0.8.9-rc.13",En=10,Rn=parseInt(a_.split("rc.")[1]);d_=new Set(["workflow","mcp"]),ri="usageByEpoch",or="lateUsage",He="usageAccounting",ai="Stopped by user",Vu="Stopped by app shutdown",u_="terminalErrorOriginal";l_=["pending","running"];Xu=new Set(["http","cli","instruction","workflow","internal"]);li=600*1e3,Qu=600*1e3,Zu=300*1e3;dr=class extends Re{dbPath;clock;taskLogRepository;processControl;lastReaperTickAt;orphanReapInFlight;pidNullObservedSince=new Map;constructor(e={}){super(),this.clock=e.clock??(()=>Date.now()),this.processControl=e.processControl??{},e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db")),this.taskLogRepository=new Fr({dbPath:this.dbPath});}resolveDbPath(){return this.dbPath?xt(this.dbPath):super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let s=dirname(n);existsSync(s)||mkdirSync(s,{recursive:true});}else if(!existsSync(n))throw new f("NOT_FOUND","Database not found");let r=$(n);if(e)try{Pe(r.db,n);}catch(s){throw r.close(),s}return r}heartbeatTask(e){let n=this.openHandle(true);try{let r=W(e.runEpoch),s=r===0?or$1(eq(a.run_epoch,0),isNull(a.run_epoch)):eq(a.run_epoch,r);return n.db.update(a).set({heartbeat_at:new Date(this.clock()).toISOString()}).where(and(eq(a.id,e.id),s,eq(a.status,"running"))).run().changes>0}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to heartbeat task",r)}finally{n.close();}}requestTaskStop(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(s=>{let o=s.select({id:a.id,status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!o)return;let i=W(o.run_epoch);if(o.status!=="running"){r={accepted:!1,status:o.status,runEpoch:i};return}let u=o.stop_requested_at!==null&&W(o.stop_requested_epoch)===i,d=u?o.stop_requested_at:e.requestedAt,c=oe(o.metadata),l=u?f_(o.metadata)??ls({origin:e.origin,at:d,callerPid:e.callerPid,callerTaskId:e.callerTaskId},d):ls({origin:e.origin,at:d,callerPid:e.callerPid,callerTaskId:e.callerTaskId},d);if(s.update(a).set({stop_requested_at:e.requestedAt,stop_requested_epoch:sql`${a.run_epoch}`,metadata:JSON.stringify({...c,stopRequest:l})}).where(and(eq(a.id,e.id),eq(a.status,"running"),zu())).run().changes===0){let m=s.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!m||m.status!=="running"){r={accepted:!1,status:m?.status??"not_running",runEpoch:W(m?.run_epoch)};return}r={accepted:!1,status:m.status,runEpoch:W(m.run_epoch),...m.stop_requested_at&&W(m.stop_requested_epoch)===W(m.run_epoch)?{alreadyRequestedAt:m.stop_requested_at}:{}};}else r={accepted:!0,status:o.status,runEpoch:i};let g=new Set([e.id]),h=(m,E)=>{if(E>=8)return;let S=s.select({id:a.id,status:a.status,metadata:a.metadata}).from(a).where(and(eq(a.parent_task_id,m),eq(a.status,"running"))).all();for(let D of S)g.has(D.id)||(g.add(D.id),s.update(a).set({stop_requested_at:d,stop_requested_epoch:sql`${a.run_epoch}`,metadata:JSON.stringify({...oe(D.metadata),stopRequest:l})}).where(and(eq(a.id,D.id),eq(a.status,"running"),zu())).run(),h(D.id,E+1));};h(e.id,0);},{behavior:"immediate"}),r}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to request task stop",r)}finally{n.close();}}requestTaskStopForInstruction(e){if(!this.dbExists())return {accepted:false,status:"not_running",runEpoch:0};let n=this.openHandle(true);try{let r={accepted:!1,status:"not_running",runEpoch:0};return n.db.transaction(s=>{let o=s.select({id:a.id,status:a.status,run_epoch:a.run_epoch,workspace_id:a.workspace_id,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!o)return;let i=W(o.run_epoch),u=W(e.sourceRunEpoch),d=W(e.settleRunEpoch);if(o.status!=="running"||i!==d||e.workspaceId!==void 0&&o.workspace_id!==e.workspaceId){r={accepted:!1,status:o.status,runEpoch:i};return}let c=d===0?or$1(eq(a.run_epoch,0),isNull(a.run_epoch)):eq(a.run_epoch,d),l=or$1(isNull(a.stop_requested_at),isNull(a.stop_requested_epoch),ne$1(a.stop_requested_epoch,u)),p=ls({origin:"instruction",at:e.requestedAt,callerPid:e.callerPid,callerTaskId:e.callerTaskId},e.requestedAt),g=S=>s.update(a).set({stop_requested_at:e.requestedAt,stop_requested_epoch:u,metadata:JSON.stringify({...oe(o.metadata),stopRequest:p})}).where(and(eq(a.id,e.id),eq(a.status,"running"),c,S,l)).run();if((e.workspaceId===void 0?g():e.workspaceId===null?g(isNull(a.workspace_id)):g(eq(a.workspace_id,e.workspaceId))).changes>0){r={accepted:!0,status:o.status,runEpoch:d};return}let m=s.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!m||m.status!=="running"){r={accepted:!1,status:m?.status??"not_running",runEpoch:W(m?.run_epoch)};return}let E=W(m.run_epoch);r={accepted:!1,status:m.status,runEpoch:E,...m.stop_requested_at&&W(m.stop_requested_epoch)===u?{alreadyRequestedAt:m.stop_requested_at}:{}};},{behavior:"immediate"}),r}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to request instruction task stop",r)}finally{n.close();}}finalizeTaskStop(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),s=!1;return n.db.transaction(o=>{let i=o.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,started_at:a.started_at,duration_ms:a.duration_ms,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!i||i.status!=="running"||W(i.run_epoch)!==W(e.runEpoch))return;let u=i.stop_requested_at!==null&&W(i.stop_requested_epoch)===W(e.runEpoch),d=oe(i.metadata),c=u?si(d,e.error):{error:e.error??null,metadata:e.terminalReason===void 0?{...d}:{...d,terminalReason:e.terminalReason}},l={...c.metadata,stopMethod:e.method},p=i.duration_ms??e.durationMs??ps(i.started_at,r,void 0),g=i.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,i.run_epoch);s=o.update(a).set({status:"stopped",error:c.error,completed_at:r,duration_ms:p,metadata:JSON.stringify(l)}).where(and(eq(a.id,e.id),eq(a.status,"running"),g)).run().changes>0;},{behavior:"immediate"}),s}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to finalize task stop",r)}finally{n.close();}}finalizeTaskForHostShutdown(e){if(!this.dbExists())return "not_running";let n=this.openHandle(true);try{let r=e.completedAt??new Date(this.clock()).toISOString(),s=W(e.expectedRunEpoch),o="not_running";return n.db.transaction(i=>{let u=i.select({status:a.status,run_epoch:a.run_epoch,workspace_id:a.workspace_id,started_at:a.started_at,duration_ms:a.duration_ms,metadata:a.metadata}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!u||u.status!=="running"){o="not_running";return}if(W(u.run_epoch)!==s){o="epoch_mismatch";return}if(e.workspaceId!==void 0&&u.workspace_id!==e.workspaceId){o="workspace_mismatch";return}let c=u.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,u.run_epoch),l=e.workspaceId===void 0?void 0:e.workspaceId===null?isNull(a.workspace_id):eq(a.workspace_id,e.workspaceId),p={...oe(u.metadata),terminalReason:"runner_lost"},g=u.duration_ms??ps(u.started_at,r,void 0);o=i.update(a).set({status:"failed",error:Vu,completed_at:r,duration_ms:g,metadata:JSON.stringify(p)}).where(and(eq(a.id,e.id),eq(a.status,"running"),c,l)).run().changes>0?"settled":"not_running";},{behavior:"immediate"}),o}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to finalize task for host shutdown",r)}finally{n.close();}}async stopTask(e,n={}){return Wu(this,e,n)}async stopTaskGenerationForInstruction(e){return qu({requestTaskStop:n=>this.requestTaskStopForInstruction(n),getTask:n=>this.getTask(n),finalizeTaskStop:n=>this.finalizeTaskStop(n)},e)}startTask(e){let n=this.openHandle(true);try{let r=e.actorKind==="human"&&typeof e.workspaceId=="string"&&e.workspaceId.length>0&&typeof e.actorId=="string"&&e.actorId.length>0,s=r?n.db.select({id:a.id}).from(a).where(eq(a.id,e.id)).get()!==void 0:!0,o={id:e.id,agent_id:e.agentId,actor_kind:e.actorKind??null,actor_id:e.actorId??null,user_id:e.userId??null,prompt:e.prompt,mode:e.mode,status:e.status,started_at:e.startedAt,pid:e.pid??null,pid_started_at:oi(e.pid,this.processControl),parent_task_id:e.parentTaskId??null,caller_agent_id:e.callerAgentId??null,trace_id:e.traceId??null,command:e.command??null,metadata:e.metadata??null,workflow_run_id:Ga(e.metadata),schedule_id:Xa(e.metadata),workspace_id:e.workspaceId??null,cwd:e.cwd??null,project_id:e.projectId??null,platform:e.platform??"cli",crewx_version:e.crewxVersion??null,thread_id:e.threadId??null,model:e.model??null,rendered_prompt:e.renderedPrompt??null,security_key:e.securityKey??null,coding_agent_command:e.codingAgentCommand??null,log_storage:"events"},i=u=>{n.db.insert(a).values(u).onConflictDoUpdate({target:a.id,set:{status:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN 'running' ELSE ${a.status} END`,pid:sql`COALESCE(excluded.pid, ${a.pid})`,pid_started_at:sql`CASE WHEN excluded.pid IS NULL THEN ${a.pid_started_at} ELSE excluded.pid_started_at END`,actor_kind:sql`CASE WHEN ${a.status} IN ('pending', 'running') AND ${a.pid} IS NULL AND ${a.actor_kind} IS NULL AND COALESCE(${a.run_epoch}, 0) = 0 THEN excluded.actor_kind ELSE ${a.actor_kind} END`,actor_id:sql`CASE WHEN ${a.status} IN ('pending', 'running') AND ${a.pid} IS NULL AND ${a.actor_kind} IS NULL AND COALESCE(${a.run_epoch}, 0) = 0 THEN excluded.actor_id ELSE ${a.actor_id} END`,command:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.command ELSE ${a.command} END`,metadata:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.metadata ELSE ${a.metadata} END`,workflow_run_id:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.workflow_run_id ELSE ${a.workflow_run_id} END`,schedule_id:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.schedule_id ELSE ${a.schedule_id} END`,workspace_id:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.workspace_id}, excluded.workspace_id) ELSE ${a.workspace_id} END`,cwd:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.cwd}, excluded.cwd) ELSE ${a.cwd} END`,project_id:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN COALESCE(${a.project_id}, excluded.project_id) ELSE ${a.project_id} END`,crewx_version:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.crewx_version ELSE ${a.crewx_version} END`,model:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.model ELSE ${a.model} END`,rendered_prompt:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.rendered_prompt ELSE ${a.rendered_prompt} END`,security_key:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.security_key ELSE ${a.security_key} END`,coding_agent_command:sql`CASE WHEN ${a.status} = 'pending' AND ${a.pid} IS NULL THEN excluded.coding_agent_command ELSE ${a.coding_agent_command} END`},setWhere:or$1(eq(a.status,"running"),and(eq(a.status,"pending"),isNull(a.pid)))}).run();};try{i(o);}catch(u){let d=u instanceof Error?u.message:typeof u=="object"&&u!==null&&"message"in u?String(u.message):String(u);if(!/log_storage|heartbeat_at|stop_requested_at|stop_requested_epoch|pid_started_at|cwd|actor_kind|actor_id/i.test(d)||!/no such column|no column named/i.test(d))throw u;let c=new Set(n.db.all("PRAGMA table_info(tasks)").map(yr=>yr.name)),l=c.has("cwd"),p=c.has("user_id"),g=c.has("actor_kind"),h=c.has("actor_id"),m=c.has("log_storage"),E=l?", cwd":"",S=l?", ?":"",D=l?", cwd = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.cwd, excluded.cwd) ELSE tasks.cwd END":"",y=m?", log_storage":"",x=m?", ?":"",I=p?", user_id":"",N=p?", ?":"",R=g?", actor_kind":"",j=g?", ?":"",ge=h?", actor_id":"",_t=h?", ?":"",et=m?`,
125
+ log_storage = CASE WHEN tasks.status = 'pending' THEN excluded.log_storage ELSE tasks.log_storage END`:"";n.runRaw(`INSERT INTO tasks (
126
+ id, agent_id, prompt, mode, status, started_at, pid,
127
+ parent_task_id, caller_agent_id, trace_id, command, metadata,
128
+ workspace_id${E}, project_id, platform, crewx_version, thread_id,
129
+ model, rendered_prompt, coding_agent_command${I}${R}${ge}${y}
130
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?${S}${N}${j}${_t}${x})
131
+ ON CONFLICT(id) DO UPDATE SET
132
+ status = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN 'running' ELSE tasks.status END,
133
+ pid = COALESCE(excluded.pid, tasks.pid),
134
+ command = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.command ELSE tasks.command END,
135
+ metadata = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.metadata ELSE tasks.metadata END,
136
+ workspace_id = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.workspace_id, excluded.workspace_id) ELSE tasks.workspace_id END${D},
137
+ project_id = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN COALESCE(tasks.project_id, excluded.project_id) ELSE tasks.project_id END,
138
+ crewx_version = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.crewx_version ELSE tasks.crewx_version END,
139
+ model = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.model ELSE tasks.model END,
140
+ rendered_prompt = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.rendered_prompt ELSE tasks.rendered_prompt END,
141
+ coding_agent_command = CASE WHEN tasks.status = 'pending' AND tasks.pid IS NULL THEN excluded.coding_agent_command ELSE tasks.coding_agent_command END${et}
142
+ WHERE tasks.status = 'running' OR (tasks.status = 'pending' AND tasks.pid IS NULL)`,[o.id,o.agent_id,o.prompt,o.mode,o.status,o.started_at,o.pid,o.parent_task_id,o.caller_agent_id,o.trace_id,o.command,o.metadata,o.workspace_id,...l?[o.cwd]:[],o.project_id,o.platform,o.crewx_version,o.thread_id,o.model,o.rendered_prompt,o.coding_agent_command,...p?[o.user_id]:[],...g?[o.actor_kind]:[],...h?[o.actor_id]:[],...m?[o.log_storage]:[]]);}r&&!s&&new qr({dbPath:this.resolveDbPath()}).recordAccepted({workspaceId:e.workspaceId,actorId:e.actorId,actorKind:e.actorKind,agentId:e.agentId});}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to start task",r)}finally{n.close();}}recordTaskPid(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=n.db.select({status:a.status,run_epoch:a.run_epoch}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!r||r.status!=="running"||W(r.run_epoch)!==W(e.runEpoch))return !1;let s=r.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,r.run_epoch);return n.db.update(a).set({pid:e.pid,pid_started_at:oi(e.pid,this.processControl)}).where(and(eq(a.id,e.id),eq(a.status,"running"),s)).run().changes>0}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to record task pid",r)}finally{n.close();}}updateTaskOwnership(e){if(!this.dbExists())return false;let n=this.openHandle(true);try{let r=n.db.select({status:a.status,run_epoch:a.run_epoch,metadata:a.metadata,model:a.model,rendered_prompt:a.rendered_prompt,security_key:a.security_key,coding_agent_command:a.coding_agent_command}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!r||r.status!=="running"||W(r.run_epoch)!==W(e.runEpoch))return !1;let s=p_(r.metadata,e.runtime?.metadata);if(s.ownership=e.ownership,e.ownership==="runner"&&e.providerPid!==void 0){s.providerPid=e.providerPid;let u=oi(e.providerPid,this.processControl);u!==null?s.providerPidStartedAt=u:delete s.providerPidStartedAt;}let o=r.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,r.run_epoch),i=n.db.update(a).set({metadata:JSON.stringify(s),model:cs(r.model,e.runtime?.model),rendered_prompt:cs(r.rendered_prompt,e.runtime?.renderedPrompt),security_key:cs(r.security_key,e.runtime?.securityKey),coding_agent_command:cs(r.coding_agent_command,e.runtime?.codingAgentCommand)}).where(and(eq(a.id,e.id),eq(a.status,"running"),o)).run();return i.changes>0&&W(e.runEpoch)>0&&n.db.update(a).set({stop_requested_at:null,stop_requested_epoch:null}).where(and(eq(a.id,e.id),eq(a.status,"running"),o,sql`${a.stop_requested_at} IS NOT NULL
143
+ AND COALESCE(${a.stop_requested_epoch}, 0) <> COALESCE(${a.run_epoch}, 0)`)).run(),i.changes>0}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to update task ownership",r)}finally{n.close();}}adoptPendingTask(e){let n=this.openHandle(true);try{return n.db.update(a).set({status:"running"}).where(and(eq(a.id,e),eq(a.status,"pending"),isNull(a.pid))).run().changes===1}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to adopt pending task",r)}finally{n.close();}}failPendingTask(e,n,r=new Date().toISOString()){let s=this.openHandle(true);try{return s.db.update(a).set({status:"failed",error:n,completed_at:r}).where(and(eq(a.id,e),eq(a.status,"pending"))).run().changes>0}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to fail pending task",o)}finally{s.close();}}stopPendingTask(e,n,r=new Date().toISOString(),s={}){let o=this.openHandle(true);try{let i=!1;return o.db.transaction(u=>{let d=u.select({metadata:a.metadata}).from(a).where(and(eq(a.id,e),eq(a.status,"pending"))).limit(1).get();if(!d)return;let c=si(oe(d.metadata),n),l={...c.metadata,stopMethod:"cooperative",stopRequest:ls(s,r)};i=u.update(a).set({status:"stopped",error:c.error,completed_at:r,metadata:JSON.stringify(l)}).where(and(eq(a.id,e),eq(a.status,"pending"))).run().changes===1;},{behavior:"immediate"}),i}catch(i){throw i instanceof f?i:new f("DB_ERROR","Failed to stop pending task",i)}finally{o.close();}}listTasksByProjectId(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.select(re).from(a).where(eq(a.project_id,e)).orderBy(desc(a.started_at)).all().map(Ve)}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to list tasks by project",r)}finally{n.close();}}finishTask(e){let n=this.openHandle(true),r,s;try{n.db.transaction(o=>{let i=o.select({status:a.status,run_epoch:a.run_epoch,stop_requested_at:a.stop_requested_at,stop_requested_epoch:a.stop_requested_epoch,started_at:a.started_at,duration_ms:a.duration_ms,result:a.result,exit_code:a.exit_code,error:a.error,metadata:a.metadata,model:a.model,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cached_input_tokens:a.cached_input_tokens,cost_usd:a.cost_usd}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!i)return;let u=W(i.run_epoch),d=W(e.runEpoch),c=i.status==="running"&&u===d,l=i.stop_requested_at!==null&&W(i.stop_requested_epoch)===u,p=c&&l,g=i.status==="stopped"&&u===d&&l,h=oe(i.metadata),m=Yt(h[or])?h[or]:{},E=String(d),S=c_(i),D=S&&u===d&&!ui(i)&&!Object.prototype.hasOwnProperty.call(m,E),y=S&&u===d&&!Object.prototype.hasOwnProperty.call(m,E),x=u>0||d>0||e.runEpoch!==void 0&&e.runEpoch!==null||e.usageComplete!==void 0||u!==d,I={},N;if(i.status!=="running"&&(r=i.status,s=e.result?.trim()||e.error?.trim()||`task:end status=${e.status}`),x&&(i.status==="running"||y)){N=oe(i.metadata);let R=Yt(N[ri])?{...N[ri]}:{},j=String(d),ge=Ku(e),_t=ar(R[j]);e.usageComplete!==void 0?R[j]={...ge,accounting:e.usagePresent===!0?e.usageComplete?"recorded":"partial":"unavailable"}:_t!==void 0?R[j]={...ge,accounting:_t}:R[j]=ge,N[ri]=R;let et=h_(R),yr=ci(et),Cc=Object.values(R).some(g_),Dc=Object.values(R).some(Pc=>ar(Pc)!==void 0);e.usageComplete!==void 0||Dc?(N[He]=Cc?"recorded":"unavailable",__(R)?N.usageIncomplete=!0:delete N.usageIncomplete):yr&&h[He]==="unavailable"?N[He]="recorded":i.status!=="running"&&!yr&&h[He]===void 0&&(N[He]="unavailable"),I.metadata=JSON.stringify(N),I.input_tokens=et.inputTokens,I.output_tokens=et.outputTokens,I.cached_input_tokens=et.cachedInputTokens,I.cost_usd=et.costUsd;}else if(c||D)if(c)I.input_tokens=pe(e.inputTokens??0),I.output_tokens=pe(e.outputTokens??0),I.cached_input_tokens=pe(e.cachedInputTokens??0),I.cost_usd=pe(e.costUsd??0);else {let R=Ku(e),j=e.usageComplete!==void 0?e.usagePresent===!0:ci(R);j&&(I.input_tokens=R.inputTokens,I.output_tokens=R.outputTokens,I.cached_input_tokens=R.cachedInputTokens,I.cost_usd=R.costUsd),N={...h};let ge=Yt(h[or])?{...h[or]}:{};ge[E]={at:e.completedAt},N[or]=ge,N[He]===void 0?N[He]=j?"recorded":"unavailable":j&&N[He]==="unavailable"&&(N[He]="recorded"),I.metadata=JSON.stringify(N);}if((c||D)&&e.model!==void 0&&e.model!==null&&(!D||i.model===null)&&(I.model=e.model),p){N??=oe(i.metadata);let R=si(N,e.error);N={...R.metadata,...e.partialResultRecovered===!0?{partialResultRecovered:!0}:{},stopMethod:ds(i.stop_requested_at,e.completedAt)},I.status="stopped",I.result=e.result??i.result,I.error=R.error,I.completed_at=e.completedAt,I.duration_ms=i.duration_ms??e.durationMs??ps(i.started_at,e.completedAt,void 0),I.exit_code=e.exitCode??i.exit_code,I.metadata=JSON.stringify(N);}else if(c)e.partialResultRecovered===!0&&(N??=oe(i.metadata),N.partialResultRecovered=!0,I.metadata=JSON.stringify(N)),I.status=e.status,I.result=e.result??null,I.error=e.error??null,I.completed_at=e.completedAt,I.duration_ms=u>0?ps(i.started_at,e.completedAt,e.durationMs):e.durationMs??null,I.exit_code=e.exitCode??null;else if(g){let R=!1;i.result===null&&e.result!==void 0&&e.result!==null&&(I.result=e.result,R=!0),i.exit_code===null&&e.exitCode!==void 0&&e.exitCode!==null&&(I.exit_code=e.exitCode),e.partialResultRecovered===!0&&(N??=oe(i.metadata),N.partialResultRecovered=!0,I.metadata=JSON.stringify(N)),R&&(r=void 0,s=void 0);}Object.keys(I).length>0&&o.update(a).set(I).where(eq(a.id,e.id)).run();},{behavior:"immediate"});}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to finish task",o)}finally{n.close();}if(r!==void 0){try{this.taskLogRepository.appendLog(e.id,{timestamp:e.completedAt,level:"late-result",message:s??`task:end status=${e.status}`});}catch(o){console.error(`[crewx] failed to preserve late task result for ${e.id}: ${o instanceof Error?o.message:String(o)}`);}process.stderr.write(`Task ${e.id} was already finalized (${r}); late result kept in task log
144
+ `);}}updateTaskLifecycle(e){let n=this.openHandle(true);try{let r=and(eq(a.id,e.id),eq(a.workspace_id,e.workspaceId)),s={status:e.status,error:e.error,completed_at:e.completedAt,duration_ms:e.durationMs};if(e.terminalReason){let o=n.db.select({metadata:a.metadata}).from(a).where(r).limit(1).get(),i=oe(o?.metadata??null);i.terminalReason=e.terminalReason,s.metadata=JSON.stringify(i);}n.db.update(a).set(s).where(r).run();}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to update task lifecycle",r)}finally{n.close();}}appendLog(e,n){this.taskLogRepository.appendLog(e,n);}appendLogs(e,n){this.taskLogRepository.appendLogs(e,n);}readLogs(e){return this.taskLogRepository.readLogs(e)}readLogsTail(e,n){return this.taskLogRepository.readLogsTail(e,n)}getLogState(e){return this.taskLogRepository.getLogState(e)}getRunningTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select(re).from(a).where(eq(a.status,"running")).orderBy(desc(a.started_at)).all().map(Ve)}catch(n){throw new f("DB_ERROR","Failed to get running tasks",n)}finally{e.close();}}getActiveTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select(re).from(a).where(inArray(a.status,["pending","running"])).orderBy(desc(a.started_at)).all().map(Ve)}catch(n){throw new f("DB_ERROR","Failed to get active tasks",n)}finally{e.close();}}getAllTasks(){if(!this.dbExists())return [];let e=this.openHandle(false);try{return e.db.select(re).from(a).orderBy(desc(a.started_at)).limit(100).all().map(Ve)}catch(n){throw new f("DB_ERROR","Failed to get all tasks",n)}finally{e.close();}}readTaskSecurityKey(e){if(!this.dbExists())return null;let n=this.openHandle(false);try{return n.db.select({security_key:a.security_key}).from(a).where(eq(a.id,e)).limit(1).get()?.security_key??null}catch(r){throw new f("DB_ERROR","Failed to read task security key",r)}finally{n.close();}}recordProviderInput(e){if(!this.dbExists())return false;let n=W(e.runEpoch);if(n===0&&e.interceptedRequest!==true)return false;let r=e.recordedAt??new Date(this.clock()).toISOString(),s=this.openHandle(true);try{let o=!1;return s.db.transaction(i=>{let u=i.select({run_epoch:a.run_epoch}).from(a).where(eq(a.id,e.id)).limit(1).get();if(!u||W(u.run_epoch)!==n)return;o=i.insert(lt).values({task_id:e.id,run_epoch:n,input:e.input,key_wrap_skipped:e.keyWrapSkipped?1:0,recorded_at:r}).onConflictDoNothing().run().changes>0;}),o}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to record provider input",o)}finally{s.close();}}listProviderInputEpochs(e,n={}){if(!this.dbExists())return [];let r=this.openHandle(false);try{let s=r.db.select({run_epoch:a.run_epoch}).from(a).where(eq(a.id,e)).limit(1).get();if(!s)return [];let o=W(s.run_epoch),i=r.db.select({run_epoch:lt.run_epoch,key_wrap_skipped:lt.key_wrap_skipped}).from(lt).where(eq(lt.task_id,e)).all(),u=new Map(i.map(c=>[c.run_epoch,c])),d=[];for(let c=1;c<=o;c++){let l=u.get(c);l?d.push({runEpoch:c,available:!0,...l.key_wrap_skipped===1?{keyWrapSkipped:!0}:{}}):d.push({runEpoch:c,available:!1,reason:n.archivedRunEpochs?.has(c)?"pruned":"absent"});}return d}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to list provider inputs",s)}finally{r.close();}}readProviderInput(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{let s=r.db.select().from(lt).where(and(eq(lt.task_id,e),eq(lt.run_epoch,W(n)))).limit(1).get();return s?{runEpoch:s.run_epoch,input:s.input,keyWrapSkipped:s.key_wrap_skipped===1,recordedAt:s.recorded_at}:void 0}catch(s){throw new f("DB_ERROR","Failed to read provider input",s)}finally{r.close();}}getTask(e){if(!this.dbExists())return;let n=this.openHandle(false);try{let r=n.db.select(re).from(a).where(eq(a.id,e)).limit(1).get();return r?Ve(r):void 0}catch(r){throw new f("DB_ERROR","Failed to get task",r)}finally{n.close();}}async killTask(e){let n=await this.stopTask(e);return n.status==="stopped"?{status:"terminated",killed:n.method==="forced"||n.method==="cooperative",...n.pid?{pid:n.pid}:{}}:n.status==="not_running"?{status:"not_running",killed:false,...n.pid?{pid:n.pid}:{},...n.error?{error:n.error}:{}}:{status:"failed",killed:false,...n.pid?{pid:n.pid}:{},...n.error?{error:n.error}:{}}}reapOrphanedTasks(e={}){return this.orphanReapInFlight===void 0&&(this.orphanReapInFlight=this.runOrphanReaperPass(e).finally(()=>{this.orphanReapInFlight=void 0;})),this.orphanReapInFlight}async runOrphanReaperPass(e){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let r=n.db.select({id:a.id,status:a.status,pid:a.pid,pid_started_at:a.pid_started_at,platform:a.platform,run_epoch:a.run_epoch,heartbeat_at:a.heartbeat_at,started_at:a.started_at,metadata:a.metadata,model:a.model,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cached_input_tokens:a.cached_input_tokens,cost_usd:a.cost_usd}).from(a).where(or$1(eq(a.status,"running"),eq(a.status,"pending"))).all(),s=this.clock(),o=Math.max(1,Math.trunc(e.tickIntervalMs??Zu)),i=this.lastReaperTickAt,u=i===void 0?Number.POSITIVE_INFINITY:s-i,d=i!==void 0&&u>=0&&u<=o*2;this.lastReaperTickAt=s;let c=yn(),l=as(),p=new Date(s-Qu).toISOString(),g=new Date(s).toISOString(),h=new Set,m=[],E=0,S=(y,x)=>{let I=oe(di(y.metadata,"runner_lost")),N=typeof I.provider=="string"?I.provider:void 0,R;try{R=os({taskLogRepository:this.taskLogRepository,taskId:y.id,provider:N,model:y.model})?.usage;}catch{}let j={status:"failed",error:x,completed_at:g};R?(j.input_tokens=R.inputTokens,j.output_tokens=R.outputTokens,j.cached_input_tokens=R.cachedInputTokens,j.cost_usd=R.costUsd,y.model===null&&R.model!==null&&(j.model=R.model),I[He]="recorded"):!ui(y)&&I[He]!=="recorded"&&(I[He]="unavailable"),j.metadata=JSON.stringify(I);let ge=y.run_epoch===null?isNull(a.run_epoch):eq(a.run_epoch,y.run_epoch),_t=y.heartbeat_at===null?isNull(a.heartbeat_at):eq(a.heartbeat_at,y.heartbeat_at),et=n.db.update(a).set(j).where(and(eq(a.id,y.id),eq(a.status,"running"),ge,_t)).run();return et.changes>0&&E++,et.changes>0};for(let y of r){if(y.status==="pending"){if(y.pid!==null||y.started_at>=p)continue;let R=di(y.metadata,"launch_failed");n.db.update(a).set({status:"failed",error:"Reaped: runner never adopted task (pending timeout)",completed_at:g,metadata:R}).where(and(eq(a.id,y.id),eq(a.status,"pending"),isNull(a.pid),lt$1(a.started_at,p))).run().changes>0&&E++;continue}if(d_.has(y.platform??"cli"))continue;if(y.pid===null){let R=`${y.id}:${y.run_epoch??0}`;h.add(R);let j=this.pidNullObservedSince.get(R);if(j===void 0){this.pidNullObservedSince.set(R,s);continue}s-j>=li&&S(y,"Reaped: pid never recorded after resume (stale running_instruction)")&&this.pidNullObservedSince.delete(R);continue}if(y.heartbeat_at===null){Et(y.pid,this.processControl.kill)==="not_found"&&S(y,"Reaped: process not found (orphaned task)");continue}let x=Date.parse(y.heartbeat_at),I=Number.isFinite(x)?s-x:Number.POSITIVE_INFINITY;if(I<=c)continue;let N=zo(y).filter(R=>Et(R.pid,this.processControl.kill)!=="not_found");N.length===0?S(y,"Reaped: process not found (orphaned task)"):I>l&&d&&m.push({row:y,targets:N});}let D=new Map;for(let y of m){let{row:x,targets:I}=y,N=n.db.select({status:a.status,run_epoch:a.run_epoch,heartbeat_at:a.heartbeat_at}).from(a).where(eq(a.id,x.id)).get();if(!N||N.status!=="running"||W(N.run_epoch)!==W(x.run_epoch)||N.heartbeat_at!==x.heartbeat_at)continue;let R=await this.judgeRecordedTargets(x,I);if(R.unproven!==void 0){console.warn("[crewx] reaper left running task",{taskId:x.id,reason:R.unproven});continue}if(R.owned.length>0){let j=await this.terminateRecordedProcesses(R.owned,D);if(j!==void 0){console.warn("[crewx] reaper left running task",{taskId:x.id,reason:j});continue}}S(x,"Reaped: heartbeat stale beyond hard limit (orphaned task)")&&R.reused.length>0&&console.warn("[crewx] reaper reaped task whose recorded pid was reused",{taskId:x.id,reason:R.reused.join("; ")});}for(let y of Array.from(this.pidNullObservedSince.keys()))h.has(y)||this.pidNullObservedSince.delete(y);return E}finally{n.close();}}async judgeRecordedTargets(e,n){let r=e.heartbeat_at===null?Number.NaN:Date.parse(e.heartbeat_at),s=Number.isFinite(r)?r+er()+Hr:void 0,o=[],i=[];for(let u of n){let d=await Ko(u,{processControlOptions:this.processControl,legacyStartBoundaryMs:s});if(d.verdict==="owned")o.push(u);else if(d.verdict==="reused")i.push(`pid ${u.pid} reused (${d.reason})`);else return {owned:o,reused:i,unproven:`pid ${u.pid} not proven owned (${d.ownership}): ${d.reason}`}}return {owned:o,reused:i}}async terminateRecordedProcesses(e,n){for(let r of e){if(!n.has(r.pid)){let s;try{s=(await St(r.pid,{...this.processControl,signal:Rt})).status==="failed"?"failed":"terminated";}catch{s="failed";}n.set(r.pid,s);}if(n.get(r.pid)==="failed")return `pid ${r.pid} termination not confirmed`;if(Et(r.pid,this.processControl.kill)!=="not_found")return `pid ${r.pid} still alive after termination`}}reapRunningWorkflowTasks(e=li){if(!this.dbExists())return 0;let n=this.openHandle(true);try{let r=new Date(Date.now()-e).toISOString(),s=and(eq(a.status,"running"),eq(a.platform,"workflow"),isNull(a.pid),lt$1(a.started_at,r),or$1(isNull(a.metadata),ju())),o=n.db.select({id:a.id,metadata:a.metadata}).from(a).where(s).all(),i=new Date().toISOString(),u=0;for(let d of o){let c=oe(d.metadata);c.terminalReason="runner_lost";let l=n.db.update(a).set({status:"failed",error:"Reaped: stale workflow run (finally not executed)",completed_at:i,metadata:JSON.stringify(c)}).where(and(eq(a.id,d.id),eq(a.status,"running"))).run();u+=l.changes??0;}return u}finally{n.close();}}findTaskStatus(e,n){let r=this.resolveDbPaths();for(let s of r){if(!existsSync(s))continue;let o=$(s);try{let i=n?eq(a.workspace_id,n):void 0,u=i?and(eq(a.id,e),i):eq(a.id,e),d=o.db.select(re).from(a).where(u).limit(1).get()??void 0;if(!d){let c=i?and(eq(a.thread_id,e),i):eq(a.thread_id,e);d=o.db.select(re).from(a).where(c).orderBy(desc(a.started_at)).limit(1).get()??void 0;}if(d)return Ve(d)}catch(i){throw new f("DB_ERROR","Failed to find task status",i)}finally{o.close();}}}findChildTasks(e,n){let r=this.resolveDbPaths(),s=new Set,o=[];for(let i of r){if(!existsSync(i))continue;let u=$(i);try{let d=n?and(eq(a.parent_task_id,e),eq(a.workspace_id,n)):eq(a.parent_task_id,e),c=u.db.select(re).from(a).where(d).orderBy(asc(a.started_at)).all();for(let l of c)s.has(l.id)||(s.add(l.id),o.push(Ve(l)));}catch(d){throw new f("DB_ERROR","Failed to find child tasks",d)}finally{u.close();}}return o}getWorkspaceUsageSummary(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{return n.db.all(e?sql`
17
145
  SELECT
18
146
  COALESCE(workspace_id, 'unknown') AS workspace_id,
19
147
  COALESCE(SUM(input_tokens), 0) AS input_tokens,
@@ -21,7 +149,7 @@ ${n.join(`
21
149
  COALESCE(SUM(cost_usd), 0) AS cost_usd,
22
150
  COUNT(*) AS task_count
23
151
  FROM tasks
24
- WHERE workspace_id = ${t}
152
+ WHERE workspace_id = ${e}
25
153
  GROUP BY workspace_id
26
154
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
27
155
  `:sql`
@@ -34,103 +162,45 @@ ${n.join(`
34
162
  FROM tasks
35
163
  GROUP BY workspace_id
36
164
  ORDER BY (COALESCE(SUM(input_tokens), 0) + COALESCE(SUM(output_tokens), 0)) DESC
37
- `)}catch(n){throw new _("DB_ERROR","Failed to get workspace usage summary",n)}finally{e.close();}}getThreadTokenUsage(t,e){let n=this.resolveDbPaths(),s=new Set,o=0,i=0,a=0;for(let c of n){if(!existsSync(c))continue;let l=R(c);try{let u=or(eq(r.thread_id,t),and(isNull(r.thread_id),like(r.command,`%--thread=${t}%`))),f=e?and(u,eq(r.workspace_id,e)):u,m=l.db.select({id:r.id,input_tokens:r.input_tokens,output_tokens:r.output_tokens,cost_usd:r.cost_usd}).from(r).where(f).all();for(let T of m)s.has(T.id)||(s.add(T.id),o+=T.input_tokens??0,i+=T.output_tokens??0,a+=T.cost_usd??0);}catch(u){throw new _("DB_ERROR","Failed to get thread token usage",u)}finally{l.close();}}return {inputTokens:o,outputTokens:i,costUsd:a}}findTasksByThread(t,e){let n=this.resolveDbPaths(),s=new Set,o=[];for(let i of n){if(!existsSync(i))continue;let a=R(i);try{let c=or(eq(r.thread_id,t),and(isNull(r.thread_id),like(r.command,`%--thread=${t}%`))),l=e?and(c,eq(r.workspace_id,e)):c,u=a.db.select().from(r).where(l).orderBy(asc(r.started_at)).all();for(let f of u)s.has(f.id)||(s.add(f.id),o.push(f));}catch(c){throw new _("DB_ERROR","Failed to find tasks by thread",c)}finally{a.close();}}return o}findAllTasks(t){if(!this.dbExists())return {rows:[],total:0};let e=this.openHandle(false);try{let n=[];t.workspaceId&&n.push(eq(r.workspace_id,t.workspaceId));let s=t.agents&&t.agents.length>0?t.agents:t.agentId?[t.agentId]:null;s&&n.push(inArray(r.agent_id,s));let o=t.statuses&&t.statuses.length>0?t.statuses:t.status?[t.status]:null;o&&n.push(inArray(r.status,o));let i=t.q??t.search;i&&n.push(like(r.prompt,`%${i}%`)),t.from&&n.push(gte(r.started_at,t.from)),t.to&&n.push(lt$1(r.started_at,t.to));let a=n.length>0?and(...n):void 0,c=e.db.select({count:sql`count(*)`}).from(r).where(a).get(),l=(t.sortDir??"DESC")==="ASC"?asc(r.started_at):desc(r.started_at);return {rows:e.db.select().from(r).where(a).orderBy(l).limit(t.limit).offset(t.offset).all(),total:c?.count??0}}catch(n){throw new _("DB_ERROR","Failed to find all tasks",n)}finally{e.close();}}getAgentUsage(t,e,n){if(!this.dbExists())return [];let s=this.openHandle(false);try{return s.db.all(n?sql`
38
- SELECT
39
- t.agent_id,
40
- t.workspace_id,
41
- COUNT(*) AS total_tasks,
42
- COALESCE(SUM(
43
- COALESCE(t.input_tokens, 0)
44
- + CASE
45
- WHEN t.started_at >= ${B}
46
- AND (
47
- t.crewx_version IS NULL
48
- OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
49
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${z}) AS INTEGER) < ${q})
50
- )
51
- THEN COALESCE(t.cached_input_tokens, 0)
52
- ELSE 0
53
- END
54
- ), 0) AS input_tokens,
55
- COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
56
- COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
57
- COALESCE(SUM(t.cost_usd), 0) AS cost_usd
58
- FROM tasks t
59
- WHERE t.status IN ('completed', 'success')
60
- AND t.started_at >= ${t}
61
- AND t.started_at < ${e}
62
- AND t.workspace_id = ${n}
63
- GROUP BY t.agent_id, t.workspace_id
64
- ORDER BY (
65
- COALESCE(SUM(
66
- COALESCE(t.input_tokens, 0)
67
- + CASE
68
- WHEN t.started_at >= ${B}
69
- AND (
70
- t.crewx_version IS NULL
71
- OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
72
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${z}) AS INTEGER) < ${q})
73
- )
74
- THEN COALESCE(t.cached_input_tokens, 0)
75
- ELSE 0
76
- END
77
- ), 0)
78
- + COALESCE(SUM(t.output_tokens), 0)
79
- ) DESC
80
- `:sql`
81
- SELECT
82
- t.agent_id,
83
- t.workspace_id,
84
- COUNT(*) AS total_tasks,
85
- COALESCE(SUM(
86
- COALESCE(t.input_tokens, 0)
87
- + CASE
88
- WHEN t.started_at >= ${B}
89
- AND (
90
- t.crewx_version IS NULL
91
- OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
92
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${z}) AS INTEGER) < ${q})
93
- )
94
- THEN COALESCE(t.cached_input_tokens, 0)
95
- ELSE 0
96
- END
97
- ), 0) AS input_tokens,
98
- COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
99
- COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
100
- COALESCE(SUM(t.cost_usd), 0) AS cost_usd
101
- FROM tasks t
102
- WHERE t.status IN ('completed', 'success')
103
- AND t.started_at >= ${t}
104
- AND t.started_at < ${e}
105
- GROUP BY t.agent_id, t.workspace_id
106
- ORDER BY (
107
- COALESCE(SUM(
108
- COALESCE(t.input_tokens, 0)
109
- + CASE
110
- WHEN t.started_at >= ${B}
111
- AND (
112
- t.crewx_version IS NULL
113
- OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
114
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${z}) AS INTEGER) < ${q})
115
- )
116
- THEN COALESCE(t.cached_input_tokens, 0)
117
- ELSE 0
118
- END
119
- ), 0)
120
- + COALESCE(SUM(t.output_tokens), 0)
121
- ) DESC
122
- `).map(i=>({agentId:i.agent_id,workspaceId:i.workspace_id??null,totalTasks:i.total_tasks,inputTokens:i.input_tokens,outputTokens:i.output_tokens,cachedInputTokens:i.cached_input_tokens,costUsd:i.cost_usd,totalTokens:i.input_tokens+i.output_tokens}))}catch(o){throw new _("DB_ERROR","Failed to get agent usage",o)}finally{s.close();}}getAgentUsageTrendRaw(t,e,n){if(!this.dbExists())return [];let s=this.openHandle(false);try{return s.db.all(n?sql`
165
+ `)}catch(r){throw new f("DB_ERROR","Failed to get workspace usage summary",r)}finally{n.close();}}getThreadTokenUsage(e,n){let r=this.resolveDbPaths(),s=new Set,o=0,i=0,u=0;for(let d of r){if(!existsSync(d))continue;let c=$(d);try{let l=eq(a.thread_id,e),p=n?and(l,eq(a.workspace_id,n)):l,g=c.db.select({id:a.id,input_tokens:a.input_tokens,output_tokens:a.output_tokens,cost_usd:a.cost_usd}).from(a).where(p).all();for(let h of g)s.has(h.id)||(s.add(h.id),o+=h.input_tokens??0,i+=h.output_tokens??0,u+=h.cost_usd??0);}catch(l){throw new f("DB_ERROR","Failed to get thread token usage",l)}finally{c.close();}}return {inputTokens:o,outputTokens:i,costUsd:u}}findTasksByThread(e,n,r){let s=this.resolveDbPaths(),o=new Set,i=[],u=r?.projection==="activity-log";for(let d of s){if(!existsSync(d))continue;let c=$(d);try{let l=eq(a.thread_id,e),p=n?and(l,eq(a.workspace_id,n)):l,g=u?c.db.select({id:a.id,thread_id:a.thread_id,agent_id:a.agent_id,parent_task_id:a.parent_task_id,started_at:a.started_at,completed_at:a.completed_at}).from(a).where(p).orderBy(asc(a.started_at)).all():c.db.select(re).from(a).where(p).orderBy(asc(a.started_at)).all().map(Ve);for(let h of g)o.has(h.id)||(o.add(h.id),i.push(h));}catch(l){throw new f("DB_ERROR","Failed to find tasks by thread",l)}finally{c.close();}}return i}parseWorkflowCardMetadata(e){if(!e)return {};try{let n=JSON.parse(e);return {kind:typeof n.kind=="string"?n.kind:void 0,workflowRunId:typeof n.workflowRunId=="string"?n.workflowRunId:void 0}}catch{return {}}}extractThreadIdFromCommand(e){return e?/--thread=(\S+)/.exec(e)?.[1]??null:null}findRunningWorkflowParentTasks(){if(!this.dbExists())return [];let e=[];for(let n of this.resolveDbPaths()){if(!existsSync(n))continue;let r=$(n);try{e.push(...r.db.select({id:a.id,agent_id:a.agent_id,thread_id:a.thread_id,workspace_id:a.workspace_id,platform:a.platform,status:a.status,error:a.error,completed_at:a.completed_at,duration_ms:a.duration_ms,started_at:a.started_at,metadata:a.metadata}).from(a).where(and(eq(a.platform,"workflow"),inArray(a.status,["running","pending"]),ei())).orderBy(desc(a.started_at)).all().map(Zo));}catch(s){throw new f("DB_ERROR","Failed to find workflow parent tasks",s)}finally{r.close();}}return e}findWorkflowParentTasksByWorkspace(e){let n=[],r=new Map;for(let s of this.resolveDbPaths()){if(!existsSync(s))continue;let o=$(s);try{let i=o.db.select({id:a.id,agent_id:a.agent_id,thread_id:a.thread_id,workspace_id:a.workspace_id,platform:a.platform,status:a.status,error:a.error,completed_at:a.completed_at,duration_ms:a.duration_ms,started_at:a.started_at,metadata:a.metadata}).from(a).where(and(eq(a.platform,"workflow"),eq(a.workspace_id,e))).orderBy(desc(a.started_at),desc(a.id)).all();for(let u of i){let d=this.parseWorkflowCardMetadata(u.metadata);if(!qn(d.kind)||typeof d.workflowRunId!="string")continue;let c=d.kind,l=r.get(c)??new Set;l.has(d.workflowRunId)||(l.add(d.workflowRunId),r.set(c,l),n.push(Zo(u)));}}catch(i){throw new f("DB_ERROR","Failed to find workflow parent tasks by workspace",i)}finally{o.close();}}return n}findWorkflowParentTask(e){if(this.dbExists())for(let n of this.resolveDbPaths()){if(!existsSync(n))continue;let r=$(n);try{let s=r.db.select({id:a.id,agent_id:a.agent_id,thread_id:a.thread_id,workspace_id:a.workspace_id,platform:a.platform,status:a.status,error:a.error,completed_at:a.completed_at,duration_ms:a.duration_ms,started_at:a.started_at,metadata:a.metadata}).from(a).where(and(eq(a.platform,"workflow"),eq(a.workspace_id,e.workspaceId))).orderBy(desc(a.started_at),desc(a.id)).all();for(let o of s){let i=this.parseWorkflowCardMetadata(o.metadata);if(i.kind===e.kind&&i.workflowRunId===e.workflowRunId)return Zo(o)}}catch(s){throw new f("DB_ERROR","Failed to find workflow parent task",s)}finally{r.close();}}}batchFetchWorkflowCards(e,n){let r=new Map;if(e.length===0)return r;let s=new Set(e),o=new Map,i=n?eq(a.workspace_id,n):void 0,u=(d,c)=>{if(!d)return;let l=o.get(d);if(l&&c.started_at<=l)return;let p=this.parseWorkflowCardMetadata(c.metadata);qn(p.kind)&&(o.set(d,c.started_at),r.set(d,{taskId:c.id,workflowRunId:p.workflowRunId,raw:c.result??void 0}));};for(let d of this.resolveDbPaths()){if(!existsSync(d))continue;let c=$(d);try{let l=and(inArray(a.thread_id,e),ei()),p=c.db.select({id:a.id,thread_id:a.thread_id,metadata:a.metadata,result:a.result,started_at:a.started_at}).from(a).where(i?and(l,i):l).all();for(let m of p)u(m.thread_id,m);let g=and(isNull(a.thread_id),ei()),h=c.db.select({id:a.id,command:a.command,metadata:a.metadata,result:a.result,started_at:a.started_at}).from(a).where(i?and(g,i):g).all();for(let m of h){let E=this.extractThreadIdFromCommand(m.command);!E||!s.has(E)||u(E,m);}}catch(l){throw new f("DB_ERROR","Failed to batch fetch workflow cards",l)}finally{c.close();}}return r}findAllTasks(e){if(!this.dbExists())return {rows:[],total:0};let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(eq(a.workspace_id,e.workspaceId));let s=e.agents&&e.agents.length>0?e.agents:e.agentId?[e.agentId]:null;s&&r.push(inArray(a.agent_id,s));let o=e.statuses&&e.statuses.length>0?e.statuses:e.status?[e.status]:null;o&&r.push(inArray(a.status,Po(o)));let i=e.q??e.search;i&&r.push(like(a.prompt,`%${i}%`)),e.from&&r.push(gte(a.started_at,e.from)),e.to&&r.push(lt$1(a.started_at,e.to));let u=r.length>0?and(...r):void 0,d=n.db.select({count:sql`count(*)`}).from(a).where(u).get(),c=(e.sortDir??"DESC")==="ASC"?asc(a.started_at):desc(a.started_at);return {rows:n.db.select(re).from(a).where(u).orderBy(c).limit(e.limit).offset(e.offset).all().map(Ve),total:d?.count??0}}catch(r){throw new f("DB_ERROR","Failed to find all tasks",r)}finally{n.close();}}getAgentUsage(e,n,r){if(!this.dbExists())return [];let s=this.openHandle(false);try{let o=ni(sql.raw("t.model"),sql.raw("t.metadata")),i=ir(sql.raw("t.status")),u=us(sql.raw("t.metadata")),d=sql`
166
+ COALESCE(t.input_tokens, 0)
167
+ + CASE
168
+ WHEN t.started_at >= ${wn}
169
+ AND (
170
+ t.crewx_version IS NULL
171
+ OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
172
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${En}) AS INTEGER) < ${Rn})
173
+ )
174
+ THEN COALESCE(t.cached_input_tokens, 0)
175
+ ELSE 0
176
+ END
177
+ `,c=r?sql`WHERE ${i} AND t.started_at >= ${e} AND t.started_at < ${n} AND t.workspace_id = ${r} AND t.agent_id != 'workflow'`:sql`WHERE ${i} AND t.started_at >= ${e} AND t.started_at < ${n} AND t.agent_id != 'workflow'`,l=s.db.all(sql`
178
+ SELECT
179
+ t.agent_id,
180
+ t.workspace_id,
181
+ ${o} AS provider,
182
+ COUNT(*) AS total_tasks,
183
+ ${u} AS unavailable_task_count,
184
+ COALESCE(SUM(${d}), 0) AS input_tokens,
185
+ COALESCE(SUM(t.output_tokens), 0) AS output_tokens,
186
+ COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
187
+ COALESCE(SUM(t.cost_usd), 0) AS cost_usd
188
+ FROM tasks t
189
+ ${c}
190
+ GROUP BY t.agent_id, t.workspace_id, ${o}
191
+ `),p=new Map;for(let m of l){let E=typeof m.provider=="string"&&m.provider.trim()!==""?m.provider:"unknown",S={provider:E,inputTokens:m.input_tokens,outputTokens:m.output_tokens,cachedInputTokens:m.cached_input_tokens,totalTokens:m.input_tokens+m.output_tokens,costUsd:m.cost_usd,totalTasks:m.total_tasks,unavailableTaskCount:m.unavailable_task_count},D=m.workspace_id??null,y=JSON.stringify([m.agent_id,D]),x=p.get(y);if(!x){p.set(y,{agentId:m.agent_id,workspaceId:D,totalTasks:m.total_tasks,unavailableTaskCount:m.unavailable_task_count,inputTokens:m.input_tokens,outputTokens:m.output_tokens,cachedInputTokens:m.cached_input_tokens,costUsd:m.cost_usd,totalTokens:m.input_tokens+m.output_tokens,providers:[S]});continue}x.totalTasks+=m.total_tasks,x.unavailableTaskCount=(x.unavailableTaskCount??0)+m.unavailable_task_count,x.inputTokens+=m.input_tokens,x.outputTokens+=m.output_tokens,x.cachedInputTokens+=m.cached_input_tokens,x.costUsd+=m.cost_usd,x.totalTokens+=m.input_tokens+m.output_tokens;let I=x.providers.find(N=>N.provider===E);I?(I.inputTokens+=S.inputTokens,I.outputTokens+=S.outputTokens,I.cachedInputTokens+=S.cachedInputTokens,I.totalTokens+=S.totalTokens,I.costUsd+=S.costUsd,I.totalTasks+=S.totalTasks,I.unavailableTaskCount+=S.unavailableTaskCount):x.providers.push(S);}let g=[...p.values()];for(let m of g)m.providers.sort((E,S)=>E.provider===S.provider?0:E.provider==="unknown"?1:S.provider==="unknown"?-1:E.totalTokens!==S.totalTokens?S.totalTokens-E.totalTokens:E.provider<S.provider?-1:1);let h=(m,E)=>m===E?0:m<E?-1:1;return g.sort((m,E)=>{if(m.totalTokens!==E.totalTokens)return E.totalTokens-m.totalTokens;let S=h(m.agentId,E.agentId);return S!==0?S:m.workspaceId===E.workspaceId?0:m.workspaceId===null?1:E.workspaceId===null?-1:h(m.workspaceId,E.workspaceId)}),g}catch(o){throw new f("DB_ERROR","Failed to get agent usage",o)}finally{s.close();}}getAgentUsageTrendRaw(e,n,r){if(!this.dbExists())return [];let s=this.openHandle(false);try{let o=ir(sql.raw("t.status")),i=us(sql.raw("t.metadata"));return s.db.all(r?sql`
123
192
  SELECT
124
193
  date(t.started_at) AS date,
125
194
  t.agent_id,
195
+ ${i} AS unavailable_task_count,
126
196
  COALESCE(SUM(
127
197
  COALESCE(t.input_tokens, 0)
128
198
  + CASE
129
- WHEN t.started_at >= ${B}
199
+ WHEN t.started_at >= ${wn}
130
200
  AND (
131
201
  t.crewx_version IS NULL
132
202
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
133
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${z}) AS INTEGER) < ${q})
203
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${En}) AS INTEGER) < ${Rn})
134
204
  )
135
205
  THEN COALESCE(t.cached_input_tokens, 0)
136
206
  ELSE 0
@@ -140,24 +210,26 @@ ${n.join(`
140
210
  COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
141
211
  COALESCE(SUM(t.cost_usd), 0) AS cost_usd
142
212
  FROM tasks t
143
- WHERE t.status IN ('completed', 'success')
144
- AND t.started_at >= ${t}
145
- AND t.started_at < ${e}
146
- AND t.workspace_id = ${n}
213
+ WHERE ${o}
214
+ AND t.started_at >= ${e}
215
+ AND t.started_at < ${n}
216
+ AND t.workspace_id = ${r}
217
+ AND t.agent_id != 'workflow'
147
218
  GROUP BY date(t.started_at), t.agent_id
148
219
  ORDER BY date(t.started_at) ASC
149
220
  `:sql`
150
221
  SELECT
151
222
  date(t.started_at) AS date,
152
223
  t.agent_id,
224
+ ${i} AS unavailable_task_count,
153
225
  COALESCE(SUM(
154
226
  COALESCE(t.input_tokens, 0)
155
227
  + CASE
156
- WHEN t.started_at >= ${B}
228
+ WHEN t.started_at >= ${wn}
157
229
  AND (
158
230
  t.crewx_version IS NULL
159
231
  OR (t.crewx_version LIKE '0.8.%' AND t.crewx_version NOT LIKE '0.8.9%')
160
- OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${z}) AS INTEGER) < ${q})
232
+ OR (t.crewx_version LIKE '0.8.9-rc.%' AND CAST(SUBSTR(t.crewx_version, ${En}) AS INTEGER) < ${Rn})
161
233
  )
162
234
  THEN COALESCE(t.cached_input_tokens, 0)
163
235
  ELSE 0
@@ -167,152 +239,398 @@ ${n.join(`
167
239
  COALESCE(SUM(t.cached_input_tokens), 0) AS cached_input_tokens,
168
240
  COALESCE(SUM(t.cost_usd), 0) AS cost_usd
169
241
  FROM tasks t
170
- WHERE t.status IN ('completed', 'success')
171
- AND t.started_at >= ${t}
172
- AND t.started_at < ${e}
242
+ WHERE ${o}
243
+ AND t.started_at >= ${e}
244
+ AND t.started_at < ${n}
245
+ AND t.agent_id != 'workflow'
173
246
  GROUP BY date(t.started_at), t.agent_id
174
247
  ORDER BY date(t.started_at) ASC
175
- `).map(i=>({date:i.date,agentId:i.agent_id,inputTokens:i.input_tokens,outputTokens:i.output_tokens,cachedInputTokens:i.cached_input_tokens,costUsd:i.cost_usd,totalTokens:i.input_tokens+i.output_tokens}))}catch(o){throw new _("DB_ERROR","Failed to get agent usage trend",o)}finally{s.close();}}findTaskForStop(t,e){if(!this.dbExists())return;let n=this.openHandle(false);try{return n.db.select().from(r).where(and(eq(r.id,t),eq(r.workspace_id,e))).limit(1).get()??void 0}catch(s){throw new _("DB_ERROR","Failed to find task for stop",s)}finally{n.close();}}markTaskFailed(t,e,n){if(!this.dbExists())return;let s=this.openHandle(true);try{let o=new Date().toISOString(),i=n?and(eq(r.id,t),eq(r.status,"running"),eq(r.workspace_id,n)):and(eq(r.id,t),eq(r.status,"running"));s.db.update(r).set({status:"failed",error:e,completed_at:o}).where(i).run();}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to mark task failed",o)}finally{s.close();}}findTasksByPromptHint(t,e){let n=this.resolveDbPaths(),s=new Set,o=[];for(let i of n){if(!existsSync(i))continue;let a=R(i);try{let c=e?and(like(r.prompt,`%${t}%`),eq(r.workspace_id,e)):like(r.prompt,`%${t}%`),l=a.db.select().from(r).where(c).orderBy(asc(r.started_at)).all();for(let u of l)s.has(u.id)||(s.add(u.id),o.push(u));}catch(c){throw new _("DB_ERROR","Failed to find tasks by prompt hint",c)}finally{a.close();}}return o}getProviderUsage(t,e,n){if(!this.dbExists())return [];let s=this.openHandle(false);try{let o=sql`
176
- CASE
177
- WHEN ${r.model} LIKE 'claude-%' OR ${r.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
178
- WHEN ${r.model} LIKE 'gpt-%' OR ${r.model} LIKE 'codex-%' THEN 'codex'
179
- WHEN ${r.model} LIKE 'gemini-%' THEN 'gemini'
180
- WHEN ${r.model} LIKE 'zai-%' OR ${r.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
181
- WHEN ${r.model} LIKE 'minimax/%' THEN 'minimax'
182
- WHEN ${r.model} LIKE 'qwen%' THEN 'qwen'
183
- ELSE 'unknown'
184
- END
185
- `,i=sql`
186
- COALESCE(${r.input_tokens}, 0)
248
+ `).map(d=>({date:d.date,agentId:d.agent_id,unavailableTaskCount:d.unavailable_task_count,inputTokens:d.input_tokens,outputTokens:d.output_tokens,cachedInputTokens:d.cached_input_tokens,costUsd:d.cost_usd,totalTokens:d.input_tokens+d.output_tokens}))}catch(o){throw new f("DB_ERROR","Failed to get agent usage trend",o)}finally{s.close();}}findTaskForStop(e,n){if(!this.dbExists())return;let r=this.openHandle(false);try{let s=r.db.select(re).from(a).where(and(eq(a.id,e),eq(a.workspace_id,n))).limit(1).get();return s?Ve(s):void 0}catch(s){throw new f("DB_ERROR","Failed to find task for stop",s)}finally{r.close();}}findLatestTaskByMetadata(e){if(!this.dbExists())return null;let n=this.openHandle(false);try{return n.db.select({id:a.id,thread_id:a.thread_id,status:a.status,result:a.result,error:a.error,started_at:a.started_at,completed_at:a.completed_at,metadata:a.metadata}).from(a).where(and(eq(a.agent_id,e.agentId),eq(a.workspace_id,e.workspaceId),sql`${a.metadata} IS NOT NULL AND json_valid(${a.metadata}) AND json_extract(${a.metadata}, '$.' || ${e.metaKey}) = ${e.metaValue}`)).orderBy(desc(a.started_at)).limit(1).get()??null}catch(r){throw new f("DB_ERROR","Failed to find latest task by metadata",r)}finally{n.close();}}markTaskFailed(e,n,r,s="failed",o){if(!this.dbExists())return;let i=this.openHandle(true);try{let u=new Date().toISOString(),d=r?and(eq(a.id,e),eq(a.status,"running"),eq(a.workspace_id,r)):and(eq(a.id,e),eq(a.status,"running")),c=i.db.select({metadata:a.metadata}).from(a).where(d).limit(1).get();if(!c)return;let l={status:s,error:n,completed_at:u};if(o){let p=oe(c.metadata);p.terminalReason=o,l.metadata=JSON.stringify(p);}i.db.update(a).set(l).where(d).run();}catch(u){throw u instanceof f?u:new f("DB_ERROR","Failed to mark task failed",u)}finally{i.close();}}findTasksByPromptHint(e,n){let r=this.resolveDbPaths(),s=new Set,o=[];for(let i of r){if(!existsSync(i))continue;let u=$(i);try{let d=n?and(like(a.prompt,`%${e}%`),eq(a.workspace_id,n)):like(a.prompt,`%${e}%`),c=u.db.select(re).from(a).where(d).orderBy(asc(a.started_at)).all();for(let l of c)s.has(l.id)||(s.add(l.id),o.push(Ve(l)));}catch(d){throw new f("DB_ERROR","Failed to find tasks by prompt hint",d)}finally{u.close();}}return o}getProviderUsage(e,n,r){if(!this.dbExists())return [];let s=this.openHandle(false);try{let o=ni(),i=ir(a.status),u=us(a.metadata),d=sql`
249
+ COALESCE(${a.input_tokens}, 0)
187
250
  + CASE
188
- WHEN ${r.started_at} >= ${B}
251
+ WHEN ${a.started_at} >= ${wn}
189
252
  AND (
190
- ${r.crewx_version} IS NULL
191
- OR (${r.crewx_version} LIKE '0.8.%' AND ${r.crewx_version} NOT LIKE '0.8.9%')
192
- OR (${r.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${r.crewx_version}, ${z}) AS INTEGER) < ${q})
253
+ ${a.crewx_version} IS NULL
254
+ OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
255
+ OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${En}) AS INTEGER) < ${Rn})
193
256
  )
194
- THEN COALESCE(${r.cached_input_tokens}, 0)
257
+ THEN COALESCE(${a.cached_input_tokens}, 0)
195
258
  ELSE 0
196
259
  END
197
- `,a=n?sql`WHERE ${r.status} IN ('completed', 'success') AND ${r.started_at} >= ${t} AND ${r.started_at} < ${e} AND ${r.workspace_id} = ${n}`:sql`WHERE ${r.status} IN ('completed', 'success') AND ${r.started_at} >= ${t} AND ${r.started_at} < ${e}`;return s.db.all(sql`
260
+ `,c=r?sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n} AND ${a.workspace_id} = ${r}`:sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n}`;return s.db.all(sql`
198
261
  SELECT
199
262
  ${o} AS provider,
200
263
  COUNT(*) AS total_tasks,
201
- COALESCE(SUM(${i}), 0) AS input_tokens,
202
- COALESCE(SUM(${r.output_tokens}), 0) AS output_tokens,
203
- COALESCE(SUM(${r.cached_input_tokens}), 0) AS cached_input_tokens,
204
- COALESCE(SUM(${r.cost_usd}), 0) AS cost_usd,
205
- COALESCE(SUM(${r.duration_ms}), 0) AS active_duration_ms,
206
- MAX(${r.completed_at}) AS last_active_at
207
- FROM ${r}
208
- ${a}
209
- GROUP BY provider
210
- ORDER BY (COALESCE(SUM(${i}), 0) + COALESCE(SUM(${r.output_tokens}), 0)) DESC
211
- `).map(l=>({provider:l.provider,totalTasks:l.total_tasks,inputTokens:l.input_tokens,outputTokens:l.output_tokens,cachedInputTokens:l.cached_input_tokens,costUsd:l.cost_usd,totalTokens:l.input_tokens+l.output_tokens,activeDurationMs:l.active_duration_ms??0,lastActiveAt:l.last_active_at??null}))}catch(o){throw new _("DB_ERROR","Failed to get provider usage",o)}finally{s.close();}}getModelUsage(t,e,n){if(!this.dbExists())return [];let s=this.openHandle(false);try{let o=sql`
212
- CASE
213
- WHEN ${r.model} LIKE 'claude-%' OR ${r.model} IN ('opus', 'sonnet', 'haiku', 'opus[1m]', 'sonnet[1m]') THEN 'claude'
214
- WHEN ${r.model} LIKE 'gpt-%' OR ${r.model} LIKE 'codex-%' THEN 'codex'
215
- WHEN ${r.model} LIKE 'gemini-%' THEN 'gemini'
216
- WHEN ${r.model} LIKE 'zai-%' OR ${r.model} LIKE 'openrouter/z-ai/%' THEN 'opencode'
217
- WHEN ${r.model} LIKE 'minimax/%' THEN 'minimax'
218
- WHEN ${r.model} LIKE 'qwen%' THEN 'qwen'
219
- ELSE 'unknown'
220
- END
221
- `,i=sql`
222
- COALESCE(${r.input_tokens}, 0)
264
+ ${u} AS unavailable_task_count,
265
+ COALESCE(SUM(${d}), 0) AS input_tokens,
266
+ COALESCE(SUM(${a.output_tokens}), 0) AS output_tokens,
267
+ COALESCE(SUM(${a.cached_input_tokens}), 0) AS cached_input_tokens,
268
+ COALESCE(SUM(${a.cost_usd}), 0) AS cost_usd,
269
+ COALESCE(SUM(${a.duration_ms}), 0) AS active_duration_ms,
270
+ MAX(${a.completed_at}) AS last_active_at
271
+ FROM ${a}
272
+ ${c}
273
+ GROUP BY ${o}
274
+ ORDER BY (COALESCE(SUM(${d}), 0) + COALESCE(SUM(${a.output_tokens}), 0)) DESC
275
+ `).map(p=>({provider:p.provider,totalTasks:p.total_tasks,unavailableTaskCount:p.unavailable_task_count,inputTokens:p.input_tokens,outputTokens:p.output_tokens,cachedInputTokens:p.cached_input_tokens,costUsd:p.cost_usd,totalTokens:p.input_tokens+p.output_tokens,activeDurationMs:p.active_duration_ms??0,lastActiveAt:p.last_active_at??null}))}catch(o){throw new f("DB_ERROR","Failed to get provider usage",o)}finally{s.close();}}getModelUsage(e,n,r){if(!this.dbExists())return [];let s=this.openHandle(false);try{let o=ni(),i=ir(a.status),u=us(a.metadata),d=sql`
276
+ COALESCE(${a.input_tokens}, 0)
223
277
  + CASE
224
- WHEN ${r.started_at} >= ${B}
278
+ WHEN ${a.started_at} >= ${wn}
225
279
  AND (
226
- ${r.crewx_version} IS NULL
227
- OR (${r.crewx_version} LIKE '0.8.%' AND ${r.crewx_version} NOT LIKE '0.8.9%')
228
- OR (${r.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${r.crewx_version}, ${z}) AS INTEGER) < ${q})
280
+ ${a.crewx_version} IS NULL
281
+ OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
282
+ OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${En}) AS INTEGER) < ${Rn})
229
283
  )
230
- THEN COALESCE(${r.cached_input_tokens}, 0)
284
+ THEN COALESCE(${a.cached_input_tokens}, 0)
231
285
  ELSE 0
232
286
  END
233
- `,a=n?sql`WHERE ${r.status} IN ('completed', 'success') AND ${r.started_at} >= ${t} AND ${r.started_at} < ${e} AND ${r.workspace_id} = ${n}`:sql`WHERE ${r.status} IN ('completed', 'success') AND ${r.started_at} >= ${t} AND ${r.started_at} < ${e}`,c=s.db.all(sql`
287
+ `,c=r?sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n} AND ${a.workspace_id} = ${r}`:sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n}`,l=s.db.all(sql`
234
288
  SELECT
235
- ${r.model} AS model,
289
+ ${a.model} AS model,
236
290
  ${o} AS provider,
237
291
  COUNT(*) AS total_tasks,
238
- COALESCE(SUM(${i}), 0) AS input_tokens,
239
- COALESCE(SUM(${r.output_tokens}), 0) AS output_tokens,
240
- COALESCE(SUM(${r.cached_input_tokens}), 0) AS cached_input_tokens,
241
- COALESCE(SUM(${r.cost_usd}), 0) AS cost_usd,
242
- COALESCE(SUM(${r.duration_ms}), 0) AS active_duration_ms,
243
- MAX(${r.completed_at}) AS last_active_at
244
- FROM ${r}
245
- ${a}
246
- GROUP BY ${r.model}
247
- `),l=new Map;for(let u of c){let f=It(u.model??""),m=l.get(f);m?(m.totalTasks+=u.total_tasks,m.inputTokens+=u.input_tokens,m.outputTokens+=u.output_tokens,m.cachedInputTokens+=u.cached_input_tokens,m.costUsd+=u.cost_usd,m.totalTokens+=u.input_tokens+u.output_tokens,m.activeDurationMs+=u.active_duration_ms??0,u.last_active_at&&(!m.lastActiveAt||u.last_active_at>m.lastActiveAt)&&(m.lastActiveAt=u.last_active_at)):l.set(f,{model:f,provider:u.provider,totalTasks:u.total_tasks,inputTokens:u.input_tokens,outputTokens:u.output_tokens,cachedInputTokens:u.cached_input_tokens,costUsd:u.cost_usd,totalTokens:u.input_tokens+u.output_tokens,activeDurationMs:u.active_duration_ms??0,lastActiveAt:u.last_active_at??null});}return Array.from(l.values()).sort((u,f)=>f.costUsd-u.costUsd)}catch(o){throw new _("DB_ERROR","Failed to get model usage",o)}finally{s.close();}}getTasksForReport(t,e,n){if(!this.dbExists())return [];let s=this.openHandle(false);try{let o=n?sql`WHERE ${r.started_at} >= ${t} AND ${r.started_at} < ${e} AND ${r.workspace_id} = ${n}`:sql`WHERE ${r.started_at} >= ${t} AND ${r.started_at} < ${e}`;return s.db.all(sql`
292
+ ${u} AS unavailable_task_count,
293
+ COALESCE(SUM(${d}), 0) AS input_tokens,
294
+ COALESCE(SUM(${a.output_tokens}), 0) AS output_tokens,
295
+ COALESCE(SUM(${a.cached_input_tokens}), 0) AS cached_input_tokens,
296
+ COALESCE(SUM(${a.cost_usd}), 0) AS cost_usd,
297
+ COALESCE(SUM(${a.duration_ms}), 0) AS active_duration_ms,
298
+ MAX(${a.completed_at}) AS last_active_at
299
+ FROM ${a}
300
+ ${c}
301
+ GROUP BY ${a.model}, ${o}
302
+ `),p=new Map;for(let g of l){let h=Zs(g.model??""),m=JSON.stringify([g.provider,h]),E=p.get(m);E?(E.totalTasks+=g.total_tasks,E.unavailableTaskCount=(E.unavailableTaskCount??0)+g.unavailable_task_count,E.inputTokens+=g.input_tokens,E.outputTokens+=g.output_tokens,E.cachedInputTokens+=g.cached_input_tokens,E.costUsd+=g.cost_usd,E.totalTokens+=g.input_tokens+g.output_tokens,E.activeDurationMs+=g.active_duration_ms??0,g.last_active_at&&(!E.lastActiveAt||g.last_active_at>E.lastActiveAt)&&(E.lastActiveAt=g.last_active_at)):p.set(m,{model:h,provider:g.provider,totalTasks:g.total_tasks,unavailableTaskCount:g.unavailable_task_count,inputTokens:g.input_tokens,outputTokens:g.output_tokens,cachedInputTokens:g.cached_input_tokens,costUsd:g.cost_usd,totalTokens:g.input_tokens+g.output_tokens,activeDurationMs:g.active_duration_ms??0,lastActiveAt:g.last_active_at??null});}return Array.from(p.values()).sort((g,h)=>h.costUsd-g.costUsd)}catch(o){throw new f("DB_ERROR","Failed to get model usage",o)}finally{s.close();}}getTasksForReport(e,n,r){if(!this.dbExists())return [];let s=this.openHandle(false);try{let o=r?sql`WHERE ${a.started_at} >= ${e} AND ${a.started_at} < ${n} AND ${a.workspace_id} = ${r}`:sql`WHERE ${a.started_at} >= ${e} AND ${a.started_at} < ${n}`;return s.db.all(sql`
248
303
  SELECT
249
- ${r.thread_id} AS thread_id,
250
- ${r.agent_id} AS agent_id,
251
- ${r.started_at} AS started_at,
252
- ${r.status} AS status,
253
- ${r.error} AS error,
254
- ${r.exit_code} AS exit_code
255
- FROM ${r}
304
+ ${a.thread_id} AS thread_id,
305
+ ${a.agent_id} AS agent_id,
306
+ ${a.started_at} AS started_at,
307
+ ${a.status} AS status,
308
+ ${a.error} AS error,
309
+ ${a.exit_code} AS exit_code,
310
+ ${a.metadata} AS metadata
311
+ FROM ${a}
256
312
  ${o}
257
- ORDER BY ${r.started_at} ASC
258
- `).map(a=>({threadId:a.thread_id,agentId:a.agent_id,startedAt:a.started_at,status:a.status,error:a.error,exitCode:a.exit_code}))}catch(o){throw new _("DB_ERROR","Failed to get tasks for report",o)}finally{s.close();}}};var Et=class extends H{name="sqlite-tracing";unsubs=[];dbPath;version;constructor(t){super(),this.dbPath=join(t?.dbRoot??homedir(),".crewx","crewx.db"),this.version=t?.version??"unknown";}attach(t){let e=new lt({dbPath:this.dbPath}),n=process.cwd(),o=existsSync(join(n,"crewx.yaml"))||existsSync(join(n,"crewx.yml"))?xt(n):null,i=process.argv.join(" ");this.unsubs.push(t.on("task:start",a=>{try{let c=a.callerAgentId??null,l=a.parentTaskId??null,u=a.rootTraceId??a.traceId,f=a.metadata?JSON.stringify(a.metadata):JSON.stringify({provider:a.provider??"cli/claude"});e.startTask({id:a.traceId,agentId:a.agentRef.replace(/^@/,""),prompt:a.message,mode:a.mode,status:"running",pid:a.pid??null,startedAt:a.timestamp.toISOString(),crewxVersion:this.version,platform:a.platform??"cli",model:a.model??null,renderedPrompt:a.renderedPrompt??null,command:i,codingAgentCommand:a.codingAgentCommand??null,workspaceId:a.workspaceId??o,callerAgentId:c,parentTaskId:l,traceId:u,metadata:f,threadId:a.threadId??null});}catch{}}),t.on("task:output",a=>{try{e.appendLog(a.traceId,{timestamp:a.timestamp.toISOString(),level:a.level??"stdout",message:a.output});}catch{}}),t.on("task:end",a=>{try{let c=typeof a.metadata?.runEpoch=="number"?a.metadata.runEpoch:null;e.finishTask({id:a.traceId,status:a.error?"failed":"success",result:a.result??null,error:a.error?JSON.stringify(a.error):null,completedAt:a.timestamp.toISOString(),durationMs:a.durationMs,exitCode:a.exitCode??null,inputTokens:a.inputTokens??0,outputTokens:a.outputTokens??0,cachedInputTokens:a.cachedInputTokens??0,costUsd:a.costUsd??0,model:a.model??null,runEpoch:c});}catch{}}));}detach(t){this.unsubs.forEach(e=>e()),this.unsubs=[];}};var ct=class extends Y{dbPath;constructor(t={}){super(),t.dbPath?this.dbPath=t.dbPath:t.dbRoot&&(this.dbPath=join(t.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(t){let e=this.resolveDbPath();if(t){let s=dirname(e);existsSync(s)||mkdirSync(s,{recursive:true});}else if(!existsSync(e))throw new _("NOT_FOUND","Database not found");let n=R(e);if(t)try{st(n.db,e);}catch(s){throw n.close(),s}return n}validateWorkspaceId(t,e){return t.db.select({id:J.id}).from(J).where(eq(J.id,e)).limit(1).get()?e:null}topLevelTaskPredicateSql(t="child"){return sql.raw(`NOT EXISTS (
259
- SELECT 1 FROM tasks parent
260
- WHERE parent.id = ${t}.parent_task_id
261
- AND parent.thread_id = ${t}.thread_id
262
- )`)}findAllThreads(t){let e=this.resolveDbPaths(),n=new Set,s=[];for(let o of e){if(!existsSync(o))continue;let i=R(o);try{let a=t?eq(p.workspace_id,t):void 0,c=i.db.select().from(p).where(a).orderBy(desc(p.updated_at)).all();for(let l of c)n.has(l.id)||(n.add(l.id),s.push(l));}catch(a){throw new _("DB_ERROR","Failed to find all threads",a)}finally{i.close();}}return s}findThreadById(t,e){let n=this.resolveDbPaths();for(let s of n){if(!existsSync(s))continue;let o=R(s);try{let i=eq(p.id,t),a=e?and(i,eq(p.workspace_id,e)):i,c=o.db.select().from(p).where(a).limit(1).get()??void 0;if(c)return c}catch(i){throw new _("DB_ERROR","Failed to find thread by id",i)}finally{o.close();}}}threadExists(t,e){let n=this.resolveDbPaths();for(let s of n){if(!existsSync(s))continue;let o=R(s);try{let i=eq(p.id,t),a=e?and(i,eq(p.workspace_id,e)):i;if(o.db.select({id:p.id}).from(p).where(a).limit(1).get())return !0}catch(i){throw new _("DB_ERROR","Failed to check thread existence",i)}finally{o.close();}}return false}aggregateTaskStats(t,e){let n=this.resolveDbPaths(),s=0,o=0,i=0,a=0,c=0,l=new Set;for(let u of n){if(!existsSync(u))continue;let f=R(u);try{let m=f.db.get(sql`
313
+ ORDER BY ${a.started_at} ASC
314
+ `).map(u=>({threadId:u.thread_id,agentId:u.agent_id,startedAt:u.started_at,status:u.status,error:u.error,exitCode:u.exit_code,terminalReason:Ke({status:u.status,error:u.error,metadata:u.metadata})??null}))}catch(o){throw new f("DB_ERROR","Failed to get tasks for report",o)}finally{s.close();}}getDelegationMatrix(e,n,r){if(!this.dbExists())return {edges:[],truncated:false};let s=this.openHandle(false);try{let o=sql`
315
+ COALESCE(${a.input_tokens}, 0)
316
+ + CASE
317
+ WHEN ${a.started_at} >= ${wn}
318
+ AND (
319
+ ${a.crewx_version} IS NULL
320
+ OR (${a.crewx_version} LIKE '0.8.%' AND ${a.crewx_version} NOT LIKE '0.8.9%')
321
+ OR (${a.crewx_version} LIKE '0.8.9-rc.%' AND CAST(SUBSTR(${a.crewx_version}, ${En}) AS INTEGER) < ${Rn})
322
+ )
323
+ THEN COALESCE(${a.cached_input_tokens}, 0)
324
+ ELSE 0
325
+ END
326
+ `,i=ir(a.status),u=r?sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n} AND ${a.workspace_id} = ${r}`:sql`WHERE ${i} AND ${a.started_at} >= ${e} AND ${a.started_at} < ${n}`,d=s.db.all(sql`
327
+ SELECT
328
+ ${a.caller_agent_id} AS caller_agent_id,
329
+ ${a.agent_id} AS agent_id,
330
+ COUNT(*) AS task_count,
331
+ COALESCE(SUM(${o}), 0) AS input_tokens,
332
+ COALESCE(SUM(${a.output_tokens}), 0) AS output_tokens
333
+ FROM ${a}
334
+ ${u}
335
+ GROUP BY ${a.caller_agent_id}, ${a.agent_id}
336
+ ORDER BY task_count DESC, ${a.caller_agent_id} ASC, ${a.agent_id} ASC
337
+ LIMIT ${ti+1}
338
+ `),c=d.length>ti;return {edges:d.slice(0,ti).map(p=>({callerAgentId:p.caller_agent_id??null,agentId:p.agent_id,taskCount:p.task_count,totalTokens:p.input_tokens+p.output_tokens,outputTokens:p.output_tokens})),truncated:c}}catch(o){throw new f("DB_ERROR","Failed to get delegation matrix",o)}finally{s.close();}}findTaskEvidence(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=[];e.workspaceId&&r.push(eq(a.workspace_id,e.workspaceId)),e.agents&&e.agents.length>0&&r.push(inArray(a.agent_id,e.agents)),e.statuses&&e.statuses.length>0&&r.push(inArray(a.status,Po(e.statuses))),e.from&&r.push(gte(a.started_at,e.from)),e.to&&r.push(lt$1(a.started_at,e.to));let s=r.length>0?and(...r):void 0,o=(e.order??"DESC")==="ASC"?asc(a.started_at):desc(a.started_at),i={id:a.id,agent_id:a.agent_id,status:a.status,prompt:a.prompt,started_at:a.started_at,completed_at:a.completed_at,thread_id:a.thread_id,error:a.error,metadata:a.metadata};return (e.limit?n.db.select(i).from(a).where(s).orderBy(o).limit(e.limit).all():n.db.select(i).from(a).where(s).orderBy(o).all()).map(({error:d,metadata:c,...l})=>({...l,status:xe({status:l.status,error:d,metadata:c}),terminalReason:Ke({status:l.status,error:d,metadata:c})??null}))}catch(r){throw new f("DB_ERROR","Failed to find task evidence",r)}finally{n.close();}}findThreadChains(e){if(!this.dbExists())return [];let n=this.openHandle(false);try{let r=e.maxThreads??8,s=e.maxTurnsPerThread??4,o=[isNotNull(a.thread_id),isNull(a.parent_task_id),isNull(a.caller_agent_id),or$1(isNull(a.platform),ne$1(a.platform,"workflow")),or$1(isNull(a.metadata),ju()),or$1(isNull(a.metadata),notLike(a.metadata,'%"retriedFromTaskId"%'))];e.workspaceId&&o.push(eq(a.workspace_id,e.workspaceId)),e.from&&o.push(gte(a.started_at,e.from)),e.to&&o.push(lt$1(a.started_at,e.to));let i=n.db.select({id:a.id,agent_id:a.agent_id,status:a.status,prompt:a.prompt,started_at:a.started_at,completed_at:a.completed_at,thread_id:a.thread_id}).from(a).where(and(...o)).orderBy(asc(a.started_at),asc(a.id)).all(),u=new Map;for(let c of i){if(!c.thread_id)continue;let l={id:c.id,agentId:c.agent_id,status:c.status,prompt:c.prompt,startedAt:c.started_at,completedAt:c.completed_at},p=u.get(c.thread_id);p?p.push(l):u.set(c.thread_id,[l]);}let d=[];for(let[c,l]of u){let p=l.filter(g=>g.agentId===e.targetAgentId).length;p<2||d.push({threadId:c,targetAgentTurnCount:p,turns:l});}return d.sort((c,l)=>{let p=c.turns[c.turns.length-1].startedAt,g=l.turns[l.turns.length-1].startedAt;return p<g?1:p>g?-1:0}),d.slice(0,r).map(c=>({threadId:c.threadId,targetAgentTurnCount:c.targetAgentTurnCount,turns:c.turns.slice(-s)}))}catch(r){throw new f("DB_ERROR","Failed to find thread chains",r)}finally{n.close();}}},ec=["up","down"],pi=1e3,tc=200,m_=64,ur=class extends f{stableCode;taskId;constructor(e,n){super(e==="TASK_NOT_FOUND"?"NOT_FOUND":"CONFLICT",e==="TASK_NOT_FOUND"?`Task not found: ${n}`:`Task is not finished, so it cannot be rated: ${n}`),this.name="TaskRatingError",this.stableCode=e,this.taskId=n;}},k_=new Set(Xt);});_();_();_();var ht=class{detach(e){}};_();function Ni(t){let e=n=>String(n).padStart(2,"0");return `${t.getFullYear()}${e(t.getMonth()+1)}${e(t.getDate())}T${e(t.getHours())}${e(t.getMinutes())}${e(t.getSeconds())}`}function bs(t){let e=t.toISOString();return `${e.slice(0,10)} ${e.slice(11,19)} UTC`}var vs=class extends ht{name="file-logger";unsubs=[];logFiles=new Map;logsDir;version;constructor(e){super(),this.logsDir=join(e?.workspaceRoot??process.cwd(),".crewx","logs"),this.version=e?.version??"unknown";}attach(e){this.unsubs.push(e.on("task:start",n=>{try{existsSync(this.logsDir)||mkdirSync(this.logsDir,{recursive:!0});let r=Ni(n.timestamp),s=join(this.logsDir,`${r}_${n.traceId}.log`);this.logFiles.set(n.traceId,s);let o=`=== TASK LOG: ${n.traceId} ===
339
+ CrewX Version: ${this.version}
340
+ Mode: ${n.mode}
341
+ Agent: ${n.agentRef}
342
+ Started: ${bs(n.timestamp)}
343
+ Message: ${n.message}
344
+
345
+ `;writeFileSync(s,o,{encoding:"utf8",mode:384});}catch{}}),e.on("task:output",n=>{try{let r=this.logFiles.get(n.traceId);if(!r)return;let s=new Date().toISOString();appendFileSync(r,`[${s}] STDOUT: ${n.output}
346
+ `,"utf8");}catch{}}),e.on("task:end",n=>{try{let r=this.logFiles.get(n.traceId);if(!r)return;let s=bs(new Date),o=n.error?`failed: ${n.error.message}`:"completed successfully",i=`[${s}] INFO: Task ${o} in ${n.durationMs}ms
347
+ [${s}] INFO: Process closed with exit code: ${n.error?1:0}
348
+ `;appendFileSync(r,i,"utf8"),this.logFiles.delete(n.traceId);}catch{}}));}detach(e){this.unsubs.forEach(n=>n()),this.unsubs=[],this.logFiles.clear();}};_();_();var xi=Symbol.for("crewx.interceptor.run-stops");function Gc(){let t=globalThis,e=t[xi];if(e)return e;let n=new Map;return t[xi]=n,n}function Ci(t){let e=Gc().get(t);return e?(e.abort(),true):false}_();var en=new Map;function wr(t){let e=he.resolve(t);return process.platform==="win32"&&(e=e.replace(/\\/g,"/"),e=e.replace(/^([A-Z]):/,(n,r)=>`${r.toLowerCase()}:`)),e.length>1&&!/^[a-zA-Z]:\/$/.test(e)&&(e=e.replace(/\/+$/,"")),e}function Li(t){let e=wr(t);return createHash("sha256").update(e).digest("hex")}function Mi(t){let e=wr(t),n=en.get(e);if(n!==void 0)return n;let r=e;try{let s=he.join(e,".git");if(!lstatSync(s).isFile())return en.set(e,r),r;let o=/^gitdir:\s*(.+?)\s*$/i.exec(readFileSync(s,"utf8").trim());if(!o)return en.set(e,r),r;let i=o[1],u=he.isAbsolute(i)?i:he.resolve(he.dirname(s),i),d=readFileSync(he.join(u,"commondir"),"utf8").trim();if(!d)return en.set(e,r),r;let c=he.isAbsolute(d)?d:he.resolve(u,d);if(he.basename(c)!==".git"||!statSync(c).isDirectory())return en.set(e,r),r;let l=wr(realpathSync.native(e)),p=wr(realpathSync.native(he.dirname(c)));(l===p||(p.endsWith("/")?l.startsWith(p):l.startsWith(`${p}/`)))&&(r=p);}catch{}return en.set(e,r),r}mt();Yo();un();Co();nr();Xo();Ur();var R_=200,S_=200;function I_(t){if(typeof t!="object"||t===null||!("code"in t))return;let e=t.code;return typeof e=="string"&&e.length>0?e:void 0}function A_(t){let e=t instanceof f?t.code:void 0,n=t instanceof f?t.cause:t,r=I_(n);return {code:e??r??"DB_ERROR",cause:r??(n instanceof Error?n.name:e??typeof n)}}function oc(t){return Buffer.byteLength(JSON.stringify(t),"utf8")}function O_(t){return typeof t=="object"&&t!==null&&!Array.isArray(t)}function ic(t){if(!t)return {};try{let e=JSON.parse(t);return O_(e)?e:{}}catch{return {}}}function In(t){return typeof t=="number"&&Number.isFinite(t)?Math.trunc(t):0}var N_=new Set(["workflow","mcp"]),gi=class extends ht{name="sqlite-tracing";unsubs=[];dbPath;version;inheritWorktreeOwner;runnerIdentity;taskRepo;heartbeatTaskIds=new Set;ownedTaskRuns=new Map;ignoredDetachedTaskIds=new Set;queues=new Map;metrics={flushCount:0,flushedEntries:0,maxQueueEntries:0,maxQueueBytes:0,appendFailureCount:0,appendFailureEntries:0,appendFailureBytes:0,appendFailureByCode:{},appendFailureByCause:{}};constructor(e){super();let n=process.env.CREWX_DB;this.dbPath=e?.dbRoot!==void 0?join(e.dbRoot,".crewx","crewx.db"):n??join(homedir(),".crewx","crewx.db"),this.version=e?.version??"unknown",this.inheritWorktreeOwner=e?.inheritWorktreeOwner===true;let r=e?.runnerIdentity;this.runnerIdentity={detachedRunner:r?.detachedRunner===true,assignedTaskId:r?.detachedRunner===true&&r.assignedTaskId?.trim()||void 0};}attach(e){let n=new dr({dbPath:this.dbPath});n.resolveDbPath(),this.taskRepo=n;let r=process.cwd(),s=existsSync(join(r,"crewx.yaml"))||existsSync(join(r,"crewx.yml")),o=this.inheritWorktreeOwner?Mi(r):r,i=s?Li(o):null,u=process.argv.join(" ");this.unsubs.push(e.on("task:start",d=>{try{let c=d.callerAgentId??null,l=d.parentTaskId??null,p=d.rootTraceId??d.traceId,{detachedRunner:g,assignedTaskId:h}=this.runnerIdentity,m=h??d.traceId,E=In(d.metadata?.runEpoch),S=g?"runner":"caller",D=d.workspaceId??i,y=g?n.getTask(m):void 0,x=d.pid??null,I={...d.metadata??{provider:d.provider??"cli/claude"},ownership:S,...g&&x!==null?{providerPid:x}:{}},N=JSON.stringify(I);if(g&&y?.status==="running"&&y.pid!==null&&E===0){this.ignoredDetachedTaskIds.add(m);return}n.startTask({id:m,agentId:d.agentRef.replace(/^@/,""),prompt:d.message,mode:d.mode,status:"running",actorKind:d.actorKind??null,actorId:d.actorId??null,pid:g?process.pid:x,startedAt:d.timestamp.toISOString(),crewxVersion:this.version,platform:d.platform??"cli",model:d.model??null,renderedPrompt:d.renderedPrompt??null,securityKey:d.renderedPrompt==null?null:d.securityKey??null,command:u,codingAgentCommand:d.codingAgentCommand??null,workspaceId:D,projectId:d.projectId??null,callerAgentId:c,parentTaskId:l,traceId:p,metadata:N,threadId:d.threadId??null,cwd:d.cwd??null}),n.updateTaskOwnership({id:m,runEpoch:E,ownership:S,...g?{providerPid:x}:{},runtime:{model:d.model??null,renderedPrompt:d.renderedPrompt??null,codingAgentCommand:d.codingAgentCommand??null,metadata:I}})?this.recordOwnedTaskRun({taskId:m,runEpoch:E,workspaceId:D,ownership:S}):console.warn("[crewx] task execution metadata not recorded",{taskId:m,runEpoch:E,ownership:S}),N_.has(d.platform??"cli")||Lu(n,{taskId:m,runEpoch:E,onStopRequested:_t=>this.handleStopRequested(n,_t)})&&this.heartbeatTaskIds.add(m);}catch(c){console.warn("[crewx] task:start tracing failed",{cause:c instanceof Error?c.name:typeof c});}}),e.on("task:output",d=>{try{let c=this.resolveTaskId(d.traceId);if(this.ignoredDetachedTaskIds.has(c))return;this.enqueueLog(c,{timestamp:d.timestamp.toISOString(),level:d.level??"stdout",message:d.output});}catch(c){let l={timestamp:d.timestamp.toISOString(),level:d.level??"stdout",message:d.output};this.recordAppendFailure(c,[l],oc(l));}}),e.on("task:run-update",d=>{try{let c=this.resolveTaskId(d.traceId);if(this.ignoredDetachedTaskIds.has(c))return;let l=In(d.runEpoch),p=this.runnerIdentity.detachedRunner;n.updateTaskOwnership({id:c,runEpoch:l,ownership:p?"runner":"caller",...p&&d.pid!==void 0?{providerPid:d.pid}:{},runtime:{...d.model!==void 0?{model:d.model}:{},...d.renderedPrompt!==void 0?{renderedPrompt:d.renderedPrompt}:{},...d.securityKey!==void 0?{securityKey:d.securityKey}:{},...d.codingAgentCommand!==void 0?{codingAgentCommand:d.codingAgentCommand}:{},...d.metadata?{metadata:d.metadata}:{}}}),!p&&d.pid!==void 0&&n.recordTaskPid({id:c,runEpoch:l,pid:d.pid});}catch(c){console.warn("[crewx] task:run-update tracing failed",{cause:c instanceof Error?c.name:typeof c});}}),e.on("task:provider-input",d=>{try{let c=this.resolveTaskId(d.traceId);if(this.ignoredDetachedTaskIds.has(c))return;n.recordProviderInput({id:c,runEpoch:d.runEpoch,input:d.input,keyWrapSkipped:d.keyWrapSkipped,interceptedRequest:d.interceptedRequest===!0,recordedAt:d.timestamp.toISOString()});}catch(c){console.warn("[crewx] task:provider-input tracing failed",{cause:c instanceof Error?c.name:typeof c});}}),e.on("task:end",d=>{try{let c=this.resolveTaskId(d.traceId);if(this.ignoredDetachedTaskIds.delete(c))return;let l=typeof d.metadata?.runEpoch=="number"?d.metadata.runEpoch:null;this.removeOwnedTaskRun(c,In(l)),tr(c,l)&&this.heartbeatTaskIds.delete(c),this.flushTaskLogs(c);let g=d.error?JSON.stringify({code:d.error.code,message:d.error.message,...d.error.providerCode?{providerCode:d.error.providerCode}:{},...d.error.mode?{mode:d.error.mode}:{}}):null,h=d.result??null,m=!1,E=d.metadata?.suppressPartialResultRecovery===!0;if(d.error&&!E&&(!h||h.trim()==="")){let S=this.recoverPartialResult(c,d,l);S&&(h=S,m=!0);}n.finishTask({id:c,status:d.error?"failed":"success",result:h,error:g,completedAt:d.timestamp.toISOString(),durationMs:d.durationMs,exitCode:d.exitCode??null,inputTokens:d.inputTokens??0,outputTokens:d.outputTokens??0,cachedInputTokens:d.cachedInputTokens??0,costUsd:d.costUsd??0,usagePresent:d.inputTokens!==void 0||d.outputTokens!==void 0||d.cachedInputTokens!==void 0,usageComplete:d.usageComplete,model:d.model??null,runEpoch:l,partialResultRecovered:m});}catch{}}));}detach(e){try{this.flushAllTaskLogs();}finally{this.clearAllTimers();for(let n of this.heartbeatTaskIds)tr(n);this.heartbeatTaskIds.clear(),this.ownedTaskRuns.clear(),this.unsubs.forEach(n=>n()),this.unsubs=[],this.queues.clear(),this.ignoredDetachedTaskIds.clear(),this.taskRepo=void 0;}}listOwnedRunningTasks(){return Array.from(this.ownedTaskRuns.values(),e=>({...e}))}async stopOwnedRunningTasksForHostShutdown(){let e=this.taskRepo;if(!e)return;let n=this.listOwnedRunningTasks();for(let r of n)try{let s=await Bu(e,{taskId:r.taskId,expectedRunEpoch:r.runEpoch,workspaceId:r.workspaceId});(s.status==="failed"||s.status==="ownership_unverified")&&console.warn("[crewx] host-shutdown task stop failed",{taskId:r.taskId,runEpoch:r.runEpoch,status:s.status,...s.error?{error:s.error}:{}});}catch(s){console.warn("[crewx] host-shutdown task stop failed",{taskId:r.taskId,runEpoch:r.runEpoch,cause:s instanceof Error?s.name:typeof s});}}getMetrics(){let e=0,n=0;for(let r of this.queues.values())e+=r.entries.length,n+=r.bytes;return {...this.metrics,appendFailureByCode:{...this.metrics.appendFailureByCode},appendFailureByCause:{...this.metrics.appendFailureByCause},pendingQueueEntries:e,pendingQueueBytes:n}}resolveTaskId(e){return this.runnerIdentity.detachedRunner?this.runnerIdentity.assignedTaskId??e:e}recordOwnedTaskRun(e){let n=this.ownedTaskRuns.get(e.taskId);n&&n.runEpoch>e.runEpoch||this.ownedTaskRuns.set(e.taskId,{...e});}removeOwnedTaskRun(e,n){let r=this.ownedTaskRuns.get(e);!r||r.runEpoch!==n||this.ownedTaskRuns.delete(e);}enqueueLog(e,n){let r=this.queues.get(e);if(r||(r={entries:[],bytes:0},this.queues.set(e,r)),r.entries.push(n),r.bytes+=oc(n),this.metrics.maxQueueEntries=Math.max(this.metrics.maxQueueEntries,r.entries.length),this.metrics.maxQueueBytes=Math.max(this.metrics.maxQueueBytes,r.bytes),r.entries.length>=R_){this.flushTaskLogs(e);return}if(!r.timer){let s=setTimeout(()=>{let o=this.queues.get(e);!o||o.timer!==s||(o.timer=void 0,this.flushTaskLogs(e));},S_);r.timer=s;}}recoverPartialResult(e,n,r){try{let s=this.taskRepo;if(!s)return;let o=s.getTask(e);if(!o||o.status!=="running"||In(o.run_epoch)!==In(r))return;let i=ic(o.metadata),u=typeof i.provider=="string"?i.provider:typeof n.metadata?.provider=="string"?n.metadata.provider:void 0;if(!u)return;let d=os({taskLogRepository:s,taskId:e,provider:u,model:o.model});if(!d?.adapter.extractPartialText)return;let c=d.adapter.extractPartialText(d.stdout);return !c||!c.trim()||at(c,u)?void 0:c}catch{return}}async handleStopRequested(e,n){let r=n.id;if(!r)return;let s=In(n.run_epoch),o=ic(n.metadata??null),i=o.ownership==="runner"?"runner":"caller";if(i==="runner"&&n.pid!==process.pid){console.warn("[crewx] ignored stop request for task owned by another runner",{taskId:r});return}let u=typeof o.providerPid=="number"&&Number.isSafeInteger(o.providerPid)&&o.providerPid>0?o.providerPid:void 0,d=i==="runner"?u:typeof n.pid=="number"&&n.pid>0?n.pid:void 0;if(Ci(r),d!==void 0){let c;try{c=await St(d,{signal:Rt});}catch(l){console.warn("[crewx] cooperative task stop failed",{taskId:r,cause:l instanceof Error?l.name:typeof l});return}if(c.status==="failed"){console.warn("[crewx] cooperative task stop failed",{taskId:r,cause:c.error??"process termination failed"});return}}try{let c=e.finalizeTaskStop({id:r,runEpoch:s,method:ds(n.stop_requested_at)}),l=e.getTask(r);(c||l?.status!=="running")&&tr(r,s)&&this.heartbeatTaskIds.delete(r);}catch(c){console.warn("[crewx] cooperative task stop finalization failed",{taskId:r,cause:c instanceof Error?c.name:typeof c});}}flushTaskLogs(e){let n=this.queues.get(e);if(!n||n.entries.length===0){n?.timer&&clearTimeout(n.timer),this.queues.delete(e);return}n.timer&&(clearTimeout(n.timer),n.timer=void 0);let r=n.entries,s=n.bytes;n.entries=[],n.bytes=0,this.metrics.flushCount+=1;try{this.taskRepo?.appendLogs(e,r),this.metrics.flushedEntries+=r.length;}catch(i){this.recordAppendFailure(i,r,s);}let o=this.queues.get(e);o&&o.entries.length===0&&(o.timer&&clearTimeout(o.timer),this.queues.delete(e));}flushAllTaskLogs(){for(let e of [...this.queues.keys()])this.flushTaskLogs(e);}clearAllTimers(){for(let e of this.queues.values())e.timer&&(clearTimeout(e.timer),e.timer=void 0);}recordAppendFailure(e,n,r){let s=A_(e);this.metrics.appendFailureCount+=1,this.metrics.appendFailureEntries+=n.length,this.metrics.appendFailureBytes+=r,this.metrics.appendFailureByCode[s.code]=(this.metrics.appendFailureByCode[s.code]??0)+1,this.metrics.appendFailureByCause[s.cause]=(this.metrics.appendFailureByCause[s.cause]??0)+1,console.warn("[crewx] sqlite tracing append failed",{code:s.code,cause:s.cause,pendingEntries:n.length,pendingBytes:r});}};_();_();_();kt();Ct();Dt();mt();Bt();Pr();Qn();_();function hs(t){return t!==null&&t!==""}function b_(t){return t.schedule_id!==null&&t.schedule_id!==void 0?"system":hs(t.parent_task_id)||hs(t.caller_agent_id)?"agent":t.platform==="workflow"?"system":"human"}function ac(t,e){return {origin:t==="human"?"direct":"delegated",delegatedByAgentId:t==="agent"&&hs(e)?e:null}}function ms(t){let e=b_(t),n=hs(t.caller_agent_id)?t.caller_agent_id:null,r=t.parent_thread_id!==null&&t.parent_thread_id!==t.thread_id;return {origin:e==="human"?"direct":"delegated",delegatedByAgentId:e==="agent"?n??(r&&t.parent_agent_id||null):null}}function dc(t,e,n){return t.creator_task_id!==null&&t.creator_pointer_unverified===0?t.creator_actor_kind!==null?ac(t.creator_actor_kind,t.creator_actor_id):e?ms(e):{origin:"direct",delegatedByAgentId:null}:t.created_by_kind!==null?ac(t.created_by_kind,t.created_by_id):n?ms(n):void 0}function cr(t){return Yn(t)}function L_({metadata:t,...e}){return {...e,status:xe({...e,metadata:t}),terminalReason:Ke({...e,metadata:t})??null}}var lr=32,cc=100,M_=["running","failed"];function $_(t){return t==="running"?0:t==="failed"?1:2}function lc(t,e){return t[0]!==e[0]?t[0]-e[0]:t[1]!==e[1]?t[1]===null?1:e[1]===null||t[1]<e[1]?-1:1:t[2]<e[2]?-1:t[2]>e[2]?1:0}function H_(t){return Buffer.from(JSON.stringify(t),"utf8").toString("base64url")}function U_(t){try{let e=JSON.parse(Buffer.from(t,"base64url").toString("utf8"));if(Array.isArray(e)&&e.length===3&&Number.isInteger(e[0])&&e[0]>=0&&e[0]<=2&&(e[1]===null||typeof e[1]=="string")&&typeof e[2]=="string")return [e[0],e[1],e[2]]}catch{}throw new f("VALIDATION","Invalid descendant cursor")}function pc(t,e,n){return t===void 0||!Number.isFinite(t)?e:Math.min(n,Math.max(1,Math.trunc(t)))}function _i(t){return {total:0,running:0,pending:0,paused:0,success:0,failed:0,stopped:0,runnerLost:0,checkedAt:t}}function F_(t){switch(t){case "running":case "pending":case "paused":case "success":case "failed":case "stopped":return t;default:return}}function hi(t,e,n,r){let s=F_(e);s&&(t[s]+=r,t.total+=r,s==="failed"&&n==="runner_lost"&&(t.runnerLost+=r));}var Ts=900,fc=20;function gc(t,e){return (t?.origin??"direct")===e}function _c(t,e){let n=new Date(e.updated_at).getTime()-new Date(t.updated_at).getTime();return n!==0?n:t.id.localeCompare(e.id)}var An=class extends f{reason;constructor(e,n=e){super("VALIDATION",n),this.name="ThreadTitleMetadataPatchError",this.reason=e;}};function On(t){if(!t)return {};try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?{}:e}catch{return {}}}function q_(t){let n=On(t).threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {priority:null,state:null};let r=n;return {priority:typeof r.priority=="string"?r.priority:null,state:typeof r.state=="string"?r.state:null}}function hc(t,e,n){return t.get(sql`
349
+ SELECT id
350
+ FROM tasks INDEXED BY idx_tasks_thread_id
351
+ WHERE thread_id = ${e}
352
+ AND id <> ${n}
353
+ LIMIT 1
354
+ `)!==void 0}function B_(t,e,n){let r=n?and(eq(k.id,e),eq(k.workspace_id,n)):eq(k.id,e),s=t.select({pinned:k.pinned,metadata:k.metadata}).from(k).where(r).get();if(!s)return null;let o=s.pinned?0:1,i=On(s.metadata);if(o){let u=n?and(eq(k.pinned,1),eq(k.workspace_id,n)):eq(k.pinned,1),d=t.select({metadata:k.metadata}).from(k).where(u).all(),c=null;for(let l of d){let p=On(l.metadata);typeof p.pinOrder=="number"&&(c===null||p.pinOrder<c)&&(c=p.pinOrder);}i.pinOrder=c===null?0:c-1;}else delete i.pinOrder;return t.update(k).set({pinned:o,metadata:Object.keys(i).length>0?JSON.stringify(i):null}).where(r).run(),{pinned:!!o}}function W_(t,e,n){for(let r=0;r<e.length;r++){let s=n?and(eq(k.id,e[r]),eq(k.workspace_id,n)):eq(k.id,e[r]),o=t.select({metadata:k.metadata}).from(k).where(s).get();if(!o)continue;let i=On(o.metadata);i.pinOrder=r+1,t.update(k).set({metadata:JSON.stringify(i)}).where(s).run();}}var ys=class extends Re{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath?this.dbPath:super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(e){let s=dirname(n);existsSync(s)||mkdirSync(s,{recursive:true});}else if(!existsSync(n))throw new f("NOT_FOUND","Database not found");let r=$(n);if(e)try{Pe(r.db,n);}catch(s){throw r.close(),s}return r}topLevelTaskPredicateSql(e="child",n){let r=n?`tasks parent INDEXED BY ${n}`:"tasks parent";return sql.raw(`NOT EXISTS (
355
+ SELECT 1 FROM ${r}
356
+ WHERE parent.id = ${e}.parent_task_id
357
+ AND parent.thread_id = ${e}.thread_id
358
+ )`)}workflowAnchorPredicateSql(e){let n=wt.map(r=>`OR ${e}.metadata LIKE '%"kind":"${r}"%'`).join(`
359
+ `);return sql.raw(`COALESCE(
360
+ ${e}.agent_id = 'workflow'
361
+ ${n}
362
+ OR (
363
+ ${e}.metadata LIKE '%"workflow"%'
364
+ AND CASE WHEN json_valid(${e}.metadata)
365
+ THEN json_type(${e}.metadata, '$.workflow')
366
+ END IN ('object', 'array')
367
+ ),
368
+ 0
369
+ )`)}descendantTraversalSql(e,n,r){return sql`
370
+ WITH RECURSIVE
371
+ own_tasks(task_id) AS (${e}),
372
+ seeds(task_id) AS (${n}),
373
+ descendants(root_task_id, task_id, depth) AS (
374
+ SELECT seed.task_id, seed.task_id, 0 FROM seeds seed
375
+ UNION
376
+ SELECT descendants.root_task_id, child.id, descendants.depth + 1
377
+ FROM descendants
378
+ JOIN tasks child INDEXED BY idx_tasks_parent_task_id
379
+ ON child.parent_task_id = descendants.task_id
380
+ WHERE descendants.depth < ${r}
381
+ ),
382
+ descendant_ids(root_task_id, task_id, depth) AS (
383
+ SELECT descendants.root_task_id, descendants.task_id, MIN(descendants.depth)
384
+ FROM descendants
385
+ WHERE descendants.depth > 0
386
+ AND descendants.task_id <> descendants.root_task_id
387
+ GROUP BY descendants.root_task_id, descendants.task_id
388
+ )
389
+ `}descendantSkippedSql(e){let n=sql.raw(e);return sql`(
390
+ ${this.workflowAnchorPredicateSql(e)}
391
+ OR (
392
+ EXISTS (SELECT 1 FROM own_tasks own WHERE own.task_id = ${n}.id)
393
+ AND ${this.topLevelTaskPredicateSql(e)}
394
+ )
395
+ )`}findAllThreadsQuery(e,n){let r=[];e&&r.push(sql`workspace_id = ${e}`),n&&r.push(sql`created_by_kind = ${n}`);let s=r.length>0?sql` WHERE ${sql.join(r,sql` AND `)}`:sql``;return sql`SELECT * FROM threads${s} ORDER BY updated_at DESC`}findThreadIdsQuery(e){return e?sql`SELECT id FROM threads INDEXED BY idx_threads_ws_updated
396
+ WHERE workspace_id = ${e}
397
+ ORDER BY updated_at DESC`:sql`SELECT id FROM threads`}readThreadIds(e,n="Failed to find thread ids"){let r=this.resolveDbPaths(),s=new Set,o=[];for(let i of r){if(!existsSync(i))continue;let u=$(i);try{let d=u.db.all(this.findThreadIdsQuery(e));for(let c of d)s.has(c.id)||(s.add(c.id),o.push(c.id));}catch(d){throw new f("DB_ERROR",n,d)}finally{u.close();}}return o}findThreadSortKeysQuery(e){return sql`SELECT id, updated_at
398
+ FROM threads INDEXED BY idx_threads_ws_updated
399
+ WHERE workspace_id = ${e}`}readThreadSortKeys(e){let n=this.resolveDbPaths(),r=new Set,s=[];for(let o of n){if(!existsSync(o))continue;let i=$(o);try{let u=i.db.all(this.findThreadSortKeysQuery(e));for(let d of u)r.has(d.id)||(r.add(d.id),s.push(d));}catch(u){throw new f("DB_ERROR","Failed to find recent direct threads",u)}finally{i.close();}}return s}readThreadRowsByIds(e,n,r="Failed to find threads by ids"){if(e.length===0)return [];let s=this.resolveDbPaths(),o=new Set,i=[];for(let u of s){if(!existsSync(u))continue;let d=$(u);try{for(let c=0;c<e.length;c+=Ts){let l=e.slice(c,c+Ts),p=inArray(k.id,l),g=n?and(p,eq(k.workspace_id,n)):p,h=d.db.select().from(k).where(g).all();for(let m of h)o.has(m.id)||(o.add(m.id),i.push(m));}}catch(c){throw new f("DB_ERROR",r,c)}finally{d.close();}}return i}readThreadRows(e,n,r="Failed to find all threads"){let s=this.resolveDbPaths(),o=new Set,i=[];for(let u of s){if(!existsSync(u))continue;let d=$(u);try{let c=d.db.all(this.findAllThreadsQuery(e,n));for(let l of c)o.has(l.id)||(o.add(l.id),i.push(l));}catch(c){throw new f("DB_ERROR",r,c)}finally{d.close();}}return i}findAllThreads(e,n){return this.readThreadRows(e,n)}explainFindAllThreadsPlan(e,n){let r=this.resolveDbPaths();for(let s of r){if(!existsSync(s))continue;let o=$(s);try{return o.db.all(sql`EXPLAIN QUERY PLAN ${this.findAllThreadsQuery(e,n)}`).map(u=>u.detail)}finally{o.close();}}return []}findThreadsByIdsOrTitles(e,n){if(e.length===0)return [];let r=this.resolveDbPaths(),s=new Set,o=[];for(let i of r){if(!existsSync(i))continue;let u=$(i);try{let d=or$1(inArray(k.id,e),inArray(k.title,e)),c=n?and(d,eq(k.workspace_id,n)):d,l=u.db.select().from(k).where(c).orderBy(desc(k.updated_at)).all();for(let p of l)s.has(p.id)||(s.add(p.id),o.push(p));}catch(d){throw new f("DB_ERROR","Failed to find threads by ids or titles",d)}finally{u.close();}}return o}findThreadById(e,n){let r=this.resolveDbPaths();for(let s of r){if(!existsSync(s))continue;let o=$(s);try{let i=eq(k.id,e),u=n?and(i,eq(k.workspace_id,n)):i,d=o.db.select().from(k).where(u).limit(1).get()??void 0;if(d)return d}catch(i){throw new f("DB_ERROR","Failed to find thread by id",i)}finally{o.close();}}}createAppLaunchThread(e){let n=this.openHandle(true);try{return n.db.transaction(r=>{if(!r.select({id:ne.id}).from(ne).where(eq(ne.id,e.workspaceId)).limit(1).get())throw new f("NOT_FOUND","Workspace not found");let o=r.select().from(k).where(eq(k.id,e.threadId)).limit(1).get();if(o){let l=On(o.metadata).appLaunch,p=l&&typeof l=="object"&&!Array.isArray(l)?l.appId:void 0,g=r.get(sql`
400
+ SELECT COUNT(*) AS count FROM tasks WHERE thread_id = ${e.threadId}
401
+ `)?.count??0;return o.workspace_id===e.workspaceId&&p===e.appId&&o.message_count===0&&o.first_message===null&&o.last_message===null&&g===0?{status:"existing",thread:o}:{status:"conflict"}}let i=new Date().toISOString(),u=JSON.stringify({appLaunch:{appId:e.appId,...e.initialAgentId===void 0?{}:{initialAgentId:e.initialAgentId}}});r.insert(k).values({id:e.threadId,workspace_id:e.workspaceId,platform:e.platform,title:e.title,title_locked:1,created_by_kind:"human",created_by_id:e.createdById,created_by_task_id:null,message_count:0,first_message:null,last_message:null,metadata:u,created_at:i,updated_at:i}).run();let d=r.select().from(k).where(eq(k.id,e.threadId)).limit(1).get();if(!d)throw new f("DB_ERROR","App-launch thread could not be read after insert");return {status:"created",thread:d}},{behavior:"immediate"})}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to create App-launch thread",r)}finally{n.close();}}threadExists(e,n){let r=this.resolveDbPaths();for(let s of r){if(!existsSync(s))continue;let o=$(s);try{let i=eq(k.id,e),u=n?and(i,eq(k.workspace_id,n)):i;if(o.db.select({id:k.id}).from(k).where(u).limit(1).get())return !0}catch(i){throw new f("DB_ERROR","Failed to check thread existence",i)}finally{o.close();}}return false}aggregateTaskStats(e,n){let r=this.resolveDbPaths(),s=0,o=0,i=0,u=0,d=0,c=0,l=0,p=0,g=0,h=0,m=new Set;for(let E of r){if(!existsSync(E))continue;let S=$(E);try{let D=S.db.get(sql`
402
+ SELECT count(*) AS cnt
403
+ FROM tasks child INDEXED BY idx_tasks_thread_id
404
+ WHERE child.thread_id = ${e}
405
+ AND ${this.topLevelTaskPredicateSql()}
406
+ ${n?sql`AND child.workspace_id = ${n}`:sql``}
407
+ `);D&&(s+=D.cnt);let y=S.db.get(sql`
263
408
  SELECT
264
- count(*) AS cnt,
265
409
  COALESCE(SUM(child.input_tokens), 0) AS total_input,
266
410
  COALESCE(SUM(child.output_tokens), 0) AS total_output,
267
411
  COALESCE(SUM(child.cached_input_tokens), 0) AS total_cached,
268
412
  COALESCE(SUM(child.cost_usd), 0) AS total_cost
269
- FROM tasks child
270
- WHERE child.thread_id = ${t}
271
- AND ${this.topLevelTaskPredicateSql()}
272
- ${e?sql`AND child.workspace_id = ${e}`:sql``}
273
- `);m&&(s+=m.cnt,o+=m.total_input,i+=m.total_output,a+=m.total_cached,c+=m.total_cost);let T=f.db.all(sql`
274
- SELECT DISTINCT child.agent_id FROM tasks child
275
- WHERE child.thread_id = ${t}
413
+ FROM tasks child INDEXED BY idx_tasks_thread_id
414
+ WHERE child.thread_id = ${e}
415
+ ${n?sql`AND child.workspace_id = ${n}`:sql``}
416
+ `);y&&(o+=y.total_input,i+=y.total_output,u+=y.total_cached,d+=y.total_cost);let x=S.db.get(sql`
417
+ WITH RECURSIVE
418
+ own_tasks(task_id) AS (
419
+ SELECT own.id
420
+ FROM tasks own INDEXED BY idx_tasks_thread_id
421
+ WHERE own.thread_id = ${e}
422
+ ${n?sql`AND own.workspace_id = ${n}`:sql``}
423
+ ),
424
+ descendants(task_id, depth) AS (
425
+ SELECT own.task_id, 0 FROM own_tasks own
426
+ UNION
427
+ SELECT child.id, descendants.depth + 1
428
+ FROM descendants
429
+ JOIN tasks child INDEXED BY idx_tasks_parent_task_id
430
+ ON child.parent_task_id = descendants.task_id
431
+ WHERE descendants.depth < ${lr}
432
+ ),
433
+ delegated_ids(task_id) AS (
434
+ SELECT DISTINCT descendants.task_id
435
+ FROM descendants
436
+ WHERE descendants.depth > 0
437
+ AND NOT EXISTS (
438
+ SELECT 1 FROM own_tasks own
439
+ WHERE own.task_id = descendants.task_id
440
+ )
441
+ )
442
+ SELECT
443
+ count(*) AS cnt,
444
+ COALESCE(SUM(task.input_tokens), 0) AS total_input,
445
+ COALESCE(SUM(task.output_tokens), 0) AS total_output,
446
+ COALESCE(SUM(task.cached_input_tokens), 0) AS total_cached,
447
+ COALESCE(SUM(task.cost_usd), 0) AS total_cost
448
+ FROM delegated_ids
449
+ JOIN tasks task ON task.id = delegated_ids.task_id
450
+ `);x&&(c+=x.cnt,l+=x.total_input,p+=x.total_output,g+=x.total_cached,h+=x.total_cost);let I=S.db.all(sql`
451
+ SELECT DISTINCT child.agent_id FROM tasks child INDEXED BY idx_tasks_thread_id
452
+ WHERE child.thread_id = ${e}
276
453
  AND child.agent_id IS NOT NULL AND child.agent_id != ''
454
+ AND child.agent_id != 'workflow'
277
455
  AND ${this.topLevelTaskPredicateSql()}
278
- ${e?sql`AND child.workspace_id = ${e}`:sql``}
279
- `);for(let X of T)l.add(X.agent_id);}catch(m){throw new _("DB_ERROR","Failed to aggregate task stats",m)}finally{f.close();}}return {taskCount:s,inputTokens:o,outputTokens:i,cachedInputTokens:a,costUsd:c,agentIds:Array.from(l)}}findTopLevelTasks(t,e,n){let s=this.resolveDbPaths(),o=new Set,i=[];for(let a of s){if(!existsSync(a))continue;let c=R(a);try{let l;n!==void 0?l=c.db.all(sql`
456
+ ${n?sql`AND child.workspace_id = ${n}`:sql``}
457
+ `);for(let N of I)m.add(N.agent_id);}catch(D){throw new f("DB_ERROR","Failed to aggregate task stats",D)}finally{S.close();}}return {taskCount:s,inputTokens:o,outputTokens:i,cachedInputTokens:u,costUsd:d,agentIds:Array.from(m),delegated:{taskCount:c,inputTokens:l,outputTokens:p,cachedInputTokens:g,costUsd:h}}}getDescendantSummaryByTaskId(e,n){let r=this.resolveDbPaths(),s={},o=new Date().toISOString();for(let i of r){if(!existsSync(i))continue;let u=$(i);try{let d=sql`
458
+ SELECT own.id
459
+ FROM tasks own INDEXED BY idx_tasks_thread_id
460
+ WHERE own.thread_id = ${e}
461
+ ${n?sql`AND own.workspace_id = ${n}`:sql``}
462
+ `,c=u.db.all(sql`
463
+ ${this.descendantTraversalSql(d,sql`SELECT own.task_id FROM own_tasks own`,lr)}
464
+ SELECT
465
+ descendant_ids.root_task_id AS root_task_id,
466
+ task.status AS status,
467
+ task.error AS error,
468
+ task.metadata AS metadata,
469
+ count(*) AS task_count
470
+ FROM descendant_ids
471
+ JOIN tasks task ON task.id = descendant_ids.task_id
472
+ WHERE NOT ${this.descendantSkippedSql("task")}
473
+ GROUP BY descendant_ids.root_task_id, task.status, task.error, task.metadata
474
+ `);for(let l of c){let p=s[l.root_task_id]??=_i(o);hi(p,xe(l),Ke(l),l.task_count);}}catch(d){throw new f("DB_ERROR","Failed to aggregate task descendant summaries",d)}finally{u.close();}}return s}listUnreadReplyCandidates(e,n){let r=new Map,s=new Map;for(let{threadId:i,readThroughAt:u}of e)u!==null&&s.set(i,u);if(s.size===0)return r;let o=new Set;for(let i of this.resolveDbPaths()){if(!existsSync(i))continue;let u=$(i);try{let d=u.db.all(this.unreadReplyCandidatesQuery(s,n));for(let c of d){if(o.has(c.id))continue;o.add(c.id);let l={id:c.id,threadId:c.thread_id,completedAt:c.completed_at,status:xe(c),result:c.result,error:c.error,metadata:c.metadata},p=r.get(c.thread_id);p?p.push(l):r.set(c.thread_id,[l]);}}catch(d){throw d instanceof f?d:new f("DB_ERROR","Failed to list unread reply candidates",d)}finally{u.close();}}return r}unreadReplyCandidatesQuery(e,n){let r=sql.join([...e].map(([o,i])=>sql`(${o}, ${i})`),sql`, `),s=sql.join(Xt.map(o=>sql`${o}`),sql`, `);return sql`
475
+ WITH watermarks(thread_id, read_through_at) AS (VALUES ${r})
476
+ SELECT child.id, child.thread_id, child.completed_at, child.status,
477
+ child.result, child.error, child.metadata
478
+ FROM watermarks w
479
+ JOIN tasks child INDEXED BY idx_tasks_thread_id ON child.thread_id = w.thread_id
480
+ WHERE julianday(child.completed_at) > julianday(w.read_through_at)
481
+ AND child.status IN (${s})
482
+ AND ${this.topLevelTaskPredicateSql()}
483
+ AND NOT ${this.workflowAnchorPredicateSql("child")}
484
+ AND COALESCE(length(child.result), 0) > 0
485
+ ${n?sql`AND child.workspace_id = ${n}`:sql``}
486
+ ORDER BY julianday(child.completed_at), child.id
487
+ `}getThreadTaskStatusBatch(e,n){let r=[...new Set(e)];if(r.length===0)return {tasksByThread:new Map,descendantSummaryByTaskId:{}};let s=this.batchFetchTasks(r,n),o={},i=new Date().toISOString(),u=sql.join(r.map(c=>sql`${c}`),sql`, `),d=sql`
488
+ SELECT own.id
489
+ FROM tasks own INDEXED BY idx_tasks_thread_id
490
+ WHERE own.thread_id IN (${u})
491
+ ${n?sql`AND own.workspace_id = ${n}`:sql``}
492
+ `;for(let c of this.resolveDbPaths()){if(!existsSync(c))continue;let l=$(c);try{let p=l.db.all(sql`
493
+ ${this.descendantTraversalSql(d,sql`SELECT own.task_id FROM own_tasks own`,lr)}
494
+ SELECT
495
+ descendant_ids.root_task_id AS root_task_id,
496
+ task.status AS status,
497
+ task.error AS error,
498
+ task.metadata AS metadata,
499
+ count(*) AS task_count
500
+ FROM descendant_ids
501
+ JOIN tasks task ON task.id = descendant_ids.task_id
502
+ WHERE NOT ${this.descendantSkippedSql("task")}
503
+ GROUP BY descendant_ids.root_task_id, task.status, task.error, task.metadata
504
+ `);for(let g of p){let h=o[g.root_task_id]??=_i(i);hi(h,xe(g),Ke(g),g.task_count);}}catch(p){throw p instanceof f?p:new f("DB_ERROR","Failed to batch summarize thread task statuses",p)}finally{l.close();}}return {tasksByThread:s,descendantSummaryByTaskId:o}}listDescendantsByTaskId(e,n,r={}){let s=new Set(r.states??M_),o=pc(r.limit,cc,cc),i=pc(r.maxDepth,lr,lr),u=r.cursor?U_(r.cursor):void 0;for(let d of this.resolveDbPaths()){if(!existsSync(d))continue;let c=$(d);try{if(!c.db.get(sql`
505
+ SELECT anchor.id FROM tasks anchor
506
+ WHERE anchor.id = ${e} AND anchor.workspace_id = ${n}
507
+ `))continue;let p=sql`
508
+ SELECT own.id
509
+ FROM tasks own INDEXED BY idx_tasks_thread_id
510
+ WHERE own.thread_id = (
511
+ SELECT anchor.thread_id FROM tasks anchor
512
+ WHERE anchor.id = ${e} AND anchor.workspace_id = ${n}
513
+ )
514
+ AND own.workspace_id = ${n}
515
+ `,g=c.db.all(sql`
516
+ ${this.descendantTraversalSql(p,sql`SELECT ${e}`,i)}
517
+ SELECT
518
+ task.id AS task_id,
519
+ task.parent_task_id AS parent_task_id,
520
+ task.status AS status,
521
+ task.error AS error,
522
+ task.metadata AS metadata,
523
+ task.started_at AS started_at,
524
+ descendant_ids.depth AS depth,
525
+ parent.agent_id AS parent_agent_id,
526
+ CASE
527
+ WHEN descendant_ids.depth >= ${i}
528
+ AND EXISTS (
529
+ SELECT 1 FROM tasks deeper INDEXED BY idx_tasks_parent_task_id
530
+ WHERE deeper.parent_task_id = task.id
531
+ )
532
+ THEN 1 ELSE 0
533
+ END AS has_deeper,
534
+ CASE WHEN ${this.descendantSkippedSql("task")} THEN 1 ELSE 0 END AS skipped
535
+ FROM descendant_ids
536
+ JOIN tasks task ON task.id = descendant_ids.task_id
537
+ LEFT JOIN tasks parent ON parent.id = task.parent_task_id
538
+ `),h=_i(new Date().toISOString()),m=!1,E=[];for(let N of g){if(N.has_deeper&&(m=!0),N.skipped)continue;let R=xe(N);hi(h,R,Ke(N),1),s.has(R)&&E.push({row:N,key:[$_(R),N.started_at?N.started_at:null,N.task_id]});}E.sort((N,R)=>lc(N.key,R.key));let S=u?E.filter(N=>lc(N.key,u)>0):E,D=S.slice(0,o),y=S.length>D.length?H_(D[D.length-1].key):null,x=new Map;if(D.length>0){let N=c.db.select(re).from(a).where(inArray(a.id,D.map(R=>R.row.task_id))).all();for(let R of N)x.set(R.id,cr(R));}let I=[];for(let{row:N}of D){let R=x.get(N.task_id);!R||!N.parent_task_id||I.push({task:R,parentTaskId:N.parent_task_id,parentAgentId:N.parent_agent_id,depth:N.depth});}return {rows:I,summary:h,nextCursor:y,traversalTruncated:m}}catch(l){throw l instanceof f?l:new f("DB_ERROR","Failed to list task descendants",l)}finally{c.close();}}}findInterceptedRequests(e){let n=new Map;if(e.length===0)return n;for(let r of this.resolveDbPaths()){if(!existsSync(r))continue;let s=$(r);try{let o=s.db.all(sql`
539
+ SELECT task_id, input FROM task_provider_inputs
540
+ WHERE run_epoch = 0
541
+ AND task_id IN (${sql.join(e.map(i=>sql`${i}`),sql`, `)})
542
+ `);for(let i of o)n.set(i.task_id,i.input);}catch{}finally{s.close();}}return n}findTopLevelTasks(e,n,r,s){let o=this.resolveDbPaths(),i=s?sql`(${this.topLevelTaskPredicateSql()} OR child.agent_id = ${s})`:this.topLevelTaskPredicateSql(),u=new Set,d=[];for(let c of o){if(!existsSync(c))continue;let l=$(c);try{let p;r!==void 0?p=l.db.all(sql`
280
543
  SELECT * FROM (
281
544
  SELECT child.*,
282
545
  ROW_NUMBER() OVER (PARTITION BY child.agent_id ORDER BY child.started_at DESC) AS rn
283
546
  FROM tasks child
284
- WHERE child.thread_id = ${t}
285
- AND ${this.topLevelTaskPredicateSql()}
286
- ${e?sql`AND child.workspace_id = ${e}`:sql``}
547
+ WHERE child.thread_id = ${e}
548
+ AND ${i}
549
+ ${n?sql`AND child.workspace_id = ${n}`:sql``}
287
550
  ) ranked
288
- WHERE rn <= ${n}
551
+ WHERE rn <= ${r}
289
552
  ORDER BY started_at ASC
290
- `):l=c.db.all(sql`
553
+ `):p=l.db.all(sql`
291
554
  SELECT child.* FROM tasks child
292
- WHERE child.thread_id = ${t}
293
- AND ${this.topLevelTaskPredicateSql()}
294
- ${e?sql`AND child.workspace_id = ${e}`:sql``}
555
+ WHERE child.thread_id = ${e}
556
+ AND ${i}
557
+ ${n?sql`AND child.workspace_id = ${n}`:sql``}
295
558
  ORDER BY child.started_at ASC
296
- `);for(let u of l)o.has(u.id)||(o.add(u.id),i.push(u));}catch(l){throw new _("DB_ERROR","Failed to find top-level tasks",l)}finally{c.close();}}if(n!==void 0&&s.length>1){let a=new Map;for(let c of i){let l=c.agent_id??"";a.has(l)||a.set(l,[]),a.get(l).push(c);}i=[];for(let c of a.values())c.sort((l,u)=>(u.started_at??"").localeCompare(l.started_at??"")),i.push(...c.slice(0,n));i.sort((c,l)=>(c.started_at??"").localeCompare(l.started_at??""));}return i}findAllTasks(t,e){let n=this.resolveDbPaths(),s=new Set,o=[];for(let i of n){if(!existsSync(i))continue;let a=R(i);try{let c=eq(r.thread_id,t),l=e?and(c,eq(r.workspace_id,e)):c,u=a.db.select().from(r).where(l).orderBy(asc(r.started_at)).all();for(let f of u)s.has(f.id)||(s.add(f.id),o.push(f));}catch(c){throw new _("DB_ERROR","Failed to find all tasks for thread",c)}finally{a.close();}}return o}findTaskById(t,e,n){let s=this.resolveDbPaths();for(let o of s){if(!existsSync(o))continue;let i=R(o);try{let a=and(eq(r.id,e),eq(r.thread_id,t)),c=n?and(a,eq(r.workspace_id,n)):a,l=i.db.select().from(r).where(c).limit(1).get();if(!l)continue;let u=i.db.select().from(r).where(eq(r.parent_task_id,l.id)).orderBy(asc(r.started_at)).all();return {task:l,children:u}}catch(a){throw new _("DB_ERROR","Failed to find task by id",a)}finally{i.close();}}}batchFetchTasksQuery(t,e){return sql`
559
+ `);for(let g of p)u.has(g.id)||(u.add(g.id),d.push(cr(g)));}catch(p){throw new f("DB_ERROR","Failed to find top-level tasks",p)}finally{l.close();}}if(r!==void 0&&o.length>1){let c=new Map;for(let l of d){let p=l.agent_id??"";c.has(p)||c.set(p,[]),c.get(p).push(l);}d=[];for(let l of c.values())l.sort((p,g)=>(g.started_at??"").localeCompare(p.started_at??"")),d.push(...l.slice(0,r));d.sort((l,p)=>(l.started_at??"").localeCompare(p.started_at??""));}return d}findAllTasks(e,n){let r=this.resolveDbPaths(),s=new Set,o=[];for(let i of r){if(!existsSync(i))continue;let u=$(i);try{let d=eq(a.thread_id,e),c=n?and(d,eq(a.workspace_id,n)):d,l=u.db.select(re).from(a).where(c).orderBy(asc(a.started_at)).all();for(let p of l)s.has(p.id)||(s.add(p.id),o.push(cr(p)));}catch(d){throw new f("DB_ERROR","Failed to find all tasks for thread",d)}finally{u.close();}}return o}findRespondedAgents(e,n){let r=this.resolveDbPaths(),s=new Map;for(let o of r){if(!existsSync(o))continue;let i=$(o,{readOnly:true});try{let u=[eq(a.thread_id,e),sql`${a.completed_at} IS NOT NULL`,sql`length(trim(coalesce(${a.result}, ''))) > 0`];n&&u.push(eq(a.workspace_id,n));let d=i.db.select({agentId:a.agent_id,lastRepliedAt:sql`MAX(${a.completed_at})`}).from(a).where(and(...u)).groupBy(a.agent_id).all();for(let c of d){let l=s.get(c.agentId);c.lastRepliedAt&&(!l||c.lastRepliedAt>l)&&s.set(c.agentId,c.lastRepliedAt);}}catch(u){throw new f("DB_ERROR","Failed to find responded agents for thread",u)}finally{i.close();}}return [...s.entries()].map(([o,i])=>({agentId:o,lastRepliedAt:i})).sort((o,i)=>(o.lastRepliedAt===i.lastRepliedAt?0:o.lastRepliedAt>i.lastRepliedAt?-1:1)||(o.agentId===i.agentId?0:o.agentId<i.agentId?-1:1))}findTaskById(e,n,r){let s=this.resolveDbPaths();for(let o of s){if(!existsSync(o))continue;let i=$(o);try{let u=and(eq(a.id,n),eq(a.thread_id,e)),d=r?and(u,eq(a.workspace_id,r)):u,c=i.db.select(re).from(a).where(d).limit(1).get();if(!c)continue;let l=i.db.select(re).from(a).where(eq(a.parent_task_id,c.id)).orderBy(asc(a.started_at)).all().map(cr);return {task:cr(c),children:l}}catch(u){throw new f("DB_ERROR","Failed to find task by id",u)}finally{i.close();}}}batchFetchTasksQuery(e,n){return sql`
297
560
  SELECT child.id, child.thread_id, child.agent_id, child.status,
298
561
  child.parent_task_id, child.started_at, child.completed_at,
299
562
  child.duration_ms, child.input_tokens, child.output_tokens,
300
- child.cost_usd, child.error
563
+ child.cost_usd, child.error, child.rating, child.rated_at, child.metadata
301
564
  FROM tasks child INDEXED BY idx_tasks_thread_id
302
- WHERE child.thread_id IN (${sql.join(t.map(n=>sql`${n}`),sql`, `)})
565
+ WHERE child.thread_id IN (${sql.join(e.map(r=>sql`${r}`),sql`, `)})
303
566
  AND ${this.topLevelTaskPredicateSql()}
304
- ${e?sql`AND child.workspace_id = ${e}`:sql``}
567
+ ${n?sql`AND child.workspace_id = ${n}`:sql``}
305
568
  ORDER BY child.started_at ASC
306
- `}batchFetchTasks(t,e){let n=new Map;if(t.length===0)return n;let s=this.resolveDbPaths();for(let o of s){if(!existsSync(o))continue;let i=R(o);try{let a=i.db.all(this.batchFetchTasksQuery(t,e));for(let c of a){let l=c.thread_id;n.has(l)||n.set(l,[]),n.get(l).push(c);}}catch(a){throw new _("DB_ERROR","Failed to batch fetch tasks",a)}finally{i.close();}}return n}explainBatchFetchTasksPlan(t,e){let n=this.resolveDbPaths();for(let s of n){if(!existsSync(s))continue;let o=R(s);try{return o.db.all(sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(t,e)}`).map(a=>a.detail)}finally{o.close();}}return []}updateThreadTitle(t,e,n){if(!this.dbExists())return;let s=this.openHandle(true);try{let o=eq(p.id,t),i=n?and(o,eq(p.workspace_id,n)):o;if(!s.db.select({id:p.id}).from(p).where(i).limit(1).get())return;s.db.update(p).set({title:e,title_locked:1,updated_at:new Date().toISOString()}).where(eq(p.id,t)).run();}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to update thread title",o)}finally{s.close();}}upsertThread(t,e){let n=this.openHandle(true);try{let s=e.workspaceId?this.validateWorkspaceId(n,e.workspaceId):null,o=new Date().toISOString();if(n.db.select({id:p.id,message_count:p.message_count}).from(p).where(eq(p.id,t)).limit(1).get()){let a={updated_at:o};e.title!==void 0&&(a.title=e.title),e.titleLocked!==void 0&&(a.title_locked=e.titleLocked?1:0),n.db.update(p).set(a).where(eq(p.id,t)).run();}else n.db.insert(p).values({id:t,platform:e.platform,workspace_id:s,title:e.title??null,title_locked:e.titleLocked?1:0,message_count:0,created_at:o,updated_at:o}).run();}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to upsert thread",s)}finally{n.close();}}ensureThread(t,e,n){let s=this.openHandle(true);try{let o=n?this.validateWorkspaceId(s,n):null,i=s.db.select({id:p.id,platform:p.platform,workspace_id:p.workspace_id}).from(p).where(eq(p.id,t)).limit(1).get();if(i){o&&!i.workspace_id&&s.db.update(p).set({workspace_id:o}).where(eq(p.id,t)).run();return}let a=new Date().toISOString();s.db.insert(p).values({id:t,platform:e,workspace_id:o,message_count:0,created_at:a,updated_at:a}).run();}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to ensure thread",o)}finally{s.close();}}saveUserMessage(t,e,n){if(!this.dbExists())return {firstMessage:false};let s=this.openHandle(true);try{let o=new Date().toISOString();return {firstMessage:s.db.transaction(a=>{let l=a.select({message_count:p.message_count}).from(p).where(eq(p.id,t)).limit(1).get()?.message_count===0;return a.run(sql`
569
+ `}batchFetchTasks(e,n){let r=new Map;if(e.length===0)return r;let s=this.resolveDbPaths();for(let o of s){if(!existsSync(o))continue;let i=$(o);try{let u=i.db.all(this.batchFetchTasksQuery(e,n));for(let d of u){let c=d.thread_id;r.has(c)||r.set(c,[]),r.get(c).push(L_(d));}}catch(u){throw new f("DB_ERROR","Failed to batch fetch tasks",u)}finally{i.close();}}return r}findThreadOriginsQuery(e,n){return sql`
570
+ WITH root AS (
571
+ SELECT child.thread_id, child.id, child.caller_agent_id, child.parent_task_id,
572
+ CASE
573
+ WHEN json_valid(child.metadata) = 1
574
+ THEN json_extract(child.metadata, '$.schedule_id')
575
+ ELSE NULL
576
+ END AS schedule_id,
577
+ child.platform,
578
+ ROW_NUMBER() OVER (
579
+ PARTITION BY child.thread_id
580
+ ORDER BY child.started_at ASC, child.id ASC
581
+ ) AS rn
582
+ FROM tasks child INDEXED BY idx_tasks_thread_id
583
+ WHERE child.thread_id IN (${sql.join(e.map(r=>sql`${r}`),sql`, `)})
584
+ AND ${this.topLevelTaskPredicateSql("child","idx_tasks_thread_creator")}
585
+ ${n?sql`AND child.workspace_id = ${n}`:sql``}
586
+ )
587
+ SELECT root.id AS task_id, root.thread_id, root.caller_agent_id, root.parent_task_id,
588
+ root.schedule_id, root.platform,
589
+ parent.thread_id AS parent_thread_id, parent.agent_id AS parent_agent_id
590
+ FROM root
591
+ LEFT JOIN tasks parent INDEXED BY idx_tasks_thread_creator
592
+ ON parent.id = root.parent_task_id
593
+ WHERE root.rn = 1
594
+ `}findCreatorPointersQuery(e,n){let r=[sql`thread.id IN (${sql.join(e.map(s=>sql`${s}`),sql`, `)})`];return n&&r.unshift(sql`thread.workspace_id = ${n}`),sql`
595
+ SELECT thread.id AS thread_id, thread.created_by_kind, thread.created_by_id,
596
+ thread.created_by_task_id,
597
+ creator.id AS creator_task_id,
598
+ creator.actor_kind AS creator_actor_kind,
599
+ creator.actor_id AS creator_actor_id,
600
+ CASE WHEN unverified.thread_id IS NULL THEN 0 ELSE 1 END AS creator_pointer_unverified
601
+ FROM threads AS thread
602
+ LEFT JOIN tasks AS creator INDEXED BY idx_tasks_thread_creator
603
+ ON creator.id = thread.created_by_task_id
604
+ AND creator.thread_id = thread.id
605
+ LEFT JOIN thread_creator_unverified AS unverified
606
+ ON unverified.thread_id = thread.id
607
+ AND unverified.created_by_task_id = thread.created_by_task_id
608
+ WHERE ${sql.join(r,sql` AND `)}
609
+ `}findTaskOriginLineageQuery(e){return sql`
610
+ SELECT child.id AS task_id, child.thread_id, child.caller_agent_id, child.parent_task_id,
611
+ CASE
612
+ WHEN json_valid(child.metadata) = 1
613
+ THEN json_extract(child.metadata, '$.schedule_id')
614
+ ELSE NULL
615
+ END AS schedule_id,
616
+ child.platform,
617
+ parent.thread_id AS parent_thread_id, parent.agent_id AS parent_agent_id
618
+ FROM tasks AS child
619
+ LEFT JOIN tasks AS parent ON parent.id = child.parent_task_id
620
+ WHERE child.id IN (${sql.join(e.map(n=>sql`${n}`),sql`, `)})
621
+ `}findThreadOrigins(e,n){let r=new Map;if(e.length===0)return r;let s=this.resolveDbPaths();for(let o of s){if(!existsSync(o))continue;let i=$(o);try{for(let u=0;u<e.length;u+=Ts){let d=e.slice(u,u+Ts),l=i.db.all(this.findCreatorPointersQuery(d,n)).filter(y=>!r.has(y.thread_id)),p=l.filter(y=>y.creator_task_id!==null&&y.creator_pointer_unverified===0&&y.creator_actor_kind===null).map(y=>y.creator_task_id),g=p.length>0?i.db.all(this.findTaskOriginLineageQuery(p)):[],h=new Map(g.map(y=>[y.task_id,y])),m=new Map(l.map(y=>[y.thread_id,y])),E=d.filter(y=>{if(r.has(y))return !1;let x=m.get(y);return x?!(x.creator_task_id!==null&&x.creator_pointer_unverified===0)&&x.created_by_kind===null:!0}),S=E.length>0?i.db.all(this.findThreadOriginsQuery(E,n)):[],D=new Map(S.map(y=>[y.thread_id,y]));for(let y of l){if(r.has(y.thread_id))continue;let x=dc(y,y.created_by_task_id!==null?h.get(y.created_by_task_id):void 0,D.get(y.thread_id));x&&r.set(y.thread_id,x);}for(let y of S)r.has(y.thread_id)||m.has(y.thread_id)||r.set(y.thread_id,ms(y));}}catch(u){throw new f("DB_ERROR","Failed to fetch thread origins",u)}finally{i.close();}}return r}findThreadsByOrigin(e,n){let r=this.readThreadIds(n,"Failed to find threads by origin"),s=this.findThreadOrigins(r,n),o=r.filter(u=>gc(s.get(u),e));return this.readThreadRowsByIds(o,n,"Failed to find threads by origin").sort(_c)}findRecentDirectThreads(e,n=5){if(typeof e!="string"||e.trim().length===0)throw new f("VALIDATION","workspaceId is required");if(!Number.isInteger(n)||n<=0)throw new f("VALIDATION","limit must be a positive integer");let r=this.readThreadSortKeys(e).sort(_c),s=[],o=new Map;for(let c=0;c<r.length;c+=fc){let l=r.slice(c,c+fc),p=this.findThreadOrigins(l.map(g=>g.id),e);for(let[g,h]of p)o.set(g,h);for(let g of l)if(gc(p.get(g.id),"direct")&&(s.push(g.id),s.length===n))break;if(s.length===n)break}let i=new Map;if(s.length>0){let c=this.readThreadRowsByIds(s,e,"Failed to find recent direct threads");for(let l of c)i.set(l.id,l);}let u=[],d=new Map;for(let c of s){let l=i.get(c);if(!l)continue;u.push(l);let p=o.get(c);p&&d.set(c,p);}return {threads:u,originsByThread:d}}explainBatchFetchTasksPlan(e,n){let r=this.resolveDbPaths();for(let s of r){if(!existsSync(s))continue;let o=$(s);try{return o.db.all(sql`EXPLAIN QUERY PLAN ${this.batchFetchTasksQuery(e,n)}`).map(u=>u.detail)}finally{o.close();}}return []}explainFindThreadOriginsPlan(e,n){if(e.length===0)return [];let r=this.resolveDbPaths();for(let s of r){if(!existsSync(s))continue;let o=$(s);try{let i=o.db.all(sql`EXPLAIN QUERY PLAN ${this.findCreatorPointersQuery(e,n)}`),u=o.db.all(sql`EXPLAIN QUERY PLAN ${this.findTaskOriginLineageQuery(e)}`),d=o.db.all(sql`EXPLAIN QUERY PLAN ${this.findThreadOriginsQuery(e,n)}`);return [...i,...u,...d].map(c=>c.detail)}finally{o.close();}}return []}explainFindThreadsByOriginPlan(e,n){let r=`__thread_origin_${e}_plan__`,s=this.resolveDbPaths();for(let o of s){if(!existsSync(o))continue;let i=$(o);try{let u=i.db.all(sql`EXPLAIN QUERY PLAN ${this.findThreadIdsQuery(n)}`),d=i.db.all(sql`EXPLAIN QUERY PLAN ${this.findCreatorPointersQuery([r],n)}`),c=i.db.all(sql`EXPLAIN QUERY PLAN ${this.findTaskOriginLineageQuery([r])}`),l=i.db.all(sql`EXPLAIN QUERY PLAN ${this.findThreadOriginsQuery([r],n)}`);return [...u,...d,...c,...l].map(p=>p.detail)}finally{i.close();}}return []}updateThreadTitle(e,n,r){if(!this.dbExists())return;let s=this.openHandle(true);try{let o=eq(k.id,e),i=r?and(o,eq(k.workspace_id,r)):o;if(!s.db.select({id:k.id}).from(k).where(i).limit(1).get())return;s.db.update(k).set({title:n,title_locked:1,updated_at:new Date().toISOString()}).where(eq(k.id,e)).run();}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to update thread title",o)}finally{s.close();}}upsertThread(e,n){let r=this.openHandle(true);try{r.db.transaction(s=>{let i=(n.workspaceId?s.select({id:ne.id}).from(ne).where(eq(ne.id,n.workspaceId)).limit(1).get():void 0)?n.workspaceId:null,u=new Date().toISOString(),d=s.select({id:k.id,message_count:k.message_count,created_by_task_id:k.created_by_task_id}).from(k).where(eq(k.id,e)).limit(1).get();if(d){let c={updated_at:u};n.title!==void 0&&(c.title=n.title),n.titleLocked!==void 0&&(c.title_locked=n.titleLocked?1:0),d.created_by_task_id===null&&n.createdByTaskId!=null&&d.message_count===0&&!hc(s,e,n.createdByTaskId)&&(c.created_by_task_id=n.createdByTaskId),s.update(k).set(c).where(eq(k.id,e)).run();}else s.insert(k).values({id:e,platform:n.platform,workspace_id:i,created_by_kind:null,created_by_id:null,created_by_task_id:n.createdByTaskId??null,title:n.title??null,title_locked:n.titleLocked?1:0,message_count:0,created_at:u,updated_at:u}).run();},{behavior:"immediate"});}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to upsert thread",s)}finally{r.close();}}ensureThread(e,n,r,s){let o=this.openHandle(true);try{o.db.transaction(i=>{let d=(r?i.select({id:ne.id}).from(ne).where(eq(ne.id,r)).limit(1).get():void 0)?r:null,c=i.select({id:k.id,platform:k.platform,workspace_id:k.workspace_id,message_count:k.message_count,created_by_task_id:k.created_by_task_id}).from(k).where(eq(k.id,e)).limit(1).get();if(c){let p={};d&&!c.workspace_id&&(p.workspace_id=d),c.created_by_task_id===null&&s?.createdByTaskId!=null&&c.message_count===0&&!hc(i,e,s.createdByTaskId)&&(p.created_by_task_id=s.createdByTaskId),Object.keys(p).length>0&&i.update(k).set(p).where(eq(k.id,e)).run();return}let l=new Date().toISOString();i.insert(k).values({id:e,platform:n,workspace_id:d,created_by_kind:null,created_by_id:null,created_by_task_id:s?.createdByTaskId??null,message_count:0,created_at:l,updated_at:l}).run();},{behavior:"immediate"});}catch(i){throw i instanceof f?i:new f("DB_ERROR","Failed to ensure thread",i)}finally{o.close();}}saveUserMessage(e,n,r){if(!this.dbExists())return {firstMessage:false};let s=this.openHandle(true);try{let o=new Date().toISOString();return {firstMessage:s.db.transaction(u=>{let c=u.select({message_count:k.message_count}).from(k).where(eq(k.id,e)).limit(1).get()?.message_count===0;return u.run(sql`
307
622
  UPDATE threads
308
- SET first_message = COALESCE(first_message, ${e}),
309
- title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${e}, 1, 60) ELSE title END,
310
- last_message = ${e},
623
+ SET first_message = COALESCE(first_message, ${n}),
624
+ title = CASE WHEN title_locked = 0 AND title IS NULL THEN substr(${n}, 1, 60) ELSE title END,
625
+ last_message = ${n},
311
626
  message_count = message_count + 1,
312
627
  updated_at = ${o}
313
- WHERE id = ${t}
314
- `),l},{behavior:"immediate"})}}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to save user message",o)}finally{s.close();}}saveAssistantMessage(t,e,n){if(!this.dbExists())return;let s=this.openHandle(true);try{let o=new Date().toISOString();s.db.update(p).set({last_message:e,updated_at:o}).where(eq(p.id,t)).run();}catch(o){throw o instanceof _?o:new _("DB_ERROR","Failed to save assistant message",o)}finally{s.close();}}updateThread(t,e){if(!this.dbExists())return;let n=this.openHandle(true);try{let s={updated_at:new Date().toISOString()};e.title!==void 0&&(s.title=e.title,s.title_locked=1),e.titleLocked!==void 0&&(s.title_locked=e.titleLocked?1:0),n.db.update(p).set(s).where(eq(p.id,t)).run();}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to update thread",s)}finally{n.close();}}togglePin(t,e){let n=this.openHandle(true);try{let s=e?and(eq(p.id,t),eq(p.workspace_id,e)):eq(p.id,t),o=n.db.select({pinned:p.pinned,metadata:p.metadata}).from(p).where(s).get();if(!o)return null;let i=o.pinned?0:1,a=o.metadata?JSON.parse(o.metadata):{};if(i){let c=e?and(eq(p.pinned,1),eq(p.workspace_id,e)):eq(p.pinned,1),l=n.db.select({metadata:p.metadata}).from(p).where(c).all(),u=0;for(let f of l){let m=f.metadata?JSON.parse(f.metadata):{};typeof m.pinOrder=="number"&&m.pinOrder>u&&(u=m.pinOrder);}a.pinOrder=u+1;}else delete a.pinOrder;return n.db.update(p).set({pinned:i,metadata:Object.keys(a).length>0?JSON.stringify(a):null}).where(s).run(),{pinned:!!i}}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to toggle pin",s)}finally{n.close();}}reorderPins(t,e){let n=this.openHandle(true);try{for(let s=0;s<t.length;s++){let o=e?and(eq(p.id,t[s]),eq(p.workspace_id,e)):eq(p.id,t[s]),i=n.db.select({metadata:p.metadata}).from(p).where(o).get();if(!i)continue;let a=i.metadata?JSON.parse(i.metadata):{};a.pinOrder=s+1,n.db.update(p).set({metadata:JSON.stringify(a)}).where(o).run();}}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to reorder pins",s)}finally{n.close();}}toggleStar(t,e){let n=this.openHandle(true);try{let s=e?and(eq(p.id,t),eq(p.workspace_id,e)):eq(p.id,t),o=n.db.select({starred:p.starred}).from(p).where(s).get();if(!o)return null;let i=o.starred?0:1;return n.db.update(p).set({starred:i}).where(s).run(),{starred:!!i}}catch(s){throw s instanceof _?s:new _("DB_ERROR","Failed to toggle star",s)}finally{n.close();}}resolveOverdriveForRequest(t,e,n,s){let i=this.openHandle(true);try{let a=e?and(eq(p.id,t),eq(p.workspace_id,e)):eq(p.id,t);return i.db.transaction(l=>{let u=l.select({metadata:p.metadata}).from(p).where(a).get();if(!u)return null;let f=u.metadata?JSON.parse(u.metadata):{},m=f.overdrive??{},T=s?.defaultTurns??m.defaultTurns??3,X=s?.updatedBy??"ui",U=new Date().toISOString(),O,$,L,Q;switch(n){case "enable-count":{let Z=s?.turns??T,tt=s?.consumeCurrent?Math.max(Z-1,0):Z;O=tt>0?"count":"off",$=tt,L=!0,Q="count";break}case "enable-latch":{O="latch",$=0,L=!0,Q="latch";break}case "disable":{O="off",$=0,L=!1;break}default:{let Z=m.state??"off",tt=typeof m.remaining=="number"?m.remaining:0;if(Z==="count"&&tt>0){let bt=tt-1;bt<=0?(O="off",$=0):(O="count",$=bt),L=!0,Q="count";}else Z==="latch"?(O="latch",$=0,L=!0,Q="latch"):(O="off",$=0,L=!1);break}}return f.overdrive={state:O,remaining:$,defaultTurns:T,updatedAt:U,updatedBy:X},l.update(p).set({metadata:JSON.stringify(f),updated_at:U}).where(a).run(),{applied:L,appliedMode:Q,state:O,remaining:$}},{behavior:"immediate"})}catch(a){throw a instanceof _?a:new _("DB_ERROR","Failed to resolve overdrive",a)}finally{i.close();}}};function He(d){return d.replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
628
+ WHERE id = ${e}
629
+ `),c},{behavior:"immediate"})}}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to save user message",o)}finally{s.close();}}saveAssistantMessage(e,n,r){if(!this.dbExists())return;let s=this.openHandle(true);try{let o=new Date().toISOString();s.db.update(k).set({last_message:n,updated_at:o}).where(eq(k.id,e)).run();}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to save assistant message",o)}finally{s.close();}}updateThread(e,n){if(!this.dbExists())return;let r=this.openHandle(true);try{let s={updated_at:new Date().toISOString()};n.title!==void 0&&(s.title=n.title,s.title_locked=1),n.titleLocked!==void 0&&(s.title_locked=n.titleLocked?1:0),r.db.update(k).set(s).where(eq(k.id,e)).run();}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to update thread",s)}finally{r.close();}}patchThreadTitleMetadata(e,n,r){let s=n;if(!s||typeof s!="object"||Array.isArray(s))return new An("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch must be an object");if(Object.keys(s).some(d=>d!=="priority"&&d!=="state"))return new An("THREAD_TITLE_PATCH_INVALID","Thread-title metadata patch only supports priority and state");let i=s;if(i.priority===void 0&&i.state===void 0)return new An("THREAD_TITLE_PATCH_EMPTY","Thread-title metadata patch must change priority or state");for(let d of [i.priority,i.state])if(d!=null&&(typeof d!="string"||d.length===0))return new An("THREAD_TITLE_PATCH_INVALID","Thread-title metadata values must be non-empty strings or null");let u=this.openHandle(true);try{let d=r?and(eq(k.id,e),eq(k.workspace_id,r)):eq(k.id,e);return u.db.transaction(c=>{let l=c.select({metadata:k.metadata}).from(k).where(d).get();if(!l)return null;let p=On(l.metadata),g=p.threadTitle,h=g&&typeof g=="object"&&!Array.isArray(g)?{...g}:{};i.priority===null?delete h.priority:i.priority!==void 0&&(h.priority=i.priority),i.state===null?delete h.state:i.state!==void 0&&(h.state=i.state),Object.keys(h).length>0?p.threadTitle=h:delete p.threadTitle;let m=Object.keys(p).length>0?JSON.stringify(p):null,E=new Date().toISOString();c.update(k).set({metadata:m,updated_at:E}).where(d).run();let S=c.select({metadata:k.metadata}).from(k).where(d).get();if(!S)throw new f("DB_ERROR","Thread-title metadata update could not be read back");let D=q_(S.metadata);return {threadId:e,priority:D.priority,state:D.state}},{behavior:"immediate"})}catch(d){throw d instanceof f?d:new f("DB_ERROR","Failed to patch thread-title metadata",d)}finally{u.close();}}togglePin(e,n){let r=this.openHandle(true);try{return r.db.transaction(s=>B_(s,e,n),{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to toggle pin",s)}finally{r.close();}}reorderPins(e,n){let r=this.openHandle(true);try{r.db.transaction(s=>W_(s,e,n),{behavior:"immediate"});}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to reorder pins",s)}finally{r.close();}}toggleStar(e,n){let r=this.openHandle(true);try{let s=n?and(eq(k.id,e),eq(k.workspace_id,n)):eq(k.id,e),o=r.db.select({starred:k.starred}).from(k).where(s).get();if(!o)return null;let i=o.starred?0:1;return r.db.update(k).set({starred:i}).where(s).run(),{starred:!!i}}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to toggle star",s)}finally{r.close();}}resolveOverdriveForRequest(e,n,r,s){let i=this.openHandle(true);try{let u=n?and(eq(k.id,e),eq(k.workspace_id,n)):eq(k.id,e);return i.db.transaction(c=>{let l=c.select({metadata:k.metadata}).from(k).where(u).get();if(!l)return null;let p=l.metadata?JSON.parse(l.metadata):{},g=p.overdrive??{},h=s?.defaultTurns??g.defaultTurns??3,m=s?.updatedBy??"ui",E=new Date().toISOString(),S,D,y,x;switch(r){case "enable-count":{let I=s?.turns??h,N=s?.consumeCurrent?Math.max(I-1,0):I;S=N>0?"count":"off",D=N,y=!0,x="count";break}case "enable-latch":{S="latch",D=0,y=!0,x="latch";break}case "disable":{S="off",D=0,y=!1;break}default:{let I=g.state??"off",N=typeof g.remaining=="number"?g.remaining:0;if(I==="count"&&N>0){let R=N-1;R<=0?(S="off",D=0):(S="count",D=R),y=!0,x="count";}else I==="latch"?(S="latch",D=0,y=!0,x="latch"):(S="off",D=0,y=!1);break}}return p.overdrive={state:S,remaining:D,defaultTurns:h,updatedAt:E,updatedBy:m},c.update(k).set({metadata:JSON.stringify(p),updated_at:E}).where(u).run(),{applied:y,appliedMode:x,state:S,remaining:D}},{behavior:"immediate"})}catch(u){throw u instanceof f?u:new f("DB_ERROR","Failed to resolve overdrive",u)}finally{i.close();}}};_();kt();Ct();Dt();mt();_();var mi="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function G_(t){let e=randomBytes(t*2),n="";for(let r=0;r<e.length&&n.length<t;r++){let s=e[r];s<248&&(n+=mi[s%62]);}for(;n.length<t;)n+=mi[randomBytes(1)[0]%62];return n}function pr(t){return `${t}_${G_(8)}`}function kc(t,e){let{createHash:n}=Zt("crypto"),r=n("sha256").update(e).digest(),s=Buffer.alloc(8);for(let i=0;i<32;i++)s[i%8]^=r[i];let o="";for(let i of s)o+=mi[i%62];return `${t}_${o}`}Bt();_();var j_=["urgent","high","medium","low"],z_=["investigating","in-progress","in-review","on-hold","done"],Tc="custom:";var K_=new Set(j_),J_=new Set(z_);function ki(t){return typeof t=="string"&&K_.has(t)}function Ti(t){if(typeof t!="string")return false;if(J_.has(t))return true;if(t.startsWith("c_"))return t.length>2;if(!t.startsWith(Tc))return false;let e=t.slice(Tc.length);return e.length>=1&&e.length<=20}function yc(t){if(!t)return null;try{let e=JSON.parse(t);return !e||typeof e!="object"||Array.isArray(e)?null:e}catch{return null}}function yi(t){let e=yc(t);if(!e)return {};let n=e.threadTitle;if(!n||typeof n!="object"||Array.isArray(n))return {};let r=n,s={};return ki(r.priority)&&(s.priority=r.priority),Ti(r.state)&&(s.state=r.state),s}function wc(t,e){let n=yc(t)??{},r={...yi(t)};return e.priority===null?delete r.priority:e.priority!==void 0&&(r.priority=e.priority),e.state===null?delete r.state:e.state!==void 0&&(r.state=e.state),r.priority===void 0&&r.state===void 0?delete n.threadTitle:n.threadTitle=r,Object.keys(n).length===0?null:JSON.stringify(n)}Qn();var Z_="regeneration_replaced";var eh="THREAD_HIGHLIGHT_REGENERATION_INTERRUPTED";var th="THREAD_HIGHLIGHT_REGENERATION_COMMIT_FAILED",Ri=class extends f{threadId;highlightId;expectedRevision;currentRevision;constructor(e,n,r,s){super("CONFLICT",`Highlight revision conflict: expected ${r}, current ${s}`),this.name="ThreadHistoryConflictError",this.threadId=e,this.highlightId=n,this.expectedRevision=r,this.currentRevision=s;}},Tr=class extends Ri{},Si=class extends f{stableCode="THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS";run;constructor(e){super("CONFLICT","THREAD_HIGHLIGHT_REGENERATION_IN_PROGRESS"),this.name="ThreadHighlightRegenerationConflictError",this.run=e;}},nh=new Set(Oa),rh=new Set(Aa),sh=new Set(Na),oh=new Set(ba),ih=50,Rc=100,Sc=280,Ic=40,ah=new Set(va),ws=["queued","running"];function Ei(t){return ah.has(t)}function z(t){throw new f("VALIDATION",t)}function Qe(t){throw new f("NOT_FOUND",t)}function H(t,e){(typeof t!="string"||t.trim().length===0)&&z(`${e} is required`);}function gr(t={}){let e=t.actor??t,n=e.actorType??"system";return nh.has(n)||z(`invalid actorType: ${String(n)}`),e.actorId!==void 0&&e.actorId!==null&&typeof e.actorId!="string"&&z("actorId must be a string or null"),{actorType:n,actorId:e.actorId??null}}function dh(t){H(t.threadId,"threadId"),t.workspaceId!==void 0&&t.workspaceId!==null&&H(t.workspaceId,"workspaceId"),t.title!==void 0&&t.title!==null&&((typeof t.title!="string"||t.title.trim().length===0)&&z("title must not be empty"),t.title.length>120&&z("title must be at most 120 characters")),t.priority!==void 0&&t.priority!==null&&!ki(t.priority)&&z(`invalid priority: ${String(t.priority)}`),t.state!==void 0&&t.state!==null&&!Ti(t.state)&&z(`invalid state: ${String(t.state)}`);}function uh(t){t.beforeSeq!==void 0&&t.afterSeq!==void 0&&z("beforeSeq and afterSeq cannot be used together");for(let[n,r]of [["beforeSeq",t.beforeSeq],["afterSeq",t.afterSeq]])r!==void 0&&(!Number.isInteger(r)||r<0)&&z(`${n} must be a non-negative integer`);let e=t.limit??ih;return (!Number.isInteger(e)||e<1||e>Rc)&&z(`limit must be between 1 and ${Rc}`),e}function Ii(t){typeof t!="string"&&z("text is required");let e=t.trim();return e.length===0&&z("text must not be empty"),e.length>Sc&&z(`text must be at most ${Sc} characters`),e}function gt(t,e){return H(t??"",e),t}function Ai(t){oh.has(t)||z(`invalid highlight kind: ${String(t)}`);}function ch(t){sh.has(t)||z(`invalid highlight source: ${String(t)}`);}function lh(t){H(t.threadId,"threadId"),H(t.workspaceId,"workspaceId");let e=t.source??"manual";ch(e),Ai(t.kind);let n=Ii(t.text),r=t.coversFromTaskId??t.fromTaskId??t.taskId,s=t.coversToTaskId??t.toTaskId??t.taskId;if(e==="manual"){let l=t.taskId??(r&&s&&r===s?r:void 0),p=gt(l,"taskId");return (r!==p||s!==p)&&z("manual highlights must cover exactly one task"),{source:e,kind:t.kind,text:n,coversFromTaskId:p,coversToTaskId:p,agentId:t.agentId??null,sourceTaskId:null,detectorVersion:null,contentFingerprint:null}}let o=gt(r,"coversFromTaskId"),i=gt(s,"coversToTaskId"),u=t.sourceTaskId??o,d=t.detectorVersion??(t.idempotencyKey!==void 0?"default":null),c=t.contentFingerprint??t.idempotencyKey??null;return gt(u??void 0,"sourceTaskId"),gt(d??void 0,"detectorVersion"),gt(c??void 0,"contentFingerprint"),{source:e,kind:t.kind,text:n,coversFromTaskId:o,coversToTaskId:i,agentId:t.agentId??null,sourceTaskId:u,detectorVersion:d,contentFingerprint:c}}function ph(t,e){(!t||typeof t!="object")&&z(`candidates[${e}] is required`),Ai(t.kind);let n=Ii(t.text),r=gt(t.anchorTaskId,`candidates[${e}].anchorTaskId`),s=gt(t.coversFromTaskId,`candidates[${e}].coversFromTaskId`),o=gt(t.coversToTaskId,`candidates[${e}].coversToTaskId`),i=t.contentFingerprint?.trim()||kc("thl",JSON.stringify({kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:s,coversToTaskId:o}));return H(i,`candidates[${e}].contentFingerprint`),{kind:t.kind,text:n,anchorTaskId:r,coversFromTaskId:s,coversToTaskId:o,contentFingerprint:i}}function fh(t){Array.isArray(t)||z("candidates must be an array"),t.length>Ic&&z(`candidates must contain at most ${Ic} items`);let e=new Map;for(let[n,r]of t.entries()){let s=ph(r,n);e.set(s.contentFingerprint,s);}return [...e.values()]}function kr(t){let e=yi(t.metadata);return {threadId:t.id,workspaceId:t.workspace_id,title:t.title,priority:e.priority??null,state:e.state??null,metadata:t.metadata,titleLocked:t.title_locked===1,updatedAt:t.updated_at}}function gh(t){try{let e=JSON.stringify(t);return (!e||e==="null"||e.startsWith("["))&&z("event payload must be a JSON object"),e}catch(e){throw new f("VALIDATION","event payload must be JSON serializable",e)}}function _r(t,e){return t.select({maxSeq:sql`COALESCE(MAX(${G.seq}), 0)`}).from(G).where(eq(G.thread_id,e)).get()?.maxSeq??0}function hr(t,e){return !!t.select({id:G.id}).from(G).where(eq(G.thread_id,e)).limit(1).get()}function Qt(t,e){rh.has(e.type)||z(`invalid thread event type: ${String(e.type)}`);let n=pr("the");t.insert(G).values({id:n,thread_id:e.threadId,seq:e.seq,type:e.type,actor_type:e.actorType,actor_id:e.actorId,task_id:e.taskId??null,highlight_id:e.highlightId??null,payload_json:gh(e.payload),created_at:e.createdAt}).run();let r=t.select().from(G).where(eq(G.id,n)).get();if(!r)throw new f("DB_ERROR","Thread event insert did not return a row");return r}function mr(t,e,n,r,s){let o=kr(e);Qt(t,{threadId:e.id,seq:s,type:"thread.snapshot.imported",actorType:n.actorType,actorId:n.actorId,createdAt:r,payload:{title:o.title,priority:o.priority,state:o.state}});}function Rs(t){return {highlightId:t.id,source:t.source,kind:t.kind,status:t.status,coversFromTaskId:t.covers_from_task_id,coversToTaskId:t.covers_to_task_id,revision:t.revision,...t.dismissed_at===null?{}:{dismissedAt:t.dismissed_at}}}function Es(t,e,n,r,s,o,i){let u=s==="thread.highlight.created"?Rs(e):{before:i?Rs({...e,...i,id:e.id}):void 0,after:Rs(e)};return Qt(t,{threadId:e.thread_id,seq:o,type:s,actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source==="manual"?e.covers_from_task_id:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:u})}function _h(t,e,n,r,s,o){return Qt(t,{threadId:e.thread_id,seq:s,type:"thread.highlight.deleted",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.source_task_id??e.covers_from_task_id,highlightId:e.id,payload:{before:Rs(e),...o??{}}})}var Ss=class extends Re{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!existsSync(n))throw new f("NOT_FOUND","Database not found");if(e){let s=dirname(n);existsSync(s)||mkdirSync(s,{recursive:true});}let r=$(n);if(e)try{Pe(r.db,n);}catch(s){throw r.close(),s}return r}findThread(e,n,r){let s=eq(k.id,n),o=r===void 0?s:r===null?and(s,isNull(k.workspace_id)):and(s,eq(k.workspace_id,r));return e.select().from(k).where(o).limit(1).get()}findRegenerationRun(e,n,r){let s=e.select().from(q).where(eq(q.id,n)).limit(1).get();if(s&&!(r!==void 0&&!this.findThread(e,s.thread_id,r)))return s}resolveWorkspaceId(e){if(H(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let n=this.openHandle(false);try{return n.db.select({workspaceId:k.workspace_id}).from(k).where(eq(k.id,e)).limit(1).get()?.workspaceId??null}catch(r){throw r instanceof f?r:new f("DB_ERROR","Failed to resolve thread workspace",r)}finally{n.close();}}getSnapshot(e,n){if(H(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{let s=this.findThread(r.db,e,n);return s?kr(s):null}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to read thread snapshot",s)}finally{r.close();}}updateSnapshot(e){dh(e);let n=gr(e),r=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(o=>{let i=this.findThread(o,e.threadId,e.workspaceId);i||Qe(`Thread ${e.threadId} not found`);let u=kr(i),d=e.title!==void 0,c=d&&e.title!==u.title,l=d&&i.title_locked!==1,p=e.priority!==void 0&&e.priority!==u.priority,g=e.state!==void 0&&e.state!==u.state,h=c||p||g;if(!h&&!l)return u;let m=i.metadata;(p||g)&&(m=wc(i.metadata,{priority:e.priority,state:e.state}));let E={};if(h&&(E.metadata=m,E.updated_at=r),c&&(E.title=e.title),d&&(E.title_locked=1),o.update(k).set(E).where(e.workspaceId===void 0?eq(k.id,e.threadId):e.workspaceId===null?and(eq(k.id,e.threadId),isNull(k.workspace_id)):and(eq(k.id,e.threadId),eq(k.workspace_id,e.workspaceId))).run(),!h){let y={...i,title_locked:1};return kr(y)}let S=_r(o,i.id)+1;hr(o,i.id)||(mr(o,i,n,r,S),S+=1),c&&(Qt(o,{threadId:i.id,seq:S,type:"thread.title.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:u.title,after:e.title}}),S+=1),p&&(Qt(o,{threadId:i.id,seq:S,type:"thread.priority.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:u.priority,after:e.priority}}),S+=1),g&&Qt(o,{threadId:i.id,seq:S,type:"thread.state.changed",actorType:n.actorType,actorId:n.actorId,createdAt:r,taskId:e.taskId,payload:{before:u.state,after:e.state}});let D={...i,title:c?e.title:i.title,metadata:m,title_locked:d?1:i.title_locked,updated_at:r};return kr(D)},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to update thread snapshot",o)}finally{s.close();}}mutateSnapshot(e){return this.updateSnapshot(e)}updateThreadSnapshot(e){return this.updateSnapshot(e)}getLatestSeq(e,n){if(H(e,"threadId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({maxSeq:sql`COALESCE(MAX(${G.seq}), 0)`}).from(G).where(eq(G.thread_id,e)).get()?.maxSeq??0:null}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to read latest thread event sequence",s)}finally{r.close();}}listCompletedThreadHighlightTurns(e,n){if(H(e,"threadId"),H(n,"workspaceId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findThread(r.db,e,n)?r.db.select({taskId:a.id,prompt:a.prompt,result:a.result,status:a.status,startedAt:a.started_at,completedAt:a.completed_at}).from(a).where(and(eq(a.thread_id,e),eq(a.workspace_id,n),inArray(a.status,[...Xt]),or$1(isNull(a.parent_task_id),eq(a.parent_task_id,"")),sql`${a.result} IS NOT NULL AND length(trim(${a.result})) > 0`)).orderBy(asc(a.started_at),asc(a.id)).all().map(i=>({taskId:i.taskId,prompt:i.prompt,result:i.result,status:i.status,startedAt:i.startedAt,completedAt:i.completedAt})):null}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to read completed thread highlight turns",s)}finally{r.close();}}createHighlightRegenerationRun(e){H(e.threadId,"threadId"),H(e.workspaceId,"workspaceId"),H(e.requestId,"requestId"),H(e.detectorVersion,"detectorVersion"),e.runId!==void 0&&H(e.runId,"runId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(s=>{let o=this.findThread(s,e.threadId,e.workspaceId);o||Qe(`Thread ${e.threadId} not found`);let i=s.select().from(q).where(and(eq(q.thread_id,o.id),eq(q.request_id,e.requestId))).orderBy(desc(q.requested_at),desc(q.id)).limit(1).get();if(i)return {run:i,created:!1};let u=s.select().from(q).where(and(eq(q.thread_id,o.id),inArray(q.status,ws))).orderBy(asc(q.requested_at),asc(q.id)).limit(1).get();if(u)throw new Si(u);let d=e.runId??pr("thr");s.insert(q).values({id:d,thread_id:o.id,request_id:e.requestId,status:"queued",detector_version:e.detectorVersion,requested_at:n,started_at:null,completed_at:null,error_code:null,previous_auto_count:null,new_auto_count:null}).run();let c=s.select().from(q).where(eq(q.id,d)).get();if(!c)throw new f("DB_ERROR","Highlight regeneration run insert did not return a row");return {run:c,created:!0}},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to create highlight regeneration run",s)}finally{r.close();}}beginHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}queueHighlightRegenerationRun(e){return this.createHighlightRegenerationRun(e)}getHighlightRegenerationRun(e,n){if(H(e,"runId"),n!==void 0&&H(n,"workspaceId"),!existsSync(this.resolveDbPath()))return null;let r=this.openHandle(false);try{return this.findRegenerationRun(r.db,e,n)??null}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to read highlight regeneration run",s)}finally{r.close();}}getHighlightRegenerationRunByRequest(e,n,r){if(H(e,"threadId"),H(n,"workspaceId"),H(r,"requestId"),!existsSync(this.resolveDbPath()))return null;let s=this.openHandle(false);try{return this.findThread(s.db,e,n)?s.db.select().from(q).where(and(eq(q.thread_id,e),eq(q.request_id,r))).orderBy(desc(q.requested_at),desc(q.id)).limit(1).get()??null:null}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to read highlight regeneration request",o)}finally{s.close();}}findHighlightRegenerationRun(e,n,r){return this.getHighlightRegenerationRunByRequest(e,n,r)}startHighlightRegenerationRun(e,n){H(e,"runId"),n!==void 0&&H(n,"workspaceId");let r=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(o=>{let i=this.findRegenerationRun(o,e,n);if(i||Qe(`Highlight regeneration run ${e} not found`),Ei(i.status)||z(`invalid highlight regeneration status: ${i.status}`),i.status!=="queued")return i;o.update(q).set({status:"running",started_at:r}).where(and(eq(q.id,i.id),eq(q.status,"queued"))).run();let u=o.select().from(q).where(eq(q.id,i.id)).get();if(!u)throw new f("DB_ERROR","Highlight regeneration run start did not return a row");return u},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to start highlight regeneration run",o)}finally{s.close();}}startHighlightRegeneration(e,n){return this.startHighlightRegenerationRun(e,n)}failHighlightRegenerationRun(e){H(e.runId,"runId"),H(e.errorCode,"errorCode"),e.workspaceId!==void 0&&H(e.workspaceId,"workspaceId");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(s=>{let o=this.findRegenerationRun(s,e.runId,e.workspaceId);if(o||Qe(`Highlight regeneration run ${e.runId} not found`),Ei(o.status)||z(`invalid highlight regeneration status: ${o.status}`),o.status==="completed"||o.status==="failed")return o;s.update(q).set({status:"failed",completed_at:n,error_code:e.errorCode}).where(and(eq(q.id,o.id),inArray(q.status,ws))).run();let i=s.select().from(q).where(eq(q.id,o.id)).get();if(!i)throw new f("DB_ERROR","Highlight regeneration run failure did not return a row");return i},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to fail highlight regeneration run",s)}finally{r.close();}}failHighlightRegeneration(e){return this.failHighlightRegenerationRun(e)}recoverInterruptedHighlightRegenerationRuns(e=eh){H(e,"errorCode");let n=new Date().toISOString(),r=this.openHandle(true);try{return r.db.transaction(s=>s.update(q).set({status:"failed",completed_at:n,error_code:e}).where(inArray(q.status,ws)).run().changes,{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to recover interrupted highlight runs",s)}finally{r.close();}}completeHighlightRegenerationRun(e){H(e.runId,"runId"),H(e.threadId,"threadId"),H(e.workspaceId,"workspaceId"),H(e.detectorVersion,"detectorVersion");let n=fh(e.candidates),r=gr(e),s=this.openHandle(true),o=false;try{return s.db.transaction(i=>{let u=this.findRegenerationRun(i,e.runId,e.workspaceId);if((!u||u.thread_id!==e.threadId)&&Qe(`Highlight regeneration run ${e.runId} not found`),Ei(u.status)||z(`invalid highlight regeneration status: ${u.status}`),u.status==="failed")throw new f("CONFLICT","Highlight regeneration run has already failed");if(u.status==="completed")return {run:u,deletedCount:0,createdCount:0,previousAutoCount:u.previous_auto_count??0,newAutoCount:u.new_auto_count??0};o=!0;let d=this.findThread(i,e.threadId,e.workspaceId);d||Qe(`Thread ${e.threadId} not found`),u.detector_version!==e.detectorVersion&&z("detectorVersion does not match the regeneration run");let c=i.select().from(U).where(eq(U.thread_id,d.id)).orderBy(asc(U.created_at),asc(U.id)).all(),l=new Set(n.map(R=>R.contentFingerprint)),p=c.filter(R=>R.source==="auto"&&R.status==="active"&&R.revision===0&&!l.has(R.content_fingerprint??"")),g=c.filter(R=>R.source==="auto"&&R.status==="active").length,h=new Set(c.filter(R=>!p.includes(R)&&R.content_fingerprint).map(R=>R.content_fingerprint)),m=n.filter(R=>!h.has(R.contentFingerprint)),E=new Date().toISOString(),S=_r(i,d.id)+1;hr(i,d.id)||(mr(i,d,r,E,S),S+=1);for(let R of p)i.delete(U).where(eq(U.id,R.id)).run(),_h(i,R,r,E,S,{runId:e.runId,reason:Z_}),S+=1;let D=0,y=e.agentId??(r.actorType==="agent"?r.actorId:null);for(let R of m){let j=pr("thl");i.insert(U).values({id:j,thread_id:d.id,source:"auto",kind:R.kind,status:"active",text:R.text,covers_from_task_id:R.coversFromTaskId,covers_to_task_id:R.coversToTaskId,revision:0,created_at:E,updated_at:E,agent_id:y,source_task_id:R.anchorTaskId,detector_version:e.detectorVersion,content_fingerprint:R.contentFingerprint,dismissed_at:null}).run();let ge=i.select().from(U).where(eq(U.id,j)).get();if(!ge)throw new f("DB_ERROR","Regenerated highlight insert did not return a row");Es(i,ge,r,E,"thread.highlight.created",S),S+=1,D+=1;}let I=i.select().from(U).where(eq(U.thread_id,d.id)).all().filter(R=>R.source==="auto"&&R.status==="active").length;Qt(i,{threadId:d.id,seq:S,type:"thread.highlights.regenerated",actorType:r.actorType,actorId:r.actorId,createdAt:E,payload:{runId:u.id,detectorVersion:e.detectorVersion,previousAutoCount:g,newAutoCount:I,deletedCount:p.length,createdCount:D}}),i.update(q).set({status:"completed",started_at:u.started_at??E,completed_at:E,error_code:null,previous_auto_count:g,new_auto_count:I}).where(and(eq(q.id,u.id),inArray(q.status,ws))).run();let N=i.select().from(q).where(eq(q.id,u.id)).get();if(!N)throw new f("DB_ERROR","Highlight regeneration completion did not return a row");return {run:N,deletedCount:p.length,createdCount:D,previousAutoCount:g,newAutoCount:I}},{behavior:"immediate"})}catch(i){if(o)try{this.failHighlightRegenerationRun({runId:e.runId,workspaceId:e.workspaceId,errorCode:th});}catch{}throw i instanceof f?i:new f("DB_ERROR","Failed to complete highlight regeneration",i)}finally{s.close();}}completeHighlightRegeneration(e){return this.completeHighlightRegenerationRun(e)}replaceAutoHighlightsAtomically(e){return this.completeHighlightRegenerationRun(e)}listTimeline(e,n,r={}){let s=typeof e=="string"?{...r,threadId:e,workspaceId:n}:e;H(s.threadId,"threadId"),H(s.workspaceId,"workspaceId");let o=uh(s);if(!existsSync(this.resolveDbPath()))return null;let i=this.openHandle(false);try{if(!this.findThread(i.db,s.threadId,s.workspaceId))return null;let u=i.db.select({maxSeq:sql`COALESCE(MAX(${G.seq}), 0)`}).from(G).where(eq(G.thread_id,s.threadId)).get()?.maxSeq??0,d;s.beforeSeq!==void 0?d=i.db.select().from(G).where(and(eq(G.thread_id,s.threadId),lt$1(G.seq,s.beforeSeq))).orderBy(desc(G.seq)).limit(o+1).all().reverse():s.afterSeq!==void 0?d=i.db.select().from(G).where(and(eq(G.thread_id,s.threadId),sql`${G.seq} > ${s.afterSeq}`)).orderBy(asc(G.seq)).limit(o+1).all():d=i.db.select().from(G).where(eq(G.thread_id,s.threadId)).orderBy(desc(G.seq)).limit(o+1).all().reverse();let c=d.length>o,l=s.afterSeq!==void 0?d.slice(0,o):c?d.slice(1):d,p=!1,g=l[0];return g&&(p=!!i.db.select({id:G.id}).from(G).where(and(eq(G.thread_id,s.threadId),lt$1(G.seq,g.seq))).limit(1).get()),{items:l,latestSeq:u,hasMoreOlder:p}}catch(u){throw u instanceof f?u:new f("DB_ERROR","Failed to list thread timeline",u)}finally{i.close();}}listEvents(e,n,r){return this.listTimeline(e,n,r)}getTimeline(e,n,r){return this.listTimeline(e,n,r)}createHighlight(e){let n=lh(e),r=gr(e),s=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(i=>{let u=this.findThread(i,e.threadId,e.workspaceId);if(u||Qe(`Thread ${e.threadId} not found`),n.source==="auto"){let g=i.select().from(U).where(and(eq(U.thread_id,e.threadId),eq(U.source_task_id,n.sourceTaskId),eq(U.detector_version,n.detectorVersion),eq(U.content_fingerprint,n.contentFingerprint))).orderBy(asc(U.created_at),asc(U.id)).limit(1).get();if(g)return g}let d=e.id??pr("thl"),c={id:d,thread_id:e.threadId,source:n.source,kind:n.kind,status:"active",text:n.text,covers_from_task_id:n.coversFromTaskId,covers_to_task_id:n.coversToTaskId,revision:0,created_at:s,updated_at:s,agent_id:n.agentId,source_task_id:n.sourceTaskId,detector_version:n.detectorVersion,content_fingerprint:n.contentFingerprint,dismissed_at:null};i.insert(U).values(c).run();let l=i.select().from(U).where(eq(U.id,d)).get();if(!l)throw new f("DB_ERROR","Highlight insert did not return a row");let p=_r(i,u.id)+1;return hr(i,u.id)||(mr(i,u,r,s,p),p+=1),Es(i,l,r,s,"thread.highlight.created",p),l},{behavior:"immediate"})}catch(i){throw i instanceof f?i:new f("DB_ERROR","Failed to create thread highlight",i)}finally{o.close();}}updateHighlight(e){H(e.threadId,"threadId"),H(e.workspaceId,"workspaceId"),H(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&z("expectedRevision must be a non-negative integer"),e.text===void 0&&e.kind===void 0&&e.coversFromTaskId===void 0&&e.coversToTaskId===void 0&&z("highlight update requires at least one field"),e.kind!==void 0&&Ai(e.kind);let n=e.text===void 0?void 0:Ii(e.text),r=gr(e),s=new Date().toISOString(),o=this.openHandle(true);try{return o.db.transaction(i=>{let u=this.findThread(i,e.threadId,e.workspaceId);u||Qe(`Thread ${e.threadId} not found`);let d=i.select().from(U).where(and(eq(U.id,e.highlightId),eq(U.thread_id,u.id))).limit(1).get();if(d||Qe(`Highlight ${e.highlightId} not found`),d.revision!==e.expectedRevision)throw new Tr(u.id,d.id,e.expectedRevision,d.revision);if(d.status!=="active")throw new Tr(u.id,d.id,e.expectedRevision,d.revision);let c=e.kind??d.kind,l=n??d.text,p=e.coversFromTaskId??d.covers_from_task_id,g=e.coversToTaskId??d.covers_to_task_id;(!l||p.length===0||g.length===0)&&z("highlight projection is incomplete");let h=c!==d.kind||l!==d.text||p!==d.covers_from_task_id||g!==d.covers_to_task_id,m=r.actorType==="user"&&d.source==="auto"&&h?"manual":d.source;if(!(h||m!==d.source))return d;let S=d.revision+1;i.update(U).set({source:m,kind:c,text:l,covers_from_task_id:p,covers_to_task_id:g,revision:S,updated_at:s}).where(and(eq(U.id,d.id),eq(U.revision,d.revision))).run();let D=i.select().from(U).where(eq(U.id,d.id)).get();if(!D)throw new f("DB_ERROR","Highlight update did not return a row");let y=_r(i,u.id)+1;return hr(i,u.id)||(mr(i,u,r,s,y),y+=1),Es(i,D,r,s,"thread.highlight.updated",y,d),D},{behavior:"immediate"})}catch(i){throw i instanceof f?i:new f("DB_ERROR","Failed to update thread highlight",i)}finally{o.close();}}dismissHighlight(e){H(e.threadId,"threadId"),H(e.workspaceId,"workspaceId"),H(e.highlightId,"highlightId"),(!Number.isInteger(e.expectedRevision)||e.expectedRevision<0)&&z("expectedRevision must be a non-negative integer");let n=gr(e),r=new Date().toISOString(),s=this.openHandle(true);try{return s.db.transaction(o=>{let i=this.findThread(o,e.threadId,e.workspaceId);i||Qe(`Thread ${e.threadId} not found`);let u=o.select().from(U).where(and(eq(U.id,e.highlightId),eq(U.thread_id,i.id))).limit(1).get();if(u||Qe(`Highlight ${e.highlightId} not found`),u.revision!==e.expectedRevision)throw new Tr(i.id,u.id,e.expectedRevision,u.revision);if(u.status==="dismissed")return u;let d=u.revision+1;o.update(U).set({status:"dismissed",text:null,revision:d,updated_at:r,dismissed_at:r}).where(and(eq(U.id,u.id),eq(U.revision,u.revision))).run();let c=o.select().from(U).where(eq(U.id,u.id)).get();if(!c)throw new f("DB_ERROR","Highlight dismissal did not return a row");let l=_r(o,i.id)+1;return hr(o,i.id)||(mr(o,i,n,r,l),l+=1),Es(o,c,n,r,"thread.highlight.deleted",l,u),c},{behavior:"immediate"})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to dismiss thread highlight",o)}finally{s.close();}}listActiveHighlights(e,n,r={}){if(H(e,"threadId"),H(n,"workspaceId"),r.taskId!==void 0&&H(r.taskId,"taskId"),r.coversFromTaskId!==void 0&&H(r.coversFromTaskId,"coversFromTaskId"),r.coversToTaskId!==void 0&&H(r.coversToTaskId,"coversToTaskId"),!existsSync(this.resolveDbPath()))return null;let s=this.openHandle(false);try{if(!this.findThread(s.db,e,n))return null;let i=s.db.select().from(U).where(and(eq(U.thread_id,e),eq(U.status,"active"))).orderBy(asc(U.created_at),asc(U.id)).all();if(r.taskId===void 0&&r.coversFromTaskId===void 0&&r.coversToTaskId===void 0)return i;let u=s.db.all(sql`
630
+ SELECT id, started_at FROM tasks WHERE thread_id = ${e}
631
+ ORDER BY started_at ASC, id ASC
632
+ `),d=new Map(u.map((g,h)=>[g.id,h])),c=r.taskId===void 0?void 0:d.get(r.taskId),l=r.coversFromTaskId===void 0?void 0:d.get(r.coversFromTaskId),p=r.coversToTaskId===void 0?void 0:d.get(r.coversToTaskId);return i.filter(g=>{let h=d.get(g.covers_from_task_id),m=d.get(g.covers_to_task_id);if(h===void 0||m===void 0)return !1;let E=Math.min(h,m),S=Math.max(h,m);return !(c!==void 0&&(c<E||c>S)||l!==void 0&&S<l||p!==void 0&&E>p)})}catch(o){throw o instanceof f?o:new f("DB_ERROR","Failed to list active thread highlights",o)}finally{s.close();}}listHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}getActiveHighlights(e,n,r){return this.listActiveHighlights(e,n,r)}};_();kt();Ct();Dt();mt();Bt();js();var Z=class extends f{reason;constructor(e,n="VALIDATION",r=e,s){super(n,r,s),this.name="CommonCodeRepositoryError",this.reason=e;}},Oc="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";function Sh(){let t=randomBytes(16),e="";for(let n of t)e+=Oc[n%Oc.length];return e.slice(0,12)}function Nc(){return `c_${Sh()}`}function Ih(t){return typeof t=="string"&&Ws.includes(t)}function Ah(t){return typeof t=="string"&&Gs.includes(t)}function xn(t){if(!Ih(t))throw new Z("COMMON_CODE_GROUP_INVALID","VALIDATION",`Unsupported common-code group: ${t}`)}function bc(t){if(!Ah(t))throw new Z("COMMON_CODE_COLOR_INVALID","VALIDATION",`Unsupported common-code color: ${t}`)}function vc(t){let e=typeof t=="string"?t.trim():"",n=[...e].length;if(n<1||n>20)throw new Z("COMMON_CODE_NAME_INVALID","VALIDATION","Common-code names must contain 1 to 20 Unicode characters");return e}function Cn(t){if(typeof t!="string"||t.trim().length===0)throw new Z("COMMON_CODE_WORKSPACE_INVALID","VALIDATION","Workspace id is required for a user common code")}function Is(t){if(typeof t!="string"||t.trim().length===0)throw new Z("COMMON_CODE_CODE_INVALID","VALIDATION","Common-code code is required")}function vt(t,e){return and(eq(C.code_group,t),or$1(isNull(C.workspace_id),eq(C.workspace_id,e)))}var As=class extends Re{dbPath;constructor(e={}){super(),e.dbPath?this.dbPath=e.dbPath:e.dbRoot&&(this.dbPath=join(e.dbRoot,".crewx","crewx.db"));}resolveDbPath(){return this.dbPath??super.resolveDbPath()}openHandle(e){let n=this.resolveDbPath();if(!e&&!existsSync(n))throw new f("NOT_FOUND","Database not found");e&&mkdirSync(dirname(n),{recursive:true});let r=$(n);if(e)try{Pe(r.db,n);}catch(s){throw r.close(),s}return r}listSelectable(e,n){if(xn(e),Cn(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(C).where(and(vt(e,n),eq(C.is_archived,0))).orderBy(asc(C.sort_order),asc(C.code)).all()}catch(s){throw new f("DB_ERROR","Failed to list selectable common codes",s)}finally{r.close();}}listForHistory(e,n){if(xn(e),Cn(n),!this.dbExists())return [];let r=this.openHandle(false);try{return r.db.select().from(C).where(vt(e,n)).orderBy(asc(C.sort_order),asc(C.code)).all()}catch(s){throw new f("DB_ERROR","Failed to list common-code history",s)}finally{r.close();}}reorder(e){let n=e.group;if(xn(n),Cn(e.workspaceId),!Array.isArray(e.codes)||e.codes.length===0)throw new Z("COMMON_CODE_REORDER_INVALID","VALIDATION","At least one common-code code is required for reordering");for(let s of e.codes)Is(s);if(new Set(e.codes).size!==e.codes.length)throw new Z("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder entries must be unique");if(!this.dbExists())throw new Z("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder scope does not exist");let r=this.openHandle(true);try{return r.db.transaction(s=>{let o=s.select().from(C).where(vt(n,e.workspaceId)).all(),i=o.filter(h=>h.is_archived===0),u=new Set(o.map(h=>h.code)),d=new Set(i.map(h=>h.code)),c=e.codes.find(h=>!u.has(h));if(c)throw new Z("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not available in this scope: ${n}/${c}`);if(e.codes.length!==i.length||e.codes.some(h=>!d.has(h)))throw new Z("COMMON_CODE_REORDER_INVALID","VALIDATION","Common-code reorder must contain every non-archived code in the scope");let l=new Map(i.map(h=>[h.code,h])),p=e.codes.map(h=>{let m=l.get(h);if(!m)throw new Z("COMMON_CODE_REORDER_INVALID","VALIDATION",`Common code is not selectable in this scope: ${n}/${h}`);return m}),g;for(let[h,m]of p.entries())m.sort_order!==h&&(g??=new Date().toISOString(),s.update(C).set({sort_order:h,updated_at:g}).where(and(eq(C.code_group,n),eq(C.code,m.code))).run());return s.select().from(C).where(vt(n,e.workspaceId)).orderBy(asc(C.sort_order),asc(C.code)).all()},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to reorder common codes",s)}finally{r.close();}}resolve(e,n){if(xn(e),Is(n),!this.dbExists())return null;let r=this.openHandle(false);try{return r.db.select().from(C).where(and(eq(C.code_group,e),eq(C.code,n))).limit(1).get()??null}catch(s){throw new f("DB_ERROR","Failed to resolve common code",s)}finally{r.close();}}createThreadState(e){Cn(e.workspaceId);let n=vc(e.name);bc(e.color);let r=this.openHandle(true);try{return r.db.transaction(s=>{if(s.select({code:C.code}).from(C).where(and(vt("THREAD_STATE",e.workspaceId),eq(C.is_archived,0),eq(C.code_name,n))).limit(1).get())throw new Z("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`);let i=s.select({maxSortOrder:sql`max(${C.sort_order})`}).from(C).where(vt("THREAD_STATE",e.workspaceId)).get(),u=new Date().toISOString(),d=Nc();for(;s.select({code:C.code}).from(C).where(and(eq(C.code_group,"THREAD_STATE"),eq(C.code,d))).limit(1).get();)d=Nc();s.insert(C).values({code_group:"THREAD_STATE",code:d,code_name:n,color:e.color,sort_order:(i?.maxSortOrder??-1)+1,workspace_id:e.workspaceId,is_builtin:0,is_archived:0,metadata:null,created_at:u,updated_at:u}).run();let c=s.select().from(C).where(and(eq(C.code_group,"THREAD_STATE"),eq(C.code,d))).limit(1).get();if(!c)throw new f("DB_ERROR","Created common code could not be read back");return c},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to create thread state common code",s)}finally{r.close();}}updateDisplay(e){if(xn(e.group),Is(e.code),Cn(e.workspaceId),e.name===void 0&&e.color===void 0)throw new Z("COMMON_CODE_UPDATE_EMPTY","VALIDATION","At least one display value is required");let n=e.name===void 0||e.name===null?e.name:vc(e.name);e.color!==void 0&&bc(e.color);let r=this.openHandle(true);try{return r.db.transaction(s=>{let o=s.select().from(C).where(and(eq(C.code_group,e.group),eq(C.code,e.code))).limit(1).get();if(!o)throw new Z("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e.group}/${e.code}`);if(this.assertOwnership(o,e.workspaceId),n===null&&o.is_builtin!==1)throw new Z("COMMON_CODE_NAME_INVALID","VALIDATION","User common-code names cannot be cleared");if(typeof n=="string"&&o.is_archived===0){let d=and(vt(e.group,e.workspaceId),eq(C.is_archived,0));if(s.select({code:C.code}).from(C).where(and(d,eq(C.code_name,n),sql`${C.code} <> ${e.code}`)).limit(1).get())throw new Z("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${n}`)}let i={updated_at:new Date().toISOString()};e.name!==void 0&&(i.code_name=n??null),e.color!==void 0&&(i.color=e.color),s.update(C).set(i).where(and(eq(C.code_group,e.group),eq(C.code,e.code))).run();let u=s.select().from(C).where(and(eq(C.code_group,e.group),eq(C.code,e.code))).limit(1).get();if(!u)throw new f("DB_ERROR","Updated common code could not be read back");return u},{behavior:"immediate"})}catch(s){throw s instanceof f?s:new f("DB_ERROR","Failed to update common-code display values",s)}finally{r.close();}}archive(e,n,r,s=true){if(xn(e),Is(n),Cn(r),typeof s!="boolean")throw new Z("COMMON_CODE_ARCHIVE_INVALID","VALIDATION","Archive state must be boolean");let o=this.openHandle(true);try{return o.db.transaction(i=>{let u=i.select().from(C).where(and(eq(C.code_group,e),eq(C.code,n))).limit(1).get();if(!u)throw new Z("COMMON_CODE_NOT_FOUND","NOT_FOUND",`Common code not found: ${e}/${n}`);if(u.is_builtin===1)throw new Z("COMMON_CODE_BUILTIN_ARCHIVE_FORBIDDEN","VALIDATION","Builtin common codes cannot be archived");if(this.assertOwnership(u,r),!s&&u.code_name!==null&&i.select({code:C.code}).from(C).where(and(vt(e,r),eq(C.is_archived,0),eq(C.code_name,u.code_name),ne$1(C.code,n))).limit(1).get())throw new Z("COMMON_CODE_NAME_CONFLICT","CONFLICT",`Common-code name is already in use: ${u.code_name}`);i.update(C).set({is_archived:s?1:0,updated_at:new Date().toISOString()}).where(and(eq(C.code_group,e),eq(C.code,n))).run();let d=i.select().from(C).where(and(eq(C.code_group,e),eq(C.code,n))).limit(1).get();if(!d)throw new f("DB_ERROR","Archived common code could not be read back");return d},{behavior:"immediate"})}catch(i){throw i instanceof f?i:new f("DB_ERROR","Failed to archive common code",i)}finally{o.close();}}assertOwnership(e,n){if(e.workspace_id!==null&&e.workspace_id!==n)throw new Z("COMMON_CODE_SCOPE_FORBIDDEN","VALIDATION","Workspace does not own this common code")}};un();Qn();_();var Ze={threadContext:"crewx_thread_context",apps:"apps",appsGuidance:"apps_guidance",availableApps:"available_apps",crewxUiState:"crewx_ui_state"};function bh(t){return t.replace(new RegExp(`<${Ze.threadContext}\\b[^>]*>[\\s\\S]*?<\\/${Ze.threadContext}>`,"g"),"").replace(new RegExp(`<${Ze.apps}\\b[^>]*>[\\s\\S]*?<\\/${Ze.apps}>`,"g"),"").replace(new RegExp(`<${Ze.appsGuidance}\\b[^>]*>[\\s\\S]*?<\\/${Ze.appsGuidance}>`,"g"),"").replace(new RegExp(`<${Ze.availableApps}\\b[^>]*>[\\s\\S]*?<\\/${Ze.availableApps}>`,"g"),"").replace(new RegExp(`<${Ze.crewxUiState}\\b[^>]*>[\\s\\S]*?<\\/${Ze.crewxUiState}>`,"g"),"").replace(/<conversation_history[^>]*>[\s\S]*?<\/conversation_history>/g,"").split(`
315
633
  `).filter(s=>!(s.startsWith("Loaded ")&&s.includes("layouts from")||s.includes("[dotenv@")||s.includes("[Nest]")&&s.includes("DEBUG")||s.startsWith("Registered custom layout:")||s.startsWith("Updated custom layout:"))).join(`
316
- `).trim()}function Fe(d){if(!d)return "";let t=d;try{let e=JSON.parse(t);Array.isArray(e)?t=e.filter(n=>n?.type==="text"&&n?.text).map(n=>n.text).join(`
317
- `):e&&typeof e=="object"&&e.result!==void 0&&(t=e.result||"");}catch{t=He(t);}return t}var ut=class{dbPath;constructor(t){this.dbPath=t??join(homedir(),".crewx","crewx.db");}getThreadRepo(){return new ct({dbPath:this.dbPath})}updateThread(t,e){this.getThreadRepo().updateThread(t,{title:e.title});}async ensureThread(t,e,n){let s=this.getThreadRepo(),o=s.findThreadById(t);if(o){if(o.platform!==e)throw new Error(`Thread '${t}' already exists with platform '${o.platform}' \u2014 cannot change to '${e}' (platform is immutable)`);return {created:false}}return s.ensureThread(t,e,n),{created:true}}async fetchHistory(t,e){let n=e?.limit??100,s=this.getThreadRepo(),o=s.findThreadById(t),i=s.findTopLevelTasks(t,void 0,n),a=new Set(["queued","cancelled"]);i=i.filter(u=>(!u.status||!a.has(u.status))&&(!e?.currentTraceId||u.trace_id!==e.currentTraceId));let c=o?.platform??"cli",l=this.rowsToMessages(i);return {threadId:t,platform:c,messages:l,metadata:{title:o?.title??void 0,firstMessage:o?.first_message??void 0,lastMessage:o?.last_message??void 0,messageCount:o?.message_count??0,updatedAt:o?.updated_at?new Date(o.updated_at).getTime():void 0}}}async saveUserMessage(t,e,n,s){let{firstMessage:o}=this.getThreadRepo().saveUserMessage(t,e);return {id:t,firstMessage:o}}async saveAssistantMessage(t,e,n,s){return this.getThreadRepo().saveAssistantMessage(t,e),{id:t}}close(){}normalizeStatus(t){if(t&&!["success","completed","done"].includes(t)){if(["failed","error"].includes(t))return "failed";if(t==="running")return "running"}}rowsToMessages(t){let e=[];for(let n of t){n.prompt&&e.push({id:`${n.id}-user`,text:n.prompt,isAssistant:false,timestamp:new Date(n.started_at).getTime(),metadata:{caller_agent_id:n.caller_agent_id}});let s=Fe(n.result),o=this.normalizeStatus(n.status);if(s||o==="running"||o==="failed"){let i={agent_id:n.agent_id,task_id:n.id};o&&(i.status=o),o==="failed"&&n.error&&(i.reason=n.error.split(`
318
- `)[0].slice(0,200)),e.push({id:`${n.id}-assistant`,text:s,isAssistant:true,timestamp:new Date(n.started_at).getTime(),metadata:i});}}return e}};var St=class extends H{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(t){super(),this._provider=new ut(t?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(t,e,n,s){}async afterAssistantMessage(t,e,n){}attach(t){this.unsubStart=t.on("task:start",async e=>{if(!e.threadId)return;let n=e.platform??"cli";try{let s=await this._provider.ensureThread(e.threadId,n,e.workspaceId),o=await this._provider.saveUserMessage(e.threadId,e.message??"");await this.afterUserMessage(e.threadId,o.id,s.created||o.firstMessage,e);}catch{}}),this.unsubEnd=t.on("task:end",async e=>{if(!e.result)return;let n=e.metadata?.threadId;if(!n)return;let s=e.agentRef?.replace(/^@/,"")??"";try{let{id:o}=await this._provider.saveAssistantMessage(n,e.result,s);await this.afterAssistantMessage(n,o,e);}catch{}});}detach(t){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};export{St as ConversationPlugin,pt as FileLoggerPlugin,Et as SqliteTracingPlugin};
634
+ `).trim()}function vh(t){if(t)try{let e=JSON.parse(t);if(typeof e!="object"||e===null||Array.isArray(e))return;let n=e.provider;return typeof n=="string"?n:void 0}catch{return}}function xh(t,e,n){if(!t||e&&at(t,n))return "";let r=t;try{let s=JSON.parse(r);Array.isArray(s)?r=s.filter(o=>o?.type==="text"&&o?.text).map(o=>o.text).join(`
635
+ `):s&&typeof s=="object"&&s.result!==void 0&&(r=s.result||"");}catch{r=bh(r);}return r}var Ch=new Set(["success","failed","stopped","running"]),Dh=new Set(["failed","stopped"]),Ph={user_stop:"stopped by the user before it finished",runner_lost:"end of run not observed \u2014 it may have done part of the work or may still be running",launch_failed:"the runner never started this run"},Os=200;function xc(t){if(t.length<=Os)return t;let e=t.charCodeAt(Os-1),n=e>=55296&&e<=56319?Os-1:Os;return t.slice(0,n)}function Lh(t){let e=Ke(t),n=typeof t.error=="string"?t.error.split(`
636
+ `)[0]??"":"";if(e){let r=Ph[e];return xc(n?`${r}; ${n}`:r)}return n?xc(n):void 0}var Ns=class{dbPath;constructor(e){this.dbPath=e??join(homedir(),".crewx","crewx.db");}getThreadRepo(){return new ys({dbPath:this.dbPath})}getThreadHistoryRepo(){return new Ss({dbPath:this.dbPath})}updateThread(e,n){this.getThreadRepo().updateThread(e,{title:n.title});}async ensureThread(e,n,r,s){let o=this.getThreadRepo(),i=o.findThreadById(e);if(i){if(i.platform!==n)throw new Error(`Thread '${e}' already exists with platform '${i.platform}' \u2014 cannot change to '${n}' (platform is immutable)`);return o.ensureThread(e,n,r,s),{created:false}}return o.ensureThread(e,n,r,s),{created:true}}async fetchHistory(e,n){let r=n?.limit??100,s=this.getThreadRepo(),o=s.findThreadById(e),i=s.findTopLevelTasks(e,void 0,r,n?.agentId||void 0),u=new Set(["queued","cancelled"]),d=n?.currentTraceId;i=i.filter(h=>(!h.status||!u.has(h.status))&&(!d||h.trace_id!==d&&h.id!==d));let c=s.findInterceptedRequests(i.map(h=>h.id));c.size>0&&(i=i.map(h=>c.has(h.id)?{...h,prompt:c.get(h.id)}:h));let l=o?.platform??"cli",p=this.rowsToMessages(i),g=n?.includeHighlights===false?void 0:this.readActiveHighlights(e,o?.workspace_id??null);return {threadId:e,platform:l,messages:p,...g?{highlights:g}:{},metadata:{title:o?.title??void 0,firstMessage:o?.first_message??void 0,lastMessage:o?.last_message??void 0,messageCount:o?.message_count??0,updatedAt:o?.updated_at?new Date(o.updated_at).getTime():void 0}}}async fetchThreadState(e){try{let n=this.getThreadHistoryRepo().getSnapshot(e);if(!n)return;let r=new As({dbPath:this.dbPath}),s=(o,i)=>{try{return r.resolve(o,i)?.code_name||i}catch{return i}};return {...n.title?{title:n.title}:{},...n.priority?{priority:{code:n.priority,name:s("THREAD_PRIORITY",n.priority)}}:{},...n.state?{state:{code:n.state,name:s("THREAD_STATE",n.state)}}:{}}}catch{return}}async fetchHighlights(e){let n=this.getThreadRepo().findThreadById(e);return this.readActiveHighlights(e,n?.workspace_id??null)}async saveUserMessage(e,n,r,s){let{firstMessage:o}=this.getThreadRepo().saveUserMessage(e,n);return {id:e,firstMessage:o}}async saveAssistantMessage(e,n,r,s){return this.getThreadRepo().saveAssistantMessage(e,n),{id:e}}close(){}readActiveHighlights(e,n){if(!n)return [];try{return (this.getThreadHistoryRepo().listActiveHighlights(e,n)??[]).filter(s=>typeof s.text=="string"&&s.text.length>0).map(s=>({id:s.id,text:s.text,kind:s.kind,source:s.source,coversFromTaskId:s.covers_from_task_id,coversToTaskId:s.covers_to_task_id,createdAt:s.created_at}))}catch{return}}rowsToMessages(e){let n=[];for(let r of e){r.prompt&&n.push({id:`${r.id}-user`,text:r.prompt,isAssistant:false,timestamp:new Date(r.started_at).getTime(),taskId:r.id,metadata:{caller_agent_id:r.caller_agent_id,task_id:r.id}});let s={status:r.status??"",error:r.error,metadata:r.metadata},o=r.status?xe(s):void 0,i=vh(r.metadata),u=xh(r.result,o!==void 0&&Dh.has(o),i);if(u||o!==void 0&&Ch.has(o)){let d={agent_id:r.agent_id,task_id:r.id};if(o&&o!=="success"){d.status=o;let c=Lh(s);c&&(d.reason=c);}n.push({id:`${r.id}-assistant`,text:u,isAssistant:true,timestamp:new Date(r.started_at).getTime(),taskId:r.id,metadata:d});}}return n}};var Oi=class extends ht{name="conversation";_provider;unsubStart=null;unsubEnd=null;constructor(e){super(),this._provider=new Ns(e?.dbPath);}get conversationProvider(){return this._provider}async afterUserMessage(e,n,r,s){}async afterAssistantMessage(e,n,r){}attach(e){this.unsubStart=e.on("task:start",async n=>{if(!n.threadId)return;let r=n.platform??"cli";try{let s=await this._provider.ensureThread(n.threadId,r,n.workspaceId,{createdByTaskId:n.traceId}),o=await this._provider.saveUserMessage(n.threadId,n.message??"");await this.afterUserMessage(n.threadId,o.id,s.created||o.firstMessage,n);}catch{}}),this.unsubEnd=e.on("task:end",async n=>{if(!n.result)return;let r=n.metadata?.threadId;if(!r)return;let s=n.agentRef?.replace(/^@/,"")??"";try{let{id:o}=await this._provider.saveAssistantMessage(r,n.result,s);await this.afterAssistantMessage(r,o,n);}catch{}});}detach(e){this.unsubStart?.(),this.unsubStart=null,this.unsubEnd?.(),this.unsubEnd=null,this._provider.close?.();}};export{Oi as ConversationPlugin,vs as FileLoggerPlugin,gi as SqliteTracingPlugin};