@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
@@ -1,4 +1,4 @@
1
- export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'channel' | 'browser' | 'extension' | 'builtin' | 'composio' | 'nativeTool' | 'memorySource';
1
+ export type ConnectorKind = 'mcp' | 'cli' | 'http' | 'browser' | 'extension' | 'builtin' | 'composio' | 'memorySource';
2
2
  export type ConnectorCategory = 'code' | 'docs' | 'browser' | 'data' | 'automation' | 'custom';
3
3
  export type ConnectorCapability = 'tools' | 'resources' | 'prompts' | 'context' | 'channel' | 'events' | 'ui' | 'memory_source' | 'workflows' | 'auth.apiKey' | 'auth.oauth' | 'runtime.mcp.stdio' | 'runtime.mcp.sse' | 'runtime.mcp.streamableHttp';
4
4
  export type ConnectorAuthMode = 'none' | 'apiKey' | 'oauth';
@@ -17,7 +17,6 @@ export type ConnectorBenefit = 'understand' | 'act' | 'reach';
17
17
  export type ConnectorBranding = {
18
18
  logoUrl?: string;
19
19
  source?: 'builtin' | 'composio-catalog' | 'registry' | 'extension' | 'custom';
20
- backgroundColor?: string;
21
20
  fetchedAt?: string;
22
21
  };
23
22
  export type ConnectorConfirmationPolicy = 'always' | 'writes' | 'admin' | 'never';
@@ -40,6 +39,8 @@ export type ConnectorSecretReference = {
40
39
  xopcSecretRef: {
41
40
  provider: string;
42
41
  fieldKey: string;
42
+ prefix?: string;
43
+ suffix?: string;
43
44
  };
44
45
  };
