@xopcai/xopc 0.0.81 → 0.0.83
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 +1 -1
- package/README.zh-CN.md +1 -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-CrpYTHJS.js +222 -0
- package/dist/gateway/static/root/assets/{apps-page-Ci17oA_o.js → apps-page-1mcKh5Rh.js} +1 -1
- package/dist/gateway/static/root/assets/channels-settings-zd6QNKPx.js +1 -0
- package/dist/gateway/static/root/assets/{channels-status-swr-CUU3faST.js → channels-status-swr-uRAuhiUo.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-BVQ2n75R.js → cron-api-O2Q_ruV6.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-x582Y6D5.js → cron-page-By09AQD-.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-XT96cQdR.js → dist-BpQxde0t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-Czzfrtt5.js → extension-debug-page-CY27wj_p.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-B_c5UIqX.js → extension-page-C-Ed5ZmP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-Ckvjgw0_.js → extension-settings-page-raLux7E7.js} +1 -1
- package/dist/gateway/static/root/assets/fetch-2iRFmd3n.js +3 -0
- package/dist/gateway/static/root/assets/{field-primitives-DQpT8iVa.js → field-primitives-fa_hiQcX.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DKqOuQ0V.js → heartbeat-config-api-BVl5VHvL.js} +1 -1
- package/dist/gateway/static/root/assets/index-BuFldCsB.css +1 -0
- package/dist/gateway/static/root/assets/{index-Bq3Lg4bG.js → index-Y-iqo-gL.js} +95 -86
- package/dist/gateway/static/root/assets/{logs-page-B3CwJNBq.js → logs-page-BdH2n7ZW.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-Vpchzdp-.js +1 -0
- package/dist/gateway/static/root/assets/{settings-form-section-CjjEpVYM.js → settings-form-section-Kk1yAGBl.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-KBm0u6Dz.js +3 -0
- package/dist/gateway/static/root/assets/skills-page-BjeXXaOn.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-DQehHvlm.js → utils-DpTxN4AF.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-CwO8Cf01.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 +133 -167
- 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/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/doctor/checks/config-health.js +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 +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +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/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.js +1 -1
- 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/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 +4 -4
- package/dist/src/cli/commands/models.js +1 -1
- 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 +9 -64
- package/dist/src/cli/commands/onboard.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/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 +1 -4
- 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 +2 -2
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +40 -37
- 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 +92 -105
- package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
- package/dist/src/gateway/hono/middleware/logger.d.ts +5 -1
- package/dist/src/gateway/hono/middleware/logger.js +41 -5
- 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/exposure.js +2 -1
- package/dist/src/gateway/hono/routes/exposure.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.d.ts +1 -0
- package/dist/src/gateway/hono/sse.js +3 -2
- package/dist/src/gateway/hono/sse.js.map +1 -1
- 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/heartbeat/index.js +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 +39 -27
- 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 +19 -18
- 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-DOONGaKz.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-CARdL-ys.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-BCNnhz9g.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-B7_PjiHL.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-VrL9TeVF.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-k4FWwgkk.js +0 -1
- package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
- package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
- package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
- package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
- package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
- package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
- package/dist/src/daemon/launchd-restart-handoff.js +0 -132
- package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
- package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
- package/dist/src/gateway/auth-rate-limit.js +0 -192
- package/dist/src/gateway/auth-rate-limit.js.map +0 -1
- package/dist/src/gateway/restart-handler.d.ts +0 -14
- package/dist/src/gateway/restart-handler.js +0 -64
- package/dist/src/gateway/restart-handler.js.map +0 -1
- package/dist/src/gateway/security/flood-guard.d.ts +0 -28
- package/dist/src/gateway/security/flood-guard.js +0 -42
- package/dist/src/gateway/security/flood-guard.js.map +0 -1
- package/dist/src/infra/rate-limit.d.ts +0 -38
- package/dist/src/infra/rate-limit.js +0 -60
- package/dist/src/infra/rate-limit.js.map +0 -1
- package/dist/src/infra/restart-intent.d.ts +0 -13
- package/dist/src/infra/restart-intent.js +0 -40
- package/dist/src/infra/restart-intent.js.map +0 -1
- package/dist/src/infra/restart-sentinel.d.ts +0 -23
- package/dist/src/infra/restart-sentinel.js +0 -75
- package/dist/src/infra/restart-sentinel.js.map +0 -1
- package/skills/creative/canvas-design/LICENSE.txt +0 -202
- package/skills/creative/canvas-design/SKILL-zh.md +0 -130
- package/skills/creative/canvas-design/SKILL.md +0 -130
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loopback / browser-origin classification helpers used by rate-limit policy
|
|
3
|
+
* and other security middleware. Pure functions, no I/O.
|
|
4
|
+
*/
|
|
5
|
+
export declare function isLoopbackClientIp(clientIp: string | undefined): boolean;
|
|
6
|
+
/** Browser Origin header points at the local gateway console. */
|
|
7
|
+
export declare function isLoopbackBrowserOrigin(origin: string | undefined): boolean;
|
|
8
|
+
/** Same-machine browser hitting the local gateway (Electron / local dev). */
|
|
9
|
+
export declare function isLoopbackEmbeddedBrowserClient(origin: string | undefined, clientIp: string): boolean;
|
|
10
|
+
/** Read X-Forwarded-For / X-Real-IP / CF-Connecting-IP. */
|
|
11
|
+
export declare function getClientIpFromHeaders(headers: {
|
|
12
|
+
get(name: string): string | undefined;
|
|
13
|
+
}): string;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { isLoopbackHost } from "../host.js";
|
|
2
|
+
//#region src/gateway/security/loopback.ts
|
|
3
|
+
/**
|
|
4
|
+
* Loopback / browser-origin classification helpers used by rate-limit policy
|
|
5
|
+
* and other security middleware. Pure functions, no I/O.
|
|
6
|
+
*/
|
|
7
|
+
function isLoopbackClientIp(clientIp) {
|
|
8
|
+
if (!clientIp || clientIp === "unknown") return false;
|
|
9
|
+
const trimmed = clientIp.trim();
|
|
10
|
+
if (trimmed.includes(":") && !trimmed.includes(".")) return isLoopbackHost(trimmed.replace(/^\[/, "").replace(/\]$/, ""));
|
|
11
|
+
return isLoopbackHost(trimmed.split(":")[0]);
|
|
12
|
+
}
|
|
13
|
+
/** Browser Origin header points at the local gateway console. */
|
|
14
|
+
function isLoopbackBrowserOrigin(origin) {
|
|
15
|
+
const trimmed = origin?.trim();
|
|
16
|
+
if (!trimmed || trimmed === "null") return false;
|
|
17
|
+
try {
|
|
18
|
+
return isLoopbackHost(new URL(trimmed).hostname);
|
|
19
|
+
} catch {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
/** Same-machine browser hitting the local gateway (Electron / local dev). */
|
|
24
|
+
function isLoopbackEmbeddedBrowserClient(origin, clientIp) {
|
|
25
|
+
if (!isLoopbackBrowserOrigin(origin)) return false;
|
|
26
|
+
if (clientIp === "unknown") return true;
|
|
27
|
+
return isLoopbackClientIp(clientIp);
|
|
28
|
+
}
|
|
29
|
+
/** Read X-Forwarded-For / X-Real-IP / CF-Connecting-IP. */
|
|
30
|
+
function getClientIpFromHeaders(headers) {
|
|
31
|
+
const xff = headers.get("x-forwarded-for");
|
|
32
|
+
if (xff) {
|
|
33
|
+
const first = xff.split(",")[0]?.trim();
|
|
34
|
+
if (first) return first;
|
|
35
|
+
}
|
|
36
|
+
const real = headers.get("x-real-ip")?.trim();
|
|
37
|
+
if (real) return real;
|
|
38
|
+
const cf = headers.get("cf-connecting-ip")?.trim();
|
|
39
|
+
if (cf) return cf;
|
|
40
|
+
return "unknown";
|
|
41
|
+
}
|
|
42
|
+
//#endregion
|
|
43
|
+
export { getClientIpFromHeaders, isLoopbackBrowserOrigin, isLoopbackClientIp, isLoopbackEmbeddedBrowserClient };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=loopback.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loopback.js","names":[],"sources":["../../../../src/gateway/security/loopback.ts"],"sourcesContent":["/**\n * Loopback / browser-origin classification helpers used by rate-limit policy\n * and other security middleware. Pure functions, no I/O.\n */\n\nimport { isLoopbackHost } from '../host.js';\n\nexport function isLoopbackClientIp(clientIp: string | undefined): boolean {\n if (!clientIp || clientIp === 'unknown') return false;\n const trimmed = clientIp.trim();\n if (trimmed.includes(':') && !trimmed.includes('.')) {\n return isLoopbackHost(trimmed.replace(/^\\[/, '').replace(/\\]$/, ''));\n }\n return isLoopbackHost(trimmed.split(':')[0]);\n}\n\n/** Browser Origin header points at the local gateway console. */\nexport function isLoopbackBrowserOrigin(origin: string | undefined): boolean {\n const trimmed = origin?.trim();\n if (!trimmed || trimmed === 'null') return false;\n try {\n return isLoopbackHost(new URL(trimmed).hostname);\n } catch {\n return false;\n }\n}\n\n/** Same-machine browser hitting the local gateway (Electron / local dev). */\nexport function isLoopbackEmbeddedBrowserClient(\n origin: string | undefined,\n clientIp: string,\n): boolean {\n if (!isLoopbackBrowserOrigin(origin)) return false;\n if (clientIp === 'unknown') return true;\n return isLoopbackClientIp(clientIp);\n}\n\n/** Read X-Forwarded-For / X-Real-IP / CF-Connecting-IP. */\nexport function getClientIpFromHeaders(headers: {\n get(name: string): string | undefined;\n}): string {\n const xff = headers.get('x-forwarded-for');\n if (xff) {\n const first = xff.split(',')[0]?.trim();\n if (first) return first;\n }\n const real = headers.get('x-real-ip')?.trim();\n if (real) return real;\n const cf = headers.get('cf-connecting-ip')?.trim();\n if (cf) return cf;\n return 'unknown';\n}\n"],"mappings":";;;;;;AAOA,SAAgB,mBAAmB,UAAuC;AACxE,KAAI,CAAC,YAAY,aAAa,UAAW,QAAO;CAChD,MAAM,UAAU,SAAS,MAAM;AAC/B,KAAI,QAAQ,SAAS,IAAI,IAAI,CAAC,QAAQ,SAAS,IAAI,CACjD,QAAO,eAAe,QAAQ,QAAQ,OAAO,GAAG,CAAC,QAAQ,OAAO,GAAG,CAAC;AAEtE,QAAO,eAAe,QAAQ,MAAM,IAAI,CAAC,GAAG;;;AAI9C,SAAgB,wBAAwB,QAAqC;CAC3E,MAAM,UAAU,QAAQ,MAAM;AAC9B,KAAI,CAAC,WAAW,YAAY,OAAQ,QAAO;AAC3C,KAAI;AACF,SAAO,eAAe,IAAI,IAAI,QAAQ,CAAC,SAAS;SAC1C;AACN,SAAO;;;;AAKX,SAAgB,gCACd,QACA,UACS;AACT,KAAI,CAAC,wBAAwB,OAAO,CAAE,QAAO;AAC7C,KAAI,aAAa,UAAW,QAAO;AACnC,QAAO,mBAAmB,SAAS;;;AAIrC,SAAgB,uBAAuB,SAE5B;CACT,MAAM,MAAM,QAAQ,IAAI,kBAAkB;AAC1C,KAAI,KAAK;EACP,MAAM,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,MAAM;AACvC,MAAI,MAAO,QAAO;;CAEpB,MAAM,OAAO,QAAQ,IAAI,YAAY,EAAE,MAAM;AAC7C,KAAI,KAAM,QAAO;CACjB,MAAM,KAAK,QAAQ,IAAI,mBAAmB,EAAE,MAAM;AAClD,KAAI,GAAI,QAAO;AACf,QAAO"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GatewayAgentRunner — webchat agent invocation and the surrounding control
|
|
3
|
+
* surface (abort, steer, clarify-bridge plumbing, scheduled continuations).
|
|
4
|
+
*
|
|
5
|
+
* Was 200 lines of `GatewayService` covering seven concerns that all hung off
|
|
6
|
+
* the same handful of fields (`activeWebchatRunBySession`, `runAbortControllers`,
|
|
7
|
+
* `clarifyBridge`, `runRelay`):
|
|
8
|
+
*
|
|
9
|
+
* - `runAgent(message, channel, chatId, ...)` — wraps {@link runGatewayAgent}
|
|
10
|
+
* - `abortAgentRun(runId)` — POST /api/agent/abort + cleanup
|
|
11
|
+
* - `steerWebchatAgent(chatId, message)` — Agent.steer queue at tool boundary
|
|
12
|
+
* - `submitClarifyResponse(requestId, answer)` — UI answers a `clarify` call
|
|
13
|
+
* - `enqueueWebchatPersistentGoalKickoff(sessionKey, goalText)` — initial
|
|
14
|
+
* `/goal` kickoff posts the goal text as the next user turn
|
|
15
|
+
* - `drainScheduledWebchatContinuation(sk, msg)` — background continuation
|
|
16
|
+
* (extension scheduler + persistent-goal flow)
|
|
17
|
+
* - `clarifyForSession({ sessionKey, request })` — clarify-bridge dispatch
|
|
18
|
+
* used by `gatewayClarify.requestClarification` in AgentService
|
|
19
|
+
*
|
|
20
|
+
* Owns the two state maps (`activeWebchatRunBySession`, `runAbortControllers`)
|
|
21
|
+
* directly so peer coordinators (sessions-api, marketplace, config) cannot
|
|
22
|
+
* accidentally mutate them.
|
|
23
|
+
*/
|
|
24
|
+
import type { Config } from '../../config/schema.js';
|
|
25
|
+
import type { MessageBus } from '../../infra/bus/index.js';
|
|
26
|
+
import type { AgentService } from '../../agent/service.js';
|
|
27
|
+
import type { ChannelManager } from '../../channels/manager.js';
|
|
28
|
+
import type { SessionIndex } from '../../session/index.js';
|
|
29
|
+
import { AgentRunRelay, type RelayEvent } from '../agent-run-relay.js';
|
|
30
|
+
import { ClarifyBridge, type ClarifyBridgeRequest } from '../clarify-bridge.js';
|
|
31
|
+
export interface GatewayAgentRunnerOptions {
|
|
32
|
+
bus: MessageBus;
|
|
33
|
+
sessionIndex: SessionIndex;
|
|
34
|
+
/** Resolved lazily — the runner is constructed before AgentService exists. */
|
|
35
|
+
getAgentService: () => AgentService;
|
|
36
|
+
getChannelManager: () => ChannelManager;
|
|
37
|
+
getConfig: () => Config;
|
|
38
|
+
/** SSE emit (re-used so `runAgent` events broadcast to subscribers). */
|
|
39
|
+
emit: (type: string, payload: unknown) => void;
|
|
40
|
+
}
|
|
41
|
+
export declare class GatewayAgentRunner {
|
|
42
|
+
private readonly opts;
|
|
43
|
+
readonly runRelay: AgentRunRelay;
|
|
44
|
+
/** Per-run abort for webchat (POST /api/agent/abort or client disconnect). */
|
|
45
|
+
private readonly runAbortControllers;
|
|
46
|
+
private readonly clarifyBridge;
|
|
47
|
+
/** Maps webchat session key → active `runId` for `clarify` tool routing. */
|
|
48
|
+
private readonly activeWebchatRunBySession;
|
|
49
|
+
constructor(opts: GatewayAgentRunnerOptions);
|
|
50
|
+
/** True when a webchat agent run is currently in-flight for `sessionKey`. */
|
|
51
|
+
hasActiveRun(sessionKey: string): boolean;
|
|
52
|
+
getActiveRunId(sessionKey: string): string | undefined;
|
|
53
|
+
getClarifyBridge(): ClarifyBridge;
|
|
54
|
+
/** Called from `GatewayService.stop()` so the bridge gets cleaned up. */
|
|
55
|
+
disposeClarifyBridge(): void;
|
|
56
|
+
runAgent(message: string, channel: string, chatId: string, attachments?: Array<{
|
|
57
|
+
type: string;
|
|
58
|
+
mimeType?: string;
|
|
59
|
+
data?: string;
|
|
60
|
+
name?: string;
|
|
61
|
+
size?: number;
|
|
62
|
+
}>, thinking?: string, runOptions?: {
|
|
63
|
+
signal?: AbortSignal;
|
|
64
|
+
clientCreatedAtMs?: number;
|
|
65
|
+
}): AsyncGenerator<{
|
|
66
|
+
type: string;
|
|
67
|
+
content?: string;
|
|
68
|
+
status?: string;
|
|
69
|
+
runId?: string;
|
|
70
|
+
}, {
|
|
71
|
+
status: string;
|
|
72
|
+
summary: string;
|
|
73
|
+
}, unknown>;
|
|
74
|
+
/** Abort an in-flight webchat agent run (matches `runId` from SSE `status`). */
|
|
75
|
+
abortAgentRun(runId: string): boolean;
|
|
76
|
+
/**
|
|
77
|
+
* Queue steering text for an active webchat run (`Agent.steer` /
|
|
78
|
+
* tool-boundary injection). `chatId` is the same as `POST /api/agent` body
|
|
79
|
+
* (`sessionKey` or legacy peer id).
|
|
80
|
+
*/
|
|
81
|
+
steerWebchatAgent(chatId: string, message: string): Promise<{
|
|
82
|
+
ok: true;
|
|
83
|
+
} | {
|
|
84
|
+
ok: false;
|
|
85
|
+
code: 'BAD_REQUEST' | 'NO_ACTIVE_RUN' | 'STEER_FAILED';
|
|
86
|
+
}>;
|
|
87
|
+
/** Deliver a user's answer to a pending `clarify` tool call. */
|
|
88
|
+
submitClarifyResponse(requestId: string, answer: string): boolean;
|
|
89
|
+
/** Hermes-style: after HTTP sets a goal, enqueue the goal text as the next user turn. */
|
|
90
|
+
enqueueWebchatPersistentGoalKickoff(sessionKey: string, goalText: string): void;
|
|
91
|
+
/** Background drain for extension-initiated webchat turns (`scheduleWebchatContinuation`). */
|
|
92
|
+
drainScheduledWebchatContinuation(sessionKey: string, message: string): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Resolve clarify-bridge config for `sessionKey`: who delivers the question
|
|
95
|
+
* (webchat SSE, Telegram message, or both), then start the bridge request.
|
|
96
|
+
* Rejects when neither path is available (e.g. CLI without webchat or TG).
|
|
97
|
+
*
|
|
98
|
+
* `publishSseFor(runId)` is the bridge into AgentService's
|
|
99
|
+
* `turnDispatcher.enqueueWebchatSseEvent`. We take it as a callback so the
|
|
100
|
+
* runner does not import AgentService statically.
|
|
101
|
+
*/
|
|
102
|
+
requestClarification(opts: {
|
|
103
|
+
sessionKey: string;
|
|
104
|
+
request: ClarifyBridgeRequest;
|
|
105
|
+
publishSseFor: (runId: string) => (e: RelayEvent) => void;
|
|
106
|
+
}): Promise<string>;
|
|
107
|
+
private deliverTelegramClarify;
|
|
108
|
+
}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { buildSessionKey, init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
4
|
+
import { getDefaultAgentId, init_resolve_route } from "../../routing/resolve-route.js";
|
|
5
|
+
import { AgentRunRelay } from "../agent-run-relay.js";
|
|
6
|
+
import { ClarifyBridge } from "../clarify-bridge.js";
|
|
7
|
+
import { runGatewayAgent } from "./run-gateway-agent.js";
|
|
8
|
+
//#region src/gateway/service/agent-runner.ts
|
|
9
|
+
init_session_key();
|
|
10
|
+
init_resolve_route();
|
|
11
|
+
init_logger();
|
|
12
|
+
const log = createLogger("GatewayAgentRunner");
|
|
13
|
+
var GatewayAgentRunner = class {
|
|
14
|
+
opts;
|
|
15
|
+
runRelay = new AgentRunRelay();
|
|
16
|
+
/** Per-run abort for webchat (POST /api/agent/abort or client disconnect). */
|
|
17
|
+
runAbortControllers = /* @__PURE__ */ new Map();
|
|
18
|
+
clarifyBridge = new ClarifyBridge();
|
|
19
|
+
/** Maps webchat session key → active `runId` for `clarify` tool routing. */
|
|
20
|
+
activeWebchatRunBySession = /* @__PURE__ */ new Map();
|
|
21
|
+
constructor(opts) {
|
|
22
|
+
this.opts = opts;
|
|
23
|
+
}
|
|
24
|
+
/** True when a webchat agent run is currently in-flight for `sessionKey`. */
|
|
25
|
+
hasActiveRun(sessionKey) {
|
|
26
|
+
return this.activeWebchatRunBySession.has(sessionKey);
|
|
27
|
+
}
|
|
28
|
+
getActiveRunId(sessionKey) {
|
|
29
|
+
return this.activeWebchatRunBySession.get(sessionKey);
|
|
30
|
+
}
|
|
31
|
+
getClarifyBridge() {
|
|
32
|
+
return this.clarifyBridge;
|
|
33
|
+
}
|
|
34
|
+
/** Called from `GatewayService.stop()` so the bridge gets cleaned up. */
|
|
35
|
+
disposeClarifyBridge() {
|
|
36
|
+
this.clarifyBridge.dispose();
|
|
37
|
+
}
|
|
38
|
+
async *runAgent(message, channel, chatId, attachments, thinking, runOptions) {
|
|
39
|
+
const iter = runGatewayAgent({
|
|
40
|
+
config: this.opts.getConfig(),
|
|
41
|
+
agentService: this.opts.getAgentService(),
|
|
42
|
+
bus: this.opts.bus,
|
|
43
|
+
runRelay: this.runRelay,
|
|
44
|
+
runAbortControllers: this.runAbortControllers,
|
|
45
|
+
activeWebchatRunBySession: this.activeWebchatRunBySession,
|
|
46
|
+
sessionIndex: this.opts.sessionIndex,
|
|
47
|
+
emit: this.opts.emit
|
|
48
|
+
}, message, channel, chatId, attachments, thinking, runOptions);
|
|
49
|
+
let step = await iter.next();
|
|
50
|
+
while (!step.done) {
|
|
51
|
+
yield step.value;
|
|
52
|
+
step = await iter.next();
|
|
53
|
+
}
|
|
54
|
+
return step.value;
|
|
55
|
+
}
|
|
56
|
+
/** Abort an in-flight webchat agent run (matches `runId` from SSE `status`). */
|
|
57
|
+
abortAgentRun(runId) {
|
|
58
|
+
this.clarifyBridge.cancelForRun(runId);
|
|
59
|
+
const keysToMark = [];
|
|
60
|
+
for (const [sk, id] of this.activeWebchatRunBySession) if (id === runId) keysToMark.push(sk);
|
|
61
|
+
for (const sk of keysToMark) this.activeWebchatRunBySession.delete(sk);
|
|
62
|
+
const relaySk = this.runRelay.getSessionKey(runId);
|
|
63
|
+
if (relaySk && !keysToMark.includes(relaySk)) keysToMark.push(relaySk);
|
|
64
|
+
const c = this.runAbortControllers.get(runId);
|
|
65
|
+
if (!c) return false;
|
|
66
|
+
const cutoffTs = Date.now();
|
|
67
|
+
for (const sk of keysToMark) {
|
|
68
|
+
this.opts.sessionIndex.updateSessionMetadata(sk, { abortCutoffTimestamp: cutoffTs }).catch(() => {});
|
|
69
|
+
this.opts.sessionIndex.appendTranscriptContextEntry(sk, {
|
|
70
|
+
text: "Webchat agent run aborted",
|
|
71
|
+
data: {
|
|
72
|
+
runId,
|
|
73
|
+
abortCutoffTimestamp: cutoffTs
|
|
74
|
+
}
|
|
75
|
+
}).catch(() => {});
|
|
76
|
+
}
|
|
77
|
+
c.abort();
|
|
78
|
+
for (const sk of keysToMark) import("../../agent/embedded/runs.js").then(({ abortEmbeddedRun }) => abortEmbeddedRun(sk));
|
|
79
|
+
return true;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Queue steering text for an active webchat run (`Agent.steer` /
|
|
83
|
+
* tool-boundary injection). `chatId` is the same as `POST /api/agent` body
|
|
84
|
+
* (`sessionKey` or legacy peer id).
|
|
85
|
+
*/
|
|
86
|
+
async steerWebchatAgent(chatId, message) {
|
|
87
|
+
const trimmed = message.trim();
|
|
88
|
+
if (!trimmed) return {
|
|
89
|
+
ok: false,
|
|
90
|
+
code: "BAD_REQUEST"
|
|
91
|
+
};
|
|
92
|
+
const cfg = this.opts.getConfig();
|
|
93
|
+
const sessionKey = parseSessionKey(chatId) ? chatId : buildSessionKey({
|
|
94
|
+
agentId: getDefaultAgentId(cfg),
|
|
95
|
+
source: "webchat",
|
|
96
|
+
accountId: "default",
|
|
97
|
+
peerKind: "direct",
|
|
98
|
+
peerId: chatId
|
|
99
|
+
});
|
|
100
|
+
if (!this.activeWebchatRunBySession.has(sessionKey)) return {
|
|
101
|
+
ok: false,
|
|
102
|
+
code: "NO_ACTIVE_RUN"
|
|
103
|
+
};
|
|
104
|
+
if (!await this.opts.getAgentService().turnDispatcher.steerWebchatSession(sessionKey, trimmed)) return {
|
|
105
|
+
ok: false,
|
|
106
|
+
code: "STEER_FAILED"
|
|
107
|
+
};
|
|
108
|
+
return { ok: true };
|
|
109
|
+
}
|
|
110
|
+
/** Deliver a user's answer to a pending `clarify` tool call. */
|
|
111
|
+
submitClarifyResponse(requestId, answer) {
|
|
112
|
+
return this.clarifyBridge.handleResponse(requestId, answer);
|
|
113
|
+
}
|
|
114
|
+
/** Hermes-style: after HTTP sets a goal, enqueue the goal text as the next user turn. */
|
|
115
|
+
enqueueWebchatPersistentGoalKickoff(sessionKey, goalText) {
|
|
116
|
+
queueMicrotask(() => {
|
|
117
|
+
this.drainScheduledWebchatContinuation(sessionKey, goalText);
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
/** Background drain for extension-initiated webchat turns (`scheduleWebchatContinuation`). */
|
|
121
|
+
async drainScheduledWebchatContinuation(sessionKey, message) {
|
|
122
|
+
try {
|
|
123
|
+
const gen = this.runAgent(message, "webchat", sessionKey, void 0, void 0, { clientCreatedAtMs: Date.now() });
|
|
124
|
+
for await (const _ of gen);
|
|
125
|
+
} catch (err) {
|
|
126
|
+
log.warn({
|
|
127
|
+
err,
|
|
128
|
+
sessionKey
|
|
129
|
+
}, "Scheduled webchat continuation failed");
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Resolve clarify-bridge config for `sessionKey`: who delivers the question
|
|
134
|
+
* (webchat SSE, Telegram message, or both), then start the bridge request.
|
|
135
|
+
* Rejects when neither path is available (e.g. CLI without webchat or TG).
|
|
136
|
+
*
|
|
137
|
+
* `publishSseFor(runId)` is the bridge into AgentService's
|
|
138
|
+
* `turnDispatcher.enqueueWebchatSseEvent`. We take it as a callback so the
|
|
139
|
+
* runner does not import AgentService statically.
|
|
140
|
+
*/
|
|
141
|
+
requestClarification(opts) {
|
|
142
|
+
const { sessionKey, request, publishSseFor } = opts;
|
|
143
|
+
const runId = this.activeWebchatRunBySession.get(sessionKey);
|
|
144
|
+
const publishSse = runId ? publishSseFor(runId) : void 0;
|
|
145
|
+
const deliver = parseSessionKey(sessionKey)?.source === "telegram" ? async (ctx) => {
|
|
146
|
+
await this.deliverTelegramClarify(ctx);
|
|
147
|
+
} : void 0;
|
|
148
|
+
if (!runId && !deliver) return Promise.reject(/* @__PURE__ */ new Error("Clarify is not available for this session (use webchat, Telegram, or CLI)"));
|
|
149
|
+
return this.clarifyBridge.startRequest({
|
|
150
|
+
sessionKey,
|
|
151
|
+
runId,
|
|
152
|
+
relay: this.runRelay,
|
|
153
|
+
publishSse,
|
|
154
|
+
request,
|
|
155
|
+
deliver
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
async deliverTelegramClarify(ctx) {
|
|
159
|
+
const parsed = parseSessionKey(ctx.sessionKey);
|
|
160
|
+
if (!parsed || parsed.source !== "telegram") return;
|
|
161
|
+
let body = ctx.request.question;
|
|
162
|
+
if (ctx.request.default) body += `\n\nDefault if unsure: ${ctx.request.default}`;
|
|
163
|
+
const choices = ctx.request.choices;
|
|
164
|
+
const buttonRows = choices && choices.length >= 2 ? choices.map((c, i) => [{
|
|
165
|
+
text: c.length > 64 ? `${c.slice(0, 61)}…` : c,
|
|
166
|
+
callback_data: `clarify:${ctx.requestId}:${i}`
|
|
167
|
+
}]) : void 0;
|
|
168
|
+
if (!buttonRows) body += "\n\nReply with your answer in this chat.";
|
|
169
|
+
await this.opts.getChannelManager().send({
|
|
170
|
+
channel: "telegram",
|
|
171
|
+
chat_id: parsed.peerId,
|
|
172
|
+
content: body,
|
|
173
|
+
metadata: {
|
|
174
|
+
accountId: parsed.accountId,
|
|
175
|
+
...parsed.threadId ? { threadId: parsed.threadId } : {}
|
|
176
|
+
},
|
|
177
|
+
buttons: buttonRows
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
};
|
|
181
|
+
//#endregion
|
|
182
|
+
export { GatewayAgentRunner };
|
|
183
|
+
|
|
184
|
+
//# sourceMappingURL=agent-runner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"agent-runner.js","names":[],"sources":["../../../../src/gateway/service/agent-runner.ts"],"sourcesContent":["/**\n * GatewayAgentRunner — webchat agent invocation and the surrounding control\n * surface (abort, steer, clarify-bridge plumbing, scheduled continuations).\n *\n * Was 200 lines of `GatewayService` covering seven concerns that all hung off\n * the same handful of fields (`activeWebchatRunBySession`, `runAbortControllers`,\n * `clarifyBridge`, `runRelay`):\n *\n * - `runAgent(message, channel, chatId, ...)` — wraps {@link runGatewayAgent}\n * - `abortAgentRun(runId)` — POST /api/agent/abort + cleanup\n * - `steerWebchatAgent(chatId, message)` — Agent.steer queue at tool boundary\n * - `submitClarifyResponse(requestId, answer)` — UI answers a `clarify` call\n * - `enqueueWebchatPersistentGoalKickoff(sessionKey, goalText)` — initial\n * `/goal` kickoff posts the goal text as the next user turn\n * - `drainScheduledWebchatContinuation(sk, msg)` — background continuation\n * (extension scheduler + persistent-goal flow)\n * - `clarifyForSession({ sessionKey, request })` — clarify-bridge dispatch\n * used by `gatewayClarify.requestClarification` in AgentService\n *\n * Owns the two state maps (`activeWebchatRunBySession`, `runAbortControllers`)\n * directly so peer coordinators (sessions-api, marketplace, config) cannot\n * accidentally mutate them.\n */\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport type { AgentService } from '../../agent/service.js';\nimport type { ChannelManager } from '../../channels/manager.js';\nimport type { SessionIndex } from '../../session/index.js';\nimport { AgentRunRelay, type RelayEvent } from '../agent-run-relay.js';\nimport { ClarifyBridge, type ClarifyBridgeRequest } from '../clarify-bridge.js';\nimport { buildSessionKey, parseSessionKey } from '../../routing/session-key.js';\nimport { getDefaultAgentId } from '../../routing/resolve-route.js';\nimport { runGatewayAgent } from './run-gateway-agent.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('GatewayAgentRunner');\n\nexport interface GatewayAgentRunnerOptions {\n bus: MessageBus;\n sessionIndex: SessionIndex;\n /** Resolved lazily — the runner is constructed before AgentService exists. */\n getAgentService: () => AgentService;\n getChannelManager: () => ChannelManager;\n getConfig: () => Config;\n /** SSE emit (re-used so `runAgent` events broadcast to subscribers). */\n emit: (type: string, payload: unknown) => void;\n}\n\nexport class GatewayAgentRunner {\n private readonly opts: GatewayAgentRunnerOptions;\n readonly runRelay = new AgentRunRelay();\n /** Per-run abort for webchat (POST /api/agent/abort or client disconnect). */\n private readonly runAbortControllers = new Map<string, AbortController>();\n private readonly clarifyBridge = new ClarifyBridge();\n /** Maps webchat session key → active `runId` for `clarify` tool routing. */\n private readonly activeWebchatRunBySession = new Map<string, string>();\n\n constructor(opts: GatewayAgentRunnerOptions) {\n this.opts = opts;\n }\n\n // ── Read-only accessors (so peers don't get a Map ref) ────────────────\n\n /** True when a webchat agent run is currently in-flight for `sessionKey`. */\n hasActiveRun(sessionKey: string): boolean {\n return this.activeWebchatRunBySession.has(sessionKey);\n }\n\n getActiveRunId(sessionKey: string): string | undefined {\n return this.activeWebchatRunBySession.get(sessionKey);\n }\n\n getClarifyBridge(): ClarifyBridge {\n return this.clarifyBridge;\n }\n\n /** Called from `GatewayService.stop()` so the bridge gets cleaned up. */\n disposeClarifyBridge(): void {\n this.clarifyBridge.dispose();\n }\n\n // ── runAgent (webchat HTTP POST) ──────────────────────────────────────\n\n async *runAgent(\n message: string,\n channel: string,\n chatId: string,\n attachments?: Array<{\n type: string;\n mimeType?: string;\n data?: string;\n name?: string;\n size?: number;\n }>,\n thinking?: string,\n runOptions?: { signal?: AbortSignal; clientCreatedAtMs?: number },\n ): AsyncGenerator<\n { type: string; content?: string; status?: string; runId?: string },\n { status: string; summary: string },\n unknown\n > {\n const iter = runGatewayAgent(\n {\n config: this.opts.getConfig(),\n agentService: this.opts.getAgentService(),\n bus: this.opts.bus,\n runRelay: this.runRelay,\n runAbortControllers: this.runAbortControllers,\n activeWebchatRunBySession: this.activeWebchatRunBySession,\n sessionIndex: this.opts.sessionIndex,\n emit: this.opts.emit,\n },\n message,\n channel,\n chatId,\n attachments,\n thinking,\n runOptions,\n );\n\n let step = await iter.next();\n while (!step.done) {\n yield step.value as { type: string; content?: string; status?: string; runId?: string };\n step = await iter.next();\n }\n return step.value;\n }\n\n /** Abort an in-flight webchat agent run (matches `runId` from SSE `status`). */\n abortAgentRun(runId: string): boolean {\n this.clarifyBridge.cancelForRun(runId);\n const keysToMark: string[] = [];\n for (const [sk, id] of this.activeWebchatRunBySession) {\n if (id === runId) {\n keysToMark.push(sk);\n }\n }\n for (const sk of keysToMark) {\n this.activeWebchatRunBySession.delete(sk);\n }\n const relaySk = this.runRelay.getSessionKey(runId);\n if (relaySk && !keysToMark.includes(relaySk)) {\n keysToMark.push(relaySk);\n }\n const c = this.runAbortControllers.get(runId);\n if (!c) {\n return false;\n }\n const cutoffTs = Date.now();\n for (const sk of keysToMark) {\n void this.opts.sessionIndex\n .updateSessionMetadata(sk, { abortCutoffTimestamp: cutoffTs })\n .catch(() => {});\n void this.opts.sessionIndex\n .appendTranscriptContextEntry(sk, {\n text: 'Webchat agent run aborted',\n data: { runId, abortCutoffTimestamp: cutoffTs },\n })\n .catch(() => {});\n }\n c.abort();\n for (const sk of keysToMark) {\n void import('../../agent/embedded/runs.js').then(({ abortEmbeddedRun }) =>\n abortEmbeddedRun(sk),\n );\n }\n return true;\n }\n\n /**\n * Queue steering text for an active webchat run (`Agent.steer` /\n * tool-boundary injection). `chatId` is the same as `POST /api/agent` body\n * (`sessionKey` or legacy peer id).\n */\n async steerWebchatAgent(\n chatId: string,\n message: string,\n ): Promise<\n { ok: true } | { ok: false; code: 'BAD_REQUEST' | 'NO_ACTIVE_RUN' | 'STEER_FAILED' }\n > {\n const trimmed = message.trim();\n if (!trimmed) {\n return { ok: false, code: 'BAD_REQUEST' };\n }\n const cfg = this.opts.getConfig();\n const parsedKey = parseSessionKey(chatId);\n const sessionKey = parsedKey\n ? chatId\n : buildSessionKey({\n agentId: getDefaultAgentId(cfg),\n source: 'webchat',\n accountId: 'default',\n peerKind: 'direct',\n peerId: chatId,\n });\n if (!this.activeWebchatRunBySession.has(sessionKey)) {\n return { ok: false, code: 'NO_ACTIVE_RUN' };\n }\n const steered = await this.opts\n .getAgentService()\n .turnDispatcher.steerWebchatSession(sessionKey, trimmed);\n if (!steered) {\n return { ok: false, code: 'STEER_FAILED' };\n }\n return { ok: true };\n }\n\n /** Deliver a user's answer to a pending `clarify` tool call. */\n submitClarifyResponse(requestId: string, answer: string): boolean {\n return this.clarifyBridge.handleResponse(requestId, answer);\n }\n\n /** Hermes-style: after HTTP sets a goal, enqueue the goal text as the next user turn. */\n enqueueWebchatPersistentGoalKickoff(sessionKey: string, goalText: string): void {\n queueMicrotask(() => {\n void this.drainScheduledWebchatContinuation(sessionKey, goalText);\n });\n }\n\n /** Background drain for extension-initiated webchat turns (`scheduleWebchatContinuation`). */\n async drainScheduledWebchatContinuation(sessionKey: string, message: string): Promise<void> {\n try {\n const gen = this.runAgent(message, 'webchat', sessionKey, undefined, undefined, {\n clientCreatedAtMs: Date.now(),\n });\n for await (const _ of gen) {\n // Relay + `agent.stream` broadcast; UI attaches via pending runId + resume.\n }\n } catch (err) {\n log.warn({ err, sessionKey }, 'Scheduled webchat continuation failed');\n }\n }\n\n // ── Clarify dispatch (called from AgentService.gatewayClarify) ────────\n\n /**\n * Resolve clarify-bridge config for `sessionKey`: who delivers the question\n * (webchat SSE, Telegram message, or both), then start the bridge request.\n * Rejects when neither path is available (e.g. CLI without webchat or TG).\n *\n * `publishSseFor(runId)` is the bridge into AgentService's\n * `turnDispatcher.enqueueWebchatSseEvent`. We take it as a callback so the\n * runner does not import AgentService statically.\n */\n requestClarification(opts: {\n sessionKey: string;\n request: ClarifyBridgeRequest;\n publishSseFor: (runId: string) => (e: RelayEvent) => void;\n }): Promise<string> {\n const { sessionKey, request, publishSseFor } = opts;\n const runId = this.activeWebchatRunBySession.get(sessionKey);\n const publishSse = runId ? publishSseFor(runId) : undefined;\n const parsed = parseSessionKey(sessionKey);\n const deliver =\n parsed?.source === 'telegram'\n ? async (ctx: {\n sessionKey: string;\n requestId: string;\n request: ClarifyBridgeRequest;\n }) => {\n await this.deliverTelegramClarify(ctx);\n }\n : undefined;\n if (!runId && !deliver) {\n return Promise.reject(\n new Error('Clarify is not available for this session (use webchat, Telegram, or CLI)'),\n );\n }\n return this.clarifyBridge.startRequest({\n sessionKey,\n runId,\n relay: this.runRelay,\n publishSse,\n request,\n deliver,\n });\n }\n\n private async deliverTelegramClarify(ctx: {\n sessionKey: string;\n requestId: string;\n request: ClarifyBridgeRequest;\n }): Promise<void> {\n const parsed = parseSessionKey(ctx.sessionKey);\n if (!parsed || parsed.source !== 'telegram') {\n return;\n }\n\n let body = ctx.request.question;\n if (ctx.request.default) {\n body += `\\n\\nDefault if unsure: ${ctx.request.default}`;\n }\n\n const choices = ctx.request.choices;\n const buttonRows =\n choices && choices.length >= 2\n ? choices.map((c, i) => [\n {\n text: c.length > 64 ? `${c.slice(0, 61)}…` : c,\n callback_data: `clarify:${ctx.requestId}:${i}`,\n },\n ])\n : undefined;\n\n if (!buttonRows) {\n body += '\\n\\nReply with your answer in this chat.';\n }\n\n await this.opts.getChannelManager().send({\n channel: 'telegram',\n chat_id: parsed.peerId,\n content: body,\n metadata: {\n accountId: parsed.accountId,\n ...(parsed.threadId ? { threadId: parsed.threadId } : {}),\n },\n buttons: buttonRows,\n });\n }\n}\n"],"mappings":";;;;;;;;kBA8BgF;oBACb;aAEd;AAErD,MAAM,MAAM,aAAa,qBAAqB;AAa9C,IAAa,qBAAb,MAAgC;CAC9B;CACA,WAAoB,IAAI,eAAe;;CAEvC,sCAAuC,IAAI,KAA8B;CACzE,gBAAiC,IAAI,eAAe;;CAEpD,4CAA6C,IAAI,KAAqB;CAEtE,YAAY,MAAiC;AAC3C,OAAK,OAAO;;;CAMd,aAAa,YAA6B;AACxC,SAAO,KAAK,0BAA0B,IAAI,WAAW;;CAGvD,eAAe,YAAwC;AACrD,SAAO,KAAK,0BAA0B,IAAI,WAAW;;CAGvD,mBAAkC;AAChC,SAAO,KAAK;;;CAId,uBAA6B;AAC3B,OAAK,cAAc,SAAS;;CAK9B,OAAO,SACL,SACA,SACA,QACA,aAOA,UACA,YAKA;EACA,MAAM,OAAO,gBACX;GACE,QAAQ,KAAK,KAAK,WAAW;GAC7B,cAAc,KAAK,KAAK,iBAAiB;GACzC,KAAK,KAAK,KAAK;GACf,UAAU,KAAK;GACf,qBAAqB,KAAK;GAC1B,2BAA2B,KAAK;GAChC,cAAc,KAAK,KAAK;GACxB,MAAM,KAAK,KAAK;GACjB,EACD,SACA,SACA,QACA,aACA,UACA,WACD;EAED,IAAI,OAAO,MAAM,KAAK,MAAM;AAC5B,SAAO,CAAC,KAAK,MAAM;AACjB,SAAM,KAAK;AACX,UAAO,MAAM,KAAK,MAAM;;AAE1B,SAAO,KAAK;;;CAId,cAAc,OAAwB;AACpC,OAAK,cAAc,aAAa,MAAM;EACtC,MAAM,aAAuB,EAAE;AAC/B,OAAK,MAAM,CAAC,IAAI,OAAO,KAAK,0BAC1B,KAAI,OAAO,MACT,YAAW,KAAK,GAAG;AAGvB,OAAK,MAAM,MAAM,WACf,MAAK,0BAA0B,OAAO,GAAG;EAE3C,MAAM,UAAU,KAAK,SAAS,cAAc,MAAM;AAClD,MAAI,WAAW,CAAC,WAAW,SAAS,QAAQ,CAC1C,YAAW,KAAK,QAAQ;EAE1B,MAAM,IAAI,KAAK,oBAAoB,IAAI,MAAM;AAC7C,MAAI,CAAC,EACH,QAAO;EAET,MAAM,WAAW,KAAK,KAAK;AAC3B,OAAK,MAAM,MAAM,YAAY;AACtB,QAAK,KAAK,aACZ,sBAAsB,IAAI,EAAE,sBAAsB,UAAU,CAAC,CAC7D,YAAY,GAAG;AACb,QAAK,KAAK,aACZ,6BAA6B,IAAI;IAChC,MAAM;IACN,MAAM;KAAE;KAAO,sBAAsB;KAAU;IAChD,CAAC,CACD,YAAY,GAAG;;AAEpB,IAAE,OAAO;AACT,OAAK,MAAM,MAAM,WACV,QAAO,gCAAgC,MAAM,EAAE,uBAClD,iBAAiB,GAAG,CACrB;AAEH,SAAO;;;;;;;CAQT,MAAM,kBACJ,QACA,SAGA;EACA,MAAM,UAAU,QAAQ,MAAM;AAC9B,MAAI,CAAC,QACH,QAAO;GAAE,IAAI;GAAO,MAAM;GAAe;EAE3C,MAAM,MAAM,KAAK,KAAK,WAAW;EAEjC,MAAM,aADY,gBAAgB,OACN,GACxB,SACA,gBAAgB;GACd,SAAS,kBAAkB,IAAI;GAC/B,QAAQ;GACR,WAAW;GACX,UAAU;GACV,QAAQ;GACT,CAAC;AACN,MAAI,CAAC,KAAK,0BAA0B,IAAI,WAAW,CACjD,QAAO;GAAE,IAAI;GAAO,MAAM;GAAiB;AAK7C,MAAI,CAAC,MAHiB,KAAK,KACxB,iBAAiB,CACjB,eAAe,oBAAoB,YAAY,QAAQ,CAExD,QAAO;GAAE,IAAI;GAAO,MAAM;GAAgB;AAE5C,SAAO,EAAE,IAAI,MAAM;;;CAIrB,sBAAsB,WAAmB,QAAyB;AAChE,SAAO,KAAK,cAAc,eAAe,WAAW,OAAO;;;CAI7D,oCAAoC,YAAoB,UAAwB;AAC9E,uBAAqB;AACd,QAAK,kCAAkC,YAAY,SAAS;IACjE;;;CAIJ,MAAM,kCAAkC,YAAoB,SAAgC;AAC1F,MAAI;GACF,MAAM,MAAM,KAAK,SAAS,SAAS,WAAW,YAAY,KAAA,GAAW,KAAA,GAAW,EAC9E,mBAAmB,KAAK,KAAK,EAC9B,CAAC;AACF,cAAW,MAAM,KAAK;WAGf,KAAK;AACZ,OAAI,KAAK;IAAE;IAAK;IAAY,EAAE,wCAAwC;;;;;;;;;;;;CAe1E,qBAAqB,MAID;EAClB,MAAM,EAAE,YAAY,SAAS,kBAAkB;EAC/C,MAAM,QAAQ,KAAK,0BAA0B,IAAI,WAAW;EAC5D,MAAM,aAAa,QAAQ,cAAc,MAAM,GAAG,KAAA;EAElD,MAAM,UADS,gBAAgB,WAEvB,EAAE,WAAW,aACf,OAAO,QAID;AACJ,SAAM,KAAK,uBAAuB,IAAI;MAExC,KAAA;AACN,MAAI,CAAC,SAAS,CAAC,QACb,QAAO,QAAQ,uBACb,IAAI,MAAM,4EAA4E,CACvF;AAEH,SAAO,KAAK,cAAc,aAAa;GACrC;GACA;GACA,OAAO,KAAK;GACZ;GACA;GACA;GACD,CAAC;;CAGJ,MAAc,uBAAuB,KAInB;EAChB,MAAM,SAAS,gBAAgB,IAAI,WAAW;AAC9C,MAAI,CAAC,UAAU,OAAO,WAAW,WAC/B;EAGF,IAAI,OAAO,IAAI,QAAQ;AACvB,MAAI,IAAI,QAAQ,QACd,SAAQ,0BAA0B,IAAI,QAAQ;EAGhD,MAAM,UAAU,IAAI,QAAQ;EAC5B,MAAM,aACJ,WAAW,QAAQ,UAAU,IACzB,QAAQ,KAAK,GAAG,MAAM,CACpB;GACE,MAAM,EAAE,SAAS,KAAK,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,KAAK;GAC7C,eAAe,WAAW,IAAI,UAAU,GAAG;GAC5C,CACF,CAAC,GACF,KAAA;AAEN,MAAI,CAAC,WACH,SAAQ;AAGV,QAAM,KAAK,KAAK,mBAAmB,CAAC,KAAK;GACvC,SAAS;GACT,SAAS,OAAO;GAChB,SAAS;GACT,UAAU;IACR,WAAW,OAAO;IAClB,GAAI,OAAO,WAAW,EAAE,UAAU,OAAO,UAAU,GAAG,EAAE;IACzD;GACD,SAAS;GACV,CAAC"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* GatewayConfigCoordinator — owns config persistence, hot-reload, and the
|
|
3
|
+
* per-section reload handlers.
|
|
4
|
+
*
|
|
5
|
+
* Was 350 lines of `GatewayService` covering nine concerns:
|
|
6
|
+
* - manual `reloadConfig()` (CLI/UI trigger)
|
|
7
|
+
* - `saveConfig()` / `updateConfig()` (PATCH /api/config)
|
|
8
|
+
* - `setBundledExtensionActivationTarget` (extension store install)
|
|
9
|
+
* - `afterWeixinCredentialsPersisted` / `afterFeishuCredentialsPersisted`
|
|
10
|
+
* (QR-login follow-ups that bypass the watcher)
|
|
11
|
+
* - `ConfigHotReloader` (fs.watch → debounced per-section dispatch)
|
|
12
|
+
* - Eight section reload handlers (models / agents / channels / cron /
|
|
13
|
+
* heartbeat / tools / mcp / extensions)
|
|
14
|
+
* - `scheduleChannelPluginsAfterPersist` (coalesces rapid saves so
|
|
15
|
+
* Telegram/Weixin do not stop/start repeatedly)
|
|
16
|
+
*
|
|
17
|
+
* Pulled out so the gateway composition root stays focused on lifecycle, and
|
|
18
|
+
* each handler is reachable from one place when adding a new config section.
|
|
19
|
+
*
|
|
20
|
+
* **Config state ownership.** `GatewayService.config` is still the single
|
|
21
|
+
* source of truth — this coordinator reads it via `getConfig()` and writes it
|
|
22
|
+
* back via `setConfig()` after every reload / persist. We pass through rather
|
|
23
|
+
* than holding our own copy so other coordinators (sessions, marketplace,
|
|
24
|
+
* agent runner) see the latest config the moment a reload commits.
|
|
25
|
+
*/
|
|
26
|
+
import type { Config } from '../../config/schema.js';
|
|
27
|
+
import type { AgentService } from '../../agent/service.js';
|
|
28
|
+
import type { ChannelManager } from '../../channels/manager.js';
|
|
29
|
+
import type { CronService } from '../../cron/index.js';
|
|
30
|
+
import type { HeartbeatService } from '../heartbeat/index.js';
|
|
31
|
+
import type { ExtensionLoader } from '../../extensions/loader.js';
|
|
32
|
+
import type { MessageBus } from '../../infra/bus/index.js';
|
|
33
|
+
export interface GatewayConfigCoordinatorOptions {
|
|
34
|
+
configPath: string;
|
|
35
|
+
bus: MessageBus;
|
|
36
|
+
/** Hot reload (fs.watch) — disabled in tests / certain CLI modes. */
|
|
37
|
+
enableHotReload: boolean;
|
|
38
|
+
getConfig: () => Config;
|
|
39
|
+
/** Writes the new config back into `GatewayService.config`. */
|
|
40
|
+
setConfig: (next: Config) => void;
|
|
41
|
+
getAgentService: () => AgentService;
|
|
42
|
+
getChannelManager: () => ChannelManager;
|
|
43
|
+
getCronService: () => CronService;
|
|
44
|
+
getHeartbeatService: () => HeartbeatService | null;
|
|
45
|
+
getExtensionLoader: () => ExtensionLoader | null;
|
|
46
|
+
/** Re-evaluate browser-extension server attachment after agent defaults change. */
|
|
47
|
+
reconcileBrowserExtensionServer: () => Promise<void>;
|
|
48
|
+
/** Latest channel status snapshot for the `channels.status` SSE event. */
|
|
49
|
+
getChannelsStatus: () => unknown;
|
|
50
|
+
/** SSE emit (used for `config.reload` + `channels.status`). */
|
|
51
|
+
emit: (type: string, payload: unknown) => void;
|
|
52
|
+
}
|
|
53
|
+
export declare class GatewayConfigCoordinator {
|
|
54
|
+
private readonly opts;
|
|
55
|
+
private configReloader;
|
|
56
|
+
private channelReloadFlushPromise;
|
|
57
|
+
private channelReloadPending;
|
|
58
|
+
constructor(opts: GatewayConfigCoordinatorOptions);
|
|
59
|
+
/** Start the fs.watch-based reloader (idempotent — only starts once). */
|
|
60
|
+
startHotReloader(): void;
|
|
61
|
+
stopHotReloader(): Promise<void>;
|
|
62
|
+
reloadConfig(): Promise<{
|
|
63
|
+
reloaded: boolean;
|
|
64
|
+
error?: string;
|
|
65
|
+
}>;
|
|
66
|
+
saveConfig(config: Config): Promise<{
|
|
67
|
+
saved: boolean;
|
|
68
|
+
error?: string;
|
|
69
|
+
}>;
|
|
70
|
+
/** Merge partial updates into `currentConfig` and persist. */
|
|
71
|
+
updateConfig(updates: Partial<Config>): Promise<{
|
|
72
|
+
updated: boolean;
|
|
73
|
+
error?: string;
|
|
74
|
+
}>;
|
|
75
|
+
/**
|
|
76
|
+
* App store (phase 1): persist `extensions.enabled` / `extensions.disabled`
|
|
77
|
+
* for a bundled extension. Marketplace-only extensions hot-load on enable;
|
|
78
|
+
* disable still needs a gateway restart to unload.
|
|
79
|
+
*/
|
|
80
|
+
setBundledExtensionActivationTarget(extensionId: string, wanted: boolean): Promise<{
|
|
81
|
+
ok: boolean;
|
|
82
|
+
error?: string;
|
|
83
|
+
requiresGatewayRestart: boolean;
|
|
84
|
+
}>;
|
|
85
|
+
afterWeixinCredentialsPersisted(): Promise<void>;
|
|
86
|
+
afterFeishuCredentialsPersisted(): Promise<void>;
|
|
87
|
+
/**
|
|
88
|
+
* Apply `latest.channels` to every registered channel plugin (Telegram,
|
|
89
|
+
* Weixin, extensions). Single runtime path for: file watcher hot reload, API
|
|
90
|
+
* saves, and Weixin QR follow-up.
|
|
91
|
+
*/
|
|
92
|
+
handleChannelsReload(newConfig: Config): Promise<void>;
|
|
93
|
+
/**
|
|
94
|
+
* Apply `gateway.heartbeat` from current config after PATCH /api/config (and
|
|
95
|
+
* when hot reload is off). File watcher uses `handleHeartbeatReload` with
|
|
96
|
+
* the same effect when paths match.
|
|
97
|
+
*/
|
|
98
|
+
reloadHeartbeatFromCurrentConfig(): void;
|
|
99
|
+
private handleModelsReload;
|
|
100
|
+
private handleAgentDefaultsReload;
|
|
101
|
+
/**
|
|
102
|
+
* Coalesces rapid saves so Telegram/Weixin do not stop/start repeatedly.
|
|
103
|
+
* The persist path schedules the channel apply; the same coalescer absorbs
|
|
104
|
+
* follow-up saves until the first flush settles.
|
|
105
|
+
*/
|
|
106
|
+
private scheduleChannelPluginsAfterPersist;
|
|
107
|
+
private handleCronReload;
|
|
108
|
+
private handleHeartbeatReload;
|
|
109
|
+
private handleToolsReload;
|
|
110
|
+
private handleMcpReload;
|
|
111
|
+
/** Dispatch config hot reload to extensions that registered `registerReload`. */
|
|
112
|
+
private handleExtensionsReload;
|
|
113
|
+
/**
|
|
114
|
+
* Persist and replace `currentConfig` with the validated file contents so
|
|
115
|
+
* runtime matches disk (PATCH merge objects can drift from Zod-normalized
|
|
116
|
+
* output).
|
|
117
|
+
*/
|
|
118
|
+
private writeConfigAndReloadFromDisk;
|
|
119
|
+
}
|