@xopcai/xopc 0.0.312 → 0.0.314

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 (497) hide show
  1. package/dist/browser-ext/dist/assets/{auth-C3yV1y_l.js → auth-DKo-NMUY.js} +18 -1
  2. package/dist/browser-ext/dist/background.js +68 -2
  3. package/dist/browser-ext/dist/sidepanel.html +1 -1
  4. package/dist/browser-ext/dist/sidepanel.js +1 -1
  5. package/dist/browser-ext/manifest.json +1 -1
  6. package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
  7. package/dist/extensions/telegram/src/inbound-processor.js +1 -1
  8. package/dist/extensions/telegram/src/plugin.js +2 -2
  9. package/dist/extensions/telegram/xopc.extension.json +1 -1
  10. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BVIJMP8w.js → agent-avatar-dicebear-BFkjfurL.js} +1 -1
  11. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BdOZ6q8Z.js +1 -0
  12. package/dist/gateway/static/root/assets/{agents-D6g_SeWI.js → agents-CCcavsHq.js} +1 -1
  13. package/dist/gateway/static/root/assets/{api-_aHQA8bd.js → api-BYhRsTAc.js} +1 -1
  14. package/dist/gateway/static/root/assets/{app-link-CKueEVbT.js → app-link-nL8iPwEr.js} +1 -1
  15. package/dist/gateway/static/root/assets/{app-management-settings-panel-CLg_aXYG.js → app-management-settings-panel-B4kihr-A.js} +1 -1
  16. package/dist/gateway/static/root/assets/appearance-settings-N9sYmNOx.js +1 -0
  17. package/dist/gateway/static/root/assets/apps-page-BMcy10_s.js +1 -0
  18. package/dist/gateway/static/root/assets/{archive-plugin-CHO3heHX.js → archive-plugin-k_SuYWyV.js} +1 -1
  19. package/dist/gateway/static/root/assets/{attachment-load-BsmsBCI2.js → attachment-load-DRv5QWUK.js} +1 -1
  20. package/dist/gateway/static/root/assets/{automations-page-CftigJlf.js → automations-page-CkJV3DN0.js} +1 -1
  21. package/dist/gateway/static/root/assets/automations-workspace-BEa2doeR.js +7 -0
  22. package/dist/gateway/static/root/assets/{binary-plugins-CRCLWBo2.js → binary-plugins-Dg3h3TA7.js} +1 -1
  23. package/dist/gateway/static/root/assets/{block-editor-D0LDiOTT.js → block-editor-DVhdHntT.js} +29 -29
  24. package/dist/gateway/static/root/assets/{browser-automation-inputs-C611KRBx.js → browser-automation-inputs-BMRYUW8_.js} +1 -1
  25. package/dist/gateway/static/root/assets/{browser-automations-page-Djyv3vy-.js → browser-automations-page-Byv6-FY2.js} +2 -2
  26. package/dist/gateway/static/root/assets/browser-settings-page-DRCHGFpO.js +3 -0
  27. package/dist/gateway/static/root/assets/capabilities-D0S3DuAD.js +1 -0
  28. package/dist/gateway/static/root/assets/capabilities-settings-panel-mxRP0gl0.js +8 -0
  29. package/dist/gateway/static/root/assets/channels-settings-DBt_6GsB.js +1 -0
  30. package/dist/gateway/static/root/assets/{chat-terminal-dock-CIsKqdET.js → chat-terminal-dock-D4AHa51o.js} +2 -2
  31. package/dist/gateway/static/root/assets/{computer-settings-page-C0YL9J7m.js → computer-settings-page-eXPe500D.js} +1 -1
  32. package/dist/gateway/static/root/assets/connector-service-page-BQTFlq_k.js +1 -0
  33. package/dist/gateway/static/root/assets/connectors-page-BKeBWwcI.js +2 -0
  34. package/dist/gateway/static/root/assets/conversation-identity-Cw0n9uzK.js +1 -0
  35. package/dist/gateway/static/root/assets/{date-picker-CDsfv8R0.js → date-picker-7MtovynY.js} +1 -1
  36. package/dist/gateway/static/root/assets/{dependency-picker-DvhPj3CZ.js → dependency-picker-Bj_xkXID.js} +1 -1
  37. package/dist/gateway/static/root/assets/{desktop-pet-Cyg8XMpL.js → desktop-pet-CTmba9zH.js} +1 -1
  38. package/dist/gateway/static/root/assets/desktop-pet-settings-DNM_BlWN.js +1 -0
  39. package/dist/gateway/static/root/assets/device-pairing-wizard-C2XE0QhT.js +1 -0
  40. package/dist/gateway/static/root/assets/{extension-debug-page-D-AVJU3q.js → extension-debug-page-J_olaL7e.js} +1 -1
  41. package/dist/gateway/static/root/assets/{extension-page-DrFoQ9xt.js → extension-page-pK5RvqN8.js} +1 -1
  42. package/dist/gateway/static/root/assets/{extension-settings-page-DxWjESC1.js → extension-settings-page-BwroEN08.js} +1 -1
  43. package/dist/gateway/static/root/assets/files-BK6enEvD.js +1 -0
  44. package/dist/gateway/static/root/assets/{gateway-config-swr-DUDX42qY.js → gateway-config-swr-FuJTIg_a.js} +1 -1
  45. package/dist/gateway/static/root/assets/gateway-settings-CLLDp23J.js +1 -0
  46. package/dist/gateway/static/root/assets/{gateway-startup-retry-Cf8OxlvY.js → gateway-startup-retry-CKg_gu8_.js} +1 -1
  47. package/dist/gateway/static/root/assets/home-page-B5Epb1PH.js +1 -0
  48. package/dist/gateway/static/root/assets/{image-generation-api-D2YorS--.js → image-generation-api-Bo6NZ7zb.js} +1 -1
  49. package/dist/gateway/static/root/assets/{imports-page-BKucJlXI.js → imports-page-C8-hX8gS.js} +1 -1
  50. package/dist/gateway/static/root/assets/index-14F1yGJI.js +89 -0
  51. package/dist/gateway/static/root/assets/index-cB7rWIDY.css +1 -0
  52. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BxLXD-yU.js → keyboard-shortcuts-settings-BkBEjUZD.js} +1 -1
  53. package/dist/gateway/static/root/assets/local-app-workbench-page-6jC3vQpY.js +2 -0
  54. package/dist/gateway/static/root/assets/{local-apps-page-BAsQJQKJ.js → local-apps-page-CrbKIixo.js} +1 -1
  55. package/dist/gateway/static/root/assets/{locale-store-DA0Z5jM_.js → locale-store-CvGwNbml.js} +1 -1
  56. package/dist/gateway/static/root/assets/logs-page-DBHlZts9.js +2 -0
  57. package/dist/gateway/static/root/assets/management-settings-DsUWLu5m.js +1 -0
  58. package/dist/gateway/static/root/assets/{markdown-view-DYGPxPee.js → markdown-view-nXo5nrsv.js} +1 -1
  59. package/dist/gateway/static/root/assets/{media-plugins-CQtQzLyg.js → media-plugins-upxXJ-4l.js} +1 -1
  60. package/dist/gateway/static/root/assets/messages-B_AwRroN.js +3 -0
  61. package/dist/gateway/static/root/assets/note-detail-panel-0Q9TOtJG.js +5 -0
  62. package/dist/gateway/static/root/assets/notes-page-D0NmcwNw.js +8 -0
  63. package/dist/gateway/static/root/assets/page-context-capture-button-DUyA-K4L.js +1 -0
  64. package/dist/gateway/static/root/assets/{page-tabs-B6DjkyMM.js → page-tabs-Cl-NFPNr.js} +1 -1
  65. package/dist/gateway/static/root/assets/{preview-open-alternatives-Dn57uLhr.js → preview-open-alternatives-DX81PwJ3.js} +1 -1
  66. package/dist/gateway/static/root/assets/product-delivery-chCjIpvu.js +1 -0
  67. package/dist/gateway/static/root/assets/{product-open-page-H2YMk8TY.js → product-open-page-CrfIGwm8.js} +1 -1
  68. package/dist/gateway/static/root/assets/project-detail-page-BVfVrYmn.js +1 -0
  69. package/dist/gateway/static/root/assets/projects-page-nM9a9XNS.js +1 -0
  70. package/dist/gateway/static/root/assets/{registry-api-C0DCx3wv.js → registry-api-CHxgohY0.js} +1 -1
  71. package/dist/gateway/static/root/assets/remote-access-hub-C8b_k88G.js +1 -0
  72. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-D3dLOW04.js +5 -0
  73. package/dist/gateway/static/root/assets/scenes-page-DEowreZV.js +2 -0
  74. package/dist/gateway/static/root/assets/{schema-form-CblI9WUA.js → schema-form-ZxuIvD2_.js} +1 -1
  75. package/dist/gateway/static/root/assets/schemas-88fK3zzl.js +64 -0
  76. package/dist/gateway/static/root/assets/sessions-page-B_nPhera.js +1 -0
  77. package/dist/gateway/static/root/assets/settings-advanced-gate-BqhIOuus.js +1 -0
  78. package/dist/gateway/static/root/assets/{settings-form-section-BAaVyxJH.js → settings-form-section-TZRfg4yo.js} +1 -1
  79. package/dist/gateway/static/root/assets/{settings-page-CKNPbm5q.js → settings-page-a8qcJpdZ.js} +1 -1
  80. package/dist/gateway/static/root/assets/{settings-page-layout-DqNCGKxQ.js → settings-page-layout-BfvlRT9q.js} +1 -1
  81. package/dist/gateway/static/root/assets/setup-status-panel-CRj5Ruqn.js +1 -0
  82. package/dist/gateway/static/root/assets/{share-preview-page-BzMfp_HM.js → share-preview-page-DCt1pTWB.js} +1 -1
  83. package/dist/gateway/static/root/assets/shares-settings-BNbXPk--.js +1 -0
  84. package/dist/gateway/static/root/assets/skill-reload-api-CNMCLbav.js +1 -0
  85. package/dist/gateway/static/root/assets/{skills-page-DIht92q6.js → skills-page-BIOcg44X.js} +1 -1
  86. package/dist/gateway/static/root/assets/{skills-page.utils-DLYRiEn3.js → skills-page.utils-CgZdzT4I.js} +1 -1
  87. package/dist/gateway/static/root/assets/{system-settings-panel-yYs4YgYk.js → system-settings-panel-_YaRncA6.js} +1 -1
  88. package/dist/gateway/static/root/assets/task-detail-page-CAcfAG-c.js +1 -0
  89. package/dist/gateway/static/root/assets/tasks-CDR_RVbQ.js +1 -0
  90. package/dist/gateway/static/root/assets/{tunnel-api-BasDYxvx.js → tunnel-api-uOupJOoS.js} +1 -1
  91. package/dist/gateway/static/root/assets/turn-outcome-D0SnyZ3Z.js +1 -0
  92. package/dist/gateway/static/root/assets/{use-autosave-CWAUHhcb.js → use-autosave-BezzHBLE.js} +1 -1
  93. package/dist/gateway/static/root/assets/user-model-page-BFFeneDq.js +2 -0
  94. package/dist/gateway/static/root/assets/{voice-api-key-field-Kc4UlxZs.js → voice-api-key-field-BmYifdwL.js} +1 -1
  95. package/dist/gateway/static/root/assets/{voice-config-api-DTyMdGOR.js → voice-config-api-D_5Q2_A3.js} +1 -1
  96. package/dist/gateway/static/root/assets/{work-discovery-overlay-BPC_c9dO.js → work-discovery-overlay-4DmyEckJ.js} +1 -1
  97. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-DBTciOrq.js → workflow-run-setup-panel-DeZe8bTZ.js} +2 -2
  98. package/dist/gateway/static/root/assets/workflows-page-Sv4hEc6W.js +6 -0
  99. package/dist/gateway/static/root/index.html +16 -16
  100. package/dist/package.js +1 -1
  101. package/dist/packages/computer-control-contract/src/index.js +10 -1
  102. package/dist/packages/gateway-contract/src/app-context.js +55 -0
  103. package/dist/packages/gateway-contract/src/automations.js +16 -17
  104. package/dist/packages/gateway-contract/src/capabilities.js +1078 -0
  105. package/dist/packages/gateway-contract/src/extension-capabilities.js +26 -0
  106. package/dist/packages/gateway-contract/src/home.js +3 -3
  107. package/dist/packages/gateway-contract/src/index.js +8 -0
  108. package/dist/packages/gateway-contract/src/product-delivery.js +19 -4
  109. package/dist/packages/gateway-contract/src/scenes.js +199 -0
  110. package/dist/packages/gateway-contract/src/task-runs.js +8 -4
  111. package/dist/packages/gateway-contract/src/tasks.js +5 -4
  112. package/dist/packages/realtime-client/src/index.js +17 -4
  113. package/dist/src/agent/agent-manager.d.ts +1 -0
  114. package/dist/src/agent/agent-manager.js +1 -0
  115. package/dist/src/agent/child-agent-factory.d.ts +2 -0
  116. package/dist/src/agent/child-agent-factory.js +5 -0
  117. package/dist/src/agent/commands/approved-verification.d.ts +14 -0
  118. package/dist/src/agent/commands/approved-verification.js +48 -0
  119. package/dist/src/agent/context/execution-scope.js +2 -1
  120. package/dist/src/agent/context/project-context.js +2 -1
  121. package/dist/src/agent/external-tools/cliProvider.js +123 -75
  122. package/dist/src/agent/external-tools/composio-provider.d.ts +1 -1
  123. package/dist/src/agent/external-tools/composio-provider.js +70 -12
  124. package/dist/src/agent/external-tools/endpoint-provider.js +14 -1
  125. package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -0
  126. package/dist/src/agent/inbound/turn-dispatcher.js +2 -1
  127. package/dist/src/agent/memory/compaction-chunks.d.ts +6 -1
  128. package/dist/src/agent/memory/compaction-chunks.js +16 -3
  129. package/dist/src/agent/memory/compaction-ledger.d.ts +3 -1
  130. package/dist/src/agent/memory/compaction-ledger.js +31 -18
  131. package/dist/src/agent/memory/compaction-request.d.ts +2 -0
  132. package/dist/src/agent/memory/compaction-request.js +6 -1
  133. package/dist/src/agent/memory/compaction.d.ts +19 -1
  134. package/dist/src/agent/memory/compaction.js +112 -30
  135. package/dist/src/agent/service/process-direct-streaming.d.ts +3 -0
  136. package/dist/src/agent/service/process-direct-streaming.js +19 -10
  137. package/dist/src/agent/service.js +1 -0
  138. package/dist/src/agent/service.types.d.ts +1 -0
  139. package/dist/src/agent/skills/config.js +2 -0
  140. package/dist/src/agent/skills/format-skills-prompt.js +14 -1
  141. package/dist/src/agent/skills/index.js +16 -8
  142. package/dist/src/agent/skills/types.d.ts +1 -1
  143. package/dist/src/agent/source-context/app-context.d.ts +4 -0
  144. package/dist/src/agent/source-context/app-context.js +36 -0
  145. package/dist/src/agent/source-context/injector.js +1 -0
  146. package/dist/src/agent/source-context/types.d.ts +5 -1
  147. package/dist/src/agent/tasks/task-judge-service.js +2 -1
  148. package/dist/src/agent/tool-manuals/computer.d.ts +1 -1
  149. package/dist/src/agent/tool-manuals/computer.js +1 -1
  150. package/dist/src/agent/tools/automation-tool.d.ts +12 -1
  151. package/dist/src/agent/tools/automation-tool.js +106 -32
  152. package/dist/src/agent/tools/factory.d.ts +1 -0
  153. package/dist/src/agent/tools/factory.js +6 -1
  154. package/dist/src/agent/tools/scoped-workspace-tools.d.ts +8 -0
  155. package/dist/src/agent/tools/scoped-workspace-tools.js +81 -0
  156. package/dist/src/agent/tools/xopc-use-tool.d.ts +6 -3
  157. package/dist/src/agent/tools/xopc-use-tool.js +997 -908
  158. package/dist/src/agent/workflow/subagent-runner.js +1 -0
  159. package/dist/src/agent-config/index.js +2 -2
  160. package/dist/src/agent-config/schema.d.ts +5 -0
  161. package/dist/src/agent-config/schema.js +14 -10
  162. package/dist/src/automations/api/routes.js +244 -164
  163. package/dist/src/automations/capabilities/drafts.d.ts +4 -0
  164. package/dist/src/automations/capabilities/drafts.js +95 -0
  165. package/dist/src/automations/capabilities/read.d.ts +4 -0
  166. package/dist/src/automations/capabilities/read.js +119 -0
  167. package/dist/src/automations/capabilities/write.d.ts +349 -0
  168. package/dist/src/automations/capabilities/write.js +172 -0
  169. package/dist/src/automations/domain/index.js +2 -2
  170. package/dist/src/automations/domain/validation.d.ts +77 -77
  171. package/dist/src/automations/domain/validation.js +9 -6
  172. package/dist/src/automations/draft/automation-draft-validator.d.ts +2 -2
  173. package/dist/src/automations/index.js +6 -6
  174. package/dist/src/automations/service/automation-service.d.ts +31 -0
  175. package/dist/src/automations/service/automation-service.js +213 -75
  176. package/dist/src/automations/service/index.js +2 -2
  177. package/dist/src/automations/storage/automation-repository.d.ts +2 -0
  178. package/dist/src/automations/storage/automation-repository.js +9 -1
  179. package/dist/src/automations/storage/automation-run-repository.d.ts +4 -1
  180. package/dist/src/automations/storage/automation-run-repository.js +16 -3
  181. package/dist/src/automations/storage/index.js +3 -3
  182. package/dist/src/browser/automations/schema.d.ts +1 -1
  183. package/dist/src/browser/automations/service.d.ts +1 -1
  184. package/dist/src/browser/observation/format.js +4 -0
  185. package/dist/src/capabilities/adapters/http.d.ts +4 -0
  186. package/dist/src/capabilities/adapters/http.js +44 -0
  187. package/dist/src/capabilities/readiness/from-config.js +11 -7
  188. package/dist/src/capabilities/runtime/app-context.d.ts +3 -0
  189. package/dist/src/capabilities/runtime/app-context.js +72 -0
  190. package/dist/src/capabilities/runtime/atomic-operations.d.ts +11 -0
  191. package/dist/src/capabilities/runtime/atomic-operations.js +34 -0
  192. package/dist/src/capabilities/runtime/dispatcher.d.ts +67 -0
  193. package/dist/src/capabilities/runtime/dispatcher.js +170 -0
  194. package/dist/src/capabilities/runtime/errors.d.ts +6 -0
  195. package/dist/src/capabilities/runtime/errors.js +11 -0
  196. package/dist/src/capabilities/runtime/external-operations.d.ts +16 -0
  197. package/dist/src/capabilities/runtime/external-operations.js +92 -0
  198. package/dist/src/capabilities/runtime/product.d.ts +12 -0
  199. package/dist/src/capabilities/runtime/product.js +69 -0
  200. package/dist/src/capabilities/runtime/settings.d.ts +3 -0
  201. package/dist/src/capabilities/runtime/settings.js +27 -0
  202. package/dist/src/channels/index.js +2 -2
  203. package/dist/src/channels/manager.js +1 -1
  204. package/dist/src/cli/cli-log-level-preset.d.ts +2 -0
  205. package/dist/src/cli/cli-log-level-preset.js +4 -0
  206. package/dist/src/cli/command-catalog.js +4 -0
  207. package/dist/src/cli/command-loaders.js +1 -0
  208. package/dist/src/cli/command-manifest.js +4 -0
  209. package/dist/src/cli/commands/channels.js +1 -1
  210. package/dist/src/cli/commands/connectors.js +1 -1
  211. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  212. package/dist/src/cli/commands/extension-marketplace.js +1 -1
  213. package/dist/src/cli/commands/mcp.d.ts +1 -0
  214. package/dist/src/cli/commands/mcp.js +51 -0
  215. package/dist/src/cli/commands/models.js +1 -1
  216. package/dist/src/cli/commands/onboard.js +1 -1
  217. package/dist/src/cli/commands/project.js +1 -1
  218. package/dist/src/computer/broker.d.ts +0 -1
  219. package/dist/src/computer/broker.js +4 -6
  220. package/dist/src/computer/evaluation-harness.d.ts +45 -0
  221. package/dist/src/computer/evaluation-harness.js +108 -0
  222. package/dist/src/computer/model-adapter.d.ts +37 -2
  223. package/dist/src/computer/model-adapter.js +333 -42
  224. package/dist/src/computer/model-policy.d.ts +4 -1
  225. package/dist/src/computer/model-policy.js +11 -3
  226. package/dist/src/computer/release-gate.d.ts +22 -0
  227. package/dist/src/computer/release-gate.js +19 -0
  228. package/dist/src/computer/runtime.js +14 -10
  229. package/dist/src/computer/task-state.d.ts +1 -0
  230. package/dist/src/computer/task-state.js +1 -0
  231. package/dist/src/config/models-json.d.ts +14 -8
  232. package/dist/src/config/models-json.js +1 -1
  233. package/dist/src/config/schema.d.ts +4 -0
  234. package/dist/src/config/schema.js +3 -9
  235. package/dist/src/connectors/composio-sessions.d.ts +4 -2
  236. package/dist/src/connectors/composio-sessions.js +10 -9
  237. package/dist/src/connectors/composio.js +10 -8
  238. package/dist/src/discussions/action-tasks.js +2 -1
  239. package/dist/src/discussions/recording.js +1 -1
  240. package/dist/src/execution-environments/local-worktree-manager.d.ts +1 -0
  241. package/dist/src/execution-environments/local-worktree-manager.js +13 -2
  242. package/dist/src/extensions/activation-context.js +3 -3
  243. package/dist/src/extensions/api.js +1 -1
  244. package/dist/src/extensions/normalize-manifest.js +6 -1
  245. package/dist/src/extensions/sdk/index.js +1 -1
  246. package/dist/src/extensions/sdk/media.js +1 -1
  247. package/dist/src/extensions/types/manifest.d.ts +3 -0
  248. package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
  249. package/dist/src/gateway/hono/lib/config-payload.d.ts +1 -0
  250. package/dist/src/gateway/hono/middleware/scopes.js +1 -1
  251. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +5 -2
  252. package/dist/src/gateway/hono/routes/capability-operations.d.ts +3 -0
  253. package/dist/src/gateway/hono/routes/capability-operations.js +52 -0
  254. package/dist/src/gateway/hono/routes/lazy-bundles.js +16 -0
  255. package/dist/src/gateway/hono/routes/local-app-capabilities.d.ts +4 -0
  256. package/dist/src/gateway/hono/routes/local-app-capabilities.js +41 -0
  257. package/dist/src/gateway/hono/routes/local-apps.js +41 -9
  258. package/dist/src/gateway/hono/routes/models.js +2 -2
  259. package/dist/src/gateway/hono/routes/notes.js +215 -146
  260. package/dist/src/gateway/hono/routes/projects.js +217 -374
  261. package/dist/src/gateway/hono/routes/scenes.js +188 -75
  262. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +60 -16
  263. package/dist/src/gateway/hono/routes/session-input-handler.js +43 -1
  264. package/dist/src/gateway/hono/routes/sessions.js +17 -0
  265. package/dist/src/gateway/hono/routes/status.js +1 -1
  266. package/dist/src/gateway/hono/routes/tasks.js +182 -326
  267. package/dist/src/gateway/hono/routes/user-model-refresh.js +1 -1
  268. package/dist/src/gateway/hono/routes/voice.js +4 -4
  269. package/dist/src/gateway/hono/routes/workflows.js +1 -1
  270. package/dist/src/gateway/media-access.js +2 -1
  271. package/dist/src/gateway/mobile-privacy.js +2 -2
  272. package/dist/src/gateway/scenes/host.js +14 -3
  273. package/dist/src/gateway/scenes/mailContext.js +1 -1
  274. package/dist/src/gateway/scenes/slackThreadSource.d.ts +41 -0
  275. package/dist/src/gateway/scenes/slackThreadSource.js +168 -0
  276. package/dist/src/gateway/security/gateway-scopes.d.ts +1 -1
  277. package/dist/src/gateway/security/gateway-scopes.js +5 -0
  278. package/dist/src/gateway/service/app-context-access.d.ts +11 -0
  279. package/dist/src/gateway/service/app-context-access.js +70 -0
  280. package/dist/src/gateway/service/run-gateway-agent.js +11 -2
  281. package/dist/src/gateway/service/session-input-coordinator.js +54 -15
  282. package/dist/src/gateway/service/sessions-api.d.ts +1 -0
  283. package/dist/src/gateway/service/sessions-api.js +3 -0
  284. package/dist/src/gateway/service/task-conversation-query-service.d.ts +3 -1
  285. package/dist/src/gateway/service/task-conversation-query-service.js +32 -3
  286. package/dist/src/gateway/service.d.ts +3 -0
  287. package/dist/src/gateway/service.js +69 -15
  288. package/dist/src/gateway/session-context-summary.js +2 -1
  289. package/dist/src/{tasks/task-outbox-dispatcher.d.ts → infra/domain-outbox-dispatcher.d.ts} +2 -2
  290. package/dist/src/{tasks/task-outbox-dispatcher.js → infra/domain-outbox-dispatcher.js} +10 -9
  291. package/dist/src/infra/operation-context.d.ts +2 -0
  292. package/dist/src/infra/operation-context.js +16 -0
  293. package/dist/src/local-apps/capabilities/contracts.d.ts +2 -0
  294. package/dist/src/local-apps/capabilities/contracts.js +32 -0
  295. package/dist/src/local-apps/capabilities/read.d.ts +3 -0
  296. package/dist/src/local-apps/capabilities/read.js +48 -0
  297. package/dist/src/local-apps/capabilities/runtime.d.ts +16 -0
  298. package/dist/src/local-apps/capabilities/runtime.js +66 -0
  299. package/dist/src/local-apps/capabilities/write.d.ts +3 -0
  300. package/dist/src/local-apps/capabilities/write.js +35 -0
  301. package/dist/src/local-apps/release-lock.d.ts +2 -0
  302. package/dist/src/local-apps/release-lock.js +20 -0
  303. package/dist/src/local-apps/runtime-entry.d.ts +0 -2
  304. package/dist/src/local-apps/runtime-entry.js +1 -14
  305. package/dist/src/local-apps/scaffold.js +4 -1
  306. package/dist/src/local-apps/service.d.ts +24 -1
  307. package/dist/src/local-apps/service.js +186 -43
  308. package/dist/src/local-apps/store.js +0 -2
  309. package/dist/src/mcp/capability-server.d.ts +4 -0
  310. package/dist/src/mcp/capability-server.js +96 -0
  311. package/dist/src/mcp/channel-bridge.js +1 -1
  312. package/dist/src/mcp/gateway-http-client.d.ts +7 -0
  313. package/dist/src/mcp/gateway-http-client.js +27 -5
  314. package/dist/src/media-understanding/openai-compatible-audio.js +1 -1
  315. package/dist/src/notes/agent-context.js +1 -1
  316. package/dist/src/notes/capabilities/read.d.ts +3 -0
  317. package/dist/src/notes/capabilities/read.js +96 -0
  318. package/dist/src/notes/capabilities/write.d.ts +7 -0
  319. package/dist/src/notes/capabilities/write.js +152 -0
  320. package/dist/src/notes/index.js +1 -1
  321. package/dist/src/notes/service.d.ts +12 -4
  322. package/dist/src/notes/service.js +188 -175
  323. package/dist/src/notes/store.d.ts +14 -9
  324. package/dist/src/notes/store.js +81 -21
  325. package/dist/src/notifications/service.d.ts +1 -0
  326. package/dist/src/notifications/service.js +5 -0
  327. package/dist/src/platform/client.d.ts +1 -1
  328. package/dist/src/platform/contracts.d.ts +1 -1
  329. package/dist/src/projects/capabilities/read.d.ts +3 -0
  330. package/dist/src/projects/capabilities/read.js +81 -0
  331. package/dist/src/projects/capabilities/write.d.ts +9 -0
  332. package/dist/src/projects/capabilities/write.js +260 -0
  333. package/dist/src/projects/index.js +2 -2
  334. package/dist/src/projects/project-change-events.d.ts +2 -0
  335. package/dist/src/projects/project-change-events.js +18 -0
  336. package/dist/src/projects/project-service.d.ts +11 -0
  337. package/dist/src/projects/project-service.js +121 -42
  338. package/dist/src/projects/project-store.js +12 -2
  339. package/dist/src/projects/project-workspace-creation.d.ts +3 -0
  340. package/dist/src/projects/project-workspace-creation.js +45 -0
  341. package/dist/src/projects/workspace-project.js +6 -0
  342. package/dist/src/providers/model-catalog-types.d.ts +2 -1
  343. package/dist/src/providers/model-reference-auditor.js +4 -4
  344. package/dist/src/providers/model-supplements.js +13 -3
  345. package/dist/src/providers/presentation.js +3 -3
  346. package/dist/src/providers/xopc-cloud-model-source.js +4 -2
  347. package/dist/src/realtime/runtime.js +4 -0
  348. package/dist/src/scenes/capabilities/read.d.ts +3 -0
  349. package/dist/src/scenes/capabilities/read.js +187 -0
  350. package/dist/src/scenes/capabilities/write.d.ts +3 -0
  351. package/dist/src/scenes/capabilities/write.js +151 -0
  352. package/dist/src/scenes/contracts.d.ts +2 -105
  353. package/dist/src/scenes/contracts.js +3 -88
  354. package/dist/src/scenes/execution.d.ts +1 -1
  355. package/dist/src/scenes/httpServices.d.ts +2 -0
  356. package/dist/src/scenes/inbox.d.ts +1 -0
  357. package/dist/src/scenes/inbox.js +7 -7
  358. package/dist/src/scenes/preferences.d.ts +3 -24
  359. package/dist/src/scenes/preferences.js +8 -30
  360. package/dist/src/scenes/repository.d.ts +1 -0
  361. package/dist/src/scenes/repository.js +7 -3
  362. package/dist/src/scenes/resultNotifications.js +2 -2
  363. package/dist/src/scenes/schedule.d.ts +1 -8
  364. package/dist/src/scenes/schedule.js +3 -15
  365. package/dist/src/scenes/service.d.ts +6 -0
  366. package/dist/src/scenes/service.js +29 -25
  367. package/dist/src/scenes/taskFollowUp/agentExecutor.d.ts +36 -0
  368. package/dist/src/scenes/taskFollowUp/agentExecutor.js +149 -0
  369. package/dist/src/scenes/taskFollowUp/branchInventory.d.ts +38 -0
  370. package/dist/src/scenes/taskFollowUp/branchInventory.js +70 -0
  371. package/dist/src/scenes/taskFollowUp/contracts.d.ts +91 -0
  372. package/dist/src/scenes/taskFollowUp/contracts.js +100 -0
  373. package/dist/src/scenes/taskFollowUp/resources.d.ts +19 -0
  374. package/dist/src/scenes/taskFollowUp/resources.js +97 -0
  375. package/dist/src/scenes/taskFollowUp/service.d.ts +810 -0
  376. package/dist/src/scenes/taskFollowUp/service.js +710 -0
  377. package/dist/src/scenes/taskFollowUp/workspaceFingerprint.d.ts +2 -0
  378. package/dist/src/scenes/taskFollowUp/workspaceFingerprint.js +46 -0
  379. package/dist/src/scenes/templates.d.ts +2 -2
  380. package/dist/src/scenes/templates.js +1 -1
  381. package/dist/src/session/session-find.d.ts +17 -0
  382. package/dist/src/session/session-find.js +56 -0
  383. package/dist/src/session/store.d.ts +4 -0
  384. package/dist/src/session/store.js +43 -7
  385. package/dist/src/share/note-share-revocation.d.ts +3 -0
  386. package/dist/src/share/note-share-revocation.js +26 -0
  387. package/dist/src/storage/sqlite/migrations/190_scene_development.sql +37 -0
  388. package/dist/src/storage/sqlite/migrations/191_scene_task_follow_up.sql +27 -0
  389. package/dist/src/storage/sqlite/migrations/192_capability_operations.sql +20 -0
  390. package/dist/src/storage/sqlite/migrations/193_note_file_cleanup.sql +8 -0
  391. package/dist/src/storage/sqlite/migrations/194_capability_external_outcomes.sql +11 -0
  392. package/dist/src/storage/sqlite/migrations/195_automation_deleted_revisions.sql +4 -0
  393. package/dist/src/storage/sqlite/migrations/196_automation_run_requests.sql +23 -0
  394. package/dist/src/storage/sqlite/migrations/197_note_deletion_cleanup.sql +8 -0
  395. package/dist/src/storage/sqlite/migrations/198_project_workspace_creation.sql +7 -0
  396. package/dist/src/storage/sqlite/migrations/199_scene_resource_events.sql +488 -0
  397. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  398. package/dist/src/storage/sqlite/migrations/runner.js +6 -3
  399. package/dist/src/storage/sqlite/schema.js +1 -1
  400. package/dist/src/storage/sqlite/transaction.d.ts +5 -0
  401. package/dist/src/storage/sqlite/transaction.js +34 -3
  402. package/dist/src/tasks/capabilities/management.d.ts +195 -0
  403. package/dist/src/tasks/capabilities/management.js +111 -0
  404. package/dist/src/tasks/capabilities/read.d.ts +2 -0
  405. package/dist/src/tasks/capabilities/read.js +141 -0
  406. package/dist/src/tasks/capabilities/relations.d.ts +204 -0
  407. package/dist/src/tasks/capabilities/relations.js +140 -0
  408. package/dist/src/tasks/capabilities/runs.d.ts +2 -0
  409. package/dist/src/tasks/capabilities/runs.js +89 -0
  410. package/dist/src/tasks/capabilities/write.d.ts +207 -0
  411. package/dist/src/tasks/capabilities/write.js +107 -0
  412. package/dist/src/tasks/home-query-service.js +3 -2
  413. package/dist/src/tasks/index.d.ts +0 -1
  414. package/dist/src/tasks/index.js +9 -9
  415. package/dist/src/tasks/project-operating-view-service.js +2 -1
  416. package/dist/src/tasks/task-application-service.d.ts +1 -0
  417. package/dist/src/tasks/task-application-service.js +3 -2
  418. package/dist/src/tasks/task-change-events.js +5 -3
  419. package/dist/src/tasks/task-context-assembler.js +2 -1
  420. package/dist/src/tasks/task-deletion-service.js +2 -1
  421. package/dist/src/tasks/task-dependency-service.js +2 -1
  422. package/dist/src/tasks/task-handoff-service.js +2 -1
  423. package/dist/src/tasks/task-read-model-projector.js +2 -1
  424. package/dist/src/tasks/task-repository.d.ts +12 -7
  425. package/dist/src/tasks/task-repository.js +175 -154
  426. package/dist/src/tasks/task-run-coordinator.js +2 -1
  427. package/dist/src/tasks/task-run-dispatcher.js +2 -1
  428. package/dist/src/tasks/task-run-repository.d.ts +1 -0
  429. package/dist/src/tasks/task-run-repository.js +29 -14
  430. package/dist/src/tasks/task-signal-service.js +2 -1
  431. package/dist/src/tui/backends/embedded-backend.js +1 -1
  432. package/dist/src/tui/backends/gateway-realtime-backend.js +1 -1
  433. package/dist/src/tui/tui-commands.js +1 -1
  434. package/dist/src/user-context/config.d.ts +13 -0
  435. package/dist/src/user-context/config.js +2 -0
  436. package/dist/src/voice/platform-catalog.d.ts +1 -1
  437. package/dist/src/voice/realtime/runtime.js +3 -3
  438. package/dist/src/voice/stt/providers/alibaba-transcription.js +1 -1
  439. package/dist/src/voice/stt/providers/xopc-cloud-transcription.js +1 -1
  440. package/dist/src/voice/tts/providers/xopc-cloud-speech.js +1 -1
  441. package/dist/src/work-discovery/incremental-repository.js +1 -1
  442. package/dist/src/work-discovery/index.js +1 -1
  443. package/dist/src/work-discovery/repository.d.ts +1 -1
  444. package/dist/src/work-discovery/repository.js +3 -2
  445. package/dist/src/work-discovery/service.d.ts +4 -0
  446. package/dist/src/work-discovery/service.js +36 -11
  447. package/dist/src/workflows/context/workflow-context.js +3 -2
  448. package/dist/src/workflows/service/workflow-run-service.js +2 -1
  449. package/package.json +6 -2
  450. package/skills/THIRD_PARTY_NOTICES.md +2 -2
  451. package/skills/documents/xlsx/SKILL.md +5 -0
  452. package/skills/engineering/build-xopc-local-app/SKILL.md +2 -0
  453. package/skills/tools/find-skills/SKILL.md +3 -0
  454. package/dist/gateway/static/root/assets/activity-store-DVUTs1fk.js +0 -1
  455. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-K3hTmu9d.js +0 -1
  456. package/dist/gateway/static/root/assets/appearance-settings-CU52MfIT.js +0 -1
  457. package/dist/gateway/static/root/assets/apps-page-ZpA1-6ad.js +0 -1
  458. package/dist/gateway/static/root/assets/automations-workspace-IEAxKRME.js +0 -7
  459. package/dist/gateway/static/root/assets/browser-settings-page-CU4VWsmX.js +0 -3
  460. package/dist/gateway/static/root/assets/capabilities-settings-panel-C9XQk3HL.js +0 -8
  461. package/dist/gateway/static/root/assets/channels-settings-Bqlhjooi.js +0 -1
  462. package/dist/gateway/static/root/assets/connector-service-page-BmH17JnO.js +0 -1
  463. package/dist/gateway/static/root/assets/connectors-page-zkx8Q-e6.js +0 -2
  464. package/dist/gateway/static/root/assets/desktop-pet-settings-CE4GOlMM.js +0 -1
  465. package/dist/gateway/static/root/assets/device-pairing-wizard-CdKJqnnw.js +0 -1
  466. package/dist/gateway/static/root/assets/files-Be5viEFY.js +0 -1
  467. package/dist/gateway/static/root/assets/gateway-realtime-CGOW0-b4.js +0 -1
  468. package/dist/gateway/static/root/assets/gateway-realtime-store-D4um_sV7.js +0 -1
  469. package/dist/gateway/static/root/assets/gateway-settings-CgXp2zq4.js +0 -1
  470. package/dist/gateway/static/root/assets/home-page-D6Idk732.js +0 -1
  471. package/dist/gateway/static/root/assets/index-1wIKA-kM.css +0 -1
  472. package/dist/gateway/static/root/assets/index-PFQHPGgi.js +0 -79
  473. package/dist/gateway/static/root/assets/local-app-workbench-page-BmAqTRb4.js +0 -2
  474. package/dist/gateway/static/root/assets/logs-page-ZjVYXXyM.js +0 -2
  475. package/dist/gateway/static/root/assets/management-settings-CSTkYVOZ.js +0 -1
  476. package/dist/gateway/static/root/assets/messages-4BtQKYlM.js +0 -3
  477. package/dist/gateway/static/root/assets/note-detail-panel-DuXCt-MM.js +0 -5
  478. package/dist/gateway/static/root/assets/notes-page-BjOgBVq5.js +0 -8
  479. package/dist/gateway/static/root/assets/product-delivery-CrAI8ZEa.js +0 -1
  480. package/dist/gateway/static/root/assets/project-detail-page-0zi4-i9X.js +0 -1
  481. package/dist/gateway/static/root/assets/projects-page-B18OxmJj.js +0 -1
  482. package/dist/gateway/static/root/assets/remote-access-hub-z-DxbuaE.js +0 -1
  483. package/dist/gateway/static/root/assets/runtime-tools-settings-panel-DGsBTbo6.js +0 -5
  484. package/dist/gateway/static/root/assets/scenes-page-Bgba03B_.js +0 -1
  485. package/dist/gateway/static/root/assets/schemas-BaskVM5g.js +0 -64
  486. package/dist/gateway/static/root/assets/sessions-page-B1t3bMsm.js +0 -1
  487. package/dist/gateway/static/root/assets/settings-advanced-gate-CBX0Ezhf.js +0 -1
  488. package/dist/gateway/static/root/assets/setup-status-panel-Bw71C2X3.js +0 -1
  489. package/dist/gateway/static/root/assets/shares-settings-BoVDQolc.js +0 -1
  490. package/dist/gateway/static/root/assets/skill-reload-api-DtTptpAt.js +0 -1
  491. package/dist/gateway/static/root/assets/task-detail-page-vgkiGo-D.js +0 -1
  492. package/dist/gateway/static/root/assets/theme-store-CegIlB8d.js +0 -1
  493. package/dist/gateway/static/root/assets/user-model-page-CAGafNfP.js +0 -2
  494. package/dist/gateway/static/root/assets/workflows-page-CSxHVs1p.js +0 -6
  495. package/skills/creative/algorithmic-art/SKILL.md +0 -44
  496. package/skills/creative/algorithmic-art/templates/generator-template.js +0 -27
  497. package/skills/creative/algorithmic-art/templates/viewer.html +0 -27
