@xopcai/xopc 0.0.306 → 0.0.307

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 (216) 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-CZeQo09T.js} +1 -1
  5. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BPsRb9Ck.js +1 -0
  6. package/dist/gateway/static/root/assets/agents-BlrHMbRx.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-Bzw4fQP8.js} +1 -1
  10. package/dist/gateway/static/root/assets/appearance-settings-8GZpUXva.js +1 -0
  11. package/dist/gateway/static/root/assets/apps-page-BkQQtIxH.js +1 -0
  12. package/dist/gateway/static/root/assets/{archive-plugin-BxOvZ-ZX.js → archive-plugin-CQ2NaoHb.js} +1 -1
  13. package/dist/gateway/static/root/assets/{attachment-load-B0FzTMAJ.js → attachment-load-BFi1H7yJ.js} +1 -1
  14. package/dist/gateway/static/root/assets/{automations-page-BpXuPaPg.js → automations-page-CDBXcii_.js} +1 -1
  15. package/dist/gateway/static/root/assets/automations-workspace-CUpiTTiY.js +6 -0
  16. package/dist/gateway/static/root/assets/{binary-plugins-BP7wfpqy.js → binary-plugins-D07eWmOx.js} +1 -1
  17. package/dist/gateway/static/root/assets/{block-editor-oMLvdnOQ.js → block-editor-CtVnjyYU.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-DyrSbDdG.js} +2 -2
  20. package/dist/gateway/static/root/assets/browser-settings-page-CqTxLpil.js +3 -0
  21. package/dist/gateway/static/root/assets/capabilities-settings-panel-BZ_-pnS6.js +8 -0
  22. package/dist/gateway/static/root/assets/channels-settings-DAD9qE3J.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-B62SZdAo.js} +1 -1
  25. package/dist/gateway/static/root/assets/{computer-settings-page-CWx_jnng.js → computer-settings-page-ClSresNq.js} +1 -1
  26. package/dist/gateway/static/root/assets/connector-service-page-CPqVmNvx.js +1 -0
  27. package/dist/gateway/static/root/assets/connectors-page-BUQyg3CW.js +2 -0
  28. package/dist/gateway/static/root/assets/{cron-expression-DMRRL4Zg.js → cron-expression-CTMi_tql.js} +1 -1
  29. package/dist/gateway/static/root/assets/{date-picker-BSwL0e6E.js → date-picker-B71AJK50.js} +1 -1
  30. package/dist/gateway/static/root/assets/{dependency-picker-BQTspLzC.js → dependency-picker-DlyGK-kA.js} +1 -1
  31. package/dist/gateway/static/root/assets/{desktop-pet-C3lFxDF6.js → desktop-pet-DGkbTE8_.js} +1 -1
  32. package/dist/gateway/static/root/assets/{desktop-pet-settings-Y8pjpXFE.js → desktop-pet-settings-BY8r9j66.js} +1 -1
  33. package/dist/gateway/static/root/assets/device-pairing-wizard-DzRrgd59.js +1 -0
  34. package/dist/gateway/static/root/assets/{extension-debug-page-CVGiGVcR.js → extension-debug-page-L8Mm1n3A.js} +1 -1
  35. package/dist/gateway/static/root/assets/{extension-page-g3JtCP_y.js → extension-page-CFc4vSNU.js} +1 -1
  36. package/dist/gateway/static/root/assets/{extension-settings-page-CjpoKV1f.js → extension-settings-page-B5zWyHr3.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-D7qmTH4R.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-Glsl3X5b.js} +1 -1
  43. package/dist/gateway/static/root/assets/home-page-s9hDQ8Hc.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-ByBX7ome.js} +1 -1
  46. package/dist/gateway/static/root/assets/{index-Do9MltC4.js → index-RBCkv8a_.js} +48 -48
  47. package/dist/gateway/static/root/assets/index-cFU4S35z.css +1 -0
  48. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CNq5D4pe.js → keyboard-shortcuts-settings-C45RlO8a.js} +1 -1
  49. package/dist/gateway/static/root/assets/local-app-workbench-page-DP0x2jpR.js +2 -0
  50. package/dist/gateway/static/root/assets/{local-apps-page-DQnRA598.js → local-apps-page-C_AQc2bI.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-DvM8Pyok.js +2 -0
  53. package/dist/gateway/static/root/assets/{management-settings-DKcO5fQ-.js → management-settings-D1uwSutV.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-C4mhf13f.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-D35sErp2.js +5 -0
  58. package/dist/gateway/static/root/assets/notes-page-8jCDklDn.js +8 -0
  59. package/dist/gateway/static/root/assets/{page-tabs-CgEoHSVT.js → page-tabs-1go_BtX1.js} +1 -1
  60. package/dist/gateway/static/root/assets/{preview-open-alternatives-Ck2uKTbf.js → preview-open-alternatives-DmoSC0j1.js} +1 -1
  61. package/dist/gateway/static/root/assets/{proactive-page-Dr1mCJhZ.js → proactive-page-xAjKTIID.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-BUMQHy_N.js +1 -0
  64. package/dist/gateway/static/root/assets/projects-page-DT-Mt7XR.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-Clz3byir.js +1 -0
  67. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CPwdgWKo.js → runtime-tools-settings-panel-ClkOoxDl.js} +2 -2
  68. package/dist/gateway/static/root/assets/{schema-form-8psK4cFO.js → schema-form-BuEmLiaU.js} +1 -1
  69. package/dist/gateway/static/root/assets/sessions-page-tQRwktKm.js +1 -0
  70. package/dist/gateway/static/root/assets/settings-advanced-gate-DqWg9XS5.js +1 -0
  71. package/dist/gateway/static/root/assets/{settings-form-section-D_Gsz5rl.js → settings-form-section-Dor39QON.js} +1 -1
  72. package/dist/gateway/static/root/assets/{settings-page-C_Tj_mkZ.js → settings-page-Xj-yvIc8.js} +1 -1
  73. package/dist/gateway/static/root/assets/setup-status-panel-BB_sMB7P.js +1 -0
  74. package/dist/gateway/static/root/assets/{share-preview-page-B_M_oPsT.js → share-preview-page-BFWZoXdm.js} +1 -1
  75. package/dist/gateway/static/root/assets/shares-settings-oDALm4b6.js +1 -0
  76. package/dist/gateway/static/root/assets/skill-reload-api-DmwelnfK.js +1 -0
  77. package/dist/gateway/static/root/assets/{skills-page-DYgwzl5B.js → skills-page-BE9JXz4U.js} +1 -1
  78. package/dist/gateway/static/root/assets/{skills-page.utils-Cuh6s2HM.js → skills-page.utils-Ii8qeXhs.js} +1 -1
  79. package/dist/gateway/static/root/assets/{system-settings-panel-aassGyNb.js → system-settings-panel-Di6OSO-0.js} +1 -1
  80. package/dist/gateway/static/root/assets/task-detail-page-D1AWszc7.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-DDOlOYlj.js} +1 -1
  83. package/dist/gateway/static/root/assets/{use-autosave-QGYG7oMZ.js → use-autosave-CQ8uWNnB.js} +1 -1
  84. package/dist/gateway/static/root/assets/user-model-page-C00i4ea0.js +2 -0
  85. package/dist/gateway/static/root/assets/{voice-api-key-field-D1s0gIRW.js → voice-api-key-field-COTzshjL.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-_URrXbi4.js} +1 -1
  88. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BYToUPUY.js → workflow-run-setup-panel-CALs-1nd.js} +2 -2
  89. package/dist/gateway/static/root/assets/workflows-page-BUiBjz6m.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/src/agent/external-tools/composio-provider.js +83 -20
  100. package/dist/src/agent/external-tools/gateway-tools.js +2 -1
  101. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  102. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +1 -1
  103. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  104. package/dist/src/cli/commands/gateway/lifecycle.js +2 -2
  105. package/dist/src/cli/commands/update.js +1 -1
  106. package/dist/src/config/schema.d.ts +12 -0
  107. package/dist/src/config/schema.js +4 -2
  108. package/dist/src/connectors/account-access.d.ts +4 -0
  109. package/dist/src/connectors/account-access.js +23 -0
  110. package/dist/src/connectors/approval-resume.d.ts +4 -0
  111. package/dist/src/connectors/approval-resume.js +23 -0
  112. package/dist/src/connectors/auth-provider-registry.d.ts +1 -0
  113. package/dist/src/connectors/auth-provider-registry.js +2 -1
  114. package/dist/src/connectors/authorization-attempts.d.ts +21 -0
  115. package/dist/src/connectors/authorization-attempts.js +33 -0
  116. package/dist/src/connectors/builtin-catalog.js +1 -3
  117. package/dist/src/connectors/catalog.js +2 -1
  118. package/dist/src/connectors/china-catalog.d.ts +2 -0
  119. package/dist/src/connectors/china-catalog.js +430 -0
  120. package/dist/src/connectors/composio-backends.d.ts +26 -0
  121. package/dist/src/connectors/composio-backends.js +65 -0
  122. package/dist/src/connectors/composio-catalog.js +2 -1
  123. package/dist/src/connectors/composio-managed-client.js +3 -1
  124. package/dist/src/connectors/composio-managed-events.js +5 -2
  125. package/dist/src/connectors/composio-session-types.d.ts +2 -0
  126. package/dist/src/connectors/composio-sessions.d.ts +11 -2
  127. package/dist/src/connectors/composio-sessions.js +137 -35
  128. package/dist/src/connectors/composio-triggers.js +4 -2
  129. package/dist/src/connectors/composio.d.ts +11 -8
  130. package/dist/src/connectors/composio.js +68 -84
  131. package/dist/src/connectors/connected-source-ingestion.js +4 -3
  132. package/dist/src/connectors/connection-recovery-service.js +25 -13
  133. package/dist/src/connectors/connector-identity.d.ts +2 -0
  134. package/dist/src/connectors/connector-identity.js +18 -5
  135. package/dist/src/connectors/content-enrichment.js +1 -1
  136. package/dist/src/connectors/instances.js +1 -7
  137. package/dist/src/connectors/learning-coordinator.js +4 -3
  138. package/dist/src/connectors/materialize.js +14 -1
  139. package/dist/src/connectors/policy.d.ts +1 -1
  140. package/dist/src/connectors/policy.js +1 -1
  141. package/dist/src/connectors/principal.js +24 -3
  142. package/dist/src/connectors/providers.d.ts +1 -0
  143. package/dist/src/connectors/providers.js +14 -2
  144. package/dist/src/connectors/runtime-adapter-registry.js +4 -9
  145. package/dist/src/connectors/secret-store.d.ts +4 -1
  146. package/dist/src/connectors/secret-store.js +7 -3
  147. package/dist/src/connectors/source-change-publisher.js +4 -2
  148. package/dist/src/connectors/types.d.ts +16 -11
  149. package/dist/src/connectors/workflow-preflight.d.ts +2 -1
  150. package/dist/src/connectors/workflow-preflight.js +20 -3
  151. package/dist/src/gateway/hono/routes/connectors.js +208 -17
  152. package/dist/src/gateway/hono/routes/context-sources.js +1 -1
  153. package/dist/src/gateway/hono/routes/home.js +4 -1
  154. package/dist/src/gateway/hono/routes/imports.js +1 -1
  155. package/dist/src/gateway/hono/routes/local-apps.js +1 -1
  156. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  157. package/dist/src/gateway/hono/routes/update.js +2 -2
  158. package/dist/src/gateway/index.js +1 -1
  159. package/dist/src/gateway/run-loop.js +1 -1
  160. package/dist/src/gateway/service.js +10 -10
  161. package/dist/src/infra/gateway-processes.js +1 -1
  162. package/dist/src/infra/update-restart.js +2 -2
  163. package/dist/src/infra/update-runner.js +2 -2
  164. package/dist/src/infra/update-startup.js +1 -1
  165. package/dist/src/proactive/follow-ups.js +2 -1
  166. package/dist/src/storage/sqlite/connection-wait-repository.d.ts +3 -0
  167. package/dist/src/storage/sqlite/connection-wait-repository.js +63 -2
  168. package/dist/src/storage/sqlite/connector-account-repository.d.ts +6 -0
  169. package/dist/src/storage/sqlite/connector-account-repository.js +35 -7
  170. package/dist/src/storage/sqlite/connector-repository.js +15 -10
  171. package/dist/src/storage/sqlite/connector-sync-policy-repository.js +1 -1
  172. package/dist/src/storage/sqlite/index.js +4 -2
  173. package/dist/src/storage/sqlite/migrations/182_connector_account_policies.sql +92 -0
  174. package/dist/src/storage/sqlite/migrations/183_connector_backend_consistency.sql +20 -0
  175. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  176. package/dist/src/storage/sqlite/migrations/runner.js +7 -7
  177. package/dist/src/storage/sqlite/schema.js +1 -1
  178. package/dist/src/tasks/home-query-service.js +3 -3
  179. package/dist/src/tui/backends/gateway-realtime-backend.js +1 -1
  180. package/dist/src/tui/tui-startup-resources.js +1 -1
  181. package/dist/src/workflows/domain/definition.d.ts +1 -0
  182. package/dist/src/workflows/domain/validation.js +1 -1
  183. package/dist/src/workflows/service/workflow-run-service.js +14 -0
  184. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
  185. package/dist/src/workflows/service/workflow-session-bridge.js +1 -0
  186. package/package.json +3 -3
  187. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CxOv4ivK.js +0 -1
  188. package/dist/gateway/static/root/assets/agents-DzKx7z3k.js +0 -1
  189. package/dist/gateway/static/root/assets/api-gpHh07OL.js +0 -1
  190. package/dist/gateway/static/root/assets/appearance-settings-BQfR5vrq.js +0 -1
  191. package/dist/gateway/static/root/assets/apps-page-BceB7JHZ.js +0 -1
  192. package/dist/gateway/static/root/assets/automations-workspace-Cn_p8zY_.js +0 -6
  193. package/dist/gateway/static/root/assets/browser-settings-page-CCUO3G23.js +0 -3
  194. package/dist/gateway/static/root/assets/capabilities-settings-panel-BjMb5H2_.js +0 -8
  195. package/dist/gateway/static/root/assets/channels-settings-P22-_i13.js +0 -1
  196. package/dist/gateway/static/root/assets/connectors-page-BLgPORmH.js +0 -2
  197. package/dist/gateway/static/root/assets/device-pairing-wizard-DM4_GMzo.js +0 -1
  198. package/dist/gateway/static/root/assets/gateway-realtime-store-BGmP1obI.js +0 -1
  199. package/dist/gateway/static/root/assets/home-page-CB_XVtIM.js +0 -1
  200. package/dist/gateway/static/root/assets/index-CI37dTAn.css +0 -1
  201. package/dist/gateway/static/root/assets/local-app-workbench-page-BxQlEje6.js +0 -2
  202. package/dist/gateway/static/root/assets/logs-page-CT5GrcMs.js +0 -2
  203. package/dist/gateway/static/root/assets/note-detail-panel-5dc3LKTL.js +0 -5
  204. package/dist/gateway/static/root/assets/notes-page-AbwxgXuG.js +0 -8
  205. package/dist/gateway/static/root/assets/project-detail-page-DnE1zI1c.js +0 -1
  206. package/dist/gateway/static/root/assets/projects-page-BD0nLYxk.js +0 -1
  207. package/dist/gateway/static/root/assets/remote-access-hub-TYuE6A3S.js +0 -1
  208. package/dist/gateway/static/root/assets/sessions-page-BcWDQQFX.js +0 -1
  209. package/dist/gateway/static/root/assets/settings-advanced-gate-DzGQX6Hq.js +0 -1
  210. package/dist/gateway/static/root/assets/setup-status-panel-CE2X89qN.js +0 -1
  211. package/dist/gateway/static/root/assets/shares-settings-BL4H9Iym.js +0 -1
  212. package/dist/gateway/static/root/assets/skill-reload-api-WMKIgUOp.js +0 -1
  213. package/dist/gateway/static/root/assets/task-detail-page-BjeRslap.js +0 -1
  214. package/dist/gateway/static/root/assets/theme-store-RUBQBsFP.js +0 -1
  215. package/dist/gateway/static/root/assets/user-model-page-PrRsd4go.js +0 -2
  216. package/dist/gateway/static/root/assets/workflows-page-Z8iZe9YP.js +0 -6
