@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
@@ -6,6 +6,9 @@ import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "
6
6
  import { init_session_instance_repository, readCurrentTranscriptId } from "./session-instance-repository.js";
7
7
  import { bumpSessionInputRevision, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, setSessionInputStatus } from "./session-input-repository.js";
8
8
  import { TaskRunRepository, init_task_run_repository } from "../../tasks/task-run-repository.js";
9
+ import { getConnectorAccount, init_connector_account_repository } from "./connector-account-repository.js";
10
+ import { getConnectorConnection, init_connector_repository } from "./connector-repository.js";
11
+ import { getSessionMetadata, init_session_repository } from "./session-repository.js";
9
12
  import { randomUUID } from "node:crypto";
10
13
  import { EventEmitter } from "node:events";
11
14
  //#region src/storage/sqlite/connection-wait-repository.ts
@@ -222,9 +225,64 @@ function consumeConnectionResume(input) {
222
225
  }
223
226
  function connectionBindings(conversationId) {
224
227
  if (!isXopcDatabaseOpen()) return [];
228
+ let metadata = getSessionMetadata(conversationId);
229
+ if (metadata?.sessionType === "workflow-subagent" && metadata.parentConversationId) metadata = getSessionMetadata(metadata.parentConversationId);
230
+ const workflowAccounts = metadata?.sessionType === "workflow-run" ? metadata.customData?.connectorAccounts : void 0;
231
+ if (workflowAccounts && typeof workflowAccounts === "object" && !Array.isArray(workflowAccounts)) return Object.entries(workflowAccounts).flatMap(([connectorId, ids]) => Array.isArray(ids) ? ids.flatMap((id) => {
232
+ if (typeof id !== "string") return [];
233
+ const account = getConnectorAccount(id);
234
+ return [{
235
+ key: `${connectorId}:${id}`,
236
+ connectorId,
237
+ accountId: id,
238
+ connectionId: account?.currentConnectionId,
239
+ label: account?.label ?? connectorId,
240
+ capabilities: []
241
+ }];
242
+ }) : []);
225
243
  const state = getSessionInputState(conversationId);
226
244
  const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
227
- return input?.payload ? getConnectionWait(input.payload.waitId)?.needs ?? [] : [];
245
+ if (!input) return [];
246
+ const wait = input.payload ? getConnectionWait(input.payload.waitId) : void 0;
247
+ const stored = getSqliteDatabase().prepare(`SELECT connector_id, account_id FROM connector_objective_accounts
248
+ WHERE conversation_id = ? AND transcript_id = ? AND objective_id = ?`).all(conversationId, readCurrentTranscriptId(getSqliteDatabase(), conversationId) ?? "", wait?.objectiveId ?? input.id);
249
+ return (wait?.needs ?? stored.map((row) => ({
250
+ key: `${row.connector_id}:${row.account_id}`,
251
+ connectorId: row.connector_id,
252
+ accountId: row.account_id,
253
+ label: getConnectorAccount(row.account_id)?.label ?? row.connector_id,
254
+ capabilities: []
255
+ }))).map((need) => {
256
+ const accountId = need.accountId ?? (need.connectionId ? getConnectorConnection(need.connectionId)?.accountId : void 0);
257
+ const account = accountId ? getConnectorAccount(accountId) : void 0;
258
+ return {
259
+ ...need,
260
+ accountId,
261
+ connectionId: account?.currentConnectionId ?? need.connectionId
262
+ };
263
+ });
264
+ }
265
+ /** Changes to the objective or transcript invalidate an outstanding action approval. */
266
+ function connectorObjectiveScope(conversationId) {
267
+ const state = getSessionInputState(conversationId);
268
+ const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
269
+ if (!input) return void 0;
270
+ const active = getActiveConnectionWait(conversationId);
271
+ const wait = input.payload ? getConnectionWait(input.payload.waitId) : active?.originInputId === input.id ? active : void 0;
272
+ return JSON.stringify([
273
+ readCurrentTranscriptId(getSqliteDatabase(), conversationId),
274
+ wait?.objectiveId ?? input.id,
275
+ wait?.objectiveRevision ?? 0
276
+ ]);
277
+ }
278
+ function bindObjectiveAccount(conversationId, connectorId, accountId) {
279
+ const db = getSqliteDatabase();
280
+ const state = getSessionInputState(conversationId);
281
+ const input = state.activeInputId ? getSessionInputById(conversationId, state.activeInputId) : void 0;
282
+ if (!input) return;
283
+ const wait = input.payload ? getConnectionWait(input.payload.waitId) : void 0;
284
+ db.prepare(`INSERT OR IGNORE INTO connector_objective_accounts
285
+ (conversation_id, transcript_id, objective_id, connector_id, account_id) VALUES (?, ?, ?, ?, ?)`).run(conversationId, readCurrentTranscriptId(db, conversationId) ?? "", wait?.objectiveId ?? input.id, connectorId, accountId);
228
286
  }
