@xopcai/xopc 0.0.6 → 0.0.11
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/dist/extensions/weixin/src/api/api.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/gateway/static/root/assets/{agents-B6s2BvpH.js → agents-BdC4Y-HX.js} +2 -2
- package/dist/gateway/static/root/assets/agents-BdC4Y-HX.js.map +1 -0
- package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js → apps-page-C-oaSHkm.js} +2 -2
- package/dist/gateway/static/root/assets/{apps-page-BtsZ5ZPx.js.map → apps-page-C-oaSHkm.js.map} +1 -1
- package/dist/gateway/static/root/assets/attachment-load-BDDlItdE.js +1 -0
- package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js → channels-settings-BqEUppPO.js} +2 -2
- package/dist/gateway/static/root/assets/{channels-settings-BUfWBEVU.js.map → channels-settings-BqEUppPO.js.map} +1 -1
- package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js → chat-agents-api-BhqjQ7iL.js} +2 -2
- package/dist/gateway/static/root/assets/{chat-agents-api-BR30M2YQ.js.map → chat-agents-api-BhqjQ7iL.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js → cron-page-Cli49RKR.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-page-CMTx0Mjz.js.map → cron-page-Cli49RKR.js.map} +1 -1
- package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js → cron-utils-Dkj-Ldpf.js} +2 -2
- package/dist/gateway/static/root/assets/{cron-utils-BJma9IcD.js.map → cron-utils-Dkj-Ldpf.js.map} +1 -1
- package/dist/gateway/static/root/assets/electron-env-BDtJw9AY.js +2 -0
- package/dist/gateway/static/root/assets/electron-env-BDtJw9AY.js.map +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js → extension-debug-page-BMcZlaxF.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-debug-page-BCVoNSo6.js.map → extension-debug-page-BMcZlaxF.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js → extension-iframe-host-D5HEF0KR.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-iframe-host-PWB-Pw2d.js.map → extension-iframe-host-D5HEF0KR.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js → extension-page-CXdCSSPl.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-page-D2tTklsD.js.map → extension-page-CXdCSSPl.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js → extension-provider-DZCZgQE2.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-provider-BpHodVRj.js.map → extension-provider-DZCZgQE2.js.map} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js → extension-settings-page-CX6STpx3.js} +2 -2
- package/dist/gateway/static/root/assets/{extension-settings-page-BEu6Xw1Z.js.map → extension-settings-page-CX6STpx3.js.map} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js → gateway-config-swr-Cph02QZn.js} +2 -2
- package/dist/gateway/static/root/assets/{gateway-config-swr-C7ZFPhNj.js.map → gateway-config-swr-Cph02QZn.js.map} +1 -1
- package/dist/gateway/static/root/assets/index-Bty3m0mS.css +2 -0
- package/dist/gateway/static/root/assets/index-iTUyfzNr.js +16 -0
- package/dist/gateway/static/root/assets/index-iTUyfzNr.js.map +1 -0
- package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js → logs-page-B9O5l3I8.js} +2 -2
- package/dist/gateway/static/root/assets/{logs-page-BpsxYdcL.js.map → logs-page-B9O5l3I8.js.map} +1 -1
- package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js → model-selector-BLiY_O25.js} +2 -2
- package/dist/gateway/static/root/assets/{model-selector-BiiDq8Pk.js.map → model-selector-BLiY_O25.js.map} +1 -1
- package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js +2 -0
- package/dist/gateway/static/root/assets/navigation-DB9S-C6S.js.map +1 -0
- package/dist/gateway/static/root/assets/page-header-store-BFpnFTed.js +2 -0
- package/dist/gateway/static/root/assets/{page-header-store-HcRZK5CZ.js.map → page-header-store-BFpnFTed.js.map} +1 -1
- package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js → session-api-DEhQXWJg.js} +2 -2
- package/dist/gateway/static/root/assets/{session-api-DxNaAkmX.js.map → session-api-DEhQXWJg.js.map} +1 -1
- package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js → session-working-directory-control-DKOtWs3-.js} +3 -3
- package/dist/gateway/static/root/assets/{session-working-directory-control-CDH-Wk4E.js.map → session-working-directory-control-DKOtWs3-.js.map} +1 -1
- package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js → sessions-page-BYlWP1ep.js} +2 -2
- package/dist/gateway/static/root/assets/{sessions-page-5PK75r1n.js.map → sessions-page-BYlWP1ep.js.map} +1 -1
- package/dist/gateway/static/root/assets/settings-page-oCnIavdg.js +2 -0
- package/dist/gateway/static/root/assets/settings-page-oCnIavdg.js.map +1 -0
- package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js → skill-api-DWrn8Az0.js} +2 -2
- package/dist/gateway/static/root/assets/{skill-api-CxbNlOD_.js.map → skill-api-DWrn8Az0.js.map} +1 -1
- package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js → skills-page-C59WQpM1.js} +2 -2
- package/dist/gateway/static/root/assets/{skills-page-Dd8ZzYJb.js.map → skills-page-C59WQpM1.js.map} +1 -1
- package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js → theme-store-CywXkKml.js} +2 -2
- package/dist/gateway/static/root/assets/{theme-store-CPTH77BE.js.map → theme-store-CywXkKml.js.map} +1 -1
- package/dist/gateway/static/root/assets/url-D7yWllI8.js +2 -0
- package/dist/gateway/static/root/assets/url-D7yWllI8.js.map +1 -0
- package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js → useTranslation-CACj0DBJ.js} +2 -2
- package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js.map → useTranslation-CACj0DBJ.js.map} +1 -1
- package/dist/gateway/static/root/index.html +16 -16
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -0
- package/dist/src/agent/agent-manager.js +17 -9
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.js +2 -0
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/child-agent-factory.js +2 -0
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/expand-at-file-mentions.d.ts +4 -0
- package/dist/src/agent/context/expand-at-file-mentions.js +69 -0
- package/dist/src/agent/context/expand-at-file-mentions.js.map +1 -0
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/image/index.d.ts +0 -1
- package/dist/src/agent/image/index.js +1 -2
- package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
- package/dist/src/agent/ipc/inbox.js +1 -1
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/memory/compaction.d.ts +1 -1
- package/dist/src/agent/memory/compaction.js +38 -11
- package/dist/src/agent/memory/compaction.js.map +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/messaging/command-handler.d.ts +13 -0
- package/dist/src/agent/messaging/command-handler.js +14 -2
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +6 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/service.d.ts +16 -1
- package/dist/src/agent/service.js +175 -17
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/skills/format-skills-prompt.js.map +1 -1
- package/dist/src/agent/skills/hub-hash.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
- package/dist/src/agent/tools/browser/tools.js +2 -2
- package/dist/src/agent/tools/browser/tools.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/image-tool.js +2 -2
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -1
- package/dist/src/agent/tools/index.js +2 -2
- package/dist/src/agent/tools/read.d.ts +0 -2
- package/dist/src/agent/tools/read.js +1 -3
- package/dist/src/agent/tools/read.js.map +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/channels/attachments/inbound-persist.js +1 -1
- package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
- package/dist/src/channels/index.d.ts +1 -1
- package/dist/src/channels/index.js +2 -2
- package/dist/src/channels/pipeline.d.ts +8 -1
- package/dist/src/channels/pipeline.js +49 -4
- package/dist/src/channels/pipeline.js.map +1 -1
- package/dist/src/channels/plugin-types.d.ts +14 -0
- package/dist/src/chat-commands/builtins/config.d.ts +4 -0
- package/dist/src/chat-commands/builtins/config.js +197 -0
- package/dist/src/chat-commands/builtins/config.js.map +1 -0
- package/dist/src/chat-commands/builtins/context.d.ts +4 -0
- package/dist/src/chat-commands/builtins/context.js +44 -0
- package/dist/src/chat-commands/builtins/context.js.map +1 -0
- package/dist/src/chat-commands/builtins/session.js +111 -0
- package/dist/src/chat-commands/builtins/session.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +49 -21
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/chat-commands/config-paths.d.ts +10 -0
- package/dist/src/chat-commands/config-paths.js +45 -0
- package/dist/src/chat-commands/config-paths.js.map +1 -0
- package/dist/src/chat-commands/config-value.d.ts +12 -0
- package/dist/src/chat-commands/config-value.js +53 -0
- package/dist/src/chat-commands/config-value.js.map +1 -0
- package/dist/src/chat-commands/context.d.ts +24 -1
- package/dist/src/chat-commands/context.js +41 -0
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/index.d.ts +2 -0
- package/dist/src/chat-commands/index.js +5 -1
- package/dist/src/chat-commands/index.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +33 -1
- package/dist/src/cli/commands/agent/interactive.js +1 -1
- package/dist/src/cli/commands/agent/interactive.js.map +1 -1
- package/dist/src/cli/commands/agent.js +21 -9
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/auth.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/channel-config.js +113 -0
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js +47 -0
- package/dist/src/cli/commands/doctor/checks/channel-plugins.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/config-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/config-health.js +82 -0
- package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.js +116 -0
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.js +64 -0
- package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.js +64 -0
- package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/node-version.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/node-version.js +33 -0
- package/dist/src/cli/commands/doctor/checks/node-version.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +91 -0
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.js +85 -0
- package/dist/src/cli/commands/doctor/checks/security-audit.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +118 -0
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +99 -0
- package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/version-check.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/version-check.js +71 -0
- package/dist/src/cli/commands/doctor/checks/version-check.js.map +1 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.d.ts +2 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +73 -0
- package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -0
- package/dist/src/cli/commands/doctor/flow.d.ts +9 -0
- package/dist/src/cli/commands/doctor/flow.js +51 -0
- package/dist/src/cli/commands/doctor/flow.js.map +1 -0
- package/dist/src/cli/commands/doctor/format.d.ts +6 -0
- package/dist/src/cli/commands/doctor/format.js +61 -0
- package/dist/src/cli/commands/doctor/format.js.map +1 -0
- package/dist/src/cli/commands/doctor/index.js +44 -0
- package/dist/src/cli/commands/doctor/index.js.map +1 -0
- package/dist/src/cli/commands/doctor/types.d.ts +20 -0
- package/dist/src/cli/commands/doctor/types.js +1 -0
- package/dist/src/cli/commands/extension.js +10 -0
- package/dist/src/cli/commands/extension.js.map +1 -1
- package/dist/src/cli/commands/init.js +1 -2
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/session/utils.js.map +1 -1
- package/dist/src/cli/commands/update.d.ts +1 -0
- package/dist/src/cli/commands/update.js +171 -0
- package/dist/src/cli/commands/update.js.map +1 -0
- package/dist/src/cli/index.d.ts +2 -2
- package/dist/src/cli/index.js +4 -2
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/init-workspace.js +1 -1
- package/dist/src/config/index.d.ts +1 -0
- package/dist/src/config/index.js +4 -3
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/loader.js +1 -1
- package/dist/src/config/models-json.d.ts +15 -15
- package/dist/src/config/paths.js.map +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/runtime-overrides.d.ts +8 -0
- package/dist/src/config/runtime-overrides.js +40 -0
- package/dist/src/config/runtime-overrides.js.map +1 -0
- package/dist/src/config/schema.d.ts +34 -104
- package/dist/src/config/schema.js +18 -39
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/cron/persistence.js +1 -1
- package/dist/src/cron/run-log-store.js +1 -1
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/launchd.js.map +1 -1
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/daemon/systemd.js.map +1 -1
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/loader.d.ts +1 -1
- package/dist/src/extensions/loader.js +5 -8
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/lockfile.js +1 -1
- package/dist/src/extensions/sdk/index.js +6 -1
- package/dist/src/extensions/sdk/index.js.map +1 -0
- package/dist/src/gateway/agents-admin.js +1 -1
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +1 -1
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/doctor.d.ts +3 -0
- package/dist/src/gateway/hono/routes/doctor.js +35 -0
- package/dist/src/gateway/hono/routes/doctor.js.map +1 -0
- package/dist/src/gateway/hono/routes/index.js +4 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +64 -11
- package/dist/src/gateway/hono/routes/models.js.map +1 -1
- package/dist/src/gateway/hono/routes/public-gateway.js +10 -0
- package/dist/src/gateway/hono/routes/public-gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/update.d.ts +3 -0
- package/dist/src/gateway/hono/routes/update.js +141 -0
- package/dist/src/gateway/hono/routes/update.js.map +1 -0
- package/dist/src/gateway/hono/routes/workspace.js +82 -2
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/lock.js +1 -1
- package/dist/src/gateway/ports.js +98 -3
- package/dist/src/gateway/ports.js.map +1 -1
- package/dist/src/gateway/service.d.ts +1 -4
- package/dist/src/gateway/service.js +13 -20
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.d.ts +5 -0
- package/dist/src/gateway/workspace-fs-file-list.js +56 -0
- package/dist/src/gateway/workspace-fs-file-list.js.map +1 -0
- package/dist/src/gateway/workspace-heartbeat-path.js +1 -1
- package/dist/src/gateway/workspace-ripgrep.d.ts +5 -0
- package/dist/src/gateway/workspace-ripgrep.js +88 -4
- package/dist/src/gateway/workspace-ripgrep.js.map +1 -1
- package/dist/src/infra/update-channels.d.ts +14 -0
- package/dist/src/infra/update-channels.js +30 -0
- package/dist/src/infra/update-channels.js.map +1 -0
- package/dist/src/infra/update-check.d.ts +53 -0
- package/dist/src/infra/update-check.js +155 -0
- package/dist/src/infra/update-check.js.map +1 -0
- package/dist/src/infra/update-runner.d.ts +18 -0
- package/dist/src/infra/update-runner.js +112 -0
- package/dist/src/infra/update-runner.js.map +1 -0
- package/dist/src/infra/update-startup.d.ts +20 -0
- package/dist/src/infra/update-startup.js +246 -0
- package/dist/src/infra/update-startup.js.map +1 -0
- package/dist/src/providers/extension-stream-bridge.d.ts +3 -0
- package/dist/src/providers/extension-stream-bridge.js +239 -0
- package/dist/src/providers/extension-stream-bridge.js.map +1 -0
- package/dist/src/providers/index.d.ts +7 -2
- package/dist/src/providers/index.js +77 -14
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/providers/plugin-registry.js +92 -87
- package/dist/src/providers/plugin-registry.js.map +1 -1
- package/dist/src/routing/bindings.js +1 -1
- package/dist/src/routing/index.d.ts +1 -1
- package/dist/src/routing/index.js +2 -2
- package/dist/src/routing/index.js.map +1 -1
- package/dist/src/routing/resolve-route.js +1 -1
- package/dist/src/routing/session-key.d.ts +0 -5
- package/dist/src/routing/session-key.js +1 -27
- package/dist/src/routing/session-key.js.map +1 -1
- package/dist/src/session/chat-export.d.ts +5 -0
- package/dist/src/session/chat-export.js +35 -0
- package/dist/src/session/chat-export.js.map +1 -0
- package/dist/src/session/config-store.js +1 -1
- package/dist/src/session/manager.d.ts +1 -1
- package/dist/src/session/manager.js +2 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/store.d.ts +1 -1
- package/dist/src/session/store.js +3 -7
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +0 -10
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/package.json +2 -2
- package/dist/gateway/static/root/assets/agents-B6s2BvpH.js.map +0 -1
- package/dist/gateway/static/root/assets/attachment-load-6pRlDPZ8.js +0 -1
- package/dist/gateway/static/root/assets/index-DBZ5eXW5.js +0 -16
- package/dist/gateway/static/root/assets/index-DBZ5eXW5.js.map +0 -1
- package/dist/gateway/static/root/assets/index-KsVMH-Jo.css +0 -2
- package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js +0 -2
- package/dist/gateway/static/root/assets/navigation-BpLKd2Ca.js.map +0 -1
- package/dist/gateway/static/root/assets/page-header-store-HcRZK5CZ.js +0 -2
- package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js +0 -2
- package/dist/gateway/static/root/assets/preference-select-fields-B4AJBqUY.js.map +0 -1
- package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js +0 -2
- package/dist/gateway/static/root/assets/settings-page-BvSj0JqX.js.map +0 -1
- package/dist/gateway/static/root/assets/url-QmwQTJ-j.js +0 -2
- package/dist/gateway/static/root/assets/url-QmwQTJ-j.js.map +0 -1
- package/dist/src/acp/commands.d.ts +0 -11
- package/dist/src/acp/commands.js +0 -17
- package/dist/src/acp/commands.js.map +0 -1
- package/dist/src/acp/control-plane/identity-reconcile.d.ts +0 -36
- package/dist/src/acp/control-plane/identity-reconcile.js +0 -124
- package/dist/src/acp/control-plane/identity-reconcile.js.map +0 -1
- package/dist/src/acp/control-plane/index.d.ts +0 -10
- package/dist/src/acp/control-plane/index.js +0 -6
- package/dist/src/acp/control-plane/manager.d.ts +0 -86
- package/dist/src/acp/control-plane/manager.js +0 -502
- package/dist/src/acp/control-plane/manager.js.map +0 -1
- package/dist/src/acp/control-plane/manager.types.d.ts +0 -125
- package/dist/src/acp/control-plane/manager.types.js +0 -14
- package/dist/src/acp/control-plane/manager.types.js.map +0 -1
- package/dist/src/acp/control-plane/manager.utils.d.ts +0 -29
- package/dist/src/acp/control-plane/manager.utils.js +0 -46
- package/dist/src/acp/control-plane/manager.utils.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-cache-manager.d.ts +0 -49
- package/dist/src/acp/control-plane/runtime-cache-manager.js +0 -155
- package/dist/src/acp/control-plane/runtime-cache-manager.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-cache.d.ts +0 -45
- package/dist/src/acp/control-plane/runtime-cache.js +0 -58
- package/dist/src/acp/control-plane/runtime-cache.js.map +0 -1
- package/dist/src/acp/control-plane/runtime-options.d.ts +0 -30
- package/dist/src/acp/control-plane/runtime-options.js +0 -92
- package/dist/src/acp/control-plane/runtime-options.js.map +0 -1
- package/dist/src/acp/control-plane/session-actor-queue.d.ts +0 -22
- package/dist/src/acp/control-plane/session-actor-queue.js +0 -70
- package/dist/src/acp/control-plane/session-actor-queue.js.map +0 -1
- package/dist/src/acp/control-plane/session-lifecycle-manager.d.ts +0 -59
- package/dist/src/acp/control-plane/session-lifecycle-manager.js +0 -209
- package/dist/src/acp/control-plane/session-lifecycle-manager.js.map +0 -1
- package/dist/src/acp/control-plane/session-store.d.ts +0 -39
- package/dist/src/acp/control-plane/session-store.js +0 -149
- package/dist/src/acp/control-plane/session-store.js.map +0 -1
- package/dist/src/acp/control-plane/turn-manager.d.ts +0 -40
- package/dist/src/acp/control-plane/turn-manager.js +0 -134
- package/dist/src/acp/control-plane/turn-manager.js.map +0 -1
- package/dist/src/acp/event-mapper.d.ts +0 -48
- package/dist/src/acp/event-mapper.js +0 -94
- package/dist/src/acp/event-mapper.js.map +0 -1
- package/dist/src/acp/index.d.ts +0 -10
- package/dist/src/acp/index.js +0 -5
- package/dist/src/acp/meta.d.ts +0 -15
- package/dist/src/acp/meta.js +0 -36
- package/dist/src/acp/meta.js.map +0 -1
- package/dist/src/acp/routing-integration.d.ts +0 -37
- package/dist/src/acp/routing-integration.js +0 -58
- package/dist/src/acp/routing-integration.js.map +0 -1
- package/dist/src/acp/runtime/backends/index.d.ts +0 -4
- package/dist/src/acp/runtime/backends/index.js +0 -2
- package/dist/src/acp/runtime/backends/local.d.ts +0 -136
- package/dist/src/acp/runtime/backends/local.js +0 -603
- package/dist/src/acp/runtime/backends/local.js.map +0 -1
- package/dist/src/acp/runtime/error-text.d.ts +0 -16
- package/dist/src/acp/runtime/error-text.js +0 -40
- package/dist/src/acp/runtime/error-text.js.map +0 -1
- package/dist/src/acp/runtime/errors.d.ts +0 -31
- package/dist/src/acp/runtime/errors.js +0 -47
- package/dist/src/acp/runtime/errors.js.map +0 -1
- package/dist/src/acp/runtime/index.d.ts +0 -7
- package/dist/src/acp/runtime/index.js +0 -4
- package/dist/src/acp/runtime/registry.d.ts +0 -35
- package/dist/src/acp/runtime/registry.js +0 -85
- package/dist/src/acp/runtime/registry.js.map +0 -1
- package/dist/src/acp/runtime/session-identity.d.ts +0 -35
- package/dist/src/acp/runtime/session-identity.js +0 -134
- package/dist/src/acp/runtime/session-identity.js.map +0 -1
- package/dist/src/acp/runtime/types.d.ts +0 -214
- package/dist/src/acp/secret-file.d.ts +0 -7
- package/dist/src/acp/secret-file.js +0 -19
- package/dist/src/acp/secret-file.js.map +0 -1
- package/dist/src/acp/server.d.ts +0 -48
- package/dist/src/acp/server.js +0 -300
- package/dist/src/acp/server.js.map +0 -1
- package/dist/src/acp/session.d.ts +0 -29
- package/dist/src/acp/session.js +0 -30
- package/dist/src/acp/session.js.map +0 -1
- package/dist/src/acp/types.d.ts +0 -39
- package/dist/src/acp/types.js +0 -13
- package/dist/src/acp/types.js.map +0 -1
- package/dist/src/agent/image/describe-images.d.ts +0 -18
- package/dist/src/agent/image/describe-images.js +0 -19
- package/dist/src/agent/image/describe-images.js.map +0 -1
- package/dist/src/cli/commands/acp.d.ts +0 -4
- package/dist/src/cli/commands/acp.js +0 -200
- package/dist/src/cli/commands/acp.js.map +0 -1
- /package/dist/src/{acp/runtime/types.js → cli/commands/doctor/index.d.ts} +0 -0
|
@@ -1,502 +0,0 @@
|
|
|
1
|
-
import { AcpRuntimeError, createUnsupportedControlError, withAcpRuntimeErrorBoundary } from "../runtime/errors.js";
|
|
2
|
-
import { createLogger } from "../../utils/logger/index.js";
|
|
3
|
-
import { init_logger } from "../../utils/logger.js";
|
|
4
|
-
import { SessionRateLimiter } from "../../infra/rate-limit.js";
|
|
5
|
-
import { isSessionIdentityPending, resolveSessionIdentityFromMeta } from "../runtime/session-identity.js";
|
|
6
|
-
import { reconcileRuntimeSessionIdentifiers } from "./identity-reconcile.js";
|
|
7
|
-
import { inferRuntimeOptionPatchFromConfigOption, resolveRuntimeOptionsFromMeta, validateRuntimeConfigOptionInput, validateRuntimeModeInput } from "./runtime-options.js";
|
|
8
|
-
import { normalizeActorKey, requireReadySessionMeta, resolveAcpSessionResolutionError } from "./manager.utils.js";
|
|
9
|
-
import { SessionActorQueue } from "./session-actor-queue.js";
|
|
10
|
-
import { AcpSessionStore, createDefaultAcpSessionStore } from "./session-store.js";
|
|
11
|
-
import { TurnManager } from "./turn-manager.js";
|
|
12
|
-
import { RuntimeCacheManager } from "./runtime-cache-manager.js";
|
|
13
|
-
import { SessionLifecycleManager } from "./session-lifecycle-manager.js";
|
|
14
|
-
//#region src/acp/control-plane/manager.ts
|
|
15
|
-
init_logger();
|
|
16
|
-
var AcpSessionManager = class {
|
|
17
|
-
actorQueue = new SessionActorQueue();
|
|
18
|
-
turnManager = new TurnManager();
|
|
19
|
-
cacheManager;
|
|
20
|
-
lifecycleManager;
|
|
21
|
-
sessionStore;
|
|
22
|
-
rateLimiter;
|
|
23
|
-
logger = createLogger("AcpSessionManager");
|
|
24
|
-
errorCountsByCode = /* @__PURE__ */ new Map();
|
|
25
|
-
constructor(sessionStorePath) {
|
|
26
|
-
this.sessionStorePath = sessionStorePath;
|
|
27
|
-
this.sessionStore = sessionStorePath ? new AcpSessionStore(sessionStorePath) : createDefaultAcpSessionStore();
|
|
28
|
-
this.rateLimiter = new SessionRateLimiter({
|
|
29
|
-
maxRequests: 100,
|
|
30
|
-
windowMs: 60 * 1e3
|
|
31
|
-
});
|
|
32
|
-
this.cacheManager = new RuntimeCacheManager({
|
|
33
|
-
persistMeta: async (sessionKey, meta) => {
|
|
34
|
-
await this.sessionStore.save(sessionKey, {
|
|
35
|
-
sessionKey,
|
|
36
|
-
acp: meta
|
|
37
|
-
});
|
|
38
|
-
},
|
|
39
|
-
enforceConcurrentLimit: () => {}
|
|
40
|
-
});
|
|
41
|
-
this.lifecycleManager = new SessionLifecycleManager({
|
|
42
|
-
loadEntry: (key) => this.sessionStore.load(key),
|
|
43
|
-
saveEntry: (key, entry) => this.sessionStore.save(key, entry),
|
|
44
|
-
listEntries: () => this.sessionStore.list(),
|
|
45
|
-
enforceConcurrentLimit: () => {}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
/** Initialize the session manager */
|
|
49
|
-
async initialize() {
|
|
50
|
-
await this.sessionStore.initialize();
|
|
51
|
-
}
|
|
52
|
-
/** Resolve Session */
|
|
53
|
-
async resolveSession(params) {
|
|
54
|
-
return this.lifecycleManager.resolveSession({
|
|
55
|
-
sessionKey: params.sessionKey,
|
|
56
|
-
getCachedMeta: (key) => {
|
|
57
|
-
const cached = this.cacheManager.get(key);
|
|
58
|
-
return cached ? {
|
|
59
|
-
backend: cached.backend,
|
|
60
|
-
agent: cached.agent,
|
|
61
|
-
runtimeSessionName: cached.handle.runtimeSessionName,
|
|
62
|
-
mode: cached.mode,
|
|
63
|
-
cwd: cached.cwd,
|
|
64
|
-
state: "idle",
|
|
65
|
-
lastActivityAt: Date.now()
|
|
66
|
-
} : null;
|
|
67
|
-
}
|
|
68
|
-
});
|
|
69
|
-
}
|
|
70
|
-
/** Get observability snapshot */
|
|
71
|
-
getObservabilitySnapshot(_cfg) {
|
|
72
|
-
const latencyStats = this.turnManager.getLatencyStats();
|
|
73
|
-
const completedTurns = latencyStats.completed + latencyStats.failed;
|
|
74
|
-
const averageLatencyMs = completedTurns > 0 ? Math.round(latencyStats.totalMs / completedTurns) : 0;
|
|
75
|
-
const evictionStats = this.cacheManager.getEvictionStats();
|
|
76
|
-
return {
|
|
77
|
-
runtimeCache: {
|
|
78
|
-
activeSessions: this.cacheManager.size(),
|
|
79
|
-
idleTtlMs: 0,
|
|
80
|
-
evictedTotal: evictionStats.evictedTotal,
|
|
81
|
-
...evictionStats.lastEvictedAt ? { lastEvictedAt: evictionStats.lastEvictedAt } : {}
|
|
82
|
-
},
|
|
83
|
-
turns: {
|
|
84
|
-
active: this.turnManager.getActiveTurnCount(),
|
|
85
|
-
queueDepth: this.actorQueue.getTotalPendingCount(),
|
|
86
|
-
completed: latencyStats.completed,
|
|
87
|
-
failed: latencyStats.failed,
|
|
88
|
-
averageLatencyMs,
|
|
89
|
-
maxLatencyMs: latencyStats.maxMs
|
|
90
|
-
},
|
|
91
|
-
errorsByCode: Object.fromEntries([...this.errorCountsByCode.entries()].toSorted(([a], [b]) => a.localeCompare(b)))
|
|
92
|
-
};
|
|
93
|
-
}
|
|
94
|
-
/** Reconciliation: recover pending session identities at startup */
|
|
95
|
-
async reconcilePendingSessionIdentities(params) {
|
|
96
|
-
const result = {
|
|
97
|
-
checked: 0,
|
|
98
|
-
resolved: 0,
|
|
99
|
-
failed: 0
|
|
100
|
-
};
|
|
101
|
-
const sessions = await this.lifecycleManager.listSessions();
|
|
102
|
-
for (const session of sessions) {
|
|
103
|
-
if (!session.acp || !session.sessionKey) continue;
|
|
104
|
-
if (!isSessionIdentityPending(resolveSessionIdentityFromMeta(session.acp))) continue;
|
|
105
|
-
result.checked += 1;
|
|
106
|
-
try {
|
|
107
|
-
if (await this.withSessionActor(session.sessionKey, async () => {
|
|
108
|
-
const resolution = await this.resolveSession({
|
|
109
|
-
cfg: params.cfg,
|
|
110
|
-
sessionKey: session.sessionKey
|
|
111
|
-
});
|
|
112
|
-
if (resolution.kind !== "ready") return false;
|
|
113
|
-
const { runtime, handle, meta } = await this.cacheManager.ensureHandle({
|
|
114
|
-
cfg: params.cfg,
|
|
115
|
-
sessionKey: session.sessionKey,
|
|
116
|
-
meta: resolution.meta
|
|
117
|
-
});
|
|
118
|
-
return !isSessionIdentityPending(resolveSessionIdentityFromMeta((await reconcileRuntimeSessionIdentifiers({
|
|
119
|
-
cfg: params.cfg,
|
|
120
|
-
sessionKey: session.sessionKey,
|
|
121
|
-
runtime,
|
|
122
|
-
handle,
|
|
123
|
-
meta,
|
|
124
|
-
failOnStatusError: false,
|
|
125
|
-
setCachedHandle: (key, _h) => {
|
|
126
|
-
this.cacheManager.clear(key);
|
|
127
|
-
},
|
|
128
|
-
writeSessionMeta: async ({ sessionKey, mutate }) => {
|
|
129
|
-
const entry = await this.sessionStore.load(sessionKey);
|
|
130
|
-
const current = entry?.acp;
|
|
131
|
-
const result = mutate(current, entry);
|
|
132
|
-
if (result) {
|
|
133
|
-
await this.sessionStore.save(sessionKey, {
|
|
134
|
-
sessionKey,
|
|
135
|
-
acp: result
|
|
136
|
-
});
|
|
137
|
-
return {
|
|
138
|
-
sessionKey,
|
|
139
|
-
acp: result
|
|
140
|
-
};
|
|
141
|
-
}
|
|
142
|
-
return null;
|
|
143
|
-
}
|
|
144
|
-
})).meta));
|
|
145
|
-
})) result.resolved += 1;
|
|
146
|
-
} catch (error) {
|
|
147
|
-
result.failed += 1;
|
|
148
|
-
this.logger.warn({
|
|
149
|
-
sessionKey: session.sessionKey,
|
|
150
|
-
error
|
|
151
|
-
}, "Failed to reconcile ACP session identity");
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
return result;
|
|
155
|
-
}
|
|
156
|
-
/** Initialize Session */
|
|
157
|
-
async initializeSession(input) {
|
|
158
|
-
await this.evictIdleRuntimeHandles({ cfg: input.cfg });
|
|
159
|
-
return await this.withSessionActor(input.sessionKey, async () => {
|
|
160
|
-
const { runtime, meta } = await this.lifecycleManager.initializeSession({
|
|
161
|
-
input,
|
|
162
|
-
onRuntimeCreated: async (sessionKey, _rt) => {
|
|
163
|
-
this.cacheManager.clear(sessionKey);
|
|
164
|
-
}
|
|
165
|
-
});
|
|
166
|
-
const { handle } = await this.cacheManager.ensureHandle({
|
|
167
|
-
cfg: input.cfg,
|
|
168
|
-
sessionKey: input.sessionKey,
|
|
169
|
-
meta
|
|
170
|
-
});
|
|
171
|
-
return {
|
|
172
|
-
runtime,
|
|
173
|
-
handle,
|
|
174
|
-
meta
|
|
175
|
-
};
|
|
176
|
-
});
|
|
177
|
-
}
|
|
178
|
-
/** Run Turn */
|
|
179
|
-
async runTurn(input) {
|
|
180
|
-
const rateLimit = this.rateLimiter.consume(input.sessionKey);
|
|
181
|
-
if (!rateLimit.allowed) throw new AcpRuntimeError("ACP_TURN_FAILED", `Rate limit exceeded. Retry after ${Math.ceil(rateLimit.retryAfterMs / 1e3)}s.`);
|
|
182
|
-
await this.evictIdleRuntimeHandles({ cfg: input.cfg });
|
|
183
|
-
await this.withSessionActor(input.sessionKey, async () => {
|
|
184
|
-
const resolution = await this.resolveSession({
|
|
185
|
-
cfg: input.cfg,
|
|
186
|
-
sessionKey: input.sessionKey
|
|
187
|
-
});
|
|
188
|
-
if (resolution.kind !== "ready") throw resolveAcpSessionResolutionError(resolution);
|
|
189
|
-
const { runtime, handle, meta } = await this.cacheManager.ensureHandle({
|
|
190
|
-
cfg: input.cfg,
|
|
191
|
-
sessionKey: input.sessionKey,
|
|
192
|
-
meta: resolution.meta
|
|
193
|
-
});
|
|
194
|
-
await this.turnManager.executeTurn({
|
|
195
|
-
input,
|
|
196
|
-
runtime: {
|
|
197
|
-
runtime,
|
|
198
|
-
handle,
|
|
199
|
-
meta
|
|
200
|
-
},
|
|
201
|
-
onStateChange: async (state, lastError) => {
|
|
202
|
-
await this.lifecycleManager.setSessionState({
|
|
203
|
-
sessionKey: input.sessionKey,
|
|
204
|
-
state,
|
|
205
|
-
lastError,
|
|
206
|
-
clearLastError: !lastError
|
|
207
|
-
});
|
|
208
|
-
}
|
|
209
|
-
});
|
|
210
|
-
});
|
|
211
|
-
}
|
|
212
|
-
/** Get Session Status */
|
|
213
|
-
async getSessionStatus(params) {
|
|
214
|
-
this.throwIfAborted(params.signal);
|
|
215
|
-
await this.evictIdleRuntimeHandles({ cfg: params.cfg });
|
|
216
|
-
return await this.withSessionActor(params.sessionKey, async () => {
|
|
217
|
-
this.throwIfAborted(params.signal);
|
|
218
|
-
const resolvedMeta = requireReadySessionMeta(await this.resolveSession({
|
|
219
|
-
cfg: params.cfg,
|
|
220
|
-
sessionKey: params.sessionKey
|
|
221
|
-
}));
|
|
222
|
-
const { runtime, handle, meta } = await this.cacheManager.ensureHandle({
|
|
223
|
-
cfg: params.cfg,
|
|
224
|
-
sessionKey: params.sessionKey,
|
|
225
|
-
meta: resolvedMeta
|
|
226
|
-
});
|
|
227
|
-
const capabilities = await this.resolveRuntimeCapabilities({
|
|
228
|
-
runtime,
|
|
229
|
-
handle
|
|
230
|
-
});
|
|
231
|
-
let runtimeStatus = await this.getRuntimeStatusSafe(runtime, handle, params.signal);
|
|
232
|
-
const identity = resolveSessionIdentityFromMeta(meta);
|
|
233
|
-
return {
|
|
234
|
-
sessionKey: params.sessionKey,
|
|
235
|
-
backend: handle.backend || meta.backend,
|
|
236
|
-
agent: meta.agent,
|
|
237
|
-
...identity ? { identity } : {},
|
|
238
|
-
state: meta.state,
|
|
239
|
-
mode: meta.mode,
|
|
240
|
-
runtimeOptions: resolveRuntimeOptionsFromMeta(meta),
|
|
241
|
-
capabilities,
|
|
242
|
-
runtimeStatus,
|
|
243
|
-
lastActivityAt: meta.lastActivityAt,
|
|
244
|
-
lastError: meta.lastError
|
|
245
|
-
};
|
|
246
|
-
}, params.signal);
|
|
247
|
-
}
|
|
248
|
-
/** Set Session Runtime Mode */
|
|
249
|
-
async setSessionRuntimeMode(params) {
|
|
250
|
-
const runtimeMode = validateRuntimeModeInput(params.runtimeMode);
|
|
251
|
-
await this.evictIdleRuntimeHandles({ cfg: params.cfg });
|
|
252
|
-
return await this.withSessionActor(params.sessionKey, async () => {
|
|
253
|
-
const resolvedMeta = requireReadySessionMeta(await this.resolveSession({
|
|
254
|
-
cfg: params.cfg,
|
|
255
|
-
sessionKey: params.sessionKey
|
|
256
|
-
}));
|
|
257
|
-
const { runtime, handle, meta } = await this.cacheManager.ensureHandle({
|
|
258
|
-
cfg: params.cfg,
|
|
259
|
-
sessionKey: params.sessionKey,
|
|
260
|
-
meta: resolvedMeta
|
|
261
|
-
});
|
|
262
|
-
if (!(await this.resolveRuntimeCapabilities({
|
|
263
|
-
runtime,
|
|
264
|
-
handle
|
|
265
|
-
})).controls.includes("session/set_mode") || !runtime.setMode) throw createUnsupportedControlError({
|
|
266
|
-
backend: handle.backend || meta.backend,
|
|
267
|
-
control: "session/set_mode"
|
|
268
|
-
});
|
|
269
|
-
await withAcpRuntimeErrorBoundary({
|
|
270
|
-
run: async () => await runtime.setMode({
|
|
271
|
-
handle,
|
|
272
|
-
mode: runtimeMode
|
|
273
|
-
}),
|
|
274
|
-
fallbackCode: "ACP_TURN_FAILED",
|
|
275
|
-
fallbackMessage: "Could not update ACP runtime mode."
|
|
276
|
-
});
|
|
277
|
-
return await this.updateAndPersistOptions(params.sessionKey, { runtimeMode });
|
|
278
|
-
});
|
|
279
|
-
}
|
|
280
|
-
/** Set Session Config Option */
|
|
281
|
-
async setSessionConfigOption(params) {
|
|
282
|
-
const { key, value } = validateRuntimeConfigOptionInput(params.key, params.value);
|
|
283
|
-
await this.evictIdleRuntimeHandles({ cfg: params.cfg });
|
|
284
|
-
return await this.withSessionActor(params.sessionKey, async () => {
|
|
285
|
-
const resolvedMeta = requireReadySessionMeta(await this.resolveSession({
|
|
286
|
-
cfg: params.cfg,
|
|
287
|
-
sessionKey: params.sessionKey
|
|
288
|
-
}));
|
|
289
|
-
const { runtime, handle, meta } = await this.cacheManager.ensureHandle({
|
|
290
|
-
cfg: params.cfg,
|
|
291
|
-
sessionKey: params.sessionKey,
|
|
292
|
-
meta: resolvedMeta
|
|
293
|
-
});
|
|
294
|
-
const inferredPatch = inferRuntimeOptionPatchFromConfigOption(key, value);
|
|
295
|
-
const capabilities = await this.resolveRuntimeCapabilities({
|
|
296
|
-
runtime,
|
|
297
|
-
handle
|
|
298
|
-
});
|
|
299
|
-
if (!capabilities.controls.includes("session/set_config_option") || !runtime.setConfigOption) throw createUnsupportedControlError({
|
|
300
|
-
backend: handle.backend || meta.backend,
|
|
301
|
-
control: "session/set_config_option"
|
|
302
|
-
});
|
|
303
|
-
const advertisedKeys = new Set((capabilities.configOptionKeys ?? []).map((k) => k.trim().toLowerCase()).filter(Boolean));
|
|
304
|
-
if (advertisedKeys.size > 0 && !advertisedKeys.has(key.toLowerCase())) throw new AcpRuntimeError("ACP_BACKEND_UNSUPPORTED_CONTROL", `ACP backend "${handle.backend || meta.backend}" does not accept config key "${key}".`);
|
|
305
|
-
await withAcpRuntimeErrorBoundary({
|
|
306
|
-
run: async () => await runtime.setConfigOption({
|
|
307
|
-
handle,
|
|
308
|
-
key,
|
|
309
|
-
value
|
|
310
|
-
}),
|
|
311
|
-
fallbackCode: "ACP_TURN_FAILED",
|
|
312
|
-
fallbackMessage: "Could not update ACP runtime config option."
|
|
313
|
-
});
|
|
314
|
-
return await this.updateAndPersistOptions(params.sessionKey, inferredPatch);
|
|
315
|
-
});
|
|
316
|
-
}
|
|
317
|
-
/** Cancel Session */
|
|
318
|
-
async cancelSession(params) {
|
|
319
|
-
await this.evictIdleRuntimeHandles({ cfg: params.cfg });
|
|
320
|
-
const activeTurn = this.turnManager.getActiveTurn(params.sessionKey);
|
|
321
|
-
if (activeTurn) {
|
|
322
|
-
if (await this.turnManager.cancelTurn({
|
|
323
|
-
sessionKey: params.sessionKey,
|
|
324
|
-
runtime: {
|
|
325
|
-
runtime: activeTurn.runtime,
|
|
326
|
-
handle: activeTurn.handle
|
|
327
|
-
},
|
|
328
|
-
reason: params.reason
|
|
329
|
-
})) return;
|
|
330
|
-
}
|
|
331
|
-
await this.withSessionActor(params.sessionKey, async () => {
|
|
332
|
-
const resolvedMeta = requireReadySessionMeta(await this.resolveSession({
|
|
333
|
-
cfg: params.cfg,
|
|
334
|
-
sessionKey: params.sessionKey
|
|
335
|
-
}));
|
|
336
|
-
const { runtime, handle } = await this.cacheManager.ensureHandle({
|
|
337
|
-
cfg: params.cfg,
|
|
338
|
-
sessionKey: params.sessionKey,
|
|
339
|
-
meta: resolvedMeta
|
|
340
|
-
});
|
|
341
|
-
try {
|
|
342
|
-
await runtime.cancel({
|
|
343
|
-
handle,
|
|
344
|
-
reason: params.reason
|
|
345
|
-
});
|
|
346
|
-
await this.lifecycleManager.setSessionState({
|
|
347
|
-
sessionKey: params.sessionKey,
|
|
348
|
-
state: "idle",
|
|
349
|
-
clearLastError: true
|
|
350
|
-
});
|
|
351
|
-
} catch (error) {
|
|
352
|
-
const acpError = error instanceof AcpRuntimeError ? error : new AcpRuntimeError("ACP_TURN_FAILED", error instanceof Error ? error.message : "Cancel failed");
|
|
353
|
-
await this.lifecycleManager.setSessionState({
|
|
354
|
-
sessionKey: params.sessionKey,
|
|
355
|
-
state: "error",
|
|
356
|
-
lastError: acpError.message
|
|
357
|
-
});
|
|
358
|
-
throw acpError;
|
|
359
|
-
}
|
|
360
|
-
});
|
|
361
|
-
}
|
|
362
|
-
/** Reset Session */
|
|
363
|
-
async resetSession(params) {
|
|
364
|
-
await this.evictIdleRuntimeHandles({ cfg: params.cfg });
|
|
365
|
-
await this.withSessionActor(params.sessionKey, async () => {
|
|
366
|
-
const resolvedMeta = requireReadySessionMeta(await this.resolveSession({
|
|
367
|
-
cfg: params.cfg,
|
|
368
|
-
sessionKey: params.sessionKey
|
|
369
|
-
}));
|
|
370
|
-
const { runtime, handle } = await this.cacheManager.ensureHandle({
|
|
371
|
-
cfg: params.cfg,
|
|
372
|
-
sessionKey: params.sessionKey,
|
|
373
|
-
meta: resolvedMeta
|
|
374
|
-
});
|
|
375
|
-
if (!(await this.resolveRuntimeCapabilities({
|
|
376
|
-
runtime,
|
|
377
|
-
handle
|
|
378
|
-
})).controls.includes("session/reset") || !runtime.resetSession) {
|
|
379
|
-
await this.lifecycleManager.setSessionState({
|
|
380
|
-
sessionKey: params.sessionKey,
|
|
381
|
-
state: "idle",
|
|
382
|
-
clearLastError: true
|
|
383
|
-
});
|
|
384
|
-
return;
|
|
385
|
-
}
|
|
386
|
-
try {
|
|
387
|
-
await runtime.resetSession({ handle });
|
|
388
|
-
await this.lifecycleManager.setSessionState({
|
|
389
|
-
sessionKey: params.sessionKey,
|
|
390
|
-
state: "idle",
|
|
391
|
-
clearLastError: true
|
|
392
|
-
});
|
|
393
|
-
} catch (error) {
|
|
394
|
-
const acpError = error instanceof AcpRuntimeError ? error : new AcpRuntimeError("ACP_SESSION_RESET_FAILED", error instanceof Error ? error.message : "Reset failed");
|
|
395
|
-
await this.lifecycleManager.setSessionState({
|
|
396
|
-
sessionKey: params.sessionKey,
|
|
397
|
-
state: "error",
|
|
398
|
-
lastError: acpError.message
|
|
399
|
-
});
|
|
400
|
-
throw acpError;
|
|
401
|
-
}
|
|
402
|
-
});
|
|
403
|
-
}
|
|
404
|
-
/** Close Session */
|
|
405
|
-
async closeSession(input) {
|
|
406
|
-
await this.evictIdleRuntimeHandles({ cfg: input.cfg });
|
|
407
|
-
return await this.withSessionActor(input.sessionKey, async () => {
|
|
408
|
-
const result = await this.lifecycleManager.closeSession({
|
|
409
|
-
input,
|
|
410
|
-
resolveSession: (key) => this.resolveSession({
|
|
411
|
-
cfg: input.cfg,
|
|
412
|
-
sessionKey: key
|
|
413
|
-
}),
|
|
414
|
-
getRuntime: async (key, meta) => this.cacheManager.ensureHandle({
|
|
415
|
-
cfg: input.cfg,
|
|
416
|
-
sessionKey: key,
|
|
417
|
-
meta
|
|
418
|
-
}),
|
|
419
|
-
clearCached: (key) => this.cacheManager.clear(key)
|
|
420
|
-
});
|
|
421
|
-
if (result.runtimeClosed || result.metaCleared) this.cacheManager.clear(input.sessionKey);
|
|
422
|
-
return result;
|
|
423
|
-
});
|
|
424
|
-
}
|
|
425
|
-
async updateAndPersistOptions(sessionKey, patch) {
|
|
426
|
-
const nextOptions = {
|
|
427
|
-
...(await this.sessionStore.load(sessionKey))?.acp?.runtimeOptions ?? {},
|
|
428
|
-
...patch
|
|
429
|
-
};
|
|
430
|
-
await this.lifecycleManager.updateRuntimeOptions({
|
|
431
|
-
sessionKey,
|
|
432
|
-
options: nextOptions,
|
|
433
|
-
clearCacheIfCwdChanged: (key, newCwd) => {
|
|
434
|
-
const cached = this.cacheManager.get(key);
|
|
435
|
-
if (cached && (cached.cwd ?? "") !== (newCwd ?? "")) this.cacheManager.clear(key);
|
|
436
|
-
}
|
|
437
|
-
});
|
|
438
|
-
return nextOptions;
|
|
439
|
-
}
|
|
440
|
-
async resolveRuntimeCapabilities(params) {
|
|
441
|
-
if (params.runtime.getCapabilities) return await Promise.resolve(params.runtime.getCapabilities({ handle: params.handle }));
|
|
442
|
-
return { controls: [] };
|
|
443
|
-
}
|
|
444
|
-
async getRuntimeStatusSafe(runtime, handle, signal) {
|
|
445
|
-
if (!runtime.getStatus) return {};
|
|
446
|
-
try {
|
|
447
|
-
this.throwIfAborted(signal);
|
|
448
|
-
return await runtime.getStatus({
|
|
449
|
-
handle,
|
|
450
|
-
signal
|
|
451
|
-
});
|
|
452
|
-
} catch {
|
|
453
|
-
return {};
|
|
454
|
-
}
|
|
455
|
-
}
|
|
456
|
-
async evictIdleRuntimeHandles(params) {
|
|
457
|
-
await this.cacheManager.evictIdle({
|
|
458
|
-
cfg: params.cfg,
|
|
459
|
-
hasActiveTurn: (key) => this.turnManager.hasActiveTurn(key),
|
|
460
|
-
onEvict: async (state) => {
|
|
461
|
-
await state.runtime.close({
|
|
462
|
-
handle: state.handle,
|
|
463
|
-
reason: "idle-evicted"
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
});
|
|
467
|
-
}
|
|
468
|
-
async withSessionActor(sessionKey, op, signal) {
|
|
469
|
-
return await this.actorQueue.run(normalizeActorKey(sessionKey), async () => {
|
|
470
|
-
this.throwIfAborted(signal);
|
|
471
|
-
return await op();
|
|
472
|
-
});
|
|
473
|
-
}
|
|
474
|
-
throwIfAborted(signal) {
|
|
475
|
-
if (signal?.aborted) throw new AcpRuntimeError("ACP_TURN_FAILED", "ACP operation aborted.");
|
|
476
|
-
}
|
|
477
|
-
};
|
|
478
|
-
let ACP_SESSION_MANAGER_SINGLETON = null;
|
|
479
|
-
let ACP_SESSION_MANAGER_INIT_PROMISE = null;
|
|
480
|
-
function getAcpSessionManager() {
|
|
481
|
-
if (!ACP_SESSION_MANAGER_SINGLETON) {
|
|
482
|
-
ACP_SESSION_MANAGER_SINGLETON = new AcpSessionManager();
|
|
483
|
-
ACP_SESSION_MANAGER_INIT_PROMISE = ACP_SESSION_MANAGER_SINGLETON.initialize();
|
|
484
|
-
}
|
|
485
|
-
return ACP_SESSION_MANAGER_SINGLETON;
|
|
486
|
-
}
|
|
487
|
-
/** Initialize and get the ACP session manager */
|
|
488
|
-
async function getAcpSessionManagerAsync() {
|
|
489
|
-
const manager = getAcpSessionManager();
|
|
490
|
-
if (ACP_SESSION_MANAGER_INIT_PROMISE) {
|
|
491
|
-
await ACP_SESSION_MANAGER_INIT_PROMISE;
|
|
492
|
-
ACP_SESSION_MANAGER_INIT_PROMISE = null;
|
|
493
|
-
}
|
|
494
|
-
return manager;
|
|
495
|
-
}
|
|
496
|
-
const __testing = { resetAcpSessionManagerForTests() {
|
|
497
|
-
ACP_SESSION_MANAGER_SINGLETON = null;
|
|
498
|
-
} };
|
|
499
|
-
//#endregion
|
|
500
|
-
export { AcpSessionManager, __testing, getAcpSessionManager, getAcpSessionManagerAsync };
|
|
501
|
-
|
|
502
|
-
//# sourceMappingURL=manager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","names":[],"sources":["../../../../src/acp/control-plane/manager.ts"],"sourcesContent":["/**\n * ACP Session Manager\n * \n * Core manager for ACP session lifecycle, runtime caching, and turn execution.\n * Refactored to delegate to specialized managers.\n */\n\nimport type { Config } from \"../../config/schema.js\";\nimport { createLogger } from \"../../utils/logger.js\";\nimport { AcpRuntimeError, withAcpRuntimeErrorBoundary } from \"../runtime/errors.js\";\nimport { SessionRateLimiter } from \"../../infra/rate-limit.js\";\nimport {\n isSessionIdentityPending,\n resolveSessionIdentityFromMeta,\n} from \"../runtime/session-identity.js\";\nimport type { AcpRuntime, AcpRuntimeHandle, AcpRuntimeControl } from \"../runtime/types.js\";\nimport {\n type AcpCloseSessionInput,\n type AcpCloseSessionResult,\n type AcpInitializeSessionInput,\n type AcpManagerObservabilitySnapshot,\n type AcpRunTurnInput,\n type AcpSessionResolution,\n type AcpSessionRuntimeOptions,\n type AcpSessionStatus,\n type AcpStartupIdentityReconcileResult,\n type SessionAcpMeta,\n type SessionEntry,\n} from \"./manager.types.js\";\nimport { reconcileRuntimeSessionIdentifiers } from \"./identity-reconcile.js\";\nimport {\n createUnsupportedControlError,\n normalizeActorKey,\n requireReadySessionMeta,\n resolveAcpSessionResolutionError,\n} from \"./manager.utils.js\";\nimport {\n inferRuntimeOptionPatchFromConfigOption,\n resolveRuntimeOptionsFromMeta,\n validateRuntimeConfigOptionInput,\n validateRuntimeModeInput,\n} from \"./runtime-options.js\";\nimport { SessionActorQueue } from \"./session-actor-queue.js\";\nimport { AcpSessionStore, createDefaultAcpSessionStore } from \"./session-store.js\";\nimport { TurnManager } from \"./turn-manager.js\";\nimport { RuntimeCacheManager } from \"./runtime-cache-manager.js\";\nimport { SessionLifecycleManager } from \"./session-lifecycle-manager.js\";\n\n/** Session Store Interface */\ninterface SessionStore {\n load(sessionKey: string): Promise<SessionEntry | null>;\n save(sessionKey: string, entry: SessionEntry): Promise<void>;\n list(): Promise<SessionEntry[]>;\n initialize(): Promise<void>;\n delete(sessionKey: string): Promise<void>;\n}\n\nexport class AcpSessionManager {\n private readonly actorQueue = new SessionActorQueue();\n private readonly turnManager = new TurnManager();\n private readonly cacheManager: RuntimeCacheManager;\n private readonly lifecycleManager: SessionLifecycleManager;\n private readonly sessionStore: SessionStore;\n private readonly rateLimiter: SessionRateLimiter;\n private readonly logger = createLogger(\"AcpSessionManager\");\n private readonly errorCountsByCode = new Map<string, number>();\n\n constructor(private readonly sessionStorePath?: string) {\n this.sessionStore = sessionStorePath\n ? new AcpSessionStore(sessionStorePath)\n : createDefaultAcpSessionStore();\n\n // Initialize rate limiter with defaults (will be updated when config is available)\n this.rateLimiter = new SessionRateLimiter({\n maxRequests: 100,\n windowMs: 60 * 1000, // 1 minute\n });\n\n this.cacheManager = new RuntimeCacheManager({\n persistMeta: async (sessionKey, meta) => {\n await this.sessionStore.save(sessionKey, { sessionKey, acp: meta });\n },\n enforceConcurrentLimit: () => {},\n });\n\n this.lifecycleManager = new SessionLifecycleManager({\n loadEntry: (key) => this.sessionStore.load(key),\n saveEntry: (key, entry) => this.sessionStore.save(key, entry),\n listEntries: () => this.sessionStore.list(),\n enforceConcurrentLimit: () => {},\n });\n }\n\n /** Initialize the session manager */\n async initialize(): Promise<void> {\n await this.sessionStore.initialize();\n }\n\n /** Resolve Session */\n async resolveSession(params: { cfg: Config; sessionKey: string }): Promise<AcpSessionResolution> {\n return this.lifecycleManager.resolveSession({\n sessionKey: params.sessionKey,\n getCachedMeta: (key) => {\n const cached = this.cacheManager.get(key);\n return cached\n ? {\n backend: cached.backend,\n agent: cached.agent,\n runtimeSessionName: cached.handle.runtimeSessionName,\n mode: cached.mode,\n cwd: cached.cwd,\n state: \"idle\",\n lastActivityAt: Date.now(),\n }\n : null;\n },\n });\n }\n\n /** Get observability snapshot */\n getObservabilitySnapshot(_cfg: Config): AcpManagerObservabilitySnapshot {\n const latencyStats = this.turnManager.getLatencyStats();\n const completedTurns = latencyStats.completed + latencyStats.failed;\n const averageLatencyMs =\n completedTurns > 0 ? Math.round(latencyStats.totalMs / completedTurns) : 0;\n const evictionStats = this.cacheManager.getEvictionStats();\n\n return {\n runtimeCache: {\n activeSessions: this.cacheManager.size(),\n idleTtlMs: 0,\n evictedTotal: evictionStats.evictedTotal,\n ...(evictionStats.lastEvictedAt ? { lastEvictedAt: evictionStats.lastEvictedAt } : {}),\n },\n turns: {\n active: this.turnManager.getActiveTurnCount(),\n queueDepth: this.actorQueue.getTotalPendingCount(),\n completed: latencyStats.completed,\n failed: latencyStats.failed,\n averageLatencyMs,\n maxLatencyMs: latencyStats.maxMs,\n },\n errorsByCode: Object.fromEntries(\n [...this.errorCountsByCode.entries()].toSorted(([a], [b]) => a.localeCompare(b)),\n ),\n };\n }\n\n /** Reconciliation: recover pending session identities at startup */\n async reconcilePendingSessionIdentities(params: {\n cfg: Config;\n }): Promise<AcpStartupIdentityReconcileResult> {\n const result: AcpStartupIdentityReconcileResult = {\n checked: 0,\n resolved: 0,\n failed: 0,\n };\n\n const sessions = await this.lifecycleManager.listSessions();\n\n for (const session of sessions) {\n if (!session.acp || !session.sessionKey) continue;\n\n const currentIdentity = resolveSessionIdentityFromMeta(session.acp);\n if (!isSessionIdentityPending(currentIdentity)) continue;\n\n result.checked += 1;\n\n try {\n const becameResolved = await this.withSessionActor(session.sessionKey, async () => {\n const resolution = await this.resolveSession({\n cfg: params.cfg,\n sessionKey: session.sessionKey!,\n });\n\n if (resolution.kind !== \"ready\") return false;\n\n const { runtime, handle, meta } = await this.cacheManager.ensureHandle({\n cfg: params.cfg,\n sessionKey: session.sessionKey!,\n meta: resolution.meta,\n });\n\n const reconciled = await reconcileRuntimeSessionIdentifiers({\n cfg: params.cfg,\n sessionKey: session.sessionKey!,\n runtime,\n handle,\n meta,\n failOnStatusError: false,\n setCachedHandle: (key, _h) => {\n this.cacheManager.clear(key);\n },\n writeSessionMeta: async ({ sessionKey, mutate }) => {\n const entry = await this.sessionStore.load(sessionKey);\n const current = entry?.acp;\n const result = mutate(current, entry);\n if (result) {\n await this.sessionStore.save(sessionKey, { sessionKey, acp: result });\n return { sessionKey, acp: result };\n }\n return null;\n },\n });\n\n return !isSessionIdentityPending(resolveSessionIdentityFromMeta(reconciled.meta));\n });\n\n if (becameResolved) result.resolved += 1;\n } catch (error) {\n result.failed += 1;\n this.logger.warn({ sessionKey: session.sessionKey, error }, \"Failed to reconcile ACP session identity\");\n }\n }\n\n return result;\n }\n\n /** Initialize Session */\n async initializeSession(input: AcpInitializeSessionInput): Promise<{\n runtime: AcpRuntime;\n handle: AcpRuntimeHandle;\n meta: SessionAcpMeta;\n }> {\n await this.evictIdleRuntimeHandles({ cfg: input.cfg });\n\n return await this.withSessionActor(input.sessionKey, async () => {\n const { runtime, meta } = await this.lifecycleManager.initializeSession({\n input,\n onRuntimeCreated: async (sessionKey, _rt) => {\n this.cacheManager.clear(sessionKey);\n },\n });\n\n // Ensure handle and cache it\n const { handle } = await this.cacheManager.ensureHandle({\n cfg: input.cfg,\n sessionKey: input.sessionKey,\n meta,\n });\n\n return { runtime, handle, meta };\n });\n }\n\n /** Run Turn */\n async runTurn(input: AcpRunTurnInput): Promise<void> {\n // Check rate limit\n const rateLimit = this.rateLimiter.consume(input.sessionKey);\n if (!rateLimit.allowed) {\n throw new AcpRuntimeError(\n \"ACP_TURN_FAILED\",\n `Rate limit exceeded. Retry after ${Math.ceil(rateLimit.retryAfterMs / 1000)}s.`\n );\n }\n\n await this.evictIdleRuntimeHandles({ cfg: input.cfg });\n\n await this.withSessionActor(input.sessionKey, async () => {\n const resolution = await this.resolveSession({ cfg: input.cfg, sessionKey: input.sessionKey });\n if (resolution.kind !== \"ready\") {\n throw resolveAcpSessionResolutionError(resolution);\n }\n\n const { runtime, handle, meta } = await this.cacheManager.ensureHandle({\n cfg: input.cfg,\n sessionKey: input.sessionKey,\n meta: resolution.meta,\n });\n\n await this.turnManager.executeTurn({\n input,\n runtime: { runtime, handle, meta },\n onStateChange: async (state, lastError) => {\n await this.lifecycleManager.setSessionState({\n sessionKey: input.sessionKey,\n state,\n lastError,\n clearLastError: !lastError,\n });\n },\n });\n });\n }\n\n /** Get Session Status */\n async getSessionStatus(params: {\n cfg: Config;\n sessionKey: string;\n signal?: AbortSignal;\n }): Promise<AcpSessionStatus> {\n this.throwIfAborted(params.signal);\n await this.evictIdleRuntimeHandles({ cfg: params.cfg });\n\n return await this.withSessionActor(\n params.sessionKey,\n async () => {\n this.throwIfAborted(params.signal);\n\n const resolution = await this.resolveSession({ cfg: params.cfg, sessionKey: params.sessionKey });\n const resolvedMeta = requireReadySessionMeta(resolution);\n\n const { runtime, handle, meta } = await this.cacheManager.ensureHandle({\n cfg: params.cfg,\n sessionKey: params.sessionKey,\n meta: resolvedMeta,\n });\n\n const capabilities = await this.resolveRuntimeCapabilities({ runtime, handle });\n let runtimeStatus = await this.getRuntimeStatusSafe(runtime, handle, params.signal);\n const identity = resolveSessionIdentityFromMeta(meta);\n\n return {\n sessionKey: params.sessionKey,\n backend: handle.backend || meta.backend,\n agent: meta.agent,\n ...(identity ? { identity } : {}),\n state: meta.state,\n mode: meta.mode,\n runtimeOptions: resolveRuntimeOptionsFromMeta(meta),\n capabilities,\n runtimeStatus,\n lastActivityAt: meta.lastActivityAt,\n lastError: meta.lastError,\n };\n },\n params.signal,\n );\n }\n\n /** Set Session Runtime Mode */\n async setSessionRuntimeMode(params: {\n cfg: Config;\n sessionKey: string;\n runtimeMode: string;\n }): Promise<AcpSessionRuntimeOptions> {\n const runtimeMode = validateRuntimeModeInput(params.runtimeMode);\n await this.evictIdleRuntimeHandles({ cfg: params.cfg });\n\n return await this.withSessionActor(params.sessionKey, async () => {\n const resolution = await this.resolveSession({ cfg: params.cfg, sessionKey: params.sessionKey });\n const resolvedMeta = requireReadySessionMeta(resolution);\n\n const { runtime, handle, meta } = await this.cacheManager.ensureHandle({\n cfg: params.cfg,\n sessionKey: params.sessionKey,\n meta: resolvedMeta,\n });\n\n const capabilities = await this.resolveRuntimeCapabilities({ runtime, handle });\n\n if (!capabilities.controls.includes(\"session/set_mode\") || !runtime.setMode) {\n throw createUnsupportedControlError({\n backend: handle.backend || meta.backend,\n control: \"session/set_mode\",\n });\n }\n\n await withAcpRuntimeErrorBoundary({\n run: async () => await runtime.setMode!({ handle, mode: runtimeMode }),\n fallbackCode: \"ACP_TURN_FAILED\",\n fallbackMessage: \"Could not update ACP runtime mode.\",\n });\n\n const nextOptions = await this.updateAndPersistOptions(params.sessionKey, { runtimeMode });\n return nextOptions;\n });\n }\n\n /** Set Session Config Option */\n async setSessionConfigOption(params: {\n cfg: Config;\n sessionKey: string;\n key: string;\n value: string;\n }): Promise<AcpSessionRuntimeOptions> {\n const { key, value } = validateRuntimeConfigOptionInput(params.key, params.value);\n await this.evictIdleRuntimeHandles({ cfg: params.cfg });\n\n return await this.withSessionActor(params.sessionKey, async () => {\n const resolution = await this.resolveSession({ cfg: params.cfg, sessionKey: params.sessionKey });\n const resolvedMeta = requireReadySessionMeta(resolution);\n\n const { runtime, handle, meta } = await this.cacheManager.ensureHandle({\n cfg: params.cfg,\n sessionKey: params.sessionKey,\n meta: resolvedMeta,\n });\n\n const inferredPatch = inferRuntimeOptionPatchFromConfigOption(key, value);\n const capabilities = await this.resolveRuntimeCapabilities({ runtime, handle });\n\n if (!capabilities.controls.includes(\"session/set_config_option\") || !runtime.setConfigOption) {\n throw createUnsupportedControlError({\n backend: handle.backend || meta.backend,\n control: \"session/set_config_option\",\n });\n }\n\n const advertisedKeys = new Set(\n (capabilities.configOptionKeys ?? []).map((k) => k.trim().toLowerCase()).filter(Boolean),\n );\n\n if (advertisedKeys.size > 0 && !advertisedKeys.has(key.toLowerCase())) {\n throw new AcpRuntimeError(\n \"ACP_BACKEND_UNSUPPORTED_CONTROL\",\n `ACP backend \"${handle.backend || meta.backend}\" does not accept config key \"${key}\".`,\n );\n }\n\n await withAcpRuntimeErrorBoundary({\n run: async () => await runtime.setConfigOption!({ handle, key, value }),\n fallbackCode: \"ACP_TURN_FAILED\",\n fallbackMessage: \"Could not update ACP runtime config option.\",\n });\n\n const nextOptions = await this.updateAndPersistOptions(params.sessionKey, inferredPatch);\n return nextOptions;\n });\n }\n\n /** Cancel Session */\n async cancelSession(params: { cfg: Config; sessionKey: string; reason?: string }): Promise<void> {\n await this.evictIdleRuntimeHandles({ cfg: params.cfg });\n\n // Try cancel active turn first\n const activeTurn = this.turnManager.getActiveTurn(params.sessionKey);\n if (activeTurn) {\n const cancelled = await this.turnManager.cancelTurn({\n sessionKey: params.sessionKey,\n runtime: { runtime: activeTurn.runtime, handle: activeTurn.handle },\n reason: params.reason,\n });\n if (cancelled) return;\n }\n\n // Otherwise cancel via session actor\n await this.withSessionActor(params.sessionKey, async () => {\n const resolution = await this.resolveSession({ cfg: params.cfg, sessionKey: params.sessionKey });\n const resolvedMeta = requireReadySessionMeta(resolution);\n\n const { runtime, handle } = await this.cacheManager.ensureHandle({\n cfg: params.cfg,\n sessionKey: params.sessionKey,\n meta: resolvedMeta,\n });\n\n try {\n await runtime.cancel({ handle, reason: params.reason });\n await this.lifecycleManager.setSessionState({\n sessionKey: params.sessionKey,\n state: \"idle\",\n clearLastError: true,\n });\n } catch (error) {\n const acpError =\n error instanceof AcpRuntimeError\n ? error\n : new AcpRuntimeError(\"ACP_TURN_FAILED\", error instanceof Error ? error.message : \"Cancel failed\");\n\n await this.lifecycleManager.setSessionState({\n sessionKey: params.sessionKey,\n state: \"error\",\n lastError: acpError.message,\n });\n throw acpError;\n }\n });\n }\n\n /** Reset Session */\n async resetSession(params: { cfg: Config; sessionKey: string }): Promise<void> {\n await this.evictIdleRuntimeHandles({ cfg: params.cfg });\n\n await this.withSessionActor(params.sessionKey, async () => {\n const resolution = await this.resolveSession({ cfg: params.cfg, sessionKey: params.sessionKey });\n const resolvedMeta = requireReadySessionMeta(resolution);\n\n const { runtime, handle } = await this.cacheManager.ensureHandle({\n cfg: params.cfg,\n sessionKey: params.sessionKey,\n meta: resolvedMeta,\n });\n\n // Check if runtime supports resetSession\n const capabilities = await this.resolveRuntimeCapabilities({ runtime, handle });\n\n if (!capabilities.controls.includes(\"session/reset\") || !runtime.resetSession) {\n // Fallback: just clear session state without calling runtime\n await this.lifecycleManager.setSessionState({\n sessionKey: params.sessionKey,\n state: \"idle\",\n clearLastError: true,\n });\n return;\n }\n\n try {\n await runtime.resetSession!({ handle });\n await this.lifecycleManager.setSessionState({\n sessionKey: params.sessionKey,\n state: \"idle\",\n clearLastError: true,\n });\n } catch (error) {\n const acpError =\n error instanceof AcpRuntimeError\n ? error\n : new AcpRuntimeError(\"ACP_SESSION_RESET_FAILED\", error instanceof Error ? error.message : \"Reset failed\");\n\n await this.lifecycleManager.setSessionState({\n sessionKey: params.sessionKey,\n state: \"error\",\n lastError: acpError.message,\n });\n throw acpError;\n }\n });\n }\n\n /** Close Session */\n async closeSession(input: AcpCloseSessionInput): Promise<AcpCloseSessionResult> {\n await this.evictIdleRuntimeHandles({ cfg: input.cfg });\n\n return await this.withSessionActor(input.sessionKey, async () => {\n const result = await this.lifecycleManager.closeSession({\n input,\n resolveSession: (key) => this.resolveSession({ cfg: input.cfg, sessionKey: key }),\n getRuntime: async (key, meta) => this.cacheManager.ensureHandle({ cfg: input.cfg, sessionKey: key, meta }),\n clearCached: (key) => this.cacheManager.clear(key),\n });\n\n if (result.runtimeClosed || result.metaCleared) {\n this.cacheManager.clear(input.sessionKey);\n }\n\n return result;\n });\n }\n\n // ============== Private Methods ==============\n\n private async updateAndPersistOptions(\n sessionKey: string,\n patch: Partial<AcpSessionRuntimeOptions>,\n ): Promise<AcpSessionRuntimeOptions> {\n const entry = await this.sessionStore.load(sessionKey);\n const current = entry?.acp?.runtimeOptions ?? {};\n const nextOptions = { ...current, ...patch };\n\n await this.lifecycleManager.updateRuntimeOptions({\n sessionKey,\n options: nextOptions,\n clearCacheIfCwdChanged: (key, newCwd) => {\n const cached = this.cacheManager.get(key);\n if (cached && (cached.cwd ?? \"\") !== (newCwd ?? \"\")) {\n this.cacheManager.clear(key);\n }\n },\n });\n\n return nextOptions;\n }\n\n private async resolveRuntimeCapabilities(params: {\n runtime: AcpRuntime;\n handle: AcpRuntimeHandle;\n }): Promise<{ controls: AcpRuntimeControl[]; configOptionKeys?: string[] }> {\n if (params.runtime.getCapabilities) {\n return await Promise.resolve(params.runtime.getCapabilities({ handle: params.handle }));\n }\n return { controls: [] };\n }\n\n private async getRuntimeStatusSafe(\n runtime: AcpRuntime,\n handle: AcpRuntimeHandle,\n signal?: AbortSignal,\n ): Promise<{ summary?: string; details?: Record<string, unknown> }> {\n if (!runtime.getStatus) return {};\n\n try {\n this.throwIfAborted(signal);\n return await runtime.getStatus({ handle, signal });\n } catch {\n return {};\n }\n }\n\n private async evictIdleRuntimeHandles(params: { cfg: Config }): Promise<void> {\n await this.cacheManager.evictIdle({\n cfg: params.cfg,\n hasActiveTurn: (key) => this.turnManager.hasActiveTurn(key),\n onEvict: async (state) => {\n await state.runtime.close({ handle: state.handle, reason: \"idle-evicted\" });\n },\n });\n }\n\n private async withSessionActor<T>(\n sessionKey: string,\n op: () => Promise<T>,\n signal?: AbortSignal,\n ): Promise<T> {\n return await this.actorQueue.run(normalizeActorKey(sessionKey), async () => {\n this.throwIfAborted(signal);\n return await op();\n });\n }\n\n private throwIfAborted(signal?: AbortSignal): void {\n if (signal?.aborted) {\n throw new AcpRuntimeError(\"ACP_TURN_FAILED\", \"ACP operation aborted.\");\n }\n }\n}\n\n// Singleton\nlet ACP_SESSION_MANAGER_SINGLETON: AcpSessionManager | null = null;\nlet ACP_SESSION_MANAGER_INIT_PROMISE: Promise<void> | null = null;\n\nexport function getAcpSessionManager(): AcpSessionManager {\n if (!ACP_SESSION_MANAGER_SINGLETON) {\n ACP_SESSION_MANAGER_SINGLETON = new AcpSessionManager();\n ACP_SESSION_MANAGER_INIT_PROMISE = ACP_SESSION_MANAGER_SINGLETON.initialize();\n }\n return ACP_SESSION_MANAGER_SINGLETON;\n}\n\n/** Initialize and get the ACP session manager */\nexport async function getAcpSessionManagerAsync(): Promise<AcpSessionManager> {\n const manager = getAcpSessionManager();\n if (ACP_SESSION_MANAGER_INIT_PROMISE) {\n await ACP_SESSION_MANAGER_INIT_PROMISE;\n ACP_SESSION_MANAGER_INIT_PROMISE = null;\n }\n return manager;\n}\n\nexport const __testing = {\n resetAcpSessionManagerForTests(): void {\n ACP_SESSION_MANAGER_SINGLETON = null;\n },\n};\n"],"mappings":"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"}
|