@xopcai/xopc 0.0.303 → 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 (431) hide show
  1. package/README.md +4 -4
  2. package/README.zh-CN.md +4 -4
  3. package/dist/browser-ext/dist/assets/{auth-B_9ZuGDx.js → auth-C3yV1y_l.js} +67 -22
  4. package/dist/browser-ext/dist/background.js +4 -4
  5. package/dist/browser-ext/dist/sidepanel.html +1 -1
  6. package/dist/browser-ext/dist/sidepanel.js +3 -3
  7. package/dist/browser-ext/manifest.json +1 -1
  8. package/dist/extensions/feishu/xopc.extension.json +0 -3
  9. package/dist/extensions/telegram/xopc.extension.json +1 -4
  10. package/dist/extensions/weixin/xopc.extension.json +0 -3
  11. package/dist/gateway/static/root/assets/{activity-store-DCi5rh4e.js → activity-store-wgSB2HYK.js} +1 -1
  12. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Ch3DzUvP.js → agent-avatar-dicebear-CZeQo09T.js} +1 -1
  13. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BPsRb9Ck.js +1 -0
  14. package/dist/gateway/static/root/assets/{agents-DXHD-ST3.js → agents-BlrHMbRx.js} +1 -1
  15. package/dist/gateway/static/root/assets/{api-CAV9PN9i.js → api-BKHmTb0w.js} +1 -1
  16. package/dist/gateway/static/root/assets/api-DFOlahZv.js +1 -0
  17. package/dist/gateway/static/root/assets/app-management-settings-panel-Bzw4fQP8.js +1 -0
  18. package/dist/gateway/static/root/assets/appearance-settings-8GZpUXva.js +1 -0
  19. package/dist/gateway/static/root/assets/apps-page-BkQQtIxH.js +1 -0
  20. package/dist/gateway/static/root/assets/{archive-plugin-BKGzaVvM.js → archive-plugin-CQ2NaoHb.js} +1 -1
  21. package/dist/gateway/static/root/assets/{attachment-load-8bARdLnp.js → attachment-load-BFi1H7yJ.js} +1 -1
  22. package/dist/gateway/static/root/assets/{automations-page-BAEenyzx.js → automations-page-CDBXcii_.js} +1 -1
  23. package/dist/gateway/static/root/assets/automations-workspace-CUpiTTiY.js +6 -0
  24. package/dist/gateway/static/root/assets/{binary-plugins-Cv3GS9Eo.js → binary-plugins-D07eWmOx.js} +1 -1
  25. package/dist/gateway/static/root/assets/{block-editor-D4ZIVQbk.css → block-editor-BdOTO0Yo.css} +1 -1
  26. package/dist/gateway/static/root/assets/{block-editor-DUeb92LG.js → block-editor-CtVnjyYU.js} +3 -3
  27. package/dist/gateway/static/root/assets/{browser-automation-inputs-BGT0xoTv.js → browser-automation-inputs-BzkJog8e.js} +1 -1
  28. package/dist/gateway/static/root/assets/{browser-automations-page-D1O22WIf.js → browser-automations-page-DyrSbDdG.js} +2 -2
  29. package/dist/gateway/static/root/assets/browser-settings-page-CqTxLpil.js +3 -0
  30. package/dist/gateway/static/root/assets/button-CS04eWY9.js +1 -0
  31. package/dist/gateway/static/root/assets/capabilities-settings-panel-BZ_-pnS6.js +8 -0
  32. package/dist/gateway/static/root/assets/channels-settings-DAD9qE3J.js +1 -0
  33. package/dist/gateway/static/root/assets/{channels-status-swr-C_icwbWj.js → channels-status-swr-B2JwuTjG.js} +1 -1
  34. package/dist/gateway/static/root/assets/{chat-terminal-dock-D-JYPVYl.js → chat-terminal-dock-B62SZdAo.js} +2 -2
  35. package/dist/gateway/static/root/assets/{computer-settings-page-Bcfp948A.js → computer-settings-page-ClSresNq.js} +1 -1
  36. package/dist/gateway/static/root/assets/connector-service-page-CPqVmNvx.js +1 -0
  37. package/dist/gateway/static/root/assets/connectors-page-BUQyg3CW.js +2 -0
  38. package/dist/gateway/static/root/assets/cron-expression-CTMi_tql.js +2 -0
  39. package/dist/gateway/static/root/assets/date-picker-B71AJK50.js +1 -0
  40. package/dist/gateway/static/root/assets/{dependency-picker-UtoUm57Q.js → dependency-picker-DlyGK-kA.js} +1 -1
  41. package/dist/gateway/static/root/assets/{desktop-pet-Bryx7gRM.js → desktop-pet-DGkbTE8_.js} +1 -1
  42. package/dist/gateway/static/root/assets/desktop-pet-settings-BY8r9j66.js +1 -0
  43. package/dist/gateway/static/root/assets/device-pairing-wizard-DzRrgd59.js +1 -0
  44. package/dist/gateway/static/root/assets/{extension-debug-page-DQlFTVBx.js → extension-debug-page-L8Mm1n3A.js} +1 -1
  45. package/dist/gateway/static/root/assets/{extension-page-BSsqRDXh.js → extension-page-CFc4vSNU.js} +1 -1
  46. package/dist/gateway/static/root/assets/{extension-settings-page-DbVZv9ve.js → extension-settings-page-B5zWyHr3.js} +1 -1
  47. package/dist/gateway/static/root/assets/{gateway-config-swr-D5AM8cyQ.js → gateway-config-swr-B6wHa6ZI.js} +1 -1
  48. package/dist/gateway/static/root/assets/gateway-realtime-B53R0CA4.js +1 -0
  49. package/dist/gateway/static/root/assets/gateway-realtime-store-BLDgrJ30.js +1 -0
  50. package/dist/gateway/static/root/assets/gateway-settings-D7qmTH4R.js +1 -0
  51. package/dist/gateway/static/root/assets/{gateway-startup-retry-CSJWdnFs.js → gateway-startup-retry-DRzGnEV-.js} +1 -1
  52. package/dist/gateway/static/root/assets/{heartbeat-settings-Cxowc29b.js → heartbeat-settings-Glsl3X5b.js} +1 -1
  53. package/dist/gateway/static/root/assets/home-page-s9hDQ8Hc.js +1 -0
  54. package/dist/gateway/static/root/assets/{image-generation-api-BNh604hw.js → image-generation-api-Ck_pyDom.js} +1 -1
  55. package/dist/gateway/static/root/assets/imports-page-ByBX7ome.js +1 -0
  56. package/dist/gateway/static/root/assets/index-RBCkv8a_.js +79 -0
  57. package/dist/gateway/static/root/assets/index-cFU4S35z.css +1 -0
  58. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-C45RlO8a.js +1 -0
  59. package/dist/gateway/static/root/assets/local-app-workbench-page-DP0x2jpR.js +2 -0
  60. package/dist/gateway/static/root/assets/{local-apps-page-CXPaPDGm.js → local-apps-page-C_AQc2bI.js} +1 -1
  61. package/dist/gateway/static/root/assets/{locale-store-DLK05Y1a.js → locale-store-msTfRK8P.js} +1 -1
  62. package/dist/gateway/static/root/assets/logs-page-DvM8Pyok.js +2 -0
  63. package/dist/gateway/static/root/assets/management-settings-D1uwSutV.js +1 -0
  64. package/dist/gateway/static/root/assets/{markdown-view-B8maDRWh.js → markdown-view-BInabSKf.js} +2 -2
  65. package/dist/gateway/static/root/assets/{media-plugins-tSJ0CvcX.js → media-plugins-C4mhf13f.js} +1 -1
  66. package/dist/gateway/static/root/assets/messages-F74LVAiU.js +3 -0
  67. package/dist/gateway/static/root/assets/note-detail-panel-D35sErp2.js +5 -0
  68. package/dist/gateway/static/root/assets/notes-page-8jCDklDn.js +8 -0
  69. package/dist/gateway/static/root/assets/{page-tabs-CQx6H-GS.js → page-tabs-1go_BtX1.js} +1 -1
  70. package/dist/gateway/static/root/assets/{popover-select-DldSX8GX.js → popover-select-9i-ZtHXL.js} +1 -1
  71. package/dist/gateway/static/root/assets/{preview-open-alternatives-A3-bVtdy.js → preview-open-alternatives-DmoSC0j1.js} +1 -1
  72. package/dist/gateway/static/root/assets/{proactive-page-D46cR3sf.js → proactive-page-xAjKTIID.js} +1 -1
  73. package/dist/gateway/static/root/assets/{product-open-page-CujZXOea.js → product-open-page-gmi5LLwM.js} +1 -1
  74. package/dist/gateway/static/root/assets/project-detail-page-BUMQHy_N.js +1 -0
  75. package/dist/gateway/static/root/assets/projects-page-DT-Mt7XR.js +1 -0
  76. package/dist/gateway/static/root/assets/{registry-api-BMFL4vis.js → registry-api-BSWtko7U.js} +1 -1
  77. package/dist/gateway/static/root/assets/remote-access-hub-Clz3byir.js +1 -0
  78. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CR0qvq9C.js → runtime-tools-settings-panel-ClkOoxDl.js} +2 -2
  79. package/dist/gateway/static/root/assets/{schema-form-BUD9lLEE.js → schema-form-BuEmLiaU.js} +1 -1
  80. package/dist/gateway/static/root/assets/sessions-page-tQRwktKm.js +1 -0
  81. package/dist/gateway/static/root/assets/settings-advanced-gate-DqWg9XS5.js +1 -0
  82. package/dist/gateway/static/root/assets/{settings-form-section-BZPCUH6a.js → settings-form-section-Dor39QON.js} +1 -1
  83. package/dist/gateway/static/root/assets/{settings-page-XoHmqIdm.js → settings-page-Xj-yvIc8.js} +1 -1
  84. package/dist/gateway/static/root/assets/setup-status-panel-BB_sMB7P.js +1 -0
  85. package/dist/gateway/static/root/assets/share-preview-page-BFWZoXdm.js +2 -0
  86. package/dist/gateway/static/root/assets/shares-settings-oDALm4b6.js +1 -0
  87. package/dist/gateway/static/root/assets/skill-reload-api-DmwelnfK.js +1 -0
  88. package/dist/gateway/static/root/assets/skills-page-BE9JXz4U.js +2 -0
  89. package/dist/gateway/static/root/assets/{skills-page.utils-CH-quGxZ.js → skills-page.utils-Ii8qeXhs.js} +1 -1
  90. package/dist/gateway/static/root/assets/{system-settings-panel-CGC7eBso.js → system-settings-panel-Di6OSO-0.js} +1 -1
  91. package/dist/gateway/static/root/assets/task-detail-page-D1AWszc7.js +1 -0
  92. package/dist/gateway/static/root/assets/theme-store-1SZ-HFHX.js +1 -0
  93. package/dist/gateway/static/root/assets/tunnel-api-DDOlOYlj.js +1 -0
  94. package/dist/gateway/static/root/assets/{use-autosave-BydB6x2K.js → use-autosave-CQ8uWNnB.js} +1 -1
  95. package/dist/gateway/static/root/assets/user-model-page-C00i4ea0.js +2 -0
  96. package/dist/gateway/static/root/assets/{voice-api-key-field-CPUDBcag.js → voice-api-key-field-COTzshjL.js} +1 -1
  97. package/dist/gateway/static/root/assets/{voice-config-api-bZqN8-UF.js → voice-config-api-DgJML_uM.js} +1 -1
  98. package/dist/gateway/static/root/assets/{work-discovery-overlay-D_FmJbGH.js → work-discovery-overlay-_URrXbi4.js} +1 -1
  99. package/dist/gateway/static/root/assets/workflow-run-setup-panel-CALs-1nd.js +3 -0
  100. package/dist/gateway/static/root/assets/workflows-page-BUiBjz6m.js +6 -0
  101. package/dist/gateway/static/root/channel-icons/feishu.svg +6 -12
  102. package/dist/gateway/static/root/connector-icons/SOURCES.md +12 -0
  103. package/dist/gateway/static/root/connector-icons/dingtalk-mark.svg +1 -0
  104. package/dist/gateway/static/root/connector-icons/tencent-meeting-mark.svg +37 -0
  105. package/dist/gateway/static/root/connector-icons/wps-calendar.svg +14 -0
  106. package/dist/gateway/static/root/connector-icons/wps-docs.svg +14 -0
  107. package/dist/gateway/static/root/connector-icons/wps-mail.svg +7 -0
  108. package/dist/gateway/static/root/index.html +14 -12
  109. package/dist/package.js +1 -1
  110. package/dist/packages/gateway-contract/src/device-pairing.js +100 -7
  111. package/dist/packages/gateway-contract/src/gateway-scopes.js +53 -0
  112. package/dist/packages/gateway-contract/src/index.js +2 -0
  113. package/dist/packages/realtime-client/src/index.js +14 -2
  114. package/dist/packages/realtime-protocol/src/index.js +18 -14
  115. package/dist/src/agent/agent-instance-gateway.d.ts +2 -0
  116. package/dist/src/agent/agent-manager.d.ts +2 -0
  117. package/dist/src/agent/agent-manager.js +40 -12
  118. package/dist/src/agent/agent-scope.d.ts +4 -1
  119. package/dist/src/agent/agent-scope.js +19 -3
  120. package/dist/src/agent/commands/command-isolation.js +11 -9
  121. package/dist/src/agent/commands/command-registry.js +18 -33
  122. package/dist/src/agent/context/audit.js +12 -2
  123. package/dist/src/agent/context/coordinator.d.ts +13 -3
  124. package/dist/src/agent/context/coordinator.js +27 -11
  125. package/dist/src/agent/context/execution-context.js +42 -22
  126. package/dist/src/agent/context/execution-context.types.d.ts +4 -2
  127. package/dist/src/agent/context/execution-scope.d.ts +2 -2
  128. package/dist/src/agent/context/execution-scope.js +1 -1
  129. package/dist/src/agent/context/project-context.d.ts +2 -2
  130. package/dist/src/agent/context/project-context.js +3 -3
  131. package/dist/src/agent/embedded/run-for-session.d.ts +1 -0
  132. package/dist/src/agent/embedded/run-for-session.js +7 -1
  133. package/dist/src/agent/external-tools/composio-provider.js +83 -20
  134. package/dist/src/agent/external-tools/gateway-tools.js +2 -1
  135. package/dist/src/agent/inbound/attachment-pipeline.d.ts +2 -0
  136. package/dist/src/agent/inbound/attachment-pipeline.js +3 -3
  137. package/dist/src/agent/inbound/inbound-loop.js +1 -0
  138. package/dist/src/agent/inbound/turn-dispatcher.js +3 -3
  139. package/dist/src/agent/mcp/bundle-mcp-runtime.js +1 -1
  140. package/dist/src/agent/mcp/mcp-stdio-transport.js +5 -2
  141. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +1 -1
  142. package/dist/src/agent/memory/compaction-promotion.js +7 -2
  143. package/dist/src/agent/memory/create-memory-manager.js +1 -0
  144. package/dist/src/agent/memory/manager.d.ts +6 -0
  145. package/dist/src/agent/memory/manager.js +74 -39
  146. package/dist/src/agent/memory/runtime.d.ts +3 -3
  147. package/dist/src/agent/memory/runtime.js +11 -4
  148. package/dist/src/agent/orchestration/agent-orchestrator.js +4 -1
  149. package/dist/src/agent/prompt/cache-boundary.d.ts +2 -0
  150. package/dist/src/agent/prompt/cache-boundary.js +10 -1
  151. package/dist/src/agent/service/build-direct-message-content.d.ts +1 -0
  152. package/dist/src/agent/service/build-direct-message-content.js +2 -1
  153. package/dist/src/agent/service/direct-turn-helpers.js +3 -2
  154. package/dist/src/agent/service/process-direct-streaming.d.ts +3 -1
  155. package/dist/src/agent/service/process-direct-streaming.js +3 -2
  156. package/dist/src/agent/service/webchat-tts.d.ts +0 -4
  157. package/dist/src/agent/service/webchat-tts.js +20 -19
  158. package/dist/src/agent/tools/factory.js +3 -3
  159. package/dist/src/agent/tools/knowledge-memory-tool.d.ts +2 -2
  160. package/dist/src/agent/tools/knowledge-memory-tool.js +7 -7
  161. package/dist/src/browser/native-messaging-host.js +2 -2
  162. package/dist/src/channels/attachments/voice-stt-webchat.d.ts +3 -0
  163. package/dist/src/channels/attachments/voice-stt-webchat.js +22 -9
  164. package/dist/src/cli/commands/agent.js +2 -0
  165. package/dist/src/cli/commands/config.js +8 -9
  166. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  167. package/dist/src/cli/commands/extension-marketplace.js +69 -44
  168. package/dist/src/cli/commands/extension-pack.js +0 -2
  169. package/dist/src/cli/commands/extension.js +4 -25
  170. package/dist/src/cli/commands/gateway/lifecycle.js +1 -1
  171. package/dist/src/cli/commands/onboard/gateway.js +2 -1
  172. package/dist/src/cli/utils/init-workspace-core.js +5 -2
  173. package/dist/src/config/index.js +2 -2
  174. package/dist/src/config/loader.d.ts +1 -0
  175. package/dist/src/config/loader.js +14 -1
  176. package/dist/src/config/schema.d.ts +22 -3
  177. package/dist/src/config/schema.js +13 -3
  178. package/dist/src/connectors/account-access.d.ts +4 -0
  179. package/dist/src/connectors/account-access.js +23 -0
  180. package/dist/src/connectors/approval-resume.d.ts +4 -0
  181. package/dist/src/connectors/approval-resume.js +23 -0
  182. package/dist/src/connectors/auth-provider-registry.d.ts +1 -0
  183. package/dist/src/connectors/auth-provider-registry.js +2 -1
  184. package/dist/src/connectors/authorization-attempts.d.ts +21 -0
  185. package/dist/src/connectors/authorization-attempts.js +33 -0
  186. package/dist/src/connectors/builtin-catalog.js +1 -3
  187. package/dist/src/connectors/catalog.js +2 -1
  188. package/dist/src/connectors/china-catalog.d.ts +2 -0
  189. package/dist/src/connectors/china-catalog.js +430 -0
  190. package/dist/src/connectors/composio-backends.d.ts +26 -0
  191. package/dist/src/connectors/composio-backends.js +65 -0
  192. package/dist/src/connectors/composio-catalog.js +2 -1
  193. package/dist/src/connectors/composio-managed-client.js +3 -1
  194. package/dist/src/connectors/composio-managed-events.js +5 -2
  195. package/dist/src/connectors/composio-session-types.d.ts +2 -0
  196. package/dist/src/connectors/composio-sessions.d.ts +11 -2
  197. package/dist/src/connectors/composio-sessions.js +137 -35
  198. package/dist/src/connectors/composio-triggers.js +4 -2
  199. package/dist/src/connectors/composio.d.ts +11 -8
  200. package/dist/src/connectors/composio.js +68 -84
  201. package/dist/src/connectors/connected-source-ingestion.js +4 -3
  202. package/dist/src/connectors/connection-recovery-service.js +25 -13
  203. package/dist/src/connectors/connector-identity.d.ts +2 -0
  204. package/dist/src/connectors/connector-identity.js +18 -5
  205. package/dist/src/connectors/content-enrichment.js +1 -1
  206. package/dist/src/connectors/instances.js +1 -7
  207. package/dist/src/connectors/learning-coordinator.js +4 -3
  208. package/dist/src/connectors/materialize.js +14 -1
  209. package/dist/src/connectors/policy.d.ts +1 -1
  210. package/dist/src/connectors/policy.js +1 -1
  211. package/dist/src/connectors/principal.js +24 -3
  212. package/dist/src/connectors/providers.d.ts +1 -0
  213. package/dist/src/connectors/providers.js +14 -2
  214. package/dist/src/connectors/runtime-adapter-registry.js +4 -9
  215. package/dist/src/connectors/secret-store.d.ts +4 -1
  216. package/dist/src/connectors/secret-store.js +7 -3
  217. package/dist/src/connectors/source-change-publisher.js +4 -2
  218. package/dist/src/connectors/types.d.ts +16 -11
  219. package/dist/src/connectors/workflow-preflight.d.ts +2 -1
  220. package/dist/src/connectors/workflow-preflight.js +20 -3
  221. package/dist/src/execution-environments/local-worktree-manager.js +17 -15
  222. package/dist/src/execution-environments/store.js +4 -2
  223. package/dist/src/execution-environments/types.d.ts +3 -0
  224. package/dist/src/execution-environments/types.js +2 -1
  225. package/dist/src/execution-environments/worktree-safety.d.ts +8 -0
  226. package/dist/src/execution-environments/worktree-safety.js +43 -0
  227. package/dist/src/extensions/activation-planner.d.ts +1 -1
  228. package/dist/src/extensions/activation-planner.js +1 -1
  229. package/dist/src/extensions/api-version.d.ts +4 -0
  230. package/dist/src/extensions/api-version.js +15 -0
  231. package/dist/src/extensions/api.d.ts +3 -9
  232. package/dist/src/extensions/api.js +26 -32
  233. package/dist/src/extensions/config-validation.d.ts +8 -0
  234. package/dist/src/extensions/config-validation.js +25 -0
  235. package/dist/src/extensions/extension-registry-impl.d.ts +20 -9
  236. package/dist/src/extensions/extension-registry-impl.js +79 -11
  237. package/dist/src/extensions/hooks.d.ts +1 -1
  238. package/dist/src/extensions/index.d.ts +2 -1
  239. package/dist/src/extensions/install-transaction.d.ts +2 -0
  240. package/dist/src/extensions/install-transaction.js +32 -21
  241. package/dist/src/extensions/install.js +18 -1
  242. package/dist/src/extensions/loader.d.ts +5 -5
  243. package/dist/src/extensions/loader.js +109 -47
  244. package/dist/src/extensions/lockfile.d.ts +3 -5
  245. package/dist/src/extensions/lockfile.js +41 -14
  246. package/dist/src/extensions/normalize-manifest.js +6 -60
  247. package/dist/src/extensions/sdk/index.d.ts +3 -2
  248. package/dist/src/extensions/sdk/index.js +2 -2
  249. package/dist/src/extensions/sdk/testing.js +0 -4
  250. package/dist/src/extensions/security.js +5 -7
  251. package/dist/src/extensions/types/core.d.ts +0 -5
  252. package/dist/src/extensions/types/index.d.ts +1 -1
  253. package/dist/src/extensions/types/manifest.d.ts +1 -25
  254. package/dist/src/extensions/types/providers.d.ts +1 -1
  255. package/dist/src/extensions/types/registration.d.ts +0 -12
  256. package/dist/src/extensions/update.js +71 -30
  257. package/dist/src/gateway/heartbeat/service.js +2 -2
  258. package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
  259. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +47 -10
  260. package/dist/src/gateway/hono/routes/connectors.js +208 -17
  261. package/dist/src/gateway/hono/routes/context-sources.js +1 -1
  262. package/dist/src/gateway/hono/routes/devices.js +10 -7
  263. package/dist/src/gateway/hono/routes/endpoint-compatibility.js +6 -0
  264. package/dist/src/gateway/hono/routes/extension-gateway.js +0 -33
  265. package/dist/src/gateway/hono/routes/home.js +4 -1
  266. package/dist/src/gateway/hono/routes/lazy-bundles.js +0 -1
  267. package/dist/src/gateway/hono/routes/mcp.js +1 -1
  268. package/dist/src/gateway/hono/routes/realtime.js +30 -8
  269. package/dist/src/gateway/hono/routes/user-model.js +25 -6
  270. package/dist/src/gateway/index.js +4 -1
  271. package/dist/src/gateway/lock.d.ts +2 -0
  272. package/dist/src/gateway/lock.js +31 -14
  273. package/dist/src/gateway/run-loop.js +2 -1
  274. package/dist/src/gateway/security/gateway-scopes.d.ts +2 -5
  275. package/dist/src/gateway/security/gateway-scopes.js +3 -45
  276. package/dist/src/gateway/security/index.js +2 -1
  277. package/dist/src/gateway/service.js +11 -7
  278. package/dist/src/heartbeat/index.js +1 -1
  279. package/dist/src/imports/importService.d.ts +1 -1
  280. package/dist/src/imports/inventory.js +16 -2
  281. package/dist/src/imports/productImport.js +5 -5
  282. package/dist/src/imports/types.d.ts +3 -3
  283. package/dist/src/infra/exec.d.ts +2 -2
  284. package/dist/src/infra/exec.js +32 -27
  285. package/dist/src/infra/run-command.js +15 -50
  286. package/dist/src/infra/update-restart.js +1 -1
  287. package/dist/src/knowledge/connected-knowledge-pipeline.js +13 -3
  288. package/dist/src/knowledge-memory/domain.d.ts +17 -1
  289. package/dist/src/knowledge-memory/index.js +2 -2
  290. package/dist/src/knowledge-memory/repository.d.ts +26 -4
  291. package/dist/src/knowledge-memory/repository.js +171 -36
  292. package/dist/src/mcp/channel-bridge.js +7 -3
  293. package/dist/src/media-understanding/registry.js +6 -1
  294. package/dist/src/migrations/knowledge-memory-read-policy-config.d.ts +2 -0
  295. package/dist/src/migrations/knowledge-memory-read-policy-config.js +48 -0
  296. package/dist/src/migrations/runner.js +2 -1
  297. package/dist/src/proactive/follow-ups.js +2 -1
  298. package/dist/src/process/bounded-output.d.ts +10 -0
  299. package/dist/src/process/bounded-output.js +41 -0
  300. package/dist/src/process/kill-tree.d.ts +6 -17
  301. package/dist/src/process/kill-tree.js +43 -75
  302. package/dist/src/process/process-spec.d.ts +39 -0
  303. package/dist/src/process/process-spec.js +13 -0
  304. package/dist/src/process/run-process.d.ts +4 -0
  305. package/dist/src/process/run-process.js +97 -0
  306. package/dist/src/providers/plugin-registry.d.ts +1 -1
  307. package/dist/src/providers/plugin-registry.js +6 -0
  308. package/dist/src/realtime/runtime.js +3 -1
  309. package/dist/src/session/store.js +1 -1
  310. package/dist/src/storage/sqlite/connection-wait-repository.d.ts +3 -0
  311. package/dist/src/storage/sqlite/connection-wait-repository.js +63 -2
  312. package/dist/src/storage/sqlite/connector-account-repository.d.ts +6 -0
  313. package/dist/src/storage/sqlite/connector-account-repository.js +35 -7
  314. package/dist/src/storage/sqlite/connector-repository.js +15 -10
  315. package/dist/src/storage/sqlite/connector-sync-policy-repository.js +1 -1
  316. package/dist/src/storage/sqlite/device-pairing-approval.js +1 -1
  317. package/dist/src/storage/sqlite/index.d.ts +1 -1
  318. package/dist/src/storage/sqlite/index.js +6 -4
  319. package/dist/src/storage/sqlite/migrations/180_execution_environment_ownership.sql +7 -0
  320. package/dist/src/storage/sqlite/migrations/181_knowledge_item_status_events.sql +12 -0
  321. package/dist/src/storage/sqlite/migrations/182_connector_account_policies.sql +92 -0
  322. package/dist/src/storage/sqlite/migrations/183_connector_backend_consistency.sql +20 -0
  323. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  324. package/dist/src/storage/sqlite/migrations/runner.js +7 -7
  325. package/dist/src/storage/sqlite/schema.js +1 -1
  326. package/dist/src/storage/sqlite/schema.sql +13 -0
  327. package/dist/src/storage/sqlite/transcript-repository.d.ts +4 -0
  328. package/dist/src/storage/sqlite/transcript-repository.js +36 -1
  329. package/dist/src/tasks/home-query-service.js +3 -3
  330. package/dist/src/tui/backends/embedded-backend.d.ts +24 -8
  331. package/dist/src/tui/backends/embedded-backend.js +114 -10
  332. package/dist/src/tui/backends/gateway-realtime-backend.d.ts +18 -0
  333. package/dist/src/tui/backends/gateway-realtime-backend.js +31 -4
  334. package/dist/src/tui/components/assistant-message.d.ts +4 -1
  335. package/dist/src/tui/components/assistant-message.js +10 -2
  336. package/dist/src/tui/components/cell-render-mode.d.ts +4 -0
  337. package/dist/src/tui/components/cell-render-mode.js +1 -0
  338. package/dist/src/tui/components/chat-log.d.ts +17 -4
  339. package/dist/src/tui/components/chat-log.js +68 -50
  340. package/dist/src/tui/components/custom-editor.d.ts +2 -2
  341. package/dist/src/tui/components/custom-editor.js +5 -1
  342. package/dist/src/tui/components/pending-input-preview.d.ts +9 -0
  343. package/dist/src/tui/components/pending-input-preview.js +33 -0
  344. package/dist/src/tui/components/semantic-cell.d.ts +17 -0
  345. package/dist/src/tui/components/semantic-cell.js +29 -0
  346. package/dist/src/tui/components/tool-execution.d.ts +5 -1
  347. package/dist/src/tui/components/tool-execution.js +33 -10
  348. package/dist/src/tui/components/transcript-overlay.d.ts +29 -0
  349. package/dist/src/tui/components/transcript-overlay.js +114 -0
  350. package/dist/src/tui/components/tui-bottom-bar.js +3 -1
  351. package/dist/src/tui/components/user-message.d.ts +5 -1
  352. package/dist/src/tui/components/user-message.js +12 -1
  353. package/dist/src/tui/extension-host/load-extensions.d.ts +1 -1
  354. package/dist/src/tui/extension-host/runtime-context.js +2 -1
  355. package/dist/src/tui/extension-host/runtime.d.ts +1 -1
  356. package/dist/src/tui/format-tui-hotkeys.js +8 -1
  357. package/dist/src/tui/tui-agent-events.js +31 -0
  358. package/dist/src/tui/tui-backend.d.ts +23 -11
  359. package/dist/src/tui/tui-backend.js +1 -9
  360. package/dist/src/tui/tui-chat-input-state.d.ts +25 -0
  361. package/dist/src/tui/tui-chat-input-state.js +36 -0
  362. package/dist/src/tui/tui-command-formatters.js +2 -1
  363. package/dist/src/tui/tui-commands.js +1 -1
  364. package/dist/src/tui/tui-startup-resources.js +1 -1
  365. package/dist/src/tui/tui-types.d.ts +2 -1
  366. package/dist/src/tui/tui-types.js +2 -1
  367. package/dist/src/tui/tui.js +122 -30
  368. package/dist/src/tui/xopc-tui-keybindings.d.ts +23 -3
  369. package/dist/src/tui/xopc-tui-keybindings.js +22 -2
  370. package/dist/src/user-context/access-policy.d.ts +2 -2
  371. package/dist/src/user-context/access-policy.js +10 -2
  372. package/dist/src/user-context/config.d.ts +23 -6
  373. package/dist/src/user-context/config.js +54 -7
  374. package/dist/src/voice/platform-streams.js +11 -1
  375. package/dist/src/voice/realtime/omniEngine.js +13 -1
  376. package/dist/src/voice/realtime/runtime.js +2 -1
  377. package/dist/src/voice/tts/audio.js +1 -1
  378. package/dist/src/voice/tts/speech-registry.js +6 -1
  379. package/dist/src/workflows/domain/definition.d.ts +1 -0
  380. package/dist/src/workflows/domain/validation.js +1 -1
  381. package/dist/src/workflows/service/workflow-run-service.js +14 -0
  382. package/dist/src/workflows/service/workflow-session-bridge.d.ts +1 -0
  383. package/dist/src/workflows/service/workflow-session-bridge.js +1 -0
  384. package/package.json +5 -3
  385. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-4oGrNj3m.js +0 -1
  386. package/dist/gateway/static/root/assets/api-fPapljyb.js +0 -1
  387. package/dist/gateway/static/root/assets/app-management-settings-panel-CdXnNtTg.js +0 -1
  388. package/dist/gateway/static/root/assets/appearance-settings-izNAyDhW.js +0 -1
  389. package/dist/gateway/static/root/assets/apps-page-BQb3RCga.js +0 -1
  390. package/dist/gateway/static/root/assets/automations-workspace-5vTl4x0h.js +0 -6
  391. package/dist/gateway/static/root/assets/browser-settings-page-CH9prS-f.js +0 -3
  392. package/dist/gateway/static/root/assets/button-CGlRPNzi.js +0 -1
  393. package/dist/gateway/static/root/assets/capabilities-settings-panel-DMURlZbj.js +0 -8
  394. package/dist/gateway/static/root/assets/channels-settings-CFBS3Yqy.js +0 -1
  395. package/dist/gateway/static/root/assets/connectors-page-DI1c3BMz.js +0 -2
  396. package/dist/gateway/static/root/assets/cron-expression-BJMBFKCh.js +0 -2
  397. package/dist/gateway/static/root/assets/date-picker-BFRIn5y9.js +0 -1
  398. package/dist/gateway/static/root/assets/desktop-pet-settings-DFsyEJUr.js +0 -1
  399. package/dist/gateway/static/root/assets/device-pairing-wizard-C3TQVPRy.js +0 -1
  400. package/dist/gateway/static/root/assets/gateway-settings-DUqVsB3X.js +0 -1
  401. package/dist/gateway/static/root/assets/home-page-CLkumXdN.js +0 -1
  402. package/dist/gateway/static/root/assets/imports-page-DXNfRmk9.js +0 -1
  403. package/dist/gateway/static/root/assets/index-BLRIcVQa.css +0 -1
  404. package/dist/gateway/static/root/assets/index-gheM453N.js +0 -79
  405. package/dist/gateway/static/root/assets/keyboard-shortcuts-settings-5Hcec8Xf.js +0 -1
  406. package/dist/gateway/static/root/assets/local-app-workbench-page-BDg1-fcw.js +0 -2
  407. package/dist/gateway/static/root/assets/logs-page-BWZc5jwO.js +0 -2
  408. package/dist/gateway/static/root/assets/management-settings-COa3PhMs.js +0 -1
  409. package/dist/gateway/static/root/assets/messages-C9h8SImu.js +0 -3
  410. package/dist/gateway/static/root/assets/note-detail-panel-D_YGzNcR.js +0 -5
  411. package/dist/gateway/static/root/assets/notes-page-D1f2oI2-.js +0 -8
  412. package/dist/gateway/static/root/assets/project-detail-page-CRlD_Rwv.js +0 -1
  413. package/dist/gateway/static/root/assets/projects-page-mmX0SavY.js +0 -1
  414. package/dist/gateway/static/root/assets/remote-access-hub-Cqr3K6T5.js +0 -1
  415. package/dist/gateway/static/root/assets/sessions-page-CPkvbdJP.js +0 -1
  416. package/dist/gateway/static/root/assets/settings-advanced-gate-Cu0DAbeH.js +0 -1
  417. package/dist/gateway/static/root/assets/setup-status-panel-D8fQF1jZ.js +0 -1
  418. package/dist/gateway/static/root/assets/share-preview-page-BgHqwTuT.js +0 -2
  419. package/dist/gateway/static/root/assets/shares-settings-Id4vRHzI.js +0 -1
  420. package/dist/gateway/static/root/assets/skill-reload-api-BB2Fj_di.js +0 -1
  421. package/dist/gateway/static/root/assets/skills-page-BAwF4LpS.js +0 -2
  422. package/dist/gateway/static/root/assets/task-detail-page-BVjw812D.js +0 -1
  423. package/dist/gateway/static/root/assets/theme-store-KfFEGMlp.js +0 -1
  424. package/dist/gateway/static/root/assets/tunnel-api-Do98Xk05.js +0 -1
  425. package/dist/gateway/static/root/assets/user-model-page-Nv68a4ak.js +0 -2
  426. package/dist/gateway/static/root/assets/workflow-run-setup-panel-1lZ_btki.js +0 -3
  427. package/dist/gateway/static/root/assets/workflows-page-DFOhccm3.js +0 -6
  428. package/dist/src/extensions/when-context.d.ts +0 -6
  429. package/dist/src/extensions/when-context.js +0 -26
  430. package/dist/src/extensions/when-expression.d.ts +0 -11
  431. package/dist/src/extensions/when-expression.js +0 -213
