@xopcai/xopc 0.0.82 → 0.0.84
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +3 -1
- package/README.zh-CN.md +3 -1
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +2 -3
- package/dist/extensions/feishu/src/outbound/media-load.js.map +1 -1
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +6 -6
- package/dist/extensions/telegram/src/config-schema.d.ts +6 -6
- package/dist/extensions/telegram/src/plugin.d.ts +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +3 -3
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/gateway/static/root/assets/agents-tR-nNP04.js +222 -0
- package/dist/gateway/static/root/assets/{apps-page-pJ27dsqn.js → apps-page-BDw6SP-d.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-DEFd-jj1.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-D1KYmOmi.js → channels-status-swr-DI5FHdGe.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-BSqY8LwW.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-D7lVDjcR.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-CqNMNhJM.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-gf2L0kY_.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-CQo2Xsmg.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.js → extension-settings-page-CZf0WoZg.js} +1 -1
- package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
- package/dist/gateway/static/root/assets/{field-primitives-B9rOLqdm.js → field-primitives-DTtlp-l8.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.js → heartbeat-config-api-B0drdQEJ.js} +1 -1
- package/dist/gateway/static/root/assets/{index-DQuaMye9.js → index-0Gt3TG4j.js} +94 -85
- package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
- package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.js → logs-page-DMuORLfC.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-_UO8g6NN.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-2Yu-FASs.js → settings-form-section-DkmHkknc.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-Cz8FoW_A.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-HrUOxF7H.js +2 -0
- package/dist/gateway/static/root/assets/{theme-store-DnwYutiX.js → theme-store-D01dJt95.js} +1 -1
- package/dist/gateway/static/root/assets/{utils-D2Gn2qod.js → utils-BFwcR6pL.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-JF8-aqc5.js +1 -0
- package/dist/gateway/static/root/index.html +4 -4
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-instance-gateway.d.ts +50 -0
- package/dist/src/agent/agent-instance-gateway.js +1 -0
- package/dist/src/agent/agent-manager.d.ts +20 -14
- package/dist/src/agent/agent-manager.js +74 -186
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.d.ts +61 -0
- package/dist/src/agent/background-review/coordinator.js +120 -0
- package/dist/src/agent/background-review/coordinator.js.map +1 -0
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +1 -1
- package/dist/src/agent/child-agent-factory.d.ts +14 -0
- package/dist/src/agent/child-agent-factory.js +2 -8
- package/dist/src/agent/child-agent-factory.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +3 -3
- package/dist/src/agent/embedded/index.d.ts +1 -2
- package/dist/src/agent/embedded/index.js +2 -3
- package/dist/src/agent/embedded/run-for-session.d.ts +2 -2
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/embedded/runs.d.ts +32 -0
- package/dist/src/agent/embedded/runs.js +79 -19
- package/dist/src/agent/embedded/runs.js.map +1 -1
- package/dist/src/agent/embedded/session-manager-cache.d.ts +14 -0
- package/dist/src/agent/embedded/session-manager-cache.js +32 -11
- package/dist/src/agent/embedded/session-manager-cache.js.map +1 -1
- package/dist/src/agent/embedded/session-runner.d.ts +37 -7
- package/dist/src/agent/embedded/session-runner.js +184 -153
- package/dist/src/agent/embedded/session-runner.js.map +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.d.ts +57 -9
- package/dist/src/agent/embedded/session-tool-result-guard.js +159 -67
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/goal-run-store.js +4 -4
- package/dist/src/agent/goals/persistent-goal-service.d.ts +84 -0
- package/dist/src/agent/goals/persistent-goal-service.js +139 -0
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -0
- package/dist/src/agent/goals/post-turn.js +2 -2
- package/dist/src/agent/goals/state.d.ts +1 -1
- package/dist/src/agent/goals/state.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +1 -1
- package/dist/src/agent/inbound/inbound-loop.d.ts +77 -0
- package/dist/src/agent/inbound/inbound-loop.js +226 -0
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -0
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +80 -0
- package/dist/src/agent/inbound/turn-dispatcher.js +138 -0
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -0
- package/dist/src/agent/ipc/bus.js +1 -1
- package/dist/src/agent/ipc/inbox.js +2 -2
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.d.ts +1 -1
- package/dist/src/agent/lifecycle/handlers/compaction.js.map +1 -1
- package/dist/src/agent/lifecycle/manager.d.ts +1 -1
- package/dist/src/agent/lifecycle/manager.js.map +1 -1
- package/dist/src/agent/lifecycle/types.d.ts +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.d.ts +12 -2
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js.map +1 -1
- package/dist/src/agent/memory/index.js +3 -3
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/memory/prefetch-coordinator.d.ts +37 -0
- package/dist/src/agent/memory/prefetch-coordinator.js +45 -0
- package/dist/src/agent/memory/prefetch-coordinator.js.map +1 -0
- package/dist/src/agent/messaging/command-handler.d.ts +5 -1
- package/dist/src/agent/messaging/command-handler.js +24 -96
- package/dist/src/agent/messaging/command-handler.js.map +1 -1
- package/dist/src/agent/messaging/index.d.ts +1 -0
- package/dist/src/agent/messaging/index.js +2 -1
- package/dist/src/agent/messaging/message-router.d.ts +1 -1
- package/dist/src/agent/messaging/message-router.js.map +1 -1
- package/dist/src/agent/messaging/outbound-coordinator.d.ts +82 -0
- package/dist/src/agent/messaging/outbound-coordinator.js +123 -0
- package/dist/src/agent/messaging/outbound-coordinator.js.map +1 -0
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/orchestration/agent-event-handler.d.ts +36 -33
- package/dist/src/agent/orchestration/agent-event-handler.js +212 -174
- package/dist/src/agent/orchestration/agent-event-handler.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +4 -4
- package/dist/src/agent/orchestration/agent-orchestrator.js +4 -8
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/index.d.ts +1 -1
- package/dist/src/agent/orchestration/index.js +2 -2
- package/dist/src/agent/prompt/service-prompt-builder.js +4 -4
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +1 -1
- package/dist/src/agent/service/async-queue.d.ts +20 -0
- package/dist/src/agent/service/async-queue.js +53 -0
- package/dist/src/agent/service/async-queue.js.map +1 -0
- package/dist/src/agent/service/build-direct-message-content.d.ts +2 -2
- package/dist/src/agent/service/build-direct-message-content.js.map +1 -1
- package/dist/src/agent/service/direct-turn-helpers.d.ts +70 -0
- package/dist/src/agent/service/direct-turn-helpers.js +90 -0
- package/dist/src/agent/service/direct-turn-helpers.js.map +1 -0
- package/dist/src/agent/service/process-direct-one-shot.d.ts +3 -3
- package/dist/src/agent/service/process-direct-one-shot.js +17 -34
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +122 -168
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.d.ts +2 -2
- package/dist/src/agent/service/webchat-tts.js +1 -1
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.d.ts +62 -167
- package/dist/src/agent/service.js +177 -786
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/index.d.ts +4 -0
- package/dist/src/agent/session/index.js +5 -1
- package/dist/src/agent/session/session-config-service.d.ts +68 -0
- package/dist/src/agent/session/session-config-service.js +172 -0
- package/dist/src/agent/session/session-config-service.js.map +1 -0
- package/dist/src/agent/session/session-context.d.ts +27 -19
- package/dist/src/agent/session/session-context.js +39 -24
- package/dist/src/agent/session/session-context.js.map +1 -1
- package/dist/src/agent/session/session-hydrator.d.ts +42 -0
- package/dist/src/agent/session/session-hydrator.js +66 -0
- package/dist/src/agent/session/session-hydrator.js.map +1 -0
- package/dist/src/agent/session/session-inspector.d.ts +80 -0
- package/dist/src/agent/session/session-inspector.js +119 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -0
- package/dist/src/agent/session/session-state-bag.d.ts +83 -0
- package/dist/src/agent/session/session-state-bag.js +192 -0
- package/dist/src/agent/session/session-state-bag.js.map +1 -0
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.d.ts +0 -2
- package/dist/src/agent/skills/index.js +3 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +2 -2
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
- package/dist/src/agent/tools/delegate-tool.js +2 -1
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/executor.d.ts +34 -15
- package/dist/src/agent/tools/executor.js +44 -79
- package/dist/src/agent/tools/executor.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +6 -0
- package/dist/src/agent/tools/factory.js +63 -4
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +1 -1
- package/dist/src/agent/tools/tts-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
- package/dist/src/agent/workspace-runtime/registry.js +59 -0
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +4 -3
- package/dist/src/browser/cdp-local-launcher.js.map +1 -1
- package/dist/src/browser/index.d.ts +1 -0
- package/dist/src/browser/index.js +2 -1
- package/dist/src/browser/manager.js +3 -2
- package/dist/src/browser/manager.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/browser-use.js +2 -1
- package/dist/src/browser/providers/browser-use.js.map +1 -1
- package/dist/src/browser/providers/browserbase.js +2 -1
- package/dist/src/browser/providers/browserbase.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +7 -6
- package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
- package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
- package/dist/src/browser/providers/playwright-doctor.js +7 -3
- package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
- package/dist/src/browser/readiness.d.ts +33 -0
- package/dist/src/browser/readiness.js +138 -0
- package/dist/src/browser/readiness.js.map +1 -0
- package/dist/src/browser/stealth.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/channel-domain.d.ts +1 -1
- package/dist/src/channels/config-helpers.d.ts +1 -1
- package/dist/src/channels/config-helpers.js.map +1 -1
- package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
- package/dist/src/channels/heartbeat-scheduler.js +94 -0
- package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
- package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
- package/dist/src/channels/lifecycle-supervisor.js +263 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
- package/dist/src/channels/manager.d.ts +34 -68
- package/dist/src/channels/manager.js +107 -477
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/outbound/deliver.d.ts +1 -1
- package/dist/src/channels/outbound/deliver.js.map +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/outbound-sender.d.ts +51 -0
- package/dist/src/channels/outbound-sender.js +125 -0
- package/dist/src/channels/outbound-sender.js.map +1 -0
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
- package/dist/src/channels/pairing/pairing-types.js +1 -0
- package/dist/src/channels/plugin-registry.d.ts +22 -0
- package/dist/src/channels/plugin-registry.js +44 -0
- package/dist/src/channels/plugin-registry.js.map +1 -0
- package/dist/src/channels/plugin-types.d.ts +1 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
- package/dist/src/channels/security-helpers.d.ts +1 -1
- package/dist/src/channels/security-helpers.js.map +1 -1
- package/dist/src/channels/setup-wizard.d.ts +1 -1
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/command-catalog.js +110 -8
- package/dist/src/cli/command-catalog.js.map +1 -1
- package/dist/src/cli/command-loaders.js +2 -0
- package/dist/src/cli/command-loaders.js.map +1 -1
- package/dist/src/cli/command-manifest.js +9 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.js +1 -1
- package/dist/src/cli/commands/agent/stream-renderer.js.map +1 -1
- package/dist/src/cli/commands/agent.js +4 -4
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +2 -1
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +70 -19
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/cron-cli.d.ts +2 -0
- package/dist/src/cli/commands/cron-cli.js +15 -0
- package/dist/src/cli/commands/cron-cli.js.map +1 -0
- package/dist/src/cli/commands/cron.d.ts +4 -1
- package/dist/src/cli/commands/cron.js +76 -41
- package/dist/src/cli/commands/cron.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +2 -2
- package/dist/src/cli/commands/doctor/checks/config-health.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/cron-health.js +1 -1
- package/dist/src/cli/commands/doctor/checks/cron-health.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/gateway-health.js +2 -2
- package/dist/src/cli/commands/doctor/checks/gateway-health.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/gateway-service.js +2 -2
- package/dist/src/cli/commands/doctor/checks/gateway-service.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/state-integrity.js +2 -2
- package/dist/src/cli/commands/doctor/checks/state-integrity.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +4 -4
- package/dist/src/cli/commands/doctor/checks/workspace-status.js.map +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-dev.js.map +1 -1
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js.map +1 -1
- package/dist/src/cli/commands/extension-pack.js +1 -1
- package/dist/src/cli/commands/gateway/call.js +1 -1
- package/dist/src/cli/commands/gateway/call.js.map +1 -1
- package/dist/src/cli/commands/gateway/health.js +1 -1
- package/dist/src/cli/commands/gateway/health.js.map +1 -1
- package/dist/src/cli/commands/gateway/index.d.ts +1 -1
- package/dist/src/cli/commands/gateway/index.js +2 -2
- package/dist/src/cli/commands/gateway/lifecycle-core.d.ts +31 -12
- package/dist/src/cli/commands/gateway/lifecycle-core.js +167 -116
- package/dist/src/cli/commands/gateway/lifecycle-core.js.map +1 -1
- package/dist/src/cli/commands/gateway/lifecycle.d.ts +11 -0
- package/dist/src/cli/commands/gateway/lifecycle.js +102 -0
- package/dist/src/cli/commands/gateway/lifecycle.js.map +1 -0
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/gateway/logs.js.map +1 -1
- package/dist/src/cli/commands/gateway/probe.js +1 -1
- package/dist/src/cli/commands/gateway/probe.js.map +1 -1
- package/dist/src/cli/commands/gateway/restart-health.d.ts +12 -0
- package/dist/src/cli/commands/gateway/restart-health.js +45 -1
- package/dist/src/cli/commands/gateway/restart-health.js.map +1 -1
- package/dist/src/cli/commands/gateway/restart.js +3 -3
- package/dist/src/cli/commands/gateway/restart.js.map +1 -1
- package/dist/src/cli/commands/gateway/run-foreground.d.ts +0 -1
- package/dist/src/cli/commands/gateway/run-foreground.js +0 -35
- package/dist/src/cli/commands/gateway/run-foreground.js.map +1 -1
- package/dist/src/cli/commands/gateway/service.d.ts +4 -0
- package/dist/src/cli/commands/gateway/service.js +18 -3
- package/dist/src/cli/commands/gateway/service.js.map +1 -1
- package/dist/src/cli/commands/gateway/shared.d.ts +3 -0
- package/dist/src/cli/commands/gateway/shared.js +54 -0
- package/dist/src/cli/commands/gateway/shared.js.map +1 -0
- package/dist/src/cli/commands/gateway/status.js +1 -1
- package/dist/src/cli/commands/gateway/status.js.map +1 -1
- package/dist/src/cli/commands/gateway/stop.js +2 -2
- package/dist/src/cli/commands/gateway/stop.js.map +1 -1
- package/dist/src/cli/commands/gateway/subcommands.js +1 -4
- package/dist/src/cli/commands/gateway/subcommands.js.map +1 -1
- package/dist/src/cli/commands/gateway/token.js +1 -1
- package/dist/src/cli/commands/gateway/token.js.map +1 -1
- package/dist/src/cli/commands/gateway.js +5 -5
- package/dist/src/cli/commands/gateway.js.map +1 -1
- package/dist/src/cli/commands/image.js +2 -2
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/init.js +31 -4
- package/dist/src/cli/commands/init.js.map +1 -1
- package/dist/src/cli/commands/models.d.ts +4 -1
- package/dist/src/cli/commands/models.js +87 -75
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/gateway.d.ts +0 -8
- package/dist/src/cli/commands/onboard/gateway.js +48 -49
- package/dist/src/cli/commands/onboard/gateway.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +11 -64
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/commands/profile.d.ts +3 -5
- package/dist/src/cli/commands/profile.js +31 -31
- package/dist/src/cli/commands/profile.js.map +1 -1
- package/dist/src/cli/commands/session/utils.js +1 -1
- package/dist/src/cli/commands/session/utils.js.map +1 -1
- package/dist/src/cli/commands/setup.js +6 -1
- package/dist/src/cli/commands/setup.js.map +1 -1
- package/dist/src/cli/commands/skills.js +1 -1
- package/dist/src/cli/commands/tailscale.js +1 -1
- package/dist/src/cli/commands/tailscale.js.map +1 -1
- package/dist/src/cli/context.d.ts +20 -0
- package/dist/src/cli/context.js +23 -0
- package/dist/src/cli/context.js.map +1 -0
- package/dist/src/cli/extension-cli-register.js +3 -3
- package/dist/src/cli/gateway-run-argv.js +16 -9
- package/dist/src/cli/gateway-run-argv.js.map +1 -1
- package/dist/src/cli/gateway-run-fast-path.js +1 -1
- package/dist/src/cli/gateway-run-fast-path.js.map +1 -1
- package/dist/src/cli/index.d.ts +1 -7
- package/dist/src/cli/index.js +4 -6
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/commands.flags.d.ts +3 -0
- package/dist/src/config/commands.flags.js +11 -0
- package/dist/src/config/commands.flags.js.map +1 -0
- package/dist/src/config/index.d.ts +1 -0
- package/dist/src/config/index.js +6 -5
- package/dist/src/config/index.js.map +1 -1
- package/dist/src/config/loader.js +2 -2
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/profile.js +2 -2
- package/dist/src/config/schema.d.ts +11 -4
- package/dist/src/config/schema.js +13 -12
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/workspace-path-helpers.d.ts +15 -0
- package/dist/src/config/workspace-path-helpers.js +14 -0
- package/dist/src/config/workspace-path-helpers.js.map +1 -0
- package/dist/src/cron/executor.js +4 -4
- package/dist/src/cron/executor.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/index.d.ts +0 -1
- package/dist/src/daemon/index.js +1 -2
- package/dist/src/daemon/install-plan.js +3 -2
- package/dist/src/daemon/install-plan.js.map +1 -1
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/daemon/types.d.ts +0 -6
- package/dist/src/extensions/api.d.ts +1 -1
- package/dist/src/extensions/api.js +2 -2
- package/dist/src/extensions/api.js.map +1 -1
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +1 -1
- package/dist/src/extensions/extension-registry-impl.d.ts +51 -0
- package/dist/src/extensions/extension-registry-impl.js +117 -0
- package/dist/src/extensions/extension-registry-impl.js.map +1 -0
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/index.js +3 -2
- package/dist/src/extensions/loader.d.ts +3 -43
- package/dist/src/extensions/loader.js +3 -110
- package/dist/src/extensions/loader.js.map +1 -1
- package/dist/src/extensions/lockfile.js +2 -2
- package/dist/src/extensions/sdk/index.js +2 -1
- package/dist/src/extensions/sdk/index.js.map +1 -1
- package/dist/src/extensions/types/events.d.ts +7 -1
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +1 -1
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +5 -53
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
- package/dist/src/gateway/hono/middleware/auth.js +89 -126
- package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
- package/dist/src/gateway/hono/middleware/logger.js +1 -1
- package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
- package/dist/src/gateway/hono/routes/browser.js +626 -0
- package/dist/src/gateway/hono/routes/browser.js.map +1 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
- package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
- package/dist/src/gateway/hono/routes/config.js +20 -1764
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +2 -3
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -2
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +32 -32
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +4 -4
- package/dist/src/gateway/hono/routes/shares.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +6 -7
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +2 -2
- package/dist/src/gateway/index.d.ts +1 -1
- package/dist/src/gateway/index.js +4 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
- package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
- package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
- package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
- package/dist/src/gateway/rate-limit/buckets.js +143 -0
- package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
- package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
- package/dist/src/gateway/rate-limit/env-flags.js +16 -0
- package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
- package/dist/src/gateway/rate-limit/index.d.ts +3 -0
- package/dist/src/gateway/rate-limit/index.js +4 -0
- package/dist/src/gateway/run-loop.d.ts +1 -1
- package/dist/src/gateway/run-loop.js +24 -4
- package/dist/src/gateway/run-loop.js.map +1 -1
- package/dist/src/gateway/runtime-config.js +2 -1
- package/dist/src/gateway/runtime-config.js.map +1 -1
- package/dist/src/gateway/security/audit.js +2 -1
- package/dist/src/gateway/security/audit.js.map +1 -1
- package/dist/src/gateway/security/index.d.ts +0 -1
- package/dist/src/gateway/security/index.js +1 -2
- package/dist/src/gateway/security/loopback.d.ts +13 -0
- package/dist/src/gateway/security/loopback.js +45 -0
- package/dist/src/gateway/security/loopback.js.map +1 -0
- package/dist/src/gateway/service/agent-runner.d.ts +108 -0
- package/dist/src/gateway/service/agent-runner.js +184 -0
- package/dist/src/gateway/service/agent-runner.js.map +1 -0
- package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
- package/dist/src/gateway/service/config-coordinator.js +351 -0
- package/dist/src/gateway/service/config-coordinator.js.map +1 -0
- package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
- package/dist/src/gateway/service/marketplace-service.js +239 -0
- package/dist/src/gateway/service/marketplace-service.js.map +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +5 -5
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +125 -0
- package/dist/src/gateway/service/sessions-api.js +135 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -0
- package/dist/src/gateway/service.d.ts +30 -360
- package/dist/src/gateway/service.js +122 -904
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-fs-file-list.js +1 -1
- package/dist/src/gateway/workspace-heartbeat-path.js +1 -2
- package/dist/src/gateway/workspace-heartbeat-path.js.map +1 -1
- package/dist/src/infra/gateway-process-argv.d.ts +4 -0
- package/dist/src/infra/gateway-process-argv.js +26 -0
- package/dist/src/infra/gateway-process-argv.js.map +1 -0
- package/dist/src/infra/gateway-processes.d.ts +5 -0
- package/dist/src/infra/gateway-processes.js +65 -0
- package/dist/src/infra/gateway-processes.js.map +1 -0
- package/dist/src/infra/rate-limit/failure-limiter.d.ts +50 -0
- package/dist/src/infra/rate-limit/failure-limiter.js +100 -0
- package/dist/src/infra/rate-limit/failure-limiter.js.map +1 -0
- package/dist/src/infra/rate-limit/index.d.ts +5 -0
- package/dist/src/infra/rate-limit/index.js +3 -0
- package/dist/src/infra/rate-limit/keyed-store.d.ts +34 -0
- package/dist/src/infra/rate-limit/keyed-store.js +44 -0
- package/dist/src/infra/rate-limit/keyed-store.js.map +1 -0
- package/dist/src/infra/rate-limit/rate-limiter.d.ts +39 -0
- package/dist/src/infra/rate-limit/rate-limiter.js +65 -0
- package/dist/src/infra/rate-limit/rate-limiter.js.map +1 -0
- package/dist/src/infra/restart.d.ts +21 -0
- package/dist/src/infra/restart.js +122 -0
- package/dist/src/infra/restart.js.map +1 -0
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-lock.js +3 -3
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +2 -2
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/mcp/channel-bridge.d.ts +0 -6
- package/dist/src/mcp/channel-bridge.js +1 -5
- package/dist/src/mcp/channel-bridge.js.map +1 -1
- package/dist/src/media-shared/http/ssrf-guard.js +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +2 -2
- package/dist/src/providers/model-registry.js +1 -1
- package/dist/src/session/config-store.js +2 -2
- package/dist/src/session/parity/jsonl-transcript-io.js +2 -2
- package/dist/src/session/parity/sessions-json-file-read.d.ts +2 -1
- package/dist/src/session/parity/sessions-json-file-read.js.map +1 -1
- package/dist/src/session/parity/sessions-json-file.js +1 -1
- package/dist/src/session/parity/transcript-file-lock.js +2 -2
- package/dist/src/session/parity/transcript-paths.js +1 -1
- package/dist/src/session/search-index-cache.js +1 -1
- package/dist/src/session/search-index.js +1 -1
- package/dist/src/session/session-title.js +1 -1
- package/dist/src/session/store.js +5 -5
- package/dist/src/share/share-rate-limit.d.ts +10 -2
- package/dist/src/share/share-rate-limit.js +33 -42
- package/dist/src/share/share-rate-limit.js.map +1 -1
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/tui/backends/embedded-backend.js +16 -12
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +2 -2
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/format-tui-hotkeys.js +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +1 -1
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui.js +1 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
- package/dist/src/tui/xopc-tui-keybindings.js +1 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +2 -2
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
- package/dist/src/tunnel/pairing-rate-limit.js +19 -15
- package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
- package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
- package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-state.js +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/utils/logger/stats.d.ts +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/factory.js +1 -1
- package/dist/src/voice/tts/index.js +2 -2
- package/dist/src/voice/tts/merge-config.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +1 -1
- package/dist/src/voice/tts/service.js +1 -1
- package/dist/src/voice/tts/service.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +1 -1
- package/package.json +10 -5
- package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
- package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
- package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
- package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
- package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
- package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
- package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
- package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
- package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
- package/dist/src/daemon/launchd-restart-handoff.js +0 -132
- package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
- package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
- package/dist/src/gateway/auth-rate-limit.js +0 -192
- package/dist/src/gateway/auth-rate-limit.js.map +0 -1
- package/dist/src/gateway/restart-handler.d.ts +0 -14
- package/dist/src/gateway/restart-handler.js +0 -64
- package/dist/src/gateway/restart-handler.js.map +0 -1
- package/dist/src/gateway/security/flood-guard.d.ts +0 -28
- package/dist/src/gateway/security/flood-guard.js +0 -42
- package/dist/src/gateway/security/flood-guard.js.map +0 -1
- package/dist/src/infra/rate-limit.d.ts +0 -38
- package/dist/src/infra/rate-limit.js +0 -60
- package/dist/src/infra/rate-limit.js.map +0 -1
- package/dist/src/infra/restart-intent.d.ts +0 -13
- package/dist/src/infra/restart-intent.js +0 -40
- package/dist/src/infra/restart-intent.js.map +0 -1
- package/dist/src/infra/restart-sentinel.d.ts +0 -23
- package/dist/src/infra/restart-sentinel.js +0 -75
- package/dist/src/infra/restart-sentinel.js.map +0 -1
- package/skills/creative/canvas-design/LICENSE.txt +0 -202
- package/skills/creative/canvas-design/SKILL-zh.md +0 -130
- package/skills/creative/canvas-design/SKILL.md +0 -130
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-config-service.js","names":[],"sources":["../../../../src/agent/session/session-config-service.ts"],"sourcesContent":["/**\n * SessionConfigService — owns the \"write side\" of per-session agent settings\n * (model override, thinking level, reasoning level, working directory).\n *\n * Previously these lived as four sibling methods on `AgentService`:\n * - `patchSessionAgentConfig` (96 lines of validation + persistence)\n * - `applyCronJobWorkingDirectory` (cron-specific working dir update)\n * - `clearCronSessionWorkingDirectoryOverride` (private helper)\n * - `clearSessionModelOverride` (private helper)\n *\n * Extracted so `AgentService` no longer mixes \"session bag\" concerns with\n * \"session config write\" concerns, and so future additions to the patch API\n * (e.g. new per-session overrides) only touch this file.\n */\n\nimport { mkdir } from 'node:fs/promises';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport { normalizeWorkingDirectoryInput } from '../../session/index.js';\nimport type { SessionConfigStore, SessionStore } from '../../session/index.js';\nimport {\n normalizeThinkLevel,\n normalizeReasoningLevel,\n} from '../transcript/thinking-types.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('SessionConfigService');\n\nexport interface SessionConfigServiceOptions {\n sessionStore: SessionStore;\n sessionConfigStore: SessionConfigStore;\n modelManager: ModelManager;\n agentManager: AgentInstanceGateway;\n /** Effective config snapshot accessor. */\n getConfig: () => Config | undefined;\n}\n\nexport interface PatchSessionAgentConfigInput {\n thinkingLevel?: string;\n model?: string | null;\n reasoningLevel?: string;\n workingDirectory?: string;\n}\n\nexport interface PatchSessionAgentConfigResult {\n ok: boolean;\n error?: string;\n}\n\nexport class SessionConfigService {\n private readonly opts: SessionConfigServiceOptions;\n\n constructor(opts: SessionConfigServiceOptions) {\n this.opts = opts;\n }\n\n /**\n * Apply a partial patch (model / thinking / reasoning / working directory) to\n * a session's persisted config. Returns `{ ok: false, error }` on the first\n * invalid field — earlier fields that succeeded are NOT rolled back, matching\n * the previous behaviour.\n */\n async patch(\n sessionKey: string,\n partial: PatchSessionAgentConfigInput,\n ): Promise<PatchSessionAgentConfigResult> {\n if (partial.model !== undefined) {\n if (partial.model === null || partial.model === '') {\n await this.clearModelOverride(sessionKey);\n } else {\n const ok = await this.opts.modelManager.switchModelForSession(sessionKey, partial.model);\n if (!ok) {\n return { ok: false, error: 'Invalid model' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { modelOverride: partial.model });\n this.opts.agentManager.setModelForSession(sessionKey, partial.model);\n }\n }\n\n if (partial.thinkingLevel !== undefined) {\n const normalized = normalizeThinkLevel(partial.thinkingLevel);\n if (!normalized) {\n return { ok: false, error: 'Invalid thinking level' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { thinkingLevel: normalized });\n this.opts.agentManager.setThinkingLevel(sessionKey, normalized as ThinkingLevel);\n }\n\n if (partial.reasoningLevel !== undefined) {\n const normalized = normalizeReasoningLevel(partial.reasoningLevel);\n if (!normalized) {\n return { ok: false, error: 'Invalid reasoning level' };\n }\n await this.opts.sessionConfigStore.update(sessionKey, { reasoningLevel: normalized });\n }\n\n if (partial.workingDirectory !== undefined) {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n return { ok: false, error: 'Config not loaded' };\n }\n const result = await this.patchWorkingDirectory(sessionKey, partial.workingDirectory);\n if (!result.ok) return result;\n }\n\n return { ok: true };\n }\n\n /**\n * Sync persisted session working directory for an isolated cron run. Runs\n * may change when the job is edited; an empty/missing input clears the\n * override so the session uses the effective agent default.\n */\n async applyCronJobWorkingDirectory(\n sessionKey: string,\n workingDirectory: string | undefined,\n ): Promise<void> {\n const raw = workingDirectory?.trim();\n if (raw) {\n const wdNorm = normalizeWorkingDirectoryInput(raw);\n if (wdNorm.ok === false) {\n log.warn(\n { sessionKey, error: wdNorm.error },\n 'Cron job working directory invalid; using agent default',\n );\n await this.clearCronWorkingDirectoryOverride(sessionKey);\n return;\n }\n await mkdir(wdNorm.path, { recursive: true });\n await this.opts.sessionConfigStore.update(sessionKey, { workingDirectoryOverride: wdNorm.path });\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, wdNorm.path);\n return;\n }\n await this.clearCronWorkingDirectoryOverride(sessionKey);\n }\n\n /**\n * Clear the session's model override (back to agent default). Used both by\n * {@link patch} and by `AgentService.resetSessionModelToAgentDefault`.\n */\n async clearModelOverride(sessionKey: string): Promise<void> {\n this.opts.modelManager.clearSessionModelOverride(sessionKey);\n await this.opts.sessionConfigStore.update(sessionKey, { modelOverride: undefined });\n const agent = this.opts.agentManager.getAgent(sessionKey);\n if (agent) {\n await this.opts.modelManager.applyModelForSession(agent, sessionKey);\n }\n }\n\n // ── Internal helpers ───────────────────────────────────────────────────\n\n private async clearCronWorkingDirectoryOverride(sessionKey: string): Promise<void> {\n const existing = await this.opts.sessionConfigStore.get(sessionKey);\n if (existing?.workingDirectoryOverride) {\n const { workingDirectoryOverride: _removed, ...rest } = existing;\n await this.opts.sessionConfigStore.set(sessionKey, rest);\n }\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, null);\n }\n\n /**\n * Apply the workingDirectory branch of `patch`. Returns the next-step result\n * (`ok: true` to keep going, `ok: false, error` to short-circuit the patch).\n *\n * Working directory has the strictest semantics: once a session has any\n * messages, it cannot move to a different directory — only re-setting the\n * same path is idempotent.\n */\n private async patchWorkingDirectory(\n sessionKey: string,\n workingDirectory: string,\n ): Promise<PatchSessionAgentConfigResult> {\n const existing = await this.opts.sessionConfigStore.get(sessionKey);\n const existingRaw = existing?.workingDirectoryOverride?.trim();\n const incoming = workingDirectory.trim();\n\n const priorMessages = await this.opts.sessionStore.load(sessionKey);\n\n if (priorMessages.length > 0) {\n if (!incoming) {\n return { ok: false, error: 'workingDirectory is empty' };\n }\n if (!existingRaw) {\n return {\n ok: false,\n error: 'Working directory can only be set before the first message in this conversation',\n };\n }\n const prev = normalizeWorkingDirectoryInput(existingRaw);\n const next = normalizeWorkingDirectoryInput(incoming);\n if (prev.ok && next.ok && prev.path === next.path) {\n // idempotent\n return { ok: true };\n }\n return { ok: false, error: 'Working directory is already set for this session' };\n }\n\n if (!incoming) {\n return { ok: false, error: 'workingDirectory is empty' };\n }\n const wdNorm = normalizeWorkingDirectoryInput(incoming);\n switch (wdNorm.ok) {\n case true: {\n if (existingRaw) {\n const prev = normalizeWorkingDirectoryInput(existingRaw);\n if (prev.ok && prev.path === wdNorm.path) {\n return { ok: true };\n }\n }\n await mkdir(wdNorm.path, { recursive: true });\n await this.opts.sessionConfigStore.update(sessionKey, {\n workingDirectoryOverride: wdNorm.path,\n });\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, wdNorm.path);\n this.opts.agentManager.removeAgent(sessionKey);\n return { ok: true };\n }\n case false:\n return { ok: false, error: wdNorm.error };\n default:\n return { ok: false, error: 'Invalid working directory' };\n }\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,7 +1,18 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Session Context
|
|
2
|
+
* Session Context — types + an `AsyncLocalStorage`-backed manager.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* The previous implementation kept the "current" session context in a single
|
|
5
|
+
* mutable field on the class. That meant bus-inbound and direct-stream paths
|
|
6
|
+
* concurrently handling different sessions could overwrite each other's view
|
|
7
|
+
* of "current session", with tools reading the wrong sessionKey at execution
|
|
8
|
+
* time (the only thing masking it was the inbound consumer being serial).
|
|
9
|
+
*
|
|
10
|
+
* The new manager uses `AsyncLocalStorage`, so each async chain sees its own
|
|
11
|
+
* context. Callers establish a scope via {@link SessionContextManager.runWith}
|
|
12
|
+
* (preferred for `async` functions) or {@link SessionContextManager.enter}
|
|
13
|
+
* (used at the top of `async function*` generators where callback-wrapping is
|
|
14
|
+
* awkward; the context leaks into the rest of the current async resource by
|
|
15
|
+
* design).
|
|
5
16
|
*/
|
|
6
17
|
import type { InboundMessage } from '../../infra/bus/index.js';
|
|
7
18
|
export interface SessionContext {
|
|
@@ -14,29 +25,26 @@ export interface SessionContext {
|
|
|
14
25
|
metadata?: Record<string, unknown>;
|
|
15
26
|
}
|
|
16
27
|
export declare class SessionContextManager {
|
|
17
|
-
private
|
|
28
|
+
private readonly als;
|
|
18
29
|
/**
|
|
19
|
-
*
|
|
30
|
+
* Run `fn` with `ctx` exposed via {@link getContext} for every async branch
|
|
31
|
+
* it launches. The context is automatically dropped when `fn` resolves or
|
|
32
|
+
* throws — there is no manual `clearContext` needed.
|
|
20
33
|
*/
|
|
21
|
-
|
|
34
|
+
runWith<T>(ctx: SessionContext, fn: () => Promise<T>): Promise<T>;
|
|
22
35
|
/**
|
|
23
|
-
*
|
|
36
|
+
* Establish a context for the current async resource and its descendants.
|
|
37
|
+
* Use this at the top of an `async function*` body where wrapping the whole
|
|
38
|
+
* generator in {@link runWith} is impractical. The context leaks into the
|
|
39
|
+
* rest of the current async tree by design — call from the start of an
|
|
40
|
+
* isolated generator so it does not bleed across requests.
|
|
24
41
|
*/
|
|
42
|
+
enter(ctx: SessionContext): void;
|
|
43
|
+
/** Returns the session context for the current async chain, or null. */
|
|
25
44
|
getContext(): SessionContext | null;
|
|
26
|
-
/**
|
|
27
|
-
* Clear the current session context
|
|
28
|
-
*/
|
|
29
|
-
clearContext(): void;
|
|
30
|
-
/**
|
|
31
|
-
* Check if a context is currently set
|
|
32
|
-
*/
|
|
33
45
|
hasContext(): boolean;
|
|
34
|
-
/**
|
|
35
|
-
* Extract session context from an inbound message
|
|
36
|
-
*/
|
|
46
|
+
/** Extract session context from an inbound bus message. */
|
|
37
47
|
static extractFromMessage(msg: InboundMessage): SessionContext;
|
|
38
|
-
/**
|
|
39
|
-
* Create a clone of the current context with optional overrides
|
|
40
|
-
*/
|
|
48
|
+
/** Create a clone of the current context with optional overrides. */
|
|
41
49
|
cloneContext(overrides?: Partial<SessionContext>): SessionContext | null;
|
|
42
50
|
}
|
|
@@ -1,33 +1,49 @@
|
|
|
1
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
1
2
|
//#region src/agent/session/session-context.ts
|
|
3
|
+
/**
|
|
4
|
+
* Session Context — types + an `AsyncLocalStorage`-backed manager.
|
|
5
|
+
*
|
|
6
|
+
* The previous implementation kept the "current" session context in a single
|
|
7
|
+
* mutable field on the class. That meant bus-inbound and direct-stream paths
|
|
8
|
+
* concurrently handling different sessions could overwrite each other's view
|
|
9
|
+
* of "current session", with tools reading the wrong sessionKey at execution
|
|
10
|
+
* time (the only thing masking it was the inbound consumer being serial).
|
|
11
|
+
*
|
|
12
|
+
* The new manager uses `AsyncLocalStorage`, so each async chain sees its own
|
|
13
|
+
* context. Callers establish a scope via {@link SessionContextManager.runWith}
|
|
14
|
+
* (preferred for `async` functions) or {@link SessionContextManager.enter}
|
|
15
|
+
* (used at the top of `async function*` generators where callback-wrapping is
|
|
16
|
+
* awkward; the context leaks into the rest of the current async resource by
|
|
17
|
+
* design).
|
|
18
|
+
*/
|
|
2
19
|
var SessionContextManager = class {
|
|
3
|
-
|
|
20
|
+
als = new AsyncLocalStorage();
|
|
4
21
|
/**
|
|
5
|
-
*
|
|
22
|
+
* Run `fn` with `ctx` exposed via {@link getContext} for every async branch
|
|
23
|
+
* it launches. The context is automatically dropped when `fn` resolves or
|
|
24
|
+
* throws — there is no manual `clearContext` needed.
|
|
6
25
|
*/
|
|
7
|
-
|
|
8
|
-
this.
|
|
26
|
+
async runWith(ctx, fn) {
|
|
27
|
+
return this.als.run(ctx, fn);
|
|
9
28
|
}
|
|
10
29
|
/**
|
|
11
|
-
*
|
|
30
|
+
* Establish a context for the current async resource and its descendants.
|
|
31
|
+
* Use this at the top of an `async function*` body where wrapping the whole
|
|
32
|
+
* generator in {@link runWith} is impractical. The context leaks into the
|
|
33
|
+
* rest of the current async tree by design — call from the start of an
|
|
34
|
+
* isolated generator so it does not bleed across requests.
|
|
12
35
|
*/
|
|
13
|
-
|
|
14
|
-
|
|
36
|
+
enter(ctx) {
|
|
37
|
+
this.als.enterWith(ctx);
|
|
15
38
|
}
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
clearContext() {
|
|
20
|
-
this.currentContext = null;
|
|
39
|
+
/** Returns the session context for the current async chain, or null. */
|
|
40
|
+
getContext() {
|
|
41
|
+
return this.als.getStore() ?? null;
|
|
21
42
|
}
|
|
22
|
-
/**
|
|
23
|
-
* Check if a context is currently set
|
|
24
|
-
*/
|
|
25
43
|
hasContext() {
|
|
26
|
-
return this.
|
|
44
|
+
return this.als.getStore() !== void 0;
|
|
27
45
|
}
|
|
28
|
-
/**
|
|
29
|
-
* Extract session context from an inbound message
|
|
30
|
-
*/
|
|
46
|
+
/** Extract session context from an inbound bus message. */
|
|
31
47
|
static extractFromMessage(msg) {
|
|
32
48
|
const metadata = msg.metadata || {};
|
|
33
49
|
return {
|
|
@@ -40,13 +56,12 @@ var SessionContextManager = class {
|
|
|
40
56
|
metadata
|
|
41
57
|
};
|
|
42
58
|
}
|
|
43
|
-
/**
|
|
44
|
-
* Create a clone of the current context with optional overrides
|
|
45
|
-
*/
|
|
59
|
+
/** Create a clone of the current context with optional overrides. */
|
|
46
60
|
cloneContext(overrides) {
|
|
47
|
-
|
|
61
|
+
const current = this.getContext();
|
|
62
|
+
if (!current) return null;
|
|
48
63
|
return {
|
|
49
|
-
...
|
|
64
|
+
...current,
|
|
50
65
|
...overrides
|
|
51
66
|
};
|
|
52
67
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"session-context.js","names":[],"sources":["../../../../src/agent/session/session-context.ts"],"sourcesContent":["/**\n * Session Context
|
|
1
|
+
{"version":3,"file":"session-context.js","names":[],"sources":["../../../../src/agent/session/session-context.ts"],"sourcesContent":["/**\n * Session Context — types + an `AsyncLocalStorage`-backed manager.\n *\n * The previous implementation kept the \"current\" session context in a single\n * mutable field on the class. That meant bus-inbound and direct-stream paths\n * concurrently handling different sessions could overwrite each other's view\n * of \"current session\", with tools reading the wrong sessionKey at execution\n * time (the only thing masking it was the inbound consumer being serial).\n *\n * The new manager uses `AsyncLocalStorage`, so each async chain sees its own\n * context. Callers establish a scope via {@link SessionContextManager.runWith}\n * (preferred for `async` functions) or {@link SessionContextManager.enter}\n * (used at the top of `async function*` generators where callback-wrapping is\n * awkward; the context leaks into the rest of the current async resource by\n * design).\n */\n\nimport { AsyncLocalStorage } from 'node:async_hooks';\n\nimport type { InboundMessage } from '../../infra/bus/index.js';\n\nexport interface SessionContext {\n sessionKey: string;\n channel: string;\n chatId: string;\n senderId: string;\n isGroup: boolean;\n model?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport class SessionContextManager {\n private readonly als = new AsyncLocalStorage<SessionContext>();\n\n /**\n * Run `fn` with `ctx` exposed via {@link getContext} for every async branch\n * it launches. The context is automatically dropped when `fn` resolves or\n * throws — there is no manual `clearContext` needed.\n */\n async runWith<T>(ctx: SessionContext, fn: () => Promise<T>): Promise<T> {\n return this.als.run(ctx, fn);\n }\n\n /**\n * Establish a context for the current async resource and its descendants.\n * Use this at the top of an `async function*` body where wrapping the whole\n * generator in {@link runWith} is impractical. The context leaks into the\n * rest of the current async tree by design — call from the start of an\n * isolated generator so it does not bleed across requests.\n */\n enter(ctx: SessionContext): void {\n this.als.enterWith(ctx);\n }\n\n /** Returns the session context for the current async chain, or null. */\n getContext(): SessionContext | null {\n return this.als.getStore() ?? null;\n }\n\n hasContext(): boolean {\n return this.als.getStore() !== undefined;\n }\n\n /** Extract session context from an inbound bus message. */\n static extractFromMessage(msg: InboundMessage): SessionContext {\n const metadata = msg.metadata || {};\n return {\n sessionKey: (metadata.sessionKey as string) || `${msg.channel}:${msg.chat_id}`,\n channel: msg.channel,\n chatId: msg.chat_id,\n senderId: (metadata.senderId as string) || '',\n isGroup: (metadata.isGroup as boolean) || false,\n model: metadata.model as string | undefined,\n metadata,\n };\n }\n\n /** Create a clone of the current context with optional overrides. */\n cloneContext(overrides?: Partial<SessionContext>): SessionContext | null {\n const current = this.getContext();\n if (!current) return null;\n return { ...current, ...overrides };\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;AA+BA,IAAa,wBAAb,MAAmC;CACjC,MAAuB,IAAI,mBAAmC;;;;;;CAO9D,MAAM,QAAW,KAAqB,IAAkC;AACtE,SAAO,KAAK,IAAI,IAAI,KAAK,GAAG;;;;;;;;;CAU9B,MAAM,KAA2B;AAC/B,OAAK,IAAI,UAAU,IAAI;;;CAIzB,aAAoC;AAClC,SAAO,KAAK,IAAI,UAAU,IAAI;;CAGhC,aAAsB;AACpB,SAAO,KAAK,IAAI,UAAU,KAAK,KAAA;;;CAIjC,OAAO,mBAAmB,KAAqC;EAC7D,MAAM,WAAW,IAAI,YAAY,EAAE;AACnC,SAAO;GACL,YAAa,SAAS,cAAyB,GAAG,IAAI,QAAQ,GAAG,IAAI;GACrE,SAAS,IAAI;GACb,QAAQ,IAAI;GACZ,UAAW,SAAS,YAAuB;GAC3C,SAAU,SAAS,WAAuB;GAC1C,OAAO,SAAS;GAChB;GACD;;;CAIH,aAAa,WAA4D;EACvE,MAAM,UAAU,KAAK,YAAY;AACjC,MAAI,CAAC,QAAS,QAAO;AACrB,SAAO;GAAE,GAAG;GAAS,GAAG;GAAW"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionHydrator — read persisted per-session config and push it into the
|
|
3
|
+
* in-memory runtime (AgentManager + ModelManager).
|
|
4
|
+
*
|
|
5
|
+
* These three operations were three sibling private methods on `AgentService`
|
|
6
|
+
* with subtly different signatures. They are the mirror image of
|
|
7
|
+
* {@link SessionConfigService} — the latter writes user choices into the
|
|
8
|
+
* config store, this hydrator reads them back out before a turn runs.
|
|
9
|
+
*
|
|
10
|
+
* - `workspace()` — apply persisted `workingDirectoryOverride` to AgentManager
|
|
11
|
+
* and ensure the directory exists on disk
|
|
12
|
+
* - `model()` — apply persisted `modelOverride` via ModelManager
|
|
13
|
+
* - `thinking()` — resolve effective thinking level (request override >
|
|
14
|
+
* per-session override > agent default) and apply
|
|
15
|
+
*/
|
|
16
|
+
import type { Config } from '../../config/schema.js';
|
|
17
|
+
import { type SessionConfigStore } from '../../session/index.js';
|
|
18
|
+
import type { AgentInstanceGateway } from '../agent-instance-gateway.js';
|
|
19
|
+
import type { ModelManager } from '../models/index.js';
|
|
20
|
+
export interface SessionHydratorOptions {
|
|
21
|
+
sessionConfigStore: SessionConfigStore;
|
|
22
|
+
agentManager: AgentInstanceGateway;
|
|
23
|
+
modelManager: ModelManager;
|
|
24
|
+
/** Effective config snapshot accessor (honours runtime overrides). */
|
|
25
|
+
getConfig: () => Config | undefined;
|
|
26
|
+
}
|
|
27
|
+
export declare class SessionHydrator {
|
|
28
|
+
private readonly opts;
|
|
29
|
+
constructor(opts: SessionHydratorOptions);
|
|
30
|
+
/**
|
|
31
|
+
* Load persisted workingDirectory override into AgentManager and `mkdir -p`
|
|
32
|
+
* the effective workspace path. Safe to call before `getOrCreateAgent`.
|
|
33
|
+
*/
|
|
34
|
+
workspace(sessionKey: string): Promise<void>;
|
|
35
|
+
/** Apply persisted `modelOverride` to ModelManager (no-op when none stored). */
|
|
36
|
+
model(sessionKey: string): Promise<void>;
|
|
37
|
+
/**
|
|
38
|
+
* Resolve the effective thinking level (request override > per-session
|
|
39
|
+
* override > agent default) and apply it to the live agent instance.
|
|
40
|
+
*/
|
|
41
|
+
thinking(sessionKey: string, requestOverride?: string | null): Promise<void>;
|
|
42
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { resolveEffectiveThinkingLevel } from "../../session/thinking-resolve.js";
|
|
4
|
+
import { effectiveWorkspacePathForSession, normalizeWorkingDirectoryInput } from "../../session/session-workspace.js";
|
|
5
|
+
import "../../session/index.js";
|
|
6
|
+
import { mkdir } from "node:fs/promises";
|
|
7
|
+
//#region src/agent/session/session-hydrator.ts
|
|
8
|
+
/**
|
|
9
|
+
* SessionHydrator — read persisted per-session config and push it into the
|
|
10
|
+
* in-memory runtime (AgentManager + ModelManager).
|
|
11
|
+
*
|
|
12
|
+
* These three operations were three sibling private methods on `AgentService`
|
|
13
|
+
* with subtly different signatures. They are the mirror image of
|
|
14
|
+
* {@link SessionConfigService} — the latter writes user choices into the
|
|
15
|
+
* config store, this hydrator reads them back out before a turn runs.
|
|
16
|
+
*
|
|
17
|
+
* - `workspace()` — apply persisted `workingDirectoryOverride` to AgentManager
|
|
18
|
+
* and ensure the directory exists on disk
|
|
19
|
+
* - `model()` — apply persisted `modelOverride` via ModelManager
|
|
20
|
+
* - `thinking()` — resolve effective thinking level (request override >
|
|
21
|
+
* per-session override > agent default) and apply
|
|
22
|
+
*/
|
|
23
|
+
init_logger();
|
|
24
|
+
const log = createLogger("SessionHydrator");
|
|
25
|
+
var SessionHydrator = class {
|
|
26
|
+
opts;
|
|
27
|
+
constructor(opts) {
|
|
28
|
+
this.opts = opts;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Load persisted workingDirectory override into AgentManager and `mkdir -p`
|
|
32
|
+
* the effective workspace path. Safe to call before `getOrCreateAgent`.
|
|
33
|
+
*/
|
|
34
|
+
async workspace(sessionKey) {
|
|
35
|
+
const cfg = this.opts.getConfig();
|
|
36
|
+
if (!cfg) return;
|
|
37
|
+
const loaded = await this.opts.sessionConfigStore.get(sessionKey);
|
|
38
|
+
if (loaded?.workingDirectoryOverride?.trim()) {
|
|
39
|
+
const wdStored = normalizeWorkingDirectoryInput(loaded.workingDirectoryOverride);
|
|
40
|
+
if (wdStored.ok) this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, wdStored.path);
|
|
41
|
+
else {
|
|
42
|
+
log.warn({ sessionKey }, "Invalid stored workingDirectoryOverride; ignoring");
|
|
43
|
+
this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, null);
|
|
44
|
+
}
|
|
45
|
+
} else this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, null);
|
|
46
|
+
await mkdir(effectiveWorkspacePathForSession(cfg, sessionKey, loaded), { recursive: true });
|
|
47
|
+
}
|
|
48
|
+
/** Apply persisted `modelOverride` to ModelManager (no-op when none stored). */
|
|
49
|
+
async model(sessionKey) {
|
|
50
|
+
const cfg = await this.opts.sessionConfigStore.get(sessionKey);
|
|
51
|
+
if (cfg?.modelOverride) await this.opts.modelManager.switchModelForSession(sessionKey, cfg.modelOverride);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Resolve the effective thinking level (request override > per-session
|
|
55
|
+
* override > agent default) and apply it to the live agent instance.
|
|
56
|
+
*/
|
|
57
|
+
async thinking(sessionKey, requestOverride) {
|
|
58
|
+
const def = this.opts.getConfig()?.agents?.defaults?.thinkingDefault;
|
|
59
|
+
const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, requestOverride, def);
|
|
60
|
+
this.opts.agentManager.setThinkingLevel(sessionKey, level);
|
|
61
|
+
}
|
|
62
|
+
};
|
|
63
|
+
//#endregion
|
|
64
|
+
export { SessionHydrator };
|
|
65
|
+
|
|
66
|
+
//# sourceMappingURL=session-hydrator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-hydrator.js","names":[],"sources":["../../../../src/agent/session/session-hydrator.ts"],"sourcesContent":["/**\n * SessionHydrator — read persisted per-session config and push it into the\n * in-memory runtime (AgentManager + ModelManager).\n *\n * These three operations were three sibling private methods on `AgentService`\n * with subtly different signatures. They are the mirror image of\n * {@link SessionConfigService} — the latter writes user choices into the\n * config store, this hydrator reads them back out before a turn runs.\n *\n * - `workspace()` — apply persisted `workingDirectoryOverride` to AgentManager\n * and ensure the directory exists on disk\n * - `model()` — apply persisted `modelOverride` via ModelManager\n * - `thinking()` — resolve effective thinking level (request override >\n * per-session override > agent default) and apply\n */\n\nimport { mkdir } from 'node:fs/promises';\n\nimport type { Config } from '../../config/schema.js';\nimport {\n effectiveWorkspacePathForSession,\n normalizeWorkingDirectoryInput,\n resolveEffectiveThinkingLevel,\n type SessionConfigStore,\n} from '../../session/index.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport type { ModelManager } from '../models/index.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('SessionHydrator');\n\nexport interface SessionHydratorOptions {\n sessionConfigStore: SessionConfigStore;\n agentManager: AgentInstanceGateway;\n modelManager: ModelManager;\n /** Effective config snapshot accessor (honours runtime overrides). */\n getConfig: () => Config | undefined;\n}\n\nexport class SessionHydrator {\n private readonly opts: SessionHydratorOptions;\n\n constructor(opts: SessionHydratorOptions) {\n this.opts = opts;\n }\n\n /**\n * Load persisted workingDirectory override into AgentManager and `mkdir -p`\n * the effective workspace path. Safe to call before `getOrCreateAgent`.\n */\n async workspace(sessionKey: string): Promise<void> {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n return;\n }\n const loaded = await this.opts.sessionConfigStore.get(sessionKey);\n if (loaded?.workingDirectoryOverride?.trim()) {\n const wdStored = normalizeWorkingDirectoryInput(loaded.workingDirectoryOverride);\n if (wdStored.ok) {\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, wdStored.path);\n } else {\n log.warn({ sessionKey }, 'Invalid stored workingDirectoryOverride; ignoring');\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, null);\n }\n } else {\n this.opts.agentManager.setSessionWorkspaceOverride(sessionKey, null);\n }\n const effective = effectiveWorkspacePathForSession(cfg, sessionKey, loaded);\n await mkdir(effective, { recursive: true });\n }\n\n /** Apply persisted `modelOverride` to ModelManager (no-op when none stored). */\n async model(sessionKey: string): Promise<void> {\n const cfg = await this.opts.sessionConfigStore.get(sessionKey);\n if (cfg?.modelOverride) {\n await this.opts.modelManager.switchModelForSession(sessionKey, cfg.modelOverride);\n }\n }\n\n /**\n * Resolve the effective thinking level (request override > per-session\n * override > agent default) and apply it to the live agent instance.\n */\n async thinking(sessionKey: string, requestOverride?: string | null): Promise<void> {\n const def = this.opts.getConfig()?.agents?.defaults?.thinkingDefault;\n const level = await resolveEffectiveThinkingLevel(\n this.opts.sessionConfigStore,\n sessionKey,\n requestOverride,\n def,\n );\n this.opts.agentManager.setThinkingLevel(sessionKey, level);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;aA2BqD;AAErD,MAAM,MAAM,aAAa,kBAAkB;AAU3C,IAAa,kBAAb,MAA6B;CAC3B;CAEA,YAAY,MAA8B;AACxC,OAAK,OAAO;;;;;;CAOd,MAAM,UAAU,YAAmC;EACjD,MAAM,MAAM,KAAK,KAAK,WAAW;AACjC,MAAI,CAAC,IACH;EAEF,MAAM,SAAS,MAAM,KAAK,KAAK,mBAAmB,IAAI,WAAW;AACjE,MAAI,QAAQ,0BAA0B,MAAM,EAAE;GAC5C,MAAM,WAAW,+BAA+B,OAAO,yBAAyB;AAChF,OAAI,SAAS,GACX,MAAK,KAAK,aAAa,4BAA4B,YAAY,SAAS,KAAK;QACxE;AACL,QAAI,KAAK,EAAE,YAAY,EAAE,oDAAoD;AAC7E,SAAK,KAAK,aAAa,4BAA4B,YAAY,KAAK;;QAGtE,MAAK,KAAK,aAAa,4BAA4B,YAAY,KAAK;AAGtE,QAAM,MADY,iCAAiC,KAAK,YAAY,OAC/C,EAAE,EAAE,WAAW,MAAM,CAAC;;;CAI7C,MAAM,MAAM,YAAmC;EAC7C,MAAM,MAAM,MAAM,KAAK,KAAK,mBAAmB,IAAI,WAAW;AAC9D,MAAI,KAAK,cACP,OAAM,KAAK,KAAK,aAAa,sBAAsB,YAAY,IAAI,cAAc;;;;;;CAQrF,MAAM,SAAS,YAAoB,iBAAgD;EACjF,MAAM,MAAM,KAAK,KAAK,WAAW,EAAE,QAAQ,UAAU;EACrD,MAAM,QAAQ,MAAM,8BAClB,KAAK,KAAK,oBACV,YACA,iBACA,IACD;AACD,OAAK,KAAK,aAAa,iBAAiB,YAAY,MAAM"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionInspector — read-only / introspection-oriented operations on a session.
|
|
3
|
+
*
|
|
4
|
+
* Owns the five methods previously scattered across `AgentService` that all
|
|
5
|
+
* compute a "summary view" of one session:
|
|
6
|
+
* - `compact` (manual user-triggered compaction)
|
|
7
|
+
* - `btwQuery` (one-shot LLM answer with transcript as background)
|
|
8
|
+
* - `report` (Markdown / JSON `/context` summary)
|
|
9
|
+
* - `agentConfig` (resolved thinking + model + workspace for the Web UI)
|
|
10
|
+
* - `contextUsage` (rough token budget vs estimated transcript)
|
|
11
|
+
*
|
|
12
|
+
* The shared helper `computeStats` keeps the three callsites that need
|
|
13
|
+
* `getWindowStats` / `getCompactionStats` / `estimateTokenUsage` in lockstep.
|
|
14
|
+
*/
|
|
15
|
+
import type { AgentMessage } from '@earendil-works/pi-agent-core';
|
|
16
|
+
import type { ThinkingLevel } from '@earendil-works/pi-agent-core';
|
|
17
|
+
import type { Config } from '../../config/schema.js';
|
|
18
|
+
import { type SessionConfigStore } from '../../session/index.js';
|
|
19
|
+
import type { SessionStore } from '../../session/store.js';
|
|
20
|
+
import type { CompactionResult } from '../memory/compaction.js';
|
|
21
|
+
import type { ModelManager } from '../models/index.js';
|
|
22
|
+
import type { AgentInstanceGateway } from '../agent-instance-gateway.js';
|
|
23
|
+
import type { ReasoningLevel } from '../transcript/thinking-types.js';
|
|
24
|
+
import type { SessionHydrator } from './session-hydrator.js';
|
|
25
|
+
export interface SessionInspectorOptions {
|
|
26
|
+
sessionStore: SessionStore;
|
|
27
|
+
sessionConfigStore: SessionConfigStore;
|
|
28
|
+
modelManager: ModelManager;
|
|
29
|
+
agentManager: AgentInstanceGateway;
|
|
30
|
+
sessionHydrator: SessionHydrator;
|
|
31
|
+
/** Effective config snapshot accessor (honours runtime overrides). */
|
|
32
|
+
getConfig: () => Config | undefined;
|
|
33
|
+
/**
|
|
34
|
+
* Nominal context window the session is budgeted against. Currently derived
|
|
35
|
+
* from `agents.defaults.maxTokens * 4`, defaulting to 128k.
|
|
36
|
+
*/
|
|
37
|
+
getContextWindow: () => number;
|
|
38
|
+
}
|
|
39
|
+
export interface SessionContextUsage {
|
|
40
|
+
estimatedTokens: number;
|
|
41
|
+
contextWindow: number;
|
|
42
|
+
usagePercent: number | null;
|
|
43
|
+
}
|
|
44
|
+
export interface SessionAgentConfigView {
|
|
45
|
+
thinkingLevel: ThinkingLevel;
|
|
46
|
+
model: string;
|
|
47
|
+
reasoningLevel: ReasoningLevel;
|
|
48
|
+
effectiveWorkspacePath: string;
|
|
49
|
+
workingDirectoryLocked: boolean;
|
|
50
|
+
}
|
|
51
|
+
export declare class SessionInspector {
|
|
52
|
+
private readonly opts;
|
|
53
|
+
constructor(opts: SessionInspectorOptions);
|
|
54
|
+
/**
|
|
55
|
+
* Manual compaction triggered by a user / API. Always forces a compaction
|
|
56
|
+
* pass (`force: true` by default) and evicts the in-memory agent so the
|
|
57
|
+
* next turn reloads from the compacted transcript.
|
|
58
|
+
*/
|
|
59
|
+
compact(sessionKey: string, options?: {
|
|
60
|
+
instructions?: string;
|
|
61
|
+
force?: boolean;
|
|
62
|
+
}): Promise<CompactionResult>;
|
|
63
|
+
/** One-shot LLM answer for `/btw`: transcript as background, not persisted. */
|
|
64
|
+
btwQuery(sessionKey: string, question: string): Promise<{
|
|
65
|
+
text: string;
|
|
66
|
+
error?: string;
|
|
67
|
+
}>;
|
|
68
|
+
/** Cheap stats used by both the report and other callers. */
|
|
69
|
+
stats(sessionKey: string, messages: AgentMessage[]): {
|
|
70
|
+
windowStats: ReturnType<SessionStore['getWindowStats']>;
|
|
71
|
+
compactionStats: ReturnType<SessionStore['getCompactionStats']>;
|
|
72
|
+
tokenEstimate: ReturnType<SessionStore['estimateTokenUsage']>;
|
|
73
|
+
};
|
|
74
|
+
/** Rough context usage for TUI footer (estimated tokens vs nominal budget). */
|
|
75
|
+
contextUsage(sessionKey: string): Promise<SessionContextUsage>;
|
|
76
|
+
/** Markdown or JSON summary for `/context`. */
|
|
77
|
+
report(sessionKey: string, mode: 'list' | 'detail' | 'json'): Promise<string>;
|
|
78
|
+
/** Resolved thinking / model / workspace for the Web UI. */
|
|
79
|
+
agentConfig(sessionKey: string): Promise<SessionAgentConfigView>;
|
|
80
|
+
}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { resolveEffectiveAgentProfileForSession } from "../../config/agent-profile.js";
|
|
4
|
+
import { resolveEffectiveReasoningLevel, resolveEffectiveThinkingLevel } from "../../session/thinking-resolve.js";
|
|
5
|
+
import { effectiveWorkspacePathForSession } from "../../session/session-workspace.js";
|
|
6
|
+
import "../../session/index.js";
|
|
7
|
+
import { runBtwQuery } from "../service/btw-query.js";
|
|
8
|
+
import { formatSessionContextReport } from "../service/session-context-report.js";
|
|
9
|
+
//#region src/agent/session/session-inspector.ts
|
|
10
|
+
init_logger();
|
|
11
|
+
const log = createLogger("SessionInspector");
|
|
12
|
+
var SessionInspector = class {
|
|
13
|
+
opts;
|
|
14
|
+
constructor(opts) {
|
|
15
|
+
this.opts = opts;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Manual compaction triggered by a user / API. Always forces a compaction
|
|
19
|
+
* pass (`force: true` by default) and evicts the in-memory agent so the
|
|
20
|
+
* next turn reloads from the compacted transcript.
|
|
21
|
+
*/
|
|
22
|
+
async compact(sessionKey, options) {
|
|
23
|
+
const messages = await this.opts.sessionStore.load(sessionKey);
|
|
24
|
+
const contextWindow = this.opts.getContextWindow();
|
|
25
|
+
const result = await this.opts.sessionStore.compact(sessionKey, messages, contextWindow, options?.instructions, options?.force ?? true);
|
|
26
|
+
if (result.compacted) this.opts.agentManager.removeAgent(sessionKey);
|
|
27
|
+
log.info({
|
|
28
|
+
sessionKey,
|
|
29
|
+
result
|
|
30
|
+
}, "Manual compaction complete");
|
|
31
|
+
return result;
|
|
32
|
+
}
|
|
33
|
+
/** One-shot LLM answer for `/btw`: transcript as background, not persisted. */
|
|
34
|
+
btwQuery(sessionKey, question) {
|
|
35
|
+
return runBtwQuery({
|
|
36
|
+
sessionKey,
|
|
37
|
+
question,
|
|
38
|
+
sessionStore: this.opts.sessionStore,
|
|
39
|
+
modelForSession: this.opts.modelManager.getModelForSession(sessionKey),
|
|
40
|
+
log
|
|
41
|
+
});
|
|
42
|
+
}
|
|
43
|
+
/** Cheap stats used by both the report and other callers. */
|
|
44
|
+
stats(sessionKey, messages) {
|
|
45
|
+
return {
|
|
46
|
+
windowStats: this.opts.sessionStore.getWindowStats(messages),
|
|
47
|
+
compactionStats: this.opts.sessionStore.getCompactionStats(sessionKey),
|
|
48
|
+
tokenEstimate: this.opts.sessionStore.estimateTokenUsage(sessionKey, messages)
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/** Rough context usage for TUI footer (estimated tokens vs nominal budget). */
|
|
52
|
+
async contextUsage(sessionKey) {
|
|
53
|
+
const messages = await this.opts.sessionStore.load(sessionKey);
|
|
54
|
+
const contextWindow = this.opts.getContextWindow();
|
|
55
|
+
const estimatedTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);
|
|
56
|
+
return {
|
|
57
|
+
estimatedTokens,
|
|
58
|
+
contextWindow,
|
|
59
|
+
usagePercent: contextWindow > 0 ? Math.min(100, Math.round(estimatedTokens / contextWindow * 100)) : null
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
/** Markdown or JSON summary for `/context`. */
|
|
63
|
+
async report(sessionKey, mode) {
|
|
64
|
+
const cfg = this.opts.getConfig();
|
|
65
|
+
if (!cfg) throw new Error("SessionInspector requires a config snapshot to render report");
|
|
66
|
+
const messages = await this.opts.sessionStore.load(sessionKey);
|
|
67
|
+
const cw = this.opts.getContextWindow();
|
|
68
|
+
const computed = this.stats(sessionKey, messages);
|
|
69
|
+
const model = this.opts.modelManager.getModelForSession(sessionKey);
|
|
70
|
+
const workspace = effectiveWorkspacePathForSession(cfg, sessionKey, await this.opts.sessionConfigStore.get(sessionKey));
|
|
71
|
+
const estTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);
|
|
72
|
+
const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);
|
|
73
|
+
const defaults = cfg.agents?.defaults;
|
|
74
|
+
const compaction = defaults?.compaction;
|
|
75
|
+
const tools = defaults?.tools;
|
|
76
|
+
const toolsSummary = tools && typeof tools === "object" ? Object.entries(tools).filter(([, v]) => v === true).map(([k]) => k).slice(0, 16).join(", ") || "(none explicitly true)" : "(see agents.defaults.tools in config)";
|
|
77
|
+
return formatSessionContextReport({
|
|
78
|
+
sessionKey,
|
|
79
|
+
mode,
|
|
80
|
+
model,
|
|
81
|
+
workspacePath: workspace,
|
|
82
|
+
agentId: profile.agentId,
|
|
83
|
+
messageCount: messages.length,
|
|
84
|
+
contextWindowNominal: cw,
|
|
85
|
+
estimatedTranscriptTokens: estTokens,
|
|
86
|
+
thinkingDefault: defaults?.thinkingDefault,
|
|
87
|
+
reasoningDefault: defaults?.reasoningDefault,
|
|
88
|
+
verboseDefault: defaults?.verboseDefault,
|
|
89
|
+
compaction,
|
|
90
|
+
toolsFlagsSummary: toolsSummary,
|
|
91
|
+
windowStats: computed.windowStats,
|
|
92
|
+
compactionRunStats: computed.compactionStats
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
/** Resolved thinking / model / workspace for the Web UI. */
|
|
96
|
+
async agentConfig(sessionKey) {
|
|
97
|
+
await this.opts.sessionHydrator.model(sessionKey);
|
|
98
|
+
const cfg = this.opts.getConfig();
|
|
99
|
+
if (!cfg) throw new Error("SessionInspector requires a config snapshot to resolve agent config");
|
|
100
|
+
const sc = await this.opts.sessionConfigStore.get(sessionKey);
|
|
101
|
+
const profileModelRef = resolveEffectiveAgentProfileForSession(cfg, sessionKey).primaryModelRef?.trim();
|
|
102
|
+
if (profileModelRef) this.opts.modelManager.setSessionProfileDefault(sessionKey, profileModelRef);
|
|
103
|
+
const defThink = cfg.agents?.defaults?.thinkingDefault ?? "medium";
|
|
104
|
+
const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, null, defThink);
|
|
105
|
+
const defReason = cfg.agents?.defaults?.reasoningDefault ?? "stream";
|
|
106
|
+
const reasoningLevel = await resolveEffectiveReasoningLevel(this.opts.sessionConfigStore, sessionKey, defReason);
|
|
107
|
+
return {
|
|
108
|
+
thinkingLevel: level,
|
|
109
|
+
model: this.opts.modelManager.getModelForSession(sessionKey),
|
|
110
|
+
reasoningLevel,
|
|
111
|
+
effectiveWorkspacePath: effectiveWorkspacePathForSession(cfg, sessionKey, sc),
|
|
112
|
+
workingDirectoryLocked: Boolean(sc?.workingDirectoryOverride?.trim())
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
//#endregion
|
|
117
|
+
export { SessionInspector };
|
|
118
|
+
|
|
119
|
+
//# sourceMappingURL=session-inspector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"session-inspector.js","names":[],"sources":["../../../../src/agent/session/session-inspector.ts"],"sourcesContent":["/**\n * SessionInspector — read-only / introspection-oriented operations on a session.\n *\n * Owns the five methods previously scattered across `AgentService` that all\n * compute a \"summary view\" of one session:\n * - `compact` (manual user-triggered compaction)\n * - `btwQuery` (one-shot LLM answer with transcript as background)\n * - `report` (Markdown / JSON `/context` summary)\n * - `agentConfig` (resolved thinking + model + workspace for the Web UI)\n * - `contextUsage` (rough token budget vs estimated transcript)\n *\n * The shared helper `computeStats` keeps the three callsites that need\n * `getWindowStats` / `getCompactionStats` / `estimateTokenUsage` in lockstep.\n */\n\nimport type { AgentMessage } from '@earendil-works/pi-agent-core';\nimport type { ThinkingLevel } from '@earendil-works/pi-agent-core';\n\nimport type { Config } from '../../config/schema.js';\nimport { resolveEffectiveAgentProfileForSession } from '../../config/agent-profile.js';\nimport {\n effectiveWorkspacePathForSession,\n resolveEffectiveReasoningLevel,\n resolveEffectiveThinkingLevel,\n type SessionConfigStore,\n} from '../../session/index.js';\nimport type { SessionStore } from '../../session/store.js';\nimport type { CompactionResult } from '../memory/compaction.js';\nimport type { ModelManager } from '../models/index.js';\nimport type { AgentInstanceGateway } from '../agent-instance-gateway.js';\nimport { runBtwQuery } from '../service/btw-query.js';\nimport { formatSessionContextReport } from '../service/session-context-report.js';\nimport type { ReasoningLevel } from '../transcript/thinking-types.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SessionHydrator } from './session-hydrator.js';\n\nconst log = createLogger('SessionInspector');\n\nexport interface SessionInspectorOptions {\n sessionStore: SessionStore;\n sessionConfigStore: SessionConfigStore;\n modelManager: ModelManager;\n agentManager: AgentInstanceGateway;\n sessionHydrator: SessionHydrator;\n /** Effective config snapshot accessor (honours runtime overrides). */\n getConfig: () => Config | undefined;\n /**\n * Nominal context window the session is budgeted against. Currently derived\n * from `agents.defaults.maxTokens * 4`, defaulting to 128k.\n */\n getContextWindow: () => number;\n}\n\nexport interface SessionContextUsage {\n estimatedTokens: number;\n contextWindow: number;\n usagePercent: number | null;\n}\n\nexport interface SessionAgentConfigView {\n thinkingLevel: ThinkingLevel;\n model: string;\n reasoningLevel: ReasoningLevel;\n effectiveWorkspacePath: string;\n workingDirectoryLocked: boolean;\n}\n\nexport class SessionInspector {\n private readonly opts: SessionInspectorOptions;\n\n constructor(opts: SessionInspectorOptions) {\n this.opts = opts;\n }\n\n /**\n * Manual compaction triggered by a user / API. Always forces a compaction\n * pass (`force: true` by default) and evicts the in-memory agent so the\n * next turn reloads from the compacted transcript.\n */\n async compact(\n sessionKey: string,\n options?: { instructions?: string; force?: boolean },\n ): Promise<CompactionResult> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = this.opts.getContextWindow();\n const result = await this.opts.sessionStore.compact(\n sessionKey,\n messages,\n contextWindow,\n options?.instructions,\n options?.force ?? true,\n );\n if (result.compacted) {\n this.opts.agentManager.removeAgent(sessionKey);\n }\n log.info({ sessionKey, result }, 'Manual compaction complete');\n return result;\n }\n\n /** One-shot LLM answer for `/btw`: transcript as background, not persisted. */\n btwQuery(sessionKey: string, question: string): Promise<{ text: string; error?: string }> {\n return runBtwQuery({\n sessionKey,\n question,\n sessionStore: this.opts.sessionStore,\n modelForSession: this.opts.modelManager.getModelForSession(sessionKey),\n log,\n });\n }\n\n /** Cheap stats used by both the report and other callers. */\n stats(sessionKey: string, messages: AgentMessage[]): {\n windowStats: ReturnType<SessionStore['getWindowStats']>;\n compactionStats: ReturnType<SessionStore['getCompactionStats']>;\n tokenEstimate: ReturnType<SessionStore['estimateTokenUsage']>;\n } {\n return {\n windowStats: this.opts.sessionStore.getWindowStats(messages),\n compactionStats: this.opts.sessionStore.getCompactionStats(sessionKey),\n tokenEstimate: this.opts.sessionStore.estimateTokenUsage(sessionKey, messages),\n };\n }\n\n /** Rough context usage for TUI footer (estimated tokens vs nominal budget). */\n async contextUsage(sessionKey: string): Promise<SessionContextUsage> {\n const messages = await this.opts.sessionStore.load(sessionKey);\n const contextWindow = this.opts.getContextWindow();\n const estimatedTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const usagePercent =\n contextWindow > 0 ? Math.min(100, Math.round((estimatedTokens / contextWindow) * 100)) : null;\n return { estimatedTokens, contextWindow, usagePercent };\n }\n\n /** Markdown or JSON summary for `/context`. */\n async report(sessionKey: string, mode: 'list' | 'detail' | 'json'): Promise<string> {\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to render report');\n }\n const messages = await this.opts.sessionStore.load(sessionKey);\n const cw = this.opts.getContextWindow();\n const computed = this.stats(sessionKey, messages);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n const workspace = effectiveWorkspacePathForSession(cfg, sessionKey, sc);\n const estTokens = await this.opts.sessionStore.estimateTokenUsage(sessionKey, messages);\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const defaults = cfg.agents?.defaults;\n const compaction = defaults?.compaction;\n const tools = defaults?.tools;\n\n const toolsSummary =\n tools && typeof tools === 'object'\n ? Object.entries(tools as Record<string, unknown>)\n .filter(([, v]) => v === true)\n .map(([k]) => k)\n .slice(0, 16)\n .join(', ') || '(none explicitly true)'\n : '(see agents.defaults.tools in config)';\n\n return formatSessionContextReport({\n sessionKey,\n mode,\n model,\n workspacePath: workspace,\n agentId: profile.agentId,\n messageCount: messages.length,\n contextWindowNominal: cw,\n estimatedTranscriptTokens: estTokens,\n thinkingDefault: defaults?.thinkingDefault,\n reasoningDefault: defaults?.reasoningDefault,\n verboseDefault: defaults?.verboseDefault,\n compaction,\n toolsFlagsSummary: toolsSummary,\n windowStats: computed.windowStats,\n compactionRunStats: computed.compactionStats,\n });\n }\n\n /** Resolved thinking / model / workspace for the Web UI. */\n async agentConfig(sessionKey: string): Promise<SessionAgentConfigView> {\n await this.opts.sessionHydrator.model(sessionKey);\n const cfg = this.opts.getConfig();\n if (!cfg) {\n throw new Error('SessionInspector requires a config snapshot to resolve agent config');\n }\n const sc = await this.opts.sessionConfigStore.get(sessionKey);\n\n // Ensure model display matches the effective agent profile even before an Agent instance exists.\n // Otherwise `ModelManager.getModelForSession()` falls back to the global default until the first turn creates the agent.\n const profile = resolveEffectiveAgentProfileForSession(cfg, sessionKey);\n const profileModelRef = profile.primaryModelRef?.trim();\n if (profileModelRef) {\n this.opts.modelManager.setSessionProfileDefault(sessionKey, profileModelRef);\n }\n\n const defThink = cfg.agents?.defaults?.thinkingDefault ?? 'medium';\n const level = await resolveEffectiveThinkingLevel(this.opts.sessionConfigStore, sessionKey, null, defThink);\n const defReason = (cfg.agents?.defaults?.reasoningDefault ?? 'stream') as ReasoningLevel;\n const reasoningLevel = await resolveEffectiveReasoningLevel(this.opts.sessionConfigStore, sessionKey, defReason);\n const model = this.opts.modelManager.getModelForSession(sessionKey);\n return {\n thinkingLevel: level,\n model,\n reasoningLevel,\n effectiveWorkspacePath: effectiveWorkspacePathForSession(cfg, sessionKey, sc),\n workingDirectoryLocked: Boolean(sc?.workingDirectoryOverride?.trim()),\n };\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SessionStateBag — typed container for the per-session state previously held
|
|
3
|
+
* as private fields on `AgentService` (six `Map<sessionKey, …>` instances with
|
|
4
|
+
* no shared cleanup path).
|
|
5
|
+
*
|
|
6
|
+
* Goals:
|
|
7
|
+
* - Single `disposeSession(sessionKey)` entry that clears every slot for a key
|
|
8
|
+
* (and runs the event unsubscriber, which was easy to forget previously).
|
|
9
|
+
* - Optional TTL sweep for slots whose lifecycle is not bound to an explicit
|
|
10
|
+
* register/unregister pair, so long-running Gateways do not accumulate stale
|
|
11
|
+
* per-session entries from disconnected webchat clients or finished turns.
|
|
12
|
+
* - Hard upper bound for the same TTL'd slots to bound worst-case memory.
|
|
13
|
+
*
|
|
14
|
+
* Slots whose lifetime is fully owned by explicit lifecycle calls
|
|
15
|
+
* (`inboundTurnDepth`, `directStreamOutcome`, `embeddedStreamText`,
|
|
16
|
+
* `sessionEventUnsubscribers`) are still cleared via `disposeSession`, but they
|
|
17
|
+
* are NOT subject to TTL — sweeping them would race with their owners.
|
|
18
|
+
*/
|
|
19
|
+
export type WebchatSsePublisher = (event: {
|
|
20
|
+
type: string;
|
|
21
|
+
[key: string]: unknown;
|
|
22
|
+
}) => void;
|
|
23
|
+
export interface PersistentGoalStreamOutcome {
|
|
24
|
+
skipPersistentGoalPostTurn: boolean;
|
|
25
|
+
}
|
|
26
|
+
export interface SessionStateBagOptions {
|
|
27
|
+
/** Idle TTL for TTL-managed slots. Defaults to 1 hour. Set to 0 to disable sweeping. */
|
|
28
|
+
ttlMs?: number;
|
|
29
|
+
/** Sweep cadence. Defaults to 10 minutes. */
|
|
30
|
+
sweepIntervalMs?: number;
|
|
31
|
+
/** Hard upper bound on entries for TTL-managed slots. Defaults to 5000. */
|
|
32
|
+
maxEntries?: number;
|
|
33
|
+
/** Inject a clock for tests. */
|
|
34
|
+
now?: () => number;
|
|
35
|
+
}
|
|
36
|
+
export declare class SessionStateBag {
|
|
37
|
+
/** Webchat SSE publisher (register/unregister + TTL fallback). */
|
|
38
|
+
private readonly webchatPublishers;
|
|
39
|
+
/** Last assistant plain text (TTL + LRU). */
|
|
40
|
+
private readonly lastAssistantText;
|
|
41
|
+
/** Stream text for the in-flight embedded turn (managed by turn). */
|
|
42
|
+
private readonly embeddedStreamText;
|
|
43
|
+
/** Persistent-goal stream outcome (take-and-delete). */
|
|
44
|
+
private readonly directStreamOutcome;
|
|
45
|
+
/** Concurrent inbound turn depth (counter). */
|
|
46
|
+
private readonly inboundTurnDepth;
|
|
47
|
+
/** Agent-event subscription tear-downs (run on dispose). */
|
|
48
|
+
private readonly sessionEventUnsubscribers;
|
|
49
|
+
private readonly ttlMs;
|
|
50
|
+
private readonly maxEntries;
|
|
51
|
+
private readonly now;
|
|
52
|
+
private readonly sweepTimer;
|
|
53
|
+
constructor(opts?: SessionStateBagOptions);
|
|
54
|
+
registerWebchatPublisher(sessionKey: string, publisher: WebchatSsePublisher): void;
|
|
55
|
+
unregisterWebchatPublisher(sessionKey: string): void;
|
|
56
|
+
getWebchatPublisher(sessionKey: string): WebchatSsePublisher | undefined;
|
|
57
|
+
setLastAssistantText(sessionKey: string, text: string): void;
|
|
58
|
+
getLastAssistantText(sessionKey: string): string | undefined;
|
|
59
|
+
appendEmbeddedStreamText(sessionKey: string, chunk: string): string;
|
|
60
|
+
clearEmbeddedStreamText(sessionKey: string): void;
|
|
61
|
+
recordPersistentGoalStreamOutcome(sessionKey: string, outcome: PersistentGoalStreamOutcome): void;
|
|
62
|
+
takePersistentGoalStreamOutcome(sessionKey: string): PersistentGoalStreamOutcome | undefined;
|
|
63
|
+
beginInboundTurn(sessionKey: string): void;
|
|
64
|
+
endInboundTurn(sessionKey: string): void;
|
|
65
|
+
getInboundTurnDepth(sessionKey: string): number;
|
|
66
|
+
setSessionEventUnsubscriber(sessionKey: string, unsubscribe: () => void): void;
|
|
67
|
+
hasSessionEventUnsubscriber(sessionKey: string): boolean;
|
|
68
|
+
/** Clear every slot for `sessionKey`, invoking the unsubscriber if registered. */
|
|
69
|
+
disposeSession(sessionKey: string): void;
|
|
70
|
+
/** Tear down every session (process stop / hot reload). */
|
|
71
|
+
disposeAll(): void;
|
|
72
|
+
/** Test helper. */
|
|
73
|
+
size(): {
|
|
74
|
+
webchatPublishers: number;
|
|
75
|
+
lastAssistantText: number;
|
|
76
|
+
embeddedStreamText: number;
|
|
77
|
+
directStreamOutcome: number;
|
|
78
|
+
inboundTurnDepth: number;
|
|
79
|
+
sessionEventUnsubscribers: number;
|
|
80
|
+
};
|
|
81
|
+
private sweepStaleEntries;
|
|
82
|
+
private enforceCap;
|
|
83
|
+
}
|