@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
@@ -2,6 +2,7 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { getConnectorInstallation, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
4
4
  import "../storage/sqlite/index.js";
5
+ import { canAccessConnectorAccount, currentAccountConnections } from "./account-access.js";
5
6
  import { ComposioSessionsAdapter } from "./composio-sessions.js";
6
7
  import { decodeConnectedSourceCursor, encodeConnectedSourceCursor } from "./connected-source-cursor.js";
7
8
  import { scopeForComposioAction } from "./composio.js";
@@ -288,11 +289,11 @@ async function ingestComposioConnectedSource(input) {
288
289
  const installation = getConnectorInstallation(`${connectorId}-local-owner`);
289
290
  if (!installation?.enabled) throw new Error("Connector installation is not enabled.");
290
291
  if (installation.allowedAgentIds.length && !installation.allowedAgentIds.includes(input.agentId)) throw new Error("This agent is not allowed to sync from the connector.");
291
- const activeConnections = listConnectorConnections({
292
+ const activeConnections = currentAccountConnections(listConnectorConnections({
292
293
  principalId: "local-owner",
293
294
  connectorId
294
- }).filter((connection) => connection.status === "active");
295
- const connection = input.connectionId ? activeConnections.find((candidate) => candidate.id === input.connectionId) : activeConnections.find((candidate) => candidate.isDefault) ?? activeConnections[0];
295
+ }).filter((connection) => canAccessConnectorAccount(connection, installation, input.agentId)));
296
+ const connection = input.connectionId ? activeConnections.find((candidate) => candidate.id === input.connectionId) : activeConnections.length === 1 ? activeConnections[0] : void 0;
296
297
  if (!connection) throw new Error("No active connector account is available for connected source ingestion.");
297
298
  if (!connection.accountId) throw new Error("The connector authorization is not assigned to an account.");
298
299
  const adapter = input.adapter ?? new ComposioSessionsAdapter();
@@ -3,17 +3,18 @@ import { init_logger } from "../utils/logger.js";
3
3
  import { getSqliteDatabase, init_transaction } from "../storage/sqlite/transaction.js";
4
4
  import { readCurrentTranscriptId } from "../storage/sqlite/session-instance-repository.js";
5
5
  import { getSessionInputState, init_session_input_repository } from "../storage/sqlite/session-input-repository.js";
6
+ import { getConnectorAccount, init_connector_account_repository } from "../storage/sqlite/connector-account-repository.js";
7
+ import { getConnectorConnection, getConnectorInstallation, init_connector_repository, listConnectorConnections, upsertConnectorInstallation } from "../storage/sqlite/connector-repository.js";
6
8
  import { cancelConnectionObjective, getActiveConnectionWait, getConnectionWait, init_connection_wait_repository, listConnectionWaitsToCheck, publishConnectionWait, queueConnectionResolution, updateConnectionWait } from "../storage/sqlite/connection-wait-repository.js";
7
9
  import { init_session_repository } from "../storage/sqlite/session-repository.js";
8
- import { getConnectorInstallation, listConnectorConnections, upsertConnectorInstallation } from "../storage/sqlite/connector-repository.js";
9
- import { getConnectorAccount } from "../storage/sqlite/connector-account-repository.js";
10
+ import { canAccessConnectorAccount, currentAccountConnections } from "./account-access.js";
10
11
  import { ComposioSessionsAdapter } from "./composio-sessions.js";
11
12
  import { getConfiguredComposioAuthConfigs, isComposioActionAllowedByCatalog, scopeForComposioAction } from "./composio.js";
12
13
  import { getConnectorDefinition } from "./catalog.js";
14
+ import { listConnectorInstances } from "./instances.js";
13
15
  import { capabilityActions, isToolInputSchema, missingConnectionCapabilities } from "./connection-capabilities.js";
14
16
  import { connectorPrincipalForSession } from "./principal.js";
15
17
  import { resolveConnectionCandidate } from "./connection-candidates.js";
16
- import { listConnectorInstances } from "./instances.js";
17
18
  import { installConnector } from "./install.js";
18
19
  import { persistConfigMutation } from "../config/config-mutation.js";
19
20
  import { randomUUID } from "node:crypto";
@@ -22,6 +23,8 @@ init_transaction();
22
23
  init_session_repository();
23
24
  init_session_input_repository();
24
25
  init_connection_wait_repository();
26
+ init_connector_repository();
27
+ init_connector_account_repository();
25
28
  init_logger();
26
29
  const log = createLogger("Connectors:Recovery");
27
30
  const SCOPE_ORDER = {
@@ -88,12 +91,13 @@ var ConnectionRecoveryService = class {
88
91
  const instance = listConnectorInstances(this.deps.getConfig()).find((instance) => instance.connectorId === need.connectorId);
89
92
  const installation = getConnectorInstallation(`${need.connectorId}-${wait.principalId}`);
90
93
  const scopeBlocked = Math.max(1, ...need.capabilities.filter((capability) => /^[A-Z]+_/.test(capability)).map((capability) => SCOPE_ORDER[scopeForComposioAction(capability).scope])) > SCOPE_ORDER[installation?.maxScope ?? "read"];
91
- const blocked = scopeBlocked || instance?.enabled === false || installation?.enabled === false || Boolean(installation?.allowedAgentIds.length && !installation.allowedAgentIds.includes(wait.agentId));
92
94
  const all = listConnectorConnections({
93
95
  principalId: wait.principalId,
94
96
  connectorId: need.connectorId
95
97
  });
96
- const eligible = all.filter((connection) => connection.status === "active" && (!verifiedIds || verifiedIds.has(connection.id)) && (!need.accountId || connection.accountId === need.accountId) && (!installation?.selectedConnectionIds.length || installation.selectedConnectionIds.includes(connection.id)));
98
+ const requested = need.accountId ? all.find((connection) => connection.accountId === need.accountId) : void 0;
99
+ const blocked = scopeBlocked || instance?.enabled === false || installation?.enabled === false || installation?.selectedAccountIds?.length === 0 || Boolean(installation && requested && !canAccessConnectorAccount(requested, installation, wait.agentId)) || Boolean(installation?.allowedAgentIds.length && !installation.allowedAgentIds.includes(wait.agentId));
100
+ const eligible = all.filter((connection) => connection.status === "active" && (!installation || canAccessConnectorAccount(connection, installation, wait.agentId)) && (!verifiedIds || verifiedIds.has(connection.id)) && (!need.accountId || connection.accountId === need.accountId) && (installation?.selectedAccountIds == null || Boolean(connection.accountId && installation.selectedAccountIds.includes(connection.accountId))));
97
101
  const byAccount = /* @__PURE__ */ new Map();
98
102
  for (const connection of eligible) {
99
103
  const key = connection.accountId ?? connection.id;
@@ -102,7 +106,7 @@ var ConnectionRecoveryService = class {
102
106
  if (!previous || connection.id === preferredId || previous.id !== preferredId && connection.updatedAt > previous.updatedAt) byAccount.set(key, connection);
103
107
  }
104
108
  const active = [...byAccount.values()];
105
- const selected = !verifiedIds && need.unavailable ? void 0 : need.attempt ? active.find((connection) => connection.providerConnectionId === need.attempt?.connectionId) : need.connectionId ? active.find((connection) => connection.id === need.connectionId) : active.length === 1 && !need.accountSelector ? active[0] : void 0;
109
+ const selected = !verifiedIds && need.unavailable ? void 0 : need.attempt ? active.find((connection) => connection.providerConnectionId === need.attempt?.connectionId) : need.accountId ? active.find((connection) => connection.accountId === need.accountId) : need.connectionId ? active.find((connection) => connection.id === need.connectionId) : active.length === 1 && !need.accountSelector ? active[0] : void 0;
106
110
  const phase = blocked || selected && need.capabilityError ? "blocked" : selected ? "ready" : active.length > 1 || need.accountSelector && active.length > 0 && !need.connectionId ? "choose_account" : need.attempt && need.attempt.expiresAt > Date.now() ? "authorizing" : need.unavailable || all.some((connection) => [
107
111
  "expired",
108
112
  "revoked",
@@ -115,11 +119,12 @@ var ConnectionRecoveryService = class {
115
119
  return {
116
120
  ...need,
117
121
  alternatives,
122
+ accountId: selected?.accountId ?? need.accountId,
118
123
  connectionId: selected?.id ?? need.connectionId,
119
124
  phase,
120
125
  accounts: active.map((connection) => ({
121
- id: connection.id,
122
- label: connection.alias ?? String(connection.identity.email ?? connection.identity.name ?? connection.id)
126
+ id: connection.accountId,
127
+ label: [getConnectorAccount(connection.accountId)?.label, connection.identity.email ?? connection.identity.name ?? connection.accountId].filter(Boolean).join(" · ")
123
128
  })),
124
129
  ...need.capabilityError && selected ? { reason: need.capabilityError } : {},
125
130
  ...blocked ? { reason: scopeBlocked ? "This action needs broader permissions. Review connector permissions in settings." : "This app is disabled or unavailable to the current agent. Review connector settings." } : {}
@@ -154,7 +159,7 @@ var ConnectionRecoveryService = class {
154
159
  allowedAgentIds: [],
155
160
  maxScope: "read",
156
161
  confirmationPolicy: "writes",
157
- selectedConnectionIds: []
162
+ selectedAccountIds: null
158
163
  });
159
164
  }
160
165
  async checkCapabilities(wait, verified) {
@@ -175,10 +180,15 @@ var ConnectionRecoveryService = class {
175
180
  const definition = getConnectorDefinition(need.connectorId);
176
181
  if (definition?.runtime.type !== "composio" || definition.runtime.role !== "toolkit") throw new Error("Unsupported connector");
177
182
  const toolkit = definition.runtime.toolkit;
183
+ const selected = views.find((view) => view.key === need.key);
184
+ const connection = selected?.connectionId ? getConnectorConnection(selected.connectionId) : void 0;
178
185
  const result = await (await this.adapter.createSession({
179
186
  principalId: wait.principalId,
180
187
  toolkits: [toolkit],
181
- authConfigs: getConfiguredComposioAuthConfigs(this.deps.getConfig(), [toolkit])
188
+ backendId: selected?.accountId ? getConnectorAccount(selected.accountId)?.backendId : void 0,
189
+ ...typeof connection?.metadata.providerPrincipalId === "string" ? { providerPrincipalId: connection.metadata.providerPrincipalId } : {},
190
+ ...connection ? { connectedAccounts: { [toolkit]: [connection.providerConnectionId] } } : {},
191
+ authConfigs: typeof connection?.metadata.authConfigId === "string" ? { [toolkit]: connection.metadata.authConfigId } : void 0
182
192
  })).search({
183
193
  query: `${toolkit} ${need.capabilities.join(" ")} ${capabilityActions(need).flat().join(" ")}`,
184
194
  toolkits: [toolkit]
@@ -303,6 +313,8 @@ var ConnectionRecoveryService = class {
303
313
  const auth = await this.adapter.authorize({
304
314
  principalId: wait.principalId,
305
315
  toolkit: definition.runtime.toolkit,
316
+ expectedAccountId: need.accountId,
317
+ backendId: need.accountId ? getConnectorAccount(need.accountId)?.backendId : void 0,
306
318
  installationId,
307
319
  authConfigId: getConfiguredComposioAuthConfigs(config, [definition.runtime.toolkit])?.[definition.runtime.toolkit]
308
320
  });
@@ -336,7 +348,7 @@ var ConnectionRecoveryService = class {
336
348
  const latest = getConnectionWait(wait.id);
337
349
  if (!latest || latest.version !== wait.version || latest.status !== "open") throw new Error("WAIT_CHANGED");
338
350
  let needs = wait.needs.map((need) => {
339
- const authorized = fresh.find((item) => item.providerConnectionId === need.attempt?.connectionId && item.status === "active");
351
+ const authorized = fresh.find((item) => item.providerConnectionId === need.attempt?.connectionId && item.status === "active" && item.connectorId === need.connectorId && (!need.accountId || item.accountId === need.accountId));
340
352
  return authorized ? {
341
353
  ...need,
342
354
  unavailable: false,
@@ -352,8 +364,8 @@ var ConnectionRecoveryService = class {
352
364
  });
353
365
  if (action.action === "select_account") {
354
366
  const need = needs.find((item) => item.key === action.needKey);
355
- const connection = fresh.find((item) => item.id === action.accountId && item.connectorId === need?.connectorId && item.status === "active");
356
- if (!need || !connection || !this.view(wait, verified).needs.find((item) => item.key === need.key)?.accounts.some((item) => item.id === connection.id)) throw new Error("Account is unavailable.");
367
+ const connection = currentAccountConnections(fresh).find((item) => item.accountId === action.accountId && item.connectorId === need?.connectorId);
368
+ if (!need || !connection || !this.view(wait, verified).needs.find((item) => item.key === need.key)?.accounts.some((item) => item.id === connection.accountId)) throw new Error("Account is unavailable.");
357
369
  needs = needs.map((item) => item.key === need.key ? {
358
370
  ...item,
359
371
  connectionId: connection.id,
@@ -1,4 +1,6 @@
1
1
  import type { ConnectorConnection } from './types.js';
2
+ /** Only verified display fields may enter model context or account summaries. */
3
+ export declare function connectorIdentitySummary(identity: Record<string, unknown>): Record<string, string>;
2
4
  export declare function normalizeConnectorIdentity(toolkit: string, result: unknown): ConnectorConnection['identity'];
3
5
  export declare function connectorIdentityKey(toolkit: string, identity: Record<string, unknown>): string | undefined;
4
6
  export declare function mergeConnectorIdentity(toolkit: string, current: Record<string, unknown>, incoming: Record<string, unknown>): Record<string, unknown>;
@@ -1,4 +1,17 @@
1
1
  //#region src/connectors/connector-identity.ts
2
+ /** Only verified display fields may enter model context or account summaries. */
3
+ function connectorIdentitySummary(identity) {
4
+ return Object.fromEntries([
5
+ "email",
6
+ "username",
7
+ "displayName",
8
+ "workspace",
9
+ "workspaceId",
10
+ "userId",
11
+ "enterpriseId",
12
+ "botUserId"
13
+ ].flatMap((key) => typeof identity[key] === "string" && identity[key].trim() ? [[key, identity[key].slice(0, 320)]] : []));
14
+ }
2
15
  function object(value) {
3
16
  if (!value || typeof value !== "object" || Array.isArray(value)) return {};
4
17
  return value;
@@ -85,16 +98,16 @@ function mergeConnectorIdentity(toolkit, current, incoming) {
85
98
  "googledrive",
86
99
  "github",
87
100
  "slack"
88
- ].includes(normalizedToolkit)) return {
101
+ ].includes(normalizedToolkit)) return connectorIdentitySummary({
89
102
  ...current,
90
103
  ...incoming
91
- };
104
+ });
92
105
  const normalized = Object.fromEntries(Object.entries(normalizeConnectorIdentity(normalizedToolkit, incoming)).filter(([, value]) => value !== void 0 && value !== null && value !== ""));
93
- return {
106
+ return connectorIdentitySummary({
94
107
  ...current,
95
108
  ...incoming,
96
109
  ...normalized
97
- };
110
+ });
98
111
  }
99
112
  //#endregion
100
- export { connectorIdentityKey, mergeConnectorIdentity, normalizeConnectorIdentity };
113
+ export { connectorIdentityKey, connectorIdentitySummary, mergeConnectorIdentity, normalizeConnectorIdentity };
@@ -1,5 +1,5 @@
1
- import { getKnowledgeSourceItem, listKnowledgeSourceItems, upsertKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
2
1
  import { getConnectorConnection, getConnectorInstallation } from "../storage/sqlite/connector-repository.js";
2
+ import { getKnowledgeSourceItem, listKnowledgeSourceItems, upsertKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
3
3
  import "../storage/sqlite/index.js";
4
4
  import { ComposioSessionsAdapter } from "./composio-sessions.js";
5
5
  import { ConnectedKnowledgePipeline } from "../knowledge/connected-knowledge-pipeline.js";
@@ -27,7 +27,7 @@ function connectorInstanceFromRecord(instanceId, record) {
27
27
  const definition = connectorDefinitionFromManagedMarker(markerRecord) ?? getConnectorDefinition(connectorId);
28
28
  const runtime = record.runtime && typeof record.runtime === "object" && !Array.isArray(record.runtime) ? record.runtime : {};
29
29
  const runtimeType = runtime.type;
30
- if (runtimeType !== "composio" && runtimeType !== "channel" && runtimeType !== "nativeTool" && runtimeType !== "memorySource") return [];
30
+ if (runtimeType !== "composio" && runtimeType !== "memorySource") return [];
31
31
  if (runtimeType === "composio" && (typeof runtime.toolkit !== "string" || runtime.role !== "credential" && runtime.role !== "toolkit")) return [];
32
32
  const enabled = markerRecord.enabled !== false;
33
33
  return [{
@@ -47,12 +47,6 @@ function connectorInstanceFromRecord(instanceId, record) {
47
47
  id: instanceId,
48
48
  toolkit: runtime.toolkit,
49
49
  role: runtime.role
50
- } : runtimeType === "channel" ? {
51
- type: "channel",
52
- id: instanceId
53
- } : runtimeType === "nativeTool" ? {
54
- type: "nativeTool",
55
- id: instanceId
56
50
  } : {
57
51
  type: "memorySource",
58
52
  id: instanceId
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { claimNextConnectorLearningJob, enqueueConnectorLearningJob, listConnectorLearningJobs, recoverStaleConnectorLearningJobs, setConnectorLearningPaused, updateConnectorLearningJob } from "../storage/sqlite/connector-learning-repository.js";
4
- import { getConnectorInstallation, listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
5
4
  import { getConnectorAccount, reconcileConnectorAccount } from "../storage/sqlite/connector-account-repository.js";
5
+ import { getConnectorInstallation, listConnectorConnections, upsertConnectorConnection } from "../storage/sqlite/connector-repository.js";
6
6
  import { getConnectorSyncPolicyForConnection } from "../storage/sqlite/connector-sync-policy-repository.js";
7
7
  import "../storage/sqlite/index.js";
8
8
  import { connectorIdentityKey, normalizeConnectorIdentity } from "./connector-identity.js";
@@ -74,8 +74,9 @@ function startConnectorLearningCoordinator(options) {
74
74
  const connection = listConnectorConnections().find((item) => item.id === connectionId && item.status === "active");
75
75
  if (!connection) return null;
76
76
  if (!connection.accountId) throw new Error(`Connector account is missing for connection ${connection.id}.`);
77
+ if (!getConnectorAccount(connection.accountId)?.enabled) return null;
77
78
  const syncPolicy = getConnectorSyncPolicyForConnection(connection.id);
78
- if (request.reason !== "manual" && syncPolicy?.scanEnabled === false) return null;
79
+ if (request.reason !== "manual" && syncPolicy?.scanEnabled !== true) return null;
79
80
  const definition = getConnectorDefinition(connection.connectorId);
80
81
  if (definition?.runtime.type !== "composio" || definition.runtime.role !== "toolkit") return null;
81
82
  if (!getConnectorLearningPlan(definition.runtime.toolkit)) return null;
@@ -275,7 +276,7 @@ function startConnectorLearningCoordinator(options) {
275
276
  ...retention
276
277
  }, "Connected source retention pruned");
277
278
  const syncPolicy = getConnectorSyncPolicyForConnection(job.connectionId);
278
- if (syncPolicy?.scanEnabled === false) return;
279
+ if (syncPolicy?.scanEnabled !== true) return;
279
280
  const intervalMinutes = syncPolicy?.intervalMinutes ?? plan.intervalMinutes;
280
281
  const nextRunAt = Date.now() + intervalMinutes * 6e4;
281
282
  enqueueConnection(getConnectorAccount(job.accountId)?.currentConnectionId ?? job.connectionId, {
@@ -4,6 +4,7 @@ import { createConnectorSecretReference } from "./secret-store.js";
4
4
  init_schema();
5
5
  const SERVER_ID_PATTERN = /^[a-z][a-z0-9_-]{0,63}$/;
6
6
  const TEMPLATE_PATTERN = /^\{\{(secrets|config)\.([A-Za-z0-9_.-]+)\}\}$/;
7
+ const EMBEDDED_SECRET_PATTERN = /\{\{secrets\.([A-Za-z0-9_.-]+)\}\}/g;
7
8
  function assertValidConnectorServerId(serverId) {
8
9
  if (!SERVER_ID_PATTERN.test(serverId)) throw new Error("Connector server name must start with a lowercase letter and only contain lowercase letters, numbers, dashes, and underscores.");
9
10
  }
@@ -14,7 +15,19 @@ function readInputValue(definition, input, scope, key) {
14
15
  function resolveTemplateValue(value, definition, input) {
15
16
  if (typeof value !== "string") return value;
16
17
  const match = TEMPLATE_PATTERN.exec(value.trim());
17
- if (!match) return value;
18
+ if (!match) {
19
+ const matches = [...value.matchAll(EMBEDDED_SECRET_PATTERN)];
20
+ if (matches.length === 0) return value;
21
+ if (matches.length > 1) throw new Error("Connector template values may contain at most one embedded secret.");
22
+ const embedded = matches[0];
23
+ const token = embedded[0];
24
+ const fieldKey = embedded[1];
25
+ const offset = embedded.index ?? 0;
26
+ return createConnectorSecretReference(definition.id, fieldKey, {
27
+ prefix: value.slice(0, offset),
28
+ suffix: value.slice(offset + token.length)
29
+ });
30
+ }
18
31
  return readInputValue(definition, input, match[1], match[2]);
19
32
  }
20
33
  function materializeTemplate(value, definition, input) {
@@ -8,6 +8,6 @@ export declare function evaluateConnectorExecutionPolicy(input: {
8
8
  installation: ConnectorInstallationPolicy;
9
9
  action: Pick<ConnectorActionMetadata, 'scope' | 'curated'>;
10
10
  agentId?: string;
11
- connectionId?: string;
11
+ accountId?: string;
12
12
  confirmed?: boolean;
13
13
  }): ConnectorPolicyEvaluation;
@@ -21,7 +21,7 @@ function evaluateConnectorExecutionPolicy(input) {
21
21
  decision: "denied",
22
22
  reason: "Agent is not allowed to use this connector."
23
23
  };
24
- if (installation.selectedConnectionIds.length > 0 && (!input.connectionId || !installation.selectedConnectionIds.includes(input.connectionId))) return {
24
+ if (installation.selectedAccountIds !== null && (!input.accountId || !installation.selectedAccountIds.includes(input.accountId))) return {
25
25
  decision: "denied",
26
26
  reason: "Connection is not allowed by this connector policy."
27
27
  };
@@ -1,17 +1,38 @@
1
+ import { getSessionMetadata, init_session_repository } from "../storage/sqlite/session-repository.js";
1
2
  import { getConversationRouting } from "../storage/sqlite/conversation-repository.js";
2
3
  import { init_session_key } from "../routing/session-key.js";
3
4
  //#region src/connectors/principal.ts
4
5
  init_session_key();
6
+ init_session_repository();
5
7
  function connectorPrincipalForSession(conversationId) {
6
- const parsed = getConversationRouting(conversationId);
8
+ let parsed = getConversationRouting(conversationId);
9
+ const agentId = parsed?.agentId;
10
+ const visited = /* @__PURE__ */ new Set();
11
+ while (conversationId && parsed?.source === "workflow" && !visited.has(conversationId) && visited.size < 8) {
12
+ visited.add(conversationId);
13
+ const metadata = getSessionMetadata(conversationId);
14
+ const parent = metadata?.parentConversationId ?? metadata?.customData?.parentConversationId;
15
+ if (typeof parent !== "string") {
16
+ if (metadata?.sessionType === "workflow-run") return {
17
+ principalId: "local-owner",
18
+ agentId,
19
+ isLocalOwner: true
20
+ };
21
+ break;
22
+ }
23
+ const parentRouting = getConversationRouting(parent);
24
+ if (!parentRouting) break;
25
+ conversationId = parent;
26
+ parsed = parentRouting;
27
+ }
7
28
  if (!parsed || parsed.source === "cli" || parsed.source === "webchat") return {
8
29
  principalId: "local-owner",
9
- agentId: parsed?.agentId,
30
+ agentId,
10
31
  isLocalOwner: true
11
32
  };
12
33
  return {
13
34
  principalId: `channel:${parsed.source}:${parsed.accountId}:${parsed.peerKind}:${parsed.peerId}`,
14
- agentId: parsed.agentId,
35
+ agentId,
15
36
  isLocalOwner: false
16
37
  };
17
38
  }
@@ -6,5 +6,6 @@ export type ConnectorProvider = {
6
6
  };
7
7
  export declare const builtinConnectorProvider: ConnectorProvider;
8
8
  export declare const composioConnectorProvider: ConnectorProvider;
9
+ export declare const chinaConnectorProvider: ConnectorProvider;
9
10
  export declare function listConnectorProviders(): ConnectorProvider[];
10
11
  export declare function listConnectorProviderDefinitions(): ConnectorDefinition[];
@@ -1,4 +1,5 @@
1
1
  import { BUILTIN_CONNECTORS } from "./builtin-catalog.js";
2
+ import { CHINA_CONNECTORS } from "./china-catalog.js";
2
3
  import { COMPOSIO_CONNECTORS } from "./composio.js";
3
4
  //#region src/connectors/providers.ts
4
5
  const builtinConnectorProvider = {
@@ -15,7 +16,18 @@ const composioConnectorProvider = {
15
16
  return COMPOSIO_CONNECTORS;
16
17
  }
17
18
  };
18
- const CONNECTOR_PROVIDERS = [builtinConnectorProvider, composioConnectorProvider];
19
+ const chinaConnectorProvider = {
20
+ id: "china",
21
+ displayName: "China connectors",
22
+ listConnectors() {
23
+ return CHINA_CONNECTORS;
24
+ }
25
+ };
26
+ const CONNECTOR_PROVIDERS = [
27
+ builtinConnectorProvider,
28
+ chinaConnectorProvider,
29
+ composioConnectorProvider
30
+ ];
19
31
  function listConnectorProviders() {
20
32
  return [...CONNECTOR_PROVIDERS];
21
33
  }
@@ -23,4 +35,4 @@ function listConnectorProviderDefinitions() {
23
35
  return CONNECTOR_PROVIDERS.flatMap((provider) => provider.listConnectors());
24
36
  }
25
37
  //#endregion
26
- export { builtinConnectorProvider, composioConnectorProvider, listConnectorProviderDefinitions, listConnectorProviders };
38
+ export { builtinConnectorProvider, chinaConnectorProvider, composioConnectorProvider, listConnectorProviderDefinitions, listConnectorProviders };
@@ -2,7 +2,6 @@ import { isXopcDatabaseOpen } from "../storage/sqlite/connection.js";
2
2
  import { deleteConnectorInstallation, getConnectorInstallation, upsertConnectorInstallation } from "../storage/sqlite/connector-repository.js";
3
3
  import "../storage/sqlite/index.js";
4
4
  import { assertComposioAccessConfigured } from "./composio-sessions.js";
5
- import { saveComposioApiKey } from "./composio.js";
6
5
  import { saveConnectorSecrets } from "./secret-store.js";
7
6
  import { isManagedConnectorServer, materializeConnectorMcpServer } from "./materialize.js";
8
7
  import { appendConnectorAuditRecord } from "./usage.js";
@@ -106,7 +105,7 @@ registerConnectorRuntimeAdapter({
106
105
  type: "composio",
107
106
  async install({ config, definition, input, resolver }) {
108
107
  if (definition.runtime.type !== "composio") throw new Error(`Invalid Composio connector definition: ${definition.id}`);
109
- if (definition.runtime.role === "credential") await saveComposioApiKey(input, resolver);
108
+ if (definition.runtime.role !== "toolkit") throw new Error("Configure Composio in connection service settings.");
110
109
  if (definition.runtime.role === "toolkit") await assertComposioAccessConfigured(resolver);
111
110
  const instance = installRecord(config, definition, definition.runtime.role === "toolkit" ? { scope: "read" } : {}, definition.runtime.role === "toolkit" ? { config: input.config ?? {} } : {});
112
111
  if (definition.runtime.role === "toolkit" && isXopcDatabaseOpen()) {
@@ -120,7 +119,7 @@ registerConnectorRuntimeAdapter({
120
119
  allowedAgentIds: existing?.allowedAgentIds ?? [],
121
120
  maxScope: "read",
122
121
  confirmationPolicy: existing?.confirmationPolicy ?? "writes",
123
- selectedConnectionIds: existing?.selectedConnectionIds ?? [],
122
+ selectedAccountIds: existing?.selectedAccountIds ?? null,
124
123
  createdAt: existing?.createdAt
125
124
  });
126
125
  }
@@ -145,12 +144,8 @@ registerConnectorRuntimeAdapter({
145
144
  return installedInstance(config, instanceId, definition.id);
146
145
  }
147
146
  });
148
- for (const type of [
149
- "channel",
150
- "nativeTool",
151
- "memorySource"
152
- ]) registerConnectorRuntimeAdapter({
153
- type,
147
+ registerConnectorRuntimeAdapter({
148
+ type: "memorySource",
154
149
  async install({ config, definition, input }) {
155
150
  return installRecord(config, definition, {}, { config: input.config ?? {} });
156
151
  },
@@ -1,7 +1,10 @@
1
1
  import { CredentialResolver } from '../auth/credentials.js';
2
2
  import type { ConnectorDefinition, ConnectorInstallInput, ConnectorSecretReference } from './types.js';
3
3
  export declare function connectorSecretProviderId(connectorId: string, fieldKey: string): string;
4
- export declare function createConnectorSecretReference(connectorId: string, fieldKey: string): ConnectorSecretReference;
4
+ export declare function createConnectorSecretReference(connectorId: string, fieldKey: string, affixes?: {
5
+ prefix?: string;
6
+ suffix?: string;
7
+ }): ConnectorSecretReference;
5
8
  export declare function isConnectorSecretReference(value: unknown): value is ConnectorSecretReference;
6
9
  export declare function saveConnectorSecrets(definition: ConnectorDefinition, input: ConnectorInstallInput, resolver?: CredentialResolver): Promise<void>;
7
10
  export declare function resolveConnectorSecretReferences(value: unknown, resolver?: CredentialResolver): Promise<unknown>;
@@ -8,10 +8,12 @@ function normalizeSecretSegment(value) {
8
8
  function connectorSecretProviderId(connectorId, fieldKey) {
9
9
  return `connector-${normalizeSecretSegment(connectorId)}-${normalizeSecretSegment(fieldKey)}`;
10
10
  }
11
- function createConnectorSecretReference(connectorId, fieldKey) {
11
+ function createConnectorSecretReference(connectorId, fieldKey, affixes = {}) {
12
12
  return { xopcSecretRef: {
13
13
  provider: connectorSecretProviderId(connectorId, fieldKey),
14
- fieldKey
14
+ fieldKey,
15
+ ...affixes.prefix ? { prefix: affixes.prefix } : {},
16
+ ...affixes.suffix ? { suffix: affixes.suffix } : {}
15
17
  } };
16
18
  }
17
19
  function isConnectorSecretReference(value) {
@@ -28,7 +30,9 @@ async function saveConnectorSecrets(definition, input, resolver = new Credential
28
30
  }
29
31
  }
30
32
  async function resolveSecretReference(reference, resolver) {
31
- return await resolver.resolveApiKey(reference.xopcSecretRef.provider) ?? void 0;
33
+ const value = await resolver.resolveApiKey(reference.xopcSecretRef.provider);
34
+ if (!value) return void 0;
35
+ return `${reference.xopcSecretRef.prefix ?? ""}${value}${reference.xopcSecretRef.suffix ?? ""}`;
32
36
  }
33
37
  async function resolveConnectorSecretReferences(value, resolver = new CredentialResolver()) {
34
38
  if (isConnectorSecretReference(value)) return resolveSecretReference(value, resolver);
@@ -1,10 +1,12 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
+ import { getConnectorAccount, init_connector_account_repository } from "../storage/sqlite/connector-account-repository.js";
4
+ import { init_connector_repository, listConnectorConnections } from "../storage/sqlite/connector-repository.js";
3
5
  import { getKnowledgeConsumerWatermark, getKnowledgeSourceItem, listKnowledgeSourceChanges, setKnowledgeConsumerWatermark } from "../storage/sqlite/knowledge-repository.js";
4
- import { listConnectorConnections } from "../storage/sqlite/connector-repository.js";
5
- import { getConnectorAccount } from "../storage/sqlite/connector-account-repository.js";
6
6
  import { getConnectorSyncPolicyForConnection } from "../storage/sqlite/connector-sync-policy-repository.js";
7
7
  //#region src/connectors/source-change-publisher.ts
8
+ init_connector_account_repository();
9
+ init_connector_repository();
8
10
  init_logger();
9
11
  const log = createLogger("Connector:SourceChanges");
10
12
  const CONSUMER_ID = "proactive-connected-source-v1";
@@ -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
  };