@xopcai/xopc 0.0.368 → 0.0.370

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 (516) hide show
  1. package/README.md +59 -174
  2. package/README.zh-CN.md +59 -174
  3. package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/_md.js +131 -0
  4. package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/_u64.js +30 -0
  5. package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/sha2.js +252 -0
  6. package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js +16 -0
  7. package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js +66 -0
  8. package/dist/browser-ext/_locales/en/messages.json +30 -1
  9. package/dist/browser-ext/_locales/zh_CN/messages.json +30 -1
  10. package/dist/browser-ext/dist/assets/{auth-beGtbLPS.js → page-context-BeworyNB.js} +1331 -1355
  11. package/dist/browser-ext/dist/assets/{sidepanel-BT0ojEzG.css → sidepanel-Ccl0eSa1.css} +43 -0
  12. package/dist/browser-ext/dist/background.js +680 -182
  13. package/dist/browser-ext/dist/sidepanel.html +2 -2
  14. package/dist/browser-ext/dist/sidepanel.js +393 -194
  15. package/dist/browser-ext/manifest.json +2 -8
  16. package/dist/extensions/telegram/xopc.extension.json +1 -1
  17. package/dist/gateway/static/root/assets/{activity-store-D9ZMh5ZR.js → activity-store-BQ3PMp2q.js} +1 -1
  18. package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Bj3rvcTm.js → agent-avatar-dicebear-C61i1QbX.js} +1 -1
  19. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-0fCR1DHx.js +1 -0
  20. package/dist/gateway/static/root/assets/agent-plugin-dialog-Di99mUTT.js +1 -0
  21. package/dist/gateway/static/root/assets/agents-BRZZmYH_.js +66 -0
  22. package/dist/gateway/static/root/assets/{agents-admin-api-B5QDepbW.js → agents-admin-api-HBZvVyzF.js} +1 -1
  23. package/dist/gateway/static/root/assets/{app-management-settings-panel-2rTEtB_X.js → app-management-settings-panel-noqqxkds.js} +1 -1
  24. package/dist/gateway/static/root/assets/{appearance-settings-BPVBS80k.js → appearance-settings-DG8QN0gR.js} +1 -1
  25. package/dist/gateway/static/root/assets/{apps-page-1FuKlZYP.js → apps-page-CgiyzFYo.js} +1 -1
  26. package/dist/gateway/static/root/assets/{archive-plugin-BbT1O7oK.js → archive-plugin-BO3I9zRP.js} +1 -1
  27. package/dist/gateway/static/root/assets/{automations-page-DjwP_h8h.js → automations-page-CgAcRFDS.js} +1 -1
  28. package/dist/gateway/static/root/assets/automations-workspace-BIkxIpab.js +6 -0
  29. package/dist/gateway/static/root/assets/{binary-plugins-gS7Wg68v.js → binary-plugins-gFD7vH9R.js} +1 -1
  30. package/dist/gateway/static/root/assets/{block-editor-DbwMaivP.js → block-editor-B1VE-jAe.js} +2 -2
  31. package/dist/gateway/static/root/assets/browser-automation-inputs-DxRoKFun.js +1 -0
  32. package/dist/gateway/static/root/assets/browser-automations-page-CIjyMS6f.js +3 -0
  33. package/dist/gateway/static/root/assets/browser-settings-page-BMAivBfp.js +3 -0
  34. package/dist/gateway/static/root/assets/{capabilities-Lswa0hv8.js → capabilities-CY4SiHcP.js} +1 -1
  35. package/dist/gateway/static/root/assets/{capabilities-Dd1PZRQw.js → capabilities-gjQtMhKu.js} +1 -1
  36. package/dist/gateway/static/root/assets/capabilities-page-DRdcfo68.js +2 -0
  37. package/dist/gateway/static/root/assets/{capabilities-settings-panel-DTHR1DrJ.js → capabilities-settings-panel-ZuL6pWjM.js} +4 -4
  38. package/dist/gateway/static/root/assets/{capability-header-actions-494dnJsj.js → capability-header-actions-D0GC1FEv.js} +1 -1
  39. package/dist/gateway/static/root/assets/channels-CgE22Pzd.js +1 -0
  40. package/dist/gateway/static/root/assets/{chat-terminal-dock-Bl7-Zk-x.js → chat-terminal-dock-CEjh1utz.js} +2 -2
  41. package/dist/gateway/static/root/assets/{computer-settings-page-ByExKr_6.js → computer-settings-page-vFHJAmQr.js} +1 -1
  42. package/dist/gateway/static/root/assets/{connector-service-page-BK_5aFxO.js → connector-service-page-DTrwZ4kV.js} +1 -1
  43. package/dist/gateway/static/root/assets/connectors-page-DRcMiTWu.js +1 -0
  44. package/dist/gateway/static/root/assets/copy-text-row-C1gaJwlZ.js +1 -0
  45. package/dist/gateway/static/root/assets/{date-picker-BXJv6472.js → date-picker-NfGIPSYY.js} +1 -1
  46. package/dist/gateway/static/root/assets/dependency-picker-CqguveUi.js +1 -0
  47. package/dist/gateway/static/root/assets/{desktop-pet-DWNEC3mk.js → desktop-pet-CTx1zkJm.js} +1 -1
  48. package/dist/gateway/static/root/assets/{desktop-pet-settings-BYwlxGiN.js → desktop-pet-settings-BRDS3EGc.js} +1 -1
  49. package/dist/gateway/static/root/assets/{device-pairing-wizard-BAc4F35b.js → device-pairing-wizard-Du4Ciuyw.js} +1 -1
  50. package/dist/gateway/static/root/assets/{directory-picker-path-field-D26tSY8Z.js → directory-picker-path-field-CjstlxFl.js} +1 -1
  51. package/dist/gateway/static/root/assets/{extension-debug-page-xYIGNegB.js → extension-debug-page-BfAtjhoK.js} +1 -1
  52. package/dist/gateway/static/root/assets/{extension-page-BoQ1-3AW.js → extension-page-BJmudejr.js} +1 -1
  53. package/dist/gateway/static/root/assets/{extension-provider-Cw_JU6RR.js → extension-provider-Br6LXyIj.js} +1 -1
  54. package/dist/gateway/static/root/assets/{extension-settings-page-BH5TFGPe.js → extension-settings-page-UvmHniyz.js} +1 -1
  55. package/dist/gateway/static/root/assets/{fallback-models-04Wqmw14.js → fallback-models-euw9MGdt.js} +1 -1
  56. package/dist/gateway/static/root/assets/{gateway-config-swr-CNf0ZeRw.js → gateway-config-swr-7RKqgU_U.js} +1 -1
  57. package/dist/gateway/static/root/assets/gateway-realtime-F6D4A7N5.js +1 -0
  58. package/dist/gateway/static/root/assets/gateway-realtime-store-BheKaO6d.js +1 -0
  59. package/dist/gateway/static/root/assets/{gateway-settings-BqvCJVUC.js → gateway-settings-C7roPHh1.js} +1 -1
  60. package/dist/gateway/static/root/assets/{gateway-startup-retry-DIxHacUw.js → gateway-startup-retry-jiV5sbEX.js} +1 -1
  61. package/dist/gateway/static/root/assets/home-page-BGNCTtM3.js +2 -0
  62. package/dist/gateway/static/root/assets/{image-generation-api-CS0q0Kto.js → image-generation-api-DO4mXb6I.js} +1 -1
  63. package/dist/gateway/static/root/assets/{imports-page-n_rSLo6b.js → imports-page-DxCoT0VV.js} +1 -1
  64. package/dist/gateway/static/root/assets/index-BGBkIIzM.css +1 -0
  65. package/dist/gateway/static/root/assets/index-FCEE325-.js +106 -0
  66. package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-tVkrHbYF.js → keyboard-shortcuts-settings-CnLln9Ds.js} +1 -1
  67. package/dist/gateway/static/root/assets/{local-app-workbench-page-L8tYuas0.js → local-app-workbench-page-yXRkSrEj.js} +1 -1
  68. package/dist/gateway/static/root/assets/{local-apps-page-SSJ9B1bH.js → local-apps-page-D46buzTk.js} +1 -1
  69. package/dist/gateway/static/root/assets/local-session-drafts-pox8evDV.js +1 -0
  70. package/dist/gateway/static/root/assets/{locale-store-D6_rF-qT.js → locale-store-COVscAqC.js} +1 -1
  71. package/dist/gateway/static/root/assets/logs-page-DmcCHnH0.js +2 -0
  72. package/dist/gateway/static/root/assets/management-settings-khN1ThNL.js +1 -0
  73. package/dist/gateway/static/root/assets/{markdown-view-_xwUuKce.js → markdown-view-B_qnAcW2.js} +1 -1
  74. package/dist/gateway/static/root/assets/{media-plugins-C631CDu4.js → media-plugins-C0Pc-wSY.js} +1 -1
  75. package/dist/gateway/static/root/assets/messages-Bb2GK-Nj.js +3 -0
  76. package/dist/gateway/static/root/assets/models-hub-cache-DyPPksMP.js +1 -0
  77. package/dist/gateway/static/root/assets/note-detail-panel-C_t58yha.js +5 -0
  78. package/dist/gateway/static/root/assets/{notes-api-vIZWQ9Yt.js → notes-api-sBgBcyLW.js} +1 -1
  79. package/dist/gateway/static/root/assets/notes-page-BJ0QS6xx.js +8 -0
  80. package/dist/gateway/static/root/assets/{page-context-capture-button-BlPDM7GM.js → page-context-capture-button-DfRODHv1.js} +1 -1
  81. package/dist/gateway/static/root/assets/personal-page-CiiXwwQE.js +1 -0
  82. package/dist/gateway/static/root/assets/{product-open-page-BJjWvoER.js → product-open-page-_Bp6HRmm.js} +1 -1
  83. package/dist/gateway/static/root/assets/{product-preview-content-CEd4E7Gf.js → product-preview-content-BUdiO0Ct.js} +1 -1
  84. package/dist/gateway/static/root/assets/project-detail-page-Clb-fXYk.js +1 -0
  85. package/dist/gateway/static/root/assets/{projects-page-lszV8HuS.js → projects-page-D9JEEqhh.js} +1 -1
  86. package/dist/gateway/static/root/assets/{registry-api-uJnjqTcn.js → registry-api-Bh9UBb-f.js} +1 -1
  87. package/dist/gateway/static/root/assets/remote-access-hub-CmyTq3_l.js +1 -0
  88. package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-CjnNQYW8.js → runtime-tools-settings-panel-B1_inj8L.js} +1 -1
  89. package/dist/gateway/static/root/assets/{scenes-page-B3T3dDOR.js → scenes-page-CUNAZN2_.js} +2 -2
  90. package/dist/gateway/static/root/assets/{schema-form-DT3c4Vd_.js → schema-form-CfT-9UVw.js} +1 -1
  91. package/dist/gateway/static/root/assets/{send-session-input-CICkGwn-.js → send-session-input-BW40VHiL.js} +1 -1
  92. package/dist/gateway/static/root/assets/{session-api-BcQodoAu.js → session-api-yjpEz4pP.js} +1 -1
  93. package/dist/gateway/static/root/assets/session-manager-BqlvrjPE.js +16 -0
  94. package/dist/gateway/static/root/assets/sessions-page-CXZKScvu.js +1 -0
  95. package/dist/gateway/static/root/assets/settings-advanced-gate-B2vKXmzg.js +1 -0
  96. package/dist/gateway/static/root/assets/{settings-page-D-PZjcss.js → settings-page-1h3vyueg.js} +1 -1
  97. package/dist/gateway/static/root/assets/setup-status-panel-Cqc7UlZy.js +1 -0
  98. package/dist/gateway/static/root/assets/{share-link-dialog-CWS8EkJS.js → share-link-dialog-HCHM8qnf.js} +1 -1
  99. package/dist/gateway/static/root/assets/{share-preview-page-23NJAKiq.js → share-preview-page-Ce6FNWt1.js} +1 -1
  100. package/dist/gateway/static/root/assets/{shares-api-iKhHbvBD.js → shares-api-c0dfWz6h.js} +1 -1
  101. package/dist/gateway/static/root/assets/shares-settings-Dh5jisCK.js +1 -0
  102. package/dist/gateway/static/root/assets/{skill-api-C-MWdQwl.js → skill-api-deDZeQS8.js} +1 -1
  103. package/dist/gateway/static/root/assets/{skill-reload-api-iy02aB13.js → skill-reload-api-Ge5XymHa.js} +1 -1
  104. package/dist/gateway/static/root/assets/skills-page-DZozl9U_.js +2 -0
  105. package/dist/gateway/static/root/assets/system-settings-panel-CtzyMxqq.js +1 -0
  106. package/dist/gateway/static/root/assets/{task-detail-page-B2SIEyhZ.js → task-detail-page-5f_V0h-p.js} +2 -2
  107. package/dist/gateway/static/root/assets/{task-expandable-content-D2LRR4BC.js → task-expandable-content-hYcgCEE3.js} +1 -1
  108. package/dist/gateway/static/root/assets/{theme-store-BJfhz-Zq.js → theme-store-BOfCKgl6.js} +1 -1
  109. package/dist/gateway/static/root/assets/{tracing-settings-page-aHD56iaS.js → tracing-settings-page-DDWFXcST.js} +1 -1
  110. package/dist/gateway/static/root/assets/{tunnel-api-BCf8CfTC.js → tunnel-api-vMtlbJ-m.js} +1 -1
  111. package/dist/gateway/static/root/assets/{usage-page-B4XUkuJd.js → usage-page-B1-BCW8U.js} +1 -1
  112. package/dist/gateway/static/root/assets/{use-autosave-BnnTw9RE.js → use-autosave-CSckcjFx.js} +1 -1
  113. package/dist/gateway/static/root/assets/{use-composer-attachments-Itczg0y1.js → use-composer-attachments-DJya1hIL.js} +1 -1
  114. package/dist/gateway/static/root/assets/use-file-preview-expanded-C5ONO7sF.js +2 -0
  115. package/dist/gateway/static/root/assets/user-model-page-D4BSq9HJ.js +2 -0
  116. package/dist/gateway/static/root/assets/{voice-api-key-field-BphJku8x.js → voice-api-key-field-GEw5x2fU.js} +1 -1
  117. package/dist/gateway/static/root/assets/{voice-config-api-B4u4coFj.js → voice-config-api-3yyVwXln.js} +1 -1
  118. package/dist/gateway/static/root/assets/{work-discovery-overlay-jgOEP1xw.js → work-discovery-overlay-CjiNYJV5.js} +1 -1
  119. package/dist/gateway/static/root/assets/{workflow-run-setup-panel-N69crzRu.js → workflow-run-setup-panel-DJOetXvm.js} +2 -2
  120. package/dist/gateway/static/root/assets/workflows-page-CcAPFh2R.js +6 -0
  121. package/dist/gateway/static/root/assets/{workspace-api-Lzv6GDO8.js → workspace-api-WhbMvdBE.js} +2 -2
  122. package/dist/gateway/static/root/index.html +32 -34
  123. package/dist/package.js +1 -1
  124. package/dist/packages/browser-control-contract/src/automation.js +213 -0
  125. package/dist/packages/browser-control-contract/src/index.js +43 -12
  126. package/dist/packages/endpoint-tools-client/src/index.js +189 -0
  127. package/dist/packages/endpoint-tools-protocol/src/bridge.js +105 -0
  128. package/dist/packages/endpoint-tools-protocol/src/index.js +93 -2
  129. package/dist/packages/endpoint-tools-protocol/src/location.js +109 -0
  130. package/dist/packages/gateway-contract/src/gateway-scopes.js +3 -1
  131. package/dist/packages/gateway-contract/src/notifications.js +1 -0
  132. package/dist/packages/gateway-contract/src/session-input-command.js +30 -5
  133. package/dist/packages/realtime-protocol/src/voice.js +9 -3
  134. package/dist/src/agent/agent-manager.js +22 -26
  135. package/dist/src/agent/coding/repository-instructions.js +8 -1
  136. package/dist/src/agent/embedded/codemode-extension.d.ts +7 -0
  137. package/dist/src/agent/embedded/codemode-extension.js +232 -0
  138. package/dist/src/agent/embedded/codemode-output.d.ts +2 -0
  139. package/dist/src/agent/embedded/codemode-output.js +34 -0
  140. package/dist/src/agent/embedded/external-tool-discovery.d.ts +6 -0
  141. package/dist/src/agent/embedded/external-tool-discovery.js +60 -0
  142. package/dist/src/agent/embedded/model-runtime.js +5 -2
  143. package/dist/src/agent/embedded/run-for-session.js +10 -1
  144. package/dist/src/agent/embedded/run-turn.js +10 -3
  145. package/dist/src/agent/embedded/session-runner.d.ts +9 -1
  146. package/dist/src/agent/embedded/session-runner.js +111 -23
  147. package/dist/src/agent/embedded/session-tool-result-guard.d.ts +2 -0
  148. package/dist/src/agent/embedded/session-tool-result-guard.js +17 -0
  149. package/dist/src/agent/embedded/subscribe-session.js +14 -4
  150. package/dist/src/agent/embedded/tool-metadata.d.ts +15 -0
  151. package/dist/src/agent/embedded/tool-metadata.js +38 -0
  152. package/dist/src/agent/embedded/tool-search-extension.d.ts +5 -0
  153. package/dist/src/agent/embedded/tool-search-extension.js +31 -0
  154. package/dist/src/agent/embedded/types.d.ts +7 -0
  155. package/dist/src/agent/embedded/xopc-tools-bridge.js +6 -0
  156. package/dist/src/agent/external-tools/endpoint-provider.d.ts +1 -1
  157. package/dist/src/agent/external-tools/endpoint-provider.js +148 -56
  158. package/dist/src/agent/external-tools/extension-provider.js +8 -1
  159. package/dist/src/agent/external-tools/gateway-tools.d.ts +1 -1
  160. package/dist/src/agent/external-tools/gateway-tools.js +45 -22
  161. package/dist/src/agent/external-tools/index.js +46 -14
  162. package/dist/src/agent/external-tools/memory-provider.js +8 -1
  163. package/dist/src/agent/external-tools/read-policy.js +2 -1
  164. package/dist/src/agent/external-tools/service.d.ts +2 -0
  165. package/dist/src/agent/external-tools/service.js +25 -3
  166. package/dist/src/agent/external-tools/tool-registry.d.ts +14 -0
  167. package/dist/src/agent/external-tools/tool-registry.js +14 -0
  168. package/dist/src/agent/external-tools/types.d.ts +8 -1
  169. package/dist/src/agent/external-tools/types.js +0 -1
  170. package/dist/src/agent/mcp/config.d.ts +18 -0
  171. package/dist/src/agent/mcp/{bundle-mcp-config.js → config.js} +8 -25
  172. package/dist/src/agent/mcp/native-mcp.d.ts +6 -0
  173. package/dist/src/agent/mcp/native-mcp.js +73 -0
  174. package/dist/src/agent/service.js +2 -5
  175. package/dist/src/agent/skills/installer.js +1 -1
  176. package/dist/src/agent/skills/skill-manager.js +1 -1
  177. package/dist/src/agent/skills/skill-sources.js +1 -1
  178. package/dist/src/agent/source-context/index.d.ts +0 -1
  179. package/dist/src/agent/source-context/index.js +1 -2
  180. package/dist/src/agent/source-context/injector.js +1 -0
  181. package/dist/src/agent/source-context/types.d.ts +2 -2
  182. package/dist/src/agent/source-context/types.js +1 -1
  183. package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
  184. package/dist/src/agent/tool-manuals/browser.js +3 -3
  185. package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -1
  186. package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -13
  187. package/dist/src/agent/tools/browser/tool/schemas.js +0 -4
  188. package/dist/src/agent/tools/browser-automation-tool.d.ts +74 -1
  189. package/dist/src/agent/tools/browser-automation-tool.js +52 -6
  190. package/dist/src/agent/tools/cli-clarify.js +1 -1
  191. package/dist/src/agent/tools/codemode-permissions.d.ts +4 -0
  192. package/dist/src/agent/tools/codemode-permissions.js +23 -0
  193. package/dist/src/agent/tools/dataBatch.js +3 -1
  194. package/dist/src/agent/tools/delegation-parent-policy.js +1 -4
  195. package/dist/src/agent/tools/factory.js +4 -3
  196. package/dist/src/agent/transcript/provider-capabilities.js +0 -1
  197. package/dist/src/agent/transcript/transcript-policy.js +1 -2
  198. package/dist/src/agent-config/schema.d.ts +28 -0
  199. package/dist/src/agent-config/schema.js +7 -0
  200. package/dist/src/auth/credentials.js +7 -20
  201. package/dist/src/auth/model-credential-store.js +11 -4
  202. package/dist/src/auth/oauth/index.d.ts +1 -1
  203. package/dist/src/auth/oauth/index.js +3 -3
  204. package/dist/src/auth/oauth/openai.d.ts +2 -0
  205. package/dist/src/auth/oauth/openai.js +90 -0
  206. package/dist/src/auth/oauth/registry.js +3 -3
  207. package/dist/src/auth/oauth/types.d.ts +1 -0
  208. package/dist/src/auth/oauth/xopc-cloud.js +1 -1
  209. package/dist/src/auth/sync-provider-auth.js +5 -0
  210. package/dist/src/automations/capabilities/write.d.ts +2 -0
  211. package/dist/src/automations/domain/types.d.ts +11 -0
  212. package/dist/src/automations/domain/validation.d.ts +4 -0
  213. package/dist/src/automations/domain/validation.js +1 -0
  214. package/dist/src/automations/draft/automation-draft-validator.d.ts +1 -0
  215. package/dist/src/automations/service/action-executor.js +11 -3
  216. package/dist/src/automations/service/automation-service.d.ts +1 -0
  217. package/dist/src/automations/service/automation-service.js +13 -1
  218. package/dist/src/bootstrap/application-state.js +1 -1
  219. package/dist/src/browser/automations/repository.d.ts +4 -0
  220. package/dist/src/browser/automations/repository.js +27 -6
  221. package/dist/src/browser/automations/runner.js +101 -9
  222. package/dist/src/browser/automations/runtime-service.js +4 -3
  223. package/dist/src/browser/automations/schema.d.ts +84 -1
  224. package/dist/src/browser/automations/schema.js +68 -2
  225. package/dist/src/browser/automations/service.d.ts +78 -1
  226. package/dist/src/browser/automations/service.js +36 -4
  227. package/dist/src/browser/automations/types.d.ts +19 -4
  228. package/dist/src/browser/drivers/extension-driver.d.ts +5 -5
  229. package/dist/src/browser/drivers/extension-driver.js +10 -10
  230. package/dist/src/browser/drivers/playwright-driver.js +46 -0
  231. package/dist/src/browser/index.d.ts +1 -2
  232. package/dist/src/browser/index.js +2 -3
  233. package/dist/src/browser/policy/browser-policy.d.ts +0 -1
  234. package/dist/src/browser/policy/browser-policy.js +1 -4
  235. package/dist/src/browser/providers/index.d.ts +1 -1
  236. package/dist/src/browser/providers/index.js +2 -2
  237. package/dist/src/browser/providers/realtime-extension.d.ts +1 -1
  238. package/dist/src/browser/providers/realtime-extension.js +5 -1
  239. package/dist/src/browser/recordings/service.d.ts +22 -0
  240. package/dist/src/browser/recordings/service.js +160 -0
  241. package/dist/src/browser/runtime/browser-runtime.d.ts +1 -1
  242. package/dist/src/browser/runtime/browser-runtime.js +19 -56
  243. package/dist/src/chat-commands/builtins/model.js +2 -2
  244. package/dist/src/cli/command-manifest.js +1 -1
  245. package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
  246. package/dist/src/cli/commands/extension-agent-plugin.js +0 -19
  247. package/dist/src/cli/commands/mcp.js +36 -2
  248. package/dist/src/cli/commands/models.js +1 -1
  249. package/dist/src/cli/utils/oauth-login.js +2 -2
  250. package/dist/src/computer/runtime.js +2 -2
  251. package/dist/src/config/index.js +3 -3
  252. package/dist/src/config/mcp-config-normalize.d.ts +0 -3
  253. package/dist/src/config/mcp-config-normalize.js +2 -22
  254. package/dist/src/config/models-json.d.ts +0 -5
  255. package/dist/src/config/models-json.js +13 -4
  256. package/dist/src/config/paths.d.ts +0 -1
  257. package/dist/src/config/paths.js +1 -4
  258. package/dist/src/config/schema.d.ts +142 -48
  259. package/dist/src/config/schema.js +64 -47
  260. package/dist/src/connectors/auth-provider-registry.d.ts +1 -1
  261. package/dist/src/connectors/auth-provider-registry.js +1 -21
  262. package/dist/src/connectors/china-catalog.js +5 -5
  263. package/dist/src/connectors/connection-recovery-service.d.ts +1 -6
  264. package/dist/src/connectors/connection-recovery-service.js +3 -105
  265. package/dist/src/connectors/health.d.ts +1 -2
  266. package/dist/src/connectors/health.js +2 -101
  267. package/dist/src/connectors/types.d.ts +1 -1
  268. package/dist/src/endpoint-tools/binding-service.d.ts +2 -0
  269. package/dist/src/endpoint-tools/binding-service.js +14 -2
  270. package/dist/src/endpoint-tools/bridge-host.d.ts +15 -0
  271. package/dist/src/endpoint-tools/bridge-host.js +166 -0
  272. package/dist/src/endpoint-tools/bridge.d.ts +27 -0
  273. package/dist/src/endpoint-tools/bridge.js +88 -0
  274. package/dist/src/endpoint-tools/capability-catalog.d.ts +2 -0
  275. package/dist/src/endpoint-tools/capability-catalog.js +8 -0
  276. package/dist/src/endpoint-tools/grant-service.d.ts +69 -0
  277. package/dist/src/endpoint-tools/grant-service.js +113 -0
  278. package/dist/src/endpoint-tools/index.js +1 -1
  279. package/dist/src/endpoint-tools/invocation-service.js +6 -2
  280. package/dist/src/endpoint-tools/location-task.d.ts +22 -0
  281. package/dist/src/endpoint-tools/location-task.js +114 -0
  282. package/dist/src/endpoint-tools/policy.js +20 -4
  283. package/dist/src/endpoint-tools/registry.d.ts +2 -0
  284. package/dist/src/endpoint-tools/registry.js +9 -0
  285. package/dist/src/endpoint-tools/result-projector.d.ts +15 -0
  286. package/dist/src/endpoint-tools/result-projector.js +31 -0
  287. package/dist/src/endpoint-tools/runtime.d.ts +2 -0
  288. package/dist/src/endpoint-tools/runtime.js +15 -2
  289. package/dist/src/endpoint-tools/target-resolver.d.ts +12 -0
  290. package/dist/src/endpoint-tools/target-resolver.js +27 -0
  291. package/dist/src/endpoint-tools/turn-context.d.ts +6 -0
  292. package/dist/src/endpoint-tools/turn-context.js +29 -0
  293. package/dist/src/extensions/agent-plugins/auth.d.ts +0 -2
  294. package/dist/src/extensions/agent-plugins/auth.js +2 -19
  295. package/dist/src/extensions/agent-plugins/credentials.js +3 -19
  296. package/dist/src/extensions/agent-plugins/inventory.d.ts +2 -2
  297. package/dist/src/extensions/agent-plugins/mcp-adapter.js +1 -5
  298. package/dist/src/extensions/agent-plugins/source-http-fetch.d.ts +2 -0
  299. package/dist/src/{agent/mcp/plugin-http-fetch.js → extensions/agent-plugins/source-http-fetch.js} +7 -7
  300. package/dist/src/extensions/agent-plugins/sources.js +2 -2
  301. package/dist/src/extensions/agent-plugins/store.js +1 -3
  302. package/dist/src/extensions/agent-plugins/validation.d.ts +0 -4
  303. package/dist/src/extensions/agent-plugins/validation.js +13 -20
  304. package/dist/src/gateway/agents-admin.d.ts +5 -0
  305. package/dist/src/gateway/agents-admin.js +56 -1
  306. package/dist/src/gateway/chat-stream/mapper.js +9 -0
  307. package/dist/src/gateway/chat-stream/protocol.d.ts +4 -4
  308. package/dist/src/gateway/hono/lib/config-payload.d.ts +9 -4
  309. package/dist/src/gateway/hono/lib/config-payload.js +2 -5
  310. package/dist/src/gateway/hono/oauth-async.js +9 -2
  311. package/dist/src/gateway/hono/routes/agent-plugins.js +4 -9
  312. package/dist/src/gateway/hono/routes/agents.js +4 -3
  313. package/dist/src/gateway/hono/routes/browser-automations.js +23 -7
  314. package/dist/src/gateway/hono/routes/browser-recordings.d.ts +3 -0
  315. package/dist/src/gateway/hono/routes/browser-recordings.js +78 -0
  316. package/dist/src/gateway/hono/routes/browser.js +1 -34
  317. package/dist/src/gateway/hono/routes/connection-waits.js +2 -5
  318. package/dist/src/gateway/hono/routes/connectors.js +5 -60
  319. package/dist/src/gateway/hono/routes/device-authorizations.d.ts +3 -0
  320. package/dist/src/gateway/hono/routes/device-authorizations.js +74 -0
  321. package/dist/src/gateway/hono/routes/device-push.js +1 -0
  322. package/dist/src/gateway/hono/routes/endpoint-compatibility.js +7 -0
  323. package/dist/src/gateway/hono/routes/endpoint-tools.d.ts +1 -0
  324. package/dist/src/gateway/hono/routes/endpoint-tools.js +53 -3
  325. package/dist/src/gateway/hono/routes/home.js +1 -1
  326. package/dist/src/gateway/hono/routes/lazy-bundles.js +25 -1
  327. package/dist/src/gateway/hono/routes/mcp.d.ts +1 -1
  328. package/dist/src/gateway/hono/routes/mcp.js +11 -237
  329. package/dist/src/gateway/hono/routes/personal-agent.js +35 -0
  330. package/dist/src/gateway/hono/routes/session-command-handler.js +11 -1
  331. package/dist/src/gateway/hono/routes/session-input-handler.d.ts +8 -2
  332. package/dist/src/gateway/hono/routes/session-input-handler.js +25 -1
  333. package/dist/src/gateway/hono/routes/voice.js +5 -2
  334. package/dist/src/gateway/security/gateway-scopes.js +3 -1
  335. package/dist/src/gateway/service/agent-runner.js +1 -0
  336. package/dist/src/gateway/service/config-coordinator.js +2 -5
  337. package/dist/src/gateway/service/marketplace-service.js +2 -2
  338. package/dist/src/gateway/service/run-gateway-agent.js +13 -5
  339. package/dist/src/gateway/service/session-input-coordinator.d.ts +1 -1
  340. package/dist/src/gateway/service/session-input-coordinator.js +29 -9
  341. package/dist/src/gateway/service/sessions-api.js +0 -6
  342. package/dist/src/gateway/service.js +3 -12
  343. package/dist/src/gateway/session-reset-service.js +0 -6
  344. package/dist/src/home-intelligence/generator.d.ts +2 -0
  345. package/dist/src/home-intelligence/generator.js +53 -4
  346. package/dist/src/home-intelligence/host.d.ts +2 -1
  347. package/dist/src/home-intelligence/host.js +23 -3
  348. package/dist/src/imports/compatibility.js +12 -10
  349. package/dist/src/mcp/channel-bridge.js +1 -1
  350. package/dist/src/migrations/cloud-public-models.js +1 -0
  351. package/dist/src/notifications/clarification.d.ts +5 -0
  352. package/dist/src/notifications/clarification.js +66 -0
  353. package/dist/src/notifications/device-store.js +1 -0
  354. package/dist/src/notifications/harmony-push.d.ts +1 -0
  355. package/dist/src/notifications/harmony-push.js +3 -1
  356. package/dist/src/notifications/planner.d.ts +1 -0
  357. package/dist/src/notifications/service.d.ts +2 -2
  358. package/dist/src/notifications/service.js +20 -4
  359. package/dist/src/notifications/store.d.ts +2 -0
  360. package/dist/src/notifications/store.js +7 -1
  361. package/dist/src/notifications/types.d.ts +1 -0
  362. package/dist/src/notifications/types.js +1 -0
  363. package/dist/src/providers/env-keys.js +1 -1
  364. package/dist/src/providers/index.js +26 -24
  365. package/dist/src/providers/model-call.d.ts +0 -2
  366. package/dist/src/providers/model-call.js +2 -6
  367. package/dist/src/providers/model-registry.js +4 -2
  368. package/dist/src/providers/model-supplements.d.ts +3 -3
  369. package/dist/src/providers/model-supplements.js +6 -27
  370. package/dist/src/providers/presentation.js +3 -8
  371. package/dist/src/providers/prompt-cache-plan.js +1 -1
  372. package/dist/src/providers/provider-auth-service.d.ts +1 -1
  373. package/dist/src/providers/provider-auth-service.js +7 -2
  374. package/dist/src/providers/provider-policy.d.ts +3 -0
  375. package/dist/src/providers/provider-policy.js +14 -0
  376. package/dist/src/providers/register-runtime-providers.js +6 -1
  377. package/dist/src/realtime/runtime.js +1 -1
  378. package/dist/src/session/store.js +7 -1
  379. package/dist/src/session/transcript-events.d.ts +5 -0
  380. package/dist/src/session/transcript-events.js +1 -0
  381. package/dist/src/session/types.d.ts +2 -0
  382. package/dist/src/storage/sqlite/clarification-wait-repository.js +1 -0
  383. package/dist/src/storage/sqlite/device-grant-audit-repository.d.ts +11 -0
  384. package/dist/src/storage/sqlite/device-grant-audit-repository.js +10 -0
  385. package/dist/src/storage/sqlite/endpoint-device-settings-repository.d.ts +7 -0
  386. package/dist/src/storage/sqlite/endpoint-device-settings-repository.js +17 -0
  387. package/dist/src/storage/sqlite/migrations/238_browser_record_replay.sql +45 -0
  388. package/dist/src/storage/sqlite/migrations/239_clarification_notifications.sql +26 -0
  389. package/dist/src/storage/sqlite/migrations/240_device_settings.sql +5 -0
  390. package/dist/src/storage/sqlite/migrations/241_device_grant_audit.sql +13 -0
  391. package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
  392. package/dist/src/storage/sqlite/migrations/runner.js +3 -3
  393. package/dist/src/storage/sqlite/schema.js +1 -1
  394. package/dist/src/storage/sqlite/session-input-repository.d.ts +1 -0
  395. package/dist/src/storage/sqlite/session-input-repository.js +5 -1
  396. package/dist/src/tasks/home-query-service.d.ts +1 -1
  397. package/dist/src/tasks/home-query-service.js +6 -2
  398. package/dist/src/tui/backends/gateway-realtime-backend.js +1 -1
  399. package/dist/src/tui/xopc-tui-keybindings.d.ts +4 -4
  400. package/dist/src/voice/dashscope/streaming-tts-stream.d.ts +2 -1
  401. package/dist/src/voice/dashscope/streaming-tts-stream.js +135 -79
  402. package/dist/src/voice/realtime/agentEngine.js +78 -1
  403. package/dist/src/voice/realtime/speakable-segmenter.d.ts +2 -0
  404. package/dist/src/voice/realtime/speakable-segmenter.js +30 -0
  405. package/dist/src/voice/tts/providers/alibaba-speech.js +17 -1
  406. package/dist/src/voice/tts/speak-core.d.ts +3 -0
  407. package/dist/src/voice/tts/speak-core.js +21 -1
  408. package/dist/src/voice/tts/speech-provider-types.d.ts +8 -0
  409. package/package.json +18 -7
  410. package/dist/gateway/static/root/assets/agent-defaults-settings-panel-D0tD3kCe.js +0 -1
  411. package/dist/gateway/static/root/assets/agent-plugin-dialog-BjdgKCnk.js +0 -1
  412. package/dist/gateway/static/root/assets/agents-CWXKzX5L.js +0 -66
  413. package/dist/gateway/static/root/assets/automations-workspace-C9ZT6TAU.js +0 -6
  414. package/dist/gateway/static/root/assets/browser-automation-inputs-CXG_JveC.js +0 -1
  415. package/dist/gateway/static/root/assets/browser-automations-page-CJc7OKR3.js +0 -3
  416. package/dist/gateway/static/root/assets/browser-settings-page-BjaTEUR8.js +0 -3
  417. package/dist/gateway/static/root/assets/capabilities-page-djBsC_tG.js +0 -2
  418. package/dist/gateway/static/root/assets/channels-BaYRJtz3.js +0 -1
  419. package/dist/gateway/static/root/assets/connectors-page-DyqRwSH2.js +0 -2
  420. package/dist/gateway/static/root/assets/copy-text-row-BHDs3cBa.js +0 -1
  421. package/dist/gateway/static/root/assets/dependency-picker-CWbbhKZa.js +0 -1
  422. package/dist/gateway/static/root/assets/dist-Che_jiQF.js +0 -1
  423. package/dist/gateway/static/root/assets/gateway-realtime-C4KtwMY3.js +0 -1
  424. package/dist/gateway/static/root/assets/gateway-realtime-store-ChZUzVbe.js +0 -1
  425. package/dist/gateway/static/root/assets/home-page-DhPPLbdD.js +0 -2
  426. package/dist/gateway/static/root/assets/index-CK4O2xMa.css +0 -1
  427. package/dist/gateway/static/root/assets/index-DpLD-7Hc.js +0 -106
  428. package/dist/gateway/static/root/assets/link-2-D_ZKYUW7.js +0 -1
  429. package/dist/gateway/static/root/assets/local-session-drafts-B_McurIj.js +0 -1
  430. package/dist/gateway/static/root/assets/logs-page-BWD63eg1.js +0 -2
  431. package/dist/gateway/static/root/assets/management-settings-aKSibklM.js +0 -1
  432. package/dist/gateway/static/root/assets/messages-Bnx3GMDB.js +0 -3
  433. package/dist/gateway/static/root/assets/models-hub-cache-Di83uIPw.js +0 -1
  434. package/dist/gateway/static/root/assets/note-detail-panel-B_fve3_2.js +0 -5
  435. package/dist/gateway/static/root/assets/notes-page-DnChyp8S.js +0 -8
  436. package/dist/gateway/static/root/assets/personal-page-BM2qAgg_.js +0 -1
  437. package/dist/gateway/static/root/assets/project-detail-page-DM4_VLNX.js +0 -1
  438. package/dist/gateway/static/root/assets/remote-access-hub-O6j9CWX0.js +0 -1
  439. package/dist/gateway/static/root/assets/session-manager-B0tOE4qz.js +0 -16
  440. package/dist/gateway/static/root/assets/sessions-page-BIixHXlQ.js +0 -1
  441. package/dist/gateway/static/root/assets/settings-advanced-gate-49SUEWPh.js +0 -1
  442. package/dist/gateway/static/root/assets/setup-status-panel-Ce3gTbT3.js +0 -1
  443. package/dist/gateway/static/root/assets/shares-settings-CNEZjF66.js +0 -1
  444. package/dist/gateway/static/root/assets/skills-page-BndNdYsJ.js +0 -2
  445. package/dist/gateway/static/root/assets/system-settings-panel-EpZeMlvp.js +0 -1
  446. package/dist/gateway/static/root/assets/use-file-preview-expanded-DJ5vyrvM.js +0 -2
  447. package/dist/gateway/static/root/assets/user-model-page-Bz5lkFG9.js +0 -2
  448. package/dist/gateway/static/root/assets/workflows-page-CPCgOfHh.js +0 -6
  449. package/dist/src/agent/embedded/system-prompt-override.d.ts +0 -2
  450. package/dist/src/agent/embedded/system-prompt-override.js +0 -21
  451. package/dist/src/agent/external-tools/mcp-provider.d.ts +0 -32
  452. package/dist/src/agent/external-tools/mcp-provider.js +0 -208
  453. package/dist/src/agent/mcp/bundle-mcp-config.d.ts +0 -20
  454. package/dist/src/agent/mcp/bundle-mcp-gateway.d.ts +0 -79
  455. package/dist/src/agent/mcp/bundle-mcp-gateway.js +0 -93
  456. package/dist/src/agent/mcp/bundle-mcp-names.d.ts +0 -1
  457. package/dist/src/agent/mcp/bundle-mcp-names.js +0 -25
  458. package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +0 -1
  459. package/dist/src/agent/mcp/bundle-mcp-policy.js +0 -6
  460. package/dist/src/agent/mcp/bundle-mcp-runtime.d.ts +0 -46
  461. package/dist/src/agent/mcp/bundle-mcp-runtime.js +0 -571
  462. package/dist/src/agent/mcp/bundle-mcp-tools.d.ts +0 -2
  463. package/dist/src/agent/mcp/bundle-mcp-tools.js +0 -2
  464. package/dist/src/agent/mcp/bundle-mcp-types.d.ts +0 -76
  465. package/dist/src/agent/mcp/bundle-mcp-types.js +0 -1
  466. package/dist/src/agent/mcp/embedded-mcp.d.ts +0 -10
  467. package/dist/src/agent/mcp/embedded-mcp.js +0 -14
  468. package/dist/src/agent/mcp/index.d.ts +0 -5
  469. package/dist/src/agent/mcp/index.js +0 -12
  470. package/dist/src/agent/mcp/mcp-config-shared.d.ts +0 -8
  471. package/dist/src/agent/mcp/mcp-config-shared.js +0 -39
  472. package/dist/src/agent/mcp/mcp-http.d.ts +0 -23
  473. package/dist/src/agent/mcp/mcp-http.js +0 -67
  474. package/dist/src/agent/mcp/mcp-resource-id.d.ts +0 -6
  475. package/dist/src/agent/mcp/mcp-resource-id.js +0 -19
  476. package/dist/src/agent/mcp/mcp-stdio-transport.d.ts +0 -26
  477. package/dist/src/agent/mcp/mcp-stdio-transport.js +0 -120
  478. package/dist/src/agent/mcp/mcp-stdio.d.ts +0 -18
  479. package/dist/src/agent/mcp/mcp-stdio.js +0 -35
  480. package/dist/src/agent/mcp/mcp-transport-config.d.ts +0 -28
  481. package/dist/src/agent/mcp/mcp-transport-config.js +0 -91
  482. package/dist/src/agent/mcp/mcp-transport.d.ts +0 -17
  483. package/dist/src/agent/mcp/mcp-transport.js +0 -141
  484. package/dist/src/agent/mcp/oauth/index.d.ts +0 -6
  485. package/dist/src/agent/mcp/oauth/index.js +0 -6
  486. package/dist/src/agent/mcp/oauth/mcp-oauth-errors.d.ts +0 -5
  487. package/dist/src/agent/mcp/oauth/mcp-oauth-errors.js +0 -14
  488. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.d.ts +0 -30
  489. package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +0 -276
  490. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.d.ts +0 -33
  491. package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +0 -103
  492. package/dist/src/agent/mcp/oauth/mcp-oauth-session.d.ts +0 -31
  493. package/dist/src/agent/mcp/oauth/mcp-oauth-session.js +0 -181
  494. package/dist/src/agent/mcp/oauth/mcp-oauth-store.d.ts +0 -12
  495. package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +0 -91
  496. package/dist/src/agent/mcp/oauth/mcp-oauth-types.d.ts +0 -22
  497. package/dist/src/agent/mcp/oauth/mcp-oauth-types.js +0 -1
  498. package/dist/src/agent/mcp/plugin-http-fetch.d.ts +0 -2
  499. package/dist/src/agent/source-context/mcp-resource-context.d.ts +0 -8
  500. package/dist/src/agent/source-context/mcp-resource-context.js +0 -30
  501. package/dist/src/auth/oauth/openai-codex.d.ts +0 -9
  502. package/dist/src/auth/oauth/openai-codex.js +0 -414
  503. package/dist/src/browser/policy/approval-store.d.ts +0 -17
  504. package/dist/src/browser/policy/approval-store.js +0 -62
  505. package/dist/src/browser/providers/extension-ws-acquire.d.ts +0 -19
  506. package/dist/src/browser/providers/extension-ws-acquire.js +0 -78
  507. package/dist/src/browser/providers/extension.d.ts +0 -61
  508. package/dist/src/browser/providers/extension.js +0 -378
  509. package/dist/src/connectors/plugin-mcp-recovery.d.ts +0 -28
  510. package/dist/src/connectors/plugin-mcp-recovery.js +0 -90
  511. package/dist/src/extensions/agent-plugins/connection.d.ts +0 -8
  512. package/dist/src/extensions/agent-plugins/connection.js +0 -41
  513. package/dist/src/extensions/agent-plugins/health.d.ts +0 -4
  514. package/dist/src/extensions/agent-plugins/health.js +0 -48
  515. package/dist/src/extensions/agent-plugins/plugin-oauth-scope.d.ts +0 -1
  516. package/dist/src/extensions/agent-plugins/plugin-oauth-scope.js +0 -8
