@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,12 +0,0 @@
1
- import type { McpOAuthRecord } from './mcp-oauth-types.js';
2
- export declare function canonicalMcpServerUrl(input: string | URL): string;
3
- export declare function mcpOAuthServerKey(input: string | URL): string;
4
- export declare class McpOAuthStore {
5
- private readonly identityScope?;
6
- constructor(identityScope?: string);
7
- pathFor(serverUrl: string | URL): string;
8
- deleteScope(): Promise<void>;
9
- load(serverUrlInput: string | URL): Promise<McpOAuthRecord | undefined>;
10
- update(serverUrlInput: string | URL, update: (current: McpOAuthRecord | undefined) => McpOAuthRecord | undefined): Promise<McpOAuthRecord | undefined>;
11
- delete(serverUrl: string | URL): Promise<void>;
12
- }
@@ -1,91 +0,0 @@
1
- import { init_write_file_atomic, writeTextAtomic } from "../../../infra/write-file-atomic.js";
2
- import { init_paths, resolveMcpOAuthPath } from "../../../config/paths.js";
3
- import { dirname, join } from "node:path";
4
- import { createHash } from "node:crypto";
5
- import { readFile, rm } from "node:fs/promises";
6
- //#region src/agent/mcp/oauth/mcp-oauth-store.ts
7
- init_paths();
8
- init_write_file_atomic();
9
- const writeTails = /* @__PURE__ */ new Map();
10
- function canonicalMcpServerUrl(input) {
11
- const url = input instanceof URL ? new URL(input) : new URL(input);
12
- url.hash = "";
13
- return url.toString();
14
- }
15
- function mcpOAuthServerKey(input) {
16
- return createHash("sha256").update(canonicalMcpServerUrl(input)).digest("hex");
17
- }
18
- function isStoredRecord(value, serverUrl) {
19
- if (!value || typeof value !== "object" || Array.isArray(value)) return false;
20
- const record = value;
21
- if (record.version !== 1 || record.serverUrl !== serverUrl || typeof record.updatedAt !== "string") return false;
22
- if (record.tokens !== void 0) {
23
- const tokens = record.tokens;
24
- if (typeof tokens.access_token !== "string" || typeof tokens.token_type !== "string") return false;
25
- }
26
- return true;
27
- }
28
- async function serializeWrite(key, operation) {
29
- const previous = writeTails.get(key) ?? Promise.resolve();
30
- let release;
31
- const gate = new Promise((resolve) => {
32
- release = resolve;
33
- });
34
- const tail = previous.catch(() => void 0).then(() => gate);
35
- writeTails.set(key, tail);
36
- await previous.catch(() => void 0);
37
- try {
38
- return await operation();
39
- } finally {
40
- release();
41
- if (writeTails.get(key) === tail) writeTails.delete(key);
42
- }
43
- }
44
- var McpOAuthStore = class {
45
- constructor(identityScope) {
46
- this.identityScope = identityScope;
47
- }
48
- pathFor(serverUrl) {
49
- const endpoint = mcpOAuthServerKey(serverUrl);
50
- return this.identityScope ? join(dirname(resolveMcpOAuthPath(endpoint)), createHash("sha256").update(this.identityScope).digest("hex"), `${endpoint}.json`) : resolveMcpOAuthPath(endpoint);
51
- }
52
- async deleteScope() {
53
- if (!this.identityScope) throw new Error("Cannot remove unscoped MCP credentials");
54
- await rm(dirname(this.pathFor("https://scope.invalid")), {
55
- recursive: true,
56
- force: true
57
- });
58
- }
59
- async load(serverUrlInput) {
60
- const serverUrl = canonicalMcpServerUrl(serverUrlInput);
61
- try {
62
- const parsed = JSON.parse(await readFile(this.pathFor(serverUrl), "utf8"));
63
- return isStoredRecord(parsed, serverUrl) ? parsed : void 0;
64
- } catch {
65
- return;
66
- }
67
- }
68
- async update(serverUrlInput, update) {
69
- const serverUrl = canonicalMcpServerUrl(serverUrlInput);
70
- return serializeWrite(mcpOAuthServerKey(serverUrl), async () => {
71
- const next = update(await this.load(serverUrl));
72
- if (!next) {
73
- await rm(this.pathFor(serverUrl), { force: true });
74
- return;
75
- }
76
- const normalized = {
77
- ...next,
78
- version: 1,
79
- serverUrl,
80
- updatedAt: (/* @__PURE__ */ new Date()).toISOString()
81
- };
82
- await writeTextAtomic(this.pathFor(serverUrl), JSON.stringify(normalized, null, 2));
83
- return normalized;
84
- });
85
- }
86
- async delete(serverUrl) {
87
- await this.update(serverUrl, () => void 0);
88
- }
89
- };
90
- //#endregion
91
- export { McpOAuthStore, canonicalMcpServerUrl, mcpOAuthServerKey };
@@ -1,22 +0,0 @@
1
- import type { OAuthDiscoveryState } from '@modelcontextprotocol/sdk/client/auth.js';
2
- import type { OAuthClientInformationMixed, OAuthTokens } from '@modelcontextprotocol/sdk/shared/auth.js';
3
- export type McpOAuthRecord = {
4
- version: 1;
5
- serverUrl: string;
6
- clientInformation?: OAuthClientInformationMixed;
7
- discoveryState?: OAuthDiscoveryState;
8
- tokens?: OAuthTokens;
9
- tokensSavedAt?: number;
10
- updatedAt: string;
11
- };
12
- export type McpOAuthSessionStatus = 'starting' | 'waiting_browser' | 'exchanging_code' | 'connected' | 'failed' | 'expired' | 'cancelled';
13
- export type McpOAuthSessionSnapshot = {
14
- id: string;
15
- serverId: string;
16
- serverUrl: string;
17
- status: McpOAuthSessionStatus;
18
- authorizationUrl?: string;
19
- error?: string;
20
- createdAt: number;
21
- expiresAt: number;
22
- };
@@ -1 +0,0 @@
1
- export {};
@@ -1,2 +0,0 @@
1
- import type { FetchLike } from '@modelcontextprotocol/sdk/shared/transport.js';
2
- export declare function createPluginHttpFetch(endpoint: URL, configuredHeaders: Record<string, string>): FetchLike;
@@ -1,8 +0,0 @@
1
- import type { Config } from '../../config/schema.js';
2
- import type { AgentSourceContext } from './types.js';
3
- export declare function buildMcpResourceAgentContext(params: {
4
- workspaceDir: string;
5
- config: Config;
6
- sourceId: string;
7
- expectedVersion?: string;
8
- }): Promise<AgentSourceContext | null>;
@@ -1,30 +0,0 @@
1
- import { readBundleMcpResourceForGateway } from "../mcp/bundle-mcp-gateway.js";
2
- //#region src/agent/source-context/mcp-resource-context.ts
3
- const MAX_MCP_RESOURCE_CONTEXT_CHARS = 96e3;
4
- async function buildMcpResourceAgentContext(params) {
5
- const resolved = await readBundleMcpResourceForGateway({
6
- workspaceDir: params.workspaceDir,
7
- cfg: params.config,
8
- sourceId: params.sourceId
9
- }).catch(() => null);
10
- if (!resolved || params.expectedVersion && params.expectedVersion !== resolved.resource.version) return null;
11
- const snapshot = resolved.contents.contents.map((content) => {
12
- if ("text" in content) return content.text;
13
- return JSON.stringify({
14
- uri: content.uri,
15
- mimeType: content.mimeType,
16
- binary: true
17
- });
18
- }).join("\n\n");
19
- const text = snapshot.slice(0, MAX_MCP_RESOURCE_CONTEXT_CHARS);
20
- return {
21
- kind: "mcp_resource",
22
- sourceId: params.sourceId,
23
- version: resolved.resource.version,
24
- title: resolved.resource.title || resolved.resource.name,
25
- text,
26
- truncated: text.length < snapshot.length
27
- };
28
- }
29
- //#endregion
30
- export { buildMcpResourceAgentContext };
@@ -1,9 +0,0 @@
1
- /**
2
- * OpenAI Codex (ChatGPT) OAuth.
3
- *
4
- * Owns callback validation, manual prompt handling, and success/error pages.
5
- */
6
- import type { OAuthCredentials, OAuthLoginCallbacks, OAuthProviderInterface } from './types.js';
7
- export declare function loginOpenAICodex(callbacks: OAuthLoginCallbacks): Promise<OAuthCredentials>;
8
- export declare function refreshOpenAICodexToken(refreshToken: string): Promise<OAuthCredentials>;
9
- export declare const openaiCodexOAuthProvider: OAuthProviderInterface;
@@ -1,414 +0,0 @@
1
- import { __esmMin } from "../../../_virtual/_rolldown/runtime.js";
2
- import { generatePKCE, init_pkce } from "./pkce.js";
3
- import { randomBytes } from "node:crypto";
4
- import http from "node:http";
5
- import { setTimeout as setTimeout$1 } from "node:timers/promises";
6
- //#region src/auth/oauth/openai-codex.ts
7
- /**
8
- * OpenAI Codex (ChatGPT) OAuth.
9
- *
10
- * Owns callback validation, manual prompt handling, and success/error pages.
11
- */
12
- function requestSignal(signal) {
13
- const timeout = AbortSignal.timeout(TOKEN_REQUEST_TIMEOUT_MS);
14
- return signal ? AbortSignal.any([signal, timeout]) : timeout;
15
- }
16
- function xopcOAuthHtml(params) {
17
- const color = params.tone === "success" ? "#2563eb" : "#dc2626";
18
- const escapedTitle = escapeHtml(params.title);
19
- return `<!doctype html>
20
- <html lang="en">
21
- <head>
22
- <meta charset="utf-8" />
23
- <meta name="viewport" content="width=device-width, initial-scale=1" />
24
- <title>${escapedTitle}</title>
25
- <style>
26
- :root { color-scheme: light dark; font-family: Inter, ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif; }
27
- body { margin: 0; min-height: 100vh; display: grid; place-items: center; background: #f8fafc; color: #0f172a; }
28
- @media (prefers-color-scheme: dark) { body { background: #020617; color: #e2e8f0; } .card { background: #0f172a !important; border-color: #1e293b !important; } .muted { color: #94a3b8 !important; } }
29
- .card { width: min(520px, calc(100vw - 32px)); background: white; border: 1px solid #e2e8f0; border-radius: 20px; padding: 28px; box-sizing: border-box; }
30
- .brand { display: flex; align-items: center; gap: 12px; margin-bottom: 20px; font-weight: 700; }
31
- .logo { width: 36px; height: 36px; border-radius: 12px; display: grid; place-items: center; color: white; background: ${color}; font-weight: 800; letter-spacing: -0.04em; }
32
- h1 { font-size: 22px; margin: 0 0 10px; }
33
- p { margin: 0; line-height: 1.6; }
34
- .muted { color: #64748b; margin-top: 14px; font-size: 14px; }
35
- </style>
36
- </head>
37
- <body>
38
- <main class="card">
39
- <div class="brand"><div class="logo">x</div><div>xopc</div></div>
40
- <h1>${escapedTitle}</h1>
41
- <p>${escapeHtml(params.message)}</p>
42
- <p class="muted">You can close this window and return to the terminal.</p>
43
- </main>
44
- </body>
45
- </html>`;
46
- }
47
- function escapeHtml(value) {
48
- return value.replace(/[&<>"]/g, (char) => ({
49
- "&": "&amp;",
50
- "<": "&lt;",
51
- ">": "&gt;",
52
- "\"": "&quot;"
53
- })[char] ?? char);
54
- }
55
- function createState() {
56
- return randomBytes(16).toString("hex");
57
- }
58
- function waitForManualPromptDelay(signal) {
59
- return new Promise((resolve, reject) => {
60
- if (signal?.aborted) {
61
- reject(/* @__PURE__ */ new Error("Login cancelled"));
62
- return;
63
- }
64
- const timeout = setTimeout(() => resolve({ type: "unavailable" }), MANUAL_PROMPT_DELAY_MS);
65
- timeout.unref?.();
66
- const abort = () => {
67
- clearTimeout(timeout);
68
- reject(/* @__PURE__ */ new Error("Login cancelled"));
69
- };
70
- signal?.addEventListener("abort", abort, { once: true });
71
- });
72
- }
73
- function parseOAuthAuthorizationInput(input) {
74
- const trimmed = input.trim();
75
- if (!trimmed) return {};
76
- try {
77
- const url = new URL(trimmed);
78
- return {
79
- code: url.searchParams.get("code") ?? void 0,
80
- state: url.searchParams.get("state") ?? void 0
81
- };
82
- } catch {}
83
- if (trimmed.includes("=")) {
84
- const params = new URLSearchParams(trimmed.startsWith("?") ? trimmed.slice(1) : trimmed);
85
- return {
86
- code: params.get("code") ?? void 0,
87
- state: params.get("state") ?? void 0
88
- };
89
- }
90
- return { code: trimmed };
91
- }
92
- async function parsePromptedAuthorizationCode(inputPromise, state) {
93
- const parsed = parseOAuthAuthorizationInput(await inputPromise);
94
- if (parsed.state && parsed.state !== state) throw new Error("State mismatch. Paste the redirect URL from the most recent xopc OAuth login.");
95
- if (!parsed.code) throw new Error("Missing authorization code");
96
- return parsed.code;
97
- }
98
- async function createAuthorizationFlow() {
99
- const { verifier, challenge } = await generatePKCE();
100
- const state = createState();
101
- const url = new URL(AUTHORIZE_URL);
102
- url.searchParams.set("response_type", "code");
103
- url.searchParams.set("client_id", CLIENT_ID);
104
- url.searchParams.set("redirect_uri", REDIRECT_URI);
105
- url.searchParams.set("scope", SCOPE);
106
- url.searchParams.set("code_challenge", challenge);
107
- url.searchParams.set("code_challenge_method", "S256");
108
- url.searchParams.set("state", state);
109
- url.searchParams.set("id_token_add_organizations", "true");
110
- url.searchParams.set("codex_cli_simplified_flow", "true");
111
- url.searchParams.set("originator", "xopc");
112
- return {
113
- verifier,
114
- state,
115
- url: url.toString()
116
- };
117
- }
118
- async function startLocalOAuthServer(state) {
119
- let settleWait;
120
- const waitForCodePromise = new Promise((resolve) => {
121
- let settled = false;
122
- settleWait = (value) => {
123
- if (settled) return;
124
- settled = true;
125
- resolve(value);
126
- };
127
- });
128
- const server = http.createServer((req, res) => {
129
- try {
130
- const url = new URL(req.url || "", "http://localhost");
131
- res.setHeader("Content-Type", "text/html; charset=utf-8");
132
- if (url.pathname !== CALLBACK_PATH) {
133
- res.statusCode = 404;
134
- res.end(xopcOAuthHtml({
135
- title: "Callback route not found",
136
- message: "This xopc OAuth callback URL is not valid.",
137
- tone: "error"
138
- }));
139
- return;
140
- }
141
- const code = url.searchParams.get("code");
142
- if (!code) {
143
- res.statusCode = 400;
144
- res.end(xopcOAuthHtml({
145
- title: "Authentication failed",
146
- message: "OpenAI did not return an authorization code.",
147
- tone: "error"
148
- }));
149
- return;
150
- }
151
- if (url.searchParams.get("state") !== state) {
152
- res.statusCode = 400;
153
- res.end(xopcOAuthHtml({
154
- title: "Authentication needs manual confirmation",
155
- message: "This callback belongs to a different xopc OAuth attempt. Copy the full URL from the address bar and paste it in the terminal prompt for the latest login.",
156
- tone: "error"
157
- }));
158
- settleWait?.({ type: "unavailable" });
159
- return;
160
- }
161
- res.statusCode = 200;
162
- res.end(xopcOAuthHtml({
163
- title: "OpenAI authentication complete",
164
- message: "xopc received the authorization callback successfully.",
165
- tone: "success"
166
- }));
167
- settleWait?.({
168
- type: "code",
169
- code
170
- });
171
- } catch {
172
- res.statusCode = 500;
173
- res.setHeader("Content-Type", "text/html; charset=utf-8");
174
- res.end(xopcOAuthHtml({
175
- title: "Authentication failed",
176
- message: "xopc could not process the OAuth callback.",
177
- tone: "error"
178
- }));
179
- }
180
- });
181
- return new Promise((resolve) => {
182
- server.listen(CALLBACK_PORT, () => {
183
- resolve({
184
- available: true,
185
- close: () => server.close(),
186
- cancelWait: () => settleWait?.({ type: "unavailable" }),
187
- waitForCode: () => waitForCodePromise
188
- });
189
- }).on("error", () => {
190
- resolve({
191
- available: false,
192
- close: () => {},
193
- cancelWait: () => settleWait?.({ type: "unavailable" }),
194
- waitForCode: async () => ({ type: "unavailable" })
195
- });
196
- });
197
- });
198
- }
199
- async function postTokenForm(body, signal) {
200
- const response = await fetch(TOKEN_URL, {
201
- method: "POST",
202
- headers: {
203
- "Content-Type": "application/x-www-form-urlencoded",
204
- Accept: "application/json"
205
- },
206
- body,
207
- signal: requestSignal(signal)
208
- });
209
- const contentType = response.headers.get("content-type") ?? "";
210
- const text = await response.text();
211
- if (!response.ok) throw new Error(`OpenAI Codex token request failed (${response.status}): ${text || response.statusText}`);
212
- if (!contentType.toLowerCase().includes("application/json")) throw new Error(`OpenAI Codex token response was not JSON: ${contentType || "missing content-type"}`);
213
- return JSON.parse(text);
214
- }
215
- async function exchangeAuthorizationCode(code, verifier, signal, redirectUri = REDIRECT_URI) {
216
- return normalizeTokenResponse(await postTokenForm(new URLSearchParams({
217
- grant_type: "authorization_code",
218
- client_id: CLIENT_ID,
219
- code,
220
- code_verifier: verifier,
221
- redirect_uri: redirectUri
222
- }), signal));
223
- }
224
- async function requestDeviceCode(signal) {
225
- const response = await fetch(DEVICE_USER_CODE_URL, {
226
- method: "POST",
227
- headers: {
228
- "Content-Type": "application/json",
229
- Accept: "application/json"
230
- },
231
- body: JSON.stringify({ client_id: CLIENT_ID }),
232
- signal: requestSignal(signal)
233
- });
234
- const body = await response.json().catch(() => ({}));
235
- if (!response.ok) {
236
- if (response.status === 404) throw new Error("OpenAI Codex device code login is not enabled. Enable it in ChatGPT security or workspace settings, or use browser login.");
237
- throw new Error(body.error_description ?? body.error ?? `OpenAI Codex device code request failed (${response.status})`);
238
- }
239
- if (!body.device_auth_id || !body.user_code) throw new Error("OpenAI Codex device code response is incomplete");
240
- const intervalSeconds = Number(body.interval);
241
- return {
242
- deviceAuthId: body.device_auth_id,
243
- userCode: body.user_code,
244
- intervalMs: Math.max(1, Number.isFinite(intervalSeconds) ? intervalSeconds : 5) * 1e3
245
- };
246
- }
247
- async function pollDeviceAuthorization(params) {
248
- const expiresAt = Date.now() + DEVICE_AUTH_TIMEOUT_MS;
249
- while (Date.now() < expiresAt) {
250
- if (params.signal?.aborted) throw params.signal.reason instanceof Error ? params.signal.reason : /* @__PURE__ */ new Error("OpenAI Codex login cancelled");
251
- const response = await fetch(DEVICE_TOKEN_URL, {
252
- method: "POST",
253
- headers: {
254
- "Content-Type": "application/json",
255
- Accept: "application/json"
256
- },
257
- body: JSON.stringify({
258
- device_auth_id: params.deviceAuthId,
259
- user_code: params.userCode
260
- }),
261
- signal: requestSignal(params.signal)
262
- });
263
- const body = await response.json().catch(() => ({}));
264
- if (response.ok) {
265
- if (!body.authorization_code || !body.code_verifier) throw new Error("OpenAI Codex device authorization response is incomplete");
266
- return {
267
- code: body.authorization_code,
268
- verifier: body.code_verifier
269
- };
270
- }
271
- if (response.status !== 403 && response.status !== 404) throw new Error(body.error_description ?? body.error ?? `OpenAI Codex device authorization failed (${response.status})`);
272
- const remainingMs = expiresAt - Date.now();
273
- await setTimeout$1(Math.min(params.intervalMs, remainingMs), void 0, params.signal ? { signal: params.signal } : void 0);
274
- }
275
- throw new Error("OpenAI Codex device authorization timed out");
276
- }
277
- async function loginOpenAICodexWithDeviceCode(callbacks) {
278
- const device = await requestDeviceCode(callbacks.signal);
279
- callbacks.onDeviceCode({
280
- userCode: device.userCode,
281
- verificationUri: DEVICE_VERIFICATION_URL,
282
- intervalSeconds: device.intervalMs / 1e3,
283
- expiresInSeconds: DEVICE_AUTH_TIMEOUT_MS / 1e3
284
- });
285
- const authorization = await pollDeviceAuthorization({
286
- ...device,
287
- signal: callbacks.signal
288
- });
289
- return exchangeAuthorizationCode(authorization.code, authorization.verifier, callbacks.signal, DEVICE_REDIRECT_URI);
290
- }
291
- async function refreshAccessToken(refreshToken) {
292
- return normalizeTokenResponse(await postTokenForm(new URLSearchParams({
293
- grant_type: "refresh_token",
294
- client_id: CLIENT_ID,
295
- refresh_token: refreshToken
296
- })));
297
- }
298
- function normalizeTokenResponse(json) {
299
- if (!json.access_token || !json.refresh_token || typeof json.expires_in !== "number") {
300
- const missing = [
301
- !json.access_token ? "access_token" : "",
302
- !json.refresh_token ? "refresh_token" : "",
303
- typeof json.expires_in !== "number" ? "expires_in" : ""
304
- ].filter(Boolean).join(", ");
305
- throw new Error(`OpenAI Codex token response missing fields: ${missing}`);
306
- }
307
- const accountId = getAccountId(json.access_token);
308
- if (!accountId) throw new Error("Failed to extract accountId from token");
309
- return {
310
- access: json.access_token,
311
- refresh: json.refresh_token,
312
- expires: Date.now() + json.expires_in * 1e3,
313
- accountId
314
- };
315
- }
316
- function getAccountId(accessToken) {
317
- const [, payload] = accessToken.split(".");
318
- if (!payload) return null;
319
- try {
320
- const normalized = payload.replace(/-/g, "+").replace(/_/g, "/");
321
- const padded = normalized.padEnd(Math.ceil(normalized.length / 4) * 4, "=");
322
- const json = JSON.parse(Buffer.from(padded, "base64").toString("utf8"));
323
- const authClaim = json["https://api.openai.com/auth"];
324
- if (authClaim && typeof authClaim === "object") {
325
- const accountId = authClaim.chatgpt_account_id;
326
- if (typeof accountId === "string" && accountId.length > 0) return accountId;
327
- }
328
- return typeof json.sub === "string" && json.sub.length > 0 ? json.sub : null;
329
- } catch {
330
- return null;
331
- }
332
- }
333
- async function loginOpenAICodexWithBrowser(callbacks) {
334
- const { verifier, state, url } = await createAuthorizationFlow();
335
- const server = await startLocalOAuthServer(state);
336
- try {
337
- callbacks.onAuth({
338
- url,
339
- instructions: server.available ? "A browser window should open. Complete login to finish. If it does not complete automatically, paste the final redirect URL in the terminal." : "Open this URL and paste the final redirect URL in the terminal. xopc could not bind localhost:1455 for the automatic callback."
340
- });
341
- let code;
342
- if (server.available) {
343
- const callback = await Promise.race([server.waitForCode(), waitForManualPromptDelay(callbacks.signal)]);
344
- if (callback.type === "code") code = callback.code;
345
- }
346
- if (!code) {
347
- const manualCode = parsePromptedAuthorizationCode(callbacks.onManualCodeInput ? callbacks.onManualCodeInput() : callbacks.onPrompt({ message: "Paste the authorization code (or full redirect URL):" }), state).then((value) => {
348
- server.cancelWait();
349
- return {
350
- type: "code",
351
- code: value
352
- };
353
- });
354
- const callback = await Promise.race([server.waitForCode(), manualCode]);
355
- if (callback.type === "code") code = callback.code;
356
- }
357
- if (!code) throw new Error("Missing authorization code");
358
- return await exchangeAuthorizationCode(code, verifier, callbacks.signal);
359
- } finally {
360
- server.close();
361
- }
362
- }
363
- async function loginOpenAICodex(callbacks) {
364
- return await callbacks.onSelect({
365
- message: "Choose how to authorize OpenAI Codex",
366
- options: [{
367
- id: "browser",
368
- label: "Browser (recommended for this device)"
369
- }, {
370
- id: "device_code",
371
- label: "Device code (remote or headless)"
372
- }]
373
- }) === "device_code" ? loginOpenAICodexWithDeviceCode(callbacks) : loginOpenAICodexWithBrowser(callbacks);
374
- }
375
- async function refreshOpenAICodexToken(refreshToken) {
376
- return refreshAccessToken(refreshToken);
377
- }
378
- var CLIENT_ID, AUTH_BASE_URL, AUTHORIZE_URL, TOKEN_URL, DEVICE_USER_CODE_URL, DEVICE_TOKEN_URL, DEVICE_VERIFICATION_URL, DEVICE_REDIRECT_URI, CALLBACK_PORT, CALLBACK_PATH, REDIRECT_URI, SCOPE, MANUAL_PROMPT_DELAY_MS, TOKEN_REQUEST_TIMEOUT_MS, DEVICE_AUTH_TIMEOUT_MS, openaiCodexOAuthProvider;
379
- var init_openai_codex = __esmMin((() => {
380
- init_pkce();
381
- CLIENT_ID = "app_EMoamEEZ73f0CkXaXp7hrann";
382
- AUTH_BASE_URL = "https://auth.openai.com";
383
- AUTHORIZE_URL = `${AUTH_BASE_URL}/oauth/authorize`;
384
- TOKEN_URL = `${AUTH_BASE_URL}/oauth/token`;
385
- DEVICE_USER_CODE_URL = `${AUTH_BASE_URL}/api/accounts/deviceauth/usercode`;
386
- DEVICE_TOKEN_URL = `${AUTH_BASE_URL}/api/accounts/deviceauth/token`;
387
- DEVICE_VERIFICATION_URL = `${AUTH_BASE_URL}/codex/device`;
388
- DEVICE_REDIRECT_URI = `${AUTH_BASE_URL}/deviceauth/callback`;
389
- CALLBACK_PORT = 1455;
390
- CALLBACK_PATH = "/auth/callback";
391
- REDIRECT_URI = `http://localhost:${CALLBACK_PORT}${CALLBACK_PATH}`;
392
- SCOPE = "openid profile email offline_access";
393
- MANUAL_PROMPT_DELAY_MS = 15e3;
394
- TOKEN_REQUEST_TIMEOUT_MS = 3e4;
395
- DEVICE_AUTH_TIMEOUT_MS = 15 * 6e4;
396
- openaiCodexOAuthProvider = {
397
- id: "openai-codex",
398
- name: "OpenAI Codex",
399
- usesCallbackServer: true,
400
- loginMethods: ["browser", "device_code"],
401
- async login(callbacks) {
402
- return loginOpenAICodex(callbacks);
403
- },
404
- async refreshToken(credentials) {
405
- return refreshOpenAICodexToken(credentials.refresh);
406
- },
407
- getApiKey(credentials) {
408
- return credentials.access;
409
- }
410
- };
411
- }));
412
- //#endregion
413
- init_openai_codex();
414
- export { init_openai_codex, loginOpenAICodex, openaiCodexOAuthProvider, refreshOpenAICodexToken };
@@ -1,17 +0,0 @@
1
- import type { BrowserActionInput, BrowserRiskLevel } from '@xopcai/browser-control-contract';
2
- export type BrowserApprovalStatus = 'pending' | 'approved' | 'denied' | 'consumed' | 'expired';
3
- export interface BrowserApproval {
4
- id: string;
5
- conversationId: string;
6
- risk: BrowserRiskLevel;
7
- action: BrowserActionInput['action'];
8
- summary: string;
9
- argumentsHash: string;
10
- status: BrowserApprovalStatus;
11
- createdAt: string;
12
- expiresAt: string;
13
- }
14
- export declare function createBrowserApproval(conversationId: string, input: BrowserActionInput, risk: BrowserRiskLevel, summary: string): BrowserApproval;
15
- export declare function listBrowserApprovals(conversationId?: string): BrowserApproval[];
16
- export declare function decideBrowserApproval(id: string, decision: 'approved' | 'denied'): BrowserApproval | undefined;
17
- export declare function consumeBrowserApproval(id: string | undefined, conversationId: string, input: BrowserActionInput): boolean;
@@ -1,62 +0,0 @@
1
- import { createHash, randomUUID } from "node:crypto";
2
- //#region src/browser/policy/approval-store.ts
3
- const TTL_MS = 600 * 1e3;
4
- const approvals = /* @__PURE__ */ new Map();
5
- function createBrowserApproval(conversationId, input, risk, summary) {
6
- expireApprovals();
7
- const argumentsHash = browserArgumentsHash(input);
8
- const existing = [...approvals.values()].find((approval) => approval.conversationId === conversationId && approval.argumentsHash === argumentsHash && approval.status === "pending");
9
- if (existing) return existing;
10
- const now = Date.now();
11
- const approval = {
12
- id: randomUUID(),
13
- conversationId,
14
- risk,
15
- action: input.action,
16
- summary,
17
- argumentsHash,
18
- status: "pending",
19
- createdAt: new Date(now).toISOString(),
20
- expiresAt: new Date(now + TTL_MS).toISOString()
21
- };
22
- approvals.set(approval.id, approval);
23
- return approval;
24
- }
25
- function listBrowserApprovals(conversationId) {
26
- expireApprovals();
27
- return [...approvals.values()].filter((approval) => !conversationId || approval.conversationId === conversationId).sort((left, right) => right.createdAt.localeCompare(left.createdAt));
28
- }
29
- function decideBrowserApproval(id, decision) {
30
- expireApprovals();
31
- const approval = approvals.get(id);
32
- if (!approval || approval.status !== "pending") return approval;
33
- approval.status = decision;
34
- return approval;
35
- }
36
- function consumeBrowserApproval(id, conversationId, input) {
37
- expireApprovals();
38
- const argumentsHash = browserArgumentsHash(input);
39
- const approval = id ? approvals.get(id) : [...approvals.values()].find((candidate) => candidate.conversationId === conversationId && candidate.argumentsHash === argumentsHash && candidate.status === "approved");
40
- if (!approval || approval.status !== "approved") return false;
41
- if (approval.conversationId !== conversationId || approval.argumentsHash !== argumentsHash) return false;
42
- approval.status = "consumed";
43
- return true;
44
- }
45
- function browserArgumentsHash(input) {
46
- const canonical = {
47
- ...input,
48
- approvalId: void 0
49
- };
50
- return createHash("sha256").update(JSON.stringify(sortRecursively(canonical))).digest("hex");
51
- }
52
- function sortRecursively(value) {
53
- if (Array.isArray(value)) return value.map(sortRecursively);
54
- if (!value || typeof value !== "object") return value;
55
- return Object.fromEntries(Object.entries(value).filter(([, child]) => child !== void 0).sort(([left], [right]) => left.localeCompare(right)).map(([key, child]) => [key, sortRecursively(child)]));
56
- }
57
- function expireApprovals() {
58
- const now = Date.now();
59
- for (const approval of approvals.values()) if ((approval.status === "pending" || approval.status === "approved") && Date.parse(approval.expiresAt) <= now) approval.status = "expired";
60
- }
61
- //#endregion
62
- export { consumeBrowserApproval, createBrowserApproval, decideBrowserApproval, listBrowserApprovals };