@xopcai/xopc 0.0.433 → 0.0.435
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.
- package/README.md +5 -5
- package/README.zh-CN.md +5 -5
- package/dist/browser-ext/dist/sidepanel.js +11 -0
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{activity-store-BpYGrRXw.js → activity-store-Cwn_CNwl.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DTgOSv6G.js → agent-avatar-dicebear-Cd23LnJJ.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-display-BUH7ljEo.js → agent-avatar-display-ByzM7u9S.js} +2 -2
- package/dist/gateway/static/root/assets/{agent-defaults-settings-panel-B_FAikHA.js → agent-defaults-settings-panel-B0i37diS.js} +1 -1
- package/dist/gateway/static/root/assets/{agent-plugin-dialog-DPabZaSE.js → agent-plugin-dialog-XN-tZ-Ox.js} +1 -1
- package/dist/gateway/static/root/assets/{agents-BAPYP1Ka.js → agents-ZDA1OaLv.js} +3 -3
- package/dist/gateway/static/root/assets/{agents-admin-api-CXCAHNPj.js → agents-admin-api-B5lKH_ps.js} +1 -1
- package/dist/gateway/static/root/assets/{api-oIK4hYkJ.js → api-B9fZL-V8.js} +1 -1
- package/dist/gateway/static/root/assets/{api-DMbimMEi.js → api-Djju8qIR.js} +1 -1
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BZ3Fy8ZR.js → app-management-settings-panel-IlyzDPJu.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DsRTj1by.js → appearance-settings-BxdFGob3.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CxEKiOTA.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-Bg1VTieK.js → archive-plugin-4gEvotPr.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-api-CLPsgcQN.js → automation-api-4fVKv9PJ.js} +1 -1
- package/dist/gateway/static/root/assets/{automation-result-state-CKVnR4KG.js → automation-result-state-m7PeK2kl.js} +1 -1
- package/dist/gateway/static/root/assets/automation-run-list-CJOdy_R2.js +1 -0
- package/dist/gateway/static/root/assets/{automation-task-card-D27Mw66U.js → automation-task-card-DZWhCWJa.js} +3 -3
- package/dist/gateway/static/root/assets/{automations-page-DGNTJ8lN.js → automations-page-BjbM15eY.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-CqurzLYX.js +9 -0
- package/dist/gateway/static/root/assets/{binary-plugins-CuwSdCG5.js → binary-plugins-69WyJLNW.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-Dtl2BG3t.js → block-editor-DUONDIZR.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automation-inputs-uGK086ag.js → browser-automation-inputs-DL4YPCuN.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-automations-page-Da_edNNS.js → browser-automations-page-1Aq6XmRs.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-control-api-k3OOX3bS.js → browser-control-api-yjru8E7R.js} +1 -1
- package/dist/gateway/static/root/assets/{browser-settings-page-C1bSw-Jq.js → browser-settings-page-CvwpT8Um.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-DlHPLld_.js → capabilities-C7lnwKKm.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-CoeuLRt6.js → capabilities-DaeQXJT4.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-B5avAOUM.js +2 -0
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-CtY-bGIi.js → capabilities-settings-panel-_9yCS78i.js} +1 -1
- package/dist/gateway/static/root/assets/capability-links-DeO34GIF.js +1 -0
- package/dist/gateway/static/root/assets/{channels-Cn1MWBL_.js → channels-CoQb4HOF.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-agents-api-BB0biwc7.js → chat-agents-api-BUi_7GRo.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-chart-block-QSvjx4w6.js → chat-chart-block-CcVcKsDZ.js} +1 -1
- package/dist/gateway/static/root/assets/chat-page--wcFhTjW.js +72 -0
- package/dist/gateway/static/root/assets/{chat-terminal-dock-Cd51G9eG.js → chat-terminal-dock-BMXJpPuH.js} +1 -1
- package/dist/gateway/static/root/assets/{command-palette-api-CEG10uE-.js → command-palette-api-luUjQPsh.js} +1 -1
- package/dist/gateway/static/root/assets/{composer-payload-handoff-Bogdq9Hy.js → composer-payload-handoff-B5XNxNCb.js} +1 -1
- package/dist/gateway/static/root/assets/computer-settings-page-CWtdyEJH.js +1 -0
- package/dist/gateway/static/root/assets/connected-providers-grid-2idMtk65.js +1 -0
- package/dist/gateway/static/root/assets/connection-usage-Cm_McddI.js +1 -0
- package/dist/gateway/static/root/assets/connection-usage-guide-Ddh0bfkj.js +1 -0
- package/dist/gateway/static/root/assets/{connector-service-page-k2rjyjrp.js → connector-service-page-C3msXaBk.js} +1 -1
- package/dist/gateway/static/root/assets/{connectors-api-DtvB9Cjm.js → connectors-api-NcWECWKg.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-Crb6DILX.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-CAankdQw.js → date-picker-Cfjq1hD_.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-DjM73fir.js → desktop-pet-ChFn9v-3.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-Rmh-GxHl.js → desktop-pet-settings-DvnVIv25.js} +1 -1
- package/dist/gateway/static/root/assets/{dev-view-store-BgW2Riyk.js → dev-view-store-DQJ61P5L.js} +1 -1
- package/dist/gateway/static/root/assets/{device-pairing-wizard-UdzSpNa5.js → device-pairing-wizard-KxaIL-OX.js} +1 -1
- package/dist/gateway/static/root/assets/{directory-picker-path-field-Rkw3f7lG.js → directory-picker-path-field-Drv864uE.js} +1 -1
- package/dist/gateway/static/root/assets/{discussion-annotation-sync-Dudoj_Fz.js → discussion-annotation-sync-DfBRkWtw.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DxIGAO23.js → extension-debug-page-DAlBIt_R.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-iframe-host-63KpX6IP.js → extension-iframe-host-Bds-5kY_.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-marketplace-api-yXNUkQDA.js → extension-marketplace-api-CZg8nBwW.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-C811A_Ww.js → extension-page-ZTw-oucT.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-C4jLFIgh.js → extension-provider-NKWfjpdP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-WJSw5MT0.js → extension-settings-page-CT7PPt_q.js} +1 -1
- package/dist/gateway/static/root/assets/{file-preview-surface-zE9AcaHM.js → file-preview-surface-BcLeaSNe.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-D6cc6W6E.js → gateway-config-swr-Cq-ByXL4.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-realtime-BSRNLciy.js → gateway-realtime-DwMd2PCt.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-CHrf6-nR.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-restart-Unun5hRL.js → gateway-restart-DdiVzbkL.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DP-DV-e5.js → gateway-settings-1QUdNwrZ.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-C8g666Ja.js → gateway-startup-retry-PMJi5mX4.js} +1 -1
- package/dist/gateway/static/root/assets/{global-defaults-api-BObi-1ww.js → global-defaults-api-DgzZh3wX.js} +1 -1
- package/dist/gateway/static/root/assets/{home-page-CIcs7Mzy.js → home-page-Chn7YTiD.js} +2 -2
- package/dist/gateway/static/root/assets/{image-generation-api-C2SqYNyD.js → image-generation-api-CjVpsckq.js} +1 -1
- package/dist/gateway/static/root/assets/{imports-page-C8ezUkOJ.js → imports-page-CJCvZFaQ.js} +1 -1
- package/dist/gateway/static/root/assets/index-8xLWo0Tt.js +11 -0
- package/dist/gateway/static/root/assets/index-iukJWzxG.css +1 -0
- package/dist/gateway/static/root/assets/install-connector-dialog-Bo06Ry3H.js +1 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-BRaY4-wA.js → keyboard-shortcuts-settings-BylFJeGu.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-BZtVcjF3.js → local-app-workbench-page-B3MSSFsr.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-MqP4EnJm.js → local-apps-page-BeV86rMJ.js} +1 -1
- package/dist/gateway/static/root/assets/{local-session-drafts-DTq9776a.js → local-session-drafts-jgw8UGsO.js} +2 -2
- package/dist/gateway/static/root/assets/{locale-store-B6OrWgY1.js → locale-store-CAZaC05J.js} +1 -1
- package/dist/gateway/static/root/assets/{logs-page-hkHBjblX.js → logs-page-BMmSsUP5.js} +1 -1
- package/dist/gateway/static/root/assets/{management-settings-DoX4eTM3.js → management-settings-Bu7T8ewk.js} +1 -1
- package/dist/gateway/static/root/assets/{markdown-view-DrhYZSmg.js → markdown-view-BatP4qeK.js} +1 -1
- package/dist/gateway/static/root/assets/{mcp-conversation-setup-page-BEp5E6TD.js → mcp-conversation-setup-page-rROtr0UN.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D987i9Gc.js → media-plugins-88OV72YE.js} +1 -1
- package/dist/gateway/static/root/assets/messages-C7fckbyG.js +3 -0
- package/dist/gateway/static/root/assets/{model-selector-DXm4NS1_.js → model-selector-raBRBkN_.js} +1 -1
- package/dist/gateway/static/root/assets/{models-hub-cache-BLcha5rx.js → models-hub-cache-CzC9y3D0.js} +1 -1
- package/dist/gateway/static/root/assets/{note-detail-panel-Cl851ivY.js → note-detail-panel-BvA8Vkbm.js} +3 -3
- package/dist/gateway/static/root/assets/note-image-lightbox-D6kUDDd5.js +1 -0
- package/dist/gateway/static/root/assets/{notes-api-Ddsf7FVg.js → notes-api-zXpV6UXu.js} +1 -1
- package/dist/gateway/static/root/assets/{notes-page-DSwA1MU1.js → notes-page-CjYH9Kle.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-api-CMmu4DzH.js → oauth-api-DmxSaxM1.js} +1 -1
- package/dist/gateway/static/root/assets/{oauth-provider-connect-BkhnftBq.js → oauth-provider-connect-D4Gfs-Ba.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-capture-button-urhQBRaN.js → page-context-capture-button-Mig3d0UX.js} +1 -1
- package/dist/gateway/static/root/assets/{page-context-draft-BuNUerth.js → page-context-draft-C4IIZaKd.js} +1 -1
- package/dist/gateway/static/root/assets/page-header-store-D7G5utVi.js +1 -0
- package/dist/gateway/static/root/assets/{personal-avatar-B49ueeZO.js → personal-avatar-DLa-CpaK.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-page-f05ceuFn.js → personal-page-BhuT79Wd.js} +1 -1
- package/dist/gateway/static/root/assets/{personal-settings-panel-DLQxzPYr.js → personal-settings-panel-XSUkgcr2.js} +1 -1
- package/dist/gateway/static/root/assets/phone-dependencies-card-DYwnuVh3.js +1 -0
- package/dist/gateway/static/root/assets/phone-model-connection-2F32QTHA.js +1 -0
- package/dist/gateway/static/root/assets/phone-model-picker-DCVzIr0s.js +1 -0
- package/dist/gateway/static/root/assets/phone-settings-page-DJttE4id.js +1 -0
- package/dist/gateway/static/root/assets/{phone-workspace-store-DbqktZbO.js → phone-workspace-store-Dxp-KhFP.js} +1 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-tyjAjFjA.js +1 -0
- package/dist/gateway/static/root/assets/{preference-select-fields-BZWqG7pu.js → preference-select-fields-BVP3MhGK.js} +1 -1
- package/dist/gateway/static/root/assets/{product-automation-feedback-DDQUsag7.js → product-automation-feedback-DbJvv92z.js} +1 -1
- package/dist/gateway/static/root/assets/{product-open-page-BkRP_HmA.js → product-open-page-RImqlhCD.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-o2Y3VNE7.js → product-preview-content-DxSqrKsg.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-modal-7Ohx-7OR.js → product-preview-modal-Cw8Q8Uom.js} +2 -2
- package/dist/gateway/static/root/assets/{project-detail-page-B2RsSHya.js → project-detail-page-CuugOYfe.js} +1 -1
- package/dist/gateway/static/root/assets/{project-understanding-BIMouiYX.js → project-understanding-BMKcoUW5.js} +1 -1
- package/dist/gateway/static/root/assets/{projects-page-C9R5u3tF.js → projects-page-CFsABLvs.js} +1 -1
- package/dist/gateway/static/root/assets/{providers-api-BOCkRZ7X.js → providers-api-CAeXbJNF.js} +1 -1
- package/dist/gateway/static/root/assets/{recording-upload-C6muEHEO.js → recording-upload-CfpllTe5.js} +1 -1
- package/dist/gateway/static/root/assets/{registry-api-Bl2guMRg.js → registry-api-fLOqFyrz.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-BceSMbCs.js → remote-access-hub-BvKOxy0L.js} +1 -1
- package/dist/gateway/static/root/assets/{resource-unavailable-CUNbPkdj.js → resource-unavailable-D15jzjV_.js} +1 -1
- package/dist/gateway/static/root/assets/route-preload-BQapekpy.js +2 -0
- package/dist/gateway/static/root/assets/{runtime-tools-api-LopLjgvu.js → runtime-tools-api-D0Nrvuqv.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-9HIPerDP.js → runtime-tools-settings-panel-CA27XgL2.js} +1 -1
- package/dist/gateway/static/root/assets/{service-recommendation-list-CoMI6MB1.js → service-recommendation-list-B0RoYLVT.js} +1 -1
- package/dist/gateway/static/root/assets/session-api-CHRP5Lwf.js +1 -0
- package/dist/gateway/static/root/assets/session-channel-icon-D1ktvt1P.js +1 -0
- package/dist/gateway/static/root/assets/session-identity-label-BP7OIYth.js +1 -0
- package/dist/gateway/static/root/assets/session-manager-DRRWwKE4.js +25 -0
- package/dist/gateway/static/root/assets/{sessions-page-BT0GdXdS.js → sessions-page-uJHS3-6F.js} +1 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-CZ4J3Kuy.js +1 -0
- package/dist/gateway/static/root/assets/{settings-advanced-section-CEorDLUp.js → settings-advanced-section-D-llwfSj.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-mode-store-C2LZqBES.js → settings-mode-store-BspMKc9N.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-C_Np_6qZ.js → settings-page-CedwaHM0.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-header-BAN34UQi.js → settings-page-header-LuOJvqNa.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-page-layout-B5TVFBV2.js → settings-page-layout-CduQ8w4a.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-interaction-page-BYvTJW3_.js → setup-interaction-page-ujpPGl84.js} +1 -1
- package/dist/gateway/static/root/assets/{setup-status-panel-UY2dH-sK.js → setup-status-panel-BN2aCJUN.js} +1 -1
- package/dist/gateway/static/root/assets/{share-link-dialog-BMcXyzr2.js → share-link-dialog-CTATUaa4.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-UQ6eUM2_.js → share-preview-page-Dq0J3VgS.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-api-DOeDN6Tm.js → shares-api-zegE8pSE.js} +1 -1
- package/dist/gateway/static/root/assets/{shares-settings-W8XhuAoL.js → shares-settings-DXpvsRXq.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-api-Do_c0d9n.js → skill-api-DCL1EN7f.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-list-api-DpHaXI2l.js → skill-list-api-Bv0mmHbu.js} +1 -1
- package/dist/gateway/static/root/assets/{skill-reload-api-DDRd9IJ2.js → skill-reload-api-DPZbadiO.js} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-CaeJVKhO.js → skills-page-DMC7Gaku.js} +1 -1
- package/dist/gateway/static/root/assets/{system-settings-panel-DYWlWPJL.js → system-settings-panel-BYFUhlqG.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-De0qD7xw.js → task-detail-page-_Og3plZL.js} +3 -3
- package/dist/gateway/static/root/assets/{task-result-evidence-CICR5K1t.js → task-result-evidence-Bxm8-H0B.js} +1 -1
- package/dist/gateway/static/root/assets/{terminal-panel-store-BbWUcQe7.js → terminal-panel-store-Djf9l2qZ.js} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-TkG5mo0p.js → theme-store-8GFVtotZ.js} +1 -1
- package/dist/gateway/static/root/assets/{tracing-settings-page-CYXEy4EG.js → tracing-settings-page-oWW3SBZ4.js} +1 -1
- package/dist/gateway/static/root/assets/{tunnel-api-DquDm6U2.js → tunnel-api-D-mEsSGF.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-activity-store-Ot3wZ3oQ.js → understanding-activity-store-CvDjsd0I.js} +1 -1
- package/dist/gateway/static/root/assets/{understanding-refresh-store-C5KYFMaC.js → understanding-refresh-store-DzOZJm7A.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-1xFO4smo.js → usage-page-z-o6Uuev.js} +1 -1
- package/dist/gateway/static/root/assets/{use-autosave-HL8XRNR8.js → use-autosave-BVYS8UoK.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-XRlQBdNF.js → use-composer-attachments-lecOV2q5.js} +1 -1
- package/dist/gateway/static/root/assets/{use-file-preview-expanded-CW956CXS.js → use-file-preview-expanded-nd_CuFsd.js} +2 -2
- package/dist/gateway/static/root/assets/{use-personal-profile-202s6tJt.js → use-personal-profile-CQi2ZCxV.js} +1 -1
- package/dist/gateway/static/root/assets/{use-workspace-tree-CjydkmH1.js → use-workspace-tree-BiaddkzX.js} +1 -1
- package/dist/gateway/static/root/assets/{user-model-page-OGPXx3pe.js → user-model-page-Bks1n0Nj.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-api-key-field-CxFu4MEA.js → voice-api-key-field-BbW8NFeZ.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-config-api-MHe5Pn-A.js → voice-config-api-jSMzZWWy.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-input-shortcut-events-B9xc1oK8.js → voice-input-shortcut-events-_SgYmx7X.js} +1 -1
- package/dist/gateway/static/root/assets/{voice-transcribe-api-CVEcB6Pe.js → voice-transcribe-api-BJCfiRFU.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-overlay-C-JoAg2D.js → work-discovery-overlay-DSTSNyU7.js} +1 -1
- package/dist/gateway/static/root/assets/{work-discovery-page-B5Kx29Ru.js → work-discovery-page-Dd_QJJvb.js} +1 -1
- package/dist/gateway/static/root/assets/{working-directory-picker-modal-DGp9cNzH.js → working-directory-picker-modal-q39BUcJ6.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-api-HBXn8pL9.js → workspace-api-Di2OmCvz.js} +2 -2
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-B2r9wlix.js +1 -0
- package/dist/gateway/static/root/assets/{workspace-file-preview-dialog-3cpwSG2w.js → workspace-file-preview-dialog-BUGNT765.js} +1 -1
- package/dist/gateway/static/root/assets/{workspace-open-location-menu-D0VOFvuP.js → workspace-open-location-menu-bMSvmQW7.js} +1 -1
- package/dist/gateway/static/root/assets/{xopc-cloud-account-card-BkdW2p3v.js → xopc-cloud-account-card-Bbe19Del.js} +1 -1
- package/dist/gateway/static/root/index.html +87 -85
- package/dist/package.js +1 -1
- package/dist/packages/computer-control-contract/src/index.js +33 -3
- package/dist/packages/gateway-contract/src/session-identity.js +2 -1
- package/dist/packages/gateway-contract/src/session-input-command.js +19 -2
- package/dist/packages/gateway-contract/src/specialists.js +1 -0
- package/dist/src/agent/embedded/execution-tool-policy.d.ts +1 -1
- package/dist/src/agent/embedded/execution-tool-policy.js +2 -2
- package/dist/src/agent/embedded/run-for-session.js +23 -8
- package/dist/src/agent/embedded/run-turn.js +30 -7
- package/dist/src/agent/embedded/runs.d.ts +2 -2
- package/dist/src/agent/embedded/runs.js +4 -4
- package/dist/src/agent/embedded/session-runner.js +26 -11
- package/dist/src/agent/embedded/tool-search-extension.d.ts +8 -2
- package/dist/src/agent/embedded/tool-search-extension.js +122 -30
- package/dist/src/agent/external-tools/cliProvider.d.ts +10 -9
- package/dist/src/agent/external-tools/cliProvider.js +24 -4
- package/dist/src/agent/external-tools/composio-provider.d.ts +3 -3
- package/dist/src/agent/external-tools/composio-provider.js +6 -3
- package/dist/src/agent/external-tools/discovery.d.ts +47 -0
- package/dist/src/agent/external-tools/discovery.js +56 -0
- package/dist/src/agent/external-tools/gateway-tools.js +26 -46
- package/dist/src/agent/external-tools/index.d.ts +1 -0
- package/dist/src/agent/external-tools/index.js +7 -0
- package/dist/src/agent/external-tools/personal-request-scope.d.ts +7 -0
- package/dist/src/agent/external-tools/personal-request-scope.js +83 -0
- package/dist/src/agent/external-tools/read-policy.js +5 -4
- package/dist/src/agent/external-tools/service.d.ts +2 -0
- package/dist/src/agent/external-tools/service.js +22 -3
- package/dist/src/agent/external-tools/tool-registry.d.ts +6 -0
- package/dist/src/agent/external-tools/types.d.ts +7 -2
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.js +3 -2
- package/dist/src/agent/orchestration/llm-turn-retry.d.ts +1 -1
- package/dist/src/agent/orchestration/llm-turn-retry.js +13 -8
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +1 -0
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +3 -1
- package/dist/src/agent/prompt/sections/tooling.js +1 -1
- package/dist/src/agent/tool-manuals/computer.d.ts +1 -1
- package/dist/src/agent/tool-manuals/computer.js +6 -4
- package/dist/src/agent/tool-manuals/phone.d.ts +1 -1
- package/dist/src/agent/tool-manuals/phone.js +4 -4
- package/dist/src/agent/tool-manuals/xopc-configuration.d.ts +1 -1
- package/dist/src/agent/tool-manuals/xopc-configuration.js +4 -2
- package/dist/src/agent/tools/computer-use-tool.js +7 -6
- package/dist/src/agent/tools/delegation-policy.js +1 -0
- package/dist/src/agent/tools/factory.js +4 -2
- package/dist/src/agent/tools/phone-use-tool.js +2 -2
- package/dist/src/agent/tools/web.js +22 -3
- package/dist/src/agent-matching/service.js +2 -2
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/computer/batch.d.ts +108 -0
- package/dist/src/computer/batch.js +125 -0
- package/dist/src/computer/broker.d.ts +30 -2
- package/dist/src/computer/broker.js +109 -17
- package/dist/src/computer/diagnostics.d.ts +5 -1
- package/dist/src/computer/diagnostics.js +22 -3
- package/dist/src/computer/errors.d.ts +15 -0
- package/dist/src/computer/errors.js +59 -3
- package/dist/src/computer/model-adapter.d.ts +58 -0
- package/dist/src/computer/model-adapter.js +112 -66
- package/dist/src/computer/native-errors.d.ts +2 -0
- package/dist/src/computer/native-errors.js +13 -0
- package/dist/src/computer/program-runtime.d.ts +1 -1
- package/dist/src/computer/program-runtime.js +1 -0
- package/dist/src/computer/runtime.d.ts +11 -0
- package/dist/src/computer/runtime.js +102 -34
- package/dist/src/computer/semantic-actions.js +4 -0
- package/dist/src/config/schema.d.ts +6 -0
- package/dist/src/extensions/agent-plugins/formats.js +2 -1
- package/dist/src/extensions/agent-plugins/inventory.d.ts +2 -0
- package/dist/src/extensions/agent-plugins/inventory.js +4 -1
- package/dist/src/extensions/agent-plugins/validation.d.ts +1 -0
- package/dist/src/extensions/agent-plugins/validation.js +2 -1
- package/dist/src/gateway/agent-builtin-tools.d.ts +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/phone-dependencies.js +26 -5
- package/dist/src/gateway/hono/routes/phone-setup.js +42 -16
- package/dist/src/gateway/hono/routes/phone.js +22 -7
- package/dist/src/gateway/hono/routes/session-command-handler.js +9 -0
- package/dist/src/gateway/hono/routes/session-input-control.d.ts +3 -0
- package/dist/src/gateway/hono/routes/session-input-control.js +37 -0
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +12 -0
- package/dist/src/gateway/hono/routes/session-input-handler.js +22 -0
- package/dist/src/gateway/hono/routes/sessions.js +4 -0
- package/dist/src/gateway/service/agent-runner.js +5 -4
- package/dist/src/gateway/service/config-coordinator.d.ts +6 -0
- package/dist/src/gateway/service/session-input-coordinator.d.ts +6 -3
- package/dist/src/gateway/service/session-input-coordinator.js +47 -6
- package/dist/src/gateway/service.d.ts +1 -0
- package/dist/src/gateway/service.js +8 -5
- package/dist/src/home-intelligence/host.js +2 -2
- package/dist/src/personal-agent/capability-service.js +1 -1
- package/dist/src/personal-agent/request-access.d.ts +2 -0
- package/dist/src/personal-agent/request-access.js +22 -2
- package/dist/src/personal-agent/request-service.js +2 -2
- package/dist/src/personal-agent/specialist-capabilities.d.ts +2 -0
- package/dist/src/personal-agent/specialist-capabilities.js +9 -3
- package/dist/src/phone/adb-driver.d.ts +3 -0
- package/dist/src/phone/adb-driver.js +29 -0
- package/dist/src/phone/contracts.d.ts +14 -2
- package/dist/src/phone/contracts.js +8 -1
- package/dist/src/phone/gui-protocol.js +1 -1
- package/dist/src/phone/hdc-driver.d.ts +30 -0
- package/dist/src/phone/hdc-driver.js +331 -0
- package/dist/src/phone/hdc-video-bridge.d.ts +2 -0
- package/dist/src/phone/hdc-video-bridge.js +91 -0
- package/dist/src/phone/hdc-video-tools.d.ts +15 -0
- package/dist/src/phone/hdc-video-tools.js +123 -0
- package/dist/src/phone/hdc-video.d.ts +69 -0
- package/dist/src/phone/hdc-video.js +350 -0
- package/dist/src/phone/interactive-session.js +1 -1
- package/dist/src/phone/live-provider.d.ts +6 -0
- package/dist/src/phone/live-provider.js +1 -0
- package/dist/src/phone/model-adapter.d.ts +3 -0
- package/dist/src/phone/model-adapter.js +5 -3
- package/dist/src/phone/repository.js +2 -1
- package/dist/src/phone/runtime.d.ts +10 -4
- package/dist/src/phone/runtime.js +151 -85
- package/dist/src/phone/setup/service.d.ts +8 -6
- package/dist/src/phone/setup/service.js +33 -16
- package/dist/src/platform/client.d.ts +1 -1
- package/dist/src/platform/contracts.d.ts +1 -1
- package/dist/src/process/phone-process.d.ts +1 -1
- package/dist/src/process/phone-process.js +2 -2
- package/dist/src/runtime-tools/downloader.d.ts +1 -0
- package/dist/src/runtime-tools/downloader.js +8 -4
- package/dist/src/runtime-tools/harmony-dependencies.d.ts +24 -0
- package/dist/src/runtime-tools/harmony-dependencies.js +272 -0
- package/dist/src/runtime-tools/harmony-dependency-catalog.d.ts +4 -0
- package/dist/src/runtime-tools/harmony-dependency-catalog.js +54 -0
- package/dist/src/runtime-tools/harmony-paths.d.ts +9 -0
- package/dist/src/runtime-tools/harmony-paths.js +15 -0
- package/dist/src/runtime-tools/hdc-dependency-catalog.d.ts +8 -0
- package/dist/src/runtime-tools/hdc-dependency-catalog.js +83 -0
- package/dist/src/runtime-tools/hdc-files.d.ts +14 -0
- package/dist/src/runtime-tools/hdc-files.js +87 -0
- package/dist/src/runtime-tools/phone-dependencies.d.ts +6 -1
- package/dist/src/runtime-tools/phone-dependencies.js +20 -2
- package/dist/src/runtime-tools/phone-dependency-catalog.d.ts +10 -1
- package/dist/src/runtime-tools/phone-dependency-catalog.js +2 -0
- package/dist/src/runtime-tools/types.d.ts +1 -1
- package/dist/src/storage/sqlite/schema.d.ts +2 -2
- package/dist/src/storage/sqlite/schema.js +7 -7
- package/dist/src/storage/sqlite/schema.sql +16 -0
- package/dist/src/storage/sqlite/session-creation-repository.js +3 -0
- package/dist/src/storage/sqlite/session-input-control-repository.d.ts +12 -0
- package/dist/src/storage/sqlite/session-input-control-repository.js +83 -0
- package/dist/src/storage/sqlite/session-input-repository.d.ts +2 -0
- package/dist/src/storage/sqlite/session-input-repository.js +17 -5
- package/dist/src/storage/sqlite/session-repository.js +1 -0
- package/dist/src/storage/sqlite/session-turn-replace-repository.d.ts +2 -0
- package/dist/src/storage/sqlite/session-turn-replace-repository.js +14 -2
- package/dist/src/storage/sqlite/upgrades/262_session_input_control.sql +15 -0
- package/package.json +2 -2
- package/skills/tools/configure-xopc/SKILL.md +2 -2
- package/skills/tools/configure-xopc/references/phone/acceptance.md +3 -2
- package/skills/tools/configure-xopc/references/phone/dependencies.md +18 -2
- package/skills/tools/configure-xopc/references/phone/harmonyos.md +16 -0
- package/skills/tools/configure-xopc/references/phone/overview.md +2 -2
- package/skills/tools/configure-xopc/references/scene-index.md +2 -2
- package/dist/gateway/static/root/assets/apps-page-D-n71lO1.js +0 -1
- package/dist/gateway/static/root/assets/automations-workspace-DWDWy-SG.js +0 -9
- package/dist/gateway/static/root/assets/capabilities-page-IcwojmJK.js +0 -2
- package/dist/gateway/static/root/assets/capability-links-DzQWK1Fh.js +0 -1
- package/dist/gateway/static/root/assets/chat-page-CwP4OMdW.js +0 -72
- package/dist/gateway/static/root/assets/computer-settings-page-DyAlOzqY.js +0 -1
- package/dist/gateway/static/root/assets/connected-providers-grid-D0lXg22c.js +0 -1
- package/dist/gateway/static/root/assets/connectors-page-DI_Q0CKz.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-store-BFeFfApQ.js +0 -1
- package/dist/gateway/static/root/assets/index-Cz-VjTNd.css +0 -1
- package/dist/gateway/static/root/assets/index-D1_PUrJf.js +0 -11
- package/dist/gateway/static/root/assets/install-connector-dialog-Cn4nRSyt.js +0 -1
- package/dist/gateway/static/root/assets/list-tree-B0OMswgM.js +0 -1
- package/dist/gateway/static/root/assets/messages-jwdBhfL9.js +0 -3
- package/dist/gateway/static/root/assets/note-image-lightbox-DGYRJS03.js +0 -1
- package/dist/gateway/static/root/assets/page-header-store-CEn_kPsn.js +0 -1
- package/dist/gateway/static/root/assets/phone-dependencies-card-DjmC1Z5j.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-connection-BRjHSgYn.js +0 -1
- package/dist/gateway/static/root/assets/phone-model-picker-DgIiWLhR.js +0 -1
- package/dist/gateway/static/root/assets/phone-settings-page-DCZGCL_z.js +0 -1
- package/dist/gateway/static/root/assets/plugin-details-dialog-D4tGKip4.js +0 -1
- package/dist/gateway/static/root/assets/route-preload-C1BKDjnu.js +0 -2
- package/dist/gateway/static/root/assets/session-api-Bfmlmn9F.js +0 -1
- package/dist/gateway/static/root/assets/session-channel-icon-SsY70Z6t.js +0 -1
- package/dist/gateway/static/root/assets/session-identity-label-B7sgG1PE.js +0 -1
- package/dist/gateway/static/root/assets/session-manager-X4UHOjjO.js +0 -25
- package/dist/gateway/static/root/assets/settings-advanced-gate-Dk9c-Z5e.js +0 -1
- package/dist/gateway/static/root/assets/workspace-editor-agent-store-msZa42fU.js +0 -1
|
@@ -17,7 +17,7 @@ import { resolveAgentAbortReason } from "../orchestration/run-termination.js";
|
|
|
17
17
|
import { isAgentTurnTimeoutError, isAgentTurnUnsettledError, resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
|
|
18
18
|
import { isContextOverflowError } from "../orchestration/context-overflow.js";
|
|
19
19
|
import { ACCEPTANCE_REPAIR_READ_TOOLS, canResumeAfterModelFailure, completedRecoveryToolResult } from "../orchestration/turn-recovery.js";
|
|
20
|
-
import { getAssistantTurnErrorMessage, isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure, stripTrailingErrorAssistantMessages } from "../orchestration/llm-turn-retry.js";
|
|
20
|
+
import { classifyLlmFailure, getAssistantTurnErrorMessage, isAssistantTurnAborted, isAssistantTurnFailed, maybeRetryTurnAfterTransientLlmFailure, stripTrailingErrorAssistantMessages } from "../orchestration/llm-turn-retry.js";
|
|
21
21
|
import { allowsExecutionTool, filterExecutionTools, resolveExecutionToolPolicy } from "./execution-tool-policy.js";
|
|
22
22
|
import { isPhoneAssistanceSuspended, phoneAssistance, phoneResumeForRun } from "../../phone/assistance.js";
|
|
23
23
|
import { runWithEmbeddedExecutionSession } from "./execution-context.js";
|
|
@@ -377,7 +377,12 @@ async function runXopcEmbeddedTurnInner(params) {
|
|
|
377
377
|
const { session, reused } = runner;
|
|
378
378
|
const configurationTurnStart = session.agent.state.messages.length;
|
|
379
379
|
await runLease.attach(session, async () => session.abort());
|
|
380
|
-
const
|
|
380
|
+
const turnDeadline = new AbortController();
|
|
381
|
+
const runAbortSignal = AbortSignal.any([
|
|
382
|
+
runLease.signal,
|
|
383
|
+
turnDeadline.signal,
|
|
384
|
+
...params.abortSignal ? [params.abortSignal] : []
|
|
385
|
+
]);
|
|
381
386
|
if (runAbortSignal.aborted) {
|
|
382
387
|
await session.abort();
|
|
383
388
|
return {
|
|
@@ -917,7 +922,20 @@ async function runXopcEmbeddedTurnInner(params) {
|
|
|
917
922
|
modelRequestNumber
|
|
918
923
|
}, "Embedded first response text ready");
|
|
919
924
|
}
|
|
920
|
-
if (event.type === "message_end" && event.message.role === "assistant")
|
|
925
|
+
if (event.type === "message_end" && event.message.role === "assistant") {
|
|
926
|
+
recordPromptCacheTouch(conversationId, resolvedModel, event.message.usage);
|
|
927
|
+
if (event.message.stopReason === "error" || event.message.stopReason === "aborted") log.warn({
|
|
928
|
+
conversationId,
|
|
929
|
+
runId,
|
|
930
|
+
modelRef: latencyModelRef,
|
|
931
|
+
modelRequestNumber,
|
|
932
|
+
phase: "model_request_end",
|
|
933
|
+
stopReason: event.message.stopReason,
|
|
934
|
+
errorMessage: event.message.errorMessage,
|
|
935
|
+
hostSignalAborted: runAbortSignal.aborted,
|
|
936
|
+
...runAbortSignal.aborted ? { terminationReason: resolveAgentAbortReason(runAbortSignal.reason) } : {}
|
|
937
|
+
}, "Model request ended without completing the response");
|
|
938
|
+
}
|
|
921
939
|
if (event.type === "tool_execution_end") {
|
|
922
940
|
markTurnToolResult(conversationId, runId, event.toolName);
|
|
923
941
|
if (event.toolName === "send_message" && !event.isError) sentVisibleMessage = true;
|
|
@@ -1055,7 +1073,10 @@ async function runXopcEmbeddedTurnInner(params) {
|
|
|
1055
1073
|
await session.agent.waitForIdle();
|
|
1056
1074
|
await recoverSettledTurn();
|
|
1057
1075
|
}
|
|
1058
|
-
}), timeoutMs, {
|
|
1076
|
+
}), timeoutMs, {
|
|
1077
|
+
timeoutExtensionMs: params.timeoutExtensionMs,
|
|
1078
|
+
onTimeout: (reason) => turnDeadline.abort(reason)
|
|
1079
|
+
});
|
|
1059
1080
|
if (phoneStopped) {
|
|
1060
1081
|
const wait = phoneAssistance(conversationId);
|
|
1061
1082
|
const notice = {
|
|
@@ -1125,7 +1146,7 @@ async function runXopcEmbeddedTurnInner(params) {
|
|
|
1125
1146
|
ok: false,
|
|
1126
1147
|
retryable: false,
|
|
1127
1148
|
terminationReason: "provider_error",
|
|
1128
|
-
errorMessage: "aborted"
|
|
1149
|
+
errorMessage: `Model request was interrupted while the agent run was still active; automatic recovery could not complete. ${getAssistantTurnErrorMessage(session.agent) ?? "Provider returned an aborted stream."}`,
|
|
1129
1150
|
lastAssistantText: lastAssistantPlainText(session)
|
|
1130
1151
|
};
|
|
1131
1152
|
if (policyStopped && !policyCompleted || lengthRecoveryExhausted || lastAssistantMessage(session.agent.state.messages)?.stopReason === "length") return {
|
|
@@ -1139,7 +1160,7 @@ async function runXopcEmbeddedTurnInner(params) {
|
|
|
1139
1160
|
ok: false,
|
|
1140
1161
|
retryable: canResumeAfterModelFailure(session.agent.state.messages, { allowFailedReadTools: ACCEPTANCE_REPAIR_READ_TOOLS }),
|
|
1141
1162
|
terminationReason: "provider_error",
|
|
1142
|
-
errorMessage: getAssistantTurnErrorMessage(session.agent) ?? "Assistant turn failed",
|
|
1163
|
+
errorMessage: classifyLlmFailure(getAssistantTurnErrorMessage(session.agent) ?? "") === "aborted" ? `Model request was interrupted while the agent run was still active; automatic recovery could not complete. ${getAssistantTurnErrorMessage(session.agent)}` : getAssistantTurnErrorMessage(session.agent) ?? "Assistant turn failed",
|
|
1143
1164
|
lastAssistantText: lastAssistantPlainText(session)
|
|
1144
1165
|
};
|
|
1145
1166
|
if (params.requireVisibleReply && !sentVisibleMessage && lastAssistantPlainText(session).trim() === "NO_REPLY") return {
|
|
@@ -1191,7 +1212,9 @@ async function runXopcEmbeddedTurnInner(params) {
|
|
|
1191
1212
|
log.error({
|
|
1192
1213
|
err,
|
|
1193
1214
|
conversationId,
|
|
1194
|
-
runId
|
|
1215
|
+
runId,
|
|
1216
|
+
phase: "embedded_run_end",
|
|
1217
|
+
terminationReason: isAgentTurnTimeoutError(err) ? "deadline_exceeded" : params.abortSignal?.aborted ? resolveAgentAbortReason(params.abortSignal.reason) : "runtime_error"
|
|
1195
1218
|
}, `Embedded run failed: ${em}`);
|
|
1196
1219
|
onEvent?.({
|
|
1197
1220
|
type: "error",
|
|
@@ -30,11 +30,11 @@ export declare class EmbeddedRunRegistry {
|
|
|
30
30
|
acquire(identity: EmbeddedRunIdentity): EmbeddedRunLease;
|
|
31
31
|
getByConversationId(conversationId: string): EmbeddedRunHandle | undefined;
|
|
32
32
|
abortByConversationId(conversationId: string, reason?: 'user_cancelled' | 'parent_cancelled', expectedRunId?: string): Promise<boolean>;
|
|
33
|
-
steerByConversationId(conversationId: string, text: string): Promise<boolean>;
|
|
33
|
+
steerByConversationId(conversationId: string, text: string, expectedRunId?: string): Promise<boolean>;
|
|
34
34
|
size(): number;
|
|
35
35
|
}
|
|
36
36
|
export declare function acquireEmbeddedRunLease(identity: EmbeddedRunIdentity): EmbeddedRunLease;
|
|
37
37
|
export declare function reserveEmbeddedRunCancellation(identity: Pick<EmbeddedRunIdentity, 'conversationId' | 'runId'>): EmbeddedRunCancellation;
|
|
38
38
|
export declare function getEmbeddedRunByConversationId(conversationId: string): EmbeddedRunHandle | undefined;
|
|
39
39
|
export declare function abortEmbeddedRun(conversationId: string, reason?: 'user_cancelled' | 'parent_cancelled', expectedRunId?: string): Promise<boolean>;
|
|
40
|
-
export declare function queueEmbeddedSteer(conversationId: string, text: string): Promise<boolean>;
|
|
40
|
+
export declare function queueEmbeddedSteer(conversationId: string, text: string, expectedRunId?: string): Promise<boolean>;
|
|
@@ -63,9 +63,9 @@ var EmbeddedRunRegistry = class {
|
|
|
63
63
|
if (entry.handle) await entry.handle.abort();
|
|
64
64
|
return true;
|
|
65
65
|
}
|
|
66
|
-
async steerByConversationId(conversationId, text) {
|
|
66
|
+
async steerByConversationId(conversationId, text, expectedRunId) {
|
|
67
67
|
const handle = this.getByConversationId(conversationId);
|
|
68
|
-
if (!handle) return false;
|
|
68
|
+
if (!handle || expectedRunId !== void 0 && handle.runId !== expectedRunId || this.byConversationId.get(conversationId)?.abortController.signal.aborted) return false;
|
|
69
69
|
await handle.session.steer(text);
|
|
70
70
|
return true;
|
|
71
71
|
}
|
|
@@ -86,8 +86,8 @@ function getEmbeddedRunByConversationId(conversationId) {
|
|
|
86
86
|
function abortEmbeddedRun(conversationId, reason = "parent_cancelled", expectedRunId) {
|
|
87
87
|
return embeddedRunRegistry.abortByConversationId(conversationId, reason, expectedRunId);
|
|
88
88
|
}
|
|
89
|
-
function queueEmbeddedSteer(conversationId, text) {
|
|
90
|
-
return embeddedRunRegistry.steerByConversationId(conversationId, text);
|
|
89
|
+
function queueEmbeddedSteer(conversationId, text, expectedRunId) {
|
|
90
|
+
return embeddedRunRegistry.steerByConversationId(conversationId, text, expectedRunId);
|
|
91
91
|
}
|
|
92
92
|
//#endregion
|
|
93
93
|
export { EmbeddedRunConflictError, EmbeddedRunRegistry, abortEmbeddedRun, acquireEmbeddedRunLease, getEmbeddedRunByConversationId, queueEmbeddedSteer, reserveEmbeddedRunCancellation };
|
|
@@ -3,6 +3,7 @@ import { init_logger } from "../../utils/logger.js";
|
|
|
3
3
|
import { filterExecutionTools, resolveExecutionToolPolicy } from "./execution-tool-policy.js";
|
|
4
4
|
import { deferredToolContract, getXopcToolMetadata } from "./tool-metadata.js";
|
|
5
5
|
import { isCodemodeCoreRead } from "../tools/codemode-permissions.js";
|
|
6
|
+
import { getExternalToolRegistry } from "../external-tools/tool-registry.js";
|
|
6
7
|
import { createEmbeddedModelRuntime, resolveEmbeddedProviderApiKeySync } from "./model-runtime.js";
|
|
7
8
|
import { getNativePiAgentDir } from "../mcp/native-mcp.js";
|
|
8
9
|
import { createXopcMcpTransport } from "../mcp/transport.js";
|
|
@@ -21,13 +22,20 @@ import { createHash } from "node:crypto";
|
|
|
21
22
|
import { DefaultResourceLoader, SettingsManager, createAgentSession, createMcpExtension } from "@earendil-works/pi-coding-agent";
|
|
22
23
|
//#region src/agent/embedded/session-runner.ts
|
|
23
24
|
init_logger();
|
|
24
|
-
const toolContract = (tool) =>
|
|
25
|
-
tool
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
25
|
+
const toolContract = (tool) => {
|
|
26
|
+
const registry = getExternalToolRegistry([tool]);
|
|
27
|
+
return JSON.stringify([
|
|
28
|
+
tool.name,
|
|
29
|
+
tool.parameters,
|
|
30
|
+
tool.description,
|
|
31
|
+
isCodemodeCoreRead(tool),
|
|
32
|
+
getXopcToolMetadata(tool),
|
|
33
|
+
registry ? {
|
|
34
|
+
discovery: registry.discovery,
|
|
35
|
+
nativeSources: registry.nativeSources
|
|
36
|
+
} : void 0
|
|
37
|
+
]);
|
|
38
|
+
};
|
|
31
39
|
const log = createLogger("EmbeddedSessionRunner");
|
|
32
40
|
const DEFAULT_IDLE_TTL_MS = 5 * 6e4;
|
|
33
41
|
function providerCredentialRevision(providerId) {
|
|
@@ -259,8 +267,8 @@ var EmbeddedSessionRunnerPool = class {
|
|
|
259
267
|
contextWindowTokens: model.contextWindow ?? 128e3,
|
|
260
268
|
transformMessageForPersistence: params.transcriptRuntime.persistent ? (message) => transformUserMessageForPersistence(runtimeId, message) : void 0
|
|
261
269
|
});
|
|
262
|
-
const toolDefs = xopcToolsToDefinitions(tools);
|
|
263
|
-
const toolNames = tools.filter((tool) => getXopcToolMetadata(tool)?.exposure !== "
|
|
270
|
+
const toolDefs = xopcToolsToDefinitions(tools.filter((tool) => tool.name !== "tool_search"));
|
|
271
|
+
const toolNames = tools.filter((tool) => !["deferred", "hidden"].includes(getXopcToolMetadata(tool)?.exposure ?? "") && tool.name !== "tool_search").map((tool) => tool.name);
|
|
264
272
|
const discoveryState = piSm.getBranch().findLast((entry) => entry.type === "custom" && entry.customType === "xopc-tool-discovery");
|
|
265
273
|
const saved = discoveryState?.type === "custom" ? discoveryState.data : void 0;
|
|
266
274
|
const restored = new Map((saved?.loaded ?? []).map((tool) => [tool.name, tool.contract]));
|
|
@@ -277,7 +285,10 @@ var EmbeddedSessionRunnerPool = class {
|
|
|
277
285
|
maxOutputTokens: 4e3
|
|
278
286
|
} : void 0;
|
|
279
287
|
if (codemode) toolNames.push("codemode");
|
|
280
|
-
const
|
|
288
|
+
const registry = getExternalToolRegistry(tools);
|
|
289
|
+
const nativeDiscovery = params.executionToolPolicy?.discovery !== false && registry?.discovery?.native !== false;
|
|
290
|
+
const externalDiscovery = registry?.discovery?.connectors !== false;
|
|
291
|
+
const discovery = nativeDiscovery && (hasMcp || externalDiscovery && Boolean(registry) || tools.some((tool) => getXopcToolMetadata(tool)?.exposure === "deferred")) || externalDiscovery && params.executionToolPolicy?.surface === "personal_request_worker";
|
|
281
292
|
if (discovery) toolNames.push("tool_search");
|
|
282
293
|
const modelRuntime = await createEmbeddedModelRuntime(model.provider);
|
|
283
294
|
const resourceLoader = new DefaultResourceLoader({
|
|
@@ -291,7 +302,11 @@ var EmbeddedSessionRunnerPool = class {
|
|
|
291
302
|
createMcpSetupContinuationGuard(runtimeId, tools.some((tool) => tool.name === "mcp_setup")),
|
|
292
303
|
...mcp?.automationSourceRunId ? [createAutomationMcpSourceGuard(mcp.automationSourceRunId)] : [],
|
|
293
304
|
...codemode ? [createXopcCodemodeExtension(codemode, tools, () => boundSession)] : [],
|
|
294
|
-
...discovery ? [createXopcToolSearchExtension(tools
|
|
305
|
+
...discovery ? [createXopcToolSearchExtension(tools, {
|
|
306
|
+
nativeDiscovery,
|
|
307
|
+
externalDiscovery,
|
|
308
|
+
registry
|
|
309
|
+
})] : [],
|
|
295
310
|
...mcp ? [createMcpExtension({
|
|
296
311
|
createTransport: createXopcMcpTransport(),
|
|
297
312
|
loadConfig: () => mcp,
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
2
|
import { type ExtensionFactory } from '@earendil-works/pi-coding-agent';
|
|
3
|
+
import { type ExternalToolRegistry } from '../external-tools/tool-registry.js';
|
|
3
4
|
export declare const TOOL_DISCOVERY_STATE = "xopc-tool-discovery";
|
|
4
|
-
/**
|
|
5
|
-
export declare function createXopcToolSearchExtension(tools: readonly AgentTool[]
|
|
5
|
+
/** One model-facing discovery entry; execution and connection permissions remain host-owned. */
|
|
6
|
+
export declare function createXopcToolSearchExtension(tools: readonly AgentTool[], options?: {
|
|
7
|
+
nativeDiscovery?: boolean;
|
|
8
|
+
externalDiscovery?: boolean;
|
|
9
|
+
registry?: ExternalToolRegistry;
|
|
10
|
+
externalTimeoutMs?: number;
|
|
11
|
+
}): ExtensionFactory;
|
|
@@ -1,44 +1,136 @@
|
|
|
1
1
|
import { deferredToolContract, getXopcToolMetadata } from "./tool-metadata.js";
|
|
2
|
+
import { getExternalToolRegistry } from "../external-tools/tool-registry.js";
|
|
2
3
|
import { createToolSearchExtension } from "@earendil-works/pi-coding-agent";
|
|
3
4
|
//#region src/agent/embedded/tool-search-extension.ts
|
|
4
5
|
const TOOL_DISCOVERY_STATE = "xopc-tool-discovery";
|
|
5
|
-
/**
|
|
6
|
-
function createXopcToolSearchExtension(tools) {
|
|
6
|
+
/** One model-facing discovery entry; execution and connection permissions remain host-owned. */
|
|
7
|
+
function createXopcToolSearchExtension(tools, options = {}) {
|
|
7
8
|
const deferred = tools.filter((tool) => getXopcToolMetadata(tool)?.exposure === "deferred");
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
...definition,
|
|
13
|
-
async execute(id, params, signal, update, context) {
|
|
14
|
-
const input = params;
|
|
15
|
-
if ((input.limit ?? 8) > 20 || (input.query?.length ?? 0) > 2e3) throw new Error("Tool search permits at most 20 matches and 2000 query characters");
|
|
16
|
-
const result = await definition.execute(id, params, signal, update, context);
|
|
17
|
-
if ((result.details?.loaded)?.length === 0) {
|
|
18
|
-
const queryNames = new Set((input.query ?? "").match(/[\w.:-]+/g));
|
|
19
|
-
const active = new Set(pi.getActiveTools());
|
|
20
|
-
const alreadyLoaded = deferred.filter((tool) => active.has(tool.name) && queryNames.has(tool.name)).map((tool) => tool.name);
|
|
21
|
-
if (alreadyLoaded.length) return {
|
|
22
|
-
...result,
|
|
23
|
-
content: [{
|
|
24
|
-
type: "text",
|
|
25
|
-
text: `Already loaded: ${alreadyLoaded.join(", ")}. These tools are declared and available now; call them directly. No new tools were loaded.`
|
|
26
|
-
}]
|
|
27
|
-
};
|
|
28
|
-
}
|
|
29
|
-
return result;
|
|
30
|
-
}
|
|
31
|
-
});
|
|
32
|
-
},
|
|
33
|
-
setActiveTools(names) {
|
|
9
|
+
const registry = options.externalDiscovery === false ? void 0 : options.registry ?? getExternalToolRegistry(tools);
|
|
10
|
+
const nativeDiscovery = options.nativeDiscovery !== false;
|
|
11
|
+
return (pi) => {
|
|
12
|
+
const setActiveTools = (names) => {
|
|
34
13
|
pi.setActiveTools(names);
|
|
14
|
+
if (!nativeDiscovery) return;
|
|
35
15
|
const active = new Set(pi.getActiveTools());
|
|
36
16
|
pi.appendEntry(TOOL_DISCOVERY_STATE, { loaded: deferred.filter((tool) => active.has(tool.name)).map((tool) => ({
|
|
37
17
|
name: tool.name,
|
|
38
18
|
contract: deferredToolContract(tool)
|
|
39
19
|
})) });
|
|
40
|
-
}
|
|
41
|
-
|
|
20
|
+
};
|
|
21
|
+
return createToolSearchExtension()({
|
|
22
|
+
...pi,
|
|
23
|
+
registerTool(definition) {
|
|
24
|
+
pi.registerTool({
|
|
25
|
+
...definition,
|
|
26
|
+
description: "Search for tools and connector capabilities using concise capability keywords. loadedTools are available by name from the next model call. externalTools require xopc_tool_describe, then xopc_tool_execute with the exact revision. Connection and install candidates are recovery options, not executable tools or proof of missing authorization. Use xopc_require_connection only when authorization, installation or account selection is actually required; Personal request workers use personal_request_connection. Source errors do not mean a capability is unavailable. Searches never grant permissions.",
|
|
27
|
+
executionMode: "sequential",
|
|
28
|
+
async execute(id, params, signal, update, context) {
|
|
29
|
+
const input = params;
|
|
30
|
+
const limit = input.limit ?? 8;
|
|
31
|
+
if (!Number.isInteger(limit) || limit < 1 || limit > 20 || !input.query?.trim() || input.query.length > 2e3) throw new Error("Tool search requires a nonempty query of at most 2000 characters and a limit from 1 to 20");
|
|
32
|
+
signal?.throwIfAborted();
|
|
33
|
+
const nativeLimit = nativeDiscovery ? registry ? Math.max(1, Math.floor(limit / 2)) : limit : 0;
|
|
34
|
+
const externalLimit = nativeDiscovery ? Math.max(1, limit - nativeLimit) : limit;
|
|
35
|
+
const externalSearch = registry ? boundedSearch(() => registry.search({
|
|
36
|
+
query: input.query,
|
|
37
|
+
limit: externalLimit,
|
|
38
|
+
signal,
|
|
39
|
+
timeoutMs: 4e3
|
|
40
|
+
}), options.externalTimeoutMs ?? 8e3, signal) : Promise.resolve(void 0);
|
|
41
|
+
const result = nativeDiscovery ? await definition.execute(id, {
|
|
42
|
+
...params,
|
|
43
|
+
limit: nativeLimit
|
|
44
|
+
}, signal, update, context) : {
|
|
45
|
+
content: [],
|
|
46
|
+
details: { loaded: [] }
|
|
47
|
+
};
|
|
48
|
+
const external = await externalSearch;
|
|
49
|
+
signal?.throwIfAborted();
|
|
50
|
+
const loaded = result.details?.loaded ?? [];
|
|
51
|
+
const queryNames = new Set(input.query.match(/[\w.:-]+/g));
|
|
52
|
+
const active = new Set(pi.getActiveTools());
|
|
53
|
+
const alreadyLoaded = nativeDiscovery ? deferred.filter((tool) => active.has(tool.name) && !loaded.includes(tool.name) && queryNames.has(tool.name)).map((tool) => tool.name) : [];
|
|
54
|
+
const externalTools = (external?.result?.tools ?? []).slice(0, Math.max(0, limit - loaded.length));
|
|
55
|
+
if (externalTools.length) setActiveTools([
|
|
56
|
+
...active,
|
|
57
|
+
"xopc_tool_describe",
|
|
58
|
+
"xopc_tool_execute"
|
|
59
|
+
]);
|
|
60
|
+
const all = new Map(pi.getAllTools().map((tool) => [tool.name, tool]));
|
|
61
|
+
const payload = {
|
|
62
|
+
loadedTools: loaded.map((name) => ({
|
|
63
|
+
name,
|
|
64
|
+
description: all.get(name)?.description,
|
|
65
|
+
nextAction: "call"
|
|
66
|
+
})),
|
|
67
|
+
alreadyLoaded,
|
|
68
|
+
externalTools: externalTools.map((tool) => ({
|
|
69
|
+
...tool,
|
|
70
|
+
nextAction: "describe"
|
|
71
|
+
})),
|
|
72
|
+
connectionCandidates: external?.result?.connectionCandidates ?? [],
|
|
73
|
+
installCandidates: external?.result?.installCandidates ?? [],
|
|
74
|
+
selectedConnections: external?.result?.selectedConnections ?? [],
|
|
75
|
+
selectedAccountId: external?.result?.selectedAccountId,
|
|
76
|
+
waitingObjective: external?.result?.waitingObjective,
|
|
77
|
+
sourceErrors: [
|
|
78
|
+
...external?.result?.sourceErrors ?? [],
|
|
79
|
+
...external?.error ? [{
|
|
80
|
+
source: "connectors",
|
|
81
|
+
message: external.error
|
|
82
|
+
}] : [],
|
|
83
|
+
...external?.result?.installCatalogError ? [{
|
|
84
|
+
source: "store",
|
|
85
|
+
message: external.result.installCatalogError
|
|
86
|
+
}] : []
|
|
87
|
+
],
|
|
88
|
+
unavailableSources: external?.result?.unavailableSources ?? [],
|
|
89
|
+
scope: {
|
|
90
|
+
native: nativeDiscovery,
|
|
91
|
+
connectors: Boolean(registry),
|
|
92
|
+
...nativeDiscovery ? {} : { restriction: "Only the selected Personal request connector, account and curated reads are discoverable." }
|
|
93
|
+
},
|
|
94
|
+
instruction: [
|
|
95
|
+
nativeDiscovery ? result.content.filter((block) => block.type === "text").map((block) => block.text).join("\n") : "",
|
|
96
|
+
alreadyLoaded.length ? `Already loaded: ${alreadyLoaded.join(", ")}. Call these tools directly.` : "",
|
|
97
|
+
external?.result?.instruction ?? "",
|
|
98
|
+
"loadedTools are declared from the next model call; externalTools are references and must be described before execution. No matches alone do not prove missing authorization."
|
|
99
|
+
].filter(Boolean).join("\n")
|
|
100
|
+
};
|
|
101
|
+
return {
|
|
102
|
+
content: [{
|
|
103
|
+
type: "text",
|
|
104
|
+
text: JSON.stringify(payload)
|
|
105
|
+
}],
|
|
106
|
+
details: {
|
|
107
|
+
...payload,
|
|
108
|
+
loaded
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
},
|
|
114
|
+
setActiveTools
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
/** Bound directory latency without cancelling another source or executing any operation. */
|
|
119
|
+
async function boundedSearch(search, timeoutMs, signal) {
|
|
120
|
+
let timer;
|
|
121
|
+
let onAbort;
|
|
122
|
+
try {
|
|
123
|
+
return await Promise.race([Promise.resolve().then(search).then((result) => ({ result })), new Promise((_resolve, reject) => {
|
|
124
|
+
timer = setTimeout(() => reject(/* @__PURE__ */ new Error("Connector discovery timed out; retry before declaring the capability unavailable")), timeoutMs);
|
|
125
|
+
onAbort = () => reject(signal?.reason ?? /* @__PURE__ */ new Error("Tool search aborted"));
|
|
126
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
127
|
+
})]);
|
|
128
|
+
} catch (error) {
|
|
129
|
+
return { error: error instanceof Error ? error.message : String(error) };
|
|
130
|
+
} finally {
|
|
131
|
+
clearTimeout(timer);
|
|
132
|
+
if (onAbort) signal?.removeEventListener("abort", onAbort);
|
|
133
|
+
}
|
|
42
134
|
}
|
|
43
135
|
//#endregion
|
|
44
136
|
export { TOOL_DISCOVERY_STATE, createXopcToolSearchExtension };
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { Config } from '../../config/schema.js';
|
|
2
|
-
import type { ExternalToolProvider, ExternalToolExecutionContext, ExternalToolTurnContext } from './types.js';
|
|
2
|
+
import type { ExternalToolProvider, ExternalToolDiscoveryContext, ExternalToolExecutionContext, ExternalToolTurnContext } from './types.js';
|
|
3
3
|
export declare class CliToolProvider implements ExternalToolProvider {
|
|
4
4
|
private readonly deps;
|
|
5
5
|
readonly source: "cli";
|
|
@@ -9,20 +9,14 @@ export declare class CliToolProvider implements ExternalToolProvider {
|
|
|
9
9
|
agentId?: string;
|
|
10
10
|
});
|
|
11
11
|
private available;
|
|
12
|
-
search(query: string): Promise<{
|
|
12
|
+
search(query: string, context?: ExternalToolDiscoveryContext): Promise<{
|
|
13
13
|
toolRef: string;
|
|
14
14
|
source: "cli";
|
|
15
15
|
namespace: string;
|
|
16
16
|
title: string;
|
|
17
17
|
summary: string;
|
|
18
18
|
}[]>;
|
|
19
|
-
describe(toolRef: string): Promise<{
|
|
20
|
-
toolRef: string;
|
|
21
|
-
source: "cli";
|
|
22
|
-
namespace: string;
|
|
23
|
-
title: string;
|
|
24
|
-
summary: string;
|
|
25
|
-
description: string;
|
|
19
|
+
describe(toolRef: string, context?: ExternalToolDiscoveryContext): Promise<{
|
|
26
20
|
readOnly: boolean;
|
|
27
21
|
batchRead: boolean;
|
|
28
22
|
inputSchema: {
|
|
@@ -37,6 +31,13 @@ export declare class CliToolProvider implements ExternalToolProvider {
|
|
|
37
31
|
};
|
|
38
32
|
};
|
|
39
33
|
};
|
|
34
|
+
contractRevision?: string;
|
|
35
|
+
toolRef: string;
|
|
36
|
+
source: "cli";
|
|
37
|
+
namespace: string;
|
|
38
|
+
title: string;
|
|
39
|
+
summary: string;
|
|
40
|
+
description: string;
|
|
40
41
|
}>;
|
|
41
42
|
execute(toolRef: string, args: Record<string, unknown>, approvalId: string | undefined, context: ExternalToolExecutionContext): Promise<{
|
|
42
43
|
content: {
|
|
@@ -35,6 +35,16 @@ const result = (value) => ({
|
|
|
35
35
|
}],
|
|
36
36
|
details: {}
|
|
37
37
|
});
|
|
38
|
+
function cliContractRevision(connection, action, adapter) {
|
|
39
|
+
return connectorArgumentsHash({
|
|
40
|
+
accountId: connection.accountId,
|
|
41
|
+
connectionId: connection.id,
|
|
42
|
+
connectionUpdatedAt: connection.updatedAt,
|
|
43
|
+
action,
|
|
44
|
+
adapterVersion: adapter.version,
|
|
45
|
+
binaryVersion: adapter.binaryVersion
|
|
46
|
+
});
|
|
47
|
+
}
|
|
38
48
|
var CliToolProvider = class {
|
|
39
49
|
source = "cli";
|
|
40
50
|
constructor(deps) {
|
|
@@ -60,13 +70,14 @@ var CliToolProvider = class {
|
|
|
60
70
|
}];
|
|
61
71
|
});
|
|
62
72
|
}
|
|
63
|
-
async search(query) {
|
|
73
|
+
async search(query, context) {
|
|
64
74
|
const words = query.toLowerCase().split(/\s+/).filter(Boolean);
|
|
65
75
|
return this.available().flatMap((item) => {
|
|
76
|
+
if (context && item.instance.connectorId !== context.connectorId) return [];
|
|
66
77
|
const accounts = selectConnectorAccount({
|
|
67
78
|
installation: item.policy,
|
|
68
79
|
agentId: item.agentId,
|
|
69
|
-
accept: (c) => c.provider === "cli" && c.metadata.runtimeInstanceId === item.instance.instanceId
|
|
80
|
+
accept: (c) => c.provider === "cli" && c.metadata.runtimeInstanceId === item.instance.instanceId && (!context || c.accountId === context.accountId)
|
|
70
81
|
}).candidates;
|
|
71
82
|
if (!accounts.length) return [];
|
|
72
83
|
return Object.entries(item.adapter.curatedActions).filter(([id, scope]) => {
|
|
@@ -90,16 +101,18 @@ var CliToolProvider = class {
|
|
|
90
101
|
}));
|
|
91
102
|
});
|
|
92
103
|
}
|
|
93
|
-
async describe(toolRef) {
|
|
104
|
+
async describe(toolRef, context) {
|
|
94
105
|
const parsed = parseExternalToolRef(toolRef, this.source);
|
|
95
106
|
const item = this.available().find((value) => value.instance.instanceId === parsed?.namespace);
|
|
96
107
|
if (!item || !parsed) return void 0;
|
|
108
|
+
if (context && item.instance.connectorId !== context.connectorId) return void 0;
|
|
97
109
|
const selected = selectConnectorAccount({
|
|
98
110
|
installation: item.policy,
|
|
99
111
|
agentId: item.agentId,
|
|
112
|
+
requestedAccountId: context?.accountId,
|
|
100
113
|
accept: (c) => c.provider === "cli" && c.metadata.runtimeInstanceId === item.instance.instanceId
|
|
101
114
|
});
|
|
102
|
-
const connection = selected.connection ?? selected.candidates[0];
|
|
115
|
+
const connection = selected.connection ?? (context ? void 0 : selected.candidates[0]);
|
|
103
116
|
if (!connection) return void 0;
|
|
104
117
|
const action = await describeCliAction(item.config, item.instance.instanceId, connection, parsed.toolName);
|
|
105
118
|
if (evaluateConnectorExecutionPolicy({
|
|
@@ -119,6 +132,7 @@ var CliToolProvider = class {
|
|
|
119
132
|
title: action.id,
|
|
120
133
|
summary: action.description,
|
|
121
134
|
description: action.description,
|
|
135
|
+
...context ? { contractRevision: cliContractRevision(connection, action, item.adapter) } : {},
|
|
122
136
|
readOnly: action.scope === "read",
|
|
123
137
|
batchRead: action.scope === "read",
|
|
124
138
|
inputSchema: {
|
|
@@ -159,6 +173,9 @@ var CliToolProvider = class {
|
|
|
159
173
|
instruction: "Select a connected account using xopcAccountId. Never substitute another account."
|
|
160
174
|
});
|
|
161
175
|
const action = await describeCliAction(item.config, item.instance.instanceId, connection, parsed.toolName);
|
|
176
|
+
context.authorize?.();
|
|
177
|
+
context.signal?.throwIfAborted();
|
|
178
|
+
if (context.contractRevision && context.contractRevision !== cliContractRevision(connection, action, item.adapter)) throw new CapabilityError("REVISION_CONFLICT", "Selected account or CLI action contract changed. Describe the tool again.");
|
|
162
179
|
if (args.xopcExportResult !== void 0 && typeof args.xopcExportResult !== "boolean") throw new Error("Invalid export option.");
|
|
163
180
|
const exportResult = args.xopcExportResult === true;
|
|
164
181
|
const input = { ...args };
|
|
@@ -252,6 +269,8 @@ var CliToolProvider = class {
|
|
|
252
269
|
}
|
|
253
270
|
const acceptedArgumentsHash = argumentsHash();
|
|
254
271
|
const authorizeCurrent = () => {
|
|
272
|
+
context.authorize?.();
|
|
273
|
+
context.signal?.throwIfAborted();
|
|
255
274
|
const freshPolicy = getConnectorInstallation(item.policy.id);
|
|
256
275
|
const freshConnection = getConnectorConnection(connection.id);
|
|
257
276
|
const currentConfig = this.deps.getConfig();
|
|
@@ -273,6 +292,7 @@ var CliToolProvider = class {
|
|
|
273
292
|
confirmed: Boolean(approvalId)
|
|
274
293
|
}).decision !== "allowed") throw new CapabilityError("FORBIDDEN", "Connector permission changed.");
|
|
275
294
|
if (argumentsHash() !== acceptedArgumentsHash) throw new CapabilityError("REVISION_CONFLICT", "Connector objective changed.");
|
|
295
|
+
if (context.contractRevision && context.contractRevision !== cliContractRevision(freshConnection, action, item.adapter)) throw new CapabilityError("REVISION_CONFLICT", "Selected account or CLI action contract changed.");
|
|
276
296
|
};
|
|
277
297
|
const execute = async (executionId) => {
|
|
278
298
|
let authorized = false;
|
|
@@ -2,7 +2,7 @@ import type { AgentToolResult } from '@earendil-works/pi-agent-core';
|
|
|
2
2
|
import type { Config } from '../../config/schema.js';
|
|
3
3
|
import type { ExtensionHookRunner } from '../../extensions/index.js';
|
|
4
4
|
import { ComposioSessionsAdapter } from '../../connectors/composio-sessions.js';
|
|
5
|
-
import type { ExternalToolDescriptor, ExternalToolExecutionContext, ExternalToolProvider, ExternalToolSearchHit } from './types.js';
|
|
5
|
+
import type { ExternalToolDescriptor, ExternalToolDiscoveryContext, ExternalToolExecutionContext, ExternalToolProvider, ExternalToolSearchHit } from './types.js';
|
|
6
6
|
type CurrentContext = {
|
|
7
7
|
channel: string;
|
|
8
8
|
chatId: string;
|
|
@@ -21,8 +21,8 @@ export declare class ComposioToolProvider implements ExternalToolProvider {
|
|
|
21
21
|
private readonly adapter;
|
|
22
22
|
private readonly unavailableToolkits;
|
|
23
23
|
constructor(deps: ComposioToolProviderDeps);
|
|
24
|
-
search(query: string): Promise<ExternalToolSearchHit[]>;
|
|
25
|
-
describe(toolRef: string): Promise<ExternalToolDescriptor | undefined>;
|
|
24
|
+
search(query: string, context?: ExternalToolDiscoveryContext): Promise<ExternalToolSearchHit[]>;
|
|
25
|
+
describe(toolRef: string, context?: ExternalToolDiscoveryContext): Promise<ExternalToolDescriptor | undefined>;
|
|
26
26
|
execute(toolRef: string, args: Record<string, unknown>, approvalId: string | undefined, context: ExternalToolExecutionContext): Promise<AgentToolResult<Record<string, unknown>>>;
|
|
27
27
|
private availableInstallations;
|
|
28
28
|
private resolve;
|
|
@@ -142,8 +142,9 @@ var ComposioToolProvider = class {
|
|
|
142
142
|
this.deps = deps;
|
|
143
143
|
this.adapter = deps.adapter ?? new ComposioSessionsAdapter();
|
|
144
144
|
}
|
|
145
|
-
async search(query) {
|
|
145
|
+
async search(query, context) {
|
|
146
146
|
const available = this.availableInstallations();
|
|
147
|
+
if (context) available.installations = available.installations.filter((installation) => installation.connectorId === context.connectorId);
|
|
147
148
|
if (available.installations.length === 0) return [];
|
|
148
149
|
const settled = await Promise.allSettled(available.installations.map(async (installation) => {
|
|
149
150
|
const toolkit = toolkitFromInstallation(installation);
|
|
@@ -207,9 +208,10 @@ var ComposioToolProvider = class {
|
|
|
207
208
|
}
|
|
208
209
|
return hits;
|
|
209
210
|
}
|
|
210
|
-
async describe(toolRef) {
|
|
211
|
+
async describe(toolRef, context) {
|
|
211
212
|
const resolved = this.resolve(toolRef);
|
|
212
213
|
if (!resolved) return void 0;
|
|
214
|
+
if (context && resolved.installation.connectorId !== context.connectorId) return void 0;
|
|
213
215
|
const toolkit = toolkitFromInstallation(resolved.installation);
|
|
214
216
|
const action = listConnectorActionMetadata(resolved.installation.connectorId).find((candidate) => candidate.actionId === resolved.actionId);
|
|
215
217
|
if (!action || !isToolInputSchema(action.inputSchema) || !isComposioActionAllowedByCatalog(action.actionId)) return void 0;
|
|
@@ -218,11 +220,12 @@ var ComposioToolProvider = class {
|
|
|
218
220
|
const accounts = currentAccountConnections(listConnectorConnections({
|
|
219
221
|
principalId: available.principalId,
|
|
220
222
|
connectorId: resolved.installation.connectorId
|
|
221
|
-
}).filter((connection) => canAccessConnectorAccount(connection, resolved.installation, available.agentId))).map((connection) => ({
|
|
223
|
+
}).filter((connection) => canAccessConnectorAccount(connection, resolved.installation, available.agentId) && (!context || connection.accountId === context.accountId))).map((connection) => ({
|
|
222
224
|
accountId: connection.accountId,
|
|
223
225
|
label: getConnectorAccount(connection.accountId)?.label,
|
|
224
226
|
identity: connectorIdentitySummary(connection.identity)
|
|
225
227
|
}));
|
|
228
|
+
if (context && !accounts.length) return void 0;
|
|
226
229
|
return {
|
|
227
230
|
toolRef,
|
|
228
231
|
source: this.source,
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Config } from '../../config/schema.js';
|
|
2
|
+
import type { ExternalToolService } from './service.js';
|
|
3
|
+
import { type ExternalToolSource, type ExternalToolTurnContext } from './types.js';
|
|
4
|
+
import type { PersonalRequest } from '../../personal-agent/request-repository.js';
|
|
5
|
+
export type ExternalDiscoveryParams = {
|
|
6
|
+
query: string;
|
|
7
|
+
limit?: number;
|
|
8
|
+
sources?: ExternalToolSource[];
|
|
9
|
+
signal?: AbortSignal;
|
|
10
|
+
timeoutMs?: number;
|
|
11
|
+
};
|
|
12
|
+
/** Discover capabilities without activating tools or granting execution permissions. */
|
|
13
|
+
export declare function discoverExternalTools(deps: {
|
|
14
|
+
service: ExternalToolService;
|
|
15
|
+
nativeSources: readonly ExternalToolSource[];
|
|
16
|
+
getContext?: () => ExternalToolTurnContext | null;
|
|
17
|
+
getConfig?: () => Config | undefined;
|
|
18
|
+
getRequest: () => PersonalRequest | undefined;
|
|
19
|
+
}, params: ExternalDiscoveryParams): Promise<{
|
|
20
|
+
tools: any[];
|
|
21
|
+
connectionCandidates: any[];
|
|
22
|
+
installCandidates: any[];
|
|
23
|
+
unavailableSources: any[];
|
|
24
|
+
instruction: string;
|
|
25
|
+
} | {
|
|
26
|
+
selectedAccountId?: string;
|
|
27
|
+
instruction?: string;
|
|
28
|
+
selectedConnections: import("@xopcai/gateway-contract/src/connection-waits.js").ConnectionNeed[];
|
|
29
|
+
waitingObjective: string;
|
|
30
|
+
searchScope?: {
|
|
31
|
+
excludedSources: ("cli" | "extension" | "memory" | "endpoint" | "composio")[];
|
|
32
|
+
instruction: string;
|
|
33
|
+
};
|
|
34
|
+
installCatalogError?: string;
|
|
35
|
+
connectionCandidates: {
|
|
36
|
+
candidateRef: string;
|
|
37
|
+
label: string;
|
|
38
|
+
capabilities: string[];
|
|
39
|
+
}[];
|
|
40
|
+
installCandidates: import("../../capabilities/store-connector.js").StoreConnectorInstallCandidate[];
|
|
41
|
+
tools: import("./types.js").ExternalToolSearchHit[];
|
|
42
|
+
unavailableSources: ExternalToolSource[];
|
|
43
|
+
sourceErrors?: Array<ReturnType<typeof import("./search-error.js").searchFailureDetails> & {
|
|
44
|
+
source: ExternalToolSource;
|
|
45
|
+
}>;
|
|
46
|
+
}>;
|
|
47
|
+
export type ExternalDiscoveryResult = Awaited<ReturnType<typeof discoverExternalTools>>;
|