@@ -1,6 +1,7 @@
1
1
  import { createLogger } from "../../../utils/logger/index.js";
2
2
  import { init_logger } from "../../../utils/logger.js";
3
3
  import { browserPageContextsInputSchema } from "../../../../packages/gateway-contract/src/browser-page-context.js";
4
+ import { endpointContextSchema } from "../../../../packages/gateway-contract/src/session-input-command.js";
4
5
  import { parseUserTurnDocument, userTurnDocumentRefIds } from "../../../../packages/gateway-contract/src/user-turn-document.js";
5
6
  import { init_src } from "../../../../packages/gateway-contract/src/index.js";
6
7
  import { endpointTurnClaimSchema, init_src as init_src$1 } from "../../../../packages/endpoint-tools-protocol/src/index.js";
@@ -15,6 +16,7 @@ import { commandRegistry } from "../../../chat-commands/registry.js";
15
16
  import "../../../chat-commands/index.js";
16
17
  import { isVoiceLikeAttachment } from "../../../channels/attachments/voice-stt-webchat.js";
17
18
  import { parseTurnContextRefs } from "../../../agent/source-context/types.js";
19
+ import { deviceTurnSourceContext, endpointClaimBelongsToPrincipal } from "../../../endpoint-tools/turn-context.js";
18
20
  import { withModelConfigLock } from "../../../session/model-config-lock.js";