@@ -168,7 +168,7 @@ export interface ProviderResponse {
168
168
  }
169
169
  export interface ProviderRegistry {
170
170
  /** Register a provider */
171
- register(provider: ProviderPlugin): void;
171
+ register(provider: ProviderPlugin): () => void;
172
172
  /** Get a provider by ID */
173
173
  get(id: string): ProviderPlugin | undefined;
174
174
  /** List all providers */
@@ -37,15 +37,3 @@ export interface OAuthCredentials {
37
37
  refresh?: string;
38
38
  expiresAt?: number;
39
39
  }
40
- export interface FlagConfig {
41
- type: 'boolean' | 'string';
42
- default?: FlagValue;
43
- description: string;
44
- aliases?: string[];
45
- }
46
- export type FlagValue = boolean | string | undefined;
47
- export interface ShortcutConfig {
48
- description: string;
49
- handler: ShortcutHandler;
50
- }
51
- export type ShortcutHandler = (context: unknown) => void | Promise<void>;
@@ -3,11 +3,12 @@ import { init_logger } from "../utils/logger.js";
3
3
  import { init_paths, resolveBundledExtensionsDir, resolveExtensionsDir } from "../config/paths.js";
4
4
  import { init_loader, loadConfig } from "../config/loader.js";
5
5
  import { downloadExtensionStoreZipBuffer, resolveExtensionZipDownloadUrl, resolveExtensionsStoreBaseUrl, verifyStoreArtifactSha256 } from "../agent/skills/marketplace/adapters/store/store-api-client.js";
6
- import { getExtensionLockfileManager } from "./lockfile.js";
7
- import { installExtensionFromStoreZip, installFromNpm } from "./install.js";
6
+ import { computeExtensionDirectoryIntegrity, getExtensionLockfileManager } from "./lockfile.js";
7
+ import { commitStagedExtensionInstall, finalizeStagedExtensionInstall, rollbackStagedExtensionInstall, stageExtensionNpm, stageExtensionStoreZip } from "./install-transaction.js";
8
8
  import { findExtension } from "./marketplace.js";
9
9
  import { join } from "node:path";
10
- import { existsSync, readFileSync, readdirSync, rmSync } from "node:fs";
10
+ import { existsSync, readFileSync, readdirSync } from "node:fs";
11
+ import { createHash } from "node:crypto";
11
12
  import semver from "semver";
12
13
  //#region src/extensions/update.ts
13
14
  /**
@@ -18,6 +19,35 @@ init_loader();
18
19
  init_logger();
19
20
  const log = createLogger("ExtensionUpdate");
20
21
  const MANIFEST = "xopc.extension.json";
22
+ function readJsonObject(path) {
23
+ try {
24
+ const value = JSON.parse(readFileSync(path, "utf-8"));
25
+ return value && typeof value === "object" && !Array.isArray(value) ? value : void 0;
26
+ } catch {
27
+ return;
28
+ }
29
+ }
30
+ function installedSnapshots(targetDir, extensionId) {
31
+ const root = join(targetDir, extensionId);
32
+ return {
33
+ manifest: readJsonObject(join(root, MANIFEST)),
34
+ packageJson: readJsonObject(join(root, "package.json"))
35
+ };
36
+ }
37
+ async function commitStagedWithLock(transaction, lock, writeLock) {
38
+ const snapshot = await lock.load();
39
+ let lockWriteStarted = false;
40
+ try {
41
+ commitStagedExtensionInstall(transaction, true);
42
+ lockWriteStarted = true;
43
+ await writeLock();
44
+ } catch (error) {
45
+ rollbackStagedExtensionInstall(transaction);
46
+ if (lockWriteStarted) await lock.save(snapshot);
47
+ throw error;
48
+ }
49
+ finalizeStagedExtensionInstall(transaction);
50
+ }
21
51
  function readInstalledExtensionVersion(targetDir, extensionId) {
22
52
  const manifestPath = join(targetDir, extensionId, MANIFEST);
23
53
  if (!existsSync(manifestPath)) return;
@@ -46,7 +76,9 @@ async function upsertNpmExtensionLock(lock, targetDir, result, spec) {
46
76
  name: result.extensionId,
47
77
  version: ver,
48
78
  resolved,
49
- source: "npm"
79
+ source: "npm",
80
+ installedIntegrity: computeExtensionDirectoryIntegrity(join(targetDir, result.extensionId)),
81
+ ...installedSnapshots(targetDir, result.extensionId)
50
82
  });
51
83
  }
52
84
  async function installExtensionFromStoreWithLock(params) {
@@ -54,20 +86,27 @@ async function installExtensionFromStoreWithLock(params) {
54
86
  const { downloadUrl, version, sha256 } = await resolveExtensionZipDownloadUrl(params.storeBase, params.packageName, params.version);
55
87
  const buf = await downloadExtensionStoreZipBuffer(params.storeBase, downloadUrl);
56
88
  verifyStoreArtifactSha256(buf, sha256);
57
- const result = await installExtensionFromStoreZip(buf, params.targetDir);
58
- if (!result.ok || !result.extensionId) return {
59
- ok: false,
60
- error: result.error ?? "install failed"
61
- };
62
- await params.lock.upsert(result.extensionId, {
63
- name: result.extensionId,
89
+ const transaction = await stageExtensionStoreZip(buf, params.targetDir);
90
+ if (transaction.extensionId !== params.expectedExtensionId) {
91
+ rollbackStagedExtensionInstall(transaction);
92
+ return {
93
+ ok: false,
94
+ error: `Expected extension ${params.expectedExtensionId}, received ${transaction.extensionId}`
95
+ };
96
+ }
97
+ await commitStagedWithLock(transaction, params.lock, () => params.lock.upsert(transaction.extensionId, {
98
+ name: transaction.extensionId,
64
99
  version,
65
100
  resolved: params.packageName,
66
- source: "store"
67
- });
101
+ source: "store",
102
+ artifactUrl: downloadUrl,
103
+ integrity: `sha256-${createHash("sha256").update(buf).digest("base64")}`,
104
+ installedIntegrity: computeExtensionDirectoryIntegrity(transaction.targetDir),
105
+ ...installedSnapshots(params.targetDir, transaction.extensionId)
106
+ }));
68
107
  return {
69
108
  ok: true,
70
- extensionId: result.extensionId,
109
+ extensionId: transaction.extensionId,
71
110
  version
72
111
  };
73
112
  } catch (err) {
@@ -112,14 +151,10 @@ async function updateSingleExtension(params) {
112
151
  const { extensionId, entry, targetDir, storeBase, lock, timeoutMs, logger } = params;
113
152
  const currentVersion = readInstalledExtensionVersion(targetDir, extensionId);
114
153
  if (entry.source === "store") {
115
- const pkgName = entry.resolved?.trim() || extensionId;
116
- if (existsSync(join(targetDir, extensionId))) rmSync(join(targetDir, extensionId), {
117
- recursive: true,
118
- force: true
119
- });
120
154
  const result = await installExtensionFromStoreWithLock({
121
155
  storeBase,
122
- packageName: pkgName,
156
+ packageName: entry.resolved?.trim() || extensionId,
157
+ expectedExtensionId: extensionId,
123
158
  targetDir,
124
159
  lock
125
160
  });
@@ -153,13 +188,20 @@ async function updateSingleExtension(params) {
153
188
  status: "skipped",
154
189
  message: `Skipping "${extensionId}" (could not resolve npm package).`
155
190
  };
156
- if (existsSync(join(targetDir, extensionId))) rmSync(join(targetDir, extensionId), {
157
- recursive: true,
158
- force: true
159
- });
160
- const installResult = await installFromNpm(spec, targetDir, timeoutMs);
161
- if (!installResult.ok) {
162
- const message = installResult.error ?? "npm install failed";
191
+ let transaction;
192
+ try {
193
+ transaction = await stageExtensionNpm(spec, targetDir, timeoutMs);
194
+ if (transaction.extensionId !== extensionId) {
195
+ rollbackStagedExtensionInstall(transaction);
196
+ throw new Error(`Expected extension ${extensionId}, received ${transaction.extensionId}`);
197
+ }
198
+ await commitStagedWithLock(transaction, lock, () => upsertNpmExtensionLock(lock, targetDir, {
199
+ ok: true,
200
+ extensionId: transaction.extensionId,
201
+ targetDir: transaction.targetDir
202
+ }, spec));
203
+ } catch (error) {
204
+ const message = error instanceof Error ? error.message : String(error);
163
205
  logger.error?.(`Failed to update ${extensionId}: ${message}`);
164
206
  return {
165
207
  extensionId,
@@ -168,9 +210,8 @@ async function updateSingleExtension(params) {
168
210
  currentVersion
169
211
  };
170
212
  }
171
- await upsertNpmExtensionLock(lock, targetDir, installResult, spec);
172
- const nextVersion = (installResult.extensionId ? readInstalledExtensionVersion(targetDir, installResult.extensionId) : void 0) ?? entry.version;
173
- const resolvedId = installResult.extensionId ?? extensionId;
213
+ const nextVersion = readInstalledExtensionVersion(targetDir, transaction.extensionId) ?? entry.version;
214
+ const resolvedId = transaction.extensionId;
174
215
  const status = currentVersion && nextVersion && currentVersion === nextVersion ? "unchanged" : "updated";
175
216
  return {
176
217
  extensionId: resolvedId,
@@ -4,11 +4,11 @@ import { init_agent_scope, resolveDefaultAgentId } from "../../agent/agent-scope
4
4
  import { createConversation, init_conversation_repository, resolveRoutedConversation } from "../../storage/sqlite/conversation-repository.js";
5
5
  import { shouldSilence, stripHeartbeatToken } from "../../heartbeat/tokens.js";
6
6
  import { proactiveChecksAllowed, proactivePreferences } from "../../proactive/policy/service.js";
7
- import { beginHeartbeatCheck, completeHeartbeatCheck, deliverHeartbeatChecks, recentHeartbeatChecks, recoverHeartbeatChecks } from "./check-store.js";
8
- import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
9
7
  import { isWithinActiveHours } from "../../heartbeat/active-hours.js";
10
8
  import { isHeartbeatContentEmpty } from "../../heartbeat/content-check.js";
9
+ import { appendCronEventLines } from "../../heartbeat/event-prompt.js";
11
10
  import { createHeartbeatWake } from "../../heartbeat/wake.js";
11
+ import { beginHeartbeatCheck, completeHeartbeatCheck, deliverHeartbeatChecks, recentHeartbeatChecks, recoverHeartbeatChecks } from "./check-store.js";
12
12
  import { resolveHeartbeatMdPath } from "../workspace-heartbeat-path.js";
13
13
  import { readFile } from "fs/promises";
14
14
  //#region src/gateway/heartbeat/service.ts
@@ -245,8 +245,10 @@ export declare function buildSafeWebConfigPayload(service: GatewayService, optio
245
245
  knowledgeMemory: {
246
246
  enabled: boolean;
247
247
  writePolicy: "allow" | "confirm" | "deny";
248
- sources: ("project" | "session" | "workspace" | "connector")[];
248
+ readScopes: ("project" | "session" | "agent" | "workspace" | "global")[];
249
+ contentSources: ("memory" | "connector" | "local_import")[];
249
250
  searchStrategy: "local-first" | "external-first" | "fanout" | "local-only" | "external-only";
251
+ searchTimeoutMs: number;
250
252
  writeStrategy: "local-first" | "external-first" | "local-only" | "external-only" | "write-through";
251
253
  allowExternalWrites: boolean;
252
254
  allowedProviderIds?: string[];
@@ -1,8 +1,8 @@
1
1
  import { getAllModels, getAvailableModels, init_providers } from "../../../providers/index.js";
2
2
  import { ActivationPlanner } from "../../../extensions/activation-planner.js";
3
3
  import { mergeActivationContext } from "../../../extensions/activation-context.js";
4
+ import { validateExtensionConfig } from "../../../extensions/config-validation.js";
4
5
  import { fetchRegistry, listExtensions, searchExtensions } from "../../../extensions/marketplace.js";
5
- import { buildWhenContextSnapshot } from "../../../extensions/when-context.js";
6
6
  import { createOAuthAsyncHandler } from "../oauth-async.js";
7
7
  import { createOAuthHandler } from "../oauth.js";
8
8
  import { extensionAssetMimeType } from "../lib/extension-assets.js";
@@ -265,22 +265,59 @@ function registerAuthRegistryExtensionsRoutes(authenticated, deps) {
265
265
  });
266
266
  authenticated.get("/api/extensions/:id/config", async (c) => {
267
267
  const extensionId = c.req.param("id");
268
- return c.json(await loadExtensionStore(`__config__${extensionId}`));
268
+ const configured = service.currentConfig.extensions?.[extensionId];
269
+ const config = configured && typeof configured === "object" && !Array.isArray(configured) ? configured : {};
270
+ return c.json(config);
269
271
  });
270
272
  authenticated.patch("/api/extensions/:id/config", async (c) => {
271
273
  const extensionId = c.req.param("id");
272
274
  const patch = await c.req.json().catch(() => null);
273
275
  if (!patch || typeof patch !== "object" || Array.isArray(patch)) return c.json({ error: "Request body must be a JSON object" }, 400);
274
- const namespace = `__config__${extensionId}`;
275
- const config = await loadExtensionStore(namespace);
276
- Object.assign(config, patch);
277
- await saveExtensionStore(namespace, config);
276
+ const loader = service.getExtensionLoader();
277
+ if (!loader) return c.json({ error: "Extensions unavailable" }, 503);
278
+ const extension = loader.discoverExtensions().find((entry) => entry.id === extensionId);
279
+ if (!extension) return c.json({ error: "Extension not found" }, 404);
280
+ const current = service.currentConfig.extensions?.[extensionId];
281
+ const config = {
282
+ ...current && typeof current === "object" && !Array.isArray(current) ? current : {},
283
+ ...patch
284
+ };
285
+ const validation = validateExtensionConfig(extension.manifest.configSchema, config);
286
+ if (validation.valid === false) return c.json({ error: `Invalid extension config: ${validation.reason}` }, 400);
287
+ const extensions = {
288
+ ...service.currentConfig.extensions ?? {},
289
+ [extensionId]: config
290
+ };
291
+ const result = await service.updateConfig({ extensions });
292
+ if (!result.updated) return c.json({ error: result.error ?? "Failed to update config" }, 500);
278
293
  return c.json({ ok: true });
279
294
  });
280
- authenticated.get("/api/context", (c) => {
281
- const loader = service.getExtensionLoader();
282
- const snapshot = buildWhenContextSnapshot(service.currentConfig, loader);
283
- return c.json(snapshot);
295
+ authenticated.all("/api/extensions/:id/runtime/*", async (c) => {
296
+ const extensionId = c.req.param("id");
297
+ const prefix = `/api/extensions/${extensionId}/runtime`;
298
+ const path = c.req.path.slice(prefix.length) || "/";
299
+ const handler = service.getExtensionRegistry()?.getHttpRoute(extensionId, path);
300
+ if (!handler) return c.json({ error: "Extension route not found" }, 404);
301
+ const contentType = c.req.header("content-type") ?? "";
302
+ let body;
303
+ if (c.req.method !== "GET" && c.req.method !== "HEAD") body = contentType.includes("application/json") ? await c.req.json().catch(() => void 0) : await c.req.text().catch(() => void 0);
304
+ const response = await handler({
305
+ method: c.req.method,
306
+ url: c.req.url,
307
+ headers: c.req.header(),
308
+ body
309
+ });
310
+ const headers = new Headers(response.headers);
311
+ let responseBody = null;
312
+ if (response.body !== void 0) if (typeof response.body === "string" || response.body instanceof Uint8Array) responseBody = response.body;
313
+ else {
314
+ headers.set("Content-Type", headers.get("Content-Type") ?? "application/json; charset=utf-8");
315
+ responseBody = JSON.stringify(response.body);
316
+ }
317
+ return new Response(responseBody, {
318
+ status: response.status,
319
+ headers
320
+ });
284
321
  });
285
322
  authenticated.get("/api/marketplace", async (c) => {
286
323
  const q = c.req.query("q");
@@ -1,27 +1,32 @@
1
+ import { createLogger } from "../../../utils/logger/index.js";
2
+ import { init_logger } from "../../../utils/logger.js";
1
3
  import { hasGatewayScope } from "../../security/gateway-scopes.js";
2
4
  import { listConnectorLearningJobs } from "../../../storage/sqlite/connector-learning-repository.js";
5
+ import { getConnectorAccount, init_connector_account_repository, updateConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
3
6
  import { decideConnectorApproval, getConnectorApproval, listConnectorApprovals, listConnectorConnections } from "../../../storage/sqlite/connector-repository.js";
4
- import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
5
7
  import { getConnectorSyncPolicy, upsertConnectorSyncPolicy } from "../../../storage/sqlite/connector-sync-policy-repository.js";
6
8
  import "../../../storage/sqlite/index.js";
7
9
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
8
- import { resolveComposioApiKey } from "../../../connectors/composio-sessions.js";
10
+ import { activateComposioBackend, addComposioBackend, ensureComposioBackend, getComposioBackend, listComposioBackends, removeComposioBackend } from "../../../connectors/composio-backends.js";
11
+ import { getAuthorizationAttempt } from "../../../connectors/authorization-attempts.js";
12
+ import { ComposioSessionsAdapter, resolveComposioApiKey } from "../../../connectors/composio-sessions.js";
9
13
  import { getConnectorLearningPlan } from "../../../connectors/learning-recipes.js";
10
14
  import { listComposioConnectorCatalog } from "../../../connectors/composio-catalog.js";
11
- import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
12
15
  import { configureComposioApiKey, executeComposioTool, getComposioInstallationPolicy, getComposioToolkitAuthState, getComposioToolkitScope, inspectComposioConnectorHealth, listComposioConnections, listComposioTools, refreshComposioConnection, revokeComposioConnection, setComposioToolkitScope, updateComposioConnection, updateComposioInstallationPolicy } from "../../../connectors/composio.js";
13
16
  import { listConnectorProviders } from "../../../connectors/providers.js";
14
17
  import { getConnectorDefinition, listConnectorCatalog } from "../../../connectors/catalog.js";
18
+ import { createConnectorSetupSecretRequest, submitConnectorSetupSecret } from "../../../connectors/setup-secrets.js";
15
19
  import { recordConnectorHealthUsage } from "../../../connectors/usage.js";
16
20
  import { getConnectorInstance, getInstalledConnectorDefinition, listConnectorInstances } from "../../../connectors/instances.js";
17
21
  import { installConnector, installConnectorDefinition, uninstallConnector, updateConnectorConfig } from "../../../connectors/install.js";
18
- import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
22
+ import { resumeApprovedConnectorAction } from "../../../connectors/approval-resume.js";
19
23
  import { getMcpOAuthManager } from "../../../agent/mcp/oauth/mcp-oauth-manager.js";
20
24
  import { startConnectorAuthorization } from "../../../connectors/auth-provider-registry.js";
21
25
  import { composioLogoResponse } from "../../../connectors/composio-logo.js";
22
26
  import { inspectManagedComposioStatus } from "../../../connectors/composio-managed-client.js";
23
27
  import { appendComposioTriggerEvent, listComposioTriggerEvents } from "../../../connectors/composio-triggers.js";
24
28
  import { ingestLocalFolderSource } from "../../../connectors/connected-source-ingestion.js";
29
+ import { ConfigPersistenceError, persistConfigMutation } from "../../../config/config-mutation.js";
25
30
  import { previewConnectorDefinition, testConnectorInstance } from "../../../connectors/health.js";
26
31
  import { listUnderstandingSourceGrants, revokeUnderstandingSourceGrant } from "../../../user-context/sources/repository.js";
27
32
  import { setConnectorEnabled } from "../../../connectors/lifecycle.js";
@@ -29,7 +34,9 @@ import { projectComposioConnectionStatus } from "../../../connectors/runtime-sta
29
34
  import { getGatewayPrincipal } from "../../security/gateway-principal.js";
30
35
  import { markContextSourceAssertionsForReview } from "./context-sources.js";
31
36
  //#region src/gateway/hono/routes/connectors.ts
37
+ init_logger();
32
38
  init_agent_scope();
39
+ init_connector_account_repository();
33
40
  function errorMessage(error) {
34
41
  return error instanceof Error ? error.message : String(error);
35
42
  }
@@ -38,6 +45,7 @@ function defaultConnectorSyncInterval(connectorId) {
38
45
  return definition?.runtime.type === "composio" && definition.runtime.role === "toolkit" ? getConnectorLearningPlan(definition.runtime.toolkit)?.intervalMinutes ?? 30 : 30;
39
46
  }
40
47
  function registerConnectorRoutes(authenticated, deps) {
48
+ const log = createLogger("Connectors:Routes");
41
49
  const { service, strictRateLimitMiddleware } = deps;
42
50
  authenticated.get("/api/connectors/catalog", (c) => {
43
51
  return c.json({
@@ -128,12 +136,93 @@ function registerConnectorRoutes(authenticated, deps) {
128
136
  }, 400);
129
137
  }
130
138
  });
139
+ authenticated.patch("/api/connectors/composio/accounts/:id", strictRateLimitMiddleware, async (c) => {
140
+ const account = getConnectorAccount(c.req.param("id"));
141
+ if (!account || account.principalId !== "local-owner") return c.json({
142
+ ok: false,
143
+ error: "Account not found."
144
+ }, 404);
145
+ const body = await c.req.json().catch(() => null);
146
+ if (!body || typeof body !== "object" || Array.isArray(body) || body.label !== void 0 && (typeof body.label !== "string" || body.label.length > 120) || body.enabled !== void 0 && typeof body.enabled !== "boolean" || body.allowedAgentIds !== void 0 && body.allowedAgentIds !== null && (!Array.isArray(body.allowedAgentIds) || body.allowedAgentIds.some((id) => typeof id !== "string"))) return c.json({
147
+ ok: false,
148
+ error: "Invalid account settings."
149
+ }, 400);
150
+ return c.json({
151
+ ok: true,
152
+ payload: { account: updateConnectorAccount(account.id, body) }
153
+ });
154
+ });
131
155
  authenticated.get("/api/connectors/learning", (c) => {
132
156
  return c.json({
133
157
  ok: true,
134
158
  payload: { jobs: listConnectorLearningJobs({ limit: 100 }) }
135
159
  });
136
160
  });
161
+ authenticated.get("/api/connectors/composio/authorizations/:id", async (c) => {
162
+ let attempt = getAuthorizationAttempt(c.req.param("id"), "local-owner");
163
+ if (!attempt) return c.json({
164
+ ok: false,
165
+ error: "Authorization attempt not found."
166
+ }, 404);
167
+ try {
168
+ if (attempt.status === "awaiting_user") {
169
+ await new ComposioSessionsAdapter().syncConnections({
170
+ principalId: "local-owner",
171
+ backendId: attempt.backend_id ?? void 0
172
+ });
173
+ attempt = getAuthorizationAttempt(attempt.id, "local-owner");
174
+ }
175
+ const connection = listConnectorConnections({
176
+ principalId: "local-owner",
177
+ connectorId: attempt.connector_id
178
+ }).find((item) => item.id === attempt.connection_id);
179
+ return c.json({
180
+ ok: true,
181
+ payload: { attempt: {
182
+ id: attempt.id,
183
+ status: attempt.status,
184
+ authorizationUrl: attempt.authorization_url,
185
+ expiresAt: attempt.expires_at,
186
+ accountId: connection?.accountId
187
+ } }
188
+ });
189
+ } catch (err) {
190
+ log.warn({
191
+ err,
192
+ phase: "authorization_status",
193
+ backendId: attempt.backend_id,
194
+ connectorId: attempt.connector_id
195
+ }, "Could not synchronize authorization status");
196
+ const localConflict = /constraint failed/i.test(errorMessage(err));
197
+ return c.json({
198
+ ok: false,
199
+ error: localConflict ? "Local connection records could not be synchronized. Update and restart the gateway; do not delete or reauthorize your accounts." : "The connection service is temporarily unavailable. Retry checking this authorization."
200
+ }, localConflict ? 500 : 503);
201
+ }
202
+ });
203
+ authenticated.delete("/api/connectors/composio/accounts/:id", strictRateLimitMiddleware, async (c) => {
204
+ const account = getConnectorAccount(c.req.param("id"));
205
+ if (!account || account.principalId !== "local-owner") return c.json({
206
+ ok: false,
207
+ error: "Account not found."
208
+ }, 404);
209
+ updateConnectorAccount(account.id, { enabled: false });
210
+ try {
211
+ for (const connection of listConnectorConnections({
212
+ principalId: account.principalId,
213
+ connectorId: account.connectorId
214
+ })) if (connection.accountId === account.id && connection.status !== "revoked") await revokeComposioConnection(connection.id);
215
+ return c.json({
216
+ ok: true,
217
+ payload: { disconnected: true }
218
+ });
219
+ } catch (error) {
220
+ return c.json({
221
+ ok: false,
222
+ error: `Account paused; some authorizations could not be revoked. Retry disconnecting. ${errorMessage(error)}`
223
+ }, 400);
224
+ }
225
+ });
137
226
  authenticated.get("/api/connectors/composio/accounts/:id/sync-policy", (c) => {
138
227
  const account = getConnectorAccount(c.req.param("id"));
139
228
  if (!account || account.principalId !== "local-owner") return c.json({
@@ -142,7 +231,7 @@ function registerConnectorRoutes(authenticated, deps) {
142
231
  }, 404);
143
232
  const policy = getConnectorSyncPolicy(account.id) ?? {
144
233
  accountId: account.id,
145
- scanEnabled: true,
234
+ scanEnabled: false,
146
235
  proactiveEnabled: false,
147
236
  intervalMinutes: defaultConnectorSyncInterval(account.connectorId),
148
237
  allowedScenarioKeys: [],
@@ -256,10 +345,7 @@ function registerConnectorRoutes(authenticated, deps) {
256
345
  const body = await c.req.json().catch(() => ({}));
257
346
  const row = body && typeof body === "object" && !Array.isArray(body) ? body : {};
258
347
  try {
259
- const connection = updateComposioConnection(c.req.param("id"), {
260
- alias: typeof row.alias === "string" ? row.alias : void 0,
261
- isDefault: typeof row.isDefault === "boolean" ? row.isDefault : void 0
262
- });
348
+ const connection = updateComposioConnection(c.req.param("id"), { alias: typeof row.alias === "string" ? row.alias : void 0 });
263
349
  return c.json({
264
350
  ok: true,
265
351
  payload: { connection }
@@ -416,6 +502,7 @@ function registerConnectorRoutes(authenticated, deps) {
416
502
  payload: { result: await executeComposioTool({
417
503
  slug,
418
504
  arguments: args,
505
+ accountId: typeof body?.accountId === "string" ? body.accountId : void 0,
419
506
  config: service.currentConfig
420
507
  }) }
421
508
  });
@@ -563,11 +650,22 @@ function registerConnectorRoutes(authenticated, deps) {
563
650
  }, 400);
564
651
  const confirmationPolicy = rawConfirmationPolicy === "never" || rawConfirmationPolicy === "writes" || rawConfirmationPolicy === "always" ? rawConfirmationPolicy : void 0;
565
652
  const allowedAgentIds = Array.isArray(row.allowedAgentIds) ? [...new Set(row.allowedAgentIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0;
566
- const selectedConnectionIds = Array.isArray(row.selectedConnectionIds) ? [...new Set(row.selectedConnectionIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0;
653
+ if (row.selectedAccountIds !== void 0 && row.selectedAccountIds !== null && !Array.isArray(row.selectedAccountIds)) return c.json({
654
+ ok: false,
655
+ error: "selectedAccountIds must be null or an array of account IDs."
656
+ }, 400);
657
+ const selectedAccountIds = row.selectedAccountIds === null ? null : Array.isArray(row.selectedAccountIds) ? [...new Set(row.selectedAccountIds.filter((value) => typeof value === "string").map((value) => value.trim()).filter(Boolean))] : void 0;
658
+ if (Array.isArray(row.selectedAccountIds) && (selectedAccountIds?.length !== row.selectedAccountIds.length || selectedAccountIds.some((id) => {
659
+ const account = getConnectorAccount(id);
660
+ return !account || account.principalId !== "local-owner" || account.connectorId !== `composio-${c.req.param("toolkit")}`;
661
+ }))) return c.json({
662
+ ok: false,
663
+ error: "Select accounts belonging to this application."
664
+ }, 400);
567
665
  try {
568
666
  const policy = updateComposioInstallationPolicy(service.currentConfig, c.req.param("toolkit"), {
569
667
  allowedAgentIds,
570
- selectedConnectionIds,
668
+ selectedAccountIds,
571
669
  confirmationPolicy
572
670
  });
573
671
  return c.json({
@@ -606,9 +704,13 @@ function registerConnectorRoutes(authenticated, deps) {
606
704
  error: `Connector approval is ${approval?.status ?? "unavailable"}.`,
607
705
  payload: { approval }
608
706
  }, 409);
707
+ const resumed = await resumeApprovedConnectorAction(approval, service.connectionRecovery);
609
708
  return c.json({
610
709
  ok: true,
611
- payload: { approval }
710
+ payload: {
711
+ approval,
712
+ resumed
713
+ }
612
714
  });
613
715
  });
614
716
  authenticated.post("/api/connectors/:id/auth/start", strictRateLimitMiddleware, async (c) => {
@@ -621,7 +723,34 @@ function registerConnectorRoutes(authenticated, deps) {
621
723
  error: `Unknown connector: ${connectorOrInstanceId}`
622
724
  }, 404);
623
725
  try {
624
- const authorization = await startConnectorAuthorization(connector, config, instance?.instanceId);
726
+ const body = await c.req.json().catch(() => ({}));
727
+ let authorization;
728
+ if (typeof body?.accountId === "string") {
729
+ const account = getConnectorAccount(body.accountId);
730
+ if (!account || account.principalId !== "local-owner" || account.connectorId !== connector.id || !account.backendId || connector.runtime.type !== "composio") return c.json({
731
+ ok: false,
732
+ error: "Account connection service is unavailable. Refresh accounts first."
733
+ }, 400);
734
+ const current = listConnectorConnections({
735
+ principalId: "local-owner",
736
+ connectorId: connector.id
737
+ }).find((connection) => connection.id === account.currentConnectionId);
738
+ const result = await new ComposioSessionsAdapter().authorize({
739
+ principalId: "local-owner",
740
+ expectedAccountId: account.id,
741
+ toolkit: connector.runtime.toolkit,
742
+ backendId: account.backendId,
743
+ authConfigId: typeof current?.metadata.authConfigId === "string" ? current.metadata.authConfigId : void 0
744
+ });
745
+ authorization = {
746
+ connectorId: connector.id,
747
+ provider: "composio",
748
+ status: "pending",
749
+ authorizationUrl: result.connectUrl,
750
+ connectionId: result.connectionId,
751
+ attemptId: result.attemptId
752
+ };
753
+ } else authorization = await startConnectorAuthorization(connector, config, instance?.instanceId);
625
754
  return c.json({
626
755
  ok: true,
627
756
  payload: { authorization }
@@ -634,20 +763,82 @@ function registerConnectorRoutes(authenticated, deps) {
634
763
  }
635
764
  });
636
765
  authenticated.get("/api/connectors/composio/setup-status", async (c) => {
637
- const status = Boolean(await resolveComposioApiKey()) ? {
638
- configured: true,
766
+ const backend = await ensureComposioBackend();
767
+ const status = backend.mode === "byok" ? {
768
+ configured: Boolean(await resolveComposioApiKey()),
639
769
  mode: "byok"
640
770
  } : await inspectManagedComposioStatus();
641
771
  return c.json({
642
772
  ok: true,
643
- payload: status
773
+ payload: {
774
+ ...status,
775
+ backendId: backend.id,
776
+ backends: listComposioBackends().map(({ id, label, mode, credential_source, verified_at }) => ({
777
+ id,
778
+ label,
779
+ mode,
780
+ credentialSource: credential_source,
781
+ verifiedAt: verified_at
782
+ }))
783
+ }
644
784
  });
645
785
  });
786
+ authenticated.delete("/api/connectors/composio/backends/:id", strictRateLimitMiddleware, async (c) => {
787
+ try {
788
+ await removeComposioBackend(c.req.param("id"));
789
+ return c.json({
790
+ ok: true,
791
+ payload: { removed: true }
792
+ });
793
+ } catch (error) {
794
+ return c.json({
795
+ ok: false,
796
+ error: errorMessage(error)
797
+ }, 400);
798
+ }
799
+ });
646
800
  authenticated.post("/api/connectors/composio/setup", strictRateLimitMiddleware, async (c) => {
647
801
  const body = await c.req.json().catch(() => ({}));
648
802
  const apiKey = body && typeof body === "object" && !Array.isArray(body) ? String(body.apiKey ?? "") : "";
649
803
  try {
650
- await configureComposioApiKey(apiKey);
804
+ if (!body || typeof body !== "object" || Array.isArray(body)) return c.json({
805
+ ok: false,
806
+ error: "Invalid setup request."
807
+ }, 400);
808
+ if (body.mode === "managed") {
809
+ const status = await inspectManagedComposioStatus();
810
+ if (!status.configured) return c.json({
811
+ ok: false,
812
+ error: status.reason ?? "Cloud unavailable."
813
+ }, 400);
814
+ activateComposioBackend((listComposioBackends().find((item) => item.mode === "managed") ?? addComposioBackend({
815
+ mode: "managed",
816
+ label: "XOPC Cloud"
817
+ })).id);
818
+ return c.json({
819
+ ok: true,
820
+ payload: {
821
+ configured: true,
822
+ mode: "managed"
823
+ }
824
+ });
825
+ }
826
+ if (typeof body.backendId === "string") {
827
+ if (!getComposioBackend(body.backendId)) return c.json({
828
+ ok: false,
829
+ error: "Unknown connection service."
830
+ }, 404);
831
+ await new ComposioSessionsAdapter().listToolkitCatalog({
832
+ principalId: "local-owner",
833
+ backendId: body.backendId
834
+ });
835
+ activateComposioBackend(body.backendId);
836
+ return c.json({
837
+ ok: true,
838
+ payload: { configured: true }
839
+ });
840
+ }
841
+ await configureComposioApiKey(apiKey, void 0, typeof body.replaceBackendId === "string" ? body.replaceBackendId : void 0);
651
842
  return c.json({
652
843
  ok: true,
653
844
  payload: {
@@ -1,6 +1,6 @@
1
1
  import { getSqliteDatabase, init_transaction } from "../../../storage/sqlite/transaction.js";
2
- import { countKnowledgeSourceItems, deleteKnowledgeSourceItems } from "../../../storage/sqlite/knowledge-repository.js";
3
2
  import { getConnectorAccount } from "../../../storage/sqlite/connector-account-repository.js";
3
+ import { countKnowledgeSourceItems, deleteKnowledgeSourceItems } from "../../../storage/sqlite/knowledge-repository.js";
4
4
  import "../../../storage/sqlite/index.js";
5
5
  import { init_agent_scope, resolveDefaultAgentId } from "../../../agent/agent-scope.js";
6
6
  import { setAssertionStatus } from "../../../user-model/repository.js";