@xopcai/xopc 0.0.267 → 0.0.269

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 (249) hide show
  1. package/dist/browser-ext/dist/assets/{auth-D_IL6naL.js → auth-cwEj8rFb.js} +140 -29
  2. package/dist/browser-ext/dist/assets/sidepanel-C86O7q5Y.css +299 -0
  3. package/dist/browser-ext/dist/background.js +2 -2
  4. package/dist/browser-ext/dist/sidepanel.html +2 -2
  5. package/dist/browser-ext/dist/sidepanel.js +9501 -427
  6. package/dist/browser-ext/manifest.json +1 -1
  7. package/dist/extensions/telegram/xopc.extension.json +1 -1
  8. package/dist/gateway/static/root/assets/{activity-store-Bhyy6ENz.js → activity-store-DcwCSY6s.js} +1 -1
  9. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-ZrSAMchm.js → agent-avatar-dicebear-D0NBOWC4.js} +1 -1
  10. package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-DiNFN8qS.js → agent-defaults-settings-panel-qKCezlBg.js} +1 -1
  11. package/dist/gateway/static/root/assets/agents-BMhnZKhP.js +1 -0
  12. package/dist/gateway/static/root/assets/{api-B2y7ZjZk.js → api-eaPO-mdr.js} +1 -1
  13. package/dist/gateway/static/root/assets/{app-management-settings-panel-D-L6yjS7.js → app-management-settings-panel-E3xm2teY.js} +1 -1
  14. package/dist/gateway/static/root/assets/{appearance-settings-BW5eb53j.js → appearance-settings-CiZOjgls.js} +1 -1
  15. package/dist/gateway/static/root/assets/apps-page-DduJDWGY.js +1 -0
  16. package/dist/gateway/static/root/assets/{archive-plugin-DwXvu1p9.js → archive-plugin-D09yo_Hc.js} +1 -1
  17. package/dist/gateway/static/root/assets/{attachment-load-DqU2BYBp.js → attachment-load-CNYb8Qru.js} +1 -1
  18. package/dist/gateway/static/root/assets/{automations-page-C7qoj9Sd.js → automations-page-DsrfW5ii.js} +1 -1
  19. package/dist/gateway/static/root/assets/automations-workspace-X7hNHCjW.js +6 -0
  20. package/dist/gateway/static/root/assets/{binary-plugins-CfplDak2.js → binary-plugins-OWlaGqlY.js} +1 -1
  21. package/dist/gateway/static/root/assets/{block-editor-CzLs38ru.js → block-editor-CVND3M6r.js} +3 -3
  22. package/dist/gateway/static/root/assets/{browser-automation-inputs-s5I78Iko.js → browser-automation-inputs-D7IzVK_J.js} +1 -1
  23. package/dist/gateway/static/root/assets/{browser-automations-page-_SKi8s9b.js → browser-automations-page-CQ6cCpIv.js} +2 -2
  24. package/dist/gateway/static/root/assets/browser-settings-page-BZ7nK_pN.js +8 -0
  25. package/dist/gateway/static/root/assets/capabilities-settings-panel-BfKvJO1C.js +7 -0
  26. package/dist/gateway/static/root/assets/channels-settings-D1UDxJuA.js +1 -0
  27. package/dist/gateway/static/root/assets/{channels-status-swr-_OsWr_vS.js → channels-status-swr-D4JrgJKa.js} +1 -1
  28. package/dist/gateway/static/root/assets/{chat-terminal-dock-snvAu3hJ.js → chat-terminal-dock-BUjnhT7C.js} +2 -2
  29. package/dist/gateway/static/root/assets/connectors-page-C2nuqs_O.js +2 -0
  30. package/dist/gateway/static/root/assets/{cron-expression-BhGZSbT6.js → cron-expression-DlyRIyUn.js} +1 -1
  31. package/dist/gateway/static/root/assets/{date-picker-Cep5f9b-.js → date-picker-CU-ij_yE.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dependency-picker-BzSEBQku.js → dependency-picker-Z6Nf0Wjq.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-BwX_6Gah.js → desktop-pet-C0F5Iqnc.js} +1 -1
  34. package/dist/gateway/static/root/assets/{desktop-pet-settings-WrbVsU2b.js → desktop-pet-settings-Bj_W6HL1.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-debug-page-BdXSwtAZ.js → extension-debug-page-Ba09EnAn.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-page-I95ukbRb.js → extension-page-C88aGXJs.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-settings-page-8zUisBay.js → extension-settings-page-CMyt0A32.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-config-swr-OObCK8jM.js → gateway-config-swr-bjzk_4hn.js} +1 -1
  39. package/dist/gateway/static/root/assets/gateway-settings-ogv8ZbvG.js +1 -0
  40. package/dist/gateway/static/root/assets/{gateway-startup-retry-D_TxKN_A.js → gateway-startup-retry-DrbIzFyB.js} +1 -1
  41. package/dist/gateway/static/root/assets/{heartbeat-settings-BGQxU-Ug.js → heartbeat-settings-BnrMRKaZ.js} +1 -1
  42. package/dist/gateway/static/root/assets/home-page-CbcJCREd.js +1 -0
  43. package/dist/gateway/static/root/assets/{image-generation-api-fPU9yGsw.js → image-generation-api-CBWU9Ner.js} +1 -1
  44. package/dist/gateway/static/root/assets/index-7PZ6jmhy.css +2 -0
  45. package/dist/gateway/static/root/assets/{index-D2OtD9Wa.js → index-CfyyA9-g.js} +47 -47
  46. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BUe_om99.js → keyboard-shortcuts-settings-B8Z7kKQY.js} +1 -1
  47. package/dist/gateway/static/root/assets/local-app-workbench-page-D5XVZnK1.js +2 -0
  48. package/dist/gateway/static/root/assets/{local-apps-page-BZaLzfms.js → local-apps-page-CLSfzkRp.js} +1 -1
  49. package/dist/gateway/static/root/assets/{locale-store-DFQX9kTl.js → locale-store-BQ2HKTWb.js} +1 -1
  50. package/dist/gateway/static/root/assets/logs-page-CWDU1AGN.js +2 -0
  51. package/dist/gateway/static/root/assets/{management-settings-Duf8w-Bl.js → management-settings-CuFNgQUy.js} +1 -1
  52. package/dist/gateway/static/root/assets/{markdown-view-D-5jHRWg.js → markdown-view-DIcfrLmG.js} +1 -1
  53. package/dist/gateway/static/root/assets/{media-plugins-2-QfzHmg.js → media-plugins-CSv6-xTA.js} +1 -1
  54. package/dist/gateway/static/root/assets/{messages-Dj8QuS6e.js → messages-BRjoarIr.js} +2 -2
  55. package/dist/gateway/static/root/assets/{mobile-pairing-wizard-DRaVIAt1.js → mobile-pairing-wizard-C7d_ztgp.js} +1 -1
  56. package/dist/gateway/static/root/assets/note-detail-panel-D5JuBLyt.js +5 -0
  57. package/dist/gateway/static/root/assets/notes-page-C5-ccCi4.js +8 -0
  58. package/dist/gateway/static/root/assets/{page-tabs-DaZ7QpNO.js → page-tabs-BfV-PQa5.js} +1 -1
  59. package/dist/gateway/static/root/assets/{preview-open-alternatives-CWEuqCmv.js → preview-open-alternatives-DQS7NFpg.js} +1 -1
  60. package/dist/gateway/static/root/assets/proactive-page-fHjPigmx.js +1 -0
  61. package/dist/gateway/static/root/assets/{product-open-page-CIGLPFm7.js → product-open-page-BIhjZLKg.js} +1 -1
  62. package/dist/gateway/static/root/assets/project-detail-page-6v_khvEt.js +1 -0
  63. package/dist/gateway/static/root/assets/projects-page-CCy1aK4V.js +1 -0
  64. package/dist/gateway/static/root/assets/{registry-api-CsZLatKo.js → registry-api-CwveUfe8.js} +1 -1
  65. package/dist/gateway/static/root/assets/remote-access-hub-pkqKRnch.js +1 -0
  66. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CslkSM-m.js → runtime-tools-settings-panel-DMQ0wpNg.js} +2 -2
  67. package/dist/gateway/static/root/assets/{schema-form-B2gvVrBq.js → schema-form-C91g2PRU.js} +1 -1
  68. package/dist/gateway/static/root/assets/sessions-page-Cr4E4cap.js +1 -0
  69. package/dist/gateway/static/root/assets/settings-advanced-gate-D1JRDRyL.js +1 -0
  70. package/dist/gateway/static/root/assets/{settings-form-section-CmlnuSO3.js → settings-form-section-Cem6L49Y.js} +1 -1
  71. package/dist/gateway/static/root/assets/{settings-page-DWWgyelT.js → settings-page-afDUxqlV.js} +1 -1
  72. package/dist/gateway/static/root/assets/{setup-status-panel-CJrN3m1o.js → setup-status-panel-Cc_iP_vv.js} +1 -1
  73. package/dist/gateway/static/root/assets/{share-preview-page-C12oyIKk.js → share-preview-page-CVEVHksg.js} +1 -1
  74. package/dist/gateway/static/root/assets/shares-settings-BrMECMAB.js +1 -0
  75. package/dist/gateway/static/root/assets/skill-reload-api-DuqIDYjc.js +1 -0
  76. package/dist/gateway/static/root/assets/{skills-page-yhW7LLqk.js → skills-page-CNrq1W6C.js} +1 -1
  77. package/dist/gateway/static/root/assets/{skills-page.utils-FaTlq8t-.js → skills-page.utils-D1wGfm22.js} +1 -1
  78. package/dist/gateway/static/root/assets/{system-settings-panel-CMrkoJLN.js → system-settings-panel-BLE8PxWE.js} +1 -1
  79. package/dist/gateway/static/root/assets/task-detail-page-m0oXUKl2.js +1 -0
  80. package/dist/gateway/static/root/assets/{theme-store-zRT6vaZc.js → theme-store-BejLVjIT.js} +1 -1
  81. package/dist/gateway/static/root/assets/{tunnel-api-C2tAZaJz.js → tunnel-api-Dur80zSQ.js} +1 -1
  82. package/dist/gateway/static/root/assets/{use-autosave-BsDRt4QI.js → use-autosave-DmgEA8Qb.js} +1 -1
  83. package/dist/gateway/static/root/assets/user-model-page-Dl10D_5q.js +2 -0
  84. package/dist/gateway/static/root/assets/{voice-api-key-field-CS5heYMP.js → voice-api-key-field-sZ0J83SF.js} +1 -1
  85. package/dist/gateway/static/root/assets/{voice-config-api-DpJEu2RQ.js → voice-config-api-BEbz3avx.js} +1 -1
  86. package/dist/gateway/static/root/assets/{work-discovery-overlay-BeSz5Th5.js → work-discovery-overlay-BXnAlbmO.js} +1 -1
  87. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BkwFey0a.js +3 -0
  88. package/dist/gateway/static/root/assets/workflows-page-CswgoIFU.js +6 -0
  89. package/dist/gateway/static/root/index.html +10 -10
  90. package/dist/gateway/static/root/notification-sw.js +15 -0
  91. package/dist/package.js +1 -1
  92. package/dist/packages/gateway-contract/src/notifications.js +15 -1
  93. package/dist/packages/gateway-contract/src/proactive.js +104 -0
  94. package/dist/packages/realtime-protocol/src/voice.js +2 -1
  95. package/dist/src/agent/agent-manager.js +4 -4
  96. package/dist/src/agent/background-review/run-background-review.js +1 -1
  97. package/dist/src/agent/embedded/model-runtime.js +1 -1
  98. package/dist/src/agent/embedded/run-for-session.js +1 -1
  99. package/dist/src/agent/image/tool-model-config.js +1 -1
  100. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +1 -1
  101. package/dist/src/agent/service.js +2 -2
  102. package/dist/src/agent/session/session-inspector.js +1 -1
  103. package/dist/src/agent/skills/hub-lock.js +1 -1
  104. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  105. package/dist/src/agent/workflow/subagent-runner.d.ts +1 -0
  106. package/dist/src/agent/workflow/subagent-runner.js +2 -2
  107. package/dist/src/ai-assist/text-assist.js +1 -1
  108. package/dist/src/auth/credentials.js +2 -2
  109. package/dist/src/auth/oauth/xopc-cloud.js +1 -1
  110. package/dist/src/auth/profiles/store.js +1 -1
  111. package/dist/src/auth/sync-provider-auth.js +2 -2
  112. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  113. package/dist/src/browser/runtime/browser-runtime.js +3 -2
  114. package/dist/src/cli/commands/connectors.js +1 -1
  115. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  116. package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
  117. package/dist/src/cli/commands/models.js +1 -1
  118. package/dist/src/config/index.js +4 -4
  119. package/dist/src/config/loader.js +2 -2
  120. package/dist/src/config/models-json.js +1 -1
  121. package/dist/src/connectors/connected-source-ingestion.js +1 -1
  122. package/dist/src/connectors/connection-recovery-service.js +1 -1
  123. package/dist/src/connectors/health.js +1 -1
  124. package/dist/src/extensions/lockfile.js +1 -1
  125. package/dist/src/gateway/agents-admin.js +1 -1
  126. package/dist/src/gateway/file-path-classifier.js +1 -1
  127. package/dist/src/gateway/heartbeat/service.js +1 -1
  128. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  129. package/dist/src/gateway/hono/routes/capabilities.js +1 -1
  130. package/dist/src/gateway/hono/routes/connectors.js +1 -1
  131. package/dist/src/gateway/hono/routes/index.js +0 -2
  132. package/dist/src/gateway/hono/routes/lazy-bundles.js +12 -0
  133. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  134. package/dist/src/gateway/hono/routes/models.js +1 -1
  135. package/dist/src/gateway/hono/routes/proactive-control.d.ts +3 -0
  136. package/dist/src/gateway/hono/routes/proactive-control.js +161 -0
  137. package/dist/src/gateway/hono/routes/proactive.d.ts +1 -1
  138. package/dist/src/gateway/hono/routes/proactive.js +12 -5
  139. package/dist/src/gateway/hono/routes/voice.js +1 -1
  140. package/dist/src/gateway/security/gateway-scopes.js +5 -0
  141. package/dist/src/gateway/service/config-coordinator.js +1 -1
  142. package/dist/src/gateway/service.d.ts +0 -1
  143. package/dist/src/gateway/service.js +28 -30
  144. package/dist/src/heartbeat/index.js +1 -1
  145. package/dist/src/notifications/planner.js +4 -3
  146. package/dist/src/notifications/proactive-channel.d.ts +8 -0
  147. package/dist/src/notifications/proactive-channel.js +57 -0
  148. package/dist/src/notifications/proactive-policy.d.ts +3 -0
  149. package/dist/src/notifications/proactive-policy.js +32 -0
  150. package/dist/src/notifications/service.d.ts +78 -0
  151. package/dist/src/notifications/service.js +71 -13
  152. package/dist/src/notifications/store.d.ts +2 -0
  153. package/dist/src/notifications/store.js +8 -1
  154. package/dist/src/notifications/web-push.d.ts +19 -0
  155. package/dist/src/notifications/web-push.js +182 -0
  156. package/dist/src/proactive/actions/service.js +10 -2
  157. package/dist/src/proactive/actions/workflow.d.ts +15 -0
  158. package/dist/src/proactive/actions/workflow.js +88 -0
  159. package/dist/src/proactive/execution/agent-executor.d.ts +5 -0
  160. package/dist/src/proactive/execution/agent-executor.js +21 -0
  161. package/dist/src/proactive/execution/authorization.d.ts +3 -0
  162. package/dist/src/proactive/execution/authorization.js +23 -0
  163. package/dist/src/proactive/execution/context.js +2 -11
  164. package/dist/src/proactive/execution/insight.d.ts +7 -0
  165. package/dist/src/proactive/execution/insight.js +33 -2
  166. package/dist/src/proactive/execution/repository.d.ts +2 -0
  167. package/dist/src/proactive/execution/repository.js +38 -4
  168. package/dist/src/proactive/execution/types.d.ts +5 -0
  169. package/dist/src/proactive/execution/worker.js +38 -7
  170. package/dist/src/proactive/inbox/cards.d.ts +21 -0
  171. package/dist/src/proactive/inbox/cards.js +237 -0
  172. package/dist/src/proactive/inbox/delivery.d.ts +6 -0
  173. package/dist/src/proactive/inbox/delivery.js +52 -0
  174. package/dist/src/proactive/inbox/digest.d.ts +8 -0
  175. package/dist/src/proactive/inbox/digest.js +112 -0
  176. package/dist/src/proactive/inbox/lifecycle.d.ts +4 -0
  177. package/dist/src/proactive/inbox/lifecycle.js +58 -0
  178. package/dist/src/proactive/inbox/notification-policy.d.ts +1 -0
  179. package/dist/src/proactive/inbox/notification-policy.js +20 -0
  180. package/dist/src/proactive/inbox/repository.d.ts +1 -0
  181. package/dist/src/proactive/inbox/repository.js +68 -11
  182. package/dist/src/proactive/inbox/types.d.ts +9 -1
  183. package/dist/src/proactive/inbox/worker.js +9 -3
  184. package/dist/src/proactive/index.js +1 -1
  185. package/dist/src/proactive/maintenance.js +7 -0
  186. package/dist/src/proactive/metrics.d.ts +10 -0
  187. package/dist/src/proactive/metrics.js +27 -0
  188. package/dist/src/proactive/policy/presence.d.ts +2 -0
  189. package/dist/src/proactive/policy/presence.js +27 -0
  190. package/dist/src/proactive/policy/service.d.ts +53 -0
  191. package/dist/src/proactive/policy/service.js +122 -0
  192. package/dist/src/proactive/routing/matcher.js +3 -2
  193. package/dist/src/proactive/scenarios/control.d.ts +90 -0
  194. package/dist/src/proactive/scenarios/control.js +109 -0
  195. package/dist/src/proactive/scenarios/preview.d.ts +13 -0
  196. package/dist/src/proactive/scenarios/preview.js +81 -0
  197. package/dist/src/proactive/scenarios/prompt-composer.js +2 -2
  198. package/dist/src/proactive/scenarios/repository.js +5 -1
  199. package/dist/src/proactive/temporal/schedule.d.ts +3 -0
  200. package/dist/src/proactive/temporal/schedule.js +67 -0
  201. package/dist/src/proactive/temporal/worker.js +8 -4
  202. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  203. package/dist/src/providers/index.js +2 -2
  204. package/dist/src/providers/model-registry.js +1 -1
  205. package/dist/src/providers/register-runtime-providers.js +1 -1
  206. package/dist/src/storage/sqlite/migrations/159_proactive_controls.sql +68 -0
  207. package/dist/src/storage/sqlite/migrations/160_proactive_web_push.sql +27 -0
  208. package/dist/src/storage/sqlite/migrations/161_proactive_delivery_and_lifecycle.sql +51 -0
  209. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  210. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  211. package/dist/src/storage/sqlite/migrations/runner.ts +1 -1
  212. package/dist/src/storage/sqlite/schema.js +1 -1
  213. package/dist/src/tui/tui-startup-resources.js +2 -2
  214. package/dist/src/tui/tui.js +1 -1
  215. package/dist/src/voice/realtime/runtime.d.ts +2 -1
  216. package/dist/src/voice/realtime/runtime.js +21 -5
  217. package/dist/src/work-discovery/service.js +1 -1
  218. package/dist/src/workflows/domain/run.d.ts +1 -0
  219. package/dist/src/workflows/index.js +2 -2
  220. package/dist/src/workflows/service/workflow-run-service.d.ts +3 -0
  221. package/dist/src/workflows/service/workflow-run-service.js +27 -6
  222. package/dist/src/workflows/service/workflow-run-service.types.d.ts +1 -0
  223. package/package.json +3 -1
  224. package/dist/browser-ext/dist/assets/sidepanel-CEPaVLjr.css +0 -155
  225. package/dist/gateway/static/root/assets/agents-Bu6Hf59K.js +0 -1
  226. package/dist/gateway/static/root/assets/apps-page-CiQIdz3N.js +0 -1
  227. package/dist/gateway/static/root/assets/automations-workspace-CIARTLHO.js +0 -6
  228. package/dist/gateway/static/root/assets/browser-settings-page-DTdx66sX.js +0 -8
  229. package/dist/gateway/static/root/assets/capabilities-settings-panel-Ck9U0Olx.js +0 -7
  230. package/dist/gateway/static/root/assets/channels-settings-I_vDpbnl.js +0 -1
  231. package/dist/gateway/static/root/assets/connectors-page-BmKTnzo1.js +0 -2
  232. package/dist/gateway/static/root/assets/gateway-settings-DGj5b9Yv.js +0 -1
  233. package/dist/gateway/static/root/assets/home-page-BZPpK0A3.js +0 -1
  234. package/dist/gateway/static/root/assets/index-CRJrO4GI.css +0 -2
  235. package/dist/gateway/static/root/assets/local-app-workbench-page-CbQnffS9.js +0 -2
  236. package/dist/gateway/static/root/assets/logs-page-WWCHqW_x.js +0 -2
  237. package/dist/gateway/static/root/assets/note-detail-panel-BT-fWGxX.js +0 -5
  238. package/dist/gateway/static/root/assets/notes-page-C4705PzN.js +0 -8
  239. package/dist/gateway/static/root/assets/project-detail-page-BZegJ6an.js +0 -1
  240. package/dist/gateway/static/root/assets/projects-page-B7hUHeLI.js +0 -1
  241. package/dist/gateway/static/root/assets/remote-access-hub-BE9hZpdh.js +0 -1
  242. package/dist/gateway/static/root/assets/sessions-page-DmAAPMo1.js +0 -1
  243. package/dist/gateway/static/root/assets/settings-advanced-gate-CvBocGDA.js +0 -1
  244. package/dist/gateway/static/root/assets/shares-settings-D4BtSiLq.js +0 -1
  245. package/dist/gateway/static/root/assets/skill-reload-api-CzKGn056.js +0 -1
  246. package/dist/gateway/static/root/assets/task-detail-page-BUaO62cy.js +0 -1
  247. package/dist/gateway/static/root/assets/user-model-page-Dy8h1SSJ.js +0 -2
  248. package/dist/gateway/static/root/assets/workflow-run-setup-panel-BebW0CDK.js +0 -3
  249. package/dist/gateway/static/root/assets/workflows-page-CU8jFgPF.js +0 -6
