@xopcai/xopc 0.0.82 → 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-pJ27dsqn.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-D1KYmOmi.js → channels-status-swr-uRAuhiUo.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-api-Y2wfSJVI.js → cron-api-O2Q_ruV6.js} +1 -1
- package/dist/gateway/static/root/assets/{cron-page-B97KU_RG.js → cron-page-By09AQD-.js} +1 -1
- package/dist/gateway/static/root/assets/{dist-CboA_Css.js → dist-BpQxde0t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-DN_zNmpo.js → extension-debug-page-CY27wj_p.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-BUXtOzv5.js → extension-page-C-Ed5ZmP.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-C2dX4KCW.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-B9rOLqdm.js → field-primitives-fa_hiQcX.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-DvfiRVrc.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-DQuaMye9.js → index-Y-iqo-gL.js} +94 -85
- package/dist/gateway/static/root/assets/{logs-page-BQuBpHcc.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-2Yu-FASs.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-D2Gn2qod.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 +122 -168
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/webchat-tts.d.ts +2 -2
- package/dist/src/agent/service/webchat-tts.js +1 -1
- package/dist/src/agent/service/webchat-tts.js.map +1 -1
- package/dist/src/agent/service.d.ts +62 -167
- package/dist/src/agent/service.js +177 -786
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/session/index.d.ts +4 -0
- package/dist/src/agent/session/index.js +5 -1
- package/dist/src/agent/session/session-config-service.d.ts +68 -0
- package/dist/src/agent/session/session-config-service.js +172 -0
- package/dist/src/agent/session/session-config-service.js.map +1 -0
- package/dist/src/agent/session/session-context.d.ts +27 -19
- package/dist/src/agent/session/session-context.js +39 -24
- package/dist/src/agent/session/session-context.js.map +1 -1
- package/dist/src/agent/session/session-hydrator.d.ts +42 -0
- package/dist/src/agent/session/session-hydrator.js +66 -0
- package/dist/src/agent/session/session-hydrator.js.map +1 -0
- package/dist/src/agent/session/session-inspector.d.ts +80 -0
- package/dist/src/agent/session/session-inspector.js +119 -0
- package/dist/src/agent/session/session-inspector.js.map +1 -0
- package/dist/src/agent/session/session-state-bag.d.ts +83 -0
- package/dist/src/agent/session/session-state-bag.js +192 -0
- package/dist/src/agent/session/session-state-bag.js.map +1 -0
- package/dist/src/agent/skills/config.js +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.d.ts +0 -2
- package/dist/src/agent/skills/index.js +3 -5
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js +11 -6
- package/dist/src/agent/skills/marketplace/adapters/clawhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js +35 -7
- package/dist/src/agent/skills/marketplace/adapters/skillhub/adapter.js.map +1 -1
- package/dist/src/agent/skills/scanner.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +2 -2
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +7 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +37 -0
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/delegate-tool.d.ts +7 -0
- package/dist/src/agent/tools/delegate-tool.js +2 -1
- package/dist/src/agent/tools/delegate-tool.js.map +1 -1
- package/dist/src/agent/tools/dreaming-tool.js +1 -1
- package/dist/src/agent/tools/executor.d.ts +34 -15
- package/dist/src/agent/tools/executor.js +44 -79
- package/dist/src/agent/tools/executor.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +6 -0
- package/dist/src/agent/tools/factory.js +63 -4
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/send-media.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/skills-tools.js +1 -1
- package/dist/src/agent/tools/tts-tool.js +1 -1
- package/dist/src/agent/tools/write.js +1 -1
- package/dist/src/agent/workspace-runtime/registry.d.ts +48 -0
- package/dist/src/agent/workspace-runtime/registry.js +59 -0
- package/dist/src/agent/workspace-runtime/registry.js.map +1 -0
- package/dist/src/auth/credentials.js +3 -3
- package/dist/src/auth/profiles/store.js +1 -1
- package/dist/src/auth/sync-provider-auth.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +4 -3
- package/dist/src/browser/cdp-local-launcher.js.map +1 -1
- package/dist/src/browser/index.d.ts +1 -0
- package/dist/src/browser/index.js +2 -1
- package/dist/src/browser/manager.js +3 -2
- package/dist/src/browser/manager.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/browser-use.js +2 -1
- package/dist/src/browser/providers/browser-use.js.map +1 -1
- package/dist/src/browser/providers/browserbase.js +2 -1
- package/dist/src/browser/providers/browserbase.js.map +1 -1
- package/dist/src/browser/providers/cloakbrowser.js +7 -6
- package/dist/src/browser/providers/cloakbrowser.js.map +1 -1
- package/dist/src/browser/providers/playwright-doctor.d.ts +2 -0
- package/dist/src/browser/providers/playwright-doctor.js +7 -3
- package/dist/src/browser/providers/playwright-doctor.js.map +1 -1
- package/dist/src/browser/readiness.d.ts +33 -0
- package/dist/src/browser/readiness.js +138 -0
- package/dist/src/browser/readiness.js.map +1 -0
- package/dist/src/browser/stealth.js +2 -2
- package/dist/src/channels/attachments/inbound-persist.js +1 -1
- package/dist/src/channels/attachments/outbound-tts-persist.js +1 -1
- package/dist/src/channels/channel-domain.d.ts +1 -1
- package/dist/src/channels/config-helpers.d.ts +1 -1
- package/dist/src/channels/config-helpers.js.map +1 -1
- package/dist/src/channels/heartbeat-scheduler.d.ts +40 -0
- package/dist/src/channels/heartbeat-scheduler.js +94 -0
- package/dist/src/channels/heartbeat-scheduler.js.map +1 -0
- package/dist/src/channels/lifecycle-supervisor.d.ts +81 -0
- package/dist/src/channels/lifecycle-supervisor.js +263 -0
- package/dist/src/channels/lifecycle-supervisor.js.map +1 -0
- package/dist/src/channels/manager.d.ts +34 -68
- package/dist/src/channels/manager.js +107 -477
- package/dist/src/channels/manager.js.map +1 -1
- package/dist/src/channels/outbound/deliver.d.ts +1 -1
- package/dist/src/channels/outbound/deliver.js.map +1 -1
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/outbound-sender.d.ts +51 -0
- package/dist/src/channels/outbound-sender.js +125 -0
- package/dist/src/channels/outbound-sender.js.map +1 -0
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-service.d.ts +3 -10
- package/dist/src/channels/pairing/pairing-service.js.map +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/channels/pairing/pairing-types.d.ts +15 -0
- package/dist/src/channels/pairing/pairing-types.js +1 -0
- package/dist/src/channels/plugin-registry.d.ts +22 -0
- package/dist/src/channels/plugin-registry.js +44 -0
- package/dist/src/channels/plugin-registry.js.map +1 -0
- package/dist/src/channels/plugin-types.d.ts +1 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
- package/dist/src/channels/security-helpers.d.ts +1 -1
- package/dist/src/channels/security-helpers.js.map +1 -1
- package/dist/src/channels/setup-wizard.d.ts +1 -1
- package/dist/src/chat-commands/builtins/config.js +2 -2
- package/dist/src/chat-commands/context.js +1 -1
- package/dist/src/cli/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 +5 -53
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +1 -1
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/auth.d.ts +5 -14
- package/dist/src/gateway/hono/middleware/auth.js +89 -126
- package/dist/src/gateway/hono/middleware/auth.js.map +1 -1
- package/dist/src/gateway/hono/middleware/logger.js +1 -1
- package/dist/src/gateway/hono/middleware/logger.js.map +1 -1
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +14 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +62 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js.map +1 -0
- package/dist/src/gateway/hono/oauth.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +4 -4
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.d.ts +20 -0
- package/dist/src/gateway/hono/routes/browser.js +626 -0
- package/dist/src/gateway/hono/routes/browser.js.map +1 -0
- package/dist/src/gateway/hono/routes/commands-skills.js +13 -13
- package/dist/src/gateway/hono/routes/commands-skills.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js +418 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.d.ts +12 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js +186 -0
- package/dist/src/gateway/hono/routes/config-patch/channels.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +264 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/index.d.ts +9 -0
- package/dist/src/gateway/hono/routes/config-patch/index.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.d.ts +23 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js +139 -0
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/result.d.ts +18 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js +13 -0
- package/dist/src/gateway/hono/routes/config-patch/result.js.map +1 -0
- package/dist/src/gateway/hono/routes/config.js +20 -1764
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +2 -3
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/host-fs.js +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +10 -5
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +1 -2
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/models.js +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +32 -32
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/shares.js +4 -4
- package/dist/src/gateway/hono/routes/shares.js.map +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js +1 -1
- package/dist/src/gateway/hono/routes/tunnel.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +6 -7
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.js +2 -2
- package/dist/src/gateway/index.d.ts +1 -1
- package/dist/src/gateway/index.js +4 -2
- package/dist/src/gateway/lock.js +3 -3
- package/dist/src/gateway/rate-limit/auth-policy.d.ts +34 -0
- package/dist/src/gateway/rate-limit/auth-policy.js +49 -0
- package/dist/src/gateway/rate-limit/auth-policy.js.map +1 -0
- package/dist/src/gateway/rate-limit/buckets.d.ts +63 -0
- package/dist/src/gateway/rate-limit/buckets.js +143 -0
- package/dist/src/gateway/rate-limit/buckets.js.map +1 -0
- package/dist/src/gateway/rate-limit/env-flags.d.ts +13 -0
- package/dist/src/gateway/rate-limit/env-flags.js +16 -0
- package/dist/src/gateway/rate-limit/env-flags.js.map +1 -0
- package/dist/src/gateway/rate-limit/index.d.ts +3 -0
- package/dist/src/gateway/rate-limit/index.js +4 -0
- package/dist/src/gateway/run-loop.d.ts +1 -1
- package/dist/src/gateway/run-loop.js +24 -4
- package/dist/src/gateway/run-loop.js.map +1 -1
- package/dist/src/gateway/runtime-config.js +2 -1
- package/dist/src/gateway/runtime-config.js.map +1 -1
- package/dist/src/gateway/security/audit.js +2 -1
- package/dist/src/gateway/security/audit.js.map +1 -1
- package/dist/src/gateway/security/index.d.ts +0 -1
- package/dist/src/gateway/security/index.js +1 -2
- package/dist/src/gateway/security/loopback.d.ts +13 -0
- package/dist/src/gateway/security/loopback.js +45 -0
- package/dist/src/gateway/security/loopback.js.map +1 -0
- package/dist/src/gateway/service/agent-runner.d.ts +108 -0
- package/dist/src/gateway/service/agent-runner.js +184 -0
- package/dist/src/gateway/service/agent-runner.js.map +1 -0
- package/dist/src/gateway/service/config-coordinator.d.ts +119 -0
- package/dist/src/gateway/service/config-coordinator.js +351 -0
- package/dist/src/gateway/service/config-coordinator.js.map +1 -0
- package/dist/src/gateway/service/marketplace-service.d.ts +85 -0
- package/dist/src/gateway/service/marketplace-service.js +239 -0
- package/dist/src/gateway/service/marketplace-service.js.map +1 -0
- package/dist/src/gateway/service/run-gateway-agent.js +5 -5
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +125 -0
- package/dist/src/gateway/service/sessions-api.js +135 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -0
- package/dist/src/gateway/service.d.ts +30 -360
- package/dist/src/gateway/service.js +121 -903
- 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 +33 -42
- package/dist/src/share/share-rate-limit.js.map +1 -1
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/tui/backends/embedded-backend.js +16 -12
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +2 -2
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/format-tui-hotkeys.js +1 -1
- package/dist/src/tui/theme-manager.js +1 -1
- package/dist/src/tui/tui-keybindings-file.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +1 -1
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-skills-autocomplete.js +1 -1
- package/dist/src/tui/tui.js +1 -2
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tui/xopc-tui-keybindings.d.ts +0 -1
- package/dist/src/tui/xopc-tui-keybindings.js +1 -2
- package/dist/src/tui/xopc-tui-keybindings.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +2 -2
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/pairing-rate-limit.d.ts +10 -2
- package/dist/src/tunnel/pairing-rate-limit.js +19 -15
- package/dist/src/tunnel/pairing-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-rate-limit.d.ts +6 -3
- package/dist/src/tunnel/tunnel-rate-limit.js +11 -22
- package/dist/src/tunnel/tunnel-rate-limit.js.map +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/log-store.js +1 -1
- package/dist/src/utils/logger/rotation.js +1 -1
- package/dist/src/utils/logger/stats.d.ts +1 -1
- package/dist/src/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/factory.js +1 -1
- package/dist/src/voice/tts/index.js +2 -2
- package/dist/src/voice/tts/merge-config.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +1 -1
- package/dist/src/voice/tts/service.js +1 -1
- package/dist/src/voice/tts/service.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +1 -1
- package/package.json +10 -5
- package/dist/gateway/static/root/assets/agents-Cqh1ts38.js +0 -222
- package/dist/gateway/static/root/assets/channels-settings-wTiWStg9.js +0 -1
- package/dist/gateway/static/root/assets/fetch-BAAh_kXG.js +0 -3
- package/dist/gateway/static/root/assets/index-C8yHX-AA.css +0 -1
- package/dist/gateway/static/root/assets/sessions-page-BeiFm0Ms.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-RPAz_Wg_.js +0 -3
- package/dist/gateway/static/root/assets/skills-page-Wu4aNWDx.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-BxIGhhEL.js +0 -1
- package/dist/src/agent/embedded/session-raw-append-message.d.ts +0 -11
- package/dist/src/agent/embedded/session-raw-append-message.js +0 -15
- package/dist/src/agent/embedded/session-raw-append-message.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.d.ts +0 -15
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js +0 -24
- package/dist/src/agent/embedded/session-tool-result-guard-wrapper.js.map +0 -1
- package/dist/src/agent/embedded/session-tool-result-state.d.ts +0 -17
- package/dist/src/agent/embedded/session-tool-result-state.js +0 -26
- package/dist/src/agent/embedded/session-tool-result-state.js.map +0 -1
- package/dist/src/daemon/launchd-restart-handoff.d.ts +0 -25
- package/dist/src/daemon/launchd-restart-handoff.js +0 -132
- package/dist/src/daemon/launchd-restart-handoff.js.map +0 -1
- package/dist/src/gateway/auth-rate-limit.d.ts +0 -71
- package/dist/src/gateway/auth-rate-limit.js +0 -192
- package/dist/src/gateway/auth-rate-limit.js.map +0 -1
- package/dist/src/gateway/restart-handler.d.ts +0 -14
- package/dist/src/gateway/restart-handler.js +0 -64
- package/dist/src/gateway/restart-handler.js.map +0 -1
- package/dist/src/gateway/security/flood-guard.d.ts +0 -28
- package/dist/src/gateway/security/flood-guard.js +0 -42
- package/dist/src/gateway/security/flood-guard.js.map +0 -1
- package/dist/src/infra/rate-limit.d.ts +0 -38
- package/dist/src/infra/rate-limit.js +0 -60
- package/dist/src/infra/rate-limit.js.map +0 -1
- package/dist/src/infra/restart-intent.d.ts +0 -13
- package/dist/src/infra/restart-intent.js +0 -40
- package/dist/src/infra/restart-intent.js.map +0 -1
- package/dist/src/infra/restart-sentinel.d.ts +0 -23
- package/dist/src/infra/restart-sentinel.js +0 -75
- package/dist/src/infra/restart-sentinel.js.map +0 -1
- package/skills/creative/canvas-design/LICENSE.txt +0 -202
- package/skills/creative/canvas-design/SKILL-zh.md +0 -130
- package/skills/creative/canvas-design/SKILL.md +0 -130
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/ArsenalSC-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BigShoulders-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Boldonse-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/BricolageGrotesque-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/CrimsonPro-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/DMMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/DMMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-OFL.txt +0 -94
- package/skills/creative/canvas-design/canvas-fonts/EricaOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/GeistMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Gloock-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Gloock-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/IBMPlexSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/InstrumentSerif-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Italiana-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Italiana-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/JetBrainsMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Light.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Jura-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/LibreBaskerville-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Lora-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Lora-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NationalPark-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/NothingYouCouldDo-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Outfit-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Outfit-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/PixelifySans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/PoiretOne-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/RedHatMono-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Silkscreen-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/SmoochSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Medium.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/Tektur-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/Tektur-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Bold.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-BoldItalic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Italic.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/WorkSans-Regular.ttf +0 -0
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-OFL.txt +0 -93
- package/skills/creative/canvas-design/canvas-fonts/YoungSerif-Regular.ttf +0 -0
|
@@ -4,9 +4,9 @@ import { isFailoverError } from "../failover-error.js";
|
|
|
4
4
|
import { imageAssetFromDataUrl, imageFileExtensionForMimeType, mimeTypeFromFileName, parseImageDataUrl, sniffImageMimeType } from "../image/generation/image-assets.js";
|
|
5
5
|
import { getImageGenerationProvider } from "../image/generation/provider-registry.js";
|
|
6
6
|
import { generateImage, listImageGenerationProvidersSummary } from "../image/generation/runtime.js";
|
|
7
|
-
import path from "node:path";
|
|
8
7
|
import { randomBytes } from "node:crypto";
|
|
9
8
|
import { mkdir, readFile, writeFile } from "node:fs/promises";
|
|
9
|
+
import path from "node:path";
|
|
10
10
|
import { Type } from "@sinclair/typebox";
|
|
11
11
|
//#region src/agent/tools/image-generate-tool.ts
|
|
12
12
|
const DEFAULT_COUNT = 1;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { checkFileSafety } from "../prompt/safety.js";
|
|
2
2
|
import { resolvePathUnderWorkspace } from "./tool-paths.js";
|
|
3
|
-
import { basename } from "node:path";
|
|
4
3
|
import { readFile } from "fs/promises";
|
|
4
|
+
import { basename } from "node:path";
|
|
5
5
|
import { Type } from "@sinclair/typebox";
|
|
6
6
|
//#region src/agent/tools/send-media.ts
|
|
7
7
|
const SendMediaSchema = Type.Object({
|
|
@@ -2,9 +2,9 @@ import { resolveStateDir } from "../../config/paths-state.js";
|
|
|
2
2
|
import { init_paths } from "../../config/paths.js";
|
|
3
3
|
import { createSkillConfigManager } from "../skills/config.js";
|
|
4
4
|
import { applyPatchToContent, atomicWriteUtf8, effectiveAgentWritePolicy, ensureCategorySegment, isPathInsideDir, maxSkillMdChars, maxSupportFileBytes, mutatableSkillOrNull, resolveCreateSkillDir, scanSkillDirOrError, validateSkillMdContent, validateSkillNameSegment, validateSupportingRelativePath } from "../skills/skill-manage-ops.js";
|
|
5
|
+
import { readFile, rm } from "fs/promises";
|
|
5
6
|
import { join } from "path";
|
|
6
7
|
import { existsSync, rmSync } from "fs";
|
|
7
|
-
import { readFile, rm } from "fs/promises";
|
|
8
8
|
import { Type } from "@sinclair/typebox";
|
|
9
9
|
//#region src/agent/tools/skill-manage-tool.ts
|
|
10
10
|
init_paths();
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { resolveStateDir } from "../../config/paths-state.js";
|
|
2
2
|
import { init_paths } from "../../config/paths.js";
|
|
3
|
-
import { createSkillConfigManager, isSkillEnabled } from "../skills/config.js";
|
|
4
3
|
import { DEFAULT_MAX_BYTES, formatSize, truncateHead } from "./truncate.js";
|
|
4
|
+
import { createSkillConfigManager, isSkillEnabled } from "../skills/config.js";
|
|
5
5
|
import { resolveSkillReadablePath } from "../skills/skill-view-path.js";
|
|
6
6
|
import { readFileSync, statSync } from "fs";
|
|
7
7
|
import { Type } from "@sinclair/typebox";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
-
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
4
3
|
import { speak } from "../../voice/tts/speak-core.js";
|
|
4
|
+
import { mergeTtsConfigFromAppConfig } from "../../voice/tts/merge-config.js";
|
|
5
5
|
import { getChannelOutputFormat } from "../../voice/tts/service.js";
|
|
6
6
|
import { compressAudio } from "../../voice/tts/audio.js";
|
|
7
7
|
import { Type } from "@sinclair/typebox";
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { checkFileSafety } from "../prompt/safety.js";
|
|
2
2
|
import { resolvePathUnderWorkspace } from "./tool-paths.js";
|
|
3
3
|
import { evaluateFilePolicy } from "../sandbox/exec-policy.js";
|
|
4
|
-
import { dirname } from "path";
|
|
5
4
|
import { mkdir, writeFile } from "fs/promises";
|
|
5
|
+
import { dirname } from "path";
|
|
6
6
|
import { Type } from "@sinclair/typebox";
|
|
7
7
|
//#region src/agent/tools/write.ts
|
|
8
8
|
const MAX_FILE_SIZE = 10 * 1024 * 1024;
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* WorkspaceRuntimeRegistry — lazy per-workspace cache of skill/memory/prompt-builder runtimes.
|
|
3
|
+
*
|
|
4
|
+
* Previously these four collaborators (`SkillManager`, `SystemPromptBuilder`,
|
|
5
|
+
* `BuiltinMemoryStore`, `MemoryManager`) were created inline inside
|
|
6
|
+
* `AgentManager.getWorkspaceRuntime` and cached in a private Map. They live
|
|
7
|
+
* outside `AgentInstance` because multiple session keys may share a workspace
|
|
8
|
+
* (the runtime is keyed by **resolved workspace path**, not session key).
|
|
9
|
+
*
|
|
10
|
+
* Extracted so:
|
|
11
|
+
* - `AgentManager` no longer juggles four sibling caches.
|
|
12
|
+
* - Hot-reload teardown (`clearAll`) lives in one place — there are now no
|
|
13
|
+
* callers that forget to shut down `memoryManager`.
|
|
14
|
+
* - Future per-workspace runtimes (e.g. embedding store, vector cache) plug in
|
|
15
|
+
* through `getOrCreate` without touching `AgentManager`.
|
|
16
|
+
*/
|
|
17
|
+
import type { Config } from '../../config/schema.js';
|
|
18
|
+
import { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';
|
|
19
|
+
import type { MemoryManager } from '../memory/manager.js';
|
|
20
|
+
import { SkillManager } from '../skills/skill-manager.js';
|
|
21
|
+
import { SystemPromptBuilder } from '../prompt/service-prompt-builder.js';
|
|
22
|
+
export interface WorkspaceRuntime {
|
|
23
|
+
skillManager: SkillManager;
|
|
24
|
+
systemPromptBuilder: SystemPromptBuilder;
|
|
25
|
+
builtinMemoryStore: BuiltinMemoryStore;
|
|
26
|
+
memoryManager: MemoryManager;
|
|
27
|
+
}
|
|
28
|
+
export interface WorkspaceRuntimeRegistryOptions {
|
|
29
|
+
/** Effective config snapshot accessor (must always return a value when called). */
|
|
30
|
+
getConfig: () => Config;
|
|
31
|
+
/** Absolute path to the bundled skills directory shared by every workspace. */
|
|
32
|
+
bundledSkillsDir: string;
|
|
33
|
+
}
|
|
34
|
+
export declare class WorkspaceRuntimeRegistry {
|
|
35
|
+
private readonly runtimes;
|
|
36
|
+
private readonly getConfig;
|
|
37
|
+
private readonly bundledSkillsDir;
|
|
38
|
+
constructor(opts: WorkspaceRuntimeRegistryOptions);
|
|
39
|
+
/** Lazily construct (and cache) the runtime for a resolved workspace path. */
|
|
40
|
+
getOrCreate(resolvedPath: string): WorkspaceRuntime;
|
|
41
|
+
/** Iterate every live workspace runtime (used by skill / config hot-reload). */
|
|
42
|
+
values(): IterableIterator<WorkspaceRuntime>;
|
|
43
|
+
/**
|
|
44
|
+
* Tear down every runtime (shutdown memory providers) and forget the cache.
|
|
45
|
+
* Used by `AgentManager.updateAgentDefaults` and `AgentManager.dispose`.
|
|
46
|
+
*/
|
|
47
|
+
clearAll(): Promise<void>;
|
|
48
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { createLogger } from "../../utils/logger/index.js";
|
|
2
|
+
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { resolveBuiltinMemoryStoreConfig } from "../memory/memory-config.js";
|
|
4
|
+
import { BuiltinMemoryStore } from "../memory/builtin-memory-store.js";
|
|
5
|
+
import { createMemoryManagerFromConfig } from "../memory/create-memory-manager.js";
|
|
6
|
+
import { SkillManager } from "../skills/skill-manager.js";
|
|
7
|
+
import { SystemPromptBuilder } from "../prompt/service-prompt-builder.js";
|
|
8
|
+
//#region src/agent/workspace-runtime/registry.ts
|
|
9
|
+
init_logger();
|
|
10
|
+
const log = createLogger("WorkspaceRuntimeRegistry");
|
|
11
|
+
var WorkspaceRuntimeRegistry = class {
|
|
12
|
+
runtimes = /* @__PURE__ */ new Map();
|
|
13
|
+
getConfig;
|
|
14
|
+
bundledSkillsDir;
|
|
15
|
+
constructor(opts) {
|
|
16
|
+
this.getConfig = opts.getConfig;
|
|
17
|
+
this.bundledSkillsDir = opts.bundledSkillsDir;
|
|
18
|
+
}
|
|
19
|
+
/** Lazily construct (and cache) the runtime for a resolved workspace path. */
|
|
20
|
+
getOrCreate(resolvedPath) {
|
|
21
|
+
const existing = this.runtimes.get(resolvedPath);
|
|
22
|
+
if (existing) return existing;
|
|
23
|
+
const cfg = this.getConfig();
|
|
24
|
+
const builtinMemoryStore = new BuiltinMemoryStore(resolveBuiltinMemoryStoreConfig(resolvedPath, cfg));
|
|
25
|
+
const memoryManager = createMemoryManagerFromConfig(resolvedPath, builtinMemoryStore, cfg);
|
|
26
|
+
const skillManager = new SkillManager(resolvedPath, this.bundledSkillsDir);
|
|
27
|
+
const rt = {
|
|
28
|
+
skillManager,
|
|
29
|
+
systemPromptBuilder: new SystemPromptBuilder({
|
|
30
|
+
workspace: resolvedPath,
|
|
31
|
+
config: cfg,
|
|
32
|
+
skillManager
|
|
33
|
+
}),
|
|
34
|
+
builtinMemoryStore,
|
|
35
|
+
memoryManager
|
|
36
|
+
};
|
|
37
|
+
this.runtimes.set(resolvedPath, rt);
|
|
38
|
+
return rt;
|
|
39
|
+
}
|
|
40
|
+
/** Iterate every live workspace runtime (used by skill / config hot-reload). */
|
|
41
|
+
values() {
|
|
42
|
+
return this.runtimes.values();
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Tear down every runtime (shutdown memory providers) and forget the cache.
|
|
46
|
+
* Used by `AgentManager.updateAgentDefaults` and `AgentManager.dispose`.
|
|
47
|
+
*/
|
|
48
|
+
async clearAll() {
|
|
49
|
+
const toShutdown = [...this.runtimes.values()];
|
|
50
|
+
this.runtimes.clear();
|
|
51
|
+
await Promise.allSettled(toShutdown.map((rt) => rt.memoryManager.shutdownAll().catch((err) => {
|
|
52
|
+
log.warn({ err }, "memoryManager.shutdownAll failed");
|
|
53
|
+
})));
|
|
54
|
+
}
|
|
55
|
+
};
|
|
56
|
+
//#endregion
|
|
57
|
+
export { WorkspaceRuntimeRegistry };
|
|
58
|
+
|
|
59
|
+
//# sourceMappingURL=registry.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../../../src/agent/workspace-runtime/registry.ts"],"sourcesContent":["/**\n * WorkspaceRuntimeRegistry — lazy per-workspace cache of skill/memory/prompt-builder runtimes.\n *\n * Previously these four collaborators (`SkillManager`, `SystemPromptBuilder`,\n * `BuiltinMemoryStore`, `MemoryManager`) were created inline inside\n * `AgentManager.getWorkspaceRuntime` and cached in a private Map. They live\n * outside `AgentInstance` because multiple session keys may share a workspace\n * (the runtime is keyed by **resolved workspace path**, not session key).\n *\n * Extracted so:\n * - `AgentManager` no longer juggles four sibling caches.\n * - Hot-reload teardown (`clearAll`) lives in one place — there are now no\n * callers that forget to shut down `memoryManager`.\n * - Future per-workspace runtimes (e.g. embedding store, vector cache) plug in\n * through `getOrCreate` without touching `AgentManager`.\n */\n\nimport type { Config } from '../../config/schema.js';\nimport { BuiltinMemoryStore } from '../memory/builtin-memory-store.js';\nimport { createMemoryManagerFromConfig } from '../memory/create-memory-manager.js';\nimport { resolveBuiltinMemoryStoreConfig } from '../memory/memory-config.js';\nimport type { MemoryManager } from '../memory/manager.js';\nimport { SkillManager } from '../skills/skill-manager.js';\nimport { SystemPromptBuilder } from '../prompt/service-prompt-builder.js';\nimport { createLogger } from '../../utils/logger.js';\n\nconst log = createLogger('WorkspaceRuntimeRegistry');\n\nexport interface WorkspaceRuntime {\n skillManager: SkillManager;\n systemPromptBuilder: SystemPromptBuilder;\n builtinMemoryStore: BuiltinMemoryStore;\n memoryManager: MemoryManager;\n}\n\nexport interface WorkspaceRuntimeRegistryOptions {\n /** Effective config snapshot accessor (must always return a value when called). */\n getConfig: () => Config;\n /** Absolute path to the bundled skills directory shared by every workspace. */\n bundledSkillsDir: string;\n}\n\nexport class WorkspaceRuntimeRegistry {\n private readonly runtimes = new Map<string, WorkspaceRuntime>();\n private readonly getConfig: () => Config;\n private readonly bundledSkillsDir: string;\n\n constructor(opts: WorkspaceRuntimeRegistryOptions) {\n this.getConfig = opts.getConfig;\n this.bundledSkillsDir = opts.bundledSkillsDir;\n }\n\n /** Lazily construct (and cache) the runtime for a resolved workspace path. */\n getOrCreate(resolvedPath: string): WorkspaceRuntime {\n const existing = this.runtimes.get(resolvedPath);\n if (existing) {\n return existing;\n }\n\n const cfg = this.getConfig();\n const builtinMemoryStore = new BuiltinMemoryStore(\n resolveBuiltinMemoryStoreConfig(resolvedPath, cfg),\n );\n const memoryManager = createMemoryManagerFromConfig(resolvedPath, builtinMemoryStore, cfg);\n const skillManager = new SkillManager(resolvedPath, this.bundledSkillsDir);\n const systemPromptBuilder = new SystemPromptBuilder({\n workspace: resolvedPath,\n config: cfg,\n skillManager,\n });\n\n const rt: WorkspaceRuntime = {\n skillManager,\n systemPromptBuilder,\n builtinMemoryStore,\n memoryManager,\n };\n this.runtimes.set(resolvedPath, rt);\n return rt;\n }\n\n /** Iterate every live workspace runtime (used by skill / config hot-reload). */\n values(): IterableIterator<WorkspaceRuntime> {\n return this.runtimes.values();\n }\n\n /**\n * Tear down every runtime (shutdown memory providers) and forget the cache.\n * Used by `AgentManager.updateAgentDefaults` and `AgentManager.dispose`.\n */\n async clearAll(): Promise<void> {\n const toShutdown = [...this.runtimes.values()];\n this.runtimes.clear();\n await Promise.allSettled(\n toShutdown.map((rt) =>\n rt.memoryManager.shutdownAll().catch((err) => {\n log.warn({ err }, 'memoryManager.shutdownAll failed');\n }),\n ),\n );\n }\n}\n"],"mappings":";;;;;;;;aAwBqD;AAErD,MAAM,MAAM,aAAa,2BAA2B;AAgBpD,IAAa,2BAAb,MAAsC;CACpC,2BAA4B,IAAI,KAA+B;CAC/D;CACA;CAEA,YAAY,MAAuC;AACjD,OAAK,YAAY,KAAK;AACtB,OAAK,mBAAmB,KAAK;;;CAI/B,YAAY,cAAwC;EAClD,MAAM,WAAW,KAAK,SAAS,IAAI,aAAa;AAChD,MAAI,SACF,QAAO;EAGT,MAAM,MAAM,KAAK,WAAW;EAC5B,MAAM,qBAAqB,IAAI,mBAC7B,gCAAgC,cAAc,IAAI,CACnD;EACD,MAAM,gBAAgB,8BAA8B,cAAc,oBAAoB,IAAI;EAC1F,MAAM,eAAe,IAAI,aAAa,cAAc,KAAK,iBAAiB;EAO1E,MAAM,KAAuB;GAC3B;GACA,qBAAA,IAR8B,oBAAoB;IAClD,WAAW;IACX,QAAQ;IACR;IACD,CAIoB;GACnB;GACA;GACD;AACD,OAAK,SAAS,IAAI,cAAc,GAAG;AACnC,SAAO;;;CAIT,SAA6C;AAC3C,SAAO,KAAK,SAAS,QAAQ;;;;;;CAO/B,MAAM,WAA0B;EAC9B,MAAM,aAAa,CAAC,GAAG,KAAK,SAAS,QAAQ,CAAC;AAC9C,OAAK,SAAS,OAAO;AACrB,QAAM,QAAQ,WACZ,WAAW,KAAK,OACd,GAAG,cAAc,aAAa,CAAC,OAAO,QAAQ;AAC5C,OAAI,KAAK,EAAE,KAAK,EAAE,mCAAmC;IACrD,CACH,CACF"}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
2
3
|
import { createLogger } from "../utils/logger/index.js";
|
|
3
4
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
-
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
5
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
6
5
|
import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
|
|
7
|
-
import {
|
|
6
|
+
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
8
7
|
import { mkdir, readFile } from "fs/promises";
|
|
8
|
+
import { dirname, join } from "path";
|
|
9
9
|
//#region src/auth/credentials.ts
|
|
10
10
|
function getCredentialResolver(options) {
|
|
11
11
|
return new CredentialResolver(options);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
|
-
import path from "node:path";
|
|
3
2
|
import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import path from "node:path";
|
|
4
4
|
import { homedir } from "os";
|
|
5
5
|
//#region src/auth/profiles/store.ts
|
|
6
6
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
3
2
|
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
|
|
4
3
|
import { init_loader, loadConfig } from "../config/loader.js";
|
|
4
|
+
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
5
5
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
6
|
//#region src/auth/sync-provider-auth.ts
|
|
7
7
|
/**
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { loadPlaywrightCoreModule } from "./providers/playwright-doctor.js";
|
|
3
4
|
import { pickFreePort } from "./free-port.js";
|
|
4
|
-
import { join } from "node:path";
|
|
5
|
-
import { homedir, platform } from "node:os";
|
|
6
5
|
import { existsSync } from "node:fs";
|
|
7
6
|
import { mkdir, rm } from "node:fs/promises";
|
|
7
|
+
import { join } from "node:path";
|
|
8
|
+
import { homedir, platform } from "node:os";
|
|
8
9
|
import { spawn } from "node:child_process";
|
|
9
10
|
//#region src/browser/cdp-local-launcher.ts
|
|
10
11
|
/**
|
|
@@ -31,7 +32,7 @@ async function resolveChromeBinary(override) {
|
|
|
31
32
|
return candidate;
|
|
32
33
|
}
|
|
33
34
|
try {
|
|
34
|
-
const pw = await
|
|
35
|
+
const pw = await loadPlaywrightCoreModule();
|
|
35
36
|
const exec = (pw.chromium ?? pw.default?.chromium)?.executablePath?.();
|
|
36
37
|
if (exec && existsSync(exec)) return exec;
|
|
37
38
|
} catch {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cdp-local-launcher.js","names":["osPlatform"],"sources":["../../../src/browser/cdp-local-launcher.ts"],"sourcesContent":["/**\n * Launches a Chromium / Chrome instance locally with `--remote-debugging-port`\n * so the user can wire CDP backend without typing the command themselves.\n *\n * Instances live for the lifetime of the gateway process (no on-disk state).\n * Launching binds the debug port to 127.0.0.1; the user-data-dir is rooted\n * under `~/.xopc/cdp-launch/` and removed on stop.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, rm } from 'node:fs/promises';\nimport { homedir, platform as osPlatform } from 'node:os';\nimport { join } from 'node:path';\nimport { ChildProcess, spawn } from 'node:child_process';\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { pickFreePort } from './free-port.js';\n\nconst log = createLogger('CdpLocalLauncher');\n\nconst READY_TIMEOUT_MS = 20_000;\nconst READY_POLL_INTERVAL_MS = 250;\n\nexport interface LaunchedCdpInstance {\n /** Debug port the instance listens on (loopback). */\n port: number;\n /** Browser-level WS endpoint, ready for Playwright `connectOverCDP`. */\n wsEndpoint: string;\n /** Browser process pid. */\n pid: number;\n /** Resolved Chrome / Chromium binary path used to spawn. */\n executablePath: string;\n /** Temporary `--user-data-dir`. Deleted on stop. */\n userDataDir: string;\n /** Wall-clock spawn time (ms epoch). */\n startedAt: number;\n}\n\ninterface InstanceEntry extends LaunchedCdpInstance {\n child: ChildProcess;\n}\n\nconst instances = new Map<number, InstanceEntry>();\n\nfunction defaultUserDataRoot(): string {\n return join(homedir(), '.xopc', 'cdp-launch');\n}\n\n/** Resolve a Chrome / Chromium executable for the current platform. */\nexport async function resolveChromeBinary(override?: string): Promise<string> {\n if (override && override.trim()) {\n const candidate = override.trim();\n if (!existsSync(candidate)) {\n throw new Error(`Chrome executable not found at ${candidate}`);\n }\n return candidate;\n }\n\n try {\n const pw = await
|
|
1
|
+
{"version":3,"file":"cdp-local-launcher.js","names":["osPlatform"],"sources":["../../../src/browser/cdp-local-launcher.ts"],"sourcesContent":["/**\n * Launches a Chromium / Chrome instance locally with `--remote-debugging-port`\n * so the user can wire CDP backend without typing the command themselves.\n *\n * Instances live for the lifetime of the gateway process (no on-disk state).\n * Launching binds the debug port to 127.0.0.1; the user-data-dir is rooted\n * under `~/.xopc/cdp-launch/` and removed on stop.\n */\n\nimport { existsSync } from 'node:fs';\nimport { mkdir, rm } from 'node:fs/promises';\nimport { homedir, platform as osPlatform } from 'node:os';\nimport { join } from 'node:path';\nimport { ChildProcess, spawn } from 'node:child_process';\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { pickFreePort } from './free-port.js';\nimport { loadPlaywrightCoreModule } from './providers/playwright-doctor.js';\n\nconst log = createLogger('CdpLocalLauncher');\n\nconst READY_TIMEOUT_MS = 20_000;\nconst READY_POLL_INTERVAL_MS = 250;\n\nexport interface LaunchedCdpInstance {\n /** Debug port the instance listens on (loopback). */\n port: number;\n /** Browser-level WS endpoint, ready for Playwright `connectOverCDP`. */\n wsEndpoint: string;\n /** Browser process pid. */\n pid: number;\n /** Resolved Chrome / Chromium binary path used to spawn. */\n executablePath: string;\n /** Temporary `--user-data-dir`. Deleted on stop. */\n userDataDir: string;\n /** Wall-clock spawn time (ms epoch). */\n startedAt: number;\n}\n\ninterface InstanceEntry extends LaunchedCdpInstance {\n child: ChildProcess;\n}\n\nconst instances = new Map<number, InstanceEntry>();\n\nfunction defaultUserDataRoot(): string {\n return join(homedir(), '.xopc', 'cdp-launch');\n}\n\n/** Resolve a Chrome / Chromium executable for the current platform. */\nexport async function resolveChromeBinary(override?: string): Promise<string> {\n if (override && override.trim()) {\n const candidate = override.trim();\n if (!existsSync(candidate)) {\n throw new Error(`Chrome executable not found at ${candidate}`);\n }\n return candidate;\n }\n\n try {\n const pw = await loadPlaywrightCoreModule();\n const chromium = pw.chromium\n ?? (pw as { default?: { chromium?: (typeof pw)['chromium'] } }).default?.chromium;\n const exec = chromium?.executablePath?.();\n if (exec && existsSync(exec)) {\n return exec;\n }\n } catch {\n // playwright-core unavailable — fall through to system probes\n }\n\n const os = osPlatform();\n const probes: string[] =\n os === 'darwin'\n ? [\n '/Applications/Google Chrome.app/Contents/MacOS/Google Chrome',\n '/Applications/Chromium.app/Contents/MacOS/Chromium',\n '/Applications/Google Chrome Canary.app/Contents/MacOS/Google Chrome Canary',\n ]\n : os === 'win32'\n ? [\n 'C:\\\\Program Files\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n 'C:\\\\Program Files (x86)\\\\Google\\\\Chrome\\\\Application\\\\chrome.exe',\n ]\n : ['/usr/bin/google-chrome', '/usr/bin/chromium', '/usr/bin/chromium-browser', '/snap/bin/chromium'];\n\n for (const path of probes) {\n if (existsSync(path)) return path;\n }\n throw new Error(\n 'No Chrome / Chromium binary found. Install Chrome or run `npx playwright install chromium` first.',\n );\n}\n\nasync function waitForCdpEndpoint(port: number): Promise<string> {\n const deadline = Date.now() + READY_TIMEOUT_MS;\n while (Date.now() < deadline) {\n try {\n const res = await fetch(`http://127.0.0.1:${port}/json/version`, {\n signal: AbortSignal.timeout(1500),\n });\n if (res.ok) {\n const data = (await res.json()) as { webSocketDebuggerUrl?: string };\n if (data.webSocketDebuggerUrl) return data.webSocketDebuggerUrl;\n }\n } catch {\n // not ready yet\n }\n await new Promise((r) => setTimeout(r, READY_POLL_INTERVAL_MS));\n }\n throw new Error(`Chrome did not expose CDP within ${READY_TIMEOUT_MS / 1000}s on port ${port}`);\n}\n\nexport interface LaunchOptions {\n /** Optional override for the Chrome / Chromium binary. */\n executablePath?: string;\n /** Run headless. Default false (visible window so user can interact). */\n headless?: boolean;\n}\n\nexport async function launchLocalCdpChrome(opts: LaunchOptions = {}): Promise<LaunchedCdpInstance> {\n const executablePath = await resolveChromeBinary(opts.executablePath);\n const port = await pickFreePort();\n\n const root = defaultUserDataRoot();\n await mkdir(root, { recursive: true });\n const userDataDir = join(root, `${process.pid}-${port}`);\n await mkdir(userDataDir, { recursive: true });\n\n const args = [\n `--remote-debugging-address=127.0.0.1`,\n `--remote-debugging-port=${port}`,\n `--user-data-dir=${userDataDir}`,\n '--no-first-run',\n '--no-default-browser-check',\n ];\n if (opts.headless) args.push('--headless=new');\n if (osPlatform() === 'darwin') args.push('--use-mock-keychain');\n\n log.info({ executablePath, port, userDataDir }, 'Spawning local debuggable Chrome');\n\n const child = spawn(executablePath, args, {\n stdio: ['ignore', 'ignore', 'ignore'],\n detached: false,\n });\n\n // Surface early launch failures before waitForCdpEndpoint times out.\n const launchFailure = new Promise<never>((_resolve, reject) => {\n const onErr = (err: Error) => reject(new Error(`spawn failed: ${err.message}`));\n const onExit = (code: number | null, signal: NodeJS.Signals | null) => {\n const reason = signal ? `signal ${signal}` : `exit ${code ?? 'unknown'}`;\n reject(new Error(`Chrome exited before CDP came up (${reason})`));\n };\n child.once('error', onErr);\n child.once('exit', onExit);\n });\n\n let wsEndpoint: string;\n try {\n wsEndpoint = await Promise.race([waitForCdpEndpoint(port), launchFailure]);\n } catch (e) {\n child.kill();\n await rm(userDataDir, { recursive: true, force: true }).catch(() => {});\n throw e;\n }\n\n const entry: InstanceEntry = {\n port,\n wsEndpoint,\n pid: child.pid ?? -1,\n executablePath,\n userDataDir,\n startedAt: Date.now(),\n child,\n };\n instances.set(port, entry);\n\n // If Chrome exits on its own, drop bookkeeping so /instances reflects truth.\n child.once('exit', () => {\n instances.delete(port);\n void rm(userDataDir, { recursive: true, force: true }).catch(() => {});\n log.info({ port }, 'Local CDP Chrome exited');\n });\n\n return toPublic(entry);\n}\n\nexport async function stopLocalCdpChrome(port: number): Promise<boolean> {\n const entry = instances.get(port);\n if (!entry) return false;\n entry.child.kill();\n // exit handler will clean up the map and user-data-dir.\n return true;\n}\n\nexport function listLocalCdpInstances(): LaunchedCdpInstance[] {\n return [...instances.values()].map(toPublic);\n}\n\nfunction toPublic(entry: InstanceEntry): LaunchedCdpInstance {\n const { child: _child, ...pub } = entry;\n return pub;\n}\n\n/** Graceful shutdown — call from gateway exit hooks. */\nexport async function stopAllLocalCdpChromes(): Promise<void> {\n for (const [port] of instances) {\n await stopLocalCdpChrome(port);\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
export { BrowserManager, type BrowserManagerOptions } from './manager.js';
|
|
2
2
|
export { resolveBrowserBackendFromConfig } from './backend-from-config.js';
|
|
3
3
|
export { resolveBrowserCommandTimeoutMs } from './browser-command-timeout.js';
|
|
4
|
+
export { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness, type BrowserBackendKind, type BrowserNotReadyReason, type BrowserSetupHint, } from './readiness.js';
|
|
4
5
|
export { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern, isAlwaysBlockedUrl, } from './url-policy.js';
|
|
5
6
|
export { CdpSupervisor, type DialogEvent, type ConsoleEntry, type DialogPolicy } from './cdp-supervisor.js';
|
|
6
7
|
export { truncateSnapshotAtBoundary, snapshotSummaryHeader } from './snapshot-helpers.js';
|
|
@@ -4,6 +4,7 @@ import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern, i
|
|
|
4
4
|
import { snapshotSummaryHeader, truncateSnapshotAtBoundary } from "./snapshot-helpers.js";
|
|
5
5
|
import { BrowserManager } from "./manager.js";
|
|
6
6
|
import { resolveBrowserBackendFromConfig } from "./backend-from-config.js";
|
|
7
|
+
import { BrowserNotReadyError, buildBrowserSetupDeepLink, checkBrowserReadiness } from "./readiness.js";
|
|
7
8
|
import { CdpSupervisor } from "./cdp-supervisor.js";
|
|
8
9
|
import { checkBotDetection, cleanupOrphanProcesses, startTracing, stopTracing } from "./session-lifecycle.js";
|
|
9
10
|
import { generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, resolveHumanConfig } from "./humanize.js";
|
|
@@ -13,4 +14,4 @@ import { parseBrowserPipeline } from "./pipeline/schema.js";
|
|
|
13
14
|
import { resolveTemplate, resolveTemplateDeep } from "./pipeline/template.js";
|
|
14
15
|
import { runBrowserPipeline, validateBrowserPipeline } from "./pipeline/runner.js";
|
|
15
16
|
import { loadBrowserPipelineSource } from "./pipeline/source.js";
|
|
16
|
-
export { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserManager, BrowserNavigateSchema, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema, CdpSupervisor, WEBDRIVER_OVERRIDE_SCRIPT, assertBrowserUrlAllowed, buildLocalStealthArgs, buildStealthArgs, checkBotDetection, checkPostRedirectUrl, cleanupOrphanProcesses, containsApiKeyPattern, createBrowserActionRegistry, generateFingerprintSeed, generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, isAlwaysBlockedUrl, loadBrowserPipelineSource, makeExecutable, parseBrowserPipeline, removeQuarantineAttr, resolveBrowserBackendFromConfig, resolveBrowserCommandTimeoutMs, resolveHumanConfig, resolveTemplate, resolveTemplateDeep, runBrowserPipeline, snapshotSummaryHeader, startTracing, stopTracing, truncateSnapshotAtBoundary, validateBrowserPipeline };
|
|
17
|
+
export { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserManager, BrowserNavigateSchema, BrowserNotReadyError, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema, CdpSupervisor, WEBDRIVER_OVERRIDE_SCRIPT, assertBrowserUrlAllowed, buildBrowserSetupDeepLink, buildLocalStealthArgs, buildStealthArgs, checkBotDetection, checkBrowserReadiness, checkPostRedirectUrl, cleanupOrphanProcesses, containsApiKeyPattern, createBrowserActionRegistry, generateFingerprintSeed, generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, isAlwaysBlockedUrl, loadBrowserPipelineSource, makeExecutable, parseBrowserPipeline, removeQuarantineAttr, resolveBrowserBackendFromConfig, resolveBrowserCommandTimeoutMs, resolveHumanConfig, resolveTemplate, resolveTemplateDeep, runBrowserPipeline, snapshotSummaryHeader, startTracing, stopTracing, truncateSnapshotAtBoundary, validateBrowserPipeline };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
|
+
import { loadPlaywrightCoreModule } from "./providers/playwright-doctor.js";
|
|
3
4
|
//#region src/browser/manager.ts
|
|
4
5
|
init_logger();
|
|
5
6
|
const log = createLogger("browser-manager");
|
|
@@ -124,7 +125,7 @@ var BrowserManager = class {
|
|
|
124
125
|
return this.context;
|
|
125
126
|
}
|
|
126
127
|
async _launchLocal(headless) {
|
|
127
|
-
const pw = await
|
|
128
|
+
const pw = await loadPlaywrightCoreModule();
|
|
128
129
|
const chromium = pw.chromium ?? pw.default?.chromium;
|
|
129
130
|
if (!chromium?.launch) throw new Error("playwright-core did not expose chromium (try reinstall: pnpm install playwright-core; install browser: npx playwright install chromium)");
|
|
130
131
|
this.browser = await chromium.launch({
|
|
@@ -145,7 +146,7 @@ var BrowserManager = class {
|
|
|
145
146
|
}, "Browser launched (local)");
|
|
146
147
|
}
|
|
147
148
|
async _connectViaCdp(wsEndpoint) {
|
|
148
|
-
const pw = await
|
|
149
|
+
const pw = await loadPlaywrightCoreModule();
|
|
149
150
|
const chromium = pw.chromium ?? pw.default?.chromium;
|
|
150
151
|
if (!chromium?.connectOverCDP) throw new Error("playwright-core does not support connectOverCDP");
|
|
151
152
|
this.browser = await chromium.connectOverCDP(wsEndpoint);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"manager.js","names":[],"sources":["../../../src/browser/manager.ts"],"sourcesContent":["import type { Browser, BrowserContext, Page } from 'playwright-core';\n\nimport { createLogger } from '../utils/logger.js';\n\nimport type { BrowserBackend, CloudBrowserProvider, CloudBrowserProviderConfig, ExtensionConnectionConfig } from './providers/types.js';\nimport type { ExtensionBrowserProvider } from './providers/extension.js';\n\nconst log = createLogger('browser-manager');\n\nconst MAX_PAGES = 3;\nconst PAGE_IDLE_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport interface BrowserManagerOptions {\n getHeadless: () => boolean;\n /** Backend connection mode. Default: local Playwright. */\n getBackend?: () => BrowserBackend;\n}\n\n/**\n * Multi-backend browser manager — supports local Playwright, direct CDP, and cloud providers.\n *\n * One browser context shared by all sessions; one {@link Page} per task/session key (max {@link MAX_PAGES}).\n * Backend is selected at first connection based on {@link BrowserManagerOptions.getBackend}.\n */\nexport class BrowserManager {\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private cloudProvider: CloudBrowserProvider | null = null;\n private extensionProvider: ExtensionBrowserProvider | null = null;\n private extensionRelease: (() => Promise<void>) | null = null;\n private cloakChildProcess: import('node:child_process').ChildProcess | null = null;\n private cloakTempProfileDir: string | null = null;\n private pages = new Map<string, { page: Page; lastUsed: number }>();\n private readonly options: BrowserManagerOptions;\n private activeBackendMode: BrowserBackend['mode'] | null = null;\n\n constructor(options: BrowserManagerOptions) {\n this.options = options;\n }\n\n /** Current backend mode (null if not yet connected). */\n get backendMode(): string | null {\n return this.activeBackendMode;\n }\n\n private evictIdlePages(): void {\n const now = Date.now();\n for (const [id, entry] of this.pages) {\n if (entry.page.isClosed() || now - entry.lastUsed > PAGE_IDLE_TIMEOUT_MS) {\n void entry.page.close().catch(() => {});\n this.pages.delete(id);\n log.debug({ taskId: id }, 'Evicted idle or closed browser page');\n }\n }\n }\n\n private _isPlaywrightConnectionAlive(): boolean {\n if (!this.browser || !this.context) return false;\n try {\n if (typeof this.browser.isConnected === 'function' && !this.browser.isConnected()) {\n return false;\n }\n return true;\n } catch {\n return false;\n }\n }\n\n private _wireBrowserLifecycle(browser: Browser): void {\n browser.on('disconnected', () => {\n log.warn({ mode: this.activeBackendMode }, 'Browser disconnected — clearing stale session');\n this._clearPlaywrightSessionRefs();\n });\n }\n\n /** Drop Playwright handles without tearing down extension bridge. */\n private _clearPlaywrightSessionRefs(): void {\n this.pages.clear();\n this.context = null;\n this.browser = null;\n this.cloakChildProcess = null;\n this.cloakTempProfileDir = null;\n if (this.cloudProvider) {\n void this.cloudProvider.disconnect().catch(() => {});\n this.cloudProvider = null;\n }\n }\n\n private async _resetStalePlaywrightSession(): Promise<void> {\n for (const [, entry] of this.pages) {\n await entry.page.close().catch(() => {});\n }\n this.pages.clear();\n\n if (this.cloudProvider) {\n await this.cloudProvider.disconnect().catch(() => {});\n this.cloudProvider = null;\n }\n\n if (this.cloakChildProcess || this.cloakTempProfileDir) {\n const { cleanupCloakBrowser } = await import('./providers/cloakbrowser.js');\n await cleanupCloakBrowser(this.cloakChildProcess, this.cloakTempProfileDir).catch(() => {});\n this.cloakChildProcess = null;\n this.cloakTempProfileDir = null;\n }\n\n await this.context?.close().catch(() => {});\n await this.browser?.close().catch(() => {});\n this.context = null;\n this.browser = null;\n }\n\n /**\n * Ensure Playwright context or Chrome Extension provider is ready.\n * Extension mode does not create a Playwright {@link BrowserContext}.\n */\n async ensureConnected(): Promise<void> {\n if (this.extensionProvider) return;\n\n if (this.context && this._isPlaywrightConnectionAlive()) {\n return;\n }\n\n if (this.context || this.browser) {\n log.warn({ mode: this.activeBackendMode }, 'Browser session unavailable — reconnecting');\n await this._resetStalePlaywrightSession();\n }\n\n const backend = this.options.getBackend?.() ?? { mode: 'local' as const, headless: false };\n\n switch (backend.mode) {\n case 'cdp':\n await this._connectViaCdp(backend.config.wsEndpoint);\n break;\n case 'cloud':\n await this._connectViaCloud(backend.config);\n break;\n case 'extension':\n await this._connectViaExtension(backend.config);\n break;\n case 'cloakbrowser':\n await this._connectViaCloakBrowser(backend.config);\n break;\n case 'local':\n default:\n await this._launchLocal(backend.mode === 'local' ? backend.headless : this.options.getHeadless() === true);\n break;\n }\n\n this.activeBackendMode = backend.mode;\n if (this.browser) {\n this._wireBrowserLifecycle(this.browser);\n }\n }\n\n /** @deprecated Use {@link ensureConnected}. */\n async ensureBrowser(): Promise<BrowserContext> {\n await this.ensureConnected();\n if (!this.context) {\n throw new Error('ensureBrowser: no Playwright context (extension backend uses ensureConnected + registry bridge)');\n }\n return this.context;\n }\n\n private async _launchLocal(headless: boolean): Promise<void> {\n const pw = await import('playwright-core');\n const chromium = pw.chromium ?? (pw as { default?: { chromium?: (typeof pw)['chromium'] } }).default?.chromium;\n if (!chromium?.launch) {\n throw new Error(\n 'playwright-core did not expose chromium (try reinstall: pnpm install playwright-core; install browser: npx playwright install chromium)',\n );\n }\n this.browser = await chromium.launch({\n headless,\n ...(headless ? { channel: 'chromium' } : {}),\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n this.context = await this.browser.newContext({\n viewport: { width: 1280, height: 720 },\n userAgent:\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n });\n log.info({ headless, mode: 'local' }, 'Browser launched (local)');\n }\n\n private async _connectViaCdp(wsEndpoint: string): Promise<void> {\n const pw = await import('playwright-core');\n const chromium = pw.chromium ?? (pw as { default?: { chromium?: (typeof pw)['chromium'] } }).default?.chromium;\n if (!chromium?.connectOverCDP) {\n throw new Error('playwright-core does not support connectOverCDP');\n }\n this.browser = await chromium.connectOverCDP(wsEndpoint);\n const contexts = this.browser.contexts();\n this.context = contexts.length > 0 ? contexts[0] : await this.browser.newContext();\n log.info({ mode: 'cdp', wsEndpoint }, 'Browser connected (CDP)');\n }\n\n private async _connectViaCloud(config: CloudBrowserProviderConfig): Promise<void> {\n const { BrowserbaseProvider } = await import('./providers/browserbase.js');\n const { BrowserUseProvider } = await import('./providers/browser-use.js');\n\n const provider = config.type === 'browserbase'\n ? new BrowserbaseProvider(config)\n : new BrowserUseProvider(config);\n\n const { browser, context } = await provider.connect();\n this.browser = browser;\n this.context = context;\n this.cloudProvider = provider;\n log.info({ mode: 'cloud', provider: config.type }, `Browser connected (${config.type})`);\n }\n\n private async _connectViaExtension(config?: ExtensionConnectionConfig): Promise<void> {\n const { acquireExtensionBrowserServer } = await import('./providers/extension-ws-acquire.js');\n const { provider, release } = await acquireExtensionBrowserServer(config);\n this.extensionProvider = provider;\n this.extensionRelease = release;\n log.info({ port: config?.port ?? 19820 }, 'Extension WS server ready, waiting for Chrome Extension...');\n await provider.waitForConnection();\n // Extension mode does not use Playwright — context stays null.\n // The action registry dispatches directly via extensionProvider.sendCommand().\n log.info({ mode: 'extension' }, 'Browser connected (Chrome Extension)');\n }\n\n private async _connectViaCloakBrowser(config?: import('./providers/types.js').CloakBrowserConfig): Promise<void> {\n const { launchCloakBrowser } = await import('./providers/cloakbrowser.js');\n const result = await launchCloakBrowser(config);\n if (!result.browser || !result.context) {\n throw new Error('BrowserManager: CloakBrowser launch did not return a Playwright connection');\n }\n this.browser = result.browser;\n this.context = result.context;\n this.cloakChildProcess = result.childProcess;\n this.cloakTempProfileDir = result.temporaryProfileDir;\n log.info({ mode: 'cloakbrowser' }, 'Browser connected (CloakBrowser)');\n }\n\n async getPage(taskId: string): Promise<Page> {\n if (this.extensionProvider) {\n throw new Error('BrowserManager.getPage is not used in Chrome Extension backend mode');\n }\n\n this.evictIdlePages();\n await this.ensureConnected();\n\n const existing = this.pages.get(taskId);\n if (existing && !existing.page.isClosed()) {\n existing.lastUsed = Date.now();\n return existing.page;\n }\n if (existing) {\n this.pages.delete(taskId);\n }\n\n if (this.pages.size >= MAX_PAGES) {\n const oldest = [...this.pages.entries()].sort((a, b) => a[1].lastUsed - b[1].lastUsed)[0];\n if (oldest) {\n await oldest[1].page.close().catch(() => {});\n this.pages.delete(oldest[0]);\n }\n }\n\n const ctx = this.context;\n if (!ctx) {\n throw new Error('BrowserManager: Playwright context missing after ensureConnected');\n }\n const page = await ctx.newPage();\n this.pages.set(taskId, { page, lastUsed: Date.now() });\n return page;\n }\n\n async closePage(taskId: string): Promise<void> {\n if (this.extensionProvider) {\n return;\n }\n const entry = this.pages.get(taskId);\n if (entry) {\n await entry.page.close().catch(() => {});\n this.pages.delete(taskId);\n }\n }\n\n /** Get the extension provider (only available in extension mode). */\n getExtensionProvider(): ExtensionBrowserProvider | null {\n return this.extensionProvider;\n }\n\n async shutdown(): Promise<void> {\n for (const [, entry] of this.pages) {\n await entry.page.close().catch(() => {});\n }\n this.pages.clear();\n\n if (this.cloudProvider) {\n await this.cloudProvider.disconnect().catch(() => {});\n this.cloudProvider = null;\n }\n\n if (this.extensionRelease) {\n await this.extensionRelease().catch(() => {});\n this.extensionRelease = null;\n }\n this.extensionProvider = null;\n\n // CloakBrowser cleanup — kill child process and remove temp profile\n if (this.cloakChildProcess || this.cloakTempProfileDir) {\n const { cleanupCloakBrowser } = await import('./providers/cloakbrowser.js');\n await cleanupCloakBrowser(this.cloakChildProcess, this.cloakTempProfileDir).catch(() => {});\n this.cloakChildProcess = null;\n this.cloakTempProfileDir = null;\n }\n\n await this.context?.close().catch(() => {});\n await this.browser?.close().catch(() => {});\n this.context = null;\n this.browser = null;\n this.activeBackendMode = null;\n log.info('Browser shut down');\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"manager.js","names":[],"sources":["../../../src/browser/manager.ts"],"sourcesContent":["import type { Browser, BrowserContext, Page } from 'playwright-core';\n\nimport { createLogger } from '../utils/logger.js';\n\nimport { loadPlaywrightCoreModule } from './providers/playwright-doctor.js';\nimport type { BrowserBackend, CloudBrowserProvider, CloudBrowserProviderConfig, ExtensionConnectionConfig } from './providers/types.js';\nimport type { ExtensionBrowserProvider } from './providers/extension.js';\n\nconst log = createLogger('browser-manager');\n\nconst MAX_PAGES = 3;\nconst PAGE_IDLE_TIMEOUT_MS = 5 * 60 * 1000;\n\nexport interface BrowserManagerOptions {\n getHeadless: () => boolean;\n /** Backend connection mode. Default: local Playwright. */\n getBackend?: () => BrowserBackend;\n}\n\n/**\n * Multi-backend browser manager — supports local Playwright, direct CDP, and cloud providers.\n *\n * One browser context shared by all sessions; one {@link Page} per task/session key (max {@link MAX_PAGES}).\n * Backend is selected at first connection based on {@link BrowserManagerOptions.getBackend}.\n */\nexport class BrowserManager {\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private cloudProvider: CloudBrowserProvider | null = null;\n private extensionProvider: ExtensionBrowserProvider | null = null;\n private extensionRelease: (() => Promise<void>) | null = null;\n private cloakChildProcess: import('node:child_process').ChildProcess | null = null;\n private cloakTempProfileDir: string | null = null;\n private pages = new Map<string, { page: Page; lastUsed: number }>();\n private readonly options: BrowserManagerOptions;\n private activeBackendMode: BrowserBackend['mode'] | null = null;\n\n constructor(options: BrowserManagerOptions) {\n this.options = options;\n }\n\n /** Current backend mode (null if not yet connected). */\n get backendMode(): string | null {\n return this.activeBackendMode;\n }\n\n private evictIdlePages(): void {\n const now = Date.now();\n for (const [id, entry] of this.pages) {\n if (entry.page.isClosed() || now - entry.lastUsed > PAGE_IDLE_TIMEOUT_MS) {\n void entry.page.close().catch(() => {});\n this.pages.delete(id);\n log.debug({ taskId: id }, 'Evicted idle or closed browser page');\n }\n }\n }\n\n private _isPlaywrightConnectionAlive(): boolean {\n if (!this.browser || !this.context) return false;\n try {\n if (typeof this.browser.isConnected === 'function' && !this.browser.isConnected()) {\n return false;\n }\n return true;\n } catch {\n return false;\n }\n }\n\n private _wireBrowserLifecycle(browser: Browser): void {\n browser.on('disconnected', () => {\n log.warn({ mode: this.activeBackendMode }, 'Browser disconnected — clearing stale session');\n this._clearPlaywrightSessionRefs();\n });\n }\n\n /** Drop Playwright handles without tearing down extension bridge. */\n private _clearPlaywrightSessionRefs(): void {\n this.pages.clear();\n this.context = null;\n this.browser = null;\n this.cloakChildProcess = null;\n this.cloakTempProfileDir = null;\n if (this.cloudProvider) {\n void this.cloudProvider.disconnect().catch(() => {});\n this.cloudProvider = null;\n }\n }\n\n private async _resetStalePlaywrightSession(): Promise<void> {\n for (const [, entry] of this.pages) {\n await entry.page.close().catch(() => {});\n }\n this.pages.clear();\n\n if (this.cloudProvider) {\n await this.cloudProvider.disconnect().catch(() => {});\n this.cloudProvider = null;\n }\n\n if (this.cloakChildProcess || this.cloakTempProfileDir) {\n const { cleanupCloakBrowser } = await import('./providers/cloakbrowser.js');\n await cleanupCloakBrowser(this.cloakChildProcess, this.cloakTempProfileDir).catch(() => {});\n this.cloakChildProcess = null;\n this.cloakTempProfileDir = null;\n }\n\n await this.context?.close().catch(() => {});\n await this.browser?.close().catch(() => {});\n this.context = null;\n this.browser = null;\n }\n\n /**\n * Ensure Playwright context or Chrome Extension provider is ready.\n * Extension mode does not create a Playwright {@link BrowserContext}.\n */\n async ensureConnected(): Promise<void> {\n if (this.extensionProvider) return;\n\n if (this.context && this._isPlaywrightConnectionAlive()) {\n return;\n }\n\n if (this.context || this.browser) {\n log.warn({ mode: this.activeBackendMode }, 'Browser session unavailable — reconnecting');\n await this._resetStalePlaywrightSession();\n }\n\n const backend = this.options.getBackend?.() ?? { mode: 'local' as const, headless: false };\n\n switch (backend.mode) {\n case 'cdp':\n await this._connectViaCdp(backend.config.wsEndpoint);\n break;\n case 'cloud':\n await this._connectViaCloud(backend.config);\n break;\n case 'extension':\n await this._connectViaExtension(backend.config);\n break;\n case 'cloakbrowser':\n await this._connectViaCloakBrowser(backend.config);\n break;\n case 'local':\n default:\n await this._launchLocal(backend.mode === 'local' ? backend.headless : this.options.getHeadless() === true);\n break;\n }\n\n this.activeBackendMode = backend.mode;\n if (this.browser) {\n this._wireBrowserLifecycle(this.browser);\n }\n }\n\n /** @deprecated Use {@link ensureConnected}. */\n async ensureBrowser(): Promise<BrowserContext> {\n await this.ensureConnected();\n if (!this.context) {\n throw new Error('ensureBrowser: no Playwright context (extension backend uses ensureConnected + registry bridge)');\n }\n return this.context;\n }\n\n private async _launchLocal(headless: boolean): Promise<void> {\n const pw = await loadPlaywrightCoreModule();\n const chromium = pw.chromium ?? (pw as { default?: { chromium?: (typeof pw)['chromium'] } }).default?.chromium;\n if (!chromium?.launch) {\n throw new Error(\n 'playwright-core did not expose chromium (try reinstall: pnpm install playwright-core; install browser: npx playwright install chromium)',\n );\n }\n this.browser = await chromium.launch({\n headless,\n ...(headless ? { channel: 'chromium' } : {}),\n args: ['--no-sandbox', '--disable-setuid-sandbox'],\n });\n this.context = await this.browser.newContext({\n viewport: { width: 1280, height: 720 },\n userAgent:\n 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',\n });\n log.info({ headless, mode: 'local' }, 'Browser launched (local)');\n }\n\n private async _connectViaCdp(wsEndpoint: string): Promise<void> {\n const pw = await loadPlaywrightCoreModule();\n const chromium = pw.chromium ?? (pw as { default?: { chromium?: (typeof pw)['chromium'] } }).default?.chromium;\n if (!chromium?.connectOverCDP) {\n throw new Error('playwright-core does not support connectOverCDP');\n }\n this.browser = await chromium.connectOverCDP(wsEndpoint);\n const contexts = this.browser.contexts();\n this.context = contexts.length > 0 ? contexts[0] : await this.browser.newContext();\n log.info({ mode: 'cdp', wsEndpoint }, 'Browser connected (CDP)');\n }\n\n private async _connectViaCloud(config: CloudBrowserProviderConfig): Promise<void> {\n const { BrowserbaseProvider } = await import('./providers/browserbase.js');\n const { BrowserUseProvider } = await import('./providers/browser-use.js');\n\n const provider = config.type === 'browserbase'\n ? new BrowserbaseProvider(config)\n : new BrowserUseProvider(config);\n\n const { browser, context } = await provider.connect();\n this.browser = browser;\n this.context = context;\n this.cloudProvider = provider;\n log.info({ mode: 'cloud', provider: config.type }, `Browser connected (${config.type})`);\n }\n\n private async _connectViaExtension(config?: ExtensionConnectionConfig): Promise<void> {\n const { acquireExtensionBrowserServer } = await import('./providers/extension-ws-acquire.js');\n const { provider, release } = await acquireExtensionBrowserServer(config);\n this.extensionProvider = provider;\n this.extensionRelease = release;\n log.info({ port: config?.port ?? 19820 }, 'Extension WS server ready, waiting for Chrome Extension...');\n await provider.waitForConnection();\n // Extension mode does not use Playwright — context stays null.\n // The action registry dispatches directly via extensionProvider.sendCommand().\n log.info({ mode: 'extension' }, 'Browser connected (Chrome Extension)');\n }\n\n private async _connectViaCloakBrowser(config?: import('./providers/types.js').CloakBrowserConfig): Promise<void> {\n const { launchCloakBrowser } = await import('./providers/cloakbrowser.js');\n const result = await launchCloakBrowser(config);\n if (!result.browser || !result.context) {\n throw new Error('BrowserManager: CloakBrowser launch did not return a Playwright connection');\n }\n this.browser = result.browser;\n this.context = result.context;\n this.cloakChildProcess = result.childProcess;\n this.cloakTempProfileDir = result.temporaryProfileDir;\n log.info({ mode: 'cloakbrowser' }, 'Browser connected (CloakBrowser)');\n }\n\n async getPage(taskId: string): Promise<Page> {\n if (this.extensionProvider) {\n throw new Error('BrowserManager.getPage is not used in Chrome Extension backend mode');\n }\n\n this.evictIdlePages();\n await this.ensureConnected();\n\n const existing = this.pages.get(taskId);\n if (existing && !existing.page.isClosed()) {\n existing.lastUsed = Date.now();\n return existing.page;\n }\n if (existing) {\n this.pages.delete(taskId);\n }\n\n if (this.pages.size >= MAX_PAGES) {\n const oldest = [...this.pages.entries()].sort((a, b) => a[1].lastUsed - b[1].lastUsed)[0];\n if (oldest) {\n await oldest[1].page.close().catch(() => {});\n this.pages.delete(oldest[0]);\n }\n }\n\n const ctx = this.context;\n if (!ctx) {\n throw new Error('BrowserManager: Playwright context missing after ensureConnected');\n }\n const page = await ctx.newPage();\n this.pages.set(taskId, { page, lastUsed: Date.now() });\n return page;\n }\n\n async closePage(taskId: string): Promise<void> {\n if (this.extensionProvider) {\n return;\n }\n const entry = this.pages.get(taskId);\n if (entry) {\n await entry.page.close().catch(() => {});\n this.pages.delete(taskId);\n }\n }\n\n /** Get the extension provider (only available in extension mode). */\n getExtensionProvider(): ExtensionBrowserProvider | null {\n return this.extensionProvider;\n }\n\n async shutdown(): Promise<void> {\n for (const [, entry] of this.pages) {\n await entry.page.close().catch(() => {});\n }\n this.pages.clear();\n\n if (this.cloudProvider) {\n await this.cloudProvider.disconnect().catch(() => {});\n this.cloudProvider = null;\n }\n\n if (this.extensionRelease) {\n await this.extensionRelease().catch(() => {});\n this.extensionRelease = null;\n }\n this.extensionProvider = null;\n\n // CloakBrowser cleanup — kill child process and remove temp profile\n if (this.cloakChildProcess || this.cloakTempProfileDir) {\n const { cleanupCloakBrowser } = await import('./providers/cloakbrowser.js');\n await cleanupCloakBrowser(this.cloakChildProcess, this.cloakTempProfileDir).catch(() => {});\n this.cloakChildProcess = null;\n this.cloakTempProfileDir = null;\n }\n\n await this.context?.close().catch(() => {});\n await this.browser?.close().catch(() => {});\n this.context = null;\n this.browser = null;\n this.activeBackendMode = null;\n log.info('Browser shut down');\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,15 +1,15 @@
|
|
|
1
1
|
import { PACKAGE_VERSION, init_package_version } from "../../package-version.js";
|
|
2
|
-
import {
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomic } from "../../infra/write-file-atomic.js";
|
|
3
3
|
import { createLogger } from "../../utils/logger/index.js";
|
|
4
4
|
import { init_logger } from "../../utils/logger.js";
|
|
5
5
|
import { init_paths, resolveBinDir } from "../../config/paths.js";
|
|
6
|
-
import {
|
|
6
|
+
import { assertCacheDir, init_cache_dir_policy } from "../cache-dir-policy.js";
|
|
7
7
|
import { resolvePackageRoot } from "../../infra/update-check.js";
|
|
8
|
-
import { dirname, join } from "node:path";
|
|
9
8
|
import { existsSync, mkdirSync, readFileSync, realpathSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
10
9
|
import { readFile, readdir, rm } from "node:fs/promises";
|
|
11
|
-
import {
|
|
10
|
+
import { dirname, join } from "node:path";
|
|
12
11
|
import { fileURLToPath } from "node:url";
|
|
12
|
+
import { spawn } from "node:child_process";
|
|
13
13
|
//#region src/browser/providers/browser-ext-install.ts
|
|
14
14
|
/**
|
|
15
15
|
* Install bundled Chrome extension artifacts into {resolveBinDir()}/browser-ext/{version}/.
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { loadPlaywrightCoreModule } from "./playwright-doctor.js";
|
|
3
4
|
//#region src/browser/providers/browser-use.ts
|
|
4
5
|
init_logger();
|
|
5
6
|
const log = createLogger("BrowserProvider:BrowserUse");
|
|
@@ -37,7 +38,7 @@ var BrowserUseProvider = class {
|
|
|
37
38
|
}
|
|
38
39
|
const session = await response.json();
|
|
39
40
|
this.sessionId = session.session_id;
|
|
40
|
-
const pw = await
|
|
41
|
+
const pw = await loadPlaywrightCoreModule();
|
|
41
42
|
const chromium = pw.chromium ?? pw.default?.chromium;
|
|
42
43
|
if (!chromium?.connectOverCDP) throw new Error("playwright-core does not support connectOverCDP");
|
|
43
44
|
this.browser = await chromium.connectOverCDP(session.ws_url);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-use.js","names":[],"sources":["../../../../src/browser/providers/browser-use.ts"],"sourcesContent":["import type { Browser, BrowserContext } from 'playwright-core';\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport type { CloudBrowserProvider, CloudBrowserProviderConfig } from './types.js';\n\nconst log = createLogger('BrowserProvider:BrowserUse');\n\n/**\n * Browser Use cloud browser provider.\n *\n * Connects to a Browser Use-managed session via CDP WebSocket.\n * Requires `BROWSER_USE_API_KEY` or config-level `apiKey`.\n *\n * @see https://docs.browser-use.com\n */\nexport class BrowserUseProvider implements CloudBrowserProvider {\n readonly name = 'browser-use';\n\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private sessionId: string | null = null;\n private readonly config: CloudBrowserProviderConfig;\n\n constructor(config: CloudBrowserProviderConfig) {\n this.config = config;\n }\n\n async connect(): Promise<{ browser: Browser; context: BrowserContext }> {\n const apiKey = this.config.apiKey || process.env.BROWSER_USE_API_KEY;\n if (!apiKey) {\n throw new Error('Browser Use API key not configured (set BROWSER_USE_API_KEY or browser.cloudProvider config)');\n }\n\n // Create a Browser Use session via REST API\n const createUrl = 'https://api.browser-use.com/api/v1/sessions';\n const response = await fetch(createUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown');\n throw new Error(`Browser Use session creation failed (${response.status}): ${errorText}`);\n }\n\n const session = (await response.json()) as { session_id: string; ws_url: string };\n this.sessionId = session.session_id;\n\n const pw = await
|
|
1
|
+
{"version":3,"file":"browser-use.js","names":[],"sources":["../../../../src/browser/providers/browser-use.ts"],"sourcesContent":["import type { Browser, BrowserContext } from 'playwright-core';\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport { loadPlaywrightCoreModule } from './playwright-doctor.js';\n\nimport type { CloudBrowserProvider, CloudBrowserProviderConfig } from './types.js';\n\nconst log = createLogger('BrowserProvider:BrowserUse');\n\n/**\n * Browser Use cloud browser provider.\n *\n * Connects to a Browser Use-managed session via CDP WebSocket.\n * Requires `BROWSER_USE_API_KEY` or config-level `apiKey`.\n *\n * @see https://docs.browser-use.com\n */\nexport class BrowserUseProvider implements CloudBrowserProvider {\n readonly name = 'browser-use';\n\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private sessionId: string | null = null;\n private readonly config: CloudBrowserProviderConfig;\n\n constructor(config: CloudBrowserProviderConfig) {\n this.config = config;\n }\n\n async connect(): Promise<{ browser: Browser; context: BrowserContext }> {\n const apiKey = this.config.apiKey || process.env.BROWSER_USE_API_KEY;\n if (!apiKey) {\n throw new Error('Browser Use API key not configured (set BROWSER_USE_API_KEY or browser.cloudProvider config)');\n }\n\n // Create a Browser Use session via REST API\n const createUrl = 'https://api.browser-use.com/api/v1/sessions';\n const response = await fetch(createUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({}),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown');\n throw new Error(`Browser Use session creation failed (${response.status}): ${errorText}`);\n }\n\n const session = (await response.json()) as { session_id: string; ws_url: string };\n this.sessionId = session.session_id;\n\n const pw = await loadPlaywrightCoreModule();\n const chromium = pw.chromium ?? (pw as { default?: { chromium?: (typeof pw)['chromium'] } }).default?.chromium;\n if (!chromium?.connectOverCDP) {\n throw new Error('playwright-core does not support connectOverCDP');\n }\n\n this.browser = await chromium.connectOverCDP(session.ws_url);\n const contexts = this.browser.contexts();\n this.context = contexts.length > 0 ? contexts[0] : await this.browser.newContext();\n\n log.info({ sessionId: this.sessionId }, 'Connected to Browser Use');\n return { browser: this.browser, context: this.context };\n }\n\n async disconnect(): Promise<void> {\n if (this.browser) {\n await this.browser.close().catch(() => {});\n this.browser = null;\n this.context = null;\n log.info({ sessionId: this.sessionId }, 'Disconnected from Browser Use');\n this.sessionId = null;\n }\n }\n\n isConnected(): boolean {\n return this.browser !== null && this.browser.isConnected();\n }\n}\n"],"mappings":";;;;aAEqD;AAMrD,MAAM,MAAM,aAAa,6BAA6B;;;;;;;;;AAUtD,IAAa,qBAAb,MAAgE;CAC9D,OAAgB;CAEhB,UAAkC;CAClC,UAAyC;CACzC,YAAmC;CACnC;CAEA,YAAY,QAAoC;AAC9C,OAAK,SAAS;;CAGhB,MAAM,UAAkE;EACtE,MAAM,SAAS,KAAK,OAAO,UAAU,QAAQ,IAAI;AACjD,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,+FAA+F;EAKjH,MAAM,WAAW,MAAM,MAAM,+CAAW;GACtC,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,eAAe,UAAU;IAC1B;GACD,MAAM,KAAK,UAAU,EAAE,CAAC;GACzB,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,YAAY,MAAM,SAAS,MAAM,CAAC,YAAY,UAAU;AAC9D,SAAM,IAAI,MAAM,wCAAwC,SAAS,OAAO,KAAK,YAAY;;EAG3F,MAAM,UAAW,MAAM,SAAS,MAAM;AACtC,OAAK,YAAY,QAAQ;EAEzB,MAAM,KAAK,MAAM,0BAA0B;EAC3C,MAAM,WAAW,GAAG,YAAa,GAA4D,SAAS;AACtG,MAAI,CAAC,UAAU,eACb,OAAM,IAAI,MAAM,kDAAkD;AAGpE,OAAK,UAAU,MAAM,SAAS,eAAe,QAAQ,OAAO;EAC5D,MAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,OAAK,UAAU,SAAS,SAAS,IAAI,SAAS,KAAK,MAAM,KAAK,QAAQ,YAAY;AAElF,MAAI,KAAK,EAAE,WAAW,KAAK,WAAW,EAAE,2BAA2B;AACnE,SAAO;GAAE,SAAS,KAAK;GAAS,SAAS,KAAK;GAAS;;CAGzD,MAAM,aAA4B;AAChC,MAAI,KAAK,SAAS;AAChB,SAAM,KAAK,QAAQ,OAAO,CAAC,YAAY,GAAG;AAC1C,QAAK,UAAU;AACf,QAAK,UAAU;AACf,OAAI,KAAK,EAAE,WAAW,KAAK,WAAW,EAAE,gCAAgC;AACxE,QAAK,YAAY;;;CAIrB,cAAuB;AACrB,SAAO,KAAK,YAAY,QAAQ,KAAK,QAAQ,aAAa"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../../utils/logger.js";
|
|
3
|
+
import { loadPlaywrightCoreModule } from "./playwright-doctor.js";
|
|
3
4
|
//#region src/browser/providers/browserbase.ts
|
|
4
5
|
init_logger();
|
|
5
6
|
const log = createLogger("BrowserProvider:Browserbase");
|
|
@@ -43,7 +44,7 @@ var BrowserbaseProvider = class {
|
|
|
43
44
|
const session = await response.json();
|
|
44
45
|
this.sessionId = session.id;
|
|
45
46
|
const connectUrl = session.connectUrl || `wss://connect.browserbase.com?apiKey=${apiKey}&sessionId=${session.id}`;
|
|
46
|
-
const pw = await
|
|
47
|
+
const pw = await loadPlaywrightCoreModule();
|
|
47
48
|
const chromium = pw.chromium ?? pw.default?.chromium;
|
|
48
49
|
if (!chromium?.connectOverCDP) throw new Error("playwright-core does not support connectOverCDP");
|
|
49
50
|
this.browser = await chromium.connectOverCDP(connectUrl);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browserbase.js","names":[],"sources":["../../../../src/browser/providers/browserbase.ts"],"sourcesContent":["import type { Browser, BrowserContext } from 'playwright-core';\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport type { CloudBrowserProvider, CloudBrowserProviderConfig } from './types.js';\n\nconst log = createLogger('BrowserProvider:Browserbase');\n\n/**\n * Browserbase cloud browser provider.\n *\n * Connects to a Browserbase-managed Chromium instance via CDP WebSocket.\n * Requires `BROWSERBASE_API_KEY` or config-level `apiKey`, plus an optional `projectId`.\n *\n * @see https://docs.browserbase.com\n */\nexport class BrowserbaseProvider implements CloudBrowserProvider {\n readonly name = 'browserbase';\n\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private sessionId: string | null = null;\n private readonly config: CloudBrowserProviderConfig;\n\n constructor(config: CloudBrowserProviderConfig) {\n this.config = config;\n }\n\n async connect(): Promise<{ browser: Browser; context: BrowserContext }> {\n const apiKey = this.config.apiKey || process.env.BROWSERBASE_API_KEY;\n if (!apiKey) {\n throw new Error('Browserbase API key not configured (set BROWSERBASE_API_KEY or browser.cloudProvider config)');\n }\n\n const projectId = this.config.projectId || process.env.BROWSERBASE_PROJECT_ID;\n\n // Create a Browserbase session via REST API\n const createUrl = 'https://www.browserbase.com/v1/sessions';\n const body: Record<string, unknown> = {};\n if (projectId) body.projectId = projectId;\n if (this.config.region) body.region = this.config.region;\n\n const response = await fetch(createUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-bb-api-key': apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown');\n throw new Error(`Browserbase session creation failed (${response.status}): ${errorText}`);\n }\n\n const session = (await response.json()) as { id: string; connectUrl?: string };\n this.sessionId = session.id;\n\n // Connect via CDP\n const connectUrl =\n session.connectUrl || `wss://connect.browserbase.com?apiKey=${apiKey}&sessionId=${session.id}`;\n\n const pw = await
|
|
1
|
+
{"version":3,"file":"browserbase.js","names":[],"sources":["../../../../src/browser/providers/browserbase.ts"],"sourcesContent":["import type { Browser, BrowserContext } from 'playwright-core';\n\nimport { createLogger } from '../../utils/logger.js';\n\nimport { loadPlaywrightCoreModule } from './playwright-doctor.js';\n\nimport type { CloudBrowserProvider, CloudBrowserProviderConfig } from './types.js';\n\nconst log = createLogger('BrowserProvider:Browserbase');\n\n/**\n * Browserbase cloud browser provider.\n *\n * Connects to a Browserbase-managed Chromium instance via CDP WebSocket.\n * Requires `BROWSERBASE_API_KEY` or config-level `apiKey`, plus an optional `projectId`.\n *\n * @see https://docs.browserbase.com\n */\nexport class BrowserbaseProvider implements CloudBrowserProvider {\n readonly name = 'browserbase';\n\n private browser: Browser | null = null;\n private context: BrowserContext | null = null;\n private sessionId: string | null = null;\n private readonly config: CloudBrowserProviderConfig;\n\n constructor(config: CloudBrowserProviderConfig) {\n this.config = config;\n }\n\n async connect(): Promise<{ browser: Browser; context: BrowserContext }> {\n const apiKey = this.config.apiKey || process.env.BROWSERBASE_API_KEY;\n if (!apiKey) {\n throw new Error('Browserbase API key not configured (set BROWSERBASE_API_KEY or browser.cloudProvider config)');\n }\n\n const projectId = this.config.projectId || process.env.BROWSERBASE_PROJECT_ID;\n\n // Create a Browserbase session via REST API\n const createUrl = 'https://www.browserbase.com/v1/sessions';\n const body: Record<string, unknown> = {};\n if (projectId) body.projectId = projectId;\n if (this.config.region) body.region = this.config.region;\n\n const response = await fetch(createUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n 'x-bb-api-key': apiKey,\n },\n body: JSON.stringify(body),\n });\n\n if (!response.ok) {\n const errorText = await response.text().catch(() => 'unknown');\n throw new Error(`Browserbase session creation failed (${response.status}): ${errorText}`);\n }\n\n const session = (await response.json()) as { id: string; connectUrl?: string };\n this.sessionId = session.id;\n\n // Connect via CDP\n const connectUrl =\n session.connectUrl || `wss://connect.browserbase.com?apiKey=${apiKey}&sessionId=${session.id}`;\n\n const pw = await loadPlaywrightCoreModule();\n const chromium = pw.chromium ?? (pw as { default?: { chromium?: (typeof pw)['chromium'] } }).default?.chromium;\n if (!chromium?.connectOverCDP) {\n throw new Error('playwright-core does not support connectOverCDP');\n }\n\n this.browser = await chromium.connectOverCDP(connectUrl);\n const contexts = this.browser.contexts();\n this.context = contexts.length > 0 ? contexts[0] : await this.browser.newContext();\n\n log.info({ sessionId: this.sessionId }, 'Connected to Browserbase');\n return { browser: this.browser, context: this.context };\n }\n\n async disconnect(): Promise<void> {\n if (this.browser) {\n await this.browser.close().catch(() => {});\n this.browser = null;\n this.context = null;\n log.info({ sessionId: this.sessionId }, 'Disconnected from Browserbase');\n this.sessionId = null;\n }\n }\n\n isConnected(): boolean {\n return this.browser !== null && this.browser.isConnected();\n }\n}\n"],"mappings":";;;;aAEqD;AAMrD,MAAM,MAAM,aAAa,8BAA8B;;;;;;;;;AAUvD,IAAa,sBAAb,MAAiE;CAC/D,OAAgB;CAEhB,UAAkC;CAClC,UAAyC;CACzC,YAAmC;CACnC;CAEA,YAAY,QAAoC;AAC9C,OAAK,SAAS;;CAGhB,MAAM,UAAkE;EACtE,MAAM,SAAS,KAAK,OAAO,UAAU,QAAQ,IAAI;AACjD,MAAI,CAAC,OACH,OAAM,IAAI,MAAM,+FAA+F;EAGjH,MAAM,YAAY,KAAK,OAAO,aAAa,QAAQ,IAAI;EAGvD,MAAM,YAAY;EAClB,MAAM,OAAgC,EAAE;AACxC,MAAI,UAAW,MAAK,YAAY;AAChC,MAAI,KAAK,OAAO,OAAQ,MAAK,SAAS,KAAK,OAAO;EAElD,MAAM,WAAW,MAAM,MAAM,WAAW;GACtC,QAAQ;GACR,SAAS;IACP,gBAAgB;IAChB,gBAAgB;IACjB;GACD,MAAM,KAAK,UAAU,KAAK;GAC3B,CAAC;AAEF,MAAI,CAAC,SAAS,IAAI;GAChB,MAAM,YAAY,MAAM,SAAS,MAAM,CAAC,YAAY,UAAU;AAC9D,SAAM,IAAI,MAAM,wCAAwC,SAAS,OAAO,KAAK,YAAY;;EAG3F,MAAM,UAAW,MAAM,SAAS,MAAM;AACtC,OAAK,YAAY,QAAQ;EAGzB,MAAM,aACJ,QAAQ,cAAc,wCAAwC,OAAO,aAAa,QAAQ;EAE5F,MAAM,KAAK,MAAM,0BAA0B;EAC3C,MAAM,WAAW,GAAG,YAAa,GAA4D,SAAS;AACtG,MAAI,CAAC,UAAU,eACb,OAAM,IAAI,MAAM,kDAAkD;AAGpE,OAAK,UAAU,MAAM,SAAS,eAAe,WAAW;EACxD,MAAM,WAAW,KAAK,QAAQ,UAAU;AACxC,OAAK,UAAU,SAAS,SAAS,IAAI,SAAS,KAAK,MAAM,KAAK,QAAQ,YAAY;AAElF,MAAI,KAAK,EAAE,WAAW,KAAK,WAAW,EAAE,2BAA2B;AACnE,SAAO;GAAE,SAAS,KAAK;GAAS,SAAS,KAAK;GAAS;;CAGzD,MAAM,aAA4B;AAChC,MAAI,KAAK,SAAS;AAChB,SAAM,KAAK,QAAQ,OAAO,CAAC,YAAY,GAAG;AAC1C,QAAK,UAAU;AACf,QAAK,UAAU;AACf,OAAI,KAAK,EAAE,WAAW,KAAK,WAAW,EAAE,gCAAgC;AACxE,QAAK,YAAY;;;CAIrB,cAAuB;AACrB,SAAO,KAAK,YAAY,QAAQ,KAAK,QAAQ,aAAa"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
-
import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
|
|
2
1
|
import { createLogger } from "../../utils/logger/index.js";
|
|
3
2
|
import { init_logger } from "../../utils/logger.js";
|
|
4
3
|
import { init_paths, resolveBinDir } from "../../config/paths.js";
|
|
4
|
+
import { assertCacheDir, expandHome, init_cache_dir_policy } from "../cache-dir-policy.js";
|
|
5
|
+
import { loadPlaywrightCoreModule } from "./playwright-doctor.js";
|
|
5
6
|
import { WEBDRIVER_OVERRIDE_SCRIPT, buildStealthArgs, filterCloakBrowserExtraArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "../stealth.js";
|
|
6
7
|
import { pickFreePort } from "../free-port.js";
|
|
7
|
-
import { join, resolve } from "node:path";
|
|
8
|
-
import { arch, platform, tmpdir } from "node:os";
|
|
9
|
-
import { createReadStream, createWriteStream } from "node:fs";
|
|
10
8
|
import { createHash } from "node:crypto";
|
|
9
|
+
import { createReadStream, createWriteStream } from "node:fs";
|
|
11
10
|
import { mkdir, mkdtemp, readdir, rename, rm, stat } from "node:fs/promises";
|
|
11
|
+
import { join, resolve } from "node:path";
|
|
12
|
+
import { arch, platform, tmpdir } from "node:os";
|
|
12
13
|
import { spawn } from "node:child_process";
|
|
13
14
|
import { Readable, Transform } from "node:stream";
|
|
14
15
|
import AdmZip from "adm-zip";
|
|
@@ -482,7 +483,7 @@ async function launchCloakBrowser(config = {}) {
|
|
|
482
483
|
log.info({ port: cdpPort }, "Reusing existing CloakBrowser instance");
|
|
483
484
|
const meta = launchResultMeta(cdpPort, userDataDir, true, null, null, null);
|
|
484
485
|
if (skipPlaywrightConnect) return meta;
|
|
485
|
-
const pw = await
|
|
486
|
+
const pw = await loadPlaywrightCoreModule();
|
|
486
487
|
const chromium = pw.chromium ?? pw.default?.chromium;
|
|
487
488
|
if (!chromium?.connectOverCDP) throw new Error("playwright-core does not support connectOverCDP");
|
|
488
489
|
const wsUrl = `ws://127.0.0.1:${cdpPort}`;
|
|
@@ -578,7 +579,7 @@ async function launchCloakBrowser(config = {}) {
|
|
|
578
579
|
}, "CloakBrowser launched (CDP only)");
|
|
579
580
|
return meta;
|
|
580
581
|
}
|
|
581
|
-
const pw = await
|
|
582
|
+
const pw = await loadPlaywrightCoreModule();
|
|
582
583
|
const chromium = pw.chromium ?? pw.default?.chromium;
|
|
583
584
|
if (!chromium?.connectOverCDP) {
|
|
584
585
|
child.kill();
|