@xopcai/xopc 0.0.124 → 0.0.126

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 (496) hide show
  1. package/README.md +56 -102
  2. package/README.zh-CN.md +51 -98
  3. package/dist/browser-ext/manifest.json +1 -1
  4. package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
  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/config-schema.d.ts +8 -8
  8. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  9. package/dist/extensions/telegram/src/plugin.js +1 -1
  10. package/dist/extensions/telegram/src/routing-integration.js +2 -2
  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 +1 -1
  14. package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
  15. package/dist/extensions/weixin/src/plugin.js +1 -1
  16. package/dist/extensions/weixin/src/workflow-progress.js +1 -1
  17. package/dist/gateway/static/root/assets/Combination-BzaXOLd9.js +41 -0
  18. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-B5uSVAyJ.js → agent-avatar-dicebear-C70vgt60.js} +1 -1
  19. package/dist/gateway/static/root/assets/agents-DRYVahI-.js +2 -0
  20. package/dist/gateway/static/root/assets/app-management-settings-panel-D9-HW6cy.js +1 -0
  21. package/dist/gateway/static/root/assets/appearance-settings-BHlahIDL.js +1 -0
  22. package/dist/gateway/static/root/assets/apps-page-BdJ1eQg3.js +1 -0
  23. package/dist/gateway/static/root/assets/{archive-plugin-CXUGRp2i.js → archive-plugin-B-aoIt0w.js} +1 -1
  24. package/dist/gateway/static/root/assets/{attachment-load-Cmiub3Wg.js → attachment-load-BD0G0FD5.js} +1 -1
  25. package/dist/gateway/static/root/assets/automation-suggestion-card-iJRVI7aZ.js +1 -0
  26. package/dist/gateway/static/root/assets/automations-page-D8hYQbkl.js +4 -0
  27. package/dist/gateway/static/root/assets/{binary-plugins-0Izz-N3p.js → binary-plugins-B0mNlVSz.js} +1 -1
  28. package/dist/gateway/static/root/assets/{block-editor-C1Kv0IkJ.js → block-editor-CJY9Lu5G.js} +3 -3
  29. package/dist/gateway/static/root/assets/browser-settings-page-CiWEO-Iy.js +8 -0
  30. package/dist/gateway/static/root/assets/capability-presets-api-Bgc8ag55.js +1 -0
  31. package/dist/gateway/static/root/assets/capability-presets-settings-panel-B1nIi0TC.js +1 -0
  32. package/dist/gateway/static/root/assets/{channel-recipient-api-BeA2aVor.js → channel-recipient-api-0sauApoC.js} +1 -1
  33. package/dist/gateway/static/root/assets/channels-settings-BddPdqVo.js +1 -0
  34. package/dist/gateway/static/root/assets/code-editor-gbRgS14t.js +1 -0
  35. package/dist/gateway/static/root/assets/connectors-page-Ba2GDhSE.js +2 -0
  36. package/dist/gateway/static/root/assets/{directory-picker-path-field-2rjzUu57.js → directory-picker-path-field-CiEc4KmY.js} +1 -1
  37. package/dist/gateway/static/root/assets/dist-By6Rh2ee.js +1 -0
  38. package/dist/gateway/static/root/assets/dist-CkobR7mk.js +1 -0
  39. package/dist/gateway/static/root/assets/dist-DokQNVMQ.js +1 -0
  40. package/dist/gateway/static/root/assets/dreaming-settings-4bvpk5wr.js +3 -0
  41. package/dist/gateway/static/root/assets/extension-debug-page-BbyczVZ3.js +1 -0
  42. package/dist/gateway/static/root/assets/extension-page-DLN1I3DR.js +1 -0
  43. package/dist/gateway/static/root/assets/extension-settings-page-D9VGHmYJ.js +1 -0
  44. package/dist/gateway/static/root/assets/{fetch-BU5S0Sn7.js → fetch-5V96dUz3.js} +1 -1
  45. package/dist/gateway/static/root/assets/{gateway-config-api-BIPGwrl1.js → gateway-config-api-BtIzObwp.js} +1 -1
  46. package/dist/gateway/static/root/assets/gateway-settings-KFsGGDhg.js +1 -0
  47. package/dist/gateway/static/root/assets/{gateway-startup-retry-Cd0Zz30N.js → gateway-startup-retry-DEMad2wt.js} +1 -1
  48. package/dist/gateway/static/root/assets/goal-create-dialog-4PcF6Sh6.js +1 -0
  49. package/dist/gateway/static/root/assets/goal-detail-page-B482PSaG.js +1 -0
  50. package/dist/gateway/static/root/assets/{goals-config-api-B95KdGMj.js → goals-config-api-CVN7-pdM.js} +1 -1
  51. package/dist/gateway/static/root/assets/goals-page-CUdgJuDn.js +2 -0
  52. package/dist/gateway/static/root/assets/goals-settings-IYCH3-Pi.js +1 -0
  53. package/dist/gateway/static/root/assets/heartbeat-settings-Cf_a2Bmz.js +1 -0
  54. package/dist/gateway/static/root/assets/{html-workspace-editor-CQLWDiwE.js → html-workspace-editor-DV90ddkE.js} +1 -1
  55. package/dist/gateway/static/root/assets/index-CA2tR2vm.js +256 -0
  56. package/dist/gateway/static/root/assets/index-Ds3u0LOk.css +1 -0
  57. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-lKTg6St7.js +1 -0
  58. package/dist/gateway/static/root/assets/logs-page-BCporcNH.js +2 -0
  59. package/dist/gateway/static/root/assets/{markdown-editor-AssmZFx4.js → markdown-editor-BFOjBBla.js} +2 -2
  60. package/dist/gateway/static/root/assets/markdown-split-Bv4k6iGJ.js +1 -0
  61. package/dist/gateway/static/root/assets/{media-plugins-BhIQU5yS.js → media-plugins-Bbi8g3N8.js} +1 -1
  62. package/dist/gateway/static/root/assets/messages-C22hxE1N.js +3 -0
  63. package/dist/gateway/static/root/assets/models-hub-panel-D68Pyow7.js +2 -0
  64. package/dist/gateway/static/root/assets/notes-page-CuUMOiyv.js +1 -0
  65. package/dist/gateway/static/root/assets/notes-workbench-Dx2N5zTk.js +2 -0
  66. package/dist/gateway/static/root/assets/page-tabs-Cp395RYD.js +1 -0
  67. package/dist/gateway/static/root/assets/{preview-open-alternatives-DGzet1d7.js → preview-open-alternatives-DqV5OM4m.js} +1 -1
  68. package/dist/gateway/static/root/assets/project-detail-page-sB8AzZi3.js +1 -0
  69. package/dist/gateway/static/root/assets/projects-page-LBnJqWK2.js +1 -0
  70. package/dist/gateway/static/root/assets/remote-access-hub-Dbj0o6SC.js +1 -0
  71. package/dist/gateway/static/root/assets/{save-bar-controls-Cqgb-jqa.js → save-bar-controls-BItmzAzI.js} +1 -1
  72. package/dist/gateway/static/root/assets/{schedule-field-DVZcI8Yt.js → schedule-field-BQ8IjjCn.js} +1 -1
  73. package/dist/gateway/static/root/assets/{schema-form-Bj7sOxC8.js → schema-form-BRpD6x3d.js} +1 -1
  74. package/dist/gateway/static/root/assets/sessions-page-DhDZKspB.js +1 -0
  75. package/dist/gateway/static/root/assets/settings-advanced-gate-BvXLMNL6.js +1 -0
  76. package/dist/gateway/static/root/assets/{settings-collapsible-section-BmXn-8N6.js → settings-collapsible-section-BKSPQM4R.js} +1 -1
  77. package/dist/gateway/static/root/assets/settings-form-section-BmyfthNQ.js +1 -0
  78. package/dist/gateway/static/root/assets/settings-page-Cfm9UxAr.js +1 -0
  79. package/dist/gateway/static/root/assets/settings-page-layout-Bls5tfbH.js +1 -0
  80. package/dist/gateway/static/root/assets/setup-status-panel-kQEsTGAs.js +1 -0
  81. package/dist/gateway/static/root/assets/{share-preview-page-IB1v8i86.js → share-preview-page-DbYZNAPb.js} +1 -1
  82. package/dist/gateway/static/root/assets/shares-settings-BtR4B0kn.js +1 -0
  83. package/dist/gateway/static/root/assets/skill-reload-api-CJNVOWoK.js +1 -0
  84. package/dist/gateway/static/root/assets/skills-page-DcWDHrt3.js +2 -0
  85. package/dist/gateway/static/root/assets/{system-settings-panel-BxQ384RC.js → system-settings-panel-DKDAojWM.js} +1 -1
  86. package/dist/gateway/static/root/assets/{typed-models-lib-BkcpvFYO.js → typed-models-lib-BCCV4Kkp.js} +1 -1
  87. package/dist/gateway/static/root/assets/{use-channel-catalog-Cd0FaEQ4.js → use-channel-catalog-NBqg3iFY.js} +1 -1
  88. package/dist/gateway/static/root/assets/{user-profile-settings-panel-DQ7NnRSY.js → user-profile-settings-panel-suQ2x-LB.js} +1 -1
  89. package/dist/gateway/static/root/assets/{utils-YKhVf7Ka.js → utils-DPGVr3tS.js} +1 -1
  90. package/dist/gateway/static/root/assets/{vendor-codemirror-CNP1wPe7.js → vendor-codemirror-BvNgyE1Q.js} +1 -1
  91. package/dist/gateway/static/root/assets/voice-api-key-field-DaJASKFP.js +1 -0
  92. package/dist/gateway/static/root/assets/work-item-detail-page-BrCZpAWh.js +1 -0
  93. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BTkRVNAh.js +3 -0
  94. package/dist/gateway/static/root/assets/{workflow-start-dialog-BNJVCWoS.js → workflow-start-dialog-DAImVtdO.js} +1 -1
  95. package/dist/gateway/static/root/assets/workflows-page-vyJ8wSXm.js +18 -0
  96. package/dist/gateway/static/root/index.html +8 -7
  97. package/dist/package.js +1 -1
  98. package/dist/src/activity/context.d.ts +11 -0
  99. package/dist/src/activity/context.js +36 -0
  100. package/dist/src/activity/context.js.map +1 -0
  101. package/dist/src/activity/emitter.d.ts +6 -0
  102. package/dist/src/activity/emitter.js +43 -0
  103. package/dist/src/activity/emitter.js.map +1 -0
  104. package/dist/src/activity/index.d.ts +3 -0
  105. package/dist/src/activity/index.js +3 -0
  106. package/dist/src/activity/service.d.ts +12 -0
  107. package/dist/src/activity/service.js +59 -0
  108. package/dist/src/activity/service.js.map +1 -0
  109. package/dist/src/activity/types.d.ts +109 -0
  110. package/dist/src/activity/types.js +1 -0
  111. package/dist/src/agent/agent-manager.d.ts +7 -0
  112. package/dist/src/agent/agent-manager.js +12 -5
  113. package/dist/src/agent/agent-manager.js.map +1 -1
  114. package/dist/src/agent/child-agent-factory.d.ts +2 -0
  115. package/dist/src/agent/child-agent-factory.js +2 -0
  116. package/dist/src/agent/child-agent-factory.js.map +1 -1
  117. package/dist/src/agent/coding/index.d.ts +1 -0
  118. package/dist/src/agent/coding/index.js +2 -0
  119. package/dist/src/agent/coding/turn-diff-tracker.d.ts +67 -0
  120. package/dist/src/agent/coding/turn-diff-tracker.js +233 -0
  121. package/dist/src/agent/coding/turn-diff-tracker.js.map +1 -0
  122. package/dist/src/agent/context/project-context.js +2 -2
  123. package/dist/src/agent/context/workspace-seed.js +2 -2
  124. package/dist/src/agent/embedded/run-for-session.js +1 -1
  125. package/dist/src/agent/goals/post-turn.js +2 -2
  126. package/dist/src/agent/ipc/bus.js +1 -1
  127. package/dist/src/agent/mcp/bundle-mcp-materialize.js +1 -1
  128. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  129. package/dist/src/agent/mcp/mcp-transport-config.js +1 -1
  130. package/dist/src/agent/mcp/mcp-transport.js +1 -1
  131. package/dist/src/agent/memory/dreaming/config.d.ts +2 -2
  132. package/dist/src/agent/memory/dreaming/config.js +3 -3
  133. package/dist/src/agent/memory/dreaming/config.js.map +1 -1
  134. package/dist/src/agent/memory/dreaming/constants.d.ts +1 -1
  135. package/dist/src/agent/memory/dreaming/constants.js +1 -1
  136. package/dist/src/agent/memory/dreaming/constants.js.map +1 -1
  137. package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +1 -0
  138. package/dist/src/agent/memory/dreaming/deep-promotion.js +11 -20
  139. package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
  140. package/dist/src/agent/memory/dreaming/events.d.ts +3 -3
  141. package/dist/src/agent/memory/dreaming/events.js +6 -6
  142. package/dist/src/agent/memory/dreaming/events.js.map +1 -1
  143. package/dist/src/agent/memory/dreaming/last-run.d.ts +2 -2
  144. package/dist/src/agent/memory/dreaming/last-run.js +1 -1
  145. package/dist/src/agent/memory/dreaming/last-run.js.map +1 -1
  146. package/dist/src/agent/memory/dreaming/light-sweep.d.ts +1 -1
  147. package/dist/src/agent/memory/dreaming/light-sweep.js +3 -3
  148. package/dist/src/agent/memory/dreaming/light-sweep.js.map +1 -1
  149. package/dist/src/agent/memory/dreaming/preview.d.ts +1 -0
  150. package/dist/src/agent/memory/dreaming/preview.js +2 -2
  151. package/dist/src/agent/memory/dreaming/preview.js.map +1 -1
  152. package/dist/src/agent/memory/dreaming/rem-patterns.d.ts +1 -1
  153. package/dist/src/agent/memory/dreaming/rem-patterns.js +13 -13
  154. package/dist/src/agent/memory/dreaming/rem-patterns.js.map +1 -1
  155. package/dist/src/agent/memory/dreaming/scope.d.ts +14 -0
  156. package/dist/src/agent/memory/dreaming/scope.js +27 -0
  157. package/dist/src/agent/memory/dreaming/scope.js.map +1 -0
  158. package/dist/src/agent/memory/dreaming/short-term-store.d.ts +4 -4
  159. package/dist/src/agent/memory/dreaming/short-term-store.js +17 -17
  160. package/dist/src/agent/memory/dreaming/short-term-store.js.map +1 -1
  161. package/dist/src/agent/memory/plugin-discovery.js +1 -1
  162. package/dist/src/agent/models/manager.js +1 -1
  163. package/dist/src/agent/orchestration/agent-event-handler.d.ts +2 -0
  164. package/dist/src/agent/orchestration/agent-event-handler.js +13 -0
  165. package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
  166. package/dist/src/agent/orchestration/agent-orchestrator.js +22 -12
  167. package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
  168. package/dist/src/agent/sandbox/command-validator.js +12 -0
  169. package/dist/src/agent/sandbox/command-validator.js.map +1 -1
  170. package/dist/src/agent/service.d.ts +2 -1
  171. package/dist/src/agent/service.js +24 -9
  172. package/dist/src/agent/service.js.map +1 -1
  173. package/dist/src/agent/service.types.d.ts +7 -0
  174. package/dist/src/agent/session/session-inspector.d.ts +5 -3
  175. package/dist/src/agent/session/session-inspector.js +17 -8
  176. package/dist/src/agent/session/session-inspector.js.map +1 -1
  177. package/dist/src/agent/skills/hub-pull.js +1 -1
  178. package/dist/src/agent/source-context/types.d.ts +1 -1
  179. package/dist/src/agent/source-context/types.js +1 -1
  180. package/dist/src/agent/source-context/types.js.map +1 -1
  181. package/dist/src/agent/tool-manuals/index.js +15 -6
  182. package/dist/src/agent/tool-manuals/index.js.map +1 -1
  183. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -0
  184. package/dist/src/agent/tool-manuals/xopc-use.js +204 -0
  185. package/dist/src/agent/tool-manuals/xopc-use.js.map +1 -0
  186. package/dist/src/agent/tools/apply-patch.js +116 -62
  187. package/dist/src/agent/tools/apply-patch.js.map +1 -1
  188. package/dist/src/agent/tools/concurrency.d.ts +8 -0
  189. package/dist/src/agent/tools/concurrency.js +31 -0
  190. package/dist/src/agent/tools/concurrency.js.map +1 -0
  191. package/dist/src/agent/tools/dreaming-tool.d.ts +2 -0
  192. package/dist/src/agent/tools/dreaming-tool.js +13 -10
  193. package/dist/src/agent/tools/dreaming-tool.js.map +1 -1
  194. package/dist/src/agent/tools/exec-command.js +4 -0
  195. package/dist/src/agent/tools/exec-command.js.map +1 -1
  196. package/dist/src/agent/tools/executor.d.ts +6 -4
  197. package/dist/src/agent/tools/executor.js +7 -4
  198. package/dist/src/agent/tools/executor.js.map +1 -1
  199. package/dist/src/agent/tools/factory.d.ts +10 -0
  200. package/dist/src/agent/tools/factory.js +16 -1
  201. package/dist/src/agent/tools/factory.js.map +1 -1
  202. package/dist/src/agent/tools/find.js +2 -0
  203. package/dist/src/agent/tools/find.js.map +1 -1
  204. package/dist/src/agent/tools/goal-tool.js +2 -2
  205. package/dist/src/agent/tools/grep.js +2 -0
  206. package/dist/src/agent/tools/grep.js.map +1 -1
  207. package/dist/src/agent/tools/index.d.ts +3 -0
  208. package/dist/src/agent/tools/index.js +4 -1
  209. package/dist/src/agent/tools/list-dir.js +2 -0
  210. package/dist/src/agent/tools/list-dir.js.map +1 -1
  211. package/dist/src/agent/tools/memory-tool.d.ts +1 -0
  212. package/dist/src/agent/tools/memory-tool.js +2 -2
  213. package/dist/src/agent/tools/memory-tool.js.map +1 -1
  214. package/dist/src/agent/tools/metadata.d.ts +15 -0
  215. package/dist/src/agent/tools/metadata.js +26 -0
  216. package/dist/src/agent/tools/metadata.js.map +1 -0
  217. package/dist/src/agent/tools/read.js +2 -0
  218. package/dist/src/agent/tools/read.js.map +1 -1
  219. package/dist/src/agent/tools/workflow-tool.js +1 -1
  220. package/dist/src/agent/tools/write.js +6 -0
  221. package/dist/src/agent/tools/write.js.map +1 -1
  222. package/dist/src/agent/tools/xopc-use-tool.d.ts +34 -0
  223. package/dist/src/agent/tools/xopc-use-tool.js +636 -0
  224. package/dist/src/agent/tools/xopc-use-tool.js.map +1 -0
  225. package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
  226. package/dist/src/agent/workflow/subagent-runner.js +5 -1
  227. package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
  228. package/dist/src/agent/workflow/workflow-child-tools.js +5 -0
  229. package/dist/src/agent/workflow/workflow-child-tools.js.map +1 -1
  230. package/dist/src/agent-manifest/schema.d.ts +27 -27
  231. package/dist/src/automations/api/routes.js +1 -1
  232. package/dist/src/automations/domain/validation.d.ts +55 -55
  233. package/dist/src/automations/draft/automation-draft-validator.d.ts +25 -25
  234. package/dist/src/automations/service/action-executor.js +2 -2
  235. package/dist/src/browser/cdp-local-launcher.js +1 -1
  236. package/dist/src/browser/providers/browser-ext-install.js +3 -3
  237. package/dist/src/browser/providers/cloakbrowser.js +2 -2
  238. package/dist/src/browser/providers/playwright-doctor.js +1 -1
  239. package/dist/src/browser/stealth.js +1 -1
  240. package/dist/src/chat-commands/agent-edit.js +1 -1
  241. package/dist/src/chat-commands/builtins/config.js +1 -1
  242. package/dist/src/chat-commands/builtins/goal.js +2 -2
  243. package/dist/src/chat-commands/context.js +1 -1
  244. package/dist/src/cli/commands/agent.js +1 -1
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +2 -2
  246. package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
  247. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  248. package/dist/src/cli/commands/extension-pack.js +1 -1
  249. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  250. package/dist/src/cli/commands/goal.js +3 -3
  251. package/dist/src/cli/commands/init.js +1 -1
  252. package/dist/src/cli/commands/project.js +4 -4
  253. package/dist/src/config/agent-profile.js +1 -1
  254. package/dist/src/config/gateway-bind.js +1 -1
  255. package/dist/src/config/index.js +1 -1
  256. package/dist/src/config/loader.js +1 -1
  257. package/dist/src/config/models-json.d.ts +14 -14
  258. package/dist/src/config/models-json.js +1 -1
  259. package/dist/src/config/schema.d.ts +60 -60
  260. package/dist/src/connectors/health.d.ts +2 -1
  261. package/dist/src/connectors/health.js +59 -1
  262. package/dist/src/connectors/health.js.map +1 -1
  263. package/dist/src/connectors/install.d.ts +1 -0
  264. package/dist/src/connectors/install.js +28 -1
  265. package/dist/src/connectors/install.js.map +1 -1
  266. package/dist/src/connectors/instances.js +7 -0
  267. package/dist/src/connectors/instances.js.map +1 -1
  268. package/dist/src/connectors/materialize.js +2 -1
  269. package/dist/src/connectors/materialize.js.map +1 -1
  270. package/dist/src/connectors/registries/modelscope.js +38 -13
  271. package/dist/src/connectors/registries/modelscope.js.map +1 -1
  272. package/dist/src/connectors/types.d.ts +2 -0
  273. package/dist/src/daemon/launchd.js +1 -1
  274. package/dist/src/daemon/systemd.js +1 -1
  275. package/dist/src/extensions/discover-extensions.js +1 -1
  276. package/dist/src/extensions/loader.js +2 -2
  277. package/dist/src/gateway/agents-admin.js +1 -1
  278. package/dist/src/gateway/dreaming-automation-reconciler.d.ts +1 -0
  279. package/dist/src/gateway/dreaming-automation-reconciler.js +62 -42
  280. package/dist/src/gateway/dreaming-automation-reconciler.js.map +1 -1
  281. package/dist/src/gateway/hono/app.js +7 -1
  282. package/dist/src/gateway/hono/app.js.map +1 -1
  283. package/dist/src/gateway/hono/lib/config-payload.d.ts +14 -14
  284. package/dist/src/gateway/hono/lib/static-ui.js +1 -1
  285. package/dist/src/gateway/hono/middleware/log-context.js +8 -1
  286. package/dist/src/gateway/hono/middleware/log-context.js.map +1 -1
  287. package/dist/src/gateway/hono/routes/activity.d.ts +14 -0
  288. package/dist/src/gateway/hono/routes/activity.js +72 -0
  289. package/dist/src/gateway/hono/routes/activity.js.map +1 -0
  290. package/dist/src/gateway/hono/routes/connectors.js +46 -2
  291. package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
  292. package/dist/src/gateway/hono/routes/dreaming.js +111 -66
  293. package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
  294. package/dist/src/gateway/hono/routes/goals.js +1 -1
  295. package/dist/src/gateway/hono/routes/index.js +2 -0
  296. package/dist/src/gateway/hono/routes/index.js.map +1 -1
  297. package/dist/src/gateway/hono/routes/memory.js +2 -2
  298. package/dist/src/gateway/hono/routes/projects.js +903 -50
  299. package/dist/src/gateway/hono/routes/projects.js.map +1 -1
  300. package/dist/src/gateway/hono/routes/sessions.js +102 -2
  301. package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
  302. package/dist/src/gateway/hono/routes/workflows.js +2 -2
  303. package/dist/src/gateway/lock.js +1 -1
  304. package/dist/src/gateway/ports.js +1 -1
  305. package/dist/src/gateway/service/sessions-api.d.ts +10 -0
  306. package/dist/src/gateway/service/sessions-api.js +31 -0
  307. package/dist/src/gateway/service/sessions-api.js.map +1 -1
  308. package/dist/src/gateway/service.js +28 -16
  309. package/dist/src/gateway/service.js.map +1 -1
  310. package/dist/src/goals/goal-store.js +1 -1
  311. package/dist/src/goals/goal-store.js.map +1 -1
  312. package/dist/src/goals/goal-workflow-judge.js +1 -1
  313. package/dist/src/infra/ports.js +1 -1
  314. package/dist/src/infra/ssh-tunnel.js +1 -1
  315. package/dist/src/infra/update-check.js +1 -1
  316. package/dist/src/infra/update-restart.js +1 -1
  317. package/dist/src/mcp/channel-bridge.js +1 -1
  318. package/dist/src/media/store.js +1 -1
  319. package/dist/src/media/store.js.map +1 -1
  320. package/dist/src/media/types.d.ts +1 -1
  321. package/dist/src/media/uri.js +2 -1
  322. package/dist/src/media/uri.js.map +1 -1
  323. package/dist/src/migrations/runner.js +1 -1
  324. package/dist/src/notes/service.js +65 -6
  325. package/dist/src/notes/service.js.map +1 -1
  326. package/dist/src/notes/store.js +1 -1
  327. package/dist/src/projects/project-service.d.ts +2 -1
  328. package/dist/src/projects/project-service.js +59 -2
  329. package/dist/src/projects/project-service.js.map +1 -1
  330. package/dist/src/projects/project-store.d.ts +2 -1
  331. package/dist/src/projects/project-store.js +43 -0
  332. package/dist/src/projects/project-store.js.map +1 -1
  333. package/dist/src/projects/types.d.ts +10 -0
  334. package/dist/src/projects/workspace.js +1 -1
  335. package/dist/src/routing/agent-session-key.js +1 -1
  336. package/dist/src/routing/resolve-route.js +1 -1
  337. package/dist/src/routing/resolve-tui-session-key.js +1 -1
  338. package/dist/src/session/client-history.d.ts +3 -0
  339. package/dist/src/session/client-history.js +24 -9
  340. package/dist/src/session/client-history.js.map +1 -1
  341. package/dist/src/session/init-session-turn.js +1 -1
  342. package/dist/src/session/resolve-session.js +1 -1
  343. package/dist/src/session/session-context-for-llm.d.ts +2 -0
  344. package/dist/src/session/session-context-for-llm.js +14 -1
  345. package/dist/src/session/session-context-for-llm.js.map +1 -1
  346. package/dist/src/session/session-title.js +2 -2
  347. package/dist/src/session/store.js +3 -3
  348. package/dist/src/session/store.js.map +1 -1
  349. package/dist/src/session/types.d.ts +4 -0
  350. package/dist/src/session/types.js.map +1 -1
  351. package/dist/src/storage/sqlite/activity-repository.d.ts +8 -0
  352. package/dist/src/storage/sqlite/activity-repository.js +208 -0
  353. package/dist/src/storage/sqlite/activity-repository.js.map +1 -0
  354. package/dist/src/storage/sqlite/connection.js +1 -1
  355. package/dist/src/storage/sqlite/index.d.ts +1 -0
  356. package/dist/src/storage/sqlite/index.js +2 -1
  357. package/dist/src/storage/sqlite/migrations/022_work_items.sql +61 -0
  358. package/dist/src/storage/sqlite/migrations/023_work_item_attachments.sql +15 -0
  359. package/dist/src/storage/sqlite/migrations/024_activity_events.sql +62 -0
  360. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  361. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  362. package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
  363. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  364. package/dist/src/storage/sqlite/row-mappers.js +1 -1
  365. package/dist/src/storage/sqlite/schema.js +1 -1
  366. package/dist/src/storage/sqlite/schema.sql +141 -0
  367. package/dist/src/storage/sqlite/session-repository.js +11 -0
  368. package/dist/src/storage/sqlite/session-repository.js.map +1 -1
  369. package/dist/src/tui/backends/embedded-backend.d.ts +13 -0
  370. package/dist/src/tui/backends/embedded-backend.js +76 -7
  371. package/dist/src/tui/backends/embedded-backend.js.map +1 -1
  372. package/dist/src/tui/backends/gateway-sse-backend.d.ts +13 -0
  373. package/dist/src/tui/backends/gateway-sse-backend.js +53 -0
  374. package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
  375. package/dist/src/tui/chat-history.js +16 -3
  376. package/dist/src/tui/chat-history.js.map +1 -1
  377. package/dist/src/tui/clipboard-image.js +1 -1
  378. package/dist/src/tui/components/assistant-message.js +12 -2
  379. package/dist/src/tui/components/assistant-message.js.map +1 -1
  380. package/dist/src/tui/components/chat-log.d.ts +23 -3
  381. package/dist/src/tui/components/chat-log.js +68 -9
  382. package/dist/src/tui/components/chat-log.js.map +1 -1
  383. package/dist/src/tui/components/tool-execution.d.ts +8 -0
  384. package/dist/src/tui/components/tool-execution.js +87 -77
  385. package/dist/src/tui/components/tool-execution.js.map +1 -1
  386. package/dist/src/tui/components/tui-bottom-bar.js +9 -5
  387. package/dist/src/tui/components/tui-bottom-bar.js.map +1 -1
  388. package/dist/src/tui/components/visual-truncate.d.ts +1 -0
  389. package/dist/src/tui/components/visual-truncate.js +28 -1
  390. package/dist/src/tui/components/visual-truncate.js.map +1 -1
  391. package/dist/src/tui/tool-summary.d.ts +22 -0
  392. package/dist/src/tui/tool-summary.js +212 -0
  393. package/dist/src/tui/tool-summary.js.map +1 -0
  394. package/dist/src/tui/tui-backend.d.ts +16 -0
  395. package/dist/src/tui/tui-command-formatters.js +2 -2
  396. package/dist/src/tui/tui-commands.d.ts +9 -0
  397. package/dist/src/tui/tui-commands.js +95 -6
  398. package/dist/src/tui/tui-commands.js.map +1 -1
  399. package/dist/src/tui/tui-picker-overlay.d.ts +1 -0
  400. package/dist/src/tui/tui-picker-overlay.js +36 -1
  401. package/dist/src/tui/tui-picker-overlay.js.map +1 -1
  402. package/dist/src/tui/tui-picker-services.d.ts +13 -0
  403. package/dist/src/tui/tui-run-state.js +11 -0
  404. package/dist/src/tui/tui-run-state.js.map +1 -1
  405. package/dist/src/tui/tui-run-status-format.d.ts +3 -0
  406. package/dist/src/tui/tui-run-status-format.js +33 -0
  407. package/dist/src/tui/tui-run-status-format.js.map +1 -0
  408. package/dist/src/tui/tui-session-actions.d.ts +5 -0
  409. package/dist/src/tui/tui-session-actions.js +24 -0
  410. package/dist/src/tui/tui-session-actions.js.map +1 -1
  411. package/dist/src/tui/tui-timeline-picker.d.ts +19 -0
  412. package/dist/src/tui/tui-timeline-picker.js +81 -0
  413. package/dist/src/tui/tui-timeline-picker.js.map +1 -0
  414. package/dist/src/tui/tui-timeline.d.ts +15 -0
  415. package/dist/src/tui/tui-timeline.js +65 -0
  416. package/dist/src/tui/tui-timeline.js.map +1 -0
  417. package/dist/src/tui/tui-tool-diff.d.ts +15 -0
  418. package/dist/src/tui/tui-tool-diff.js +178 -7
  419. package/dist/src/tui/tui-tool-diff.js.map +1 -1
  420. package/dist/src/tui/tui-types.d.ts +1 -0
  421. package/dist/src/tui/tui-types.js +1 -0
  422. package/dist/src/tui/tui-types.js.map +1 -1
  423. package/dist/src/tui/tui.js +31 -25
  424. package/dist/src/tui/tui.js.map +1 -1
  425. package/dist/src/utils/index.js +1 -1
  426. package/dist/src/utils/logger/index.js +1 -1
  427. package/dist/src/utils/logger/stats.d.ts +3 -3
  428. package/dist/src/utils/logger.js +1 -1
  429. package/dist/src/work-items/agent-context.d.ts +7 -0
  430. package/dist/src/work-items/agent-context.js +75 -0
  431. package/dist/src/work-items/agent-context.js.map +1 -0
  432. package/dist/src/work-items/index.d.ts +4 -0
  433. package/dist/src/work-items/index.js +4 -0
  434. package/dist/src/work-items/types.d.ts +112 -0
  435. package/dist/src/work-items/types.js +1 -0
  436. package/dist/src/work-items/work-item-service.d.ts +35 -0
  437. package/dist/src/work-items/work-item-service.js +277 -0
  438. package/dist/src/work-items/work-item-service.js.map +1 -0
  439. package/dist/src/work-items/work-item-store.d.ts +21 -0
  440. package/dist/src/work-items/work-item-store.js +302 -0
  441. package/dist/src/work-items/work-item-store.js.map +1 -0
  442. package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
  443. package/dist/src/workflows/service/workflow-run-service.js +4 -3
  444. package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
  445. package/dist/src/workflows/service/workflow-session-bridge.js +4 -1
  446. package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
  447. package/package.json +5 -5
  448. package/dist/gateway/static/root/assets/Combination-HAlzriaz.js +0 -41
  449. package/dist/gateway/static/root/assets/agents-BjIxt67Z.js +0 -2
  450. package/dist/gateway/static/root/assets/app-management-settings-panel-CYCONLIL.js +0 -1
  451. package/dist/gateway/static/root/assets/appearance-settings-Clw3ryKg.js +0 -1
  452. package/dist/gateway/static/root/assets/apps-page-QICTeGjX.js +0 -1
  453. package/dist/gateway/static/root/assets/automation-suggestion-card-CU0-4nQ-.js +0 -1
  454. package/dist/gateway/static/root/assets/automations-page-Car-jtiz.js +0 -1
  455. package/dist/gateway/static/root/assets/browser-settings-page-CMeBJzlS.js +0 -8
  456. package/dist/gateway/static/root/assets/capability-presets-api-BmQTM9Il.js +0 -1
  457. package/dist/gateway/static/root/assets/capability-presets-settings-panel-DZEJEoCF.js +0 -1
  458. package/dist/gateway/static/root/assets/channels-settings-kkW-xFau.js +0 -1
  459. package/dist/gateway/static/root/assets/code-editor-dZTY2dRW.js +0 -1
  460. package/dist/gateway/static/root/assets/connectors-page-BvaQvO5F.js +0 -2
  461. package/dist/gateway/static/root/assets/dist-Mys7eFJ5.js +0 -1
  462. package/dist/gateway/static/root/assets/dist-wO9a2_ID.js +0 -1
  463. package/dist/gateway/static/root/assets/dreaming-settings-DnHO686d.js +0 -1
  464. package/dist/gateway/static/root/assets/extension-debug-page-BGLRuWVN.js +0 -1
  465. package/dist/gateway/static/root/assets/extension-page-D978ePp9.js +0 -1
  466. package/dist/gateway/static/root/assets/extension-settings-page-B6Ih4Swx.js +0 -1
  467. package/dist/gateway/static/root/assets/gateway-settings-CMEA3r5u.js +0 -1
  468. package/dist/gateway/static/root/assets/goal-create-dialog-B-KHKeXN.js +0 -1
  469. package/dist/gateway/static/root/assets/goal-detail-page-BxrSoWdj.js +0 -1
  470. package/dist/gateway/static/root/assets/goals-page-BTJzIl28.js +0 -2
  471. package/dist/gateway/static/root/assets/goals-settings-BJyEuLLm.js +0 -1
  472. package/dist/gateway/static/root/assets/heartbeat-settings-wkOjYNQT.js +0 -1
  473. package/dist/gateway/static/root/assets/index-BLaXr6Ev.css +0 -1
  474. package/dist/gateway/static/root/assets/index-c_9TVr_C.js +0 -191
  475. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-BT8T4DyC.js +0 -1
  476. package/dist/gateway/static/root/assets/logs-page-CrxBJUgI.js +0 -2
  477. package/dist/gateway/static/root/assets/markdown-split-Dv66bO2b.js +0 -1
  478. package/dist/gateway/static/root/assets/messages-O6TAtdFC.js +0 -3
  479. package/dist/gateway/static/root/assets/models-hub-panel-DOOpz6y1.js +0 -2
  480. package/dist/gateway/static/root/assets/notes-page-Br16pK9v.js +0 -1
  481. package/dist/gateway/static/root/assets/notes-workbench-PSJAi0ZC.js +0 -2
  482. package/dist/gateway/static/root/assets/project-detail-page-CIGGgKuw.js +0 -1
  483. package/dist/gateway/static/root/assets/projects-page-B2grhsBt.js +0 -1
  484. package/dist/gateway/static/root/assets/remote-access-hub-CXMORxBD.js +0 -1
  485. package/dist/gateway/static/root/assets/sessions-page-Bi2wkBzU.js +0 -1
  486. package/dist/gateway/static/root/assets/settings-advanced-gate-B1L3G4IA.js +0 -1
  487. package/dist/gateway/static/root/assets/settings-form-section-BnqYMWHR.js +0 -1
  488. package/dist/gateway/static/root/assets/settings-page-BfRSHJmO.js +0 -1
  489. package/dist/gateway/static/root/assets/settings-page-layout-CdWZU1hd.js +0 -1
  490. package/dist/gateway/static/root/assets/setup-status-panel-CWtPM7RK.js +0 -1
  491. package/dist/gateway/static/root/assets/shares-settings-ngbsBgij.js +0 -1
  492. package/dist/gateway/static/root/assets/skill-reload-api-BIe442Gv.js +0 -1
  493. package/dist/gateway/static/root/assets/skills-page-BfchZRVa.js +0 -2
  494. package/dist/gateway/static/root/assets/voice-api-key-field-C5Ov8Uk_.js +0 -1
  495. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BYD9BtOq.js +0 -3
  496. package/dist/gateway/static/root/assets/workflows-page-BYF29ANm.js +0 -18