@@ -1,3 +1,4 @@
1
+ import { init_paths_state, resolveStateDir } from "../config/paths-state.js";
1
2
  import { createLogger } from "../utils/logger/index.js";
2
3
  import { init_logger } from "../utils/logger.js";
3
4
  import { requireXopcDatabase } from "../storage/sqlite/connection.js";
@@ -6,53 +7,56 @@ import { buildNoteIndexMeta } from "./note-index-meta.js";
6
7
  import { deleteNoteRecord, getNoteRecord, listNoteRecords, upsertNoteRecord } from "../storage/sqlite/notes-repository.js";
7
8
  import { deleteNoteAgentContextRecord } from "../storage/sqlite/note-agent-context-repository.js";
8
9
  import "../storage/sqlite/index.js";
10
+ import { canRemoveRevokedNoteShareArtifact } from "../share/note-share-revocation.js";
9
11
  import { resolveNoteMediaDir } from "./paths.js";
10
- import { join } from "node:path";
12
+ import { basename, join } from "node:path";
13
+ import { rmSync } from "node:fs";
11
14
  import { randomUUID } from "node:crypto";
12
15
  import { copyFile, mkdir, rm, stat, writeFile } from "node:fs/promises";
13
16
  //#region src/notes/store.ts
14
17
  init_transaction();