19
21
  import { getGatewayPrincipal } from "../../security/gateway-principal.js";
20
22
  import { browserPageContextToAgentContext } from "../../../agent/source-context/browser-page.js";
@@ -127,6 +129,21 @@ async function submitSessionInput(c, deps, conversationId, options) {
127
129
  message: "Endpoint connection is not active"
128
130
  }
129
131
  }, 401);
132
+ if (!endpointClaimBelongsToPrincipal(deps.service.endpointTools.registry, origin.data.endpointId, getGatewayPrincipal(c))) return c.json({
133
+ ok: false,
134
+ error: {
135
+ code: "FORBIDDEN",
136
+ message: "Endpoint does not belong to the authenticated device"
137
+ }
138
+ }, 403);
139
+ const environment = endpointContextSchema.optional().safeParse(body.endpointContext);
140
+ if (!environment.success) return c.json({
141
+ ok: false,
142
+ error: {
143
+ code: "BAD_REQUEST",
144
+ message: "Invalid device context"
145
+ }
146
+ }, 400);
130
147
  if (browserContexts.data.length && deps.service.endpointTools.registry.get(origin.data.endpointId)?.kind !== "browser") return c.json({
131
148
  ok: false,
132
149
  error: {
@@ -176,7 +193,7 @@ async function submitSessionInput(c, deps, conversationId, options) {
176
193
  }, 409);
177
194
  }
178
195
  }
