@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
@@ -0,0 +1,60 @@
1
+ import { getEmbeddedExecutionRunId, runWithEmbeddedExecutionSession } from "./execution-context.js";
2
+ import { parseExternalToolRef } from "../external-tools/refs.js";
3
+ import { wrapToolsWithProtection } from "../tools/executor.js";
4
+ import { setXopcToolMetadata } from "./tool-metadata.js";
5
+ import { getExternalToolRegistry } from "../external-tools/tool-registry.js";
6
+ import { createHash } from "node:crypto";
7
+ //#region src/agent/embedded/external-tool-discovery.ts
8
+ /** Project the current host directory into pi; pi owns search and declaration loading. */
9
+ async function materializeNativeExternalTools(params) {
10
+ const registry = getExternalToolRegistry(params.tools);
11
+ if (!registry) return [];
12
+ return runWithEmbeddedExecutionSession(params.conversationId, async () => {
13
+ const descriptors = await registry.service.catalog(registry.nativeSources);
14
+ const names = new Set(params.tools.map((tool) => tool.name));
15
+ const refs = /* @__PURE__ */ new Map();
16
+ return wrapToolsWithProtection(descriptors.map((descriptor) => {
17
+ const parsed = parseExternalToolRef(descriptor.toolRef, descriptor.source);
18
+ if (!parsed) throw new Error("Invalid native tool identity");
19
+ const suffix = createHash("sha256").update(descriptor.toolRef).digest("hex").slice(0, 12);
20
+ const prefix = descriptor.source === "endpoint" ? "device" : descriptor.source;
21
+ const name = `${prefix}__${parsed.toolName.replace(/[^A-Za-z0-9_]/g, "_").slice(0, 40)}_${suffix}`;
22
+ if (names.has(name)) throw new Error(`Native tool identifier collision: ${name}`);
23
+ names.add(name);
24
+ refs.set(name, descriptor.toolRef);
25
+ return setXopcToolMetadata({
26
+ name,
27
+ label: descriptor.title,
28
+ description: `${descriptor.description}\n${descriptor.summary}`,
29
+ parameters: descriptor.inputSchema,
30
+ execute(id, args, signal, update) {
31
+ return runWithEmbeddedExecutionSession(params.conversationId, () => registry.execute(id, {
32
+ toolRef: descriptor.toolRef,
33
+ revision: descriptor.revision,
34
+ arguments: args,
35
+ ...descriptor.batchRead ? { readOnly: true } : {}
36
+ }, signal, update), getEmbeddedExecutionRunId());
37
+ }
38
+ }, {
39
+ exposure: descriptor.exposure === "model-only" ? "model-only" : "deferred",
40
+ namespace: {
41
+ name: `${prefix}__${createHash("sha256").update(parsed.namespace).digest("hex").slice(0, 12)}`,
42
+ description: descriptor.source === "endpoint" ? "Tools of the current authorized device" : descriptor.namespace
43
+ },
44
+ outputSchema: descriptor.outputSchema,
45
+ annotations: descriptor.annotations,
46
+ external: {
47
+ toolRef: descriptor.toolRef,
48
+ revision: descriptor.revision,
49
+ readOnly: descriptor.batchRead === true
50
+ },
51
+ ...registry.subscribeInvalidation ? { subscribeInvalidation: (listener) => registry.subscribeInvalidation(params.conversationId, descriptor.toolRef, listener) } : {}
52
+ });
53
+ }), {
54
+ ...registry.executorConfig,
55
+ resolveTimeoutMs: (name) => registry.executorConfig?.resolveTimeoutMs?.(refs.get(name) ?? name) ?? registry.executorConfig?.resolveTimeoutMs?.("xopc_tool_execute")
56
+ });
57
+ }, getEmbeddedExecutionRunId());
58
+ }
59
+ //#endregion
60
+ export { materializeNativeExternalTools };
@@ -1,8 +1,9 @@
1
1
  import { init_paths, resolveModelsJsonPath } from "../../config/paths.js";
2
+ import { init_register_bundled_oauth_flows, registerBundledOAuthFlows } from "../../providers/register-bundled-oauth-flows.js";
3
+ import { assertCurrentModelProvider, init_provider_policy } from "../../providers/provider-policy.js";
2
4
  import { CredentialResolver, init_credentials } from "../../auth/credentials.js";
3
5
  import { init_sync_provider_auth, resolveProviderApiKeySync } from "../../auth/sync-provider-auth.js";
4
6
  import { XopcModelCredentialStore, init_model_credential_store } from "../../auth/model-credential-store.js";
5
- import { init_register_bundled_oauth_flows, registerBundledOAuthFlows } from "../../providers/register-bundled-oauth-flows.js";
6
7
  import { init_register_runtime_providers, registerRuntimeProviders } from "../../providers/register-runtime-providers.js";
