@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
package/dist/gateway/static/root/assets/{useTranslation-BEUWOMuh.js → useTranslation-CACj0DBJ.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{i as e}from"./rolldown-runtime-B1FJdls4.js";import{i as t}from"./vendor-react-QAsRxa6t.js";import{m as n,p as r}from"./url-
|
|
2
|
-
//# sourceMappingURL=useTranslation-
|
|
1
|
+
import{i as e}from"./rolldown-runtime-B1FJdls4.js";import{i as t}from"./vendor-react-QAsRxa6t.js";import{m as n,p as r}from"./url-D7yWllI8.js";import{o as i}from"./vendor-swr-8rdcElid.js";var a=e(t()),o=(e,t,n,r)=>{let i=[n,{code:t,...r||{}}];if(e?.services?.logger?.forward)return e.services.logger.forward(i,`warn`,`react-i18next::`,!0);p(i[0])&&(i[0]=`react-i18next:: ${i[0]}`),e?.services?.logger?.warn?e.services.logger.warn(...i):console?.warn&&console.warn(...i)},s={},c=(e,t,n,r)=>{p(n)&&s[n]||(p(n)&&(s[n]=new Date),o(e,t,n,r))},l=(e,t)=>()=>{if(e.isInitialized)t();else{let n=()=>{setTimeout(()=>{e.off(`initialized`,n)},0),t()};e.on(`initialized`,n)}},u=(e,t,n)=>{e.loadNamespaces(t,l(e,n))},d=(e,t,n,r)=>{if(p(n)&&(n=[n]),e.options.preload&&e.options.preload.indexOf(t)>-1)return u(e,n,r);n.forEach(t=>{e.options.ns.indexOf(t)<0&&e.options.ns.push(t)}),e.loadLanguages(t,l(e,r))},f=(e,t,n={})=>!t.languages||!t.languages.length?(c(t,`NO_LANGUAGES`,`i18n.languages were undefined or empty`,{languages:t.languages}),!0):t.hasLoadedNamespace(e,{lng:n.lng,precheck:(t,r)=>{if(n.bindI18n&&n.bindI18n.indexOf(`languageChanging`)>-1&&t.services.backendConnector.backend&&t.isLanguageChangingTo&&!r(t.isLanguageChangingTo,e))return!1}}),p=e=>typeof e==`string`,m=e=>typeof e==`object`&&!!e,h=(0,a.createContext)(),g=class{constructor(){this.usedNamespaces={}}addUsedNamespaces(e){e.forEach(e=>{this.usedNamespaces[e]||(this.usedNamespaces[e]=!0)})}getUsedNamespaces(){return Object.keys(this.usedNamespaces)}},_=i(),v={t:(e,t)=>{if(p(t))return t;if(m(t)&&p(t.defaultValue))return t.defaultValue;if(typeof e==`function`)return``;if(Array.isArray(e)){let t=e[e.length-1];return typeof t==`function`?``:t}return e},ready:!1},y=()=>()=>{},b=(e,t={})=>{let{i18n:i}=t,{i18n:o,defaultNS:s}=(0,a.useContext)(h)||{},l=i||o||r();l&&!l.reportNamespaces&&(l.reportNamespaces=new g),l||c(l,`NO_I18NEXT_INSTANCE`,`useTranslation: You will need to pass in an i18next instance by using initReactI18next`);let m=(0,a.useMemo)(()=>({...n(),...l?.options?.react,...t}),[l,t]),{useSuspense:b,keyPrefix:x}=m,S=e||s||l?.options?.defaultNS,C=p(S)?[S]:S||[`translation`],w=(0,a.useMemo)(()=>C,C);l?.reportNamespaces?.addUsedNamespaces?.(w);let T=(0,a.useRef)(0),E=(0,a.useCallback)(e=>{if(!l)return y;let{bindI18n:t,bindI18nStore:n}=m,r=()=>{T.current+=1,e()};return t&&l.on(t,r),n&&l.store.on(n,r),()=>{t&&t.split(` `).forEach(e=>l.off(e,r)),n&&n.split(` `).forEach(e=>l.store.off(e,r))}},[l,m]),D=(0,a.useRef)(),O=(0,a.useCallback)(()=>{if(!l)return v;let e=!!(l.isInitialized||l.initializedStoreOnce)&&w.every(e=>f(e,l,m)),n=t.lng||l.language,r=T.current,i=D.current;if(i&&i.ready===e&&i.lng===n&&i.keyPrefix===x&&i.revision===r)return i;let a={t:l.getFixedT(n,m.nsMode===`fallback`?w:w[0],x),ready:e,lng:n,keyPrefix:x,revision:r};return D.current=a,a},[l,w,x,m,t.lng]),[k,A]=(0,a.useState)(0),{t:j,ready:M}=(0,_.useSyncExternalStore)(E,O,O);(0,a.useEffect)(()=>{if(l&&!M&&!b){let e=()=>A(e=>e+1);t.lng?d(l,t.lng,w,e):u(l,w,e)}},[l,t.lng,w,M,b,k]);let N=l||{},P=(0,a.useRef)(null),F=(0,a.useRef)(),I=e=>{let t=Object.getOwnPropertyDescriptors(e);t.__original&&delete t.__original;let n=Object.create(Object.getPrototypeOf(e),t);if(!Object.prototype.hasOwnProperty.call(n,`__original`))try{Object.defineProperty(n,`__original`,{value:e,writable:!1,enumerable:!1,configurable:!1})}catch{}return n},L=(0,a.useMemo)(()=>{let e=N,t=e?.language,n=e;e&&(P.current&&P.current.__original===e&&F.current===t?n=P.current:(n=I(e),P.current=n,F.current=t));let r=!M&&!b?(...e)=>(c(l,`USE_T_BEFORE_READY`,`useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.`),j(...e)):j,i=[r,n,M];return i.t=r,i.i18n=n,i.ready=M,i},[j,N,M,N.resolvedLanguage,N.language,N.languages]);if(l&&b&&!M)throw new Promise(e=>{let n=()=>e();t.lng?d(l,t.lng,w,n):u(l,w,n)});return L};export{h as n,b as t};
|
|
2
|
+
//# sourceMappingURL=useTranslation-CACj0DBJ.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useTranslation-BEUWOMuh.js","names":[],"sources":["../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/utils.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/context.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/useTranslation.js"],"sourcesContent":["export const warn = (i18n, code, msg, rest) => {\n const args = [msg, {\n code,\n ...(rest || {})\n }];\n if (i18n?.services?.logger?.forward) {\n return i18n.services.logger.forward(args, 'warn', 'react-i18next::', true);\n }\n if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;\n if (i18n?.services?.logger?.warn) {\n i18n.services.logger.warn(...args);\n } else if (console?.warn) {\n console.warn(...args);\n }\n};\nconst alreadyWarned = {};\nexport const warnOnce = (i18n, code, msg, rest) => {\n if (isString(msg) && alreadyWarned[msg]) return;\n if (isString(msg)) alreadyWarned[msg] = new Date();\n warn(i18n, code, msg, rest);\n};\nconst loadedClb = (i18n, cb) => () => {\n if (i18n.isInitialized) {\n cb();\n } else {\n const initialized = () => {\n setTimeout(() => {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n i18n.on('initialized', initialized);\n }\n};\nexport const loadNamespaces = (i18n, ns, cb) => {\n i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n};\nexport const loadLanguages = (i18n, lng, ns, cb) => {\n if (isString(ns)) ns = [ns];\n if (i18n.options.preload && i18n.options.preload.indexOf(lng) > -1) return loadNamespaces(i18n, ns, cb);\n ns.forEach(n => {\n if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n });\n i18n.loadLanguages(lng, loadedClb(i18n, cb));\n};\nexport const hasLoadedNamespace = (ns, i18n, options = {}) => {\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce(i18n, 'NO_LANGUAGES', 'i18n.languages were undefined or empty', {\n languages: i18n.languages\n });\n return true;\n }\n return i18n.hasLoadedNamespace(ns, {\n lng: options.lng,\n precheck: (i18nInstance, loadNotPending) => {\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n};\nexport const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');\nexport const isString = obj => typeof obj === 'string';\nexport const isObject = obj => typeof obj === 'object' && obj !== null;","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n const i18nInitialProps = getInitialProps();\n return {\n ...componentsInitialProps,\n ...i18nInitialProps\n };\n};\nexport const getInitialProps = () => {\n const i18n = getI18n();\n if (!i18n) {\n console.warn('react-i18next:: getInitialProps: You will need to pass in an i18next instance by using initReactI18next');\n return {};\n }\n const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n};","import { useContext, useCallback, useMemo, useEffect, useRef, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace, isString, isObject } from './utils.js';\nconst notReadyT = (k, optsOrDefaultValue) => {\n if (isString(optsOrDefaultValue)) return optsOrDefaultValue;\n if (isObject(optsOrDefaultValue) && isString(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;\n if (typeof k === 'function') return '';\n if (Array.isArray(k)) {\n const last = k[k.length - 1];\n return typeof last === 'function' ? '' : last;\n }\n return k;\n};\nconst notReadySnapshot = {\n t: notReadyT,\n ready: false\n};\nconst dummySubscribe = () => () => {};\nexport const useTranslation = (ns, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n if (!i18n) {\n warnOnce(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next');\n }\n const i18nOptions = useMemo(() => ({\n ...getDefaults(),\n ...i18n?.options?.react,\n ...props\n }), [i18n, props]);\n const {\n useSuspense,\n keyPrefix\n } = i18nOptions;\n const nsOrContext = ns || defaultNSFromContext || i18n?.options?.defaultNS;\n const unstableNamespaces = isString(nsOrContext) ? [nsOrContext] : nsOrContext || ['translation'];\n const namespaces = useMemo(() => unstableNamespaces, unstableNamespaces);\n i18n?.reportNamespaces?.addUsedNamespaces?.(namespaces);\n const revisionRef = useRef(0);\n const subscribe = useCallback(callback => {\n if (!i18n) return dummySubscribe;\n const {\n bindI18n,\n bindI18nStore\n } = i18nOptions;\n const wrappedCallback = () => {\n revisionRef.current += 1;\n callback();\n };\n if (bindI18n) i18n.on(bindI18n, wrappedCallback);\n if (bindI18nStore) i18n.store.on(bindI18nStore, wrappedCallback);\n return () => {\n if (bindI18n) bindI18n.split(' ').forEach(e => i18n.off(e, wrappedCallback));\n if (bindI18nStore) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, wrappedCallback));\n };\n }, [i18n, i18nOptions]);\n const snapshotRef = useRef();\n const getSnapshot = useCallback(() => {\n if (!i18n) {\n return notReadySnapshot;\n }\n const calculatedReady = !!(i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n const currentLng = props.lng || i18n.language;\n const currentRevision = revisionRef.current;\n const lastSnapshot = snapshotRef.current;\n if (lastSnapshot && lastSnapshot.ready === calculatedReady && lastSnapshot.lng === currentLng && lastSnapshot.keyPrefix === keyPrefix && lastSnapshot.revision === currentRevision) {\n return lastSnapshot;\n }\n const calculatedT = i18n.getFixedT(currentLng, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const newSnapshot = {\n t: calculatedT,\n ready: calculatedReady,\n lng: currentLng,\n keyPrefix,\n revision: currentRevision\n };\n snapshotRef.current = newSnapshot;\n return newSnapshot;\n }, [i18n, namespaces, keyPrefix, i18nOptions, props.lng]);\n const [loadCount, setLoadCount] = useState(0);\n const {\n t,\n ready\n } = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n useEffect(() => {\n if (i18n && !ready && !useSuspense) {\n const onLoaded = () => setLoadCount(c => c + 1);\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n }\n }, [i18n, props.lng, namespaces, ready, useSuspense, loadCount]);\n const finalI18n = i18n || {};\n const wrapperRef = useRef(null);\n const wrapperLangRef = useRef();\n const createI18nWrapper = original => {\n const descriptors = Object.getOwnPropertyDescriptors(original);\n if (descriptors.__original) delete descriptors.__original;\n const wrapper = Object.create(Object.getPrototypeOf(original), descriptors);\n if (!Object.prototype.hasOwnProperty.call(wrapper, '__original')) {\n try {\n Object.defineProperty(wrapper, '__original', {\n value: original,\n writable: false,\n enumerable: false,\n configurable: false\n });\n } catch (_) {}\n }\n return wrapper;\n };\n const ret = useMemo(() => {\n const original = finalI18n;\n const lang = original?.language;\n let i18nWrapper = original;\n if (original) {\n if (wrapperRef.current && wrapperRef.current.__original === original) {\n if (wrapperLangRef.current !== lang) {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n } else {\n i18nWrapper = wrapperRef.current;\n }\n } else {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n }\n }\n const effectiveT = !ready && !useSuspense ? (...args) => {\n warnOnce(i18n, 'USE_T_BEFORE_READY', 'useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.');\n return t(...args);\n } : t;\n const arr = [effectiveT, i18nWrapper, ready];\n arr.t = effectiveT;\n arr.i18n = i18nWrapper;\n arr.ready = ready;\n return arr;\n }, [t, finalI18n, ready, finalI18n.resolvedLanguage, finalI18n.language, finalI18n.languages]);\n if (i18n && useSuspense && !ready) {\n throw new Promise(resolve => {\n const onLoaded = () => resolve();\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n });\n }\n return ret;\n};"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"useTranslation-CACj0DBJ.js","names":[],"sources":["../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/utils.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/context.js","../../../../../node_modules/.pnpm/react-i18next@17.0.3_i18next@26.0.4_typescript@6.0.2__react-dom@19.2.5_react@19.2.5__react@19.2.5_typescript@6.0.2/node_modules/react-i18next/dist/es/useTranslation.js"],"sourcesContent":["export const warn = (i18n, code, msg, rest) => {\n const args = [msg, {\n code,\n ...(rest || {})\n }];\n if (i18n?.services?.logger?.forward) {\n return i18n.services.logger.forward(args, 'warn', 'react-i18next::', true);\n }\n if (isString(args[0])) args[0] = `react-i18next:: ${args[0]}`;\n if (i18n?.services?.logger?.warn) {\n i18n.services.logger.warn(...args);\n } else if (console?.warn) {\n console.warn(...args);\n }\n};\nconst alreadyWarned = {};\nexport const warnOnce = (i18n, code, msg, rest) => {\n if (isString(msg) && alreadyWarned[msg]) return;\n if (isString(msg)) alreadyWarned[msg] = new Date();\n warn(i18n, code, msg, rest);\n};\nconst loadedClb = (i18n, cb) => () => {\n if (i18n.isInitialized) {\n cb();\n } else {\n const initialized = () => {\n setTimeout(() => {\n i18n.off('initialized', initialized);\n }, 0);\n cb();\n };\n i18n.on('initialized', initialized);\n }\n};\nexport const loadNamespaces = (i18n, ns, cb) => {\n i18n.loadNamespaces(ns, loadedClb(i18n, cb));\n};\nexport const loadLanguages = (i18n, lng, ns, cb) => {\n if (isString(ns)) ns = [ns];\n if (i18n.options.preload && i18n.options.preload.indexOf(lng) > -1) return loadNamespaces(i18n, ns, cb);\n ns.forEach(n => {\n if (i18n.options.ns.indexOf(n) < 0) i18n.options.ns.push(n);\n });\n i18n.loadLanguages(lng, loadedClb(i18n, cb));\n};\nexport const hasLoadedNamespace = (ns, i18n, options = {}) => {\n if (!i18n.languages || !i18n.languages.length) {\n warnOnce(i18n, 'NO_LANGUAGES', 'i18n.languages were undefined or empty', {\n languages: i18n.languages\n });\n return true;\n }\n return i18n.hasLoadedNamespace(ns, {\n lng: options.lng,\n precheck: (i18nInstance, loadNotPending) => {\n if (options.bindI18n && options.bindI18n.indexOf('languageChanging') > -1 && i18nInstance.services.backendConnector.backend && i18nInstance.isLanguageChangingTo && !loadNotPending(i18nInstance.isLanguageChangingTo, ns)) return false;\n }\n });\n};\nexport const getDisplayName = Component => Component.displayName || Component.name || (isString(Component) && Component.length > 0 ? Component : 'Unknown');\nexport const isString = obj => typeof obj === 'string';\nexport const isObject = obj => typeof obj === 'object' && obj !== null;","import { createContext } from 'react';\nimport { getDefaults, setDefaults } from './defaults.js';\nimport { getI18n, setI18n } from './i18nInstance.js';\nimport { initReactI18next } from './initReactI18next.js';\nexport { getDefaults, setDefaults, getI18n, setI18n, initReactI18next };\nexport const I18nContext = createContext();\nexport class ReportNamespaces {\n constructor() {\n this.usedNamespaces = {};\n }\n addUsedNamespaces(namespaces) {\n namespaces.forEach(ns => {\n if (!this.usedNamespaces[ns]) this.usedNamespaces[ns] = true;\n });\n }\n getUsedNamespaces() {\n return Object.keys(this.usedNamespaces);\n }\n}\nexport const composeInitialProps = ForComponent => async ctx => {\n const componentsInitialProps = (await ForComponent.getInitialProps?.(ctx)) ?? {};\n const i18nInitialProps = getInitialProps();\n return {\n ...componentsInitialProps,\n ...i18nInitialProps\n };\n};\nexport const getInitialProps = () => {\n const i18n = getI18n();\n if (!i18n) {\n console.warn('react-i18next:: getInitialProps: You will need to pass in an i18next instance by using initReactI18next');\n return {};\n }\n const namespaces = i18n.reportNamespaces?.getUsedNamespaces() ?? [];\n const ret = {};\n const initialI18nStore = {};\n i18n.languages.forEach(l => {\n initialI18nStore[l] = {};\n namespaces.forEach(ns => {\n initialI18nStore[l][ns] = i18n.getResourceBundle(l, ns) || {};\n });\n });\n ret.initialI18nStore = initialI18nStore;\n ret.initialLanguage = i18n.language;\n return ret;\n};","import { useContext, useCallback, useMemo, useEffect, useRef, useState } from 'react';\nimport { useSyncExternalStore } from 'use-sync-external-store/shim';\nimport { getI18n, getDefaults, ReportNamespaces, I18nContext } from './context.js';\nimport { warnOnce, loadNamespaces, loadLanguages, hasLoadedNamespace, isString, isObject } from './utils.js';\nconst notReadyT = (k, optsOrDefaultValue) => {\n if (isString(optsOrDefaultValue)) return optsOrDefaultValue;\n if (isObject(optsOrDefaultValue) && isString(optsOrDefaultValue.defaultValue)) return optsOrDefaultValue.defaultValue;\n if (typeof k === 'function') return '';\n if (Array.isArray(k)) {\n const last = k[k.length - 1];\n return typeof last === 'function' ? '' : last;\n }\n return k;\n};\nconst notReadySnapshot = {\n t: notReadyT,\n ready: false\n};\nconst dummySubscribe = () => () => {};\nexport const useTranslation = (ns, props = {}) => {\n const {\n i18n: i18nFromProps\n } = props;\n const {\n i18n: i18nFromContext,\n defaultNS: defaultNSFromContext\n } = useContext(I18nContext) || {};\n const i18n = i18nFromProps || i18nFromContext || getI18n();\n if (i18n && !i18n.reportNamespaces) i18n.reportNamespaces = new ReportNamespaces();\n if (!i18n) {\n warnOnce(i18n, 'NO_I18NEXT_INSTANCE', 'useTranslation: You will need to pass in an i18next instance by using initReactI18next');\n }\n const i18nOptions = useMemo(() => ({\n ...getDefaults(),\n ...i18n?.options?.react,\n ...props\n }), [i18n, props]);\n const {\n useSuspense,\n keyPrefix\n } = i18nOptions;\n const nsOrContext = ns || defaultNSFromContext || i18n?.options?.defaultNS;\n const unstableNamespaces = isString(nsOrContext) ? [nsOrContext] : nsOrContext || ['translation'];\n const namespaces = useMemo(() => unstableNamespaces, unstableNamespaces);\n i18n?.reportNamespaces?.addUsedNamespaces?.(namespaces);\n const revisionRef = useRef(0);\n const subscribe = useCallback(callback => {\n if (!i18n) return dummySubscribe;\n const {\n bindI18n,\n bindI18nStore\n } = i18nOptions;\n const wrappedCallback = () => {\n revisionRef.current += 1;\n callback();\n };\n if (bindI18n) i18n.on(bindI18n, wrappedCallback);\n if (bindI18nStore) i18n.store.on(bindI18nStore, wrappedCallback);\n return () => {\n if (bindI18n) bindI18n.split(' ').forEach(e => i18n.off(e, wrappedCallback));\n if (bindI18nStore) bindI18nStore.split(' ').forEach(e => i18n.store.off(e, wrappedCallback));\n };\n }, [i18n, i18nOptions]);\n const snapshotRef = useRef();\n const getSnapshot = useCallback(() => {\n if (!i18n) {\n return notReadySnapshot;\n }\n const calculatedReady = !!(i18n.isInitialized || i18n.initializedStoreOnce) && namespaces.every(n => hasLoadedNamespace(n, i18n, i18nOptions));\n const currentLng = props.lng || i18n.language;\n const currentRevision = revisionRef.current;\n const lastSnapshot = snapshotRef.current;\n if (lastSnapshot && lastSnapshot.ready === calculatedReady && lastSnapshot.lng === currentLng && lastSnapshot.keyPrefix === keyPrefix && lastSnapshot.revision === currentRevision) {\n return lastSnapshot;\n }\n const calculatedT = i18n.getFixedT(currentLng, i18nOptions.nsMode === 'fallback' ? namespaces : namespaces[0], keyPrefix);\n const newSnapshot = {\n t: calculatedT,\n ready: calculatedReady,\n lng: currentLng,\n keyPrefix,\n revision: currentRevision\n };\n snapshotRef.current = newSnapshot;\n return newSnapshot;\n }, [i18n, namespaces, keyPrefix, i18nOptions, props.lng]);\n const [loadCount, setLoadCount] = useState(0);\n const {\n t,\n ready\n } = useSyncExternalStore(subscribe, getSnapshot, getSnapshot);\n useEffect(() => {\n if (i18n && !ready && !useSuspense) {\n const onLoaded = () => setLoadCount(c => c + 1);\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n }\n }, [i18n, props.lng, namespaces, ready, useSuspense, loadCount]);\n const finalI18n = i18n || {};\n const wrapperRef = useRef(null);\n const wrapperLangRef = useRef();\n const createI18nWrapper = original => {\n const descriptors = Object.getOwnPropertyDescriptors(original);\n if (descriptors.__original) delete descriptors.__original;\n const wrapper = Object.create(Object.getPrototypeOf(original), descriptors);\n if (!Object.prototype.hasOwnProperty.call(wrapper, '__original')) {\n try {\n Object.defineProperty(wrapper, '__original', {\n value: original,\n writable: false,\n enumerable: false,\n configurable: false\n });\n } catch (_) {}\n }\n return wrapper;\n };\n const ret = useMemo(() => {\n const original = finalI18n;\n const lang = original?.language;\n let i18nWrapper = original;\n if (original) {\n if (wrapperRef.current && wrapperRef.current.__original === original) {\n if (wrapperLangRef.current !== lang) {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n } else {\n i18nWrapper = wrapperRef.current;\n }\n } else {\n i18nWrapper = createI18nWrapper(original);\n wrapperRef.current = i18nWrapper;\n wrapperLangRef.current = lang;\n }\n }\n const effectiveT = !ready && !useSuspense ? (...args) => {\n warnOnce(i18n, 'USE_T_BEFORE_READY', 'useTranslation: t was called before ready. When using useSuspense: false, make sure to check the ready flag before using t.');\n return t(...args);\n } : t;\n const arr = [effectiveT, i18nWrapper, ready];\n arr.t = effectiveT;\n arr.i18n = i18nWrapper;\n arr.ready = ready;\n return arr;\n }, [t, finalI18n, ready, finalI18n.resolvedLanguage, finalI18n.language, finalI18n.languages]);\n if (i18n && useSuspense && !ready) {\n throw new Promise(resolve => {\n const onLoaded = () => resolve();\n if (props.lng) {\n loadLanguages(i18n, props.lng, namespaces, onLoaded);\n } else {\n loadNamespaces(i18n, namespaces, onLoaded);\n }\n });\n }\n return ret;\n};"],"x_google_ignoreList":[0,1,2],"mappings":"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"}
|
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
<link rel="icon" type="image/svg+xml" href="/logo.svg" />
|
|
10
10
|
<link rel="apple-touch-icon" href="/logo.svg" />
|
|
11
11
|
<title>xopc</title>
|
|
12
|
-
<script type="module" crossorigin src="/assets/index-
|
|
12
|
+
<script type="module" crossorigin src="/assets/index-iTUyfzNr.js"></script>
|
|
13
13
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-B1FJdls4.js">
|
|
14
14
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-DzyYoeor.js">
|
|
15
15
|
<link rel="modulepreload" crossorigin href="/assets/dist-CjRB05pZ.js">
|
|
@@ -24,34 +24,34 @@
|
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/dist-CpMMntuC.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/cn-DPF56z7S.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/vendor-swr-8rdcElid.js">
|
|
27
|
-
<link rel="modulepreload" crossorigin href="/assets/url-
|
|
27
|
+
<link rel="modulepreload" crossorigin href="/assets/url-D7yWllI8.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/check-CDc_K89l.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/chunk-QFMPRPBF-DOYp8d2p.js">
|
|
30
30
|
<link rel="modulepreload" crossorigin href="/assets/form-field-width-BlpNwrfn.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/interaction-C4gx-xSs.js">
|
|
32
|
-
<link rel="modulepreload" crossorigin href="/assets/model-selector-
|
|
32
|
+
<link rel="modulepreload" crossorigin href="/assets/model-selector-BLiY_O25.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/button-CRQ9eQGX.js">
|
|
34
34
|
<link rel="modulepreload" crossorigin href="/assets/markdown-view-BpEqr7_J.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/settings-nav-state-BSa0kz44.js">
|
|
36
36
|
<link rel="modulepreload" crossorigin href="/assets/pin-DlJMazAN.js">
|
|
37
37
|
<link rel="modulepreload" crossorigin href="/assets/extension-paths-BNsLxSIK.js">
|
|
38
38
|
<link rel="modulepreload" crossorigin href="/assets/sparkles-BG1XFBU0.js">
|
|
39
|
-
<link rel="modulepreload" crossorigin href="/assets/theme-store-
|
|
40
|
-
<link rel="modulepreload" crossorigin href="/assets/
|
|
39
|
+
<link rel="modulepreload" crossorigin href="/assets/theme-store-CywXkKml.js">
|
|
40
|
+
<link rel="modulepreload" crossorigin href="/assets/electron-env-BDtJw9AY.js">
|
|
41
41
|
<link rel="modulepreload" crossorigin href="/assets/chevron-down-DUplxB5j.js">
|
|
42
|
-
<link rel="modulepreload" crossorigin href="/assets/skill-api-
|
|
42
|
+
<link rel="modulepreload" crossorigin href="/assets/skill-api-DWrn8Az0.js">
|
|
43
43
|
<link rel="modulepreload" crossorigin href="/assets/chevron-right-DmT4UtDa.js">
|
|
44
44
|
<link rel="modulepreload" crossorigin href="/assets/loader-circle-B2bCE4iI.js">
|
|
45
45
|
<link rel="modulepreload" crossorigin href="/assets/attachment-utils-core-B42k7cMx.js">
|
|
46
|
-
<link rel="modulepreload" crossorigin href="/assets/session-api-
|
|
47
|
-
<link rel="modulepreload" crossorigin href="/assets/session-working-directory-control-
|
|
46
|
+
<link rel="modulepreload" crossorigin href="/assets/session-api-DEhQXWJg.js">
|
|
47
|
+
<link rel="modulepreload" crossorigin href="/assets/session-working-directory-control-DKOtWs3-.js">
|
|
48
48
|
<link rel="modulepreload" crossorigin href="/assets/segmented-styles-DEG4J-_P.js">
|
|
49
49
|
<link rel="modulepreload" crossorigin href="/assets/sliding-segmented-BIYAScDL.js">
|
|
50
|
-
<link rel="modulepreload" crossorigin href="/assets/navigation-
|
|
50
|
+
<link rel="modulepreload" crossorigin href="/assets/navigation-DB9S-C6S.js">
|
|
51
51
|
<link rel="modulepreload" crossorigin href="/assets/ellipsis-vertical-BJP8MSr5.js">
|
|
52
52
|
<link rel="modulepreload" crossorigin href="/assets/send-CPmJTrt0.js">
|
|
53
53
|
<link rel="modulepreload" crossorigin href="/assets/external-link-DxIqSrRZ.js">
|
|
54
|
-
<link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-
|
|
54
|
+
<link rel="modulepreload" crossorigin href="/assets/gateway-config-swr-Cph02QZn.js">
|
|
55
55
|
<link rel="modulepreload" crossorigin href="/assets/file-text-CVBsYEv2.js">
|
|
56
56
|
<link rel="modulepreload" crossorigin href="/assets/folder-BZ5toHcH.js">
|
|
57
57
|
<link rel="modulepreload" crossorigin href="/assets/info-Ccltk00r.js">
|
|
@@ -61,13 +61,13 @@
|
|
|
61
61
|
<link rel="modulepreload" crossorigin href="/assets/refresh-cw-D7hzzeQ5.js">
|
|
62
62
|
<link rel="modulepreload" crossorigin href="/assets/search-DoMetBR0.js">
|
|
63
63
|
<link rel="modulepreload" crossorigin href="/assets/trash-2-D9v5oysq.js">
|
|
64
|
-
<link rel="modulepreload" crossorigin href="/assets/useTranslation-
|
|
65
|
-
<link rel="modulepreload" crossorigin href="/assets/extension-provider-
|
|
66
|
-
<link rel="modulepreload" crossorigin href="/assets/chat-agents-api-
|
|
67
|
-
<link rel="modulepreload" crossorigin href="/assets/extension-iframe-host-
|
|
68
|
-
<link rel="modulepreload" crossorigin href="/assets/page-header-store-
|
|
64
|
+
<link rel="modulepreload" crossorigin href="/assets/useTranslation-CACj0DBJ.js">
|
|
65
|
+
<link rel="modulepreload" crossorigin href="/assets/extension-provider-DZCZgQE2.js">
|
|
66
|
+
<link rel="modulepreload" crossorigin href="/assets/chat-agents-api-BhqjQ7iL.js">
|
|
67
|
+
<link rel="modulepreload" crossorigin href="/assets/extension-iframe-host-D5HEF0KR.js">
|
|
68
|
+
<link rel="modulepreload" crossorigin href="/assets/page-header-store-BFpnFTed.js">
|
|
69
69
|
<link rel="stylesheet" crossorigin href="/assets/markdown-view-CL7jotIt.css">
|
|
70
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
70
|
+
<link rel="stylesheet" crossorigin href="/assets/index-Bty3m0mS.css">
|
|
71
71
|
</head>
|
|
72
72
|
<body>
|
|
73
73
|
<div id="root"></div>
|
package/dist/package.js
CHANGED
|
@@ -78,6 +78,7 @@ export declare class AgentManager {
|
|
|
78
78
|
private agents;
|
|
79
79
|
private config;
|
|
80
80
|
private toolsFactory;
|
|
81
|
+
private mergedConfig;
|
|
81
82
|
/** Default agent workspace (effective profile for `getDefaultAgentId`). */
|
|
82
83
|
private baseWorkspacePath;
|
|
83
84
|
/** Per-session absolute markdown workspace when `SessionAgentConfig.workingDirectoryOverride` is set. */
|
|
@@ -3,12 +3,14 @@ import { init_logger } from "../utils/logger.js";
|
|
|
3
3
|
import { resolveStateDir } from "../config/paths-state.js";
|
|
4
4
|
import { expandWorkspacePathString, init_workspace_path } from "../config/workspace-path.js";
|
|
5
5
|
import { resolveAgentBootstrapDir } from "./agent-scope.js";
|
|
6
|
-
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
7
6
|
import { init_paths, resolveBundledSkillsDir } from "../config/paths.js";
|
|
8
|
-
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
9
|
-
import { init_sync_provider_auth, resolveProviderApiKeySync } from "../auth/sync-provider-auth.js";
|
|
10
7
|
import { CredentialResolver, init_credentials } from "../auth/credentials.js";
|
|
8
|
+
import { getAgentDefaultModelRef, init_schema } from "../config/schema.js";
|
|
9
|
+
import { init_sync_provider_auth, resolveProviderApiKeySync } from "../auth/sync-provider-auth.js";
|
|
10
|
+
import { applyConfigOverrides } from "../config/runtime-overrides.js";
|
|
11
|
+
import { resolveEffectiveAgentProfileForSession } from "../config/agent-profile.js";
|
|
11
12
|
import { getApiKeySync, getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
|
|
13
|
+
import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
|
|
12
14
|
import { extractTextContent, loadBootstrapFiles } from "./context/workspace.js";
|
|
13
15
|
import { createSkillConfigManager } from "./skills/config.js";
|
|
14
16
|
import { isValidSkillEnvVarName } from "./skills/required-env-vars.js";
|
|
@@ -48,6 +50,10 @@ var AgentManager = class {
|
|
|
48
50
|
agents = /* @__PURE__ */ new Map();
|
|
49
51
|
config;
|
|
50
52
|
toolsFactory;
|
|
53
|
+
mergedConfig() {
|
|
54
|
+
const base = this.config.config;
|
|
55
|
+
return base ? applyConfigOverrides(base) : void 0;
|
|
56
|
+
}
|
|
51
57
|
/** Default agent workspace (effective profile for `getDefaultAgentId`). */
|
|
52
58
|
baseWorkspacePath;
|
|
53
59
|
/** Per-session absolute markdown workspace when `SessionAgentConfig.workingDirectoryOverride` is set. */
|
|
@@ -67,7 +73,7 @@ var AgentManager = class {
|
|
|
67
73
|
extensionRegistry: config.extensionRegistry,
|
|
68
74
|
getCurrentContext: config.getCurrentContext,
|
|
69
75
|
bus: config.bus,
|
|
70
|
-
getConfig: () => this.
|
|
76
|
+
getConfig: () => this.mergedConfig(),
|
|
71
77
|
getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),
|
|
72
78
|
getBuiltinMemoryStore: () => baseRt.builtinMemoryStore,
|
|
73
79
|
getMemoryManager: () => baseRt.memoryManager,
|
|
@@ -135,7 +141,7 @@ var AgentManager = class {
|
|
|
135
141
|
}
|
|
136
142
|
/** Merged `thinkingDefault` for this session's agent id (defaults + `agents.list`). */
|
|
137
143
|
getThinkingDefaultForSession(sessionKey) {
|
|
138
|
-
const cfg = this.
|
|
144
|
+
const cfg = this.mergedConfig();
|
|
139
145
|
if (!cfg) return;
|
|
140
146
|
return resolveEffectiveAgentProfileForSession(cfg, sessionKey).thinkingDefault;
|
|
141
147
|
}
|
|
@@ -159,13 +165,14 @@ var AgentManager = class {
|
|
|
159
165
|
return rt;
|
|
160
166
|
}
|
|
161
167
|
pickDefaultModelRef() {
|
|
162
|
-
|
|
168
|
+
const cfg = this.mergedConfig();
|
|
169
|
+
return getAgentDefaultModelRef(cfg)?.trim() || getDefaultModelSync(cfg);
|
|
163
170
|
}
|
|
164
171
|
resolveModelStringToModel(modelRef) {
|
|
165
172
|
try {
|
|
166
173
|
return resolveModel(modelRef);
|
|
167
174
|
} catch {
|
|
168
|
-
const fallback = getDefaultModelSync(this.
|
|
175
|
+
const fallback = getDefaultModelSync(this.mergedConfig());
|
|
169
176
|
log.warn({
|
|
170
177
|
modelRef,
|
|
171
178
|
fallback
|
|
@@ -190,7 +197,7 @@ var AgentManager = class {
|
|
|
190
197
|
extensionRegistry: this.config.extensionRegistry,
|
|
191
198
|
getCurrentContext: this.config.getCurrentContext,
|
|
192
199
|
bus: this.config.bus,
|
|
193
|
-
getConfig: () => this.
|
|
200
|
+
getConfig: () => this.mergedConfig(),
|
|
194
201
|
getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),
|
|
195
202
|
getBuiltinMemoryStore: () => this.getWorkspaceRuntime(this.baseWorkspacePath).builtinMemoryStore,
|
|
196
203
|
getMemoryManager: () => this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager,
|
|
@@ -308,7 +315,7 @@ var AgentManager = class {
|
|
|
308
315
|
skillManager: rt.skillManager,
|
|
309
316
|
builtinMemoryStore: rt.builtinMemoryStore,
|
|
310
317
|
memoryManager: rt.memoryManager,
|
|
311
|
-
getConfig: () => this.
|
|
318
|
+
getConfig: () => this.mergedConfig(),
|
|
312
319
|
onSkillsFilesystemMutate: () => this.refreshSkillsAfterDiskChange()
|
|
313
320
|
});
|
|
314
321
|
}
|
|
@@ -626,6 +633,7 @@ var AgentManager = class {
|
|
|
626
633
|
tools,
|
|
627
634
|
messages: []
|
|
628
635
|
},
|
|
636
|
+
streamFn: createExtensionAwareStreamFn(),
|
|
629
637
|
getApiKey: (provider) => this.resolveApiKeyWithCache(provider)
|
|
630
638
|
}),
|
|
631
639
|
registeredToolNames
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-manager.js","names":[],"sources":["../../../src/agent/agent-manager.ts"],"sourcesContent":["/**\n * Agent Manager - Manages Agent instances per session\n *\n * Each session gets its own Agent instance for true isolation\n * and concurrent processing across sessions.\n */\n\nimport {\n Agent,\n type AgentMessage,\n type AgentEvent,\n type ThinkingLevel,\n} from '@mariozechner/pi-agent-core';\nimport type { Model, Api } from '@mariozechner/pi-ai';\nimport { type Config, getAgentDefaultModelRef } from '../config/schema.js';\nimport {\n type EffectiveAgentProfile,\n resolveAgentBootstrapDir,\n resolveEffectiveAgentProfileForSession,\n} from '../config/agent-profile.js';\nimport { expandWorkspacePathString } from '../config/workspace-path.js';\nimport type { ModelManager } from './models/manager.js';\nimport { createLogger } from '../utils/logger.js';\nimport { resolveProviderApiKeySync } from '../auth/sync-provider-auth.js';\nimport { resolveModel, getDefaultModelSync, getApiKeySync } from '../providers/index.js';\nimport { CredentialResolver } from '../auth/credentials.js';\nimport { resolveBundledSkillsDir, resolveStateDir } from '../config/paths.js';\nimport { loadBootstrapFiles, extractTextContent, type BootstrapFile } from './context/workspace.js';\nimport { SkillManager } from './skills/index.js';\nimport { SystemPromptBuilder } from './prompt/service-prompt-builder.js';\nimport { AgentToolsFactory } from './tools/factory.js';\nimport type { GatewayClarifyRequestFn } from './tools/clarify-tool.js';\nimport type { ExtensionRegistryImpl as ExtensionRegistry } from '../extensions/index.js';\nimport type { MessageBus } from '../infra/bus/index.js';\nimport type { CronService } from '../cron/index.js';\nimport type { SessionStore } from '../session/store.js';\nimport { isValidSkillEnvVarName } from './skills/required-env-vars.js';\nimport type { SessionContext } from './session/session-context.js';\nimport type { Skill } from './skills/types.js';\nimport { createSkillConfigManager } from './skills/config.js';\nimport { isUnderManagedSkillsDir } from './skills/managed-store.js';\nimport { loadSkillsLock, type SkillHubLockEntry } from './skills/hub-lock.js';\nimport { readFileSync } from 'node:fs';\nimport { basename, resolve, sep } from 'node:path';\n\nimport { BuiltinMemoryStore } from './memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from './memory/create-memory-manager.js';\nimport { injectPrefetchIntoUserMessage } from './memory/inject-prefetch.js';\nimport {\n isCuratedMemoryInPrompt,\n isMemorySubsystemEnabled,\n resolveBuiltinMemoryStoreConfig,\n shouldInjectMemoryPrefetchThisTurn,\n} from './memory/memory-config.js';\nimport type { MemoryManager } from './memory/manager.js';\nimport type { MemorySnapshot } from './memory/types.js';\nimport { extractAgentUserPlainText } from './memory/user-message-text.js';\nimport { resolveBackgroundReviewSettings } from './background-review/settings.js';\nimport { runBackgroundReviewTurn } from './background-review/run-background-review.js';\nimport {\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n} from './orchestration/llm-turn-retry.js';\n\nconst log = createLogger('AgentManager');\n\n/** Counters for optional post-turn memory/skill review (see `agents.defaults.backgroundReview`). */\nexport interface BackgroundNudgeState {\n turnsSinceMemory: number;\n itersSinceSkill: number;\n pendingMemoryReview: boolean;\n unsubscribe?: () => void;\n}\n\nexport interface SkillCatalogEntry {\n directoryId: string;\n name: string;\n description: string;\n source: Skill['source'];\n path: string;\n managed: boolean;\n /** User toggle in ~/.xopc/skills.json (`entries[name].enabled`). Default true. */\n enabled: boolean;\n /** When true, skill is never injected into `<available_skills>` (SKILL.md frontmatter). */\n disableModelInvocation: boolean;\n /** Hub install provenance when under ~/.xopc/skills and listed in skills-lock.json. */\n hub?: SkillHubLockEntry;\n}\n\nexport interface AgentManagerConfig {\n workspace: string;\n model?: string;\n config?: Config;\n extensionRegistry?: ExtensionRegistry;\n bus: MessageBus;\n getCurrentContext: () => SessionContext | null;\n /** Session persistence (enables `session_search` when set). */\n getSessionStore?: () => SessionStore;\n /** Clears per-session profile default on teardown. */\n getModelManager?: () => ModelManager;\n // Thinking configuration\n thinkingLevel?: ThinkingLevel;\n reasoningLevel?: 'off' | 'on' | 'stream';\n verboseLevel?: 'off' | 'on' | 'full';\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: exposes CronService for the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n}\n\nexport interface AgentInstance {\n agent: Agent;\n sessionKey: string;\n createdAt: number;\n lastUsedAt: number;\n /** Curated agent-home `memories/` snapshot frozen at agent creation (prefix cache). */\n curatedMemorySnapshot: MemorySnapshot;\n effectiveProfile: EffectiveAgentProfile;\n resolvedWorkspacePath: string;\n /** Tool names registered on this agent (for skill indexing / tool gating). */\n registeredToolNames: string[];\n /** Declared env var names from skill_view; shell reads values from process.env at spawn time. */\n skillEnvPassthroughKeys: Set<string>;\n backgroundNudge: BackgroundNudgeState;\n}\n\ninterface WorkspaceRuntime {\n skillManager: SkillManager;\n systemPromptBuilder: SystemPromptBuilder;\n builtinMemoryStore: BuiltinMemoryStore;\n memoryManager: MemoryManager;\n}\n\nexport class AgentManager {\n private agents = new Map<string, AgentInstance>();\n private config: AgentManagerConfig;\n private toolsFactory: AgentToolsFactory;\n /** Default agent workspace (effective profile for `getDefaultAgentId`). */\n private baseWorkspacePath: string;\n /** Per-session absolute markdown workspace when `SessionAgentConfig.workingDirectoryOverride` is set. */\n private sessionWorkspaceOverrides = new Map<string, string>();\n private defaultModel: string;\n private credentialCache = new Map<string, string>();\n private credentialResolver: CredentialResolver;\n private workspaceRuntimes = new Map<string, WorkspaceRuntime>();\n /** Per-session user-message index for prefetch injection cadence. */\n private memoryPrefetchUserTurn = new Map<string, number>();\n\n constructor(config: AgentManagerConfig) {\n this.config = config;\n this.baseWorkspacePath = this.computeBaseWorkspacePath();\n const baseRt = this.getWorkspaceRuntime(this.baseWorkspacePath);\n\n this.toolsFactory = new AgentToolsFactory({\n workspace: this.baseWorkspacePath,\n extensionRegistry: config.extensionRegistry,\n getCurrentContext: config.getCurrentContext,\n bus: config.bus,\n getConfig: () => this.config.config,\n getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),\n getBuiltinMemoryStore: () => baseRt.builtinMemoryStore,\n getMemoryManager: () => baseRt.memoryManager,\n getSessionStore: config.getSessionStore,\n gatewayClarify: config.gatewayClarify,\n getCronService: config.getCronService,\n getSkillIndexingContext: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return undefined;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return undefined;\n return {\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n };\n },\n onSkillsFilesystemMutate: () => {\n this.refreshSkillsAfterDiskChange();\n },\n getSkillPassthroughEnvVarNames: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return [];\n return [...(this.agents.get(ctx.sessionKey)?.skillEnvPassthroughKeys ?? [])];\n },\n registerSkillEnvPassthrough: (names: string[]) => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return;\n for (const n of names) {\n if (isValidSkillEnvVarName(n)) {\n inst.skillEnvPassthroughKeys.add(n.trim());\n }\n }\n },\n });\n\n this.defaultModel = config.model || getDefaultModelSync(config.config);\n\n this.credentialResolver = new CredentialResolver();\n this.warmCredentialCache().catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em }, `Credential cache pre-warm failed: ${em}`);\n });\n }\n\n private computeBaseWorkspacePath(): string {\n const cfg = this.config.config;\n if (!cfg) {\n return expandWorkspacePathString(this.config.workspace);\n }\n return resolveEffectiveAgentProfileForSession(cfg, null).resolvedWorkspacePath;\n }\n\n /**\n * Workspace root for inbound attachments / side effects for this session's agent id.\n * Uses in-memory session workspace overrides when the session has a persisted `workingDirectoryOverride`.\n */\n getResolvedWorkspaceForSession(sessionKey: string): string {\n const cfg = this.config.config!;\n const fromMap = this.sessionWorkspaceOverrides.get(sessionKey);\n if (fromMap !== undefined) {\n return fromMap;\n }\n return resolveEffectiveAgentProfileForSession(cfg, sessionKey).resolvedWorkspacePath;\n }\n\n /**\n * Sync in-memory workspace override from session config (after load or PATCH).\n * Pass `null` to clear when the session has no `workingDirectoryOverride` on disk.\n */\n setSessionWorkspaceOverride(sessionKey: string, absolutePath: string | null): void {\n if (absolutePath === null || absolutePath === '') {\n this.sessionWorkspaceOverrides.delete(sessionKey);\n } else {\n this.sessionWorkspaceOverrides.set(sessionKey, absolutePath);\n }\n }\n\n /** Merged `thinkingDefault` for this session's agent id (defaults + `agents.list`). */\n getThinkingDefaultForSession(\n sessionKey: string,\n ): import('./transcript/thinking-types.js').ThinkLevel | undefined {\n const cfg = this.config.config;\n if (!cfg) {\n return undefined;\n }\n return resolveEffectiveAgentProfileForSession(cfg, sessionKey).thinkingDefault;\n }\n\n private getWorkspaceRuntime(resolvedPath: string): WorkspaceRuntime {\n const existing = this.workspaceRuntimes.get(resolvedPath);\n if (existing) {\n return existing;\n }\n\n const builtinMemoryStore = new BuiltinMemoryStore(\n resolveBuiltinMemoryStoreConfig(resolvedPath, this.config.config),\n );\n const memoryManager = createMemoryManagerFromConfig(\n resolvedPath,\n builtinMemoryStore,\n this.config.config,\n );\n const skillManager = new SkillManager(resolvedPath, resolveBundledSkillsDir());\n const systemPromptBuilder = new SystemPromptBuilder({\n workspace: resolvedPath,\n config: this.config.config!,\n skillManager,\n });\n\n const rt: WorkspaceRuntime = {\n skillManager,\n systemPromptBuilder,\n builtinMemoryStore,\n memoryManager,\n };\n this.workspaceRuntimes.set(resolvedPath, rt);\n return rt;\n }\n\n private pickDefaultModelRef(): string {\n const ref = getAgentDefaultModelRef(this.config.config);\n return ref?.trim() || getDefaultModelSync(this.config.config);\n }\n\n private resolveModelStringToModel(modelRef: string): Model<Api> {\n try {\n return resolveModel(modelRef);\n } catch {\n const fallback = getDefaultModelSync(this.config.config);\n log.warn({ modelRef, fallback }, 'Model not found, using default');\n return resolveModel(fallback);\n }\n }\n\n /**\n * Keep defaults in sync when config is hot-reloaded or saved from the UI.\n */\n updateAgentDefaults(config: Config): void {\n this.config.config = config;\n const ref = getAgentDefaultModelRef(config);\n this.config.model = ref;\n this.defaultModel = ref || getDefaultModelSync(config);\n this.baseWorkspacePath = this.computeBaseWorkspacePath();\n void this.toolsFactory.shutdownBrowser();\n for (const rt of this.workspaceRuntimes.values()) {\n void rt.memoryManager.shutdownAll().catch(() => {});\n }\n this.workspaceRuntimes.clear();\n this.toolsFactory = new AgentToolsFactory({\n workspace: this.baseWorkspacePath,\n extensionRegistry: this.config.extensionRegistry,\n getCurrentContext: this.config.getCurrentContext,\n bus: this.config.bus,\n getConfig: () => this.config.config,\n getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),\n getBuiltinMemoryStore: () => this.getWorkspaceRuntime(this.baseWorkspacePath).builtinMemoryStore,\n getMemoryManager: () => this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager,\n getSessionStore: this.config.getSessionStore,\n gatewayClarify: this.config.gatewayClarify,\n getCronService: this.config.getCronService,\n getSkillIndexingContext: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return undefined;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return undefined;\n return {\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n };\n },\n onSkillsFilesystemMutate: () => {\n this.refreshSkillsAfterDiskChange();\n },\n getSkillPassthroughEnvVarNames: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return [];\n return [...(this.agents.get(ctx.sessionKey)?.skillEnvPassthroughKeys ?? [])];\n },\n registerSkillEnvPassthrough: (names: string[]) => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return;\n for (const n of names) {\n if (isValidSkillEnvVarName(n)) {\n inst.skillEnvPassthroughKeys.add(n.trim());\n }\n }\n },\n });\n }\n\n getMemoryManager(): MemoryManager {\n return this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager;\n }\n\n private getMemoryManagerForSession(sessionKey: string): MemoryManager {\n const path = this.getResolvedWorkspaceForSession(sessionKey);\n return this.getWorkspaceRuntime(path).memoryManager;\n }\n\n /**\n * Prefix the user turn with fenced prefetched memory (external providers).\n */\n async applyMemoryPrefetchToUserMessage(\n userMessage: AgentMessage,\n sessionKey: string,\n ): Promise<AgentMessage> {\n if (!isMemorySubsystemEnabled(this.config.config)) {\n return userMessage;\n }\n const plain = extractAgentUserPlainText(userMessage);\n const turn = (this.memoryPrefetchUserTurn.get(sessionKey) ?? 0) + 1;\n this.memoryPrefetchUserTurn.set(sessionKey, turn);\n if (!shouldInjectMemoryPrefetchThisTurn(this.config.config, turn)) {\n return userMessage;\n }\n return injectPrefetchIntoUserMessage(\n this.getMemoryManagerForSession(sessionKey),\n sessionKey,\n userMessage,\n plain,\n );\n }\n\n /**\n * After a completed turn: sync external providers and queue next-turn prefetch.\n */\n afterAgentTurn(sessionKey: string, userPlainText: string): void {\n if (!isMemorySubsystemEnabled(this.config.config)) {\n return;\n }\n const assistant = this.getLastAssistantContent(sessionKey) ?? '';\n const mm = this.getMemoryManagerForSession(sessionKey);\n mm.syncAll(userPlainText, assistant, { sessionId: sessionKey });\n mm.queuePrefetchAll(userPlainText, { sessionId: sessionKey });\n }\n\n /**\n * Call once per user turn before the main `agent.prompt` (via {@link runAgentTurnWithModelFallbacks} `beforeUserPrompt`).\n */\n beginBackgroundReviewUserTurn(sessionKey: string): void {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n const cfg = resolveBackgroundReviewSettings(this.config.config);\n if (!cfg.enabled || cfg.memoryNudgeInterval <= 0) return;\n if (!inst.registeredToolNames.includes('curated_memory')) return;\n inst.backgroundNudge.turnsSinceMemory += 1;\n if (inst.backgroundNudge.turnsSinceMemory >= cfg.memoryNudgeInterval) {\n inst.backgroundNudge.pendingMemoryReview = true;\n inst.backgroundNudge.turnsSinceMemory = 0;\n }\n }\n\n /**\n * After a successful main turn (after memory sync via `afterAgentTurn`), may run a quiet follow-up for memory/skills.\n */\n scheduleBackgroundReviewAfterUserTurn(sessionKey: string): void {\n void this.runBackgroundReviewIfNeeded(sessionKey).catch((err) => {\n log.warn({ err, sessionKey }, 'Background review failed');\n });\n }\n\n private async runBackgroundReviewIfNeeded(sessionKey: string): Promise<void> {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n const settings = resolveBackgroundReviewSettings(this.config.config);\n if (!settings.enabled) return;\n if (isAssistantTurnAborted(inst.agent) || isAssistantTurnFailed(inst.agent)) return;\n const last = this.getLastAssistantContent(sessionKey);\n if (!last?.trim()) return;\n\n const reviewMemory = inst.backgroundNudge.pendingMemoryReview;\n inst.backgroundNudge.pendingMemoryReview = false;\n\n let reviewSkills = false;\n if (settings.skillNudgeInterval > 0 && inst.registeredToolNames.includes('skill_manage')) {\n if (inst.backgroundNudge.itersSinceSkill >= settings.skillNudgeInterval) {\n reviewSkills = true;\n inst.backgroundNudge.itersSinceSkill = 0;\n }\n }\n\n if (!reviewMemory && !reviewSkills) return;\n\n const rt = this.getWorkspaceRuntime(inst.resolvedWorkspacePath);\n await runBackgroundReviewTurn({\n sessionKey,\n mainAgent: inst.agent,\n settings,\n reviewMemory,\n reviewSkills,\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n workspacePath: inst.resolvedWorkspacePath,\n skillManager: rt.skillManager,\n builtinMemoryStore: rt.builtinMemoryStore,\n memoryManager: rt.memoryManager,\n getConfig: () => this.config.config,\n onSkillsFilesystemMutate: () => this.refreshSkillsAfterDiskChange(),\n });\n }\n\n private attachBackgroundNudgeListeners(sessionKey: string): void {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n inst.backgroundNudge.unsubscribe?.();\n const unsub = inst.agent.subscribe((ev: AgentEvent) => {\n const cfg = resolveBackgroundReviewSettings(this.config.config);\n if (!cfg.enabled || cfg.skillNudgeInterval <= 0) return;\n if (!inst.registeredToolNames.includes('skill_manage')) return;\n if (ev.type === 'turn_start') {\n inst.backgroundNudge.itersSinceSkill += 1;\n }\n if (ev.type === 'tool_execution_end') {\n const te = ev as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n if (\n !te.isError &&\n typeof te.toolName === 'string' &&\n te.toolName.trim() === 'skill_manage'\n ) {\n inst.backgroundNudge.itersSinceSkill = 0;\n }\n }\n });\n inst.backgroundNudge.unsubscribe = unsub;\n }\n\n /**\n * Expand `/skill:name` user text into the full skill block for the current turn (WebChat, channels).\n */\n expandSkillUserText(text: string): string {\n const ctx = this.config.getCurrentContext?.();\n const path = ctx?.sessionKey\n ? this.getResolvedWorkspaceForSession(ctx.sessionKey)\n : this.baseWorkspacePath;\n return this.getWorkspaceRuntime(path).skillManager.expandCommand(text);\n }\n\n /**\n * Read raw SKILL.md from disk (including frontmatter) for UI preview.\n */\n getSkillMarkdownSource(skillName: string): { name: string; markdown: string } | null {\n const skill = this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.findSkill(skillName);\n if (!skill) return null;\n try {\n const markdown = readFileSync(skill.filePath, 'utf-8');\n return { name: skill.name, markdown };\n } catch (err) {\n log.warn({ err, skillName, path: skill.filePath }, 'Failed to read SKILL.md');\n return null;\n }\n }\n\n private loadBootstrapForProfile(profile: EffectiveAgentProfile): BootstrapFile[] {\n const cfg = this.config.config!;\n const bootstrapDir = resolveAgentBootstrapDir(cfg, profile.agentId);\n return loadBootstrapFiles(bootstrapDir);\n }\n\n getSkillCatalog(): SkillCatalogEntry[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const lock = loadSkillsLock();\n return this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.getSkills().map((s) => {\n const base = resolve(s.baseDir);\n const managed = isUnderManagedSkillsDir(s.baseDir);\n const directoryId = base.split(sep).filter(Boolean).pop() || s.name;\n const enabled = !(skillsConfig.entries?.[s.name]?.enabled === false);\n const hubKey = managed ? basename(base) : '';\n const hub = managed && hubKey ? lock.entries[hubKey] : undefined;\n return {\n directoryId,\n name: s.name,\n description: s.description,\n source: s.source,\n path: s.baseDir,\n managed,\n enabled,\n disableModelInvocation: s.disableModelInvocation,\n ...(hub ? { hub } : {}),\n };\n });\n }\n\n /**\n * After ~/.xopc/skills.json changes (enable/disable), refresh `<available_skills>` on active agents.\n */\n refreshSkillsAfterSkillConfigChange(): void {\n const touched = new Set<string>();\n for (const instance of this.agents.values()) {\n const rt = this.getWorkspaceRuntime(instance.resolvedWorkspacePath);\n if (!touched.has(instance.resolvedWorkspacePath)) {\n rt.skillManager.refreshPromptFromConfig();\n touched.add(instance.resolvedWorkspacePath);\n }\n const bootstrapFiles = this.loadBootstrapForProfile(instance.effectiveProfile);\n const newPrompt = rt.systemPromptBuilder.build(bootstrapFiles, {\n curatedMemorySnapshot: instance.curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: instance.resolvedWorkspacePath,\n systemPromptOverride: instance.effectiveProfile.systemPromptOverride,\n skillAllowlist: instance.effectiveProfile.skillsAllowlist,\n registeredToolNames: instance.registeredToolNames,\n });\n instance.agent.state.systemPrompt = newPrompt;\n }\n log.info({ agents: this.agents.size }, 'Skill toggles applied; system prompt updated');\n }\n\n /**\n * Reload skills from disk and refresh system prompt on all active Agent instances.\n */\n refreshSkillsAfterDiskChange(): void {\n // Reload every workspace SkillManager first. When there are no active agent sessions\n // (e.g. gateway UI only), the loop below runs zero times — without this, `getSkillCatalog()`\n // and delete flows still see stale in-memory skills after ~/.xopc/skills changes.\n for (const rt of this.workspaceRuntimes.values()) {\n rt.skillManager.reload();\n }\n\n const touched = new Set<string>();\n for (const instance of this.agents.values()) {\n const rt = this.getWorkspaceRuntime(instance.resolvedWorkspacePath);\n if (!touched.has(instance.resolvedWorkspacePath)) {\n touched.add(instance.resolvedWorkspacePath);\n }\n const bootstrapFiles = this.loadBootstrapForProfile(instance.effectiveProfile);\n const newPrompt = rt.systemPromptBuilder.rebuild(bootstrapFiles, {\n curatedMemorySnapshot: instance.curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: instance.resolvedWorkspacePath,\n systemPromptOverride: instance.effectiveProfile.systemPromptOverride,\n skillAllowlist: instance.effectiveProfile.skillsAllowlist,\n registeredToolNames: instance.registeredToolNames,\n });\n instance.agent.state.systemPrompt = newPrompt;\n }\n log.info({ agents: this.agents.size }, 'Skills refreshed; system prompt updated');\n }\n\n /**\n * Get or create an Agent instance for a session\n */\n getOrCreateAgent(sessionKey: string): Agent {\n const cfg = this.config.config!;\n const targetPath = this.getResolvedWorkspaceForSession(sessionKey);\n const existing = this.agents.get(sessionKey);\n if (existing) {\n if (existing.resolvedWorkspacePath !== targetPath) {\n this.removeAgent(sessionKey);\n } else {\n existing.lastUsedAt = Date.now();\n if (!existing.backgroundNudge) {\n existing.backgroundNudge = {\n turnsSinceMemory: 0,\n itersSinceSkill: 0,\n pendingMemoryReview: false,\n };\n this.attachBackgroundNudgeListeners(sessionKey);\n }\n log.debug({ sessionKey }, 'Reusing existing agent instance');\n return existing.agent;\n }\n }\n\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const resolvedPath = targetPath;\n const rt = this.getWorkspaceRuntime(resolvedPath);\n\n if (isMemorySubsystemEnabled(cfg)) {\n void rt.memoryManager\n .initializeAll(sessionKey, { workspace: resolvedPath })\n .catch((err) => log.warn({ err, sessionKey }, 'memory initializeAll failed'));\n }\n\n const curatedOn = isCuratedMemoryInPrompt(cfg);\n if (curatedOn) {\n rt.builtinMemoryStore.loadFromDiskSync();\n }\n const snap = curatedOn ? rt.builtinMemoryStore.getSnapshot() : { memory: '', user: '' };\n const curatedMemorySnapshot: MemorySnapshot = { memory: snap.memory, user: snap.user };\n\n const { agent, registeredToolNames } = this.createAgentForProfile(\n sessionKey,\n profile,\n resolvedPath,\n rt,\n curatedMemorySnapshot,\n );\n\n this.agents.set(sessionKey, {\n agent,\n sessionKey,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n curatedMemorySnapshot,\n effectiveProfile: profile,\n resolvedWorkspacePath: resolvedPath,\n registeredToolNames,\n skillEnvPassthroughKeys: new Set<string>(),\n backgroundNudge: {\n turnsSinceMemory: 0,\n itersSinceSkill: 0,\n pendingMemoryReview: false,\n },\n });\n\n this.attachBackgroundNudgeListeners(sessionKey);\n\n const modelRef = profile.primaryModelRef?.trim() || this.defaultModel;\n this.config.getModelManager?.().setSessionProfileDefault(sessionKey, modelRef);\n\n log.debug({ sessionKey, totalAgents: this.agents.size, agentId: profile.agentId }, 'Created new agent instance');\n return agent;\n }\n\n /**\n * Get existing agent for a session (if any)\n */\n getAgent(sessionKey: string): Agent | undefined {\n return this.agents.get(sessionKey)?.agent;\n }\n\n /**\n * Check if an agent exists for a session\n */\n hasAgent(sessionKey: string): boolean {\n return this.agents.has(sessionKey);\n }\n\n /**\n * Remove an agent instance\n */\n removeAgent(sessionKey: string): boolean {\n const instance = this.agents.get(sessionKey);\n if (instance) {\n instance.backgroundNudge?.unsubscribe?.();\n void this.toolsFactory.closeBrowserPageForSession(sessionKey);\n instance.agent.abort();\n this.agents.delete(sessionKey);\n this.memoryPrefetchUserTurn.delete(sessionKey);\n this.config.getModelManager?.().clearSessionProfileDefault(sessionKey);\n log.info({ sessionKey, totalAgents: this.agents.size }, 'Removed agent instance');\n return true;\n }\n return false;\n }\n\n /**\n * Get all active session keys\n */\n getActiveSessions(): string[] {\n return Array.from(this.agents.keys());\n }\n\n /**\n * Get agent count\n */\n getAgentCount(): number {\n return this.agents.size;\n }\n\n /**\n * Set thinking level for a session's agent\n */\n setThinkingLevel(sessionKey: string, level: ThinkingLevel): void {\n const instance = this.agents.get(sessionKey);\n if (instance) {\n instance.agent.state.thinkingLevel = level;\n log.debug({ sessionKey, thinkingLevel: level }, 'Set thinking level for agent');\n }\n }\n\n /**\n * Dispose all agents\n */\n dispose(): void {\n void this.toolsFactory.shutdownBrowser();\n for (const instance of this.agents.values()) {\n instance.backgroundNudge?.unsubscribe?.();\n instance.agent.abort();\n }\n this.agents.clear();\n this.memoryPrefetchUserTurn.clear();\n this.sessionWorkspaceOverrides.clear();\n for (const rt of this.workspaceRuntimes.values()) {\n void rt.memoryManager.shutdownAll().catch(() => {});\n }\n this.workspaceRuntimes.clear();\n log.debug('All agent instances disposed');\n }\n\n async warmCredentialCache(): Promise<void> {\n const profiles = await this.credentialResolver.listProfiles();\n for (const profile of profiles) {\n const secret = profile.key?.trim()\n ? profile.key.trim()\n : profile.envVar\n ? process.env[profile.envVar]?.trim()\n : undefined;\n if (secret) {\n this.credentialCache.set(profile.provider.toLowerCase(), secret);\n }\n }\n log.debug({ count: this.credentialCache.size }, 'Credential cache warmed');\n }\n\n async refreshCredentials(): Promise<void> {\n this.credentialCache.clear();\n await this.warmCredentialCache();\n }\n\n private resolveApiKeyWithCache(provider: string): string | undefined {\n const key = provider.toLowerCase();\n const cached = this.credentialCache.get(key);\n if (cached) return cached;\n\n const fromDisk = resolveProviderApiKeySync(provider);\n if (fromDisk) {\n this.credentialCache.set(key, fromDisk);\n return fromDisk;\n }\n\n const fromRegistryOrEnv = getApiKeySync(provider);\n if (fromRegistryOrEnv) {\n this.credentialCache.set(key, fromRegistryOrEnv);\n return fromRegistryOrEnv;\n }\n return undefined;\n }\n\n private createAgentForProfile(\n _sessionKey: string,\n profile: EffectiveAgentProfile,\n resolvedWorkspacePath: string,\n rt: WorkspaceRuntime,\n curatedMemorySnapshot: MemorySnapshot,\n ): { agent: Agent; registeredToolNames: string[] } {\n const modelRef = profile.primaryModelRef?.trim() || this.defaultModel;\n const model = this.resolveModelStringToModel(modelRef);\n\n const bootstrapFiles = this.loadBootstrapForProfile(profile);\n const tools = this.toolsFactory.createAllTools({\n workspace: resolvedWorkspacePath,\n bootstrapDir: resolveAgentBootstrapDir(this.config.config!, profile.agentId),\n disabledTools: profile.tools.disable,\n getPrimaryModel: () => this.resolveModelStringToModel(modelRef),\n getBuiltinMemoryStore: () => rt.builtinMemoryStore,\n getMemoryManager: () => rt.memoryManager,\n getSkillManager: () => rt.skillManager,\n });\n const registeredToolNames = tools.map((t) => t.name);\n\n const thinkingLevel =\n (profile.thinkingDefault as ThinkingLevel | undefined) ?? this.config.thinkingLevel ?? 'medium';\n\n const agent = new Agent({\n initialState: {\n systemPrompt: rt.systemPromptBuilder.build(bootstrapFiles, {\n curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: resolvedWorkspacePath,\n systemPromptOverride: profile.systemPromptOverride,\n skillAllowlist: profile.skillsAllowlist,\n registeredToolNames,\n }),\n model,\n thinkingLevel,\n tools,\n messages: [],\n },\n getApiKey: (provider: string) => this.resolveApiKeyWithCache(provider),\n });\n return { agent, registeredToolNames };\n }\n\n /**\n * Set model for a specific session\n */\n setModelForSession(sessionKey: string, modelId: string): boolean {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n log.warn(\n { sessionKey, modelId, activeSessionCount: this.agents.size },\n `setModelForSession: no agent instance for session (create session / run turn first); modelId=${modelId}`,\n );\n return false;\n }\n\n try {\n const model = resolveModel(modelId);\n instance.agent.state.model = model;\n log.info({ sessionKey, modelId }, 'Model set for session');\n return true;\n } catch (err) {\n log.error({ err, sessionKey, modelId }, 'Failed to set model for session');\n return false;\n }\n }\n\n /**\n * Get last assistant content from a session's agent\n */\n getLastAssistantContent(sessionKey: string): string | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n const messages = instance.agent.state.messages;\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant') {\n const content = msg.content;\n if (Array.isArray(content)) {\n return extractTextContent(content as Array<{ type: string; text?: string }>);\n }\n return String(content);\n }\n }\n return null;\n }\n\n /**\n * Replace messages for a session's agent\n */\n replaceMessages(sessionKey: string, messages: AgentMessage[]): boolean {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return false;\n }\n\n instance.agent.state.messages = messages;\n return true;\n }\n\n /**\n * Get messages for a session's agent\n */\n getMessages(sessionKey: string): AgentMessage[] | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n return instance.agent.state.messages;\n }\n\n /**\n * Subscribe to agent events for a session\n */\n subscribeToSession(sessionKey: string, callback: (event: AgentEvent) => void): (() => void) | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n return instance.agent.subscribe(callback);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-manager.js","names":[],"sources":["../../../src/agent/agent-manager.ts"],"sourcesContent":["/**\n * Agent Manager - Manages Agent instances per session\n *\n * Each session gets its own Agent instance for true isolation\n * and concurrent processing across sessions.\n */\n\nimport {\n Agent,\n type AgentMessage,\n type AgentEvent,\n type ThinkingLevel,\n} from '@mariozechner/pi-agent-core';\nimport type { Model, Api } from '@mariozechner/pi-ai';\nimport { type Config, getAgentDefaultModelRef } from '../config/schema.js';\nimport { applyConfigOverrides } from '../config/runtime-overrides.js';\nimport {\n type EffectiveAgentProfile,\n resolveAgentBootstrapDir,\n resolveEffectiveAgentProfileForSession,\n} from '../config/agent-profile.js';\nimport { expandWorkspacePathString } from '../config/workspace-path.js';\nimport type { ModelManager } from './models/manager.js';\nimport { createLogger } from '../utils/logger.js';\nimport { resolveProviderApiKeySync } from '../auth/sync-provider-auth.js';\nimport { resolveModel, getDefaultModelSync, getApiKeySync } from '../providers/index.js';\nimport { createExtensionAwareStreamFn } from '../providers/extension-stream-bridge.js';\nimport { CredentialResolver } from '../auth/credentials.js';\nimport { resolveBundledSkillsDir, resolveStateDir } from '../config/paths.js';\nimport { loadBootstrapFiles, extractTextContent, type BootstrapFile } from './context/workspace.js';\nimport { SkillManager } from './skills/index.js';\nimport { SystemPromptBuilder } from './prompt/service-prompt-builder.js';\nimport { AgentToolsFactory } from './tools/factory.js';\nimport type { GatewayClarifyRequestFn } from './tools/clarify-tool.js';\nimport type { ExtensionRegistryImpl as ExtensionRegistry } from '../extensions/index.js';\nimport type { MessageBus } from '../infra/bus/index.js';\nimport type { CronService } from '../cron/index.js';\nimport type { SessionStore } from '../session/store.js';\nimport { isValidSkillEnvVarName } from './skills/required-env-vars.js';\nimport type { SessionContext } from './session/session-context.js';\nimport type { Skill } from './skills/types.js';\nimport { createSkillConfigManager } from './skills/config.js';\nimport { isUnderManagedSkillsDir } from './skills/managed-store.js';\nimport { loadSkillsLock, type SkillHubLockEntry } from './skills/hub-lock.js';\nimport { readFileSync } from 'node:fs';\nimport { basename, resolve, sep } from 'node:path';\n\nimport { BuiltinMemoryStore } from './memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from './memory/create-memory-manager.js';\nimport { injectPrefetchIntoUserMessage } from './memory/inject-prefetch.js';\nimport {\n isCuratedMemoryInPrompt,\n isMemorySubsystemEnabled,\n resolveBuiltinMemoryStoreConfig,\n shouldInjectMemoryPrefetchThisTurn,\n} from './memory/memory-config.js';\nimport type { MemoryManager } from './memory/manager.js';\nimport type { MemorySnapshot } from './memory/types.js';\nimport { extractAgentUserPlainText } from './memory/user-message-text.js';\nimport { resolveBackgroundReviewSettings } from './background-review/settings.js';\nimport { runBackgroundReviewTurn } from './background-review/run-background-review.js';\nimport {\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n} from './orchestration/llm-turn-retry.js';\n\nconst log = createLogger('AgentManager');\n\n/** Counters for optional post-turn memory/skill review (see `agents.defaults.backgroundReview`). */\nexport interface BackgroundNudgeState {\n turnsSinceMemory: number;\n itersSinceSkill: number;\n pendingMemoryReview: boolean;\n unsubscribe?: () => void;\n}\n\nexport interface SkillCatalogEntry {\n directoryId: string;\n name: string;\n description: string;\n source: Skill['source'];\n path: string;\n managed: boolean;\n /** User toggle in ~/.xopc/skills.json (`entries[name].enabled`). Default true. */\n enabled: boolean;\n /** When true, skill is never injected into `<available_skills>` (SKILL.md frontmatter). */\n disableModelInvocation: boolean;\n /** Hub install provenance when under ~/.xopc/skills and listed in skills-lock.json. */\n hub?: SkillHubLockEntry;\n}\n\nexport interface AgentManagerConfig {\n workspace: string;\n model?: string;\n config?: Config;\n extensionRegistry?: ExtensionRegistry;\n bus: MessageBus;\n getCurrentContext: () => SessionContext | null;\n /** Session persistence (enables `session_search` when set). */\n getSessionStore?: () => SessionStore;\n /** Clears per-session profile default on teardown. */\n getModelManager?: () => ModelManager;\n // Thinking configuration\n thinkingLevel?: ThinkingLevel;\n reasoningLevel?: 'off' | 'on' | 'stream';\n verboseLevel?: 'off' | 'on' | 'full';\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: exposes CronService for the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n}\n\nexport interface AgentInstance {\n agent: Agent;\n sessionKey: string;\n createdAt: number;\n lastUsedAt: number;\n /** Curated agent-home `memories/` snapshot frozen at agent creation (prefix cache). */\n curatedMemorySnapshot: MemorySnapshot;\n effectiveProfile: EffectiveAgentProfile;\n resolvedWorkspacePath: string;\n /** Tool names registered on this agent (for skill indexing / tool gating). */\n registeredToolNames: string[];\n /** Declared env var names from skill_view; shell reads values from process.env at spawn time. */\n skillEnvPassthroughKeys: Set<string>;\n backgroundNudge: BackgroundNudgeState;\n}\n\ninterface WorkspaceRuntime {\n skillManager: SkillManager;\n systemPromptBuilder: SystemPromptBuilder;\n builtinMemoryStore: BuiltinMemoryStore;\n memoryManager: MemoryManager;\n}\n\nexport class AgentManager {\n private agents = new Map<string, AgentInstance>();\n private config: AgentManagerConfig;\n private toolsFactory: AgentToolsFactory;\n\n private mergedConfig(): Config | undefined {\n const base = this.config.config;\n return base ? applyConfigOverrides(base) : undefined;\n }\n /** Default agent workspace (effective profile for `getDefaultAgentId`). */\n private baseWorkspacePath: string;\n /** Per-session absolute markdown workspace when `SessionAgentConfig.workingDirectoryOverride` is set. */\n private sessionWorkspaceOverrides = new Map<string, string>();\n private defaultModel: string;\n private credentialCache = new Map<string, string>();\n private credentialResolver: CredentialResolver;\n private workspaceRuntimes = new Map<string, WorkspaceRuntime>();\n /** Per-session user-message index for prefetch injection cadence. */\n private memoryPrefetchUserTurn = new Map<string, number>();\n\n constructor(config: AgentManagerConfig) {\n this.config = config;\n this.baseWorkspacePath = this.computeBaseWorkspacePath();\n const baseRt = this.getWorkspaceRuntime(this.baseWorkspacePath);\n\n this.toolsFactory = new AgentToolsFactory({\n workspace: this.baseWorkspacePath,\n extensionRegistry: config.extensionRegistry,\n getCurrentContext: config.getCurrentContext,\n bus: config.bus,\n getConfig: () => this.mergedConfig(),\n getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),\n getBuiltinMemoryStore: () => baseRt.builtinMemoryStore,\n getMemoryManager: () => baseRt.memoryManager,\n getSessionStore: config.getSessionStore,\n gatewayClarify: config.gatewayClarify,\n getCronService: config.getCronService,\n getSkillIndexingContext: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return undefined;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return undefined;\n return {\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n };\n },\n onSkillsFilesystemMutate: () => {\n this.refreshSkillsAfterDiskChange();\n },\n getSkillPassthroughEnvVarNames: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return [];\n return [...(this.agents.get(ctx.sessionKey)?.skillEnvPassthroughKeys ?? [])];\n },\n registerSkillEnvPassthrough: (names: string[]) => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return;\n for (const n of names) {\n if (isValidSkillEnvVarName(n)) {\n inst.skillEnvPassthroughKeys.add(n.trim());\n }\n }\n },\n });\n\n this.defaultModel = config.model || getDefaultModelSync(config.config);\n\n this.credentialResolver = new CredentialResolver();\n this.warmCredentialCache().catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn({ err, errorMessage: em }, `Credential cache pre-warm failed: ${em}`);\n });\n }\n\n private computeBaseWorkspacePath(): string {\n const cfg = this.config.config;\n if (!cfg) {\n return expandWorkspacePathString(this.config.workspace);\n }\n return resolveEffectiveAgentProfileForSession(cfg, null).resolvedWorkspacePath;\n }\n\n /**\n * Workspace root for inbound attachments / side effects for this session's agent id.\n * Uses in-memory session workspace overrides when the session has a persisted `workingDirectoryOverride`.\n */\n getResolvedWorkspaceForSession(sessionKey: string): string {\n const cfg = this.config.config!;\n const fromMap = this.sessionWorkspaceOverrides.get(sessionKey);\n if (fromMap !== undefined) {\n return fromMap;\n }\n return resolveEffectiveAgentProfileForSession(cfg, sessionKey).resolvedWorkspacePath;\n }\n\n /**\n * Sync in-memory workspace override from session config (after load or PATCH).\n * Pass `null` to clear when the session has no `workingDirectoryOverride` on disk.\n */\n setSessionWorkspaceOverride(sessionKey: string, absolutePath: string | null): void {\n if (absolutePath === null || absolutePath === '') {\n this.sessionWorkspaceOverrides.delete(sessionKey);\n } else {\n this.sessionWorkspaceOverrides.set(sessionKey, absolutePath);\n }\n }\n\n /** Merged `thinkingDefault` for this session's agent id (defaults + `agents.list`). */\n getThinkingDefaultForSession(\n sessionKey: string,\n ): import('./transcript/thinking-types.js').ThinkLevel | undefined {\n const cfg = this.mergedConfig();\n if (!cfg) {\n return undefined;\n }\n return resolveEffectiveAgentProfileForSession(cfg, sessionKey).thinkingDefault;\n }\n\n private getWorkspaceRuntime(resolvedPath: string): WorkspaceRuntime {\n const existing = this.workspaceRuntimes.get(resolvedPath);\n if (existing) {\n return existing;\n }\n\n const builtinMemoryStore = new BuiltinMemoryStore(\n resolveBuiltinMemoryStoreConfig(resolvedPath, this.config.config),\n );\n const memoryManager = createMemoryManagerFromConfig(\n resolvedPath,\n builtinMemoryStore,\n this.config.config,\n );\n const skillManager = new SkillManager(resolvedPath, resolveBundledSkillsDir());\n const systemPromptBuilder = new SystemPromptBuilder({\n workspace: resolvedPath,\n config: this.config.config!,\n skillManager,\n });\n\n const rt: WorkspaceRuntime = {\n skillManager,\n systemPromptBuilder,\n builtinMemoryStore,\n memoryManager,\n };\n this.workspaceRuntimes.set(resolvedPath, rt);\n return rt;\n }\n\n private pickDefaultModelRef(): string {\n const cfg = this.mergedConfig();\n const ref = getAgentDefaultModelRef(cfg);\n return ref?.trim() || getDefaultModelSync(cfg);\n }\n\n private resolveModelStringToModel(modelRef: string): Model<Api> {\n try {\n return resolveModel(modelRef);\n } catch {\n const fallback = getDefaultModelSync(this.mergedConfig());\n log.warn({ modelRef, fallback }, 'Model not found, using default');\n return resolveModel(fallback);\n }\n }\n\n /**\n * Keep defaults in sync when config is hot-reloaded or saved from the UI.\n */\n updateAgentDefaults(config: Config): void {\n this.config.config = config;\n const ref = getAgentDefaultModelRef(config);\n this.config.model = ref;\n this.defaultModel = ref || getDefaultModelSync(config);\n this.baseWorkspacePath = this.computeBaseWorkspacePath();\n void this.toolsFactory.shutdownBrowser();\n for (const rt of this.workspaceRuntimes.values()) {\n void rt.memoryManager.shutdownAll().catch(() => {});\n }\n this.workspaceRuntimes.clear();\n this.toolsFactory = new AgentToolsFactory({\n workspace: this.baseWorkspacePath,\n extensionRegistry: this.config.extensionRegistry,\n getCurrentContext: this.config.getCurrentContext,\n bus: this.config.bus,\n getConfig: () => this.mergedConfig(),\n getPrimaryModel: () => this.resolveModelStringToModel(this.pickDefaultModelRef()),\n getBuiltinMemoryStore: () => this.getWorkspaceRuntime(this.baseWorkspacePath).builtinMemoryStore,\n getMemoryManager: () => this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager,\n getSessionStore: this.config.getSessionStore,\n gatewayClarify: this.config.gatewayClarify,\n getCronService: this.config.getCronService,\n getSkillIndexingContext: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return undefined;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return undefined;\n return {\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n };\n },\n onSkillsFilesystemMutate: () => {\n this.refreshSkillsAfterDiskChange();\n },\n getSkillPassthroughEnvVarNames: () => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return [];\n return [...(this.agents.get(ctx.sessionKey)?.skillEnvPassthroughKeys ?? [])];\n },\n registerSkillEnvPassthrough: (names: string[]) => {\n const ctx = this.config.getCurrentContext?.();\n if (!ctx?.sessionKey) return;\n const inst = this.agents.get(ctx.sessionKey);\n if (!inst) return;\n for (const n of names) {\n if (isValidSkillEnvVarName(n)) {\n inst.skillEnvPassthroughKeys.add(n.trim());\n }\n }\n },\n });\n }\n\n getMemoryManager(): MemoryManager {\n return this.getWorkspaceRuntime(this.baseWorkspacePath).memoryManager;\n }\n\n private getMemoryManagerForSession(sessionKey: string): MemoryManager {\n const path = this.getResolvedWorkspaceForSession(sessionKey);\n return this.getWorkspaceRuntime(path).memoryManager;\n }\n\n /**\n * Prefix the user turn with fenced prefetched memory (external providers).\n */\n async applyMemoryPrefetchToUserMessage(\n userMessage: AgentMessage,\n sessionKey: string,\n ): Promise<AgentMessage> {\n if (!isMemorySubsystemEnabled(this.config.config)) {\n return userMessage;\n }\n const plain = extractAgentUserPlainText(userMessage);\n const turn = (this.memoryPrefetchUserTurn.get(sessionKey) ?? 0) + 1;\n this.memoryPrefetchUserTurn.set(sessionKey, turn);\n if (!shouldInjectMemoryPrefetchThisTurn(this.config.config, turn)) {\n return userMessage;\n }\n return injectPrefetchIntoUserMessage(\n this.getMemoryManagerForSession(sessionKey),\n sessionKey,\n userMessage,\n plain,\n );\n }\n\n /**\n * After a completed turn: sync external providers and queue next-turn prefetch.\n */\n afterAgentTurn(sessionKey: string, userPlainText: string): void {\n if (!isMemorySubsystemEnabled(this.config.config)) {\n return;\n }\n const assistant = this.getLastAssistantContent(sessionKey) ?? '';\n const mm = this.getMemoryManagerForSession(sessionKey);\n mm.syncAll(userPlainText, assistant, { sessionId: sessionKey });\n mm.queuePrefetchAll(userPlainText, { sessionId: sessionKey });\n }\n\n /**\n * Call once per user turn before the main `agent.prompt` (via {@link runAgentTurnWithModelFallbacks} `beforeUserPrompt`).\n */\n beginBackgroundReviewUserTurn(sessionKey: string): void {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n const cfg = resolveBackgroundReviewSettings(this.config.config);\n if (!cfg.enabled || cfg.memoryNudgeInterval <= 0) return;\n if (!inst.registeredToolNames.includes('curated_memory')) return;\n inst.backgroundNudge.turnsSinceMemory += 1;\n if (inst.backgroundNudge.turnsSinceMemory >= cfg.memoryNudgeInterval) {\n inst.backgroundNudge.pendingMemoryReview = true;\n inst.backgroundNudge.turnsSinceMemory = 0;\n }\n }\n\n /**\n * After a successful main turn (after memory sync via `afterAgentTurn`), may run a quiet follow-up for memory/skills.\n */\n scheduleBackgroundReviewAfterUserTurn(sessionKey: string): void {\n void this.runBackgroundReviewIfNeeded(sessionKey).catch((err) => {\n log.warn({ err, sessionKey }, 'Background review failed');\n });\n }\n\n private async runBackgroundReviewIfNeeded(sessionKey: string): Promise<void> {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n const settings = resolveBackgroundReviewSettings(this.config.config);\n if (!settings.enabled) return;\n if (isAssistantTurnAborted(inst.agent) || isAssistantTurnFailed(inst.agent)) return;\n const last = this.getLastAssistantContent(sessionKey);\n if (!last?.trim()) return;\n\n const reviewMemory = inst.backgroundNudge.pendingMemoryReview;\n inst.backgroundNudge.pendingMemoryReview = false;\n\n let reviewSkills = false;\n if (settings.skillNudgeInterval > 0 && inst.registeredToolNames.includes('skill_manage')) {\n if (inst.backgroundNudge.itersSinceSkill >= settings.skillNudgeInterval) {\n reviewSkills = true;\n inst.backgroundNudge.itersSinceSkill = 0;\n }\n }\n\n if (!reviewMemory && !reviewSkills) return;\n\n const rt = this.getWorkspaceRuntime(inst.resolvedWorkspacePath);\n await runBackgroundReviewTurn({\n sessionKey,\n mainAgent: inst.agent,\n settings,\n reviewMemory,\n reviewSkills,\n registeredToolNames: inst.registeredToolNames,\n skillAllowlist: inst.effectiveProfile.skillsAllowlist,\n workspacePath: inst.resolvedWorkspacePath,\n skillManager: rt.skillManager,\n builtinMemoryStore: rt.builtinMemoryStore,\n memoryManager: rt.memoryManager,\n getConfig: () => this.mergedConfig(),\n onSkillsFilesystemMutate: () => this.refreshSkillsAfterDiskChange(),\n });\n }\n\n private attachBackgroundNudgeListeners(sessionKey: string): void {\n const inst = this.agents.get(sessionKey);\n if (!inst?.backgroundNudge) return;\n inst.backgroundNudge.unsubscribe?.();\n const unsub = inst.agent.subscribe((ev: AgentEvent) => {\n const cfg = resolveBackgroundReviewSettings(this.config.config);\n if (!cfg.enabled || cfg.skillNudgeInterval <= 0) return;\n if (!inst.registeredToolNames.includes('skill_manage')) return;\n if (ev.type === 'turn_start') {\n inst.backgroundNudge.itersSinceSkill += 1;\n }\n if (ev.type === 'tool_execution_end') {\n const te = ev as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n if (\n !te.isError &&\n typeof te.toolName === 'string' &&\n te.toolName.trim() === 'skill_manage'\n ) {\n inst.backgroundNudge.itersSinceSkill = 0;\n }\n }\n });\n inst.backgroundNudge.unsubscribe = unsub;\n }\n\n /**\n * Expand `/skill:name` user text into the full skill block for the current turn (WebChat, channels).\n */\n expandSkillUserText(text: string): string {\n const ctx = this.config.getCurrentContext?.();\n const path = ctx?.sessionKey\n ? this.getResolvedWorkspaceForSession(ctx.sessionKey)\n : this.baseWorkspacePath;\n return this.getWorkspaceRuntime(path).skillManager.expandCommand(text);\n }\n\n /**\n * Read raw SKILL.md from disk (including frontmatter) for UI preview.\n */\n getSkillMarkdownSource(skillName: string): { name: string; markdown: string } | null {\n const skill = this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.findSkill(skillName);\n if (!skill) return null;\n try {\n const markdown = readFileSync(skill.filePath, 'utf-8');\n return { name: skill.name, markdown };\n } catch (err) {\n log.warn({ err, skillName, path: skill.filePath }, 'Failed to read SKILL.md');\n return null;\n }\n }\n\n private loadBootstrapForProfile(profile: EffectiveAgentProfile): BootstrapFile[] {\n const cfg = this.config.config!;\n const bootstrapDir = resolveAgentBootstrapDir(cfg, profile.agentId);\n return loadBootstrapFiles(bootstrapDir);\n }\n\n getSkillCatalog(): SkillCatalogEntry[] {\n const skillsConfig = createSkillConfigManager(resolveStateDir()).load();\n const lock = loadSkillsLock();\n return this.getWorkspaceRuntime(this.baseWorkspacePath).skillManager.getSkills().map((s) => {\n const base = resolve(s.baseDir);\n const managed = isUnderManagedSkillsDir(s.baseDir);\n const directoryId = base.split(sep).filter(Boolean).pop() || s.name;\n const enabled = !(skillsConfig.entries?.[s.name]?.enabled === false);\n const hubKey = managed ? basename(base) : '';\n const hub = managed && hubKey ? lock.entries[hubKey] : undefined;\n return {\n directoryId,\n name: s.name,\n description: s.description,\n source: s.source,\n path: s.baseDir,\n managed,\n enabled,\n disableModelInvocation: s.disableModelInvocation,\n ...(hub ? { hub } : {}),\n };\n });\n }\n\n /**\n * After ~/.xopc/skills.json changes (enable/disable), refresh `<available_skills>` on active agents.\n */\n refreshSkillsAfterSkillConfigChange(): void {\n const touched = new Set<string>();\n for (const instance of this.agents.values()) {\n const rt = this.getWorkspaceRuntime(instance.resolvedWorkspacePath);\n if (!touched.has(instance.resolvedWorkspacePath)) {\n rt.skillManager.refreshPromptFromConfig();\n touched.add(instance.resolvedWorkspacePath);\n }\n const bootstrapFiles = this.loadBootstrapForProfile(instance.effectiveProfile);\n const newPrompt = rt.systemPromptBuilder.build(bootstrapFiles, {\n curatedMemorySnapshot: instance.curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: instance.resolvedWorkspacePath,\n systemPromptOverride: instance.effectiveProfile.systemPromptOverride,\n skillAllowlist: instance.effectiveProfile.skillsAllowlist,\n registeredToolNames: instance.registeredToolNames,\n });\n instance.agent.state.systemPrompt = newPrompt;\n }\n log.info({ agents: this.agents.size }, 'Skill toggles applied; system prompt updated');\n }\n\n /**\n * Reload skills from disk and refresh system prompt on all active Agent instances.\n */\n refreshSkillsAfterDiskChange(): void {\n // Reload every workspace SkillManager first. When there are no active agent sessions\n // (e.g. gateway UI only), the loop below runs zero times — without this, `getSkillCatalog()`\n // and delete flows still see stale in-memory skills after ~/.xopc/skills changes.\n for (const rt of this.workspaceRuntimes.values()) {\n rt.skillManager.reload();\n }\n\n const touched = new Set<string>();\n for (const instance of this.agents.values()) {\n const rt = this.getWorkspaceRuntime(instance.resolvedWorkspacePath);\n if (!touched.has(instance.resolvedWorkspacePath)) {\n touched.add(instance.resolvedWorkspacePath);\n }\n const bootstrapFiles = this.loadBootstrapForProfile(instance.effectiveProfile);\n const newPrompt = rt.systemPromptBuilder.rebuild(bootstrapFiles, {\n curatedMemorySnapshot: instance.curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: instance.resolvedWorkspacePath,\n systemPromptOverride: instance.effectiveProfile.systemPromptOverride,\n skillAllowlist: instance.effectiveProfile.skillsAllowlist,\n registeredToolNames: instance.registeredToolNames,\n });\n instance.agent.state.systemPrompt = newPrompt;\n }\n log.info({ agents: this.agents.size }, 'Skills refreshed; system prompt updated');\n }\n\n /**\n * Get or create an Agent instance for a session\n */\n getOrCreateAgent(sessionKey: string): Agent {\n const cfg = this.config.config!;\n const targetPath = this.getResolvedWorkspaceForSession(sessionKey);\n const existing = this.agents.get(sessionKey);\n if (existing) {\n if (existing.resolvedWorkspacePath !== targetPath) {\n this.removeAgent(sessionKey);\n } else {\n existing.lastUsedAt = Date.now();\n if (!existing.backgroundNudge) {\n existing.backgroundNudge = {\n turnsSinceMemory: 0,\n itersSinceSkill: 0,\n pendingMemoryReview: false,\n };\n this.attachBackgroundNudgeListeners(sessionKey);\n }\n log.debug({ sessionKey }, 'Reusing existing agent instance');\n return existing.agent;\n }\n }\n\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const resolvedPath = targetPath;\n const rt = this.getWorkspaceRuntime(resolvedPath);\n\n if (isMemorySubsystemEnabled(cfg)) {\n void rt.memoryManager\n .initializeAll(sessionKey, { workspace: resolvedPath })\n .catch((err) => log.warn({ err, sessionKey }, 'memory initializeAll failed'));\n }\n\n const curatedOn = isCuratedMemoryInPrompt(cfg);\n if (curatedOn) {\n rt.builtinMemoryStore.loadFromDiskSync();\n }\n const snap = curatedOn ? rt.builtinMemoryStore.getSnapshot() : { memory: '', user: '' };\n const curatedMemorySnapshot: MemorySnapshot = { memory: snap.memory, user: snap.user };\n\n const { agent, registeredToolNames } = this.createAgentForProfile(\n sessionKey,\n profile,\n resolvedPath,\n rt,\n curatedMemorySnapshot,\n );\n\n this.agents.set(sessionKey, {\n agent,\n sessionKey,\n createdAt: Date.now(),\n lastUsedAt: Date.now(),\n curatedMemorySnapshot,\n effectiveProfile: profile,\n resolvedWorkspacePath: resolvedPath,\n registeredToolNames,\n skillEnvPassthroughKeys: new Set<string>(),\n backgroundNudge: {\n turnsSinceMemory: 0,\n itersSinceSkill: 0,\n pendingMemoryReview: false,\n },\n });\n\n this.attachBackgroundNudgeListeners(sessionKey);\n\n const modelRef = profile.primaryModelRef?.trim() || this.defaultModel;\n this.config.getModelManager?.().setSessionProfileDefault(sessionKey, modelRef);\n\n log.debug({ sessionKey, totalAgents: this.agents.size, agentId: profile.agentId }, 'Created new agent instance');\n return agent;\n }\n\n /**\n * Get existing agent for a session (if any)\n */\n getAgent(sessionKey: string): Agent | undefined {\n return this.agents.get(sessionKey)?.agent;\n }\n\n /**\n * Check if an agent exists for a session\n */\n hasAgent(sessionKey: string): boolean {\n return this.agents.has(sessionKey);\n }\n\n /**\n * Remove an agent instance\n */\n removeAgent(sessionKey: string): boolean {\n const instance = this.agents.get(sessionKey);\n if (instance) {\n instance.backgroundNudge?.unsubscribe?.();\n void this.toolsFactory.closeBrowserPageForSession(sessionKey);\n instance.agent.abort();\n this.agents.delete(sessionKey);\n this.memoryPrefetchUserTurn.delete(sessionKey);\n this.config.getModelManager?.().clearSessionProfileDefault(sessionKey);\n log.info({ sessionKey, totalAgents: this.agents.size }, 'Removed agent instance');\n return true;\n }\n return false;\n }\n\n /**\n * Get all active session keys\n */\n getActiveSessions(): string[] {\n return Array.from(this.agents.keys());\n }\n\n /**\n * Get agent count\n */\n getAgentCount(): number {\n return this.agents.size;\n }\n\n /**\n * Set thinking level for a session's agent\n */\n setThinkingLevel(sessionKey: string, level: ThinkingLevel): void {\n const instance = this.agents.get(sessionKey);\n if (instance) {\n instance.agent.state.thinkingLevel = level;\n log.debug({ sessionKey, thinkingLevel: level }, 'Set thinking level for agent');\n }\n }\n\n /**\n * Dispose all agents\n */\n dispose(): void {\n void this.toolsFactory.shutdownBrowser();\n for (const instance of this.agents.values()) {\n instance.backgroundNudge?.unsubscribe?.();\n instance.agent.abort();\n }\n this.agents.clear();\n this.memoryPrefetchUserTurn.clear();\n this.sessionWorkspaceOverrides.clear();\n for (const rt of this.workspaceRuntimes.values()) {\n void rt.memoryManager.shutdownAll().catch(() => {});\n }\n this.workspaceRuntimes.clear();\n log.debug('All agent instances disposed');\n }\n\n async warmCredentialCache(): Promise<void> {\n const profiles = await this.credentialResolver.listProfiles();\n for (const profile of profiles) {\n const secret = profile.key?.trim()\n ? profile.key.trim()\n : profile.envVar\n ? process.env[profile.envVar]?.trim()\n : undefined;\n if (secret) {\n this.credentialCache.set(profile.provider.toLowerCase(), secret);\n }\n }\n log.debug({ count: this.credentialCache.size }, 'Credential cache warmed');\n }\n\n async refreshCredentials(): Promise<void> {\n this.credentialCache.clear();\n await this.warmCredentialCache();\n }\n\n private resolveApiKeyWithCache(provider: string): string | undefined {\n const key = provider.toLowerCase();\n const cached = this.credentialCache.get(key);\n if (cached) return cached;\n\n const fromDisk = resolveProviderApiKeySync(provider);\n if (fromDisk) {\n this.credentialCache.set(key, fromDisk);\n return fromDisk;\n }\n\n const fromRegistryOrEnv = getApiKeySync(provider);\n if (fromRegistryOrEnv) {\n this.credentialCache.set(key, fromRegistryOrEnv);\n return fromRegistryOrEnv;\n }\n return undefined;\n }\n\n private createAgentForProfile(\n _sessionKey: string,\n profile: EffectiveAgentProfile,\n resolvedWorkspacePath: string,\n rt: WorkspaceRuntime,\n curatedMemorySnapshot: MemorySnapshot,\n ): { agent: Agent; registeredToolNames: string[] } {\n const modelRef = profile.primaryModelRef?.trim() || this.defaultModel;\n const model = this.resolveModelStringToModel(modelRef);\n\n const bootstrapFiles = this.loadBootstrapForProfile(profile);\n const tools = this.toolsFactory.createAllTools({\n workspace: resolvedWorkspacePath,\n bootstrapDir: resolveAgentBootstrapDir(this.config.config!, profile.agentId),\n disabledTools: profile.tools.disable,\n getPrimaryModel: () => this.resolveModelStringToModel(modelRef),\n getBuiltinMemoryStore: () => rt.builtinMemoryStore,\n getMemoryManager: () => rt.memoryManager,\n getSkillManager: () => rt.skillManager,\n });\n const registeredToolNames = tools.map((t) => t.name);\n\n const thinkingLevel =\n (profile.thinkingDefault as ThinkingLevel | undefined) ?? this.config.thinkingLevel ?? 'medium';\n\n const agent = new Agent({\n initialState: {\n systemPrompt: rt.systemPromptBuilder.build(bootstrapFiles, {\n curatedMemorySnapshot,\n externalMemoryInstructions: rt.memoryManager.buildExternalSystemPrompt(),\n workspaceOverride: resolvedWorkspacePath,\n systemPromptOverride: profile.systemPromptOverride,\n skillAllowlist: profile.skillsAllowlist,\n registeredToolNames,\n }),\n model,\n thinkingLevel,\n tools,\n messages: [],\n },\n streamFn: createExtensionAwareStreamFn(),\n getApiKey: (provider: string) => this.resolveApiKeyWithCache(provider),\n });\n return { agent, registeredToolNames };\n }\n\n /**\n * Set model for a specific session\n */\n setModelForSession(sessionKey: string, modelId: string): boolean {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n log.warn(\n { sessionKey, modelId, activeSessionCount: this.agents.size },\n `setModelForSession: no agent instance for session (create session / run turn first); modelId=${modelId}`,\n );\n return false;\n }\n\n try {\n const model = resolveModel(modelId);\n instance.agent.state.model = model;\n log.info({ sessionKey, modelId }, 'Model set for session');\n return true;\n } catch (err) {\n log.error({ err, sessionKey, modelId }, 'Failed to set model for session');\n return false;\n }\n }\n\n /**\n * Get last assistant content from a session's agent\n */\n getLastAssistantContent(sessionKey: string): string | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n const messages = instance.agent.state.messages;\n for (let i = messages.length - 1; i >= 0; i--) {\n const msg = messages[i];\n if (msg.role === 'assistant') {\n const content = msg.content;\n if (Array.isArray(content)) {\n return extractTextContent(content as Array<{ type: string; text?: string }>);\n }\n return String(content);\n }\n }\n return null;\n }\n\n /**\n * Replace messages for a session's agent\n */\n replaceMessages(sessionKey: string, messages: AgentMessage[]): boolean {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return false;\n }\n\n instance.agent.state.messages = messages;\n return true;\n }\n\n /**\n * Get messages for a session's agent\n */\n getMessages(sessionKey: string): AgentMessage[] | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n return instance.agent.state.messages;\n }\n\n /**\n * Subscribe to agent events for a session\n */\n subscribeToSession(sessionKey: string, callback: (event: AgentEvent) => void): (() => void) | null {\n const instance = this.agents.get(sessionKey);\n if (!instance) {\n return null;\n }\n\n return instance.agent.subscribe(callback);\n }\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { createLogger } from "../../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
3
|
import { init_sync_provider_auth, resolveProviderApiKeySync } from "../../auth/sync-provider-auth.js";
|
|
4
4
|
import { getApiKeySync, init_providers } from "../../providers/index.js";
|
|
5
|
+
import { createExtensionAwareStreamFn } from "../../providers/extension-stream-bridge.js";
|
|
5
6
|
import { extractTextContent } from "../context/workspace.js";
|
|
6
7
|
import { createCuratedMemoryTool } from "../tools/curated-memory-tool.js";
|
|
7
8
|
import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "../orchestration/run-agent-turn-with-timeout.js";
|
|
@@ -61,6 +62,7 @@ async function runBackgroundReviewTurn(params) {
|
|
|
61
62
|
tools,
|
|
62
63
|
messages: []
|
|
63
64
|
},
|
|
65
|
+
streamFn: createExtensionAwareStreamFn(),
|
|
64
66
|
getApiKey: (provider) => resolveProviderApiKeySync(provider) ?? getApiKeySync(provider) ?? "",
|
|
65
67
|
beforeToolCall: async () => {
|
|
66
68
|
if (aborted) return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"run-background-review.js","names":[],"sources":["../../../../src/agent/background-review/run-background-review.ts"],"sourcesContent":["import { Agent, type AgentMessage, type AgentTool, type ThinkingLevel } from '@mariozechner/pi-agent-core';\nimport type { Api, Model } from '@mariozechner/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveProviderApiKeySync } from '../../auth/sync-provider-auth.js';\nimport { getApiKeySync } from '../../providers/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport { extractTextContent } from '../context/workspace.js';\nimport type { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport {\n runAgentTurnWithTimeout,\n resolveAgentTurnTimeoutMs,\n} from '../orchestration/run-agent-turn-with-timeout.js';\nimport {\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n} from '../orchestration/llm-turn-retry.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { createCuratedMemoryTool } from '../tools/curated-memory-tool.js';\nimport { createSkillManageTool } from '../tools/skill-manage-tool.js';\nimport { createSkillsListTool, createSkillViewTool } from '../tools/skills-tools.js';\nimport { wrapToolsWithProtection } from '../tools/executor.js';\n\nimport type { BackgroundReviewSettings } from './settings.js';\nimport {\n COMBINED_REVIEW_USER_PROMPT,\n MEMORY_REVIEW_USER_PROMPT,\n REVIEW_SYSTEM_PROMPT,\n SKILL_REVIEW_USER_PROMPT,\n} from './prompts.js';\n\nconst log = createLogger('BackgroundReview');\n\nfunction cloneMessageTail(messages: AgentMessage[], max: number): AgentMessage[] {\n const tail = messages.length <= max ? messages : messages.slice(-max);\n return JSON.parse(JSON.stringify(tail)) as AgentMessage[];\n}\n\nexport interface RunBackgroundReviewParams {\n sessionKey: string;\n mainAgent: Agent;\n settings: BackgroundReviewSettings;\n reviewMemory: boolean;\n reviewSkills: boolean;\n registeredToolNames: string[];\n skillAllowlist?: string[];\n workspacePath: string;\n skillManager: SkillManager;\n builtinMemoryStore: BuiltinMemoryStore;\n memoryManager: MemoryManager;\n getConfig: () => Config | undefined;\n onSkillsFilesystemMutate: () => void;\n}\n\nexport async function runBackgroundReviewTurn(params: RunBackgroundReviewParams): Promise<void> {\n const {\n sessionKey,\n mainAgent,\n settings,\n reviewMemory,\n reviewSkills,\n registeredToolNames,\n skillAllowlist,\n workspacePath,\n skillManager,\n builtinMemoryStore,\n memoryManager,\n getConfig,\n onSkillsFilesystemMutate,\n } = params;\n\n const userPrompt =\n reviewMemory && reviewSkills\n ? COMBINED_REVIEW_USER_PROMPT\n : reviewMemory\n ? MEMORY_REVIEW_USER_PROMPT\n : SKILL_REVIEW_USER_PROMPT;\n\n const rawTools: AgentTool<any, any>[] = [];\n\n if (reviewMemory && shouldRegisterCuratedMemoryTool(getConfig())) {\n rawTools.push(\n createCuratedMemoryTool(() => builtinMemoryStore, {\n onMemoryWrite: (action, target, content) => {\n memoryManager.onMemoryWrite(action, target, content);\n },\n }),\n );\n }\n\n if (reviewSkills) {\n const ctx = () => ({ registeredToolNames, skillAllowlist });\n rawTools.push(\n createSkillsListTool({\n getSkillManager: () => skillManager,\n getSkillIndexingContext: ctx,\n }),\n createSkillViewTool({\n getSkillManager: () => skillManager,\n getSkillIndexingContext: ctx,\n }),\n createSkillManageTool({\n getSkillManager: () => skillManager,\n getWorkspace: () => workspacePath,\n onSkillsFilesystemMutate,\n }),\n );\n }\n\n if (rawTools.length === 0) {\n log.debug({ sessionKey }, 'Background review skipped: no tools registered for selected channels');\n return;\n }\n\n const tools = wrapToolsWithProtection(rawTools, {});\n\n const model = mainAgent.state.model as Model<Api>;\n let toolRounds = 0;\n let aborted = false;\n\n const reviewAgent = new Agent({\n initialState: {\n systemPrompt: REVIEW_SYSTEM_PROMPT,\n model,\n thinkingLevel: 'off' as ThinkingLevel,\n tools,\n messages: [],\n },\n getApiKey: (provider: string) =>\n resolveProviderApiKeySync(provider) ?? getApiKeySync(provider) ?? '',\n beforeToolCall: async () => {\n if (aborted) {\n return { block: true, reason: 'Background review aborted.' };\n }\n if (toolRounds >= settings.maxToolRounds) {\n return {\n block: true,\n reason: `Background review reached max tool rounds (${settings.maxToolRounds}).`,\n };\n }\n return undefined;\n },\n afterToolCall: async () => {\n toolRounds += 1;\n return undefined;\n },\n });\n\n reviewAgent.state.messages = cloneMessageTail(mainAgent.state.messages, settings.maxHistoryMessages);\n\n const timeoutMs = Math.min(settings.maxDurationMs, resolveAgentTurnTimeoutMs(getConfig()));\n\n try {\n await runAgentTurnWithTimeout(\n reviewAgent,\n async () => {\n await reviewAgent.prompt({\n role: 'user',\n content: userPrompt,\n timestamp: Date.now(),\n });\n await reviewAgent.waitForIdle();\n },\n timeoutMs,\n );\n } catch (err) {\n log.warn({ err, sessionKey }, 'Background review turn failed or timed out');\n aborted = true;\n reviewAgent.abort();\n await reviewAgent.waitForIdle().catch(() => {});\n return;\n }\n\n if (isAssistantTurnAborted(reviewAgent) || isAssistantTurnFailed(reviewAgent)) {\n log.debug({ sessionKey }, 'Background review produced aborted/failed assistant turn');\n return;\n }\n\n const last = reviewAgent.state.messages;\n for (let i = last.length - 1; i >= 0; i--) {\n const msg = last[i];\n if (msg.role === 'assistant') {\n const content = msg.content;\n const text = Array.isArray(content)\n ? extractTextContent(content as Array<{ type: string; text?: string }>)\n : String(content);\n const trimmed = text.trim();\n if (trimmed && !/^nothing to save\\.?$/i.test(trimmed)) {\n log.info({ sessionKey, preview: trimmed.slice(0, 120) }, 'Background review completed');\n } else {\n log.debug({ sessionKey }, 'Background review: nothing to save');\n }\n return;\n }\n }\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"run-background-review.js","names":[],"sources":["../../../../src/agent/background-review/run-background-review.ts"],"sourcesContent":["import { Agent, type AgentMessage, type AgentTool, type ThinkingLevel } from '@mariozechner/pi-agent-core';\nimport type { Api, Model } from '@mariozechner/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveProviderApiKeySync } from '../../auth/sync-provider-auth.js';\nimport { getApiKeySync } from '../../providers/index.js';\nimport { createExtensionAwareStreamFn } from '../../providers/extension-stream-bridge.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport { extractTextContent } from '../context/workspace.js';\nimport type { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport {\n runAgentTurnWithTimeout,\n resolveAgentTurnTimeoutMs,\n} from '../orchestration/run-agent-turn-with-timeout.js';\nimport {\n isAssistantTurnAborted,\n isAssistantTurnFailed,\n} from '../orchestration/llm-turn-retry.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { createCuratedMemoryTool } from '../tools/curated-memory-tool.js';\nimport { createSkillManageTool } from '../tools/skill-manage-tool.js';\nimport { createSkillsListTool, createSkillViewTool } from '../tools/skills-tools.js';\nimport { wrapToolsWithProtection } from '../tools/executor.js';\n\nimport type { BackgroundReviewSettings } from './settings.js';\nimport {\n COMBINED_REVIEW_USER_PROMPT,\n MEMORY_REVIEW_USER_PROMPT,\n REVIEW_SYSTEM_PROMPT,\n SKILL_REVIEW_USER_PROMPT,\n} from './prompts.js';\n\nconst log = createLogger('BackgroundReview');\n\nfunction cloneMessageTail(messages: AgentMessage[], max: number): AgentMessage[] {\n const tail = messages.length <= max ? messages : messages.slice(-max);\n return JSON.parse(JSON.stringify(tail)) as AgentMessage[];\n}\n\nexport interface RunBackgroundReviewParams {\n sessionKey: string;\n mainAgent: Agent;\n settings: BackgroundReviewSettings;\n reviewMemory: boolean;\n reviewSkills: boolean;\n registeredToolNames: string[];\n skillAllowlist?: string[];\n workspacePath: string;\n skillManager: SkillManager;\n builtinMemoryStore: BuiltinMemoryStore;\n memoryManager: MemoryManager;\n getConfig: () => Config | undefined;\n onSkillsFilesystemMutate: () => void;\n}\n\nexport async function runBackgroundReviewTurn(params: RunBackgroundReviewParams): Promise<void> {\n const {\n sessionKey,\n mainAgent,\n settings,\n reviewMemory,\n reviewSkills,\n registeredToolNames,\n skillAllowlist,\n workspacePath,\n skillManager,\n builtinMemoryStore,\n memoryManager,\n getConfig,\n onSkillsFilesystemMutate,\n } = params;\n\n const userPrompt =\n reviewMemory && reviewSkills\n ? COMBINED_REVIEW_USER_PROMPT\n : reviewMemory\n ? MEMORY_REVIEW_USER_PROMPT\n : SKILL_REVIEW_USER_PROMPT;\n\n const rawTools: AgentTool<any, any>[] = [];\n\n if (reviewMemory && shouldRegisterCuratedMemoryTool(getConfig())) {\n rawTools.push(\n createCuratedMemoryTool(() => builtinMemoryStore, {\n onMemoryWrite: (action, target, content) => {\n memoryManager.onMemoryWrite(action, target, content);\n },\n }),\n );\n }\n\n if (reviewSkills) {\n const ctx = () => ({ registeredToolNames, skillAllowlist });\n rawTools.push(\n createSkillsListTool({\n getSkillManager: () => skillManager,\n getSkillIndexingContext: ctx,\n }),\n createSkillViewTool({\n getSkillManager: () => skillManager,\n getSkillIndexingContext: ctx,\n }),\n createSkillManageTool({\n getSkillManager: () => skillManager,\n getWorkspace: () => workspacePath,\n onSkillsFilesystemMutate,\n }),\n );\n }\n\n if (rawTools.length === 0) {\n log.debug({ sessionKey }, 'Background review skipped: no tools registered for selected channels');\n return;\n }\n\n const tools = wrapToolsWithProtection(rawTools, {});\n\n const model = mainAgent.state.model as Model<Api>;\n let toolRounds = 0;\n let aborted = false;\n\n const reviewAgent = new Agent({\n initialState: {\n systemPrompt: REVIEW_SYSTEM_PROMPT,\n model,\n thinkingLevel: 'off' as ThinkingLevel,\n tools,\n messages: [],\n },\n streamFn: createExtensionAwareStreamFn(),\n getApiKey: (provider: string) =>\n resolveProviderApiKeySync(provider) ?? getApiKeySync(provider) ?? '',\n beforeToolCall: async () => {\n if (aborted) {\n return { block: true, reason: 'Background review aborted.' };\n }\n if (toolRounds >= settings.maxToolRounds) {\n return {\n block: true,\n reason: `Background review reached max tool rounds (${settings.maxToolRounds}).`,\n };\n }\n return undefined;\n },\n afterToolCall: async () => {\n toolRounds += 1;\n return undefined;\n },\n });\n\n reviewAgent.state.messages = cloneMessageTail(mainAgent.state.messages, settings.maxHistoryMessages);\n\n const timeoutMs = Math.min(settings.maxDurationMs, resolveAgentTurnTimeoutMs(getConfig()));\n\n try {\n await runAgentTurnWithTimeout(\n reviewAgent,\n async () => {\n await reviewAgent.prompt({\n role: 'user',\n content: userPrompt,\n timestamp: Date.now(),\n });\n await reviewAgent.waitForIdle();\n },\n timeoutMs,\n );\n } catch (err) {\n log.warn({ err, sessionKey }, 'Background review turn failed or timed out');\n aborted = true;\n reviewAgent.abort();\n await reviewAgent.waitForIdle().catch(() => {});\n return;\n }\n\n if (isAssistantTurnAborted(reviewAgent) || isAssistantTurnFailed(reviewAgent)) {\n log.debug({ sessionKey }, 'Background review produced aborted/failed assistant turn');\n return;\n }\n\n const last = reviewAgent.state.messages;\n for (let i = last.length - 1; i >= 0; i--) {\n const msg = last[i];\n if (msg.role === 'assistant') {\n const content = msg.content;\n const text = Array.isArray(content)\n ? extractTextContent(content as Array<{ type: string; text?: string }>)\n : String(content);\n const trimmed = text.trim();\n if (trimmed && !/^nothing to save\\.?$/i.test(trimmed)) {\n log.info({ sessionKey, preview: trimmed.slice(0, 120) }, 'Background review completed');\n } else {\n log.debug({ sessionKey }, 'Background review: nothing to save');\n }\n return;\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { createLogger } from "../utils/logger/index.js";
|
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { init_sync_provider_auth, resolveProviderApiKeySync } from "../auth/sync-provider-auth.js";
|
|
4
4
|
import { getApiKeySync, init_providers } from "../providers/index.js";
|
|
5
|
+
import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
|
|
5
6
|
import { extractTextContent } from "./context/workspace.js";
|
|
6
7
|
import { resolveAgentTurnTimeoutMs, runAgentTurnWithTimeout } from "./orchestration/run-agent-turn-with-timeout.js";
|
|
7
8
|
import { AgentToolsFactory } from "./tools/factory.js";
|
|
@@ -59,6 +60,7 @@ function createDelegateChildHandle(options) {
|
|
|
59
60
|
tools: filteredTools,
|
|
60
61
|
messages: []
|
|
61
62
|
},
|
|
63
|
+
streamFn: createExtensionAwareStreamFn(),
|
|
62
64
|
getApiKey: (provider) => resolveProviderApiKeySync(provider) ?? getApiKeySync(provider) ?? "",
|
|
63
65
|
beforeToolCall: async () => {
|
|
64
66
|
if (aborted) return {
|