@xopcai/xopc 0.0.306 → 0.0.308

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 (273) hide show
  1. package/dist/browser-ext/manifest.json +1 -1
  2. package/dist/extensions/telegram/xopc.extension.json +1 -1
  3. package/dist/gateway/static/root/assets/{activity-store-DLtim-_I.js → activity-store-wgSB2HYK.js} +1 -1
  4. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-iQXtiilH.js → agent-avatar-dicebear-dUotwUO6.js} +1 -1
  5. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-C6LflMXr.js +1 -0
  6. package/dist/gateway/static/root/assets/agents-VPDIGRSS.js +1 -0
  7. package/dist/gateway/static/root/assets/{api-DfSU0-lD.js → api-BKHmTb0w.js} +1 -1
  8. package/dist/gateway/static/root/assets/api-DFOlahZv.js +1 -0
  9. package/dist/gateway/static/root/assets/{app-management-settings-panel-BpYFKz7B.js → app-management-settings-panel-zPz0rOND.js} +1 -1
  10. package/dist/gateway/static/root/assets/appearance-settings-DhvhR43G.js +1 -0
  11. package/dist/gateway/static/root/assets/apps-page-Pmslbzzr.js +1 -0
  12. package/dist/gateway/static/root/assets/{archive-plugin-BxOvZ-ZX.js → archive-plugin-BQVZMreT.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-load-B0FzTMAJ.js → attachment-load-CPE-TMPf.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-page-BpXuPaPg.js → automations-page-C4IAy_zF.js} +1 -1
  15. package/dist/gateway/static/root/assets/automations-workspace-Fx5VUJRu.js +6 -0
  16. package/dist/gateway/static/root/assets/{binary-plugins-BP7wfpqy.js → binary-plugins-DgTl7diZ.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-oMLvdnOQ.js → block-editor-CcOVA-Gw.js} +3 -3
  18. package/dist/gateway/static/root/assets/{browser-automation-inputs-DTxSZ00u.js → browser-automation-inputs-BzkJog8e.js} +1 -1
  19. package/dist/gateway/static/root/assets/{browser-automations-page-IbJnwEY4.js → browser-automations-page--zKAgj1k.js} +2 -2
  20. package/dist/gateway/static/root/assets/browser-settings-page-DBms6d35.js +3 -0
  21. package/dist/gateway/static/root/assets/capabilities-settings-panel-epdDWIZy.js +8 -0
  22. package/dist/gateway/static/root/assets/channels-settings-B0bsDtmP.js +1 -0
  23. package/dist/gateway/static/root/assets/{channels-status-swr-D2AmAoty.js → channels-status-swr-B2JwuTjG.js} +1 -1
  24. package/dist/gateway/static/root/assets/{chat-terminal-dock-B-yI3Mi1.js → chat-terminal-dock-BfLd2rIJ.js} +1 -1
  25. package/dist/gateway/static/root/assets/{computer-settings-page-CWx_jnng.js → computer-settings-page-Ckgc0Py-.js} +1 -1
  26. package/dist/gateway/static/root/assets/connector-service-page-BlC1OXX4.js +1 -0
  27. package/dist/gateway/static/root/assets/connectors-page-By33-bF1.js +2 -0
  28. package/dist/gateway/static/root/assets/{cron-expression-DMRRL4Zg.js → cron-expression-CqNE-nf6.js} +1 -1
  29. package/dist/gateway/static/root/assets/{date-picker-BSwL0e6E.js → date-picker-BS9ZjzYJ.js} +1 -1
  30. package/dist/gateway/static/root/assets/{dependency-picker-BQTspLzC.js → dependency-picker-CF_zYzxX.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-C3lFxDF6.js → desktop-pet-CDwtLR7Z.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-settings-Y8pjpXFE.js → desktop-pet-settings-C0djIc1J.js} +1 -1
  33. package/dist/gateway/static/root/assets/device-pairing-wizard-CDKj9LQj.js +1 -0
  34. package/dist/gateway/static/root/assets/{extension-debug-page-CVGiGVcR.js → extension-debug-page-CX5OXxEU.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-page-g3JtCP_y.js → extension-page-BytR1PaY.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-CjpoKV1f.js → extension-settings-page-CkaMJA5F.js} +1 -1
  37. package/dist/gateway/static/root/assets/{gateway-config-swr-BSvXXpKM.js → gateway-config-swr-B6wHa6ZI.js} +1 -1
  38. package/dist/gateway/static/root/assets/{gateway-realtime-BDCpS7U1.js → gateway-realtime-B53R0CA4.js} +1 -1
  39. package/dist/gateway/static/root/assets/gateway-realtime-store-BLDgrJ30.js +1 -0
  40. package/dist/gateway/static/root/assets/{gateway-settings-CYG9WCZn.js → gateway-settings-_YU-1p0z.js} +1 -1
  41. package/dist/gateway/static/root/assets/{gateway-startup-retry-Caf8g3sC.js → gateway-startup-retry-DRzGnEV-.js} +1 -1
  42. package/dist/gateway/static/root/assets/{heartbeat-settings-Cl834-SS.js → heartbeat-settings-CVIvvm4x.js} +1 -1
  43. package/dist/gateway/static/root/assets/home-page-COCHelcL.js +1 -0
  44. package/dist/gateway/static/root/assets/{image-generation-api-BwEWBUVC.js → image-generation-api-Ck_pyDom.js} +1 -1
  45. package/dist/gateway/static/root/assets/{imports-page-CoMlgSIA.js → imports-page-DrtbjL8O.js} +1 -1
  46. package/dist/gateway/static/root/assets/index-CDfcPiPb.js +79 -0
  47. package/dist/gateway/static/root/assets/index-CRu1p38D.css +1 -0
  48. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CNq5D4pe.js → keyboard-shortcuts-settings-BlZh41Xq.js} +1 -1
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-D7_Raxjw.js +2 -0
  50. package/dist/gateway/static/root/assets/{local-apps-page-DQnRA598.js → local-apps-page-DbP7wWuh.js} +1 -1
  51. package/dist/gateway/static/root/assets/{locale-store-D16nmbaN.js → locale-store-msTfRK8P.js} +1 -1
  52. package/dist/gateway/static/root/assets/logs-page-C0n66FiO.js +2 -0
  53. package/dist/gateway/static/root/assets/{management-settings-DKcO5fQ-.js → management-settings-i6GhxpGV.js} +1 -1
  54. package/dist/gateway/static/root/assets/{markdown-view-DCp4BlZP.js → markdown-view-BInabSKf.js} +1 -1
  55. package/dist/gateway/static/root/assets/{media-plugins-Cy64sn_C.js → media-plugins-CnWChQ3Y.js} +1 -1
  56. package/dist/gateway/static/root/assets/{messages-C-9oo69N.js → messages-F74LVAiU.js} +3 -3
  57. package/dist/gateway/static/root/assets/note-detail-panel-C59d8vDW.js +5 -0
  58. package/dist/gateway/static/root/assets/notes-page-C1GBPrVI.js +8 -0
  59. package/dist/gateway/static/root/assets/{page-tabs-CgEoHSVT.js → page-tabs-BWitjb3e.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-Ck2uKTbf.js → preview-open-alternatives-UaCWCxZv.js} +1 -1
  61. package/dist/gateway/static/root/assets/{proactive-page-Dr1mCJhZ.js → proactive-page-CtSFJxoM.js} +1 -1
  62. package/dist/gateway/static/root/assets/{product-open-page-DbZvJ5GE.js → product-open-page-gmi5LLwM.js} +1 -1
  63. package/dist/gateway/static/root/assets/project-detail-page-ILTmQ1YN.js +1 -0
  64. package/dist/gateway/static/root/assets/projects-page-snl4rOQZ.js +1 -0
  65. package/dist/gateway/static/root/assets/{registry-api-DcQdwpPu.js → registry-api-BSWtko7U.js} +1 -1
  66. package/dist/gateway/static/root/assets/remote-access-hub-BbaAcEN3.js +1 -0
  67. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CPwdgWKo.js → runtime-tools-settings-panel-CtOjKGWg.js} +2 -2
  68. package/dist/gateway/static/root/assets/{schema-form-8psK4cFO.js → schema-form-DkyyDcl2.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-DrWL71O8.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-BG0kl4HT.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-form-section-D_Gsz5rl.js → settings-form-section-C0JDGN_V.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-page-C_Tj_mkZ.js → settings-page-DiIyMQ52.js} +1 -1
  73. package/dist/gateway/static/root/assets/setup-status-panel-EPazhoZO.js +1 -0
  74. package/dist/gateway/static/root/assets/{share-preview-page-B_M_oPsT.js → share-preview-page-Bt1K657Y.js} +1 -1
  75. package/dist/gateway/static/root/assets/shares-settings-g2MdRXSZ.js +1 -0
  76. package/dist/gateway/static/root/assets/skill-reload-api-B1DPzu98.js +1 -0
  77. package/dist/gateway/static/root/assets/skills-page-Wd0uYSPG.js +2 -0
  78. package/dist/gateway/static/root/assets/{skills-page.utils-Cuh6s2HM.js → skills-page.utils-vq5Ujm03.js} +1 -1
  79. package/dist/gateway/static/root/assets/{system-settings-panel-aassGyNb.js → system-settings-panel-Cz1P-HDH.js} +1 -1
  80. package/dist/gateway/static/root/assets/task-detail-page-BG3A5gPZ.js +1 -0
  81. package/dist/gateway/static/root/assets/theme-store-1SZ-HFHX.js +1 -0
  82. package/dist/gateway/static/root/assets/{tunnel-api-DJYcPWIV.js → tunnel-api-DQGoFuZO.js} +1 -1
  83. package/dist/gateway/static/root/assets/{use-autosave-QGYG7oMZ.js → use-autosave-DVDlBb95.js} +1 -1
  84. package/dist/gateway/static/root/assets/user-model-page-qM5UiTGx.js +2 -0
  85. package/dist/gateway/static/root/assets/{voice-api-key-field-D1s0gIRW.js → voice-api-key-field-B2pZCcxY.js} +1 -1
  86. package/dist/gateway/static/root/assets/{voice-config-api-D2goEn5e.js → voice-config-api-DgJML_uM.js} +1 -1
  87. package/dist/gateway/static/root/assets/{work-discovery-overlay-DkFW9aJ6.js → work-discovery-overlay-Bptv7bEY.js} +1 -1
  88. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BYToUPUY.js → workflow-run-setup-panel-BijCrNc4.js} +2 -2
  89. package/dist/gateway/static/root/assets/workflows-page-DRy1RAYH.js +6 -0
  90. package/dist/gateway/static/root/channel-icons/feishu.svg +6 -12
  91. package/dist/gateway/static/root/connector-icons/SOURCES.md +12 -0
  92. package/dist/gateway/static/root/connector-icons/dingtalk-mark.svg +1 -0
  93. package/dist/gateway/static/root/connector-icons/tencent-meeting-mark.svg +37 -0
  94. package/dist/gateway/static/root/connector-icons/wps-calendar.svg +14 -0
  95. package/dist/gateway/static/root/connector-icons/wps-docs.svg +14 -0
  96. package/dist/gateway/static/root/connector-icons/wps-mail.svg +7 -0
  97. package/dist/gateway/static/root/index.html +12 -12
  98. package/dist/package.js +1 -1
  99. package/dist/packages/gateway-contract/src/notifications.js +1 -1
  100. package/dist/src/agent/background-review/prompts.js +3 -1
  101. package/dist/src/agent/context/execution-context.js +4 -4
  102. package/dist/src/agent/external-tools/composio-provider.js +83 -20
  103. package/dist/src/agent/external-tools/gateway-tools.js +2 -1
  104. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  105. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +1 -1
  106. package/dist/src/agent/memory/compaction-promotion.d.ts +1 -1
  107. package/dist/src/agent/memory/compaction-promotion.js +4 -3
  108. package/dist/src/agent/tools/knowledge-memory-tool.d.ts +1 -1
  109. package/dist/src/agent/tools/knowledge-memory-tool.js +3 -3
  110. package/dist/src/agent/tools/user-context-tool.js +17 -7
  111. package/dist/src/chat-commands/builtins/understanding.js +1 -1
  112. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  113. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  114. package/dist/src/cli/commands/update.js +1 -1
  115. package/dist/src/config/schema.d.ts +14 -4
  116. package/dist/src/config/schema.js +6 -4
  117. package/dist/src/connectors/account-access.d.ts +4 -0
  118. package/dist/src/connectors/account-access.js +23 -0
  119. package/dist/src/connectors/approval-resume.d.ts +4 -0
  120. package/dist/src/connectors/approval-resume.js +23 -0
  121. package/dist/src/connectors/auth-provider-registry.d.ts +1 -0
  122. package/dist/src/connectors/auth-provider-registry.js +2 -1
  123. package/dist/src/connectors/authorization-attempts.d.ts +21 -0
  124. package/dist/src/connectors/authorization-attempts.js +33 -0
  125. package/dist/src/connectors/builtin-catalog.js +1 -3
  126. package/dist/src/connectors/catalog.js +2 -1
  127. package/dist/src/connectors/china-catalog.d.ts +2 -0
  128. package/dist/src/connectors/china-catalog.js +430 -0
  129. package/dist/src/connectors/composio-backends.d.ts +26 -0
  130. package/dist/src/connectors/composio-backends.js +65 -0
  131. package/dist/src/connectors/composio-catalog.js +2 -1
  132. package/dist/src/connectors/composio-managed-client.js +3 -1
  133. package/dist/src/connectors/composio-managed-events.js +5 -2
  134. package/dist/src/connectors/composio-session-types.d.ts +2 -0
  135. package/dist/src/connectors/composio-sessions.d.ts +11 -2
  136. package/dist/src/connectors/composio-sessions.js +137 -35
  137. package/dist/src/connectors/composio-triggers.js +4 -2
  138. package/dist/src/connectors/composio.d.ts +11 -8
  139. package/dist/src/connectors/composio.js +68 -84
  140. package/dist/src/connectors/connected-source-ingestion.js +4 -3
  141. package/dist/src/connectors/connected-source-understanding.d.ts +1 -0
  142. package/dist/src/connectors/connected-source-understanding.js +1 -0
  143. package/dist/src/connectors/connection-recovery-service.js +25 -13
  144. package/dist/src/connectors/connector-identity.d.ts +2 -0
  145. package/dist/src/connectors/connector-identity.js +18 -5
  146. package/dist/src/connectors/content-enrichment.js +1 -1
  147. package/dist/src/connectors/instances.js +1 -7
  148. package/dist/src/connectors/learning-coordinator.js +35 -12
  149. package/dist/src/connectors/materialize.js +14 -1
  150. package/dist/src/connectors/policy.d.ts +1 -1
  151. package/dist/src/connectors/policy.js +1 -1
  152. package/dist/src/connectors/principal.js +24 -3
  153. package/dist/src/connectors/providers.d.ts +1 -0
  154. package/dist/src/connectors/providers.js +14 -2
  155. package/dist/src/connectors/runtime-adapter-registry.js +4 -9
  156. package/dist/src/connectors/secret-store.d.ts +4 -1
  157. package/dist/src/connectors/secret-store.js +7 -3
  158. package/dist/src/connectors/source-change-publisher.js +4 -2
  159. package/dist/src/connectors/types.d.ts +16 -11
  160. package/dist/src/connectors/workflow-preflight.d.ts +2 -1
  161. package/dist/src/connectors/workflow-preflight.js +20 -3
  162. package/dist/src/gateway/hono/lib/config-payload.d.ts +2 -2
  163. package/dist/src/gateway/hono/routes/connectors.js +207 -16
  164. package/dist/src/gateway/hono/routes/context-sources.js +1 -24
  165. package/dist/src/gateway/hono/routes/home.js +4 -1
  166. package/dist/src/gateway/hono/routes/imports.js +1 -1
  167. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  168. package/dist/src/gateway/hono/routes/local-apps.js +1 -1
  169. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  170. package/dist/src/gateway/hono/routes/projects.js +8 -0
  171. package/dist/src/gateway/hono/routes/update.js +2 -2
  172. package/dist/src/gateway/hono/routes/user-model-refresh.d.ts +5 -0
  173. package/dist/src/gateway/hono/routes/user-model-refresh.js +128 -0
  174. package/dist/src/gateway/hono/routes/user-model.js +12 -5
  175. package/dist/src/gateway/hono/routes/work-discovery.js +0 -30
  176. package/dist/src/gateway/index.js +1 -1
  177. package/dist/src/gateway/run-loop.js +1 -1
  178. package/dist/src/gateway/service.js +6 -6
  179. package/dist/src/infra/gateway-processes.js +1 -1
  180. package/dist/src/infra/update-restart.js +1 -1
  181. package/dist/src/infra/update-runner.js +2 -2
  182. package/dist/src/infra/update-startup.js +1 -1
  183. package/dist/src/knowledge/connected-knowledge-pipeline.js +1 -1
  184. package/dist/src/knowledge-memory/index.js +2 -2
  185. package/dist/src/knowledge-memory/repository.d.ts +7 -0
  186. package/dist/src/knowledge-memory/repository.js +58 -8
  187. package/dist/src/memory-maintenance/service.js +61 -31
  188. package/dist/src/migrations/memory-config.d.ts +2 -0
  189. package/dist/src/migrations/memory-config.js +77 -0
  190. package/dist/src/migrations/runner.js +2 -2
  191. package/dist/src/notifications/planner.js +5 -5
  192. package/dist/src/notifications/service.d.ts +2 -2
  193. package/dist/src/notifications/service.js +1 -1
  194. package/dist/src/proactive/follow-ups.js +2 -1
  195. package/dist/src/storage/sqlite/connection-wait-repository.d.ts +3 -0
  196. package/dist/src/storage/sqlite/connection-wait-repository.js +63 -2
  197. package/dist/src/storage/sqlite/connector-account-repository.d.ts +6 -0
  198. package/dist/src/storage/sqlite/connector-account-repository.js +35 -7
  199. package/dist/src/storage/sqlite/connector-repository.js +15 -10
  200. package/dist/src/storage/sqlite/connector-sync-policy-repository.js +1 -1
  201. package/dist/src/storage/sqlite/index.js +4 -2
  202. package/dist/src/storage/sqlite/migrations/182_connector_account_policies.sql +92 -0
  203. package/dist/src/storage/sqlite/migrations/183_connector_backend_consistency.sql +20 -0
  204. package/dist/src/storage/sqlite/migrations/184_memory_suppressions.sql +12 -0
  205. package/dist/src/storage/sqlite/migrations/185_understanding_refresh_batches.sql +6 -0
  206. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  207. package/dist/src/storage/sqlite/migrations/runner.js +7 -7
  208. package/dist/src/storage/sqlite/schema.js +1 -1
  209. package/dist/src/tasks/home-query-service.js +3 -3
  210. package/dist/src/tui/backends/gateway-realtime-backend.js +1 -1
  211. package/dist/src/tui/tui-startup-resources.js +1 -1
  212. package/dist/src/user-context/config.d.ts +4 -9
  213. package/dist/src/user-context/config.js +7 -27
  214. package/dist/src/user-context/memory-suppression.d.ts +7 -0
  215. package/dist/src/user-context/memory-suppression.js +23 -0
  216. package/dist/src/user-context/relationship-continuity.js +1 -1
  217. package/dist/src/user-context/sources/refresh-service.d.ts +48 -0
  218. package/dist/src/user-context/sources/refresh-service.js +221 -0
  219. package/dist/src/user-context/sources/repository.js +1 -1
  220. package/dist/src/user-model/bootstrap.js +27 -24
  221. package/dist/src/user-model/capture/executor.d.ts +1 -1
  222. package/dist/src/user-model/capture/executor.js +17 -11
  223. package/dist/src/user-model/capture/semantic.js +1 -1
  224. package/dist/src/user-model/domain.d.ts +6 -2
  225. package/dist/src/user-model/index.js +3 -3
  226. package/dist/src/user-model/profile.js +1 -1
  227. package/dist/src/user-model/repository.d.ts +4 -1
  228. package/dist/src/user-model/repository.js +96 -6
  229. package/dist/src/user-model/usage-policy.d.ts +2 -0
  230. package/dist/src/user-model/usage-policy.js +6 -2
  231. package/dist/src/work-discovery/project-understanding.js +2 -1
  232. package/dist/src/work-discovery/service.d.ts +8 -24
  233. package/dist/src/work-discovery/service.js +138 -180
  234. package/dist/src/workflows/domain/definition.d.ts +1 -0
  235. package/dist/src/workflows/domain/validation.js +1 -1
  236. package/dist/src/workflows/service/workflow-run-service.js +14 -0
  237. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
  238. package/dist/src/workflows/service/workflow-session-bridge.js +1 -0
  239. package/package.json +5 -5
  240. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CxOv4ivK.js +0 -1
  241. package/dist/gateway/static/root/assets/agents-DzKx7z3k.js +0 -1
  242. package/dist/gateway/static/root/assets/api-gpHh07OL.js +0 -1
  243. package/dist/gateway/static/root/assets/appearance-settings-BQfR5vrq.js +0 -1
  244. package/dist/gateway/static/root/assets/apps-page-BceB7JHZ.js +0 -1
  245. package/dist/gateway/static/root/assets/automations-workspace-Cn_p8zY_.js +0 -6
  246. package/dist/gateway/static/root/assets/browser-settings-page-CCUO3G23.js +0 -3
  247. package/dist/gateway/static/root/assets/capabilities-settings-panel-BjMb5H2_.js +0 -8
  248. package/dist/gateway/static/root/assets/channels-settings-P22-_i13.js +0 -1
  249. package/dist/gateway/static/root/assets/connectors-page-BLgPORmH.js +0 -2
  250. package/dist/gateway/static/root/assets/device-pairing-wizard-DM4_GMzo.js +0 -1
  251. package/dist/gateway/static/root/assets/gateway-realtime-store-BGmP1obI.js +0 -1
  252. package/dist/gateway/static/root/assets/home-page-CB_XVtIM.js +0 -1
  253. package/dist/gateway/static/root/assets/index-CI37dTAn.css +0 -1
  254. package/dist/gateway/static/root/assets/index-Do9MltC4.js +0 -79
  255. package/dist/gateway/static/root/assets/local-app-workbench-page-BxQlEje6.js +0 -2
  256. package/dist/gateway/static/root/assets/logs-page-CT5GrcMs.js +0 -2
  257. package/dist/gateway/static/root/assets/note-detail-panel-5dc3LKTL.js +0 -5
  258. package/dist/gateway/static/root/assets/notes-page-AbwxgXuG.js +0 -8
  259. package/dist/gateway/static/root/assets/project-detail-page-DnE1zI1c.js +0 -1
  260. package/dist/gateway/static/root/assets/projects-page-BD0nLYxk.js +0 -1
  261. package/dist/gateway/static/root/assets/remote-access-hub-TYuE6A3S.js +0 -1
  262. package/dist/gateway/static/root/assets/sessions-page-BcWDQQFX.js +0 -1
  263. package/dist/gateway/static/root/assets/settings-advanced-gate-DzGQX6Hq.js +0 -1
  264. package/dist/gateway/static/root/assets/setup-status-panel-CE2X89qN.js +0 -1
  265. package/dist/gateway/static/root/assets/shares-settings-BL4H9Iym.js +0 -1
  266. package/dist/gateway/static/root/assets/skill-reload-api-WMKIgUOp.js +0 -1
  267. package/dist/gateway/static/root/assets/skills-page-DYgwzl5B.js +0 -2
  268. package/dist/gateway/static/root/assets/task-detail-page-BjeRslap.js +0 -1
  269. package/dist/gateway/static/root/assets/theme-store-RUBQBsFP.js +0 -1
  270. package/dist/gateway/static/root/assets/user-model-page-PrRsd4go.js +0 -2
  271. package/dist/gateway/static/root/assets/workflows-page-Z8iZe9YP.js +0 -6
  272. package/dist/src/migrations/knowledge-memory-read-policy-config.d.ts +0 -2
  273. package/dist/src/migrations/knowledge-memory-read-policy-config.js +0 -48