7
8
  import { getApiKeySync, init_providers } from "../../providers/index.js";
8
9
  import { InMemoryModelsStore } from "@earendil-works/pi-ai";
@@ -15,10 +16,12 @@ init_paths();
15
16
  init_providers();
16
17
  init_register_bundled_oauth_flows();
17
18
  init_register_runtime_providers();
19
+ init_provider_policy();
18
20
  function resolveEmbeddedProviderApiKeySync(providerId) {
19
21
  return resolveProviderApiKeySync(providerId) ?? getApiKeySync(providerId);
20
22
  }
21
23
  async function createEmbeddedModelRuntime(providerId) {
24
+ assertCurrentModelProvider(providerId);
22
25
  registerBundledOAuthFlows();
23
26
  const resolver = new CredentialResolver();
24
27
  const credentials = new XopcModelCredentialStore(resolver);
@@ -30,7 +33,7 @@ async function createEmbeddedModelRuntime(providerId) {
30
33
  registerRuntimeProviders(modelRuntime);
31
34
  const runtimeProvider = modelRuntime.getProvider(providerId);
32
35
  const storedCredential = await credentials.read(providerId);
33
- if (!(runtimeProvider?.auth.oauth && storedCredential?.type === "oauth")) {
36
+ if (await resolver.resolveApiKeySource(providerId) !== "oauth" || !(runtimeProvider?.auth.oauth && storedCredential?.type === "oauth")) {
34
37
  const key = await resolver.resolveApiKey(providerId) ?? getApiKeySync(providerId);
35
38
  if (key && key !== "extension-managed") await modelRuntime.setRuntimeApiKey(providerId, key);
36
39
  }
@@ -10,6 +10,7 @@ import { isPersonalConversation } from "../../personal-agent/repository.js";
10
10
  import { runWithEmbeddedExecutionSession } from "./execution-context.js";
11
11
  import { resolveAgentTurnTimeoutMs } from "../orchestration/run-agent-turn-with-timeout.js";
12
12
  import { resolvePromptCachePolicy } from "../../providers/prompt-cache-plan.js";
13
+ import { prepareNativeMcpConfig } from "../mcp/native-mcp.js";
13
14
  import { evaluateContextBudget } from "../memory/context-budget.js";
14
15
  import { assessContext, recoverContext as recoverContext$1 } from "../memory/context-recovery.js";
15
16
  import { resolveCompactionPolicy } from "../memory/compaction-policy.js";
@@ -18,6 +19,7 @@ import { projectTurnOutcome } from "../../session/turn-outcome-projector.js";
18
19
  import { voicePresentationPrompt } from "../prompt/voice-presentation.js";
19
20
  import { applyStartupContextToUserMessage } from "../reply/apply-turn-user-enrichment.js";
20
21
  import { AgentRunSupervisor } from "../orchestration/agent-run-supervisor.js";
22
+ import { materializeNativeExternalTools } from "./external-tool-discovery.js";
21
23
  import crypto from "node:crypto";
22
24
  //#region src/agent/embedded/run-for-session.ts
23
25
  init_src();
@@ -124,7 +126,7 @@ async function runEmbeddedTurnForSessionInner(params) {
124
126
  if (typeof mm.applyResolvedModel === "function") mm.applyResolvedModel(agent, model, modelRef);
125
127
  else await mm.applyModelForSession(agent, conversationId);
126
128
  agentManager.setModelForSession(conversationId, modelRef);
127
- const tools = agent.state.tools;
129
+ const tools = [...agent.state.tools];
128
130
  const turnPolicy = agentManager.createAgentTurnPolicy(conversationId);
129
131
  const systemPrompt = appendDynamicPromptSection([agent.state.systemPrompt ?? "", params.presentation === "voice" ? voicePresentationPrompt : ""].filter(Boolean).join("\n\n"), params.dynamicSystemContext ?? "");
130
132
  const idlePolicy = resolveCompactionPolicy(config);
@@ -164,6 +166,11 @@ async function runEmbeddedTurnForSessionInner(params) {
164
166
  };
165
167
  const thinkingLevel = params.thinkingOverride ?? agent.state.thinkingLevel;
166
168
  const workspaceDir = agentManager.getResolvedWorkspaceForSession(conversationId);
169
+ tools.push(...await materializeNativeExternalTools({
170
+ conversationId,
171
+ tools
172
+ }));
173
+ const mcp = config ? await prepareNativeMcpConfig(config, workspaceDir) : void 0;
167
174
  const promptCachePolicy = resolvePromptCachePolicy(config ? resolveEffectiveAgentProfileForSession(conversationId).config.runtime.promptCache : void 0);
168
175
  let userMessageForTurn = userMessage;
169
176
  if (params.applyStartupContext !== false) {
@@ -263,6 +270,8 @@ async function runEmbeddedTurnForSessionInner(params) {
263
270
  tools,
264
271
  systemPrompt,
265
272
  thinkingLevel,
273
+ codemode: config ? resolveEffectiveAgentProfileForSession(conversationId).config.runtime.codemode : void 0,
274
+ mcp,
266
275
  promptCachePolicy,
267
276
  compactionPolicy: resolveCompactionPolicy(config),
268
277
  workspaceDir,
@@ -10,6 +10,7 @@ import { setTraceIdentity, traceOperation, traceRun, traceTools } from "../../ob
10
10
  import { resolveEffectiveAgentConfigForSession } from "../../config/agent-profile.js";
11
11
  import { continuesAfterTool, trackAiUsageStream } from "../../usage/recorder.js";
12
12
  import { runWithEmbeddedExecutionSession } from "./execution-context.js";
13
+ import { externalPolicyContext } from "./tool-metadata.js";
13
14
  import { isComputerControlActive, isComputerLeaseTool, stopComputerControl } from "../../computer/control-guard.js";
14
15
  import { EmbeddedRunConflictError, abortEmbeddedRun, acquireEmbeddedRunLease, queueEmbeddedSteer } from "./runs.js";
15
16
  import { lastAssistantPlainText, subscribeEmbeddedSessionEvents } from "./subscribe-session.js";
@@ -282,6 +283,8 @@ async function runXopcEmbeddedTurnInner(params) {
282
283
  model: resolvedModel,
283
284
  modelRef: params.modelRef,
284
285
  tools,
286
+ codemode: params.codemode,
287
+ mcp: params.mcp,
285
288
  systemPrompt: [systemPrompt, rootInstructions].filter(Boolean).join("\n\n"),
286
289
  thinkingLevel: configuredThinking ?? thinkingLevel ?? "medium",
287
290
  transcriptRuntime
@@ -529,7 +532,7 @@ async function runXopcEmbeddedTurnInner(params) {
529
532
  reason: "Waiting for the user to answer.",
530
533
  terminate: true
531
534
  };
532
- const decision = await params.turnPolicy?.beforeToolCall(context, signal);
535
+ const decision = await params.turnPolicy?.beforeToolCall(externalPolicyContext(context, tools), signal);
533
536
  if (decision?.block) {
534
537
  policyStopped ||= decision.terminate === true;
535
538
  return decision;
@@ -561,10 +564,13 @@ async function runXopcEmbeddedTurnInner(params) {
561
564
  text: scoped
562
565
  });
563
566
  await params.turnPolicy?.afterToolCall({
564
- ...context,
567
+ ...externalPolicyContext(context, tools),
565
568
  ...checked
566
569
  });
567
- return checked;
570
+ return {
571
+ ...checked.result,
572
+ isError: checked.isError
573
+ };
568
574
  };
569
575
  const baseFinishTurn = session.agent.finishTurn;
570
576
  session.agent.finishTurn = async (context, signal) => {
@@ -675,6 +681,7 @@ async function runXopcEmbeddedTurnInner(params) {
675
681
  });
676
682
  if (runAbortSignal.aborted) return {
677
683
  ok: false,
684
+ retryable: false,
678
685
  errorMessage: "aborted"
679
686
  };
680
687
  if (isAssistantTurnAborted(session.agent)) return {
@@ -1,9 +1,10 @@
1
1
  import type { AgentTool } from '@earendil-works/pi-agent-core';
2
2
  import type { ThinkingLevel } from '@earendil-works/pi-agent-core';
3
- import { type AgentSession } from '@earendil-works/pi-coding-agent';
3
+ import { type LoadedMcpConfig, type AgentSession } from '@earendil-works/pi-coding-agent';
4
4
  import type { Model, Api } from '@earendil-works/pi-ai';
5
5
  import { type GuardedPiTranscriptManager } from './session-tool-result-guard.js';
6
6
  import type { EmbeddedTranscriptRuntime } from './transcript-runtime.js';
7
+ import { type CodemodePolicy } from './codemode-extension.js';
7
8
  export type EmbeddedRunnerFingerprintInput = {
8
9
  transcriptId: string;
9
10
  workspaceDir: string;
@@ -13,6 +14,8 @@ export type EmbeddedRunnerFingerprintInput = {
13
14
  systemPrompt: string;
14
15
  thinkingLevel: string;
15
16
  credentialRevision: string;
17
+ codemode?: CodemodePolicy;
18
+ mcp?: LoadedMcpConfig;
16
19
  };
17
20
  export declare function buildEmbeddedRunnerFingerprint(input: EmbeddedRunnerFingerprintInput): string;
18
21
  export type AcquireEmbeddedSessionRunnerParams = {
@@ -25,6 +28,8 @@ export type AcquireEmbeddedSessionRunnerParams = {
25
28
  systemPrompt: string;
26
29
  thinkingLevel: ThinkingLevel;
27
30
  transcriptRuntime: EmbeddedTranscriptRuntime;
31
+ codemode?: CodemodePolicy;
32
+ mcp?: LoadedMcpConfig;
28
33
  };
29
34
  export type AcquiredEmbeddedSessionRunner = {
30
35
  session: AgentSession;
@@ -51,6 +56,8 @@ export interface EmbeddedSessionRunnerPoolOptions {
51
56
  * Owns the per-runtime pool of pi `AgentSession` runners.
52
57
  */
53
58
  export declare class EmbeddedSessionRunnerPool {
59
+ private readonly shutdowns;
60
+ drainShutdowns(): Promise<void>;
54
61
  private readonly pool;
55
62
  private readonly isEnabledFn;
56
63
  private readonly getIdleTtlMsFn;
@@ -72,3 +79,4 @@ export declare function resetEmbeddedSessionRunnerForTest(): void;
72
79
  export declare function evictEmbeddedSessionRunner(runtimeId: string, reason?: string): void;
73
80
  export declare function evictAllEmbeddedSessionRunners(reason?: string): void;
74
81
  export declare function acquireEmbeddedSessionRunner(params: AcquireEmbeddedSessionRunnerParams): Promise<AcquiredEmbeddedSessionRunner>;
82
+ export declare function drainEmbeddedSessionRunnerShutdowns(): Promise<void>;
@@ -1,15 +1,28 @@
1
1
  import { createLogger } from "../../utils/logger/index.js";
2
2
  import { init_logger } from "../../utils/logger.js";
3
+ import { isCodemodeCoreRead } from "../tools/codemode-permissions.js";
4
+ import { deferredToolContract, getXopcToolMetadata } from "./tool-metadata.js";
5
+ import { abortEmbeddedRun } from "./runs.js";
3
6
  import { guardSessionManager } from "./session-tool-result-guard.js";
4
7
  import { transformUserMessageForPersistence } from "../inbound/attachment-pipeline.js";
5
8
  import { createEmbeddedModelRuntime, resolveEmbeddedProviderApiKeySync } from "./model-runtime.js";
6
9
  import { wrapStreamFnForXopcExtensions } from "./xopc-stream-bridge.js";
7
10
  import { xopcToolsToDefinitions } from "./xopc-tools-bridge.js";
8
- import { applySystemPromptOverrideToSession } from "./system-prompt-override.js";
11
+ import { createXopcCodemodeExtension } from "./codemode-extension.js";
12
+ import { TOOL_DISCOVERY_STATE, createXopcToolSearchExtension } from "./tool-search-extension.js";
13
+ import { getNativePiAgentDir } from "../mcp/native-mcp.js";
14
+ import { join } from "node:path";
9
15
  import { createHash } from "node:crypto";
10
- import { DefaultResourceLoader, SettingsManager, createAgentSession, getAgentDir } from "@earendil-works/pi-coding-agent";
16
+ import { DefaultResourceLoader, SettingsManager, createAgentSession, createMcpExtension } from "@earendil-works/pi-coding-agent";
11
17
  //#region src/agent/embedded/session-runner.ts
12
18
  init_logger();
19
+ const toolContract = (tool) => JSON.stringify([
20
+ tool.name,
21
+ tool.parameters,
22
+ tool.description,
23
+ isCodemodeCoreRead(tool),
24
+ getXopcToolMetadata(tool)
25
+ ]);
13
26
  const log = createLogger("EmbeddedSessionRunner");
14
27
  const DEFAULT_IDLE_TTL_MS = 5 * 6e4;
15
28
  function providerCredentialRevision(providerId) {
@@ -26,7 +39,9 @@ function buildEmbeddedRunnerFingerprint(input) {
26
39
  [...input.toolContracts].sort().join("\0"),
27
40
  input.systemPrompt,
28
41
  input.thinkingLevel,
29
- input.credentialRevision
42
+ input.credentialRevision,
43
+ JSON.stringify(input.codemode ?? null),
44
+ JSON.stringify(input.mcp ?? null)
30
45
  ].join("\0")).digest("base64url");
31
46
  }
32
47
  function isEmbeddedSessionRunnerEnabled() {
@@ -41,7 +56,10 @@ function getEmbeddedSessionRunnerIdleTtlMs() {
41
56
  return Number.isFinite(parsed) && parsed > 0 ? parsed : DEFAULT_IDLE_TTL_MS;
42
57
  }
43
58
  function createEmbeddedSettingsManager(cwd) {
44
- const sm = SettingsManager.inMemory({ compaction: { enabled: false } });
59
+ const sm = SettingsManager.inMemory({
60
+ compaction: { enabled: false },
61
+ retry: { enabled: false }
62
+ });
45
63
  sm.setCompactionEnabled(false);
46
64
  return sm;
47
65
  }
@@ -49,6 +67,10 @@ function createEmbeddedSettingsManager(cwd) {
49
67
  * Owns the per-runtime pool of pi `AgentSession` runners.
50
68
  */
51
69
  var EmbeddedSessionRunnerPool = class {
70
+ shutdowns = /* @__PURE__ */ new Set();
71
+ async drainShutdowns() {
72
+ await Promise.allSettled([...this.shutdowns]);
73
+ }
52
74
  pool = /* @__PURE__ */ new Map();
53
75
  isEnabledFn;
54
76
  getIdleTtlMsFn;
@@ -69,8 +91,7 @@ var EmbeddedSessionRunnerPool = class {
69
91
  };
70
92
  }
71
93
  resetForTest() {
72
- for (const entry of this.pool.values()) this.clearIdleTimer(entry);
73
- this.pool.clear();
94
+ this.evictAll("test_reset");
74
95
  this.stats = {
75
96
  acquires: 0,
76
97
  reuses: 0,
@@ -93,10 +114,12 @@ var EmbeddedSessionRunnerPool = class {
93
114
  workspaceDir: params.workspaceDir,
94
115
  modelRef: params.modelRef,
95
116
  toolNames: params.tools.map((t) => t.name),
96
- toolContracts: params.tools.map((tool) => JSON.stringify([tool.name, tool.parameters])),
117
+ toolContracts: params.tools.map(toolContract),
97
118
  systemPrompt: params.systemPrompt,
98
119
  thinkingLevel: params.thinkingLevel ?? "medium",
99
- credentialRevision: providerCredentialRevision(params.model.provider)
120
+ credentialRevision: providerCredentialRevision(params.model.provider),
121
+ codemode: params.codemode,
122
+ mcp: params.mcp
100
123
  });
101
124
  const reuseEnabled = this.isEnabledFn();
102
125
  const existing = this.pool.get(params.runtimeId);
@@ -108,7 +131,6 @@ var EmbeddedSessionRunnerPool = class {
108
131
  entry.lastUsedAt = Date.now();
109
132
  reused = true;
110
133
  this.stats.reuses += 1;
111
- applySystemPromptOverrideToSession(entry.session, params.systemPrompt);
112
134
  entry.session.agent.streamFunction = entry.baseStreamFn;
113
135
  log.debug({ runtimeId: params.runtimeId }, "Reusing pooled embedded session runner");
114
136
  } else {
@@ -148,11 +170,33 @@ var EmbeddedSessionRunnerPool = class {
148
170
  }
149
171
  disposePooledRunner(runtimeId, entry, reason) {
150
172
  this.clearIdleTimer(entry);
173
+ for (const release of entry.releaseInvalidations) release();
151
174
  this.pool.delete(runtimeId);
152
175
  this.stats.evictions += 1;
153
- try {
154
- entry.piSm.flushPendingToolResults?.();
155
- } catch {}
176
+ const shutdown = Promise.resolve(entry.session.abort?.()).catch((err) => {
177
+ log.warn({
178
+ err,
179
+ runtimeId
180
+ }, "Embedded runner abort failed");
181
+ }).then(async () => {
182
+ try {
183
+ await entry.session.extensionRunner?.emit({
184
+ type: "session_shutdown",
185
+ reason: "quit"
186
+ });
187
+ } finally {
188
+ try {
189
+ entry.piSm.flushPendingToolResults?.();
190
+ } finally {
191
+ entry.session.dispose?.();
192
+ }
193
+ }
194
+ }).catch((err) => log.warn({
195
+ err,
196
+ runtimeId
197
+ }, "Embedded runner disposal failed"));
198
+ this.shutdowns.add(shutdown);
199
+ shutdown.finally(() => this.shutdowns.delete(shutdown));
156
200
  log.debug({
157
201
  runtimeId,
158
202
  reason
@@ -163,17 +207,46 @@ var EmbeddedSessionRunnerPool = class {
163
207
  const settingsManager = createEmbeddedSettingsManager(workspaceDir);
164
208
  const piSm = guardSessionManager(params.transcriptRuntime.openSessionManager(workspaceDir), {
165
209
  conversationId: params.transcriptRuntime.persistent ? runtimeId : void 0,
210
+ persistCustomTypes: ["codemode-store", TOOL_DISCOVERY_STATE],
166
211
  contextWindowTokens: model.contextWindow ?? 128e3,
167
212
  transformMessageForPersistence: params.transcriptRuntime.persistent ? (message) => transformUserMessageForPersistence(runtimeId, message) : void 0
168
213
  });
169
214
  const toolDefs = xopcToolsToDefinitions(tools);
170
- const toolNames = tools.map((t) => t.name);
215
+ const toolNames = tools.filter((tool) => getXopcToolMetadata(tool)?.exposure !== "deferred").map((tool) => tool.name);
216
+ const discoveryState = piSm.getBranch().findLast((entry) => entry.type === "custom" && entry.customType === "xopc-tool-discovery");
217
+ const saved = discoveryState?.type === "custom" ? discoveryState.data : void 0;
218
+ const restored = new Map((saved?.loaded ?? []).map((tool) => [tool.name, tool.contract]));
219
+ toolNames.push(...tools.filter((tool) => getXopcToolMetadata(tool)?.exposure === "deferred" && restored.get(tool.name) === deferredToolContract(tool)).map((tool) => tool.name));
220
+ let boundSession;
221
+ const mcp = params.mcp;
222
+ const hasMcp = Boolean(mcp?.servers.length);
223
+ const usesMcpCodemode = mcp?.servers.some((server) => server.config.enabled !== false && [server.config.exposure ?? "codemode", ...Object.values(server.config.toolExposure ?? {})].includes("codemode"));
224
+ const codemode = params.codemode?.enabled ? params.codemode : usesMcpCodemode ? {
225
+ enabled: true,
226
+ timeoutMs: 6e4,
227
+ maxConcurrentCalls: 4,
228
+ maxCalls: 32,
229
+ maxOutputTokens: 4e3
230
+ } : void 0;
231
+ if (codemode) toolNames.push("codemode");
232
+ const discovery = hasMcp || tools.some((tool) => getXopcToolMetadata(tool)?.exposure === "deferred");
233
+ if (discovery) toolNames.push("tool_search");
171
234
  const modelRuntime = await createEmbeddedModelRuntime(model.provider);
172
235
  const resourceLoader = new DefaultResourceLoader({
173
236
  cwd: workspaceDir,
174
- agentDir: getAgentDir(),
237
+ agentDir: getNativePiAgentDir(),
175
238
  settingsManager,
176
- noContextFiles: true
239
+ systemPrompt,
240
+ noContextFiles: true,
241
+ noExtensions: true,
242
+ extensionFactories: [
243
+ ...codemode ? [createXopcCodemodeExtension(codemode, tools, () => boundSession)] : [],
244
+ ...discovery ? [createXopcToolSearchExtension(tools)] : [],
245
+ ...mcp ? [createMcpExtension({
246
+ loadConfig: () => mcp,
247
+ logPath: join(getNativePiAgentDir(), "mcp.log")
248
+ })] : []
249
+ ]
177
250
  });
178
251
  await resourceLoader.reload();
179
252
  const { session } = await createAgentSession({
@@ -185,10 +258,11 @@ var EmbeddedSessionRunnerPool = class {
185
258
  modelRuntime,
186
259
  resourceLoader,
187
260
  noTools: "builtin",
188
- customTools: toolDefs,
189
- tools: toolNames
261
+ customTools: toolDefs
190
262
  });
191
- applySystemPromptOverrideToSession(session, systemPrompt);
263
+ boundSession = session;
264
+ session.setActiveToolsByName(toolNames);
265
+ if (codemode || discovery || mcp) await session.bindExtensions({});
192
266
  const baseStreamFn = wrapStreamFnForXopcExtensions(session.agent.streamFunction);
193
267
  session.agent.streamFunction = baseStreamFn;
194
268
  return {
@@ -197,18 +271,29 @@ var EmbeddedSessionRunnerPool = class {
197
271
  transcriptId,
198
272
  workspaceDir,
199
273
  modelRef: params.modelRef,
200
- toolNames,
201
- toolContracts: tools.map((tool) => JSON.stringify([tool.name, tool.parameters])),
274
+ toolNames: tools.map((tool) => tool.name),
275
+ toolContracts: tools.map(toolContract),
202
276
  systemPrompt,
203
277
  thinkingLevel: thinkingLevel ?? "medium",
204
- credentialRevision: providerCredentialRevision(model.provider)
278
+ credentialRevision: providerCredentialRevision(model.provider),
279
+ codemode: params.codemode,
280
+ mcp: params.mcp
205
281
  }),
206
282
  session,
207
283
  piSm,
208
284
  settingsManager,
209
285
  baseStreamFn,
210
286
  lastUsedAt: Date.now(),
211
- idleTimer: null
287
+ idleTimer: null,
288
+ releaseInvalidations: tools.flatMap((tool) => {
289
+ const subscribe = getXopcToolMetadata(tool)?.subscribeInvalidation;
290
+ if (!subscribe) return [];
291
+ return [subscribe(() => {
292
+ if (this.pool.get(runtimeId)?.session !== session) return;
293
+ abortEmbeddedRun(runtimeId);
294
+ this.evict(runtimeId, "external_tool_catalog_changed");
295
+ })];
296
+ })
212
297
  };
213
298
  }
214
299
  };
@@ -228,5 +313,8 @@ function evictAllEmbeddedSessionRunners(reason = "dispose_all") {
228
313
  function acquireEmbeddedSessionRunner(params) {
229
314
  return defaultEmbeddedSessionRunnerPool.acquire(params);
230
315
  }
316
+ function drainEmbeddedSessionRunnerShutdowns() {
317
+ return defaultEmbeddedSessionRunnerPool.drainShutdowns();
318
+ }
231
319
  //#endregion
232
- export { EmbeddedSessionRunnerPool, acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, defaultEmbeddedSessionRunnerPool, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest };
320
+ export { EmbeddedSessionRunnerPool, acquireEmbeddedSessionRunner, buildEmbeddedRunnerFingerprint, defaultEmbeddedSessionRunnerPool, drainEmbeddedSessionRunnerShutdowns, evictAllEmbeddedSessionRunners, evictEmbeddedSessionRunner, getEmbeddedSessionRunnerIdleTtlMs, getEmbeddedSessionRunnerStats, isEmbeddedSessionRunnerEnabled, resetEmbeddedSessionRunnerForTest };
@@ -28,6 +28,7 @@ export type BeforeMessageWriteHookResult = {
28
28
  message?: AgentMessage;
29
29
  } | undefined;
30
30
  export interface ToolResultGuardOptions {
31
+ persistCustomTypes?: readonly string[];
31
32
  /** Optional session key for transcript update broadcasts. */
32
33
  conversationId?: string;
33
34
  /** Optional transform applied to any message before persistence. */
@@ -93,6 +94,7 @@ export declare function guardSessionManager(sessionManager: SessionManager, opts
93
94
  missingToolResultText?: string;
94
95
  allowedToolNames?: Iterable<string>;
95
96
  transformMessageForPersistence?: (message: AgentMessage) => AgentMessage;
97
+ persistCustomTypes?: readonly string[];
96
98
  }): GuardedPiTranscriptManager;
97
99
  /**
98
100
  * Recover the original (un-guarded) appendMessage for a session manager.
@@ -32,6 +32,7 @@ function guardSessionManager(sessionManager, opts) {
32
32
  if (typeof sessionManager.flushPendingToolResults === "function") return sessionManager;
33
33
  const result = installSessionToolResultGuard(sessionManager, {
34
34
  conversationId: opts?.conversationId,
35
+ persistCustomTypes: opts?.persistCustomTypes,
35
36
  transformMessageForPersistence: opts?.transformMessageForPersistence,
36
37
  allowSyntheticToolResults: opts?.allowSyntheticToolResults,
37
38
  missingToolResultText: opts?.missingToolResultText,
@@ -287,6 +288,22 @@ var ToolResultGuard = class {
287
288
  attach() {
288
289
  const bound = this.guardedAppend.bind(this);
289
290
  this.sessionManager.appendMessage = bound;
291
+ if (this.opts.conversationId && this.opts.persistCustomTypes?.length) {
292
+ const appendCustom = this.sessionManager.appendCustomEntry.bind(this.sessionManager);
293
+ this.sessionManager.appendCustomEntry = (customType, data) => {
294
+ const id = appendCustom(customType, data);
295
+ if (this.opts.persistCustomTypes?.includes(customType)) emitSessionTranscriptUpdate({
296
+ conversationId: this.opts.conversationId,
297
+ customEntry: {
298
+ customType,
299
+ data,
300
+ timestamp: (/* @__PURE__ */ new Date()).toISOString()
301
+ },
302
+ messageId: id
303
+ });
304
+ return id;
305
+ };
306
+ }
290
307
  }
291
308
  setActiveTurnId(turnId) {
292
309
  this.activeTurnId = normalizeOptionalString(turnId) ?? null;
@@ -2,15 +2,21 @@ import { extractTextContent } from "../context/workspace.js";
2
2
  //#region src/agent/embedded/subscribe-session.ts
3
3
  function subscribeEmbeddedSessionEvents(session, onEvent, onAgentEvent) {
4
4
  return session.subscribe((event) => {
5
+ if (event.type === "agent_settled") {
6
+ onEvent({
7
+ type: "agent_end",
8
+ aborted: event.aborted
9
+ });
10
+ return;
11
+ }
5
12
  const base = event;
13
+ const parent = "parentToolCallId" in event && event.parentToolCallId ? { parentToolCallId: event.parentToolCallId } : {};
6
14
  onAgentEvent?.(base);
7
15
  switch (base.type) {
8
16
  case "agent_start":
9
17
  onEvent({ type: "agent_start" });
10
18
  break;
11
- case "agent_end":
12
- onEvent({ type: "agent_end" });
13
- break;
19
+ case "agent_end": break;
14
20
  case "message_start": {
15
21
  const m = base.message;
16
22
  onEvent({
@@ -40,6 +46,7 @@ function subscribeEmbeddedSessionEvents(session, onEvent, onAgentEvent) {
40
46
  const t = base;
41
47
  onEvent({
42
48
  type: "tool_execution_start",
49
+ ...parent,
43
50
  toolName: t.toolName,
44
51
  toolCallId: t.toolCallId,
45
52
  args: t.args
@@ -50,10 +57,12 @@ function subscribeEmbeddedSessionEvents(session, onEvent, onAgentEvent) {
50
57
  const t = base;
51
58
  onEvent({
52
59
  type: "tool_execution_end",
60
+ ...parent,
53
61
  toolName: t.toolName,
54
62
  toolCallId: t.toolCallId,
55
63
  isError: t.isError,
56
- result: t.result
64
+ result: t.result,
65
+ durationMs: t.durationMs
57
66
  });
58
67
  break;
59
68
  }
@@ -61,6 +70,7 @@ function subscribeEmbeddedSessionEvents(session, onEvent, onAgentEvent) {
61
70
  const t = base;
62
71
  onEvent({
63
72
  type: "tool_execution_update",
73
+ ...parent,
64
74
  toolName: t.toolName,
65
75
  toolCallId: t.toolCallId,
66
76
  args: t.args,
@@ -0,0 +1,15 @@
1
+ import type { AgentTool, BeforeToolCallContext } from '@earendil-works/pi-agent-core';
2
+ import type { ToolDefinition } from '@earendil-works/pi-coding-agent';
3
+ export type XopcToolMetadata = Pick<ToolDefinition, 'exposure' | 'namespace' | 'annotations' | 'outputSchema'> & {
4
+ external?: {
5
+ toolRef: string;
6
+ revision: string;
7
+ readOnly: boolean;
8
+ };
9
+ subscribeInvalidation?: (listener: () => void) => () => void;
10
+ };
11
+ export declare function setXopcToolMetadata(tool: AgentTool, metadata: XopcToolMetadata): AgentTool;
12
+ export declare function getXopcToolMetadata(tool: AgentTool): XopcToolMetadata | undefined;
13
+ export declare function deferredToolContract(tool: AgentTool): string;
14
+ /** Deferred declarations retain the policy identity of the existing external gateway. */
15
+ export declare function externalPolicyContext(context: BeforeToolCallContext, tools: readonly AgentTool[]): BeforeToolCallContext;
@@ -0,0 +1,38 @@
1
+ import { createHash } from "node:crypto";
2
+ //#region src/agent/embedded/tool-metadata.ts
3
+ const metadataKey = Symbol("xopc.sdkToolMetadata");
4
+ function setXopcToolMetadata(tool, metadata) {
5
+ return Object.assign(tool, { [metadataKey]: metadata });
6
+ }
7
+ function getXopcToolMetadata(tool) {
8
+ return Reflect.get(tool, metadataKey);
9
+ }
10
+ function deferredToolContract(tool) {
11
+ return createHash("sha256").update(JSON.stringify([
12
+ tool.name,
13
+ tool.description,
14
+ tool.parameters,
15
+ getXopcToolMetadata(tool)
16
+ ])).digest("base64url");
17
+ }
18
+ /** Deferred declarations retain the policy identity of the existing external gateway. */
19
+ function externalPolicyContext(context, tools) {
20
+ const tool = tools.find((candidate) => candidate.name === context.toolCall.name);
21
+ const external = tool && getXopcToolMetadata(tool)?.external;
22
+ if (!external) return context;
23
+ const args = {
24
+ ...external,
25
+ arguments: context.args
26
+ };
27
+ return {
28
+ ...context,
29
+ args,
30
+ toolCall: {
31
+ ...context.toolCall,
32
+ name: "xopc_tool_execute",
33
+ arguments: args
34
+ }
35
+ };
36
+ }
37
+ //#endregion
38
+ export { deferredToolContract, externalPolicyContext, getXopcToolMetadata, setXopcToolMetadata };
@@ -0,0 +1,5 @@
1
+ import type { AgentTool } from '@earendil-works/pi-agent-core';
2
+ import { type ExtensionFactory } from '@earendil-works/pi-coding-agent';
3
+ export declare const TOOL_DISCOVERY_STATE = "xopc-tool-discovery";
4
+ /** xopc deliberately excludes pi system declarations from SQLite; retain only discovery state. */
5
+ export declare function createXopcToolSearchExtension(tools: readonly AgentTool[]): ExtensionFactory;