229
287
  function connectionBinding(conversationId, connectorId) {
230
288
  const matches = connectionBindings(conversationId).filter((need) => need.connectorId === connectorId);
@@ -334,15 +392,18 @@ function listConnectionWaitsToCheck() {
334
392
  }
335
393
  var log, events;
336
394
  var init_connection_wait_repository = __esmMin((() => {
395
+ init_connector_account_repository();
396
+ init_connector_repository();
337
397
  init_logger();
338
398
  init_task_run_repository();
339
399
  init_connection();
340
400
  init_transaction();
341
401
  init_session_instance_repository();
402
+ init_session_repository();
342
403
  init_session_input_repository();
343
404
  log = createLogger("Connectors:Wait");
344
405
  events = new EventEmitter();
345
406
  }));
346
407
  //#endregion
347
408
  init_connection_wait_repository();
348
- export { cancelConnectionObjective, connectionBinding, connectionBindings, consumeConnectionResume, getActiveConnectionWait, getConnectionResumeInput, getConnectionWait, init_connection_wait_repository, invalidateConnectionResumeIntent, isConnectionSuspended, listConnectionWaitsToCheck, onConnectionWaitChanged, publishConnectionWait, queueConnectionResolution, requireSessionConnection, reviseCurrentConnectionObjective, updateConnectionWait };
409
+ export { bindObjectiveAccount, cancelConnectionObjective, connectionBinding, connectionBindings, connectorObjectiveScope, consumeConnectionResume, getActiveConnectionWait, getConnectionResumeInput, getConnectionWait, init_connection_wait_repository, invalidateConnectionResumeIntent, isConnectionSuspended, listConnectionWaitsToCheck, onConnectionWaitChanged, publishConnectionWait, queueConnectionResolution, requireSessionConnection, reviseCurrentConnectionObjective, updateConnectionWait };
@@ -1,5 +1,10 @@
1
1
  import type { ConnectorAccount } from '../../connectors/types.js';
2
2
  export declare function getConnectorAccount(id: string): ConnectorAccount | undefined;
3
+ export declare function updateConnectorAccount(id: string, patch: {
4
+ label?: string;
5
+ enabled?: boolean;
6
+ allowedAgentIds?: string[] | null;
7
+ }): ConnectorAccount;
3
8
  export declare function listConnectorAccounts(options?: {
4
9
  principalId?: string;
5
10
  connectorId?: string;
@@ -7,6 +12,7 @@ export declare function listConnectorAccounts(options?: {
7
12
  export declare function refreshConnectorAccountCurrent(accountId: string): ConnectorAccount | undefined;
8
13
  export declare function reconcileConnectorAccount(input: {
9
14
  connectionId: string;
15
+ backendId?: string;
10
16
  identityKey: string;
11
17
  identity: Record<string, unknown>;
12
18
  }): ConnectorAccount;
@@ -1,6 +1,6 @@
1
+ import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
1
2
  import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "./transaction.js";
2
3
  //#region src/storage/sqlite/connector-account-repository.ts
3
- init_transaction();
4
4
  function parseIdentity(value) {
5
5
  try {
6
6
  const parsed = JSON.parse(value);
@@ -15,8 +15,12 @@ function fromRow(row) {
15
15
  connectorId: row.connector_id,
16
16
  principalId: row.principal_id,
17
17
  identityKey: row.identity_key ?? void 0,
18
+ backendId: row.backend_id ?? void 0,
18
19
  identity: parseIdentity(row.identity_json),
19
20
  currentConnectionId: row.current_connection_id ?? void 0,
21
+ label: row.label ?? void 0,
22
+ enabled: row.enabled === 1,
23
+ allowedAgentIds: row.allowed_agent_ids_json === null ? null : JSON.parse(row.allowed_agent_ids_json),
20
24
  createdAt: row.created_at,
21
25
  updatedAt: row.updated_at
22
26
  };
@@ -74,6 +78,13 @@ function getConnectorAccount(id) {
74
78
  const row = getSqliteDatabase().prepare("SELECT * FROM connector_accounts WHERE id = ?").get(id);
75
79
  return row ? fromRow(row) : void 0;
76
80
  }
81
+ function updateConnectorAccount(id, patch) {
82
+ const account = getConnectorAccount(id);
83
+ if (!account) throw new Error("Connector account not found.");
84
+ getSqliteDatabase().prepare(`UPDATE connector_accounts
85
+ SET label = ?, enabled = ?, allowed_agent_ids_json = ?, updated_at = ? WHERE id = ?`).run(patch.label === void 0 ? account.label ?? null : patch.label.trim() || null, patch.enabled ?? account.enabled ? 1 : 0, patch.allowedAgentIds === void 0 ? account.allowedAgentIds === null ? null : JSON.stringify(account.allowedAgentIds) : patch.allowedAgentIds === null ? null : JSON.stringify([...new Set(patch.allowedAgentIds)]), (/* @__PURE__ */ new Date()).toISOString(), id);
86
+ return getConnectorAccount(id);
87
+ }
77
88
  function listConnectorAccounts(options = {}) {
78
89
  const clauses = [];
79
90
  const values = [];
@@ -109,13 +120,26 @@ function refreshConnectorAccountCurrent(accountId) {
109
120
  function reconcileConnectorAccount(input) {
110
121
  const now = (/* @__PURE__ */ new Date()).toISOString();
111
122
  return getConnectorAccount(runSqliteWriteTransaction((db) => {
112
- const connection = db.prepare("SELECT account_id, connector_id, principal_id FROM connector_connections WHERE id = ?").get(input.connectionId);
123
+ const connection = db.prepare(`SELECT c.account_id, c.connector_id, c.principal_id, a.backend_id FROM connector_connections c
124
+ JOIN connector_accounts a ON a.id = c.account_id WHERE c.id = ?`).get(input.connectionId);
113
125
  if (!connection?.account_id) throw new Error(`Connector connection not found: ${input.connectionId}`);
114
126
  const targetId = db.prepare(`
115
127
  SELECT id FROM connector_accounts
116
- WHERE principal_id = ? AND connector_id = ? AND identity_key = ?
117
- `).get(connection.principal_id, connection.connector_id, input.identityKey)?.id ?? connection.account_id;
128
+ WHERE principal_id = ? AND connector_id = ? AND identity_key = ? AND backend_id IS ?
129
+ `).get(connection.principal_id, connection.connector_id, input.identityKey, input.backendId ?? connection.backend_id)?.id ?? connection.account_id;
118
130
  if (targetId !== connection.account_id) {
131
+ db.prepare(`UPDATE connector_installations SET selected_account_ids_json = (
132
+ SELECT json_group_array(DISTINCT CASE WHEN value = ? THEN ? ELSE value END)
133
+ FROM json_each(connector_installations.selected_account_ids_json))
134
+ WHERE json_type(selected_account_ids_json) = 'array'
135
+ AND EXISTS (SELECT 1 FROM json_each(selected_account_ids_json) WHERE value = ?)`).run(connection.account_id, targetId, connection.account_id);
136
+ db.prepare(`INSERT OR IGNORE INTO connector_objective_accounts
137
+ SELECT conversation_id, transcript_id, objective_id, connector_id, ?
138
+ FROM connector_objective_accounts WHERE account_id = ?`).run(targetId, connection.account_id);
139
+ const source = getConnectorAccount(connection.account_id);
140
+ const target = getConnectorAccount(targetId);
141
+ const agents = source.allowedAgentIds === null ? target.allowedAgentIds : target.allowedAgentIds === null ? source.allowedAgentIds : target.allowedAgentIds.filter((id) => source.allowedAgentIds.includes(id));
142
+ db.prepare(`UPDATE connector_accounts SET enabled = ?, allowed_agent_ids_json = ?, label = COALESCE(label, ?) WHERE id = ?`).run(source.enabled && target.enabled ? 1 : 0, agents === null ? null : JSON.stringify(agents), source.label ?? null, targetId);
119
143
  mergeAccountSourceData(db, connection.connector_id, connection.account_id, targetId);
120
144
  if (db.prepare("SELECT 1 FROM connector_sync_policies WHERE account_id = ?").get(targetId)) db.prepare("DELETE FROM connector_sync_policies WHERE account_id = ?").run(connection.account_id);
121
145
  else db.prepare("UPDATE connector_sync_policies SET account_id = ? WHERE account_id = ?").run(targetId, connection.account_id);
@@ -133,11 +157,15 @@ function reconcileConnectorAccount(input) {
133
157
  if (!primary) throw new Error(`Connector account has no authorizations: ${targetId}`);
134
158
  db.prepare(`
135
159
  UPDATE connector_accounts
136
- SET identity_key = ?, identity_json = ?, current_connection_id = ?, updated_at = ?
160
+ SET identity_key = ?, identity_json = ?, current_connection_id = ?, updated_at = ?, backend_id = ?
137
161
  WHERE id = ?
138
- `).run(input.identityKey, JSON.stringify(input.identity), primary.id, now, targetId);
162
+ `).run(input.identityKey, JSON.stringify(input.identity), primary.id, now, input.backendId ?? connection.backend_id, targetId);
139
163
  return targetId;
140
164
  }));
141
165
  }
166
+ var init_connector_account_repository = __esmMin((() => {
167
+ init_transaction();
168
+ }));
142
169
  //#endregion
143
- export { getConnectorAccount, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent };
170
+ init_connector_account_repository();
171
+ export { getConnectorAccount, init_connector_account_repository, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent, updateConnectorAccount };
@@ -1,7 +1,7 @@
1
+ import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
1
2
  import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "./transaction.js";
2
3
  import { randomUUID } from "node:crypto";
3
4
  //#region src/storage/sqlite/connector-repository.ts
4
- init_transaction();
5
5
  function parseStringArray(value) {
6
6
  try {
7
7
  const parsed = JSON.parse(value);
@@ -27,7 +27,7 @@ function installationFromRow(row) {
27
27
  allowedAgentIds: parseStringArray(row.allowed_agent_ids_json),
28
28
  maxScope: row.max_scope,
29
29
  confirmationPolicy: row.confirmation_policy,
30
- selectedConnectionIds: parseStringArray(row.selected_connection_ids_json),
30
+ selectedAccountIds: row.selected_account_ids_json === "null" ? null : parseStringArray(row.selected_account_ids_json),
31
31
  createdAt: row.created_at,
32
32
  updatedAt: row.updated_at
33
33
  };
@@ -101,6 +101,7 @@ function catalogFromRow(row) {
101
101
  function approvalFromRow(row) {
102
102
  return {
103
103
  id: row.id,
104
+ waitId: row.wait_id ?? void 0,
104
105
  principalId: row.principal_id,
105
106
  connectorId: row.connector_id,
106
107
  connectionId: row.connection_id ?? void 0,
@@ -129,9 +130,9 @@ function createConnectorApproval(input) {
129
130
  INSERT INTO connector_approvals (
130
131
  id, principal_id, connector_id, connection_id, agent_id, conversation_id, action_id,
131
132
  scope, arguments_hash, arguments_preview_json, status, expires_at, created_at,
132
- decided_at, consumed_at
133
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
134
- `).run(record.id, record.principalId, record.connectorId, record.connectionId ?? null, record.agentId ?? null, record.conversationId ?? null, record.actionId, record.scope, record.argumentsHash, JSON.stringify(record.argumentsPreview), record.status, record.expiresAt, record.createdAt, record.decidedAt ?? null, record.consumedAt ?? null);
133
+ decided_at, consumed_at, wait_id
134
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
135
+ `).run(record.id, record.principalId, record.connectorId, record.connectionId ?? null, record.agentId ?? null, record.conversationId ?? null, record.actionId, record.scope, record.argumentsHash, JSON.stringify(record.argumentsPreview), record.status, record.expiresAt, record.createdAt, record.decidedAt ?? null, record.consumedAt ?? null, record.waitId ?? null);
135
136
  });
136
137
  return record;
137
138
  }
@@ -223,7 +224,7 @@ function upsertConnectorInstallation(input) {
223
224
  db.prepare(`
224
225
  INSERT INTO connector_installations (
225
226
  id, connector_id, principal_id, enabled, allowed_agent_ids_json, max_scope,
226
- confirmation_policy, selected_connection_ids_json, created_at, updated_at
227
+ confirmation_policy, selected_account_ids_json, created_at, updated_at
227
228
  ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
228
229
  ON CONFLICT(id) DO UPDATE SET
229
230
  connector_id = excluded.connector_id,
@@ -232,9 +233,9 @@ function upsertConnectorInstallation(input) {
232
233
  allowed_agent_ids_json = excluded.allowed_agent_ids_json,
233
234
  max_scope = excluded.max_scope,
234
235
  confirmation_policy = excluded.confirmation_policy,
235
- selected_connection_ids_json = excluded.selected_connection_ids_json,
236
+ selected_account_ids_json = excluded.selected_account_ids_json,
236
237
  updated_at = excluded.updated_at
237
- `).run(input.id, input.connectorId, input.principalId, input.enabled ? 1 : 0, JSON.stringify(input.allowedAgentIds), input.maxScope, input.confirmationPolicy, JSON.stringify(input.selectedConnectionIds), input.createdAt ?? now, input.updatedAt ?? now);
238
+ `).run(input.id, input.connectorId, input.principalId, input.enabled ? 1 : 0, JSON.stringify(input.allowedAgentIds), input.maxScope, input.confirmationPolicy, JSON.stringify(input.selectedAccountIds), input.createdAt ?? now, input.updatedAt ?? now);
238
239
  return getConnectorInstallation(input.id);
239
240
  });
240
241
  }
@@ -251,7 +252,7 @@ function deleteConnectorInstallation(id) {
251
252
  function upsertConnectorConnection(input) {
252
253
  const now = (/* @__PURE__ */ new Date()).toISOString();
253
254
  return runSqliteWriteTransaction((db) => {
254
- const accountId = input.accountId ?? `account:${input.id}`;
255
+ const accountId = db.prepare("SELECT account_id FROM connector_connections WHERE id = ?").get(input.id)?.account_id ?? input.accountId ?? `account:${input.id}`;
255
256
  db.prepare(`
256
257
  INSERT INTO connector_accounts (
257
258
  id, connector_id, principal_id, identity_json, current_connection_id, created_at, updated_at
@@ -400,5 +401,9 @@ function releaseConnectorWebhookDelivery(id, error) {
400
401
  `).run(message.slice(0, 500), id);
401
402
  });
402
403
  }
404
+ var init_connector_repository = __esmMin((() => {
405
+ init_transaction();
406
+ }));
403
407
  //#endregion
404
- export { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation };
408
+ init_connector_repository();
409
+ export { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, init_connector_repository, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation };
@@ -53,7 +53,7 @@ function upsertConnectorSyncPolicy(input) {
53
53
  interval_minutes = excluded.interval_minutes,
54
54
  allowed_scenario_keys_json = excluded.allowed_scenario_keys_json,
55
55
  revision = connector_sync_policies.revision + 1,
56
- updated_at = excluded.updated_at`).run(input.accountId, input.scanEnabled ?? current?.scanEnabled ?? true ? 1 : 0, input.proactiveEnabled ?? current?.proactiveEnabled ?? false ? 1 : 0, intervalMinutes, JSON.stringify(allowedScenarioKeys), now);
56
+ updated_at = excluded.updated_at`).run(input.accountId, input.scanEnabled ?? current?.scanEnabled ?? false ? 1 : 0, input.proactiveEnabled ?? current?.proactiveEnabled ?? false ? 1 : 0, intervalMinutes, JSON.stringify(allowedScenarioKeys), now);
57
57
  });
58
58
  return getConnectorSyncPolicy(input.accountId);
59
59
  }
@@ -28,6 +28,8 @@ import { COMPOSER_INPUT_HISTORY_LIMIT, appendComposerInputHistory, clearComposer
28
28
  import { bindEndpointPrincipal, createEndpointPrincipal, getEndpointPrincipal, listEndpointPrincipals, revokeEndpointPrincipal, touchEndpointPrincipal } from "./endpoint-principal-repository.js";
29
29
  import { finishEndpointToolInvocationAudit, listEndpointToolInvocationAudits, startEndpointToolInvocationAudit } from "./endpoint-tool-invocation-repository.js";
30
30
  import { getInteractionState, setInteractionState, updateInteractionStateFromMessage } from "./interaction-state-repository.js";
31
+ import { getConnectorAccount, init_connector_account_repository, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent } from "./connector-account-repository.js";
32
+ import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, init_connector_repository, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
31
33
  import { deleteSessionRecord, ensureSessionRecord, findConversationIdByTranscriptId, getCurrentTranscriptId, getGlobalSessionStats, getSessionMetadata, getSessionPersistedLevels, incrementSessionStatsOnAppend, init_session_repository, listSessionMetadata, listSessionsByAgent, patchSessionMetadata, resetSessionRecord, resolveSessionAgentId, updateSessionStats } from "./session-repository.js";
32
34
  import { getSessionTaskPlan, setSessionTaskPlan } from "./session-task-plan-repository.js";
33
35
  import { buildRelationshipPrompt, getRelationshipSettings, isProactiveSupportAllowed, updateRelationshipSettings } from "./relationship-settings-repository.js";
@@ -37,8 +39,6 @@ import { deleteNoteAgentContextRecord, getNoteAgentContextRecord, upsertNoteAgen
37
39
  import { claimKnowledgeSourceItems, completeKnowledgeSourceItemSynthesis, countKnowledgeSourceItems, deleteKnowledgeSourceItems, finishKnowledgeSyncRun, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, pruneBoundedKnowledgeSourceItems, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, startKnowledgeSyncRun, upsertKnowledgeSourceItems } from "./knowledge-repository.js";
38
40
  import { deleteSessionConfig, getSessionConfig, hasSessionConfig, setSessionConfig, updateSessionConfig } from "./config-repository.js";
39
41
  import { createObjectLinkRecord, deleteObjectLinkRecord, getActivityEventRecord, listActivityRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, recordActivityEvent } from "./activity-repository.js";
40
- import { appendConnectorExecutionAudit, claimConnectorWebhookDelivery, completeConnectorWebhookDelivery, consumeConnectorApproval, createConnectorApproval, decideConnectorApproval, deleteConnectorConnection, deleteConnectorInstallation, getCachedConnectorCatalogEntry, getConnectorApproval, getConnectorConnection, getConnectorInstallation, listCachedConnectorCatalogEntries, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation } from "./connector-repository.js";
41
- import { getConnectorAccount, listConnectorAccounts, reconcileConnectorAccount, refreshConnectorAccountCurrent } from "./connector-account-repository.js";
42
42
  import { getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, listConnectorSyncPolicies, upsertConnectorSyncPolicy } from "./connector-sync-policy-repository.js";
43
43
  import { getUserTrustPolicy, setUserTrustPolicy } from "./user-trust-repository.js";
44
44
  //#region src/storage/sqlite/index.ts
@@ -53,5 +53,7 @@ init_session_input_repository();
53
53
  init_session_metadata();
54
54
  init_row_mappers();
55
55
  init_session_repository();
56
+ init_connector_repository();
57
+ init_connector_account_repository();
56
58
  //#endregion
57
59
  export { COMPOSER_INPUT_HISTORY_LIMIT, DatabaseSchemaMigrationGapError, DatabaseSchemaTooNewError, DatabaseSchemaTooOldError, SCHEMA_META_SCHEMA_VERSION_KEY, XOPC_DB_BASELINE_SCHEMA_VERSION, XOPC_DB_FILENAME, XOPC_DB_SCHEMA_VERSION, acknowledgeHomeAttention, appendCompactionBoundaryIfUnchanged, appendComposerInputHistory, appendConnectorExecutionAudit, appendMediaToAssistantTranscriptEntry, appendTranscriptEntry, applyPendingMigrations, authenticateDeviceAccessToken, bindEndpointPrincipal, buildDefaultSessionMetadata, buildGlobalSessionStats, buildRefreshProofMessage, buildRelationshipPrompt, cancelQueuedSessionInput, claimConnectorWebhookDelivery, claimContextExtractionRun, claimKnowledgeSourceItems, claimNextConnectorLearningJob, claimNextSessionInput, classifyStoredRow, clearComposerInputHistory, clearGatewayIdentityForTest, closeTemporalAssertions, closeXopcDatabase, completeConnectorWebhookDelivery, completeKnowledgeSourceItemSynthesis, consumeClarificationApproval, consumeClarificationResume, consumeConnectorApproval, countKnowledgeSourceItems, createClarificationWait, createCollaborationRule, createConnectorApproval, createContextEvidence, createDevice, createDevicePairingSetup, createEndpointPrincipal, createObjectLinkRecord, createTemporalAssertion, decideConnectorApproval, deleteBrowserTabBinding, deleteBrowserTabBindingsByEndpoint, deleteBrowserTabBindingsByPrincipal, deleteConnectorConnection, deleteConnectorInstallation, deleteEndpointSessionBinding, deleteEndpointSessionBindingsByPrincipal, deleteKnowledgeSourceItems, deleteNoteAgentContextRecord, deleteNoteRecord, deleteObjectLinkRecord, deleteSessionConfig, deleteSessionRecord, discoverSqlMigrations, enqueueConnectorLearningJob, ensureSessionRecord, ensureXopcDatabaseSchema, estimateTokensFromMessages, extractFtsContent, findConversationIdByTranscriptId, findLatestAssistantTranscriptEntryId, findSessionInput, finishContextExtractionRun, finishEndpointToolInvocationAudit, finishKnowledgeSyncRun, finishSessionInputRun, getActiveClarification, getActivityEventRecord, getBrowserTabBinding, getBrowserTabBindingById, getCachedConnectorCatalogEntry, getClarification, getClarificationResumeInput, getClarificationSnapshot, getCollaborationRule, getConnectorAccount, getConnectorApproval, getConnectorConnection, getConnectorInstallation, getConnectorSyncPolicy, getConnectorSyncPolicyForConnection, getContextExtractionRun, getCurrentTranscriptId, getDevice, getEndpointPrincipal, getEndpointSessionBinding, getGlobalSessionStats, getInteractionState, getKnowledgeConsumerWatermark, getKnowledgeSourceCursor, getKnowledgeSourceItem, getNoteAgentContextRecord, getNoteRecord, getOrCreateGatewayIdentity, getRelationshipSettings, getSessionConfig, getSessionInputById, getSessionInputState, getSessionMetadata, getSessionPersistedLevels, getSessionTaskPlan, getSqliteDatabase, getUserPeopleIndexState, getUserPerson, getUserTrustPolicy, getXopcDatabase, hasIndependentExtractionOutput, hasSessionConfig, incrementSessionStatsOnAppend, insertSessionInput, inspectSchemaMigrationStatus, isClarificationSuspended, isDevicePairingSetupActive, isHomeAttentionAcknowledged, isProactiveSupportAllowed, isXopcDatabaseOpen, issueDeviceTokenPair, linkContextObjects, listActiveSessionInputRuns, listActivityRecords, listCachedConnectorCatalogEntries, listCollaborationRules, listCompactionBoundaries, listComposerInputHistory, listConnectorAccounts, listConnectorActionMetadata, listConnectorApprovals, listConnectorConnections, listConnectorExecutionAudit, listConnectorInstallations, listConnectorLearningJobs, listConnectorSyncPolicies, listContextExtractionOutputs, listContextExtractionRuns, listContextObjectRelations, listDevices, listEndpointPrincipals, listEndpointToolInvocationAudits, listKnowledgeSourceChanges, listKnowledgeSourceItems, listKnowledgeSyncRuns, listNoteRecords, listObjectActivityRecords, listObjectLinkRecords, listProjectActivityRecords, listRegisteredMigrationTargets, listSessionMetadata, listSessionsByAgent, listTemporalAssertions, listUserPeople, loadCompactionSourceSnapshot, loadLlmMessagesForSession, loadTranscriptHistoryRowsForSession, loadTranscriptRows, loadTranscriptRowsForSession, mergeUserPeople, metadataToSessionInsert, mutateQueuedSessionInput, openXopcDatabase, paginateTranscriptMessages, patchSessionMetadata, pruneBoundedKnowledgeSourceItems, readSchemaVersion, readSchemaVersionForTest, reconcileConnectorAccount, recordActivityEvent, recoverSessionInputState, recoverStaleConnectorLearningJobs, refreshConnectorAccountCurrent, releaseConnectorWebhookDelivery, replaceConnectorCatalogEntries, replaceLatestSessionTurnAndQueueInput, replaceTranscriptRows, replaceUserPeopleIndex, requireXopcDatabase, resetSessionRecord, resetXopcDatabaseSingletonForTest, resolveClarification, resolveMigrationsDir, resolveSessionAgentId, resolveXopcDatabasePath, restoreBeforeCompactionBoundary, revokeDevice, revokeEndpointPrincipal, rotateDeviceRefreshToken, runSqliteWriteTransaction, searchSessionTranscript, sessionConfigRowToConfig, sessionRowToMetadata, setBrowserTabBinding, setCollaborationRuleStatus, setConnectorLearningPaused, setEndpointSessionBinding, setInteractionState, setKnowledgeConsumerWatermark, setKnowledgeSourceCursor, setKnowledgeSourceItemSynthesisStatus, setSessionConfig, setSessionInputStatus, setSessionTaskPlan, setUserTrustPolicy, signGatewayPayload, startEndpointToolInvocationAudit, startKnowledgeSyncRun, summarizeUserPeople, supersedeActiveClarification, touchEndpointPrincipal, transcriptEntryRowToStoredRow, updateConnectorLearningJob, updateInteractionStateFromMessage, updateRelationshipSettings, updateSessionConfig, updateSessionStats, updateUserPerson, upsertConnectorActionMetadata, upsertConnectorCatalogEntry, upsertConnectorConnection, upsertConnectorInstallation, upsertConnectorSyncPolicy, upsertKnowledgeSourceItems, upsertNoteAgentContextRecord, upsertNoteRecord, validateLatestSessionTurnTarget };
@@ -0,0 +1,92 @@
1
+ ALTER TABLE connector_installations RENAME COLUMN selected_connection_ids_json TO selected_account_ids_json;
2
+ UPDATE connector_installations
3
+ SET selected_account_ids_json = CASE
4
+ WHEN json_array_length(selected_account_ids_json) = 0 THEN 'null'
5
+ ELSE (
6
+ SELECT json_group_array(DISTINCT c.account_id)
7
+ FROM json_each(connector_installations.selected_account_ids_json) selected
8
+ JOIN connector_connections c ON c.id = selected.value
9
+ WHERE c.principal_id = connector_installations.principal_id
10
+ AND c.connector_id = connector_installations.connector_id
11
+ AND c.account_id IS NOT NULL
12
+ )
13
+ END;
14
+
15
+ ALTER TABLE connector_accounts ADD COLUMN label TEXT;
16
+ ALTER TABLE connector_accounts ADD COLUMN enabled INTEGER NOT NULL DEFAULT 1;
17
+ ALTER TABLE connector_accounts ADD COLUMN allowed_agent_ids_json TEXT;
18
+ UPDATE connector_accounts SET label = (
19
+ SELECT alias FROM connector_connections WHERE account_id = connector_accounts.id
20
+ AND alias IS NOT NULL ORDER BY is_default DESC, updated_at DESC LIMIT 1
21
+ );
22
+
23
+ CREATE TABLE connector_backends (
24
+ id TEXT PRIMARY KEY,
25
+ mode TEXT NOT NULL CHECK(mode IN ('managed', 'byok')),
26
+ label TEXT NOT NULL,
27
+ credential_ref TEXT,
28
+ credential_source TEXT NOT NULL DEFAULT 'stored' CHECK(credential_source IN ('stored','environment')),
29
+ verified_at TEXT,
30
+ active INTEGER NOT NULL DEFAULT 0,
31
+ created_at TEXT NOT NULL
32
+ );
33
+ CREATE UNIQUE INDEX idx_connector_backend_active ON connector_backends(active) WHERE active = 1;
34
+ ALTER TABLE connector_accounts ADD COLUMN backend_id TEXT;
35
+ DROP INDEX idx_connector_accounts_identity;
36
+ CREATE UNIQUE INDEX idx_connector_accounts_identity
37
+ ON connector_accounts(principal_id, backend_id, connector_id, identity_key)
38
+ WHERE identity_key IS NOT NULL;
39
+
40
+ CREATE TABLE connector_objective_accounts (
41
+ conversation_id TEXT NOT NULL,
42
+ transcript_id TEXT NOT NULL,
43
+ objective_id TEXT NOT NULL,
44
+ connector_id TEXT NOT NULL,
45
+ account_id TEXT NOT NULL REFERENCES connector_accounts(id) ON DELETE CASCADE,
46
+ PRIMARY KEY(conversation_id, transcript_id, objective_id, connector_id, account_id)
47
+ );
48
+
49
+ -- Provider IDs are scoped to a backend, not the whole installation.
50
+ CREATE TABLE connector_connections_next (
51
+ id TEXT PRIMARY KEY,
52
+ installation_id TEXT REFERENCES connector_installations(id) ON DELETE SET NULL,
53
+ connector_id TEXT NOT NULL,
54
+ provider TEXT NOT NULL,
55
+ principal_id TEXT NOT NULL,
56
+ provider_connection_id TEXT NOT NULL,
57
+ alias TEXT,
58
+ identity_json TEXT NOT NULL DEFAULT '{}',
59
+ status TEXT NOT NULL DEFAULT 'unknown' CHECK(status IN ('pending','active','expired','failed','revoked','disabled','unknown')),
60
+ is_default INTEGER NOT NULL DEFAULT 0 CHECK(is_default IN (0,1)),
61
+ connected_at TEXT,
62
+ expires_at TEXT,
63
+ last_error TEXT,
64
+ metadata_json TEXT NOT NULL DEFAULT '{}',
65
+ created_at TEXT NOT NULL,
66
+ updated_at TEXT NOT NULL,
67
+ account_id TEXT REFERENCES connector_accounts(id) ON DELETE CASCADE
68
+ );
69
+ INSERT INTO connector_connections_next SELECT * FROM connector_connections;
70
+ DROP TABLE connector_connections;
71
+ ALTER TABLE connector_connections_next RENAME TO connector_connections;
72
+ CREATE INDEX idx_connector_connections_principal ON connector_connections(principal_id, connector_id, status);
73
+ CREATE INDEX idx_connector_connections_account ON connector_connections(account_id);
74
+ CREATE UNIQUE INDEX idx_connector_connections_provider_backend
75
+ ON connector_connections(provider, COALESCE(json_extract(metadata_json, '$.backendId'), ''), provider_connection_id);
76
+
77
+ CREATE TABLE connector_authorization_attempts (
78
+ id TEXT PRIMARY KEY,
79
+ principal_id TEXT NOT NULL,
80
+ connector_id TEXT NOT NULL,
81
+ backend_id TEXT,
82
+ connection_id TEXT NOT NULL REFERENCES connector_connections(id) ON DELETE CASCADE,
83
+ expected_account_id TEXT,
84
+ authorization_url TEXT,
85
+ status TEXT NOT NULL CHECK(status IN ('awaiting_user','succeeded','failed','expired')),
86
+ expires_at INTEGER NOT NULL,
87
+ created_at INTEGER NOT NULL
88
+ );
89
+ CREATE INDEX idx_connector_authorization_attempt_scope ON connector_authorization_attempts(principal_id,connector_id,created_at);
90
+ CREATE TABLE connector_runtime_identity (id INTEGER PRIMARY KEY CHECK(id = 1), installation_id TEXT NOT NULL);
91
+ INSERT INTO connector_runtime_identity VALUES(1, lower(hex(randomblob(16))));
92
+ ALTER TABLE connector_approvals ADD COLUMN wait_id TEXT;
@@ -0,0 +1,20 @@
1
+ -- Repair only accounts whose authorizations agree on one known backend.
2
+ -- Identity collisions are reconciled transactionally by the next provider sync.
3
+ WITH candidates AS (
4
+ SELECT c.account_id, MIN(json_extract(c.metadata_json, '$.backendId')) AS backend_id
5
+ FROM connector_connections c
6
+ GROUP BY c.account_id
7
+ HAVING COUNT(DISTINCT json_extract(c.metadata_json, '$.backendId')) = 1
8
+ AND COUNT(json_extract(c.metadata_json, '$.backendId')) = COUNT(*)
9
+ )
10
+ UPDATE connector_accounts AS account
11
+ SET backend_id = (SELECT backend_id FROM candidates WHERE account_id = account.id)
12
+ WHERE account.backend_id IS NULL
13
+ AND EXISTS (SELECT 1 FROM candidates JOIN connector_backends backend ON backend.id = candidates.backend_id WHERE candidates.account_id = account.id)
14
+ AND NOT EXISTS (
15
+ SELECT 1 FROM connector_accounts other JOIN candidates ON candidates.account_id = account.id
16
+ WHERE other.id <> account.id
17
+ AND COALESCE(other.backend_id, (SELECT backend_id FROM candidates WHERE account_id = other.id)) = candidates.backend_id
18
+ AND other.principal_id = account.principal_id AND other.connector_id = account.connector_id
19
+ AND other.identity_key = account.identity_key
20
+ );
@@ -3,7 +3,7 @@ import type { ApplyMigrationsOptions } from './types.js';
3
3
  /** Baseline schema version applied from schema.sql on first open. */
4
4
  export declare const XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
5
5
  /** Latest schema version this release supports (increment when adding migrations). */
6
- export declare const XOPC_DB_SCHEMA_VERSION = 181;
6
+ export declare const XOPC_DB_SCHEMA_VERSION = 183;
7
7
  export declare function resolveMigrationsDir(override?: string): string;
8
8
  /**
9
9
  * Apply sequential SQL migrations from (currentVersion + 1) through targetVersion.
@@ -35,16 +35,16 @@ function applySingleMigration(db, migration) {
35
35
  targetVersion: migration.targetVersion,
36
36
  file: migration.filename
37
37
  }, "Applying SQLite migration");
38
- const rebuildDevices = migration.targetVersion === 179;
38
+ const rebuildParentTable = migration.targetVersion === 179 || migration.targetVersion === 182;
39
39
  const foreignKeysEnabled = Number(db.prepare("PRAGMA foreign_keys").get()?.foreign_keys) === 1;
40
- if (rebuildDevices) db.exec("PRAGMA foreign_keys = OFF");
40
+ if (rebuildParentTable) db.exec("PRAGMA foreign_keys = OFF");
41
41
  let transactionStarted = false;
42
42
  try {
43
43
  db.exec("BEGIN IMMEDIATE");
44
44
  transactionStarted = true;
45
45
  db.exec(migration.sql);
46
46
  const summary = migration.targetVersion === 178 ? migrateConversationUuids(db) : void 0;
47
- if (rebuildDevices && db.prepare("PRAGMA foreign_key_check").all().length > 0) throw new Error("Device platform migration would violate foreign key integrity");
47
+ if (rebuildParentTable && db.prepare("PRAGMA foreign_key_check").all().length > 0) throw new Error("Parent table migration would violate foreign key integrity");
48
48
  setSchemaVersion(db, migration.targetVersion);
49
49
  db.exec("COMMIT");
50
50
  return summary;
@@ -55,7 +55,7 @@ function applySingleMigration(db, migration) {
55
55
  const em = error instanceof Error ? error.message : String(error);
56
56
  throw new Error(`SQLite migration to v${migration.targetVersion} (${migration.filename}) failed: ${em}`, { cause: error });
57
57
  } finally {
58
- if (rebuildDevices && foreignKeysEnabled) db.exec("PRAGMA foreign_keys = ON");
58
+ if (rebuildParentTable && foreignKeysEnabled) db.exec("PRAGMA foreign_keys = ON");
59
59
  }
60
60
  }
61
61
  /**
@@ -63,7 +63,7 @@ function applySingleMigration(db, migration) {
63
63
  * Each step runs in its own transaction and updates schema_meta on success.
64
64
  */
65
65
  function applyPendingMigrations(db, options = {}) {
66
- const targetVersion = options.targetVersion ?? 181;
66
+ const targetVersion = options.targetVersion ?? 183;
67
67
  let currentVersion = readSchemaVersion(db);
68
68
  if (currentVersion > targetVersion) throw new DatabaseSchemaTooNewError(currentVersion, targetVersion);
69
69
  if (!options.migrationsDir && currentVersion < 165) throw new DatabaseSchemaTooOldError(currentVersion, 165);
@@ -118,7 +118,7 @@ function applyPendingMigrations(db, options = {}) {
118
118
  }
119
119
  /** Inspect schema version without mutating the database. */
120
120
  function inspectSchemaMigrationStatus(db, options = {}) {
121
- const appVersion = options.targetVersion ?? 181;
121
+ const appVersion = options.targetVersion ?? 183;
122
122
  const dbVersion = readSchemaVersion(db);
123
123
  if (dbVersion > appVersion) return {
124
124
  dbVersion,
@@ -157,7 +157,7 @@ var init_runner = __esmMin((() => {
157
157
  init_errors();
158
158
  log = createLogger("Sqlite:Migrations");
159
159
  XOPC_DB_BASELINE_SCHEMA_VERSION = 165;
160
- XOPC_DB_SCHEMA_VERSION = 181;
160
+ XOPC_DB_SCHEMA_VERSION = 183;
161
161
  MODULE_DIR = dirname(fileURLToPath(import.meta.url));
162
162
  }));
163
163
  //#endregion
@@ -33,7 +33,7 @@ function ensureXopcDatabaseSchema(db, options = {}) {
33
33
  currentVersion = 165;
34
34
  }
35
35
  applyPendingMigrations(db, {
36
- targetVersion: 181,
36
+ targetVersion: 183,
37
37
  databasePath: fresh ? void 0 : options.databasePath
38
38
  });
39
39
  }
@@ -1,6 +1,6 @@
1
1
  import { isHomeAttentionAcknowledged } from "../storage/sqlite/home-attention-repository.js";
2
- import { getRelationshipSettings } from "../storage/sqlite/relationship-settings-repository.js";
3
2
  import { listConnectorApprovals } from "../storage/sqlite/connector-repository.js";
3
+ import { getRelationshipSettings } from "../storage/sqlite/relationship-settings-repository.js";
4
4
  import "../storage/sqlite/index.js";
5
5
  import { TaskRepository } from "./task-repository.js";
6
6
  import { TaskReadModelProjector } from "./task-read-model-projector.js";
@@ -362,10 +362,10 @@ var HomeQueryService = class {
362
362
  id: `connector-approval:${approval.id}`,
363
363
  kind: "connector_approval",
364
364
  title: approval.actionId,
365
- detail: `${approval.connectorId} · ${approval.scope}`,
365
+ detail: `${approval.connectorId} · ${approval.scope}\n${JSON.stringify(approval.argumentsPreview).slice(0, 1600)}`,
366
366
  reason: "approval_required",
367
367
  urgency: "now",
368
- href: "/connectors",
368
+ href: approval.conversationId ? `/chat/${encodeURIComponent(approval.conversationId)}` : "/connectors",
369
369
  updatedAt: Date.parse(approval.createdAt),
370
370
  response: {
371
371
  kind: "connector_approval",
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { transcriptRowsToClientHistory } from "../../session/client-history.js";
4
4
  import { parseModelRef } from "../../agent/models/selection.js";
5
5
  import { prependEnvelopeTimestamp } from "../../channels/envelope-timestamp.js";
6
- import { RealtimeClient } from "../../../packages/realtime-client/src/index.js";
7
6
  import { gatewayCredentialAuthorization } from "../../gateway/credential.js";
7
+ import { RealtimeClient } from "../../../packages/realtime-client/src/index.js";
8
8
  import { buildTuiTranscriptTree, transcriptTreeEntryIdToRowNumber } from "../tui-transcript-tree.js";
9
9
  import { computeTuiSessionStats } from "../tui-session-stats.js";
10
10
  import { createRequire } from "node:module";
@@ -2,10 +2,10 @@ import { resolveStateDir } from "../config/paths-state.js";
2
2
  import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
3
3
  import { init_paths, resolveAgentProfileDir, resolveBundledSkillsDir } from "../config/paths.js";
4
4
  import { resolveBootstrapFilesSync } from "../agent/bootstrap/bootstrap-files.js";
5
+ import { listConnectorInstances } from "../connectors/instances.js";
5
6
  import { createSkillConfigManager, isSkillEnabled } from "../agent/skills/config.js";
6
7
  import { loadSkills } from "../agent/skills/index.js";
7
8
  import { createWorkflowCatalog } from "../agent/workflow/catalog.js";
8
- import { listConnectorInstances } from "../connectors/instances.js";
9
9
  import { getWorkspacePath } from "../config/workspace-path-helpers.js";
10
10
  import "../config/index.js";
11
11
  import { basename } from "node:path";
@@ -110,6 +110,7 @@ export interface WorkflowDefinitionManifest {
110
110
  }
111
111
  export interface WorkflowConnectorRequirement {
112
112
  connectorId: string;
113
+ accountIds?: string[];
113
114
  scope?: 'read' | 'write' | 'admin';
114
115
  connectionRequired?: boolean;
115
116
  optional?: boolean;
@@ -121,7 +121,7 @@ function validateManifest(value, errors) {
121
121
  field: "manifest.resources"
122
122
  });
123
123
  }
124
- if (value.connectors !== void 0 && (!Array.isArray(value.connectors) || value.connectors.some((connector) => !isRecord(connector) || typeof connector.connectorId !== "string" || connector.scope !== void 0 && ![
124
+ if (value.connectors !== void 0 && (!Array.isArray(value.connectors) || value.connectors.some((connector) => !isRecord(connector) || typeof connector.connectorId !== "string" || connector.accountIds !== void 0 && (!Array.isArray(connector.accountIds) || connector.accountIds.length === 0 || connector.accountIds.some((id) => typeof id !== "string" || !id.trim()) || new Set(connector.accountIds).size !== connector.accountIds.length) || connector.scope !== void 0 && ![
125
125
  "read",
126
126
  "write",
127
127
  "admin"
@@ -195,6 +195,7 @@ var WorkflowRunService = class {
195
195
  agentId: params.agentId,
196
196
  definitionId: params.definitionId,
197
197
  definitionTitle: definition.title,
198
+ connectorAccounts: connectorPreflight.accounts,
198
199
  triggerSource: params.source.kind,
199
200
  goal,
200
201
  parentConversationId: params.parentConversationId,
@@ -386,8 +387,21 @@ var WorkflowRunService = class {
386
387
  httpStatus: 400
387
388
  };
388
389
  }
390
+ const replayConnectors = preflightWorkflowConnectors({
391
+ definition,
392
+ config: this.options.service.currentConfig,
393
+ agentId: params.agentId
394
+ });
395
+ if (!replayConnectors.ok) return {
396
+ ok: false,
397
+ code: "connector_preflight_failed",
398
+ message: replayConnectors.issues.map((issue) => issue.message).join(" "),
399
+ httpStatus: 409,
400
+ details: replayConnectors
401
+ };
389
402
  const { conversationId } = await this.options.sessionBridge.prepareRunSession({
390
403
  runId: replayRunId,
404
+ connectorAccounts: replayConnectors.accounts,
391
405
  agentId: params.agentId,
392
406
  definitionId: existing.run.definitionId,
393
407
  definitionTitle: `${definition.title} replay`,
@@ -11,6 +11,7 @@ export interface PrepareWorkflowRunSessionParams {
11
11
  parentConversationId?: string;
12
12
  projectId?: string;
13
13
  triggerSource?: string;
14
+ connectorAccounts?: Record<string, string[]>;
14
15
  }
15
16
  export interface PrepareWorkflowRunSessionResult {
16
17
  conversationId: string;
@@ -48,6 +48,7 @@ var WorkflowSessionBridge = class {
48
48
  workflowRunId: params.runId,
49
49
  workflowDefinitionId: params.definitionId,
50
50
  workflowGoal: params.goal,
51
+ connectorAccounts: params.connectorAccounts ?? {},
51
52
  deferVisibilityUntilOutput: true,
52
53
  ...params.triggerSource ? { triggerSource: params.triggerSource } : {},
53
54
  ...params.parentConversationId ? { parentConversationId: params.parentConversationId } : {}