@@ -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
  };
@@ -1,27 +1,32 @@
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
- import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
22
+ import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
19
23
  import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
20
24
  import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
21
25
  import { composioLogoResponse } from "../../../connectors/composio-logo.js";
22
26
  import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
23
27
  import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
24
28
  import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
29
+ import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
25
30
  import { previewConnectorDefinition, testConnectorInstance } from "../../../connectors/health.js";
26
31
  import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
27
32
  import { setConnectorEnabled } from "../../../connectors/lifecycle.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";
@@ -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({
@@ -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";
@@ -1,11 +1,11 @@
1
1
  import { PACKAGE_VERSION, init_package_version } from "../../../package-version.js";
2
2
  import { loadConfig } from "../../../config/loader.js";
3
3
  import "../../../config/index.js";
4
- import { normalizeUpdateChannel } from "../../../infra/update-channels.js";
5
4
  import { acquireUpdateLock } from "../../../infra/update-lock.js";
6
- import { formatUpdateApiResult, runGatewayUpdateWithPostSteps } from "../../../infra/update-runner.js";
5
+ import { normalizeUpdateChannel } from "../../../infra/update-channels.js";
7
6
  import { getUpdateAvailable, runGatewayUpdateCheck } from "../../../infra/update-startup.js";
8
7
  import { createGatewayRouteLogger } from "../lib/route-logger.js";
8
+ import { formatUpdateApiResult, runGatewayUpdateWithPostSteps } from "../../../infra/update-runner.js";
9
9
  import { streamSSE } from "hono/streaming";
10
10
  //#region src/gateway/hono/routes/update.ts
11
11
  init_package_version();
@@ -1,7 +1,6 @@
1
1
  import { GatewayLockError, acquireGatewayLock, init_lock } from "./lock.js";
2
2
  import { buildDefaultCorsOrigins, isAllInterfacesHost, isLoopbackHost, resolveEffectiveGatewayPort, resolveGatewayServiceListenPort } from "./host.js";
3
3
  import { defaultGatewayBindMode, isContainerEnvironment, resolveGatewayBindHost, resolveGatewayBindHostSync, resolveGatewayBindMode, resolveGatewayEffectiveHost } from "../config/gateway-bind.js";
4
- import { checkPortAvailable, forceFreePortAndWait, listPortListeners, parseLsofOutput } from "./ports.js";
5
4
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
6
5
  import { resolveGatewayListenHost, resolveGatewayListenPlan } from "./listen.js";
7
6
  import { buckets } from "./rate-limit/buckets.js";
@@ -13,6 +12,7 @@ import { GatewayService } from "./service.js";
13
12
  import { createHonoApp } from "./hono/app.js";
14
13
  import { GatewayServer } from "./server.js";
15
14
  import { runGatewayLoop } from "./run-loop.js";
15
+ import { checkPortAvailable, forceFreePortAndWait, listPortListeners, parseLsofOutput } from "./ports.js";
16
16
  import { apiError, apiOk } from "./protocol.js";
17
17
  import "./hono/index.js";
18
18
  import { assertSecureGatewayHttpUrl, assertSecureWebSocketUrl, isInsecurePrivateWsAllowed, isSecureWebSocketUrl } from "./ws-security.js";
@@ -2,9 +2,9 @@ import { acquireGatewayLock, init_lock } from "./lock.js";
2
2
  import { loadConfig } from "../config/loader.js";
3
3
  import "../config/index.js";
4
4
  import { isRestartEnabled } from "../config/commands.flags.js";
5
- import { consumeGatewayRestartIntentSync, consumeGatewaySigusr1RestartAuthorization, isGatewaySigusr1RestartExternallyAllowed, resetGatewayRestartStateForInProcessRestart, scheduleGatewaySigusr1Restart, setGatewaySigusr1RestartPolicy } from "../infra/restart.js";
6
5
  import { runBootstrapMigrationsSync } from "../migrations/runner.js";
7
6
  import { restartGatewayProcessWithFreshPid } from "./respawn.js";
7
+ import { consumeGatewayRestartIntentSync, consumeGatewaySigusr1RestartAuthorization, isGatewaySigusr1RestartExternallyAllowed, resetGatewayRestartStateForInProcessRestart, scheduleGatewaySigusr1Restart, setGatewaySigusr1RestartPolicy } from "../infra/restart.js";
8
8
  //#region src/gateway/run-loop.ts
9
9
  /**
10
10
  * Gateway Run Loop - Core run loop for gateway process management
@@ -59,6 +59,12 @@ import { registerClarificationChannelRuntime } from "./clarify-runtime.js";
59
59
  import { ChannelManager } from "../channels/manager.js";
60
60
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
61
61
  import "../config/index.js";
62
+ import { DiscussionService } from "../discussions/service.js";
63
+ import { DiscussionOrganizer } from "../discussions/organizer.js";
64
+ import { DiscussionLiveWorker } from "../discussions/live-worker.js";
65
+ import { DiscussionOrganizerWorker } from "../discussions/organizer-worker.js";
66
+ import { DiscussionSealer } from "../discussions/sealer.js";
67
+ import "../discussions/index.js";
62
68
  import { ManagedComposioEventPoller } from "../connectors/composio-managed-events.js";
63
69
  import { startConnectedKnowledgeCoordinator } from "../knowledge/coordinator.js";
64
70
  import "../knowledge/index.js";
@@ -68,19 +74,10 @@ import { ConnectedSourceChangePublisher } from "../connectors/source-change-publ
68
74
  import { startConnectorSupervisor } from "../connectors/supervisor.js";
69
75
  import { EndpointToolRuntime } from "../endpoint-tools/runtime.js";
70
76
  import "../endpoint-tools/index.js";
71
- import { DiscussionService } from "../discussions/service.js";
72
- import { DiscussionOrganizer } from "../discussions/organizer.js";
73
- import { DiscussionLiveWorker } from "../discussions/live-worker.js";
74
- import { DiscussionOrganizerWorker } from "../discussions/organizer-worker.js";
75
- import { DiscussionSealer } from "../discussions/sealer.js";
76
- import "../discussions/index.js";
77
- import { createBackgroundTask } from "../infra/background-task.js";
78
- import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
79
- import { LocalAppService } from "../local-apps/service.js";
80
- import "../local-apps/index.js";
81
77
  import { assertGatewayAuthConfigured, extractToken, resolveGatewayAuth, validateToken } from "./auth.js";
82
78
  import { prepareAutomationAgentSession } from "./automation-agent-session.js";
83
79
  import { stopTailscaleExposure } from "./tailscale-lifecycle.js";
80
+ import { createBackgroundTask } from "../infra/background-task.js";
84
81
  import { buildTaskAgentContext } from "../agent/source-context/task-context.js";
85
82
  import { deliverProactiveCard } from "../proactive/inbox/delivery.js";
86
83
  import { WorkDiscoveryService } from "../work-discovery/service.js";
@@ -112,6 +109,8 @@ import { getXopcCloudCatalogCoordinator } from "../providers/xopc-cloud-catalog-
112
109
  import { ModelCatalogSyncService } from "../providers/model-catalog-sync-service.js";
113
110
  import { runBootstrapMigrationsSync } from "../migrations/runner.js";
114
111
  import { NotificationService } from "../notifications/service.js";
112
+ import { LocalAppService } from "../local-apps/service.js";
113
+ import "../local-apps/index.js";
115
114
  import { createRuntimeBrowserAutomationService } from "../browser/automations/runtime-service.js";
116
115
  import "../browser/automations/index.js";
117
116
  import { mapProductEventToProactive } from "../proactive/events/product-event-bridge.js";
@@ -121,6 +120,7 @@ import { ProactiveWorker } from "../proactive/execution/worker.js";
121
120
  import { ProactiveTemporalWorker } from "../proactive/temporal/worker.js";
122
121
  import { ProactiveInboxWorker } from "../proactive/inbox/worker.js";
123
122
  import "../proactive/index.js";
123
+ import { scheduleGatewayUpdateCheck } from "../infra/update-startup.js";
124
124
  import { resolveChannelConnectDeferSet } from "./resolve-channel-connect-defer.js";
125
125
  import { restartGatewayProcessWithFreshPid } from "./respawn.js";
126
126
  import { GatewaySessionsApi } from "./service/sessions-api.js";
@@ -1,5 +1,5 @@
1
- import { isGatewayArgv, parseProcCmdline } from "./gateway-process-argv.js";
2
1
  import { listPortListeners } from "../gateway/ports.js";
2
+ import { isGatewayArgv, parseProcCmdline } from "./gateway-process-argv.js";
3
3
  import fs from "node:fs";
4
4
  import { spawnSync } from "node:child_process";
5
5
  //#region src/infra/gateway-processes.ts
@@ -2,10 +2,10 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { init_paths, resolveConfigPath } from "../config/paths.js";
4
4
  import { init_loader, loadConfig } from "../config/loader.js";
5
- import { isRestartEnabled } from "../config/commands.flags.js";
6
5
  import { resolveGatewayService } from "../daemon/service.js";
7
- import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
6
+ import { isRestartEnabled } from "../config/commands.flags.js";
8
7
  import { authorizeGatewaySigusr1Restart, writeGatewayRestartIntentSync } from "./restart.js";
8
+ import { findVerifiedGatewayListenerPidsOnPortSync, signalVerifiedGatewayPidSync } from "./gateway-processes.js";
9
9
  import { refreshGatewayServiceAfterUpdate } from "./update-service-refresh.js";
10
10
  //#region src/infra/update-restart.ts
11
11
  init_loader();
@@ -1,11 +1,11 @@
1
1
  import { runPostUpdateExtensionSync } from "../extensions/update.js";
2
+ import "./update-channels.js";
3
+ import { compareSemver, resolveNpmChannelTag } from "./update-check.js";
2
4
  import { readPackageName, readPackageVersion } from "./package-json.js";
3
5
  import { createDefaultCommandRunner, runCommandWithTimeout } from "./run-command.js";
4
6
  import { XOPC_PACKAGE_NAME, cleanupGlobalRenameDirs, createGlobalInstallEnv, detectGlobalInstallManagerForRoot, resolveGlobalInstallSpec, resolveGlobalInstallTarget } from "./update-global.js";
5
7
  import { runGlobalPackageUpdateSteps } from "./package-update-steps.js";
6
8
  import { resolveStableNodePath } from "./stable-node-path.js";
7
- import "./update-channels.js";
8
- import { compareSemver, resolveNpmChannelTag } from "./update-check.js";
9
9
  import { trimLogTail } from "./update-log.js";
10
10
  import { maybeRestartGatewayAfterUpdate } from "./update-restart.js";
11
11
  import path from "node:path";
@@ -3,9 +3,9 @@ import { init_paths_state, resolveUpdateCheckStatePath } from "../config/paths-s
3
3
  import { createLogger } from "../utils/logger/index.js";
4
4
  import { init_logger } from "../utils/logger.js";
5
5
  import { init_write_file_atomic, writeTextAtomic } from "./write-file-atomic.js";
6
+ import { acquireUpdateLock } from "./update-lock.js";
6
7
  import { normalizeUpdateChannel } from "./update-channels.js";
7
8
  import { compareSemver, detectInstallKind, resolveNpmChannelTag, resolvePackageRoot } from "./update-check.js";
8
- import { acquireUpdateLock } from "./update-lock.js";
9
9
  import { createHash, randomUUID } from "node:crypto";
10
10
  import { readFile } from "node:fs/promises";
11
11
  //#region src/infra/update-startup.ts
@@ -1,6 +1,6 @@
1
1
  import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import { getConnectorConnection, init_connector_repository } from "../storage/sqlite/connector-repository.js";
2
3
  import { listKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
3
- import { getConnectorConnection } from "../storage/sqlite/connector-repository.js";
4
4
  import { sourceFreshness } from "./source-freshness.js";
5
5
  import { emailFields, readMailThread } from "./mail-thread.js";
6
6
  import { authorizedConnectedSource } from "./execution/authorization.js";
@@ -12,6 +12,7 @@ import { ProactiveEventService } from "./service.js";
12
12
  import { randomUUID } from "node:crypto";
13
13
  import { z } from "zod";
14
14
  //#region src/proactive/follow-ups.ts
15
+ init_connector_repository();
15
16
  init_transaction();
16
17
  const COMMUNICATION_SCENARIO = "communication_follow_up";
17
18
  const CreateSchema = z.object({
@@ -21,6 +21,9 @@ export declare function requireSessionConnection(input: {
21
21
  export declare function queueConnectionResolution(wait: ConnectionWait, resolution: 'continued' | 'skipped'): ConnectionWait;
22
22
  export declare function consumeConnectionResume(input: SessionInput): boolean;
23
23
  export declare function connectionBindings(conversationId: string): ConnectionNeed[];
24
+ /** Changes to the objective or transcript invalidate an outstanding action approval. */
25
+ export declare function connectorObjectiveScope(conversationId: string): string | undefined;
26
+ export declare function bindObjectiveAccount(conversationId: string, connectorId: string, accountId: string): void;
24
27
  export declare function connectionBinding(conversationId: string, connectorId: string): string | undefined;
25
28
  /** New input wins over an outstanding auto-resume intent, including an already queued resume. */
26
29
  export declare function invalidateConnectionResumeIntent(conversationId: string): void;