@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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"delegate-tool.js","names":[],"sources":["../../../../src/agent/tools/delegate-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport { createDelegateChildHandle, type DelegateChildHandleOptions } from '../child-agent-factory.js';\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport const DEFAULT_DELEGATE_TOOLS = [\n 'shell',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'grep',\n 'find',\n 'list_dir',\n 'web_search',\n 'web_fetch',\n] as const;\n\n/** Tools never passed to a delegated sub-agent (even if requested). */\nexport const DELEGATE_BLOCKED_TOOLS = new Set([\n 'delegate_task',\n 'clarify',\n 'curated_memory',\n 'send_message',\n 'send_media',\n 'todo',\n 'session_search',\n 'memory_search',\n 'memory_get',\n 'cronjob',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'bundle-mcp',\n]);\n\nconst DelegateTaskSchema = Type.Object({\n goal: Type.String({\n description: 'Clear description of what the sub-agent should accomplish',\n }),\n context: Type.Optional(\n Type.String({\n description: 'Additional context the sub-agent needs (file paths, constraints, etc.)',\n }),\n ),\n toolset: Type.Optional(\n Type.Array(Type.String(), {\n description:\n 'Tool names the sub-agent may use. Defaults to shell, read_file, write_file, edit_file, grep, find, list_dir, web_search, web_fetch. ' +\n 'Dangerous or interactive tools are always removed.',\n }),\n ),\n maxIterations: Type.Optional(\n Type.Number({\n description: 'Maximum tool executions in the sub-agent (default: 30)',\n default: DEFAULT_MAX_ITERATIONS,\n }),\n ),\n});\n\nexport interface DelegateToolDeps {\n workspace: string;\n getSubagentModel: () => import('@earendil-works/pi-ai').Model<import('@earendil-works/pi-ai').Api>;\n bus: import('../../infra/bus/index.js').MessageBus;\n getConfig: () => import('../../config/schema.js').Config | undefined;\n getCurrentContext?: () => { sessionKey?: string; channel?: string; accountId?: string; to?: string; threadId?: string | number } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n toolExecutorConfig?: Partial<import('./executor.js').ToolExecutorConfig>;\n}\n\ntype DelegateTaskParams = {\n goal: string;\n context?: string;\n toolset?: string[];\n maxIterations?: number;\n};\n\nexport function createDelegateTool(deps: DelegateToolDeps): AgentTool {\n return {\n name: 'delegate_task',\n label: '🤖 Delegate',\n description:\n 'Spawn a sub-agent for an isolated subtask with a fresh conversation (no parent transcript).\\n\\n' +\n 'The sub-agent returns a text summary only — tool traces stay out of your context.\\n\\n' +\n 'WHEN TO USE:\\n' +\n '- Independent work (research, multi-file exploration) where you only need the outcome\\n' +\n '- Avoiding context bloat from long intermediate tool output\\n\\n' +\n 'WHEN NOT TO USE:\\n' +\n '- Tasks that need this chat history or user clarification\\n' +\n '- Single trivial steps\\n\\n' +\n 'Sub-agents cannot use clarify, messaging, memory tools, todo, or nested delegate_task.',\n parameters: DelegateTaskSchema,\n\n async execute(\n _toolCallId: string,\n params: any,\n signal?: AbortSignal,\n ): Promise<AgentToolResult<{ summary: string; iterations: number }>> {\n const p = params as DelegateTaskParams;\n const maxIterations = p.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n if (!Number.isFinite(maxIterations) || maxIterations < 1 || maxIterations > 200) {\n return {\n content: [{ type: 'text', text: 'Invalid maxIterations (use 1–200).' }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const requested = p.toolset ?? [...DEFAULT_DELEGATE_TOOLS];\n const allowedNames = [\n ...new Set(\n requested.map((t) => String(t).trim()).filter(Boolean).filter((t) => !DELEGATE_BLOCKED_TOOLS.has(t)),\n ),\n ];\n\n if (allowedNames.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No allowed tools remain after applying the delegation blocklist. Expand `toolset` with safe tools.',\n },\n ],\n details: { summary: '', iterations: 0 },\n };\n }\n\n let model: ReturnType<DelegateToolDeps['getSubagentModel']>;\n try {\n model = deps.getSubagentModel();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `delegate_task: ${msg}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: deps.workspace,\n goal: p.goal,\n context: p.context,\n allowedToolNames: allowedNames,\n maxIterations,\n model,\n bus: deps.bus,\n getConfig: deps.getConfig,\n toolExecutorConfig: deps.toolExecutorConfig,\n };\n\n // Sub-agent lifecycle hook (parity surface for channel thread bindings).\n const ctx = deps.getCurrentContext?.() ?? null;\n const parentSessionKey = ctx?.sessionKey;\n let childSessionKey: string | undefined;\n try {\n if (deps.hookRunner && parentSessionKey) {\n const { parseSessionKey, buildSessionKey } = await import('../../routing/session-key.js');\n const parsed = parseSessionKey(parentSessionKey);\n if (parsed) {\n childSessionKey = buildSessionKey({\n agentId: 'subagent',\n source: parsed.agentId,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n threadId: parsed.threadId,\n scopeId: parsed.scopeId,\n });\n }\n if (childSessionKey) {\n const hookResult = await (deps.hookRunner as any).runHooksWithResult(\n 'subagent_spawning',\n {\n childSessionKey,\n requester: {\n channel: ctx?.channel,\n accountId: ctx?.accountId,\n to: (ctx as any)?.to,\n threadId: (ctx as any)?.threadId,\n },\n threadRequested: true,\n agentId: 'subagent',\n label: 'delegate_task',\n },\n { sessionKey: parentSessionKey, agentId: ctx?.channel },\n );\n const r = hookResult as any;\n if (r && r.status === 'error') {\n return {\n content: [{ type: 'text', text: `delegate_task: ${String(r.error || 'subagent spawn blocked')}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n }\n }\n } catch {\n // Hooks are best-effort.\n }\n\n const child = createDelegateChildHandle(childOptions);\n\n if (signal) {\n signal.addEventListener('abort', () => child.abort(), { once: true });\n }\n\n try {\n const { summary, toolIterations } = await child.run();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n return {\n content: [{ type: 'text', text: `Sub-agent completed:\\n\\n${summary}` }],\n details: { summary, iterations: toolIterations },\n };\n } catch (error) {\n child.abort();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: `Sub-agent failed: ${message}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n },\n } as any;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"delegate-tool.js","names":[],"sources":["../../../../src/agent/tools/delegate-tool.ts"],"sourcesContent":["import { Type } from '@sinclair/typebox';\nimport type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';\n\nimport {\n createDelegateChildHandle,\n type BuildChildToolsOptions,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport const DEFAULT_DELEGATE_TOOLS = [\n 'shell',\n 'read_file',\n 'write_file',\n 'edit_file',\n 'grep',\n 'find',\n 'list_dir',\n 'web_search',\n 'web_fetch',\n] as const;\n\n/** Tools never passed to a delegated sub-agent (even if requested). */\nexport const DELEGATE_BLOCKED_TOOLS = new Set([\n 'delegate_task',\n 'clarify',\n 'curated_memory',\n 'send_message',\n 'send_media',\n 'todo',\n 'session_search',\n 'memory_search',\n 'memory_get',\n 'cronjob',\n 'skills_list',\n 'skill_view',\n 'skill_manage',\n 'bundle-mcp',\n]);\n\nconst DelegateTaskSchema = Type.Object({\n goal: Type.String({\n description: 'Clear description of what the sub-agent should accomplish',\n }),\n context: Type.Optional(\n Type.String({\n description: 'Additional context the sub-agent needs (file paths, constraints, etc.)',\n }),\n ),\n toolset: Type.Optional(\n Type.Array(Type.String(), {\n description:\n 'Tool names the sub-agent may use. Defaults to shell, read_file, write_file, edit_file, grep, find, list_dir, web_search, web_fetch. ' +\n 'Dangerous or interactive tools are always removed.',\n }),\n ),\n maxIterations: Type.Optional(\n Type.Number({\n description: 'Maximum tool executions in the sub-agent (default: 30)',\n default: DEFAULT_MAX_ITERATIONS,\n }),\n ),\n});\n\nexport interface DelegateToolDeps {\n workspace: string;\n getSubagentModel: () => import('@earendil-works/pi-ai').Model<import('@earendil-works/pi-ai').Api>;\n bus: import('../../infra/bus/index.js').MessageBus;\n getConfig: () => import('../../config/schema.js').Config | undefined;\n getCurrentContext?: () => { sessionKey?: string; channel?: string; accountId?: string; to?: string; threadId?: string | number } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n toolExecutorConfig?: Partial<import('./executor.js').ToolExecutorConfig>;\n /**\n * Construct the child agent's tool set. Injected by `AgentToolsFactory` so\n * the child-agent-factory module does not import `tools/factory.ts`\n * (which would form a factory ↔ delegate-tool ↔ child-agent-factory cycle).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\ntype DelegateTaskParams = {\n goal: string;\n context?: string;\n toolset?: string[];\n maxIterations?: number;\n};\n\nexport function createDelegateTool(deps: DelegateToolDeps): AgentTool {\n return {\n name: 'delegate_task',\n label: '🤖 Delegate',\n description:\n 'Spawn a sub-agent for an isolated subtask with a fresh conversation (no parent transcript).\\n\\n' +\n 'The sub-agent returns a text summary only — tool traces stay out of your context.\\n\\n' +\n 'WHEN TO USE:\\n' +\n '- Independent work (research, multi-file exploration) where you only need the outcome\\n' +\n '- Avoiding context bloat from long intermediate tool output\\n\\n' +\n 'WHEN NOT TO USE:\\n' +\n '- Tasks that need this chat history or user clarification\\n' +\n '- Single trivial steps\\n\\n' +\n 'Sub-agents cannot use clarify, messaging, memory tools, todo, or nested delegate_task.',\n parameters: DelegateTaskSchema,\n\n async execute(\n _toolCallId: string,\n params: any,\n signal?: AbortSignal,\n ): Promise<AgentToolResult<{ summary: string; iterations: number }>> {\n const p = params as DelegateTaskParams;\n const maxIterations = p.maxIterations ?? DEFAULT_MAX_ITERATIONS;\n if (!Number.isFinite(maxIterations) || maxIterations < 1 || maxIterations > 200) {\n return {\n content: [{ type: 'text', text: 'Invalid maxIterations (use 1–200).' }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const requested = p.toolset ?? [...DEFAULT_DELEGATE_TOOLS];\n const allowedNames = [\n ...new Set(\n requested.map((t) => String(t).trim()).filter(Boolean).filter((t) => !DELEGATE_BLOCKED_TOOLS.has(t)),\n ),\n ];\n\n if (allowedNames.length === 0) {\n return {\n content: [\n {\n type: 'text',\n text: 'No allowed tools remain after applying the delegation blocklist. Expand `toolset` with safe tools.',\n },\n ],\n details: { summary: '', iterations: 0 },\n };\n }\n\n let model: ReturnType<DelegateToolDeps['getSubagentModel']>;\n try {\n model = deps.getSubagentModel();\n } catch (e) {\n const msg = e instanceof Error ? e.message : String(e);\n return {\n content: [{ type: 'text', text: `delegate_task: ${msg}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: deps.workspace,\n goal: p.goal,\n context: p.context,\n allowedToolNames: allowedNames,\n maxIterations,\n model,\n bus: deps.bus,\n getConfig: deps.getConfig,\n toolExecutorConfig: deps.toolExecutorConfig,\n buildChildTools: deps.buildChildTools,\n };\n\n // Sub-agent lifecycle hook (parity surface for channel thread bindings).\n const ctx = deps.getCurrentContext?.() ?? null;\n const parentSessionKey = ctx?.sessionKey;\n let childSessionKey: string | undefined;\n try {\n if (deps.hookRunner && parentSessionKey) {\n const { parseSessionKey, buildSessionKey } = await import('../../routing/session-key.js');\n const parsed = parseSessionKey(parentSessionKey);\n if (parsed) {\n childSessionKey = buildSessionKey({\n agentId: 'subagent',\n source: parsed.agentId,\n accountId: parsed.accountId,\n peerKind: parsed.peerKind,\n peerId: parsed.peerId,\n threadId: parsed.threadId,\n scopeId: parsed.scopeId,\n });\n }\n if (childSessionKey) {\n const hookResult = await (deps.hookRunner as any).runHooksWithResult(\n 'subagent_spawning',\n {\n childSessionKey,\n requester: {\n channel: ctx?.channel,\n accountId: ctx?.accountId,\n to: (ctx as any)?.to,\n threadId: (ctx as any)?.threadId,\n },\n threadRequested: true,\n agentId: 'subagent',\n label: 'delegate_task',\n },\n { sessionKey: parentSessionKey, agentId: ctx?.channel },\n );\n const r = hookResult as any;\n if (r && r.status === 'error') {\n return {\n content: [{ type: 'text', text: `delegate_task: ${String(r.error || 'subagent spawn blocked')}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n }\n }\n } catch {\n // Hooks are best-effort.\n }\n\n const child = createDelegateChildHandle(childOptions);\n\n if (signal) {\n signal.addEventListener('abort', () => child.abort(), { once: true });\n }\n\n try {\n const { summary, toolIterations } = await child.run();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n return {\n content: [{ type: 'text', text: `Sub-agent completed:\\n\\n${summary}` }],\n details: { summary, iterations: toolIterations },\n };\n } catch (error) {\n child.abort();\n try {\n if (deps.hookRunner && childSessionKey) {\n await (deps.hookRunner as any).runHooks(\n 'subagent_ended',\n { targetSessionKey: childSessionKey, accountId: ctx?.accountId },\n { sessionKey: parentSessionKey },\n );\n }\n } catch {\n // best-effort\n }\n const message = error instanceof Error ? error.message : String(error);\n return {\n content: [{ type: 'text', text: `Sub-agent failed: ${message}` }],\n details: { summary: '', iterations: 0 },\n };\n }\n },\n } as any;\n}\n"],"mappings":"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"}
|
|
@@ -3,8 +3,8 @@ import { init_logger } from "../../utils/logger.js";
|
|
|
3
3
|
import { SHORT_TERM_PROMOTION_LOCK_RELATIVE, SHORT_TERM_RECALL_STORE_RELATIVE } from "../memory/dreaming/constants.js";
|
|
4
4
|
import { loadDreamingStore, saveDreamingStore } from "../memory/dreaming/short-term-store.js";
|
|
5
5
|
import { resolveDreamingConfig } from "../memory/dreaming/config.js";
|
|
6
|
-
import path from "node:path";
|
|
7
6
|
import fs from "node:fs/promises";
|
|
7
|
+
import path from "node:path";
|
|
8
8
|
import { Type } from "@sinclair/typebox";
|
|
9
9
|
//#region src/agent/tools/dreaming-tool.ts
|
|
10
10
|
init_logger();
|
|
@@ -1,34 +1,53 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Tool Executor - Unified tool execution
|
|
2
|
+
* Tool Executor - Unified tool execution wrapper.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
5
|
-
* - Timeout protection (
|
|
6
|
-
* -
|
|
7
|
-
*
|
|
4
|
+
* Adds:
|
|
5
|
+
* - Timeout protection (tools that hang would otherwise stall the turn).
|
|
6
|
+
* - Optional retry for tools explicitly marked `idempotent`.
|
|
7
|
+
*
|
|
8
|
+
* Pi-agent contract (from `AgentTool.execute` docstring): "Throw on failure
|
|
9
|
+
* instead of encoding errors in `content`." Pi-agent turns thrown errors into
|
|
10
|
+
* `tool_execution_end` events with `isError=true`, which feeds the loop guard,
|
|
11
|
+
* error tracker, and error-pattern matcher. This wrapper therefore re-throws
|
|
12
|
+
* instead of synthesising fake-success results.
|
|
8
13
|
*/
|
|
9
|
-
import type { AgentTool, AgentToolResult } from '@earendil-works/pi-agent-core';
|
|
14
|
+
import type { AgentTool, AgentToolResult, AgentToolUpdateCallback } from '@earendil-works/pi-agent-core';
|
|
10
15
|
export interface ToolExecutorConfig {
|
|
16
|
+
/** Default per-tool timeout when the tool does not declare its own `timeoutMs`. */
|
|
11
17
|
defaultTimeoutMs: number;
|
|
12
|
-
|
|
13
|
-
readTimeoutMs: number;
|
|
14
|
-
writeTimeoutMs: number;
|
|
15
|
-
networkTimeoutMs: number;
|
|
18
|
+
/** Max retry attempts for tools opted into retry via `idempotent: true`. */
|
|
16
19
|
maxRetries: number;
|
|
20
|
+
/** Initial backoff between retries (passed straight to `withRetry`). */
|
|
17
21
|
retryDelayMs: number;
|
|
22
|
+
/** Master switches; default both on so the wrapper is still effective. */
|
|
18
23
|
enableTimeout: boolean;
|
|
19
24
|
enableRetry: boolean;
|
|
20
25
|
}
|
|
21
26
|
declare const DEFAULT_CONFIG: ToolExecutorConfig;
|
|
22
27
|
/**
|
|
23
|
-
*
|
|
28
|
+
* Optional xopc-side hints that any tool may attach. They are not part of the
|
|
29
|
+
* pi-agent `AgentTool` contract; the wrapper reads them via structural typing.
|
|
30
|
+
*
|
|
31
|
+
* - `timeoutMs`: per-tool override of the default execution timeout.
|
|
32
|
+
* - `idempotent`: marks a tool as safe to retry. The wrapper retries only
|
|
33
|
+
* tools that opt in — write/edit-like tools must leave this `false`.
|
|
34
|
+
*/
|
|
35
|
+
export interface XopcToolHints {
|
|
36
|
+
timeoutMs?: number;
|
|
37
|
+
idempotent?: boolean;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Execute tool with timeout (always) and retry (only for idempotent tools).
|
|
41
|
+
* Re-throws on failure so pi-agent records `isError=true`.
|
|
24
42
|
*/
|
|
25
|
-
export declare function executeToolWithProtection(tool: AgentTool<any,
|
|
43
|
+
export declare function executeToolWithProtection<TDetails>(tool: AgentTool<any, TDetails>, toolCallId: string, params: any, signal?: AbortSignal, onUpdate?: AgentToolUpdateCallback<TDetails>, config?: Partial<ToolExecutorConfig>): Promise<AgentToolResult<TDetails>>;
|
|
26
44
|
/**
|
|
27
|
-
*
|
|
45
|
+
* Wrap a single tool with the protection pipeline. Preserves the original
|
|
46
|
+
* `execute` signature so streaming `signal` / `onUpdate` reach the tool.
|
|
28
47
|
*/
|
|
29
|
-
export declare function wrapToolWithProtection(tool: AgentTool<any,
|
|
48
|
+
export declare function wrapToolWithProtection<TDetails>(tool: AgentTool<any, TDetails>, config?: Partial<ToolExecutorConfig>): AgentTool<any, TDetails>;
|
|
30
49
|
/**
|
|
31
|
-
* Wrap
|
|
50
|
+
* Wrap a batch of tools with protection.
|
|
32
51
|
*/
|
|
33
52
|
export declare function wrapToolsWithProtection(tools: AgentTool<any, any>[], config?: Partial<ToolExecutorConfig>): AgentTool<any, any>[];
|
|
34
53
|
export { DEFAULT_CONFIG as DEFAULT_TOOL_EXECUTOR_CONFIG };
|
|
@@ -7,79 +7,64 @@ init_logger();
|
|
|
7
7
|
const log = createLogger("ToolExecutor");
|
|
8
8
|
const DEFAULT_CONFIG = {
|
|
9
9
|
defaultTimeoutMs: 300 * 1e3,
|
|
10
|
-
shellTimeoutMs: 300 * 1e3,
|
|
11
|
-
readTimeoutMs: 30 * 1e3,
|
|
12
|
-
writeTimeoutMs: 60 * 1e3,
|
|
13
|
-
networkTimeoutMs: 60 * 1e3,
|
|
14
10
|
maxRetries: 2,
|
|
15
11
|
retryDelayMs: 1e3,
|
|
16
12
|
enableTimeout: true,
|
|
17
13
|
enableRetry: true
|
|
18
14
|
};
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
return config.defaultTimeoutMs;
|
|
15
|
+
function readToolHints(tool) {
|
|
16
|
+
const t = tool;
|
|
17
|
+
return {
|
|
18
|
+
timeoutMs: typeof t.timeoutMs === "number" && t.timeoutMs > 0 ? t.timeoutMs : void 0,
|
|
19
|
+
idempotent: t.idempotent === true
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
function resolveTimeoutMs(tool, config) {
|
|
23
|
+
return readToolHints(tool).timeoutMs ?? config.defaultTimeoutMs;
|
|
29
24
|
}
|
|
30
25
|
/**
|
|
31
|
-
* Execute tool with timeout and retry
|
|
26
|
+
* Execute tool with timeout (always) and retry (only for idempotent tools).
|
|
27
|
+
* Re-throws on failure so pi-agent records `isError=true`.
|
|
32
28
|
*/
|
|
33
|
-
async function executeToolWithProtection(tool, toolCallId, params, config = {}) {
|
|
29
|
+
async function executeToolWithProtection(tool, toolCallId, params, signal, onUpdate, config = {}) {
|
|
34
30
|
const fullConfig = {
|
|
35
31
|
...DEFAULT_CONFIG,
|
|
36
32
|
...config
|
|
37
33
|
};
|
|
38
34
|
const toolName = tool.name;
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
} catch (error) {
|
|
43
|
-
if (error instanceof Error) throw error;
|
|
44
|
-
throw new Error(String(error));
|
|
45
|
-
}
|
|
46
|
-
};
|
|
47
|
-
let operation = execute;
|
|
35
|
+
const hints = readToolHints(tool);
|
|
36
|
+
const runOnce = () => tool.execute(toolCallId, params, signal, onUpdate);
|
|
37
|
+
let operation = runOnce;
|
|
48
38
|
if (fullConfig.enableTimeout) {
|
|
49
|
-
const timeoutMs =
|
|
50
|
-
const
|
|
51
|
-
operation =
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
});
|
|
57
|
-
};
|
|
39
|
+
const timeoutMs = resolveTimeoutMs(tool, fullConfig);
|
|
40
|
+
const inner = operation;
|
|
41
|
+
operation = () => executeWithTimeout(inner, {
|
|
42
|
+
toolName,
|
|
43
|
+
timeoutMs,
|
|
44
|
+
description: `Executing ${toolName}`
|
|
45
|
+
});
|
|
58
46
|
}
|
|
59
|
-
if (fullConfig.enableRetry && fullConfig.maxRetries > 0) {
|
|
60
|
-
const
|
|
61
|
-
operation =
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
});
|
|
74
|
-
};
|
|
47
|
+
if (fullConfig.enableRetry && fullConfig.maxRetries > 0 && hints.idempotent) {
|
|
48
|
+
const inner = operation;
|
|
49
|
+
operation = () => withRetry(inner, {
|
|
50
|
+
attempts: fullConfig.maxRetries + 1,
|
|
51
|
+
minDelayMs: fullConfig.retryDelayMs,
|
|
52
|
+
onRetry: (info) => {
|
|
53
|
+
log.warn({
|
|
54
|
+
tool: toolName,
|
|
55
|
+
attempt: info.attempt,
|
|
56
|
+
delayMs: info.delayMs,
|
|
57
|
+
error: info.error
|
|
58
|
+
}, "Tool execution failed, retrying (idempotent)");
|
|
59
|
+
}
|
|
60
|
+
});
|
|
75
61
|
}
|
|
76
62
|
const startTime = Date.now();
|
|
77
63
|
try {
|
|
78
64
|
const result = await operation();
|
|
79
|
-
const durationMs = Date.now() - startTime;
|
|
80
65
|
log.debug({
|
|
81
66
|
tool: toolName,
|
|
82
|
-
durationMs,
|
|
67
|
+
durationMs: Date.now() - startTime,
|
|
83
68
|
success: true
|
|
84
69
|
}, "Tool execution completed");
|
|
85
70
|
return result;
|
|
@@ -91,17 +76,7 @@ async function executeToolWithProtection(tool, toolCallId, params, config = {})
|
|
|
91
76
|
timeoutMs: error.timeoutMs,
|
|
92
77
|
durationMs
|
|
93
78
|
}, "Tool execution timed out");
|
|
94
|
-
|
|
95
|
-
content: [{
|
|
96
|
-
type: "text",
|
|
97
|
-
text: error.getUserMessage()
|
|
98
|
-
}],
|
|
99
|
-
details: {
|
|
100
|
-
exitCode: null,
|
|
101
|
-
timedOut: true,
|
|
102
|
-
truncated: false
|
|
103
|
-
}
|
|
104
|
-
};
|
|
79
|
+
throw new Error(`Tool '${toolName}' timed out after ${error.timeoutMs}ms`, { cause: error });
|
|
105
80
|
}
|
|
106
81
|
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
107
82
|
log.error({
|
|
@@ -109,33 +84,23 @@ async function executeToolWithProtection(tool, toolCallId, params, config = {})
|
|
|
109
84
|
error: errorMessage,
|
|
110
85
|
durationMs
|
|
111
86
|
}, "Tool execution failed");
|
|
112
|
-
|
|
113
|
-
content: [{
|
|
114
|
-
type: "text",
|
|
115
|
-
text: `❌ Tool '${toolName}' failed: ${errorMessage}`
|
|
116
|
-
}],
|
|
117
|
-
details: {
|
|
118
|
-
exitCode: null,
|
|
119
|
-
timedOut: false,
|
|
120
|
-
truncated: false,
|
|
121
|
-
error: errorMessage
|
|
122
|
-
}
|
|
123
|
-
};
|
|
87
|
+
throw error instanceof Error ? error : new Error(errorMessage);
|
|
124
88
|
}
|
|
125
89
|
}
|
|
126
90
|
/**
|
|
127
|
-
*
|
|
91
|
+
* Wrap a single tool with the protection pipeline. Preserves the original
|
|
92
|
+
* `execute` signature so streaming `signal` / `onUpdate` reach the tool.
|
|
128
93
|
*/
|
|
129
94
|
function wrapToolWithProtection(tool, config) {
|
|
130
95
|
return {
|
|
131
96
|
...tool,
|
|
132
|
-
async execute(toolCallId, params) {
|
|
133
|
-
return executeToolWithProtection(tool, toolCallId, params, config);
|
|
97
|
+
async execute(toolCallId, params, signal, onUpdate) {
|
|
98
|
+
return executeToolWithProtection(tool, toolCallId, params, signal, onUpdate, config);
|
|
134
99
|
}
|
|
135
100
|
};
|
|
136
101
|
}
|
|
137
102
|
/**
|
|
138
|
-
* Wrap
|
|
103
|
+
* Wrap a batch of tools with protection.
|
|
139
104
|
*/
|
|
140
105
|
function wrapToolsWithProtection(tools, config) {
|
|
141
106
|
return tools.map((tool) => wrapToolWithProtection(tool, config));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","names":[],"sources":["../../../../src/agent/tools/executor.ts"],"sourcesContent":["/**\n * Tool Executor - Unified tool execution
|
|
1
|
+
{"version":3,"file":"executor.js","names":[],"sources":["../../../../src/agent/tools/executor.ts"],"sourcesContent":["/**\n * Tool Executor - Unified tool execution wrapper.\n *\n * Adds:\n * - Timeout protection (tools that hang would otherwise stall the turn).\n * - Optional retry for tools explicitly marked `idempotent`.\n *\n * Pi-agent contract (from `AgentTool.execute` docstring): \"Throw on failure\n * instead of encoding errors in `content`.\" Pi-agent turns thrown errors into\n * `tool_execution_end` events with `isError=true`, which feeds the loop guard,\n * error tracker, and error-pattern matcher. This wrapper therefore re-throws\n * instead of synthesising fake-success results.\n */\n\nimport type {\n AgentTool,\n AgentToolResult,\n AgentToolUpdateCallback,\n} from '@earendil-works/pi-agent-core';\nimport { createLogger } from '../../utils/logger.js';\nimport { executeWithTimeout, TimeoutError } from '../lifecycle/timeout-wrapper.js';\nimport { withRetry } from '../../infra/retry.js';\n\nconst log = createLogger('ToolExecutor');\n\nexport interface ToolExecutorConfig {\n /** Default per-tool timeout when the tool does not declare its own `timeoutMs`. */\n defaultTimeoutMs: number;\n\n /** Max retry attempts for tools opted into retry via `idempotent: true`. */\n maxRetries: number;\n /** Initial backoff between retries (passed straight to `withRetry`). */\n retryDelayMs: number;\n\n /** Master switches; default both on so the wrapper is still effective. */\n enableTimeout: boolean;\n enableRetry: boolean;\n}\n\nconst DEFAULT_CONFIG: ToolExecutorConfig = {\n defaultTimeoutMs: 5 * 60 * 1000, // 5 minutes\n maxRetries: 2,\n retryDelayMs: 1000,\n enableTimeout: true,\n enableRetry: true,\n};\n\n/**\n * Optional xopc-side hints that any tool may attach. They are not part of the\n * pi-agent `AgentTool` contract; the wrapper reads them via structural typing.\n *\n * - `timeoutMs`: per-tool override of the default execution timeout.\n * - `idempotent`: marks a tool as safe to retry. The wrapper retries only\n * tools that opt in — write/edit-like tools must leave this `false`.\n */\nexport interface XopcToolHints {\n timeoutMs?: number;\n idempotent?: boolean;\n}\n\nfunction readToolHints(tool: AgentTool<any, any>): XopcToolHints {\n const t = tool as AgentTool<any, any> & XopcToolHints;\n return {\n timeoutMs: typeof t.timeoutMs === 'number' && t.timeoutMs > 0 ? t.timeoutMs : undefined,\n idempotent: t.idempotent === true,\n };\n}\n\nfunction resolveTimeoutMs(tool: AgentTool<any, any>, config: ToolExecutorConfig): number {\n const hints = readToolHints(tool);\n return hints.timeoutMs ?? config.defaultTimeoutMs;\n}\n\n/**\n * Execute tool with timeout (always) and retry (only for idempotent tools).\n * Re-throws on failure so pi-agent records `isError=true`.\n */\nexport async function executeToolWithProtection<TDetails>(\n tool: AgentTool<any, TDetails>,\n toolCallId: string,\n params: any,\n signal?: AbortSignal,\n onUpdate?: AgentToolUpdateCallback<TDetails>,\n config: Partial<ToolExecutorConfig> = {},\n): Promise<AgentToolResult<TDetails>> {\n const fullConfig = { ...DEFAULT_CONFIG, ...config };\n const toolName = tool.name;\n const hints = readToolHints(tool);\n\n const runOnce = (): Promise<AgentToolResult<TDetails>> =>\n tool.execute(toolCallId, params, signal, onUpdate);\n\n let operation: () => Promise<AgentToolResult<TDetails>> = runOnce;\n\n if (fullConfig.enableTimeout) {\n const timeoutMs = resolveTimeoutMs(tool, fullConfig);\n const inner = operation;\n operation = () =>\n executeWithTimeout(inner, {\n toolName,\n timeoutMs,\n description: `Executing ${toolName}`,\n });\n }\n\n const shouldRetry = fullConfig.enableRetry && fullConfig.maxRetries > 0 && hints.idempotent;\n if (shouldRetry) {\n const inner = operation;\n operation = () =>\n withRetry(inner, {\n attempts: fullConfig.maxRetries + 1,\n minDelayMs: fullConfig.retryDelayMs,\n onRetry: (info) => {\n log.warn(\n { tool: toolName, attempt: info.attempt, delayMs: info.delayMs, error: info.error },\n 'Tool execution failed, retrying (idempotent)',\n );\n },\n });\n }\n\n const startTime = Date.now();\n try {\n const result = await operation();\n log.debug(\n { tool: toolName, durationMs: Date.now() - startTime, success: true },\n 'Tool execution completed',\n );\n return result;\n } catch (error) {\n const durationMs = Date.now() - startTime;\n\n if (error instanceof TimeoutError) {\n log.error(\n { tool: toolName, timeoutMs: error.timeoutMs, durationMs },\n 'Tool execution timed out',\n );\n throw new Error(`Tool '${toolName}' timed out after ${error.timeoutMs}ms`, { cause: error });\n }\n\n const errorMessage = error instanceof Error ? error.message : String(error);\n log.error(\n { tool: toolName, error: errorMessage, durationMs },\n 'Tool execution failed',\n );\n throw error instanceof Error ? error : new Error(errorMessage);\n }\n}\n\n/**\n * Wrap a single tool with the protection pipeline. Preserves the original\n * `execute` signature so streaming `signal` / `onUpdate` reach the tool.\n */\nexport function wrapToolWithProtection<TDetails>(\n tool: AgentTool<any, TDetails>,\n config?: Partial<ToolExecutorConfig>,\n): AgentTool<any, TDetails> {\n return {\n ...tool,\n async execute(\n toolCallId: string,\n params: any,\n signal?: AbortSignal,\n onUpdate?: AgentToolUpdateCallback<TDetails>,\n ): Promise<AgentToolResult<TDetails>> {\n return executeToolWithProtection(tool, toolCallId, params, signal, onUpdate, config);\n },\n } as AgentTool<any, TDetails>;\n}\n\n/**\n * Wrap a batch of tools with protection.\n */\nexport function wrapToolsWithProtection(\n tools: AgentTool<any, any>[],\n config?: Partial<ToolExecutorConfig>,\n): AgentTool<any, any>[] {\n return tools.map((tool) => wrapToolWithProtection(tool, config));\n}\n\n// Export configuration\nexport { DEFAULT_CONFIG as DEFAULT_TOOL_EXECUTOR_CONFIG };\n"],"mappings":";;;;;aAmBqD;AAIrD,MAAM,MAAM,aAAa,eAAe;AAgBxC,MAAM,iBAAqC;CACzC,kBAAkB,MAAS;CAC3B,YAAY;CACZ,cAAc;CACd,eAAe;CACf,aAAa;CACd;AAeD,SAAS,cAAc,MAA0C;CAC/D,MAAM,IAAI;AACV,QAAO;EACL,WAAW,OAAO,EAAE,cAAc,YAAY,EAAE,YAAY,IAAI,EAAE,YAAY,KAAA;EAC9E,YAAY,EAAE,eAAe;EAC9B;;AAGH,SAAS,iBAAiB,MAA2B,QAAoC;AAEvF,QADc,cAAc,KAChB,CAAC,aAAa,OAAO;;;;;;AAOnC,eAAsB,0BACpB,MACA,YACA,QACA,QACA,UACA,SAAsC,EAAE,EACJ;CACpC,MAAM,aAAa;EAAE,GAAG;EAAgB,GAAG;EAAQ;CACnD,MAAM,WAAW,KAAK;CACtB,MAAM,QAAQ,cAAc,KAAK;CAEjC,MAAM,gBACJ,KAAK,QAAQ,YAAY,QAAQ,QAAQ,SAAS;CAEpD,IAAI,YAAsD;AAE1D,KAAI,WAAW,eAAe;EAC5B,MAAM,YAAY,iBAAiB,MAAM,WAAW;EACpD,MAAM,QAAQ;AACd,oBACE,mBAAmB,OAAO;GACxB;GACA;GACA,aAAa,aAAa;GAC3B,CAAC;;AAIN,KADoB,WAAW,eAAe,WAAW,aAAa,KAAK,MAAM,YAChE;EACf,MAAM,QAAQ;AACd,oBACE,UAAU,OAAO;GACf,UAAU,WAAW,aAAa;GAClC,YAAY,WAAW;GACvB,UAAU,SAAS;AACjB,QAAI,KACF;KAAE,MAAM;KAAU,SAAS,KAAK;KAAS,SAAS,KAAK;KAAS,OAAO,KAAK;KAAO,EACnF,+CACD;;GAEJ,CAAC;;CAGN,MAAM,YAAY,KAAK,KAAK;AAC5B,KAAI;EACF,MAAM,SAAS,MAAM,WAAW;AAChC,MAAI,MACF;GAAE,MAAM;GAAU,YAAY,KAAK,KAAK,GAAG;GAAW,SAAS;GAAM,EACrE,2BACD;AACD,SAAO;UACA,OAAO;EACd,MAAM,aAAa,KAAK,KAAK,GAAG;AAEhC,MAAI,iBAAiB,cAAc;AACjC,OAAI,MACF;IAAE,MAAM;IAAU,WAAW,MAAM;IAAW;IAAY,EAC1D,2BACD;AACD,SAAM,IAAI,MAAM,SAAS,SAAS,oBAAoB,MAAM,UAAU,KAAK,EAAE,OAAO,OAAO,CAAC;;EAG9F,MAAM,eAAe,iBAAiB,QAAQ,MAAM,UAAU,OAAO,MAAM;AAC3E,MAAI,MACF;GAAE,MAAM;GAAU,OAAO;GAAc;GAAY,EACnD,wBACD;AACD,QAAM,iBAAiB,QAAQ,QAAQ,IAAI,MAAM,aAAa;;;;;;;AAQlE,SAAgB,uBACd,MACA,QAC0B;AAC1B,QAAO;EACL,GAAG;EACH,MAAM,QACJ,YACA,QACA,QACA,UACoC;AACpC,UAAO,0BAA0B,MAAM,YAAY,QAAQ,QAAQ,UAAU,OAAO;;EAEvF;;;;;AAMH,SAAgB,wBACd,OACA,QACuB;AACvB,QAAO,MAAM,KAAK,SAAS,uBAAuB,MAAM,OAAO,CAAC"}
|
|
@@ -75,7 +75,13 @@ export declare class AgentToolsFactory {
|
|
|
75
75
|
private browserManager;
|
|
76
76
|
/** One dialog/console supervisor per chat session (browser tab). */
|
|
77
77
|
private readonly browserTaskSupervisors;
|
|
78
|
+
/** Cached readiness probe — keyed by backend mode + extension host:port. */
|
|
79
|
+
private browserReadinessCache;
|
|
78
80
|
constructor(deps: ToolFactoryDeps);
|
|
81
|
+
private browserReadinessKey;
|
|
82
|
+
private checkBrowserReadinessCached;
|
|
83
|
+
/** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */
|
|
84
|
+
invalidateBrowserReadinessCache(): void;
|
|
79
85
|
private browserSupervisorForTask;
|
|
80
86
|
private acquireBrowserPage;
|
|
81
87
|
private ensureBrowserManager;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
4
|
-
import {
|
|
3
|
+
import { init_session_key, parseSessionKey } from "../../routing/session-key.js";
|
|
5
4
|
import { createReadFileTool } from "./read.js";
|
|
6
5
|
import { createWriteFileTool } from "./write.js";
|
|
7
6
|
import { createEditFileTool } from "./edit.js";
|
|
@@ -23,6 +22,7 @@ import { createClarifyTool } from "./clarify-tool.js";
|
|
|
23
22
|
import { createImageTool } from "./image-tool.js";
|
|
24
23
|
import { BrowserManager } from "../../browser/manager.js";
|
|
25
24
|
import { resolveBrowserBackendFromConfig } from "../../browser/backend-from-config.js";
|
|
25
|
+
import { checkBrowserReadiness } from "../../browser/readiness.js";
|
|
26
26
|
import { CdpSupervisor } from "../../browser/cdp-supervisor.js";
|
|
27
27
|
import "../../browser/index.js";
|
|
28
28
|
import { createDelegateTool } from "./delegate-tool.js";
|
|
@@ -35,6 +35,7 @@ import "./index.js";
|
|
|
35
35
|
import { shouldRegisterCuratedMemoryTool } from "../memory/memory-config.js";
|
|
36
36
|
import { createBrowserUseTool } from "./browser/tool/browser-use-tool.js";
|
|
37
37
|
import { wrapToolsWithProtection } from "./executor.js";
|
|
38
|
+
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
38
39
|
import { createTextToSpeechTool } from "./tts-tool.js";
|
|
39
40
|
//#region src/agent/tools/factory.ts
|
|
40
41
|
init_session_key();
|
|
@@ -52,13 +53,55 @@ function clarifyTransportSource(sessionKey) {
|
|
|
52
53
|
const first = sessionKey.split(":").filter(Boolean)[0] ?? "";
|
|
53
54
|
if (first === "cli" || first === "webchat") return first;
|
|
54
55
|
}
|
|
55
|
-
var AgentToolsFactory = class {
|
|
56
|
+
var AgentToolsFactory = class AgentToolsFactory {
|
|
56
57
|
browserManager = null;
|
|
57
58
|
/** One dialog/console supervisor per chat session (browser tab). */
|
|
58
59
|
browserTaskSupervisors = /* @__PURE__ */ new Map();
|
|
60
|
+
/** Cached readiness probe — keyed by backend mode + extension host:port. */
|
|
61
|
+
browserReadinessCache = null;
|
|
59
62
|
constructor(deps) {
|
|
60
63
|
this.deps = deps;
|
|
61
64
|
}
|
|
65
|
+
browserReadinessKey() {
|
|
66
|
+
const cfg = this.deps.getConfig?.();
|
|
67
|
+
const backend = resolveBrowserBackendFromConfig(cfg);
|
|
68
|
+
const ext = cfg?.agents?.defaults?.browser?.extension;
|
|
69
|
+
const host = typeof ext?.host === "string" && ext.host.trim() ? ext.host.trim() : "127.0.0.1";
|
|
70
|
+
const port = typeof ext?.port === "number" ? ext.port : 19820;
|
|
71
|
+
const cdpUrl = backend.mode === "cdp" ? backend.config.wsEndpoint : "";
|
|
72
|
+
const cloudKind = backend.mode === "cloud" ? backend.config.type : "";
|
|
73
|
+
return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;
|
|
74
|
+
}
|
|
75
|
+
async checkBrowserReadinessCached() {
|
|
76
|
+
const key = this.browserReadinessKey();
|
|
77
|
+
const now = Date.now();
|
|
78
|
+
const cached = this.browserReadinessCache;
|
|
79
|
+
if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === void 0) return cached.result ?? null;
|
|
80
|
+
if (cached && cached.key === key && cached.inflight) return cached.inflight;
|
|
81
|
+
const inflight = checkBrowserReadiness(this.deps.getConfig?.());
|
|
82
|
+
this.browserReadinessCache = {
|
|
83
|
+
key,
|
|
84
|
+
expiresAt: now + 3e4,
|
|
85
|
+
inflight
|
|
86
|
+
};
|
|
87
|
+
try {
|
|
88
|
+
const result = await inflight;
|
|
89
|
+
this.browserReadinessCache = {
|
|
90
|
+
key,
|
|
91
|
+
expiresAt: Date.now() + 3e4,
|
|
92
|
+
result
|
|
93
|
+
};
|
|
94
|
+
return result;
|
|
95
|
+
} catch (e) {
|
|
96
|
+
this.browserReadinessCache = null;
|
|
97
|
+
log.warn({ err: e }, "browserReadiness probe failed");
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */
|
|
102
|
+
invalidateBrowserReadinessCache() {
|
|
103
|
+
this.browserReadinessCache = null;
|
|
104
|
+
}
|
|
62
105
|
browserSupervisorForTask(taskId) {
|
|
63
106
|
let s = this.browserTaskSupervisors.get(taskId);
|
|
64
107
|
if (!s) {
|
|
@@ -89,6 +132,7 @@ var AgentToolsFactory = class {
|
|
|
89
132
|
}
|
|
90
133
|
/** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */
|
|
91
134
|
async shutdownBrowser() {
|
|
135
|
+
this.browserReadinessCache = null;
|
|
92
136
|
if (!this.browserManager) return;
|
|
93
137
|
await this.browserManager.shutdown();
|
|
94
138
|
this.browserManager = null;
|
|
@@ -197,6 +241,7 @@ var AgentToolsFactory = class {
|
|
|
197
241
|
getPageForTask: () => this.acquireBrowserPage(),
|
|
198
242
|
getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? "default",
|
|
199
243
|
getConfig: () => this.deps.getConfig?.(),
|
|
244
|
+
getReadiness: () => this.checkBrowserReadinessCached(),
|
|
200
245
|
getSupervisor: () => this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? "default"),
|
|
201
246
|
notifyBrowserPageClosed: (taskId) => {
|
|
202
247
|
this.browserTaskSupervisors.delete(taskId);
|
|
@@ -213,7 +258,21 @@ var AgentToolsFactory = class {
|
|
|
213
258
|
getConfig: () => this.deps.getConfig?.(),
|
|
214
259
|
getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,
|
|
215
260
|
hookRunner: this.deps.hookRunner,
|
|
216
|
-
toolExecutorConfig: this.deps.toolExecutorConfig
|
|
261
|
+
toolExecutorConfig: this.deps.toolExecutorConfig,
|
|
262
|
+
buildChildTools: (childOpts) => {
|
|
263
|
+
return new AgentToolsFactory({
|
|
264
|
+
workspace: childOpts.workspace,
|
|
265
|
+
bus: childOpts.bus,
|
|
266
|
+
getCurrentContext: () => null,
|
|
267
|
+
getConfig: childOpts.getConfig,
|
|
268
|
+
getPrimaryModel: () => childOpts.model,
|
|
269
|
+
toolExecutorConfig: childOpts.toolExecutorConfig
|
|
270
|
+
}).createAllTools({
|
|
271
|
+
workspace: childOpts.workspace,
|
|
272
|
+
getPrimaryModel: () => childOpts.model,
|
|
273
|
+
disabledTools: new Set(["extensions"])
|
|
274
|
+
});
|
|
275
|
+
}
|
|
217
276
|
})] : [],
|
|
218
277
|
...optionalTools
|
|
219
278
|
], disabled);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"factory.js","names":["parseRoutingSessionKey"],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createEditFileTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createShellTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createSendMediaTool,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { parseSessionKey as parseRoutingSessionKey } from '../../routing/session-key.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n CdpSupervisor,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport { createCronjobTool } from './cronjob-tool.js';\nimport type { CronService } from '../../cron/index.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nfunction clarifyTransportSource(sessionKey: string): string | undefined {\n const parsed = parseRoutingSessionKey(sessionKey);\n if (parsed) return parsed.source;\n // Fallback for simple `<channel>:<chatId>` keys used by webchat and CLI.\n const first = sessionKey.split(':').filter(Boolean)[0] ?? '';\n if (first === 'cli' || first === 'webchat') return first;\n return undefined;\n}\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Built-in curated memory store (agent home `memories/`). */\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for shell env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/shell tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `shell`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n getMemoryManager?: () => MemoryManager;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n const b = this.deps.getConfig?.()?.agents?.defaults?.browser;\n const dialogPolicy =\n b?.dialogPolicy === 'must_respond' || b?.dialogPolicy === 'auto_accept' || b?.dialogPolicy === 'auto_dismiss'\n ? b.dialogPolicy\n : 'auto_dismiss';\n const dialogTimeoutSeconds =\n typeof b?.dialogTimeoutSeconds === 'number' &&\n Number.isFinite(b.dialogTimeoutSeconds) &&\n b.dialogTimeoutSeconds >= 1\n ? Math.floor(b.dialogTimeoutSeconds)\n : 300;\n s = new CdpSupervisor({ dialogPolicy, dialogTimeoutSeconds });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => this.deps.getConfig?.()?.agents?.defaults?.browser?.headless === true,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getBuiltin = options?.getBuiltinMemoryStore ?? this.deps.getBuiltinMemoryStore;\n const builtinStore = getBuiltin?.();\n const memoriesDir = builtinStore?.memoriesDir;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const optionalTools = [imageTool, imageGenerateTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace);\n const editTool = createEditFileTool(workspace);\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n const source = clarifyTransportSource(ctx.sessionKey);\n if (!source || !CLARIFY_SUPPORTED_CHANNELS.has(source)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n editTool,\n listDir,\n grep,\n find,\n createShellTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createMemorySearchTool({ workspaceDir: workspace, memoriesDir }),\n createMemoryGetTool({ workspaceDir: workspace, memoriesDir }),\n ...(getBuiltin && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(getBuiltin, {\n onMemoryWrite: (action, target, content) => {\n getMemMgr?.().onMemoryWrite(action, target, content);\n },\n }),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getCronService\n ? [\n createCronjobTool({\n getCronService: this.deps.getCronService,\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.browser?.enabled !== false\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.delegate?.enabled === true && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n const cfg = this.deps.getConfig?.();\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled =\n cfg?.agents?.defaults?.executeCode?.enabled === true &&\n !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"factory.js","names":["parseRoutingSessionKey"],"sources":["../../../../src/agent/tools/factory.ts"],"sourcesContent":["/**\n * Agent Tools Factory - Creates and configures agent tools\n *\n * Centralizes tool creation logic to keep service.ts focused on orchestration.\n *\n * TTS: auto TTS is applied at the ChannelManager via maybeApplyTtsToPayload().\n * Optional \\`text_to_speech\\` tool sends explicit voice when TTS is enabled.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Model, Api } from '@earendil-works/pi-ai';\nimport type { Page } from 'playwright-core';\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport {\n createReadFileTool,\n createWriteFileTool,\n createEditFileTool,\n createListDirTool,\n createGrepTool,\n createFindTool,\n createShellTool,\n createWebSearchTool,\n createWebFetchTool,\n createWebExtractTool,\n createMessageTool,\n createSendMediaTool,\n createMemorySearchTool,\n createMemoryGetTool,\n createTodoTool,\n createSessionStatusTool,\n createDreamingTool,\n createClarifyTool,\n} from './index.js';\nimport { createCuratedMemoryTool } from './curated-memory-tool.js';\nimport { createSessionSearchTool } from './session-search-tool.js';\nimport type { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { shouldRegisterCuratedMemoryTool } from '../memory/memory-config.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { parseSessionKey as parseRoutingSessionKey } from '../../routing/session-key.js';\nimport type { GatewayClarifyRequestFn } from './clarify-tool.js';\nimport { createImageTool } from './image-tool.js';\nimport { createImageGenerateTool } from './image-generate-tool.js';\nimport {\n BrowserManager,\n BrowserNotReadyError,\n CdpSupervisor,\n checkBrowserReadiness,\n resolveBrowserBackendFromConfig,\n} from '../../browser/index.js';\nimport { createBrowserUseTool } from './browser/tool/browser-use-tool.js';\nimport { createDelegateTool } from './delegate-tool.js';\nimport { buildSandboxToolMap, createExecuteCodeTool } from './execute-code-tool.js';\nimport { createCronjobTool } from './cronjob-tool.js';\nimport type { CronService } from '../../cron/index.js';\nimport { createLogger } from '../../utils/logger.js';\nimport type { SkillManager } from '../skills/skill-manager.js';\nimport { wrapToolsWithProtection, type ToolExecutorConfig } from './executor.js';\nimport { createSkillsListTool, createSkillViewTool } from './skills-tools.js';\nimport { createSkillManageTool } from './skill-manage-tool.js';\nimport { createTextToSpeechTool } from './tts-tool.js';\nimport { mergeTtsConfigFromAppConfig } from '../../voice/tts/merge-config.js';\n\nconst log = createLogger('AgentToolsFactory');\n\n/** Channels where `clarify` can block for a user answer (web UI, Telegram, CLI readline). */\nconst CLARIFY_SUPPORTED_CHANNELS = new Set(['webchat', 'telegram', 'cli']);\n\nfunction clarifyTransportSource(sessionKey: string): string | undefined {\n const parsed = parseRoutingSessionKey(sessionKey);\n if (parsed) return parsed.source;\n // Fallback for simple `<channel>:<chatId>` keys used by webchat and CLI.\n const first = sessionKey.split(':').filter(Boolean)[0] ?? '';\n if (first === 'cli' || first === 'webchat') return first;\n return undefined;\n}\n\nexport interface ToolFactoryDeps {\n workspace: string;\n extensionRegistry?: any;\n getCurrentContext: () => { channel: string; chatId: string; sessionKey: string } | null;\n hookRunner?: import('../../extensions/index.js').ExtensionHookRunner;\n bus: MessageBus;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n /** Agent defaults (image tools, etc.); use getter so hot-reloaded config applies. */\n getConfig?: () => Config | undefined;\n /** Session / default chat model for vision tool description. */\n getPrimaryModel?: () => Model<Api>;\n /** Built-in curated memory store (agent home `memories/`). */\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n /** Memory orchestration (prefetch/sync + external tools). */\n getMemoryManager?: () => MemoryManager;\n /** Session store for `session_search`. */\n getSessionStore?: () => SessionStore;\n /** When set (gateway webchat), enables the `clarify` tool. */\n gatewayClarify?: { requestClarification: GatewayClarifyRequestFn };\n /** Gateway: enables the `cronjob` tool. */\n getCronService?: () => CronService | undefined;\n /** Current session skill indexing (tool gating + allowlist); used by skills_list / skill_view. */\n getSkillIndexingContext?: () =>\n | { registeredToolNames: string[]; skillAllowlist?: string[] }\n | undefined;\n /** After skill_manage mutates disk, reload skills + refresh agent prompts (optional). */\n onSkillsFilesystemMutate?: () => void;\n /** Names registered via skill_view for shell env passthrough. */\n getSkillPassthroughEnvVarNames?: () => string[];\n /** Add declared env names for the current session (no values stored). */\n registerSkillEnvPassthrough?: (names: string[]) => void;\n}\n\nexport interface CreateCoreToolsOptions {\n /** Workspace root for file/shell tools (defaults to factory workspace). */\n workspace?: string;\n /** Canonical `agents/<id>/profile/`: bare SOUL.md / IDENTITY.md resolve here after the workspace. */\n profileMarkdownRoot?: string;\n /** Tool `name` values to omit (e.g. `shell`, `extensions` for extension tools). */\n disabledTools?: Set<string>;\n /** Optional primary model for image tool heuristics. */\n getPrimaryModel?: () => Model<Api>;\n getBuiltinMemoryStore?: () => BuiltinMemoryStore;\n getMemoryManager?: () => MemoryManager;\n /** When set, registers `skills_list` and `skill_view` bound to this workspace\\'s skills. */\n getSkillManager?: () => SkillManager;\n}\n\nexport class AgentToolsFactory {\n private browserManager: BrowserManager | null = null;\n /** One dialog/console supervisor per chat session (browser tab). */\n private readonly browserTaskSupervisors = new Map<string, CdpSupervisor>();\n /** Cached readiness probe — keyed by backend mode + extension host:port. */\n private browserReadinessCache: {\n key: string;\n expiresAt: number;\n inflight?: Promise<BrowserNotReadyError | null>;\n result?: BrowserNotReadyError | null;\n } | null = null;\n\n constructor(private deps: ToolFactoryDeps) {}\n\n private browserReadinessKey(): string {\n const cfg = this.deps.getConfig?.();\n const backend = resolveBrowserBackendFromConfig(cfg);\n const ext = cfg?.agents?.defaults?.browser?.extension;\n const host = typeof ext?.host === 'string' && ext.host.trim() ? ext.host.trim() : '127.0.0.1';\n const port = typeof ext?.port === 'number' ? ext.port : 19820;\n const cdpUrl = backend.mode === 'cdp' ? backend.config.wsEndpoint : '';\n const cloudKind = backend.mode === 'cloud' ? backend.config.type : '';\n return `${backend.mode}@${host}:${port}|${cdpUrl}|${cloudKind}`;\n }\n\n private async checkBrowserReadinessCached(): Promise<BrowserNotReadyError | null> {\n const key = this.browserReadinessKey();\n const now = Date.now();\n const cached = this.browserReadinessCache;\n if (cached && cached.key === key && cached.expiresAt > now && cached.inflight === undefined) {\n return cached.result ?? null;\n }\n if (cached && cached.key === key && cached.inflight) {\n return cached.inflight;\n }\n const inflight = checkBrowserReadiness(this.deps.getConfig?.());\n this.browserReadinessCache = { key, expiresAt: now + 30_000, inflight };\n try {\n const result = await inflight;\n this.browserReadinessCache = { key, expiresAt: Date.now() + 30_000, result };\n return result;\n } catch (e) {\n // Probe should never throw, but if it does we just bypass the cache.\n this.browserReadinessCache = null;\n log.warn({ err: e }, 'browserReadiness probe failed');\n return null;\n }\n }\n\n /** Invalidate the readiness cache (config hot-reload, settings-page save, etc.). */\n invalidateBrowserReadinessCache(): void {\n this.browserReadinessCache = null;\n }\n\n private browserSupervisorForTask(taskId: string): CdpSupervisor {\n let s = this.browserTaskSupervisors.get(taskId);\n if (!s) {\n const b = this.deps.getConfig?.()?.agents?.defaults?.browser;\n const dialogPolicy =\n b?.dialogPolicy === 'must_respond' || b?.dialogPolicy === 'auto_accept' || b?.dialogPolicy === 'auto_dismiss'\n ? b.dialogPolicy\n : 'auto_dismiss';\n const dialogTimeoutSeconds =\n typeof b?.dialogTimeoutSeconds === 'number' &&\n Number.isFinite(b.dialogTimeoutSeconds) &&\n b.dialogTimeoutSeconds >= 1\n ? Math.floor(b.dialogTimeoutSeconds)\n : 300;\n s = new CdpSupervisor({ dialogPolicy, dialogTimeoutSeconds });\n this.browserTaskSupervisors.set(taskId, s);\n }\n return s;\n }\n\n private async acquireBrowserPage(): Promise<Page> {\n const taskId = this.deps.getCurrentContext()?.sessionKey ?? 'default';\n const mgr = this.ensureBrowserManager();\n await mgr.ensureConnected();\n if (mgr.getExtensionProvider()) {\n return null as unknown as Page;\n }\n const page = await mgr.getPage(taskId);\n this.browserSupervisorForTask(taskId).attach(page);\n return page;\n }\n\n private ensureBrowserManager(): BrowserManager {\n if (!this.browserManager) {\n this.browserManager = new BrowserManager({\n getHeadless: () => this.deps.getConfig?.()?.agents?.defaults?.browser?.headless === true,\n getBackend: () => resolveBrowserBackendFromConfig(this.deps.getConfig?.()),\n });\n }\n return this.browserManager;\n }\n\n /** Close Playwright and all pages (gateway stop, agent manager dispose, or config hot-reload). */\n async shutdownBrowser(): Promise<void> {\n this.browserReadinessCache = null;\n if (!this.browserManager) {\n return;\n }\n await this.browserManager.shutdown();\n this.browserManager = null;\n this.browserTaskSupervisors.clear();\n }\n\n /** Drop the tab for a session when its agent instance is removed. */\n async closeBrowserPageForSession(sessionKey: string): Promise<void> {\n this.browserTaskSupervisors.delete(sessionKey);\n await this.browserManager?.closePage(sessionKey);\n }\n\n createCoreTools(options?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const workspace = options?.workspace ?? this.deps.workspace;\n const { bus } = this.deps;\n const getPrimary = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const getBuiltin = options?.getBuiltinMemoryStore ?? this.deps.getBuiltinMemoryStore;\n const builtinStore = getBuiltin?.();\n const memoriesDir = builtinStore?.memoriesDir;\n const getMemMgr = options?.getMemoryManager ?? this.deps.getMemoryManager;\n const getSkillMgr = options?.getSkillManager;\n const disabled = options?.disabledTools;\n\n const primary = getPrimary?.();\n const modelHasVision = primary?.input?.includes('image') ?? false;\n const cfg = this.deps.getConfig?.();\n const imageTool = createImageTool({\n config: cfg,\n workspace,\n modelHasVision,\n });\n const imageGenerateTool = createImageGenerateTool({\n config: cfg,\n workspace,\n });\n\n const optionalTools = [imageTool, imageGenerateTool].filter((t) => t != null) as any[];\n\n const readTool = createReadFileTool(workspace, {\n profileMarkdownRoot: options?.profileMarkdownRoot,\n });\n const writeTool = createWriteFileTool(workspace);\n const editTool = createEditFileTool(workspace);\n const listDir = createListDirTool(workspace);\n const grep = createGrepTool(workspace);\n const find = createFindTool(workspace);\n\n const core: AgentTool<any, any>[] = [\n createSessionStatusTool(),\n createDreamingTool({\n getWorkspace: () => workspace,\n getConfig: () => this.deps.getConfig?.(),\n }),\n createClarifyTool({\n resolveAskUser: () => {\n const req = this.deps.gatewayClarify?.requestClarification;\n if (!req) return null;\n const ctx = this.deps.getCurrentContext();\n if (!ctx?.sessionKey) return null;\n const source = clarifyTransportSource(ctx.sessionKey);\n if (!source || !CLARIFY_SUPPORTED_CHANNELS.has(source)) return null;\n return (r) => req(ctx.sessionKey, r);\n },\n }),\n createTodoTool({\n getSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ...(getSkillMgr\n ? [\n createSkillsListTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n }),\n createSkillViewTool({\n getSkillManager: getSkillMgr,\n getSkillIndexingContext: this.deps.getSkillIndexingContext,\n registerSkillEnvPassthrough: this.deps.registerSkillEnvPassthrough,\n }),\n createSkillManageTool({\n getSkillManager: getSkillMgr,\n getWorkspace: () => workspace,\n onSkillsFilesystemMutate: this.deps.onSkillsFilesystemMutate,\n }),\n ]\n : []),\n readTool,\n writeTool,\n editTool,\n listDir,\n grep,\n find,\n createShellTool(workspace, {\n getSkillPassthroughEnvVarNames: this.deps.getSkillPassthroughEnvVarNames,\n }),\n createWebSearchTool(() => this.deps.getConfig?.()),\n createWebFetchTool(() => this.deps.getConfig?.()),\n createWebExtractTool({ getConfig: () => this.deps.getConfig?.() }),\n // Note: TTS is NOT handled by send_message tool anymore\n // TTS is applied at the ChannelManager dispatch layer\n createMessageTool(bus, () => this.deps.getCurrentContext()),\n ...(mergeTtsConfigFromAppConfig(cfg?.messages?.tts).enabled\n ? [\n createTextToSpeechTool({\n bus,\n getContext: () => this.deps.getCurrentContext(),\n getConfig: () => this.deps.getConfig?.(),\n }),\n ]\n : []),\n createSendMediaTool(workspace, bus, () => this.deps.getCurrentContext()),\n createMemorySearchTool({ workspaceDir: workspace, memoriesDir }),\n createMemoryGetTool({ workspaceDir: workspace, memoriesDir }),\n ...(getBuiltin && shouldRegisterCuratedMemoryTool(this.deps.getConfig?.())\n ? [\n createCuratedMemoryTool(getBuiltin, {\n onMemoryWrite: (action, target, content) => {\n getMemMgr?.().onMemoryWrite(action, target, content);\n },\n }),\n ]\n : []),\n ...(getMemMgr?.().getAdditionalTools() ?? []),\n ...(this.deps.getSessionStore\n ? [\n createSessionSearchTool({\n getSessionStore: this.deps.getSessionStore,\n getConfig: this.deps.getConfig,\n getCurrentSessionKey: () => this.deps.getCurrentContext()?.sessionKey,\n }),\n ]\n : []),\n ...(this.deps.getCronService\n ? [\n createCronjobTool({\n getCronService: this.deps.getCronService,\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.browser?.enabled !== false\n ? [\n createBrowserUseTool({\n getManager: () => this.ensureBrowserManager(),\n getPageForTask: () => this.acquireBrowserPage(),\n getTaskId: () => this.deps.getCurrentContext()?.sessionKey ?? 'default',\n getConfig: () => this.deps.getConfig?.(),\n getReadiness: () => this.checkBrowserReadinessCached(),\n getSupervisor: () =>\n this.browserSupervisorForTask(this.deps.getCurrentContext()?.sessionKey ?? 'default'),\n notifyBrowserPageClosed: (taskId) => {\n this.browserTaskSupervisors.delete(taskId);\n },\n }),\n ]\n : []),\n ...(cfg?.agents?.defaults?.delegate?.enabled === true && primary\n ? [\n createDelegateTool({\n workspace,\n getSubagentModel: () => {\n const gp = options?.getPrimaryModel ?? this.deps.getPrimaryModel;\n const m = gp?.();\n if (!m) {\n throw new Error('No primary model configured for delegate_task');\n }\n return m;\n },\n bus: this.deps.bus,\n getConfig: () => this.deps.getConfig?.(),\n getCurrentContext: () => this.deps.getCurrentContext?.() ?? null,\n hookRunner: this.deps.hookRunner,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n // Injected so `child-agent-factory.ts` does not need to import\n // `AgentToolsFactory` directly (which would form a cycle).\n buildChildTools: (childOpts) => {\n const childFactory = new AgentToolsFactory({\n workspace: childOpts.workspace,\n bus: childOpts.bus,\n getCurrentContext: () => null,\n getConfig: childOpts.getConfig,\n getPrimaryModel: () => childOpts.model,\n toolExecutorConfig: childOpts.toolExecutorConfig,\n });\n return childFactory.createAllTools({\n workspace: childOpts.workspace,\n getPrimaryModel: () => childOpts.model,\n disabledTools: new Set(['extensions']),\n });\n },\n }),\n ]\n : []),\n ...optionalTools,\n ];\n\n return filterToolsByDisabledSet(core, disabled);\n }\n\n createAllTools(coreOptions?: CreateCoreToolsOptions): AgentTool<any, any>[] {\n const coreTools = this.createCoreTools(coreOptions);\n const disableExtensions = coreOptions?.disabledTools?.has('extensions');\n const cfg = this.deps.getConfig?.();\n\n let bundled: AgentTool<any, any>[];\n if (!this.deps.extensionRegistry || disableExtensions) {\n bundled = coreTools;\n } else {\n const extensionTools = this.deps.extensionRegistry.getAllTools();\n log.info({ count: extensionTools.length }, 'Loaded extension tools');\n bundled = [...coreTools, ...extensionTools];\n }\n\n const wrapped = wrapToolsWithProtection(bundled, this.deps.toolExecutorConfig);\n\n const executeEnabled =\n cfg?.agents?.defaults?.executeCode?.enabled === true &&\n !coreOptions?.disabledTools?.has('execute_code');\n\n if (executeEnabled) {\n const sandboxMap = buildSandboxToolMap(wrapped);\n const executeTool = createExecuteCodeTool({ getSandboxToolMap: () => sandboxMap });\n const wrappedExecute = wrapToolsWithProtection([executeTool as any], this.deps.toolExecutorConfig);\n return [...wrapped, ...wrappedExecute];\n }\n\n return wrapped;\n }\n}\n\nfunction filterToolsByDisabledSet(\n tools: any[],\n disabled: Set<string> | undefined,\n): any[] {\n if (!disabled || disabled.size === 0) {\n return tools;\n }\n return tools.filter((t) => !disabled.has(t.name));\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;kBAwCyF;aAgBpC;AAQrD,MAAM,MAAM,aAAa,oBAAoB;;AAG7C,MAAM,6BAA6B,IAAI,IAAI;CAAC;CAAW;CAAY;CAAM,CAAC;AAE1E,SAAS,uBAAuB,YAAwC;CACtE,MAAM,SAASA,gBAAuB,WAAW;AACjD,KAAI,OAAQ,QAAO,OAAO;CAE1B,MAAM,QAAQ,WAAW,MAAM,IAAI,CAAC,OAAO,QAAQ,CAAC,MAAM;AAC1D,KAAI,UAAU,SAAS,UAAU,UAAW,QAAO;;AAoDrD,IAAa,oBAAb,MAAa,kBAAkB;CAC7B,iBAAgD;;CAEhD,yCAA0C,IAAI,KAA4B;;CAE1E,wBAKW;CAEX,YAAY,MAA+B;AAAvB,OAAA,OAAA;;CAEpB,sBAAsC;EACpC,MAAM,MAAM,KAAK,KAAK,aAAa;EACnC,MAAM,UAAU,gCAAgC,IAAI;EACpD,MAAM,MAAM,KAAK,QAAQ,UAAU,SAAS;EAC5C,MAAM,OAAO,OAAO,KAAK,SAAS,YAAY,IAAI,KAAK,MAAM,GAAG,IAAI,KAAK,MAAM,GAAG;EAClF,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,IAAI,OAAO;EACxD,MAAM,SAAS,QAAQ,SAAS,QAAQ,QAAQ,OAAO,aAAa;EACpE,MAAM,YAAY,QAAQ,SAAS,UAAU,QAAQ,OAAO,OAAO;AACnE,SAAO,GAAG,QAAQ,KAAK,GAAG,KAAK,GAAG,KAAK,GAAG,OAAO,GAAG;;CAGtD,MAAc,8BAAoE;EAChF,MAAM,MAAM,KAAK,qBAAqB;EACtC,MAAM,MAAM,KAAK,KAAK;EACtB,MAAM,SAAS,KAAK;AACpB,MAAI,UAAU,OAAO,QAAQ,OAAO,OAAO,YAAY,OAAO,OAAO,aAAa,KAAA,EAChF,QAAO,OAAO,UAAU;AAE1B,MAAI,UAAU,OAAO,QAAQ,OAAO,OAAO,SACzC,QAAO,OAAO;EAEhB,MAAM,WAAW,sBAAsB,KAAK,KAAK,aAAa,CAAC;AAC/D,OAAK,wBAAwB;GAAE;GAAK,WAAW,MAAM;GAAQ;GAAU;AACvE,MAAI;GACF,MAAM,SAAS,MAAM;AACrB,QAAK,wBAAwB;IAAE;IAAK,WAAW,KAAK,KAAK,GAAG;IAAQ;IAAQ;AAC5E,UAAO;WACA,GAAG;AAEV,QAAK,wBAAwB;AAC7B,OAAI,KAAK,EAAE,KAAK,GAAG,EAAE,gCAAgC;AACrD,UAAO;;;;CAKX,kCAAwC;AACtC,OAAK,wBAAwB;;CAG/B,yBAAiC,QAA+B;EAC9D,IAAI,IAAI,KAAK,uBAAuB,IAAI,OAAO;AAC/C,MAAI,CAAC,GAAG;GACN,MAAM,IAAI,KAAK,KAAK,aAAa,EAAE,QAAQ,UAAU;AAWrD,OAAI,IAAI,cAAc;IAAE,cATtB,GAAG,iBAAiB,kBAAkB,GAAG,iBAAiB,iBAAiB,GAAG,iBAAiB,iBAC3F,EAAE,eACF;IAOgC,sBALpC,OAAO,GAAG,yBAAyB,YACnC,OAAO,SAAS,EAAE,qBAAqB,IACvC,EAAE,wBAAwB,IACtB,KAAK,MAAM,EAAE,qBAAqB,GAClC;IACsD,CAAC;AAC7D,QAAK,uBAAuB,IAAI,QAAQ,EAAE;;AAE5C,SAAO;;CAGT,MAAc,qBAAoC;EAChD,MAAM,SAAS,KAAK,KAAK,mBAAmB,EAAE,cAAc;EAC5D,MAAM,MAAM,KAAK,sBAAsB;AACvC,QAAM,IAAI,iBAAiB;AAC3B,MAAI,IAAI,sBAAsB,CAC5B,QAAO;EAET,MAAM,OAAO,MAAM,IAAI,QAAQ,OAAO;AACtC,OAAK,yBAAyB,OAAO,CAAC,OAAO,KAAK;AAClD,SAAO;;CAGT,uBAA+C;AAC7C,MAAI,CAAC,KAAK,eACR,MAAK,iBAAiB,IAAI,eAAe;GACvC,mBAAmB,KAAK,KAAK,aAAa,EAAE,QAAQ,UAAU,SAAS,aAAa;GACpF,kBAAkB,gCAAgC,KAAK,KAAK,aAAa,CAAC;GAC3E,CAAC;AAEJ,SAAO,KAAK;;;CAId,MAAM,kBAAiC;AACrC,OAAK,wBAAwB;AAC7B,MAAI,CAAC,KAAK,eACR;AAEF,QAAM,KAAK,eAAe,UAAU;AACpC,OAAK,iBAAiB;AACtB,OAAK,uBAAuB,OAAO;;;CAIrC,MAAM,2BAA2B,YAAmC;AAClE,OAAK,uBAAuB,OAAO,WAAW;AAC9C,QAAM,KAAK,gBAAgB,UAAU,WAAW;;CAGlD,gBAAgB,SAAyD;EACvE,MAAM,YAAY,SAAS,aAAa,KAAK,KAAK;EAClD,MAAM,EAAE,QAAQ,KAAK;EACrB,MAAM,aAAa,SAAS,mBAAmB,KAAK,KAAK;EACzD,MAAM,aAAa,SAAS,yBAAyB,KAAK,KAAK;EAE/D,MAAM,eADe,cAAc,GACD;EAClC,MAAM,YAAY,SAAS,oBAAoB,KAAK,KAAK;EACzD,MAAM,cAAc,SAAS;EAC7B,MAAM,WAAW,SAAS;EAE1B,MAAM,UAAU,cAAc;EAC9B,MAAM,iBAAiB,SAAS,OAAO,SAAS,QAAQ,IAAI;EAC5D,MAAM,MAAM,KAAK,KAAK,aAAa;EAWnC,MAAM,gBAAgB,CAVJ,gBAAgB;GAChC,QAAQ;GACR;GACA;GACD,CAM+B,EALN,wBAAwB;GAChD,QAAQ;GACR;GACD,CAEkD,CAAC,CAAC,QAAQ,MAAM,KAAK,KAAK;EAE7E,MAAM,WAAW,mBAAmB,WAAW,EAC7C,qBAAqB,SAAS,qBAC/B,CAAC;EACF,MAAM,YAAY,oBAAoB,UAAU;EAChD,MAAM,WAAW,mBAAmB,UAAU;EAC9C,MAAM,UAAU,kBAAkB,UAAU;EAC5C,MAAM,OAAO,eAAe,UAAU;EACtC,MAAM,OAAO,eAAe,UAAU;AAqJtC,SAAO,yBAAyB;GAlJ9B,yBAAyB;GACzB,mBAAmB;IACjB,oBAAoB;IACpB,iBAAiB,KAAK,KAAK,aAAa;IACzC,CAAC;GACF,kBAAkB,EAChB,sBAAsB;IACpB,MAAM,MAAM,KAAK,KAAK,gBAAgB;AACtC,QAAI,CAAC,IAAK,QAAO;IACjB,MAAM,MAAM,KAAK,KAAK,mBAAmB;AACzC,QAAI,CAAC,KAAK,WAAY,QAAO;IAC7B,MAAM,SAAS,uBAAuB,IAAI,WAAW;AACrD,QAAI,CAAC,UAAU,CAAC,2BAA2B,IAAI,OAAO,CAAE,QAAO;AAC/D,YAAQ,MAAM,IAAI,IAAI,YAAY,EAAE;MAEvC,CAAC;GACF,eAAe,EACb,qBAAqB,KAAK,KAAK,mBAAmB,EAAE,YACrD,CAAC;GACF,GAAI,cACA;IACE,qBAAqB;KACnB,iBAAiB;KACjB,yBAAyB,KAAK,KAAK;KACpC,CAAC;IACF,oBAAoB;KAClB,iBAAiB;KACjB,yBAAyB,KAAK,KAAK;KACnC,6BAA6B,KAAK,KAAK;KACxC,CAAC;IACF,sBAAsB;KACpB,iBAAiB;KACjB,oBAAoB;KACpB,0BAA0B,KAAK,KAAK;KACrC,CAAC;IACH,GACD,EAAE;GACN;GACA;GACA;GACA;GACA;GACA;GACA,gBAAgB,WAAW,EACzB,gCAAgC,KAAK,KAAK,gCAC3C,CAAC;GACF,0BAA0B,KAAK,KAAK,aAAa,CAAC;GAClD,yBAAyB,KAAK,KAAK,aAAa,CAAC;GACjD,qBAAqB,EAAE,iBAAiB,KAAK,KAAK,aAAa,EAAE,CAAC;GAGlE,kBAAkB,WAAW,KAAK,KAAK,mBAAmB,CAAC;GAC3D,GAAI,4BAA4B,KAAK,UAAU,IAAI,CAAC,UAChD,CACE,uBAAuB;IACrB;IACA,kBAAkB,KAAK,KAAK,mBAAmB;IAC/C,iBAAiB,KAAK,KAAK,aAAa;IACzC,CAAC,CACH,GACD,EAAE;GACN,oBAAoB,WAAW,WAAW,KAAK,KAAK,mBAAmB,CAAC;GACxE,uBAAuB;IAAE,cAAc;IAAW;IAAa,CAAC;GAChE,oBAAoB;IAAE,cAAc;IAAW;IAAa,CAAC;GAC7D,GAAI,cAAc,gCAAgC,KAAK,KAAK,aAAa,CAAC,GACtE,CACE,wBAAwB,YAAY,EAClC,gBAAgB,QAAQ,QAAQ,YAAY;AAC1C,iBAAa,CAAC,cAAc,QAAQ,QAAQ,QAAQ;MAEvD,CAAC,CACH,GACD,EAAE;GACN,GAAI,aAAa,CAAC,oBAAoB,IAAI,EAAE;GAC5C,GAAI,KAAK,KAAK,kBACV,CACE,wBAAwB;IACtB,iBAAiB,KAAK,KAAK;IAC3B,WAAW,KAAK,KAAK;IACrB,4BAA4B,KAAK,KAAK,mBAAmB,EAAE;IAC5D,CAAC,CACH,GACD,EAAE;GACN,GAAI,KAAK,KAAK,iBACV,CACE,kBAAkB,EAChB,gBAAgB,KAAK,KAAK,gBAC3B,CAAC,CACH,GACD,EAAE;GACN,GAAI,KAAK,QAAQ,UAAU,SAAS,YAAY,QAC5C,CACE,qBAAqB;IACnB,kBAAkB,KAAK,sBAAsB;IAC7C,sBAAsB,KAAK,oBAAoB;IAC/C,iBAAiB,KAAK,KAAK,mBAAmB,EAAE,cAAc;IAC9D,iBAAiB,KAAK,KAAK,aAAa;IACxC,oBAAoB,KAAK,6BAA6B;IACtD,qBACE,KAAK,yBAAyB,KAAK,KAAK,mBAAmB,EAAE,cAAc,UAAU;IACvF,0BAA0B,WAAW;AACnC,UAAK,uBAAuB,OAAO,OAAO;;IAE7C,CAAC,CACH,GACD,EAAE;GACN,GAAI,KAAK,QAAQ,UAAU,UAAU,YAAY,QAAQ,UACrD,CACE,mBAAmB;IACjB;IACA,wBAAwB;KAEtB,MAAM,KADK,SAAS,mBAAmB,KAAK,KAAK,oBACjC;AAChB,SAAI,CAAC,EACH,OAAM,IAAI,MAAM,gDAAgD;AAElE,YAAO;;IAET,KAAK,KAAK,KAAK;IACf,iBAAiB,KAAK,KAAK,aAAa;IACxC,yBAAyB,KAAK,KAAK,qBAAqB,IAAI;IAC5D,YAAY,KAAK,KAAK;IACtB,oBAAoB,KAAK,KAAK;IAG9B,kBAAkB,cAAc;AAS9B,YAAO,IARkB,kBAAkB;MACzC,WAAW,UAAU;MACrB,KAAK,UAAU;MACf,yBAAyB;MACzB,WAAW,UAAU;MACrB,uBAAuB,UAAU;MACjC,oBAAoB,UAAU;MAC/B,CACkB,CAAC,eAAe;MACjC,WAAW,UAAU;MACrB,uBAAuB,UAAU;MACjC,eAAe,IAAI,IAAI,CAAC,aAAa,CAAC;MACvC,CAAC;;IAEL,CAAC,CACH,GACD,EAAE;GACN,GAAG;GAG+B,EAAE,SAAS;;CAGjD,eAAe,aAA6D;EAC1E,MAAM,YAAY,KAAK,gBAAgB,YAAY;EACnD,MAAM,oBAAoB,aAAa,eAAe,IAAI,aAAa;EACvE,MAAM,MAAM,KAAK,KAAK,aAAa;EAEnC,IAAI;AACJ,MAAI,CAAC,KAAK,KAAK,qBAAqB,kBAClC,WAAU;OACL;GACL,MAAM,iBAAiB,KAAK,KAAK,kBAAkB,aAAa;AAChE,OAAI,KAAK,EAAE,OAAO,eAAe,QAAQ,EAAE,yBAAyB;AACpE,aAAU,CAAC,GAAG,WAAW,GAAG,eAAe;;EAG7C,MAAM,UAAU,wBAAwB,SAAS,KAAK,KAAK,mBAAmB;AAM9E,MAHE,KAAK,QAAQ,UAAU,aAAa,YAAY,QAChD,CAAC,aAAa,eAAe,IAAI,eAAe,EAE9B;GAClB,MAAM,aAAa,oBAAoB,QAAQ;GAE/C,MAAM,iBAAiB,wBAAwB,CAD3B,sBAAsB,EAAE,yBAAyB,YAAY,CACtB,CAAQ,EAAE,KAAK,KAAK,mBAAmB;AAClG,UAAO,CAAC,GAAG,SAAS,GAAG,eAAe;;AAGxC,SAAO;;;AAIX,SAAS,yBACP,OACA,UACO;AACP,KAAI,CAAC,YAAY,SAAS,SAAS,EACjC,QAAO;AAET,QAAO,MAAM,QAAQ,MAAM,CAAC,SAAS,IAAI,EAAE,KAAK,CAAC"}
|