@xopcai/xopc 0.0.110 → 0.0.112

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 (583) hide show
  1. package/README.md +46 -4
  2. package/README.zh-CN.md +46 -4
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  5. package/dist/extensions/feishu/src/workflow-progress.js +1 -1
  6. package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
  7. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  8. package/dist/extensions/telegram/src/plugin.js +1 -1
  9. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  10. package/dist/extensions/telegram/src/update-offset-store.js +1 -1
  11. package/dist/extensions/telegram/src/workflow-progress.js +1 -1
  12. package/dist/extensions/telegram/xopc.extension.json +1 -1
  13. package/dist/extensions/weixin/src/api/api.js +2 -2
  14. package/dist/extensions/weixin/src/auth/accounts.js +1 -1
  15. package/dist/extensions/weixin/src/cdn/upload.js +1 -1
  16. package/dist/extensions/weixin/src/media/data-url.js +1 -1
  17. package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
  18. package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
  19. package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
  20. package/dist/extensions/weixin/src/plugin.js +1 -1
  21. package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
  22. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  23. package/dist/gateway/static/root/apple-touch-icon.png +0 -0
  24. package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
  25. package/dist/gateway/static/root/assets/agent-avatar-dicebear-EhRp-ZMa.js +1 -0
  26. package/dist/gateway/static/root/assets/agent-browser-settings-page-H4foVCiS.js +6 -0
  27. package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-DDNw2oNU.js +1 -0
  28. package/dist/gateway/static/root/assets/agents-E_X2kzS1.js +71 -0
  29. package/dist/gateway/static/root/assets/app-management-settings-panel-BIy7KEsM.js +1 -0
  30. package/dist/gateway/static/root/assets/appearance-settings-DGQG8NwA.js +1 -0
  31. package/dist/gateway/static/root/assets/apps-page-BZLvInLr.js +1 -0
  32. package/dist/gateway/static/root/assets/archive-plugin-uuQPupqx.js +1 -0
  33. package/dist/gateway/static/root/assets/attachment-load-DBkv0cAv.js +2 -0
  34. package/dist/gateway/static/root/assets/{attachment-preview-renderer-CybMSIoS.js → attachment-preview-renderer-DonnL2dL.js} +1 -1
  35. package/dist/gateway/static/root/assets/binary-plugins-DxxN_VAR.js +2 -0
  36. package/dist/gateway/static/root/assets/block-editor-CwnUlRmO.js +180 -0
  37. package/dist/gateway/static/root/assets/channels-settings-BHvUKlzw.js +1 -0
  38. package/dist/gateway/static/root/assets/cn-JdwAhgNB.js +1 -0
  39. package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +1 -0
  40. package/dist/gateway/static/root/assets/config-api-BD-NcD5d.js +3 -0
  41. package/dist/gateway/static/root/assets/config-reload-event-Bjh2zoKp.js +1 -0
  42. package/dist/gateway/static/root/assets/connectors-settings-VBzXcEXL.js +2 -0
  43. package/dist/gateway/static/root/assets/cron-api-C5DoipZA.js +1 -0
  44. package/dist/gateway/static/root/assets/cron-dreaming-jobs-nCMWCf0p.js +1 -0
  45. package/dist/gateway/static/root/assets/cron-page-BLTpdm34.js +3 -0
  46. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
  47. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
  48. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
  49. package/dist/gateway/static/root/assets/dreaming-scene-BHMRVEUS.js +4585 -0
  50. package/dist/gateway/static/root/assets/dreaming-settings-DSVhXTPq.js +1 -0
  51. package/dist/gateway/static/root/assets/extension-debug-page-BDHA9o_e.js +1 -0
  52. package/dist/gateway/static/root/assets/{extension-page-W1wiG38F.js → extension-page-DmDLVSPE.js} +1 -1
  53. package/dist/gateway/static/root/assets/extension-settings-page-1124aHw_.js +1 -0
  54. package/dist/gateway/static/root/assets/fetch-DOe56Wmy.js +1 -0
  55. package/dist/gateway/static/root/assets/format-cron-label-BsotZDO5.js +2 -0
  56. package/dist/gateway/static/root/assets/format-interval-label-tsMSvBSR.js +1 -0
  57. package/dist/gateway/static/root/assets/gateway-config-api-CsD4FC9D.js +1 -0
  58. package/dist/gateway/static/root/assets/gateway-settings-HQ8FBhY2.js +1 -0
  59. package/dist/gateway/static/root/assets/gateway-startup-retry-C1zg7pH3.js +1 -0
  60. package/dist/gateway/static/root/assets/goal-detail-page-BG3Onph0.js +1 -0
  61. package/dist/gateway/static/root/assets/goals-page-DgeKn8zL.js +2 -0
  62. package/dist/gateway/static/root/assets/goals-settings-B5nI6lgz.js +1 -0
  63. package/dist/gateway/static/root/assets/heartbeat-config-api-CIv42nJD.js +1 -0
  64. package/dist/gateway/static/root/assets/heartbeat-settings-DFcVuJ3M.js +1 -0
  65. package/dist/gateway/static/root/assets/html-workspace-editor-CQLWDiwE.js +1 -0
  66. package/dist/gateway/static/root/assets/index-5A_ZaABy.css +1 -0
  67. package/dist/gateway/static/root/assets/index-BTmbp2AU.js +121 -0
  68. package/dist/gateway/static/root/assets/interval-presets-DGP3S7OB.js +1 -0
  69. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-fETaDYQP.js +1 -0
  70. package/dist/gateway/static/root/assets/locale-store-DjbfSsfA.js +1 -0
  71. package/dist/gateway/static/root/assets/logs-page-B1-b27lK.js +2 -0
  72. package/dist/gateway/static/root/assets/markdown-editor-AssmZFx4.js +2 -0
  73. package/dist/gateway/static/root/assets/markdown-split-CgeBJMOD.js +1 -0
  74. package/dist/gateway/static/root/assets/media-plugins-C30GzlV2.js +1 -0
  75. package/dist/gateway/static/root/assets/mermaid-render-BbqDc_LQ.js +134 -0
  76. package/dist/gateway/static/root/assets/messages-BUUfPaZ9.js +3 -0
  77. package/dist/gateway/static/root/assets/middleware-Pd0e8Igk.js +1 -0
  78. package/dist/gateway/static/root/assets/models-hub-panel-DPcTS1-u.js +2 -0
  79. package/dist/gateway/static/root/assets/note-detail-page-xeGb4owe.js +2 -0
  80. package/dist/gateway/static/root/assets/note-image-lightbox-t1g0qZYh.js +1 -0
  81. package/dist/gateway/static/root/assets/note-time-hm6JO_Wi.js +1 -0
  82. package/dist/gateway/static/root/assets/notes-page-C_TdnKBe.js +1 -0
  83. package/dist/gateway/static/root/assets/preview-open-alternatives-DeWp9x5g.js +1 -0
  84. package/dist/gateway/static/root/assets/remote-access-hub-BtkPmJIN.js +1 -0
  85. package/dist/gateway/static/root/assets/save-bar-controls-BOaAOJI3.js +1 -0
  86. package/dist/gateway/static/root/assets/schedule-field-BLWLKqgw.js +1 -0
  87. package/dist/gateway/static/root/assets/schema-form-plqRFYT8.js +1 -0
  88. package/dist/gateway/static/root/assets/sessions-page-DOUjxzJm.js +1 -0
  89. package/dist/gateway/static/root/assets/settings-advanced-gate-qK_bnTrw.js +1 -0
  90. package/dist/gateway/static/root/assets/settings-collapsible-section-BP5zRrDI.js +1 -0
  91. package/dist/gateway/static/root/assets/settings-form-section-Bv8MZplG.js +1 -0
  92. package/dist/gateway/static/root/assets/settings-page-DmDfE1ww.js +1 -0
  93. package/dist/gateway/static/root/assets/setup-status-panel-BEFwNcIZ.js +1 -0
  94. package/dist/gateway/static/root/assets/share-preview-page-4OX1YCgp.js +2 -0
  95. package/dist/gateway/static/root/assets/shares-settings-CbKmJZot.js +1 -0
  96. package/dist/gateway/static/root/assets/skill-reload-api-YdtnUHtK.js +1 -0
  97. package/dist/gateway/static/root/assets/skills-page-DwW1IzQ0.js +2 -0
  98. package/dist/gateway/static/root/assets/system-settings-panel-CGy4f_s2.js +1 -0
  99. package/dist/gateway/static/root/assets/theme-store-CD2wtgZV.js +1 -0
  100. package/dist/gateway/static/root/assets/use-agent-defaults-form-BMuMvzl_.js +1 -0
  101. package/dist/gateway/static/root/assets/use-blob-object-url-D4BFuzZB.js +1 -0
  102. package/dist/gateway/static/root/assets/use-channel-catalog-CjGHnDvN.js +1 -0
  103. package/dist/gateway/static/root/assets/use-settings-tab-guard-BMMFa0oA.js +1 -0
  104. package/dist/gateway/static/root/assets/vendor-codemirror-CNP1wPe7.js +45 -0
  105. package/dist/gateway/static/root/assets/voice-api-key-field-DnRbhMNq.js +1 -0
  106. package/dist/gateway/static/root/assets/voice-player-store-D5vzWwls.js +1 -0
  107. package/dist/gateway/static/root/assets/{workflow-page.utils-EYg_xBQS.js → workflow-page.utils-tjGpRVnw.js} +1 -1
  108. package/dist/gateway/static/root/assets/workflows-page-DqqHKGj2.js +18 -0
  109. package/dist/gateway/static/root/favicon-16x16.png +0 -0
  110. package/dist/gateway/static/root/favicon-32x32.png +0 -0
  111. package/dist/gateway/static/root/favicon.ico +0 -0
  112. package/dist/gateway/static/root/favicon.svg +14 -12
  113. package/dist/gateway/static/root/index.html +18 -15
  114. package/dist/package.js +1 -1
  115. package/dist/src/agent/agent-manager.d.ts +28 -2
  116. package/dist/src/agent/agent-manager.js +82 -11
  117. package/dist/src/agent/agent-manager.js.map +1 -1
  118. package/dist/src/agent/agent-scope.js +1 -1
  119. package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
  120. package/dist/src/agent/context/workspace-seed.js +2 -2
  121. package/dist/src/agent/context/workspace-state.js +1 -1
  122. package/dist/src/agent/context/workspace.js +1 -1
  123. package/dist/src/agent/goals/checklist-judge.d.ts +5 -0
  124. package/dist/src/agent/goals/checklist-judge.js +26 -2
  125. package/dist/src/agent/goals/checklist-judge.js.map +1 -1
  126. package/dist/src/agent/goals/evaluate-turn.d.ts +5 -1
  127. package/dist/src/agent/goals/evaluate-turn.js +29 -3
  128. package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
  129. package/dist/src/agent/goals/goal-locale.d.ts +0 -2
  130. package/dist/src/agent/goals/goal-locale.js +3 -16
  131. package/dist/src/agent/goals/goal-locale.js.map +1 -1
  132. package/dist/src/agent/goals/persistent-goal-service.d.ts +9 -0
  133. package/dist/src/agent/goals/persistent-goal-service.js +3 -2
  134. package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
  135. package/dist/src/agent/goals/post-turn.d.ts +7 -0
  136. package/dist/src/agent/goals/post-turn.js +70 -25
  137. package/dist/src/agent/goals/post-turn.js.map +1 -1
  138. package/dist/src/agent/goals/state.d.ts +0 -5
  139. package/dist/src/agent/goals/state.js +1 -96
  140. package/dist/src/agent/goals/state.js.map +1 -1
  141. package/dist/src/agent/image/load-image-media.js +2 -2
  142. package/dist/src/agent/ipc/inbox.js +3 -3
  143. package/dist/src/agent/ipc/socket.js +1 -1
  144. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  145. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  146. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  147. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  148. package/dist/src/agent/memory/builtin-memory-store.js +1 -1
  149. package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
  150. package/dist/src/agent/memory/dreaming/events.js +1 -1
  151. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  152. package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
  153. package/dist/src/agent/memory/dreaming/preview.js +1 -1
  154. package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
  155. package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
  156. package/dist/src/agent/memory/dreaming/utils.js +1 -1
  157. package/dist/src/agent/memory/memory-flush.js +1 -1
  158. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  159. package/dist/src/agent/messaging/command-handler.d.ts +7 -0
  160. package/dist/src/agent/messaging/command-handler.js +11 -2
  161. package/dist/src/agent/messaging/command-handler.js.map +1 -1
  162. package/dist/src/agent/models/manager.js +1 -1
  163. package/dist/src/agent/prompt/memory/index.js +1 -1
  164. package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
  165. package/dist/src/agent/reply/post-compaction-context.js +1 -1
  166. package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
  167. package/dist/src/agent/sandbox/path-policy.js +2 -2
  168. package/dist/src/agent/service/direct-turn-helpers.d.ts +2 -0
  169. package/dist/src/agent/service/direct-turn-helpers.js +3 -2
  170. package/dist/src/agent/service/direct-turn-helpers.js.map +1 -1
  171. package/dist/src/agent/service/process-direct-streaming.js +10 -1
  172. package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
  173. package/dist/src/agent/service/reconcile-dreaming-cron.js +8 -5
  174. package/dist/src/agent/service/reconcile-dreaming-cron.js.map +1 -1
  175. package/dist/src/agent/service.d.ts +2 -1
  176. package/dist/src/agent/service.js +30 -6
  177. package/dist/src/agent/service.js.map +1 -1
  178. package/dist/src/agent/service.types.d.ts +12 -0
  179. package/dist/src/agent/session/session-config-service.d.ts +8 -0
  180. package/dist/src/agent/session/session-config-service.js +20 -0
  181. package/dist/src/agent/session/session-config-service.js.map +1 -1
  182. package/dist/src/agent/session/session-inspector.js +1 -1
  183. package/dist/src/agent/skills/config.js +2 -2
  184. package/dist/src/agent/skills/filesystem-watcher.d.ts +19 -0
  185. package/dist/src/agent/skills/filesystem-watcher.js +182 -0
  186. package/dist/src/agent/skills/filesystem-watcher.js.map +1 -0
  187. package/dist/src/agent/skills/hub-hash.js +2 -2
  188. package/dist/src/agent/skills/hub-lock.js +1 -1
  189. package/dist/src/agent/skills/hub-pull.js +30 -36
  190. package/dist/src/agent/skills/hub-pull.js.map +1 -1
  191. package/dist/src/agent/skills/index.js +82 -38
  192. package/dist/src/agent/skills/index.js.map +1 -1
  193. package/dist/src/agent/skills/installer.js +2 -2
  194. package/dist/src/agent/skills/managed-store.d.ts +19 -0
  195. package/dist/src/agent/skills/managed-store.js +97 -38
  196. package/dist/src/agent/skills/managed-store.js.map +1 -1
  197. package/dist/src/agent/skills/skill-manage-ops.js +1 -1
  198. package/dist/src/agent/skills/skill-manager.d.ts +16 -6
  199. package/dist/src/agent/skills/skill-manager.js +79 -24
  200. package/dist/src/agent/skills/skill-manager.js.map +1 -1
  201. package/dist/src/agent/skills/skill-view-path.js +1 -1
  202. package/dist/src/agent/skills/test-framework.js +1 -1
  203. package/dist/src/agent/skills/types.d.ts +11 -0
  204. package/dist/src/agent/skills/watcher.js +1 -1
  205. package/dist/src/agent/starter-agents.js +1 -1
  206. package/dist/src/agent/tools/cronjob-tool.d.ts +8 -3
  207. package/dist/src/agent/tools/cronjob-tool.js +82 -24
  208. package/dist/src/agent/tools/cronjob-tool.js.map +1 -1
  209. package/dist/src/agent/tools/dreaming-tool.js +1 -1
  210. package/dist/src/agent/tools/edit.d.ts +2 -0
  211. package/dist/src/agent/tools/edit.js +10 -0
  212. package/dist/src/agent/tools/edit.js.map +1 -1
  213. package/dist/src/agent/tools/factory.js +17 -4
  214. package/dist/src/agent/tools/factory.js.map +1 -1
  215. package/dist/src/agent/tools/find.js +1 -1
  216. package/dist/src/agent/tools/goal-evidence-recorder.d.ts +6 -0
  217. package/dist/src/agent/tools/goal-evidence-recorder.js +34 -0
  218. package/dist/src/agent/tools/goal-evidence-recorder.js.map +1 -0
  219. package/dist/src/agent/tools/goal-tool.d.ts +19 -0
  220. package/dist/src/agent/tools/goal-tool.js +101 -0
  221. package/dist/src/agent/tools/goal-tool.js.map +1 -0
  222. package/dist/src/agent/tools/grep.js +1 -1
  223. package/dist/src/agent/tools/image-generate-tool.js +1 -1
  224. package/dist/src/agent/tools/index.d.ts +1 -0
  225. package/dist/src/agent/tools/index.js +2 -1
  226. package/dist/src/agent/tools/shell.d.ts +2 -0
  227. package/dist/src/agent/tools/shell.js +17 -2
  228. package/dist/src/agent/tools/shell.js.map +1 -1
  229. package/dist/src/agent/tools/skill-manage-tool.js +1 -1
  230. package/dist/src/agent/tools/workflow-tool.d.ts +1 -0
  231. package/dist/src/agent/tools/workflow-tool.js +11 -3
  232. package/dist/src/agent/tools/workflow-tool.js.map +1 -1
  233. package/dist/src/agent/tools/write.d.ts +2 -0
  234. package/dist/src/agent/tools/write.js +11 -0
  235. package/dist/src/agent/tools/write.js.map +1 -1
  236. package/dist/src/agent/workflow/catalog.js +1 -1
  237. package/dist/src/agent/workspace-runtime/registry.d.ts +5 -0
  238. package/dist/src/agent/workspace-runtime/registry.js +7 -0
  239. package/dist/src/agent/workspace-runtime/registry.js.map +1 -1
  240. package/dist/src/ai-assist/text-assist.d.ts +39 -0
  241. package/dist/src/ai-assist/text-assist.js +234 -0
  242. package/dist/src/ai-assist/text-assist.js.map +1 -0
  243. package/dist/src/auth/credentials.js +2 -2
  244. package/dist/src/auth/profiles/store.js +2 -2
  245. package/dist/src/auth/sync-provider-auth.js +1 -1
  246. package/dist/src/browser/cache-dir-policy.js +1 -1
  247. package/dist/src/browser/cdp-local-launcher.js +2 -2
  248. package/dist/src/browser/providers/browser-ext-install.js +4 -4
  249. package/dist/src/browser/providers/cloakbrowser.js +5 -5
  250. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  251. package/dist/src/browser/stealth.js +1 -1
  252. package/dist/src/channels/attachments/inbound-persist.d.ts +7 -0
  253. package/dist/src/channels/attachments/inbound-persist.js +20 -2
  254. package/dist/src/channels/attachments/inbound-persist.js.map +1 -1
  255. package/dist/src/channels/outbound/persist-store.js +1 -1
  256. package/dist/src/channels/pairing/allow-from-file.js +1 -1
  257. package/dist/src/channels/pairing/pairing-store.js +2 -2
  258. package/dist/src/chat-commands/agent-edit.js +2 -2
  259. package/dist/src/chat-commands/builtins/config.js +3 -3
  260. package/dist/src/chat-commands/builtins/goal.d.ts +1 -1
  261. package/dist/src/chat-commands/builtins/goal.js +55 -97
  262. package/dist/src/chat-commands/builtins/goal.js.map +1 -1
  263. package/dist/src/chat-commands/builtins/subgoal.d.ts +1 -1
  264. package/dist/src/chat-commands/builtins/subgoal.js +49 -108
  265. package/dist/src/chat-commands/builtins/subgoal.js.map +1 -1
  266. package/dist/src/chat-commands/builtins/system.js +11 -4
  267. package/dist/src/chat-commands/builtins/system.js.map +1 -1
  268. package/dist/src/chat-commands/builtins/workflow.js +132 -8
  269. package/dist/src/chat-commands/builtins/workflow.js.map +1 -1
  270. package/dist/src/chat-commands/context.d.ts +6 -0
  271. package/dist/src/chat-commands/context.js +12 -0
  272. package/dist/src/chat-commands/context.js.map +1 -1
  273. package/dist/src/chat-commands/types.d.ts +7 -0
  274. package/dist/src/cli/command-catalog.js +43 -0
  275. package/dist/src/cli/command-catalog.js.map +1 -1
  276. package/dist/src/cli/command-loaders.js +1 -0
  277. package/dist/src/cli/command-loaders.js.map +1 -1
  278. package/dist/src/cli/command-manifest.js +4 -0
  279. package/dist/src/cli/command-manifest.js.map +1 -1
  280. package/dist/src/cli/commands/config.js +1 -1
  281. package/dist/src/cli/commands/cron.js +55 -16
  282. package/dist/src/cli/commands/cron.js.map +1 -1
  283. package/dist/src/cli/commands/doctor/checks/config-health.js +1 -1
  284. package/dist/src/cli/commands/doctor/checks/cron-health.js +2 -83
  285. package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
  286. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  287. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  288. package/dist/src/cli/commands/doctor/checks/state-integrity.js +1 -1
  289. package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
  290. package/dist/src/cli/commands/extension-create.js +1 -1
  291. package/dist/src/cli/commands/extension-dev.js +2 -2
  292. package/dist/src/cli/commands/extension-marketplace.js +2 -2
  293. package/dist/src/cli/commands/extension-pack.js +2 -2
  294. package/dist/src/cli/commands/extension.js +3 -3
  295. package/dist/src/cli/commands/gateway/logs.js +1 -1
  296. package/dist/src/cli/commands/goal.d.ts +4 -0
  297. package/dist/src/cli/commands/goal.js +213 -0
  298. package/dist/src/cli/commands/goal.js.map +1 -0
  299. package/dist/src/cli/commands/image.js +1 -1
  300. package/dist/src/cli/commands/init.js +2 -2
  301. package/dist/src/cli/commands/models.js +1 -1
  302. package/dist/src/cli/commands/onboard.js +11 -5
  303. package/dist/src/cli/commands/onboard.js.map +1 -1
  304. package/dist/src/cli/commands/skills-test.js +1 -1
  305. package/dist/src/cli/templates.js +1 -1
  306. package/dist/src/cli/utils/gateway-client.js +1 -1
  307. package/dist/src/cli/utils/init-workspace-core.js +2 -2
  308. package/dist/src/config/agent-profile.js +1 -1
  309. package/dist/src/config/agent-typed-models.js +1 -1
  310. package/dist/src/config/gateway-bind.js +1 -1
  311. package/dist/src/config/index.js +8 -8
  312. package/dist/src/config/loader.js +4 -4
  313. package/dist/src/config/models-json.js +2 -2
  314. package/dist/src/config/paths-state.js +1 -1
  315. package/dist/src/config/paths.js +1 -1
  316. package/dist/src/config/profile.js +1 -1
  317. package/dist/src/config/reload.js +1 -1
  318. package/dist/src/config/schema.d.ts +115 -2
  319. package/dist/src/config/schema.js +63 -7
  320. package/dist/src/config/schema.js.map +1 -1
  321. package/dist/src/config/web-patch.d.ts +14 -1
  322. package/dist/src/config/web-patch.js +45 -8
  323. package/dist/src/config/web-patch.js.map +1 -1
  324. package/dist/src/config/workspace-path.js +1 -1
  325. package/dist/src/cron/executor.d.ts +2 -0
  326. package/dist/src/cron/executor.js +126 -70
  327. package/dist/src/cron/executor.js.map +1 -1
  328. package/dist/src/cron/index.d.ts +1 -1
  329. package/dist/src/cron/index.js +3 -3
  330. package/dist/src/cron/job-content.js +1 -0
  331. package/dist/src/cron/job-content.js.map +1 -1
  332. package/dist/src/cron/run-log-store.d.ts +1 -0
  333. package/dist/src/cron/run-log-store.js +4 -2
  334. package/dist/src/cron/run-log-store.js.map +1 -1
  335. package/dist/src/cron/schedule.d.ts +10 -0
  336. package/dist/src/cron/schedule.js +85 -0
  337. package/dist/src/cron/schedule.js.map +1 -0
  338. package/dist/src/cron/service.d.ts +34 -77
  339. package/dist/src/cron/service.js +327 -264
  340. package/dist/src/cron/service.js.map +1 -1
  341. package/dist/src/cron/types.d.ts +97 -49
  342. package/dist/src/cron/validation.d.ts +374 -86
  343. package/dist/src/cron/validation.js +156 -129
  344. package/dist/src/cron/validation.js.map +1 -1
  345. package/dist/src/cron/workflow-run-completion.js +1 -1
  346. package/dist/src/daemon/constants.js +1 -1
  347. package/dist/src/daemon/install-plan.js +2 -2
  348. package/dist/src/daemon/launchd.js +2 -2
  349. package/dist/src/daemon/schtasks.js +2 -2
  350. package/dist/src/daemon/systemd.js +2 -2
  351. package/dist/src/extensions/bundle-mcp.js +1 -1
  352. package/dist/src/extensions/discover-extensions.js +2 -2
  353. package/dist/src/extensions/health.js +1 -1
  354. package/dist/src/extensions/install.js +2 -2
  355. package/dist/src/extensions/loader.js +2 -2
  356. package/dist/src/extensions/lockfile.js +3 -3
  357. package/dist/src/extensions/security.js +1 -1
  358. package/dist/src/extensions/update.js +2 -2
  359. package/dist/src/gateway/agents-admin.js +2 -2
  360. package/dist/src/gateway/chat-stream/mapper.d.ts +1 -0
  361. package/dist/src/gateway/chat-stream/mapper.js +6 -2
  362. package/dist/src/gateway/chat-stream/mapper.js.map +1 -1
  363. package/dist/src/gateway/chat-stream/protocol.d.ts +2 -0
  364. package/dist/src/gateway/file-path-classifier.js +2 -2
  365. package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -1
  366. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  367. package/dist/src/gateway/hono/lib/extension-store.js +2 -2
  368. package/dist/src/gateway/hono/lib/static-ui.js +2 -2
  369. package/dist/src/gateway/hono/oauth-async.js +1 -1
  370. package/dist/src/gateway/hono/routes/agents.js +1 -1
  371. package/dist/src/gateway/hono/routes/ai-assist.d.ts +3 -0
  372. package/dist/src/gateway/hono/routes/ai-assist.js +66 -0
  373. package/dist/src/gateway/hono/routes/ai-assist.js.map +1 -0
  374. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
  375. package/dist/src/gateway/hono/routes/commands-skills.js +7 -0
  376. package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
  377. package/dist/src/gateway/hono/routes/config-patch/misc.js +1 -1
  378. package/dist/src/gateway/hono/routes/cron.js +24 -5
  379. package/dist/src/gateway/hono/routes/cron.js.map +1 -1
  380. package/dist/src/gateway/hono/routes/dreaming.js +1 -1
  381. package/dist/src/gateway/hono/routes/goals.d.ts +1 -1
  382. package/dist/src/gateway/hono/routes/goals.js +670 -173
  383. package/dist/src/gateway/hono/routes/goals.js.map +1 -1
  384. package/dist/src/gateway/hono/routes/home.d.ts +5 -0
  385. package/dist/src/gateway/hono/routes/home.js +90 -3
  386. package/dist/src/gateway/hono/routes/home.js.map +1 -1
  387. package/dist/src/gateway/hono/routes/host-fs.js +2 -2
  388. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  389. package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
  390. package/dist/src/gateway/hono/routes/models.js +1 -1
  391. package/dist/src/gateway/hono/routes/notes.js +20 -14
  392. package/dist/src/gateway/hono/routes/notes.js.map +1 -1
  393. package/dist/src/gateway/hono/routes/shares.js +1 -1
  394. package/dist/src/gateway/hono/routes/workflows.js +8 -4
  395. package/dist/src/gateway/hono/routes/workflows.js.map +1 -1
  396. package/dist/src/gateway/hono/routes/workspace.js +2 -2
  397. package/dist/src/gateway/hono/sse.js.map +1 -1
  398. package/dist/src/gateway/lock.js +3 -3
  399. package/dist/src/gateway/ports.js +1 -1
  400. package/dist/src/gateway/service/agent-runner.d.ts +2 -0
  401. package/dist/src/gateway/service/agent-runner.js +8 -4
  402. package/dist/src/gateway/service/agent-runner.js.map +1 -1
  403. package/dist/src/gateway/service/config-coordinator.js +1 -1
  404. package/dist/src/gateway/service/marketplace-service.d.ts +22 -10
  405. package/dist/src/gateway/service/marketplace-service.js +46 -5
  406. package/dist/src/gateway/service/marketplace-service.js.map +1 -1
  407. package/dist/src/gateway/service/run-gateway-agent.d.ts +3 -0
  408. package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
  409. package/dist/src/gateway/service.d.ts +8 -0
  410. package/dist/src/gateway/service.js +79 -6
  411. package/dist/src/gateway/service.js.map +1 -1
  412. package/dist/src/gateway/workspace-fs-file-list.js +1 -1
  413. package/dist/src/goals/goal-notifications.d.ts +29 -0
  414. package/dist/src/goals/goal-notifications.js +154 -0
  415. package/dist/src/goals/goal-notifications.js.map +1 -0
  416. package/dist/src/goals/goal-queue-store.d.ts +16 -0
  417. package/dist/src/goals/goal-queue-store.js +131 -0
  418. package/dist/src/goals/goal-queue-store.js.map +1 -0
  419. package/dist/src/goals/goal-queue-types.d.ts +31 -0
  420. package/dist/src/goals/goal-queue-types.js +1 -0
  421. package/dist/src/goals/goal-runner.d.ts +17 -0
  422. package/dist/src/goals/goal-runner.js +127 -0
  423. package/dist/src/goals/goal-runner.js.map +1 -0
  424. package/dist/src/goals/goal-service.d.ts +77 -0
  425. package/dist/src/goals/goal-service.js +261 -0
  426. package/dist/src/goals/goal-service.js.map +1 -0
  427. package/dist/src/goals/goal-store.d.ts +38 -0
  428. package/dist/src/goals/goal-store.js +404 -0
  429. package/dist/src/goals/goal-store.js.map +1 -0
  430. package/dist/src/goals/goal-workflow-judge.d.ts +13 -0
  431. package/dist/src/goals/goal-workflow-judge.js +147 -0
  432. package/dist/src/goals/goal-workflow-judge.js.map +1 -0
  433. package/dist/src/goals/index.d.ts +10 -0
  434. package/dist/src/goals/index.js +7 -0
  435. package/dist/src/goals/types.d.ts +119 -0
  436. package/dist/src/goals/types.js +1 -0
  437. package/dist/src/i18n/goals-bundle.js +1 -1
  438. package/dist/src/i18n/index.js +1 -1
  439. package/dist/src/i18n/share-tool-bundle.js +2 -2
  440. package/dist/src/infra/brew.js +1 -1
  441. package/dist/src/infra/package-json.js +1 -1
  442. package/dist/src/infra/package-update-steps.js +1 -1
  443. package/dist/src/infra/path-env.js +2 -2
  444. package/dist/src/infra/restart.js +1 -1
  445. package/dist/src/infra/stable-node-path.js +1 -1
  446. package/dist/src/infra/update-check.js +1 -1
  447. package/dist/src/infra/update-global.js +1 -1
  448. package/dist/src/infra/update-lock.js +2 -2
  449. package/dist/src/infra/update-restart.js +1 -1
  450. package/dist/src/infra/update-runner.js +1 -1
  451. package/dist/src/infra/update-startup.js +1 -1
  452. package/dist/src/infra/write-file-atomic.js +2 -2
  453. package/dist/src/media/store.js +1 -1
  454. package/dist/src/notes/agent-context.js +1 -1
  455. package/dist/src/notes/service.js +1 -1
  456. package/dist/src/notes/store.js +2 -2
  457. package/dist/src/project-trust/trust-store.js +2 -2
  458. package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
  459. package/dist/src/providers/index.js +1 -1
  460. package/dist/src/providers/model-registry.js +4 -4
  461. package/dist/src/session/init-session-turn.js +2 -2
  462. package/dist/src/session/resolve-session.js +3 -3
  463. package/dist/src/session/session-title.js +2 -2
  464. package/dist/src/session/store.js +1 -1
  465. package/dist/src/share/share-auto.js +2 -2
  466. package/dist/src/share/share-store.js +3 -3
  467. package/dist/src/share/share-thumbnail.js +2 -2
  468. package/dist/src/share/share-zip.js +1 -1
  469. package/dist/src/share/site-share-store.js +3 -3
  470. package/dist/src/share/site-static-serve.js +1 -1
  471. package/dist/src/storage/sqlite/connection.js +1 -1
  472. package/dist/src/storage/sqlite/cron-job-repository.d.ts +6 -0
  473. package/dist/src/storage/sqlite/cron-job-repository.js +70 -0
  474. package/dist/src/storage/sqlite/cron-job-repository.js.map +1 -0
  475. package/dist/src/storage/sqlite/cron-run-repository.js +0 -1
  476. package/dist/src/storage/sqlite/cron-run-repository.js.map +1 -1
  477. package/dist/src/storage/sqlite/index.d.ts +1 -0
  478. package/dist/src/storage/sqlite/index.js +2 -1
  479. package/dist/src/storage/sqlite/memory-index-repository.js +2 -2
  480. package/dist/src/storage/sqlite/migrations/006_add_goals.sql +108 -0
  481. package/dist/src/storage/sqlite/migrations/007_goal_run_judge_schema.sql +4 -0
  482. package/dist/src/storage/sqlite/migrations/008_goal_queue_workflow_runs.sql +53 -0
  483. package/dist/src/storage/sqlite/migrations/009_cron_jobs.sql +24 -0
  484. package/dist/src/storage/sqlite/migrations/discover.js +1 -1
  485. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  486. package/dist/src/storage/sqlite/migrations/runner.js +4 -4
  487. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  488. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  489. package/dist/src/storage/sqlite/schema.js +2 -2
  490. package/dist/src/storage/sqlite/schema.sql +188 -0
  491. package/dist/src/tui/clipboard-image.js +3 -3
  492. package/dist/src/tui/extension-host/load-extensions.js +1 -1
  493. package/dist/src/tui/theme-manager.js +1 -1
  494. package/dist/src/tui/tui-command-formatters.js +4 -4
  495. package/dist/src/tui/tui-commands.js +2 -2
  496. package/dist/src/tui/tui-keybindings-file.js +1 -1
  497. package/dist/src/tui/tui-scoped-models.js +2 -2
  498. package/dist/src/tui/tui-settings.js +1 -1
  499. package/dist/src/tui/tui-startup-resources.js +1 -1
  500. package/dist/src/tui/tui.js +6 -6
  501. package/dist/src/tunnel/frpc-binary.js +4 -4
  502. package/dist/src/tunnel/frpc-config.js +1 -1
  503. package/dist/src/tunnel/frpc-extract.js +1 -1
  504. package/dist/src/tunnel/tunnel-state.js +1 -1
  505. package/dist/src/utils/logger/audit.js +1 -1
  506. package/dist/src/utils/logger/log-store.js +1 -1
  507. package/dist/src/utils/logger/rotation.js +1 -1
  508. package/dist/src/utils/logger/stats.d.ts +1 -1
  509. package/dist/src/utils/logger/streams.js +1 -1
  510. package/dist/src/voice/tts/audio.js +1 -1
  511. package/dist/src/voice/tts/providers/edge-speech.js +2 -2
  512. package/dist/src/workflows/domain/run.d.ts +1 -0
  513. package/dist/src/workflows/domain/run.js.map +1 -1
  514. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  515. package/dist/src/workflows/engine/projector.js +23 -14
  516. package/dist/src/workflows/engine/projector.js.map +1 -1
  517. package/dist/src/workflows/engine/workflow-engine.d.ts +1 -0
  518. package/dist/src/workflows/engine/workflow-engine.js +36 -0
  519. package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
  520. package/dist/src/workflows/index.js +1 -1
  521. package/dist/src/workflows/service/workflow-run-service.d.ts +1 -0
  522. package/dist/src/workflows/service/workflow-run-service.js +7 -3
  523. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  524. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -0
  525. package/dist/src/workflows/service/workflow-session-bridge.js +8 -1
  526. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  527. package/dist/src/workflows/store/event-store.js +1 -1
  528. package/dist/src/workflows/store/run-index-store.d.ts +8 -0
  529. package/dist/src/workflows/store/run-index-store.js +58 -0
  530. package/dist/src/workflows/store/run-index-store.js.map +1 -0
  531. package/dist/src/workflows/store/run-store.d.ts +2 -0
  532. package/dist/src/workflows/store/run-store.js +15 -22
  533. package/dist/src/workflows/store/run-store.js.map +1 -1
  534. package/package.json +10 -5
  535. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  536. package/dist/gateway/static/root/assets/agents-CFFioJCI.js +0 -78
  537. package/dist/gateway/static/root/assets/apps-page-BYDmkbzG.js +0 -1
  538. package/dist/gateway/static/root/assets/channels-settings-CsbDaMvd.js +0 -1
  539. package/dist/gateway/static/root/assets/circle-check-C23XjkUj.js +0 -1
  540. package/dist/gateway/static/root/assets/copy-Dv6d4Dvw.js +0 -1
  541. package/dist/gateway/static/root/assets/cron-page-Apk-7p4p.js +0 -1
  542. package/dist/gateway/static/root/assets/dist-DmGDgpy2.js +0 -1
  543. package/dist/gateway/static/root/assets/extension-debug-page-pxFC-tUa.js +0 -1
  544. package/dist/gateway/static/root/assets/extension-settings-page-COXSv6xP.js +0 -1
  545. package/dist/gateway/static/root/assets/fetch-CFdKBnE6.js +0 -1
  546. package/dist/gateway/static/root/assets/gateway-startup-retry-DdngdObI.js +0 -1
  547. package/dist/gateway/static/root/assets/heartbeat-config-api-DcmAMYmN.js +0 -1
  548. package/dist/gateway/static/root/assets/index-C_2yKRJX.js +0 -4845
  549. package/dist/gateway/static/root/assets/index-DI5_GsZt.css +0 -1
  550. package/dist/gateway/static/root/assets/logs-page-DvTWUOzd.js +0 -2
  551. package/dist/gateway/static/root/assets/note-detail-page-CZbdugWZ.js +0 -180
  552. package/dist/gateway/static/root/assets/note-time-RdyBZxj3.js +0 -1
  553. package/dist/gateway/static/root/assets/notes-page-mEAwy3e1.js +0 -1
  554. package/dist/gateway/static/root/assets/schema-form-DEvdni_r.js +0 -1
  555. package/dist/gateway/static/root/assets/sessions-page-BsgffzV4.js +0 -1
  556. package/dist/gateway/static/root/assets/settings-advanced-gate-t6v8Dwb8.js +0 -2
  557. package/dist/gateway/static/root/assets/settings-form-section-BoYYZmJG.js +0 -1
  558. package/dist/gateway/static/root/assets/settings-page-ClIthYF8.js +0 -3
  559. package/dist/gateway/static/root/assets/share-preview-page-Dd9et7KD.js +0 -2
  560. package/dist/gateway/static/root/assets/skills-page-DEXtxyfQ.js +0 -2
  561. package/dist/gateway/static/root/assets/theme-store-BZozwAeK.js +0 -1
  562. package/dist/gateway/static/root/assets/url-DQRqHuL-.js +0 -3
  563. package/dist/gateway/static/root/assets/vendor-codemirror-DYoKfS8f.js +0 -45
  564. package/dist/gateway/static/root/assets/voice-api-key-field-CNrKzQrf.js +0 -1
  565. package/dist/gateway/static/root/assets/workflows-page-EMZkzJNN.js +0 -18
  566. package/dist/gateway/static/root/favicon-16.png +0 -0
  567. package/dist/gateway/static/root/favicon-32.png +0 -0
  568. package/dist/src/agent/goals/checklist-user.d.ts +0 -24
  569. package/dist/src/agent/goals/checklist-user.js +0 -92
  570. package/dist/src/agent/goals/checklist-user.js.map +0 -1
  571. package/dist/src/agent/goals/goal-run-store.d.ts +0 -19
  572. package/dist/src/agent/goals/goal-run-store.js +0 -138
  573. package/dist/src/agent/goals/goal-run-store.js.map +0 -1
  574. package/dist/src/agent/goals/goal-run-types.d.ts +0 -28
  575. package/dist/src/agent/goals/goal-run-types.js +0 -6
  576. package/dist/src/agent/goals/goal-run-types.js.map +0 -1
  577. package/dist/src/agent/goals/patch-from-user-action.d.ts +0 -20
  578. package/dist/src/agent/goals/patch-from-user-action.js +0 -103
  579. package/dist/src/agent/goals/patch-from-user-action.js.map +0 -1
  580. package/dist/src/cron/persistence.d.ts +0 -62
  581. package/dist/src/cron/persistence.js +0 -188
  582. package/dist/src/cron/persistence.js.map +0 -1
  583. /package/dist/gateway/static/root/assets/{note-detail-page-D4ZIVQbk.css → block-editor-D4ZIVQbk.css} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cron-job-repository.js","names":[],"sources":["../../../../src/storage/sqlite/cron-job-repository.ts"],"sourcesContent":["import type { JobData } from '../../cron/types.js';\nimport { JobDataSchema } from '../../cron/validation.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\ntype CronJobRow = {\n job_id: string;\n name: string;\n description: string | null;\n enabled: number;\n delete_after_run: number | null;\n created_at_ms: number;\n updated_at_ms: number;\n schedule_json: string;\n session_target: string;\n wake_mode: string;\n agent_id: string | null;\n session_key: string | null;\n working_directory: string | null;\n payload_json: string;\n delivery_json: string | null;\n failure_alert_json: string | null;\n state_json: string;\n};\n\nfunction parseJson(value: string | null): unknown {\n if (!value) return undefined;\n return JSON.parse(value);\n}\n\nfunction rowToCronJob(row: CronJobRow): JobData {\n const parsed = JobDataSchema.parse({\n id: row.job_id,\n name: row.name,\n description: row.description ?? undefined,\n enabled: row.enabled !== 0,\n deleteAfterRun: row.delete_after_run == null ? undefined : row.delete_after_run !== 0,\n createdAtMs: row.created_at_ms,\n updatedAtMs: row.updated_at_ms,\n schedule: parseJson(row.schedule_json),\n sessionTarget: row.session_target,\n wakeMode: row.wake_mode,\n agentId: row.agent_id ?? undefined,\n sessionKey: row.session_key ?? undefined,\n workingDirectory: row.working_directory ?? undefined,\n payload: parseJson(row.payload_json),\n delivery: parseJson(row.delivery_json),\n failureAlert: parseJson(row.failure_alert_json),\n state: parseJson(row.state_json) ?? {},\n });\n return parsed as JobData;\n}\n\nfunction bindJson(value: unknown): string | null {\n return value === undefined ? null : JSON.stringify(value);\n}\n\nfunction upsertJob(db: ReturnType<typeof getSqliteDatabase>, job: JobData): void {\n db.prepare(\n `INSERT OR REPLACE INTO cron_jobs (\n job_id, name, description, enabled, delete_after_run, created_at_ms, updated_at_ms,\n schedule_json, session_target, wake_mode, agent_id, session_key, working_directory,\n payload_json, delivery_json, failure_alert_json, state_json\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n job.id,\n job.name,\n job.description ?? null,\n job.enabled ? 1 : 0,\n job.deleteAfterRun == null ? null : job.deleteAfterRun ? 1 : 0,\n job.createdAtMs,\n job.updatedAtMs,\n JSON.stringify(job.schedule),\n job.sessionTarget,\n job.wakeMode,\n job.agentId ?? null,\n job.sessionKey ?? null,\n job.workingDirectory ?? null,\n JSON.stringify(job.payload),\n bindJson(job.delivery),\n bindJson(job.failureAlert),\n JSON.stringify(job.state ?? {}),\n );\n}\n\nexport function listCronJobs(): JobData[] {\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT job_id, name, description, enabled, delete_after_run, created_at_ms, updated_at_ms,\n schedule_json, session_target, wake_mode, agent_id, session_key, working_directory,\n payload_json, delivery_json, failure_alert_json, state_json\n FROM cron_jobs\n ORDER BY created_at_ms DESC`,\n )\n .all() as CronJobRow[];\n return rows.map(rowToCronJob);\n}\n\nexport function getCronJob(jobId: string): JobData | null {\n const row = getSqliteDatabase()\n .prepare(\n `SELECT job_id, name, description, enabled, delete_after_run, created_at_ms, updated_at_ms,\n schedule_json, session_target, wake_mode, agent_id, session_key, working_directory,\n payload_json, delivery_json, failure_alert_json, state_json\n FROM cron_jobs\n WHERE job_id = ?`,\n )\n .get(jobId) as CronJobRow | undefined;\n return row ? rowToCronJob(row) : null;\n}\n\nexport function saveCronJob(job: JobData): void {\n runSqliteWriteTransaction((db) => upsertJob(db, job));\n}\n\nexport function saveCronJobs(jobs: JobData[]): void {\n runSqliteWriteTransaction((db) => {\n for (const job of jobs) upsertJob(db, job);\n });\n}\n\nexport function deleteCronJob(jobId: string): boolean {\n return runSqliteWriteTransaction((db) => {\n const result = db.prepare(`DELETE FROM cron_jobs WHERE job_id = ?`).run(jobId);\n return result.changes > 0;\n });\n}\n"],"mappings":";;;AAwBA,SAAS,UAAU,OAA+B;AAChD,KAAI,CAAC,MAAO,QAAO,KAAA;AACnB,QAAO,KAAK,MAAM,MAAM;;AAG1B,SAAS,aAAa,KAA0B;AAoB9C,QAnBe,cAAc,MAAM;EACjC,IAAI,IAAI;EACR,MAAM,IAAI;EACV,aAAa,IAAI,eAAe,KAAA;EAChC,SAAS,IAAI,YAAY;EACzB,gBAAgB,IAAI,oBAAoB,OAAO,KAAA,IAAY,IAAI,qBAAqB;EACpF,aAAa,IAAI;EACjB,aAAa,IAAI;EACjB,UAAU,UAAU,IAAI,cAAc;EACtC,eAAe,IAAI;EACnB,UAAU,IAAI;EACd,SAAS,IAAI,YAAY,KAAA;EACzB,YAAY,IAAI,eAAe,KAAA;EAC/B,kBAAkB,IAAI,qBAAqB,KAAA;EAC3C,SAAS,UAAU,IAAI,aAAa;EACpC,UAAU,UAAU,IAAI,cAAc;EACtC,cAAc,UAAU,IAAI,mBAAmB;EAC/C,OAAO,UAAU,IAAI,WAAW,IAAI,EAAE;EACvC,CACY;;AAGf,SAAS,SAAS,OAA+B;AAC/C,QAAO,UAAU,KAAA,IAAY,OAAO,KAAK,UAAU,MAAM;;AAG3D,SAAS,UAAU,IAA0C,KAAoB;AAC/E,IAAG,QACD;;;;kEAKD,CAAC,IACA,IAAI,IACJ,IAAI,MACJ,IAAI,eAAe,MACnB,IAAI,UAAU,IAAI,GAClB,IAAI,kBAAkB,OAAO,OAAO,IAAI,iBAAiB,IAAI,GAC7D,IAAI,aACJ,IAAI,aACJ,KAAK,UAAU,IAAI,SAAS,EAC5B,IAAI,eACJ,IAAI,UACJ,IAAI,WAAW,MACf,IAAI,cAAc,MAClB,IAAI,oBAAoB,MACxB,KAAK,UAAU,IAAI,QAAQ,EAC3B,SAAS,IAAI,SAAS,EACtB,SAAS,IAAI,aAAa,EAC1B,KAAK,UAAU,IAAI,SAAS,EAAE,CAAC,CAChC;;AAGH,SAAgB,eAA0B;AAUxC,QATa,mBAAmB,CAC7B,QACC;;;;oCAKD,CACA,KACQ,CAAC,IAAI,aAAa;;AAG/B,SAAgB,WAAW,OAA+B;CACxD,MAAM,MAAM,mBAAmB,CAC5B,QACC;;;;yBAKD,CACA,IAAI,MAAM;AACb,QAAO,MAAM,aAAa,IAAI,GAAG;;AAGnC,SAAgB,YAAY,KAAoB;AAC9C,4BAA2B,OAAO,UAAU,IAAI,IAAI,CAAC;;AAGvD,SAAgB,aAAa,MAAuB;AAClD,4BAA2B,OAAO;AAChC,OAAK,MAAM,OAAO,KAAM,WAAU,IAAI,IAAI;GAC1C;;AAGJ,SAAgB,cAAc,OAAwB;AACpD,QAAO,2BAA2B,OAAO;AAEvC,SADe,GAAG,QAAQ,yCAAyC,CAAC,IAAI,MAC3D,CAAC,UAAU;GACxB"}
