@xopcai/xopc 0.0.369 → 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.
- package/README.md +59 -174
- package/README.zh-CN.md +59 -174
- package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/_md.js +131 -0
- package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/_u64.js +30 -0
- package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/sha2.js +252 -0
- package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/sha256.js +16 -0
- package/dist/.pnpm/@noble_hashes@1.8.0/node_modules/@noble/hashes/esm/utils.js +66 -0
- package/dist/browser-ext/dist/sidepanel.js +21 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-Stj17S9u.js → agent-avatar-dicebear-C61i1QbX.js} +1 -1
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-0fCR1DHx.js +1 -0
- package/dist/gateway/static/root/assets/agent-plugin-dialog-Di99mUTT.js +1 -0
- package/dist/gateway/static/root/assets/agents-BRZZmYH_.js +66 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-pJFe6M6c.js → app-management-settings-panel-noqqxkds.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-BrxSpBWa.js → appearance-settings-DG8QN0gR.js} +1 -1
- package/dist/gateway/static/root/assets/{apps-page-DegSl5Lh.js → apps-page-CgiyzFYo.js} +1 -1
- package/dist/gateway/static/root/assets/{automations-page-BZQ_VHjp.js → automations-page-CgAcRFDS.js} +1 -1
- package/dist/gateway/static/root/assets/automations-workspace-BIkxIpab.js +6 -0
- package/dist/gateway/static/root/assets/{block-editor-3XjFv3kK.js → block-editor-B1VE-jAe.js} +3 -3
- package/dist/gateway/static/root/assets/browser-automations-page-CIjyMS6f.js +3 -0
- package/dist/gateway/static/root/assets/{browser-settings-page-ch2_bQF0.js → browser-settings-page-BMAivBfp.js} +2 -2
- package/dist/gateway/static/root/assets/{capabilities-DO-vfNKI.js → capabilities-CY4SiHcP.js} +1 -1
- package/dist/gateway/static/root/assets/{capabilities-B48r0DDa.js → capabilities-gjQtMhKu.js} +1 -1
- package/dist/gateway/static/root/assets/capabilities-page-DRdcfo68.js +2 -0
- package/dist/gateway/static/root/assets/{capabilities-settings-panel-NckMsJ5N.js → capabilities-settings-panel-ZuL6pWjM.js} +4 -4
- package/dist/gateway/static/root/assets/{capability-header-actions-CY8KCO9j.js → capability-header-actions-D0GC1FEv.js} +1 -1
- package/dist/gateway/static/root/assets/{channels-CHOS2CGa.js → channels-CgE22Pzd.js} +1 -1
- package/dist/gateway/static/root/assets/{chat-terminal-dock-Bwknnb4c.js → chat-terminal-dock-CEjh1utz.js} +2 -2
- package/dist/gateway/static/root/assets/{computer-settings-page-B2xeFCSt.js → computer-settings-page-vFHJAmQr.js} +1 -1
- package/dist/gateway/static/root/assets/{connector-service-page-C83DnAqK.js → connector-service-page-DTrwZ4kV.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DRcMiTWu.js +1 -0
- package/dist/gateway/static/root/assets/copy-text-row-C1gaJwlZ.js +1 -0
- package/dist/gateway/static/root/assets/{date-picker-Bq9GR-DU.js → date-picker-NfGIPSYY.js} +1 -1
- package/dist/gateway/static/root/assets/dependency-picker-CqguveUi.js +1 -0
- package/dist/gateway/static/root/assets/{desktop-pet-BwsbQw8V.js → desktop-pet-CTx1zkJm.js} +1 -1
- package/dist/gateway/static/root/assets/{desktop-pet-settings-sL9i44pP.js → desktop-pet-settings-BRDS3EGc.js} +1 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-Du4Ciuyw.js +1 -0
- package/dist/gateway/static/root/assets/{directory-picker-path-field-BFlDmsS5.js → directory-picker-path-field-CjstlxFl.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-7Z1Tp7-w.js → extension-debug-page-BfAtjhoK.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-uGqvb8QX.js → extension-page-BJmudejr.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-xlSyz4Z6.js → extension-provider-Br6LXyIj.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-CKHgrjOs.js → extension-settings-page-UvmHniyz.js} +1 -1
- package/dist/gateway/static/root/assets/{fallback-models-BwQg0G1D.js → fallback-models-euw9MGdt.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-realtime-F6D4A7N5.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-settings-BAQnSEMJ.js → gateway-settings-C7roPHh1.js} +1 -1
- package/dist/gateway/static/root/assets/home-page-BGNCTtM3.js +2 -0
- package/dist/gateway/static/root/assets/{imports-page-re1_Nh64.js → imports-page-DxCoT0VV.js} +1 -1
- package/dist/gateway/static/root/assets/index-BGBkIIzM.css +1 -0
- package/dist/gateway/static/root/assets/index-FCEE325-.js +106 -0
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-B_xja9LN.js → keyboard-shortcuts-settings-CnLln9Ds.js} +1 -1
- package/dist/gateway/static/root/assets/{local-app-workbench-page-CErdCrPX.js → local-app-workbench-page-yXRkSrEj.js} +1 -1
- package/dist/gateway/static/root/assets/{local-apps-page-BPL2RXdK.js → local-apps-page-D46buzTk.js} +1 -1
- package/dist/gateway/static/root/assets/local-session-drafts-pox8evDV.js +1 -0
- package/dist/gateway/static/root/assets/logs-page-DmcCHnH0.js +2 -0
- package/dist/gateway/static/root/assets/management-settings-khN1ThNL.js +1 -0
- package/dist/gateway/static/root/assets/note-detail-panel-C_t58yha.js +5 -0
- package/dist/gateway/static/root/assets/notes-page-BJ0QS6xx.js +8 -0
- package/dist/gateway/static/root/assets/{page-context-capture-button-tf77xIz3.js → page-context-capture-button-DfRODHv1.js} +1 -1
- package/dist/gateway/static/root/assets/personal-page-CiiXwwQE.js +1 -0
- package/dist/gateway/static/root/assets/{product-open-page-Dc3Y-Y7J.js → product-open-page-_Bp6HRmm.js} +1 -1
- package/dist/gateway/static/root/assets/{product-preview-content-MG_hmVA3.js → product-preview-content-BUdiO0Ct.js} +1 -1
- package/dist/gateway/static/root/assets/project-detail-page-Clb-fXYk.js +1 -0
- package/dist/gateway/static/root/assets/{projects-page-MllfNLGA.js → projects-page-D9JEEqhh.js} +1 -1
- package/dist/gateway/static/root/assets/{remote-access-hub-Bs-C70el.js → remote-access-hub-CmyTq3_l.js} +1 -1
- package/dist/gateway/static/root/assets/{runtime-tools-settings-panel-DpJ5jNzR.js → runtime-tools-settings-panel-B1_inj8L.js} +1 -1
- package/dist/gateway/static/root/assets/{scenes-page-Dpxamkw6.js → scenes-page-CUNAZN2_.js} +2 -2
- package/dist/gateway/static/root/assets/{schema-form-DUeyQ1zh.js → schema-form-CfT-9UVw.js} +1 -1
- package/dist/gateway/static/root/assets/{send-session-input-Dgn4BRk_.js → send-session-input-BW40VHiL.js} +1 -1
- package/dist/gateway/static/root/assets/session-manager-BqlvrjPE.js +16 -0
- package/dist/gateway/static/root/assets/sessions-page-CXZKScvu.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-B2vKXmzg.js +1 -0
- package/dist/gateway/static/root/assets/{settings-page-DouHuBXt.js → settings-page-1h3vyueg.js} +1 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Cqc7UlZy.js +1 -0
- package/dist/gateway/static/root/assets/{share-link-dialog-DJTabLAM.js → share-link-dialog-HCHM8qnf.js} +1 -1
- package/dist/gateway/static/root/assets/{share-preview-page-jw7h4t_B.js → share-preview-page-Ce6FNWt1.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Dh5jisCK.js +1 -0
- package/dist/gateway/static/root/assets/{skill-api-CfyX_0zN.js → skill-api-deDZeQS8.js} +1 -1
- package/dist/gateway/static/root/assets/skills-page-DZozl9U_.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-DWf256TE.js → system-settings-panel-CtzyMxqq.js} +1 -1
- package/dist/gateway/static/root/assets/{task-detail-page-DE6N1ZQe.js → task-detail-page-5f_V0h-p.js} +2 -2
- package/dist/gateway/static/root/assets/{tunnel-api-BBm9esrY.js → tunnel-api-vMtlbJ-m.js} +1 -1
- package/dist/gateway/static/root/assets/{usage-page-C93x89uW.js → usage-page-B1-BCW8U.js} +1 -1
- package/dist/gateway/static/root/assets/{use-composer-attachments-C7Gaaai1.js → use-composer-attachments-DJya1hIL.js} +1 -1
- package/dist/gateway/static/root/assets/use-file-preview-expanded-C5ONO7sF.js +2 -0
- package/dist/gateway/static/root/assets/user-model-page-D4BSq9HJ.js +2 -0
- package/dist/gateway/static/root/assets/{work-discovery-overlay-Bs2MKiTv.js → work-discovery-overlay-CjiNYJV5.js} +1 -1
- package/dist/gateway/static/root/assets/{workflow-run-setup-panel-BR_U_snV.js → workflow-run-setup-panel-DJOetXvm.js} +2 -2
- package/dist/gateway/static/root/assets/workflows-page-CcAPFh2R.js +6 -0
- package/dist/gateway/static/root/assets/{workspace-api-Si2o3inw.js → workspace-api-WhbMvdBE.js} +2 -2
- package/dist/gateway/static/root/index.html +18 -20
- package/dist/package.js +1 -1
- package/dist/packages/endpoint-tools-client/src/index.js +189 -0
- package/dist/packages/endpoint-tools-protocol/src/bridge.js +105 -0
- package/dist/packages/endpoint-tools-protocol/src/index.js +93 -2
- package/dist/packages/endpoint-tools-protocol/src/location.js +109 -0
- package/dist/packages/gateway-contract/src/session-input-command.js +30 -5
- package/dist/src/agent/agent-manager.js +22 -26
- package/dist/src/agent/embedded/codemode-extension.d.ts +7 -0
- package/dist/src/agent/embedded/codemode-extension.js +232 -0
- package/dist/src/agent/embedded/codemode-output.d.ts +2 -0
- package/dist/src/agent/embedded/codemode-output.js +34 -0
- package/dist/src/agent/embedded/external-tool-discovery.d.ts +6 -0
- package/dist/src/agent/embedded/external-tool-discovery.js +60 -0
- package/dist/src/agent/embedded/model-runtime.js +5 -2
- package/dist/src/agent/embedded/run-for-session.js +10 -1
- package/dist/src/agent/embedded/run-turn.js +10 -3
- package/dist/src/agent/embedded/session-runner.d.ts +9 -1
- package/dist/src/agent/embedded/session-runner.js +111 -23
- package/dist/src/agent/embedded/session-tool-result-guard.d.ts +2 -0
- package/dist/src/agent/embedded/session-tool-result-guard.js +17 -0
- package/dist/src/agent/embedded/subscribe-session.js +14 -4
- package/dist/src/agent/embedded/tool-metadata.d.ts +15 -0
- package/dist/src/agent/embedded/tool-metadata.js +38 -0
- package/dist/src/agent/embedded/tool-search-extension.d.ts +5 -0
- package/dist/src/agent/embedded/tool-search-extension.js +31 -0
- package/dist/src/agent/embedded/types.d.ts +7 -0
- package/dist/src/agent/embedded/xopc-tools-bridge.js +6 -0
- package/dist/src/agent/external-tools/endpoint-provider.d.ts +1 -1
- package/dist/src/agent/external-tools/endpoint-provider.js +148 -56
- package/dist/src/agent/external-tools/extension-provider.js +8 -1
- package/dist/src/agent/external-tools/gateway-tools.d.ts +1 -1
- package/dist/src/agent/external-tools/gateway-tools.js +45 -22
- package/dist/src/agent/external-tools/index.js +46 -14
- package/dist/src/agent/external-tools/memory-provider.js +8 -1
- package/dist/src/agent/external-tools/read-policy.js +2 -1
- package/dist/src/agent/external-tools/service.d.ts +2 -0
- package/dist/src/agent/external-tools/service.js +25 -3
- package/dist/src/agent/external-tools/tool-registry.d.ts +14 -0
- package/dist/src/agent/external-tools/tool-registry.js +14 -0
- package/dist/src/agent/external-tools/types.d.ts +8 -1
- package/dist/src/agent/external-tools/types.js +0 -1
- package/dist/src/agent/mcp/config.d.ts +18 -0
- package/dist/src/agent/mcp/{bundle-mcp-config.js → config.js} +8 -25
- package/dist/src/agent/mcp/native-mcp.d.ts +6 -0
- package/dist/src/agent/mcp/native-mcp.js +73 -0
- package/dist/src/agent/service.js +2 -5
- package/dist/src/agent/skills/installer.js +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/skills/skill-sources.js +1 -1
- package/dist/src/agent/source-context/index.d.ts +0 -1
- package/dist/src/agent/source-context/index.js +1 -2
- package/dist/src/agent/source-context/injector.js +1 -0
- package/dist/src/agent/source-context/types.d.ts +2 -2
- package/dist/src/agent/source-context/types.js +1 -1
- package/dist/src/agent/tools/cli-clarify.js +1 -1
- package/dist/src/agent/tools/codemode-permissions.d.ts +4 -0
- package/dist/src/agent/tools/codemode-permissions.js +23 -0
- package/dist/src/agent/tools/dataBatch.js +3 -1
- package/dist/src/agent/tools/delegation-parent-policy.js +1 -4
- package/dist/src/agent/tools/factory.js +4 -3
- package/dist/src/agent/transcript/provider-capabilities.js +0 -1
- package/dist/src/agent/transcript/transcript-policy.js +1 -2
- package/dist/src/agent-config/schema.d.ts +28 -0
- package/dist/src/agent-config/schema.js +7 -0
- package/dist/src/auth/credentials.js +7 -20
- package/dist/src/auth/model-credential-store.js +11 -4
- package/dist/src/auth/oauth/index.d.ts +1 -1
- package/dist/src/auth/oauth/index.js +3 -3
- package/dist/src/auth/oauth/openai.d.ts +2 -0
- package/dist/src/auth/oauth/openai.js +90 -0
- package/dist/src/auth/oauth/registry.js +3 -3
- package/dist/src/auth/oauth/types.d.ts +1 -0
- package/dist/src/auth/oauth/xopc-cloud.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +5 -0
- package/dist/src/chat-commands/builtins/model.js +2 -2
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/extension-agent-plugin.js +0 -19
- package/dist/src/cli/commands/mcp.js +36 -2
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/utils/oauth-login.js +2 -2
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/mcp-config-normalize.d.ts +0 -3
- package/dist/src/config/mcp-config-normalize.js +2 -22
- package/dist/src/config/models-json.d.ts +0 -5
- package/dist/src/config/models-json.js +13 -4
- package/dist/src/config/paths.d.ts +0 -1
- package/dist/src/config/paths.js +1 -4
- package/dist/src/config/schema.d.ts +130 -36
- package/dist/src/config/schema.js +52 -35
- package/dist/src/connectors/auth-provider-registry.d.ts +1 -1
- package/dist/src/connectors/auth-provider-registry.js +1 -21
- package/dist/src/connectors/china-catalog.js +5 -5
- package/dist/src/connectors/connection-recovery-service.d.ts +1 -6
- package/dist/src/connectors/connection-recovery-service.js +3 -105
- package/dist/src/connectors/health.d.ts +1 -2
- package/dist/src/connectors/health.js +2 -101
- package/dist/src/connectors/types.d.ts +1 -1
- package/dist/src/endpoint-tools/binding-service.d.ts +2 -0
- package/dist/src/endpoint-tools/binding-service.js +14 -2
- package/dist/src/endpoint-tools/bridge-host.d.ts +15 -0
- package/dist/src/endpoint-tools/bridge-host.js +166 -0
- package/dist/src/endpoint-tools/bridge.d.ts +27 -0
- package/dist/src/endpoint-tools/bridge.js +88 -0
- package/dist/src/endpoint-tools/capability-catalog.d.ts +2 -0
- package/dist/src/endpoint-tools/capability-catalog.js +8 -0
- package/dist/src/endpoint-tools/grant-service.d.ts +69 -0
- package/dist/src/endpoint-tools/grant-service.js +113 -0
- package/dist/src/endpoint-tools/index.js +1 -1
- package/dist/src/endpoint-tools/invocation-service.js +6 -2
- package/dist/src/endpoint-tools/location-task.d.ts +22 -0
- package/dist/src/endpoint-tools/location-task.js +114 -0
- package/dist/src/endpoint-tools/policy.js +16 -1
- package/dist/src/endpoint-tools/registry.d.ts +2 -0
- package/dist/src/endpoint-tools/registry.js +9 -0
- package/dist/src/endpoint-tools/result-projector.d.ts +15 -0
- package/dist/src/endpoint-tools/result-projector.js +31 -0
- package/dist/src/endpoint-tools/runtime.d.ts +2 -0
- package/dist/src/endpoint-tools/runtime.js +15 -2
- package/dist/src/endpoint-tools/target-resolver.d.ts +12 -0
- package/dist/src/endpoint-tools/target-resolver.js +27 -0
- package/dist/src/endpoint-tools/turn-context.d.ts +6 -0
- package/dist/src/endpoint-tools/turn-context.js +29 -0
- package/dist/src/extensions/agent-plugins/auth.d.ts +0 -2
- package/dist/src/extensions/agent-plugins/auth.js +2 -19
- package/dist/src/extensions/agent-plugins/credentials.js +3 -19
- package/dist/src/extensions/agent-plugins/inventory.d.ts +2 -2
- package/dist/src/extensions/agent-plugins/mcp-adapter.js +1 -5
- package/dist/src/extensions/agent-plugins/source-http-fetch.d.ts +2 -0
- package/dist/src/{agent/mcp/plugin-http-fetch.js → extensions/agent-plugins/source-http-fetch.js} +7 -7
- package/dist/src/extensions/agent-plugins/sources.js +2 -2
- package/dist/src/extensions/agent-plugins/store.js +1 -3
- package/dist/src/extensions/agent-plugins/validation.d.ts +0 -4
- package/dist/src/extensions/agent-plugins/validation.js +13 -20
- package/dist/src/gateway/agents-admin.d.ts +5 -0
- package/dist/src/gateway/agents-admin.js +56 -1
- package/dist/src/gateway/chat-stream/mapper.js +9 -0
- package/dist/src/gateway/chat-stream/protocol.d.ts +4 -4
- package/dist/src/gateway/hono/lib/config-payload.d.ts +9 -4
- package/dist/src/gateway/hono/lib/config-payload.js +2 -5
- package/dist/src/gateway/hono/oauth-async.js +9 -2
- package/dist/src/gateway/hono/routes/agent-plugins.js +4 -9
- package/dist/src/gateway/hono/routes/agents.js +4 -3
- package/dist/src/gateway/hono/routes/connection-waits.js +2 -5
- package/dist/src/gateway/hono/routes/connectors.js +5 -60
- package/dist/src/gateway/hono/routes/device-authorizations.d.ts +3 -0
- package/dist/src/gateway/hono/routes/device-authorizations.js +74 -0
- package/dist/src/gateway/hono/routes/endpoint-compatibility.js +7 -0
- package/dist/src/gateway/hono/routes/endpoint-tools.d.ts +1 -0
- package/dist/src/gateway/hono/routes/endpoint-tools.js +53 -3
- package/dist/src/gateway/hono/routes/lazy-bundles.js +17 -1
- package/dist/src/gateway/hono/routes/mcp.d.ts +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +11 -237
- package/dist/src/gateway/hono/routes/session-command-handler.js +11 -1
- package/dist/src/gateway/hono/routes/session-input-handler.d.ts +8 -2
- package/dist/src/gateway/hono/routes/session-input-handler.js +25 -1
- package/dist/src/gateway/service/config-coordinator.js +2 -5
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- package/dist/src/gateway/service/run-gateway-agent.js +13 -5
- package/dist/src/gateway/service/session-input-coordinator.d.ts +1 -1
- package/dist/src/gateway/service/session-input-coordinator.js +29 -9
- package/dist/src/gateway/service/sessions-api.js +0 -6
- package/dist/src/gateway/service.js +3 -12
- package/dist/src/gateway/session-reset-service.js +0 -6
- package/dist/src/imports/compatibility.js +12 -10
- package/dist/src/mcp/channel-bridge.js +1 -1
- package/dist/src/providers/env-keys.js +1 -1
- package/dist/src/providers/index.js +26 -24
- package/dist/src/providers/model-call.d.ts +0 -2
- package/dist/src/providers/model-call.js +2 -6
- package/dist/src/providers/model-registry.js +4 -2
- package/dist/src/providers/model-supplements.d.ts +3 -3
- package/dist/src/providers/model-supplements.js +6 -27
- package/dist/src/providers/presentation.js +3 -8
- package/dist/src/providers/prompt-cache-plan.js +1 -1
- package/dist/src/providers/provider-auth-service.d.ts +1 -1
- package/dist/src/providers/provider-auth-service.js +7 -2
- package/dist/src/providers/provider-policy.d.ts +3 -0
- package/dist/src/providers/provider-policy.js +14 -0
- package/dist/src/providers/register-runtime-providers.js +6 -1
- package/dist/src/realtime/runtime.js +1 -1
- package/dist/src/session/store.js +7 -1
- package/dist/src/session/transcript-events.d.ts +5 -0
- package/dist/src/session/transcript-events.js +1 -0
- package/dist/src/session/types.d.ts +2 -0
- package/dist/src/storage/sqlite/device-grant-audit-repository.d.ts +11 -0
- package/dist/src/storage/sqlite/device-grant-audit-repository.js +10 -0
- package/dist/src/storage/sqlite/endpoint-device-settings-repository.d.ts +7 -0
- package/dist/src/storage/sqlite/endpoint-device-settings-repository.js +17 -0
- package/dist/src/storage/sqlite/migrations/240_device_settings.sql +5 -0
- package/dist/src/storage/sqlite/migrations/241_device_grant_audit.sql +13 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +1 -1
- package/dist/src/storage/sqlite/migrations/runner.js +3 -3
- package/dist/src/storage/sqlite/schema.js +1 -1
- package/dist/src/storage/sqlite/session-input-repository.d.ts +1 -0
- package/dist/src/storage/sqlite/session-input-repository.js +5 -1
- package/dist/src/tui/backends/gateway-realtime-backend.js +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +4 -4
- package/package.json +19 -8
- package/dist/gateway/static/root/assets/agent-defaults-settings-panel-CCRfvuov.js +0 -1
- package/dist/gateway/static/root/assets/agent-plugin-dialog-CRlzd8El.js +0 -1
- package/dist/gateway/static/root/assets/agents-_ug2LCQb.js +0 -66
- package/dist/gateway/static/root/assets/automations-workspace-BQywN6nG.js +0 -6
- package/dist/gateway/static/root/assets/browser-automations-page-yiEuG1v7.js +0 -3
- package/dist/gateway/static/root/assets/capabilities-page-BEnFt_dj.js +0 -2
- package/dist/gateway/static/root/assets/connectors-page-D6wTmWA6.js +0 -2
- package/dist/gateway/static/root/assets/copy-text-row-BHDs3cBa.js +0 -1
- package/dist/gateway/static/root/assets/dependency-picker-BTERkA9X.js +0 -1
- package/dist/gateway/static/root/assets/device-pairing-wizard-DI2bqaKO.js +0 -1
- package/dist/gateway/static/root/assets/dist-Che_jiQF.js +0 -1
- package/dist/gateway/static/root/assets/gateway-realtime-DDWymi-o.js +0 -1
- package/dist/gateway/static/root/assets/home-page-BZDjvwet.js +0 -2
- package/dist/gateway/static/root/assets/index-BB1z8QxA.js +0 -106
- package/dist/gateway/static/root/assets/index-D9R6tU7r.css +0 -1
- package/dist/gateway/static/root/assets/link-2-D_ZKYUW7.js +0 -1
- package/dist/gateway/static/root/assets/local-session-drafts-DRPsDCj1.js +0 -1
- package/dist/gateway/static/root/assets/logs-page-DL-BM0xq.js +0 -2
- package/dist/gateway/static/root/assets/management-settings-BOVRHhXk.js +0 -1
- package/dist/gateway/static/root/assets/note-detail-panel-DJJK2yL4.js +0 -5
- package/dist/gateway/static/root/assets/notes-page-oCxO7ZTv.js +0 -8
- package/dist/gateway/static/root/assets/personal-page-DOk9gUK5.js +0 -1
- package/dist/gateway/static/root/assets/project-detail-page-3uAzbW4T.js +0 -1
- package/dist/gateway/static/root/assets/session-manager-LInoZ_Yi.js +0 -16
- package/dist/gateway/static/root/assets/sessions-page-BCVlNHtq.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-Bz-ue9fZ.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-B5BoZ-1y.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-BlnlzGjH.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DjdTeYzm.js +0 -2
- package/dist/gateway/static/root/assets/use-file-preview-expanded-Db2VYg1b.js +0 -2
- package/dist/gateway/static/root/assets/user-model-page-B74LkVbp.js +0 -2
- package/dist/gateway/static/root/assets/workflows-page-Crk4SxtC.js +0 -6
- package/dist/src/agent/embedded/system-prompt-override.d.ts +0 -2
- package/dist/src/agent/embedded/system-prompt-override.js +0 -21
- package/dist/src/agent/external-tools/mcp-provider.d.ts +0 -32
- package/dist/src/agent/external-tools/mcp-provider.js +0 -208
- package/dist/src/agent/mcp/bundle-mcp-config.d.ts +0 -20
- package/dist/src/agent/mcp/bundle-mcp-gateway.d.ts +0 -79
- package/dist/src/agent/mcp/bundle-mcp-gateway.js +0 -93
- package/dist/src/agent/mcp/bundle-mcp-names.d.ts +0 -1
- package/dist/src/agent/mcp/bundle-mcp-names.js +0 -25
- package/dist/src/agent/mcp/bundle-mcp-policy.d.ts +0 -1
- package/dist/src/agent/mcp/bundle-mcp-policy.js +0 -6
- package/dist/src/agent/mcp/bundle-mcp-runtime.d.ts +0 -46
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +0 -571
- package/dist/src/agent/mcp/bundle-mcp-tools.d.ts +0 -2
- package/dist/src/agent/mcp/bundle-mcp-tools.js +0 -2
- package/dist/src/agent/mcp/bundle-mcp-types.d.ts +0 -76
- package/dist/src/agent/mcp/bundle-mcp-types.js +0 -1
- package/dist/src/agent/mcp/embedded-mcp.d.ts +0 -10
- package/dist/src/agent/mcp/embedded-mcp.js +0 -14
- package/dist/src/agent/mcp/index.d.ts +0 -5
- package/dist/src/agent/mcp/index.js +0 -12
- package/dist/src/agent/mcp/mcp-config-shared.d.ts +0 -8
- package/dist/src/agent/mcp/mcp-config-shared.js +0 -39
- package/dist/src/agent/mcp/mcp-http.d.ts +0 -23
- package/dist/src/agent/mcp/mcp-http.js +0 -67
- package/dist/src/agent/mcp/mcp-resource-id.d.ts +0 -6
- package/dist/src/agent/mcp/mcp-resource-id.js +0 -19
- package/dist/src/agent/mcp/mcp-stdio-transport.d.ts +0 -26
- package/dist/src/agent/mcp/mcp-stdio-transport.js +0 -120
- package/dist/src/agent/mcp/mcp-stdio.d.ts +0 -18
- package/dist/src/agent/mcp/mcp-stdio.js +0 -35
- package/dist/src/agent/mcp/mcp-transport-config.d.ts +0 -28
- package/dist/src/agent/mcp/mcp-transport-config.js +0 -91
- package/dist/src/agent/mcp/mcp-transport.d.ts +0 -17
- package/dist/src/agent/mcp/mcp-transport.js +0 -141
- package/dist/src/agent/mcp/oauth/index.d.ts +0 -6
- package/dist/src/agent/mcp/oauth/index.js +0 -6
- package/dist/src/agent/mcp/oauth/mcp-oauth-errors.d.ts +0 -5
- package/dist/src/agent/mcp/oauth/mcp-oauth-errors.js +0 -14
- package/dist/src/agent/mcp/oauth/mcp-oauth-manager.d.ts +0 -30
- package/dist/src/agent/mcp/oauth/mcp-oauth-manager.js +0 -276
- package/dist/src/agent/mcp/oauth/mcp-oauth-provider.d.ts +0 -33
- package/dist/src/agent/mcp/oauth/mcp-oauth-provider.js +0 -103
- package/dist/src/agent/mcp/oauth/mcp-oauth-session.d.ts +0 -31
- package/dist/src/agent/mcp/oauth/mcp-oauth-session.js +0 -181
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.d.ts +0 -12
- package/dist/src/agent/mcp/oauth/mcp-oauth-store.js +0 -91
- package/dist/src/agent/mcp/oauth/mcp-oauth-types.d.ts +0 -22
- package/dist/src/agent/mcp/oauth/mcp-oauth-types.js +0 -1
- package/dist/src/agent/mcp/plugin-http-fetch.d.ts +0 -2
- package/dist/src/agent/source-context/mcp-resource-context.d.ts +0 -8
- package/dist/src/agent/source-context/mcp-resource-context.js +0 -30
- package/dist/src/auth/oauth/openai-codex.d.ts +0 -9
- package/dist/src/auth/oauth/openai-codex.js +0 -414
- package/dist/src/connectors/plugin-mcp-recovery.d.ts +0 -28
- package/dist/src/connectors/plugin-mcp-recovery.js +0 -90
- package/dist/src/extensions/agent-plugins/connection.d.ts +0 -8
- package/dist/src/extensions/agent-plugins/connection.js +0 -41
- package/dist/src/extensions/agent-plugins/health.d.ts +0 -4
- package/dist/src/extensions/agent-plugins/health.js +0 -48
- package/dist/src/extensions/agent-plugins/plugin-oauth-scope.d.ts +0 -1
- package/dist/src/extensions/agent-plugins/plugin-oauth-scope.js +0 -8
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
import { isCodemodeCoreRead } from "../tools/codemode-permissions.js";
|
|
2
|
+
import { getXopcToolMetadata } from "./tool-metadata.js";
|
|
3
|
+
import { withDataToolPermissions } from "../tools/dataBatch.js";
|
|
4
|
+
import { retainCodemodeOutput } from "./codemode-output.js";
|
|
5
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
6
|
+
import { createCodemodeExtension } from "@earendil-works/pi-coding-agent";
|
|
7
|
+
//#region src/agent/embedded/codemode-extension.ts
|
|
8
|
+
const MAX_STORE_BYTES = 64 * 1024;
|
|
9
|
+
const MAX_SOURCE_BYTES = 64 * 1024;
|
|
10
|
+
/** Public pi extension, restricted to core reads and the current xopc turn policy. */
|
|
11
|
+
function createXopcCodemodeExtension(policy, tools, getSession) {
|
|
12
|
+
const allowed = new Set(tools.filter((tool) => isCodemodeCoreRead(tool) || getXopcToolMetadata(tool)?.external?.readOnly === true).map((tool) => tool.name));
|
|
13
|
+
const isAllowed = (name) => allowed.has(name) || name.startsWith("mcp__") || [
|
|
14
|
+
"list_mcp_resources",
|
|
15
|
+
"list_mcp_resource_templates",
|
|
16
|
+
"read_mcp_resource"
|
|
17
|
+
].includes(name);
|
|
18
|
+
const inlineReads = tools.filter(isCodemodeCoreRead).map((tool) => tool.name);
|
|
19
|
+
const execution = new AsyncLocalStorage();
|
|
20
|
+
const original = createCodemodeExtension({
|
|
21
|
+
mode: "on",
|
|
22
|
+
models: false
|
|
23
|
+
});
|
|
24
|
+
const contextFor = (id, name, args) => {
|
|
25
|
+
const session = getSession();
|
|
26
|
+
const assistantMessage = session?.agent.state.messages.findLast((message) => message.role === "assistant");
|
|
27
|
+
if (!session || assistantMessage?.role !== "assistant") throw new Error("Codemode needs an active xopc turn");
|
|
28
|
+
return {
|
|
29
|
+
assistantMessage,
|
|
30
|
+
toolCall: {
|
|
31
|
+
type: "toolCall",
|
|
32
|
+
id,
|
|
33
|
+
name,
|
|
34
|
+
arguments: args
|
|
35
|
+
},
|
|
36
|
+
args,
|
|
37
|
+
context: {
|
|
38
|
+
messages: session.agent.state.messages,
|
|
39
|
+
tools: session.agent.state.tools
|
|
40
|
+
}
|
|
41
|
+
};
|
|
42
|
+
};
|
|
43
|
+
return (pi) => {
|
|
44
|
+
pi.on("tool_call", async (event) => {
|
|
45
|
+
if (!event.parentToolCallId) return;
|
|
46
|
+
const active = execution.getStore();
|
|
47
|
+
if (!active || active.parentId !== event.parentToolCallId || !isAllowed(event.toolName)) return {
|
|
48
|
+
block: true,
|
|
49
|
+
reason: "Codemode tool is not authorized"
|
|
50
|
+
};
|
|
51
|
+
active.signal.throwIfAborted();
|
|
52
|
+
return getSession()?.agent.beforeToolCall?.(contextFor(event.toolCallId, event.toolName, event.input), active.signal);
|
|
53
|
+
});
|
|
54
|
+
pi.on("tool_result", async (event) => {
|
|
55
|
+
if (!event.parentToolCallId) return;
|
|
56
|
+
const active = execution.getStore();
|
|
57
|
+
if (!active || active.parentId !== event.parentToolCallId) return {
|
|
58
|
+
content: [{
|
|
59
|
+
type: "text",
|
|
60
|
+
text: "Codemode execution is no longer active"
|
|
61
|
+
}],
|
|
62
|
+
isError: true
|
|
63
|
+
};
|
|
64
|
+
try {
|
|
65
|
+
return await getSession()?.agent.afterToolCall?.({
|
|
66
|
+
...contextFor(event.toolCallId, event.toolName, event.input),
|
|
67
|
+
result: {
|
|
68
|
+
content: event.content,
|
|
69
|
+
details: event.details,
|
|
70
|
+
structuredContent: event.structuredContent,
|
|
71
|
+
usage: event.usage
|
|
72
|
+
},
|
|
73
|
+
isError: event.isError
|
|
74
|
+
}, active.signal);
|
|
75
|
+
} catch {
|
|
76
|
+
return {
|
|
77
|
+
content: [{
|
|
78
|
+
type: "text",
|
|
79
|
+
text: "Codemode result policy failed"
|
|
80
|
+
}],
|
|
81
|
+
details: {},
|
|
82
|
+
isError: true
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
});
|
|
86
|
+
return original({
|
|
87
|
+
...pi,
|
|
88
|
+
appendEntry(customType, data) {
|
|
89
|
+
if (customType !== "codemode-store") throw new Error("Unsupported Codemode entry");
|
|
90
|
+
const active = execution.getStore();
|
|
91
|
+
if (!active || active.signal.aborted) throw new Error("Codemode execution is no longer active");
|
|
92
|
+
if (Buffer.byteLength(JSON.stringify(data)) > MAX_STORE_BYTES) throw new Error("Codemode store writes exceed 64 KiB");
|
|
93
|
+
const state = Object.create(null);
|
|
94
|
+
const apply = (value) => {
|
|
95
|
+
const writes = value;
|
|
96
|
+
for (const key of writes.delete ?? []) delete state[key];
|
|
97
|
+
Object.assign(state, writes.set ?? {});
|
|
98
|
+
};
|
|
99
|
+
for (const entry of active.ctx.sessionManager.getBranch()) if (entry.type === "custom" && entry.customType === customType) apply(entry.data);
|
|
100
|
+
apply(data);
|
|
101
|
+
if (Object.keys(state).length > 64 || Buffer.byteLength(JSON.stringify(state)) > MAX_STORE_BYTES) throw new Error("Codemode store exceeds 64 keys or 64 KiB");
|
|
102
|
+
pi.appendEntry(customType, data);
|
|
103
|
+
},
|
|
104
|
+
registerTool(definition) {
|
|
105
|
+
const prepare = definition.prepareLoadout;
|
|
106
|
+
pi.registerTool({
|
|
107
|
+
...definition,
|
|
108
|
+
prepareLoadout(loadout) {
|
|
109
|
+
const changes = prepare?.({
|
|
110
|
+
...loadout,
|
|
111
|
+
callable: loadout.callable.filter((tool) => isAllowed(tool.name))
|
|
112
|
+
});
|
|
113
|
+
return {
|
|
114
|
+
...changes,
|
|
115
|
+
descriptions: {
|
|
116
|
+
...changes?.descriptions,
|
|
117
|
+
codemode: `${changes?.descriptions?.codemode ?? definition.description}\n\nCore reads: ${inlineReads.join(", ") || "(none)"}. Host-approved deferred reads and native MCP tools can be found with searchTools(). Host limits: ${policy.timeoutMs}ms, ${policy.maxConcurrentCalls} concurrent calls, ${policy.maxCalls} calls, ${policy.maxOutputTokens} estimated output tokens. Store: 64 keys / 64 KiB. Models APIs are unavailable.`
|
|
118
|
+
}
|
|
119
|
+
};
|
|
120
|
+
},
|
|
121
|
+
async execute(id, params, signal, onUpdate, ctx) {
|
|
122
|
+
if (!ctx) throw new Error("Codemode needs an active session");
|
|
123
|
+
const input = params;
|
|
124
|
+
if (Buffer.byteLength(input.code) > MAX_SOURCE_BYTES) throw new Error("Codemode source exceeds 64 KiB");
|
|
125
|
+
const source = boundCodemodeSource(input.code, policy);
|
|
126
|
+
const deadline = AbortSignal.timeout(policy.timeoutMs);
|
|
127
|
+
const budgetAbort = new AbortController();
|
|
128
|
+
const combined = AbortSignal.any([
|
|
129
|
+
deadline,
|
|
130
|
+
budgetAbort.signal,
|
|
131
|
+
...signal ? [signal] : []
|
|
132
|
+
]);
|
|
133
|
+
let calls = 0;
|
|
134
|
+
let running = 0;
|
|
135
|
+
const waiting = /* @__PURE__ */ new Set();
|
|
136
|
+
const boundedContext = {
|
|
137
|
+
...ctx,
|
|
138
|
+
tools: ctx.tools.filter((tool) => isAllowed(tool.name)),
|
|
139
|
+
async executeTool(name, args, options) {
|
|
140
|
+
if (!isAllowed(name)) throw new Error(`Codemode tool ${name} is not authorized`);
|
|
141
|
+
if (++calls > policy.maxCalls) {
|
|
142
|
+
const error = /* @__PURE__ */ new Error(`Codemode exceeds ${policy.maxCalls} calls`);
|
|
143
|
+
budgetAbort.abort(error);
|
|
144
|
+
throw error;
|
|
145
|
+
}
|
|
146
|
+
const callSignal = options?.signal ? AbortSignal.any([combined, options.signal]) : combined;
|
|
147
|
+
while (running >= policy.maxConcurrentCalls) {
|
|
148
|
+
callSignal.throwIfAborted();
|
|
149
|
+
await new Promise((resolve) => {
|
|
150
|
+
const wake = () => {
|
|
151
|
+
waiting.delete(wake);
|
|
152
|
+
callSignal.removeEventListener("abort", wake);
|
|
153
|
+
resolve();
|
|
154
|
+
};
|
|
155
|
+
waiting.add(wake);
|
|
156
|
+
callSignal.addEventListener("abort", wake, { once: true });
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
callSignal.throwIfAborted();
|
|
160
|
+
running++;
|
|
161
|
+
try {
|
|
162
|
+
return await execution.run({
|
|
163
|
+
parentId: id,
|
|
164
|
+
signal: callSignal,
|
|
165
|
+
ctx
|
|
166
|
+
}, () => ctx.executeTool(name, args, {
|
|
167
|
+
...options,
|
|
168
|
+
signal: callSignal
|
|
169
|
+
}));
|
|
170
|
+
} finally {
|
|
171
|
+
running--;
|
|
172
|
+
waiting.values().next().value?.();
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
return execution.run({
|
|
177
|
+
parentId: id,
|
|
178
|
+
signal: combined,
|
|
179
|
+
ctx
|
|
180
|
+
}, () => withDataToolPermissions(allowed, async () => {
|
|
181
|
+
const result = await definition.execute(id, {
|
|
182
|
+
...params,
|
|
183
|
+
code: source
|
|
184
|
+
}, combined, onUpdate, boundedContext);
|
|
185
|
+
const details = result.details;
|
|
186
|
+
let outputPath;
|
|
187
|
+
if (details.fullOutputPath) try {
|
|
188
|
+
outputPath = await retainCodemodeOutput(ctx.cwd, details.fullOutputPath);
|
|
189
|
+
} catch {}
|
|
190
|
+
let remaining = policy.maxOutputTokens * 4;
|
|
191
|
+
const link = outputPath ? `Full Codemode output: ${outputPath}\n` : "";
|
|
192
|
+
const retainedLink = link.length <= remaining ? link : "";
|
|
193
|
+
remaining -= retainedLink.length;
|
|
194
|
+
const content = result.content.flatMap((block) => {
|
|
195
|
+
if (block.type === "image") {
|
|
196
|
+
if (block.data.length > remaining) return [];
|
|
197
|
+
remaining -= block.data.length;
|
|
198
|
+
return [block];
|
|
199
|
+
}
|
|
200
|
+
const text = block.text.replace(/\[Full output: [^\n]+\]/g, "").slice(0, remaining);
|
|
201
|
+
remaining -= text.length;
|
|
202
|
+
return text ? [{
|
|
203
|
+
type: "text",
|
|
204
|
+
text
|
|
205
|
+
}] : [];
|
|
206
|
+
});
|
|
207
|
+
details.fullOutputPath = outputPath;
|
|
208
|
+
return {
|
|
209
|
+
...result,
|
|
210
|
+
content: [...retainedLink ? [{
|
|
211
|
+
type: "text",
|
|
212
|
+
text: retainedLink
|
|
213
|
+
}] : [], ...content]
|
|
214
|
+
};
|
|
215
|
+
}));
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
}
|
|
219
|
+
});
|
|
220
|
+
};
|
|
221
|
+
}
|
|
222
|
+
function boundCodemodeSource(source, policy) {
|
|
223
|
+
const match = /^\s*\/\/\s*@options:\s*([^\r\n]*)(?:\r?\n|$)/.exec(source);
|
|
224
|
+
const options = match ? JSON.parse(match[1]) : {};
|
|
225
|
+
const clamp = (value, limit) => typeof value === "number" && Number.isFinite(value) && value > 0 ? Math.min(Math.floor(value), limit) : limit;
|
|
226
|
+
return `// @options: ${JSON.stringify({
|
|
227
|
+
timeout_ms: clamp(options.timeout_ms, policy.timeoutMs),
|
|
228
|
+
max_output_tokens: clamp(options.max_output_tokens, policy.maxOutputTokens)
|
|
229
|
+
})}\n${match ? source.slice(match[0].length) : source}`;
|
|
230
|
+
}
|
|
231
|
+
//#endregion
|
|
232
|
+
export { boundCodemodeSource, createXopcCodemodeExtension };
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { tmpdir } from "node:os";
|
|
2
|
+
import { basename, dirname, join, relative, sep } from "node:path";
|
|
3
|
+
import { constants } from "node:fs";
|
|
4
|
+
import { randomUUID } from "node:crypto";
|
|
5
|
+
import { mkdir, open, realpath, writeFile } from "node:fs/promises";
|
|
6
|
+
//#region src/agent/embedded/codemode-output.ts
|
|
7
|
+
/** Adopt only pi's own spill file, never a path printed by a script or an MCP server. */
|
|
8
|
+
async function retainCodemodeOutput(workspace, source) {
|
|
9
|
+
if (typeof source !== "string" || dirname(source) !== tmpdir() || !/^pi-codemode-[a-f0-9]{16}\.txt$/.test(basename(source))) return;
|
|
10
|
+
const handle = await open(source, constants.O_RDONLY | constants.O_NOFOLLOW);
|
|
11
|
+
try {
|
|
12
|
+
const info = await handle.stat();
|
|
13
|
+
if (!info.isFile() || info.size > 64 * 1024 * 1024) throw new Error("Codemode output file exceeds 64 MiB");
|
|
14
|
+
const root = await realpath(workspace);
|
|
15
|
+
const directory = join(root, ".xopc", "codemode-output");
|
|
16
|
+
await mkdir(directory, {
|
|
17
|
+
recursive: true,
|
|
18
|
+
mode: 448
|
|
19
|
+
});
|
|
20
|
+
const resolved = await realpath(directory);
|
|
21
|
+
const location = relative(root, resolved);
|
|
22
|
+
if (location === ".." || location.startsWith(`..${sep}`) || location.startsWith(sep)) throw new Error("Codemode output directory escapes workspace");
|
|
23
|
+
const name = `${randomUUID()}.txt`;
|
|
24
|
+
await writeFile(join(resolved, name), await handle.readFile(), {
|
|
25
|
+
flag: "wx",
|
|
26
|
+
mode: 384
|
|
27
|
+
});
|
|
28
|
+
return `.xopc/codemode-output/${name}`;
|
|
29
|
+
} finally {
|
|
30
|
+
await handle.close();
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//#endregion
|
|
34
|
+
export { retainCodemodeOutput };
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type { AgentTool } from '@earendil-works/pi-agent-core';
|
|
2
|
+
/** Project the current host directory into pi; pi owns search and declaration loading. */
|
|
3
|
+
export declare function materializeNativeExternalTools(params: {
|
|
4
|
+
conversationId: string;
|
|
5
|
+
tools: readonly AgentTool[];
|
|
6
|
+
}): Promise<AgentTool[]>;
|
|
@@ -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
|
|
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>;
|