15
18
  init_logger();
19
+ init_paths_state();
16
20
  const log = createLogger("NotesStore");
17
21
  var NotesStore = class {
18
22
  initialized = false;
23
+ failedCleanupPaths = /* @__PURE__ */ new Set();
19
24
  async initialize() {
20
25
  if (this.initialized) return;
21
26
  requireXopcDatabase();
22
27
  this.initialized = true;
23
28
  log.debug("NotesStore initialized");
24
29
  }
25
- async addNote(note) {
30
+ addNote(note) {
26
31
  requireXopcDatabase();
27
32
  upsertNoteRecord(note);
28
33
  }
29
- async getNote(id) {
34
+ getNote(id) {
30
35
  requireXopcDatabase();
31
36
  return getNoteRecord(id);
32
37
  }
33
- async updateNote(id, patch) {
34
- const existing = await this.getNote(id);
38
+ updateNote(id, patch) {
39
+ const existing = this.getNote(id);
35
40
  if (!existing) return null;
36
41
  const updated = {
37
42
  ...existing,
38
43
  ...patch,
39
44
  id: existing.id,
40
45
  createdAt: existing.createdAt,
41
- updatedAt: Date.now()
46
+ updatedAt: Math.max(Date.now(), existing.updatedAt + 1)
42
47
  };
43
48
  requireXopcDatabase();
44
49
  upsertNoteRecord(updated);
45
50
  return updated;
46
51
  }
47
- async deleteNote(id) {
48
- requireXopcDatabase();
49
- if (!deleteNoteRecord(id)) return false;
50
- deleteNoteAgentContextRecord(id);
51
- await rm(resolveNoteMediaDir(id), {
52
- recursive: true,
53
- force: true
54
- }).catch(() => void 0);
55
- return true;
52
+ deleteNoteAtomically(id) {
53
+ return runSqliteWriteTransaction((db) => {
54
+ if (!deleteNoteRecord(id)) return false;
55
+ deleteNoteAgentContextRecord(id);
56
+ db.prepare("DELETE FROM note_snapshots WHERE note_id = ?").run(id);
57
+ this.queueDeletionCleanup("media", id);
58
+ return true;
59
+ });
56
60
  }
57
61
  async listNotes(query = {}) {
58
62
  requireXopcDatabase();
@@ -82,7 +86,7 @@ var NotesStore = class {
82
86
  }, "Failed to remove note attachment file");
83
87
  });
84
88
  }
85
- async saveSnapshot(note, trigger) {
89
+ saveSnapshot(note, trigger) {
86
90
  requireXopcDatabase();
87
91
  runSqliteWriteTransaction((db) => {
88
92
  const row = db.prepare("SELECT MAX(timestamp) AS timestamp FROM note_snapshots WHERE note_id = ?").get(note.id);
@@ -99,7 +103,7 @@ var NotesStore = class {
99
103
  db.prepare("INSERT INTO note_snapshots(note_id, timestamp, payload) VALUES (?, ?, ?)").run(note.id, snapshot.timestamp, JSON.stringify(snapshot));
100
104
  });
101
105
  }
102
- async listSnapshots(noteId) {
106
+ listSnapshots(noteId) {
103
107
  return requireXopcDatabase().db.prepare("SELECT payload FROM note_snapshots WHERE note_id = ? ORDER BY timestamp DESC").all(noteId).map((row) => {
104
108
  const snapshot = JSON.parse(row.payload);
105
109
  return {
@@ -109,18 +113,74 @@ var NotesStore = class {
109
113
  };
110
114
  });
111
115
  }
112
- async getSnapshot(noteId, timestamp) {
116
+ getSnapshot(noteId, timestamp) {
113
117
  const row = requireXopcDatabase().db.prepare("SELECT payload FROM note_snapshots WHERE note_id = ? AND timestamp = ?").get(noteId, timestamp);
114
118
  return row ? JSON.parse(row.payload) : null;
115
119
  }
116
- async pruneSnapshots(noteId, maxCount) {
120
+ pruneSnapshots(noteId, maxCount) {
117
121
  if (!Number.isSafeInteger(maxCount) || maxCount < 0) throw new Error("Invalid snapshot retention count");
118
122
  requireXopcDatabase().db.prepare(`DELETE FROM note_snapshots WHERE note_id = ? AND timestamp NOT IN (
119
123
  SELECT timestamp FROM note_snapshots WHERE note_id = ? ORDER BY timestamp DESC LIMIT ?
120
124
  )`).run(noteId, noteId, maxCount);
121
125
  }
122
- async deleteAllSnapshots(noteId) {
123
- requireXopcDatabase().db.prepare("DELETE FROM note_snapshots WHERE note_id = ?").run(noteId);
126
+ queueAttachmentCleanup(noteId, relativePath) {
127
+ if (!/^[a-zA-Z0-9_-]+$/.test(noteId) || !relativePath || basename(relativePath) !== relativePath || relativePath === "." || relativePath === "..") throw new Error("Invalid note attachment cleanup path");
128
+ requireXopcDatabase().db.prepare(`INSERT OR IGNORE INTO note_file_cleanup
129
+ (note_id, relative_path, created_at) VALUES (?, ?, ?)`).run(noteId, relativePath, Date.now());
130
+ }
131
+ queueDeletionCleanup(kind, id) {
132
+ if (!/^[a-zA-Z0-9_-]+$/.test(id)) throw new Error("Invalid note deletion cleanup identity");
133
+ requireXopcDatabase().db.prepare("INSERT OR IGNORE INTO note_deletion_cleanup(kind, object_id, created_at) VALUES (?, ?, ?)").run(kind, id, Date.now());
134
+ }
135
+ drainDeletionCleanup(limit = 100) {
136
+ const db = requireXopcDatabase().db;
137
+ const rows = db.prepare("SELECT kind, object_id, attempts FROM note_deletion_cleanup WHERE next_attempt_at <= ? ORDER BY created_at LIMIT ?").all(Date.now(), limit);
138
+ for (const row of rows) {
139
+ const key = `${row.kind}:${row.object_id}`;
140
+ try {
141
+ if (!/^[a-zA-Z0-9_-]+$/.test(row.object_id) || !["media", "share"].includes(row.kind)) throw new Error("Invalid note deletion cleanup identity");
142
+ if (row.kind === "media" ? !this.getNote(row.object_id) : canRemoveRevokedNoteShareArtifact(row.object_id)) rmSync(row.kind === "media" ? resolveNoteMediaDir(row.object_id) : join(resolveStateDir(), "share-artifacts", row.object_id), {
143
+ recursive: true,
144
+ force: true
145
+ });
146
+ db.prepare("DELETE FROM note_deletion_cleanup WHERE kind = ? AND object_id = ?").run(row.kind, row.object_id);
147
+ this.failedCleanupPaths.delete(key);
148
+ } catch (err) {
149
+ db.prepare("UPDATE note_deletion_cleanup SET attempts = attempts + 1, next_attempt_at = ? WHERE kind = ? AND object_id = ?").run(Date.now() + Math.min(3e5, 1e3 * 2 ** Math.min(row.attempts, 9)), row.kind, row.object_id);
150
+ if (!this.failedCleanupPaths.has(key)) {
151
+ this.failedCleanupPaths.add(key);
152
+ log.warn({
153
+ err,
154
+ kind: row.kind,
155
+ objectId: row.object_id
156
+ }, "Deferred note deletion cleanup failed; retry scheduled");
157
+ }
158
+ }
159
+ }
160
+ }
161
+ /** Called after commit and on startup. A failed deletion remains durable for the next attempt. */
162
+ drainAttachmentCleanup(limit = 100) {
163
+ const db = requireXopcDatabase().db;
164
+ const rows = db.prepare("SELECT note_id, relative_path, attempts FROM note_file_cleanup WHERE next_attempt_at <= ? ORDER BY created_at LIMIT ?").all(Date.now(), limit);
165
+ for (const row of rows) {
166
+ const key = `${row.note_id}/${row.relative_path}`;
167
+ try {
168
+ if (!/^[a-zA-Z0-9_-]+$/.test(row.note_id) || !row.relative_path || basename(row.relative_path) !== row.relative_path || row.relative_path === "." || row.relative_path === "..") throw new Error("Invalid note attachment cleanup path");
169
+ if (!this.getNote(row.note_id)?.attachments?.some((item) => item.relativePath === row.relative_path)) rmSync(this.resolveAttachmentPath(row.note_id, row.relative_path), { force: true });
170
+ db.prepare("DELETE FROM note_file_cleanup WHERE note_id = ? AND relative_path = ?").run(row.note_id, row.relative_path);
171
+ this.failedCleanupPaths.delete(key);
172
+ } catch (err) {
173
+ db.prepare("UPDATE note_file_cleanup SET attempts = attempts + 1, next_attempt_at = ? WHERE note_id = ? AND relative_path = ?").run(Date.now() + Math.min(3e5, 1e3 * 2 ** Math.min(row.attempts, 9)), row.note_id, row.relative_path);
174
+ if (!this.failedCleanupPaths.has(key)) {
175
+ this.failedCleanupPaths.add(key);
176
+ log.warn({
177
+ err,
178
+ noteId: row.note_id,
179
+ relativePath: row.relative_path
180
+ }, "Deferred note attachment cleanup failed; retry scheduled");
181
+ }
182
+ }
183
+ }
124
184
  }
125
185
  };
126
186
  //#endregion
@@ -10,6 +10,7 @@ export declare class NotificationService {
10
10
  publish: (type: string, payload: unknown) => void;
11
11
  fetch?: typeof fetch;
12
12
  domainDelivery?: NotificationDomainDelivery;
13
+ allowsNotification?: (notification: NotificationPlan['notification']) => boolean;
13
14
  sendHarmony?: typeof sendHarmonyPush;
14
15
  });
15
16
  start(): void;
@@ -83,6 +83,7 @@ var NotificationService = class {
83
83
  return this.persistPlan(plan);
84
84
  }
85
85
  persistPlan(plan) {
86
+ if (this.options.allowsNotification?.(plan.notification) === false) return null;
86
87
  const domain = this.options.domainDelivery?.owns(plan.notification.type) ? this.options.domainDelivery : void 0;
87
88
  if (!domain && !Object.hasOwn(STANDARD_PREFERENCES, plan.notification.type)) throw new Error("Notification domain delivery is not installed");
88
89
  const devices = listDeliverableNotificationDevices().filter((device) => domain ? domain.allowsDevice(device.preferences) : preferenceAllows(plan.notification.type, device.preferences));
@@ -122,6 +123,10 @@ var NotificationService = class {
122
123
  await Promise.all(deliveries.map((delivery) => this.send(delivery)));
123
124
  }
124
125
  async send(delivery) {
126
+ if (this.options.allowsNotification?.(delivery.event) === false) {
127
+ markNotificationDeliveryDead(delivery.event.id, delivery.deviceId, "Notification policy changed");
128
+ return;
129
+ }
125
130
  const domain = this.options.domainDelivery?.owns(delivery.event.type) ? this.options.domainDelivery : void 0;
126
131
  if (!domain && !Object.hasOwn(STANDARD_PREFERENCES, delivery.event.type)) {
127
132
  markNotificationDeliveryDead(delivery.event.id, delivery.deviceId, "Notification domain delivery is not installed");
@@ -66,10 +66,10 @@ export declare const RuntimeCommandSchema: z.ZodObject<{
66
66
  read: "read";
67
67
  write: "write";
68
68
  execute: "execute";
69
- admin: "admin";
70
69
  send: "send";
71
70
  purchase: "purchase";
72
71
  publish: "publish";
72
+ admin: "admin";
73
73
  }>>;
74
74
  }, z.core.$strict>;
75
75
  data: z.ZodObject<{
@@ -152,10 +152,10 @@ export declare const AgentManifestSchema: z.ZodObject<{
152
152
  read: "read";
153
153
  write: "write";
154
154
  execute: "execute";
155
- admin: "admin";
156
155
  send: "send";
157
156
  purchase: "purchase";
158
157
  publish: "publish";
158
+ admin: "admin";
159
159
  }>>;
160
160
  }, z.core.$strict>;
161
161
  data: z.ZodObject<{
@@ -0,0 +1,3 @@
1
+ import { type CapabilityDispatcher } from '../../capabilities/runtime/dispatcher.js';
2
+ import type { ProjectService } from '../project-service.js';
3
+ export declare function registerProjectReadCapabilities(dispatcher: CapabilityDispatcher, projects: ProjectService): void;
@@ -0,0 +1,81 @@
1
+ import { ProductReadContracts } from "../../../packages/gateway-contract/src/capabilities.js";
2
+ import { init_src } from "../../../packages/gateway-contract/src/index.js";
3
+ import { CapabilityError } from "../../capabilities/runtime/errors.js";
4
+ import { defineReadCapability } from "../../capabilities/runtime/dispatcher.js";
5
+ //#region src/projects/capabilities/read.ts
6
+ init_src();
7
+ function registerProjectReadCapabilities(dispatcher, projects) {
8
+ const requireProject = (id) => {
9
+ const project = projects.get(id);
10
+ if (!project) throw new CapabilityError("NOT_FOUND", "Project not found");
11
+ return project;
12
+ };
13
+ const policy = {
14
+ majorVersion: 1,
15
+ effect: "read",
16
+ surfaces: [
17
+ "http",
18
+ "agent",
19
+ "cli"
20
+ ],
21
+ scopes: ["workspace.read"]
22
+ };
23
+ dispatcher.register(defineReadCapability({
24
+ ...policy,
25
+ id: "xopc.projects.get",
26
+ description: "Read a project and its domain details.",
27
+ ...ProductReadContracts["xopc.projects.get"],
28
+ execute({ id }) {
29
+ const project = projects.getWithDetails(id);
30
+ if (!project) throw new CapabilityError("NOT_FOUND", "Project not found");
31
+ return {
32
+ ok: true,
33
+ project: { ...project }
34
+ };
35
+ }
36
+ }));
37
+ dispatcher.register(defineReadCapability({
38
+ ...policy,
39
+ id: "xopc.projects.list",
40
+ description: "List projects with filters and pagination.",
41
+ ...ProductReadContracts["xopc.projects.list"],
42
+ execute(input) {
43
+ const result = projects.list(input);
44
+ return {
45
+ ok: true,
46
+ ...result,
47
+ items: result.items.map((project) => ({ ...project }))
48
+ };
49
+ }
50
+ }));
51
+ dispatcher.register(defineReadCapability({
52
+ ...policy,
53
+ id: "xopc.projects.list_milestones",
54
+ description: "List project milestones.",
55
+ ...ProductReadContracts["xopc.projects.list_milestones"],
56
+ execute({ id }) {
57
+ requireProject(id);
58
+ return {
59
+ ok: true,
60
+ projectId: id,
61
+ items: projects.listMilestones(id).map((item) => ({ ...item }))
62
+ };
63
+ }
64
+ }));
65
+ dispatcher.register(defineReadCapability({
66
+ ...policy,
67
+ id: "xopc.projects.list_updates",
68
+ description: "List project progress updates.",
69
+ ...ProductReadContracts["xopc.projects.list_updates"],
70
+ execute({ id, limit }) {
71
+ requireProject(id);
72
+ return {
73
+ ok: true,
74
+ projectId: id,
75
+ items: projects.listUpdates(id, limit).map((item) => ({ ...item }))
76
+ };
77
+ }
78
+ }));
79
+ }
80
+ //#endregion
81
+ export { registerProjectReadCapabilities };
@@ -0,0 +1,9 @@
1
+ import { type CapabilityDispatcher } from '../../capabilities/runtime/dispatcher.js';
2
+ import { type ProjectService } from '../project-service.js';
3
+ import type { Config } from '../../config/schema.js';
4
+ import type { WorkDiscoveryService } from '../../work-discovery/service.js';
5
+ export interface ProjectWriteCapabilityDeps {
6
+ getConfig?: () => Config | undefined;
7
+ getWorkDiscovery?: () => WorkDiscoveryService | undefined;
8
+ }
9
+ export declare function registerProjectWriteCapabilities(dispatcher: CapabilityDispatcher, service: ProjectService, deps?: ProjectWriteCapabilityDeps): void;
@@ -0,0 +1,260 @@
1
+ import { ProjectCreateInputSchema, ProjectDeleteInputSchema, ProjectDeleteOutputSchema, ProjectEditInputSchema, ProjectMilestoneCreateInputSchema, ProjectMilestoneDeleteInputSchema, ProjectMilestoneDeleteOutputSchema, ProjectMilestoneOutputSchema, ProjectMilestoneUpdateInputSchema, ProjectMutationOutputSchema, ProjectResolveWorkspaceInputSchema, ProjectResolveWorkspaceOutputSchema, ProjectSetPinnedInputSchema, ProjectUpdateCreateInputSchema, ProjectUpdateOutputSchema } from "../../../packages/gateway-contract/src/capabilities.js";
2
+ import { init_src } from "../../../packages/gateway-contract/src/index.js";
3
+ import { getSessionMetadata } from "../../storage/sqlite/session-read-repository.js";
4
+ import { ensureSessionRecord } from "../../storage/sqlite/session-repository.js";
5
+ import "../../storage/sqlite/index.js";
6
+ import { CapabilityError } from "../../capabilities/runtime/errors.js";
7
+ import { defineAtomicCapability } from "../../capabilities/runtime/dispatcher.js";
8
+ import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError } from "../workspace-project.js";
9
+ import { ProjectDeletionBlockedError, ProjectWorkspaceInUseError, ProjectWorkspaceInvalidError } from "../project-service.js";
10
+ import { isValidProjectAgentId, normalizeProjectAgentId } from "../project-agent.js";
11
+ import { inferSuggestedProjectDefaultAgentId } from "../project-agent-suggestion.js";
12
+ //#region src/projects/capabilities/write.ts
13
+ init_src();
14
+ function projectMutation(execute) {
15
+ try {
16
+ return execute();
17
+ } catch (error) {
18
+ if (error instanceof ProjectWorkspaceInvalidError) throw new CapabilityError("INVALID_INPUT", error.message);
19
+ if (error instanceof ProjectWorkspaceConflictError || error instanceof ProjectWorkspaceMissingError || error instanceof ProjectWorkspaceInUseError) {
20
+ const conflict = new CapabilityError("REVISION_CONFLICT", error.message);
21
+ conflict.cause = error;
22
+ throw conflict;
23
+ }
24
+ throw error;
25
+ }
26
+ }
27
+ function registerProjectWriteCapabilities(dispatcher, service, deps = {}) {
28
+ const policy = {
29
+ majorVersion: 1,
30
+ effect: "local-write",
31
+ surfaces: ["http", "agent"],
32
+ scopes: ["workspace.write"],
33
+ afterCommit: () => service.flushCommittedEffects()
34
+ };
35
+ const requireProject = (id) => {
36
+ const project = service.get(id);
37
+ if (!project) throw new CapabilityError("NOT_FOUND", "Project not found");
38
+ return project;
39
+ };
40
+ const agentId = (raw) => {
41
+ const normalized = normalizeProjectAgentId(raw);
42
+ const config = deps.getConfig?.();
43
+ if (normalized && !config) throw new CapabilityError("UNAVAILABLE", "Agent configuration is unavailable");
44
+ if (config && !isValidProjectAgentId(config, normalized)) throw new CapabilityError("INVALID_INPUT", "Default agent not found");
45
+ return normalized;
46
+ };
47
+ const flushWorkspace = (projectId) => {
48
+ try {
49
+ service.flushCommittedEffects(projectId);
50
+ } catch (error) {
51
+ const pending = new CapabilityError("UNAVAILABLE", "Project committed; workspace creation is pending. Retry the same idempotencyKey.");
52
+ pending.cause = error;
53
+ throw pending;
54
+ }
55
+ };
56
+ dispatcher.register(defineAtomicCapability({
57
+ ...policy,
58
+ id: "xopc.projects.create",
59
+ description: "Create a project with a durable receipt and recoverable post-commit workspace creation.",
60
+ input: ProjectCreateInputSchema,
61
+ output: ProjectMutationOutputSchema,
62
+ execute({ autoUnderstand, ...input }) {
63
+ const understanding = autoUnderstand ? deps.getWorkDiscovery?.() : void 0;
64
+ if (autoUnderstand && !understanding) throw new CapabilityError("UNAVAILABLE", "Project understanding service is unavailable");
65
+ const config = deps.getConfig?.();
66
+ const defaultAgentId = input.defaultAgentId !== void 0 ? agentId(input.defaultAgentId) : config ? inferSuggestedProjectDefaultAgentId({
67
+ config,
68
+ ...input
69
+ }) : void 0;
70
+ const project = projectMutation(() => service.create({
71
+ ...input,
72
+ defaultAgentId
73
+ }));
74
+ understanding?.startProjectUnderstanding(project.id);
75
+ return {
76
+ ok: true,
77
+ project: { ...project }
78
+ };
79
+ },
80
+ afterCommit: (result) => flushWorkspace(result.project.id)
81
+ }));
82
+ dispatcher.register(defineAtomicCapability({
83
+ ...policy,
84
+ id: "xopc.projects.update",
85
+ description: "Edit a project at its exact version with recoverable workspace creation.",
86
+ input: ProjectEditInputSchema,
87
+ output: ProjectMutationOutputSchema,
88
+ execute({ id, expectedVersion, patch }) {
89
+ if (requireProject(id).version !== expectedVersion) throw new CapabilityError("REVISION_CONFLICT", "Project changed");
90
+ const defaultAgentId = patch.defaultAgentId === void 0 ? void 0 : agentId(patch.defaultAgentId) ?? null;
91
+ return {
92
+ ok: true,
93
+ project: { ...projectMutation(() => service.update(id, {
94
+ ...patch,
95
+ ...patch.defaultAgentId === void 0 ? {} : { defaultAgentId }
96
+ })) }
97
+ };
98
+ },
99
+ afterCommit: (result) => flushWorkspace(result.project.id)
100
+ }));
101
+ dispatcher.register(defineAtomicCapability({
102
+ ...policy,
103
+ id: "xopc.projects.resolve_workspace",
104
+ description: "Resolve or create a workspace project and optionally bind an unassigned conversation atomically.",
105
+ input: ProjectResolveWorkspaceInputSchema,
106
+ output: ProjectResolveWorkspaceOutputSchema,
107
+ execute(input) {
108
+ const config = deps.getConfig?.();
109
+ const existing = input.conversationId ? getSessionMetadata(input.conversationId) : void 0;
110
+ const requestedAgent = existing ? existing.routing?.agentId || existing.agentId : input.agentId;
111
+ const resolvedAgent = requestedAgent ? agentId(requestedAgent) ?? void 0 : void 0;
112
+ const defaultAgentId = input.defaultAgentId !== void 0 ? agentId(input.defaultAgentId) ?? void 0 : config ? inferSuggestedProjectDefaultAgentId({
113
+ config,
114
+ workspaceRoot: input.workspacePath,
115
+ projectKind: input.projectKind
116
+ }) : resolvedAgent;
117
+ const match = projectMutation(() => service.resolveOrCreateForWorkspacePath({
118
+ ...input,
119
+ agentId: resolvedAgent,
120
+ defaultAgentId
121
+ }));
122
+ if (!match) return {
123
+ ok: true,
124
+ project: null
125
+ };
126
+ const projectAgent = normalizeProjectAgentId(match.project.defaultAgentId);
127
+ if (input.conversationId && (!projectAgent || projectAgent === resolvedAgent)) {
128
+ if (existing?.projectId && existing.projectId !== match.project.id) throw new CapabilityError("REVISION_CONFLICT", "Conversation is already bound to another project");
129
+ if (!existing) ensureSessionRecord(input.conversationId, match.project.workspaceRoot ?? input.workspacePath, {
130
+ sourceChannel: "tui",
131
+ sourceChatId: `default:direct:${input.conversationId}`,
132
+ sessionType: "chat",
133
+ routing: {
134
+ agentId: resolvedAgent ?? "main",
135
+ source: "tui",
136
+ accountId: "default",
137
+ peerKind: "direct",
138
+ peerId: input.conversationId
139
+ }
140
+ });
141
+ if (existing?.projectId !== match.project.id) service.attachSession(input.conversationId, match.project.id);
142
+ }
143
+ return {
144
+ ok: true,
145
+ ...match,
146
+ project: { ...service.get(match.project.id) }
147
+ };
148
+ }
149
+ }));
150
+ const requireMilestone = (projectId, id, revision) => {
151
+ requireProject(projectId);
152
+ const milestone = service.listMilestones(projectId).find((item) => item.id === id);
153
+ if (!milestone) throw new CapabilityError("NOT_FOUND", "Milestone not found");
154
+ if (milestone.updatedAt !== revision) throw new CapabilityError("REVISION_CONFLICT", "Milestone changed");
155
+ };
156
+ dispatcher.register(defineAtomicCapability({
157
+ ...policy,
158
+ id: "xopc.projects.delete",
159
+ description: "Delete a project at its exact version without removing workspace files. External execution stop is not confirmed.",
160
+ input: ProjectDeleteInputSchema,
161
+ output: ProjectDeleteOutputSchema,
162
+ execute({ id, expectedVersion }) {
163
+ if (requireProject(id).version !== expectedVersion) throw new CapabilityError("REVISION_CONFLICT", "Project changed");
164
+ try {
165
+ service.delete(id);
166
+ } catch (error) {
167
+ if (error instanceof ProjectDeletionBlockedError) {
168
+ const conflict = new CapabilityError("REVISION_CONFLICT", error.message);
169
+ conflict.cause = error;
170
+ throw conflict;
171
+ }
172
+ throw error;
173
+ }
174
+ return {
175
+ ok: true,
176
+ deleted: true,
177
+ executionStopConfirmed: false
178
+ };
179
+ }
180
+ }));
181
+ dispatcher.register(defineAtomicCapability({
182
+ ...policy,
183
+ id: "xopc.projects.set_pinned",
184
+ description: "Pin or unpin a project at its exact version with a durable receipt.",
185
+ input: ProjectSetPinnedInputSchema,
186
+ output: ProjectMutationOutputSchema,
187
+ execute({ id, expectedVersion, pinned }) {
188
+ if (requireProject(id).version !== expectedVersion) throw new CapabilityError("REVISION_CONFLICT", "Project changed");
189
+ return {
190
+ ok: true,
191
+ project: { ...pinned ? service.pin(id) : service.unpin(id) }
192
+ };
193
+ }
194
+ }));
195
+ dispatcher.register(defineAtomicCapability({
196
+ ...policy,
197
+ id: "xopc.projects.create_milestone",
198
+ description: "Create a project milestone with a durable receipt.",
199
+ input: ProjectMilestoneCreateInputSchema,
200
+ output: ProjectMilestoneOutputSchema,
201
+ execute({ projectId, ...input }) {
202
+ requireProject(projectId);
203
+ return {
204
+ ok: true,
205
+ milestone: { ...service.createMilestone(projectId, input) },
206
+ project: { ...requireProject(projectId) }
207
+ };
208
+ }
209
+ }));
210
+ dispatcher.register(defineAtomicCapability({
211
+ ...policy,
212
+ id: "xopc.projects.update_milestone",
213
+ description: "Edit a milestone at its exact updatedAt revision.",
214
+ input: ProjectMilestoneUpdateInputSchema,
215
+ output: ProjectMilestoneOutputSchema,
216
+ execute({ projectId, id, expectedRevision, patch }) {
217
+ requireMilestone(projectId, id, expectedRevision);
218
+ return {
219
+ ok: true,
220
+ milestone: { ...service.updateMilestone(projectId, id, patch) },
221
+ project: { ...requireProject(projectId) }
222
+ };
223
+ }
224
+ }));
225
+ dispatcher.register(defineAtomicCapability({
226
+ ...policy,
227
+ id: "xopc.projects.delete_milestone",
228
+ description: "Delete a milestone at its exact updatedAt revision.",
229
+ input: ProjectMilestoneDeleteInputSchema,
230
+ output: ProjectMilestoneDeleteOutputSchema,
231
+ execute({ projectId, id, expectedRevision }) {
232
+ requireMilestone(projectId, id, expectedRevision);
233
+ service.deleteMilestone(projectId, id);
234
+ return {
235
+ ok: true,
236
+ deleted: true
237
+ };
238
+ }
239
+ }));
240
+ dispatcher.register(defineAtomicCapability({
241
+ ...policy,
242
+ id: "xopc.projects.create_update",
243
+ description: "Record progress and change project health at an exact project version.",
244
+ input: ProjectUpdateCreateInputSchema,
245
+ output: ProjectUpdateOutputSchema,
246
+ execute({ projectId, expectedVersion, ...input }, context) {
247
+ if (requireProject(projectId).version !== expectedVersion) throw new CapabilityError("REVISION_CONFLICT", "Project changed");
248
+ return {
249
+ ok: true,
250
+ update: { ...service.createUpdate(projectId, {
251
+ ...input,
252
+ actor: context.actor ?? { kind: "system" }
253
+ }) },
254
+ project: { ...requireProject(projectId) }
255
+ };
256
+ }
257
+ }));
258
+ }
259
+ //#endregion
260
+ export { registerProjectWriteCapabilities };
@@ -3,7 +3,7 @@ import { getProjectForSession, getProjectWorkspacePathForSession, resolveProject
3
3
  import { ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, canonicalWorkspacePath, ensureWorkspaceDirectory, inferProjectNameFromWorkspaceRoot, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, resolveWorkspaceProjectRoot, workspaceDirectoryExists } from "./workspace-project.js";
4
4
  import { inferProjectExecutionMode, inferProjectKind } from "./project-kind.js";
5
5
  import { bindSessionToProject, bindSessionsToProject, listProjectConversationIds, moveSessionToProject, unbindSessionFromProject } from "./session-bind.js";
6
- import { ProjectService } from "./project-service.js";
6
+ import { ProjectDeletionBlockedError, ProjectService, ProjectWorkspaceInUseError, ProjectWorkspaceInvalidError } from "./project-service.js";
7
7
  import { ProjectSkillError, ProjectSkillService } from "./project-skill-service.js";
8
8
  import { isValidProjectAgentId, normalizeProjectAgentId, resolveProjectAgentId } from "./project-agent.js";
9
9
  import { CODING_PROJECT_AGENT_ID, inferSuggestedProjectDefaultAgentId, suggestProjectDefaultAgentId } from "./project-agent-suggestion.js";
@@ -11,4 +11,4 @@ import { buildProjectLoopOverview } from "./project-loop.js";
11
11
  import { bindWorkflowRunToProject } from "./workflow-bind.js";
12
12
  import { bindAutomationToProject } from "./automation-bind.js";
13
13
  import { bindKnowledgeItemToProject } from "./knowledge-bind.js";
14
- export { CODING_PROJECT_AGENT_ID, ProjectService, ProjectSkillError, ProjectSkillService, ProjectStore, ProjectWorkspaceConflictError, ProjectWorkspaceMissingError, bindAutomationToProject, bindKnowledgeItemToProject, bindSessionToProject, bindSessionsToProject, bindWorkflowRunToProject, buildProjectLoopOverview, canonicalWorkspacePath, ensureWorkspaceDirectory, getProjectForSession, getProjectWorkspacePathForSession, inferProjectExecutionMode, inferProjectKind, inferProjectNameFromWorkspaceRoot, inferSuggestedProjectDefaultAgentId, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, isValidProjectAgentId, listProjectConversationIds, moveSessionToProject, normalizeProjectAgentId, resolveProjectAgentId, resolveProjectWorkspacePath, resolveWorkspaceProjectRoot, slugifyProjectName, suggestProjectDefaultAgentId, unbindSessionFromProject, workspaceDirectoryExists };
14
+ export { CODING_PROJECT_AGENT_ID, ProjectDeletionBlockedError, ProjectService, ProjectSkillError, ProjectSkillService, ProjectStore, ProjectWorkspaceConflictError, ProjectWorkspaceInUseError, ProjectWorkspaceInvalidError, ProjectWorkspaceMissingError, bindAutomationToProject, bindKnowledgeItemToProject, bindSessionToProject, bindSessionsToProject, bindWorkflowRunToProject, buildProjectLoopOverview, canonicalWorkspacePath, ensureWorkspaceDirectory, getProjectForSession, getProjectWorkspacePathForSession, inferProjectExecutionMode, inferProjectKind, inferProjectNameFromWorkspaceRoot, inferSuggestedProjectDefaultAgentId, isPathSameOrInsideWorkspace, isSafeAutoCreateWorkspaceRoot, isValidProjectAgentId, listProjectConversationIds, moveSessionToProject, normalizeProjectAgentId, resolveProjectAgentId, resolveProjectWorkspacePath, resolveWorkspaceProjectRoot, slugifyProjectName, suggestProjectDefaultAgentId, unbindSessionFromProject, workspaceDirectoryExists };
@@ -0,0 +1,2 @@
1
+ import type { Project } from './types.js';
2
+ export declare function enqueueProjectChanged(project: Project, changedFields: string[], operation?: 'created' | 'updated' | 'deleted', deletedUnderstandingRunIds?: string[]): void;
@@ -0,0 +1,18 @@
1
+ import { currentOperationId, init_operation_context } from "../infra/operation-context.js";
2
+ import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transaction.js";
3
+ import { randomUUID } from "node:crypto";
4
+ //#region src/projects/project-change-events.ts
5
+ init_operation_context();
6
+ init_transaction();
7
+ function enqueueProjectChanged(project, changedFields, operation = "updated", deletedUnderstandingRunIds = []) {
8
+ getSqliteDatabase().prepare(`INSERT INTO domain_outbox
9
+ (event_id, event_type, subject_kind, subject_id, correlation_id, payload_json, created_at, operation_id)
10
+ VALUES (?, ?, 'project', ?, ?, ?, ?, ?)`).run(randomUUID(), operation === "updated" ? "project.changed" : `project.${operation}`, project.id, project.id, JSON.stringify({
11
+ projectId: project.id,
12
+ version: project.version,
13
+ changedFields,
14
+ ...deletedUnderstandingRunIds.length ? { deletedUnderstandingRunIds } : {}
15
+ }), project.updatedAt, currentOperationId() ?? null);
16
+ }
17
+ //#endregion
18
+ export { enqueueProjectChanged };
@@ -7,6 +7,15 @@ export type ProjectSuggestion = {
7
7
  score: number;
8
8
  reason: string;
9
9
  };
10
+ export declare class ProjectDeletionBlockedError extends Error {
11
+ constructor();
12
+ }
13
+ export declare class ProjectWorkspaceInvalidError extends Error {
14
+ constructor();
15
+ }
16
+ export declare class ProjectWorkspaceInUseError extends Error {
17
+ constructor();
18
+ }
10
19
  export declare class ProjectService {
11
20
  private readonly store;
12
21
  constructor(store?: ProjectStore);
@@ -38,6 +47,8 @@ export declare class ProjectService {
38
47
  createMilestone(projectId: string, input: Parameters<ProjectStore['createMilestone']>[1]): ProjectMilestone;
39
48
  updateMilestone(projectId: string, milestoneId: string, input: Parameters<ProjectStore['updateMilestone']>[2]): ProjectMilestone;
40
49
  deleteMilestone(projectId: string, milestoneId: string): boolean;
50
+ private recordMilestoneChange;
51
+ flushCommittedEffects(projectId?: string): void;
41
52
  listUpdates(projectId: string, limit?: number): ProjectUpdate[];
42
53
  createUpdate(projectId: string, input: {
43
54
  health: ProjectHealth;