@@ -0,0 +1,208 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "./transaction.js";
2
+ import { randomUUID } from "node:crypto";
3
+ //#region src/storage/sqlite/activity-repository.ts
4
+ function parseJson(json, fallback) {
5
+ try {
6
+ return JSON.parse(json);
7
+ } catch {
8
+ return fallback;
9
+ }
10
+ }
11
+ function eventFromRow(row) {
12
+ return {
13
+ id: row.id,
14
+ type: row.type,
15
+ primaryObject: {
16
+ kind: row.primary_object_kind,
17
+ id: row.primary_object_id,
18
+ title: row.primary_object_title ?? void 0
19
+ },
20
+ actor: parseJson(row.actor_json, { kind: "system" }),
21
+ initiator: row.initiator_json ? parseJson(row.initiator_json, void 0) : void 0,
22
+ source: parseJson(row.source_json, { kind: "system" }),
23
+ payload: parseJson(row.payload_json, {}),
24
+ visibility: row.visibility,
25
+ importance: row.importance,
26
+ createdAt: row.created_at
27
+ };
28
+ }
29
+ function scopeFromRow(row) {
30
+ return {
31
+ activityId: row.activity_id,
32
+ scopeKind: row.scope_kind,
33
+ scopeId: row.scope_id,
34
+ reason: row.reason
35
+ };
36
+ }
37
+ function relatedProjectFromRow(row) {
38
+ return {
39
+ activityId: row.activity_id,
40
+ projectId: row.project_id,
41
+ reason: row.reason,
42
+ confidence: row.confidence,
43
+ computedAt: row.computed_at
44
+ };
45
+ }
46
+ function objectLinkFromRow(row) {
47
+ return {
48
+ id: row.id,
49
+ from: {
50
+ kind: row.from_kind,
51
+ id: row.from_id,
52
+ title: row.from_title ?? void 0
53
+ },
54
+ to: {
55
+ kind: row.to_kind,
56
+ id: row.to_id,
57
+ title: row.to_title ?? void 0
58
+ },
59
+ relation: row.relation,
60
+ source: row.source,
61
+ createdAt: row.created_at
62
+ };
63
+ }
64
+ function listScopesForActivity(activityId) {
65
+ return getSqliteDatabase().prepare(`SELECT activity_id, scope_kind, scope_id, reason
66
+ FROM activity_scopes
67
+ WHERE activity_id = ?
68
+ ORDER BY scope_kind ASC, scope_id ASC, reason ASC`).all(activityId).map((row) => scopeFromRow(row));
69
+ }
70
+ function listRelatedProjectsForActivity(activityId) {
71
+ return getSqliteDatabase().prepare(`SELECT activity_id, project_id, reason, confidence, computed_at
72
+ FROM activity_related_projects
73
+ WHERE activity_id = ?
74
+ ORDER BY project_id ASC, reason ASC`).all(activityId).map((row) => relatedProjectFromRow(row));
75
+ }
76
+ function eventWithRelations(row) {
77
+ const event = eventFromRow(row);
78
+ return {
79
+ ...event,
80
+ scopes: listScopesForActivity(event.id),
81
+ relatedProjects: listRelatedProjectsForActivity(event.id)
82
+ };
83
+ }
84
+ function normalizeLimit(limit) {
85
+ return Math.max(1, Math.min(100, Math.floor(limit ?? 50)));
86
+ }
87
+ function normalizeOffset(offset) {
88
+ return Math.max(0, Math.floor(offset ?? 0));
89
+ }
90
+ function visibilityClause(visibility, params) {
91
+ if (!visibility) return "";
92
+ params.push(visibility);
93
+ return "WHERE visibility = ?";
94
+ }
95
+ function listResult(rows, total, limit, offset) {
96
+ return {
97
+ items: rows.map(eventWithRelations),
98
+ total,
99
+ limit,
100
+ offset,
101
+ hasMore: offset + rows.length < total
102
+ };
103
+ }
104
+ function recordActivityEvent(input) {
105
+ const id = input.id ?? randomUUID();
106
+ const now = input.nowMs ?? Date.now();
107
+ const visibility = input.visibility ?? "timeline";
108
+ const importance = input.importance ?? "normal";
109
+ const payload = input.payload ?? {};
110
+ runSqliteWriteTransaction((db) => {
111
+ db.prepare(`INSERT INTO activity_events (
112
+ id, type, primary_object_kind, primary_object_id, primary_object_title,
113
+ actor_json, initiator_json, source_json, payload_json,
114
+ visibility, importance, created_at
115
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.type, input.primaryObject.kind, input.primaryObject.id, input.primaryObject.title ?? null, JSON.stringify(input.actor), input.initiator ? JSON.stringify(input.initiator) : null, JSON.stringify(input.source), JSON.stringify(payload), visibility, importance, now);
116
+ for (const scope of input.scopes ?? []) db.prepare(`INSERT OR IGNORE INTO activity_scopes (activity_id, scope_kind, scope_id, reason)
117
+ VALUES (?, ?, ?, ?)`).run(id, scope.scopeKind, scope.scopeId, scope.reason);
118
+ for (const related of input.relatedProjects ?? []) db.prepare(`INSERT OR REPLACE INTO activity_related_projects (
119
+ activity_id, project_id, reason, confidence, computed_at
120
+ ) VALUES (?, ?, ?, ?, ?)`).run(id, related.projectId, related.reason, related.confidence, related.computedAt ?? now);
121
+ });
122
+ const event = getActivityEventRecord(id);
123
+ if (!event) throw new Error(`Activity event was not persisted: ${id}`);
124
+ return event;
125
+ }
126
+ function getActivityEventRecord(id) {
127
+ const row = getSqliteDatabase().prepare(`SELECT *
128
+ FROM activity_events
129
+ WHERE id = ?`).get(id);
130
+ return row ? eventWithRelations(row) : null;
131
+ }
132
+ function listActivityRecords(options = {}) {
133
+ const limit = normalizeLimit(options.limit);
134
+ const offset = normalizeOffset(options.offset);
135
+ const params = [];
136
+ const where = visibilityClause(options.visibility, params);
137
+ const total = getSqliteDatabase().prepare(`SELECT COUNT(*) AS count FROM activity_events ${where}`).get(...params).count;
138
+ return listResult(getSqliteDatabase().prepare(`SELECT *
139
+ FROM activity_events
140
+ ${where}
141
+ ORDER BY created_at DESC, id DESC
142
+ LIMIT ? OFFSET ?`).all(...params, limit, offset).map((row) => row), total, limit, offset);
143
+ }
144
+ function listObjectActivityRecords(options) {
145
+ const limit = normalizeLimit(options.limit);
146
+ const offset = normalizeOffset(options.offset);
147
+ const params = [options.object.kind, options.object.id];
148
+ const visibility = options.visibility ? "AND visibility = ?" : "";
149
+ if (options.visibility) params.push(options.visibility);
150
+ const total = getSqliteDatabase().prepare(`SELECT COUNT(*) AS count
151
+ FROM activity_events
152
+ WHERE primary_object_kind = ? AND primary_object_id = ?
153
+ ${visibility}`).get(...params).count;
154
+ return listResult(getSqliteDatabase().prepare(`SELECT *
155
+ FROM activity_events
156
+ WHERE primary_object_kind = ? AND primary_object_id = ?
157
+ ${visibility}
158
+ ORDER BY created_at DESC, id DESC
159
+ LIMIT ? OFFSET ?`).all(...params, limit, offset).map((row) => row), total, limit, offset);
160
+ }
161
+ function listProjectActivityRecords(options) {
162
+ const limit = normalizeLimit(options.limit);
163
+ const offset = normalizeOffset(options.offset);
164
+ const params = ["project", options.projectId];
165
+ const relatedClause = options.includeRelated ? `OR EXISTS (
166
+ SELECT 1 FROM activity_related_projects ar
167
+ WHERE ar.activity_id = ae.id AND ar.project_id = ?
168
+ )` : "";
169
+ if (options.includeRelated) params.push(options.projectId);
170
+ const visibilityClauseSql = options.visibility ? "AND ae.visibility = ?" : "";
171
+ if (options.visibility) params.push(options.visibility);
172
+ const baseWhere = `EXISTS (
173
+ SELECT 1 FROM activity_scopes s
174
+ WHERE s.activity_id = ae.id AND s.scope_kind = ? AND s.scope_id = ?
175
+ ) ${relatedClause}`;
176
+ const total = getSqliteDatabase().prepare(`SELECT COUNT(*) AS count
177
+ FROM activity_events ae
178
+ WHERE (${baseWhere})
179
+ ${visibilityClauseSql}`).get(...params).count;
180
+ return listResult(getSqliteDatabase().prepare(`SELECT ae.*
181
+ FROM activity_events ae
182
+ WHERE (${baseWhere})
183
+ ${visibilityClauseSql}
184
+ ORDER BY ae.created_at DESC, ae.id DESC
185
+ LIMIT ? OFFSET ?`).all(...params, limit, offset).map((row) => row), total, limit, offset);
186
+ }
187
+ function createObjectLinkRecord(input) {
188
+ const id = input.id ?? randomUUID();
189
+ const now = input.nowMs ?? Date.now();
190
+ runSqliteWriteTransaction((db) => {
191
+ db.prepare(`INSERT INTO object_links (
192
+ id, from_kind, from_id, from_title, to_kind, to_id, to_title, relation, source, created_at
193
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`).run(id, input.from.kind, input.from.id, input.from.title ?? null, input.to.kind, input.to.id, input.to.title ?? null, input.relation, input.source, now);
194
+ });
195
+ const row = getSqliteDatabase().prepare(`SELECT * FROM object_links WHERE id = ?`).get(id);
196
+ if (!row) throw new Error(`Object link was not persisted: ${id}`);
197
+ return objectLinkFromRow(row);
198
+ }
199
+ function listObjectLinkRecords(object) {
200
+ return getSqliteDatabase().prepare(`SELECT *
201
+ FROM object_links
202
+ WHERE (from_kind = ? AND from_id = ?) OR (to_kind = ? AND to_id = ?)
203
+ ORDER BY created_at DESC, id DESC`).all(object.kind, object.id, object.kind, object.id).map((row) => objectLinkFromRow(row));
204
+ }
205
+ //#endregion
206
+ export { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent };
207
+
208
+ //# sourceMappingURL=activity-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-repository.js","names":[],"sources":["../../../../src/storage/sqlite/activity-repository.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto';\n\nimport type {\n ActivityEvent,\n ActivityEventWithRelations,\n ActivityListResult,\n ActivityObjectRef,\n ActivityRelatedProject,\n ActivityScope,\n ActivitySource,\n ActivityPrincipal,\n CreateObjectLinkInput,\n ListActivityOptions,\n ListObjectActivityOptions,\n ListProjectActivityOptions,\n ObjectLink,\n RecordActivityInput,\n} from '../../activity/types.js';\nimport { getSqliteDatabase, runSqliteWriteTransaction } from './transaction.js';\n\ntype ActivityEventRow = {\n id: string;\n type: string;\n primary_object_kind: string;\n primary_object_id: string;\n primary_object_title: string | null;\n actor_json: string;\n initiator_json: string | null;\n source_json: string;\n payload_json: string;\n visibility: string;\n importance: string;\n created_at: number;\n};\n\ntype ActivityScopeRow = {\n activity_id: string;\n scope_kind: string;\n scope_id: string;\n reason: string;\n};\n\ntype ActivityRelatedProjectRow = {\n activity_id: string;\n project_id: string;\n reason: string;\n confidence: number;\n computed_at: number;\n};\n\ntype ObjectLinkRow = {\n id: string;\n from_kind: string;\n from_id: string;\n from_title: string | null;\n to_kind: string;\n to_id: string;\n to_title: string | null;\n relation: string;\n source: string;\n created_at: number;\n};\n\ntype CountRow = { count: number };\ntype SqlParam = string | number | bigint | null;\n\nfunction parseJson<T>(json: string, fallback: T): T {\n try {\n return JSON.parse(json) as T;\n } catch {\n return fallback;\n }\n}\n\nfunction eventFromRow(row: ActivityEventRow): ActivityEvent {\n return {\n id: row.id,\n type: row.type,\n primaryObject: {\n kind: row.primary_object_kind as ActivityObjectRef['kind'],\n id: row.primary_object_id,\n title: row.primary_object_title ?? undefined,\n },\n actor: parseJson<ActivityPrincipal>(row.actor_json, { kind: 'system' }),\n initiator: row.initiator_json ? parseJson<ActivityPrincipal | undefined>(row.initiator_json, undefined) : undefined,\n source: parseJson<ActivitySource>(row.source_json, { kind: 'system' }),\n payload: parseJson<Record<string, unknown>>(row.payload_json, {}),\n visibility: row.visibility as ActivityEvent['visibility'],\n importance: row.importance as ActivityEvent['importance'],\n createdAt: row.created_at,\n };\n}\n\nfunction scopeFromRow(row: ActivityScopeRow): ActivityScope {\n return {\n activityId: row.activity_id,\n scopeKind: row.scope_kind as ActivityScope['scopeKind'],\n scopeId: row.scope_id,\n reason: row.reason as ActivityScope['reason'],\n };\n}\n\nfunction relatedProjectFromRow(row: ActivityRelatedProjectRow): ActivityRelatedProject {\n return {\n activityId: row.activity_id,\n projectId: row.project_id,\n reason: row.reason as ActivityRelatedProject['reason'],\n confidence: row.confidence,\n computedAt: row.computed_at,\n };\n}\n\nfunction objectLinkFromRow(row: ObjectLinkRow): ObjectLink {\n return {\n id: row.id,\n from: {\n kind: row.from_kind as ActivityObjectRef['kind'],\n id: row.from_id,\n title: row.from_title ?? undefined,\n },\n to: {\n kind: row.to_kind as ActivityObjectRef['kind'],\n id: row.to_id,\n title: row.to_title ?? undefined,\n },\n relation: row.relation as ObjectLink['relation'],\n source: row.source as ObjectLink['source'],\n createdAt: row.created_at,\n };\n}\n\nfunction listScopesForActivity(activityId: string): ActivityScope[] {\n return getSqliteDatabase()\n .prepare(\n `SELECT activity_id, scope_kind, scope_id, reason\n FROM activity_scopes\n WHERE activity_id = ?\n ORDER BY scope_kind ASC, scope_id ASC, reason ASC`,\n )\n .all(activityId)\n .map((row) => scopeFromRow(row as ActivityScopeRow));\n}\n\nfunction listRelatedProjectsForActivity(activityId: string): ActivityRelatedProject[] {\n return getSqliteDatabase()\n .prepare(\n `SELECT activity_id, project_id, reason, confidence, computed_at\n FROM activity_related_projects\n WHERE activity_id = ?\n ORDER BY project_id ASC, reason ASC`,\n )\n .all(activityId)\n .map((row) => relatedProjectFromRow(row as ActivityRelatedProjectRow));\n}\n\nfunction eventWithRelations(row: ActivityEventRow): ActivityEventWithRelations {\n const event = eventFromRow(row);\n return {\n ...event,\n scopes: listScopesForActivity(event.id),\n relatedProjects: listRelatedProjectsForActivity(event.id),\n };\n}\n\nfunction normalizeLimit(limit: number | undefined): number {\n return Math.max(1, Math.min(100, Math.floor(limit ?? 50)));\n}\n\nfunction normalizeOffset(offset: number | undefined): number {\n return Math.max(0, Math.floor(offset ?? 0));\n}\n\nfunction visibilityClause(visibility: string | undefined, params: SqlParam[]): string {\n if (!visibility) return '';\n params.push(visibility);\n return 'WHERE visibility = ?';\n}\n\nfunction listResult(rows: ActivityEventRow[], total: number, limit: number, offset: number): ActivityListResult {\n return {\n items: rows.map(eventWithRelations),\n total,\n limit,\n offset,\n hasMore: offset + rows.length < total,\n };\n}\n\nexport function recordActivityEvent(input: RecordActivityInput): ActivityEventWithRelations {\n const id = input.id ?? randomUUID();\n const now = input.nowMs ?? Date.now();\n const visibility = input.visibility ?? 'timeline';\n const importance = input.importance ?? 'normal';\n const payload = input.payload ?? {};\n\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO activity_events (\n id, type, primary_object_kind, primary_object_id, primary_object_title,\n actor_json, initiator_json, source_json, payload_json,\n visibility, importance, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id,\n input.type,\n input.primaryObject.kind,\n input.primaryObject.id,\n input.primaryObject.title ?? null,\n JSON.stringify(input.actor),\n input.initiator ? JSON.stringify(input.initiator) : null,\n JSON.stringify(input.source),\n JSON.stringify(payload),\n visibility,\n importance,\n now,\n );\n\n for (const scope of input.scopes ?? []) {\n db.prepare(\n `INSERT OR IGNORE INTO activity_scopes (activity_id, scope_kind, scope_id, reason)\n VALUES (?, ?, ?, ?)`,\n ).run(id, scope.scopeKind, scope.scopeId, scope.reason);\n }\n\n for (const related of input.relatedProjects ?? []) {\n db.prepare(\n `INSERT OR REPLACE INTO activity_related_projects (\n activity_id, project_id, reason, confidence, computed_at\n ) VALUES (?, ?, ?, ?, ?)`,\n ).run(id, related.projectId, related.reason, related.confidence, related.computedAt ?? now);\n }\n });\n\n const event = getActivityEventRecord(id);\n if (!event) {\n throw new Error(`Activity event was not persisted: ${id}`);\n }\n return event;\n}\n\nexport function getActivityEventRecord(id: string): ActivityEventWithRelations | null {\n const row = getSqliteDatabase()\n .prepare(\n `SELECT *\n FROM activity_events\n WHERE id = ?`,\n )\n .get(id) as ActivityEventRow | undefined;\n return row ? eventWithRelations(row) : null;\n}\n\nexport function listActivityRecords(options: ListActivityOptions = {}): ActivityListResult {\n const limit = normalizeLimit(options.limit);\n const offset = normalizeOffset(options.offset);\n const params: SqlParam[] = [];\n const where = visibilityClause(options.visibility, params);\n const total = (getSqliteDatabase()\n .prepare(`SELECT COUNT(*) AS count FROM activity_events ${where}`)\n .get(...params) as CountRow).count;\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT *\n FROM activity_events\n ${where}\n ORDER BY created_at DESC, id DESC\n LIMIT ? OFFSET ?`,\n )\n .all(...params, limit, offset)\n .map((row) => row as ActivityEventRow);\n return listResult(rows, total, limit, offset);\n}\n\nexport function listObjectActivityRecords(options: ListObjectActivityOptions): ActivityListResult {\n const limit = normalizeLimit(options.limit);\n const offset = normalizeOffset(options.offset);\n const params: SqlParam[] = [options.object.kind, options.object.id];\n const visibility = options.visibility ? 'AND visibility = ?' : '';\n if (options.visibility) params.push(options.visibility);\n const total = (getSqliteDatabase()\n .prepare(\n `SELECT COUNT(*) AS count\n FROM activity_events\n WHERE primary_object_kind = ? AND primary_object_id = ?\n ${visibility}`,\n )\n .get(...params) as CountRow).count;\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT *\n FROM activity_events\n WHERE primary_object_kind = ? AND primary_object_id = ?\n ${visibility}\n ORDER BY created_at DESC, id DESC\n LIMIT ? OFFSET ?`,\n )\n .all(...params, limit, offset)\n .map((row) => row as ActivityEventRow);\n return listResult(rows, total, limit, offset);\n}\n\nexport function listProjectActivityRecords(options: ListProjectActivityOptions): ActivityListResult {\n const limit = normalizeLimit(options.limit);\n const offset = normalizeOffset(options.offset);\n const params: SqlParam[] = ['project', options.projectId];\n const relatedClause = options.includeRelated\n ? `OR EXISTS (\n SELECT 1 FROM activity_related_projects ar\n WHERE ar.activity_id = ae.id AND ar.project_id = ?\n )`\n : '';\n if (options.includeRelated) params.push(options.projectId);\n const visibilityClauseSql = options.visibility ? 'AND ae.visibility = ?' : '';\n if (options.visibility) params.push(options.visibility);\n\n const baseWhere = `EXISTS (\n SELECT 1 FROM activity_scopes s\n WHERE s.activity_id = ae.id AND s.scope_kind = ? AND s.scope_id = ?\n ) ${relatedClause}`;\n\n const total = (getSqliteDatabase()\n .prepare(\n `SELECT COUNT(*) AS count\n FROM activity_events ae\n WHERE (${baseWhere})\n ${visibilityClauseSql}`,\n )\n .get(...params) as CountRow).count;\n const rows = getSqliteDatabase()\n .prepare(\n `SELECT ae.*\n FROM activity_events ae\n WHERE (${baseWhere})\n ${visibilityClauseSql}\n ORDER BY ae.created_at DESC, ae.id DESC\n LIMIT ? OFFSET ?`,\n )\n .all(...params, limit, offset)\n .map((row) => row as ActivityEventRow);\n return listResult(rows, total, limit, offset);\n}\n\nexport function createObjectLinkRecord(input: CreateObjectLinkInput): ObjectLink {\n const id = input.id ?? randomUUID();\n const now = input.nowMs ?? Date.now();\n runSqliteWriteTransaction((db) => {\n db.prepare(\n `INSERT INTO object_links (\n id, from_kind, from_id, from_title, to_kind, to_id, to_title, relation, source, created_at\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`,\n ).run(\n id,\n input.from.kind,\n input.from.id,\n input.from.title ?? null,\n input.to.kind,\n input.to.id,\n input.to.title ?? null,\n input.relation,\n input.source,\n now,\n );\n });\n const row = getSqliteDatabase()\n .prepare(`SELECT * FROM object_links WHERE id = ?`)\n .get(id) as ObjectLinkRow | undefined;\n if (!row) {\n throw new Error(`Object link was not persisted: ${id}`);\n }\n return objectLinkFromRow(row);\n}\n\nexport function listObjectLinkRecords(object: ActivityObjectRef): ObjectLink[] {\n return getSqliteDatabase()\n .prepare(\n `SELECT *\n FROM object_links\n WHERE (from_kind = ? AND from_id = ?) OR (to_kind = ? AND to_id = ?)\n ORDER BY created_at DESC, id DESC`,\n )\n .all(object.kind, object.id, object.kind, object.id)\n .map((row) => objectLinkFromRow(row as ObjectLinkRow));\n}\n"],"mappings":"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"}
@@ -1,9 +1,9 @@
1
1
  import { resolveXopcDatabasePath } from "../../config/paths-state.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
+ import { ensureXopcDatabaseSchema } from "./schema.js";
4
5
  import { requireNodeSqlite } from "../../infra/node-sqlite.js";
5
6
  import { installSqliteTransientRejectionHandler } from "../../infra/unhandled-rejections.js";
6
- import { ensureXopcDatabaseSchema } from "./schema.js";
7
7
  import path from "node:path";
8
8
  import fs from "node:fs";
9
9
  import childProcess from "node:child_process";
@@ -14,3 +14,4 @@ export { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgen
14
14
  export { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex, type MemorySearchHit, } from './memory-index-repository.js';
15
15
  export { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, listMemorySignals, listMemoryTraceEvents, listMemoryRecords, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord, type AppendMemorySignalInput, type AppendMemoryTraceEventInput, type ListMemoryRecordsOptions, type MemoryRecallFeedbackSummary, type MemorySignalRowPayload, type MemoryTraceFeedback, type MemoryTraceEventPayload, type SearchMemoryRecordsOptions, type SetMemoryTraceFeedbackInput, type UpsertMemoryRecordInput, } from './memory-records-repository.js';
16
16
  export { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig, } from './config-repository.js';
17
+ export { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent, } from './activity-repository.js';
@@ -15,4 +15,5 @@ import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgen
15
15
  import { resolveAgentIdFromMemoriesDir, searchMemoryIndex, syncMemoryIndex } from "./memory-index-repository.js";
16
16
  import { appendMemorySignal, appendMemoryTraceEvent, deleteMemoryRecord, getMemoryProviderState, getMemoryRecord, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, searchMemoryRecords, setMemoryProviderState, setMemoryTraceFeedback, summarizeMemoryRecallFeedback, upsertMemoryRecord } from "./memory-records-repository.js";
17
17
  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, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findSessionKeyBySessionId, getCompactionCheckpointDetail, getCurrentSessionId, getGlobalSessionStats, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listCompactionCheckpoints, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, summarizeMemoryRecallFeedback, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
18
+ import { createObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
19
+ export { DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, appendMemorySignal, appendMemoryTraceEvent, appendTranscriptEntry, applyPendingMigrations, buildDefaultSessionMetadata, buildGlobalSessionStats, captureCompactionCheckpoint, classifyStoredRow, closeXopcDatabase, createObjectLinkRecord, deleteMemoryRecord, deleteNoteAgentContextRecord, deleteNoteRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findSessionKeyBySessionId, getActivityEventRecord, getCompactionCheckpointDetail, getCurrentSessionId, getGlobalSessionStats, getMemoryProviderState, getMemoryRecord, getNoteAgentContextRecord, getNoteRecord, getSessionConfig, getSessionMetadata, getSessionPersistedLevels, getSqliteDatabase, getXopcDatabase, hasSessionConfig, incrementSessionStatsOnAppend, inspectSchemaMigrationStatus, isXopcDatabaseOpen, listActivityRecords, listCompactionCheckpoints, listMemoryRecords, listMemorySignals, listMemoryTraceEvents, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, loadCheckpointRows, loadLlmMessagesForSession, loadTranscriptRows, loadTranscriptRowsForSession, metadataToSessionInsert, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, readSchemaVersion, readSchemaVersionForTest, recordActivityEvent, replaceTranscriptRows, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveAgentIdFromMemoriesDir, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreCompactionCheckpoint, runSqliteWriteTransaction, searchMemoryIndex, searchMemoryRecords, sessionConfigRowToConfig, sessionRowToMetadata, setMemoryProviderState, setMemoryTraceFeedback, setSessionConfig, summarizeMemoryRecallFeedback, syncMemoryIndex, transcriptEntryRowToStoredRow, updateSessionConfig, updateSessionStats, upsertMemoryRecord, upsertNoteAgentContextRecord, upsertNoteRecord };
@@ -0,0 +1,61 @@
1
+ CREATE TABLE IF NOT EXISTS work_items (
2
+ id TEXT PRIMARY KEY,
3
+ project_id TEXT NOT NULL,
4
+ title TEXT NOT NULL,
5
+ description TEXT,
6
+ status TEXT NOT NULL,
7
+ priority TEXT NOT NULL DEFAULT 'normal',
8
+ owner_agent_id TEXT,
9
+ next_action TEXT,
10
+ blocked_reason TEXT,
11
+ due_at INTEGER,
12
+ completed_at INTEGER,
13
+ archived_at INTEGER,
14
+ created_at INTEGER NOT NULL,
15
+ updated_at INTEGER NOT NULL
16
+ );
17
+
18
+ CREATE INDEX IF NOT EXISTS idx_work_items_project_status
19
+ ON work_items(project_id, status, archived_at, updated_at DESC);
20
+
21
+ CREATE TABLE IF NOT EXISTS work_item_links (
22
+ id TEXT PRIMARY KEY,
23
+ work_item_id TEXT NOT NULL,
24
+ kind TEXT NOT NULL,
25
+ target_id TEXT NOT NULL,
26
+ title TEXT,
27
+ status_snapshot TEXT,
28
+ created_at INTEGER NOT NULL
29
+ );
30
+
31
+ CREATE INDEX IF NOT EXISTS idx_work_item_links_item
32
+ ON work_item_links(work_item_id, created_at DESC);
33
+
34
+ CREATE TABLE IF NOT EXISTS work_item_events (
35
+ id TEXT PRIMARY KEY,
36
+ work_item_id TEXT NOT NULL,
37
+ type TEXT NOT NULL,
38
+ payload_json TEXT,
39
+ created_at INTEGER NOT NULL
40
+ );
41
+
42
+ CREATE INDEX IF NOT EXISTS idx_work_item_events_item
43
+ ON work_item_events(work_item_id, created_at DESC);
44
+
45
+ CREATE TABLE IF NOT EXISTS work_item_update_suggestions (
46
+ id TEXT PRIMARY KEY,
47
+ work_item_id TEXT NOT NULL,
48
+ source_kind TEXT NOT NULL,
49
+ source_id TEXT NOT NULL,
50
+ status TEXT NOT NULL,
51
+ patch_json TEXT NOT NULL DEFAULT '{}',
52
+ progress_note TEXT,
53
+ rationale TEXT,
54
+ confidence REAL,
55
+ created_at INTEGER NOT NULL,
56
+ applied_at INTEGER,
57
+ dismissed_at INTEGER
58
+ );
59
+
60
+ CREATE INDEX IF NOT EXISTS idx_work_item_update_suggestions_item
61
+ ON work_item_update_suggestions(work_item_id, status, created_at DESC);
@@ -0,0 +1,15 @@
1
+ CREATE TABLE IF NOT EXISTS work_item_attachments (
2
+ id TEXT PRIMARY KEY,
3
+ work_item_id TEXT NOT NULL,
4
+ media_uri TEXT NOT NULL,
5
+ media_id TEXT NOT NULL,
6
+ bucket TEXT NOT NULL,
7
+ type TEXT NOT NULL,
8
+ mime_type TEXT NOT NULL,
9
+ file_name TEXT NOT NULL,
10
+ size INTEGER NOT NULL,
11
+ created_at INTEGER NOT NULL
12
+ );
13
+
14
+ CREATE INDEX IF NOT EXISTS idx_work_item_attachments_item
15
+ ON work_item_attachments(work_item_id, created_at DESC);
@@ -0,0 +1,62 @@
1
+ CREATE TABLE IF NOT EXISTS activity_events (
2
+ id TEXT PRIMARY KEY,
3
+ type TEXT NOT NULL,
4
+ primary_object_kind TEXT NOT NULL,
5
+ primary_object_id TEXT NOT NULL,
6
+ primary_object_title TEXT,
7
+ actor_json TEXT NOT NULL,
8
+ initiator_json TEXT,
9
+ source_json TEXT NOT NULL,
10
+ payload_json TEXT NOT NULL DEFAULT '{}',
11
+ visibility TEXT NOT NULL,
12
+ importance TEXT NOT NULL,
13
+ created_at INTEGER NOT NULL
14
+ );
15
+
16
+ CREATE INDEX IF NOT EXISTS idx_activity_events_created
17
+ ON activity_events(created_at DESC);
18
+
19
+ CREATE INDEX IF NOT EXISTS idx_activity_events_object_created
20
+ ON activity_events(primary_object_kind, primary_object_id, created_at DESC);
21
+
22
+ CREATE TABLE IF NOT EXISTS activity_scopes (
23
+ activity_id TEXT NOT NULL,
24
+ scope_kind TEXT NOT NULL,
25
+ scope_id TEXT NOT NULL,
26
+ reason TEXT NOT NULL,
27
+ PRIMARY KEY (activity_id, scope_kind, scope_id, reason)
28
+ );
29
+
30
+ CREATE INDEX IF NOT EXISTS idx_activity_scopes_scope
31
+ ON activity_scopes(scope_kind, scope_id, activity_id);
32
+
33
+ CREATE TABLE IF NOT EXISTS object_links (
34
+ id TEXT PRIMARY KEY,
35
+ from_kind TEXT NOT NULL,
36
+ from_id TEXT NOT NULL,
37
+ from_title TEXT,
38
+ to_kind TEXT NOT NULL,
39
+ to_id TEXT NOT NULL,
40
+ to_title TEXT,
41
+ relation TEXT NOT NULL,
42
+ source TEXT NOT NULL,
43
+ created_at INTEGER NOT NULL
44
+ );
45
+
46
+ CREATE INDEX IF NOT EXISTS idx_object_links_from
47
+ ON object_links(from_kind, from_id);
48
+
49
+ CREATE INDEX IF NOT EXISTS idx_object_links_to
50
+ ON object_links(to_kind, to_id);
51
+
52
+ CREATE TABLE IF NOT EXISTS activity_related_projects (
53
+ activity_id TEXT NOT NULL,
54
+ project_id TEXT NOT NULL,
55
+ reason TEXT NOT NULL,
56
+ confidence REAL NOT NULL,
57
+ computed_at INTEGER NOT NULL,
58
+ PRIMARY KEY (activity_id, project_id, reason)
59
+ );
60
+
61
+ CREATE INDEX IF NOT EXISTS idx_activity_related_projects_project
62
+ ON activity_related_projects(project_id, activity_id);
@@ -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 = 11;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 21;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 24;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -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 = 11;
14
14
  /** Latest schema version this release supports (increment when adding migrations). */
15
- const XOPC_DB_SCHEMA_VERSION = 21;
15
+ const XOPC_DB_SCHEMA_VERSION = 24;
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 ?? 21;
49
+ const targetVersion = options.targetVersion ?? 24;
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 ?? 21;
65
+ const appVersion = options.targetVersion ?? 24;
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 = 11;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION = 21;\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 = 11;\n\n/** Latest schema version this release supports (increment when adding migrations). */\nexport const XOPC_DB_SCHEMA_VERSION = 24;\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 = 11;
20
20
 
21
21
  /** Latest schema version this release supports (increment when adding migrations). */
22
- export const XOPC_DB_SCHEMA_VERSION = 21;
22
+ export const XOPC_DB_SCHEMA_VERSION = 24;
23
23
 
24
24
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
25
 
@@ -1,7 +1,7 @@
1
- import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../../routing/agent-session-key.js";
2
1
  import "../../session/types.js";
3
2
  import { buildDefaultSessionMetadata } from "./session-metadata.js";
4
3
  import { isTranscriptContextEntry } from "../../session/session-context-for-llm.js";
4
+ import { init_agent_session_key, resolveAgentIdFromSessionKey } from "../../routing/agent-session-key.js";
5
5
  //#region src/storage/sqlite/row-mappers.ts
6
6
  init_agent_session_key();
7
7
  function parseJson(raw) {
@@ -31,7 +31,7 @@ function ensureXopcDatabaseSchema(db) {
31
31
  bootstrapFreshDatabase(db);
32
32
  currentVersion = 11;
33
33
  }
34
- applyPendingMigrations(db, { targetVersion: 21 });
34
+ applyPendingMigrations(db, { targetVersion: 24 });
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 };