@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
@@ -0,0 +1,48 @@
1
+ import { init_config, normalizeKnowledgeMemoryConfigInput } from "../user-context/config.js";
2
+ import { init_lock, isGatewayConfigLockedByAnotherProcessSync } from "../gateway/lock.js";
3
+ import { existsSync, readFileSync } from "node:fs";
4
+ //#region src/migrations/knowledge-memory-read-policy-config.ts
5
+ init_lock();
6
+ init_config();
7
+ const id = "knowledge-memory-read-policy-config";
8
+ function convertedConfig(ctx) {
9
+ if (!existsSync(ctx.configPath)) return null;
10
+ const config = JSON.parse(readFileSync(ctx.configPath, "utf8"));
11
+ const userContext = config.userContext;
12
+ if (!userContext || typeof userContext !== "object" || Array.isArray(userContext)) return null;
13
+ const knowledgeMemory = userContext.knowledgeMemory;
14
+ if (!knowledgeMemory || typeof knowledgeMemory !== "object" || Array.isArray(knowledgeMemory)) return null;
15
+ const memory = knowledgeMemory;
16
+ if (!Array.isArray(memory.sources)) return null;
17
+ userContext.knowledgeMemory = normalizeKnowledgeMemoryConfigInput(memory);
18
+ return config;
19
+ }
20
+ function item(status) {
21
+ return {
22
+ id,
23
+ title: "Knowledge memory read policy configuration",
24
+ kind: "config",
25
+ safety: "auto",
26
+ status,
27
+ message: "Split knowledge memory visibility scopes from content sources."
28
+ };
29
+ }
30
+ const knowledgeMemoryReadPolicyConfigMigration = {
31
+ id,
32
+ kind: "config",
33
+ safety: "auto",
34
+ detect: (ctx) => convertedConfig(ctx) ? item("planned") : null,
35
+ apply: (ctx) => {
36
+ if (isGatewayConfigLockedByAnotherProcessSync(ctx.configPath)) return {
37
+ ...item("skipped"),
38
+ message: "Deferred knowledge memory config migration until the running gateway restarts."
39
+ };
40
+ const config = convertedConfig(ctx);
41
+ return config ? {
42
+ ...item("applied"),
43
+ details: { config }
44
+ } : item("not_needed");
45
+ }
46
+ };
47
+ //#endregion
48
+ export { knowledgeMemoryReadPolicyConfigMigration };
@@ -3,6 +3,7 @@ import { init_logger } from "../utils/logger.js";
3
3
  import { ConfigSchema, init_schema } from "../config/schema.js";
4
4
  import { listRegisteredMigrations } from "./registry.js";
5
5
  import { conversationRoutingConfigMigration } from "./conversation-routing-config.js";
6
+ import { knowledgeMemoryReadPolicyConfigMigration } from "./knowledge-memory-read-policy-config.js";
6
7
  import { dirname, join } from "node:path";
7
8
  import { existsSync, mkdirSync, readFileSync, renameSync, writeFileSync } from "node:fs";
8
9
  //#region src/migrations/runner.ts
@@ -11,7 +12,7 @@ init_logger();
11
12
  const log = createLogger("Migrations");
12
13
  const MIGRATION_LEDGER_FILENAME = "migrations.json";
13
14
  const CONFIG_BACKUP_COUNT = 10;
14
- const CORE_MIGRATIONS = [conversationRoutingConfigMigration];
15
+ const CORE_MIGRATIONS = [conversationRoutingConfigMigration, knowledgeMemoryReadPolicyConfigMigration];
15
16
  function listAllMigrations() {
16
17
  return [...CORE_MIGRATIONS, ...listRegisteredMigrations().map((entry) => entry.migration)];
17
18
  }
@@ -1,6 +1,6 @@
1
1
  import { getSqliteDatabase, init_transaction, runSqliteWriteTransaction } from "../storage/sqlite/transaction.js";
2
+ import { getConnectorConnection, init_connector_repository } from "../storage/sqlite/connector-repository.js";
2
3
  import { listKnowledgeSourceItems } from "../storage/sqlite/knowledge-repository.js";
3
- import { getConnectorConnection } from "../storage/sqlite/connector-repository.js";
4
4
  import { sourceFreshness } from "./source-freshness.js";