@@ -56,7 +56,6 @@ function trimJobRuns(db, jobId) {
56
56
  )`).run(jobId, excess);
57
57
  }
58
58
  function appendCronRun(execution) {
59
- if (execution.status === "running") return;
60
59
  const row = executionToInsert(execution);
61
60
  runSqliteWriteTransaction((db) => {
62
61
  db.prepare(`INSERT OR REPLACE INTO cron_runs (
@@ -1 +1 @@
1
- {"version":3,"file":"cron-run-repository.js","names":[],"sources":["../../../../src/storage/sqlite/cron-run-repository.ts"],"sourcesContent":["import type { JobExecution } from '../../cron/execution-types.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\nconst MAX_RUNS_PER_JOB = 2000;\nconst TRIM_TO_RUNS = 1500;\n\ntype CronRunRow = {\n run_id: string;\n job_id: string;\n status: string;\n started_at: number;\n ended_at: number | null;\n duration_ms: number | null;\n error: string | null;\n output: string | null;\n retry_count: number;\n summary: string | null;\n session_id: string | null;\n session_key: string | null;\n session_type: string | null;\n model: string | null;\n provider: string | null;\n usage_json: string | null;\n workflow_run_id: string | null;\n};\n\nfunction rowToExecution(row: CronRunRow): JobExecution {\n return {\n id: row.run_id,\n jobId: row.job_id,\n status: row.status as JobExecution['status'],\n startedAt: new Date(row.started_at).toISOString(),\n endedAt: row.ended_at != null ? new Date(row.ended_at).toISOString() : undefined,\n duration: row.duration_ms ?? undefined,\n error: row.error ?? undefined,\n output: row.output ?? undefined,\n retryCount: row.retry_count,\n summary: row.summary ?? undefined,\n sessionId: row.session_id ?? undefined,\n sessionKey: row.session_key ?? undefined,\n sessionType: row.session_type ?? undefined,\n model: row.model ?? undefined,\n provider: row.provider ?? undefined,\n usage: row.usage_json ? (JSON.parse(row.usage_json) as JobExecution['usage']) : undefined,\n workflowRunId: row.workflow_run_id ?? undefined,\n };\n}\n\nfunction executionToInsert(execution: JobExecution): CronRunRow {\n const startedAt = Date.parse(execution.startedAt);\n const endedAt = execution.endedAt ? Date.parse(execution.endedAt) : null;\n return {\n run_id: execution.id,\n job_id: execution.jobId,\n status: execution.status,\n started_at: startedAt,\n ended_at: endedAt,\n duration_ms: execution.duration ?? null,\n error: execution.error ?? null,\n output: execution.output ?? null,\n retry_count: execution.retryCount,\n summary: execution.summary ?? null,\n session_id: execution.sessionId ?? null,\n session_key: execution.sessionKey ?? null,\n session_type: execution.sessionType ?? null,\n model: execution.model ?? null,\n provider: execution.provider ?? null,\n usage_json: execution.usage ? JSON.stringify(execution.usage) : null,\n workflow_run_id: execution.workflowRunId ?? null,\n };\n}\n\nfunction trimJobRuns(db: ReturnType<typeof getSqliteDatabase>, jobId: string): void {\n const countRow = db\n .prepare(`SELECT COUNT(*) AS count FROM cron_runs WHERE job_id = ?`)\n .get(jobId) as { count: number };\n if (countRow.count <= MAX_RUNS_PER_JOB) {\n return;\n }\n const excess = countRow.count - TRIM_TO_RUNS;\n db.prepare(\n `DELETE FROM cron_runs WHERE run_id IN (\n SELECT run_id FROM cron_runs WHERE job_id = ?\n ORDER BY started_at ASC LIMIT ?\n )`,\n ).run(jobId, excess);\n}\n\nexport function appendCronRun(execution: JobExecution): void {\n if (execution.status === 'running') {\n return;\n }\n const row = executionToInsert(execution);\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT OR REPLACE INTO cron_runs (\n run_id, job_id, status, started_at, ended_at, duration_ms,\n error, output, retry_count, summary, session_id, session_key,\n session_type, model, provider, usage_json, workflow_run_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n row.run_id,\n row.job_id,\n row.status,\n row.started_at,\n row.ended_at,\n row.duration_ms,\n row.error,\n row.output,\n row.retry_count,\n row.summary,\n row.session_id,\n row.session_key,\n row.session_type,\n row.model,\n row.provider,\n row.usage_json,\n row.workflow_run_id,\n );\n trimJobRuns(db, row.job_id);\n });\n}\n\nexport function readCronJobHistory(jobId: string, limit: number): JobExecution[] {\n if (limit <= 0) {\n return [];\n }\n const db = getSqliteDatabase();\n const rows = db\n .prepare(\n `SELECT run_id, job_id, status, started_at, ended_at, duration_ms,\n error, output, retry_count, summary, session_id, session_key,\n session_type, model, provider, usage_json, workflow_run_id\n FROM cron_runs\n WHERE job_id = ?\n ORDER BY started_at DESC\n LIMIT ?`,\n )\n .all(jobId, limit) as CronRunRow[];\n return rows.map(rowToExecution);\n}\n\nexport function readAllCronRuns(limit: number): JobExecution[] {\n if (limit <= 0) {\n return [];\n }\n const db = getSqliteDatabase();\n const rows = db\n .prepare(\n `SELECT run_id, job_id, status, started_at, ended_at, duration_ms,\n error, output, retry_count, summary, session_id, session_key,\n session_type, model, provider, usage_json, workflow_run_id\n FROM cron_runs\n ORDER BY started_at DESC\n LIMIT ?`,\n )\n .all(limit) as CronRunRow[];\n return rows.map(rowToExecution);\n}\n\nexport function deleteCronRunsForJob(jobId: string): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(`DELETE FROM cron_runs WHERE job_id = ?`).run(jobId);\n });\n}\n"],"mappings":";;AAGA,MAAM,mBAAmB;AACzB,MAAM,eAAe;AAsBrB,SAAS,eAAe,KAA+B;AACrD,QAAO;EACL,IAAI,IAAI;EACR,OAAO,IAAI;EACX,QAAQ,IAAI;EACZ,WAAW,IAAI,KAAK,IAAI,WAAW,CAAC,aAAa;EACjD,SAAS,IAAI,YAAY,OAAO,IAAI,KAAK,IAAI,SAAS,CAAC,aAAa,GAAG,KAAA;EACvE,UAAU,IAAI,eAAe,KAAA;EAC7B,OAAO,IAAI,SAAS,KAAA;EACpB,QAAQ,IAAI,UAAU,KAAA;EACtB,YAAY,IAAI;EAChB,SAAS,IAAI,WAAW,KAAA;EACxB,WAAW,IAAI,cAAc,KAAA;EAC7B,YAAY,IAAI,eAAe,KAAA;EAC/B,aAAa,IAAI,gBAAgB,KAAA;EACjC,OAAO,IAAI,SAAS,KAAA;EACpB,UAAU,IAAI,YAAY,KAAA;EAC1B,OAAO,IAAI,aAAc,KAAK,MAAM,IAAI,WAAW,GAA6B,KAAA;EAChF,eAAe,IAAI,mBAAmB,KAAA;EACvC;;AAGH,SAAS,kBAAkB,WAAqC;CAC9D,MAAM,YAAY,KAAK,MAAM,UAAU,UAAU;CACjD,MAAM,UAAU,UAAU,UAAU,KAAK,MAAM,UAAU,QAAQ,GAAG;AACpE,QAAO;EACL,QAAQ,UAAU;EAClB,QAAQ,UAAU;EAClB,QAAQ,UAAU;EAClB,YAAY;EACZ,UAAU;EACV,aAAa,UAAU,YAAY;EACnC,OAAO,UAAU,SAAS;EAC1B,QAAQ,UAAU,UAAU;EAC5B,aAAa,UAAU;EACvB,SAAS,UAAU,WAAW;EAC9B,YAAY,UAAU,aAAa;EACnC,aAAa,UAAU,cAAc;EACrC,cAAc,UAAU,eAAe;EACvC,OAAO,UAAU,SAAS;EAC1B,UAAU,UAAU,YAAY;EAChC,YAAY,UAAU,QAAQ,KAAK,UAAU,UAAU,MAAM,GAAG;EAChE,iBAAiB,UAAU,iBAAiB;EAC7C;;AAGH,SAAS,YAAY,IAA0C,OAAqB;CAClF,MAAM,WAAW,GACd,QAAQ,2DAA2D,CACnE,IAAI,MAAM;AACb,KAAI,SAAS,SAAS,iBACpB;CAEF,MAAM,SAAS,SAAS,QAAQ;AAChC,IAAG,QACD;;;QAID,CAAC,IAAI,OAAO,OAAO;;AAGtB,SAAgB,cAAc,WAA+B;AAC3D,KAAI,UAAU,WAAW,UACvB;CAEF,MAAM,MAAM,kBAAkB,UAAU;AACxC,4BAA2B,OAAO;AAChC,KAAG,QACD;;;;oEAKD,CAAC,IACA,IAAI,QACJ,IAAI,QACJ,IAAI,QACJ,IAAI,YACJ,IAAI,UACJ,IAAI,aACJ,IAAI,OACJ,IAAI,QACJ,IAAI,aACJ,IAAI,SACJ,IAAI,YACJ,IAAI,aACJ,IAAI,cACJ,IAAI,OACJ,IAAI,UACJ,IAAI,YACJ,IAAI,gBACL;AACD,cAAY,IAAI,IAAI,OAAO;GAC3B;;AAGJ,SAAgB,mBAAmB,OAAe,OAA+B;AAC/E,KAAI,SAAS,EACX,QAAO,EAAE;AAcX,QAZW,mBACI,CACZ,QACC;;;;;;gBAOD,CACA,IAAI,OAAO,MACH,CAAC,IAAI,eAAe;;AAGjC,SAAgB,gBAAgB,OAA+B;AAC7D,KAAI,SAAS,EACX,QAAO,EAAE;AAaX,QAXW,mBACI,CACZ,QACC;;;;;gBAMD,CACA,IAAI,MACI,CAAC,IAAI,eAAe;;AAGjC,SAAgB,qBAAqB,OAAqB;AACxD,4BAA2B,OAAO;AAChC,KAAG,QAAQ,yCAAyC,CAAC,IAAI,MAAM;GAC/D"}
1
+ {"version":3,"file":"cron-run-repository.js","names":[],"sources":["../../../../src/storage/sqlite/cron-run-repository.ts"],"sourcesContent":["import type { JobExecution } from '../../cron/execution-types.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\nconst MAX_RUNS_PER_JOB = 2000;\nconst TRIM_TO_RUNS = 1500;\n\ntype CronRunRow = {\n run_id: string;\n job_id: string;\n status: string;\n started_at: number;\n ended_at: number | null;\n duration_ms: number | null;\n error: string | null;\n output: string | null;\n retry_count: number;\n summary: string | null;\n session_id: string | null;\n session_key: string | null;\n session_type: string | null;\n model: string | null;\n provider: string | null;\n usage_json: string | null;\n workflow_run_id: string | null;\n};\n\nfunction rowToExecution(row: CronRunRow): JobExecution {\n return {\n id: row.run_id,\n jobId: row.job_id,\n status: row.status as JobExecution['status'],\n startedAt: new Date(row.started_at).toISOString(),\n endedAt: row.ended_at != null ? new Date(row.ended_at).toISOString() : undefined,\n duration: row.duration_ms ?? undefined,\n error: row.error ?? undefined,\n output: row.output ?? undefined,\n retryCount: row.retry_count,\n summary: row.summary ?? undefined,\n sessionId: row.session_id ?? undefined,\n sessionKey: row.session_key ?? undefined,\n sessionType: row.session_type ?? undefined,\n model: row.model ?? undefined,\n provider: row.provider ?? undefined,\n usage: row.usage_json ? (JSON.parse(row.usage_json) as JobExecution['usage']) : undefined,\n workflowRunId: row.workflow_run_id ?? undefined,\n };\n}\n\nfunction executionToInsert(execution: JobExecution): CronRunRow {\n const startedAt = Date.parse(execution.startedAt);\n const endedAt = execution.endedAt ? Date.parse(execution.endedAt) : null;\n return {\n run_id: execution.id,\n job_id: execution.jobId,\n status: execution.status,\n started_at: startedAt,\n ended_at: endedAt,\n duration_ms: execution.duration ?? null,\n error: execution.error ?? null,\n output: execution.output ?? null,\n retry_count: execution.retryCount,\n summary: execution.summary ?? null,\n session_id: execution.sessionId ?? null,\n session_key: execution.sessionKey ?? null,\n session_type: execution.sessionType ?? null,\n model: execution.model ?? null,\n provider: execution.provider ?? null,\n usage_json: execution.usage ? JSON.stringify(execution.usage) : null,\n workflow_run_id: execution.workflowRunId ?? null,\n };\n}\n\nfunction trimJobRuns(db: ReturnType<typeof getSqliteDatabase>, jobId: string): void {\n const countRow = db\n .prepare(`SELECT COUNT(*) AS count FROM cron_runs WHERE job_id = ?`)\n .get(jobId) as { count: number };\n if (countRow.count <= MAX_RUNS_PER_JOB) {\n return;\n }\n const excess = countRow.count - TRIM_TO_RUNS;\n db.prepare(\n `DELETE FROM cron_runs WHERE run_id IN (\n SELECT run_id FROM cron_runs WHERE job_id = ?\n ORDER BY started_at ASC LIMIT ?\n )`,\n ).run(jobId, excess);\n}\n\nexport function appendCronRun(execution: JobExecution): void {\n const row = executionToInsert(execution);\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT OR REPLACE INTO cron_runs (\n run_id, job_id, status, started_at, ended_at, duration_ms,\n error, output, retry_count, summary, session_id, session_key,\n session_type, model, provider, usage_json, workflow_run_id\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n row.run_id,\n row.job_id,\n row.status,\n row.started_at,\n row.ended_at,\n row.duration_ms,\n row.error,\n row.output,\n row.retry_count,\n row.summary,\n row.session_id,\n row.session_key,\n row.session_type,\n row.model,\n row.provider,\n row.usage_json,\n row.workflow_run_id,\n );\n trimJobRuns(db, row.job_id);\n });\n}\n\nexport function readCronJobHistory(jobId: string, limit: number): JobExecution[] {\n if (limit <= 0) {\n return [];\n }\n const db = getSqliteDatabase();\n const rows = db\n .prepare(\n `SELECT run_id, job_id, status, started_at, ended_at, duration_ms,\n error, output, retry_count, summary, session_id, session_key,\n session_type, model, provider, usage_json, workflow_run_id\n FROM cron_runs\n WHERE job_id = ?\n ORDER BY started_at DESC\n LIMIT ?`,\n )\n .all(jobId, limit) as CronRunRow[];\n return rows.map(rowToExecution);\n}\n\nexport function readAllCronRuns(limit: number): JobExecution[] {\n if (limit <= 0) {\n return [];\n }\n const db = getSqliteDatabase();\n const rows = db\n .prepare(\n `SELECT run_id, job_id, status, started_at, ended_at, duration_ms,\n error, output, retry_count, summary, session_id, session_key,\n session_type, model, provider, usage_json, workflow_run_id\n FROM cron_runs\n ORDER BY started_at DESC\n LIMIT ?`,\n )\n .all(limit) as CronRunRow[];\n return rows.map(rowToExecution);\n}\n\nexport function deleteCronRunsForJob(jobId: string): void {\n runSqliteWriteTransaction((db) => {\n db.prepare(`DELETE FROM cron_runs WHERE job_id = ?`).run(jobId);\n });\n}\n"],"mappings":";;AAGA,MAAM,mBAAmB;AACzB,MAAM,eAAe;AAsBrB,SAAS,eAAe,KAA+B;AACrD,QAAO;EACL,IAAI,IAAI;EACR,OAAO,IAAI;EACX,QAAQ,IAAI;EACZ,WAAW,IAAI,KAAK,IAAI,WAAW,CAAC,aAAa;EACjD,SAAS,IAAI,YAAY,OAAO,IAAI,KAAK,IAAI,SAAS,CAAC,aAAa,GAAG,KAAA;EACvE,UAAU,IAAI,eAAe,KAAA;EAC7B,OAAO,IAAI,SAAS,KAAA;EACpB,QAAQ,IAAI,UAAU,KAAA;EACtB,YAAY,IAAI;EAChB,SAAS,IAAI,WAAW,KAAA;EACxB,WAAW,IAAI,cAAc,KAAA;EAC7B,YAAY,IAAI,eAAe,KAAA;EAC/B,aAAa,IAAI,gBAAgB,KAAA;EACjC,OAAO,IAAI,SAAS,KAAA;EACpB,UAAU,IAAI,YAAY,KAAA;EAC1B,OAAO,IAAI,aAAc,KAAK,MAAM,IAAI,WAAW,GAA6B,KAAA;EAChF,eAAe,IAAI,mBAAmB,KAAA;EACvC;;AAGH,SAAS,kBAAkB,WAAqC;CAC9D,MAAM,YAAY,KAAK,MAAM,UAAU,UAAU;CACjD,MAAM,UAAU,UAAU,UAAU,KAAK,MAAM,UAAU,QAAQ,GAAG;AACpE,QAAO;EACL,QAAQ,UAAU;EAClB,QAAQ,UAAU;EAClB,QAAQ,UAAU;EAClB,YAAY;EACZ,UAAU;EACV,aAAa,UAAU,YAAY;EACnC,OAAO,UAAU,SAAS;EAC1B,QAAQ,UAAU,UAAU;EAC5B,aAAa,UAAU;EACvB,SAAS,UAAU,WAAW;EAC9B,YAAY,UAAU,aAAa;EACnC,aAAa,UAAU,cAAc;EACrC,cAAc,UAAU,eAAe;EACvC,OAAO,UAAU,SAAS;EAC1B,UAAU,UAAU,YAAY;EAChC,YAAY,UAAU,QAAQ,KAAK,UAAU,UAAU,MAAM,GAAG;EAChE,iBAAiB,UAAU,iBAAiB;EAC7C;;AAGH,SAAS,YAAY,IAA0C,OAAqB;CAClF,MAAM,WAAW,GACd,QAAQ,2DAA2D,CACnE,IAAI,MAAM;AACb,KAAI,SAAS,SAAS,iBACpB;CAEF,MAAM,SAAS,SAAS,QAAQ;AAChC,IAAG,QACD;;;QAID,CAAC,IAAI,OAAO,OAAO;;AAGtB,SAAgB,cAAc,WAA+B;CAC3D,MAAM,MAAM,kBAAkB,UAAU;AACxC,4BAA2B,OAAO;AAChC,KAAG,QACD;;;;oEAKD,CAAC,IACA,IAAI,QACJ,IAAI,QACJ,IAAI,QACJ,IAAI,YACJ,IAAI,UACJ,IAAI,aACJ,IAAI,OACJ,IAAI,QACJ,IAAI,aACJ,IAAI,SACJ,IAAI,YACJ,IAAI,aACJ,IAAI,cACJ,IAAI,OACJ,IAAI,UACJ,IAAI,YACJ,IAAI,gBACL;AACD,cAAY,IAAI,IAAI,OAAO;GAC3B;;AAGJ,SAAgB,mBAAmB,OAAe,OAA+B;AAC/E,KAAI,SAAS,EACX,QAAO,EAAE;AAcX,QAZW,mBACI,CACZ,QACC;;;;;;gBAOD,CACA,IAAI,OAAO,MACH,CAAC,IAAI,eAAe;;AAGjC,SAAgB,gBAAgB,OAA+B;AAC7D,KAAI,SAAS,EACX,QAAO,EAAE;AAaX,QAXW,mBACI,CACZ,QACC;;;;;gBAMD,CACA,IAAI,MACI,CAAC,IAAI,eAAe;;AAGjC,SAAgB,qBAAqB,OAAqB;AACxD,4BAA2B,OAAO;AAChC,KAAG,QAAQ,yCAAyC,CAAC,IAAI,MAAM;GAC/D"}
@@ -10,6 +10,7 @@ export { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages,
10
10
  export { deleteSessionRecord, ensureSessionRecord, getCurrentTranscriptId, getGlobalSessionStats, findSessionKeyByTranscriptId, getSessionPersistedLevels, getSessionMetadata, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats, } from './session-repository.js';
11
11
  export { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint, } from './transcript-repository.js';
12
12
  export { appendCronRun, deleteCronRunsForJob, readAllCronRuns, readCronJobHistory, } from './cron-run-repository.js';
13
+ export { deleteCronJob, getCronJob, listCronJobs, saveCronJob, saveCronJobs, } from './cron-job-repository.js';
13
14
  export { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord, } from './notes-repository.js';
14
15
  export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord, type NoteAgentContextRecord, } from './note-agent-context-repository.js';
15
16
  export { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex, type MemorySearchHit, } from './memory-index-repository.js';
@@ -11,8 +11,9 @@ import { buildGlobalSessionStats, classifyStoredRow, estimateTokensFromMessages,
11
11
  import { deleteSessionRecord, ensureSessionRecord, findSessionKeyByTranscriptId, getCurrentTranscriptId, getGlobalSessionStats, getSessionMetadata, getSessionPersistedLevels, incrementSessionStatsOnAppend, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
12
12
  import { appendTranscriptEntry, captureCompactionCheckpoint, getCompactionCheckpointDetail, listCompactionCheckpoints, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, paginateTranscriptMessages, replaceTranscriptRows, restoreCompactionCheckpoint } from "./transcript-repository.js";
13
13
  import { appendCronRun, deleteCronRunsForJob, readAllCronRuns, readCronJobHistory } from "./cron-run-repository.js";
14
+ import { deleteCronJob, getCronJob, listCronJobs, saveCronJob, saveCronJobs } from "./cron-job-repository.js";
14
15
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "./notes-repository.js";
15
16
  import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgentContextRecord } from "./note-agent-context-repository.js";
16
17
  import { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
17
18
  import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
18
- export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendCronRun, appendTranscriptEntry, applyPendingMigrations, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, deleteCronRunsForJob, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, extractRoutingFromSessionKey, findSessionKeyByTranscriptId, getCompactionCheckpointDetail, getCurrentTranscriptId, getGlobalSessionStats, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listCompactionCheckpoints, listNoteRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, parseSessionKeySource, patchSessionMetadata, readAllCronRuns, readCronJobHistory, readSchemaVersion, readSchemaVersionForTest, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveAgentIdFromSessionKey, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, sessionConfigRowToConfig, sessionRowToMetadata, setSessionConfig, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertNoteAgentContextRecord, upsertNoteRecord };
19
+ export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendCronRun, appendTranscriptEntry, applyPendingMigrations, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, deleteCronJob, deleteCronRunsForJob, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, extractRoutingFromSessionKey, findSessionKeyByTranscriptId, getCompactionCheckpointDetail, getCronJob, getCurrentTranscriptId, getGlobalSessionStats, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listCompactionCheckpoints, listCronJobs, listNoteRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, parseSessionKeySource, patchSessionMetadata, readAllCronRuns, readCronJobHistory, readSchemaVersion, readSchemaVersionForTest, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveAgentIdFromSessionKey, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, saveCronJob, saveCronJobs, searchMemoryIndex, sessionConfigRowToConfig, sessionRowToMetadata, setSessionConfig, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertNoteAgentContextRecord, upsertNoteRecord };
@@ -1,8 +1,8 @@
1
1
  import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
2
  import { escapeFts5Query } from "./fts.js";
3
- import { join, relative } from "node:path";
4
- import { existsSync, readFileSync, statSync } from "node:fs";
5
3
  import { createHash } from "node:crypto";
4
+ import { existsSync, readFileSync, statSync } from "node:fs";
5
+ import { join, relative } from "node:path";
6
6
  //#region src/storage/sqlite/memory-index-repository.ts
7
7
  const CURATED_MEMORY_FILENAMES = new Set(["MEMORY.md", "USER.md"]);
8
8
  const MEMORY_SYNC_CACHE_TTL_MS = 3e4;
@@ -0,0 +1,108 @@
1
+ CREATE TABLE IF NOT EXISTS goals (
2
+ goal_id TEXT PRIMARY KEY,
3
+ title TEXT NOT NULL,
4
+ description TEXT,
5
+ status TEXT NOT NULL,
6
+ agent_id TEXT NOT NULL,
7
+ priority TEXT NOT NULL DEFAULT 'normal',
8
+ deadline_at INTEGER,
9
+ created_at INTEGER NOT NULL,
10
+ updated_at INTEGER NOT NULL,
11
+ completed_at INTEGER,
12
+ archived_at INTEGER,
13
+ active_session_key TEXT,
14
+ current_run_id TEXT,
15
+ next_action TEXT,
16
+ blocked_reason TEXT,
17
+ judge_model_ref TEXT,
18
+ max_turns INTEGER NOT NULL,
19
+ turns_used INTEGER NOT NULL DEFAULT 0,
20
+ ui_locale TEXT,
21
+ source TEXT NOT NULL DEFAULT 'chat'
22
+ );
23
+
24
+ CREATE INDEX IF NOT EXISTS idx_goals_status_updated
25
+ ON goals(status, updated_at DESC);
26
+ CREATE INDEX IF NOT EXISTS idx_goals_agent_updated
27
+ ON goals(agent_id, updated_at DESC);
28
+ CREATE INDEX IF NOT EXISTS idx_goals_active_session
29
+ ON goals(active_session_key);
30
+
31
+ CREATE TABLE IF NOT EXISTS goal_checklist_items (
32
+ item_id TEXT PRIMARY KEY,
33
+ goal_id TEXT NOT NULL,
34
+ text TEXT NOT NULL,
35
+ status TEXT NOT NULL,
36
+ added_by TEXT NOT NULL,
37
+ added_at INTEGER NOT NULL,
38
+ completed_at INTEGER,
39
+ evidence_summary TEXT,
40
+ sort_order INTEGER NOT NULL,
41
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
42
+ );
43
+
44
+ CREATE INDEX IF NOT EXISTS idx_goal_checklist_goal_order
45
+ ON goal_checklist_items(goal_id, sort_order);
46
+
47
+ CREATE TABLE IF NOT EXISTS goal_runs (
48
+ run_id TEXT PRIMARY KEY,
49
+ goal_id TEXT NOT NULL,
50
+ session_key TEXT NOT NULL,
51
+ source TEXT NOT NULL,
52
+ status TEXT NOT NULL,
53
+ started_at INTEGER NOT NULL,
54
+ finished_at INTEGER,
55
+ verdict TEXT,
56
+ reason TEXT,
57
+ next_action TEXT,
58
+ assistant_preview TEXT,
59
+ checklist_done INTEGER,
60
+ checklist_total INTEGER,
61
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
62
+ );
63
+
64
+ CREATE INDEX IF NOT EXISTS idx_goal_runs_goal_started
65
+ ON goal_runs(goal_id, started_at DESC);
66
+ CREATE INDEX IF NOT EXISTS idx_goal_runs_session_started
67
+ ON goal_runs(session_key, started_at DESC);
68
+
69
+ CREATE TABLE IF NOT EXISTS goal_events (
70
+ event_id TEXT PRIMARY KEY,
71
+ goal_id TEXT NOT NULL,
72
+ run_id TEXT,
73
+ kind TEXT NOT NULL,
74
+ message TEXT NOT NULL,
75
+ data_json TEXT,
76
+ created_at INTEGER NOT NULL,
77
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
78
+ );
79
+
80
+ CREATE INDEX IF NOT EXISTS idx_goal_events_goal_created
81
+ ON goal_events(goal_id, created_at DESC);
82
+
83
+ CREATE TABLE IF NOT EXISTS goal_evidence (
84
+ evidence_id TEXT PRIMARY KEY,
85
+ goal_id TEXT NOT NULL,
86
+ run_id TEXT,
87
+ kind TEXT NOT NULL,
88
+ title TEXT NOT NULL,
89
+ summary TEXT,
90
+ uri TEXT,
91
+ data_json TEXT,
92
+ created_at INTEGER NOT NULL,
93
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
94
+ );
95
+
96
+ CREATE INDEX IF NOT EXISTS idx_goal_evidence_goal_created
97
+ ON goal_evidence(goal_id, created_at DESC);
98
+
99
+ CREATE TABLE IF NOT EXISTS goal_session_links (
100
+ goal_id TEXT NOT NULL,
101
+ session_key TEXT NOT NULL,
102
+ linked_at INTEGER NOT NULL,
103
+ PRIMARY KEY (goal_id, session_key),
104
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
105
+ );
106
+
107
+ CREATE INDEX IF NOT EXISTS idx_goal_session_links_session
108
+ ON goal_session_links(session_key, linked_at DESC);
@@ -0,0 +1,4 @@
1
+ ALTER TABLE goal_runs ADD COLUMN confidence REAL;
2
+ ALTER TABLE goal_runs ADD COLUMN missing_evidence_json TEXT;
3
+ ALTER TABLE goal_runs ADD COLUMN user_question TEXT;
4
+ ALTER TABLE goal_runs ADD COLUMN completed_checklist_item_ids_json TEXT;
@@ -0,0 +1,53 @@
1
+ CREATE TABLE IF NOT EXISTS goal_queue (
2
+ queue_id TEXT PRIMARY KEY,
3
+ goal_id TEXT NOT NULL,
4
+ status TEXT NOT NULL,
5
+ payload_json TEXT NOT NULL,
6
+ attempts INTEGER NOT NULL,
7
+ max_retries INTEGER NOT NULL,
8
+ enqueued_at INTEGER NOT NULL,
9
+ started_at INTEGER,
10
+ finished_at INTEGER,
11
+ next_run_at INTEGER,
12
+ session_key TEXT,
13
+ last_error TEXT,
14
+ source TEXT NOT NULL,
15
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
16
+ );
17
+
18
+ CREATE INDEX IF NOT EXISTS idx_goal_queue_status_next
19
+ ON goal_queue(status, next_run_at, enqueued_at);
20
+ CREATE INDEX IF NOT EXISTS idx_goal_queue_goal_status
21
+ ON goal_queue(goal_id, status);
22
+ CREATE INDEX IF NOT EXISTS idx_goal_queue_enqueued
23
+ ON goal_queue(enqueued_at DESC);
24
+
25
+ CREATE TABLE IF NOT EXISTS workflow_runs (
26
+ run_id TEXT PRIMARY KEY,
27
+ agent_id TEXT NOT NULL,
28
+ definition_id TEXT NOT NULL,
29
+ definition_version TEXT NOT NULL,
30
+ goal_id TEXT,
31
+ session_key TEXT NOT NULL,
32
+ parent_session_key TEXT,
33
+ status TEXT NOT NULL,
34
+ source_kind TEXT NOT NULL,
35
+ source_json TEXT NOT NULL,
36
+ metadata_json TEXT,
37
+ title TEXT NOT NULL,
38
+ created_at_ms INTEGER NOT NULL,
39
+ started_at_ms INTEGER,
40
+ completed_at_ms INTEGER,
41
+ metrics_json TEXT NOT NULL,
42
+ result_preview TEXT,
43
+ error_message TEXT
44
+ );
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_workflow_runs_goal_created
47
+ ON workflow_runs(goal_id, created_at_ms DESC);
48
+ CREATE INDEX IF NOT EXISTS idx_workflow_runs_status_created
49
+ ON workflow_runs(agent_id, status, created_at_ms DESC);
50
+ CREATE INDEX IF NOT EXISTS idx_workflow_runs_definition_created
51
+ ON workflow_runs(definition_id, created_at_ms DESC);
52
+ CREATE INDEX IF NOT EXISTS idx_workflow_runs_created
53
+ ON workflow_runs(agent_id, created_at_ms DESC);
@@ -0,0 +1,24 @@
1
+ CREATE TABLE IF NOT EXISTS cron_jobs (
2
+ job_id TEXT PRIMARY KEY,
3
+ name TEXT NOT NULL,
4
+ description TEXT,
5
+ enabled INTEGER NOT NULL,
6
+ delete_after_run INTEGER,
7
+ created_at_ms INTEGER NOT NULL,
8
+ updated_at_ms INTEGER NOT NULL,
9
+ schedule_json TEXT NOT NULL,
10
+ session_target TEXT NOT NULL,
11
+ wake_mode TEXT NOT NULL,
12
+ agent_id TEXT,
13
+ session_key TEXT,
14
+ working_directory TEXT,
15
+ payload_json TEXT NOT NULL,
16
+ delivery_json TEXT,
17
+ failure_alert_json TEXT,
18
+ state_json TEXT NOT NULL DEFAULT '{}'
19
+ );
20
+
21
+ CREATE INDEX IF NOT EXISTS idx_cron_jobs_enabled_next
22
+ ON cron_jobs(enabled, job_id);
23
+ CREATE INDEX IF NOT EXISTS idx_cron_jobs_updated
24
+ ON cron_jobs(updated_at_ms DESC);
@@ -1,5 +1,5 @@
1
- import { join } from "node:path";
2
1
  import { existsSync, readFileSync, readdirSync } from "node:fs";
2
+ import { join } from "node:path";
3
3
  //#region src/storage/sqlite/migrations/discover.ts
4
4
  /** Matches `002_add_notes_index.sql` → target version 2. */
5
5
  const MIGRATION_FILENAME = /^(\d{3})_[\w-]+\.sql$/;
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
3
3
  /** Baseline schema version applied from schema.sql on first open. */
4
4
  export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 5;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 9;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -3,8 +3,8 @@ import { init_logger } from "../../../utils/logger.js";
3
3
  import { readSchemaVersion, setSchemaVersion } from "../schema-version.js";
4
4
  import { discoverSqlMigrations } from "./discover.js";
5
5
  import { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError } from "./errors.js";
6
- import { dirname, join } from "node:path";
7
6
  import { existsSync } from "node:fs";
7
+ import { dirname, join } from "node:path";
8
8
  import { fileURLToPath } from "node:url";
9
9
  //#region src/storage/sqlite/migrations/runner.ts
10
10
  init_logger();
@@ -12,7 +12,7 @@ const log = createLogger("Sqlite:Migrations");
12
12
  /** Baseline schema version applied from schema.sql on first open. */
13
13
  const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;
14
14
  /** Latest schema version this release supports (increment when adding migrations). */
15
- const XOPC_DB_SCHEMA_VERSION = 5;
15
+ const XOPC_DB_SCHEMA_VERSION = 9;
16
16
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
17
17
  function resolveMigrationsDir(override) {
18
18
  if (override) return override;
@@ -46,7 +46,7 @@ function applySingleMigration(db, migration) {
46
46
  * Each step runs in its own transaction and updates schema_meta on success.
47
47
  */
48
48
  function applyPendingMigrations(db, options = {}) {
49
- const targetVersion = options.targetVersion ?? 5;
49
+ const targetVersion = options.targetVersion ?? 9;
50
50
  let currentVersion = readSchemaVersion(db);
51
51
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
52
52
  if (currentVersion >= targetVersion) return currentVersion;
@@ -62,7 +62,7 @@ function applyPendingMigrations(db, options = {}) {
62
62
  }
63
63
  /** Inspect schema version without mutating the database. */
64
64
  function inspectSchemaMigrationStatus(db, options = {}) {
65
- const appVersion = options.targetVersion ?? 5;
65
+ const appVersion = options.targetVersion ?? 9;
66
66
  const dbVersion = readSchemaVersion(db);
67
67
  if (dbVersion > appVersion) return {
68
68
  dbVersion,
@@ -1 +1 @@
1
- {"version":3,"file":"runner.js","names":[],"sources":["../../../../../src/storage/sqlite/migrations/runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { readSchemaVersion, setSchemaVersion } from '../schema-version.js';\nimport { discoverSqlMigrations } from './discover.js';\nimport {\n DatabaseSchemaMigrationGapError,\n DatabaseSchemaTooNewError,\n} from './errors.js';\nimport type { ApplyMigrationsOptions, SqlMigration } from './types.js';\n\nconst log = createLogger('Sqlite:Migrations');\n\n/** Baseline schema version applied from schema.sql on first open. */\nexport const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION = 5;\n\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nexport function resolveMigrationsDir(override?: string): string {\n if (override) {\n return override;\n }\n // Packaged Electron gateway bundle: `out/server/index.js` + `out/server/migrations/`.\n const siblingDir = join(MODULE_DIR, 'migrations');\n if (existsSync(siblingDir)) {\n return siblingDir;\n }\n // Dev / dist: SQL files live next to `migrations/runner.js`.\n return MODULE_DIR;\n}\n\nfunction migrationByTarget(\n migrations: SqlMigration[],\n targetVersion: number,\n): SqlMigration | undefined {\n return migrations.find((migration) => migration.targetVersion === targetVersion);\n}\n\nfunction applySingleMigration(db: DatabaseSync, migration: SqlMigration): void {\n log.info({ targetVersion: migration.targetVersion, file: migration.filename }, 'Applying SQLite migration');\n db.exec('BEGIN IMMEDIATE');\n try {\n db.exec(migration.sql);\n setSchemaVersion(db, migration.targetVersion);\n db.exec('COMMIT');\n } catch (error) {\n try {\n db.exec('ROLLBACK');\n } catch {\n /* preserve original error */\n }\n const em = error instanceof Error ? error.message : String(error);\n throw new Error(\n `SQLite migration to v${migration.targetVersion} (${migration.filename}) failed: ${em}`,\n { cause: error },\n );\n }\n}\n\n/**\n * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.\n * Each step runs in its own transaction and updates schema_meta on success.\n */\nexport function applyPendingMigrations(\n db: DatabaseSync,\n options: ApplyMigrationsOptions = {},\n): number {\n const targetVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n let currentVersion = readSchemaVersion(db);\n\n if (currentVersion > targetVersion) {\n throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);\n }\n\n if (currentVersion >= targetVersion) {\n return currentVersion;\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n\n while (currentVersion < targetVersion) {\n const nextVersion = currentVersion + 1;\n const migration = migrationByTarget(migrations, nextVersion);\n if (!migration) {\n throw new DatabaseSchemaMigrationGapError(currentVersion, targetVersion, nextVersion);\n }\n applySingleMigration(db, migration);\n currentVersion = nextVersion;\n }\n\n return currentVersion;\n}\n\nexport type SchemaMigrationStatus = {\n dbVersion: number;\n appVersion: number;\n pendingVersions: number[];\n isTooNew: boolean;\n hasMigrationGap: boolean;\n missingVersion: number | null;\n};\n\n/** Inspect schema version without mutating the database. */\nexport function inspectSchemaMigrationStatus(\n db: DatabaseSync,\n options: Pick<ApplyMigrationsOptions, 'migrationsDir' | 'targetVersion'> = {},\n): SchemaMigrationStatus {\n const appVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n const dbVersion = readSchemaVersion(db);\n const isTooNew = dbVersion > appVersion;\n\n if (isTooNew) {\n return {\n dbVersion,\n appVersion,\n pendingVersions: [],\n isTooNew: true,\n hasMigrationGap: false,\n missingVersion: null,\n };\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n const pendingVersions: number[] = [];\n let hasMigrationGap = false;\n let missingVersion: number | null = null;\n\n for (let version = dbVersion + 1; version <= appVersion; version++) {\n if (migrationByTarget(migrations, version)) {\n pendingVersions.push(version);\n } else {\n hasMigrationGap = true;\n missingVersion = version;\n break;\n }\n }\n\n return {\n dbVersion,\n appVersion,\n pendingVersions,\n isTooNew: false,\n hasMigrationGap,\n missingVersion,\n };\n}\n"],"mappings":";;;;;;;;;aAMwD;AASxD,MAAM,MAAM,aAAa,oBAAoB;;AAG7C,MAAa,kCAAkC;;AAG/C,MAAa,yBAAyB;AAEtC,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAE1D,SAAgB,qBAAqB,UAA2B;AAC9D,KAAI,SACF,QAAO;CAGT,MAAM,aAAa,KAAK,YAAY,aAAa;AACjD,KAAI,WAAW,WAAW,CACxB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,YACA,eAC0B;AAC1B,QAAO,WAAW,MAAM,cAAc,UAAU,kBAAkB,cAAc;;AAGlF,SAAS,qBAAqB,IAAkB,WAA+B;AAC7E,KAAI,KAAK;EAAE,eAAe,UAAU;EAAe,MAAM,UAAU;EAAU,EAAE,4BAA4B;AAC3G,IAAG,KAAK,kBAAkB;AAC1B,KAAI;AACF,KAAG,KAAK,UAAU,IAAI;AACtB,mBAAiB,IAAI,UAAU,cAAc;AAC7C,KAAG,KAAK,SAAS;UACV,OAAO;AACd,MAAI;AACF,MAAG,KAAK,WAAW;UACb;EAGR,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,QAAM,IAAI,MACR,wBAAwB,UAAU,cAAc,IAAI,UAAU,SAAS,YAAY,MACnF,EAAE,OAAO,OAAO,CACjB;;;;;;;AAQL,SAAgB,uBACd,IACA,UAAkC,EAAE,EAC5B;CACR,MAAM,gBAAgB,QAAQ,iBAAA;CAC9B,IAAI,iBAAiB,kBAAkB,GAAG;AAE1C,KAAI,iBAAiB,cACnB,OAAM,IAAI,0BAA0B,gBAAgB,cAAc;AAGpE,KAAI,kBAAkB,cACpB,QAAO;CAGT,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;AAErF,QAAO,iBAAiB,eAAe;EACrC,MAAM,cAAc,iBAAiB;EACrC,MAAM,YAAY,kBAAkB,YAAY,YAAY;AAC5D,MAAI,CAAC,UACH,OAAM,IAAI,gCAAgC,gBAAgB,eAAe,YAAY;AAEvF,uBAAqB,IAAI,UAAU;AACnC,mBAAiB;;AAGnB,QAAO;;;AAaT,SAAgB,6BACd,IACA,UAA2E,EAAE,EACtD;CACvB,MAAM,aAAa,QAAQ,iBAAA;CAC3B,MAAM,YAAY,kBAAkB,GAAG;AAGvC,KAFiB,YAAY,WAG3B,QAAO;EACL;EACA;EACA,iBAAiB,EAAE;EACnB,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EACjB;CAGH,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;CACrF,MAAM,kBAA4B,EAAE;CACpC,IAAI,kBAAkB;CACtB,IAAI,iBAAgC;AAEpC,MAAK,IAAI,UAAU,YAAY,GAAG,WAAW,YAAY,UACvD,KAAI,kBAAkB,YAAY,QAAQ,CACxC,iBAAgB,KAAK,QAAQ;MACxB;AACL,oBAAkB;AAClB,mBAAiB;AACjB;;AAIJ,QAAO;EACL;EACA;EACA;EACA,UAAU;EACV;EACA;EACD"}
1
+ {"version":3,"file":"runner.js","names":[],"sources":["../../../../../src/storage/sqlite/migrations/runner.ts"],"sourcesContent":["import { existsSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\n\nimport type { DatabaseSync } from 'node:sqlite';\n\nimport { createLogger } from '../../../utils/logger.js';\nimport { readSchemaVersion, setSchemaVersion } from '../schema-version.js';\nimport { discoverSqlMigrations } from './discover.js';\nimport {\n DatabaseSchemaMigrationGapError,\n DatabaseSchemaTooNewError,\n} from './errors.js';\nimport type { ApplyMigrationsOptions, SqlMigration } from './types.js';\n\nconst log = createLogger('Sqlite:Migrations');\n\n/** Baseline schema version applied from schema.sql on first open. */\nexport const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION = 9;\n\nconst MODULE_DIR = dirname(fileURLToPath(import.meta.url));\n\nexport function resolveMigrationsDir(override?: string): string {\n if (override) {\n return override;\n }\n // Packaged Electron gateway bundle: `out/server/index.js` + `out/server/migrations/`.\n const siblingDir = join(MODULE_DIR, 'migrations');\n if (existsSync(siblingDir)) {\n return siblingDir;\n }\n // Dev / dist: SQL files live next to `migrations/runner.js`.\n return MODULE_DIR;\n}\n\nfunction migrationByTarget(\n migrations: SqlMigration[],\n targetVersion: number,\n): SqlMigration | undefined {\n return migrations.find((migration) => migration.targetVersion === targetVersion);\n}\n\nfunction applySingleMigration(db: DatabaseSync, migration: SqlMigration): void {\n log.info({ targetVersion: migration.targetVersion, file: migration.filename }, 'Applying SQLite migration');\n db.exec('BEGIN IMMEDIATE');\n try {\n db.exec(migration.sql);\n setSchemaVersion(db, migration.targetVersion);\n db.exec('COMMIT');\n } catch (error) {\n try {\n db.exec('ROLLBACK');\n } catch {\n /* preserve original error */\n }\n const em = error instanceof Error ? error.message : String(error);\n throw new Error(\n `SQLite migration to v${migration.targetVersion} (${migration.filename}) failed: ${em}`,\n { cause: error },\n );\n }\n}\n\n/**\n * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.\n * Each step runs in its own transaction and updates schema_meta on success.\n */\nexport function applyPendingMigrations(\n db: DatabaseSync,\n options: ApplyMigrationsOptions = {},\n): number {\n const targetVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n let currentVersion = readSchemaVersion(db);\n\n if (currentVersion > targetVersion) {\n throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);\n }\n\n if (currentVersion >= targetVersion) {\n return currentVersion;\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n\n while (currentVersion < targetVersion) {\n const nextVersion = currentVersion + 1;\n const migration = migrationByTarget(migrations, nextVersion);\n if (!migration) {\n throw new DatabaseSchemaMigrationGapError(currentVersion, targetVersion, nextVersion);\n }\n applySingleMigration(db, migration);\n currentVersion = nextVersion;\n }\n\n return currentVersion;\n}\n\nexport type SchemaMigrationStatus = {\n dbVersion: number;\n appVersion: number;\n pendingVersions: number[];\n isTooNew: boolean;\n hasMigrationGap: boolean;\n missingVersion: number | null;\n};\n\n/** Inspect schema version without mutating the database. */\nexport function inspectSchemaMigrationStatus(\n db: DatabaseSync,\n options: Pick<ApplyMigrationsOptions, 'migrationsDir' | 'targetVersion'> = {},\n): SchemaMigrationStatus {\n const appVersion = options.targetVersion ?? XOPC_DB_SCHEMA_VERSION;\n const dbVersion = readSchemaVersion(db);\n const isTooNew = dbVersion > appVersion;\n\n if (isTooNew) {\n return {\n dbVersion,\n appVersion,\n pendingVersions: [],\n isTooNew: true,\n hasMigrationGap: false,\n missingVersion: null,\n };\n }\n\n const migrations = discoverSqlMigrations(resolveMigrationsDir(options.migrationsDir));\n const pendingVersions: number[] = [];\n let hasMigrationGap = false;\n let missingVersion: number | null = null;\n\n for (let version = dbVersion + 1; version <= appVersion; version++) {\n if (migrationByTarget(migrations, version)) {\n pendingVersions.push(version);\n } else {\n hasMigrationGap = true;\n missingVersion = version;\n break;\n }\n }\n\n return {\n dbVersion,\n appVersion,\n pendingVersions,\n isTooNew: false,\n hasMigrationGap,\n missingVersion,\n };\n}\n"],"mappings":";;;;;;;;;aAMwD;AASxD,MAAM,MAAM,aAAa,oBAAoB;;AAG7C,MAAa,kCAAkC;;AAG/C,MAAa,yBAAyB;AAEtC,MAAM,aAAa,QAAQ,cAAc,OAAO,KAAK,IAAI,CAAC;AAE1D,SAAgB,qBAAqB,UAA2B;AAC9D,KAAI,SACF,QAAO;CAGT,MAAM,aAAa,KAAK,YAAY,aAAa;AACjD,KAAI,WAAW,WAAW,CACxB,QAAO;AAGT,QAAO;;AAGT,SAAS,kBACP,YACA,eAC0B;AAC1B,QAAO,WAAW,MAAM,cAAc,UAAU,kBAAkB,cAAc;;AAGlF,SAAS,qBAAqB,IAAkB,WAA+B;AAC7E,KAAI,KAAK;EAAE,eAAe,UAAU;EAAe,MAAM,UAAU;EAAU,EAAE,4BAA4B;AAC3G,IAAG,KAAK,kBAAkB;AAC1B,KAAI;AACF,KAAG,KAAK,UAAU,IAAI;AACtB,mBAAiB,IAAI,UAAU,cAAc;AAC7C,KAAG,KAAK,SAAS;UACV,OAAO;AACd,MAAI;AACF,MAAG,KAAK,WAAW;UACb;EAGR,MAAM,KAAK,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AACjE,QAAM,IAAI,MACR,wBAAwB,UAAU,cAAc,IAAI,UAAU,SAAS,YAAY,MACnF,EAAE,OAAO,OAAO,CACjB;;;;;;;AAQL,SAAgB,uBACd,IACA,UAAkC,EAAE,EAC5B;CACR,MAAM,gBAAgB,QAAQ,iBAAA;CAC9B,IAAI,iBAAiB,kBAAkB,GAAG;AAE1C,KAAI,iBAAiB,cACnB,OAAM,IAAI,0BAA0B,gBAAgB,cAAc;AAGpE,KAAI,kBAAkB,cACpB,QAAO;CAGT,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;AAErF,QAAO,iBAAiB,eAAe;EACrC,MAAM,cAAc,iBAAiB;EACrC,MAAM,YAAY,kBAAkB,YAAY,YAAY;AAC5D,MAAI,CAAC,UACH,OAAM,IAAI,gCAAgC,gBAAgB,eAAe,YAAY;AAEvF,uBAAqB,IAAI,UAAU;AACnC,mBAAiB;;AAGnB,QAAO;;;AAaT,SAAgB,6BACd,IACA,UAA2E,EAAE,EACtD;CACvB,MAAM,aAAa,QAAQ,iBAAA;CAC3B,MAAM,YAAY,kBAAkB,GAAG;AAGvC,KAFiB,YAAY,WAG3B,QAAO;EACL;EACA;EACA,iBAAiB,EAAE;EACnB,UAAU;EACV,iBAAiB;EACjB,gBAAgB;EACjB;CAGH,MAAM,aAAa,sBAAsB,qBAAqB,QAAQ,cAAc,CAAC;CACrF,MAAM,kBAA4B,EAAE;CACpC,IAAI,kBAAkB;CACtB,IAAI,iBAAgC;AAEpC,MAAK,IAAI,UAAU,YAAY,GAAG,WAAW,YAAY,UACvD,KAAI,kBAAkB,YAAY,QAAQ,CACxC,iBAAgB,KAAK,QAAQ;MACxB;AACL,oBAAkB;AAClB,mBAAiB;AACjB;;AAIJ,QAAO;EACL;EACA;EACA;EACA,UAAU;EACV;EACA;EACD"}
@@ -19,7 +19,7 @@ const log = createLogger('Sqlite:Migrations');
19
19
  export const XOPC_DB_BASELINE_SCHEMA_VERSION = 3;
20
20
 
21
21
  /** Latest schema version this release supports (increment when adding migrations). */
22
- export const XOPC_DB_SCHEMA_VERSION = 5;
22
+ export const XOPC_DB_SCHEMA_VERSION = 9;
23
23
 
24
24
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
25
 
@@ -1,7 +1,7 @@
1
1
  import { SCHEMA_META_SCHEMA_VERSION_KEY, ensureSchemaMetaTable, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion } from "./schema-version.js";
2
2
  import { XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, applyPendingMigrations } from "./migrations/runner.js";
3
- import { dirname, join } from "node:path";
4
3
  import { readFileSync } from "node:fs";
4
+ import { dirname, join } from "node:path";
5
5
  import { fileURLToPath } from "node:url";
6
6
  //#region src/storage/sqlite/schema.ts
7
7
  const SCHEMA_DIR = dirname(fileURLToPath(import.meta.url));
@@ -31,7 +31,7 @@ function ensureXopcDatabaseSchema(db) {
31
31
  bootstrapFreshDatabase(db);
32
32
  currentVersion = 3;
33
33
  }
34
- applyPendingMigrations(db, { targetVersion: 5 });
34
+ applyPendingMigrations(db, { targetVersion: 9 });
35
35
  }
36
36
  //#endregion
37
37
  export { SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_SCHEMA_VERSION, ensureSchemaMetaTable, ensureXopcDatabaseSchema, readSchemaVersion, readSchemaVersionForTest, setSchemaVersion };
@@ -131,6 +131,61 @@ CREATE INDEX IF NOT EXISTS idx_cron_runs_job_started
131
131
  CREATE INDEX IF NOT EXISTS idx_cron_runs_started
132
132
  ON cron_runs(started_at DESC);
133
133
 
134
+ CREATE TABLE IF NOT EXISTS cron_jobs (
135
+ job_id TEXT PRIMARY KEY,
136
+ name TEXT NOT NULL,
137
+ description TEXT,
138
+ enabled INTEGER NOT NULL,
139
+ delete_after_run INTEGER,
140
+ created_at_ms INTEGER NOT NULL,
141
+ updated_at_ms INTEGER NOT NULL,
142
+ schedule_json TEXT NOT NULL,
143
+ session_target TEXT NOT NULL,
144
+ wake_mode TEXT NOT NULL,
145
+ agent_id TEXT,
146
+ session_key TEXT,
147
+ working_directory TEXT,
148
+ payload_json TEXT NOT NULL,
149
+ delivery_json TEXT,
150
+ failure_alert_json TEXT,
151
+ state_json TEXT NOT NULL DEFAULT '{}'
152
+ );
153
+
154
+ CREATE INDEX IF NOT EXISTS idx_cron_jobs_enabled_next
155
+ ON cron_jobs(enabled, job_id);
156
+ CREATE INDEX IF NOT EXISTS idx_cron_jobs_updated
157
+ ON cron_jobs(updated_at_ms DESC);
158
+
159
+ CREATE TABLE IF NOT EXISTS workflow_runs (
160
+ run_id TEXT PRIMARY KEY,
161
+ agent_id TEXT NOT NULL,
162
+ definition_id TEXT NOT NULL,
163
+ definition_version TEXT NOT NULL,
164
+ goal_id TEXT,
165
+ session_key TEXT NOT NULL,
166
+ parent_session_key TEXT,
167
+ status TEXT NOT NULL,
168
+ source_kind TEXT NOT NULL,
169
+ source_json TEXT NOT NULL,
170
+ metadata_json TEXT,
171
+ title TEXT NOT NULL,
172
+ created_at_ms INTEGER NOT NULL,
173
+ started_at_ms INTEGER,
174
+ completed_at_ms INTEGER,
175
+ metrics_json TEXT NOT NULL,
176
+ result_preview TEXT,
177
+ error_message TEXT
178
+ );
179
+
180
+ CREATE INDEX IF NOT EXISTS idx_workflow_runs_goal_created
181
+ ON workflow_runs(goal_id, created_at_ms DESC);
182
+ CREATE INDEX IF NOT EXISTS idx_workflow_runs_status_created
183
+ ON workflow_runs(agent_id, status, created_at_ms DESC);
184
+ CREATE INDEX IF NOT EXISTS idx_workflow_runs_definition_created
185
+ ON workflow_runs(definition_id, created_at_ms DESC);
186
+ CREATE INDEX IF NOT EXISTS idx_workflow_runs_created
187
+ ON workflow_runs(agent_id, created_at_ms DESC);
188
+
134
189
  CREATE TABLE IF NOT EXISTS notes (
135
190
  note_id TEXT PRIMARY KEY,
136
191
  title TEXT,
@@ -199,3 +254,136 @@ CREATE VIRTUAL TABLE IF NOT EXISTS memory_fts USING fts5(
199
254
  end_line UNINDEXED,
200
255
  tokenize='unicode61'
201
256
  );
257
+
258
+ CREATE TABLE IF NOT EXISTS goals (
259
+ goal_id TEXT PRIMARY KEY,
260
+ title TEXT NOT NULL,
261
+ description TEXT,
262
+ status TEXT NOT NULL,
263
+ agent_id TEXT NOT NULL,
264
+ priority TEXT NOT NULL DEFAULT 'normal',
265
+ deadline_at INTEGER,
266
+ created_at INTEGER NOT NULL,
267
+ updated_at INTEGER NOT NULL,
268
+ completed_at INTEGER,
269
+ archived_at INTEGER,
270
+ active_session_key TEXT,
271
+ current_run_id TEXT,
272
+ next_action TEXT,
273
+ blocked_reason TEXT,
274
+ judge_model_ref TEXT,
275
+ max_turns INTEGER NOT NULL,
276
+ turns_used INTEGER NOT NULL DEFAULT 0,
277
+ ui_locale TEXT,
278
+ source TEXT NOT NULL DEFAULT 'chat'
279
+ );
280
+
281
+ CREATE INDEX IF NOT EXISTS idx_goals_status_updated
282
+ ON goals(status, updated_at DESC);
283
+ CREATE INDEX IF NOT EXISTS idx_goals_agent_updated
284
+ ON goals(agent_id, updated_at DESC);
285
+ CREATE INDEX IF NOT EXISTS idx_goals_active_session
286
+ ON goals(active_session_key);
287
+
288
+ CREATE TABLE IF NOT EXISTS goal_queue (
289
+ queue_id TEXT PRIMARY KEY,
290
+ goal_id TEXT NOT NULL,
291
+ status TEXT NOT NULL,
292
+ payload_json TEXT NOT NULL,
293
+ attempts INTEGER NOT NULL,
294
+ max_retries INTEGER NOT NULL,
295
+ enqueued_at INTEGER NOT NULL,
296
+ started_at INTEGER,
297
+ finished_at INTEGER,
298
+ next_run_at INTEGER,
299
+ session_key TEXT,
300
+ last_error TEXT,
301
+ source TEXT NOT NULL,
302
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
303
+ );
304
+
305
+ CREATE INDEX IF NOT EXISTS idx_goal_queue_status_next
306
+ ON goal_queue(status, next_run_at, enqueued_at);
307
+ CREATE INDEX IF NOT EXISTS idx_goal_queue_goal_status
308
+ ON goal_queue(goal_id, status);
309
+ CREATE INDEX IF NOT EXISTS idx_goal_queue_enqueued
310
+ ON goal_queue(enqueued_at DESC);
311
+
312
+ CREATE TABLE IF NOT EXISTS goal_checklist_items (
313
+ item_id TEXT PRIMARY KEY,
314
+ goal_id TEXT NOT NULL,
315
+ text TEXT NOT NULL,
316
+ status TEXT NOT NULL,
317
+ added_by TEXT NOT NULL,
318
+ added_at INTEGER NOT NULL,
319
+ completed_at INTEGER,
320
+ evidence_summary TEXT,
321
+ sort_order INTEGER NOT NULL,
322
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
323
+ );
324
+
325
+ CREATE INDEX IF NOT EXISTS idx_goal_checklist_goal_order
326
+ ON goal_checklist_items(goal_id, sort_order);
327
+
328
+ CREATE TABLE IF NOT EXISTS goal_runs (
329
+ run_id TEXT PRIMARY KEY,
330
+ goal_id TEXT NOT NULL,
331
+ session_key TEXT NOT NULL,
332
+ source TEXT NOT NULL,
333
+ status TEXT NOT NULL,
334
+ started_at INTEGER NOT NULL,
335
+ finished_at INTEGER,
336
+ verdict TEXT,
337
+ reason TEXT,
338
+ next_action TEXT,
339
+ assistant_preview TEXT,
340
+ checklist_done INTEGER,
341
+ checklist_total INTEGER,
342
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
343
+ );
344
+
345
+ CREATE INDEX IF NOT EXISTS idx_goal_runs_goal_started
346
+ ON goal_runs(goal_id, started_at DESC);
347
+ CREATE INDEX IF NOT EXISTS idx_goal_runs_session_started
348
+ ON goal_runs(session_key, started_at DESC);
349
+
350
+ CREATE TABLE IF NOT EXISTS goal_events (
351
+ event_id TEXT PRIMARY KEY,
352
+ goal_id TEXT NOT NULL,
353
+ run_id TEXT,
354
+ kind TEXT NOT NULL,
355
+ message TEXT NOT NULL,
356
+ data_json TEXT,
357
+ created_at INTEGER NOT NULL,
358
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
359
+ );
360
+
361
+ CREATE INDEX IF NOT EXISTS idx_goal_events_goal_created
362
+ ON goal_events(goal_id, created_at DESC);
363
+
364
+ CREATE TABLE IF NOT EXISTS goal_evidence (
365
+ evidence_id TEXT PRIMARY KEY,
366
+ goal_id TEXT NOT NULL,
367
+ run_id TEXT,
368
+ kind TEXT NOT NULL,
369
+ title TEXT NOT NULL,
370
+ summary TEXT,
371
+ uri TEXT,
372
+ data_json TEXT,
373
+ created_at INTEGER NOT NULL,
374
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
375
+ );
376
+
377
+ CREATE INDEX IF NOT EXISTS idx_goal_evidence_goal_created
378
+ ON goal_evidence(goal_id, created_at DESC);
379
+
380
+ CREATE TABLE IF NOT EXISTS goal_session_links (
381
+ goal_id TEXT NOT NULL,
382
+ session_key TEXT NOT NULL,
383
+ linked_at INTEGER NOT NULL,
384
+ PRIMARY KEY (goal_id, session_key),
385
+ FOREIGN KEY (goal_id) REFERENCES goals(goal_id) ON DELETE CASCADE
386
+ );
387
+
388
+ CREATE INDEX IF NOT EXISTS idx_goal_session_links_session
389
+ ON goal_session_links(session_key, linked_at DESC);
@@ -1,7 +1,7 @@
1
- import { tmpdir } from "node:os";
2
- import { join } from "node:path";
3
- import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
4
1
  import { randomUUID } from "node:crypto";
2
+ import { readFileSync, unlinkSync, writeFileSync } from "node:fs";
3
+ import { join } from "node:path";
4
+ import { tmpdir } from "node:os";
5
5
  import { spawnSync } from "node:child_process";
6
6
  //#region src/tui/clipboard-image.ts
7
7
  const SUPPORTED_IMAGE_MIME_TYPES = [
@@ -1,6 +1,6 @@
1
+ import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
1
2
  import { createLogger } from "../../utils/logger/index.js";
2
3
  import { init_logger } from "../../utils/logger.js";
3
- import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
4
4
  import { loadConfig } from "../../config/loader.js";
5
5
  import { ExtensionLoader } from "../../extensions/loader.js";
6
6
  import { getWorkspacePath } from "../../config/workspace-path-helpers.js";
@@ -2,8 +2,8 @@ import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { init_paths } from "../config/paths.js";
3
3
  import { palette } from "./theme/dark.js";
4
4
  import { palette as palette$1 } from "./theme/light.js";
5
- import { join } from "node:path";
6
5
  import { existsSync, readFileSync, readdirSync } from "node:fs";
6
+ import { join } from "node:path";
7
7
  import chalk from "chalk";
8
8
  //#region src/tui/theme-manager.ts
9
9
  init_paths();