@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,3 +1,5 @@
1
+ import { browserDom } from "../../../packages/browser-control-contract/src/automation.js";
2
+ import "../../../packages/browser-control-contract/src/index.js";
1
3
  import { verifyBrowserExpectation } from "../verification/expectation.js";
2
4
  import { randomUUID } from "node:crypto";
3
5
  //#region src/browser/drivers/playwright-driver.ts
@@ -174,6 +176,47 @@ var PlaywrightDriver = class {
174
176
  try {
175
177
  throwIfAborted(signal);
176
178
  const state = await this.activeState(sessionId);
179
+ if (input.action === "resolve") {
180
+ const resolved = await state.page.evaluate(browserDom, {
181
+ operation: "resolve",
182
+ target: input.semanticTarget
183
+ });
184
+ if (resolved.matches !== 1) return {
185
+ ok: false,
186
+ error: {
187
+ code: "TARGET_NOT_FOUND",
188
+ message: `Semantic target must match exactly one element; matched ${resolved.matches}.`
189
+ }
190
+ };
191
+ const handle = await state.page.locator(`[data-xopc-ref="${resolved.node.ref}"]`).elementHandle();
192
+ if (!handle) return targetNotFound(resolved.node.ref);
193
+ state.refs.set(resolved.node.ref, handle);
194
+ state.revision += 1;
195
+ const observation = {
196
+ sessionId,
197
+ tabId: state.id,
198
+ revision: state.revision,
199
+ documentId: state.documentId,
200
+ url: state.page.url(),
201
+ title: await state.page.title(),
202
+ nodes: [resolved.node],
203
+ changes: {
204
+ added: [resolved.node],
205
+ changed: [],
206
+ removed: []
207
+ }
208
+ };
209
+ return {
210
+ ok: true,
211
+ receipt: {
212
+ action: "resolve",
213
+ risk: "read",
214
+ durationMs: Date.now() - startedAt,
215
+ verified: true,
216
+ observation
217
+ }
218
+ };
219
+ }
177
220
  if ("revision" in input && input.revision !== state.revision) return stale(await this.observe(sessionId, {
178
221
  action: "observe",
179
222
  visual: "never"
@@ -188,6 +231,9 @@ var PlaywrightDriver = class {
188
231
  await handle.fill(input.value, { timeout: this.options.actionTimeoutMs });
189
232
  if (input.submit) await handle.press("Enter");
190
233
  break;
234
+ case "check":
235
+ await handle.setChecked(input.checked, { timeout: this.options.actionTimeoutMs });
236
+ break;
191
237
  case "select":
192
238
  await handle.selectOption(input.value);
193
239
  break;
@@ -4,8 +4,7 @@ export type { BrowserDriver, BrowserPrimitiveInput } from './drivers/browser-dri
4
4
  export { PlaywrightDriver, type PlaywrightDriverOptions } from './drivers/playwright-driver.js';
5
5
  export { ExtensionDriver } from './drivers/extension-driver.js';
6
6
  export { formatBrowserObservation } from './observation/format.js';
7
- export { classifyBrowserRisk, browserRiskNeedsApproval } from './policy/browser-policy.js';
8
- export { createBrowserApproval, consumeBrowserApproval, decideBrowserApproval, listBrowserApprovals, } from './policy/approval-store.js';
7
+ export { classifyBrowserRisk } from './policy/browser-policy.js';
9
8
  export { verifyBrowserExpectation } from './verification/expectation.js';
10
9
  export { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness, type BrowserDriverKind, type BrowserNotReadyReason, type BrowserSetupHint, } from './readiness.js';
11
10
  export { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern, isAlwaysBlockedUrl, } from './url-policy.js';
@@ -1,6 +1,5 @@
1
1
  import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern, isAlwaysBlockedUrl } from "./url-policy.js";
2
- import { consumeBrowserApproval, createBrowserApproval, decideBrowserApproval, listBrowserApprovals } from "./policy/approval-store.js";
3
- import { browserRiskNeedsApproval, classifyBrowserRisk } from "./policy/browser-policy.js";
2
+ import { classifyBrowserRisk } from "./policy/browser-policy.js";
4
3
  import { BrowserRuntime } from "./runtime/browser-runtime.js";
5
4
  import { ExtensionDriver } from "./drivers/extension-driver.js";
6
5
  import { verifyBrowserExpectation } from "./verification/expectation.js";
@@ -8,4 +7,4 @@ import { PlaywrightDriver } from "./drivers/playwright-driver.js";
8
7
  import { createBrowserDriver } from "./drivers/create-driver.js";
9
8
  import { formatBrowserObservation } from "./observation/format.js";
10
9
  import { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness } from "./readiness.js";
11
- export { BrowserNotReadyError, BrowserRuntime, ExtensionDriver, PlaywrightDriver, assertBrowserUrlAllowed, browserRiskNeedsApproval, buildBrowserSetupDeepLink, checkBrowserReadiness, checkPostRedirectUrl, classifyBrowserRisk, consumeBrowserApproval, containsApiKeyPattern, createBrowserApproval, createBrowserDriver, decideBrowserApproval, formatBrowserObservation, isAlwaysBlockedUrl, listBrowserApprovals, verifyBrowserExpectation };
10
+ export { BrowserNotReadyError, BrowserRuntime, ExtensionDriver, PlaywrightDriver, assertBrowserUrlAllowed, buildBrowserSetupDeepLink, checkBrowserReadiness, checkPostRedirectUrl, classifyBrowserRisk, containsApiKeyPattern, createBrowserDriver, formatBrowserObservation, isAlwaysBlockedUrl, verifyBrowserExpectation };
@@ -1,3 +1,2 @@
1
1
  import type { BrowserActionInput, BrowserNode, BrowserRiskLevel } from '@xopcai/browser-control-contract';
2
2
  export declare function classifyBrowserRisk(input: BrowserActionInput, target?: BrowserNode): BrowserRiskLevel;
3
- export declare function browserRiskNeedsApproval(risk: BrowserRiskLevel): boolean;
@@ -20,8 +20,5 @@ function classifyBrowserRisk(input, target) {
20
20
  if (EXTERNAL_EFFECT_PATTERN.test(label)) return "external_effect";
21
21
  return "draft";
22
22
  }
23
- function browserRiskNeedsApproval(risk) {
24
- return risk === "external_effect" || risk === "destructive" || risk === "sensitive";
25
- }
26
23
  //#endregion
27
- export { browserRiskNeedsApproval, classifyBrowserRisk };
24
+ export { classifyBrowserRisk };
@@ -1,4 +1,4 @@
1
1
  export type { CloudBrowserProvider, CloudBrowserProviderConfig } from './types.js';
2
2
  export { BrowserbaseProvider } from './browserbase.js';
3
3
  export { BrowserUseProvider } from './browser-use.js';
4
- export { ExtensionBrowserProvider } from './extension.js';
4
+ export { RealtimeExtensionBrowserProvider } from './realtime-extension.js';
@@ -1,4 +1,4 @@
1
1
  import { BrowserbaseProvider } from "./browserbase.js";
2
2
  import { BrowserUseProvider } from "./browser-use.js";
3
- import { ExtensionBrowserProvider } from "./extension.js";
4
- export { BrowserUseProvider, BrowserbaseProvider, ExtensionBrowserProvider };
3
+ import { RealtimeExtensionBrowserProvider } from "./realtime-extension.js";
4
+ export { BrowserUseProvider, BrowserbaseProvider, RealtimeExtensionBrowserProvider };
@@ -12,7 +12,7 @@ export declare class RealtimeExtensionBrowserProvider {
12
12
  constructor(runtime: EndpointToolRuntime, config?: RealtimeExtensionProviderConfig);
13
13
  start(): Promise<void>;
14
14
  waitForConnection(timeoutMs?: number): Promise<void>;
15
- send(input: BrowserActionInput, timeoutMs?: number, visualFallback?: boolean): Promise<BrowserWireResult>;
15
+ send(input: BrowserActionInput, timeoutMs?: number, visualFallback?: boolean, signal?: AbortSignal): Promise<BrowserWireResult>;
16
16
  isConnected(): boolean;
17
17
  getConnectionStatus(): {
18
18
  socketConnected: boolean;
@@ -20,7 +20,7 @@ var RealtimeExtensionBrowserProvider = class {
20
20
  await new Promise((resolve) => setTimeout(resolve, 200));
21
21
  }
22
22
  }
23
- async send(input, timeoutMs = this.commandTimeout, visualFallback = true) {
23
+ async send(input, timeoutMs = this.commandTimeout, visualFallback = true, signal) {
24
24
  const endpoint = this.endpointForInput(input);
25
25
  if (!endpoint) {
26
26
  if (input.target?.kind === "endpoint") throw new Error(`The Chrome endpoint bound to this Session is offline (${input.target.endpointId}). Reconnect that browser or bind another one.`);
@@ -31,6 +31,9 @@ var RealtimeExtensionBrowserProvider = class {
31
31
  if (!tool) throw new Error("Connected browser extension does not support authenticated Realtime browser control. Reload or update the extension.");
32
32
  const id = crypto.randomUUID();
33
33
  const controller = new AbortController();
34
+ const abort = () => controller.abort();
35
+ signal?.addEventListener("abort", abort, { once: true });
36
+ if (signal?.aborted) controller.abort();
34
37
  const timer = setTimeout(() => controller.abort(), timeoutMs);
35
38
  try {
36
39
  const value = (await this.runtime.invocations.invoke({
@@ -53,6 +56,7 @@ var RealtimeExtensionBrowserProvider = class {
53
56
  };
54
57
  } finally {
55
58
  clearTimeout(timer);
59
+ signal?.removeEventListener("abort", abort);
56
60
  }
57
61
  }
58
62
  isConnected() {
@@ -0,0 +1,22 @@
1
+ import type { BrowserRecordingEvent } from '@xopcai/browser-control-contract';
2
+ import type { BrowserAutomationService, BrowserAutomationDefinition } from '../automations/index.js';
3
+ type RecordingRow = {
4
+ recording_id: string;
5
+ principal_id: string;
6
+ state: string;
7
+ ack_seq: number;
8
+ final_seq: number | null;
9
+ automation_id: string | null;
10
+ error: string | null;
11
+ };
12
+ export declare class BrowserRecordingService {
13
+ private readonly automations;
14
+ constructor(automations: BrowserAutomationService);
15
+ get(id: string, principalId: string): RecordingRow | null;
16
+ append(id: string, principalId: string, payload: unknown): {
17
+ ackThrough: number;
18
+ };
19
+ finish(id: string, principalId: string, finalSeq: number): import("../automations/types.js").BrowserAutomation;
20
+ }
21
+ export declare function compileRecording(id: string, events: BrowserRecordingEvent[]): BrowserAutomationDefinition;
22
+ export {};
@@ -0,0 +1,160 @@
1
+ import { getSqliteDatabase, runSqliteWriteTransaction } from "../../storage/sqlite/transaction.js";
2
+ import { init_sqlite } from "../../storage/sqlite/index.js";
3
+ import { z } from "zod";
4
+ //#region src/browser/recordings/service.ts
5
+ init_sqlite();
6
+ const Target = z.object({
7
+ role: z.string().min(1),
8
+ name: z.string().max(240).optional(),
9
+ nameIncludes: z.string().max(240).optional(),
10
+ testId: z.string().max(240).optional(),
11
+ scope: z.object({
12
+ role: z.string(),
13
+ name: z.string().max(240)
14
+ }).strict().optional()
15
+ }).strict();
16
+ const Event = z.object({
17
+ id: z.string().uuid(),
18
+ seq: z.number().int().positive(),
19
+ documentId: z.string().max(200),
20
+ sourceSeq: z.number().int().positive(),
21
+ url: z.string().url().max(4096),
22
+ action: z.enum([
23
+ "navigate",
24
+ "click",
25
+ "fill",
26
+ "select",
27
+ "check",
28
+ "press",
29
+ "checkpoint",
30
+ "unsupported"
31
+ ]),
32
+ target: Target.optional(),
33
+ value: z.string().max(4096).optional(),
34
+ checked: z.boolean().optional(),
35
+ key: z.enum(["Enter", "Escape"]).optional()
36
+ }).strict();
37
+ const Batch = z.array(Event).min(1).max(100);
38
+ var BrowserRecordingService = class {
39
+ constructor(automations) {
40
+ this.automations = automations;
41
+ }
42
+ get(id, principalId) {
43
+ return getSqliteDatabase().prepare("SELECT * FROM browser_recordings WHERE recording_id=? AND principal_id=?").get(id, principalId) ?? null;
44
+ }
45
+ append(id, principalId, payload) {
46
+ z.string().uuid().parse(id);
47
+ const events = Batch.parse(payload);
48
+ return runSqliteWriteTransaction((db) => {
49
+ const now = Date.now();
50
+ db.prepare("INSERT OR IGNORE INTO browser_recordings (recording_id, principal_id, state, created_at_ms, updated_at_ms) VALUES (?, ?, 'recording', ?, ?)").run(id, principalId, now, now);
51
+ const row = this.get(id, principalId);
52
+ if (!row) throw new Error("Recording belongs to another device.");
53
+ if (Math.max(row.ack_seq, events.at(-1).seq) > 1e4) throw new Error("Recording event budget exceeded.");
54
+ let bytes = db.prepare("SELECT COALESCE(SUM(length(CAST(payload_json AS BLOB))),0) AS bytes FROM browser_recording_events WHERE recording_id=?").get(id).bytes;
55
+ for (const event of events) {
56
+ const prior = db.prepare("SELECT payload_json FROM browser_recording_events WHERE recording_id=? AND seq=?").get(id, event.seq);
57
+ const serialized = JSON.stringify(event);
58
+ if (prior) {
59
+ if (prior.payload_json !== serialized) throw new Error("Recording event conflict.");
60
+ continue;
61
+ }
62
+ bytes += Buffer.byteLength(serialized);
63
+ if (bytes > 20 * 1024 * 1024) throw new Error("Recording storage budget exceeded.");
64
+ if (row.state === "saved") throw new Error("Recording is already finished.");
65
+ if (event.seq !== this.get(id, principalId).ack_seq + 1) throw new Error("Recording event sequence has a gap.");
66
+ if (!["http:", "https:"].includes(new URL(event.url).protocol)) throw new Error("Only HTTP pages can be recorded.");
67
+ db.prepare("INSERT INTO browser_recording_events (recording_id, seq, event_id, payload_json) VALUES (?, ?, ?, ?)").run(id, event.seq, event.id, serialized);
68
+ db.prepare("UPDATE browser_recordings SET ack_seq=?, updated_at_ms=? WHERE recording_id=?").run(event.seq, now, id);
69
+ }
70
+ return { ackThrough: this.get(id, principalId).ack_seq };
71
+ });
72
+ }
73
+ finish(id, principalId, finalSeq) {
74
+ z.number().int().min(1).max(1e4).parse(finalSeq);
75
+ const row = this.get(id, principalId);
76
+ if (!row) throw new Error("Recording not found.");
77
+ if (row.state === "saved") {
78
+ if (row.final_seq !== finalSeq) throw new Error("Recording final sequence conflicts with the saved recording.");
79
+ return this.automations.get(row.automation_id);
80
+ }
81
+ if (row.ack_seq !== finalSeq) throw new Error("Recording is incomplete. Waiting for all events.");
82
+ const events = getSqliteDatabase().prepare("SELECT payload_json FROM browser_recording_events WHERE recording_id=? ORDER BY seq").all(id).map((item) => JSON.parse(item.payload_json));
83
+ const sources = /* @__PURE__ */ new Map();
84
+ for (const event of events) {
85
+ if (event.sourceSeq !== (sources.get(event.documentId) ?? 0) + 1) throw new Error("Recording is incomplete: document events are missing.");
86
+ sources.set(event.documentId, event.sourceSeq);
87
+ }
88
+ for (const documentId of sources.keys()) if (events.filter((event) => event.documentId === documentId).at(-1)?.action !== "checkpoint") throw new Error("Recording is incomplete: a document did not confirm its final events.");
89
+ const definition = compileRecording(id, events);
90
+ return runSqliteWriteTransaction((db) => {
91
+ const automation = this.automations.save({ definition });
92
+ db.prepare("UPDATE browser_recordings SET state='saved', final_seq=?, automation_id=?, updated_at_ms=? WHERE recording_id=?").run(finalSeq, automation.id, Date.now(), id);
93
+ return automation;
94
+ });
95
+ }
96
+ };
97
+ function compileRecording(id, events) {
98
+ const steps = [];
99
+ const inputs = {};
100
+ for (const event of events) {
101
+ if (event.action === "checkpoint") continue;
102
+ if (event.action === "unsupported") throw new Error(event.value || "Recording contains an unsupported action.");
103
+ if (event.action === "navigate") {
104
+ if (steps.length && ["click", "press"].includes(steps.at(-1).action)) steps.push({
105
+ action: "wait",
106
+ condition: "page_idle"
107
+ });
108
+ else if (!steps.length || steps.at(-1)?.action !== "wait") steps.push({
109
+ action: "navigate",
110
+ url: event.url
111
+ });
112
+ continue;
113
+ }
114
+ if (!event.target) throw new Error("Recording contains an unsupported target.");
115
+ if (event.action === "fill" || event.action === "select") {
116
+ const key = `value${Object.keys(inputs).length + 1}`;
117
+ inputs[key] = {
118
+ type: "string",
119
+ default: event.value ?? "",
120
+ description: event.target.name || key
121
+ };
122
+ steps.push({
123
+ action: event.action,
124
+ target: event.target,
125
+ value: `\${input.${key}}`
126
+ });
127
+ } else if (event.action === "check") {
128
+ if (event.checked === void 0) throw new Error("Recording checkbox state is missing.");
129
+ steps.push({
130
+ action: "check",
131
+ target: event.target,
132
+ checked: event.checked
133
+ });
134
+ } else if (event.action === "press") {
135
+ if (!event.key) throw new Error("Recording key is missing.");
136
+ steps.push({
137
+ action: "press",
138
+ target: event.target,
139
+ key: event.key
140
+ });
141
+ } else steps.push({
142
+ action: "click",
143
+ target: event.target
144
+ });
145
+ }
146
+ if (!steps.length || steps.length > 100) throw new Error("Recording must contain between 1 and 100 executable steps.");
147
+ const first = events[0];
148
+ return {
149
+ id: `recording-${id}`,
150
+ name: events.find((event) => event.target?.name)?.target?.name || new URL(first.url).hostname,
151
+ description: "Recorded browser workflow",
152
+ allowedDomains: [...new Set(events.map((event) => new URL(event.url).hostname))],
153
+ risk: steps.some((step) => ["click", "press"].includes(step.action)) ? "external_effect" : "draft",
154
+ inputs,
155
+ steps,
156
+ outputs: { url: { field: "url" } }
157
+ };
158
+ }
159
+ //#endregion
160
+ export { BrowserRecordingService, compileRecording };
@@ -18,7 +18,7 @@ export declare class BrowserRuntime {
18
18
  closeTaskSession(taskKey: string): Promise<void>;
19
19
  private dispatch;
20
20
  private executeSequence;
21
- private authorize;
21
+ private actionDenied;
22
22
  private validateUrl;
23
23
  private validateRedirect;
24
24
  private blockedRedirect;
@@ -1,6 +1,5 @@
1
1
  import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from "../url-policy.js";
2
- import { consumeBrowserApproval, createBrowserApproval } from "../policy/approval-store.js";
3
- import { browserRiskNeedsApproval, classifyBrowserRisk } from "../policy/browser-policy.js";
2
+ import { classifyBrowserRisk } from "../policy/browser-policy.js";
4
3
  import { isAbsolute, relative, resolve } from "node:path";
5
4
  import { randomUUID } from "node:crypto";
6
5
  //#region src/browser/runtime/browser-runtime.ts
@@ -94,10 +93,7 @@ var BrowserRuntime = class {
94
93
  if (input.action === "navigate") {
95
94
  const blocked = this.validateUrl(input.url);
96
95
  if (blocked) return failure("BLOCKED_URL", blocked);
97
- const crossDomainPolicy = this.crossDomainPolicy(session.observation?.url, input.url);
98
- if (crossDomainPolicy === "deny") return failure("BLOCKED_URL", "Cross-domain navigation is denied by policy.");
99
- const authorization = this.authorize(session.taskKey, input, crossDomainPolicy === "ask" ? "external_effect" : "read", crossDomainPolicy);
100
- if (authorization) return authorization;
96
+ if (this.crossDomainPolicy(session.observation?.url, input.url) === "deny") return failure("BLOCKED_URL", "Cross-domain navigation is denied by policy.");
101
97
  const result = await driver.navigate(session.id, input, signal);
102
98
  return this.validateRedirect(input.url, result);
103
99
  }
@@ -105,10 +101,7 @@ var BrowserRuntime = class {
105
101
  if (input.url) {
106
102
  const blocked = this.validateUrl(input.url);
107
103
  if (blocked) return failure("BLOCKED_URL", blocked);
108
- const crossDomainPolicy = this.crossDomainPolicy(session.observation?.url, input.url);
109
- if (crossDomainPolicy === "deny") return failure("BLOCKED_URL", "Cross-domain navigation is denied by policy.");
110
- const authorization = this.authorize(session.taskKey, input, crossDomainPolicy === "ask" ? "external_effect" : "read", crossDomainPolicy);
111
- if (authorization) return authorization;
104
+ if (this.crossDomainPolicy(session.observation?.url, input.url) === "deny") return failure("BLOCKED_URL", "Cross-domain navigation is denied by policy.");
112
105
  }
113
106
  const result = await driver.tabs(session.id, input, signal);
114
107
  if (!input.url || !result.ok) return result;
@@ -117,15 +110,21 @@ var BrowserRuntime = class {
117
110
  return blocked ? failure("BLOCKED_URL", blocked) : result;
118
111
  }
119
112
  if (input.action === "sequence") return this.executeSequence(driver, session, input, signal);
113
+ if (input.action === "resolve") return driver.perform(session.id, input, signal);
120
114
  const target = findActionTarget(input, session.observation);
121
115
  const risk = classifyBrowserRisk(input, target);
122
116
  if (input.action === "upload") {
123
117
  const invalidPath = this.invalidUploadPath(input.paths);
124
118
  if (invalidPath) return failure("INVALID_INPUT", invalidPath);
125
119
  }
126
- const authorization = this.authorize(session.taskKey, input, risk, void 0, target);
127
- if (authorization) return authorization;
128
- return withRisk(await driver.perform(session.id, input, signal), risk);
120
+ if (this.actionDenied(input, risk)) return failure("INVALID_INPUT", `Browser action is denied by policy (${risk}).`);
121
+ if (input.action === "click" && target?.href) {
122
+ const blocked = this.validateUrl(target.href);
123
+ if (blocked) return failure("BLOCKED_URL", blocked);
124
+ if (this.crossDomainPolicy(session.observation?.url, target.href) === "deny") return failure("BLOCKED_URL", "Cross-domain navigation is denied by policy.");
125
+ }
126
+ const result = await driver.perform(session.id, input, signal);
127
+ return withRisk(this.validateRedirect(session.observation?.url ?? "", result), risk);
129
128
  }
130
129
  async executeSequence(driver, session, input, signal) {
131
130
  const config = this.options.getConfig();
@@ -138,8 +137,7 @@ var BrowserRuntime = class {
138
137
  const risk = classifyBrowserRisk(step, findActionTarget(step, session.observation));
139
138
  if (riskRank(risk) > riskRank(highestRisk)) highestRisk = risk;
140
139
  }
141
- const authorization = this.authorize(session.taskKey, input, highestRisk);
142
- if (authorization) return authorization;
140
+ if (this.actionDenied(input, highestRisk)) return failure("INVALID_INPUT", `Browser action is denied by policy (${highestRisk}).`);
143
141
  for (const step of input.steps) {
144
142
  const primitive = {
145
143
  ...step,
@@ -165,27 +163,13 @@ var BrowserRuntime = class {
165
163
  }
166
164
  };
167
165
  }
168
- authorize(conversationId, input, risk, explicitPolicy, target) {
166
+ actionDenied(input, risk) {
169
167
  const security = this.options.getConfig().security;
170
- const policy = explicitPolicy ?? (input.action === "upload" ? security.uploads : security.consequentialActions);
171
- if (!browserRiskNeedsApproval(risk) || policy === "allow") return null;
172
- if (policy === "deny") return failure("APPROVAL_REQUIRED", `Browser action is denied by policy (${risk}).`);
173
- if (consumeBrowserApproval(input.approvalId, conversationId, input)) return null;
174
- const approval = createBrowserApproval(conversationId, input, risk, browserApprovalSummary(input, target));
175
- this.options.emit?.("browser.approval.required", approval);
176
- return {
177
- ok: false,
178
- error: {
179
- code: "APPROVAL_REQUIRED",
180
- message: "This browser action needs local-owner approval before it can run.",
181
- approval: {
182
- id: approval.id,
183
- risk,
184
- summary: approval.summary,
185
- expiresAt: approval.expiresAt
186
- }
187
- }
188
- };
168
+ return (input.action === "upload" ? security.uploads : security.consequentialActions) === "deny" && [
169
+ "external_effect",
170
+ "destructive",
171
+ "sensitive"
172
+ ].includes(risk);
189
173
  }
190
174
  validateUrl(url) {
191
175
  if (containsApiKeyPattern(url)) return "URL contains a credential-like value.";
@@ -338,27 +322,6 @@ function findActionTarget(input, observation) {
338
322
  const ref = "ref" in input && input.ref ? input.ref : input.action === "press" ? observation?.focused : void 0;
339
323
  return ref ? observation?.nodes.find((node) => node.ref === ref) : void 0;
340
324
  }
341
- function browserApprovalSummary(input, target) {
342
- const targetName = target?.name.trim() ? ` “${target.name.slice(0, 120)}”` : "";
343
- switch (input.action) {
344
- case "navigate": return `Navigate to ${safeUrlLabel(input.url)}.`;
345
- case "tabs": return input.url ? `Open a tab at ${safeUrlLabel(input.url)}.` : `Change browser tabs (${input.operation}).`;
346
- case "click": return `Click${targetName || ` element ${input.ref}`}.`;
347
- case "fill": return `${target?.states.includes("sensitive") ? "Fill a sensitive field" : "Fill field"}${targetName || ` ${input.ref}`}${input.submit ? " and submit the form" : ""}.`;
348
- case "upload": return `Upload ${input.paths.length} file${input.paths.length === 1 ? "" : "s"}${targetName ? ` using${targetName}` : ""}.`;
349
- case "press": return `Press ${input.key}${targetName ? ` on${targetName}` : ""}.`;
350
- case "sequence": return `Run ${input.steps.length} browser actions as one sequence.`;
351
- default: return `Run browser action “${input.action}”${targetName ? ` on${targetName}` : ""}.`;
352
- }
353
- }
354
- function safeUrlLabel(raw) {
355
- try {
356
- const url = new URL(raw);
357
- return `${url.origin}${url.pathname}`.slice(0, 240);
358
- } catch {
359
- return "the requested URL";
360
- }
361
- }
362
325
  function withoutVisual(value) {
363
326
  if (!value || typeof value !== "object") return value;
364
327
  return JSON.parse(JSON.stringify(value, (key, child) => key === "visual" ? void 0 : child));
@@ -66,10 +66,10 @@ const switchCommand = {
66
66
  "group"
67
67
  ],
68
68
  acceptsArgs: true,
69
- examples: ["/switch openai/gpt-5.6", "/switch anthropic/claude-sonnet-5"],
69
+ examples: ["/switch openai/gpt-6-sol", "/switch anthropic/claude-sonnet-5"],
70
70
  handler: async (ctx, args) => {
71
71
  if (!args.trim()) return {
72
- content: joinBlocks("❌ Missing model ref.", "**Usage:** `/switch provider/model-id`", "Run `/models` — each line shows a display name and a `provider/model` ref in backticks. Copy that ref.", "**Example:** `/switch openai/gpt-5.6`"),
72
+ content: joinBlocks("❌ Missing model ref.", "**Usage:** `/switch provider/model-id`", "Run `/models` — each line shows a display name and a `provider/model` ref in backticks. Copy that ref.", "**Example:** `/switch openai/gpt-6-sol`"),
73
73
  success: false
74
74
  };
75
75
  await ctx.setTyping(true);
@@ -97,7 +97,7 @@ const ROOT_HELP_COMMANDS = [
97
97
  },
98
98
  {
99
99
  name: "mcp",
100
- description: "Expose selected Gateway capabilities over MCP"
100
+ description: "Manage native pi MCP servers and expose Gateway capabilities"
101
101
  },
102
102
  {
103
103
  name: "platform",
@@ -53,7 +53,7 @@ async function checkDatabaseSchema(ctx) {
53
53
  id: "database-schema",
54
54
  label: "Database schema",
55
55
  status: "pass",
56
- message: `SQLite schema v${status.dbVersion} (current release v237).`,
56
+ message: `SQLite schema v${status.dbVersion} (current release v241).`,
57
57
  hints: []
58
58
  };
59
59
  }
@@ -1,10 +1,6 @@
1
- import { pluginServerId } from "../../extensions/agent-plugins/validation.js";
2
1
  import { AgentPluginStore } from "../../extensions/agent-plugins/store.js";
3
- import { savePluginAuthBinding } from "../../extensions/agent-plugins/auth.js";
4
- import { materializePluginServers } from "../../extensions/agent-plugins/mcp-adapter.js";
5
2
  import { loadConfig } from "../../config/loader.js";
6
3
  import { getContextWithOpts } from "../context.js";
7
- import { getMcpOAuthManager } from "../../agent/mcp/oauth/mcp-oauth-manager.js";
8
4
  import { isAgentPluginArchive, withAgentPluginSource } from "../../extensions/agent-plugins/sources.js";
9
5
  import { removePluginCredentials } from "../../extensions/agent-plugins/credentials.js";
10
6
  import { join, resolve } from "node:path";
@@ -63,21 +59,6 @@ function addAgentPluginLifecycleCommands(command) {
63
59
  store.remove(id, options.removeData);
64
60
  console.log(`Removed ${raw}; credentials ${options.removeCredentials ? "deleted" : "retained"}${options.removeData ? ", plugin data deleted" : ", plugin data retained"}.`);
65
61
  });
66
- command.command("connect").argument("<id>", "plugin:<name>").requiredOption("--mcp <server>", "MCP server name").action(async (raw, options) => {
67
- const store = new AgentPluginStore();
68
- const id = raw.replace(/^plugin:/, "");
69
- const plugin = store.get(id);
70
- if (!plugin || plugin.readiness === "blocked") throw new Error("Plugin is unavailable");
71
- await savePluginAuthBinding(store, id, options.mcp, { mode: "oauth" });
72
- const serverId = pluginServerId(id, options.mcp);
73
- const server = materializePluginServers(plugin, store)[serverId];
74
- if (!server) throw new Error("MCP server not found");
75
- const status = await getMcpOAuthManager(server).start({
76
- serverId,
77
- rawServer: server
78
- });
79
- console.log(JSON.stringify(status, null, 2));
80
- });
81
62
  }
82
63
  //#endregion
83
64
  export { addAgentPluginLifecycleCommands, installAgentPluginFromCli, isAgentPluginSource };
@@ -1,12 +1,46 @@
1
+ import { getNativePiAgentDir, prepareNativeMcpConfig } from "../../agent/mcp/native-mcp.js";
1
2
  import { loadConfig } from "../../config/loader.js";
2
3
  import { register } from "../registry.js";
3
4
  import { createGatewayHttpClientFromConfig } from "../../mcp/gateway-http-client.js";
4
5
  import { createCapabilityMcpServer } from "../../mcp/capability-server.js";
6
+ import { join } from "node:path";
7
+ import { chmodSync, existsSync, readFileSync, writeFileSync } from "node:fs";
8
+ import { main } from "@earendil-works/pi-coding-agent";
5
9
  import { Command } from "commander";
6
10
  import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
7
11
  //#region src/cli/commands/mcp.ts
8
12
  function createMcpCommand(ctx) {
9
- const command = new Command("mcp").description("Expose selected Gateway capabilities over MCP");
13
+ const command = new Command("mcp").description("Manage native pi MCP servers and expose Gateway capabilities");
14
+ for (const action of [
15
+ "list",
16
+ "login",
17
+ "logout"
18
+ ]) {
19
+ const native = command.command(action).description(`Use pi's native MCP ${action}`);
20
+ if (action !== "list") native.argument("<server>", "Configured MCP server ID");
21
+ if (action === "list") native.option("--json", "Print pi MCP diagnostics as JSON");
22
+ if (action === "login") native.option("--timeout <seconds>", "Browser sign-in timeout in seconds");
23
+ native.action(async (serverOrOptions, loginOptions) => {
24
+ const server = typeof serverOrOptions === "string" ? serverOrOptions : void 0;
25
+ const options = typeof serverOrOptions === "string" ? loginOptions : serverOrOptions;
26
+ const mcp = await prepareNativeMcpConfig(loadConfig(ctx.configPath), ctx.workspacePath || process.cwd());
27
+ if (mcp.errors.length) throw new Error(mcp.errors.join("\n"));
28
+ const path = join(getNativePiAgentDir(), "mcp.json");
29
+ if (existsSync(path) && JSON.parse(readFileSync(path, "utf8")).xopcGenerated !== true) throw new Error("The pi directory contains a user-managed mcp.json. Use a dedicated PI_CODING_AGENT_DIR for xopc.");
30
+ if (existsSync(path)) chmodSync(path, 384);
31
+ writeFileSync(path, JSON.stringify({
32
+ xopcGenerated: true,
33
+ mcpServers: Object.fromEntries(mcp.servers.map((entry) => [entry.name, entry.config]))
34
+ }), { mode: 384 });
35
+ await main([
36
+ "mcp",
37
+ action,
38
+ ...server ? [server] : [],
39
+ ...action === "list" && options?.json ? ["--json"] : [],
40
+ ...action === "login" && loginOptions?.timeout ? ["--timeout", loginOptions.timeout] : []
41
+ ]);
42
+ });
43
+ }
10
44
  command.command("capabilities").description("Run an opt-in stdio MCP proxy for an explicit capability allowlist").requiredOption("--allow-capability <ids...>", "Exact capability IDs; no wildcards").action(async (options) => {
11
45
  const server = createCapabilityMcpServer(createGatewayHttpClientFromConfig({ config: loadConfig(ctx.configPath) }), options.allowCapability);
12
46
  const transport = new StdioServerTransport();
@@ -39,7 +73,7 @@ function createMcpCommand(ctx) {
39
73
  register({
40
74
  id: "mcp",
41
75
  name: "mcp",
42
- description: "Expose selected Gateway capabilities over MCP",
76
+ description: "Manage native pi MCP servers and expose Gateway capabilities",
43
77
  factory: createMcpCommand,
44
78
  metadata: {
45
79
  category: "utility",
@@ -22,7 +22,7 @@ init_repository();
22
22
  init_providers();
23
23
  const IMAGE_GENERATION_IDS = new Set(listImageProviderSpecs().flatMap((provider) => provider.models.map((model) => model.id)));
24
24
  const VISION_IDS = new Set([
25
- "gpt-5.6",
25
+ "gpt-6-sol",
26
26
  "gpt-5.6-luna",
27
27
  "gpt-5.6-sol",
28
28
  "gpt-5.6-terra",
@@ -51,8 +51,8 @@ function buildCliOAuthCallbacks(params) {
51
51
  onPrompt: async (prompt) => input({
52
52
  message: prompt.message,
53
53
  validate: prompt.allowEmpty ? void 0 : (value) => value.trim().length > 0 || "Required"
54
- }),
55
- onManualCodeInput: params.provider.usesCallbackServer && params.provider.id !== "openai-codex" ? promptForManualCode : void 0,
54
+ }, { signal: prompt.signal }),
55
+ onManualCodeInput: params.provider.usesCallbackServer && params.provider.id !== "openai" ? promptForManualCode : void 0,
56
56
  onProgress: (message) => {
57
57
  params.onProgress?.(message);
58
58
  },
@@ -173,7 +173,7 @@ var ComputerRuntime = class {
173
173
  const metadata = (await readComputerJson(response, 2 * 1024 * 1024)).data?.find((item) => item.id === model.id)?.xopc;
174
174
  const parsedDeployment = z.object({
175
175
  revision: z.string().regex(/^[a-f0-9]{64}$/),
176
- origin: z.string().url()
176
+ origin: z.string().url().optional()
177
177
  }).safeParse(metadata?.computerDeployment);
178
178
  const parsedLimits = ComputerServiceLimitsSchema.optional().safeParse(metadata?.computerLimits);
179
179
  if (!parsedDeployment.success || !parsedLimits.success) throw new Error("COMPUTER_DEPLOYMENT_UNAVAILABLE");
@@ -204,7 +204,7 @@ var ComputerRuntime = class {
204
204
  profile,
205
205
  origin: new URL(model.baseUrl).origin,
206
206
  runtimeLocation: "unknown",
207
- ...deployment ? { upstreamOrigin: deployment.origin } : {}
207
+ ...deployment?.origin ? { upstreamOrigin: deployment.origin } : {}
208
208
  },
209
209
  createdAt: Date.now(),
210
210
  actions: 0,