45
46
  export type ConnectorSecretField = {
@@ -48,6 +49,11 @@ export type ConnectorSecretField = {
48
49
  description?: string;
49
50
  required: boolean;
50
51
  };
52
+ export type ConnectorSetupLink = {
53
+ label: string;
54
+ href: string;
55
+ external?: boolean;
56
+ };
51
57
  export type ConnectorConfigField = {
52
58
  key: string;
53
59
  label: string;
@@ -66,17 +72,10 @@ export type ConnectorRuntimeDefinition = {
66
72
  name: string;
67
73
  version: string;
68
74
  };
69
- } | {
70
- type: 'channel';
71
- channelId: string;
72
- pluginId: string;
73
75
  } | {
74
76
  type: 'composio';
75
77
  toolkit: string;
76
78
  role: 'credential' | 'toolkit';
77
- } | {
78
- type: 'nativeTool';
79
- toolsetId: string;
80
79
  } | {
81
80
  type: 'memorySource';
82
81
  sourceKind: string;
@@ -103,6 +102,7 @@ export type ConnectorDefinition = {
103
102
  setup: {
104
103
  secrets?: ConnectorSecretField[];
105
104
  config?: ConnectorConfigField[];
105
+ links?: ConnectorSetupLink[];
106
106
  };
107
107
  runtime: ConnectorRuntimeDefinition;
108
108
  permissions?: ConnectorPermissions;
@@ -120,7 +120,7 @@ export type ConnectorInstallationPolicy = {
120
120
  allowedAgentIds: string[];
121
121
  maxScope: ConnectorScope;
122
122
  confirmationPolicy: ConnectorConfirmationPolicy;
123
- selectedConnectionIds: string[];
123
+ selectedAccountIds: string[] | null;
124
124
  createdAt: string;
125
125
  updatedAt: string;
126
126
  };
@@ -149,8 +149,12 @@ export type ConnectorAccount = {
149
149
  connectorId: string;
150
150
  principalId: string;
151
151
  identityKey?: string;
152
+ backendId?: string;
152
153
  identity: Record<string, unknown>;
153
154
  currentConnectionId?: string;
155
+ label?: string;
156
+ enabled: boolean;
157
+ allowedAgentIds: string[] | null;
154
158
  createdAt: string;
155
159
  updatedAt: string;
156
160
  };
@@ -184,6 +188,7 @@ export type ConnectorExecutionAuditRecord = {
184
188
  export type ConnectorApprovalStatus = 'pending' | 'approved' | 'denied' | 'expired' | 'consumed';
185
189
  export type ConnectorApprovalRecord = {
186
190
  id: string;
191
+ waitId?: string;
187
192
  principalId: string;
188
193
  connectorId: string;
189
194
  connectionId?: string;
@@ -240,7 +245,7 @@ export type ConnectorInstance = {
240
245
  toolkit: string;
241
246
  role: 'credential' | 'toolkit';
242
247
  } | {
243
- type: 'channel' | 'nativeTool' | 'memorySource';
248
+ type: 'memorySource';
244
249
  id: string;
245
250
  };
246
251
  usage: ConnectorUsageRecord;
@@ -1,6 +1,6 @@
1
1
  import type { Config } from '../config/schema.js';
2
2
  import type { WorkflowDefinition } from '../workflows/domain/definition.js';
3
- export type ConnectorPreflightIssueCode = 'not_installed' | 'disabled' | 'agent_not_allowed' | 'scope_too_narrow' | 'connection_missing' | 'reauthorization_required';
3
+ export type ConnectorPreflightIssueCode = 'not_installed' | 'disabled' | 'agent_not_allowed' | 'scope_too_narrow' | 'connection_missing' | 'account_selection_required' | 'reauthorization_required';
4
4
  export type ConnectorPreflightIssue = {
5
5
  connectorId: string;
6
6
  code: ConnectorPreflightIssueCode;
@@ -9,6 +9,7 @@ export type ConnectorPreflightIssue = {
9
9
  };
10
10
  export type ConnectorPreflightResult = {
11
11
  ok: boolean;
12
+ accounts: Record<string, string[]>;
12
13
  issues: ConnectorPreflightIssue[];
13
14
  optionalIssues: ConnectorPreflightIssue[];
14
15
  };
@@ -1,8 +1,10 @@
1
- import { getConnectorInstallation, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
1
+ import { getConnectorInstallation, init_connector_repository, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
2
+ import { canAccessConnectorAccount, currentAccountConnections } from "./account-access.js";
2
3
  import { getComposioToolkitScope } from "./composio.js";
3
4
  import { getConnectorDefinition } from "./catalog.js";
4
5
  import { listConnectorInstances } from "./instances.js";
5
6
  //#region src/connectors/workflow-preflight.ts
7
+ init_connector_repository();
6
8
  const SCOPE_ORDER = {
7
9
  read: 1,
8
10
  write: 2,
@@ -20,6 +22,7 @@ function preflightWorkflowConnectors(input) {
20
22
  const principalId = input.principalId ?? "local-owner";
21
23
  const instances = listConnectorInstances(input.config);
22
24
  const issues = [];
25
+ const accounts = {};
23
26
  const optionalIssues = [];
24
27
  const add = (requirement, value) => {
25
28
  (requirement.optional ? optionalIssues : issues).push(value);
@@ -53,13 +56,27 @@ function preflightWorkflowConnectors(input) {
53
56
  principalId,
54
57
  connectorId: requirement.connectorId
55
58
  });
56
- const selected = installation?.selectedConnectionIds.length ? connections.filter((connection) => installation.selectedConnectionIds.includes(connection.id)) : connections;
57
- if (selected.some((connection) => connection.status === "active")) continue;
59
+ const selected = installation && installation.selectedAccountIds !== null ? connections.filter((connection) => connection.accountId && installation.selectedAccountIds.includes(connection.accountId)) : connections;
60
+ const active = currentAccountConnections(selected.filter((connection) => installation && canAccessConnectorAccount(connection, installation, input.agentId)));
61
+ if (requirement.accountIds) {
62
+ if (!requirement.accountIds.length || requirement.accountIds.some((id) => !active.some((connection) => connection.accountId === id))) add(requirement, issue(requirement, "connection_missing", `${requirement.connectorId} has an unavailable selected account. Reconnect or update its permissions; no other account will be substituted.`));
63
+ else accounts[requirement.connectorId] = [...requirement.accountIds];
64
+ continue;
65
+ }
66
+ if (active.length > 1) {
67
+ add(requirement, issue(requirement, "account_selection_required", `${requirement.connectorId} has multiple available accounts. Select the intended account before unattended execution.`));
68
+ continue;
69
+ }
70
+ if (active.length === 1) {
71
+ accounts[requirement.connectorId] = [active[0].accountId];
72
+ continue;
73
+ }
58
74
  const needsAuthorization = selected.some((connection) => connection.status === "expired" || connection.status === "failed");
59
75
  add(requirement, issue(requirement, needsAuthorization ? "reauthorization_required" : "connection_missing", needsAuthorization ? `${requirement.connectorId} needs to be reconnected.` : `${requirement.connectorId} has no active account connection.`));
60
76
  }
61
77
  return {
62
78
  ok: issues.length === 0,
79
+ accounts,
63
80
  issues,
64
81
  optionalIssues
65
82
  };
@@ -222,7 +222,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
222
222
  };
223
223
  userModel: {
224
224
  enabled: boolean;
225
- writePolicy: "allow" | "confirm" | "deny";
225
+ writePolicy: "allow" | "deny";
226
226
  sensitiveWritePolicy: "allow" | "confirm" | "deny";
227
227
  processingPolicy: "local_only" | "remote_allowed";
228
228
  extraction: {
@@ -244,7 +244,7 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
244
244
  };
245
245
  knowledgeMemory: {
246
246
  enabled: boolean;
247
- writePolicy: "allow" | "confirm" | "deny";
247
+ writePolicy: "allow" | "deny";
248
248
  readScopes: ("project" | "session" | "agent" | "workspace" | "global")[];
249
249
  contentSources: ("memory" | "connector" | "local_import")[];
250
250
  searchStrategy: "local-first" | "external-first" | "fanout" | "local-only" | "external-only";
@@ -1,21 +1,26 @@
1
+ import { createLogger } from "../../../utils/logger/index.js";
2
+ import { init_logger } from "../../../utils/logger.js";
1
3
  import { hasGatewayScope } from "../../security/gateway-scopes.js";
2
4
  import { listConnectorLearningJobs } from "../../../storage/sqlite/connector-learning-repository.js";
5
+ import { getConnectorAccount, init_connector_account_repository, updateConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
3
6
  import { decideConnectorApproval, getConnectorApproval, listConnectorApprovals, listConnectorConnections } from "../../../storage/sqlite/connector-repository.js";
4
- import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
5
7
  import { getConnectorSyncPolicy, upsertConnectorSyncPolicy } from "../../../storage/sqlite/connector-sync-policy-repository.js";
6
8
  import "../../../storage/sqlite/index.js";
7
9
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
8
- import { resolveComposioApiKey } from "../../../connectors/composio-sessions.js";
10
+ import { activateComposioBackend, addComposioBackend, ensureComposioBackend, getComposioBackend, listComposioBackends, removeComposioBackend } from "../../../connectors/composio-backends.js";
11
+ import { getAuthorizationAttempt } from "../../../connectors/authorization-attempts.js";
12
+ import { ComposioSessionsAdapter, resolveComposioApiKey } from "../../../connectors/composio-sessions.js";
9
13
  import { getConnectorLearningPlan } from "../../../connectors/learning-recipes.js";
10
14
  import { listComposioConnectorCatalog } from "../../../connectors/composio-catalog.js";
11
- import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
12
15
  import { configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitAuthState, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
13
16
  import { listConnectorProviders } from "../../../connectors/providers.js";
14
17
  import { getConnectorDefinition, listConnectorCatalog } from "../../../connectors/catalog.js";
18
+ import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
15
19
  import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
16
20
  import { getConnectorInstance, getInstalledConnectorDefinition, listConnectorInstances } from "../../../connectors/instances.js";
17
21
  import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
18
22
  import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
23
+ import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
19
24
  import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
20
25
  import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
21
26
  import { composioLogoResponse } from "../../../connectors/composio-logo.js";
@@ -29,7 +34,9 @@ import { projectComposioConnectionStatus } from "../../../connectors/runtime-sta
29
34
  import { getGatewayPrincipal } from "../../security/gateway-principal.js";
30
35
  import { markContextSourceAssertionsForReview } from "./context-sources.js";
31
36
  //#region src/gateway/hono/routes/connectors.ts
37
+ init_logger();
32
38
  init_agent_scope();
39
+ init_connector_account_repository();
33
40
  function errorMessage(error) {
34
41
  return error instanceof Error ? error.message : String(error);
35
42
  }
@@ -38,6 +45,7 @@ function defaultConnectorSyncInterval(connectorId) {
38
45
  return definition?.runtime.type === "composio" && definition.runtime.role === "toolkit" ? getConnectorLearningPlan(definition.runtime.toolkit)?.intervalMinutes ?? 30 : 30;
39
46
  }
40
47
  function registerConnectorRoutes(authenticated, deps) {
48
+ const log = createLogger("Connectors:Routes");
41
49
  const { service, strictRateLimitMiddleware } = deps;
42
50
  authenticated.get("/api/connectors/catalog", (c) => {
43
51
  return c.json({
@@ -128,12 +136,93 @@ function registerConnectorRoutes(authenticated, deps) {
128
136
  }, 400);
129
137
  }
130
138
  });
139
+ authenticated.patch("/api/connectors/composio/accounts/:id", strictRateLimitMiddleware, async (c) => {
140
+ const account = getConnectorAccount(c.req.param("id"));
141
+ if (!account || account.principalId !== "local-owner") return c.json({
142
+ ok: false,
143
+ error: "Account not found."
144
+ }, 404);
145
+ const body = await c.req.json().catch(() => null);
146
+ if (!body || typeof body !== "object" || Array.isArray(body) || body.label !== void 0 && (typeof body.label !== "string" || body.label.length > 120) || body.enabled !== void 0 && typeof body.enabled !== "boolean" || body.allowedAgentIds !== void 0 && body.allowedAgentIds !== null && (!Array.isArray(body.allowedAgentIds) || body.allowedAgentIds.some((id) => typeof id !== "string"))) return c.json({
147
+ ok: false,
148
+ error: "Invalid account settings."
149
+ }, 400);
150
+ return c.json({
151
+ ok: true,
152
+ payload: { account: updateConnectorAccount(account.id, body) }
153
+ });
154
+ });
131
155
  authenticated.get("/api/connectors/learning", (c) => {
132
156
  return c.json({
133
157
  ok: true,
134
158
  payload: { jobs: listConnectorLearningJobs({ limit: 100 }) }
135
159
  });
136
160
  });
161
+ authenticated.get("/api/connectors/composio/authorizations/:id", async (c) => {
162
+ let attempt = getAuthorizationAttempt(c.req.param("id"), "local-owner");
163
+ if (!attempt) return c.json({
164
+ ok: false,
165
+ error: "Authorization attempt not found."
166
+ }, 404);
167
+ try {
168
+ if (attempt.status === "awaiting_user") {
169
+ await new ComposioSessionsAdapter().syncConnections({
170
+ principalId: "local-owner",
171
+ backendId: attempt.backend_id ?? void 0
172
+ });
173
+ attempt = getAuthorizationAttempt(attempt.id, "local-owner");
174
+ }
175
+ const connection = listConnectorConnections({
176
+ principalId: "local-owner",
177
+ connectorId: attempt.connector_id
178
+ }).find((item) => item.id === attempt.connection_id);
179
+ return c.json({
180
+ ok: true,
181
+ payload: { attempt: {
182
+ id: attempt.id,
183
+ status: attempt.status,
184
+ authorizationUrl: attempt.authorization_url,
185
+ expiresAt: attempt.expires_at,
186
+ accountId: connection?.accountId
187
+ } }
188
+ });
189
+ } catch (err) {
190
+ log.warn({
191
+ err,
192
+ phase: "authorization_status",
193
+ backendId: attempt.backend_id,
194
+ connectorId: attempt.connector_id
195
+ }, "Could not synchronize authorization status");
196
+ const localConflict = /constraint failed/i.test(errorMessage(err));
197
+ return c.json({
198
+ ok: false,
199
+ error: localConflict ? "Local connection records could not be synchronized. Update and restart the gateway; do not delete or reauthorize your accounts." : "The connection service is temporarily unavailable. Retry checking this authorization."
200
+ }, localConflict ? 500 : 503);
201
+ }
202
+ });
203
+ authenticated.delete("/api/connectors/composio/accounts/:id", strictRateLimitMiddleware, async (c) => {
204
+ const account = getConnectorAccount(c.req.param("id"));
205
+ if (!account || account.principalId !== "local-owner") return c.json({
206
+ ok: false,
207
+ error: "Account not found."
208
+ }, 404);
209
+ updateConnectorAccount(account.id, { enabled: false });
210
+ try {
211
+ for (const connection of listConnectorConnections({
212
+ principalId: account.principalId,
213
+ connectorId: account.connectorId
214
+ })) if (connection.accountId === account.id && connection.status !== "revoked") await revokeComposioConnection(connection.id);
215
+ return c.json({
216
+ ok: true,
217
+ payload: { disconnected: true }
218
+ });
219
+ } catch (error) {
220
+ return c.json({
221
+ ok: false,
222
+ error: `Account paused; some authorizations could not be revoked. Retry disconnecting. ${errorMessage(error)}`
223
+ }, 400);
224
+ }
225
+ });
137
226
  authenticated.get("/api/connectors/composio/accounts/:id/sync-policy", (c) => {
138
227
  const account = getConnectorAccount(c.req.param("id"));
139
228
  if (!account || account.principalId !== "local-owner") return c.json({
@@ -142,7 +231,7 @@ function registerConnectorRoutes(authenticated, deps) {
142
231
  }, 404);
143
232
  const policy = getConnectorSyncPolicy(account.id) ?? {
144
233
  accountId: account.id,
145
- scanEnabled: true,
234
+ scanEnabled: false,
146
235
  proactiveEnabled: false,
147
236
  intervalMinutes: defaultConnectorSyncInterval(account.connectorId),
148
237
  allowedScenarioKeys: [],
@@ -256,10 +345,7 @@ function registerConnectorRoutes(authenticated, deps) {
256
345
  const body = await c.req.json().catch(() => ({}));
257
346
  const row = body && typeof body === "object" && !Array.isArray(body) ? body : {};
258
347
  try {
259
- const connection = updateComposioConnection(c.req.param("id"), {
260
- alias: typeof row.alias === "string" ? row.alias : void 0,
261
- isDefault: typeof row.isDefault === "boolean" ? row.isDefault : void 0
262
- });
348
+ const connection = updateComposioConnection(c.req.param("id"), { alias: typeof row.alias === "string" ? row.alias : void 0 });
263
349
  return c.json({
264
350
  ok: true,
265
351
  payload: { connection }
@@ -416,6 +502,7 @@ function registerConnectorRoutes(authenticated, deps) {
416
502
  payload: { result: await executeComposioTool({
417
503
  slug,
418
504
  arguments: args,
505
+ accountId: typeof body?.accountId === "string" ? body.accountId : void 0,
419
506
  config: service.currentConfig
420
507
  }) }
421
508
  });
@@ -563,11 +650,22 @@ function registerConnectorRoutes(authenticated, deps) {
563
650
  }, 400);
564
651
  const confirmationPolicy = rawConfirmationPolicy === "never" || rawConfirmationPolicy === "writes" || rawConfirmationPolicy === "always" ? rawConfirmationPolicy : void 0;
565
652
  const allowedAgentIds = Array.isArray(row.allowedAgentIds) ? [...new Set(row.allowedAgentIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0;
566
- const selectedConnectionIds = Array.isArray(row.selectedConnectionIds) ? [...new Set(row.selectedConnectionIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0;
653
+ if (row.selectedAccountIds !== void 0 && row.selectedAccountIds !== null && !Array.isArray(row.selectedAccountIds)) return c.json({
654
+ ok: false,
655
+ error: "selectedAccountIds must be null or an array of account IDs."
656
+ }, 400);
657
+ const selectedAccountIds = row.selectedAccountIds === null ? null : Array.isArray(row.selectedAccountIds) ? [...new Set(row.selectedAccountIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0;
658
+ if (Array.isArray(row.selectedAccountIds) && (selectedAccountIds?.length !== row.selectedAccountIds.length || selectedAccountIds.some((id) => {
659
+ const account = getConnectorAccount(id);
660
+ return !account || account.principalId !== "local-owner" || account.connectorId !== `composio-${c.req.param("toolkit")}`;
661
+ }))) return c.json({
662
+ ok: false,
663
+ error: "Select accounts belonging to this application."
664
+ }, 400);
567
665
  try {
568
666
  const policy = updateComposioInstallationPolicy(service.currentConfig, c.req.param("toolkit"), {
569
667
  allowedAgentIds,
570
- selectedConnectionIds,
668
+ selectedAccountIds,
571
669
  confirmationPolicy
572
670
  });
573
671
  return c.json({
@@ -606,9 +704,13 @@ function registerConnectorRoutes(authenticated, deps) {
606
704
  error: `Connector approval is ${approval?.status ?? "unavailable"}.`,
607
705
  payload: { approval }
608
706
  }, 409);
707
+ const resumed = await resumeApprovedConnectorAction(approval, service.connectionRecovery);
609
708
  return c.json({
610
709
  ok: true,
611
- payload: { approval }
710
+ payload: {
711
+ approval,
712
+ resumed
713
+ }
612
714
  });
613
715
  });
614
716
  authenticated.post("/api/connectors/:id/auth/start", strictRateLimitMiddleware, async (c) => {
@@ -621,7 +723,34 @@ function registerConnectorRoutes(authenticated, deps) {
621
723
  error: `Unknown connector: ${connectorOrInstanceId}`
622
724
  }, 404);
623
725
  try {
624
- const authorization = await startConnectorAuthorization(connector, config, instance?.instanceId);
726
+ const body = await c.req.json().catch(() => ({}));
727
+ let authorization;
728
+ if (typeof body?.accountId === "string") {
729
+ const account = getConnectorAccount(body.accountId);
730
+ if (!account || account.principalId !== "local-owner" || account.connectorId !== connector.id || !account.backendId || connector.runtime.type !== "composio") return c.json({
731
+ ok: false,
732
+ error: "Account connection service is unavailable. Refresh accounts first."
733
+ }, 400);
734
+ const current = listConnectorConnections({
735
+ principalId: "local-owner",
736
+ connectorId: connector.id
737
+ }).find((connection) => connection.id === account.currentConnectionId);
738
+ const result = await new ComposioSessionsAdapter().authorize({
739
+ principalId: "local-owner",
740
+ expectedAccountId: account.id,
741
+ toolkit: connector.runtime.toolkit,
742
+ backendId: account.backendId,
743
+ authConfigId: typeof current?.metadata.authConfigId === "string" ? current.metadata.authConfigId : void 0
744
+ });
745
+ authorization = {
746
+ connectorId: connector.id,
747
+ provider: "composio",
748
+ status: "pending",
749
+ authorizationUrl: result.connectUrl,
750
+ connectionId: result.connectionId,
751
+ attemptId: result.attemptId
752
+ };
753
+ } else authorization = await startConnectorAuthorization(connector, config, instance?.instanceId);
625
754
  return c.json({
626
755
  ok: true,
627
756
  payload: { authorization }
@@ -634,20 +763,82 @@ function registerConnectorRoutes(authenticated, deps) {
634
763
  }
635
764
  });
636
765
  authenticated.get("/api/connectors/composio/setup-status", async (c) => {
637
- const status = Boolean(await resolveComposioApiKey()) ? {
638
- configured: true,
766
+ const backend = await ensureComposioBackend();
767
+ const status = backend.mode === "byok" ? {
768
+ configured: Boolean(await resolveComposioApiKey()),
639
769
  mode: "byok"
640
770
  } : await inspectManagedComposioStatus();
641
771
  return c.json({
642
772
  ok: true,
643
- payload: status
773
+ payload: {
774
+ ...status,
775
+ backendId: backend.id,
776
+ backends: listComposioBackends().map(({ id, label, mode, credential_source, verified_at }) => ({
777
+ id,
778
+ label,
779
+ mode,
780
+ credentialSource: credential_source,
781
+ verifiedAt: verified_at
782
+ }))
783
+ }
644
784
  });
645
785
  });
786
+ authenticated.delete("/api/connectors/composio/backends/:id", strictRateLimitMiddleware, async (c) => {
787
+ try {
788
+ await removeComposioBackend(c.req.param("id"));
789
+ return c.json({
790
+ ok: true,
791
+ payload: { removed: true }
792
+ });
793
+ } catch (error) {
794
+ return c.json({
795
+ ok: false,
796
+ error: errorMessage(error)
797
+ }, 400);
798
+ }
799
+ });
646
800
  authenticated.post("/api/connectors/composio/setup", strictRateLimitMiddleware, async (c) => {
647
801
  const body = await c.req.json().catch(() => ({}));
648
802
  const apiKey = body && typeof body === "object" && !Array.isArray(body) ? String(body.apiKey ?? "") : "";
649
803
  try {
650
- await configureComposioApiKey(apiKey);
804
+ if (!body || typeof body !== "object" || Array.isArray(body)) return c.json({
805
+ ok: false,
806
+ error: "Invalid setup request."
807
+ }, 400);
808
+ if (body.mode === "managed") {
809
+ const status = await inspectManagedComposioStatus();
810
+ if (!status.configured) return c.json({
811
+ ok: false,
812
+ error: status.reason ?? "Cloud unavailable."
813
+ }, 400);
814
+ activateComposioBackend((listComposioBackends().find((item) => item.mode === "managed") ?? addComposioBackend({
815
+ mode: "managed",
816
+ label: "XOPC Cloud"
817
+ })).id);
818
+ return c.json({
819
+ ok: true,
820
+ payload: {
821
+ configured: true,
822
+ mode: "managed"
823
+ }
824
+ });
825
+ }
826
+ if (typeof body.backendId === "string") {
827
+ if (!getComposioBackend(body.backendId)) return c.json({
828
+ ok: false,
829
+ error: "Unknown connection service."
830
+ }, 404);
831
+ await new ComposioSessionsAdapter().listToolkitCatalog({
832
+ principalId: "local-owner",
833
+ backendId: body.backendId
834
+ });
835
+ activateComposioBackend(body.backendId);
836
+ return c.json({
837
+ ok: true,
838
+ payload: { configured: true }
839
+ });
840
+ }
841
+ await configureComposioApiKey(apiKey, void 0, typeof body.replaceBackendId === "string" ? body.replaceBackendId : void 0);
651
842
  return c.json({
652
843
  ok: true,
653
844
  payload: {
@@ -1,6 +1,6 @@
1
1
  import { getSqliteDatabase, init_transaction } from "../../../storage/sqlite/transaction.js";
2
- import { countKnowledgeSourceItems, deleteKnowledgeSourceItems } from "../../../storage/sqlite/knowledge-repository.js";
3
2
  import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
3
+ import { countKnowledgeSourceItems, deleteKnowledgeSourceItems } from "../../../storage/sqlite/knowledge-repository.js";
4
4
  import "../../../storage/sqlite/index.js";
5
5
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
6
6
  import { setAssertionStatus } from "../../../user-model/repository.js";
@@ -8,7 +8,6 @@ import "../../../user-model/index.js";
8
8
  import { listConnectedContentCandidates, readConnectedContent } from "../../../connectors/content-enrichment.js";
9
9
  import { getUnderstandingSourceGrant, listUnderstandingSourceGrants, listUnderstandingSourceRuns, revokeUnderstandingSourceGrant, updateUnderstandingSourceGrantPolicies } from "../../../user-context/sources/repository.js";
10
10
  import { listUnderstandingSourceDefinitions } from "../../../user-context/sources/catalog.js";
11
- import { randomUUID } from "node:crypto";
12
11
  //#region src/gateway/hono/routes/context-sources.ts
13
12
  init_agent_scope();
14
13
  init_transaction();
@@ -103,28 +102,6 @@ function registerContextSourceRoutes(authenticated, deps) {
103
102
  return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
104
103
  }
105
104
  });
106
- authenticated.post("/api/context-sources/grants/:grantId/refresh", limited, async (c) => {
107
- const grant = getUnderstandingSourceGrant(c.req.param("grantId"));
108
- if (!grant || grant.status !== "active") return c.json({ error: "Active context source not found" }, 404);
109
- try {
110
- if (grant.adapterId === "local-work-folders") {
111
- const result = await service.refreshDirectorySourceIfChanged({
112
- id: grant.id,
113
- idempotencyKey: randomUUID()
114
- });
115
- return c.json({ result }, result.changed ? 202 : 200);
116
- }
117
- const accountId = typeof grant.config.accountId === "string" ? grant.config.accountId : "";
118
- const connectionId = accountId ? getConnectorAccount(accountId)?.currentConnectionId : void 0;
119
- const job = connectionId ? deps.service.requestConnectorLearning(connectionId, {
120
- mode: "incremental",
121
- reason: "manual"
122
- }) : null;
123
- return job ? c.json({ job }, 202) : c.json({ error: "Context source cannot be refreshed here" }, 409);
124
- } catch (error) {
125
- return c.json({ error: error instanceof Error ? error.message : String(error) }, 400);
126
- }
127
- });
128
105
  authenticated.get("/api/context-sources/work-folders", (c) => c.json({ sources: service.listDirectorySources() }));
129
106
  authenticated.post("/api/context-sources/work-folders", limited, async (c) => {
130
107
  const input = await c.req.json().catch(() => null);
@@ -3,6 +3,7 @@ import { decideConnectorApproval } from "../../../storage/sqlite/connector-repos
3
3
  import "../../../storage/sqlite/index.js";
4
4
  import { listGatewayAgents } from "../../agents-admin.js";
5
5
  import { HomeQueryService, buildHomeWorkbench, decisionFromTask } from "../../../tasks/home-query-service.js";
6
+ import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
6
7
  //#region src/gateway/hono/routes/home.ts
7
8
  /** Register the unified work-home read model and its decision actions. */
8
9
  function registerHomeRoutes(authenticated, deps) {
@@ -26,9 +27,11 @@ function registerHomeRoutes(authenticated, deps) {
26
27
  ok: false,
27
28
  error: `Approval is ${approval.status}`
28
29
  }, 409);
30
+ const resumed = await resumeApprovedConnectorAction(approval, service.connectionRecovery);
29
31
  return c.json({
30
32
  ok: true,
31
- status: approval.status
33
+ status: approval.status,
34
+ resumed
32
35
  });
33
36
  }
34
37
  return c.json({
@@ -1,10 +1,10 @@
1
+ import { getGatewayPrincipal } from "../../security/gateway-principal.js";
1
2
  import { ImportError } from "../../../imports/types.js";
2
3
  import { isImportSource } from "../../../imports/sources.js";
3
4
  import { ImportSelectionRepository } from "../../../storage/sqlite/import-selection-repository.js";
4
5
  import { getLiveInventory, previewInventoryItem, publicInventory, scanProduct } from "../../../imports/inventory.js";
5
6
  import { importSelection, listImportSources } from "../../../imports/productImport.js";
6
7
  import { createRuntimeImportService } from "../../../imports/runtime.js";
7
- import { getGatewayPrincipal } from "../../security/gateway-principal.js";
8
8
  import { z } from "zod";
9
9
  //#region src/gateway/hono/routes/imports.ts
10
10
  const selectionSchema = z.object({
@@ -329,6 +329,14 @@ const AUTHENTICATED_LAZY_ROUTE_BUNDLES = [
329
329
  return { register: registerVoiceRoutes };
330
330
  }
331
331
  },
332
+ {
333
+ id: "user-model-refresh",
334
+ match: (pathname) => pathname === "/api/user-model/refresh" || pathname.startsWith("/api/user-model/refresh/"),
335
+ load: async () => {
336
+ const { registerUserModelRefreshRoutes } = await import("./user-model-refresh.js");
337
+ return { register: registerUserModelRefreshRoutes };
338
+ }
339
+ },
332
340
  {
333
341
  id: "user-model",
334
342
  match: (path) => startsWithAny(path, [
@@ -1,6 +1,6 @@
1
1
  import { readLocalAppAcceptanceConfig } from "../../../local-apps/acceptance.js";
2
- import { LOCAL_APP_RUNTIME_BRIDGE_HASH, injectLocalAppRuntimeBridge } from "../../../local-apps/preview-runtime-bridge.js";
3
2
  import { extensionAssetMimeType } from "../lib/extension-assets.js";
3
+ import { LOCAL_APP_RUNTIME_BRIDGE_HASH, injectLocalAppRuntimeBridge } from "../../../local-apps/preview-runtime-bridge.js";
4
4
  import { relative, resolve } from "node:path";
5
5
  import { existsSync, readFileSync, statSync } from "node:fs";
6
6
  //#region src/gateway/hono/routes/local-apps.ts
@@ -1,6 +1,6 @@
1
+ import { isManagedConnectorServer } from "../../../connectors/materialize.js";
1
2
  import { canonicalizeConfiguredMcpServer, normalizeConfiguredMcpServers } from "../../../config/mcp-config-normalize.js";
2
3
  import { loadMergedBundleMcpConfig } from "../../../agent/mcp/bundle-mcp-config.js";
3
- import { isManagedConnectorServer } from "../../../connectors/materialize.js";
4
4
  import { getWorkspacePath } from "../../../config/workspace-path-helpers.js";
5
5
  import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
6
6
  import { listBundleMcpServerCapabilitiesForGateway, listBundleMcpServerToolsForGateway } from "../../../agent/mcp/bundle-mcp-gateway.js";
@@ -405,6 +405,10 @@ function registerProjectsRoutes(authenticated, deps) {
405
405
  originClass: "system",
406
406
  replaceExisting: true
407
407
  });
408
+ if (!record.item) return c.json({
409
+ ok: false,
410
+ error: "This memory was deleted and automatic recreation is disabled."
411
+ }, 409);
408
412
  return c.json({
409
413
  ok: true,
410
414
  knowledge: record.item
@@ -804,6 +808,10 @@ function registerProjectsRoutes(authenticated, deps) {
804
808
  originClass: "agent",
805
809
  replaceExisting: true
806
810
  });
811
+ if (!record.item) return c.json({
812
+ ok: false,
813
+ error: "This memory was deleted and automatic recreation is disabled."
814
+ }, 409);
807
815
  return c.json({
808
816
  ok: true,
809
817
  knowledge: record.item