@xopcai/xopc 0.0.320 → 0.0.323

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 (323) hide show
  1. package/dist/browser-ext/dist/assets/{auth-DKo-NMUY.js → auth-DocRzRlS.js} +95 -21
  2. package/dist/browser-ext/dist/background.js +1 -1
  3. package/dist/browser-ext/dist/sidepanel.html +1 -1
  4. package/dist/browser-ext/dist/sidepanel.js +18 -2
  5. package/dist/browser-ext/manifest.json +1 -1
  6. package/dist/extensions/telegram/xopc.extension.json +1 -1
  7. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-BXLU0HJa.js → agent-avatar-dicebear-DFzmThVi.js} +1 -1
  8. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CAFHadiy.js +1 -0
  9. package/dist/gateway/static/root/assets/agent-plugin-dialog-DYFYiuig.js +1 -0
  10. package/dist/gateway/static/root/assets/{agents-hrbGiOHn.js → agents-BqIlB5Co.js} +1 -1
  11. package/dist/gateway/static/root/assets/{app-link-nL8iPwEr.js → app-link-C6gA5Nck.js} +1 -1
  12. package/dist/gateway/static/root/assets/{app-management-settings-panel-C0jEvonH.js → app-management-settings-panel-BgvMRGWe.js} +1 -1
  13. package/dist/gateway/static/root/assets/{appearance-settings-ByVRv2Oe.js → appearance-settings-CliHU03A.js} +1 -1
  14. package/dist/gateway/static/root/assets/apps-page-Drt3Foi9.js +1 -0
  15. package/dist/gateway/static/root/assets/{archive-plugin-CMITc1PQ.js → archive-plugin-DnuPpm0u.js} +1 -1
  16. package/dist/gateway/static/root/assets/{attachment-load-B5Z1PKHm.js → attachment-load-BiwaK0ie.js} +1 -1
  17. package/dist/gateway/static/root/assets/{automations-page-BOcXqVar.js → automations-page-CJSISGQH.js} +1 -1
  18. package/dist/gateway/static/root/assets/automations-workspace-B-Eduqwz.js +7 -0
  19. package/dist/gateway/static/root/assets/{binary-plugins-BkRb9adx.js → binary-plugins-KDjduQZO.js} +1 -1
  20. package/dist/gateway/static/root/assets/{block-editor-DsmDlkC2.js → block-editor-bclvgove.js} +3 -3
  21. package/dist/gateway/static/root/assets/{browser-automation-inputs-BgBH3eFk.js → browser-automation-inputs-CfQ2T9t6.js} +1 -1
  22. package/dist/gateway/static/root/assets/{browser-automations-page-e3KpurLo.js → browser-automations-page-Cxq38Nnp.js} +2 -2
  23. package/dist/gateway/static/root/assets/browser-settings-page-Dwgir6mu.js +3 -0
  24. package/dist/gateway/static/root/assets/capabilities-settings-panel-H5L5vynP.js +8 -0
  25. package/dist/gateway/static/root/assets/capabilities-uFKh3Hd0.js +1 -0
  26. package/dist/gateway/static/root/assets/channels-settings-RFBRYe5S.js +1 -0
  27. package/dist/gateway/static/root/assets/{chat-terminal-dock-DUdkU1C5.js → chat-terminal-dock-DKQC62nQ.js} +2 -2
  28. package/dist/gateway/static/root/assets/{computer-settings-page-C6WR9Syy.js → computer-settings-page-D1whpIqL.js} +1 -1
  29. package/dist/gateway/static/root/assets/{connector-service-page-SVKcySx0.js → connector-service-page-BAuYTgf5.js} +1 -1
  30. package/dist/gateway/static/root/assets/connectors-page-Px-v3Q6Q.js +2 -0
  31. package/dist/gateway/static/root/assets/{date-picker-DBD5yedi.js → date-picker-CfCo3lqh.js} +1 -1
  32. package/dist/gateway/static/root/assets/{dependency-picker-HE41Co5W.js → dependency-picker-DOuVO2M1.js} +1 -1
  33. package/dist/gateway/static/root/assets/{desktop-pet-DH9EU9O3.js → desktop-pet-D9tu6Bhu.js} +1 -1
  34. package/dist/gateway/static/root/assets/{desktop-pet-settings-Br6Z1Vau.js → desktop-pet-settings-CQPXub2f.js} +1 -1
  35. package/dist/gateway/static/root/assets/device-pairing-wizard-DxkOYSut.js +1 -0
  36. package/dist/gateway/static/root/assets/{extension-debug-page-CFjVNb1m.js → extension-debug-page-CtWClPz-.js} +1 -1
  37. package/dist/gateway/static/root/assets/{extension-page-BQ3ldBhh.js → extension-page-BHh9HLCz.js} +1 -1
  38. package/dist/gateway/static/root/assets/{extension-settings-page-CaXnWbRI.js → extension-settings-page-BdT3v5Uh.js} +1 -1
  39. package/dist/gateway/static/root/assets/{gateway-config-swr-DgFmBSH9.js → gateway-config-swr-1eqyz9vZ.js} +1 -1
  40. package/dist/gateway/static/root/assets/gateway-settings-CZas_Ekx.js +1 -0
  41. package/dist/gateway/static/root/assets/{gateway-startup-retry-C7h3xef0.js → gateway-startup-retry-C4rsW6vJ.js} +1 -1
  42. package/dist/gateway/static/root/assets/home-page-w3_aWeNt.js +1 -0
  43. package/dist/gateway/static/root/assets/{image-generation-api-DJ1xaz2p.js → image-generation-api-B5DXMylk.js} +1 -1
  44. package/dist/gateway/static/root/assets/{imports-page-CaB54QIp.js → imports-page-B1JH0G5j.js} +1 -1
  45. package/dist/gateway/static/root/assets/index--3c0awkr.js +121 -0
  46. package/dist/gateway/static/root/assets/index-CNc4N4TX.css +1 -0
  47. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-DnvHvKQJ.js → keyboard-shortcuts-settings-DGrLJ8Yh.js} +1 -1
  48. package/dist/gateway/static/root/assets/local-app-workbench-page-BYKrJpFF.js +1 -0
  49. package/dist/gateway/static/root/assets/local-apps-Bpja8nC6.js +1 -0
  50. package/dist/gateway/static/root/assets/local-apps-page-DqjStqbL.js +1 -0
  51. package/dist/gateway/static/root/assets/{locale-store-C4RjTd0C.js → locale-store-BIkcRr3t.js} +1 -1
  52. package/dist/gateway/static/root/assets/{logs-page-N0q5DxnI.js → logs-page-Dl4kM4Na.js} +2 -2
  53. package/dist/gateway/static/root/assets/management-settings-gCfH4cwH.js +1 -0
  54. package/dist/gateway/static/root/assets/{markdown-view-DkPzc50Z.js → markdown-view-Ck_5MADq.js} +1 -1
  55. package/dist/gateway/static/root/assets/{media-plugins-BzLYE9lj.js → media-plugins-DTsZqgo6.js} +1 -1
  56. package/dist/gateway/static/root/assets/messages-7VAhscYe.js +3 -0
  57. package/dist/gateway/static/root/assets/note-detail-panel-j6sioeL1.js +5 -0
  58. package/dist/gateway/static/root/assets/notes-page-CMvvHv0f.js +8 -0
  59. package/dist/gateway/static/root/assets/{page-context-capture-button-DVnGa7Lu.js → page-context-capture-button-DTI_g4tz.js} +1 -1
  60. package/dist/gateway/static/root/assets/{page-tabs-q6lpN9OD.js → page-tabs-CfW_Q-K5.js} +1 -1
  61. package/dist/gateway/static/root/assets/{preview-open-alternatives-Ck63fJaQ.js → preview-open-alternatives-CuPN-vAn.js} +1 -1
  62. package/dist/gateway/static/root/assets/product-delivery-bv3z8Xkh.js +1 -0
  63. package/dist/gateway/static/root/assets/product-open-page-BHjxRz1E.js +1 -0
  64. package/dist/gateway/static/root/assets/project-detail-page-C9K_e-EV.js +1 -0
  65. package/dist/gateway/static/root/assets/projects-page-Bk-es4i9.js +1 -0
  66. package/dist/gateway/static/root/assets/{registry-api-CRnytFLF.js → registry-api-BAAZUGnU.js} +1 -1
  67. package/dist/gateway/static/root/assets/remote-access-hub-CLGJNA42.js +1 -0
  68. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-Bu3XyrDI.js → runtime-tools-settings-panel-CHJBJKL1.js} +2 -2
  69. package/dist/gateway/static/root/assets/{scenes-page-B_5HOUzl.js → scenes-page-ClLAD1pz.js} +2 -2
  70. package/dist/gateway/static/root/assets/{schema-form-CbOOKW1B.js → schema-form-FQAit5HL.js} +1 -1
  71. package/dist/gateway/static/root/assets/sessions-page-Xj8MkXN1.js +1 -0
  72. package/dist/gateway/static/root/assets/settings-advanced-gate-DwALV8mi.js +1 -0
  73. package/dist/gateway/static/root/assets/{settings-form-section-D3UN4rb4.js → settings-form-section-BDc6bw1q.js} +1 -1
  74. package/dist/gateway/static/root/assets/{settings-page-BHztZayW.js → settings-page-DnhxBJjV.js} +1 -1
  75. package/dist/gateway/static/root/assets/{settings-page-layout-nskqtzZs.js → settings-page-layout-D3KNSQ5g.js} +1 -1
  76. package/dist/gateway/static/root/assets/{setup-status-panel-BtukdJ-z.js → setup-status-panel-F0rCQ-2a.js} +1 -1
  77. package/dist/gateway/static/root/assets/{share-preview-page-DbYXEqur.js → share-preview-page-DVQCRxwK.js} +1 -1
  78. package/dist/gateway/static/root/assets/shares-settings-C7hf6Cov.js +1 -0
  79. package/dist/gateway/static/root/assets/skill-reload-api-xPrFejRE.js +1 -0
  80. package/dist/gateway/static/root/assets/{skills-page-CK9Jeaur.js → skills-page-RdDYu7Yj.js} +1 -1
  81. package/dist/gateway/static/root/assets/{skills-page.utils-B44aWbyL.js → skills-page.utils-mDwC9UJ-.js} +1 -1
  82. package/dist/gateway/static/root/assets/{system-settings-panel-BwqpUGv_.js → system-settings-panel-Bk7GrMij.js} +1 -1
  83. package/dist/gateway/static/root/assets/task-detail-page-2A966jFY.js +1 -0
  84. package/dist/gateway/static/root/assets/{tunnel-api-BKTZzQIT.js → tunnel-api-D3Aquraj.js} +1 -1
  85. package/dist/gateway/static/root/assets/{use-autosave-BB1JBOCz.js → use-autosave-C1xQ-sHn.js} +1 -1
  86. package/dist/gateway/static/root/assets/user-model-page-CnBxPBVe.js +2 -0
  87. package/dist/gateway/static/root/assets/{voice-api-key-field-C-HsgED9.js → voice-api-key-field-DCNECvcp.js} +1 -1
  88. package/dist/gateway/static/root/assets/{voice-config-api-DvJKYYA0.js → voice-config-api-B-_niUTU.js} +1 -1
  89. package/dist/gateway/static/root/assets/{work-discovery-overlay-K3e5ONUo.js → work-discovery-overlay-BrGx_JS_.js} +1 -1
  90. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-dXRTHBoE.js → workflow-run-setup-panel-CmmC2Pdr.js} +2 -2
  91. package/dist/gateway/static/root/assets/workflows-page-BZVpqw4T.js +6 -0
  92. package/dist/gateway/static/root/index.html +12 -11
  93. package/dist/package.js +1 -1
  94. package/dist/packages/gateway-contract/src/capabilities.js +4 -110
  95. package/dist/packages/gateway-contract/src/chat-previews.js +73 -0
  96. package/dist/packages/gateway-contract/src/index.js +6 -0
  97. package/dist/packages/gateway-contract/src/local-apps.js +215 -0
  98. package/dist/packages/gateway-contract/src/product-delivery.js +62 -17
  99. package/dist/packages/gateway-contract/src/user-turn-document.js +60 -0
  100. package/dist/src/agent/agent-manager.d.ts +1 -0
  101. package/dist/src/agent/agent-manager.js +5 -4
  102. package/dist/src/agent/background-review/run-background-review.js +1 -1
  103. package/dist/src/agent/embedded/model-runtime.js +1 -1
  104. package/dist/src/agent/embedded/run-for-session.js +1 -1
  105. package/dist/src/agent/embedded/transcript-runtime.d.ts +3 -0
  106. package/dist/src/agent/embedded/transcript-runtime.js +6 -0
  107. package/dist/src/agent/external-tools/cliProvider.js +4 -1
  108. package/dist/src/agent/external-tools/composio-provider.js +9 -3
  109. package/dist/src/agent/external-tools/gateway-tools.js +17 -10
  110. package/dist/src/agent/external-tools/mcp-provider.d.ts +3 -1
  111. package/dist/src/agent/external-tools/mcp-provider.js +91 -6
  112. package/dist/src/agent/external-tools/service.d.ts +2 -1
  113. package/dist/src/agent/external-tools/service.js +8 -3
  114. package/dist/src/agent/external-tools/types.d.ts +9 -0
  115. package/dist/src/agent/image/tool-model-config.js +1 -1
  116. package/dist/src/agent/mcp/bundle-mcp-config.js +37 -5
  117. package/dist/src/agent/mcp/bundle-mcp-gateway.d.ts +1 -0
  118. package/dist/src/agent/mcp/bundle-mcp-gateway.js +1 -0
  119. package/dist/src/agent/mcp/bundle-mcp-names.js +2 -1
  120. package/dist/src/agent/mcp/bundle-mcp-runtime.js +33 -1
  121. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +4 -0
  122. package/dist/src/agent/mcp/index.js +1 -1
  123. package/dist/src/agent/mcp/mcp-stdio-transport.d.ts +1 -0
  124. package/dist/src/agent/mcp/mcp-stdio-transport.js +10 -0
  125. package/dist/src/agent/mcp/mcp-transport.js +12 -8
  126. package/dist/src/agent/mcp/oauth/index.js +1 -1
  127. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.d.ts +6 -1
  128. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +70 -14
  129. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +1 -1
  130. package/dist/src/agent/mcp/oauth/mcp-oauth-session.d.ts +2 -0
  131. package/dist/src/agent/mcp/oauth/mcp-oauth-session.js +12 -0
  132. package/dist/src/agent/mcp/oauth/mcp-oauth-store.d.ts +3 -0
  133. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +14 -2
  134. package/dist/src/agent/mcp/plugin-http-fetch.d.ts +2 -0
  135. package/dist/src/agent/mcp/plugin-http-fetch.js +56 -0
  136. package/dist/src/agent/service/process-direct-streaming.js +27 -12
  137. package/dist/src/agent/service.js +3 -2
  138. package/dist/src/agent/service.types.d.ts +2 -0
  139. package/dist/src/agent/session/session-inspector.js +1 -1
  140. package/dist/src/agent/skills/hub-lock.js +1 -1
  141. package/dist/src/agent/skills/hub-pull.js +1 -1
  142. package/dist/src/agent/skills/index.js +8 -1
  143. package/dist/src/agent/skills/skill-manager.d.ts +2 -0
  144. package/dist/src/agent/skills/skill-manager.js +8 -0
  145. package/dist/src/agent/skills/skill-sources.js +17 -0
  146. package/dist/src/agent/skills/types.d.ts +3 -1
  147. package/dist/src/agent/source-context/injector.js +10 -5
  148. package/dist/src/agent/source-context/types.d.ts +3 -0
  149. package/dist/src/agent/source-context/types.js +8 -2
  150. package/dist/src/agent/tasks/task-judge-service.js +3 -3
  151. package/dist/src/agent/tool-manuals/xopc-use.d.ts +1 -1
  152. package/dist/src/agent/tool-manuals/xopc-use.js +12 -2
  153. package/dist/src/agent/tools/automation-tool.js +1 -1
  154. package/dist/src/agent/tools/factory.d.ts +1 -0
  155. package/dist/src/agent/tools/factory.js +2 -1
  156. package/dist/src/agent/tools/search/registry.js +4 -1
  157. package/dist/src/agent/tools/workflow-tool.js +1 -1
  158. package/dist/src/agent/tools/write.js +1 -1
  159. package/dist/src/agent/tools/xopc-use-tool.d.ts +4 -2
  160. package/dist/src/agent/tools/xopc-use-tool.js +120 -12
  161. package/dist/src/ai-assist/text-assist.js +1 -1
  162. package/dist/src/auth/credentials.js +2 -2
  163. package/dist/src/auth/oauth/xopc-cloud.js +1 -1
  164. package/dist/src/auth/profiles/store.js +1 -1
  165. package/dist/src/auth/sync-provider-auth.js +2 -2
  166. package/dist/src/browser/providers/browser-ext-install.js +1 -1
  167. package/dist/src/chat-commands/agent-edit.js +1 -1
  168. package/dist/src/chat-previews/index.d.ts +2 -0
  169. package/dist/src/chat-previews/index.js +3 -0
  170. package/dist/src/chat-previews/service.d.ts +27 -0
  171. package/dist/src/chat-previews/service.js +106 -0
  172. package/dist/src/chat-previews/store.d.ts +28 -0
  173. package/dist/src/chat-previews/store.js +77 -0
  174. package/dist/src/cli/commands/agent.js +1 -1
  175. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  176. package/dist/src/cli/commands/doctor/checks/provider-auth.js +3 -3
  177. package/dist/src/cli/commands/extension-agent-plugin.d.ts +8 -0
  178. package/dist/src/cli/commands/extension-agent-plugin.js +82 -0
  179. package/dist/src/cli/commands/extension-marketplace.js +44 -4
  180. package/dist/src/cli/commands/extension.js +35 -3
  181. package/dist/src/cli/commands/models.js +1 -1
  182. package/dist/src/computer/runtime.js +1 -1
  183. package/dist/src/config/index.js +4 -4
  184. package/dist/src/config/loader.js +2 -2
  185. package/dist/src/config/models-json.js +2 -2
  186. package/dist/src/config/schema.js +2 -2
  187. package/dist/src/connectors/account-selection.js +1 -1
  188. package/dist/src/connectors/connection-candidates.d.ts +4 -1
  189. package/dist/src/connectors/connection-candidates.js +8 -2
  190. package/dist/src/connectors/connection-capabilities.d.ts +2 -2
  191. package/dist/src/connectors/connection-capabilities.js +3 -1
  192. package/dist/src/connectors/connection-recovery-service.d.ts +6 -1
  193. package/dist/src/connectors/connection-recovery-service.js +138 -26
  194. package/dist/src/connectors/plugin-mcp-recovery.d.ts +28 -0
  195. package/dist/src/connectors/plugin-mcp-recovery.js +90 -0
  196. package/dist/src/extensions/agent-plugins/auth.d.ts +39 -0
  197. package/dist/src/extensions/agent-plugins/auth.js +156 -0
  198. package/dist/src/extensions/agent-plugins/connection.d.ts +8 -0
  199. package/dist/src/extensions/agent-plugins/connection.js +41 -0
  200. package/dist/src/extensions/agent-plugins/health.d.ts +4 -0
  201. package/dist/src/extensions/agent-plugins/health.js +48 -0
  202. package/dist/src/extensions/agent-plugins/inventory.d.ts +53 -0
  203. package/dist/src/extensions/agent-plugins/inventory.js +34 -0
  204. package/dist/src/extensions/agent-plugins/mcp-adapter.d.ts +3 -0
  205. package/dist/src/extensions/agent-plugins/mcp-adapter.js +47 -0
  206. package/dist/src/extensions/agent-plugins/sources.d.ts +5 -0
  207. package/dist/src/extensions/agent-plugins/sources.js +72 -0
  208. package/dist/src/extensions/agent-plugins/store.d.ts +61 -0
  209. package/dist/src/extensions/agent-plugins/store.js +305 -0
  210. package/dist/src/extensions/agent-plugins/validation.d.ts +59 -0
  211. package/dist/src/extensions/agent-plugins/validation.js +211 -0
  212. package/dist/src/extensions/lockfile.js +1 -1
  213. package/dist/src/extensions/update.js +1 -1
  214. package/dist/src/gateway/agents-admin.js +1 -1
  215. package/dist/src/gateway/chat-stream/mapper.js +10 -3
  216. package/dist/src/gateway/file-path-classifier.js +1 -1
  217. package/dist/src/gateway/hono/lib/config-payload.js +1 -1
  218. package/dist/src/gateway/hono/routes/agent-plugins.d.ts +3 -0
  219. package/dist/src/gateway/hono/routes/agent-plugins.js +166 -0
  220. package/dist/src/gateway/hono/routes/agent-stream.js +14 -0
  221. package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -2
  222. package/dist/src/gateway/hono/routes/chat-previews.d.ts +3 -0
  223. package/dist/src/gateway/hono/routes/chat-previews.js +41 -0
  224. package/dist/src/gateway/hono/routes/connection-waits.js +4 -2
  225. package/dist/src/gateway/hono/routes/index.js +2 -0
  226. package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
  227. package/dist/src/gateway/hono/routes/local-apps.js +71 -39
  228. package/dist/src/gateway/hono/routes/mcp.js +48 -21
  229. package/dist/src/gateway/hono/routes/models.js +1 -1
  230. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +4 -0
  231. package/dist/src/gateway/hono/routes/session-input-handler.js +22 -0
  232. package/dist/src/gateway/hono/routes/side-chats.js +11 -0
  233. package/dist/src/gateway/service/agent-runner.js +7 -1
  234. package/dist/src/gateway/service/config-coordinator.js +1 -1
  235. package/dist/src/gateway/service/marketplace-service.d.ts +1 -0
  236. package/dist/src/gateway/service/marketplace-service.js +15 -1
  237. package/dist/src/gateway/service/session-input-coordinator.js +3 -3
  238. package/dist/src/gateway/service.d.ts +5 -1
  239. package/dist/src/gateway/service.js +19 -5
  240. package/dist/src/gateway/side-chat/index.d.ts +3 -1
  241. package/dist/src/gateway/side-chat/index.js +2 -1
  242. package/dist/src/gateway/side-chat/manager.d.ts +16 -0
  243. package/dist/src/gateway/side-chat/manager.js +40 -6
  244. package/dist/src/gateway/side-chat/promotion-service.d.ts +19 -0
  245. package/dist/src/gateway/side-chat/promotion-service.js +111 -0
  246. package/dist/src/gateway/side-chat/run-service.js +1 -0
  247. package/dist/src/gateway/side-chat/types.d.ts +1 -1
  248. package/dist/src/local-apps/artifact-files.d.ts +3 -0
  249. package/dist/src/local-apps/artifact-files.js +45 -0
  250. package/dist/src/local-apps/capabilities/write.js +1 -1
  251. package/dist/src/local-apps/fix-guidance.d.ts +3 -0
  252. package/dist/src/local-apps/fix-guidance.js +75 -0
  253. package/dist/src/local-apps/index.d.ts +2 -1
  254. package/dist/src/local-apps/scaffold.d.ts +5 -0
  255. package/dist/src/local-apps/scaffold.js +18 -5
  256. package/dist/src/local-apps/service.d.ts +18 -3
  257. package/dist/src/local-apps/service.js +106 -64
  258. package/dist/src/local-apps/snapshot-store.d.ts +8 -0
  259. package/dist/src/local-apps/snapshot-store.js +68 -0
  260. package/dist/src/local-apps/types.d.ts +4 -87
  261. package/dist/src/notes/service.js +1 -1
  262. package/dist/src/providers/auth-runtime/resolve-auth.js +1 -1
  263. package/dist/src/providers/index.js +2 -2
  264. package/dist/src/providers/model-catalog-persistence.js +1 -1
  265. package/dist/src/providers/model-registry.js +1 -1
  266. package/dist/src/providers/register-runtime-providers.js +1 -1
  267. package/dist/src/session/client-history.d.ts +3 -1
  268. package/dist/src/session/client-history.js +10 -3
  269. package/dist/src/session/index.d.ts +1 -1
  270. package/dist/src/session/manager.d.ts +4 -0
  271. package/dist/src/session/manager.js +6 -0
  272. package/dist/src/session/session-context-for-llm.d.ts +12 -1
  273. package/dist/src/session/session-context-for-llm.js +16 -2
  274. package/dist/src/session/store.d.ts +14 -0
  275. package/dist/src/session/store.js +17 -0
  276. package/dist/src/session/stored-rows-to-file-entries.js +10 -1
  277. package/dist/src/session/transcript-outline.js +10 -3
  278. package/dist/src/storage/sqlite/connection-wait-repository.js +9 -3
  279. package/dist/src/storage/sqlite/migrations/202_chat_previews.sql +26 -0
  280. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  281. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  282. package/dist/src/storage/sqlite/row-mappers.js +6 -1
  283. package/dist/src/storage/sqlite/schema.js +1 -1
  284. package/dist/src/tui/backends/embedded-backend.js +1 -1
  285. package/dist/src/tui/tui-commands.js +1 -1
  286. package/dist/src/tui/tui-startup-resources.js +1 -1
  287. package/dist/src/tui/tui.js +2 -2
  288. package/dist/src/voice/tts/audio.js +1 -1
  289. package/dist/src/work-discovery/service.js +2 -2
  290. package/dist/src/workflows/service/workflow-run-service.js +1 -1
  291. package/package.json +4 -4
  292. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-BGCqlTcR.js +0 -1
  293. package/dist/gateway/static/root/assets/api-DEneywgz.js +0 -1
  294. package/dist/gateway/static/root/assets/apps-page-vC87gAyb.js +0 -1
  295. package/dist/gateway/static/root/assets/automations-workspace-CzYmREol.js +0 -7
  296. package/dist/gateway/static/root/assets/browser-settings-page-BxaSzUIU.js +0 -3
  297. package/dist/gateway/static/root/assets/capabilities-D0S3DuAD.js +0 -1
  298. package/dist/gateway/static/root/assets/capabilities-settings-panel-CFCu-8da.js +0 -8
  299. package/dist/gateway/static/root/assets/channels-settings-CENp82yt.js +0 -1
  300. package/dist/gateway/static/root/assets/connectors-page-g_KTZWCb.js +0 -2
  301. package/dist/gateway/static/root/assets/device-pairing-wizard-DO7jp0ep.js +0 -1
  302. package/dist/gateway/static/root/assets/gateway-settings-BkeSEBxk.js +0 -1
  303. package/dist/gateway/static/root/assets/home-page-KoQXV4hp.js +0 -1
  304. package/dist/gateway/static/root/assets/index-ZxnWUdPv.css +0 -1
  305. package/dist/gateway/static/root/assets/index-u4709aCa.js +0 -89
  306. package/dist/gateway/static/root/assets/local-app-workbench-page-7QX0YFa7.js +0 -2
  307. package/dist/gateway/static/root/assets/local-apps-page-RSAl-NhO.js +0 -1
  308. package/dist/gateway/static/root/assets/management-settings-C_cb0Kue.js +0 -1
  309. package/dist/gateway/static/root/assets/messages-M5xl1fHE.js +0 -3
  310. package/dist/gateway/static/root/assets/note-detail-panel-CVWst-Er.js +0 -5
  311. package/dist/gateway/static/root/assets/notes-page-BFwCgIls.js +0 -8
  312. package/dist/gateway/static/root/assets/product-delivery-chCjIpvu.js +0 -1
  313. package/dist/gateway/static/root/assets/product-open-page-BIGvTs9n.js +0 -1
  314. package/dist/gateway/static/root/assets/project-detail-page-BFEtpkcf.js +0 -1
  315. package/dist/gateway/static/root/assets/projects-page-CHr-P2z4.js +0 -1
  316. package/dist/gateway/static/root/assets/remote-access-hub-PhEyHSOb.js +0 -1
  317. package/dist/gateway/static/root/assets/sessions-page-CmIhlHPS.js +0 -1
  318. package/dist/gateway/static/root/assets/settings-advanced-gate-CCOTu1jb.js +0 -1
  319. package/dist/gateway/static/root/assets/shares-settings-CG1sll8V.js +0 -1
  320. package/dist/gateway/static/root/assets/skill-reload-api-Byq23h9c.js +0 -1
  321. package/dist/gateway/static/root/assets/task-detail-page-D5q-wk_d.js +0 -1
  322. package/dist/gateway/static/root/assets/user-model-page-DE3ZeJL3.js +0 -2
  323. package/dist/gateway/static/root/assets/workflows-page-DGZaETmN.js +0 -6