@@ -62,7 +62,14 @@ export declare class WorkDiscoveryService {
62
62
  reused?: undefined;
63
63
  }>;
64
64
  revokeDirectorySource(id: string): import("./types.js").WorkDiscoveryDirectorySource;
65
- importUnderstandingSources(rawItems: unknown[], processingPolicy: ModelProcessingPolicy, signal?: AbortSignal, runId?: string, rawCheckpoints?: Record<string, unknown>): Promise<{
65
+ importUnderstandingSources(rawItems: unknown[], processingPolicy: ModelProcessingPolicy, signal?: AbortSignal, runId?: string, rawCheckpoints?: Record<string, unknown>, refresh?: {
66
+ grantId: string;
67
+ }): Promise<{
68
+ profileCandidates: any[];
69
+ workThreads: import("./types.js").WorkUnderstandingThread[];
70
+ knowledgeCandidates: import("../knowledge-memory/domain.js").KnowledgeItem[];
71
+ sourceStatuses: import("./analyzer.js").UnderstandingSourceAnalysisStatus[];
72
+ } | {
66
73
  profileCandidates: any[];
67
74
  workThreads: any[];
68
75
  knowledgeCandidates: any[];
@@ -70,21 +77,6 @@ export declare class WorkDiscoveryService {
70
77
  sourceId: string;
71
78
  status: "completed";
72
79
  }[];
73
- } | {
74
- profileCandidates: {
75
- status: "pending" | "rejected";
76
- assertionId: string;
77
- id: string;
78
- category: "role" | "responsibility" | "preference" | "routine" | "communication" | "boundary" | "relationship";
79
- factKey: string;
80
- statement: string;
81
- confidence: "high" | "medium" | "low";
82
- evidence: string[];
83
- evidenceRefs?: string[];
84
- }[];
85
- workThreads: import("./types.js").WorkUnderstandingThread[];
86
- knowledgeCandidates: import("../knowledge-memory/domain.js").KnowledgeItem[];
87
- sourceStatuses: import("./analyzer.js").UnderstandingSourceAnalysisStatus[];
88
80
  }>;
89
81
  rescanDirectorySource(input: {
90
82
  id: string;
@@ -103,14 +95,6 @@ export declare class WorkDiscoveryService {
103
95
  private publish;
104
96
  private execute;
105
97
  private persistProfileCandidates;
106
- updateProfileCandidates(input: {
107
- runId: string;
108
- decisions: Array<{
109
- id: string;
110
- status: 'accepted' | 'edited' | 'rejected';
111
- statement?: string;
112
- }>;
113
- }): WorkDiscoveryRun | null;
114
98
  cancelRun(id: string): WorkDiscoveryRun | null;
115
99
  retryRun(id: string): WorkDiscoveryRun | null;
116
100
  submitRecognitionFeedback(input: {
@@ -1,5 +1,6 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
3
4
  import { createContextEvidence } from "../storage/sqlite/context-evidence-repository.js";
4
5
  import { ensureSessionRecord, patchSessionMetadata } from "../storage/sqlite/session-repository.js";
5
6
  import "../storage/sqlite/index.js";
@@ -12,12 +13,12 @@ import { init_providers, resolveModel } from "../providers/index.js";
12
13
  import { writeKnowledgeItem } from "../knowledge-memory/repository.js";
13
14
  import "../knowledge-memory/index.js";
14
15
  import { createPriorityWindow, createUserGoal } from "../user-model/goals.js";
15
- import { getAssertionSlot, getUserAssertion, linkAssertionEvidence, reconcileAssertion, setAssertionStatus } from "../user-model/repository.js";
16
+ import { linkAssertionEvidence, reconcileAssertion } from "../user-model/repository.js";
16
17
  import "../user-model/index.js";
17
18
  import { isLocalModelBaseUrl } from "../providers/model-call.js";
18
19
  import { allowsRemoteSourceProcessing } from "../user-context/sources/processing-policy.js";
19
20
  import { analyzeUnderstandingSources, analyzeWorkContext, workDiscoveryResultMarkdown } from "./analyzer.js";
20
- import { createUnderstandingSourceRun, getUnderstandingSourceRun, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceGrantPolicies, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
21
+ import { createUnderstandingSourceRun, getUnderstandingSourceGrant, getUnderstandingSourceRun, updateUnderstandingSourceGrantCheckpoint, updateUnderstandingSourceGrantPolicies, updateUnderstandingSourceRun, upsertUnderstandingSourceGrant } from "../user-context/sources/repository.js";
21
22
  import { clusterActivityTopics } from "../user-context/sources/activity-clustering.js";
22
23
  import { isLocalUnderstandingSourceId } from "../user-context/sources/local-source-contract.js";
23
24
  import { discoverWorkCandidates } from "./candidate-discovery.js";
@@ -36,6 +37,7 @@ init_schema();
36
37
  init_providers();
37
38
  init_session_key();
38
39
  init_resolve_route();
40
+ init_transaction();
39
41
  init_logger();
40
42
  const log = createLogger("WorkDiscovery");
41
43
  const MAX_UNDERSTANDING_ITEMS = 150;
@@ -199,45 +201,6 @@ function persistUnderstandingCandidate(candidate, scope, sourceRef) {
199
201
  evidenceConfidence: candidate.confidence === "high" ? .9 : .7
200
202
  }).assertion;
201
203
  }
202
- function decideAssertion(input, _expectedSourcePrefix) {
203
- const current = getUserAssertion(input.assertionId);
204
- if (!current || current.status === "archived") return void 0;
205
- if (input.status === "rejected") return setAssertionStatus(current.id, "rejected", {
206
- actor: "user",
207
- reason: "Rejected in work discovery review."
208
- });
209
- const statement = input.status === "edited" ? input.statement?.trim().slice(0, 500) : void 0;
210
- if (input.status === "edited" && !statement) return void 0;
211
- if (!statement) return setAssertionStatus(current.id, "active", {
212
- actor: "user",
213
- reason: "Accepted in work discovery review."
214
- });
215
- const slot = getAssertionSlot(current.slotId);
216
- if (!slot) return void 0;
217
- return reconcileAssertion({
218
- subject: slot.subject,
219
- predicate: slot.predicate,
220
- cardinality: slot.cardinality,
221
- scope: slot.scope,
222
- kind: current.kind,
223
- value: statement,
224
- normalizedValue: statement.toLocaleLowerCase(),
225
- statement,
226
- authority: "user_explicit",
227
- confidence: 1,
228
- declaredImportance: current.declaredImportance ?? .7,
229
- inferredImportance: current.inferredImportance,
230
- consequence: current.consequence,
231
- actionability: current.actionability,
232
- volatility: current.volatility,
233
- sensitivity: current.sensitivity,
234
- disclosurePolicy: current.disclosurePolicy,
235
- applicability: current.applicability,
236
- observedAt: Date.now(),
237
- createdBy: "user",
238
- correctionOfAssertionId: current.id
239
- }).assertion;
240
- }
241
204
  function persistWorkKnowledge(input) {
242
205
  const now = Date.now();
243
206
  return writeKnowledgeItem({
@@ -518,8 +481,17 @@ var WorkDiscoveryService = class {
518
481
  revokeDirectorySource(id) {
519
482
  return revokeWorkDiscoveryDirectorySource(id);
520
483
  }
521
- async importUnderstandingSources(rawItems, processingPolicy, signal, runId, rawCheckpoints) {
484
+ async importUnderstandingSources(rawItems, processingPolicy, signal, runId, rawCheckpoints, refresh) {
522
485
  const items = normalizeUnderstandingSourceItems(rawItems);
486
+ const assertRefreshAuthorized = () => {
487
+ signal?.throwIfAborted();
488
+ if (!refresh) return;
489
+ const config = this.options.getConfig();
490
+ if (!config.userContext.enabled || !config.userContext.userModel.enabled) throw new Error("User understanding is disabled.");
491
+ const grant = getUnderstandingSourceGrant(refresh.grantId);
492
+ if (!grant || grant.status !== "active" || grant.processingPolicy !== processingPolicy || items.some((item) => item.sourceId !== grant.adapterId)) throw new Error("Source authorization changed during update.");
493
+ };
494
+ assertRefreshAuthorized();
523
495
  if (!items.length) throw new Error("No readable understanding source items were provided");
524
496
  const target = this.getModelProcessingTarget();
525
497
  const agentId = getDefaultAgentId(this.options.getConfig());
@@ -541,7 +513,7 @@ var WorkDiscoveryService = class {
541
513
  const sourceItems = items.filter((item) => item.sourceId === sourceId);
542
514
  const category = sourceItems.some((item) => item.type === "calendar_event") ? "calendar" : sourceItems.some((item) => item.type === "task") ? "tasks" : sourceItems.some((item) => item.type === "note") ? "notes" : sourceItems.some((item) => item.type === "mail") ? "mail" : sourceItems.some((item) => item.type === "message") ? "messages" : sourceItems.some((item) => item.type === "code_activity") ? "code_activity" : "recent_documents";
543
515
  const platform = sourceId.startsWith("apple-") ? "darwin" : sourceId.startsWith("windows-") ? "win32" : sourceId.startsWith("linux-") ? "linux" : "all";
544
- let grant = upsertUnderstandingSourceGrant({
516
+ let grant = refresh ? getUnderstandingSourceGrant(refresh.grantId) : upsertUnderstandingSourceGrant({
545
517
  sourceKey: `understanding-source:${sourceId}`,
546
518
  adapterId: sourceId,
547
519
  category,
@@ -552,11 +524,11 @@ var WorkDiscoveryService = class {
552
524
  processingPolicy: effectiveProcessingPolicy,
553
525
  config: { readOnly: true }
554
526
  });
555
- if (grant.processingPolicy !== effectiveProcessingPolicy) grant = updateUnderstandingSourceGrantPolicies(grant.id, { processingPolicy: effectiveProcessingPolicy }) ?? grant;
527
+ if (!refresh && grant.processingPolicy !== effectiveProcessingPolicy) grant = updateUnderstandingSourceGrantPolicies(grant.id, { processingPolicy: effectiveProcessingPolicy }) ?? grant;
556
528
  sourceGrants.set(sourceId, grant);
557
529
  const checkpoint = checkpoints.get(sourceId);
558
530
  const previousFingerprint = typeof grant.checkpoint.fingerprint === "string" ? grant.checkpoint.fingerprint : void 0;
559
- const unchanged = Boolean(checkpoint && previousFingerprint === checkpoint.fingerprint);
531
+ const unchanged = !refresh && Boolean(checkpoint && previousFingerprint === checkpoint.fingerprint);
560
532
  const kind = !previousFingerprint ? "bootstrap" : unchanged ? "fingerprint" : "incremental";
561
533
  const sourceRun = createUnderstandingSourceRun({
562
534
  grantId: grant.id,
@@ -625,6 +597,8 @@ var WorkDiscoveryService = class {
625
597
  status: "completed"
626
598
  }))
627
599
  };
600
+ assertRefreshAuthorized();
601
+ if (refresh && analysis.sourceStatuses.some((source) => source.status !== "completed")) throw new Error("Source analysis did not complete. Please retry.");
628
602
  const statusBySource = new Map(analysis.sourceStatuses.map((item) => [item.sourceId, item]));
629
603
  for (const [sourceId, sourceRunId] of sourceRuns) {
630
604
  if (!changedSourceIds.has(sourceId)) continue;
@@ -665,123 +639,127 @@ var WorkDiscoveryService = class {
665
639
  }
666
640
  throw error;
667
641
  }
668
- const rawContents = analysisItems.flatMap((item) => item.text ? [item.text] : []);
669
- const activityTopics = clusterActivityTopics(analysisItems);
670
- const safeProfileCandidates = analysis.profileCandidates.filter((candidate) => !hasLongVerbatimOverlap(candidate.statement, rawContents));
671
- const safeWorkThreadCandidates = analysis.workThreadCandidates.filter((candidate) => !hasLongVerbatimOverlap(candidate.title, rawContents) && !hasLongVerbatimOverlap(candidate.summary, rawContents));
672
- const profileCandidates = safeProfileCandidates.map((candidate) => {
673
- const assertion = persistUnderstandingCandidate(candidate, { type: "global" }, "understanding-source:onboarding");
674
- const evidenceSourceIds = new Set((candidate.evidenceRefs ?? []).map((ref) => ref.split("://", 1)[0]).filter(Boolean));
675
- for (const sourceId of evidenceSourceIds) {
676
- const sourceRunId = sourceRuns.get(sourceId);
677
- if (!sourceRunId) continue;
678
- const sourceRun = getUnderstandingSourceRun(sourceRunId);
679
- if (!sourceRun) continue;
680
- const evidence = createContextEvidence({
681
- sourceType: "runtime",
682
- sourceRef: `understanding-source-grant:${sourceRun.grantId}:${candidate.id}`,
683
- redactedExcerpt: candidate.evidence.join(" · ").slice(0, 600),
684
- trustLevel: "trusted",
685
- observedAt: Date.now()
642
+ return runSqliteWriteTransaction(() => {
643
+ const rawContents = analysisItems.flatMap((item) => item.text ? [item.text] : []);
644
+ const activityTopics = clusterActivityTopics(analysisItems);
645
+ const safeProfileCandidates = analysis.profileCandidates.filter((candidate) => !hasLongVerbatimOverlap(candidate.statement, rawContents));
646
+ const safeWorkThreadCandidates = analysis.workThreadCandidates.filter((candidate) => !hasLongVerbatimOverlap(candidate.title, rawContents) && !hasLongVerbatimOverlap(candidate.summary, rawContents));
647
+ const profileCandidates = safeProfileCandidates.flatMap((candidate) => {
648
+ const assertion = persistUnderstandingCandidate(candidate, { type: "global" }, "understanding-source:onboarding");
649
+ if (!assertion) return [];
650
+ const evidenceSourceIds = new Set((candidate.evidenceRefs ?? []).map((ref) => ref.split("://", 1)[0]).filter(Boolean));
651
+ for (const sourceId of evidenceSourceIds) {
652
+ const sourceRunId = sourceRuns.get(sourceId);
653
+ if (!sourceRunId) continue;
654
+ const sourceRun = getUnderstandingSourceRun(sourceRunId);
655
+ if (!sourceRun) continue;
656
+ const evidence = createContextEvidence({
657
+ sourceType: "runtime",
658
+ sourceRef: `understanding-source-grant:${sourceRun.grantId}:${candidate.id}`,
659
+ redactedExcerpt: candidate.evidence.join(" · ").slice(0, 600),
660
+ trustLevel: "trusted",
661
+ observedAt: Date.now()
662
+ });
663
+ linkAssertionEvidence(assertion.id, evidence.id, "supports", assertion.confidence);
664
+ }
665
+ return {
666
+ ...candidate,
667
+ status: assertion.status === "rejected" ? "rejected" : "pending",
668
+ assertionId: assertion.id
669
+ };
670
+ });
671
+ const investigation = linkedRun ? getWorkUnderstandingInvestigationForRun(linkedRun.id) : null;
672
+ const contextEvidence = investigation ? safeWorkThreadCandidates.map((candidate) => {
673
+ const topicHash = createHash("sha256").update(candidate.topicKey).digest("hex").slice(0, 16);
674
+ return appendWorkUnderstandingEvidence({
675
+ investigationId: investigation.id,
676
+ projectId: linkedRun.projectId,
677
+ sourceType: "understanding_source",
678
+ sourceRef: `understanding-source://thread/${topicHash}`,
679
+ observation: candidate.summary,
680
+ contentHash: createHash("sha256").update(JSON.stringify(candidate.evidenceRefs)).digest("hex"),
681
+ sensitivity: "normal"
686
682
  });
687
- linkAssertionEvidence(assertion.id, evidence.id, "supports", assertion.confidence);
688
- }
689
- return {
690
- ...candidate,
691
- status: assertion.status === "rejected" ? "rejected" : "pending",
692
- assertionId: assertion.id
693
- };
694
- });
695
- const investigation = linkedRun ? getWorkUnderstandingInvestigationForRun(linkedRun.id) : null;
696
- const contextEvidence = investigation ? safeWorkThreadCandidates.map((candidate) => {
697
- const topicHash = createHash("sha256").update(candidate.topicKey).digest("hex").slice(0, 16);
698
- return appendWorkUnderstandingEvidence({
699
- investigationId: investigation.id,
683
+ }) : [];
684
+ const workThreads = linkedRun && contextEvidence.length ? persistWorkThreadsFromDiscovery({
700
685
  projectId: linkedRun.projectId,
701
- sourceType: "understanding_source",
702
- sourceRef: `understanding-source://thread/${topicHash}`,
703
- observation: candidate.summary,
704
- contentHash: createHash("sha256").update(JSON.stringify(candidate.evidenceRefs)).digest("hex"),
705
- sensitivity: "normal"
706
- });
707
- }) : [];
708
- const workThreads = linkedRun && contextEvidence.length ? persistWorkThreadsFromDiscovery({
709
- projectId: linkedRun.projectId,
710
- result: {
711
- projectSummary: "Connected source context",
712
- currentState: "Work streams inferred from sources the user explicitly connected.",
713
- uncertainties: [],
714
- suggestions: [],
715
- workThreadCandidates: safeWorkThreadCandidates.map((candidate, index) => ({
716
- ...candidate,
717
- evidenceRefs: contextEvidence[index] ? [contextEvidence[index].sourceRef] : []
718
- }))
719
- },
720
- snapshot: {
721
- root: {
722
- displayName: "Connected Sources",
723
- projectKind: "general",
724
- markerReasons: ["explicitly_connected_understanding_sources"]
686
+ result: {
687
+ projectSummary: "Connected source context",
688
+ currentState: "Work streams inferred from sources the user explicitly connected.",
689
+ uncertainties: [],
690
+ suggestions: [],
691
+ workThreadCandidates: safeWorkThreadCandidates.map((candidate, index) => ({
692
+ ...candidate,
693
+ evidenceRefs: contextEvidence[index] ? [contextEvidence[index].sourceRef] : []
694
+ }))
725
695
  },
726
- structure: {
727
- sampledPaths: [],
728
- metadataOnlyFiles: [],
729
- omittedPathCount: 0
696
+ snapshot: {
697
+ root: {
698
+ displayName: "Connected Sources",
699
+ projectKind: "general",
700
+ markerReasons: ["explicitly_connected_understanding_sources"]
701
+ },
702
+ structure: {
703
+ sampledPaths: [],
704
+ metadataOnlyFiles: [],
705
+ omittedPathCount: 0
706
+ },
707
+ documents: [],
708
+ limits: {
709
+ policyVersion: 1,
710
+ fileCount: 0,
711
+ contentBytes: 0,
712
+ truncated: false
713
+ }
730
714
  },
731
- documents: [],
732
- limits: {
733
- policyVersion: 1,
734
- fileCount: 0,
735
- contentBytes: 0,
736
- truncated: false
737
- }
738
- },
739
- evidence: contextEvidence
740
- }) : [];
741
- const activityEvidence = new Set(activityTopics.flatMap((topic) => topic.evidenceRefs));
742
- const activityKnowledge = activityTopics.map((topic) => persistWorkKnowledge({
743
- canonicalKey: topic.canonicalKey,
744
- title: topic.title,
745
- summary: topic.summary,
746
- horizon: topic.horizon,
747
- confidence: topic.confidence,
748
- scope: {
749
- type: "agent",
750
- id: agentId
751
- },
752
- evidenceRefs: topic.evidenceRefs
753
- }));
754
- const modelKnowledge = safeWorkThreadCandidates.filter((candidate) => !candidate.evidenceRefs.some((ref) => activityEvidence.has(ref))).map((candidate) => persistWorkKnowledge({
755
- canonicalKey: `source-knowledge:${candidate.topicKey}`,
756
- title: candidate.title,
757
- summary: candidate.summary,
758
- horizon: candidate.horizon,
759
- confidence: candidate.confidence === "high" ? .9 : candidate.confidence === "medium" ? .72 : .55,
760
- scope: {
761
- type: "agent",
762
- id: agentId
763
- },
764
- evidenceRefs: candidate.evidenceRefs
765
- }));
766
- const knowledgeCandidates = [...activityKnowledge, ...modelKnowledge];
767
- log.info({
768
- runId,
769
- itemCount: items.length,
770
- candidateCount: profileCandidates.length,
771
- knowledgeCount: knowledgeCandidates.length,
772
- incompleteSourceCount: analysis.sourceStatuses.filter((item) => item.status !== "completed").length
773
- }, "Understanding sources analyzed");
774
- return {
775
- profileCandidates,
776
- workThreads,
777
- knowledgeCandidates,
778
- sourceStatuses: analysis.sourceStatuses
779
- };
715
+ evidence: contextEvidence
716
+ }) : [];
717
+ const activityEvidence = new Set(activityTopics.flatMap((topic) => topic.evidenceRefs));
718
+ const activityKnowledge = activityTopics.map((topic) => persistWorkKnowledge({
719
+ canonicalKey: topic.canonicalKey,
720
+ title: topic.title,
721
+ summary: topic.summary,
722
+ horizon: topic.horizon,
723
+ confidence: topic.confidence,
724
+ scope: {
725
+ type: "agent",
726
+ id: agentId
727
+ },
728
+ evidenceRefs: topic.evidenceRefs
729
+ }));
730
+ const modelKnowledge = safeWorkThreadCandidates.filter((candidate) => !candidate.evidenceRefs.some((ref) => activityEvidence.has(ref))).map((candidate) => persistWorkKnowledge({
731
+ canonicalKey: `source-knowledge:${candidate.topicKey}`,
732
+ title: candidate.title,
733
+ summary: candidate.summary,
734
+ horizon: candidate.horizon,
735
+ confidence: candidate.confidence === "high" ? .9 : candidate.confidence === "medium" ? .72 : .55,
736
+ scope: {
737
+ type: "agent",
738
+ id: agentId
739
+ },
740
+ evidenceRefs: candidate.evidenceRefs
741
+ }));
742
+ const knowledgeCandidates = [...activityKnowledge, ...modelKnowledge].filter((item) => item !== void 0);
743
+ log.info({
744
+ runId,
745
+ itemCount: items.length,
746
+ candidateCount: profileCandidates.length,
747
+ knowledgeCount: knowledgeCandidates.length,
748
+ incompleteSourceCount: analysis.sourceStatuses.filter((item) => item.status !== "completed").length
749
+ }, "Understanding sources analyzed");
750
+ return {
751
+ profileCandidates,
752
+ workThreads,
753
+ knowledgeCandidates,
754
+ sourceStatuses: analysis.sourceStatuses
755
+ };
756
+ });
780
757
  }
781
758
  async rescanDirectorySource(input) {
782
759
  const source = getWorkDiscoveryDirectorySource(input.id);
783
760
  if (!source || source.status !== "active") throw new Error("Approved work folder not found");
784
761
  const preview = await previewWorkDiscoveryRoot(source.rootPath);
762
+ if (getUnderstandingSourceGrant(source.id)?.status !== "active" || getUnderstandingSourceGrant(source.id)?.processingPolicy !== source.processingPolicy) throw new Error("Work folder authorization was revoked.");
785
763
  upsertWorkDiscoveryDirectorySource({
786
764
  rootPath: preview.canonicalRootPath,
787
765
  displayName: preview.displayName,
@@ -1010,6 +988,8 @@ var WorkDiscoveryService = class {
1010
988
  },
1011
989
  ...discoveredProjects?.length ? { discoveredProjects } : {}
1012
990
  };
991
+ signal.throwIfAborted();
992
+ if (approvedSource && (getUnderstandingSourceGrant(approvedSource.id)?.status !== "active" || getUnderstandingSourceGrant(approvedSource.id)?.processingPolicy !== approvedSource.processingPolicy)) throw new Error("Work folder authorization was revoked during analysis.");
1013
993
  const workThreads = persistWorkThreadsFromDiscovery({
1014
994
  projectId: run.projectId,
1015
995
  result: baseResult,
@@ -1070,6 +1050,8 @@ var WorkDiscoveryService = class {
1070
1050
  });
1071
1051
  if (approvedSource) try {
1072
1052
  const preview = await previewWorkDiscoveryRoot(run.rootPath);
1053
+ signal.throwIfAborted();
1054
+ if (getUnderstandingSourceGrant(approvedSource.id)?.status !== "active") throw new Error("Work folder authorization was revoked.");
1073
1055
  upsertWorkDiscoveryDirectorySource({
1074
1056
  rootPath: preview.canonicalRootPath,
1075
1057
  displayName: preview.displayName,
@@ -1195,42 +1177,18 @@ var WorkDiscoveryService = class {
1195
1177
  }
1196
1178
  persistProfileCandidates(run, result) {
1197
1179
  if (!result.profileCandidates?.length) return result;
1198
- const profileCandidates = result.profileCandidates.map((candidate) => {
1180
+ const profileCandidates = result.profileCandidates.flatMap((candidate) => {
1199
1181
  const assertion = persistUnderstandingCandidate(candidate, { type: "global" }, `work-discovery:${run.id}`);
1200
- return {
1182
+ return assertion ? [{
1201
1183
  ...candidate,
1202
1184
  assertionId: assertion.id
1203
- };
1185
+ }] : [];
1204
1186
  });
1205
1187
  return {
1206
1188
  ...result,
1207
1189
  profileCandidates
1208
1190
  };
1209
1191
  }
1210
- updateProfileCandidates(input) {
1211
- const run = getWorkDiscoveryRun(input.runId);
1212
- if (!run?.result?.profileCandidates?.length) return null;
1213
- const decisions = new Map(input.decisions.map((decision) => [decision.id, decision]));
1214
- const profileCandidates = run.result.profileCandidates.map((candidate) => {
1215
- const decision = decisions.get(candidate.id);
1216
- if (!decision || !candidate.assertionId) return candidate;
1217
- const updated = decideAssertion({
1218
- assertionId: candidate.assertionId,
1219
- ...decision
1220
- }, `work-discovery:${run.id}:`);
1221
- if (!updated) return candidate;
1222
- return {
1223
- ...candidate,
1224
- assertionId: updated.id,
1225
- statement: updated.statement,
1226
- status: decision.status
1227
- };
1228
- });
1229
- return updateWorkDiscoveryRun(run.id, { result: {
1230
- ...run.result,
1231
- profileCandidates
1232
- } });
1233
- }
1234
1192
  cancelRun(id) {
1235
1193
  const run = getWorkDiscoveryRun(id);
1236
1194
  if (!run) return null;
@@ -110,6 +110,7 @@ export interface WorkflowDefinitionManifest {
110
110
  }
111
111
  export interface WorkflowConnectorRequirement {
112
112
  connectorId: string;
113
+ accountIds?: string[];
113
114
  scope?: 'read' | 'write' | 'admin';
114
115
  connectionRequired?: boolean;
115
116
  optional?: boolean;
@@ -121,7 +121,7 @@ function validateManifest(value, errors) {
121
121
  field: "manifest.resources"
122
122
  });
123
123
  }
124
- if (value.connectors !== void 0 && (!Array.isArray(value.connectors) || value.connectors.some((connector) => !isRecord(connector) || typeof connector.connectorId !== "string" || connector.scope !== void 0 && ![
124
+ if (value.connectors !== void 0 && (!Array.isArray(value.connectors) || value.connectors.some((connector) => !isRecord(connector) || typeof connector.connectorId !== "string" || connector.accountIds !== void 0 && (!Array.isArray(connector.accountIds) || connector.accountIds.length === 0 || connector.accountIds.some((id) => typeof id !== "string" || !id.trim()) || new Set(connector.accountIds).size !== connector.accountIds.length) || connector.scope !== void 0 && ![
125
125
  "read",
126
126
  "write",
127
127
  "admin"
@@ -195,6 +195,7 @@ var WorkflowRunService = class {
195
195
  agentId: params.agentId,
196
196
  definitionId: params.definitionId,
197
197
  definitionTitle: definition.title,
198
+ connectorAccounts: connectorPreflight.accounts,
198
199
  triggerSource: params.source.kind,
199
200
  goal,
200
201
  parentConversationId: params.parentConversationId,
@@ -386,8 +387,21 @@ var WorkflowRunService = class {
386
387
  httpStatus: 400
387
388
  };
388
389
  }
390
+ const replayConnectors = preflightWorkflowConnectors({
391
+ definition,
392
+ config: this.options.service.currentConfig,
393
+ agentId: params.agentId
394
+ });
395
+ if (!replayConnectors.ok) return {
396
+ ok: false,
397
+ code: "connector_preflight_failed",
398
+ message: replayConnectors.issues.map((issue) => issue.message).join(" "),
399
+ httpStatus: 409,
400
+ details: replayConnectors
401
+ };
389
402
  const { conversationId } = await this.options.sessionBridge.prepareRunSession({
390
403
  runId: replayRunId,
404
+ connectorAccounts: replayConnectors.accounts,
391
405
  agentId: params.agentId,
392
406
  definitionId: existing.run.definitionId,
393
407
  definitionTitle: `${definition.title} replay`,
@@ -11,6 +11,7 @@ export interface PrepareWorkflowRunSessionParams {
11
11
  parentConversationId?: string;
12
12
  projectId?: string;
13
13
  triggerSource?: string;
14
+ connectorAccounts?: Record<string, string[]>;
14
15
  }
15
16
  export interface PrepareWorkflowRunSessionResult {
16
17
  conversationId: string;
@@ -48,6 +48,7 @@ var WorkflowSessionBridge = class {
48
48
  workflowRunId: params.runId,
49
49
  workflowDefinitionId: params.definitionId,
50
50
  workflowGoal: params.goal,
51
+ connectorAccounts: params.connectorAccounts ?? {},
51
52
  deferVisibilityUntilOutput: true,
52
53
  ...params.triggerSource ? { triggerSource: params.triggerSource } : {},
53
54
  ...params.parentConversationId ? { parentConversationId: params.parentConversationId } : {}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xopcai/xopc",
3
- "version": "0.0.306",
3
+ "version": "0.0.308",
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",
@@ -167,12 +167,12 @@
167
167
  "vitest": "4.1.5",
168
168
  "vue": "^3.5.35",
169
169
  "@xopcai/browser-control-contract": "0.1.0",
170
- "@xopcai/gateway-contract": "0.0.0",
171
- "@xopcai/endpoint-tools-protocol": "0.0.0",
172
170
  "@xopcai/computer-control-contract": "0.1.0",
173
171
  "@xopcai/endpoint-tools-client": "0.0.0",
174
- "@xopcai/realtime-client": "0.0.0",
175
- "@xopcai/realtime-protocol": "0.0.0"
172
+ "@xopcai/endpoint-tools-protocol": "0.0.0",
173
+ "@xopcai/gateway-contract": "0.0.0",
174
+ "@xopcai/realtime-protocol": "0.0.0",
175
+ "@xopcai/realtime-client": "0.0.0"
176
176
  },
177
177
  "scripts": {
178
178
  "assets:brand": "node scripts/generate-brand-assets.mjs",