5
5
  import { emailFields, readMailThread } from "./mail-thread.js";
6
6
  import { authorizedConnectedSource } from "./execution/authorization.js";
@@ -12,6 +12,7 @@ import { ProactiveEventService } from "./service.js";
12
12
  import { randomUUID } from "node:crypto";
13
13
  import { z } from "zod";
14
14
  //#region src/proactive/follow-ups.ts
15
+ init_connector_repository();
15
16
  init_transaction();
16
17
  const COMMUNICATION_SCENARIO = "communication_follow_up";
17
18
  const CreateSchema = z.object({
@@ -0,0 +1,10 @@
1
+ export interface BoundedOutput {
2
+ readonly text: string;
3
+ readonly totalBytes: number;
4
+ readonly truncated: boolean;
5
+ }
6
+ /** Keeps the newest bytes so failures retain their most useful tail output. */
7
+ export declare function createBoundedOutput(maxBytes: number): {
8
+ append(chunk: Buffer | string): void;
9
+ snapshot(): BoundedOutput;
10
+ };
@@ -0,0 +1,41 @@
1
+ //#region src/process/bounded-output.ts
2
+ /** Keeps the newest bytes so failures retain their most useful tail output. */
3
+ function createBoundedOutput(maxBytes) {
4
+ const limit = Math.max(0, Math.floor(maxBytes));
5
+ let chunks = [];
6
+ let capturedBytes = 0;
7
+ let totalBytes = 0;
8
+ return {
9
+ append(chunk) {
10
+ const value = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk);
11
+ totalBytes += value.byteLength;
12
+ if (limit === 0) {
13
+ chunks = [];
14
+ capturedBytes = 0;
15
+ return;
16
+ }
17
+ chunks.push(value);
18
+ capturedBytes += value.byteLength;
19
+ while (capturedBytes > limit && chunks.length > 0) {
20
+ const excess = capturedBytes - limit;
21
+ const first = chunks[0];
22
+ if (first.byteLength <= excess) {
23
+ chunks.shift();
24
+ capturedBytes -= first.byteLength;
25
+ } else {
26
+ chunks[0] = first.subarray(excess);
27
+ capturedBytes -= excess;
28
+ }
29
+ }
30
+ },
31
+ snapshot() {
32
+ return {
33
+ text: Buffer.concat(chunks, capturedBytes).toString("utf8"),
34
+ totalBytes,
35
+ truncated: totalBytes > capturedBytes
36
+ };
37
+ }
38
+ };
39
+ }
40
+ //#endregion
41
+ export { createBoundedOutput };
@@ -1,18 +1,7 @@
1
- /**
2
- * Best-effort process-tree termination with graceful shutdown.
3
- * - Windows: use taskkill /T to include descendants. Sends SIGTERM-equivalent
4
- * first (without /F), then force-kills if process survives.
5
- * - Unix: send SIGTERM to process group first, wait grace period, then SIGKILL.
6
- *
7
- * This gives child processes a chance to clean up (close connections, remove
8
- * temp files, terminate their own children) before being hard-killed.
9
- *
10
- * When the child was spawned with `detached: false` (e.g. service-managed
11
- * runtime under launchd/systemd), pass `detached: false` to skip the Unix
12
- * `process.kill(-pid, ...)` group-kill — it would otherwise target the
13
- * gateway's own process group and SIGTERM the gateway itself. (#71662)
14
- */
15
- export declare function killProcessTree(pid: number, opts?: {
16
- graceMs?: number;
1
+ import { type ChildProcess } from 'node:child_process';
2
+ /** Terminates a child and optionally its process tree, escalating after a grace period. */
3
+ export declare function terminateProcess(child: ChildProcess, options?: {
4
+ tree?: boolean;
17
5
  detached?: boolean;
18
- }): void;
6
+ graceMs?: number;
7
+ }): Promise<boolean>;
@@ -1,35 +1,7 @@
1
1
  import { spawn } from "node:child_process";
2
2
  //#region src/process/kill-tree.ts
3
3
  const DEFAULT_GRACE_MS = 3e3;
4
- const MAX_GRACE_MS = 6e4;
5
- /**
6
- * Best-effort process-tree termination with graceful shutdown.
7
- * - Windows: use taskkill /T to include descendants. Sends SIGTERM-equivalent
8
- * first (without /F), then force-kills if process survives.
9
- * - Unix: send SIGTERM to process group first, wait grace period, then SIGKILL.
10
- *
11
- * This gives child processes a chance to clean up (close connections, remove
12
- * temp files, terminate their own children) before being hard-killed.
13
- *
14
- * When the child was spawned with `detached: false` (e.g. service-managed
15
- * runtime under launchd/systemd), pass `detached: false` to skip the Unix
16
- * `process.kill(-pid, ...)` group-kill — it would otherwise target the
17
- * gateway's own process group and SIGTERM the gateway itself. (#71662)
18
- */
19
- function killProcessTree(pid, opts) {
20
- if (!Number.isFinite(pid) || pid <= 0) return;
21
- const graceMs = normalizeGraceMs(opts?.graceMs);
22
- if (process.platform === "win32") {
23
- killProcessTreeWindows(pid, graceMs);
24
- return;
25
- }
26
- killProcessTreeUnix(pid, graceMs, opts?.detached !== false);
27
- }
28
- function normalizeGraceMs(value) {
29
- if (typeof value !== "number" || !Number.isFinite(value)) return DEFAULT_GRACE_MS;
30
- return Math.max(0, Math.min(MAX_GRACE_MS, Math.floor(value)));
31
- }
32
- function isProcessAlive(pid) {
4
+ function processAlive(pid) {
33
5
  try {
34
6
  process.kill(pid, 0);
35
7
  return true;
@@ -37,56 +9,52 @@ function isProcessAlive(pid) {
37
9
  return false;
38
10
  }
39
11
  }
40
- function killProcessTreeUnix(pid, graceMs, useGroupKill) {
41
- if (useGroupKill) try {
42
- process.kill(-pid, "SIGTERM");
43
- } catch {
44
- try {
45
- process.kill(pid, "SIGTERM");
46
- } catch {
47
- return;
48
- }
49
- }
50
- else try {
51
- process.kill(pid, "SIGTERM");
52
- } catch {
53
- return;
54
- }
55
- setTimeout(() => {
56
- if (useGroupKill && isProcessAlive(-pid)) try {
57
- process.kill(-pid, "SIGKILL");
58
- return;
59
- } catch {}
60
- if (!isProcessAlive(pid)) return;
61
- try {
62
- process.kill(pid, "SIGKILL");
63
- } catch {}
64
- }, graceMs).unref();
12
+ function delay(ms) {
13
+ return new Promise((resolve) => {
14
+ setTimeout(resolve, ms).unref();
15
+ });
65
16
  }
66
- function runTaskkill(args) {
67
- try {
68
- spawn("taskkill", args, {
17
+ function taskkill(pid, force) {
18
+ return new Promise((resolve) => {
19
+ const child = spawn("taskkill", [
20
+ ...force ? ["/F"] : [],
21
+ "/T",
22
+ "/PID",
23
+ String(pid)
24
+ ], {
69
25
  stdio: "ignore",
70
- detached: true,
71
26
  windowsHide: true
72
27
  });
73
- } catch {}
28
+ child.once("error", () => resolve());
29
+ child.once("close", () => resolve());
30
+ });
74
31
  }
75
- function killProcessTreeWindows(pid, graceMs) {
76
- runTaskkill([
77
- "/T",
78
- "/PID",
79
- String(pid)
80
- ]);
81
- setTimeout(() => {
82
- if (!isProcessAlive(pid)) return;
83
- runTaskkill([
84
- "/F",
85
- "/T",
86
- "/PID",
87
- String(pid)
88
- ]);
89
- }, graceMs).unref();
32
+ /** Terminates a child and optionally its process tree, escalating after a grace period. */
33
+ async function terminateProcess(child, options = {}) {
34
+ const pid = child.pid;
35
+ if (!pid || child.exitCode !== null || child.signalCode !== null) return true;
36
+ const graceMs = Math.max(0, Math.min(6e4, Math.floor(options.graceMs ?? DEFAULT_GRACE_MS)));
37
+ if (process.platform === "win32" && options.tree) {
38
+ await taskkill(pid, false);
39
+ if (graceMs > 0 && processAlive(pid)) await delay(graceMs);
40
+ if (processAlive(pid)) await taskkill(pid, true);
41
+ return !processAlive(pid);
42
+ }
43
+ const target = options.tree && options.detached ? -pid : pid;
44
+ try {
45
+ process.kill(target, "SIGTERM");
46
+ } catch {
47
+ return true;
48
+ }
49
+ if (graceMs > 0 && processAlive(pid)) await delay(graceMs);
50
+ if (processAlive(pid)) try {
51
+ process.kill(target, "SIGKILL");
52
+ } catch {
53
+ try {
54
+ child.kill("SIGKILL");
55
+ } catch {}
56
+ }
57
+ return !processAlive(pid);
90
58
  }
91
59
  //#endregion
92
- export { killProcessTree };
60
+ export { terminateProcess };
@@ -0,0 +1,39 @@
1
+ import type { ChildProcess, SpawnOptions } from 'node:child_process';
2
+ export interface ProcessSpec {
3
+ program: string;
4
+ args?: readonly string[];
5
+ cwd?: string;
6
+ env?: NodeJS.ProcessEnv;
7
+ input?: string | Buffer;
8
+ keepStdinOpen?: boolean;
9
+ timeoutMs?: number | null;
10
+ maxOutputBytes?: number;
11
+ signal?: AbortSignal;
12
+ detached?: boolean;
13
+ windowsHide?: boolean;
14
+ shell?: SpawnOptions['shell'];
15
+ terminationPolicy?: 'root' | 'tree';
16
+ onOutput?: (stream: 'stdout' | 'stderr', chunk: Buffer) => void;
17
+ }
18
+ export interface ProcessResult {
19
+ exitCode: number | null;
20
+ spawnErrorCode?: string;
21
+ signal: NodeJS.Signals | null;
22
+ stdout: string;
23
+ stderr: string;
24
+ timedOut: boolean;
25
+ aborted: boolean;
26
+ outputTruncated: boolean;
27
+ terminationVerified: boolean;
28
+ }
29
+ export interface ProcessHandle {
30
+ readonly child: ChildProcess;
31
+ readonly completion: Promise<ProcessResult>;
32
+ terminate(reason?: 'cancelled' | 'timed_out'): void;
33
+ }
34
+ export declare class ProcessExitError extends Error {
35
+ readonly spec: ProcessSpec;
36
+ readonly result: ProcessResult;
37
+ readonly code: number | string | null;
38
+ constructor(spec: ProcessSpec, result: ProcessResult);
39
+ }
@@ -0,0 +1,13 @@
1
+ //#region src/process/process-spec.ts
2
+ var ProcessExitError = class extends Error {
3
+ code;
4
+ constructor(spec, result) {
5
+ super(result.stderr.trim() || `Process exited with code ${String(result.exitCode)}`);
6
+ this.spec = spec;
7
+ this.result = result;
8
+ this.name = "ProcessExitError";
9
+ this.code = result.spawnErrorCode ?? result.exitCode;
10
+ }
11
+ };
12
+ //#endregion
13
+ export { ProcessExitError };
@@ -0,0 +1,4 @@
1
+ import { type ProcessHandle, type ProcessResult, type ProcessSpec } from './process-spec.js';
2
+ export declare function spawnProcess(spec: ProcessSpec): ProcessHandle;
3
+ export declare function runProcess(spec: ProcessSpec): Promise<ProcessResult>;
4
+ export declare function runProcessChecked(spec: ProcessSpec): Promise<ProcessResult>;
@@ -0,0 +1,97 @@
1
+ import { createBoundedOutput } from "./bounded-output.js";
2
+ import { terminateProcess } from "./kill-tree.js";
3
+ import { ProcessExitError } from "./process-spec.js";
4
+ import { spawn } from "node:child_process";
5
+ //#region src/process/run-process.ts
6
+ const DEFAULT_MAX_OUTPUT_BYTES = 1024 * 1024;
7
+ function spawnProcess(spec) {
8
+ spec.signal?.throwIfAborted();
9
+ const detached = spec.detached ?? (spec.terminationPolicy === "tree" && process.platform !== "win32");
10
+ const child = spawn(spec.program, [...spec.args ?? []], {
11
+ cwd: spec.cwd,
12
+ env: spec.env ?? process.env,
13
+ stdio: [
14
+ "pipe",
15
+ "pipe",
16
+ "pipe"
17
+ ],
18
+ detached,
19
+ windowsHide: spec.windowsHide ?? true,
20
+ shell: spec.shell ?? false
21
+ });
22
+ const stdout = createBoundedOutput(spec.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES);
23
+ const stderr = createBoundedOutput(spec.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES);
24
+ let timedOut = false;
25
+ let aborted = false;
26
+ let terminationRequested = false;
27
+ let settled = false;
28
+ let timer;
29
+ const terminate = (reason = "cancelled") => {
30
+ if (settled || terminationRequested) return;
31
+ terminationRequested = true;
32
+ timedOut = reason === "timed_out";
33
+ aborted = reason === "cancelled";
34
+ terminateProcess(child, {
35
+ tree: spec.terminationPolicy === "tree",
36
+ detached
37
+ });
38
+ };
39
+ const abort = () => terminate("cancelled");
40
+ spec.signal?.addEventListener("abort", abort, { once: true });
41
+ if (spec.signal?.aborted) abort();
42
+ if (spec.timeoutMs != null && spec.timeoutMs > 0) {
43
+ timer = setTimeout(() => terminate("timed_out"), spec.timeoutMs);
44
+ timer.unref();
45
+ }
46
+ child.stdout?.on("data", (chunk) => {
47
+ stdout.append(chunk);
48
+ spec.onOutput?.("stdout", chunk);
49
+ });
50
+ child.stderr?.on("data", (chunk) => {
51
+ stderr.append(chunk);
52
+ spec.onOutput?.("stderr", chunk);
53
+ });
54
+ child.stdin?.on("error", (error) => stderr.append(error.message));
55
+ if (spec.input !== void 0) child.stdin?.end(spec.input);
56
+ else if (!spec.keepStdinOpen) child.stdin?.end();
57
+ return {
58
+ child,
59
+ completion: new Promise((resolve) => {
60
+ let spawnError;
61
+ child.once("error", (error) => {
62
+ spawnError = error;
63
+ });
64
+ child.once("close", (exitCode, signal) => {
65
+ if (settled) return;
66
+ settled = true;
67
+ if (timer) clearTimeout(timer);
68
+ spec.signal?.removeEventListener("abort", abort);
69
+ if (spawnError && stderr.snapshot().totalBytes === 0) stderr.append(spawnError.message);
70
+ const out = stdout.snapshot();
71
+ const err = stderr.snapshot();
72
+ resolve({
73
+ exitCode: spawnError ? null : exitCode,
74
+ ...spawnError && spawnError.code ? { spawnErrorCode: spawnError.code } : {},
75
+ signal,
76
+ stdout: out.text,
77
+ stderr: err.text,
78
+ timedOut,
79
+ aborted,
80
+ outputTruncated: out.truncated || err.truncated,
81
+ terminationVerified: !terminationRequested || child.exitCode !== null || child.signalCode !== null
82
+ });
83
+ });
84
+ }),
85
+ terminate
86
+ };
87
+ }
88
+ function runProcess(spec) {
89
+ return spawnProcess(spec).completion;
90
+ }
91
+ async function runProcessChecked(spec) {
92
+ const result = await runProcess(spec);
93
+ if (result.exitCode !== 0) throw new ProcessExitError(spec, result);
94
+ return result;
95
+ }
96
+ //#endregion
97
+ export { runProcess, runProcessChecked, spawnProcess };
@@ -9,7 +9,7 @@ export declare class ProviderPluginRegistry implements ProviderRegistry {
9
9
  /**
10
10
  * Register a new provider
11
11
  */
12
- register(provider: ProviderPlugin): void;
12
+ register(provider: ProviderPlugin): () => void;
13
13
  /**
14
14
  * Get a provider by ID
15
15
  */
@@ -23,8 +23,14 @@ var init_plugin_registry = __esmMin((() => {
23
23
  if (!provider.id) throw new Error("Provider must have an id");
24
24
  if (!provider.name) throw new Error("Provider must have a name");
25
25
  if (!provider.createStream || typeof provider.createStream !== "function") throw new Error("Provider must implement createStream method");
26
+ const previous = this.providers.get(provider.id);
26
27
  this.providers.set(provider.id, provider);
27
28
  log.info(`Registered provider: ${provider.name} (${provider.id})`);
29
+ return () => {
30
+ if (this.providers.get(provider.id) !== provider) return;
31
+ if (previous) this.providers.set(provider.id, previous);
32
+ else this.providers.delete(provider.id);
33
+ };
28
34
  }
29
35
  /**
30
36
  * Get a provider by ID
@@ -2,7 +2,7 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { hasGatewayScope } from "../gateway/security/gateway-scopes.js";
4
4
  import { EndpointToolPolicyError } from "../endpoint-tools/policy.js";
5
- import { REALTIME_HEARTBEAT_INTERVAL_MS, REALTIME_HEARTBEAT_TIMEOUT_MS, REALTIME_HELLO_TIMEOUT_MS, REALTIME_MAX_CLIENT_FRAME_BYTES, parseClientRealtimeJsonFrame, parseClientRealtimeMessage } from "../../packages/realtime-protocol/src/index.js";
5
+ import { REALTIME_CAPABILITIES, REALTIME_HEARTBEAT_INTERVAL_MS, REALTIME_HEARTBEAT_TIMEOUT_MS, REALTIME_HELLO_TIMEOUT_MS, REALTIME_MAX_CLIENT_FRAME_BYTES, parseClientRealtimeJsonFrame, parseClientRealtimeMessage } from "../../packages/realtime-protocol/src/index.js";
6
6
  import { createPreauthConnectionBudget } from "../gateway/security/preauth-connection-budget.js";
7
7
  import { RealtimeBroker } from "./broker.js";
8
8
  import { RealtimeTicketStore } from "./tickets.js";
@@ -265,10 +265,12 @@ var RealtimeRuntime = class {
265
265
  }
266
266
  clearTimeout(helloTimer);
267
267
  releaseBudget();
268
+ const negotiatedCapabilities = message.payload.capabilities ? [...new Set(message.payload.capabilities.filter((capability) => REALTIME_CAPABILITIES.includes(capability)))] : void 0;
268
269
  writer.enqueue(serverMessage("realtime.ready", {
269
270
  connectionId,
270
271
  heartbeatIntervalMs: REALTIME_HEARTBEAT_INTERVAL_MS,
271
272
  heartbeatTimeoutMs: REALTIME_HEARTBEAT_TIMEOUT_MS,
273
+ ...message.payload.capabilities ? { negotiatedCapabilities } : {},
272
274
  ...endpointReady ? { endpoint: endpointReady } : {}
273
275
  }), "critical");
274
276
  subscribe(message.payload.subscriptions);
@@ -502,7 +502,7 @@ var SessionStore = class {
502
502
  handover: result.handover,
503
503
  audit: result.audit,
504
504
  sourceEntries: expectedSnapshot.entries,
505
- writePolicy: access.knowledge && this.options.config.userContext.knowledgeMemory.sources.includes("session") ? this.options.config.userContext.knowledgeMemory.writePolicy : "deny"
505
+ writePolicy: access.knowledge && access.knowledgePolicy.scopes.includes("session") && access.knowledgePolicy.contentSources.includes("memory") ? this.options.config.userContext.knowledgeMemory.writePolicy : "deny"
506
506
  });
507
507
  log.info({
508
508
  conversationId: key,
@@ -21,6 +21,9 @@ export declare function requireSessionConnection(input: {
21
21
  export declare function queueConnectionResolution(wait: ConnectionWait, resolution: 'continued' | 'skipped'): ConnectionWait;
22
22
  export declare function consumeConnectionResume(input: SessionInput): boolean;
23
23
  export declare function connectionBindings(conversationId: string): ConnectionNeed[];
24
+ /** Changes to the objective or transcript invalidate an outstanding action approval. */
25
+ export declare function connectorObjectiveScope(conversationId: string): string | undefined;
26
+ export declare function bindObjectiveAccount(conversationId: string, connectorId: string, accountId: string): void;
24
27
  export declare function connectionBinding(conversationId: string, connectorId: string): string | undefined;
25
28
  /** New input wins over an outstanding auto-resume intent, including an already queued resume. */
26
29
  export declare function invalidateConnectionResumeIntent(conversationId: string): void;
@@ -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;