@@ -1,5 +1,7 @@
1
1
  import { terminateProcess } from "../../process/kill-tree.js";
2
+ import { containedPath } from "../../extensions/agent-plugins/validation.js";
2
3
  import { spawn } from "node:child_process";
4
+ import { mkdir } from "node:fs/promises";
3
5
  import { getDefaultEnvironment } from "@modelcontextprotocol/sdk/client/stdio.js";
4
6
  import process from "node:process";
5
7
  import { PassThrough } from "node:stream";
@@ -24,6 +26,14 @@ var XopcStdioClientTransport = class {
24
26
  }
25
27
  async start() {
26
28
  if (this.process) throw new Error("XopcStdioClientTransport already started; Client.connect() starts transports automatically.");
29
+ if (this.serverParams.pluginDataDir) {
30
+ const data = this.serverParams.pluginDataDir;
31
+ await mkdir(data, {
32
+ recursive: true,
33
+ mode: 448
34
+ });
35
+ if (this.serverParams.cwd) containedPath(this.serverParams.cwd.startsWith(data) ? data : this.serverParams.env?.PLUGIN_ROOT ?? data, this.serverParams.cwd);
36
+ }
27
37
  await new Promise((resolve, reject) => {
28
38
  const baseEnv = {
29
39
  ...getDefaultEnvironment(),
@@ -2,11 +2,13 @@ import { init_paths_state, resolveStateDir } from "../../config/paths-state.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
4
  import { init_string_coerce, normalizeOptionalString } from "../../utils/string-coerce.js";
5
+ import { McpOAuthStore } from "./oauth/mcp-oauth-store.js";
6
+ import { pluginOAuthScope } from "../../extensions/agent-plugins/auth.js";
5
7
  import { buildRuntimeEnvironment, resolveRuntimeCommand } from "../../runtime-tools/environment.js";
6
8
  import { XopcStdioClientTransport } from "./mcp-stdio-transport.js";
7
9
  import { resolveMcpTransportConfig } from "./mcp-transport-config.js";
8
- import { McpOAuthStore } from "./oauth/mcp-oauth-store.js";
9
10
  import { XopcMcpOAuthClientProvider } from "./oauth/mcp-oauth-provider.js";
11
+ import { createPluginHttpFetch } from "./plugin-http-fetch.js";
10
12
  import { SSEClientTransport } from "@modelcontextprotocol/sdk/client/sse.js";
11
13
  import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
12
14
  import { getDefaultEnvironment } from "@modelcontextprotocol/sdk/client/stdio.js";
@@ -64,6 +66,7 @@ function buildScopedHttpFetch(serverUrl, headers) {
64
66
  async function resolveMcpTransport(serverName, rawServer, config, options = {}) {
65
67
  const resolved = resolveMcpTransportConfig(serverName, rawServer);
66
68
  if (!resolved) return null;
69
+ const plugin = rawServer && typeof rawServer === "object" ? rawServer.xopcPlugin : void 0;
67
70
  if (resolved.kind === "stdio") {
68
71
  const command = config ? await resolveRuntimeCommand({
69
72
  command: resolved.command,
@@ -84,7 +87,8 @@ async function resolveMcpTransport(serverName, rawServer, config, options = {})
84
87
  args: resolved.args,
85
88
  env,
86
89
  cwd: resolved.cwd,
87
- stderr: "pipe"
90
+ stderr: "pipe",
91
+ pluginDataDir: plugin?.dataDir
88
92
  });
89
93
  return {
90
94
  transport,
@@ -100,7 +104,7 @@ async function resolveMcpTransport(serverName, rawServer, config, options = {})
100
104
  const oauthEnabled = Boolean(resolved.auth);
101
105
  let oauthProvider = options.oauthProvider;
102
106
  if (resolved.auth && !oauthProvider) {
103
- const store = options.oauthStore ?? new McpOAuthStore();
107
+ const store = options.oauthStore ?? new McpOAuthStore(pluginOAuthScope(rawServer));
104
108
  if ((await store.load(serverUrl))?.tokens) oauthProvider = new XopcMcpOAuthClientProvider({
105
109
  serverUrl,
106
110
  clientId: resolved.auth.clientId,
@@ -110,8 +114,8 @@ async function resolveMcpTransport(serverName, rawServer, config, options = {})
110
114
  return {
111
115
  transport: new StreamableHTTPClientTransport(serverUrl, {
112
116
  authProvider: oauthProvider,
113
- requestInit: !oauthEnabled && resolved.headers ? { headers: resolved.headers } : void 0,
114
- fetch: oauthEnabled ? buildScopedHttpFetch(serverUrl, resolved.headers ?? {}) : fetchWithUndici
117
+ requestInit: !plugin && !oauthEnabled && resolved.headers ? { headers: resolved.headers } : void 0,
118
+ fetch: plugin ? createPluginHttpFetch(serverUrl, resolved.headers ?? {}) : oauthEnabled ? buildScopedHttpFetch(serverUrl, resolved.headers ?? {}) : fetchWithUndici
115
119
  }),
116
120
  description: resolved.description,
117
121
  transportType: "streamable-http",
@@ -123,9 +127,9 @@ async function resolveMcpTransport(serverName, rawServer, config, options = {})
123
127
  const hasHeaders = Object.keys(headers).length > 0;
124
128
  return {
125
129
  transport: new SSEClientTransport(new URL(resolved.url), {
126
- requestInit: hasHeaders ? { headers } : void 0,
127
- fetch: fetchWithUndici,
128
- eventSourceInit: { fetch: buildSseEventSourceFetch(headers) }
130
+ requestInit: !plugin && hasHeaders ? { headers } : void 0,
131
+ fetch: plugin ? createPluginHttpFetch(new URL(resolved.url), headers) : fetchWithUndici,
132
+ eventSourceInit: { fetch: plugin ? createPluginHttpFetch(new URL(resolved.url), headers) : buildSseEventSourceFetch(headers) }
129
133
  }),
130
134
  description: resolved.description,
131
135
  transportType: "sse",
@@ -1,5 +1,5 @@
1
- import { McpAuthorizationRequiredError, isMcpAuthorizationError } from "./mcp-oauth-errors.js";
2
1
  import { McpOAuthStore, canonicalMcpServerUrl, mcpOAuthServerKey } from "./mcp-oauth-store.js";
2
+ import { McpAuthorizationRequiredError, isMcpAuthorizationError } from "./mcp-oauth-errors.js";
3
3
  import { XopcMcpOAuthClientProvider } from "./mcp-oauth-provider.js";
4
4
  import { McpOAuthSession } from "./mcp-oauth-session.js";
5
5
  import { McpOAuthManager, getMcpOAuthManager } from "./mcp-oauth-manager.js";
@@ -15,11 +15,16 @@ type StartMcpOAuthParams = {
15
15
  export declare class McpOAuthManager {
16
16
  private readonly store;
17
17
  private readonly sessionsByServerUrl;
18
+ private readonly pending;
19
+ private cancelling;
18
20
  constructor(store?: McpOAuthStore);
19
21
  status(serverId: string, rawServer: unknown): Promise<McpOAuthStatus>;
20
22
  start(params: StartMcpOAuthParams): Promise<McpOAuthStatus>;
23
+ cancelPending(): Promise<void>;
24
+ private startSession;
21
25
  disconnect(serverId: string, rawServer: unknown): Promise<McpOAuthStatus>;
26
+ submitCallback(serverId: string, rawServer: unknown, callbackUrl: string): Promise<McpOAuthStatus>;
22
27
  private finishAuthorization;
23
28
  }
24
- export declare function getMcpOAuthManager(): McpOAuthManager;
29
+ export declare function getMcpOAuthManager(rawServer?: unknown): McpOAuthManager;
25
30
  export {};
@@ -2,10 +2,12 @@ import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
3
  import { init_global_singleton, resolveGlobalSingleton } from "../../../utils/global-singleton.js";
4
4
  import { resolveConnectorSecretReferences } from "../../../connectors/secret-store.js";
5
+ import { recordPluginMcpHealth } from "../../../extensions/agent-plugins/health.js";
5
6
  import { redactSensitiveUrlLikeString } from "../../../utils/redact-sensitive-url.js";
7
+ import { McpOAuthStore, canonicalMcpServerUrl } from "./mcp-oauth-store.js";
8
+ import { pluginOAuthScope } from "../../../extensions/agent-plugins/auth.js";
6
9
  import { resolveMcpTransportConfig } from "../mcp-transport-config.js";
7
10
  import { isMcpAuthorizationError } from "./mcp-oauth-errors.js";
8
- import { McpOAuthStore, canonicalMcpServerUrl } from "./mcp-oauth-store.js";
9
11
  import { XopcMcpOAuthClientProvider } from "./mcp-oauth-provider.js";
10
12
  import { resolveMcpTransport } from "../mcp-transport.js";
11
13
  import { disposeAllSessionMcpRuntimes } from "../bundle-mcp-runtime.js";
@@ -49,6 +51,8 @@ function isAuthorizing(snapshot) {
49
51
  var McpOAuthManager = class {
50
52
  store;
51
53
  sessionsByServerUrl = /* @__PURE__ */ new Map();
54
+ pending = /* @__PURE__ */ new Set();
55
+ cancelling = false;
52
56
  constructor(store = new McpOAuthStore()) {
53
57
  this.store = store;
54
58
  }
@@ -83,7 +87,28 @@ var McpOAuthManager = class {
83
87
  };
84
88
  }
85
89
  async start(params) {
90
+ if (this.cancelling) throw new Error("OAuth connections are being cleared");
91
+ const task = this.startSession(params);
92
+ this.pending.add(task);
93
+ try {
94
+ return await task;
95
+ } finally {
96
+ this.pending.delete(task);
97
+ }
98
+ }
99
+ async cancelPending() {
100
+ this.cancelling = true;
101
+ try {
102
+ await Promise.all([...this.sessionsByServerUrl.values()].map((session) => session.close()));
103
+ await Promise.allSettled([...this.pending]);
104
+ this.sessionsByServerUrl.clear();
105
+ } finally {
106
+ this.cancelling = false;
107
+ }
108
+ }
109
+ async startSession(params) {
86
110
  const rawServer = await resolveConnectorSecretReferences(params.rawServer);
111
+ if (this.cancelling) throw new Error("OAuth connections are being cleared");
87
112
  const resolvedConfig = resolveMcpTransportConfig(params.serverId, rawServer);
88
113
  if (!resolvedConfig || resolvedConfig.kind !== "http" || !resolvedConfig.auth) throw new Error(`MCP server "${params.serverId}" is not configured for OAuth`);
89
114
  const serverUrl = new URL(resolvedConfig.url);
@@ -139,23 +164,39 @@ var McpOAuthManager = class {
139
164
  const client = createClient();
140
165
  try {
141
166
  await connectClient(client, resolved);
167
+ if (session.snapshot().status === "cancelled") {
168
+ await this.store.delete(serverUrl);
169
+ await closeConnection(client, resolved);
170
+ return {
171
+ configured: true,
172
+ status: "disconnected"
173
+ };
174
+ }
142
175
  session.complete();
176
+ recordPluginMcpHealth(rawServer, "ready");
143
177
  await closeConnection(client, resolved);
144
178
  await disposeAllSessionMcpRuntimes();
145
179
  } catch (error) {
146
- if (!isMcpAuthorizationError(error) || !session.snapshot().authorizationUrl) {
180
+ if (session.snapshot().status === "cancelled") {
181
+ await this.store.delete(serverUrl);
182
+ await closeConnection(client, resolved);
183
+ } else if (!isMcpAuthorizationError(error) || !session.snapshot().authorizationUrl) {
147
184
  session.fail(error);
148
185
  await closeConnection(client, resolved);
149
- } else this.finishAuthorization({
150
- session,
151
- provider,
152
- client,
153
- resolved,
154
- params: {
155
- ...params,
156
- rawServer
157
- }
158
- });
186
+ } else {
187
+ const task = this.finishAuthorization({
188
+ session,
189
+ provider,
190
+ client,
191
+ resolved,
192
+ params: {
193
+ ...params,
194
+ rawServer
195
+ }
196
+ });
197
+ this.pending.add(task);
198
+ task.finally(() => this.pending.delete(task));
199
+ }
159
200
  }
160
201
  return this.status(params.serverId, params.rawServer);
161
202
  }
@@ -167,12 +208,21 @@ var McpOAuthManager = class {
167
208
  this.sessionsByServerUrl.delete(conversationId);
168
209
  if (session) await session.close();
169
210
  await this.store.delete(resolved.url);
211
+ recordPluginMcpHealth(rawServer, "authorization_required");
170
212
  await disposeAllSessionMcpRuntimes();
171
213
  return {
172
214
  configured: true,
173
215
  status: "disconnected"
174
216
  };
175
217
  }
218
+ async submitCallback(serverId, rawServer, callbackUrl) {
219
+ const resolved = resolveMcpTransportConfig(serverId, rawServer);
220
+ if (!resolved || resolved.kind !== "http") throw new Error("Unknown OAuth server");
221
+ const session = this.sessionsByServerUrl.get(canonicalMcpServerUrl(resolved.url));
222
+ if (!session) throw new Error("OAuth session not found");
223
+ session.submitCallback(callbackUrl);
224
+ return this.status(serverId, rawServer);
225
+ }
176
226
  async finishAuthorization(context) {
177
227
  const { session, provider, client, resolved, params } = context;
178
228
  try {
@@ -195,7 +245,12 @@ var McpOAuthManager = class {
195
245
  } finally {
196
246
  await closeConnection(authenticatedClient, authenticated);
197
247
  }
248
+ if (session.snapshot().status === "cancelled") {
249
+ await this.store.delete(session.serverUrl);
250
+ return;
251
+ }
198
252
  session.complete();
253
+ recordPluginMcpHealth(params.rawServer, "ready");
199
254
  await disposeAllSessionMcpRuntimes();
200
255
  } catch (error) {
201
256
  if (session.snapshot().status === "cancelled") {
@@ -213,8 +268,9 @@ var McpOAuthManager = class {
213
268
  }
214
269
  }
215
270
  };
216
- function getMcpOAuthManager() {
217
- return resolveGlobalSingleton(MCP_OAUTH_MANAGER_KEY, () => new McpOAuthManager());
271
+ function getMcpOAuthManager(rawServer) {
272
+ const scope = pluginOAuthScope(rawServer);
273
+ return resolveGlobalSingleton(scope ? Symbol.for(`xopc.mcpOAuthManager:${scope}`) : MCP_OAUTH_MANAGER_KEY, () => new McpOAuthManager(new McpOAuthStore(scope)));
218
274
  }
219
275
  //#endregion
220
276
  export { McpOAuthManager, getMcpOAuthManager };
@@ -1,5 +1,5 @@
1
- import { McpAuthorizationRequiredError } from "./mcp-oauth-errors.js";
2
1
  import { McpOAuthStore } from "./mcp-oauth-store.js";
2
+ import { McpAuthorizationRequiredError } from "./mcp-oauth-errors.js";
3
3
  //#region src/agent/mcp/oauth/mcp-oauth-provider.ts
4
4
  var XopcMcpOAuthClientProvider = class {
5
5
  store;
@@ -19,6 +19,8 @@ export declare class McpOAuthSession {
19
19
  get redirectUrl(): URL;
20
20
  start(): Promise<void>;
21
21
  setAuthorizationUrl(url: URL): void;
22
+ /** Remote Gateway users can submit the browser's loopback callback URL over the authenticated API. */
23
+ submitCallback(url: string): void;
22
24
  waitForCode(): Promise<string>;
23
25
  complete(): void;
24
26
  fail(error: unknown): void;
@@ -110,6 +110,18 @@ var McpOAuthSession = class {
110
110
  this.authorizationUrlValue = url.toString();
111
111
  this.statusValue = "waiting_browser";
112
112
  }
113
+ /** Remote Gateway users can submit the browser's loopback callback URL over the authenticated API. */
114
+ submitCallback(url) {
115
+ const callback = new URL(url);
116
+ if (callback.origin !== this.redirectUrl.origin || callback.pathname !== CALLBACK_PATH || callback.searchParams.get("state") !== this.state) throw new Error("MCP OAuth callback mismatch");
117
+ if (this.statusValue !== "waiting_browser" || this.callbackConsumed || Date.now() >= this.expiresAt) throw new Error("MCP OAuth session is not waiting for a callback");
118
+ const code = callback.searchParams.get("code");
119
+ if (!code || callback.searchParams.has("error")) throw new Error("MCP OAuth authorization code is missing or denied");
120
+ this.callbackConsumed = true;
121
+ this.statusValue = "exchanging_code";
122
+ this.settleCode?.({ code });
123
+ this.settleCode = void 0;
124
+ }
113
125
  async waitForCode() {
114
126
  const result = await this.codePromise;
115
127
  if (result.error) throw result.error;
@@ -2,7 +2,10 @@ import type { McpOAuthRecord } from './mcp-oauth-types.js';
2
2
  export declare function canonicalMcpServerUrl(input: string | URL): string;
3
3
  export declare function mcpOAuthServerKey(input: string | URL): string;
4
4
  export declare class McpOAuthStore {
5
+ private readonly identityScope?;
6
+ constructor(identityScope?: string);
5
7
  pathFor(serverUrl: string | URL): string;
8
+ deleteScope(): Promise<void>;
6
9
  load(serverUrlInput: string | URL): Promise<McpOAuthRecord | undefined>;
7
10
  update(serverUrlInput: string | URL, update: (current: McpOAuthRecord | undefined) => McpOAuthRecord | undefined): Promise<McpOAuthRecord | undefined>;
8
11
  delete(serverUrl: string | URL): Promise<void>;
@@ -1,5 +1,6 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "../../../infra/write-file-atomic.js";
2
1
  import { init_paths, resolveMcpOAuthPath } from "../../../config/paths.js";
2
+ import { init_write_file_atomic, writeTextAtomic } from "../../../infra/write-file-atomic.js";
3
+ import { dirname, join } from "node:path";
3
4
  import { createHash } from "node:crypto";
4
5
  import { readFile, rm } from "node:fs/promises";
5
6
  //#region src/agent/mcp/oauth/mcp-oauth-store.ts
@@ -41,8 +42,19 @@ async function serializeWrite(key, operation) {
41
42
  }
42
43
  }
43
44
  var McpOAuthStore = class {
45
+ constructor(identityScope) {
46
+ this.identityScope = identityScope;
47
+ }
44
48
  pathFor(serverUrl) {
45
- return resolveMcpOAuthPath(mcpOAuthServerKey(serverUrl));
49
+ const endpoint = mcpOAuthServerKey(serverUrl);
50
+ return this.identityScope ? join(dirname(resolveMcpOAuthPath(endpoint)), createHash("sha256").update(this.identityScope).digest("hex"), `${endpoint}.json`) : resolveMcpOAuthPath(endpoint);
51
+ }
52
+ async deleteScope() {
53
+ if (!this.identityScope) throw new Error("Cannot remove unscoped MCP credentials");
54
+ await rm(dirname(this.pathFor("https://scope.invalid")), {
55
+ recursive: true,
56
+ force: true
57
+ });
46
58
  }
47
59
  async load(serverUrlInput) {
48
60
  const serverUrl = canonicalMcpServerUrl(serverUrlInput);
@@ -0,0 +1,2 @@
1
+ import type { FetchLike } from '@modelcontextprotocol/sdk/shared/transport.js';
2
+ export declare function createPluginHttpFetch(endpoint: URL, configuredHeaders: Record<string, string>): FetchLike;
@@ -0,0 +1,56 @@
1
+ import { BlockList, isIP } from "node:net";
2
+ import { Agent, fetch } from "undici";
3
+ import { lookup } from "node:dns";
4
+ //#region src/agent/mcp/plugin-http-fetch.ts
5
+ const blocked = new BlockList();
6
+ for (const [network, prefix] of [
7
+ ["0.0.0.0", 8],
8
+ ["10.0.0.0", 8],
9
+ ["100.64.0.0", 10],
10
+ ["127.0.0.0", 8],
11
+ ["169.254.0.0", 16],
12
+ ["172.16.0.0", 12],
13
+ ["192.168.0.0", 16],
14
+ ["224.0.0.0", 4],
15
+ ["240.0.0.0", 4]
16
+ ]) blocked.addSubnet(network, prefix);
17
+ for (const [network, prefix] of [
18
+ ["::", 128],
19
+ ["::1", 128],
20
+ ["fc00::", 7],
21
+ ["fe80::", 10],
22
+ ["ff00::", 8]
23
+ ]) blocked.addSubnet(network, prefix, "ipv6");
24
+ const isBlocked = (address) => blocked.check(address, isIP(address) === 6 ? "ipv6" : "ipv4");
25
+ const loopback = (host) => host === "localhost" || host === "[::1]" || /^127(?:\.\d{1,3}){3}$/.test(host);
26
+ const publicDispatcher = new Agent({ connect: { lookup(host, options, callback) {
27
+ lookup(host, {
28
+ ...options,
29
+ all: true
30
+ }, (error, addresses) => {
31
+ if (error) return callback(error, []);
32
+ if (!addresses.length || addresses.some((entry) => isBlocked(entry.address))) return callback(/* @__PURE__ */ new Error("Plugin MCP cannot access private network addresses"), []);
33
+ if (options.all) callback(null, addresses);
34
+ else callback(null, addresses[0].address, addresses[0].family);
35
+ });
36
+ } } });
37
+ function createPluginHttpFetch(endpoint, configuredHeaders) {
38
+ return async (input, init) => {
39
+ const url = new URL(input);
40
+ if (!["https:", "http:"].includes(url.protocol) || url.username || url.password || url.hash) throw new Error("Invalid plugin MCP request URL");
41
+ const local = loopback(endpoint.hostname) && url.origin === endpoint.origin;
42
+ if (!local && url.protocol !== "https:") throw new Error("Plugin MCP requires HTTPS");
43
+ const address = url.hostname.replace(/^\[|\]$/g, "");
44
+ if (!local && isIP(address) && isBlocked(address)) throw new Error("Plugin MCP cannot access private network addresses");
45
+ const headers = new Headers(url.origin === endpoint.origin ? configuredHeaders : void 0);
46
+ new Headers(init?.headers).forEach((value, key) => headers.set(key, value));
47
+ return await fetch(url, {
48
+ ...init,
49
+ headers,
50
+ redirect: "error",
51
+ ...local ? {} : { dispatcher: publicDispatcher }
52
+ });
53
+ };
54
+ }
55
+ //#endregion
56
+ export { createPluginHttpFetch };
@@ -1,3 +1,5 @@
1
+ import { parseUserTurnDocument, renderUserTurnDocument } from "../../../packages/gateway-contract/src/user-turn-document.js";
2
+ import { init_src } from "../../../packages/gateway-contract/src/index.js";
1
3
  import { getClarificationResumeInput } from "../../storage/sqlite/clarification-wait-repository.js";
2
4
  import { getConnectionResumeInput, init_connection_wait_repository } from "../../storage/sqlite/connection-wait-repository.js";
3
5
  import { init_agent_scope, resolveDefaultAgentId } from "../agent-scope.js";
@@ -21,6 +23,7 @@ import { isSuccessfulWebchatTtsToolEvent } from "./webchat-tts.js";
21
23
  //#region src/agent/service/process-direct-streaming.ts
22
24
  init_agent_session_key();
23
25
  init_agent_scope();
26
+ init_src();
24
27
  init_connection_wait_repository();
25
28
  const MAX_BUFFERED_STREAM_EVENTS = 512;
26
29
  const LOSSY_STREAM_EVENT_TYPES = new Set([
@@ -235,6 +238,17 @@ async function* runProcessDirectStreaming(deps, input) {
235
238
  }
236
239
  signal.addEventListener("abort", armAbort, { once: true });
237
240
  }
241
+ const sourceContexts = [...input.sourceContexts ?? []];
242
+ if (deps.sourceContextResolver) {
243
+ const metadata = await deps.sessionStore.getMetadata(conversationId).catch(() => null);
244
+ const sourceBinding = metadata?.customData && typeof metadata.customData === "object" ? metadata.customData.sourceBinding : void 0;
245
+ if (isSessionSourceBinding(sourceBinding)) {
246
+ const sourceContext = await deps.sourceContextResolver(sourceBinding, conversationId);
247
+ if (sourceContext && !sourceContexts.some((context) => context.kind === sourceContext.kind && context.sourceId === sourceContext.sourceId)) sourceContexts.push(sourceContext);
248
+ }
249
+ }
250
+ const userTurnDocument = parseUserTurnDocument(mergedUserText);
251
+ const authoredText = userTurnDocument ? renderUserTurnDocument(userTurnDocument, (refId) => sourceContexts.find((context) => context.refId === refId)?.title ?? null) : mergedUserText;
238
252
  const slash = await tryRunSlashCommand(deps, {
239
253
  conversationId,
240
254
  channel,
@@ -242,7 +256,7 @@ async function* runProcessDirectStreaming(deps, input) {
242
256
  senderId: context.senderId,
243
257
  isGroup: context.isGroup,
244
258
  inboundMetadata: context.metadata
245
- }, mergedUserText, {
259
+ }, authoredText, {
246
260
  skipResetCommands: resetTriggeredAtInit,
247
261
  emitEvent: (event) => {
248
262
  pushVisible({
@@ -274,25 +288,26 @@ async function* runProcessDirectStreaming(deps, input) {
274
288
  });
275
289
  return;
276
290
  }
277
- const skillTurn = deps.agentManager.prepareSkillTurn(conversationId, mergedUserText);
291
+ const skillTurn = deps.agentManager.prepareSkillTurn(conversationId, authoredText);
278
292
  const textForAgent = skillTurn.text;
279
- const userMessage = await deps.buildTranscriptUserMessage(textForAgent, prepared, conversationId, { suppressMediaPromptUris });
280
- const sourceContexts = [...input.sourceContexts ?? []];
281
- if (deps.sourceContextResolver) {
282
- const metadata = await deps.sessionStore.getMetadata(conversationId).catch(() => null);
283
- const sourceBinding = metadata?.customData && typeof metadata.customData === "object" ? metadata.customData.sourceBinding : void 0;
284
- if (isSessionSourceBinding(sourceBinding)) {
285
- const sourceContext = await deps.sourceContextResolver(sourceBinding, conversationId);
286
- if (sourceContext && !sourceContexts.some((context) => context.kind === sourceContext.kind && context.sourceId === sourceContext.sourceId)) sourceContexts.push(sourceContext);
293
+ const builtUserMessage = await deps.buildTranscriptUserMessage(textForAgent, prepared, conversationId, { suppressMediaPromptUris });
294
+ const userMessage = userTurnDocument ? {
295
+ ...builtUserMessage,
296
+ metadata: {
297
+ ...builtUserMessage.metadata ?? {},
298
+ userTurnDocument
287
299
  }
288
- }
300
+ } : builtUserMessage;
289
301
  if (channel === "webchat" && !isInternalResume) {
290
302
  pushVisible({
291
303
  type: "user_message",
292
304
  timestamp: userMessage.timestamp ?? Date.now(),
293
305
  content: readAgentMessageContent(userMessage),
294
306
  media: userMessage.media,
295
- metadata: sourceContexts.length > 0 ? { sourceContexts: sourceContexts.map(summarizeSourceContext) } : void 0
307
+ metadata: sourceContexts.length > 0 || userTurnDocument ? {
308
+ ...sourceContexts.length > 0 ? { sourceContexts: sourceContexts.map(summarizeSourceContext) } : {},
309
+ ...userTurnDocument ? { userTurnDocument } : {}
310
+ } : void 0
296
311
  });
297
312
  if (textForAgent.trim()) deps.enqueueProvisionalSessionTitle?.(conversationId, textForAgent);
298
313
  }
@@ -2,11 +2,11 @@ import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { parseNoteAttachmentTarget } from "../notes/attachment-ref.js";
4
4
  import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
5
+ import { applyConfigOverrides } from "../config/runtime-overrides.js";
5
6
  import { init_agent_scope, resolveAgentHomeDir, resolveDefaultAgentId } from "./agent-scope.js";
6
7
  import { init_agent_session_key, resolveAgentIdFromConversationId } from "../routing/agent-session-key.js";
7
- import { init_providers, resolveModel } from "../providers/index.js";
8
- import { applyConfigOverrides } from "../config/runtime-overrides.js";
9
8
  import { extractProfileAgentId } from "../config/agent-profile.js";
9
+ import { init_providers, resolveModel } from "../providers/index.js";
10
10
  import { extractTextContent } from "./context/workspace.js";
11
11
  import { effectiveWorkspacePathForSession } from "../session/session-workspace.js";
12
12
  import { getProjectForSession } from "../projects/workspace.js";
@@ -240,6 +240,7 @@ var AgentService = class {
240
240
  getProjectService: config.getProjectService,
241
241
  getWorkDiscovery: config.getWorkDiscovery,
242
242
  getLocalAppService: config.getLocalAppService,
243
+ getChatPreviewService: config.getChatPreviewService,
243
244
  dispatchTaskEvents: config.dispatchTaskEvents,
244
245
  dispatchTaskRuns: config.dispatchTaskRuns,
245
246
  getWorkflowRunService: config.getWorkflowRunService,
@@ -7,6 +7,7 @@ import type { ExtensionRegistryImpl as ExtensionRegistry } from '../extensions/i
7
7
  import type { NotesService } from '../notes/index.js';
8
8
  import type { ProjectService } from '../projects/index.js';
9
9
  import type { LocalAppService } from '../local-apps/index.js';
10
+ import type { ChatPreviewService } from '../chat-previews/index.js';
10
11
  import type { GatewayClarifyRequestFn } from './tools/clarify-tool.js';
11
12
  import type { AgentSourceContextResolver } from './source-context/types.js';
12
13
  import type { EndpointToolRuntime } from '../endpoint-tools/index.js';
@@ -37,6 +38,7 @@ export interface AgentServiceConfig {
37
38
  getProjectService?: () => ProjectService | undefined;
38
39
  getWorkDiscovery?: () => import('../work-discovery/service.js').WorkDiscoveryService | undefined;
39
40
  getLocalAppService?: () => LocalAppService | undefined;
41
+ getChatPreviewService?: () => ChatPreviewService | undefined;
40
42
  dispatchTaskEvents?: () => void;
41
43
  dispatchTaskRuns?: () => void;
42
44
  /**
@@ -1,8 +1,8 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
3
  import { init_workspace_defaults, resolveDefaultAgentWorkspaceDir } from "../../config/workspace-defaults.js";
4
- import { init_providers, resolveModel } from "../../providers/index.js";
5
4
  import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
5
+ import { init_providers, resolveModel } from "../../providers/index.js";
6
6
  import { getExecutionEnvironmentForSession } from "../../execution-environments/subject.js";
7
7
  import { effectiveWorkspacePathForSession, projectWorkspacePath } from "../../session/session-workspace.js";
8
8
  import { getProjectForSession } from "../../projects/workspace.js";
@@ -1,5 +1,5 @@
1
- import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
2
1
  import { init_paths, resolveSkillsLockPath } from "../../config/paths.js";
2
+ import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
3
3
  import { existsSync, readFileSync } from "node:fs";
4
4
  //#region src/agent/skills/hub-lock.ts
5
5
  /**
@@ -8,8 +8,8 @@ import { basename, dirname, join, normalize, resolve, sep } from "node:path";
8
8
  import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, statSync, writeFileSync } from "node:fs";
9
9
  import { fileURLToPath } from "node:url";
10
10
  import { execFileSync } from "node:child_process";
11
- import { fetch } from "undici";
12
11
  import AdmZip from "adm-zip";
12
+ import { fetch } from "undici";
13
13
  //#region src/agent/skills/hub-pull.ts
14
14
  /**
15
15
  * CLI / hub: install or update skills from git or archive (zip / tar.gz) into ~/.xopc/skills.
@@ -131,7 +131,14 @@ function discoverAndMergeSkills(sources, maxSkillFileBytes, limits = {}, initial
131
131
  const discoveredSkills = [];
132
132
  const diagnostics = [...initialDiagnostics];
133
133
  for (const source of sources) {
134
- const discovered = discoverSkills(source, maxSkillFileBytes, limits.maxSkillsLoadedPerSource, limits.maxCandidatesPerRoot);
134
+ const discovered = source.skillFiles ? {
135
+ skills: source.skillFiles.slice(0, limits.maxSkillsLoadedPerSource).flatMap((path) => {
136
+ const result = loadSkillFromFile(path, source, source.rootDir, maxSkillFileBytes);
137
+ if (result.diagnostic) diagnostics.push(result.diagnostic);
138
+ return result.skill ? [result.skill] : [];
139
+ }),
140
+ diagnostics: []
141
+ } : discoverSkills(source, maxSkillFileBytes, limits.maxSkillsLoadedPerSource, limits.maxCandidatesPerRoot);
135
142
  diagnostics.push(...discovered.diagnostics);
136
143
  for (const skill of discovered.skills) {
137
144
  discoveredSkills.push(skill);
@@ -19,6 +19,7 @@ export declare class SkillManager {
19
19
  private workspace;
20
20
  private bundledSkillsDir;
21
21
  private version;
22
+ private pluginRevision;
22
23
  private loadedAt;
23
24
  private reloadInProgress;
24
25
  private reloadPending;
@@ -60,6 +61,7 @@ export declare class SkillManager {
60
61
  * Get all loaded skills
61
62
  */
62
63
  getSkills(): Skill[];
64
+ private refreshPlugins;
63
65
  getDiagnostics(): SkillDiagnostic[];
64
66
  getVersion(): string;
65
67
  getLoadedAt(): number;
@@ -2,6 +2,7 @@ import { resolveStateDir } from "../../config/paths-state.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
4
  import { init_paths, resolveBundledSkillsDir } from "../../config/paths.js";
5
+ import { AgentPluginStore } from "../../extensions/agent-plugins/store.js";
5
6
  import { createSkillConfigManager, isSkillEnabled } from "./config.js";
6
7
  import { formatSkillsForPrompt, selectSkillsVisibleInPrompt } from "./format-skills-prompt.js";
7
8
  import { createSkillLoader } from "./index.js";
@@ -22,6 +23,7 @@ var SkillManager = class {
22
23
  workspace;
23
24
  bundledSkillsDir;
24
25
  version = 0;
26
+ pluginRevision = "";
25
27
  loadedAt = 0;
26
28
  reloadInProgress = false;
27
29
  reloadPending = false;
@@ -73,6 +75,7 @@ var SkillManager = class {
73
75
  try {
74
76
  const result = load();
75
77
  this.applyLoadResult(result);
78
+ this.pluginRevision = new AgentPluginStore().revisionKey();
76
79
  this.lastReloadOk = true;
77
80
  this.lastReloadError = void 0;
78
81
  log.info({
@@ -117,6 +120,7 @@ var SkillManager = class {
117
120
  * Get the skill prompt to append to system prompt
118
121
  */
119
122
  getPrompt() {
123
+ this.refreshPlugins();
120
124
  return this.skillPrompt;
121
125
  }
122
126
  /**
@@ -140,8 +144,12 @@ var SkillManager = class {
140
144
  * Get all loaded skills
141
145
  */
142
146
  getSkills() {
147
+ this.refreshPlugins();
143
148
  return [...this.skills];
144
149
  }
150
+ refreshPlugins() {
151
+ if (!this.reloadInProgress && this.pluginRevision !== new AgentPluginStore().revisionKey()) this.reload();
152
+ }
145
153
  getDiagnostics() {
146
154
  return this.skillLoader.getDiagnostics();
147
155
  }