@xopcai/xopc 0.0.115 → 0.0.117
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 +26 -10
- package/README.zh-CN.md +26 -10
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/demo-memory/src/index.d.ts +6 -0
- package/dist/extensions/demo-memory/src/index.js +132 -0
- package/dist/extensions/demo-memory/src/index.js.map +1 -0
- package/dist/extensions/demo-memory/xopc.extension.json +15 -0
- package/dist/extensions/feishu/src/schema/config-schema.d.ts +3 -3
- package/dist/extensions/telegram/src/command-handler.js +1 -2
- package/dist/extensions/telegram/src/command-handler.js.map +1 -1
- package/dist/extensions/telegram/src/config-schema.d.ts +8 -8
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/config-schema.d.ts +3 -3
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-DVnBfANm.js → agent-avatar-dicebear-BBLhJ2C6.js} +1 -1
- package/dist/gateway/static/root/assets/agents-C6xgagZd.js +71 -0
- package/dist/gateway/static/root/assets/app-management-settings-panel-CBpLONvG.js +1 -0
- package/dist/gateway/static/root/assets/{appearance-settings-BQpPSTHD.js → appearance-settings-CGcc54yj.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-DdDx0V4z.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-CXu-Csep.js → archive-plugin-DZsVqMhU.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-BAjgOoGY.js → attachment-load-CIol6JWX.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-BSBgB2hO.js → binary-plugins-B3UauMfp.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-BpXw9TTR.js → block-editor-2HJoFchH.js} +3 -3
- package/dist/gateway/static/root/assets/browser-settings-page-CUOO-PQk.js +8 -0
- package/dist/gateway/static/root/assets/capability-presets-api-XQoMTI0A.js +1 -0
- package/dist/gateway/static/root/assets/capability-presets-settings-panel-CfqF-kGr.js +1 -0
- package/dist/gateway/static/root/assets/{channels-settings-BbPUpzWB.js → channels-settings-BYyRzsex.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-page-DIvEz4NX.js +2 -0
- package/dist/gateway/static/root/assets/cron-api-R41aQCX9.js +1 -0
- package/dist/gateway/static/root/assets/cron-page-D97nFqQD.js +3 -0
- package/dist/gateway/static/root/assets/dreaming-settings-Bceaw1PG.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-D9kgUHCc.js → extension-debug-page-DX5WRE_t.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CGyhXqzR.js → extension-page-Buah7Bw-.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DL8Xquqd.js → extension-settings-page-DuroLVnf.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-D0VXA932.js → fetch-B5zdl27C.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-Be8SmgUw.js → format-interval-label-Dn_QKIqb.js} +1 -1
- package/dist/gateway/static/root/assets/gateway-config-api-gT4ZhE7h.js +1 -0
- package/dist/gateway/static/root/assets/gateway-settings-iISWAZRm.js +1 -0
- package/dist/gateway/static/root/assets/{gateway-startup-retry-DERUH61L.js → gateway-startup-retry-B3kL8KGY.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-DCUROLMQ.js +1 -0
- package/dist/gateway/static/root/assets/{goals-config-api-BPmqWk90.js → goals-config-api-AR-fVh0P.js} +1 -1
- package/dist/gateway/static/root/assets/goals-page-Cpb21ezg.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-CPAuFwoD.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-Bfdzr8oV.js → heartbeat-config-api-D7bKFEeO.js} +1 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-CC69vNx0.js +1 -0
- package/dist/gateway/static/root/assets/index-CwhK8qCh.js +122 -0
- package/dist/gateway/static/root/assets/index-CyfhARL-.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-utKbuCRY.js → interval-presets-0DtsnxE0.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-CjqS6c6V.js → keyboard-shortcuts-settings-BPREtN8B.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DefCgF4o.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-DW8C47iB.js → markdown-split-ChbR9LGO.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-D6HwDhDT.js → media-plugins-B82oP80n.js} +1 -1
- package/dist/gateway/static/root/assets/messages-Cf1O9JB0.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-DmKiIihT.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-CxxfLRJZ.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-pJM35Pz5.js → note-image-lightbox-CDknITM3.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-X2slSx7V.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-CVwHuyN6.js → preview-open-alternatives-DV3xQsWB.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BvmUWqgu.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-Ba-UEk7x.js → save-bar-controls-BODCXnvY.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CNN9595U.js → schedule-field-CgJSCD3B.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-DnNMmtD5.js → schema-form-qtfEI6QM.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-B0yESuuL.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-q2M8RKOo.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-CmOz80i5.js → settings-collapsible-section-BHZKjVcS.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-BmK7JJOV.js → settings-form-section-5i35D-J1.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-CGozabLD.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-FoOSe6nU.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-Dp2qGrHC.js → share-preview-page-B0H63tDv.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Cy5zWyYQ.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-DaZNFro9.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-CnwtUzvw.js +2 -0
- package/dist/gateway/static/root/assets/system-settings-panel-DXs2VmBt.js +1 -0
- package/dist/gateway/static/root/assets/typed-models-lib-4gPuydz_.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-CHlO8J9G.js → use-channel-catalog-BCjP_VHb.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DvKiOglO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-DDDWYHvg.js → voice-player-store-BlF9V05n.js} +1 -1
- package/dist/gateway/static/root/assets/workflows-page-CAVZcONQ.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +1 -1
- package/dist/src/agent/agent-manager.js +7 -8
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +6 -8
- package/dist/src/agent/agent-scope.js.map +1 -1
- package/dist/src/agent/background-review/coordinator.js +0 -1
- package/dist/src/agent/background-review/coordinator.js.map +1 -1
- package/dist/src/agent/background-review/run-background-review.d.ts +0 -2
- package/dist/src/agent/background-review/run-background-review.js +2 -4
- package/dist/src/agent/background-review/run-background-review.js.map +1 -1
- package/dist/src/agent/background-review/settings.js +8 -7
- package/dist/src/agent/background-review/settings.js.map +1 -1
- package/dist/src/agent/bootstrap/bootstrap-context.d.ts +2 -2
- package/dist/src/agent/bootstrap/bootstrap-context.js +4 -4
- package/dist/src/agent/bootstrap/bootstrap-context.js.map +1 -1
- package/dist/src/agent/context/workspace-seed.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js +1 -1
- package/dist/src/agent/embedded/run-for-session.js.map +1 -1
- package/dist/src/agent/fallback/candidates.js +6 -3
- package/dist/src/agent/fallback/candidates.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +1 -1
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -0
- package/dist/src/agent/goals/evaluate-turn.js +1 -0
- package/dist/src/agent/goals/evaluate-turn.js.map +1 -1
- package/dist/src/agent/goals/post-turn.js +8 -1
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/generation/runtime-types.d.ts +2 -0
- package/dist/src/agent/image/generation/runtime.js +1 -1
- package/dist/src/agent/image/generation/runtime.js.map +1 -1
- package/dist/src/agent/image/image-helpers.d.ts +1 -1
- package/dist/src/agent/image/image-helpers.js +4 -17
- package/dist/src/agent/image/image-helpers.js.map +1 -1
- package/dist/src/agent/image/image-model-fallback.js +1 -1
- package/dist/src/agent/image/image-model-fallback.js.map +1 -1
- package/dist/src/agent/image/inbound-image-handling.js +1 -1
- package/dist/src/agent/image/inbound-image-handling.js.map +1 -1
- package/dist/src/agent/image/tool-model-config.d.ts +1 -1
- package/dist/src/agent/image/tool-model-config.js +2 -2
- package/dist/src/agent/image/tool-model-config.js.map +1 -1
- package/dist/src/agent/image/understanding/pi-ai-provider.js +5 -2
- package/dist/src/agent/image/understanding/pi-ai-provider.js.map +1 -1
- package/dist/src/agent/image/understanding/provider-registry.d.ts +1 -0
- package/dist/src/agent/image/understanding/provider-registry.js +16 -2
- package/dist/src/agent/image/understanding/provider-registry.js.map +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js +1 -1
- package/dist/src/agent/mcp/resolve-embedded-mcp-tools.js.map +1 -1
- package/dist/src/agent/media-generation/runtime-shared.d.ts +5 -2
- package/dist/src/agent/media-generation/runtime-shared.js +1 -1
- package/dist/src/agent/media-generation/runtime-shared.js.map +1 -1
- package/dist/src/agent/memory/builtin-memory-store.d.ts +2 -0
- package/dist/src/agent/memory/builtin-memory-store.js +4 -0
- package/dist/src/agent/memory/builtin-memory-store.js.map +1 -1
- package/dist/src/agent/memory/builtin-provider.d.ts +31 -9
- package/dist/src/agent/memory/builtin-provider.js +261 -11
- package/dist/src/agent/memory/builtin-provider.js.map +1 -1
- package/dist/src/agent/memory/context-assembler.d.ts +10 -0
- package/dist/src/agent/memory/context-assembler.js +26 -0
- package/dist/src/agent/memory/context-assembler.js.map +1 -0
- package/dist/src/agent/memory/create-memory-manager.js +25 -7
- package/dist/src/agent/memory/create-memory-manager.js.map +1 -1
- package/dist/src/agent/memory/dreaming/config.d.ts +1 -6
- package/dist/src/agent/memory/dreaming/config.js +8 -8
- package/dist/src/agent/memory/dreaming/config.js.map +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.d.ts +2 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js +24 -0
- package/dist/src/agent/memory/dreaming/deep-promotion.js.map +1 -1
- package/dist/src/agent/memory/index.d.ts +1 -0
- package/dist/src/agent/memory/index.js +4 -3
- package/dist/src/agent/memory/inject-prefetch.js +6 -2
- package/dist/src/agent/memory/inject-prefetch.js.map +1 -1
- package/dist/src/agent/memory/manager.d.ts +37 -1
- package/dist/src/agent/memory/manager.js +332 -40
- package/dist/src/agent/memory/manager.js.map +1 -1
- package/dist/src/agent/memory/memory-config.js +12 -15
- package/dist/src/agent/memory/memory-config.js.map +1 -1
- package/dist/src/agent/memory/plugin-discovery.d.ts +19 -5
- package/dist/src/agent/memory/plugin-discovery.js +97 -31
- package/dist/src/agent/memory/plugin-discovery.js.map +1 -1
- package/dist/src/agent/memory/provider.d.ts +20 -15
- package/dist/src/agent/memory/stub-memory-provider.d.ts +17 -2
- package/dist/src/agent/memory/stub-memory-provider.js +20 -3
- package/dist/src/agent/memory/stub-memory-provider.js.map +1 -1
- package/dist/src/agent/memory/types.d.ts +136 -0
- package/dist/src/agent/models/manager.d.ts +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/models/manager.js.map +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.d.ts +1 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js +2 -1
- package/dist/src/agent/orchestration/agent-orchestrator.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.d.ts +2 -2
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-fallbacks.js.map +1 -1
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.d.ts +2 -6
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js +2 -8
- package/dist/src/agent/orchestration/run-agent-turn-with-timeout.js.map +1 -1
- package/dist/src/agent/reply/post-compaction-context.js +11 -6
- package/dist/src/agent/reply/post-compaction-context.js.map +1 -1
- package/dist/src/agent/reply/startup-context.js +8 -9
- package/dist/src/agent/reply/startup-context.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.js +1 -4
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service/session-context-report.js +1 -1
- package/dist/src/agent/service/session-context-report.js.map +1 -1
- package/dist/src/agent/service.js +21 -25
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +1 -2
- package/dist/src/agent/session/session-hydrator.js +1 -2
- package/dist/src/agent/session/session-hydrator.js.map +1 -1
- package/dist/src/agent/session/session-inspector.d.ts +1 -1
- package/dist/src/agent/session/session-inspector.js +9 -14
- package/dist/src/agent/session/session-inspector.js.map +1 -1
- package/dist/src/agent/skills/hub-pull.js +1 -1
- package/dist/src/agent/starter-agents.d.ts +1 -3
- package/dist/src/agent/starter-agents.js +13 -21
- package/dist/src/agent/starter-agents.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +1 -2
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/composio-tool.d.ts +8 -0
- package/dist/src/agent/tools/composio-tool.js +46 -0
- package/dist/src/agent/tools/composio-tool.js.map +1 -0
- package/dist/src/agent/tools/curated-memory-tool.d.ts +2 -5
- package/dist/src/agent/tools/curated-memory-tool.js +20 -16
- package/dist/src/agent/tools/curated-memory-tool.js.map +1 -1
- package/dist/src/agent/tools/factory.d.ts +0 -4
- package/dist/src/agent/tools/factory.js +32 -66
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/image-generate-tool.d.ts +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +19 -14
- package/dist/src/agent/tools/image-generate-tool.js.map +1 -1
- package/dist/src/agent/tools/image-tool.js +1 -3
- package/dist/src/agent/tools/image-tool.js.map +1 -1
- package/dist/src/agent/tools/index.d.ts +1 -0
- package/dist/src/agent/tools/index.js +2 -1
- package/dist/src/agent/tools/memory-tool.d.ts +2 -2
- package/dist/src/agent/tools/memory-tool.js +39 -14
- package/dist/src/agent/tools/memory-tool.js.map +1 -1
- package/dist/src/agent/tools/session-search-tool.js +1 -3
- package/dist/src/agent/tools/session-search-tool.js.map +1 -1
- package/dist/src/agent/tools/web-extract.js +6 -5
- package/dist/src/agent/tools/web-extract.js.map +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/audit-repo.js +15 -2
- package/dist/src/agent/workflow/builtins/audit-repo.js.map +1 -1
- package/dist/src/agent/workflow/builtins/client-proposal.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/client-proposal.js +10 -1
- package/dist/src/agent/workflow/builtins/client-proposal.js.map +1 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/competitor-scan.js +16 -2
- package/dist/src/agent/workflow/builtins/competitor-scan.js.map +1 -1
- package/dist/src/agent/workflow/builtins/content-draft.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/content-draft.js +15 -2
- package/dist/src/agent/workflow/builtins/content-draft.js.map +1 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.js +10 -1
- package/dist/src/agent/workflow/builtins/content-repurpose.js.map +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js +9 -1
- package/dist/src/agent/workflow/builtins/debug-incident.js.map +1 -1
- package/dist/src/agent/workflow/builtins/decision-compare.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/decision-compare.js +16 -2
- package/dist/src/agent/workflow/builtins/decision-compare.js.map +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.js +11 -1
- package/dist/src/agent/workflow/builtins/implementation-plan.js.map +1 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.js +11 -1
- package/dist/src/agent/workflow/builtins/inbox-triage.js.map +1 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.js +9 -1
- package/dist/src/agent/workflow/builtins/meeting-prep.js.map +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js +9 -1
- package/dist/src/agent/workflow/builtins/multi-perspective-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/offer-design.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/offer-design.js +10 -1
- package/dist/src/agent/workflow/builtins/offer-design.js.map +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/pr-review.js +9 -1
- package/dist/src/agent/workflow/builtins/pr-review.js.map +1 -1
- package/dist/src/agent/workflow/builtins/release-check.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/release-check.js +10 -1
- package/dist/src/agent/workflow/builtins/release-check.js.map +1 -1
- package/dist/src/agent/workflow/builtins/research.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/research.js +16 -2
- package/dist/src/agent/workflow/builtins/research.js.map +1 -1
- package/dist/src/agent/workflow/builtins/weekly-review.d.ts +1 -1
- package/dist/src/agent/workflow/builtins/weekly-review.js +9 -1
- package/dist/src/agent/workflow/builtins/weekly-review.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +1 -3
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/agent-manifest/index.d.ts +4 -0
- package/dist/src/agent-manifest/index.js +10 -0
- package/dist/src/agent-manifest/index.js.map +1 -0
- package/dist/src/agent-manifest/prompt.d.ts +2 -0
- package/dist/src/agent-manifest/prompt.js +57 -0
- package/dist/src/agent-manifest/prompt.js.map +1 -0
- package/dist/src/agent-manifest/resolver.d.ts +11 -0
- package/dist/src/agent-manifest/resolver.js +93 -0
- package/dist/src/agent-manifest/resolver.js.map +1 -0
- package/dist/src/agent-manifest/schema.d.ts +778 -0
- package/dist/src/agent-manifest/schema.js +267 -0
- package/dist/src/agent-manifest/schema.js.map +1 -0
- package/dist/src/agent-manifest/validator.d.ts +24 -0
- package/dist/src/agent-manifest/validator.js +87 -0
- package/dist/src/agent-manifest/validator.js.map +1 -0
- package/dist/src/agent-runtime/boundary-guard.d.ts +12 -0
- package/dist/src/agent-runtime/boundary-guard.js +23 -0
- package/dist/src/agent-runtime/boundary-guard.js.map +1 -0
- package/dist/src/agent-runtime/index.d.ts +7 -0
- package/dist/src/agent-runtime/index.js +8 -0
- package/dist/src/agent-runtime/memory-runtime.d.ts +21 -0
- package/dist/src/agent-runtime/memory-runtime.js +50 -0
- package/dist/src/agent-runtime/memory-runtime.js.map +1 -0
- package/dist/src/agent-runtime/model-router.d.ts +11 -0
- package/dist/src/agent-runtime/model-router.js +16 -0
- package/dist/src/agent-runtime/model-router.js.map +1 -0
- package/dist/src/agent-runtime/run-trace.d.ts +27 -0
- package/dist/src/agent-runtime/run-trace.js +53 -0
- package/dist/src/agent-runtime/run-trace.js.map +1 -0
- package/dist/src/agent-runtime/runtime-profile.d.ts +24 -0
- package/dist/src/agent-runtime/runtime-profile.js +44 -0
- package/dist/src/agent-runtime/runtime-profile.js.map +1 -0
- package/dist/src/agent-runtime/tool-registry.d.ts +28 -0
- package/dist/src/agent-runtime/tool-registry.js +52 -0
- package/dist/src/agent-runtime/tool-registry.js.map +1 -0
- package/dist/src/agent-runtime/workflow-runtime.d.ts +31 -0
- package/dist/src/agent-runtime/workflow-runtime.js +34 -0
- package/dist/src/agent-runtime/workflow-runtime.js.map +1 -0
- package/dist/src/browser/actions/extension-registry-bridge.js +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +5 -8
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/backend-from-config.d.ts +1 -1
- package/dist/src/browser/backend-from-config.js +50 -71
- package/dist/src/browser/backend-from-config.js.map +1 -1
- package/dist/src/browser/browser-command-timeout.d.ts +0 -1
- package/dist/src/browser/browser-command-timeout.js +3 -7
- package/dist/src/browser/browser-command-timeout.js.map +1 -1
- package/dist/src/browser/providers/browser-ext-install.d.ts +2 -12
- package/dist/src/browser/providers/browser-ext-install.js +3 -8
- package/dist/src/browser/providers/browser-ext-install.js.map +1 -1
- package/dist/src/browser/readiness.js +16 -16
- package/dist/src/browser/readiness.js.map +1 -1
- package/dist/src/browser/schemas.js +1 -1
- package/dist/src/browser/schemas.js.map +1 -1
- package/dist/src/chat-commands/builtins/config.js +4 -4
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/builtins/thinking.js +16 -42
- package/dist/src/chat-commands/builtins/thinking.js.map +1 -1
- package/dist/src/chat-commands/config-paths.js +1 -1
- package/dist/src/chat-commands/config-paths.js.map +1 -1
- package/dist/src/chat-commands/context.js +3 -4
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/cli/command-manifest.js +1 -1
- package/dist/src/cli/command-manifest.js.map +1 -1
- package/dist/src/cli/commands/agent.js +3 -1
- package/dist/src/cli/commands/agent.js.map +1 -1
- package/dist/src/cli/commands/agents.js +3 -6
- package/dist/src/cli/commands/agents.js.map +1 -1
- package/dist/src/cli/commands/browser-cli-helpers.js +9 -11
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/config.js +5 -5
- package/dist/src/cli/commands/config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/provider-auth.js +1 -17
- package/dist/src/cli/commands/doctor/checks/provider-auth.js.map +1 -1
- package/dist/src/cli/commands/goal.js +1 -1
- package/dist/src/cli/commands/image.js +13 -372
- package/dist/src/cli/commands/image.js.map +1 -1
- package/dist/src/cli/commands/models.js +26 -10
- package/dist/src/cli/commands/models.js.map +1 -1
- package/dist/src/cli/commands/onboard/channels/registry.js.map +1 -1
- package/dist/src/cli/commands/onboard/model.js +20 -22
- package/dist/src/cli/commands/onboard/model.js.map +1 -1
- package/dist/src/cli/commands/onboard.js +1 -1
- package/dist/src/cli/commands/onboard.js.map +1 -1
- package/dist/src/cli/utils/init-workspace-core.d.ts +1 -4
- package/dist/src/cli/utils/init-workspace-core.js +7 -6
- package/dist/src/cli/utils/init-workspace-core.js.map +1 -1
- package/dist/src/commands/agents.config.d.ts +0 -1
- package/dist/src/commands/agents.config.js +66 -12
- package/dist/src/commands/agents.config.js.map +1 -1
- package/dist/src/config/agent-profile.d.ts +5 -17
- package/dist/src/config/agent-profile.js +31 -64
- package/dist/src/config/agent-profile.js.map +1 -1
- package/dist/src/config/agent-typed-models.d.ts +1 -1
- package/dist/src/config/agent-typed-models.js +0 -1
- package/dist/src/config/agent-typed-models.js.map +1 -1
- package/dist/src/config/index.js +3 -3
- package/dist/src/config/integration.d.ts +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/reload.js.map +1 -1
- package/dist/src/config/rules.js +6 -56
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +925 -781
- package/dist/src/config/schema.js +157 -424
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/connectors/composio-triggers.d.ts +10 -0
- package/dist/src/connectors/composio-triggers.js +32 -0
- package/dist/src/connectors/composio-triggers.js.map +1 -0
- package/dist/src/connectors/composio.d.ts +54 -0
- package/dist/src/connectors/composio.js +334 -0
- package/dist/src/connectors/composio.js.map +1 -0
- package/dist/src/connectors/health.js +16 -1
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/install.d.ts +2 -1
- package/dist/src/connectors/install.js +50 -13
- package/dist/src/connectors/install.js.map +1 -1
- package/dist/src/connectors/instances.js +57 -6
- package/dist/src/connectors/instances.js.map +1 -1
- package/dist/src/connectors/lifecycle.d.ts +3 -0
- package/dist/src/connectors/lifecycle.js +23 -0
- package/dist/src/connectors/lifecycle.js.map +1 -0
- package/dist/src/connectors/materialize.js +2 -1
- package/dist/src/connectors/materialize.js.map +1 -1
- package/dist/src/connectors/providers.d.ts +1 -0
- package/dist/src/connectors/providers.js +10 -2
- package/dist/src/connectors/providers.js.map +1 -1
- package/dist/src/connectors/registries/modelscope.d.ts +2 -0
- package/dist/src/connectors/registries/modelscope.js +205 -0
- package/dist/src/connectors/registries/modelscope.js.map +1 -0
- package/dist/src/connectors/registries/official-mcp.d.ts +2 -0
- package/dist/src/connectors/registries/official-mcp.js +142 -0
- package/dist/src/connectors/registries/official-mcp.js.map +1 -0
- package/dist/src/connectors/registries/search.d.ts +12 -0
- package/dist/src/connectors/registries/search.js +89 -0
- package/dist/src/connectors/registries/search.js.map +1 -0
- package/dist/src/connectors/registries/smithery.d.ts +2 -0
- package/dist/src/connectors/registries/smithery.js +98 -0
- package/dist/src/connectors/registries/smithery.js.map +1 -0
- package/dist/src/connectors/registries/types.d.ts +20 -0
- package/dist/src/connectors/registries/types.js +1 -0
- package/dist/src/connectors/secret-store.js +4 -2
- package/dist/src/connectors/secret-store.js.map +1 -1
- package/dist/src/connectors/setup-secrets.d.ts +15 -0
- package/dist/src/connectors/setup-secrets.js +64 -0
- package/dist/src/connectors/setup-secrets.js.map +1 -0
- package/dist/src/connectors/supervisor.d.ts +15 -0
- package/dist/src/connectors/supervisor.js +73 -0
- package/dist/src/connectors/supervisor.js.map +1 -0
- package/dist/src/connectors/types.d.ts +27 -3
- package/dist/src/connectors/usage.js +6 -1
- package/dist/src/connectors/usage.js.map +1 -1
- package/dist/src/cron/index.js +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/cron/validation.d.ts +3 -3
- package/dist/src/extensions/activation-context.js +13 -7
- package/dist/src/extensions/activation-context.js.map +1 -1
- package/dist/src/gateway/agents-admin.d.ts +17 -18
- package/dist/src/gateway/agents-admin.js +123 -88
- package/dist/src/gateway/agents-admin.js.map +1 -1
- package/dist/src/gateway/capability-presets-admin.d.ts +56 -0
- package/dist/src/gateway/capability-presets-admin.js +214 -0
- package/dist/src/gateway/capability-presets-admin.js.map +1 -0
- package/dist/src/gateway/hono/lib/agent-model.d.ts +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js +1 -1
- package/dist/src/gateway/hono/lib/agent-model.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +234 -127
- package/dist/src/gateway/hono/lib/config-payload.js +13 -37
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/routes/agents.js +56 -33
- package/dist/src/gateway/hono/routes/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/browser.js +8 -15
- package/dist/src/gateway/hono/routes/browser.js.map +1 -1
- package/dist/src/gateway/hono/routes/capability-presets.d.ts +3 -0
- package/dist/src/gateway/hono/routes/capability-presets.js +145 -0
- package/dist/src/gateway/hono/routes/capability-presets.js.map +1 -0
- package/dist/src/gateway/hono/routes/config-patch/agents.d.ts +1 -17
- package/dist/src/gateway/hono/routes/config-patch/agents.js +2 -443
- package/dist/src/gateway/hono/routes/config-patch/agents.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js +7 -1
- package/dist/src/gateway/hono/routes/config-patch/misc.js.map +1 -1
- package/dist/src/gateway/hono/routes/config.js +1 -1
- package/dist/src/gateway/hono/routes/config.js.map +1 -1
- package/dist/src/gateway/hono/routes/connectors.js +230 -3
- package/dist/src/gateway/hono/routes/connectors.js.map +1 -1
- package/dist/src/gateway/hono/routes/dreaming.js +7 -0
- package/dist/src/gateway/hono/routes/dreaming.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +52 -5
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/index.js +2 -0
- package/dist/src/gateway/hono/routes/index.js.map +1 -1
- package/dist/src/gateway/hono/routes/lazy-bundles.js +8 -0
- package/dist/src/gateway/hono/routes/lazy-bundles.js.map +1 -1
- package/dist/src/gateway/hono/routes/memory.d.ts +3 -0
- package/dist/src/gateway/hono/routes/memory.js +290 -0
- package/dist/src/gateway/hono/routes/memory.js.map +1 -0
- package/dist/src/gateway/hono/routes/voice.js +14 -1
- package/dist/src/gateway/hono/routes/voice.js.map +1 -1
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +5 -12
- package/dist/src/gateway/service/agent-runner.js +8 -8
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.d.ts +2 -10
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service.d.ts +2 -2
- package/dist/src/gateway/service.js +20 -16
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/user-turn-input.d.ts +18 -0
- package/dist/src/gateway/user-turn-input.js +16 -0
- package/dist/src/gateway/user-turn-input.js.map +1 -0
- package/dist/src/goals/goal-queue-store.d.ts +2 -1
- package/dist/src/goals/goal-queue-store.js +2 -2
- package/dist/src/goals/goal-queue-store.js.map +1 -1
- package/dist/src/goals/goal-queue-types.d.ts +4 -3
- package/dist/src/goals/goal-runner.js +25 -3
- package/dist/src/goals/goal-runner.js.map +1 -1
- package/dist/src/goals/goal-service.d.ts +6 -1
- package/dist/src/goals/goal-service.js +9 -2
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/goals/goal-store.d.ts +7 -1
- package/dist/src/goals/goal-store.js +42 -0
- package/dist/src/goals/goal-store.js.map +1 -1
- package/dist/src/goals/types.d.ts +10 -0
- package/dist/src/notes/agent-context.js +2 -2
- package/dist/src/providers/index.d.ts +2 -2
- package/dist/src/providers/index.js +10 -14
- package/dist/src/providers/index.js.map +1 -1
- package/dist/src/session/index.js +1 -1
- package/dist/src/session/session-workspace.js +7 -2
- package/dist/src/session/session-workspace.js.map +1 -1
- package/dist/src/session/store.js +5 -0
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/thinking-resolve.d.ts +1 -1
- package/dist/src/session/thinking-resolve.js +1 -1
- package/dist/src/session/thinking-resolve.js.map +1 -1
- package/dist/src/storage/sqlite/connection.js +1 -1
- package/dist/src/storage/sqlite/index.d.ts +1 -0
- package/dist/src/storage/sqlite/index.js +2 -1
- package/dist/src/storage/sqlite/memory-records-repository.d.ts +101 -0
- package/dist/src/storage/sqlite/memory-records-repository.js +309 -0
- package/dist/src/storage/sqlite/memory-records-repository.js.map +1 -0
- package/dist/src/storage/sqlite/migrations/011_goal_context_messages.sql +8 -0
- package/dist/src/storage/sqlite/migrations/012_memory_records.sql +63 -0
- package/dist/src/storage/sqlite/migrations/013_memory_trace_events.sql +21 -0
- package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
- package/dist/src/storage/sqlite/migrations/runner.js +4 -4
- package/dist/src/storage/sqlite/migrations/runner.js.map +1 -1
- package/dist/src/storage/sqlite/migrations/runner.ts +2 -2
- package/dist/src/storage/sqlite/schema.js +3 -3
- package/dist/src/storage/sqlite/schema.sql +95 -0
- package/dist/src/tui/backends/embedded-backend.js +6 -4
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js.map +1 -1
- package/dist/src/voice/tts/openai-compatible-speech.d.ts +1 -1
- package/dist/src/voice/tts/openai-compatible-speech.js.map +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +14 -2
- package/dist/src/voice/tts/providers/edge-speech.js.map +1 -1
- package/dist/src/voice/tts/speak-core.js +3 -3
- package/dist/src/voice/tts/speak-core.js.map +1 -1
- package/dist/src/voice/tts/speech-provider-types.d.ts +2 -2
- package/dist/src/voice/tts/types.js +1 -1
- package/dist/src/voice/tts/types.js.map +1 -1
- package/dist/src/workflows/domain/result.d.ts +0 -1
- package/dist/src/workflows/engine/workflow-engine.js +7 -23
- package/dist/src/workflows/engine/workflow-engine.js.map +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +3 -4
- package/dist/src/workflows/service/workflow-run-service.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +1 -1
- package/package.json +4 -3
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +0 -1
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +0 -71
- package/dist/gateway/static/root/assets/app-management-settings-panel-DzGbdr04.js +0 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +0 -1
- package/dist/gateway/static/root/assets/config-api-NOoPiIYz.js +0 -3
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +0 -2
- package/dist/gateway/static/root/assets/cron-api-C9BOqAXd.js +0 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-DQ4DtiK1.js +0 -1
- package/dist/gateway/static/root/assets/gateway-config-api-C-xjn__h.js +0 -1
- package/dist/gateway/static/root/assets/gateway-settings-BMPwIjKI.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +0 -1
- package/dist/gateway/static/root/assets/heartbeat-settings-TbHgcjTn.js +0 -1
- package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +0 -122
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +0 -2
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +0 -2
- package/dist/gateway/static/root/assets/system-settings-panel-5jrIEr5b.js +0 -1
- package/dist/gateway/static/root/assets/use-agent-defaults-form-BuiXLIs5.js +0 -1
- package/dist/gateway/static/root/assets/use-settings-tab-guard-CW5JORnl.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +0 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"registry.js","names":[],"sources":["../../../../src/browser/actions/registry.ts"],"sourcesContent":["/**\n * Browser Action Registry — unified action layer shared by browser_use tool, CLI, and pipeline.\n */\n\nimport type { Page } from 'playwright-core';\n\nimport { createLogger } from '../../utils/logger.js';\nimport { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from '../url-policy.js';\nimport { checkWebsiteBlocklist } from '../../agent/tools/url-safety.js';\nimport { resolveBrowserCommandTimeoutMs } from '../browser-command-timeout.js';\nimport { truncateSnapshotAtBoundary } from '../snapshot-helpers.js';\nimport { humanizedClick, humanizedFill, humanizedScroll, type HumanPreset } from '../humanize.js';\nimport { isTruthyValue, resolvePath, valueContains } from '../pipeline/template.js';\n\nimport type {\n BrowserActionContext,\n BrowserActionHandler,\n BrowserActionRegistry,\n BrowserActionResult,\n} from './types.js';\n\nconst log = createLogger('BrowserActionRegistry');\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst AUTO_SNAPSHOT_MAX = 8_000;\n\ninterface NetworkEvent {\n type: 'request' | 'response' | 'requestfailed';\n url: string;\n method?: string;\n status?: number;\n resourceType?: string;\n postData?: string | null;\n body?: string;\n errorText?: string;\n timestamp: number;\n}\n\ninterface NetworkMonitor {\n events: NetworkEvent[];\n includeBody: boolean;\n urlPattern?: string;\n dispose: () => void;\n}\n\nconst networkMonitors = new WeakMap<Page, NetworkMonitor>();\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction toMs(ctx: BrowserActionContext): number {\n return resolveBrowserCommandTimeoutMs(ctx.config);\n}\n\n/** Whether humanize mode is active for this context (local/cdp/cloakbrowser only). */\nfunction isHumanizeEnabled(ctx: BrowserActionContext): boolean {\n const browser = ctx.config?.agents?.defaults?.browser;\n if (!browser?.humanize) return false;\n // Extension backend has its own event dispatch — humanize is not applicable\n const backend = browser.backend;\n if (backend === 'extension') return false;\n return true;\n}\n\nfunction humanPreset(ctx: BrowserActionContext): HumanPreset {\n return (ctx.config?.agents?.defaults?.browser?.humanPreset as HumanPreset) ?? 'default';\n}\n\nasync function ariaSnapshot(page: Page, selector: string | undefined, maxLength: number, timeoutMs: number): Promise<string> {\n const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator('body');\n await loc.waitFor({ state: 'attached', timeout: timeoutMs });\n let text = await loc.ariaSnapshot({ mode: 'ai', timeout: timeoutMs });\n if (!text || !text.trim()) text = '(empty snapshot)';\n if (text.length > maxLength) text = truncateSnapshotAtBoundary(text, maxLength);\n return text;\n}\n\nfunction resolveClickLocator(page: Page, args: Record<string, unknown>) {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const role = args.role as string | undefined;\n const hasSel = Boolean(selector?.trim());\n const hasText = Boolean(text?.trim());\n const hasRole = Boolean(role?.trim());\n const n = (hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0);\n if (n !== 1) throw new Error('Provide exactly one of: selector, text, role');\n if (hasSel) return page.locator(selector!.trim()).first();\n if (hasText) return page.getByText(text!.trim(), { exact: false }).first();\n const raw = role!.trim();\n const idx = raw.indexOf(':');\n const roleName = (idx >= 0 ? raw.slice(0, idx) : raw).trim();\n const name = idx >= 0 ? raw.slice(idx + 1).trim() : '';\n if (!roleName) throw new Error('Invalid role: empty ARIA role');\n return page.getByRole(roleName as never, name ? { name } : undefined).first();\n}\n\nfunction resolveTypeLocator(page: Page, args: Record<string, unknown>) {\n const selector = args.selector as string | undefined;\n const label = args.label as string | undefined;\n const hasSel = Boolean(selector?.trim());\n const hasLab = Boolean(label?.trim());\n if (hasSel === hasLab) throw new Error('Provide exactly one of: selector, label');\n if (hasSel) return page.locator(selector!.trim()).first();\n return page.getByLabel(label!.trim()).first();\n}\n\nfunction ok(action: string, text: string, data?: unknown, artifacts?: BrowserActionResult['artifacts']): BrowserActionResult {\n return { ok: true, action, text, data, artifacts };\n}\n\nfunction fail(action: string, code: string, message: string, diagnostics?: BrowserActionResult['diagnostics']): BrowserActionResult {\n return { ok: false, action, error: { code, message }, diagnostics };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction pipelineLast(ctx: BrowserActionContext): unknown {\n return ctx.pipeline?.last;\n}\n\nfunction valueFromArgs(ctx: BrowserActionContext, args: Record<string, unknown>): unknown {\n if ('value' in args) return args.value;\n if (typeof args.path === 'string') return resolvePath(pipelineLast(ctx), args.path);\n return pipelineLast(ctx);\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n const av = typeof a === 'number' ? a : String(a ?? '');\n const bv = typeof b === 'number' ? b : String(b ?? '');\n if (av < bv) return -1;\n if (av > bv) return 1;\n return 0;\n}\n\nfunction matchesNetworkPattern(url: string, pattern: string | undefined): boolean {\n if (!pattern) return true;\n return url.includes(pattern);\n}\n\n// ─── Action Handlers ────────────────────────────────────────────────────────\n\nconst navigateAction: BrowserActionHandler = async (ctx, args) => {\n const url = String(args.url ?? '');\n if (!url) return fail('navigate', 'MISSING_URL', 'url is required');\n\n const allowPrivate = ctx.config?.agents?.defaults?.browser?.allowPrivateUrls === true;\n if (containsApiKeyPattern(url)) return fail('navigate', 'BLOCKED', 'URL contains API key/token');\n const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);\n if (block) return fail('navigate', 'BLOCKED', block.message);\n assertBrowserUrlAllowed(url, { allowPrivateUrls: allowPrivate });\n\n const waitUntil = (args.wait_until as string) ?? (args.waitFor as string) ?? 'domcontentloaded';\n const navTimeout = toMs(ctx);\n await ctx.page.goto(url, { waitUntil: waitUntil as any, timeout: navTimeout });\n\n const title = await ctx.page.title();\n const finalUrl = ctx.page.url();\n\n if (finalUrl && finalUrl !== url) {\n const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });\n if (redirectBlock) {\n await ctx.page.goto('about:blank').catch(() => {});\n return fail('navigate', 'REDIRECT_BLOCKED', redirectBlock);\n }\n }\n\n let snapshot = '';\n try { snapshot = await ariaSnapshot(ctx.page, undefined, AUTO_SNAPSHOT_MAX, navTimeout); } catch { /* non-fatal */ }\n\n const text = `Navigated to: ${title}\\nURL: ${finalUrl}${snapshot ? `\\n--- Page Snapshot ---\\n${snapshot}` : ''}`;\n return ok('navigate', text, { url: finalUrl, title });\n};\n\nconst stateAction: BrowserActionHandler = async (ctx, args) => {\n const maxLen = typeof args.maxLength === 'number' ? args.maxLength : DEFAULT_SNAPSHOT_MAX;\n const selector = args.selector as string | undefined;\n const timeout = toMs(ctx);\n try {\n const text = await ariaSnapshot(ctx.page, selector, maxLen, timeout);\n return ok('state', text, { length: text.length });\n } catch (e) {\n return fail('state', 'SNAPSHOT_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst clickAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n try {\n if (isHumanizeEnabled(ctx) && args.selector) {\n await humanizedClick(ctx.page, String(args.selector), humanPreset(ctx));\n return ok('click', 'Click succeeded (humanized).');\n }\n const loc = resolveClickLocator(ctx.page, args);\n await loc.click({ timeout });\n return ok('click', 'Click succeeded.');\n } catch (e) {\n return fail('click', 'CLICK_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst typeAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n try {\n if (isHumanizeEnabled(ctx) && args.selector) {\n await humanizedFill(ctx.page, String(args.selector), String(args.text ?? ''), humanPreset(ctx));\n if (args.pressEnter) await ctx.page.keyboard.press('Enter');\n return ok('type', 'Typed into field (humanized).');\n }\n const loc = resolveTypeLocator(ctx.page, args);\n await loc.clear({ timeout: Math.min(5000, timeout) }).catch(() => {});\n await loc.fill(String(args.text ?? ''), { timeout });\n if (args.pressEnter) await ctx.page.keyboard.press('Enter');\n return ok('type', 'Typed into field.');\n } catch (e) {\n return fail('type', 'TYPE_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst scrollAction: BrowserActionHandler = async (ctx, args) => {\n const direction = (args.direction as string) ?? 'down';\n const amount = typeof args.amount === 'number' ? args.amount : 500;\n const dy = direction === 'down' ? amount : -amount;\n try {\n if (isHumanizeEnabled(ctx)) {\n await humanizedScroll(ctx.page, dy, humanPreset(ctx));\n return ok('scroll', `Scrolled ${direction} by ${amount}px (humanized).`);\n }\n await ctx.page.evaluate(({ deltaY }) => {\n (globalThis as any).scrollBy(0, deltaY);\n }, { deltaY: dy });\n return ok('scroll', `Scrolled ${direction} by ${amount}px.`);\n } catch (e) {\n return fail('scroll', 'SCROLL_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst screenshotAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n const selector = args.selector as string | undefined;\n const fullPage = args.full_page === true || args.fullPage === true;\n const path = args.path as string | undefined;\n try {\n let buf: Buffer;\n if (selector?.trim()) {\n const loc = ctx.page.locator(selector.trim()).first();\n await loc.waitFor({ state: 'visible', timeout });\n buf = await loc.screenshot({ type: 'png', timeout });\n } else {\n buf = await ctx.page.screenshot({ type: 'png', fullPage, timeout });\n }\n const artifact = { type: 'screenshot' as const, path, data: buf.toString('base64'), mimeType: 'image/png' };\n return ok('screenshot', `Screenshot captured (${buf.length} bytes).`, { bytes: buf.length }, [artifact]);\n } catch (e) {\n return fail('screenshot', 'SCREENSHOT_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst backAction: BrowserActionHandler = async (ctx, args) => {\n const waitUntil = (args.waitFor as string) ?? 'domcontentloaded';\n const timeout = toMs(ctx);\n try {\n const response = await ctx.page.goBack({ waitUntil: waitUntil as any, timeout });\n if (!response) return fail('back', 'NO_HISTORY', 'No previous page in history.');\n const title = await ctx.page.title();\n const url = ctx.page.url();\n return ok('back', `Navigated back to: ${title}\\nURL: ${url}`, { url, title });\n } catch (e) {\n return fail('back', 'BACK_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst pressAction: BrowserActionHandler = async (ctx, args) => {\n const key = String(args.key ?? '');\n if (!key) return fail('press', 'MISSING_KEY', 'key is required');\n try {\n await ctx.page.keyboard.press(key);\n return ok('press', `Pressed key: ${key}`);\n } catch (e) {\n return fail('press', 'PRESS_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst evalAction: BrowserActionHandler = async (ctx, args) => {\n const js = (args.javascript as string) ?? (args.expression as string) ?? (args.code as string) ?? '';\n if (!js.trim()) return fail('eval', 'MISSING_JS', 'javascript expression is required');\n try {\n const result = await ctx.page.evaluate(js);\n const serialized = result === undefined ? 'undefined' : JSON.stringify(result, null, 2);\n const text = serialized.length > DEFAULT_SNAPSHOT_MAX\n ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\\n... (truncated)`\n : serialized;\n return ok('eval', text, result);\n } catch (e) {\n return fail('eval', 'EVAL_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst imagesAction: BrowserActionHandler = async (ctx, args) => {\n const selector = args.selector as string | undefined;\n const maxImages = typeof args.maxImages === 'number' ? args.maxImages : 20;\n try {\n const images = await ctx.page.evaluate(\n ([sel, max]: [string | null, number]) => {\n const d = globalThis.document as any;\n const root = sel ? d.querySelector(sel) : d;\n if (!root) return [];\n const imgs = Array.from(root.querySelectorAll('img') as ArrayLike<any>);\n return imgs.slice(0, max).map((img: any) => ({\n src: String(img.src ?? ''),\n alt: String(img.alt ?? ''),\n width: Number(img.naturalWidth ?? 0),\n height: Number(img.naturalHeight ?? 0),\n }));\n },\n [selector?.trim() || null, maxImages] as [string | null, number],\n );\n if (!images || images.length === 0) return ok('images', 'No images found on the page.', []);\n const lines = images.map((img: any, i: number) =>\n `${i + 1}. ${img.alt || '(no alt)'} — ${img.width}×${img.height}\\n ${img.src}`);\n return ok('images', `Found ${images.length} image(s):\\n${lines.join('\\n')}`, images);\n } catch (e) {\n return fail('images', 'IMAGES_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst closeAction: BrowserActionHandler = async (ctx, _args) => {\n await ctx.manager.closePage(ctx.taskId);\n return ok('close', 'Browser page closed.');\n};\n\nconst dialogAction: BrowserActionHandler = async (ctx, args) => {\n const action = args.action as string;\n if (action !== 'accept' && action !== 'dismiss') {\n return fail('dialog', 'INVALID_ACTION', 'action must be \"accept\" or \"dismiss\"');\n }\n // Dialog handling relies on the CdpSupervisor event queue; this is a placeholder\n // that signals the supervisor to accept/dismiss the next pending dialog.\n const sup = ctx.supervisor;\n if (!sup) return fail('dialog', 'NO_SUPERVISOR', 'No dialog supervisor available');\n // Forward to supervisor (implementation detail in cdp-supervisor.ts)\n return ok('dialog', `Dialog ${action}ed.`);\n};\n\nconst waitAction: BrowserActionHandler = async (ctx, args) => {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const state = (args.state as 'attached' | 'detached' | 'visible' | 'hidden' | undefined) ?? 'visible';\n const timeoutMs = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n if (selector?.trim()) {\n await ctx.page.locator(selector.trim()).first().waitFor({ state, timeout: timeoutMs });\n } else if (text?.trim()) {\n await ctx.page.getByText(text.trim()).first().waitFor({ state: 'visible', timeout: timeoutMs });\n } else if (args.function || args.expression) {\n await ctx.page.waitForFunction(String(args.function ?? args.expression), null, { timeout: timeoutMs });\n } else {\n const ms = typeof args.ms === 'number' ? args.ms : 1000;\n await ctx.page.waitForTimeout(ms);\n }\n return ok('wait', 'Wait completed.');\n } catch (e) {\n return fail('wait', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst outputAction: BrowserActionHandler = async (ctx, args) => {\n return ok('output', 'Output captured.', valueFromArgs(ctx, args));\n};\n\nconst assertAction: BrowserActionHandler = async (ctx, args) => {\n const actual = valueFromArgs(ctx, args);\n if ('equals' in args && JSON.stringify(actual) !== JSON.stringify(args.equals)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to equal ${JSON.stringify(args.equals)}, got ${JSON.stringify(actual)?.slice(0, 500)}`);\n }\n if ('contains' in args && !valueContains(actual, args.contains)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to contain ${JSON.stringify(args.contains)}`);\n }\n if ('matches' in args) {\n const pattern = new RegExp(String(args.matches));\n if (!pattern.test(String(actual ?? ''))) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to match /${pattern.source}/`);\n }\n }\n if (args.truthy === true && !isTruthyValue(actual)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to be truthy, got ${JSON.stringify(actual)}`);\n }\n if (args.exists === true && (actual === undefined || actual === null || actual === '')) {\n return fail('assert', 'ASSERTION_FAILED', 'Expected value to exist');\n }\n return ok('assert', 'Assertion passed.');\n};\n\nconst waitForNavigationAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n const waitUntil = (args.wait_until as string) ?? 'domcontentloaded';\n try {\n await ctx.page.waitForLoadState(waitUntil as any, { timeout });\n return ok('wait_for_navigation', 'Navigation wait completed.');\n } catch (e) {\n return fail('wait_for_navigation', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst waitForTimeoutAction: BrowserActionHandler = async (ctx, args) => {\n const ms = Number(args.ms ?? args.timeout_ms ?? 1000);\n await ctx.page.waitForTimeout(Number.isFinite(ms) ? ms : 1000);\n return ok('wait_for_timeout', `Waited ${ms}ms.`);\n};\n\nconst waitForFunctionAction: BrowserActionHandler = async (ctx, args) => {\n const expression = String(args.expression ?? args.function ?? '');\n if (!expression.trim()) return fail('wait_for_function', 'MISSING_EXPRESSION', 'expression is required');\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n await ctx.page.waitForFunction(expression, null, { timeout });\n return ok('wait_for_function', 'Function wait completed.');\n } catch (e) {\n return fail('wait_for_function', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst waitForNetworkIdleAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n await ctx.page.waitForLoadState('networkidle', { timeout });\n return ok('wait_for_network_idle', 'Network idle reached.');\n } catch (e) {\n return fail('wait_for_network_idle', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst elementTextAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n if (!selector) return fail('element_text', 'MISSING_SELECTOR', 'selector is required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'attached', timeout });\n const text = await loc.innerText({ timeout }).catch(() => loc.textContent({ timeout }));\n return ok('element_text', String(text ?? ''), text ?? '');\n};\n\nconst elementAttributeAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n const attribute = String(args.attribute ?? '');\n if (!selector || !attribute) return fail('element_attribute', 'INVALID_ARGS', 'selector and attribute are required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'attached', timeout });\n const value = await loc.getAttribute(attribute, { timeout });\n return ok('element_attribute', value ?? '', value);\n};\n\nconst boundingBoxAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n if (!selector) return fail('bounding_box', 'MISSING_SELECTOR', 'selector is required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'visible', timeout });\n const box = await loc.boundingBox({ timeout });\n return ok('bounding_box', JSON.stringify(box), box);\n};\n\nconst setInputFilesAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n const files = Array.isArray(args.files) ? args.files.map(String) : typeof args.file === 'string' ? [args.file] : [];\n if (!selector || files.length === 0) return fail('set_input_files', 'INVALID_ARGS', 'selector and files are required');\n await ctx.page.locator(selector).first().setInputFiles(files, { timeout: toMs(ctx) });\n return ok('set_input_files', `Attached ${files.length} file(s).`, { files });\n};\n\nconst getCookiesAction: BrowserActionHandler = async (ctx, args) => {\n const urls = Array.isArray(args.urls) ? args.urls.map(String) : undefined;\n const cookies = await ctx.page.context().cookies(urls);\n return ok('cookies', JSON.stringify(cookies, null, 2), cookies);\n};\n\nconst addCookiesAction: BrowserActionHandler = async (ctx, args) => {\n const cookies = Array.isArray(args.cookies) ? args.cookies as any[] : [];\n if (cookies.length === 0) return fail('add_cookies', 'INVALID_ARGS', 'cookies must be a non-empty array');\n await ctx.page.context().addCookies(cookies);\n return ok('add_cookies', `Added ${cookies.length} cookie(s).`);\n};\n\nconst clearCookiesAction: BrowserActionHandler = async (ctx) => {\n await ctx.page.context().clearCookies();\n return ok('clear_cookies', 'Cookies cleared.');\n};\n\nconst listTabsAction: BrowserActionHandler = async (ctx) => {\n const pages = ctx.page.context().pages();\n const tabs = await Promise.all(pages.map(async (page, index) => ({ index, url: page.url(), title: await page.title().catch(() => '') })));\n return ok('tabs', JSON.stringify(tabs, null, 2), tabs);\n};\n\nconst newTabAction: BrowserActionHandler = async (ctx, args) => {\n const page = await ctx.page.context().newPage();\n if (args.url) await page.goto(String(args.url), { waitUntil: 'domcontentloaded', timeout: toMs(ctx) });\n return ok('new_tab', `Opened tab: ${page.url()}`, { url: page.url(), title: await page.title().catch(() => '') });\n};\n\nconst switchTabAction: BrowserActionHandler = async (ctx, args) => {\n const index = Number(args.index ?? args.tab_index ?? 0);\n const pages = ctx.page.context().pages();\n const page = pages[index];\n if (!page) return fail('switch_tab', 'TAB_NOT_FOUND', `No tab at index ${index}`);\n await page.bringToFront();\n return ok('switch_tab', `Switched to tab ${index}.`, { index, url: page.url() });\n};\n\nconst selectAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n const path = String(args.path ?? args.value ?? '');\n const value = path ? resolvePath(source, path) : source;\n return ok('select', typeof value === 'string' ? value : JSON.stringify(value, null, 2), value);\n};\n\nconst mapAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('map', 'INVALID_INPUT', 'map input must be an array');\n const path = String(args.path ?? '');\n const result = path ? source.map((item) => resolvePath(item, path)) : source;\n return ok('map', JSON.stringify(result, null, 2), result);\n};\n\nconst filterAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('filter', 'INVALID_INPUT', 'filter input must be an array');\n const path = String(args.path ?? '');\n const equals = args.equals;\n const contains = args.contains;\n const truthy = args.truthy === true;\n const result = source.filter((item) => {\n const value = path ? resolvePath(item, path) : item;\n if ('equals' in args) return JSON.stringify(value) === JSON.stringify(equals);\n if ('contains' in args) return valueContains(value, contains);\n if (truthy) return isTruthyValue(value);\n return isTruthyValue(value);\n });\n return ok('filter', JSON.stringify(result, null, 2), result);\n};\n\nconst sortAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('sort', 'INVALID_INPUT', 'sort input must be an array');\n const path = String(args.path ?? '');\n const direction = String(args.direction ?? 'asc');\n const result = [...source].sort((a, b) => {\n const av = path ? resolvePath(a, path) : a;\n const bv = path ? resolvePath(b, path) : b;\n const cmp = compareValues(av, bv);\n return direction === 'desc' ? -cmp : cmp;\n });\n return ok('sort', JSON.stringify(result, null, 2), result);\n};\n\nconst limitAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('limit', 'INVALID_INPUT', 'limit input must be an array');\n const count = Math.max(0, Number(args.count ?? args.limit ?? 10));\n const offset = Math.max(0, Number(args.offset ?? 0));\n const result = source.slice(offset, offset + count);\n return ok('limit', JSON.stringify(result, null, 2), result);\n};\n\nconst fetchAction: BrowserActionHandler = async (ctx, args) => {\n const url = String(args.url ?? '');\n if (!url) return fail('fetch', 'MISSING_URL', 'url is required');\n const method = String(args.method ?? 'GET');\n const headers = asObject(args.headers) as Record<string, string>;\n const body = args.body === undefined ? undefined : typeof args.body === 'string' ? args.body : JSON.stringify(args.body);\n const result = await ctx.page.evaluate(\n async ({ url, method, headers, body }) => {\n const response = await fetch(url, { method, headers, body });\n const text = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n let parsed: unknown = text;\n if (contentType.includes('application/json')) {\n try { parsed = JSON.parse(text); } catch { parsed = text; }\n }\n return { ok: response.ok, status: response.status, url: response.url, headers: Object.fromEntries(response.headers.entries()), body: parsed };\n },\n { url, method, headers, body },\n );\n return ok('fetch', JSON.stringify(result, null, 2), result);\n};\n\nconst networkStartAction: BrowserActionHandler = async (ctx, args) => {\n networkMonitors.get(ctx.page)?.dispose();\n const includeBody = args.include_body === true || args.includeBody === true;\n const urlPattern = typeof args.url_pattern === 'string' ? args.url_pattern : typeof args.urlPattern === 'string' ? args.urlPattern : undefined;\n const events: NetworkEvent[] = [];\n const onRequest = (request: any) => {\n if (!matchesNetworkPattern(request.url(), urlPattern)) return;\n events.push({ type: 'request', url: request.url(), method: request.method(), resourceType: request.resourceType(), postData: request.postData(), timestamp: Date.now() });\n };\n const onResponse = async (response: any) => {\n if (!matchesNetworkPattern(response.url(), urlPattern)) return;\n const event: NetworkEvent = { type: 'response', url: response.url(), status: response.status(), timestamp: Date.now() };\n if (includeBody) {\n event.body = await response.text().catch(() => undefined);\n }\n events.push(event);\n };\n const onRequestFailed = (request: any) => {\n if (!matchesNetworkPattern(request.url(), urlPattern)) return;\n events.push({ type: 'requestfailed', url: request.url(), method: request.method(), errorText: request.failure()?.errorText, timestamp: Date.now() });\n };\n ctx.page.on('request', onRequest);\n ctx.page.on('response', onResponse);\n ctx.page.on('requestfailed', onRequestFailed);\n networkMonitors.set(ctx.page, {\n events,\n includeBody,\n urlPattern,\n dispose: () => {\n ctx.page.off('request', onRequest);\n ctx.page.off('response', onResponse);\n ctx.page.off('requestfailed', onRequestFailed);\n networkMonitors.delete(ctx.page);\n },\n });\n return ok('network_start', 'Network monitoring started.', { includeBody, urlPattern });\n};\n\nconst networkEventsAction: BrowserActionHandler = async (ctx) => {\n const monitor = networkMonitors.get(ctx.page);\n const events = monitor?.events ?? [];\n return ok('network_events', JSON.stringify(events, null, 2), events);\n};\n\nconst networkStopAction: BrowserActionHandler = async (ctx) => {\n const events = networkMonitors.get(ctx.page)?.events ?? [];\n networkMonitors.get(ctx.page)?.dispose();\n return ok('network_stop', JSON.stringify(events, null, 2), events);\n};\n\nconst collectAction: BrowserActionHandler = async (ctx, args) => {\n const events = networkMonitors.get(ctx.page)?.events ?? [];\n if (args.parse) {\n const parsed = await ctx.page.evaluate(\n ({ events, parse }) => {\n const parseFn = (0, eval)(`(${parse})`);\n return parseFn(events);\n },\n { events, parse: String(args.parse) },\n );\n return ok('collect', JSON.stringify(parsed, null, 2), parsed);\n }\n return ok('collect', JSON.stringify(events, null, 2), events);\n};\n\nconst tapAction: BrowserActionHandler = async (ctx, args) => {\n const pattern = String(args.capture ?? args.url ?? args.pattern ?? '');\n const timeoutMs = Number(args.timeout_ms ?? args.timeoutMs ?? 5000);\n const captured = await ctx.page.evaluate(\n async ({ pattern, timeoutMs }) => {\n let result: unknown = null;\n const g = globalThis as any;\n const originalFetch = g.fetch;\n g.fetch = async (...fetchArgs: any[]) => {\n const response = await originalFetch(...fetchArgs);\n try {\n const url = typeof fetchArgs[0] === 'string' ? fetchArgs[0] : fetchArgs[0]?.url ?? String(fetchArgs[0]);\n if ((!pattern || url.includes(pattern)) && result === null) {\n const clone = response.clone();\n const text = await clone.text();\n try { result = JSON.parse(text); } catch { result = text; }\n }\n } catch {}\n return response;\n };\n try {\n await new Promise((resolve) => setTimeout(resolve, timeoutMs));\n } finally {\n g.fetch = originalFetch;\n }\n return result;\n },\n { pattern, timeoutMs },\n );\n return ok('tap', JSON.stringify(captured, null, 2), captured);\n};\n\n// ─── Registry Construction ──────────────────────────────────────────────────\n\nexport function createBrowserActionRegistry(): BrowserActionRegistry {\n const handlers = new Map<string, BrowserActionHandler>();\n\n // Navigate\n handlers.set('open', navigateAction);\n handlers.set('navigate', navigateAction);\n // State / snapshot\n handlers.set('state', stateAction);\n handlers.set('snapshot', stateAction);\n // Interaction\n handlers.set('click', clickAction);\n handlers.set('type', typeAction);\n handlers.set('input', typeAction);\n handlers.set('scroll', scrollAction);\n handlers.set('back', backAction);\n handlers.set('keys', pressAction);\n handlers.set('press', pressAction);\n // Inspection\n handlers.set('screenshot', screenshotAction);\n handlers.set('images', imagesAction);\n // Eval\n handlers.set('console', evalAction);\n handlers.set('eval', evalAction);\n handlers.set('evaluate', evalAction);\n // Control\n handlers.set('dialog', dialogAction);\n handlers.set('close', closeAction);\n handlers.set('wait', waitAction);\n handlers.set('wait_for_navigation', waitForNavigationAction);\n handlers.set('wait_for_timeout', waitForTimeoutAction);\n handlers.set('wait_for_function', waitForFunctionAction);\n handlers.set('wait_for_network_idle', waitForNetworkIdleAction);\n // Pipeline-specific\n handlers.set('output', outputAction);\n handlers.set('assert', assertAction);\n handlers.set('select', selectAction);\n handlers.set('map', mapAction);\n handlers.set('filter', filterAction);\n handlers.set('sort', sortAction);\n handlers.set('limit', limitAction);\n handlers.set('fetch', fetchAction);\n handlers.set('collect', collectAction);\n handlers.set('tap', tapAction);\n // DOM / browser context\n handlers.set('element_text', elementTextAction);\n handlers.set('element_attribute', elementAttributeAction);\n handlers.set('bounding_box', boundingBoxAction);\n handlers.set('set_input_files', setInputFilesAction);\n handlers.set('cookies', getCookiesAction);\n handlers.set('get_cookies', getCookiesAction);\n handlers.set('add_cookies', addCookiesAction);\n handlers.set('clear_cookies', clearCookiesAction);\n handlers.set('tabs', listTabsAction);\n handlers.set('list_tabs', listTabsAction);\n handlers.set('new_tab', newTabAction);\n handlers.set('switch_tab', switchTabAction);\n // Network\n handlers.set('network_start', networkStartAction);\n handlers.set('network_events', networkEventsAction);\n handlers.set('network_stop', networkStopAction);\n\n return {\n get(name: string) { return handlers.get(name); },\n has(name: string) { return handlers.has(name); },\n names() { return [...handlers.keys()]; },\n async execute(name: string, ctx: BrowserActionContext, args: Record<string, unknown>): Promise<BrowserActionResult> {\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n if (ctx.manager.getExtensionProvider()) {\n const { runExtensionRegistryAction } = await import('./extension-registry-bridge.js');\n return runExtensionRegistryAction(name, ctx, args);\n }\n const handler = handlers.get(name);\n if (!handler) {\n return fail(name, 'UNKNOWN_ACTION', `Unknown browser action: ${name}`);\n }\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n try {\n return await handler(ctx, args);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n log.error({ err: e, action: name }, `Action failed: ${message}`);\n return fail(name, 'ACTION_ERROR', message);\n }\n },\n };\n}\n"],"mappings":";;;;;;;;;aAMqD;AAerD,MAAM,MAAM,aAAa,wBAAwB;AAEjD,MAAM,uBAAuB;AAC7B,MAAM,oBAAoB;AAqB1B,MAAM,kCAAkB,IAAI,SAA+B;AAI3D,SAAS,KAAK,KAAmC;AAC/C,QAAO,+BAA+B,IAAI,OAAO;;;AAInD,SAAS,kBAAkB,KAAoC;CAC7D,MAAM,UAAU,IAAI,QAAQ,QAAQ,UAAU;AAC9C,KAAI,CAAC,SAAS,SAAU,QAAO;AAG/B,KADgB,QAAQ,YACR,YAAa,QAAO;AACpC,QAAO;;AAGT,SAAS,YAAY,KAAwC;AAC3D,QAAQ,IAAI,QAAQ,QAAQ,UAAU,SAAS,eAA+B;;AAGhF,eAAe,aAAa,MAAY,UAA8B,WAAmB,WAAoC;CAC3H,MAAM,MAAM,UAAU,MAAM,GAAG,KAAK,QAAQ,SAAS,MAAM,CAAC,CAAC,OAAO,GAAG,KAAK,QAAQ,OAAO;AAC3F,OAAM,IAAI,QAAQ;EAAE,OAAO;EAAY,SAAS;EAAW,CAAC;CAC5D,IAAI,OAAO,MAAM,IAAI,aAAa;EAAE,MAAM;EAAM,SAAS;EAAW,CAAC;AACrE,KAAI,CAAC,QAAQ,CAAC,KAAK,MAAM,CAAE,QAAO;AAClC,KAAI,KAAK,SAAS,UAAW,QAAO,2BAA2B,MAAM,UAAU;AAC/E,QAAO;;AAGT,SAAS,oBAAoB,MAAY,MAA+B;CACtE,MAAM,WAAW,KAAK;CACtB,MAAM,OAAO,KAAK;CAClB,MAAM,OAAO,KAAK;CAClB,MAAM,SAAS,QAAQ,UAAU,MAAM,CAAC;CACxC,MAAM,UAAU,QAAQ,MAAM,MAAM,CAAC;CACrC,MAAM,UAAU,QAAQ,MAAM,MAAM,CAAC;AAErC,MADW,SAAS,IAAI,MAAM,UAAU,IAAI,MAAM,UAAU,IAAI,OACtD,EAAG,OAAM,IAAI,MAAM,+CAA+C;AAC5E,KAAI,OAAQ,QAAO,KAAK,QAAQ,SAAU,MAAM,CAAC,CAAC,OAAO;AACzD,KAAI,QAAS,QAAO,KAAK,UAAU,KAAM,MAAM,EAAE,EAAE,OAAO,OAAO,CAAC,CAAC,OAAO;CAC1E,MAAM,MAAM,KAAM,MAAM;CACxB,MAAM,MAAM,IAAI,QAAQ,IAAI;CAC5B,MAAM,YAAY,OAAO,IAAI,IAAI,MAAM,GAAG,IAAI,GAAG,KAAK,MAAM;CAC5D,MAAM,OAAO,OAAO,IAAI,IAAI,MAAM,MAAM,EAAE,CAAC,MAAM,GAAG;AACpD,KAAI,CAAC,SAAU,OAAM,IAAI,MAAM,gCAAgC;AAC/D,QAAO,KAAK,UAAU,UAAmB,OAAO,EAAE,MAAM,GAAG,KAAA,EAAU,CAAC,OAAO;;AAG/E,SAAS,mBAAmB,MAAY,MAA+B;CACrE,MAAM,WAAW,KAAK;CACtB,MAAM,QAAQ,KAAK;CACnB,MAAM,SAAS,QAAQ,UAAU,MAAM,CAAC;AAExC,KAAI,WADW,QAAQ,OAAO,MAAM,CACf,CAAE,OAAM,IAAI,MAAM,0CAA0C;AACjF,KAAI,OAAQ,QAAO,KAAK,QAAQ,SAAU,MAAM,CAAC,CAAC,OAAO;AACzD,QAAO,KAAK,WAAW,MAAO,MAAM,CAAC,CAAC,OAAO;;AAG/C,SAAS,GAAG,QAAgB,MAAc,MAAgB,WAAmE;AAC3H,QAAO;EAAE,IAAI;EAAM;EAAQ;EAAM;EAAM;EAAW;;AAGpD,SAAS,KAAK,QAAgB,MAAc,SAAiB,aAAuE;AAClI,QAAO;EAAE,IAAI;EAAO;EAAQ,OAAO;GAAE;GAAM;GAAS;EAAE;EAAa;;AAGrE,SAAS,SAAS,OAAyC;AACzD,QAAO,SAAS,OAAO,UAAU,YAAY,CAAC,MAAM,QAAQ,MAAM,GAAG,QAAmC,EAAE;;AAG5G,SAAS,aAAa,KAAoC;AACxD,QAAO,IAAI,UAAU;;AAGvB,SAAS,cAAc,KAA2B,MAAwC;AACxF,KAAI,WAAW,KAAM,QAAO,KAAK;AACjC,KAAI,OAAO,KAAK,SAAS,SAAU,QAAO,YAAY,aAAa,IAAI,EAAE,KAAK,KAAK;AACnF,QAAO,aAAa,IAAI;;AAG1B,SAAS,cAAc,GAAY,GAAoB;CACrD,MAAM,KAAK,OAAO,MAAM,WAAW,IAAI,OAAO,KAAK,GAAG;CACtD,MAAM,KAAK,OAAO,MAAM,WAAW,IAAI,OAAO,KAAK,GAAG;AACtD,KAAI,KAAK,GAAI,QAAO;AACpB,KAAI,KAAK,GAAI,QAAO;AACpB,QAAO;;AAGT,SAAS,sBAAsB,KAAa,SAAsC;AAChF,KAAI,CAAC,QAAS,QAAO;AACrB,QAAO,IAAI,SAAS,QAAQ;;AAK9B,MAAM,iBAAuC,OAAO,KAAK,SAAS;CAChE,MAAM,MAAM,OAAO,KAAK,OAAO,GAAG;AAClC,KAAI,CAAC,IAAK,QAAO,KAAK,YAAY,eAAe,kBAAkB;CAEnE,MAAM,eAAe,IAAI,QAAQ,QAAQ,UAAU,SAAS,qBAAqB;AACjF,KAAI,sBAAsB,IAAI,CAAE,QAAO,KAAK,YAAY,WAAW,6BAA6B;CAChG,MAAM,QAAQ,sBAAsB,KAAK,IAAI,QAAQ,OAAO,KAAK,UAAU;AAC3E,KAAI,MAAO,QAAO,KAAK,YAAY,WAAW,MAAM,QAAQ;AAC5D,yBAAwB,KAAK,EAAE,kBAAkB,cAAc,CAAC;CAEhE,MAAM,YAAa,KAAK,cAA0B,KAAK,WAAsB;CAC7E,MAAM,aAAa,KAAK,IAAI;AAC5B,OAAM,IAAI,KAAK,KAAK,KAAK;EAAa;EAAkB,SAAS;EAAY,CAAC;CAE9E,MAAM,QAAQ,MAAM,IAAI,KAAK,OAAO;CACpC,MAAM,WAAW,IAAI,KAAK,KAAK;AAE/B,KAAI,YAAY,aAAa,KAAK;EAChC,MAAM,gBAAgB,qBAAqB,UAAU,EAAE,kBAAkB,cAAc,CAAC;AACxF,MAAI,eAAe;AACjB,SAAM,IAAI,KAAK,KAAK,cAAc,CAAC,YAAY,GAAG;AAClD,UAAO,KAAK,YAAY,oBAAoB,cAAc;;;CAI9D,IAAI,WAAW;AACf,KAAI;AAAE,aAAW,MAAM,aAAa,IAAI,MAAM,KAAA,GAAW,mBAAmB,WAAW;SAAU;AAGjG,QAAO,GAAG,YAAY,iBADQ,MAAM,SAAS,WAAW,WAAW,4BAA4B,aAAa,MAChF;EAAE,KAAK;EAAU;EAAO,CAAC;;AAGvD,MAAM,cAAoC,OAAO,KAAK,SAAS;CAC7D,MAAM,SAAS,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;CACrE,MAAM,WAAW,KAAK;CACtB,MAAM,UAAU,KAAK,IAAI;AACzB,KAAI;EACF,MAAM,OAAO,MAAM,aAAa,IAAI,MAAM,UAAU,QAAQ,QAAQ;AACpE,SAAO,GAAG,SAAS,MAAM,EAAE,QAAQ,KAAK,QAAQ,CAAC;UAC1C,GAAG;AACV,SAAO,KAAK,SAAS,mBAAmB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIvF,MAAM,cAAoC,OAAO,KAAK,SAAS;CAC7D,MAAM,UAAU,KAAK,IAAI;AACzB,KAAI;AACF,MAAI,kBAAkB,IAAI,IAAI,KAAK,UAAU;AAC3C,SAAM,eAAe,IAAI,MAAM,OAAO,KAAK,SAAS,EAAE,YAAY,IAAI,CAAC;AACvE,UAAO,GAAG,SAAS,+BAA+B;;AAGpD,QADY,oBAAoB,IAAI,MAAM,KACjC,CAAC,MAAM,EAAE,SAAS,CAAC;AAC5B,SAAO,GAAG,SAAS,mBAAmB;UAC/B,GAAG;AACV,SAAO,KAAK,SAAS,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIpF,MAAM,aAAmC,OAAO,KAAK,SAAS;CAC5D,MAAM,UAAU,KAAK,IAAI;AACzB,KAAI;AACF,MAAI,kBAAkB,IAAI,IAAI,KAAK,UAAU;AAC3C,SAAM,cAAc,IAAI,MAAM,OAAO,KAAK,SAAS,EAAE,OAAO,KAAK,QAAQ,GAAG,EAAE,YAAY,IAAI,CAAC;AAC/F,OAAI,KAAK,WAAY,OAAM,IAAI,KAAK,SAAS,MAAM,QAAQ;AAC3D,UAAO,GAAG,QAAQ,gCAAgC;;EAEpD,MAAM,MAAM,mBAAmB,IAAI,MAAM,KAAK;AAC9C,QAAM,IAAI,MAAM,EAAE,SAAS,KAAK,IAAI,KAAM,QAAQ,EAAE,CAAC,CAAC,YAAY,GAAG;AACrE,QAAM,IAAI,KAAK,OAAO,KAAK,QAAQ,GAAG,EAAE,EAAE,SAAS,CAAC;AACpD,MAAI,KAAK,WAAY,OAAM,IAAI,KAAK,SAAS,MAAM,QAAQ;AAC3D,SAAO,GAAG,QAAQ,oBAAoB;UAC/B,GAAG;AACV,SAAO,KAAK,QAAQ,eAAe,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIlF,MAAM,eAAqC,OAAO,KAAK,SAAS;CAC9D,MAAM,YAAa,KAAK,aAAwB;CAChD,MAAM,SAAS,OAAO,KAAK,WAAW,WAAW,KAAK,SAAS;CAC/D,MAAM,KAAK,cAAc,SAAS,SAAS,CAAC;AAC5C,KAAI;AACF,MAAI,kBAAkB,IAAI,EAAE;AAC1B,SAAM,gBAAgB,IAAI,MAAM,IAAI,YAAY,IAAI,CAAC;AACrD,UAAO,GAAG,UAAU,YAAY,UAAU,MAAM,OAAO,iBAAiB;;AAE1E,QAAM,IAAI,KAAK,UAAU,EAAE,aAAa;AACrC,cAAmB,SAAS,GAAG,OAAO;KACtC,EAAE,QAAQ,IAAI,CAAC;AAClB,SAAO,GAAG,UAAU,YAAY,UAAU,MAAM,OAAO,KAAK;UACrD,GAAG;AACV,SAAO,KAAK,UAAU,iBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAItF,MAAM,mBAAyC,OAAO,KAAK,SAAS;CAClE,MAAM,UAAU,KAAK,IAAI;CACzB,MAAM,WAAW,KAAK;CACtB,MAAM,WAAW,KAAK,cAAc,QAAQ,KAAK,aAAa;CAC9D,MAAM,OAAO,KAAK;AAClB,KAAI;EACF,IAAI;AACJ,MAAI,UAAU,MAAM,EAAE;GACpB,MAAM,MAAM,IAAI,KAAK,QAAQ,SAAS,MAAM,CAAC,CAAC,OAAO;AACrD,SAAM,IAAI,QAAQ;IAAE,OAAO;IAAW;IAAS,CAAC;AAChD,SAAM,MAAM,IAAI,WAAW;IAAE,MAAM;IAAO;IAAS,CAAC;QAEpD,OAAM,MAAM,IAAI,KAAK,WAAW;GAAE,MAAM;GAAO;GAAU;GAAS,CAAC;EAErE,MAAM,WAAW;GAAE,MAAM;GAAuB;GAAM,MAAM,IAAI,SAAS,SAAS;GAAE,UAAU;GAAa;AAC3G,SAAO,GAAG,cAAc,wBAAwB,IAAI,OAAO,WAAW,EAAE,OAAO,IAAI,QAAQ,EAAE,CAAC,SAAS,CAAC;UACjG,GAAG;AACV,SAAO,KAAK,cAAc,qBAAqB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAI9F,MAAM,aAAmC,OAAO,KAAK,SAAS;CAC5D,MAAM,YAAa,KAAK,WAAsB;CAC9C,MAAM,UAAU,KAAK,IAAI;AACzB,KAAI;AAEF,MAAI,CAAC,MADkB,IAAI,KAAK,OAAO;GAAa;GAAkB;GAAS,CAAC,CACjE,QAAO,KAAK,QAAQ,cAAc,+BAA+B;EAChF,MAAM,QAAQ,MAAM,IAAI,KAAK,OAAO;EACpC,MAAM,MAAM,IAAI,KAAK,KAAK;AAC1B,SAAO,GAAG,QAAQ,sBAAsB,MAAM,SAAS,OAAO;GAAE;GAAK;GAAO,CAAC;UACtE,GAAG;AACV,SAAO,KAAK,QAAQ,eAAe,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIlF,MAAM,cAAoC,OAAO,KAAK,SAAS;CAC7D,MAAM,MAAM,OAAO,KAAK,OAAO,GAAG;AAClC,KAAI,CAAC,IAAK,QAAO,KAAK,SAAS,eAAe,kBAAkB;AAChE,KAAI;AACF,QAAM,IAAI,KAAK,SAAS,MAAM,IAAI;AAClC,SAAO,GAAG,SAAS,gBAAgB,MAAM;UAClC,GAAG;AACV,SAAO,KAAK,SAAS,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIpF,MAAM,aAAmC,OAAO,KAAK,SAAS;CAC5D,MAAM,KAAM,KAAK,cAA0B,KAAK,cAA0B,KAAK,QAAmB;AAClG,KAAI,CAAC,GAAG,MAAM,CAAE,QAAO,KAAK,QAAQ,cAAc,oCAAoC;AACtF,KAAI;EACF,MAAM,SAAS,MAAM,IAAI,KAAK,SAAS,GAAG;EAC1C,MAAM,aAAa,WAAW,KAAA,IAAY,cAAc,KAAK,UAAU,QAAQ,MAAM,EAAE;AAIvF,SAAO,GAAG,QAHG,WAAW,SAAS,uBAC7B,GAAG,WAAW,MAAM,GAAG,qBAAqB,CAAC,qBAC7C,YACoB,OAAO;UACxB,GAAG;AACV,SAAO,KAAK,QAAQ,eAAe,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIlF,MAAM,eAAqC,OAAO,KAAK,SAAS;CAC9D,MAAM,WAAW,KAAK;CACtB,MAAM,YAAY,OAAO,KAAK,cAAc,WAAW,KAAK,YAAY;AACxE,KAAI;EACF,MAAM,SAAS,MAAM,IAAI,KAAK,UAC3B,CAAC,KAAK,SAAkC;GACvC,MAAM,IAAI,WAAW;GACrB,MAAM,OAAO,MAAM,EAAE,cAAc,IAAI,GAAG;AAC1C,OAAI,CAAC,KAAM,QAAO,EAAE;AAEpB,UADa,MAAM,KAAK,KAAK,iBAAiB,MAAM,CACzC,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,SAAc;IAC3C,KAAK,OAAO,IAAI,OAAO,GAAG;IAC1B,KAAK,OAAO,IAAI,OAAO,GAAG;IAC1B,OAAO,OAAO,IAAI,gBAAgB,EAAE;IACpC,QAAQ,OAAO,IAAI,iBAAiB,EAAE;IACvC,EAAE;KAEL,CAAC,UAAU,MAAM,IAAI,MAAM,UAAU,CACtC;AACD,MAAI,CAAC,UAAU,OAAO,WAAW,EAAG,QAAO,GAAG,UAAU,gCAAgC,EAAE,CAAC;EAC3F,MAAM,QAAQ,OAAO,KAAK,KAAU,MAClC,GAAG,IAAI,EAAE,IAAI,IAAI,OAAO,WAAW,KAAK,IAAI,MAAM,GAAG,IAAI,OAAO,OAAO,IAAI,MAAM;AACnF,SAAO,GAAG,UAAU,SAAS,OAAO,OAAO,cAAc,MAAM,KAAK,KAAK,IAAI,OAAO;UAC7E,GAAG;AACV,SAAO,KAAK,UAAU,iBAAiB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAItF,MAAM,cAAoC,OAAO,KAAK,UAAU;AAC9D,OAAM,IAAI,QAAQ,UAAU,IAAI,OAAO;AACvC,QAAO,GAAG,SAAS,uBAAuB;;AAG5C,MAAM,eAAqC,OAAO,KAAK,SAAS;CAC9D,MAAM,SAAS,KAAK;AACpB,KAAI,WAAW,YAAY,WAAW,UACpC,QAAO,KAAK,UAAU,kBAAkB,2CAAuC;AAKjF,KAAI,CADQ,IAAI,WACN,QAAO,KAAK,UAAU,iBAAiB,iCAAiC;AAElF,QAAO,GAAG,UAAU,UAAU,OAAO,KAAK;;AAG5C,MAAM,aAAmC,OAAO,KAAK,SAAS;CAC5D,MAAM,WAAW,KAAK;CACtB,MAAM,OAAO,KAAK;CAClB,MAAM,QAAS,KAAK,SAAwE;CAC5F,MAAM,YAAY,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,KAAK,IAAI;AACnF,KAAI;AACF,MAAI,UAAU,MAAM,CAClB,OAAM,IAAI,KAAK,QAAQ,SAAS,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ;GAAE;GAAO,SAAS;GAAW,CAAC;WAC7E,MAAM,MAAM,CACrB,OAAM,IAAI,KAAK,UAAU,KAAK,MAAM,CAAC,CAAC,OAAO,CAAC,QAAQ;GAAE,OAAO;GAAW,SAAS;GAAW,CAAC;WACtF,KAAK,YAAY,KAAK,WAC/B,OAAM,IAAI,KAAK,gBAAgB,OAAO,KAAK,YAAY,KAAK,WAAW,EAAE,MAAM,EAAE,SAAS,WAAW,CAAC;OACjG;GACL,MAAM,KAAK,OAAO,KAAK,OAAO,WAAW,KAAK,KAAK;AACnD,SAAM,IAAI,KAAK,eAAe,GAAG;;AAEnC,SAAO,GAAG,QAAQ,kBAAkB;UAC7B,GAAG;AACV,SAAO,KAAK,QAAQ,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAInF,MAAM,eAAqC,OAAO,KAAK,SAAS;AAC9D,QAAO,GAAG,UAAU,oBAAoB,cAAc,KAAK,KAAK,CAAC;;AAGnE,MAAM,eAAqC,OAAO,KAAK,SAAS;CAC9D,MAAM,SAAS,cAAc,KAAK,KAAK;AACvC,KAAI,YAAY,QAAQ,KAAK,UAAU,OAAO,KAAK,KAAK,UAAU,KAAK,OAAO,CAC5E,QAAO,KAAK,UAAU,oBAAoB,2BAA2B,KAAK,UAAU,KAAK,OAAO,CAAC,QAAQ,KAAK,UAAU,OAAO,EAAE,MAAM,GAAG,IAAI,GAAG;AAEnJ,KAAI,cAAc,QAAQ,CAAC,cAAc,QAAQ,KAAK,SAAS,CAC7D,QAAO,KAAK,UAAU,oBAAoB,6BAA6B,KAAK,UAAU,KAAK,SAAS,GAAG;AAEzG,KAAI,aAAa,MAAM;EACrB,MAAM,UAAU,IAAI,OAAO,OAAO,KAAK,QAAQ,CAAC;AAChD,MAAI,CAAC,QAAQ,KAAK,OAAO,UAAU,GAAG,CAAC,CACrC,QAAO,KAAK,UAAU,oBAAoB,4BAA4B,QAAQ,OAAO,GAAG;;AAG5F,KAAI,KAAK,WAAW,QAAQ,CAAC,cAAc,OAAO,CAChD,QAAO,KAAK,UAAU,oBAAoB,oCAAoC,KAAK,UAAU,OAAO,GAAG;AAEzG,KAAI,KAAK,WAAW,SAAS,WAAW,KAAA,KAAa,WAAW,QAAQ,WAAW,IACjF,QAAO,KAAK,UAAU,oBAAoB,0BAA0B;AAEtE,QAAO,GAAG,UAAU,oBAAoB;;AAG1C,MAAM,0BAAgD,OAAO,KAAK,SAAS;CACzE,MAAM,UAAU,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,KAAK,IAAI;CACjF,MAAM,YAAa,KAAK,cAAyB;AACjD,KAAI;AACF,QAAM,IAAI,KAAK,iBAAiB,WAAkB,EAAE,SAAS,CAAC;AAC9D,SAAO,GAAG,uBAAuB,6BAA6B;UACvD,GAAG;AACV,SAAO,KAAK,uBAAuB,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIlG,MAAM,uBAA6C,OAAO,KAAK,SAAS;CACtE,MAAM,KAAK,OAAO,KAAK,MAAM,KAAK,cAAc,IAAK;AACrD,OAAM,IAAI,KAAK,eAAe,OAAO,SAAS,GAAG,GAAG,KAAK,IAAK;AAC9D,QAAO,GAAG,oBAAoB,UAAU,GAAG,KAAK;;AAGlD,MAAM,wBAA8C,OAAO,KAAK,SAAS;CACvE,MAAM,aAAa,OAAO,KAAK,cAAc,KAAK,YAAY,GAAG;AACjE,KAAI,CAAC,WAAW,MAAM,CAAE,QAAO,KAAK,qBAAqB,sBAAsB,yBAAyB;CACxG,MAAM,UAAU,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,KAAK,IAAI;AACjF,KAAI;AACF,QAAM,IAAI,KAAK,gBAAgB,YAAY,MAAM,EAAE,SAAS,CAAC;AAC7D,SAAO,GAAG,qBAAqB,2BAA2B;UACnD,GAAG;AACV,SAAO,KAAK,qBAAqB,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIhG,MAAM,2BAAiD,OAAO,KAAK,SAAS;CAC1E,MAAM,UAAU,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,KAAK,IAAI;AACjF,KAAI;AACF,QAAM,IAAI,KAAK,iBAAiB,eAAe,EAAE,SAAS,CAAC;AAC3D,SAAO,GAAG,yBAAyB,wBAAwB;UACpD,GAAG;AACV,SAAO,KAAK,yBAAyB,gBAAgB,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE,CAAC;;;AAIpG,MAAM,oBAA0C,OAAO,KAAK,SAAS;CACnE,MAAM,WAAW,OAAO,KAAK,YAAY,GAAG;AAC5C,KAAI,CAAC,SAAU,QAAO,KAAK,gBAAgB,oBAAoB,uBAAuB;CACtF,MAAM,UAAU,KAAK,IAAI;CACzB,MAAM,MAAM,IAAI,KAAK,QAAQ,SAAS,CAAC,OAAO;AAC9C,OAAM,IAAI,QAAQ;EAAE,OAAO;EAAY;EAAS,CAAC;CACjD,MAAM,OAAO,MAAM,IAAI,UAAU,EAAE,SAAS,CAAC,CAAC,YAAY,IAAI,YAAY,EAAE,SAAS,CAAC,CAAC;AACvF,QAAO,GAAG,gBAAgB,OAAO,QAAQ,GAAG,EAAE,QAAQ,GAAG;;AAG3D,MAAM,yBAA+C,OAAO,KAAK,SAAS;CACxE,MAAM,WAAW,OAAO,KAAK,YAAY,GAAG;CAC5C,MAAM,YAAY,OAAO,KAAK,aAAa,GAAG;AAC9C,KAAI,CAAC,YAAY,CAAC,UAAW,QAAO,KAAK,qBAAqB,gBAAgB,sCAAsC;CACpH,MAAM,UAAU,KAAK,IAAI;CACzB,MAAM,MAAM,IAAI,KAAK,QAAQ,SAAS,CAAC,OAAO;AAC9C,OAAM,IAAI,QAAQ;EAAE,OAAO;EAAY;EAAS,CAAC;CACjD,MAAM,QAAQ,MAAM,IAAI,aAAa,WAAW,EAAE,SAAS,CAAC;AAC5D,QAAO,GAAG,qBAAqB,SAAS,IAAI,MAAM;;AAGpD,MAAM,oBAA0C,OAAO,KAAK,SAAS;CACnE,MAAM,WAAW,OAAO,KAAK,YAAY,GAAG;AAC5C,KAAI,CAAC,SAAU,QAAO,KAAK,gBAAgB,oBAAoB,uBAAuB;CACtF,MAAM,UAAU,KAAK,IAAI;CACzB,MAAM,MAAM,IAAI,KAAK,QAAQ,SAAS,CAAC,OAAO;AAC9C,OAAM,IAAI,QAAQ;EAAE,OAAO;EAAW;EAAS,CAAC;CAChD,MAAM,MAAM,MAAM,IAAI,YAAY,EAAE,SAAS,CAAC;AAC9C,QAAO,GAAG,gBAAgB,KAAK,UAAU,IAAI,EAAE,IAAI;;AAGrD,MAAM,sBAA4C,OAAO,KAAK,SAAS;CACrE,MAAM,WAAW,OAAO,KAAK,YAAY,GAAG;CAC5C,MAAM,QAAQ,MAAM,QAAQ,KAAK,MAAM,GAAG,KAAK,MAAM,IAAI,OAAO,GAAG,OAAO,KAAK,SAAS,WAAW,CAAC,KAAK,KAAK,GAAG,EAAE;AACnH,KAAI,CAAC,YAAY,MAAM,WAAW,EAAG,QAAO,KAAK,mBAAmB,gBAAgB,kCAAkC;AACtH,OAAM,IAAI,KAAK,QAAQ,SAAS,CAAC,OAAO,CAAC,cAAc,OAAO,EAAE,SAAS,KAAK,IAAI,EAAE,CAAC;AACrF,QAAO,GAAG,mBAAmB,YAAY,MAAM,OAAO,YAAY,EAAE,OAAO,CAAC;;AAG9E,MAAM,mBAAyC,OAAO,KAAK,SAAS;CAClE,MAAM,OAAO,MAAM,QAAQ,KAAK,KAAK,GAAG,KAAK,KAAK,IAAI,OAAO,GAAG,KAAA;CAChE,MAAM,UAAU,MAAM,IAAI,KAAK,SAAS,CAAC,QAAQ,KAAK;AACtD,QAAO,GAAG,WAAW,KAAK,UAAU,SAAS,MAAM,EAAE,EAAE,QAAQ;;AAGjE,MAAM,mBAAyC,OAAO,KAAK,SAAS;CAClE,MAAM,UAAU,MAAM,QAAQ,KAAK,QAAQ,GAAG,KAAK,UAAmB,EAAE;AACxE,KAAI,QAAQ,WAAW,EAAG,QAAO,KAAK,eAAe,gBAAgB,oCAAoC;AACzG,OAAM,IAAI,KAAK,SAAS,CAAC,WAAW,QAAQ;AAC5C,QAAO,GAAG,eAAe,SAAS,QAAQ,OAAO,aAAa;;AAGhE,MAAM,qBAA2C,OAAO,QAAQ;AAC9D,OAAM,IAAI,KAAK,SAAS,CAAC,cAAc;AACvC,QAAO,GAAG,iBAAiB,mBAAmB;;AAGhD,MAAM,iBAAuC,OAAO,QAAQ;CAC1D,MAAM,QAAQ,IAAI,KAAK,SAAS,CAAC,OAAO;CACxC,MAAM,OAAO,MAAM,QAAQ,IAAI,MAAM,IAAI,OAAO,MAAM,WAAW;EAAE;EAAO,KAAK,KAAK,KAAK;EAAE,OAAO,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG;EAAE,EAAE,CAAC;AACzI,QAAO,GAAG,QAAQ,KAAK,UAAU,MAAM,MAAM,EAAE,EAAE,KAAK;;AAGxD,MAAM,eAAqC,OAAO,KAAK,SAAS;CAC9D,MAAM,OAAO,MAAM,IAAI,KAAK,SAAS,CAAC,SAAS;AAC/C,KAAI,KAAK,IAAK,OAAM,KAAK,KAAK,OAAO,KAAK,IAAI,EAAE;EAAE,WAAW;EAAoB,SAAS,KAAK,IAAI;EAAE,CAAC;AACtG,QAAO,GAAG,WAAW,eAAe,KAAK,KAAK,IAAI;EAAE,KAAK,KAAK,KAAK;EAAE,OAAO,MAAM,KAAK,OAAO,CAAC,YAAY,GAAG;EAAE,CAAC;;AAGnH,MAAM,kBAAwC,OAAO,KAAK,SAAS;CACjE,MAAM,QAAQ,OAAO,KAAK,SAAS,KAAK,aAAa,EAAE;CAEvD,MAAM,OADQ,IAAI,KAAK,SAAS,CAAC,OACf,CAAC;AACnB,KAAI,CAAC,KAAM,QAAO,KAAK,cAAc,iBAAiB,mBAAmB,QAAQ;AACjF,OAAM,KAAK,cAAc;AACzB,QAAO,GAAG,cAAc,mBAAmB,MAAM,IAAI;EAAE;EAAO,KAAK,KAAK,KAAK;EAAE,CAAC;;AAGlF,MAAM,eAAqC,OAAO,KAAK,SAAS;CAC9D,MAAM,SAAS,UAAU,OAAO,KAAK,OAAO,aAAa,IAAI;CAC7D,MAAM,OAAO,OAAO,KAAK,QAAQ,KAAK,SAAS,GAAG;CAClD,MAAM,QAAQ,OAAO,YAAY,QAAQ,KAAK,GAAG;AACjD,QAAO,GAAG,UAAU,OAAO,UAAU,WAAW,QAAQ,KAAK,UAAU,OAAO,MAAM,EAAE,EAAE,MAAM;;AAGhG,MAAM,YAAkC,OAAO,KAAK,SAAS;CAC3D,MAAM,SAAS,UAAU,OAAO,KAAK,OAAO,aAAa,IAAI;AAC7D,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO,KAAK,OAAO,iBAAiB,6BAA6B;CAC7F,MAAM,OAAO,OAAO,KAAK,QAAQ,GAAG;CACpC,MAAM,SAAS,OAAO,OAAO,KAAK,SAAS,YAAY,MAAM,KAAK,CAAC,GAAG;AACtE,QAAO,GAAG,OAAO,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAG3D,MAAM,eAAqC,OAAO,KAAK,SAAS;CAC9D,MAAM,SAAS,UAAU,OAAO,KAAK,OAAO,aAAa,IAAI;AAC7D,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO,KAAK,UAAU,iBAAiB,gCAAgC;CACnG,MAAM,OAAO,OAAO,KAAK,QAAQ,GAAG;CACpC,MAAM,SAAS,KAAK;CACpB,MAAM,WAAW,KAAK;CACtB,MAAM,SAAS,KAAK,WAAW;CAC/B,MAAM,SAAS,OAAO,QAAQ,SAAS;EACrC,MAAM,QAAQ,OAAO,YAAY,MAAM,KAAK,GAAG;AAC/C,MAAI,YAAY,KAAM,QAAO,KAAK,UAAU,MAAM,KAAK,KAAK,UAAU,OAAO;AAC7E,MAAI,cAAc,KAAM,QAAO,cAAc,OAAO,SAAS;AAC7D,MAAI,OAAQ,QAAO,cAAc,MAAM;AACvC,SAAO,cAAc,MAAM;GAC3B;AACF,QAAO,GAAG,UAAU,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAG9D,MAAM,aAAmC,OAAO,KAAK,SAAS;CAC5D,MAAM,SAAS,UAAU,OAAO,KAAK,OAAO,aAAa,IAAI;AAC7D,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO,KAAK,QAAQ,iBAAiB,8BAA8B;CAC/F,MAAM,OAAO,OAAO,KAAK,QAAQ,GAAG;CACpC,MAAM,YAAY,OAAO,KAAK,aAAa,MAAM;CACjD,MAAM,SAAS,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,MAAM;EAGxC,MAAM,MAAM,cAFD,OAAO,YAAY,GAAG,KAAK,GAAG,GAC9B,OAAO,YAAY,GAAG,KAAK,GAAG,EACR;AACjC,SAAO,cAAc,SAAS,CAAC,MAAM;GACrC;AACF,QAAO,GAAG,QAAQ,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAG5D,MAAM,cAAoC,OAAO,KAAK,SAAS;CAC7D,MAAM,SAAS,UAAU,OAAO,KAAK,OAAO,aAAa,IAAI;AAC7D,KAAI,CAAC,MAAM,QAAQ,OAAO,CAAE,QAAO,KAAK,SAAS,iBAAiB,+BAA+B;CACjG,MAAM,QAAQ,KAAK,IAAI,GAAG,OAAO,KAAK,SAAS,KAAK,SAAS,GAAG,CAAC;CACjE,MAAM,SAAS,KAAK,IAAI,GAAG,OAAO,KAAK,UAAU,EAAE,CAAC;CACpD,MAAM,SAAS,OAAO,MAAM,QAAQ,SAAS,MAAM;AACnD,QAAO,GAAG,SAAS,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAG7D,MAAM,cAAoC,OAAO,KAAK,SAAS;CAC7D,MAAM,MAAM,OAAO,KAAK,OAAO,GAAG;AAClC,KAAI,CAAC,IAAK,QAAO,KAAK,SAAS,eAAe,kBAAkB;CAChE,MAAM,SAAS,OAAO,KAAK,UAAU,MAAM;CAC3C,MAAM,UAAU,SAAS,KAAK,QAAQ;CACtC,MAAM,OAAO,KAAK,SAAS,KAAA,IAAY,KAAA,IAAY,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,KAAK,UAAU,KAAK,KAAK;CACxH,MAAM,SAAS,MAAM,IAAI,KAAK,SAC5B,OAAO,EAAE,KAAK,QAAQ,SAAS,WAAW;EACxC,MAAM,WAAW,MAAM,MAAM,KAAK;GAAE;GAAQ;GAAS;GAAM,CAAC;EAC5D,MAAM,OAAO,MAAM,SAAS,MAAM;EAClC,MAAM,cAAc,SAAS,QAAQ,IAAI,eAAe,IAAI;EAC5D,IAAI,SAAkB;AACtB,MAAI,YAAY,SAAS,mBAAmB,CAC1C,KAAI;AAAE,YAAS,KAAK,MAAM,KAAK;UAAU;AAAE,YAAS;;AAEtD,SAAO;GAAE,IAAI,SAAS;GAAI,QAAQ,SAAS;GAAQ,KAAK,SAAS;GAAK,SAAS,OAAO,YAAY,SAAS,QAAQ,SAAS,CAAC;GAAE,MAAM;GAAQ;IAE/I;EAAE;EAAK;EAAQ;EAAS;EAAM,CAC/B;AACD,QAAO,GAAG,SAAS,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAG7D,MAAM,qBAA2C,OAAO,KAAK,SAAS;AACpE,iBAAgB,IAAI,IAAI,KAAK,EAAE,SAAS;CACxC,MAAM,cAAc,KAAK,iBAAiB,QAAQ,KAAK,gBAAgB;CACvE,MAAM,aAAa,OAAO,KAAK,gBAAgB,WAAW,KAAK,cAAc,OAAO,KAAK,eAAe,WAAW,KAAK,aAAa,KAAA;CACrI,MAAM,SAAyB,EAAE;CACjC,MAAM,aAAa,YAAiB;AAClC,MAAI,CAAC,sBAAsB,QAAQ,KAAK,EAAE,WAAW,CAAE;AACvD,SAAO,KAAK;GAAE,MAAM;GAAW,KAAK,QAAQ,KAAK;GAAE,QAAQ,QAAQ,QAAQ;GAAE,cAAc,QAAQ,cAAc;GAAE,UAAU,QAAQ,UAAU;GAAE,WAAW,KAAK,KAAK;GAAE,CAAC;;CAE3K,MAAM,aAAa,OAAO,aAAkB;AAC1C,MAAI,CAAC,sBAAsB,SAAS,KAAK,EAAE,WAAW,CAAE;EACxD,MAAM,QAAsB;GAAE,MAAM;GAAY,KAAK,SAAS,KAAK;GAAE,QAAQ,SAAS,QAAQ;GAAE,WAAW,KAAK,KAAK;GAAE;AACvH,MAAI,YACF,OAAM,OAAO,MAAM,SAAS,MAAM,CAAC,YAAY,KAAA,EAAU;AAE3D,SAAO,KAAK,MAAM;;CAEpB,MAAM,mBAAmB,YAAiB;AACxC,MAAI,CAAC,sBAAsB,QAAQ,KAAK,EAAE,WAAW,CAAE;AACvD,SAAO,KAAK;GAAE,MAAM;GAAiB,KAAK,QAAQ,KAAK;GAAE,QAAQ,QAAQ,QAAQ;GAAE,WAAW,QAAQ,SAAS,EAAE;GAAW,WAAW,KAAK,KAAK;GAAE,CAAC;;AAEtJ,KAAI,KAAK,GAAG,WAAW,UAAU;AACjC,KAAI,KAAK,GAAG,YAAY,WAAW;AACnC,KAAI,KAAK,GAAG,iBAAiB,gBAAgB;AAC7C,iBAAgB,IAAI,IAAI,MAAM;EAC5B;EACA;EACA;EACA,eAAe;AACb,OAAI,KAAK,IAAI,WAAW,UAAU;AAClC,OAAI,KAAK,IAAI,YAAY,WAAW;AACpC,OAAI,KAAK,IAAI,iBAAiB,gBAAgB;AAC9C,mBAAgB,OAAO,IAAI,KAAK;;EAEnC,CAAC;AACF,QAAO,GAAG,iBAAiB,+BAA+B;EAAE;EAAa;EAAY,CAAC;;AAGxF,MAAM,sBAA4C,OAAO,QAAQ;CAE/D,MAAM,SADU,gBAAgB,IAAI,IAAI,KAClB,EAAE,UAAU,EAAE;AACpC,QAAO,GAAG,kBAAkB,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAGtE,MAAM,oBAA0C,OAAO,QAAQ;CAC7D,MAAM,SAAS,gBAAgB,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE;AAC1D,iBAAgB,IAAI,IAAI,KAAK,EAAE,SAAS;AACxC,QAAO,GAAG,gBAAgB,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAGpE,MAAM,gBAAsC,OAAO,KAAK,SAAS;CAC/D,MAAM,SAAS,gBAAgB,IAAI,IAAI,KAAK,EAAE,UAAU,EAAE;AAC1D,KAAI,KAAK,OAAO;EACd,MAAM,SAAS,MAAM,IAAI,KAAK,UAC3B,EAAE,QAAQ,YAAY;AAErB,WADiB,GAAG,MAAM,IAAI,MAAM,GACtB,CAAC,OAAO;KAExB;GAAE;GAAQ,OAAO,OAAO,KAAK,MAAM;GAAE,CACtC;AACD,SAAO,GAAG,WAAW,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAE/D,QAAO,GAAG,WAAW,KAAK,UAAU,QAAQ,MAAM,EAAE,EAAE,OAAO;;AAG/D,MAAM,YAAkC,OAAO,KAAK,SAAS;CAC3D,MAAM,UAAU,OAAO,KAAK,WAAW,KAAK,OAAO,KAAK,WAAW,GAAG;CACtE,MAAM,YAAY,OAAO,KAAK,cAAc,KAAK,aAAa,IAAK;CACnE,MAAM,WAAW,MAAM,IAAI,KAAK,SAC9B,OAAO,EAAE,SAAS,gBAAgB;EAChC,IAAI,SAAkB;EACtB,MAAM,IAAI;EACV,MAAM,gBAAgB,EAAE;AACxB,IAAE,QAAQ,OAAO,GAAG,cAAqB;GACvC,MAAM,WAAW,MAAM,cAAc,GAAG,UAAU;AAClD,OAAI;IACF,MAAM,MAAM,OAAO,UAAU,OAAO,WAAW,UAAU,KAAK,UAAU,IAAI,OAAO,OAAO,UAAU,GAAG;AACvG,SAAK,CAAC,WAAW,IAAI,SAAS,QAAQ,KAAK,WAAW,MAAM;KAE1D,MAAM,OAAO,MADC,SAAS,OACC,CAAC,MAAM;AAC/B,SAAI;AAAE,eAAS,KAAK,MAAM,KAAK;aAAU;AAAE,eAAS;;;WAEhD;AACR,UAAO;;AAET,MAAI;AACF,SAAM,IAAI,SAAS,YAAY,WAAW,SAAS,UAAU,CAAC;YACtD;AACR,KAAE,QAAQ;;AAEZ,SAAO;IAET;EAAE;EAAS;EAAW,CACvB;AACD,QAAO,GAAG,OAAO,KAAK,UAAU,UAAU,MAAM,EAAE,EAAE,SAAS;;AAK/D,SAAgB,8BAAqD;CACnE,MAAM,2BAAW,IAAI,KAAmC;AAGxD,UAAS,IAAI,QAAQ,eAAe;AACpC,UAAS,IAAI,YAAY,eAAe;AAExC,UAAS,IAAI,SAAS,YAAY;AAClC,UAAS,IAAI,YAAY,YAAY;AAErC,UAAS,IAAI,SAAS,YAAY;AAClC,UAAS,IAAI,QAAQ,WAAW;AAChC,UAAS,IAAI,SAAS,WAAW;AACjC,UAAS,IAAI,UAAU,aAAa;AACpC,UAAS,IAAI,QAAQ,WAAW;AAChC,UAAS,IAAI,QAAQ,YAAY;AACjC,UAAS,IAAI,SAAS,YAAY;AAElC,UAAS,IAAI,cAAc,iBAAiB;AAC5C,UAAS,IAAI,UAAU,aAAa;AAEpC,UAAS,IAAI,WAAW,WAAW;AACnC,UAAS,IAAI,QAAQ,WAAW;AAChC,UAAS,IAAI,YAAY,WAAW;AAEpC,UAAS,IAAI,UAAU,aAAa;AACpC,UAAS,IAAI,SAAS,YAAY;AAClC,UAAS,IAAI,QAAQ,WAAW;AAChC,UAAS,IAAI,uBAAuB,wBAAwB;AAC5D,UAAS,IAAI,oBAAoB,qBAAqB;AACtD,UAAS,IAAI,qBAAqB,sBAAsB;AACxD,UAAS,IAAI,yBAAyB,yBAAyB;AAE/D,UAAS,IAAI,UAAU,aAAa;AACpC,UAAS,IAAI,UAAU,aAAa;AACpC,UAAS,IAAI,UAAU,aAAa;AACpC,UAAS,IAAI,OAAO,UAAU;AAC9B,UAAS,IAAI,UAAU,aAAa;AACpC,UAAS,IAAI,QAAQ,WAAW;AAChC,UAAS,IAAI,SAAS,YAAY;AAClC,UAAS,IAAI,SAAS,YAAY;AAClC,UAAS,IAAI,WAAW,cAAc;AACtC,UAAS,IAAI,OAAO,UAAU;AAE9B,UAAS,IAAI,gBAAgB,kBAAkB;AAC/C,UAAS,IAAI,qBAAqB,uBAAuB;AACzD,UAAS,IAAI,gBAAgB,kBAAkB;AAC/C,UAAS,IAAI,mBAAmB,oBAAoB;AACpD,UAAS,IAAI,WAAW,iBAAiB;AACzC,UAAS,IAAI,eAAe,iBAAiB;AAC7C,UAAS,IAAI,eAAe,iBAAiB;AAC7C,UAAS,IAAI,iBAAiB,mBAAmB;AACjD,UAAS,IAAI,QAAQ,eAAe;AACpC,UAAS,IAAI,aAAa,eAAe;AACzC,UAAS,IAAI,WAAW,aAAa;AACrC,UAAS,IAAI,cAAc,gBAAgB;AAE3C,UAAS,IAAI,iBAAiB,mBAAmB;AACjD,UAAS,IAAI,kBAAkB,oBAAoB;AACnD,UAAS,IAAI,gBAAgB,kBAAkB;AAE/C,QAAO;EACL,IAAI,MAAc;AAAE,UAAO,SAAS,IAAI,KAAK;;EAC7C,IAAI,MAAc;AAAE,UAAO,SAAS,IAAI,KAAK;;EAC7C,QAAQ;AAAE,UAAO,CAAC,GAAG,SAAS,MAAM,CAAC;;EACrC,MAAM,QAAQ,MAAc,KAA2B,MAA6D;AAClH,OAAI,IAAI,QAAQ,QACd,QAAO,KAAK,MAAM,WAAW,wBAAwB;AAEvD,OAAI,IAAI,QAAQ,sBAAsB,EAAE;IACtC,MAAM,EAAE,+BAA+B,MAAM,OAAO;AACpD,WAAO,2BAA2B,MAAM,KAAK,KAAK;;GAEpD,MAAM,UAAU,SAAS,IAAI,KAAK;AAClC,OAAI,CAAC,QACH,QAAO,KAAK,MAAM,kBAAkB,2BAA2B,OAAO;AAExE,OAAI,IAAI,QAAQ,QACd,QAAO,KAAK,MAAM,WAAW,wBAAwB;AAEvD,OAAI;AACF,WAAO,MAAM,QAAQ,KAAK,KAAK;YACxB,GAAG;IACV,MAAM,UAAU,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AAC1D,QAAI,MAAM;KAAE,KAAK;KAAG,QAAQ;KAAM,EAAE,kBAAkB,UAAU;AAChE,WAAO,KAAK,MAAM,gBAAgB,QAAQ;;;EAG/C"}
|
|
1
|
+
{"version":3,"file":"registry.js","names":[],"sources":["../../../../src/browser/actions/registry.ts"],"sourcesContent":["/**\n * Browser Action Registry — unified action layer shared by browser_use tool, CLI, and pipeline.\n */\n\nimport type { Page } from 'playwright-core';\n\nimport { createLogger } from '../../utils/logger.js';\nimport { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from '../url-policy.js';\nimport { checkWebsiteBlocklist } from '../../agent/tools/url-safety.js';\nimport { resolveBrowserCommandTimeoutMs } from '../browser-command-timeout.js';\nimport { truncateSnapshotAtBoundary } from '../snapshot-helpers.js';\nimport { humanizedClick, humanizedFill, humanizedScroll, type HumanPreset } from '../humanize.js';\nimport { isTruthyValue, resolvePath, valueContains } from '../pipeline/template.js';\n\nimport type {\n BrowserActionContext,\n BrowserActionHandler,\n BrowserActionRegistry,\n BrowserActionResult,\n} from './types.js';\n\nconst log = createLogger('BrowserActionRegistry');\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst AUTO_SNAPSHOT_MAX = 8_000;\n\ninterface NetworkEvent {\n type: 'request' | 'response' | 'requestfailed';\n url: string;\n method?: string;\n status?: number;\n resourceType?: string;\n postData?: string | null;\n body?: string;\n errorText?: string;\n timestamp: number;\n}\n\ninterface NetworkMonitor {\n events: NetworkEvent[];\n includeBody: boolean;\n urlPattern?: string;\n dispose: () => void;\n}\n\nconst networkMonitors = new WeakMap<Page, NetworkMonitor>();\n\n// ─── Helpers ────────────────────────────────────────────────────────────────\n\nfunction toMs(ctx: BrowserActionContext): number {\n return resolveBrowserCommandTimeoutMs(ctx.config);\n}\n\n/** Whether humanize mode is active for this context (local/cdp/cloakbrowser only). */\nfunction isHumanizeEnabled(_ctx: BrowserActionContext): boolean {\n return false;\n}\n\nfunction humanPreset(_ctx: BrowserActionContext): HumanPreset {\n return 'default';\n}\n\nasync function ariaSnapshot(page: Page, selector: string | undefined, maxLength: number, timeoutMs: number): Promise<string> {\n const loc = selector?.trim() ? page.locator(selector.trim()).first() : page.locator('body');\n await loc.waitFor({ state: 'attached', timeout: timeoutMs });\n let text = await loc.ariaSnapshot({ mode: 'ai', timeout: timeoutMs });\n if (!text || !text.trim()) text = '(empty snapshot)';\n if (text.length > maxLength) text = truncateSnapshotAtBoundary(text, maxLength);\n return text;\n}\n\nfunction resolveClickLocator(page: Page, args: Record<string, unknown>) {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const role = args.role as string | undefined;\n const hasSel = Boolean(selector?.trim());\n const hasText = Boolean(text?.trim());\n const hasRole = Boolean(role?.trim());\n const n = (hasSel ? 1 : 0) + (hasText ? 1 : 0) + (hasRole ? 1 : 0);\n if (n !== 1) throw new Error('Provide exactly one of: selector, text, role');\n if (hasSel) return page.locator(selector!.trim()).first();\n if (hasText) return page.getByText(text!.trim(), { exact: false }).first();\n const raw = role!.trim();\n const idx = raw.indexOf(':');\n const roleName = (idx >= 0 ? raw.slice(0, idx) : raw).trim();\n const name = idx >= 0 ? raw.slice(idx + 1).trim() : '';\n if (!roleName) throw new Error('Invalid role: empty ARIA role');\n return page.getByRole(roleName as never, name ? { name } : undefined).first();\n}\n\nfunction resolveTypeLocator(page: Page, args: Record<string, unknown>) {\n const selector = args.selector as string | undefined;\n const label = args.label as string | undefined;\n const hasSel = Boolean(selector?.trim());\n const hasLab = Boolean(label?.trim());\n if (hasSel === hasLab) throw new Error('Provide exactly one of: selector, label');\n if (hasSel) return page.locator(selector!.trim()).first();\n return page.getByLabel(label!.trim()).first();\n}\n\nfunction ok(action: string, text: string, data?: unknown, artifacts?: BrowserActionResult['artifacts']): BrowserActionResult {\n return { ok: true, action, text, data, artifacts };\n}\n\nfunction fail(action: string, code: string, message: string, diagnostics?: BrowserActionResult['diagnostics']): BrowserActionResult {\n return { ok: false, action, error: { code, message }, diagnostics };\n}\n\nfunction asObject(value: unknown): Record<string, unknown> {\n return value && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : {};\n}\n\nfunction pipelineLast(ctx: BrowserActionContext): unknown {\n return ctx.pipeline?.last;\n}\n\nfunction valueFromArgs(ctx: BrowserActionContext, args: Record<string, unknown>): unknown {\n if ('value' in args) return args.value;\n if (typeof args.path === 'string') return resolvePath(pipelineLast(ctx), args.path);\n return pipelineLast(ctx);\n}\n\nfunction compareValues(a: unknown, b: unknown): number {\n const av = typeof a === 'number' ? a : String(a ?? '');\n const bv = typeof b === 'number' ? b : String(b ?? '');\n if (av < bv) return -1;\n if (av > bv) return 1;\n return 0;\n}\n\nfunction matchesNetworkPattern(url: string, pattern: string | undefined): boolean {\n if (!pattern) return true;\n return url.includes(pattern);\n}\n\n// ─── Action Handlers ────────────────────────────────────────────────────────\n\nconst navigateAction: BrowserActionHandler = async (ctx, args) => {\n const url = String(args.url ?? '');\n if (!url) return fail('navigate', 'MISSING_URL', 'url is required');\n\n const allowPrivate = false;\n if (containsApiKeyPattern(url)) return fail('navigate', 'BLOCKED', 'URL contains API key/token');\n const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);\n if (block) return fail('navigate', 'BLOCKED', block.message);\n assertBrowserUrlAllowed(url, { allowPrivateUrls: allowPrivate });\n\n const waitUntil = (args.wait_until as string) ?? (args.waitFor as string) ?? 'domcontentloaded';\n const navTimeout = toMs(ctx);\n await ctx.page.goto(url, { waitUntil: waitUntil as any, timeout: navTimeout });\n\n const title = await ctx.page.title();\n const finalUrl = ctx.page.url();\n\n if (finalUrl && finalUrl !== url) {\n const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });\n if (redirectBlock) {\n await ctx.page.goto('about:blank').catch(() => {});\n return fail('navigate', 'REDIRECT_BLOCKED', redirectBlock);\n }\n }\n\n let snapshot = '';\n try { snapshot = await ariaSnapshot(ctx.page, undefined, AUTO_SNAPSHOT_MAX, navTimeout); } catch { /* non-fatal */ }\n\n const text = `Navigated to: ${title}\\nURL: ${finalUrl}${snapshot ? `\\n--- Page Snapshot ---\\n${snapshot}` : ''}`;\n return ok('navigate', text, { url: finalUrl, title });\n};\n\nconst stateAction: BrowserActionHandler = async (ctx, args) => {\n const maxLen = typeof args.maxLength === 'number' ? args.maxLength : DEFAULT_SNAPSHOT_MAX;\n const selector = args.selector as string | undefined;\n const timeout = toMs(ctx);\n try {\n const text = await ariaSnapshot(ctx.page, selector, maxLen, timeout);\n return ok('state', text, { length: text.length });\n } catch (e) {\n return fail('state', 'SNAPSHOT_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst clickAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n try {\n if (isHumanizeEnabled(ctx) && args.selector) {\n await humanizedClick(ctx.page, String(args.selector), humanPreset(ctx));\n return ok('click', 'Click succeeded (humanized).');\n }\n const loc = resolveClickLocator(ctx.page, args);\n await loc.click({ timeout });\n return ok('click', 'Click succeeded.');\n } catch (e) {\n return fail('click', 'CLICK_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst typeAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n try {\n if (isHumanizeEnabled(ctx) && args.selector) {\n await humanizedFill(ctx.page, String(args.selector), String(args.text ?? ''), humanPreset(ctx));\n if (args.pressEnter) await ctx.page.keyboard.press('Enter');\n return ok('type', 'Typed into field (humanized).');\n }\n const loc = resolveTypeLocator(ctx.page, args);\n await loc.clear({ timeout: Math.min(5000, timeout) }).catch(() => {});\n await loc.fill(String(args.text ?? ''), { timeout });\n if (args.pressEnter) await ctx.page.keyboard.press('Enter');\n return ok('type', 'Typed into field.');\n } catch (e) {\n return fail('type', 'TYPE_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst scrollAction: BrowserActionHandler = async (ctx, args) => {\n const direction = (args.direction as string) ?? 'down';\n const amount = typeof args.amount === 'number' ? args.amount : 500;\n const dy = direction === 'down' ? amount : -amount;\n try {\n if (isHumanizeEnabled(ctx)) {\n await humanizedScroll(ctx.page, dy, humanPreset(ctx));\n return ok('scroll', `Scrolled ${direction} by ${amount}px (humanized).`);\n }\n await ctx.page.evaluate(({ deltaY }) => {\n (globalThis as any).scrollBy(0, deltaY);\n }, { deltaY: dy });\n return ok('scroll', `Scrolled ${direction} by ${amount}px.`);\n } catch (e) {\n return fail('scroll', 'SCROLL_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst screenshotAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = toMs(ctx);\n const selector = args.selector as string | undefined;\n const fullPage = args.full_page === true || args.fullPage === true;\n const path = args.path as string | undefined;\n try {\n let buf: Buffer;\n if (selector?.trim()) {\n const loc = ctx.page.locator(selector.trim()).first();\n await loc.waitFor({ state: 'visible', timeout });\n buf = await loc.screenshot({ type: 'png', timeout });\n } else {\n buf = await ctx.page.screenshot({ type: 'png', fullPage, timeout });\n }\n const artifact = { type: 'screenshot' as const, path, data: buf.toString('base64'), mimeType: 'image/png' };\n return ok('screenshot', `Screenshot captured (${buf.length} bytes).`, { bytes: buf.length }, [artifact]);\n } catch (e) {\n return fail('screenshot', 'SCREENSHOT_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst backAction: BrowserActionHandler = async (ctx, args) => {\n const waitUntil = (args.waitFor as string) ?? 'domcontentloaded';\n const timeout = toMs(ctx);\n try {\n const response = await ctx.page.goBack({ waitUntil: waitUntil as any, timeout });\n if (!response) return fail('back', 'NO_HISTORY', 'No previous page in history.');\n const title = await ctx.page.title();\n const url = ctx.page.url();\n return ok('back', `Navigated back to: ${title}\\nURL: ${url}`, { url, title });\n } catch (e) {\n return fail('back', 'BACK_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst pressAction: BrowserActionHandler = async (ctx, args) => {\n const key = String(args.key ?? '');\n if (!key) return fail('press', 'MISSING_KEY', 'key is required');\n try {\n await ctx.page.keyboard.press(key);\n return ok('press', `Pressed key: ${key}`);\n } catch (e) {\n return fail('press', 'PRESS_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst evalAction: BrowserActionHandler = async (ctx, args) => {\n const js = (args.javascript as string) ?? (args.expression as string) ?? (args.code as string) ?? '';\n if (!js.trim()) return fail('eval', 'MISSING_JS', 'javascript expression is required');\n try {\n const result = await ctx.page.evaluate(js);\n const serialized = result === undefined ? 'undefined' : JSON.stringify(result, null, 2);\n const text = serialized.length > DEFAULT_SNAPSHOT_MAX\n ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\\n... (truncated)`\n : serialized;\n return ok('eval', text, result);\n } catch (e) {\n return fail('eval', 'EVAL_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst imagesAction: BrowserActionHandler = async (ctx, args) => {\n const selector = args.selector as string | undefined;\n const maxImages = typeof args.maxImages === 'number' ? args.maxImages : 20;\n try {\n const images = await ctx.page.evaluate(\n ([sel, max]: [string | null, number]) => {\n const d = globalThis.document as any;\n const root = sel ? d.querySelector(sel) : d;\n if (!root) return [];\n const imgs = Array.from(root.querySelectorAll('img') as ArrayLike<any>);\n return imgs.slice(0, max).map((img: any) => ({\n src: String(img.src ?? ''),\n alt: String(img.alt ?? ''),\n width: Number(img.naturalWidth ?? 0),\n height: Number(img.naturalHeight ?? 0),\n }));\n },\n [selector?.trim() || null, maxImages] as [string | null, number],\n );\n if (!images || images.length === 0) return ok('images', 'No images found on the page.', []);\n const lines = images.map((img: any, i: number) =>\n `${i + 1}. ${img.alt || '(no alt)'} — ${img.width}×${img.height}\\n ${img.src}`);\n return ok('images', `Found ${images.length} image(s):\\n${lines.join('\\n')}`, images);\n } catch (e) {\n return fail('images', 'IMAGES_FAILED', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst closeAction: BrowserActionHandler = async (ctx, _args) => {\n await ctx.manager.closePage(ctx.taskId);\n return ok('close', 'Browser page closed.');\n};\n\nconst dialogAction: BrowserActionHandler = async (ctx, args) => {\n const action = args.action as string;\n if (action !== 'accept' && action !== 'dismiss') {\n return fail('dialog', 'INVALID_ACTION', 'action must be \"accept\" or \"dismiss\"');\n }\n // Dialog handling relies on the CdpSupervisor event queue; this is a placeholder\n // that signals the supervisor to accept/dismiss the next pending dialog.\n const sup = ctx.supervisor;\n if (!sup) return fail('dialog', 'NO_SUPERVISOR', 'No dialog supervisor available');\n // Forward to supervisor (implementation detail in cdp-supervisor.ts)\n return ok('dialog', `Dialog ${action}ed.`);\n};\n\nconst waitAction: BrowserActionHandler = async (ctx, args) => {\n const selector = args.selector as string | undefined;\n const text = args.text as string | undefined;\n const state = (args.state as 'attached' | 'detached' | 'visible' | 'hidden' | undefined) ?? 'visible';\n const timeoutMs = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n if (selector?.trim()) {\n await ctx.page.locator(selector.trim()).first().waitFor({ state, timeout: timeoutMs });\n } else if (text?.trim()) {\n await ctx.page.getByText(text.trim()).first().waitFor({ state: 'visible', timeout: timeoutMs });\n } else if (args.function || args.expression) {\n await ctx.page.waitForFunction(String(args.function ?? args.expression), null, { timeout: timeoutMs });\n } else {\n const ms = typeof args.ms === 'number' ? args.ms : 1000;\n await ctx.page.waitForTimeout(ms);\n }\n return ok('wait', 'Wait completed.');\n } catch (e) {\n return fail('wait', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst outputAction: BrowserActionHandler = async (ctx, args) => {\n return ok('output', 'Output captured.', valueFromArgs(ctx, args));\n};\n\nconst assertAction: BrowserActionHandler = async (ctx, args) => {\n const actual = valueFromArgs(ctx, args);\n if ('equals' in args && JSON.stringify(actual) !== JSON.stringify(args.equals)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to equal ${JSON.stringify(args.equals)}, got ${JSON.stringify(actual)?.slice(0, 500)}`);\n }\n if ('contains' in args && !valueContains(actual, args.contains)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to contain ${JSON.stringify(args.contains)}`);\n }\n if ('matches' in args) {\n const pattern = new RegExp(String(args.matches));\n if (!pattern.test(String(actual ?? ''))) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to match /${pattern.source}/`);\n }\n }\n if (args.truthy === true && !isTruthyValue(actual)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to be truthy, got ${JSON.stringify(actual)}`);\n }\n if (args.exists === true && (actual === undefined || actual === null || actual === '')) {\n return fail('assert', 'ASSERTION_FAILED', 'Expected value to exist');\n }\n return ok('assert', 'Assertion passed.');\n};\n\nconst waitForNavigationAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n const waitUntil = (args.wait_until as string) ?? 'domcontentloaded';\n try {\n await ctx.page.waitForLoadState(waitUntil as any, { timeout });\n return ok('wait_for_navigation', 'Navigation wait completed.');\n } catch (e) {\n return fail('wait_for_navigation', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst waitForTimeoutAction: BrowserActionHandler = async (ctx, args) => {\n const ms = Number(args.ms ?? args.timeout_ms ?? 1000);\n await ctx.page.waitForTimeout(Number.isFinite(ms) ? ms : 1000);\n return ok('wait_for_timeout', `Waited ${ms}ms.`);\n};\n\nconst waitForFunctionAction: BrowserActionHandler = async (ctx, args) => {\n const expression = String(args.expression ?? args.function ?? '');\n if (!expression.trim()) return fail('wait_for_function', 'MISSING_EXPRESSION', 'expression is required');\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n await ctx.page.waitForFunction(expression, null, { timeout });\n return ok('wait_for_function', 'Function wait completed.');\n } catch (e) {\n return fail('wait_for_function', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst waitForNetworkIdleAction: BrowserActionHandler = async (ctx, args) => {\n const timeout = typeof args.timeout_ms === 'number' ? args.timeout_ms : toMs(ctx);\n try {\n await ctx.page.waitForLoadState('networkidle', { timeout });\n return ok('wait_for_network_idle', 'Network idle reached.');\n } catch (e) {\n return fail('wait_for_network_idle', 'WAIT_TIMEOUT', e instanceof Error ? e.message : String(e));\n }\n};\n\nconst elementTextAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n if (!selector) return fail('element_text', 'MISSING_SELECTOR', 'selector is required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'attached', timeout });\n const text = await loc.innerText({ timeout }).catch(() => loc.textContent({ timeout }));\n return ok('element_text', String(text ?? ''), text ?? '');\n};\n\nconst elementAttributeAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n const attribute = String(args.attribute ?? '');\n if (!selector || !attribute) return fail('element_attribute', 'INVALID_ARGS', 'selector and attribute are required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'attached', timeout });\n const value = await loc.getAttribute(attribute, { timeout });\n return ok('element_attribute', value ?? '', value);\n};\n\nconst boundingBoxAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n if (!selector) return fail('bounding_box', 'MISSING_SELECTOR', 'selector is required');\n const timeout = toMs(ctx);\n const loc = ctx.page.locator(selector).first();\n await loc.waitFor({ state: 'visible', timeout });\n const box = await loc.boundingBox({ timeout });\n return ok('bounding_box', JSON.stringify(box), box);\n};\n\nconst setInputFilesAction: BrowserActionHandler = async (ctx, args) => {\n const selector = String(args.selector ?? '');\n const files = Array.isArray(args.files) ? args.files.map(String) : typeof args.file === 'string' ? [args.file] : [];\n if (!selector || files.length === 0) return fail('set_input_files', 'INVALID_ARGS', 'selector and files are required');\n await ctx.page.locator(selector).first().setInputFiles(files, { timeout: toMs(ctx) });\n return ok('set_input_files', `Attached ${files.length} file(s).`, { files });\n};\n\nconst getCookiesAction: BrowserActionHandler = async (ctx, args) => {\n const urls = Array.isArray(args.urls) ? args.urls.map(String) : undefined;\n const cookies = await ctx.page.context().cookies(urls);\n return ok('cookies', JSON.stringify(cookies, null, 2), cookies);\n};\n\nconst addCookiesAction: BrowserActionHandler = async (ctx, args) => {\n const cookies = Array.isArray(args.cookies) ? args.cookies as any[] : [];\n if (cookies.length === 0) return fail('add_cookies', 'INVALID_ARGS', 'cookies must be a non-empty array');\n await ctx.page.context().addCookies(cookies);\n return ok('add_cookies', `Added ${cookies.length} cookie(s).`);\n};\n\nconst clearCookiesAction: BrowserActionHandler = async (ctx) => {\n await ctx.page.context().clearCookies();\n return ok('clear_cookies', 'Cookies cleared.');\n};\n\nconst listTabsAction: BrowserActionHandler = async (ctx) => {\n const pages = ctx.page.context().pages();\n const tabs = await Promise.all(pages.map(async (page, index) => ({ index, url: page.url(), title: await page.title().catch(() => '') })));\n return ok('tabs', JSON.stringify(tabs, null, 2), tabs);\n};\n\nconst newTabAction: BrowserActionHandler = async (ctx, args) => {\n const page = await ctx.page.context().newPage();\n if (args.url) await page.goto(String(args.url), { waitUntil: 'domcontentloaded', timeout: toMs(ctx) });\n return ok('new_tab', `Opened tab: ${page.url()}`, { url: page.url(), title: await page.title().catch(() => '') });\n};\n\nconst switchTabAction: BrowserActionHandler = async (ctx, args) => {\n const index = Number(args.index ?? args.tab_index ?? 0);\n const pages = ctx.page.context().pages();\n const page = pages[index];\n if (!page) return fail('switch_tab', 'TAB_NOT_FOUND', `No tab at index ${index}`);\n await page.bringToFront();\n return ok('switch_tab', `Switched to tab ${index}.`, { index, url: page.url() });\n};\n\nconst selectAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n const path = String(args.path ?? args.value ?? '');\n const value = path ? resolvePath(source, path) : source;\n return ok('select', typeof value === 'string' ? value : JSON.stringify(value, null, 2), value);\n};\n\nconst mapAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('map', 'INVALID_INPUT', 'map input must be an array');\n const path = String(args.path ?? '');\n const result = path ? source.map((item) => resolvePath(item, path)) : source;\n return ok('map', JSON.stringify(result, null, 2), result);\n};\n\nconst filterAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('filter', 'INVALID_INPUT', 'filter input must be an array');\n const path = String(args.path ?? '');\n const equals = args.equals;\n const contains = args.contains;\n const truthy = args.truthy === true;\n const result = source.filter((item) => {\n const value = path ? resolvePath(item, path) : item;\n if ('equals' in args) return JSON.stringify(value) === JSON.stringify(equals);\n if ('contains' in args) return valueContains(value, contains);\n if (truthy) return isTruthyValue(value);\n return isTruthyValue(value);\n });\n return ok('filter', JSON.stringify(result, null, 2), result);\n};\n\nconst sortAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('sort', 'INVALID_INPUT', 'sort input must be an array');\n const path = String(args.path ?? '');\n const direction = String(args.direction ?? 'asc');\n const result = [...source].sort((a, b) => {\n const av = path ? resolvePath(a, path) : a;\n const bv = path ? resolvePath(b, path) : b;\n const cmp = compareValues(av, bv);\n return direction === 'desc' ? -cmp : cmp;\n });\n return ok('sort', JSON.stringify(result, null, 2), result);\n};\n\nconst limitAction: BrowserActionHandler = async (ctx, args) => {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail('limit', 'INVALID_INPUT', 'limit input must be an array');\n const count = Math.max(0, Number(args.count ?? args.limit ?? 10));\n const offset = Math.max(0, Number(args.offset ?? 0));\n const result = source.slice(offset, offset + count);\n return ok('limit', JSON.stringify(result, null, 2), result);\n};\n\nconst fetchAction: BrowserActionHandler = async (ctx, args) => {\n const url = String(args.url ?? '');\n if (!url) return fail('fetch', 'MISSING_URL', 'url is required');\n const method = String(args.method ?? 'GET');\n const headers = asObject(args.headers) as Record<string, string>;\n const body = args.body === undefined ? undefined : typeof args.body === 'string' ? args.body : JSON.stringify(args.body);\n const result = await ctx.page.evaluate(\n async ({ url, method, headers, body }) => {\n const response = await fetch(url, { method, headers, body });\n const text = await response.text();\n const contentType = response.headers.get('content-type') ?? '';\n let parsed: unknown = text;\n if (contentType.includes('application/json')) {\n try { parsed = JSON.parse(text); } catch { parsed = text; }\n }\n return { ok: response.ok, status: response.status, url: response.url, headers: Object.fromEntries(response.headers.entries()), body: parsed };\n },\n { url, method, headers, body },\n );\n return ok('fetch', JSON.stringify(result, null, 2), result);\n};\n\nconst networkStartAction: BrowserActionHandler = async (ctx, args) => {\n networkMonitors.get(ctx.page)?.dispose();\n const includeBody = args.include_body === true || args.includeBody === true;\n const urlPattern = typeof args.url_pattern === 'string' ? args.url_pattern : typeof args.urlPattern === 'string' ? args.urlPattern : undefined;\n const events: NetworkEvent[] = [];\n const onRequest = (request: any) => {\n if (!matchesNetworkPattern(request.url(), urlPattern)) return;\n events.push({ type: 'request', url: request.url(), method: request.method(), resourceType: request.resourceType(), postData: request.postData(), timestamp: Date.now() });\n };\n const onResponse = async (response: any) => {\n if (!matchesNetworkPattern(response.url(), urlPattern)) return;\n const event: NetworkEvent = { type: 'response', url: response.url(), status: response.status(), timestamp: Date.now() };\n if (includeBody) {\n event.body = await response.text().catch(() => undefined);\n }\n events.push(event);\n };\n const onRequestFailed = (request: any) => {\n if (!matchesNetworkPattern(request.url(), urlPattern)) return;\n events.push({ type: 'requestfailed', url: request.url(), method: request.method(), errorText: request.failure()?.errorText, timestamp: Date.now() });\n };\n ctx.page.on('request', onRequest);\n ctx.page.on('response', onResponse);\n ctx.page.on('requestfailed', onRequestFailed);\n networkMonitors.set(ctx.page, {\n events,\n includeBody,\n urlPattern,\n dispose: () => {\n ctx.page.off('request', onRequest);\n ctx.page.off('response', onResponse);\n ctx.page.off('requestfailed', onRequestFailed);\n networkMonitors.delete(ctx.page);\n },\n });\n return ok('network_start', 'Network monitoring started.', { includeBody, urlPattern });\n};\n\nconst networkEventsAction: BrowserActionHandler = async (ctx) => {\n const monitor = networkMonitors.get(ctx.page);\n const events = monitor?.events ?? [];\n return ok('network_events', JSON.stringify(events, null, 2), events);\n};\n\nconst networkStopAction: BrowserActionHandler = async (ctx) => {\n const events = networkMonitors.get(ctx.page)?.events ?? [];\n networkMonitors.get(ctx.page)?.dispose();\n return ok('network_stop', JSON.stringify(events, null, 2), events);\n};\n\nconst collectAction: BrowserActionHandler = async (ctx, args) => {\n const events = networkMonitors.get(ctx.page)?.events ?? [];\n if (args.parse) {\n const parsed = await ctx.page.evaluate(\n ({ events, parse }) => {\n const parseFn = (0, eval)(`(${parse})`);\n return parseFn(events);\n },\n { events, parse: String(args.parse) },\n );\n return ok('collect', JSON.stringify(parsed, null, 2), parsed);\n }\n return ok('collect', JSON.stringify(events, null, 2), events);\n};\n\nconst tapAction: BrowserActionHandler = async (ctx, args) => {\n const pattern = String(args.capture ?? args.url ?? args.pattern ?? '');\n const timeoutMs = Number(args.timeout_ms ?? args.timeoutMs ?? 5000);\n const captured = await ctx.page.evaluate(\n async ({ pattern, timeoutMs }) => {\n let result: unknown = null;\n const g = globalThis as any;\n const originalFetch = g.fetch;\n g.fetch = async (...fetchArgs: any[]) => {\n const response = await originalFetch(...fetchArgs);\n try {\n const url = typeof fetchArgs[0] === 'string' ? fetchArgs[0] : fetchArgs[0]?.url ?? String(fetchArgs[0]);\n if ((!pattern || url.includes(pattern)) && result === null) {\n const clone = response.clone();\n const text = await clone.text();\n try { result = JSON.parse(text); } catch { result = text; }\n }\n } catch {}\n return response;\n };\n try {\n await new Promise((resolve) => setTimeout(resolve, timeoutMs));\n } finally {\n g.fetch = originalFetch;\n }\n return result;\n },\n { pattern, timeoutMs },\n );\n return ok('tap', JSON.stringify(captured, null, 2), captured);\n};\n\n// ─── Registry Construction ──────────────────────────────────────────────────\n\nexport function createBrowserActionRegistry(): BrowserActionRegistry {\n const handlers = new Map<string, BrowserActionHandler>();\n\n // Navigate\n handlers.set('open', navigateAction);\n handlers.set('navigate', navigateAction);\n // State / snapshot\n handlers.set('state', stateAction);\n handlers.set('snapshot', stateAction);\n // Interaction\n handlers.set('click', clickAction);\n handlers.set('type', typeAction);\n handlers.set('input', typeAction);\n handlers.set('scroll', scrollAction);\n handlers.set('back', backAction);\n handlers.set('keys', pressAction);\n handlers.set('press', pressAction);\n // Inspection\n handlers.set('screenshot', screenshotAction);\n handlers.set('images', imagesAction);\n // Eval\n handlers.set('console', evalAction);\n handlers.set('eval', evalAction);\n handlers.set('evaluate', evalAction);\n // Control\n handlers.set('dialog', dialogAction);\n handlers.set('close', closeAction);\n handlers.set('wait', waitAction);\n handlers.set('wait_for_navigation', waitForNavigationAction);\n handlers.set('wait_for_timeout', waitForTimeoutAction);\n handlers.set('wait_for_function', waitForFunctionAction);\n handlers.set('wait_for_network_idle', waitForNetworkIdleAction);\n // Pipeline-specific\n handlers.set('output', outputAction);\n handlers.set('assert', assertAction);\n handlers.set('select', selectAction);\n handlers.set('map', mapAction);\n handlers.set('filter', filterAction);\n handlers.set('sort', sortAction);\n handlers.set('limit', limitAction);\n handlers.set('fetch', fetchAction);\n handlers.set('collect', collectAction);\n handlers.set('tap', tapAction);\n // DOM / browser context\n handlers.set('element_text', elementTextAction);\n handlers.set('element_attribute', elementAttributeAction);\n handlers.set('bounding_box', boundingBoxAction);\n handlers.set('set_input_files', setInputFilesAction);\n handlers.set('cookies', getCookiesAction);\n handlers.set('get_cookies', getCookiesAction);\n handlers.set('add_cookies', addCookiesAction);\n handlers.set('clear_cookies', clearCookiesAction);\n handlers.set('tabs', listTabsAction);\n handlers.set('list_tabs', listTabsAction);\n handlers.set('new_tab', newTabAction);\n handlers.set('switch_tab', switchTabAction);\n // Network\n handlers.set('network_start', networkStartAction);\n handlers.set('network_events', networkEventsAction);\n handlers.set('network_stop', networkStopAction);\n\n return {\n get(name: string) { return handlers.get(name); },\n has(name: string) { return handlers.has(name); },\n names() { return [...handlers.keys()]; },\n async execute(name: string, ctx: BrowserActionContext, args: Record<string, unknown>): Promise<BrowserActionResult> {\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n if (ctx.manager.getExtensionProvider()) {\n const { runExtensionRegistryAction } = await import('./extension-registry-bridge.js');\n return runExtensionRegistryAction(name, ctx, args);\n }\n const handler = handlers.get(name);\n if (!handler) {\n return fail(name, 'UNKNOWN_ACTION', `Unknown browser action: ${name}`);\n }\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n try {\n return await handler(ctx, args);\n } catch (e) {\n const message = e instanceof Error ? e.message : String(e);\n log.error({ err: e, action: name }, `Action failed: ${message}`);\n return fail(name, 'ACTION_ERROR', message);\n }\n },\n };\n}\n"],"mappings":"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"}
|
|
@@ -6,7 +6,7 @@ import type { BrowserBackend, CloakBrowserConfig } from './providers/types.js';
|
|
|
6
6
|
*/
|
|
7
7
|
export declare function shouldRunExtensionBridgeServer(cfg: Config | undefined): boolean;
|
|
8
8
|
/**
|
|
9
|
-
* Resolve browser backend from
|
|
9
|
+
* Resolve browser backend from root browser runtime config.
|
|
10
10
|
* Precedence: `backend: 'extension'` → `cloakbrowser` → `cdpUrl` (CDP) → `cloudProvider` (remote) → `local` (explicit) → extension (default).
|
|
11
11
|
*/
|
|
12
12
|
export declare function resolveBrowserBackendFromConfig(cfg: Config | undefined): BrowserBackend;
|
|
@@ -4,103 +4,82 @@
|
|
|
4
4
|
* True when browser tools are enabled and the resolved backend is extension (including default).
|
|
5
5
|
*/
|
|
6
6
|
function shouldRunExtensionBridgeServer(cfg) {
|
|
7
|
-
|
|
8
|
-
return resolveBrowserBackendFromConfig(cfg).mode === "extension";
|
|
7
|
+
return cfg?.browser?.enabled !== false && resolveBrowserBackendFromConfig(cfg).mode === "extension";
|
|
9
8
|
}
|
|
10
9
|
/**
|
|
11
|
-
* Resolve browser backend from
|
|
10
|
+
* Resolve browser backend from root browser runtime config.
|
|
12
11
|
* Precedence: `backend: 'extension'` → `cloakbrowser` → `cdpUrl` (CDP) → `cloudProvider` (remote) → `local` (explicit) → extension (default).
|
|
13
12
|
*/
|
|
14
13
|
function resolveBrowserBackendFromConfig(cfg) {
|
|
15
|
-
const
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
14
|
+
const browser = cfg?.browser;
|
|
15
|
+
if (browser?.enabled === false) return {
|
|
16
|
+
mode: "extension",
|
|
17
|
+
config: {}
|
|
18
|
+
};
|
|
19
|
+
const commandTimeout = resolveCommandTimeoutMs(browser?.commandTimeout);
|
|
20
|
+
const backend = browser?.backend ?? "extension";
|
|
21
|
+
if (backend === "extension") {
|
|
22
|
+
const ext = browser?.extension;
|
|
20
23
|
return {
|
|
21
24
|
mode: "extension",
|
|
22
25
|
config: {
|
|
23
|
-
port:
|
|
24
|
-
host:
|
|
25
|
-
connectionTimeout:
|
|
26
|
-
commandTimeout
|
|
27
|
-
}
|
|
28
|
-
};
|
|
29
|
-
}
|
|
30
|
-
if (b?.backend === "cloakbrowser") {
|
|
31
|
-
const cb = b.cloakbrowser;
|
|
32
|
-
return {
|
|
33
|
-
mode: "cloakbrowser",
|
|
34
|
-
config: {
|
|
35
|
-
headless,
|
|
36
|
-
keepOpen: cb?.keepOpen,
|
|
37
|
-
temporaryProfile: cb?.temporaryProfile,
|
|
38
|
-
cacheDir: cb?.cacheDir,
|
|
39
|
-
binaryPath: cb?.binaryPath,
|
|
40
|
-
timezone: cb?.timezone,
|
|
41
|
-
locale: cb?.locale,
|
|
42
|
-
webrtcIp: cb?.webrtcIp,
|
|
43
|
-
fingerprintPlatform: cb?.fingerprintPlatform,
|
|
44
|
-
extraArgs: cb?.extraArgs,
|
|
45
|
-
humanize: b.humanize ?? true,
|
|
46
|
-
humanPreset: b.humanPreset ?? "careful"
|
|
26
|
+
...ext?.port !== void 0 ? { port: ext.port } : {},
|
|
27
|
+
...ext?.host ? { host: ext.host } : {},
|
|
28
|
+
...ext?.connectionTimeout !== void 0 ? { connectionTimeout: ext.connectionTimeout } : {},
|
|
29
|
+
commandTimeout
|
|
47
30
|
}
|
|
48
31
|
};
|
|
49
32
|
}
|
|
50
|
-
|
|
51
|
-
|
|
33
|
+
if (backend === "cloakbrowser") return {
|
|
34
|
+
mode: "cloakbrowser",
|
|
35
|
+
config: cloakBrowserConfigFromAgentDefaults(cfg)
|
|
36
|
+
};
|
|
37
|
+
if (backend === "cdp" && browser?.cdpUrl?.trim()) return {
|
|
52
38
|
mode: "cdp",
|
|
53
|
-
config: { wsEndpoint: cdpUrl }
|
|
39
|
+
config: { wsEndpoint: browser.cdpUrl.trim() }
|
|
54
40
|
};
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
...apiKey ? { apiKey } : {},
|
|
66
|
-
...projectId ? { projectId } : {},
|
|
67
|
-
...region ? { region } : {}
|
|
68
|
-
}
|
|
69
|
-
};
|
|
70
|
-
}
|
|
71
|
-
if (b?.backend === "local") return {
|
|
41
|
+
if (backend === "cloud") return {
|
|
42
|
+
mode: "cloud",
|
|
43
|
+
config: {
|
|
44
|
+
type: browser?.cloudProvider === "browserbase" || browser?.cloudProvider === "browser-use" ? browser.cloudProvider : "browserbase",
|
|
45
|
+
...browser?.cloud?.apiKey ? { apiKey: browser.cloud.apiKey } : {},
|
|
46
|
+
...browser?.cloud?.projectId ? { projectId: browser.cloud.projectId } : {},
|
|
47
|
+
...browser?.cloud?.region ? { region: browser.cloud.region } : {}
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
if (backend === "local") return {
|
|
72
51
|
mode: "local",
|
|
73
|
-
headless
|
|
52
|
+
headless: browser?.headless === true
|
|
74
53
|
};
|
|
75
|
-
const ex = b?.extension;
|
|
76
|
-
const cmdSec = b?.commandTimeout;
|
|
77
54
|
return {
|
|
78
55
|
mode: "extension",
|
|
79
|
-
config: {
|
|
80
|
-
port: ex?.port,
|
|
81
|
-
host: ex?.host,
|
|
82
|
-
connectionTimeout: ex?.connectionTimeout,
|
|
83
|
-
commandTimeout: typeof cmdSec === "number" && Number.isFinite(cmdSec) && cmdSec > 0 ? Math.floor(cmdSec * 1e3) : void 0
|
|
84
|
-
}
|
|
56
|
+
config: { commandTimeout }
|
|
85
57
|
};
|
|
86
58
|
}
|
|
87
59
|
/** CloakBrowser launch options aligned with saved agent defaults (headed for manual use). */
|
|
88
60
|
function cloakBrowserConfigFromAgentDefaults(cfg) {
|
|
89
|
-
const
|
|
61
|
+
const browser = cfg?.browser;
|
|
62
|
+
const cloak = browser?.cloakbrowser;
|
|
90
63
|
return {
|
|
91
64
|
headless: false,
|
|
92
|
-
keepOpen:
|
|
93
|
-
temporaryProfile:
|
|
94
|
-
cacheDir:
|
|
95
|
-
binaryPath:
|
|
96
|
-
timezone:
|
|
97
|
-
locale:
|
|
98
|
-
webrtcIp:
|
|
99
|
-
fingerprintPlatform:
|
|
100
|
-
extraArgs:
|
|
65
|
+
...cloak?.keepOpen !== void 0 ? { keepOpen: cloak.keepOpen } : {},
|
|
66
|
+
...cloak?.temporaryProfile !== void 0 ? { temporaryProfile: cloak.temporaryProfile } : {},
|
|
67
|
+
...cloak?.cacheDir ? { cacheDir: cloak.cacheDir } : {},
|
|
68
|
+
...cloak?.binaryPath ? { binaryPath: cloak.binaryPath } : {},
|
|
69
|
+
...cloak?.timezone ? { timezone: cloak.timezone } : {},
|
|
70
|
+
...cloak?.locale ? { locale: cloak.locale } : {},
|
|
71
|
+
...cloak?.webrtcIp ? { webrtcIp: cloak.webrtcIp } : {},
|
|
72
|
+
...cloak?.fingerprintPlatform ? { fingerprintPlatform: cloak.fingerprintPlatform } : {},
|
|
73
|
+
...cloak?.extraArgs ? { extraArgs: cloak.extraArgs } : {},
|
|
74
|
+
humanize: browser?.humanize ?? true,
|
|
75
|
+
humanPreset: browser?.humanPreset ?? "careful",
|
|
101
76
|
reuseExisting: true
|
|
102
77
|
};
|
|
103
78
|
}
|
|
79
|
+
function resolveCommandTimeoutMs(value) {
|
|
80
|
+
if (typeof value !== "number" || !Number.isFinite(value)) return 3e4;
|
|
81
|
+
return Math.min(900, Math.max(5, Math.floor(value))) * 1e3;
|
|
82
|
+
}
|
|
104
83
|
//#endregion
|
|
105
84
|
export { cloakBrowserConfigFromAgentDefaults, resolveBrowserBackendFromConfig, shouldRunExtensionBridgeServer };
|
|
106
85
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"backend-from-config.js","names":[],"sources":["../../../src/browser/backend-from-config.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\n\nimport type { BrowserBackend, CloakBrowserConfig } from './providers/types.js';\n\n/**\n * Whether the gateway should keep the Chrome extension WebSocket bridge listening.\n * True when browser tools are enabled and the resolved backend is extension (including default).\n */\nexport function shouldRunExtensionBridgeServer(cfg: Config | undefined): boolean {\n
|
|
1
|
+
{"version":3,"file":"backend-from-config.js","names":[],"sources":["../../../src/browser/backend-from-config.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\n\nimport type { BrowserBackend, CloakBrowserConfig } from './providers/types.js';\n\n/**\n * Whether the gateway should keep the Chrome extension WebSocket bridge listening.\n * True when browser tools are enabled and the resolved backend is extension (including default).\n */\nexport function shouldRunExtensionBridgeServer(cfg: Config | undefined): boolean {\n return cfg?.browser?.enabled !== false && resolveBrowserBackendFromConfig(cfg).mode === 'extension';\n}\n\n/**\n * Resolve browser backend from root browser runtime config.\n * Precedence: `backend: 'extension'` → `cloakbrowser` → `cdpUrl` (CDP) → `cloudProvider` (remote) → `local` (explicit) → extension (default).\n */\nexport function resolveBrowserBackendFromConfig(cfg: Config | undefined): BrowserBackend {\n const browser = cfg?.browser;\n if (browser?.enabled === false) {\n return { mode: 'extension', config: {} };\n }\n const commandTimeout = resolveCommandTimeoutMs(browser?.commandTimeout);\n const backend = browser?.backend ?? 'extension';\n if (backend === 'extension') {\n const ext = browser?.extension;\n return {\n mode: 'extension',\n config: {\n ...(ext?.port !== undefined ? { port: ext.port } : {}),\n ...(ext?.host ? { host: ext.host } : {}),\n ...(ext?.connectionTimeout !== undefined ? { connectionTimeout: ext.connectionTimeout } : {}),\n commandTimeout,\n },\n };\n }\n if (backend === 'cloakbrowser') {\n return {\n mode: 'cloakbrowser',\n config: cloakBrowserConfigFromAgentDefaults(cfg),\n };\n }\n if (backend === 'cdp' && browser?.cdpUrl?.trim()) {\n return { mode: 'cdp', config: { wsEndpoint: browser.cdpUrl.trim() } };\n }\n if (backend === 'cloud') {\n const provider = browser?.cloudProvider === 'browserbase' || browser?.cloudProvider === 'browser-use'\n ? browser.cloudProvider\n : 'browserbase';\n return {\n mode: 'cloud',\n config: {\n type: provider,\n ...(browser?.cloud?.apiKey ? { apiKey: browser.cloud.apiKey } : {}),\n ...(browser?.cloud?.projectId ? { projectId: browser.cloud.projectId } : {}),\n ...(browser?.cloud?.region ? { region: browser.cloud.region } : {}),\n },\n };\n }\n if (backend === 'local') {\n return { mode: 'local', headless: browser?.headless === true };\n }\n return { mode: 'extension', config: { commandTimeout } };\n}\n\n/** CloakBrowser launch options aligned with saved agent defaults (headed for manual use). */\nexport function cloakBrowserConfigFromAgentDefaults(cfg: Config | undefined): CloakBrowserConfig {\n const browser = cfg?.browser;\n const cloak = browser?.cloakbrowser;\n return {\n headless: false,\n ...(cloak?.keepOpen !== undefined ? { keepOpen: cloak.keepOpen } : {}),\n ...(cloak?.temporaryProfile !== undefined ? { temporaryProfile: cloak.temporaryProfile } : {}),\n ...(cloak?.cacheDir ? { cacheDir: cloak.cacheDir } : {}),\n ...(cloak?.binaryPath ? { binaryPath: cloak.binaryPath } : {}),\n ...(cloak?.timezone ? { timezone: cloak.timezone } : {}),\n ...(cloak?.locale ? { locale: cloak.locale } : {}),\n ...(cloak?.webrtcIp ? { webrtcIp: cloak.webrtcIp } : {}),\n ...(cloak?.fingerprintPlatform ? { fingerprintPlatform: cloak.fingerprintPlatform } : {}),\n ...(cloak?.extraArgs ? { extraArgs: cloak.extraArgs } : {}),\n humanize: browser?.humanize ?? true,\n humanPreset: browser?.humanPreset ?? 'careful',\n reuseExisting: true,\n };\n}\n\nfunction resolveCommandTimeoutMs(value: number | undefined): number {\n if (typeof value !== 'number' || !Number.isFinite(value)) return 30_000;\n return Math.min(900, Math.max(5, Math.floor(value))) * 1000;\n}\n"],"mappings":";;;;;AAQA,SAAgB,+BAA+B,KAAkC;AAC/E,QAAO,KAAK,SAAS,YAAY,SAAS,gCAAgC,IAAI,CAAC,SAAS;;;;;;AAO1F,SAAgB,gCAAgC,KAAyC;CACvF,MAAM,UAAU,KAAK;AACrB,KAAI,SAAS,YAAY,MACvB,QAAO;EAAE,MAAM;EAAa,QAAQ,EAAE;EAAE;CAE1C,MAAM,iBAAiB,wBAAwB,SAAS,eAAe;CACvE,MAAM,UAAU,SAAS,WAAW;AACpC,KAAI,YAAY,aAAa;EAC3B,MAAM,MAAM,SAAS;AACrB,SAAO;GACL,MAAM;GACN,QAAQ;IACN,GAAI,KAAK,SAAS,KAAA,IAAY,EAAE,MAAM,IAAI,MAAM,GAAG,EAAE;IACrD,GAAI,KAAK,OAAO,EAAE,MAAM,IAAI,MAAM,GAAG,EAAE;IACvC,GAAI,KAAK,sBAAsB,KAAA,IAAY,EAAE,mBAAmB,IAAI,mBAAmB,GAAG,EAAE;IAC5F;IACD;GACF;;AAEH,KAAI,YAAY,eACd,QAAO;EACL,MAAM;EACN,QAAQ,oCAAoC,IAAI;EACjD;AAEH,KAAI,YAAY,SAAS,SAAS,QAAQ,MAAM,CAC9C,QAAO;EAAE,MAAM;EAAO,QAAQ,EAAE,YAAY,QAAQ,OAAO,MAAM,EAAE;EAAE;AAEvE,KAAI,YAAY,QAId,QAAO;EACL,MAAM;EACN,QAAQ;GACN,MANa,SAAS,kBAAkB,iBAAiB,SAAS,kBAAkB,gBACpF,QAAQ,gBACR;GAKA,GAAI,SAAS,OAAO,SAAS,EAAE,QAAQ,QAAQ,MAAM,QAAQ,GAAG,EAAE;GAClE,GAAI,SAAS,OAAO,YAAY,EAAE,WAAW,QAAQ,MAAM,WAAW,GAAG,EAAE;GAC3E,GAAI,SAAS,OAAO,SAAS,EAAE,QAAQ,QAAQ,MAAM,QAAQ,GAAG,EAAE;GACnE;EACF;AAEH,KAAI,YAAY,QACd,QAAO;EAAE,MAAM;EAAS,UAAU,SAAS,aAAa;EAAM;AAEhE,QAAO;EAAE,MAAM;EAAa,QAAQ,EAAE,gBAAgB;EAAE;;;AAI1D,SAAgB,oCAAoC,KAA6C;CAC/F,MAAM,UAAU,KAAK;CACrB,MAAM,QAAQ,SAAS;AACvB,QAAO;EACL,UAAU;EACV,GAAI,OAAO,aAAa,KAAA,IAAY,EAAE,UAAU,MAAM,UAAU,GAAG,EAAE;EACrE,GAAI,OAAO,qBAAqB,KAAA,IAAY,EAAE,kBAAkB,MAAM,kBAAkB,GAAG,EAAE;EAC7F,GAAI,OAAO,WAAW,EAAE,UAAU,MAAM,UAAU,GAAG,EAAE;EACvD,GAAI,OAAO,aAAa,EAAE,YAAY,MAAM,YAAY,GAAG,EAAE;EAC7D,GAAI,OAAO,WAAW,EAAE,UAAU,MAAM,UAAU,GAAG,EAAE;EACvD,GAAI,OAAO,SAAS,EAAE,QAAQ,MAAM,QAAQ,GAAG,EAAE;EACjD,GAAI,OAAO,WAAW,EAAE,UAAU,MAAM,UAAU,GAAG,EAAE;EACvD,GAAI,OAAO,sBAAsB,EAAE,qBAAqB,MAAM,qBAAqB,GAAG,EAAE;EACxF,GAAI,OAAO,YAAY,EAAE,WAAW,MAAM,WAAW,GAAG,EAAE;EAC1D,UAAU,SAAS,YAAY;EAC/B,aAAa,SAAS,eAAe;EACrC,eAAe;EAChB;;AAGH,SAAS,wBAAwB,OAAmC;AAClE,KAAI,OAAO,UAAU,YAAY,CAAC,OAAO,SAAS,MAAM,CAAE,QAAO;AACjE,QAAO,KAAK,IAAI,KAAK,KAAK,IAAI,GAAG,KAAK,MAAM,MAAM,CAAC,CAAC,GAAG"}
|
|
@@ -2,14 +2,10 @@
|
|
|
2
2
|
const DEFAULT_MS = 3e4;
|
|
3
3
|
const MIN_SEC = 5;
|
|
4
4
|
const MAX_SEC = 900;
|
|
5
|
-
/** Playwright action timeout from `agents.defaults.browser.commandTimeout` (seconds). */
|
|
6
5
|
function resolveBrowserCommandTimeoutMs(cfg) {
|
|
7
|
-
const
|
|
8
|
-
if (typeof
|
|
9
|
-
|
|
10
|
-
if (n >= MIN_SEC && n <= MAX_SEC) return n * 1e3;
|
|
11
|
-
}
|
|
12
|
-
return DEFAULT_MS;
|
|
6
|
+
const raw = cfg?.browser?.commandTimeout;
|
|
7
|
+
if (typeof raw !== "number" || !Number.isFinite(raw)) return DEFAULT_MS;
|
|
8
|
+
return Math.min(MAX_SEC, Math.max(MIN_SEC, Math.floor(raw))) * 1e3;
|
|
13
9
|
}
|
|
14
10
|
//#endregion
|
|
15
11
|
export { resolveBrowserCommandTimeoutMs };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"browser-command-timeout.js","names":[],"sources":["../../../src/browser/browser-command-timeout.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\n\nconst DEFAULT_MS = 30_000;\nconst MIN_SEC = 5;\nconst MAX_SEC = 900;\n\
|
|
1
|
+
{"version":3,"file":"browser-command-timeout.js","names":[],"sources":["../../../src/browser/browser-command-timeout.ts"],"sourcesContent":["import type { Config } from '../config/schema.js';\n\nconst DEFAULT_MS = 30_000;\nconst MIN_SEC = 5;\nconst MAX_SEC = 900;\n\nexport function resolveBrowserCommandTimeoutMs(cfg: Config | undefined): number {\n const raw = cfg?.browser?.commandTimeout;\n if (typeof raw !== 'number' || !Number.isFinite(raw)) return DEFAULT_MS;\n return Math.min(MAX_SEC, Math.max(MIN_SEC, Math.floor(raw))) * 1000;\n}\n"],"mappings":";AAEA,MAAM,aAAa;AACnB,MAAM,UAAU;AAChB,MAAM,UAAU;AAEhB,SAAgB,+BAA+B,KAAiC;CAC9E,MAAM,MAAM,KAAK,SAAS;AAC1B,KAAI,OAAO,QAAQ,YAAY,CAAC,OAAO,SAAS,IAAI,CAAE,QAAO;AAC7D,QAAO,KAAK,IAAI,SAAS,KAAK,IAAI,SAAS,KAAK,MAAM,IAAI,CAAC,CAAC,GAAG"}
|
|
@@ -55,18 +55,8 @@ export declare function ensureBrowserExtensionArtifacts(opts?: {
|
|
|
55
55
|
force?: boolean;
|
|
56
56
|
cacheDir?: string;
|
|
57
57
|
}): Promise<EnsureBrowserExtResult>;
|
|
58
|
-
/**
|
|
59
|
-
|
|
60
|
-
*/
|
|
61
|
-
export declare function ensureBrowserExtensionOnStartup(config: {
|
|
62
|
-
agents?: {
|
|
63
|
-
defaults?: {
|
|
64
|
-
browser?: {
|
|
65
|
-
backend?: string;
|
|
66
|
-
};
|
|
67
|
-
};
|
|
68
|
-
};
|
|
69
|
-
}): Promise<void>;
|
|
58
|
+
/** Gateway startup hook: ensure extension artifacts for the fixed extension backend. */
|
|
59
|
+
export declare function ensureBrowserExtensionOnStartup(_config: unknown): Promise<void>;
|
|
70
60
|
export declare function readInstalledExtensionDir(cacheDir?: string): Promise<string | null>;
|
|
71
61
|
export type BrowserExtensionOpenAction = 'chrome' | 'folder' | 'both';
|
|
72
62
|
/**
|
|
@@ -8,8 +8,8 @@ import { resolvePackageRoot } from "../../infra/update-check.js";
|
|
|
8
8
|
import { dirname, join } from "node:path";
|
|
9
9
|
import { existsSync, mkdirSync, readFileSync, readdirSync, renameSync, rmSync, statSync, writeFileSync } from "node:fs";
|
|
10
10
|
import { readFile, readdir, rm } from "node:fs/promises";
|
|
11
|
-
import { fileURLToPath } from "node:url";
|
|
12
11
|
import { spawn } from "node:child_process";
|
|
12
|
+
import { fileURLToPath } from "node:url";
|
|
13
13
|
//#region src/browser/providers/browser-ext-install.ts
|
|
14
14
|
/**
|
|
15
15
|
* Install bundled Chrome extension artifacts into {resolveBinDir()}/browser-ext/.
|
|
@@ -269,13 +269,8 @@ async function ensureBrowserExtensionArtifacts(opts) {
|
|
|
269
269
|
copied: true
|
|
270
270
|
};
|
|
271
271
|
}
|
|
272
|
-
/**
|
|
273
|
-
|
|
274
|
-
*/
|
|
275
|
-
async function ensureBrowserExtensionOnStartup(config) {
|
|
276
|
-
const backend = config.agents?.defaults?.browser?.backend;
|
|
277
|
-
const metaExists = existsSync(resolveMetaPath(resolveBinDir()));
|
|
278
|
-
if (backend !== "extension" && !metaExists) return;
|
|
272
|
+
/** Gateway startup hook: ensure extension artifacts for the fixed extension backend. */
|
|
273
|
+
async function ensureBrowserExtensionOnStartup(_config) {
|
|
279
274
|
await ensureBrowserExtensionArtifacts();
|
|
280
275
|
}
|
|
281
276
|
async function readInstalledExtensionDir(cacheDir) {
|