@@ -0,0 +1,68 @@
1
+ CREATE TABLE proactive_preferences (
2
+ workspace_id TEXT PRIMARY KEY,
3
+ preferences_json TEXT NOT NULL,
4
+ revision INTEGER NOT NULL DEFAULT 1
5
+ );
6
+ CREATE TABLE proactive_subscription_settings (
7
+ subscription_id TEXT PRIMARY KEY REFERENCES proactive_scenario_subscriptions(subscription_id) ON DELETE CASCADE,
8
+ settings_json TEXT NOT NULL,
9
+ revision INTEGER NOT NULL DEFAULT 1
10
+ );
11
+ CREATE TABLE proactive_schedule_state (
12
+ subscription_id TEXT PRIMARY KEY REFERENCES proactive_scenario_subscriptions(subscription_id) ON DELETE CASCADE,
13
+ next_due_at TEXT NOT NULL,
14
+ last_checked_at TEXT,
15
+ last_fingerprint TEXT
16
+ );
17
+ CREATE TABLE proactive_notification_budget (
18
+ dedupe_key TEXT PRIMARY KEY,
19
+ workspace_id TEXT NOT NULL,
20
+ local_day TEXT NOT NULL,
21
+ created_at TEXT NOT NULL
22
+ );
23
+ CREATE INDEX proactive_budget_day ON proactive_notification_budget(workspace_id, local_day);
24
+ ALTER TABLE proactive_runs ADD COLUMN outcome_reason TEXT;
25
+ ALTER TABLE proactive_runs ADD COLUMN policy_revision INTEGER NOT NULL DEFAULT 0;
26
+ ALTER TABLE proactive_inbox_items ADD COLUMN revision INTEGER NOT NULL DEFAULT 1;
27
+ ALTER TABLE proactive_inbox_items ADD COLUMN notification_revision INTEGER NOT NULL DEFAULT 1;
28
+ ALTER TABLE proactive_inbox_items ADD COLUMN expires_at TEXT;
29
+ CREATE TABLE proactive_card_changes (
30
+ sequence INTEGER PRIMARY KEY AUTOINCREMENT,
31
+ workspace_id TEXT NOT NULL,
32
+ inbox_item_id TEXT NOT NULL,
33
+ deleted INTEGER NOT NULL DEFAULT 0
34
+ );
35
+ CREATE TRIGGER proactive_card_created AFTER INSERT ON proactive_inbox_items BEGIN
36
+ INSERT INTO proactive_card_changes(inbox_item_id, workspace_id)
37
+ SELECT NEW.inbox_item_id, s.workspace_id FROM proactive_insights x JOIN proactive_scenario_subscriptions s USING(subscription_id) WHERE x.insight_id = NEW.insight_id;
38
+ END;
39
+ CREATE TRIGGER proactive_card_updated AFTER UPDATE ON proactive_inbox_items
40
+ WHEN NEW.revision = OLD.revision BEGIN
41
+ UPDATE proactive_inbox_items SET revision = OLD.revision + 1 WHERE inbox_item_id = NEW.inbox_item_id;
42
+ INSERT INTO proactive_card_changes(inbox_item_id, workspace_id)
43
+ SELECT NEW.inbox_item_id, s.workspace_id FROM proactive_insights x JOIN proactive_scenario_subscriptions s USING(subscription_id) WHERE x.insight_id = NEW.insight_id;
44
+ END;
45
+ CREATE TRIGGER proactive_card_deleted AFTER DELETE ON proactive_inbox_items BEGIN
46
+ INSERT INTO proactive_card_changes(inbox_item_id, workspace_id, deleted)
47
+ SELECT OLD.inbox_item_id, workspace_id, 1 FROM proactive_card_changes WHERE inbox_item_id = OLD.inbox_item_id ORDER BY sequence DESC LIMIT 1;
48
+ END;
49
+ CREATE TRIGGER proactive_insight_card_updated AFTER UPDATE OF title, summary, decision_json, action_status, action_result_json, action_error ON proactive_insights BEGIN
50
+ UPDATE proactive_inbox_items SET updated_at = NEW.action_updated_at WHERE insight_id = NEW.insight_id AND NEW.action_updated_at IS NOT NULL;
51
+ END;
52
+ CREATE TABLE proactive_card_actions (
53
+ idempotency_key TEXT PRIMARY KEY,
54
+ inbox_item_id TEXT NOT NULL REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE,
55
+ request_json TEXT NOT NULL,
56
+ response_json TEXT NOT NULL
57
+ );
58
+
59
+ INSERT INTO proactive_card_changes(inbox_item_id, workspace_id)
60
+ SELECT i.inbox_item_id, s.workspace_id FROM proactive_inbox_items i JOIN proactive_insights x USING(insight_id) JOIN proactive_scenario_subscriptions s USING(subscription_id);
61
+
62
+ ALTER TABLE proactive_runs ADD COLUMN subscription_revision INTEGER NOT NULL DEFAULT 0;
63
+ ALTER TABLE proactive_runs ADD COLUMN policy_snapshot_json TEXT;
64
+
65
+ CREATE TRIGGER proactive_subscription_enabled_changed AFTER UPDATE OF enabled ON proactive_scenario_subscriptions
66
+ WHEN NEW.enabled <> OLD.enabled BEGIN
67
+ UPDATE proactive_subscription_settings SET revision = revision + 1 WHERE subscription_id = NEW.subscription_id;
68
+ END;
@@ -0,0 +1,27 @@
1
+ CREATE TABLE proactive_web_push_keys (
2
+ id INTEGER PRIMARY KEY CHECK (id = 1),
3
+ public_key TEXT NOT NULL,
4
+ private_key TEXT NOT NULL
5
+ );
6
+ CREATE TABLE proactive_web_push_subscriptions (
7
+ id TEXT PRIMARY KEY,
8
+ workspace_id TEXT NOT NULL,
9
+ endpoint TEXT NOT NULL UNIQUE,
10
+ subscription_json TEXT NOT NULL,
11
+ language TEXT NOT NULL,
12
+ created_at TEXT NOT NULL
13
+ );
14
+ CREATE TABLE proactive_web_push_deliveries (
15
+ notification_id TEXT NOT NULL REFERENCES notification_events(event_id) ON DELETE CASCADE,
16
+ subscription_id TEXT NOT NULL REFERENCES proactive_web_push_subscriptions(id) ON DELETE CASCADE,
17
+ inbox_item_id TEXT NOT NULL,
18
+ notification_revision INTEGER NOT NULL DEFAULT 1,
19
+ status TEXT NOT NULL DEFAULT 'pending' CHECK (status IN ('pending', 'sending', 'sent', 'failed')),
20
+ attempt INTEGER NOT NULL DEFAULT 0,
21
+ next_attempt_at INTEGER NOT NULL,
22
+ lease_until INTEGER,
23
+ last_error TEXT,
24
+ PRIMARY KEY(notification_id, subscription_id)
25
+ );
26
+
27
+ CREATE INDEX proactive_web_push_due_idx ON proactive_web_push_deliveries(status, next_attempt_at);
@@ -0,0 +1,51 @@
1
+ ALTER TABLE proactive_inbox_items ADD COLUMN withdrawn_at TEXT;
2
+ ALTER TABLE proactive_inbox_items ADD COLUMN correlation_key TEXT;
3
+ CREATE INDEX proactive_card_correlation ON proactive_inbox_items(correlation_key);
4
+ CREATE TABLE proactive_presence (
5
+ workspace_id TEXT NOT NULL, client_id TEXT NOT NULL, surface TEXT NOT NULL,
6
+ expires_at INTEGER NOT NULL, PRIMARY KEY(workspace_id, client_id)
7
+ );
8
+ CREATE TABLE proactive_digest_queue (
9
+ inbox_item_id TEXT PRIMARY KEY REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE,
10
+ workspace_id TEXT NOT NULL, notification_revision INTEGER NOT NULL,
11
+ mode TEXT NOT NULL, due_at TEXT NOT NULL, consumed_at TEXT
12
+ );
13
+ CREATE INDEX proactive_digest_due ON proactive_digest_queue(consumed_at, due_at);
14
+ CREATE TABLE proactive_digests (
15
+ digest_id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, occurrence_key TEXT NOT NULL,
16
+ created_at TEXT NOT NULL, notification_id TEXT, UNIQUE(workspace_id, occurrence_key)
17
+ );
18
+ CREATE TABLE proactive_digest_members (
19
+ digest_id TEXT NOT NULL REFERENCES proactive_digests(digest_id) ON DELETE CASCADE,
20
+ inbox_item_id TEXT NOT NULL REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE,
21
+ notification_revision INTEGER NOT NULL, PRIMARY KEY(digest_id, inbox_item_id)
22
+ );
23
+ CREATE TABLE proactive_channel_deliveries (
24
+ notification_id TEXT PRIMARY KEY REFERENCES notification_events(event_id) ON DELETE CASCADE,
25
+ workspace_id TEXT NOT NULL, target_json TEXT NOT NULL,
26
+ status TEXT NOT NULL DEFAULT 'pending', attempt INTEGER NOT NULL DEFAULT 0,
27
+ next_attempt_at INTEGER NOT NULL, lease_until INTEGER, provider_message_id TEXT, last_error TEXT
28
+ );
29
+ CREATE TABLE proactive_preview_runs (
30
+ id TEXT PRIMARY KEY, subscription_id TEXT NOT NULL, created_at TEXT NOT NULL,
31
+ completed_at TEXT, status TEXT NOT NULL, error TEXT
32
+ );
33
+ CREATE TABLE proactive_delivery_decisions (
34
+ notification_key TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, outcome TEXT NOT NULL, created_at TEXT NOT NULL
35
+ );
36
+ CREATE TABLE proactive_card_review_state (
37
+ inbox_item_id TEXT PRIMARY KEY REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE,
38
+ checked_at TEXT NOT NULL
39
+ );
40
+ CREATE TABLE proactive_workflow_links (
41
+ inbox_item_id TEXT PRIMARY KEY REFERENCES proactive_inbox_items(inbox_item_id) ON DELETE CASCADE,
42
+ definition_id TEXT NOT NULL, agent_id TEXT NOT NULL, attempt_key TEXT NOT NULL,
43
+ run_id TEXT, session_key TEXT, status TEXT NOT NULL, lease_until INTEGER, error TEXT
44
+ );
45
+ CREATE TABLE proactive_push_probes (
46
+ id TEXT PRIMARY KEY, workspace_id TEXT NOT NULL, subscription_id TEXT NOT NULL,
47
+ status TEXT NOT NULL, created_at INTEGER NOT NULL, opened_at INTEGER, error TEXT
48
+ );
49
+ ALTER TABLE proactive_runs ADD COLUMN input_tokens INTEGER;
50
+ ALTER TABLE proactive_runs ADD COLUMN output_tokens INTEGER;
51
+ ALTER TABLE proactive_runs ADD COLUMN estimated_cost_usd REAL;
@@ -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 = 158;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 161;
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 = 158;
15
+ const XOPC_DB_SCHEMA_VERSION = 161;
16
16
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
17
17
  function backupBeforeTaskCutover(db, databasePath) {
18
18
  db.exec("PRAGMA wal_checkpoint(FULL)");
@@ -57,7 +57,7 @@ function applySingleMigration(db, migration) {
57
57
  * Each step runs in its own transaction and updates schema_meta on success.
58
58
  */
59
59
  function applyPendingMigrations(db, options = {}) {
60
- const targetVersion = options.targetVersion ?? 158;
60
+ const targetVersion = options.targetVersion ?? 161;
61
61
  let currentVersion = readSchemaVersion(db);
62
62
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
63
63
  if (currentVersion >= targetVersion) return currentVersion;
@@ -94,7 +94,7 @@ function applyPendingMigrations(db, options = {}) {
94
94
  }
95
95
  /** Inspect schema version without mutating the database. */
96
96
  function inspectSchemaMigrationStatus(db, options = {}) {
97
- const appVersion = options.targetVersion ?? 158;
97
+ const appVersion = options.targetVersion ?? 161;
98
98
  const dbVersion = readSchemaVersion(db);
99
99
  if (dbVersion > appVersion) return {
100
100
  dbVersion,
@@ -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 = 158;
22
+ export const XOPC_DB_SCHEMA_VERSION = 161;
23
23
 
24
24
  const MODULE_DIR = dirname(fileURLToPath(import.meta.url));
25
25
 
@@ -32,7 +32,7 @@ function ensureXopcDatabaseSchema(db, options = {}) {
32
32
  currentVersion = 11;
33
33
  }
34
34
  applyPendingMigrations(db, {
35
- targetVersion: 158,
35
+ targetVersion: 161,
36
36
  databasePath: options.databasePath
37
37
  });
38
38
  }
@@ -1,13 +1,13 @@
1
1
  import { resolveStateDir } from "../config/paths-state.js";
2
- import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir } from "../config/paths.js";
3
2
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
3
+ import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir } from "../config/paths.js";
4
4
  import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
5
5
  import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
6
6
  import { loadSkills } from "../agent/skills/index.js";
7
7
  import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
8
- import { listConnectorInstances } from "../connectors/instances.js";
9
8
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
10
9
  import "../config/index.js";
10
+ import { listConnectorInstances } from "../connectors/instances.js";
11
11
  import { basename } from "node:path";
12
12
  //#region src/tui/tui-startup-resources.ts
13
13
  init_paths();
@@ -2,10 +2,10 @@ import { version } from "../../package.js";
2
2
  import { resolveStateDir, resolveXopcDatabasePath } from "../config/paths-state.js";
3
3
  import { parseAgentSessionKey } from "../routing/session-key-utils.js";
4
4
  import { init_agent_session_key, normalizeAgentId } from "../routing/agent-session-key.js";
5
+ import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
5
6
  import { init_paths } from "../config/paths.js";
6
7
  import { loadConfig } from "../config/loader.js";
7
8
  import { getAllModels, getAllProviders, getApiKey, init_providers, isProviderConfiguredSync } from "../providers/index.js";
8
- import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
9
9
  import { ProjectTrustStore, hasTrustRequiringProjectResources } from "../project-trust/trust-store.js";
10
10
  import { renderWorkflowFinalSummary, renderWorkflowPanel } from "../agent/workflow/snapshot.js";
11
11
  import { ensureStarterAgentsInitialized } from "../agent/starter-agents.js";
@@ -19,6 +19,7 @@ export declare class VoiceRealtimeRuntime {
19
19
  private readonly preauthBudget;
20
20
  private readonly socketsByPrincipal;
21
21
  private readonly conversationReservations;
22
+ private readonly activeSessions;
22
23
  private closed;
23
24
  constructor(options: VoiceRealtimeRuntimeOptions);
24
25
  private prepareSession;
@@ -26,7 +27,7 @@ export declare class VoiceRealtimeRuntime {
26
27
  createSession(request: CreateVoiceSessionRequest, principalId: string, now?: number): Promise<CreateVoiceSessionResponse>;
27
28
  handleUpgrade(req: IncomingMessage, socket: Socket, head: Buffer): boolean;
28
29
  hasConversation(sessionKey: string): boolean;
29
- cancelSession(sessionId: string, ticket: string, principalId: string): boolean;
30
+ cancelSession(sessionId: string, ticket: string, principalId: string): Promise<boolean>;
30
31
  close(): void;
31
32
  private releaseConversationReservation;
32
33
  private consumeTicket;
@@ -147,6 +147,7 @@ var VoiceRealtimeRuntime = class {
147
147
  preauthBudget = createPreauthConnectionBudget();
148
148
  socketsByPrincipal = /* @__PURE__ */ new Map();
149
149
  conversationReservations = /* @__PURE__ */ new Map();
150
+ activeSessions = /* @__PURE__ */ new Map();
150
151
  closed = false;
151
152
  constructor(options) {
152
153
  this.options = options;
@@ -263,7 +264,9 @@ var VoiceRealtimeRuntime = class {
263
264
  };
264
265
  }
265
266
  handleUpgrade(req, socket, head) {
266
- if (new URL(req.url ?? "/", "http://gateway.local").pathname !== "/api/voice/realtime/v3/ws") return false;
267
+ const url = new URL(req.url ?? "/", "http://gateway.local");
268
+ const pathAndQuery = `${url.pathname}${url.search}`;
269
+ if (url.pathname !== "/api/voice/realtime/v3/ws" && pathAndQuery !== "/api/realtime/v1/ws?transport=voice-v3") return false;
267
270
  if (this.closed || this.wss.clients.size >= MAX_CONNECTIONS) {
268
271
  socket.destroy();
269
272
  return true;
@@ -285,12 +288,17 @@ var VoiceRealtimeRuntime = class {
285
288
  this.pruneTickets(Date.now());
286
289
  return this.conversationReservations.has(sessionKey);
287
290
  }
288
- cancelSession(sessionId, ticket, principalId) {
291
+ async cancelSession(sessionId, ticket, principalId) {
289
292
  const key = ticketKey(ticket);
290
293
  const claim = this.tickets.get(key);
291
- if (!claim || claim.sessionId !== sessionId || claim.principalId !== principalId) return false;
292
- this.tickets.delete(key);
293
- this.releaseConversationReservation(claim);
294
+ if (claim && claim.sessionId === sessionId && claim.principalId === principalId) {
295
+ this.tickets.delete(key);
296
+ this.releaseConversationReservation(claim);
297
+ return true;
298
+ }
299
+ const active = this.activeSessions.get(sessionId);
300
+ if (!active || active.principalId !== principalId || active.ticketKey !== key) return false;
301
+ await active.shutdown();
294
302
  return true;
295
303
  }
296
304
  close() {
@@ -298,6 +306,7 @@ var VoiceRealtimeRuntime = class {
298
306
  this.closed = true;
299
307
  for (const client of this.wss.clients) client.close(1001, "Gateway stopping");
300
308
  this.tickets.clear();
309
+ this.activeSessions.clear();
301
310
  this.wss.close();
302
311
  this.socketsByPrincipal.clear();
303
312
  this.conversationReservations.clear();
@@ -362,6 +371,7 @@ var VoiceRealtimeRuntime = class {
362
371
  const shutdown = async (reason, notify) => {
363
372
  if (closed) return;
364
373
  closed = true;
374
+ if (claim && this.activeSessions.get(claim.sessionId)?.socket === socket) this.activeSessions.delete(claim.sessionId);
365
375
  unsubscribeMemory?.();
366
376
  unsubscribeSession?.();
367
377
  clearTimeout(startTimer);
@@ -418,6 +428,12 @@ var VoiceRealtimeRuntime = class {
418
428
  return;
419
429
  }
420
430
  claim = consumed;
431
+ this.activeSessions.set(consumed.sessionId, {
432
+ principalId: consumed.principalId,
433
+ socket,
434
+ ticketKey: ticketKey(message.payload.ticket),
435
+ shutdown: () => shutdown("cancelled", false)
436
+ });
421
437
  principalSockets.add(socket);
422
438
  this.socketsByPrincipal.set(consumed.principalId, principalSockets);
423
439
  clearTimeout(startTimer);
@@ -6,12 +6,12 @@ import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
6
6
  import { buildSessionKey, init_session_key } from "../routing/session-key.js";
7
7
  import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
8
8
  import { init_providers, resolveModel } from "../providers/index.js";
9
- import { isLocalModelBaseUrl } from "../providers/model-call.js";
10
9
  import { writeKnowledgeItem } from "../knowledge-memory/repository.js";
11
10
  import "../knowledge-memory/index.js";
12
11
  import { createPriorityWindow, createUserGoal } from "../user-model/goals.js";
13
12
  import { getAssertionSlot, getUserAssertion, linkAssertionEvidence, reconcileAssertion, setAssertionStatus } from "../user-model/repository.js";
14
13
  import "../user-model/index.js";
14
+ import { isLocalModelBaseUrl } from "../providers/model-call.js";
15
15
  import { allowsRemoteSourceProcessing } from "../user-context/sources/processing-policy.js";
16
16
  import { analyzeUnderstandingSources, analyzeWorkContext, workDiscoveryResultMarkdown } from "./analyzer.js";
17
17
  import { createUnderstandingSourceRun, getUnderstandingSourceRun, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceGrantPolicies, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
@@ -20,6 +20,7 @@ export interface WorkflowRun {
20
20
  completedAtMs?: number;
21
21
  }
22
22
  export interface WorkflowRunMetadata {
23
+ preparationOnly?: boolean;
23
24
  sessionKey: string;
24
25
  triggerSource: WorkflowRunSource['kind'];
25
26
  agentId?: string;
@@ -10,10 +10,10 @@ import { WorkflowEngine } from "./engine/workflow-engine.js";
10
10
  import "./engine/index.js";
11
11
  import { WorkflowEventStore, createWorkflowEventStore } from "./store/event-store.js";
12
12
  import { WorkflowRunStore, createWorkflowRunStore } from "./store/run-store.js";
13
- import { WorkflowRunService, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, extractWorkflowRunSessionKey, resolveWorkflowReplayTargets } from "./service/workflow-run-service.js";
13
+ import { WorkflowRunService, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, extractWorkflowRunSessionKey, preparationDefinition, resolveWorkflowReplayTargets } from "./service/workflow-run-service.js";
14
14
  import { runViewToSnapshot } from "./service/run-view-to-snapshot.js";
15
15
  import { buildWorkflowRunSessionKey, readWorkflowRunIdFromSessionCustomData } from "./service/workflow-session-key.js";
16
16
  import { WORKFLOW_RUN_LINK_CONTEXT_KIND, WORKFLOW_SESSION_TYPE, WorkflowSessionBridge, formatParentRunLinkText } from "./service/workflow-session-bridge.js";
17
17
  import "./registry/index.js";
18
18
  import { resolveWorkflowRootDir, resolveWorkflowRunArtifactsDir, resolveWorkflowRunDir, resolveWorkflowRunsDir } from "./store/paths.js";
19
- export { CatalogWorkflowDefinitionRegistry, DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, GraphWorkflowRuntime, WORKFLOW_RUN_LINK_CONTEXT_KIND, WORKFLOW_SESSION_TYPE, WorkflowEngine, WorkflowEventStore, WorkflowRunService, WorkflowRunStore, WorkflowSessionBridge, buildWorkflowDefinition, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, buildWorkflowRunSessionKey, createGraphWorkflowRuntime, createWorkflowEventStore, createWorkflowRunStore, deriveWorkflowPhases, extractWorkflowRunSessionKey, formatParentRunLinkText, hashWorkflowStableValue, isTerminalWorkflowRunStatus, normalizeWorkflowDefinitionId, projectWorkflowRunView, readWorkflowRunIdFromSessionCustomData, renderWorkflowTemplate, resolveWorkflowReplayTargets, resolveWorkflowRootDir, resolveWorkflowRunArtifactsDir, resolveWorkflowRunDir, resolveWorkflowRunsDir, runViewToSnapshot, toWorkflowDefinitionTitle, validateWorkflowDefinitionInput, validateWorkflowGraph, validateWorkflowJsonSchema };
19
+ export { CatalogWorkflowDefinitionRegistry, DEFAULT_WORKFLOW_CONCURRENCY, DEFAULT_WORKFLOW_MAX_SUBAGENTS, DEFAULT_WORKFLOW_TIMEOUT_SEC, GraphWorkflowRuntime, WORKFLOW_RUN_LINK_CONTEXT_KIND, WORKFLOW_SESSION_TYPE, WorkflowEngine, WorkflowEventStore, WorkflowRunService, WorkflowRunStore, WorkflowSessionBridge, buildWorkflowDefinition, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, buildWorkflowRunSessionKey, createGraphWorkflowRuntime, createWorkflowEventStore, createWorkflowRunStore, deriveWorkflowPhases, extractWorkflowRunSessionKey, formatParentRunLinkText, hashWorkflowStableValue, isTerminalWorkflowRunStatus, normalizeWorkflowDefinitionId, preparationDefinition, projectWorkflowRunView, readWorkflowRunIdFromSessionCustomData, renderWorkflowTemplate, resolveWorkflowReplayTargets, resolveWorkflowRootDir, resolveWorkflowRunArtifactsDir, resolveWorkflowRunDir, resolveWorkflowRunsDir, runViewToSnapshot, toWorkflowDefinitionTitle, validateWorkflowDefinitionInput, validateWorkflowGraph, validateWorkflowJsonSchema };
@@ -37,6 +37,7 @@ export declare class WorkflowRunService {
37
37
  }
38
38
  export declare function buildWorkflowRunInputEnvelope(input: unknown, goal?: string): WorkflowRunInputEnvelope;
39
39
  export declare function buildWorkflowRunMetadata(params: {
40
+ preparationOnly?: boolean;
40
41
  definition: WorkflowDefinition;
41
42
  agentId: string;
42
43
  taskRunId?: string;
@@ -57,3 +58,5 @@ export declare function resolveWorkflowReplayTargets(view: WorkflowRunView, scop
57
58
  };
58
59
  export declare function buildWorkflowRunDefinitionSnapshot(definition: WorkflowDefinition): WorkflowRunDefinitionSnapshot;
59
60
  export declare function extractWorkflowRunSessionKey(source: WorkflowRunSource): string | null;
61
+ /** Preparation runs can only transform supplied context into a reviewable result. */
62
+ export declare function preparationDefinition(original: WorkflowDefinition): WorkflowDefinition;
@@ -1,7 +1,7 @@
1
1
  import { TaskRunRepository } from "../../tasks/task-run-repository.js";
2
2
  import { getDefaultAgentId, init_resolve_route } from "../../routing/resolve-route.js";
3
- import { init_providers, resolveModel } from "../../providers/index.js";
4
3
  import { extractProfileAgentId, resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
4
+ import { init_providers, resolveModel } from "../../providers/index.js";
5
5
  import { TaskRepository } from "../../tasks/task-repository.js";
6
6
  import { TaskConversationRepository } from "../../tasks/task-conversation-repository.js";
7
7
  import { getProjectWorkspacePathForSession } from "../../projects/workspace.js";
@@ -97,13 +97,14 @@ var WorkflowRunService = class {
97
97
  message: `Workflow "${params.definitionId}" is not allowed for this agent`,
98
98
  httpStatus: 409
99
99
  };
100
- const definition = await this.loadDefinition(params.definitionId);
100
+ let definition = await this.loadDefinition(params.definitionId);
101
101
  if (!definition) return {
102
102
  ok: false,
103
103
  code: "definition_not_found",
104
104
  message: "Workflow definition not found",
105
105
  httpStatus: 404
106
106
  };
107
+ if (params.preparationOnly) definition = preparationDefinition(definition);
107
108
  const connectorPreflight = preflightWorkflowConnectors({
108
109
  definition,
109
110
  config: this.options.service.currentConfig,
@@ -174,7 +175,7 @@ var WorkflowRunService = class {
174
175
  const contextRefs = resolvedContext ? [...resolvedContext.refs, ...passiveContextRefs] : requestedContextRefs;
175
176
  let writebackPolicy;
176
177
  try {
177
- writebackPolicy = resolveWorkflowWritebackPolicy(params.writebackPolicy, {
178
+ writebackPolicy = resolveWorkflowWritebackPolicy(params.preparationOnly ? { targets: [] } : params.writebackPolicy, {
178
179
  projectId,
179
180
  taskId
180
181
  });
@@ -252,6 +253,7 @@ var WorkflowRunService = class {
252
253
  source,
253
254
  metadata: buildWorkflowRunMetadata({
254
255
  definition,
256
+ preparationOnly: params.preparationOnly,
255
257
  agentId: params.agentId,
256
258
  taskRunId: params.taskRunId,
257
259
  projectId,
@@ -299,6 +301,7 @@ var WorkflowRunService = class {
299
301
  return this.startWorkflowRun({
300
302
  agentId: params.agentId,
301
303
  definitionId: existing.run.definitionId,
304
+ preparationOnly: existing.run.metadata?.preparationOnly,
302
305
  taskRunId: existing.run.metadata?.taskRunId,
303
306
  projectId,
304
307
  contextRefs: existing.run.metadata?.contextRefs,
@@ -320,14 +323,18 @@ var WorkflowRunService = class {
320
323
  message: "Workflow run not found",
321
324
  httpStatus: 404
322
325
  };
323
- const definition = await this.loadDefinition(existing.run.definitionId);
326
+ let definition = await this.loadDefinition(existing.run.definitionId);
324
327
  if (!definition) return {
325
328
  ok: false,
326
329
  code: "definition_not_found",
327
330
  message: "Workflow definition not found",
328
331
  httpStatus: 404
329
332
  };
333
+ if (existing.run.metadata?.preparationOnly) definition = preparationDefinition(definition);
330
334
  const targets = resolveWorkflowReplayTargets(existing, params.scope);
335
+ if (existing.run.metadata?.preparationOnly) {
336
+ for (const target of targets.targets) if (target.invocation) target.invocation.toolset = [];
337
+ }
331
338
  if (targets.targets.length === 0) return {
332
339
  ok: false,
333
340
  code: "invalid_state",
@@ -412,6 +419,7 @@ var WorkflowRunService = class {
412
419
  source,
413
420
  metadata: buildWorkflowRunMetadata({
414
421
  definition,
422
+ preparationOnly: existing.run.metadata?.preparationOnly,
415
423
  agentId: params.agentId,
416
424
  taskRunId,
417
425
  projectId,
@@ -637,12 +645,13 @@ function buildWorkflowRunMetadata(params) {
637
645
  taskId,
638
646
  source: params.source
639
647
  });
640
- const writebackPolicy = resolveWorkflowWritebackPolicy(params.writebackPolicy, {
648
+ const writebackPolicy = resolveWorkflowWritebackPolicy(params.preparationOnly ? { targets: [] } : params.writebackPolicy, {
641
649
  projectId,
642
650
  taskId
643
651
  });
644
652
  return {
645
653
  sessionKey: params.sessionKey,
654
+ ...params.preparationOnly ? { preparationOnly: true } : {},
646
655
  triggerSource: params.source.kind,
647
656
  agentId: params.agentId,
648
657
  projectId,
@@ -791,5 +800,17 @@ function isWorkflowRunInputEnvelope(input) {
791
800
  if (!input || typeof input !== "object" || Array.isArray(input)) return false;
792
801
  return "payload" in input || "variables" in input || "context" in input;
793
802
  }
803
+ /** Preparation runs can only transform supplied context into a reviewable result. */
804
+ function preparationDefinition(original) {
805
+ const definition = structuredClone(original);
806
+ for (const node of definition.graph.nodes) if (node.kind === "agent") node.config.toolset = [];
807
+ definition.permissions = {
808
+ tools: [],
809
+ network: false,
810
+ fileSystem: "none"
811
+ };
812
+ definition.connectors = [];
813
+ return definition;
814
+ }
794
815
  //#endregion
795
- export { WorkflowRunService, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, extractWorkflowRunSessionKey, resolveWorkflowReplayTargets };
816
+ export { WorkflowRunService, buildWorkflowRunDefinitionSnapshot, buildWorkflowRunInputEnvelope, buildWorkflowRunMetadata, extractWorkflowRunSessionKey, preparationDefinition, resolveWorkflowReplayTargets };
@@ -1,5 +1,6 @@
1
1
  import type { WorkflowRunInputEnvelope, WorkflowRunContextRef, WorkflowRunReplayScope, WorkflowRunSource, WorkflowRunWritebackPolicy, WorkflowRunView } from '../domain/index.js';
2
2
  export interface StartWorkflowRunServiceParams {
3
+ preparationOnly?: boolean;
3
4
  agentId: string;
4
5
  definitionId: string;
5
6
  taskRunId?: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.267",
3
+ "version": "0.0.269",
4
4
  "description": "Local-first personal AI assistant with reviewable user understanding, durable tasks, workflows, automations, and local or cloud models.",
5
5
  "type": "module",
6
6
  "main": "dist/src/index.js",
@@ -104,6 +104,7 @@
104
104
  "thread-stream": "^4.2.0",
105
105
  "undici": "^8.9.0",
106
106
  "uuid": "^14.0.0",
107
+ "web-push": "^3.6.7",
107
108
  "ws": "^8.21.0",
108
109
  "zod": "^4.4.3"
109
110
  },
@@ -138,6 +139,7 @@
138
139
  "@types/markdown-it": "^14.1.2",
139
140
  "@types/node": "^25.9.1",
140
141
  "@types/qrcode-terminal": "^0.12.2",
142
+ "@types/web-push": "^3.6.4",
141
143
  "@types/ws": "^8.18.1",
142
144
  "@vitejs/plugin-react-swc": "^4.3.1",
143
145
  "cross-env": "^10.1.0",