179
- const sourceContexts = browserContexts.data.map(browserPageContextToAgentContext);
196
+ const sourceContexts = [deviceTurnSourceContext(deps.service.endpointTools.registry.get(origin.data.endpointId), environment.data), ...browserContexts.data.map(browserPageContextToAgentContext)];
180
197
  if (body.appContext !== void 0) try {
181
198
  sourceContexts.push(await deps.service.prepareSessionAppContext(body.appContext, getGatewayPrincipal(c), conversationId, typeof body.clientMessageId === "string" ? body.clientMessageId.trim() : ""));
182
199
  } catch (error) {
@@ -300,6 +317,13 @@ async function replaceLatestSessionTurn(c, deps, conversationId, targetTurnId) {
300
317
  message: "Endpoint connection is not active"
301
318
  }
302
319
  }, 401);
320
+ if (!endpointClaimBelongsToPrincipal(deps.service.endpointTools.registry, origin.data.endpointId, getGatewayPrincipal(c))) return c.json({
321
+ ok: false,
322
+ error: {
323
+ code: "FORBIDDEN",
324
+ message: "Endpoint does not belong to the authenticated device"
325
+ }
326
+ }, 403);
303
327
  return withModelConfigLock(conversationId, async () => {
304
328
  if (deps.service.voiceRealtime?.hasConversation(conversationId)) return c.json({
305
329
  ok: false,
@@ -1,5 +1,5 @@
1
1
  import { voiceSelectionSchema } from "../../../../packages/realtime-protocol/src/voice-catalog.js";
2
- import { createVoiceSessionRequestSchema, init_voice } from "../../../../packages/realtime-protocol/src/voice.js";
2
+ import { VOICE_TIMING_METRICS, createVoiceSessionRequestSchema, init_voice } from "../../../../packages/realtime-protocol/src/voice.js";
3
3
  import { getDefaultModelSync, init_providers, resolveModel } from "../../../providers/index.js";
4
4
  import { isPersonalConversation } from "../../../personal-agent/repository.js";
5
5
  import { completeWithResolvedCredentials } from "../../../providers/model-call.js";
@@ -312,7 +312,10 @@ function registerVoiceRoutes(authenticated, deps) {
312
312
  }, 409);
313
313
  if (action === "preflight") {
314
314
  await service.voiceRealtime.preflight(parsed.data);
315
- return c.json({ ok: true });
315
+ return c.json({
316
+ ok: true,
317
+ timingMetrics: VOICE_TIMING_METRICS
318
+ });
316
319
  }
317
320
  const principal = getGatewayPrincipal(c);
318
321
  const create = () => service.voiceRealtime.createSession(parsed.data, principal.principalId);
@@ -20,7 +20,9 @@ function requiredGatewayScope(method, path) {
20
20
  if (path.startsWith("/api/endpoint-tools")) return "device.self";
21
21
  if (path === "/api/personal-agent/activity") return "tasks.read";
22
22
  if (path === "/api/personal-agent" || path.startsWith("/api/personal-agent/")) return methodScope(method, "sessions.read", "sessions.write");
23
- if (path.startsWith("/api/browser/tab-bindings") || path.startsWith("/api/browser/approvals")) return methodScope(method, "sessions.read", "sessions.write");
23
+ if (path.startsWith("/api/browser/recordings/")) return "device.self";
24
+ if (path.startsWith("/api/browser/automations") || path.startsWith("/api/browser/automation-runs")) return methodScope(method, "automations.read", "automations.write");
25
+ if (path.startsWith("/api/browser/tab-bindings")) return methodScope(method, "sessions.read", "sessions.write");
24
26
  if (method === "GET" && path === "/api/connectors/approvals") return "sessions.read";
25
27
  if (method === "POST" && path === "/api/connectors/approvals/respond") return "sessions.write";
26
28
  if (path === "/api/agent" || path.startsWith("/api/agent/")) return "agents.run";
@@ -397,6 +397,7 @@ var GatewayAgentRunner = class {
397
397
  suggestedAnswer: request.suggestedAnswer,
398
398
  approvalKey: request.approvalKey
399
399
  });
400
+ this.opts.emit("clarification.created", wait);
400
401
  const event = {
401
402
  type: "clarify_request",
402
403
  requestId: wait.id,
@@ -3,9 +3,8 @@ import { init_logger } from "../../utils/logger.js";
3
3
  import { configureTracing } from "../../observability/runtime.js";
4
4
  import { getModelRegistry } from "../../providers/model-registry.js";
5
5
  import { init_providers } from "../../providers/index.js";
6
- import { disposeAllSessionMcpRuntimes } from "../../agent/mcp/bundle-mcp-runtime.js";
6
+ import { evictAllEmbeddedSessionRunners } from "../../agent/embedded/session-runner.js";
7
7
  import { reloadImageGenerationProviders } from "../../agent/image/generation/provider-registry.js";
8
- import "../../agent/mcp/bundle-mcp-tools.js";
9
8
  import { loadConfig, saveConfig } from "../../config/loader.js";
10
9
  import { ConfigHotReloader } from "../../config/reload.js";
11
10
  import "../../config/index.js";
@@ -280,9 +279,7 @@ var GatewayConfigCoordinator = class {
280
279
  handleMcpReload(newConfig) {
281
280
  log.debug("Reloading MCP config...");
282
281
  this.opts.setConfig(newConfig);
283
- disposeAllSessionMcpRuntimes().catch((err) => {
284
- log.warn({ err }, "MCP runtime dispose on config reload failed");
285
- });
282
+ evictAllEmbeddedSessionRunners("mcp_config_reload");
286
283
  this.opts.emit("config.reload", { section: "mcp" });
287
284
  log.debug("MCP config reloaded");
288
285
  }
@@ -5,10 +5,10 @@ import { init_agent_scope, resolveDefaultAgentId } from "../../agent/agent-scope
5
5
  import { init_paths, resolveExtensionsDir } from "../../config/paths.js";
6
6
  import { removeSkillsLockEntry } from "../../agent/skills/hub-lock.js";
7
7
  import { deleteManagedSkill, installSkillFromZip, listManagedSkillDirs } from "../../agent/skills/managed-store.js";
8
- import { getExtensionLockfileManager } from "../../extensions/lockfile.js";
9
- import { AgentPluginStore } from "../../extensions/agent-plugins/store.js";
10
8
  import { createSkillConfigManager } from "../../agent/skills/config.js";
11
9
  import { resolveWorkspaceSkillsDir, resolveWorkspaceSkillsLockPath } from "../../agent/skills/workspace-skills-dir.js";
10
+ import { getExtensionLockfileManager } from "../../extensions/lockfile.js";
11
+ import { AgentPluginStore } from "../../extensions/agent-plugins/store.js";
12
12
  import { normalizeSkillInstallTarget } from "../../agent/skills/install-target.js";
13
13
  import { isAgentPluginArchive, withAgentPluginArchive } from "../../extensions/agent-plugins/sources.js";
14
14
  import { existsSync, rmSync } from "node:fs";
@@ -1,6 +1,8 @@
1
1
  import { inboundCorrelationMetadataFromAsyncLogContext, updateAsyncLogContext } from "../../utils/logger/context.js";
2
2
  import { createLogger } from "../../utils/logger/index.js";
3
3
  import { init_logger } from "../../utils/logger.js";
4
+ import { parseTurnOutcome } from "../../../packages/gateway-contract/src/turn-outcome.js";
5
+ import { init_src } from "../../../packages/gateway-contract/src/index.js";
4
6
  import { init_session_input_repository, listTaskUpdateTriggers } from "../../storage/sqlite/session-input-repository.js";
5
7
  import { init_clarification_wait_repository, isClarificationSuspended } from "../../storage/sqlite/clarification-wait-repository.js";
6
8
  import { updateInteractionStateFromMessage } from "../../storage/sqlite/interaction-state-repository.js";
@@ -23,6 +25,7 @@ import crypto from "crypto";
23
25
  //#region src/gateway/service/run-gateway-agent.ts
24
26
  init_connection_wait_repository();
25
27
  init_clarification_wait_repository();
28
+ init_src();
26
29
  init_logger();
27
30
  init_session_key();
28
31
  init_sqlite();
@@ -165,6 +168,7 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
165
168
  });
166
169
  }
167
170
  let streamError;
171
+ let embeddedAborted = false;
168
172
  try {
169
173
  const eventStream = agentService.turnDispatcher.processDirectStreaming(stampedMessage, conversationId, origin, prepared, thinking, {
170
174
  signal: mergedSignal,
@@ -182,22 +186,26 @@ async function* runGatewayAgent(deps, message, channel, chatId, origin, attachme
182
186
  }
183
187
  });
184
188
  const mappedEvents = (async function* () {
185
- for await (const event of eventStream) yield* mapper.map(event);
189
+ for await (const event of eventStream) {
190
+ if (event.type === "turn_outcome" && parseTurnOutcome(event.outcome)?.summary === "aborted") embeddedAborted = true;
191
+ yield* mapper.map(event);
192
+ }
186
193
  })();
187
194
  for await (const event of coalesceThinkingDeltas(mappedEvents)) yield* emitAndYield([event]);
188
195
  const connectionSuspended = isConnectionSuspended(conversationId, runId);
189
196
  const clarificationSuspended = isClarificationSuspended(conversationId, runId);
190
197
  const suspended = connectionSuspended || clarificationSuspended;
191
- const endStatus = mergedSignal.aborted ? "cancelled" : suspended ? "suspended" : "success";
192
- const endSummary = mergedSignal.aborted ? "Interrupted" : connectionSuspended ? "Waiting for connection" : clarificationSuspended ? "Waiting for user input" : "Message processed successfully";
193
- taskRunStatus = mergedSignal.aborted ? "cancelled" : "succeeded";
198
+ const cancelled = mergedSignal.aborted || embeddedAborted;
199
+ const endStatus = cancelled ? "cancelled" : suspended ? "suspended" : "success";
200
+ const endSummary = cancelled ? "Interrupted" : connectionSuspended ? "Waiting for connection" : clarificationSuspended ? "Waiting for user input" : "Message processed successfully";
201
+ taskRunStatus = cancelled ? "cancelled" : "succeeded";
194
202
  terminalStatus = endStatus;
195
203
  taskRunSummary = endSummary;
196
204
  yield* emitAndYield(mapper.end(endStatus, endSummary));
197
205
  completeRealtimeTopic(`run:${runId}`);
198
206
  runTopicCompleted = true;
199
207
  return {
200
- status: mergedSignal.aborted ? "aborted" : suspended ? "suspended" : "ok",
208
+ status: cancelled ? "aborted" : suspended ? "suspended" : "ok",
201
209
  summary: endSummary
202
210
  };
203
211
  } catch (error) {
@@ -1,5 +1,5 @@
1
1
  import type { TurnOrigin } from '@xopcai/endpoint-tools-protocol';
2
- import type { SessionInput } from '../../storage/sqlite/session-input-repository.js';
2
+ import { type SessionInput } from '../../storage/sqlite/session-input-repository.js';
3
3
  import type { UserTurnAttachment } from '../user-turn-input.js';
4
4
  import { type AgentSourceContext, type TurnContextRef } from '../../agent/source-context/types.js';
5
5
  import { type SessionInputDelivery, type SessionInputState } from '../../storage/sqlite/index.js';
@@ -1,19 +1,20 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
- import { SessionInstanceChangedError, cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "../../storage/sqlite/session-input-repository.js";
3
+ import { SessionInstanceChangedError, cancelQueuedSessionInput, claimNextSessionInput, findSessionInput, findSessionInputByRunId, finishSessionInputRun, getSessionInputById, getSessionInputState, init_session_input_repository, insertSessionInput, mutateQueuedSessionInput, recoverSessionInputState, setSessionInputStatus } from "../../storage/sqlite/session-input-repository.js";
4
4
  import { consumeClarificationResume, init_clarification_wait_repository, supersedeActiveClarification } from "../../storage/sqlite/clarification-wait-repository.js";
5
5
  import { replaceLatestSessionTurnAndQueueInput, validateLatestSessionTurnTarget } from "../../storage/sqlite/session-turn-replace-repository.js";
6
6
  import { cancelConnectionObjective, consumeConnectionResume, init_connection_wait_repository, invalidateConnectionResumeIntent, publishConnectionWait } from "../../storage/sqlite/connection-wait-repository.js";
7
7
  import { init_sqlite } from "../../storage/sqlite/index.js";
8
8
  import { summarizeSourceContext } from "../../agent/source-context/types.js";
9
+ import { injectSourceContextsIntoUserMessage } from "../../agent/source-context/injector.js";
9
10
  import { deleteMediaUrisNoLongerReferenced } from "../../media/session-references.js";
10
11
  import { fitSourceContextsToBudget } from "../../agent/source-context/budget.js";
11
12
  import crypto from "node:crypto";
12
13
  import { isDeepStrictEqual } from "node:util";
13
14
  //#region src/gateway/service/session-input-coordinator.ts
15
+ init_session_input_repository();
14
16
  init_connection_wait_repository();
15
17
  init_clarification_wait_repository();
16
- init_session_input_repository();
17
18
  init_sqlite();
18
19
  init_logger();
19
20
  const log = createLogger("SessionInputCoordinator");
@@ -23,10 +24,23 @@ function sameAppContext(input, existing) {
23
24
  snapshot: source.appContext,
24
25
  principal: source.appContextGrant?.principal.principalId
25
26
  })) ?? [];
26
- return isDeepStrictEqual(identity(input.sourceContexts), identity(existing.contextSnapshots));
27
+ return isDeepStrictEqual(input.origin, existing.origin) && isDeepStrictEqual(identity(input.sourceContexts), identity(existing.contextSnapshots));
28
+ }
29
+ function canSteerContexts(state, origin, contexts) {
30
+ if (!contexts?.length) return true;
31
+ const active = state.activeInputId ? getSessionInputById(state.conversationId, state.activeInputId) : void 0;
32
+ return Boolean(active && isDeepStrictEqual(active.origin, origin) && contexts.every((context) => context.kind === "device_context"));
33
+ }
34
+ function steeringText(content, contexts) {
35
+ if (!contexts?.length) return content;
36
+ return injectSourceContextsIntoUserMessage({
37
+ role: "user",
38
+ content,
39
+ timestamp: Date.now()
40
+ }, contexts).content[0].text;
27
41
  }
28
42
  function contextRefsMatchFrozenSnapshot(requested, frozen) {
29
- const editable = frozen?.filter((ref) => ref.kind === "note" || ref.kind === "task" || ref.kind === "file" || ref.kind === "session" || ref.kind === "browser_tab" || ref.kind === "mcp_resource" || ref.kind === "user_assertion") ?? [];
43
+ const editable = frozen?.filter((ref) => ref.kind === "note" || ref.kind === "task" || ref.kind === "file" || ref.kind === "session" || ref.kind === "browser_tab" || ref.kind === "user_assertion") ?? [];
30
44
  if (requested.length !== editable.length) return false;
31
45
  return requested.every((ref, index) => {
32
46
  const snapshot = editable[index];
@@ -74,13 +88,13 @@ var SessionInputCoordinator = class {
74
88
  this.prioritizeAcceptedInput(row, state);
75
89
  return;
76
90
  }
77
- if (row.requestedDelivery !== "steer" || !state.activeRunId || row.attachments?.length || row.contextSnapshots?.length || state.preparation && state.preparation.state !== "ready") return;
91
+ if (row.requestedDelivery !== "steer" || !state.activeRunId || row.attachments?.length || !canSteerContexts(state, row.origin, row.contextSnapshots) || state.preparation && state.preparation.state !== "ready") return;
78
92
  setSessionInputStatus(row.id, "injecting", {
79
93
  effectiveDelivery: "steer",
80
94
  targetRunId: state.activeRunId
81
95
  });
82
96
  try {
83
- if (!await this.deps.steer(row.conversationId, row.content)) setSessionInputStatus(row.id, "queued", {
97
+ if (!await this.deps.steer(row.conversationId, steeringText(row.content, row.contextSnapshots))) setSessionInputStatus(row.id, "queued", {
84
98
  effectiveDelivery: "next",
85
99
  targetRunId: null
86
100
  });
@@ -180,6 +194,7 @@ var SessionInputCoordinator = class {
180
194
  };
181
195
  const existing = findSessionInput(conversationId, clientMessageId);
182
196
  if (existing) {
197
+ input.origin = existing.origin;
183
198
  if (!sameAppContext(input, existing)) return {
184
199
  ok: false,
185
200
  code: "CONTEXT_UNAVAILABLE"
@@ -192,6 +207,11 @@ var SessionInputCoordinator = class {
192
207
  }
193
208
  const target = validateLatestSessionTurnTarget(conversationId, targetTurnId);
194
209
  if (target.ok === false) return target;
210
+ const original = findSessionInputByRunId(conversationId, targetTurnId);
211
+ if (original) {
212
+ input.origin = original.origin;
213
+ input.sourceContexts = [...(input.sourceContexts ?? []).filter((source) => source.kind !== "device_context"), ...(original.contextSnapshots ?? []).filter((source) => source.kind === "device_context")];
214
+ }
195
215
  const attachments = await this.deps.prepareAttachments(conversationId, input.attachments);
196
216
  let sourceContexts;
197
217
  try {
@@ -284,7 +304,7 @@ var SessionInputCoordinator = class {
284
304
  }
285
305
  const runtime = this.snapshot(conversationId);
286
306
  const priority = input.interrupt !== false && this.deps.prioritizeInput?.(input) === true;
287
- const canSteer = !priority && input.delivery === "steer" && runtime.activeRunId !== void 0 && !attachments?.length && !sourceContexts?.length;
307
+ const canSteer = !priority && input.delivery === "steer" && runtime.activeRunId !== void 0 && !attachments?.length && canSteerContexts(runtime, input.origin, sourceContexts);
288
308
  const effectiveDelivery = canSteer ? "steer" : "next";
289
309
  const row = insertSessionInput({
290
310
  expectedTranscriptId: input.expectedTranscriptId,
@@ -314,7 +334,7 @@ var SessionInputCoordinator = class {
314
334
  };
315
335
  }
316
336
  if (canSteer) {
317
- if (!await this.deps.steer(conversationId, content)) {
337
+ if (!await this.deps.steer(conversationId, steeringText(content, sourceContexts))) {
318
338
  setSessionInputStatus(row.id, "queued", {
319
339
  effectiveDelivery: "next",
320
340
  targetRunId: null
@@ -414,7 +434,7 @@ var SessionInputCoordinator = class {
414
434
  const existing = getSessionInputById(conversationId, id);
415
435
  if (!contextRefsMatchFrozenSnapshot(body.contextRefs, existing?.contextRefs)) try {
416
436
  const resolved = await this.deps.prepareContexts(conversationId, body.contextRefs) ?? [];
417
- sourceContexts = fitSourceContextsToBudget([...existing?.contextSnapshots?.filter((source) => source.kind === "app_context" || source.kind === "browser_page") ?? [], ...resolved]);
437
+ sourceContexts = fitSourceContextsToBudget([...existing?.contextSnapshots?.filter((source) => source.kind === "app_context" || source.kind === "browser_page" || source.kind === "device_context") ?? [], ...resolved]);
418
438
  } catch (err) {
419
439
  log.warn({
420
440
  err,
@@ -1,9 +1,7 @@
1
1
  import { init_agent_session_key, resolveAgentIdFromConversationId } from "../../routing/agent-session-key.js";
2
2
  import { isPersonalConversation } from "../../personal-agent/repository.js";
3
- import { retireSessionMcpRuntimeForConversationId } from "../../agent/mcp/bundle-mcp-runtime.js";
4
3
  import { buildSessionTimeline } from "../../session/transcript-outline.js";
5
4
  import { transcriptRowsToClientHistory } from "../../session/client-history.js";
6
- import "../../agent/mcp/bundle-mcp-tools.js";
7
5
  import { collectMediaUrisFromValues, deleteMediaUris } from "../../media/session-references.js";
8
6
  import { withModelConfigLock } from "../../session/model-config-lock.js";
9
7
  import { publicExecutionDetail } from "../../session/execution-detail.js";
@@ -180,10 +178,6 @@ var GatewaySessionsApi = class {
180
178
  if (result) {
181
179
  await deleteMediaUris(collectMediaUrisFromValues(transcriptRows));
182
180
  this.opts.getAgentService().evictSessionAgent(key);
183
- await retireSessionMcpRuntimeForConversationId({
184
- conversationId: key,
185
- reason: "session-delete"
186
- });
187
181
  }
188
182
  return { deleted: result };
189
183
  }
@@ -34,7 +34,6 @@ import "../knowledge-memory/index.js";
34
34
  import { getPersonalAgentByConversation } from "../personal-agent/repository.js";
35
35
  import { TaskConversationRepository } from "../tasks/task-conversation-repository.js";
36
36
  import { getEmbeddedExecutionSession } from "../agent/embedded/execution-context.js";
37
- import { disposeAllSessionMcpRuntimes } from "../agent/mcp/bundle-mcp-runtime.js";
38
37
  import { DomainOutboxDispatcher } from "../infra/domain-outbox-dispatcher.js";
39
38
  import { ProjectService } from "../projects/project-service.js";
40
39
  import { resolveProjectAgentId } from "../projects/project-agent.js";
@@ -44,6 +43,7 @@ import { runMemoryMaintenance } from "../memory-maintenance/service.js";
44
43
  import "../memory-maintenance/index.js";
45
44
  import { RealtimeExtensionBrowserProvider } from "../browser/providers/realtime-extension.js";
46
45
  import { onSessionTranscriptUpdate } from "../session/transcript-events.js";
46
+ import { drainEmbeddedSessionRunnerShutdowns, evictAllEmbeddedSessionRunners } from "../agent/embedded/session-runner.js";
47
47
  import { buildNoteAgentContext } from "../notes/agent-context.js";
48
48
  import { NotesStore } from "../notes/store.js";
49
49
  import { NotesService } from "../notes/service.js";
@@ -56,7 +56,6 @@ import { createProductDispatcher } from "../capabilities/runtime/product.js";
56
56
  import "../automations/index.js";
57
57
  import { TaskRunDispatcher } from "../tasks/task-run-dispatcher.js";
58
58
  import "../tasks/index.js";
59
- import "../agent/mcp/bundle-mcp-tools.js";
60
59
  import { areExtensionsGloballyDisabled } from "../extensions/discover-extensions.js";
61
60
  import { SessionIndex } from "../session/manager.js";
62
61
  import "../session/index.js";
@@ -103,7 +102,6 @@ import { createBackgroundTask } from "../infra/background-task.js";
103
102
  import { buildTaskAgentContext } from "../agent/source-context/task-context.js";
104
103
  import { buildFileAgentContext } from "../agent/source-context/file-context.js";
105
104
  import { buildSessionAgentContext } from "../agent/source-context/session-context.js";
106
- import { buildMcpResourceAgentContext } from "../agent/source-context/mcp-resource-context.js";
107
105
  import { buildBrowserTabAgentContext } from "../agent/source-context/browser-tab.js";
108
106
  import { buildUserAssertionAgentContext } from "../agent/source-context/user-assertion-context.js";
109
107
  import { WorkDiscoveryService } from "../work-discovery/service.js";
@@ -538,12 +536,6 @@ var GatewayService = class {
538
536
  const [metadata, messages] = await Promise.all([this.sessionIndex.getSessionMetadata(ref.sourceId), this.sessionIndex.getStore().loadMessages(ref.sourceId)]);
539
537
  return buildSessionAgentContext(metadata, messages, ref.expectedVersion);
540
538
  }
541
- if (ref.kind === "mcp_resource") return buildMcpResourceAgentContext({
542
- workspaceDir: this.currentWorkspacePath,
543
- config: this.config,
544
- sourceId: ref.sourceId,
545
- expectedVersion: ref.expectedVersion
546
- });
547
539
  if (ref.kind === "browser_tab") {
548
540
  const binding = getBrowserTabBindingById(ref.sourceId);
549
541
  if (!binding || binding.conversationId !== conversationId || ref.expectedVersion && ref.expectedVersion !== binding.documentId) return null;
@@ -1596,9 +1588,8 @@ var GatewayService = class {
1596
1588
  registerClarificationChannelRuntime(null);
1597
1589
  this.connectionRecovery.stop();
1598
1590
  this.agentRunner.disposeClarifications();
1599
- await disposeAllSessionMcpRuntimes().catch((err) => {
1600
- log.warn({ err }, "MCP runtime shutdown failed");
1601
- });
1591
+ evictAllEmbeddedSessionRunners("gateway_stop");
1592
+ await drainEmbeddedSessionRunnerShutdowns();
1602
1593
  await this._agentService?.stop();
1603
1594
  this.running = false;
1604
1595
  this.bus.shutdown();
@@ -1,9 +1,7 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
3
  import { isPersonalConversation } from "../personal-agent/repository.js";
4
- import { retireSessionMcpRuntimeForConversationId } from "../agent/mcp/bundle-mcp-runtime.js";
5
4
  import { abortEmbeddedRun } from "../agent/embedded/runs.js";
6
- import "../agent/mcp/bundle-mcp-tools.js";
7
5
  //#region src/gateway/session-reset-service.ts
8
6
  init_logger();
9
7
  const log = createLogger("SessionReset");
@@ -30,10 +28,6 @@ async function performSessionReset(conversationId, deps) {
30
28
  };
31
29
  try {
32
30
  deps.getAgentService().evictSessionAgent(key);
33
- await retireSessionMcpRuntimeForConversationId({
34
- conversationId: key,
35
- reason: "session-reset"
36
- });
37
31
  } catch (err) {
38
32
  const em = err instanceof Error ? err.message : String(err);
39
33
  log.warn({
@@ -109,6 +109,8 @@ export declare const HomeModelResultSchema: z.ZodDiscriminatedUnion<[z.ZodObject
109
109
  }, z.core.$strict>], "state">;
110
110
  export type HomeModelCandidate = z.infer<typeof HomeModelCandidateSchema>;
111
111
  export type HomeModelResult = z.infer<typeof HomeModelResultSchema>;
112
+ /** Check prose rather than identifiers so English evidence cannot override Chinese output. */
113
+ export declare function isHomeProseLocalized(values: readonly string[], locale: HomeContextSnapshot['locale']): boolean;
112
114
  export interface HomeModelGeneration {
113
115
  result: HomeModelResult;
114
116
  modelRef: string;
@@ -102,7 +102,8 @@ function buildSystemPrompt(locale) {
102
102
  "Prefer outcomes over feature promotion. Mention a connector or skill only when it materially enables the outcome.",
103
103
  "When useful work remains possible without a missing capability, provide degradedActionPrompt using only supplied evidence.",
104
104
  "External writes always require user confirmation.",
105
- `Write only user-visible prose values such as title, rationale, steps, and prompts in ${locale === "zh" ? "Simplified Chinese" : "English"}. Machine values listed above must remain in English.`
105
+ `Write all user-visible prose values (title, outcome, rationale, proposedSteps, verification, actionPrompt, degradedActionPrompt, question, and option labels) in ${locale === "zh" ? "Simplified Chinese" : "English"}. Machine values listed above must remain in English. Translate English source material into the requested language; keep technical identifiers and proper names intact.`,
106
+ "Use plain text in prose values. Do not HTML-encode characters or include HTML markup."
106
107
  ].join("\n");
107
108
  }
108
109
  function extractHomeResponseText(response) {
@@ -126,6 +127,54 @@ function parseJson(raw) {
126
127
  }
127
128
  throw new Error("Home intelligence model did not return valid JSON");
128
129
  }
130
+ function decodeProse(value) {
131
+ const named = {
132
+ amp: "&",
133
+ lt: "<",
134
+ gt: ">",
135
+ quot: "\"",
136
+ apos: "'",
137
+ nbsp: " "
138
+ };
139
+ return value.replace(/&(#x[0-9a-f]+|#\d+|amp|lt|gt|quot|apos|nbsp);/gi, (entity, code) => {
140
+ if (!code.startsWith("#")) return named[code.toLowerCase()] ?? entity;
141
+ const point = code.toLowerCase().startsWith("#x") ? parseInt(code.slice(2), 16) : Number(code.slice(1));
142
+ return point > 0 && point <= 1114111 && !(point >= 55296 && point <= 57343) ? String.fromCodePoint(point) : entity;
143
+ });
144
+ }
145
+ /** Check prose rather than identifiers so English evidence cannot override Chinese output. */
146
+ function isHomeProseLocalized(values, locale) {
147
+ return locale !== "zh" || values.every((value) => !/[a-z]/i.test(value) || /\p{Script=Han}/u.test(value));
148
+ }
149
+ function parseLocalizedResult(raw, locale) {
150
+ const result = HomeModelResultSchema.parse(parseJson(raw));
151
+ const prose = [];
152
+ if (result.state === "ready") for (const candidate of result.candidates) {
153
+ candidate.title = decodeProse(candidate.title);
154
+ candidate.outcome = decodeProse(candidate.outcome);
155
+ candidate.rationale = decodeProse(candidate.rationale);
156
+ candidate.proposedSteps = candidate.proposedSteps.map(decodeProse);
157
+ candidate.verification = candidate.verification.map(decodeProse);
158
+ candidate.actionPrompt = decodeProse(candidate.actionPrompt);
159
+ if (candidate.degradedActionPrompt) candidate.degradedActionPrompt = decodeProse(candidate.degradedActionPrompt);
160
+ prose.push(candidate.title, candidate.outcome, candidate.rationale, candidate.actionPrompt);
161
+ prose.push(...[
162
+ ...candidate.proposedSteps,
163
+ ...candidate.verification,
164
+ candidate.degradedActionPrompt ?? ""
165
+ ].filter((value) => (value.match(/[a-z]+/gi)?.length ?? 0) >= 3));
166
+ }
167
+ else if (result.state === "clarification") {
168
+ result.question = decodeProse(result.question);
169
+ result.options = result.options.map((option) => ({
170
+ ...option,
171
+ label: decodeProse(option.label)
172
+ }));
173
+ prose.push(result.question, ...result.options.map((option) => option.label).filter((value) => (value.match(/[a-z]+/gi)?.length ?? 0) >= 3));
174
+ }
175
+ if (!isHomeProseLocalized(prose, locale)) throw new Error("User-visible prose must be in Simplified Chinese; translate English source material while preserving identifiers and evidence IDs");
176
+ return result;
177
+ }
129
178
  function validationSummary(error) {
130
179
  if (!(error instanceof z.ZodError)) return error instanceof Error ? error.message : String(error);
131
180
  return error.issues.slice(0, 20).map((issue) => `${issue.path.join(".") || "<root>"}: ${issue.message}`).join("; ");
@@ -194,7 +243,7 @@ var HomeAdviceGenerator = class {
194
243
  const raw = extractHomeResponseText(response);
195
244
  let result;
196
245
  try {
197
- result = HomeModelResultSchema.parse(parseJson(raw));
246
+ result = parseLocalizedResult(raw, snapshot.locale);
198
247
  } catch (firstError) {
199
248
  const correction = {
200
249
  role: "user",
@@ -221,7 +270,7 @@ var HomeAdviceGenerator = class {
221
270
  trigger: "retry"
222
271
  });
223
272
  try {
224
- result = HomeModelResultSchema.parse(parseJson(extractHomeResponseText(corrected)));
273
+ result = parseLocalizedResult(extractHomeResponseText(corrected), snapshot.locale);
225
274
  } catch (correctionError) {
226
275
  throw new Error(`Home intelligence model returned invalid structured JSON after correction: ${validationSummary(correctionError)}`);
227
276
  }
@@ -239,4 +288,4 @@ var HomeAdviceGenerator = class {
239
288
  }
240
289
  };
241
290
  //#endregion
242
- export { HomeAdviceBudgetExceededError, HomeAdviceGenerator, HomeModelCandidateSchema, HomeModelResultSchema };
291
+ export { HomeAdviceBudgetExceededError, HomeAdviceGenerator, HomeModelCandidateSchema, HomeModelResultSchema, isHomeProseLocalized };
@@ -35,12 +35,13 @@ export declare class HomeIntelligenceHost {
35
35
  private stopped;
36
36
  private abortController;
37
37
  private localeHint;
38
+ private advisorLocale;
38
39
  private contextRefreshTimer?;
39
40
  private readonly pendingContextReasons;
40
41
  constructor(db: DatabaseSync, deps: HomeIntelligenceHostDeps);
41
42
  start(): void;
42
43
  stop(): void;
43
- getAdvisor(): HomeAdvisor;
44
+ getAdvisor(locale?: string): HomeAdvisor;
44
45
  getMetrics(since?: number): HomeAdviceMetrics;
45
46
  getHistory(): HomeOpportunityHistoryItem[];
46
47
  requestRefresh(reason: HomeGenerationReason, idempotencyKey?: string, locale?: string): string;
@@ -1,6 +1,6 @@
1
1
  import { createLogger } from "../utils/logger/index.js";
2
2
  import { init_logger } from "../utils/logger.js";
3
- import { HomeAdviceBudgetExceededError } from "./generator.js";
3
+ import { HomeAdviceBudgetExceededError, isHomeProseLocalized } from "./generator.js";
4
4
  import { homePatternKey } from "./strategy.js";
5
5
  import { HomeAdvicePolicy } from "./policy.js";
6
6
  import { HomeIntelligenceRepository } from "./repository.js";
@@ -39,6 +39,7 @@ var HomeIntelligenceHost = class {
39
39
  stopped = false;
40
40
  abortController = new AbortController();
41
41
  localeHint;
42
+ advisorLocale;
42
43
  contextRefreshTimer;
43
44
  pendingContextReasons = /* @__PURE__ */ new Set();
44
45
  constructor(db, deps) {
@@ -47,6 +48,7 @@ var HomeIntelligenceHost = class {
47
48
  this.opportunities = new HomeOpportunityApplicationService(db, deps.principal, () => deps.capabilities().agentId);
48
49
  this.now = deps.now ?? Date.now;
49
50
  this.localeHint = deps.locale();
51
+ this.advisorLocale = this.localeHint;
50
52
  }
51
53
  start() {
52
54
  if (this.timer) return;
@@ -65,9 +67,26 @@ var HomeIntelligenceHost = class {
65
67
  this.contextRefreshTimer = void 0;
66
68
  this.pendingContextReasons.clear();
67
69
  }
68
- getAdvisor() {
70
+ getAdvisor(locale) {
69
71
  if (this.deps.enabled?.() === false) return { state: "disabled" };
70
- return this.repository.getAdvisor(this.deps.principal, this.now());
72
+ if (locale) {
73
+ const requestedLocale = locale.toLowerCase().startsWith("zh") ? "zh" : "en";
74
+ if (requestedLocale !== this.localeHint) this.requestRefresh("manual_refresh", `locale:${requestedLocale}:${this.now()}`, requestedLocale);
75
+ }
76
+ const advisor = this.repository.getAdvisor(this.deps.principal, this.now());
77
+ const prose = advisor.state === "ready" ? [advisor.primary, ...advisor.alternatives].flatMap((item) => [
78
+ item.title,
79
+ item.outcome,
80
+ item.rationale
81
+ ]) : advisor.state === "clarification" ? [advisor.question.question] : [];
82
+ if (prose.length > 0 && this.advisorLocale !== this.localeHint || !isHomeProseLocalized(prose, this.localeHint)) return advisor.state === "ready" && advisor.stale ? {
83
+ state: "refreshing",
84
+ requestedAt: this.now()
85
+ } : {
86
+ state: "quiet",
87
+ reason: "generation_failed"
88
+ };
89
+ return advisor;
71
90
  }
72
91
  getMetrics(since = Math.max(0, this.now() - 720 * 60 * 6e4)) {
73
92
  return this.repository.getMetrics(this.deps.principal, since, this.now());
@@ -251,6 +270,7 @@ var HomeIntelligenceHost = class {
251
270
  outcomeReason: result.state === "quiet" ? result.reason : result.state,
252
271
  completedAt
253
272
  });
273
+ this.advisorLocale = snapshot.locale;
254
274
  this.deps.publish("home.advisor.updated", {
255
275
  state: result.state,
256
276
  completedAt
@@ -115,8 +115,12 @@ function inspectMcp(base, name, raw) {
115
115
  "env",
116
116
  "headers",
117
117
  "http_headers",
118
- "startup_timeout_sec",
119
- "tool_timeout_sec"
118
+ "tool_timeout_sec",
119
+ "timeout",
120
+ "exposure",
121
+ "toolExposure",
122
+ "description",
123
+ "enabled"
120
124
  ]);
121
125
  for (const [key, v] of Object.entries(value)) {
122
126
  if (!supported.has(key)) {
@@ -131,14 +135,12 @@ function inspectMcp(base, name, raw) {
131
135
  ].includes(key)) {
132
136
  if (v && typeof v === "object") item.requiredEnv.push(...Object.keys(v));
133
137
  item.findings.push(`${key} values omitted; configure them in xopc`);
134
- } else if (key === "type") {
135
- if (v === "http") draft.transport = "streamable-http";
136
- else if (v === "sse") draft.transport = "sse";
137
- else if (v !== "stdio") {
138
- item.compatibility = "blocked";
139
- item.findings.push("Unsupported MCP transport");
140
- }
141
- } else if (key === "startup_timeout_sec" || key === "tool_timeout_sec") if (typeof v === "number") draft[key === "startup_timeout_sec" ? "connectionTimeoutMs" : "requestTimeoutMs"] = v * 1e3;
138
+ } else if (key === "type") if (v === "http" || v === "streamable-http" || v === "stdio") draft.type = v;
139
+ else {
140
+ item.compatibility = "blocked";
141
+ item.findings.push("Unsupported MCP transport");
142
+ }
143
+ else if (key === "tool_timeout_sec") if (typeof v === "number") draft.timeout = v;
142
144
  else {
143
145
  item.compatibility = "blocked";
144
146
  item.findings.push("Invalid MCP timeout");