@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
|
@@ -4,76 +4,72 @@ import { extractTextContent } from "../context/workspace.js";
|
|
|
4
4
|
//#region src/agent/orchestration/agent-event-handler.ts
|
|
5
5
|
init_logger();
|
|
6
6
|
const log = createLogger("AgentEventHandler");
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
this.toolChainTracker = config.toolChainTracker;
|
|
25
|
-
this.selfVerifyMiddleware = config.selfVerifyMiddleware;
|
|
26
|
-
this.systemReminder = config.systemReminder;
|
|
27
|
-
this.toolUsageAnalyzer = config.toolUsageAnalyzer;
|
|
28
|
-
this.errorPatternMatcher = config.errorPatternMatcher;
|
|
29
|
-
this.modelManager = config.modelManager;
|
|
7
|
+
/**
|
|
8
|
+
* Typed pub/sub for agent events. Listeners run in registration order; the bus
|
|
9
|
+
* itself is synchronous — listeners that need async work must dispatch their own
|
|
10
|
+
* promises (typically by awaiting and logging on error, like the lifecycle hooks).
|
|
11
|
+
*/
|
|
12
|
+
var SessionEventBus = class {
|
|
13
|
+
listeners = /* @__PURE__ */ new Map();
|
|
14
|
+
on(type, listener) {
|
|
15
|
+
const bucket = this.listeners.get(type) ?? [];
|
|
16
|
+
bucket.push(listener);
|
|
17
|
+
this.listeners.set(type, bucket);
|
|
18
|
+
return () => {
|
|
19
|
+
const current = this.listeners.get(type);
|
|
20
|
+
if (!current) return;
|
|
21
|
+
const idx = current.indexOf(listener);
|
|
22
|
+
if (idx >= 0) current.splice(idx, 1);
|
|
23
|
+
};
|
|
30
24
|
}
|
|
31
|
-
|
|
32
|
-
* Handle an agent event
|
|
33
|
-
*/
|
|
34
|
-
handle(event, context) {
|
|
25
|
+
dispatch(event, context) {
|
|
35
26
|
if (!context) {
|
|
36
27
|
if (event.type !== "message_update") log.warn({ eventType: event.type }, `Agent event ignored (no SessionContext): ${event.type}`);
|
|
37
28
|
return;
|
|
38
29
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
case "turn_start":
|
|
44
|
-
this.handleTurnStart(event, context);
|
|
45
|
-
break;
|
|
46
|
-
case "message_start":
|
|
47
|
-
this.handleMessageStart(event, context);
|
|
48
|
-
break;
|
|
49
|
-
case "message_end":
|
|
50
|
-
this.handleMessageEnd(event, context);
|
|
51
|
-
break;
|
|
52
|
-
case "tool_execution_start":
|
|
53
|
-
this.handleToolExecutionStart(event, context);
|
|
54
|
-
break;
|
|
55
|
-
case "tool_execution_update":
|
|
56
|
-
this.handleToolExecutionUpdate(event, context);
|
|
57
|
-
break;
|
|
58
|
-
case "tool_execution_end":
|
|
59
|
-
this.handleToolExecutionEnd(event, context);
|
|
60
|
-
break;
|
|
61
|
-
case "message_update": break;
|
|
62
|
-
case "turn_end":
|
|
63
|
-
this.handleTurnEnd(event, context);
|
|
64
|
-
break;
|
|
65
|
-
case "agent_end":
|
|
66
|
-
this.handleAgentEnd(event, context);
|
|
67
|
-
break;
|
|
68
|
-
default: log.debug({ eventType: event.type }, "Unhandled event type");
|
|
69
|
-
}
|
|
30
|
+
const exact = this.listeners.get(event.type);
|
|
31
|
+
if (exact) for (const listener of exact) listener(event, context);
|
|
32
|
+
const all = this.listeners.get("all");
|
|
33
|
+
if (all) for (const listener of all) listener(event, context);
|
|
70
34
|
}
|
|
71
|
-
|
|
35
|
+
};
|
|
36
|
+
function installProgressListener(bus, progressManager) {
|
|
37
|
+
bus.on("agent_start", () => {
|
|
72
38
|
log.debug("Agent turn started");
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
39
|
+
progressManager.startTask();
|
|
40
|
+
});
|
|
41
|
+
bus.on("turn_start", () => {
|
|
42
|
+
log.debug("Turn started");
|
|
43
|
+
progressManager.onTurnStart();
|
|
44
|
+
});
|
|
45
|
+
bus.on("tool_execution_start", (event) => {
|
|
46
|
+
const e = event;
|
|
47
|
+
log.debug({
|
|
48
|
+
tool: e.toolName,
|
|
49
|
+
args: e.args
|
|
50
|
+
}, "Tool execution started");
|
|
51
|
+
progressManager.onToolStart(e.toolName, e.args || {});
|
|
52
|
+
});
|
|
53
|
+
bus.on("tool_execution_update", (event) => {
|
|
54
|
+
const e = event;
|
|
55
|
+
progressManager.onToolUpdate(e.toolName, e.partialResult);
|
|
56
|
+
});
|
|
57
|
+
bus.on("tool_execution_end", (event) => {
|
|
58
|
+
const e = event;
|
|
59
|
+
log.debug({
|
|
60
|
+
tool: e.toolName,
|
|
61
|
+
isError: e.isError
|
|
62
|
+
}, "Tool execution complete");
|
|
63
|
+
progressManager.onToolEnd(e.toolName, e.result, e.isError);
|
|
64
|
+
});
|
|
65
|
+
bus.on("agent_end", () => {
|
|
66
|
+
progressManager.endTask();
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
function installRequestLimitListener(bus, deps) {
|
|
70
|
+
bus.on("agent_start", (_event, context) => {
|
|
71
|
+
const result = deps.requestLimiter.recordRequest();
|
|
72
|
+
deps.lifecycleManager.emit("llm_request", context.sessionKey, {
|
|
77
73
|
requestNumber: result.count,
|
|
78
74
|
maxRequests: result.limit
|
|
79
75
|
}, context).catch((err) => {
|
|
@@ -86,51 +82,42 @@ var AgentEventHandler = class {
|
|
|
86
82
|
maxRequests: result.limit
|
|
87
83
|
}, `Lifecycle emit llm_request failed: ${em}`);
|
|
88
84
|
});
|
|
89
|
-
|
|
85
|
+
deps.progressManager.onRequestLimitStatus(result.count, result.limit, result.remaining, result.isWarning, result.shouldStop);
|
|
90
86
|
if (result.shouldStop) log.error({
|
|
91
87
|
count: result.count,
|
|
92
88
|
limit: result.limit,
|
|
93
89
|
sessionKey: context.sessionKey
|
|
94
90
|
}, `Request limit reached (${result.count}/${result.limit}) for session`);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
const
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
const toolEvent = event;
|
|
126
|
-
log.debug({
|
|
127
|
-
tool: toolEvent.toolName,
|
|
128
|
-
args: toolEvent.args
|
|
129
|
-
}, "Tool execution started");
|
|
130
|
-
this.progressManager.onToolStart(toolEvent.toolName, toolEvent.args || {});
|
|
131
|
-
this.lifecycleManager.emit("tool_call_start", context.sessionKey, {
|
|
132
|
-
toolName: toolEvent.toolName,
|
|
133
|
-
arguments: toolEvent.args || {},
|
|
91
|
+
});
|
|
92
|
+
bus.on("turn_end", () => {
|
|
93
|
+
deps.requestLimiter.reset();
|
|
94
|
+
});
|
|
95
|
+
}
|
|
96
|
+
function installLifecycleHookListener(bus, lifecycleManager) {
|
|
97
|
+
bus.on("message_end", (event, context) => {
|
|
98
|
+
const e = event;
|
|
99
|
+
if (e.message?.role !== "assistant") return;
|
|
100
|
+
const content = e.message.content;
|
|
101
|
+
const text = Array.isArray(content) ? extractTextContent(content) : String(content);
|
|
102
|
+
log.debug({ contentLength: text.length }, "Assistant response complete");
|
|
103
|
+
lifecycleManager.emit("llm_response", context.sessionKey, {
|
|
104
|
+
response: text,
|
|
105
|
+
usage: e.message.usage
|
|
106
|
+
}, context).catch((err) => {
|
|
107
|
+
const em = err instanceof Error ? err.message : String(err);
|
|
108
|
+
log.warn({
|
|
109
|
+
err,
|
|
110
|
+
errorMessage: em,
|
|
111
|
+
sessionKey: context.sessionKey,
|
|
112
|
+
responseChars: text.length
|
|
113
|
+
}, `Lifecycle emit llm_response failed: ${em}`);
|
|
114
|
+
});
|
|
115
|
+
});
|
|
116
|
+
bus.on("tool_execution_start", (event, context) => {
|
|
117
|
+
const e = event;
|
|
118
|
+
lifecycleManager.emit("tool_call_start", context.sessionKey, {
|
|
119
|
+
toolName: e.toolName,
|
|
120
|
+
arguments: e.args || {},
|
|
134
121
|
attemptNumber: 1,
|
|
135
122
|
maxAttempts: 3
|
|
136
123
|
}, context).catch((err) => {
|
|
@@ -139,29 +126,18 @@ var AgentEventHandler = class {
|
|
|
139
126
|
err,
|
|
140
127
|
errorMessage: em,
|
|
141
128
|
sessionKey: context.sessionKey,
|
|
142
|
-
tool:
|
|
129
|
+
tool: e.toolName
|
|
143
130
|
}, `Lifecycle emit tool_call_start failed: ${em}`);
|
|
144
131
|
});
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
log.debug({
|
|
155
|
-
tool: toolEvent.toolName,
|
|
156
|
-
isError: toolEvent.isError
|
|
157
|
-
}, "Tool execution complete");
|
|
158
|
-
this.progressManager.onToolEnd(toolEvent.toolName, toolEvent.result, toolEvent.isError);
|
|
159
|
-
const durationMs = toolEvent.durationMs || 0;
|
|
160
|
-
this.lifecycleManager.emit("tool_call_end", context.sessionKey, {
|
|
161
|
-
toolName: toolEvent.toolName,
|
|
162
|
-
success: !toolEvent.isError,
|
|
163
|
-
result: toolEvent.result,
|
|
164
|
-
error: toolEvent.isError ? String(toolEvent.result) : void 0,
|
|
132
|
+
});
|
|
133
|
+
bus.on("tool_execution_end", (event, context) => {
|
|
134
|
+
const e = event;
|
|
135
|
+
const durationMs = e.durationMs || 0;
|
|
136
|
+
lifecycleManager.emit("tool_call_end", context.sessionKey, {
|
|
137
|
+
toolName: e.toolName,
|
|
138
|
+
success: !e.isError,
|
|
139
|
+
result: e.result,
|
|
140
|
+
error: e.isError ? String(e.result) : void 0,
|
|
165
141
|
durationMs
|
|
166
142
|
}, context).catch((err) => {
|
|
167
143
|
const em = err instanceof Error ? err.message : String(err);
|
|
@@ -169,67 +145,129 @@ var AgentEventHandler = class {
|
|
|
169
145
|
err,
|
|
170
146
|
errorMessage: em,
|
|
171
147
|
sessionKey: context.sessionKey,
|
|
172
|
-
tool:
|
|
148
|
+
tool: e.toolName
|
|
173
149
|
}, `Lifecycle hook tool_call_end failed: ${em}`);
|
|
174
150
|
});
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
function installSystemReminderListener(bus, systemReminder) {
|
|
154
|
+
bus.on("tool_execution_end", (event) => {
|
|
155
|
+
const e = event;
|
|
156
|
+
e.result = systemReminder.appendToResult(e.result);
|
|
157
|
+
});
|
|
158
|
+
}
|
|
159
|
+
function installToolChainListener(bus, toolChainTracker) {
|
|
160
|
+
bus.on("turn_start", (_event, context) => {
|
|
161
|
+
toolChainTracker.startChain(context.sessionKey);
|
|
162
|
+
});
|
|
163
|
+
bus.on("tool_execution_start", (event, context) => {
|
|
164
|
+
const e = event;
|
|
165
|
+
toolChainTracker.recordCall(context.sessionKey, e.toolName, e.args || {}, 0);
|
|
166
|
+
});
|
|
167
|
+
bus.on("tool_execution_end", (event, context) => {
|
|
168
|
+
const e = event;
|
|
169
|
+
const durationMs = e.durationMs || 0;
|
|
170
|
+
const chain = toolChainTracker.getCurrentChain(context.sessionKey);
|
|
171
|
+
if (!chain) return;
|
|
172
|
+
const lastNode = chain.nodes[chain.nodes.length - 1];
|
|
173
|
+
if (lastNode && lastNode.toolName === e.toolName) toolChainTracker.recordResult(context.sessionKey, lastNode.id, e.result, e.isError ? "Tool execution failed" : void 0, durationMs);
|
|
174
|
+
});
|
|
175
|
+
bus.on("turn_end", (_event, context) => {
|
|
176
|
+
toolChainTracker.endChain(context.sessionKey);
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
function installToolUsageListener(bus, toolUsageAnalyzer) {
|
|
180
|
+
bus.on("tool_execution_end", (event) => {
|
|
181
|
+
const e = event;
|
|
182
|
+
const durationMs = e.durationMs || 0;
|
|
183
|
+
toolUsageAnalyzer.recordUsage(e.toolName, !e.isError, durationMs);
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
function extractErrorText(result) {
|
|
187
|
+
if (typeof result === "string") return result;
|
|
188
|
+
if (result && typeof result === "object") {
|
|
189
|
+
const obj = result;
|
|
190
|
+
if (typeof obj.error === "string") return obj.error;
|
|
191
|
+
if (typeof obj.message === "string") return obj.message;
|
|
192
|
+
return JSON.stringify(result);
|
|
197
193
|
}
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
194
|
+
return String(result);
|
|
195
|
+
}
|
|
196
|
+
function installErrorTrackingListener(bus, deps) {
|
|
197
|
+
bus.on("tool_execution_end", (event) => {
|
|
198
|
+
const e = event;
|
|
199
|
+
if (!e.isError) return;
|
|
200
|
+
const errorText = extractErrorText(e.result);
|
|
201
|
+
deps.errorTracker.recordFailure(e.toolName, errorText);
|
|
202
|
+
const errorMatch = deps.errorPatternMatcher.matchError(errorText);
|
|
203
|
+
if (errorMatch.matched && errorMatch.pattern) {
|
|
204
|
+
const preview = errorText.length > 120 ? `${errorText.slice(0, 120)}…` : errorText;
|
|
205
|
+
log.warn({
|
|
206
|
+
tool: e.toolName,
|
|
207
|
+
pattern: errorMatch.pattern.name,
|
|
208
|
+
errorPreview: preview
|
|
209
|
+
}, `Tool error matched pattern "${errorMatch.pattern.name}" (${e.toolName}): ${preview}`);
|
|
210
|
+
}
|
|
211
|
+
});
|
|
212
|
+
bus.on("turn_end", () => {
|
|
213
|
+
deps.errorTracker.reset();
|
|
214
|
+
});
|
|
215
|
+
}
|
|
216
|
+
function installSelfVerifyListener(bus, selfVerifyMiddleware) {
|
|
217
|
+
bus.on("tool_execution_start", (event) => {
|
|
218
|
+
const e = event;
|
|
219
|
+
const args = e.args;
|
|
220
|
+
const toolName = e.toolName;
|
|
202
221
|
if (!toolName || !args) return;
|
|
203
222
|
const name = toolName.toLowerCase();
|
|
204
|
-
if (name.includes("write") && args.path)
|
|
205
|
-
else if (name.includes("edit") && args.path)
|
|
206
|
-
}
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
223
|
+
if (name.includes("write") && args.path) selfVerifyMiddleware.recordEdit(String(args.path), "write");
|
|
224
|
+
else if (name.includes("edit") && args.path) selfVerifyMiddleware.recordEdit(String(args.path), "edit");
|
|
225
|
+
});
|
|
226
|
+
bus.on("turn_end", () => {
|
|
227
|
+
selfVerifyMiddleware.onTurnStart();
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
/**
|
|
231
|
+
* Thin façade over {@link SessionEventBus} that pre-registers all built-in
|
|
232
|
+
* listeners in their required order. `handle(event, ctx)` is the entry point
|
|
233
|
+
* used by `AgentService.handleSessionEvent`; extensions can hook in via
|
|
234
|
+
* {@link registerListener} without touching this class.
|
|
235
|
+
*/
|
|
236
|
+
var AgentEventHandler = class {
|
|
237
|
+
bus;
|
|
238
|
+
constructor(config) {
|
|
239
|
+
this.bus = new SessionEventBus();
|
|
240
|
+
installProgressListener(this.bus, config.progressManager);
|
|
241
|
+
installRequestLimitListener(this.bus, {
|
|
242
|
+
requestLimiter: config.requestLimiter,
|
|
243
|
+
progressManager: config.progressManager,
|
|
244
|
+
lifecycleManager: config.lifecycleManager
|
|
245
|
+
});
|
|
246
|
+
installLifecycleHookListener(this.bus, config.lifecycleManager);
|
|
247
|
+
installSystemReminderListener(this.bus, config.systemReminder);
|
|
248
|
+
installToolUsageListener(this.bus, config.toolUsageAnalyzer);
|
|
249
|
+
installToolChainListener(this.bus, config.toolChainTracker);
|
|
250
|
+
installErrorTrackingListener(this.bus, {
|
|
251
|
+
errorTracker: config.errorTracker,
|
|
252
|
+
errorPatternMatcher: config.errorPatternMatcher
|
|
253
|
+
});
|
|
254
|
+
installSelfVerifyListener(this.bus, config.selfVerifyMiddleware);
|
|
213
255
|
}
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
const obj = result;
|
|
218
|
-
if (obj.error && typeof obj.error === "string") return obj.error;
|
|
219
|
-
if (obj.message && typeof obj.message === "string") return obj.message;
|
|
220
|
-
return JSON.stringify(result);
|
|
221
|
-
}
|
|
222
|
-
return String(result);
|
|
256
|
+
/** Dispatch a pi-agent event to all registered listeners. */
|
|
257
|
+
handle(event, context) {
|
|
258
|
+
this.bus.dispatch(event, context);
|
|
223
259
|
}
|
|
224
260
|
/**
|
|
225
|
-
*
|
|
261
|
+
* Register an additional listener (e.g. from an extension). Returns an
|
|
262
|
+
* unsubscribe function. Listeners run after the built-ins in registration
|
|
263
|
+
* order; if you need to run before a built-in, you must create your own
|
|
264
|
+
* {@link SessionEventBus} instance.
|
|
226
265
|
*/
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
return Date.now() - this.taskStartTime;
|
|
266
|
+
registerListener(type, listener) {
|
|
267
|
+
return this.bus.on(type, listener);
|
|
230
268
|
}
|
|
231
269
|
};
|
|
232
270
|
//#endregion
|
|
233
|
-
export { AgentEventHandler };
|
|
271
|
+
export { AgentEventHandler, SessionEventBus };
|
|
234
272
|
|
|
235
273
|
//# sourceMappingURL=agent-event-handler.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"agent-event-handler.js","names":["msgEvent"],"sources":["../../../../src/agent/orchestration/agent-event-handler.ts"],"sourcesContent":["/**\n * Agent Event Handler - Handles all Agent lifecycle events\n *\n * Processes agent events and coordinates related actions like\n * progress updates, error tracking, and lifecycle events.\n */\n\nimport type { AgentEvent } from '@earendil-works/pi-agent-core';\nimport type { SessionContext } from '../session/session-context.js';\nimport type { ProgressFeedbackManager } from '../lifecycle/progress.js';\nimport type { ToolErrorTracker } from '../tools/error-tracker.js';\nimport type { RequestLimiter } from '../models/request-limiter.js';\nimport type { LifecycleManager } from '../lifecycle/index.js';\nimport type { ToolChainTracker } from '../tools/chain-tracker.js';\nimport type { SelfVerifyMiddleware } from '../middleware/index.js';\nimport type { SystemReminder } from '../prompt/system-reminder.js';\nimport type { ToolUsageAnalyzer } from '../tools/usage-analyzer.js';\nimport type { ErrorPatternMatcher } from '../tools/error-pattern-matcher.js';\nimport type { ModelManager } from '../models/index.js';\nimport { extractTextContent } from '../context/workspace.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('AgentEventHandler');\n\nexport interface AgentEventHandlerConfig {\n progressManager: ProgressFeedbackManager;\n errorTracker: ToolErrorTracker;\n requestLimiter: RequestLimiter;\n lifecycleManager: LifecycleManager;\n toolChainTracker: ToolChainTracker;\n selfVerifyMiddleware: SelfVerifyMiddleware;\n systemReminder: SystemReminder;\n toolUsageAnalyzer: ToolUsageAnalyzer;\n errorPatternMatcher: ErrorPatternMatcher;\n modelManager: ModelManager;\n}\n\nexport class AgentEventHandler {\n private progressManager: ProgressFeedbackManager;\n private errorTracker: ToolErrorTracker;\n private requestLimiter: RequestLimiter;\n private lifecycleManager: LifecycleManager;\n private toolChainTracker: ToolChainTracker;\n private selfVerifyMiddleware: SelfVerifyMiddleware;\n private systemReminder: SystemReminder;\n private toolUsageAnalyzer: ToolUsageAnalyzer;\n private errorPatternMatcher: ErrorPatternMatcher;\n private modelManager: ModelManager;\n private taskStartTime: number = 0;\n\n constructor(config: AgentEventHandlerConfig) {\n this.progressManager = config.progressManager;\n this.errorTracker = config.errorTracker;\n this.requestLimiter = config.requestLimiter;\n this.lifecycleManager = config.lifecycleManager;\n this.toolChainTracker = config.toolChainTracker;\n this.selfVerifyMiddleware = config.selfVerifyMiddleware;\n this.systemReminder = config.systemReminder;\n this.toolUsageAnalyzer = config.toolUsageAnalyzer;\n this.errorPatternMatcher = config.errorPatternMatcher;\n this.modelManager = config.modelManager;\n }\n\n /**\n * Handle an agent event\n */\n handle(event: AgentEvent, context: SessionContext | null): void {\n if (!context) {\n if (event.type !== 'message_update') {\n log.warn(\n { eventType: event.type },\n `Agent event ignored (no SessionContext): ${event.type}`,\n );\n }\n return;\n }\n\n switch (event.type) {\n case 'agent_start':\n this.handleAgentStart(event, context);\n break;\n case 'turn_start':\n this.handleTurnStart(event, context);\n break;\n case 'message_start':\n this.handleMessageStart(event, context);\n break;\n case 'message_end':\n this.handleMessageEnd(event, context);\n break;\n case 'tool_execution_start':\n this.handleToolExecutionStart(event, context);\n break;\n case 'tool_execution_update':\n this.handleToolExecutionUpdate(event, context);\n break;\n case 'tool_execution_end':\n this.handleToolExecutionEnd(event, context);\n break;\n case 'message_update':\n // Handled by AgentService for streaming, but we acknowledge it here\n break;\n case 'turn_end':\n this.handleTurnEnd(event, context);\n break;\n case 'agent_end':\n this.handleAgentEnd(event, context);\n break;\n default:\n log.debug({ eventType: (event as AgentEvent).type }, 'Unhandled event type');\n }\n }\n\n private handleAgentStart(_event: AgentEvent, context: SessionContext): void {\n log.debug('Agent turn started');\n this.taskStartTime = Date.now();\n this.progressManager.startTask();\n\n const result = this.requestLimiter.recordRequest();\n\n this.lifecycleManager.emit('llm_request', context.sessionKey, {\n requestNumber: result.count,\n maxRequests: result.limit,\n }, context).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, requestNumber: result.count, maxRequests: result.limit },\n `Lifecycle emit llm_request failed: ${em}`,\n );\n });\n\n this.progressManager.onRequestLimitStatus(\n result.count,\n result.limit,\n result.remaining,\n result.isWarning,\n result.shouldStop\n );\n\n if (result.shouldStop) {\n log.error(\n { count: result.count, limit: result.limit, sessionKey: context.sessionKey },\n `Request limit reached (${result.count}/${result.limit}) for session`,\n );\n }\n }\n\n private handleTurnStart(_event: AgentEvent, context: SessionContext): void {\n log.debug('Turn started');\n this.progressManager.onTurnStart();\n // One chain per LLM turn (pi-agent emits turn_start each round; turn_end clears the chain)\n this.toolChainTracker.startChain(context.sessionKey);\n }\n\n private handleMessageStart(event: AgentEvent, _context: SessionContext): void {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_start' }>;\n if (msgEvent.message?.role === 'assistant') {\n log.debug('Assistant response starting');\n }\n }\n\n private handleMessageEnd(event: AgentEvent, context: SessionContext): void {\n const msgEvent = event as Extract<AgentEvent, { type: 'message_end' }>;\n if (msgEvent.message?.role === 'assistant') {\n const content = msgEvent.message.content;\n const text = Array.isArray(content)\n ? extractTextContent(content as Array<{ type: string; text?: string }>)\n : String(content);\n log.debug({ contentLength: text.length }, 'Assistant response complete');\n\n this.lifecycleManager.emit('llm_response', context.sessionKey, {\n response: text,\n usage: (msgEvent.message as any).usage,\n }, context).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, responseChars: text.length },\n `Lifecycle emit llm_response failed: ${em}`,\n );\n });\n }\n }\n\n private handleToolExecutionStart(event: AgentEvent, context: SessionContext): void {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n log.debug({ tool: toolEvent.toolName, args: toolEvent.args }, 'Tool execution started');\n this.progressManager.onToolStart(toolEvent.toolName, toolEvent.args || {});\n\n this.lifecycleManager.emit('tool_call_start', context.sessionKey, {\n toolName: toolEvent.toolName,\n arguments: toolEvent.args || {},\n attemptNumber: 1,\n maxAttempts: 3,\n }, context).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, tool: toolEvent.toolName },\n `Lifecycle emit tool_call_start failed: ${em}`,\n );\n });\n\n this.toolChainTracker.recordCall(\n context.sessionKey,\n toolEvent.toolName,\n toolEvent.args || {},\n 0\n );\n\n // Track file edits for self-verify\n this.trackFileEdit(toolEvent.toolName, toolEvent.args);\n }\n\n private handleToolExecutionUpdate(event: AgentEvent, _context: SessionContext): void {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_update' }>;\n this.progressManager.onToolUpdate(toolEvent.toolName, toolEvent.partialResult);\n }\n\n private handleToolExecutionEnd(event: AgentEvent, context: SessionContext): void {\n const toolEvent = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n log.debug({ tool: toolEvent.toolName, isError: toolEvent.isError }, 'Tool execution complete');\n this.progressManager.onToolEnd(toolEvent.toolName, toolEvent.result, toolEvent.isError);\n\n const durationMs = (toolEvent as any).durationMs || 0;\n\n this.lifecycleManager.emit('tool_call_end', context.sessionKey, {\n toolName: toolEvent.toolName,\n success: !toolEvent.isError,\n result: toolEvent.result,\n error: toolEvent.isError ? String(toolEvent.result) : undefined,\n durationMs,\n }, context).catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, tool: toolEvent.toolName },\n `Lifecycle hook tool_call_end failed: ${em}`,\n );\n });\n\n // System reminder\n (toolEvent as any).result = this.systemReminder.appendToResult(toolEvent.result);\n\n // Record tool usage\n this.toolUsageAnalyzer.recordUsage(toolEvent.toolName, !toolEvent.isError, durationMs);\n\n // Record tool result in chain\n this.recordToolResult(context.sessionKey, toolEvent.toolName, toolEvent.result, toolEvent.isError, durationMs);\n\n // Track errors\n if (toolEvent.isError) {\n const errorText = this.extractError(toolEvent.result);\n this.errorTracker.recordFailure(toolEvent.toolName, errorText);\n\n // Match error pattern\n const errorMatch = this.errorPatternMatcher.matchError(errorText);\n if (errorMatch.matched && errorMatch.pattern) {\n const preview = errorText.length > 120 ? `${errorText.slice(0, 120)}…` : errorText;\n log.warn(\n { tool: toolEvent.toolName, pattern: errorMatch.pattern.name, errorPreview: preview },\n `Tool error matched pattern \"${errorMatch.pattern.name}\" (${toolEvent.toolName}): ${preview}`,\n );\n }\n }\n }\n\n private handleTurnEnd(_event: AgentEvent, context: SessionContext): void {\n // Reset trackers\n this.errorTracker.reset();\n this.requestLimiter.reset();\n this.selfVerifyMiddleware.onTurnStart();\n this.toolChainTracker.endChain(context.sessionKey);\n }\n\n private handleAgentEnd(_event: AgentEvent, _context: SessionContext): void {\n this.progressManager.endTask();\n }\n\n private trackFileEdit(toolName: string | undefined, args: Record<string, unknown> | undefined): void {\n if (!toolName || !args) return;\n \n const name = toolName.toLowerCase();\n if (name.includes('write') && args.path) {\n this.selfVerifyMiddleware.recordEdit(String(args.path), 'write');\n } else if (name.includes('edit') && args.path) {\n this.selfVerifyMiddleware.recordEdit(String(args.path), 'edit');\n }\n }\n\n private recordToolResult(\n sessionKey: string,\n toolName: string,\n result: unknown,\n isError: boolean,\n durationMs: number\n ): void {\n const chain = this.toolChainTracker.getCurrentChain(sessionKey);\n if (chain) {\n const lastNode = chain.nodes[chain.nodes.length - 1];\n if (lastNode && lastNode.toolName === toolName) {\n this.toolChainTracker.recordResult(\n sessionKey,\n lastNode.id,\n result,\n isError ? 'Tool execution failed' : undefined,\n durationMs\n );\n }\n }\n }\n\n private extractError(result: unknown): string {\n if (typeof result === 'string') return result;\n if (result && typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n if (obj.error && typeof obj.error === 'string') return obj.error;\n if (obj.message && typeof obj.message === 'string') return obj.message;\n return JSON.stringify(result);\n }\n return String(result);\n }\n\n /**\n * Get task duration in milliseconds\n */\n getTaskDuration(): number {\n if (!this.taskStartTime) return 0;\n return Date.now() - this.taskStartTime;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"agent-event-handler.js","names":[],"sources":["../../../../src/agent/orchestration/agent-event-handler.ts"],"sourcesContent":["/**\n * Agent Event Handler — coordinates listeners on pi-agent events.\n *\n * Previously a single god-handler with ten manager fields and one `switch`. Now a\n * thin façade around {@link SessionEventBus}: each concern (progress, lifecycle\n * hooks, tool-chain recording, error tracking, self-verify, etc.) registers its\n * own listener at construction time, and external code can add new listeners via\n * {@link AgentEventHandler.registerListener} without modifying this file (OCP).\n *\n * Ordering note: a few listeners are order-sensitive (notably the\n * `tool_execution_end` chain — `SystemReminder` mutates `event.result` in place\n * and downstream listeners read the mutated value). The `installX` calls below\n * preserve the exact order from the previous implementation.\n */\n\nimport type { AgentEvent } from '@earendil-works/pi-agent-core';\nimport type { SessionContext } from '../session/session-context.js';\nimport type { ProgressFeedbackManager } from '../lifecycle/progress.js';\nimport type { ToolErrorTracker } from '../tools/error-tracker.js';\nimport type { RequestLimiter } from '../models/request-limiter.js';\nimport type { LifecycleManager } from '../lifecycle/index.js';\nimport type { ToolChainTracker } from '../tools/chain-tracker.js';\nimport type { SelfVerifyMiddleware } from '../middleware/index.js';\nimport type { SystemReminder } from '../prompt/system-reminder.js';\nimport type { ToolUsageAnalyzer } from '../tools/usage-analyzer.js';\nimport type { ErrorPatternMatcher } from '../tools/error-pattern-matcher.js';\nimport { extractTextContent } from '../context/workspace.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('AgentEventHandler');\n\n// ── Event bus ──────────────────────────────────────────────────────────────\n\nexport type SessionEventListener = (event: AgentEvent, context: SessionContext) => void;\nexport type SessionEventTypeFilter = AgentEvent['type'] | 'all';\n\n/**\n * Typed pub/sub for agent events. Listeners run in registration order; the bus\n * itself is synchronous — listeners that need async work must dispatch their own\n * promises (typically by awaiting and logging on error, like the lifecycle hooks).\n */\nexport class SessionEventBus {\n private readonly listeners = new Map<SessionEventTypeFilter, SessionEventListener[]>();\n\n on(type: SessionEventTypeFilter, listener: SessionEventListener): () => void {\n const bucket = this.listeners.get(type) ?? [];\n bucket.push(listener);\n this.listeners.set(type, bucket);\n return () => {\n const current = this.listeners.get(type);\n if (!current) return;\n const idx = current.indexOf(listener);\n if (idx >= 0) current.splice(idx, 1);\n };\n }\n\n dispatch(event: AgentEvent, context: SessionContext | null): void {\n if (!context) {\n if (event.type !== 'message_update') {\n log.warn(\n { eventType: event.type },\n `Agent event ignored (no SessionContext): ${event.type}`,\n );\n }\n return;\n }\n const exact = this.listeners.get(event.type);\n if (exact) {\n for (const listener of exact) {\n listener(event, context);\n }\n }\n const all = this.listeners.get('all');\n if (all) {\n for (const listener of all) {\n listener(event, context);\n }\n }\n }\n}\n\n// ── Built-in listener installers ───────────────────────────────────────────\n\nfunction installProgressListener(bus: SessionEventBus, progressManager: ProgressFeedbackManager): void {\n bus.on('agent_start', () => {\n log.debug('Agent turn started');\n progressManager.startTask();\n });\n bus.on('turn_start', () => {\n log.debug('Turn started');\n progressManager.onTurnStart();\n });\n bus.on('tool_execution_start', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n log.debug({ tool: e.toolName, args: e.args }, 'Tool execution started');\n progressManager.onToolStart(e.toolName, e.args || {});\n });\n bus.on('tool_execution_update', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_update' }>;\n progressManager.onToolUpdate(e.toolName, e.partialResult);\n });\n bus.on('tool_execution_end', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n log.debug({ tool: e.toolName, isError: e.isError }, 'Tool execution complete');\n progressManager.onToolEnd(e.toolName, e.result, e.isError);\n });\n bus.on('agent_end', () => {\n progressManager.endTask();\n });\n}\n\nfunction installRequestLimitListener(\n bus: SessionEventBus,\n deps: {\n requestLimiter: RequestLimiter;\n progressManager: ProgressFeedbackManager;\n lifecycleManager: LifecycleManager;\n },\n): void {\n bus.on('agent_start', (_event, context) => {\n const result = deps.requestLimiter.recordRequest();\n\n deps.lifecycleManager\n .emit(\n 'llm_request',\n context.sessionKey,\n { requestNumber: result.count, maxRequests: result.limit },\n context,\n )\n .catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n {\n err,\n errorMessage: em,\n sessionKey: context.sessionKey,\n requestNumber: result.count,\n maxRequests: result.limit,\n },\n `Lifecycle emit llm_request failed: ${em}`,\n );\n });\n\n deps.progressManager.onRequestLimitStatus(\n result.count,\n result.limit,\n result.remaining,\n result.isWarning,\n result.shouldStop,\n );\n\n if (result.shouldStop) {\n log.error(\n { count: result.count, limit: result.limit, sessionKey: context.sessionKey },\n `Request limit reached (${result.count}/${result.limit}) for session`,\n );\n }\n });\n\n bus.on('turn_end', () => {\n deps.requestLimiter.reset();\n });\n}\n\nfunction installLifecycleHookListener(bus: SessionEventBus, lifecycleManager: LifecycleManager): void {\n bus.on('message_end', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'message_end' }>;\n if (e.message?.role !== 'assistant') return;\n const content = e.message.content;\n const text = Array.isArray(content)\n ? extractTextContent(content as Array<{ type: string; text?: string }>)\n : String(content);\n log.debug({ contentLength: text.length }, 'Assistant response complete');\n\n lifecycleManager\n .emit(\n 'llm_response',\n context.sessionKey,\n { response: text, usage: (e.message as { usage?: unknown }).usage },\n context,\n )\n .catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, responseChars: text.length },\n `Lifecycle emit llm_response failed: ${em}`,\n );\n });\n });\n\n bus.on('tool_execution_start', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n lifecycleManager\n .emit(\n 'tool_call_start',\n context.sessionKey,\n {\n toolName: e.toolName,\n arguments: e.args || {},\n attemptNumber: 1,\n maxAttempts: 3,\n },\n context,\n )\n .catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, tool: e.toolName },\n `Lifecycle emit tool_call_start failed: ${em}`,\n );\n });\n });\n\n bus.on('tool_execution_end', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const durationMs = (e as { durationMs?: number }).durationMs || 0;\n lifecycleManager\n .emit(\n 'tool_call_end',\n context.sessionKey,\n {\n toolName: e.toolName,\n success: !e.isError,\n result: e.result,\n error: e.isError ? String(e.result) : undefined,\n durationMs,\n },\n context,\n )\n .catch((err) => {\n const em = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, errorMessage: em, sessionKey: context.sessionKey, tool: e.toolName },\n `Lifecycle hook tool_call_end failed: ${em}`,\n );\n });\n });\n}\n\nfunction installSystemReminderListener(bus: SessionEventBus, systemReminder: SystemReminder): void {\n // MUTATES `event.result` so downstream listeners (tool-chain, error-tracking) see\n // the decorated text. Must run AFTER progress + lifecycle hooks (they consume the\n // original) and BEFORE tool-chain + error-tracking.\n bus.on('tool_execution_end', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }> & { result: unknown };\n e.result = systemReminder.appendToResult(e.result);\n });\n}\n\nfunction installToolChainListener(bus: SessionEventBus, toolChainTracker: ToolChainTracker): void {\n bus.on('turn_start', (_event, context) => {\n // One chain per LLM turn (pi-agent emits turn_start each round; turn_end clears the chain).\n toolChainTracker.startChain(context.sessionKey);\n });\n bus.on('tool_execution_start', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n toolChainTracker.recordCall(context.sessionKey, e.toolName, e.args || {}, 0);\n });\n bus.on('tool_execution_end', (event, context) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const durationMs = (e as { durationMs?: number }).durationMs || 0;\n const chain = toolChainTracker.getCurrentChain(context.sessionKey);\n if (!chain) return;\n const lastNode = chain.nodes[chain.nodes.length - 1];\n if (lastNode && lastNode.toolName === e.toolName) {\n toolChainTracker.recordResult(\n context.sessionKey,\n lastNode.id,\n e.result,\n e.isError ? 'Tool execution failed' : undefined,\n durationMs,\n );\n }\n });\n bus.on('turn_end', (_event, context) => {\n toolChainTracker.endChain(context.sessionKey);\n });\n}\n\nfunction installToolUsageListener(bus: SessionEventBus, toolUsageAnalyzer: ToolUsageAnalyzer): void {\n bus.on('tool_execution_end', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n const durationMs = (e as { durationMs?: number }).durationMs || 0;\n toolUsageAnalyzer.recordUsage(e.toolName, !e.isError, durationMs);\n });\n}\n\nfunction extractErrorText(result: unknown): string {\n if (typeof result === 'string') return result;\n if (result && typeof result === 'object') {\n const obj = result as Record<string, unknown>;\n if (typeof obj.error === 'string') return obj.error;\n if (typeof obj.message === 'string') return obj.message;\n return JSON.stringify(result);\n }\n return String(result);\n}\n\nfunction installErrorTrackingListener(\n bus: SessionEventBus,\n deps: { errorTracker: ToolErrorTracker; errorPatternMatcher: ErrorPatternMatcher },\n): void {\n bus.on('tool_execution_end', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_end' }>;\n if (!e.isError) return;\n const errorText = extractErrorText(e.result);\n deps.errorTracker.recordFailure(e.toolName, errorText);\n\n const errorMatch = deps.errorPatternMatcher.matchError(errorText);\n if (errorMatch.matched && errorMatch.pattern) {\n const preview = errorText.length > 120 ? `${errorText.slice(0, 120)}…` : errorText;\n log.warn(\n { tool: e.toolName, pattern: errorMatch.pattern.name, errorPreview: preview },\n `Tool error matched pattern \"${errorMatch.pattern.name}\" (${e.toolName}): ${preview}`,\n );\n }\n });\n bus.on('turn_end', () => {\n deps.errorTracker.reset();\n });\n}\n\nfunction installSelfVerifyListener(bus: SessionEventBus, selfVerifyMiddleware: SelfVerifyMiddleware): void {\n bus.on('tool_execution_start', (event) => {\n const e = event as Extract<AgentEvent, { type: 'tool_execution_start' }>;\n const args = e.args;\n const toolName = e.toolName;\n if (!toolName || !args) return;\n const name = toolName.toLowerCase();\n if (name.includes('write') && args.path) {\n selfVerifyMiddleware.recordEdit(String(args.path), 'write');\n } else if (name.includes('edit') && args.path) {\n selfVerifyMiddleware.recordEdit(String(args.path), 'edit');\n }\n });\n bus.on('turn_end', () => {\n selfVerifyMiddleware.onTurnStart();\n });\n}\n\n// ── Public façade ───────────────────────────────────────────────────────────\n\nexport interface AgentEventHandlerConfig {\n progressManager: ProgressFeedbackManager;\n errorTracker: ToolErrorTracker;\n requestLimiter: RequestLimiter;\n lifecycleManager: LifecycleManager;\n toolChainTracker: ToolChainTracker;\n selfVerifyMiddleware: SelfVerifyMiddleware;\n systemReminder: SystemReminder;\n toolUsageAnalyzer: ToolUsageAnalyzer;\n errorPatternMatcher: ErrorPatternMatcher;\n}\n\n/**\n * Thin façade over {@link SessionEventBus} that pre-registers all built-in\n * listeners in their required order. `handle(event, ctx)` is the entry point\n * used by `AgentService.handleSessionEvent`; extensions can hook in via\n * {@link registerListener} without touching this class.\n */\nexport class AgentEventHandler {\n private readonly bus: SessionEventBus;\n\n constructor(config: AgentEventHandlerConfig) {\n this.bus = new SessionEventBus();\n\n // Order matters for `tool_execution_end`: SystemReminder mutates `event.result`\n // and ToolChain + ErrorTracking depend on the mutated value. Keep these in this\n // exact sequence.\n installProgressListener(this.bus, config.progressManager);\n installRequestLimitListener(this.bus, {\n requestLimiter: config.requestLimiter,\n progressManager: config.progressManager,\n lifecycleManager: config.lifecycleManager,\n });\n installLifecycleHookListener(this.bus, config.lifecycleManager);\n installSystemReminderListener(this.bus, config.systemReminder);\n installToolUsageListener(this.bus, config.toolUsageAnalyzer);\n installToolChainListener(this.bus, config.toolChainTracker);\n installErrorTrackingListener(this.bus, {\n errorTracker: config.errorTracker,\n errorPatternMatcher: config.errorPatternMatcher,\n });\n installSelfVerifyListener(this.bus, config.selfVerifyMiddleware);\n }\n\n /** Dispatch a pi-agent event to all registered listeners. */\n handle(event: AgentEvent, context: SessionContext | null): void {\n this.bus.dispatch(event, context);\n }\n\n /**\n * Register an additional listener (e.g. from an extension). Returns an\n * unsubscribe function. Listeners run after the built-ins in registration\n * order; if you need to run before a built-in, you must create your own\n * {@link SessionEventBus} instance.\n */\n registerListener(type: SessionEventTypeFilter, listener: SessionEventListener): () => void {\n return this.bus.on(type, listener);\n }\n}\n"],"mappings":"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"}
|
|
@@ -7,6 +7,7 @@
|
|
|
7
7
|
import type { Config } from '../../config/schema.js';
|
|
8
8
|
import type { InboundMessage } from '../../infra/bus/index.js';
|
|
9
9
|
import type { SessionConfigStore, SessionStore } from '../../session/index.js';
|
|
10
|
+
import type { SessionHydrator } from '../session/index.js';
|
|
10
11
|
import type { ThinkLevel } from '../transcript/thinking-types.js';
|
|
11
12
|
import type { ModelManager } from '../models/index.js';
|
|
12
13
|
import type { SessionContext } from '../session/session-context.js';
|
|
@@ -21,8 +22,8 @@ export interface AgentOrchestratorConfig {
|
|
|
21
22
|
eventHandler: AgentEventHandler;
|
|
22
23
|
feedbackCoordinator: FeedbackCoordinator;
|
|
23
24
|
sessionConfigStore: SessionConfigStore;
|
|
24
|
-
/**
|
|
25
|
-
|
|
25
|
+
/** Per-session hydration (workspace override + model override) before the agent runs. */
|
|
26
|
+
sessionHydrator: SessionHydrator;
|
|
26
27
|
getThinkingDefault: () => ThinkLevel | undefined;
|
|
27
28
|
/** Per-session default from merged `agents.list` / defaults (optional). */
|
|
28
29
|
getThinkingDefaultForSession?: (sessionKey: string) => ThinkLevel | undefined;
|
|
@@ -48,7 +49,7 @@ export declare class AgentOrchestrator {
|
|
|
48
49
|
private eventHandler;
|
|
49
50
|
private feedbackCoordinator;
|
|
50
51
|
private sessionConfigStore;
|
|
51
|
-
private
|
|
52
|
+
private sessionHydrator;
|
|
52
53
|
private getThinkingDefault;
|
|
53
54
|
private getThinkingDefaultForSession?;
|
|
54
55
|
private workspaceRoot;
|
|
@@ -59,7 +60,6 @@ export declare class AgentOrchestrator {
|
|
|
59
60
|
private onEmbeddedStreamEvent?;
|
|
60
61
|
private onEmbeddedTurnComplete?;
|
|
61
62
|
constructor(config: AgentOrchestratorConfig);
|
|
62
|
-
private hydrateSessionModelFromStore;
|
|
63
63
|
/**
|
|
64
64
|
* Process a message through the agent orchestration pipeline
|
|
65
65
|
*/
|
|
@@ -23,7 +23,7 @@ var AgentOrchestrator = class {
|
|
|
23
23
|
eventHandler;
|
|
24
24
|
feedbackCoordinator;
|
|
25
25
|
sessionConfigStore;
|
|
26
|
-
|
|
26
|
+
sessionHydrator;
|
|
27
27
|
getThinkingDefault;
|
|
28
28
|
getThinkingDefaultForSession;
|
|
29
29
|
workspaceRoot;
|
|
@@ -40,7 +40,7 @@ var AgentOrchestrator = class {
|
|
|
40
40
|
this.eventHandler = config.eventHandler;
|
|
41
41
|
this.feedbackCoordinator = config.feedbackCoordinator;
|
|
42
42
|
this.sessionConfigStore = config.sessionConfigStore;
|
|
43
|
-
this.
|
|
43
|
+
this.sessionHydrator = config.sessionHydrator;
|
|
44
44
|
this.getThinkingDefault = config.getThinkingDefault;
|
|
45
45
|
this.getThinkingDefaultForSession = config.getThinkingDefaultForSession;
|
|
46
46
|
this.workspaceRoot = config.workspaceRoot;
|
|
@@ -51,17 +51,13 @@ var AgentOrchestrator = class {
|
|
|
51
51
|
this.onEmbeddedStreamEvent = config.onEmbeddedStreamEvent;
|
|
52
52
|
this.onEmbeddedTurnComplete = config.onEmbeddedTurnComplete;
|
|
53
53
|
}
|
|
54
|
-
async hydrateSessionModelFromStore(sessionKey) {
|
|
55
|
-
const cfg = await this.sessionConfigStore.get(sessionKey);
|
|
56
|
-
if (cfg?.modelOverride) await this.modelManager.switchModelForSession(sessionKey, cfg.modelOverride);
|
|
57
|
-
}
|
|
58
54
|
/**
|
|
59
55
|
* Process a message through the agent orchestration pipeline
|
|
60
56
|
*/
|
|
61
57
|
async process(msg, context) {
|
|
62
58
|
const { sessionKey } = context;
|
|
63
59
|
log.debug({ sessionKey }, "Processing message through agent orchestrator");
|
|
64
|
-
await this.
|
|
60
|
+
await this.sessionHydrator.workspace(sessionKey);
|
|
65
61
|
if (typeof msg.content === "string" && (sessionKey.startsWith("cron:") || context.channel === "cron")) {
|
|
66
62
|
const content = msg.content;
|
|
67
63
|
if (content.includes("__xopc_memory_dreaming_sweep__") || content.includes("__xopc_memory_dreaming_light_sweep__") || content.includes("__xopc_memory_dreaming_rem_sweep__")) {
|
|
@@ -116,7 +112,7 @@ var AgentOrchestrator = class {
|
|
|
116
112
|
}
|
|
117
113
|
}
|
|
118
114
|
try {
|
|
119
|
-
await this.
|
|
115
|
+
await this.sessionHydrator.model(sessionKey);
|
|
120
116
|
const thinkingDefault = this.getThinkingDefaultForSession?.(sessionKey) ?? this.getThinkingDefault();
|
|
121
117
|
const thinkingLevel = await resolveEffectiveThinkingLevel(this.sessionConfigStore, sessionKey, null, thinkingDefault);
|
|
122
118
|
this.agentManager.setThinkingLevel(sessionKey, thinkingLevel);
|