@xopcai/xopc 0.0.112 → 0.0.114
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/dist/browser-ext/icons/icon-128.png +0 -0
- package/dist/browser-ext/icons/icon-16.png +0 -0
- package/dist/browser-ext/icons/icon-32.png +0 -0
- package/dist/browser-ext/icons/icon-48.png +0 -0
- package/dist/browser-ext/manifest.json +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/delivery-to.d.ts +3 -3
- package/dist/extensions/weixin/src/delivery-to.js.map +1 -1
- package/dist/gateway/static/root/apple-touch-icon.png +0 -0
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-EhRp-ZMa.js → agent-avatar-dicebear-Fp-p7bP1.js} +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-CWh7trjd.js +6 -0
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-kC8OuLoj.js +1 -0
- package/dist/gateway/static/root/assets/agents-DJWG26Si.js +71 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-BIy7KEsM.js → app-management-settings-panel-v24i25Oj.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-DGQG8NwA.js → appearance-settings-ycbdJRuZ.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-0V3DXZ7J.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-uuQPupqx.js → archive-plugin-CJzSADJo.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-DBkv0cAv.js → attachment-load-BTAB4zGS.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-DxxN_VAR.js → binary-plugins-DXR1-mct.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CwnUlRmO.js → block-editor-CzQri9h2.js} +44 -44
- package/dist/gateway/static/root/assets/channels-settings-CIKOkYdO.js +1 -0
- package/dist/gateway/static/root/assets/{config-api-BD-NcD5d.js → config-api-DRqjEvAx.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-settings-ClrDS5jH.js +2 -0
- package/dist/gateway/static/root/assets/{cron-api-C5DoipZA.js → cron-api-BXaZXv1o.js} +1 -1
- package/dist/gateway/static/root/assets/cron-page-Chi_4u4P.js +3 -0
- package/dist/gateway/static/root/assets/dreaming-settings-B0_rs2tj.js +1 -0
- package/dist/gateway/static/root/assets/{extension-debug-page-BDHA9o_e.js → extension-debug-page-DSkqMYo7.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-DmDLVSPE.js → extension-page-h2dGDbMN.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-1124aHw_.js → extension-settings-page-hN99RhOi.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-DOe56Wmy.js → fetch-D9QqUtzZ.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-tsMSvBSR.js → format-interval-label-D6E687rG.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-CsD4FC9D.js → gateway-config-api-CLt_SKTC.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-HQ8FBhY2.js → gateway-settings-1PDi4lI0.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-C1zg7pH3.js → gateway-startup-retry-N7Z_sz7p.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-D_wwXL-t.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-DZ2toZ8y.js +2 -0
- package/dist/gateway/static/root/assets/{goals-settings-B5nI6lgz.js → goals-settings-LFlwtIKE.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-config-api-CIv42nJD.js → heartbeat-config-api-DGPadTw-.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DFcVuJ3M.js → heartbeat-settings-BHHAs8ZX.js} +1 -1
- package/dist/gateway/static/root/assets/index-DefIdW9q.js +122 -0
- package/dist/gateway/static/root/assets/index-DzmWBkq-.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-DGP3S7OB.js → interval-presets-CEklPQ_r.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-fETaDYQP.js → keyboard-shortcuts-settings-Ce_aQ8Iv.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-j_D2QTuQ.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-CgeBJMOD.js → markdown-split-BMz3xPXO.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-C30GzlV2.js → media-plugins-BalOSoz9.js} +1 -1
- package/dist/gateway/static/root/assets/messages-BN_WiUg0.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-CMH_TmZz.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-O18BrQPq.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-t1g0qZYh.js → note-image-lightbox-C5D1Q5mY.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-B_ZYCmY9.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-DeWp9x5g.js → preview-open-alternatives-CYFR5U9l.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-CwKgWixY.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-BOaAOJI3.js → save-bar-controls-BQ79Z5IP.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-BLWLKqgw.js → schedule-field-Bgk6Emue.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-plqRFYT8.js → schema-form-DzS36TMa.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-C4fcD-7B.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-Ad2OJ86w.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-BP5zRrDI.js → settings-collapsible-section-CdjFnSAy.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Bv8MZplG.js → settings-form-section-DZLy_exu.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-D2BMY5wo.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-aWwxl_E1.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-4OX1YCgp.js → share-preview-page-_qRDr4g_.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-DUE83uIf.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-mWKJcrog.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-0Sx1Q58n.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-CGy4f_s2.js → system-settings-panel-hqaBF5aG.js} +1 -1
- package/dist/gateway/static/root/assets/use-agent-defaults-form-zbVIQLOA.js +1 -0
- package/dist/gateway/static/root/assets/{use-channel-catalog-CjGHnDvN.js → use-channel-catalog-CbXq97rT.js} +1 -1
- package/dist/gateway/static/root/assets/{use-settings-tab-guard-BMMFa0oA.js → use-settings-tab-guard-DwS3drWK.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-D6HR0hR2.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-D5vzWwls.js → voice-player-store-DSuOd9zy.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-C0Uq3xyq.js +1 -0
- package/dist/gateway/static/root/assets/workflows-page-DW0fmWhQ.js +18 -0
- package/dist/gateway/static/root/favicon-16x16.png +0 -0
- package/dist/gateway/static/root/favicon-32x32.png +0 -0
- package/dist/gateway/static/root/favicon-icon.svg +1 -0
- package/dist/gateway/static/root/favicon.ico +0 -0
- package/dist/gateway/static/root/favicon.png +0 -0
- package/dist/gateway/static/root/favicon.svg +24 -17
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/gateway/static/root/logo-dark.svg +23 -15
- package/dist/gateway/static/root/logo.svg +23 -16
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +8 -0
- package/dist/src/agent/agent-manager.js +57 -22
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/bootstrap/project-agents-context.d.ts +2 -0
- package/dist/src/agent/bootstrap/project-agents-context.js +32 -0
- package/dist/src/agent/bootstrap/project-agents-context.js.map +1 -0
- package/dist/src/agent/goals/persistent-goal-service.js +2 -4
- package/dist/src/agent/goals/persistent-goal-service.js.map +1 -1
- package/dist/src/agent/inbound/inbound-loop.js +5 -1
- package/dist/src/agent/inbound/inbound-loop.js.map +1 -1
- package/dist/src/agent/inbound/turn-dispatcher.d.ts +2 -2
- package/dist/src/agent/inbound/turn-dispatcher.js +2 -2
- package/dist/src/agent/inbound/turn-dispatcher.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +49 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +78 -3
- package/dist/src/agent/mcp/bundle-mcp-runtime.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-types.d.ts +19 -0
- package/dist/src/agent/service/btw-query.js +11 -3
- package/dist/src/agent/service/btw-query.js.map +1 -1
- package/dist/src/agent/service/parse-outbound-session-key.js +13 -8
- package/dist/src/agent/service/parse-outbound-session-key.js.map +1 -1
- package/dist/src/agent/service/process-direct-one-shot.d.ts +2 -2
- package/dist/src/agent/service/process-direct-one-shot.js +1 -1
- package/dist/src/agent/service/process-direct-one-shot.js.map +1 -1
- package/dist/src/agent/service/process-direct-streaming.d.ts +2 -2
- package/dist/src/agent/service/process-direct-streaming.js +10 -5
- package/dist/src/agent/service/process-direct-streaming.js.map +1 -1
- package/dist/src/agent/service.d.ts +1 -1
- package/dist/src/agent/service.js +9 -5
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +5 -0
- package/dist/src/agent/skills/filesystem-watcher.js +4 -3
- package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
- package/dist/src/agent/skills/index.js +2 -1
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +2 -1
- package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
- package/dist/src/agent/skills/types.d.ts +1 -1
- package/dist/src/agent/skills/watcher.js +2 -5
- package/dist/src/agent/skills/watcher.js.map +1 -1
- package/dist/src/agent/skills/workspace-skills-dir.d.ts +1 -0
- package/dist/src/agent/skills/workspace-skills-dir.js +11 -0
- package/dist/src/agent/skills/workspace-skills-dir.js.map +1 -0
- package/dist/src/agent/tool-manuals/browser.d.ts +1 -1
- package/dist/src/agent/tool-manuals/browser.js +62 -3
- package/dist/src/agent/tool-manuals/browser.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.d.ts +4 -1
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js +13 -4
- package/dist/src/agent/tools/browser/tool/browser-use-tool.js.map +1 -1
- package/dist/src/agent/tools/browser/tool/schemas.d.ts +0 -2
- package/dist/src/agent/tools/browser/tool/schemas.js +1 -2
- package/dist/src/agent/tools/browser/tool/schemas.js.map +1 -1
- package/dist/src/agent/tools/factory.js +1 -10
- package/dist/src/agent/tools/factory.js.map +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
- package/dist/src/agent/workflow/subagent-runner.js +18 -1
- package/dist/src/agent/workflow/subagent-runner.js.map +1 -1
- package/dist/src/ai-assist/text-assist.d.ts +3 -0
- package/dist/src/ai-assist/text-assist.js +25 -7
- package/dist/src/ai-assist/text-assist.js.map +1 -1
- package/dist/src/browser/actions/extension-registry-bridge.js +91 -7
- package/dist/src/browser/actions/extension-registry-bridge.js.map +1 -1
- package/dist/src/browser/actions/registry.js +383 -7
- package/dist/src/browser/actions/registry.js.map +1 -1
- package/dist/src/browser/actions/types.d.ts +11 -3
- package/dist/src/browser/index.js +2 -2
- package/dist/src/browser/pipeline/output.d.ts +18 -16
- package/dist/src/browser/pipeline/output.js +28 -20
- package/dist/src/browser/pipeline/output.js.map +1 -1
- package/dist/src/browser/pipeline/runner.d.ts +7 -14
- package/dist/src/browser/pipeline/runner.js +349 -102
- package/dist/src/browser/pipeline/runner.js.map +1 -1
- package/dist/src/browser/pipeline/schema.d.ts +1 -0
- package/dist/src/browser/pipeline/schema.js +35 -58
- package/dist/src/browser/pipeline/schema.js.map +1 -1
- package/dist/src/browser/pipeline/source.d.ts +2 -0
- package/dist/src/browser/pipeline/source.js +10 -1
- package/dist/src/browser/pipeline/source.js.map +1 -1
- package/dist/src/browser/pipeline/template.d.ts +10 -2
- package/dist/src/browser/pipeline/template.js +50 -8
- package/dist/src/browser/pipeline/template.js.map +1 -1
- package/dist/src/channels/plugins/types.adapters.d.ts +2 -2
- package/dist/src/chat-commands/builtins/config.js +3 -5
- package/dist/src/chat-commands/builtins/config.js.map +1 -1
- package/dist/src/chat-commands/context.d.ts +5 -0
- package/dist/src/chat-commands/context.js +18 -9
- package/dist/src/chat-commands/context.js.map +1 -1
- package/dist/src/chat-commands/index.d.ts +1 -1
- package/dist/src/chat-commands/index.js +2 -2
- package/dist/src/chat-commands/index.js.map +1 -1
- package/dist/src/chat-commands/processor.js +22 -21
- package/dist/src/chat-commands/processor.js.map +1 -1
- package/dist/src/chat-commands/session-key.d.ts +3 -15
- package/dist/src/chat-commands/session-key.js +3 -49
- package/dist/src/chat-commands/session-key.js.map +1 -1
- package/dist/src/chat-commands/types.d.ts +4 -0
- package/dist/src/cli/commands/browser-cli-helpers.js +11 -5
- package/dist/src/cli/commands/browser-cli-helpers.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/database-schema.js +1 -1
- package/dist/src/cli/commands/doctor/checks/session-integrity.js +8 -8
- package/dist/src/cli/commands/doctor/checks/session-integrity.js.map +1 -1
- package/dist/src/config/rules.js +5 -0
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/connectors/builtin-catalog.js +180 -1
- package/dist/src/connectors/builtin-catalog.js.map +1 -1
- package/dist/src/connectors/health.js +18 -9
- package/dist/src/connectors/health.js.map +1 -1
- package/dist/src/connectors/types.d.ts +19 -0
- package/dist/src/connectors/usage.js +12 -4
- package/dist/src/connectors/usage.js.map +1 -1
- package/dist/src/cron/executor.js.map +1 -1
- package/dist/src/cron/types.d.ts +2 -2
- package/dist/src/extensions/types/tui.d.ts +2 -0
- package/dist/src/gateway/heartbeat/service.js +13 -1
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +13 -4
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/oauth-async.js +1 -1
- package/dist/src/gateway/hono/routes/agent-stream.js +6 -6
- package/dist/src/gateway/hono/routes/agent-stream.js.map +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.d.ts +1 -1
- package/dist/src/gateway/hono/routes/config-patch/gateway.js +6 -0
- package/dist/src/gateway/hono/routes/config-patch/gateway.js.map +1 -1
- package/dist/src/gateway/hono/routes/goals.js +16 -3
- package/dist/src/gateway/hono/routes/goals.js.map +1 -1
- package/dist/src/gateway/hono/routes/logs.js +1 -0
- package/dist/src/gateway/hono/routes/logs.js.map +1 -1
- package/dist/src/gateway/hono/routes/mcp.js +27 -8
- package/dist/src/gateway/hono/routes/mcp.js.map +1 -1
- package/dist/src/gateway/hono/routes/notes.js +14 -2
- package/dist/src/gateway/hono/routes/notes.js.map +1 -1
- package/dist/src/gateway/hono/routes/sessions.js +62 -4
- package/dist/src/gateway/hono/routes/sessions.js.map +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +3 -66
- package/dist/src/gateway/hono/routes/workspace.js.map +1 -1
- package/dist/src/gateway/hono/sse.d.ts +2 -2
- package/dist/src/gateway/hono/sse.js +7 -15
- package/dist/src/gateway/hono/sse.js.map +1 -1
- package/dist/src/gateway/resolve-webchat-session-key.d.ts +2 -6
- package/dist/src/gateway/resolve-webchat-session-key.js +5 -31
- package/dist/src/gateway/resolve-webchat-session-key.js.map +1 -1
- package/dist/src/gateway/service/agent-runner.d.ts +2 -3
- package/dist/src/gateway/service/agent-runner.js +9 -22
- package/dist/src/gateway/service/agent-runner.js.map +1 -1
- package/dist/src/gateway/service/run-gateway-agent.js +9 -7
- package/dist/src/gateway/service/run-gateway-agent.js.map +1 -1
- package/dist/src/gateway/service/sessions-api.d.ts +9 -0
- package/dist/src/gateway/service/sessions-api.js +11 -0
- package/dist/src/gateway/service/sessions-api.js.map +1 -1
- package/dist/src/gateway/service.d.ts +1 -1
- package/dist/src/gateway/service.js +19 -5
- package/dist/src/gateway/service.js.map +1 -1
- package/dist/src/gateway/workspace-file-search.d.ts +9 -0
- package/dist/src/gateway/workspace-file-search.js +76 -0
- package/dist/src/gateway/workspace-file-search.js.map +1 -0
- package/dist/src/goals/goal-notifications.d.ts +2 -0
- package/dist/src/goals/goal-notifications.js +16 -11
- package/dist/src/goals/goal-notifications.js.map +1 -1
- package/dist/src/goals/goal-service.js +1 -6
- package/dist/src/goals/goal-service.js.map +1 -1
- package/dist/src/project-trust/trust-store.js +2 -0
- package/dist/src/project-trust/trust-store.js.map +1 -1
- package/dist/src/session/index.d.ts +1 -1
- package/dist/src/session/index.js +2 -2
- package/dist/src/session/init-session-turn.js +6 -9
- package/dist/src/session/init-session-turn.js.map +1 -1
- package/dist/src/session/manager.d.ts +5 -1
- package/dist/src/session/manager.js +5 -2
- package/dist/src/session/manager.js.map +1 -1
- package/dist/src/session/reset-type.d.ts +0 -2
- package/dist/src/session/reset-type.js +3 -9
- package/dist/src/session/reset-type.js.map +1 -1
- package/dist/src/session/resolve-session.js +9 -20
- package/dist/src/session/resolve-session.js.map +1 -1
- package/dist/src/session/store-reader.d.ts +5 -0
- package/dist/src/session/store-reader.js +1 -0
- package/dist/src/session/store.d.ts +11 -3
- package/dist/src/session/store.js +29 -13
- package/dist/src/session/store.js.map +1 -1
- package/dist/src/session/types.d.ts +2 -4
- package/dist/src/session/types.js.map +1 -1
- package/dist/src/storage/sqlite/index.d.ts +2 -2
- package/dist/src/storage/sqlite/index.js +3 -3
- package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -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/row-mappers.d.ts +4 -4
- package/dist/src/storage/sqlite/row-mappers.js +11 -14
- package/dist/src/storage/sqlite/row-mappers.js.map +1 -1
- package/dist/src/storage/sqlite/schema.js +3 -3
- package/dist/src/storage/sqlite/schema.js.map +1 -1
- package/dist/src/storage/sqlite/schema.sql +37 -10
- package/dist/src/storage/sqlite/session-metadata.d.ts +2 -7
- package/dist/src/storage/sqlite/session-metadata.js +18 -72
- package/dist/src/storage/sqlite/session-metadata.js.map +1 -1
- package/dist/src/storage/sqlite/session-repository.d.ts +6 -5
- package/dist/src/storage/sqlite/session-repository.js +34 -40
- package/dist/src/storage/sqlite/session-repository.js.map +1 -1
- package/dist/src/storage/sqlite/transcript-repository.d.ts +2 -2
- package/dist/src/storage/sqlite/transcript-repository.js +52 -52
- package/dist/src/storage/sqlite/transcript-repository.js.map +1 -1
- package/dist/src/tui/backends/embedded-backend.d.ts +11 -4
- package/dist/src/tui/backends/embedded-backend.js +27 -1
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +4 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +21 -2
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/extension-host/autocomplete.js +13 -10
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
- package/dist/src/tui/extension-host/runtime.d.ts +7 -0
- package/dist/src/tui/extension-host/runtime.js +6 -4
- package/dist/src/tui/extension-host/runtime.js.map +1 -1
- package/dist/src/tui/tui-backend.d.ts +9 -0
- package/dist/src/tui/tui-commands.js +85 -6
- package/dist/src/tui/tui-commands.js.map +1 -1
- package/dist/src/tui/tui-file-autocomplete.d.ts +5 -0
- package/dist/src/tui/tui-file-autocomplete.js +26 -0
- package/dist/src/tui/tui-file-autocomplete.js.map +1 -0
- package/dist/src/tui/tui-picker-overlay.js +1 -1
- package/dist/src/tui/tui.js +29 -11
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/utils/logger/context.d.ts +2 -2
- package/dist/src/utils/logger/context.js +2 -1
- package/dist/src/utils/logger/context.js.map +1 -1
- package/dist/src/utils/logger/log-store.js +1 -0
- package/dist/src/utils/logger/log-store.js.map +1 -1
- package/dist/src/utils/logger/pino-record.js +3 -0
- package/dist/src/utils/logger/pino-record.js.map +1 -1
- package/dist/src/utils/logger/types.d.ts +5 -0
- package/dist/src/utils/logger/types.js.map +1 -1
- package/dist/src/workflows/service/workflow-session-bridge.js +13 -1
- package/dist/src/workflows/service/workflow-session-bridge.js.map +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-H4foVCiS.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-DDNw2oNU.js +0 -1
- package/dist/gateway/static/root/assets/agents-E_X2kzS1.js +0 -71
- package/dist/gateway/static/root/assets/apps-page-BZLvInLr.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-BHvUKlzw.js +0 -1
- package/dist/gateway/static/root/assets/connectors-settings-VBzXcEXL.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-BLTpdm34.js +0 -3
- package/dist/gateway/static/root/assets/dreaming-settings-DSVhXTPq.js +0 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BG3Onph0.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-DgeKn8zL.js +0 -2
- package/dist/gateway/static/root/assets/index-5A_ZaABy.css +0 -1
- package/dist/gateway/static/root/assets/index-BTmbp2AU.js +0 -121
- package/dist/gateway/static/root/assets/logs-page-B1-b27lK.js +0 -2
- package/dist/gateway/static/root/assets/messages-BUUfPaZ9.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-DPcTS1-u.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-xeGb4owe.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-C_TdnKBe.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BtkPmJIN.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-DOUjxzJm.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-qK_bnTrw.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DmDfE1ww.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-BEFwNcIZ.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-CbKmJZot.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-YdtnUHtK.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-DwW1IzQ0.js +0 -2
- package/dist/gateway/static/root/assets/use-agent-defaults-form-BMuMvzl_.js +0 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DnRbhMNq.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-tjGpRVnw.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DqqHKGj2.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';\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\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\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 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: 'visible', timeout: timeoutMs });\n } else if (text?.trim()) {\n await ctx.page.getByText(text.trim()).first().waitFor({ state: 'visible', 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.', args.value ?? ctx.pipelineData);\n};\n\nconst assertAction: BrowserActionHandler = async (ctx, args) => {\n const value = String(args.value ?? ctx.pipelineData ?? '');\n const contains = args.contains as string | undefined;\n const equals = args.equals as string | undefined;\n if (contains && !value.includes(contains)) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to contain \"${contains}\"`);\n }\n if (equals !== undefined && value !== equals) {\n return fail('assert', 'ASSERTION_FAILED', `Expected value to equal \"${equals}\"`);\n }\n return ok('assert', 'Assertion passed.');\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 // Pipeline-specific\n handlers.set('output', outputAction);\n handlers.set('assert', assertAction);\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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"}
|
|
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":"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"}
|
|
@@ -5,7 +5,7 @@ import type { Page } from 'playwright-core';
|
|
|
5
5
|
import type { Config } from '../../config/schema.js';
|
|
6
6
|
import type { BrowserManager } from '../manager.js';
|
|
7
7
|
import type { CdpSupervisor } from '../cdp-supervisor.js';
|
|
8
|
-
export type BrowserActionName = 'open' | 'navigate' | 'state' | 'snapshot' | 'click' | 'type' | 'input' | 'scroll' | 'screenshot' | 'back' | 'keys' | 'press' | 'console' | 'eval' | 'evaluate' | 'images' | 'dialog' | 'cdp' | 'close' | 'wait' | 'assert' | 'output' | 'network_start' | 'network_events' | 'network_stop';
|
|
8
|
+
export type BrowserActionName = 'open' | 'navigate' | 'state' | 'snapshot' | 'click' | 'type' | 'input' | 'scroll' | 'screenshot' | 'back' | 'keys' | 'press' | 'console' | 'eval' | 'evaluate' | 'images' | 'dialog' | 'cdp' | 'close' | 'wait' | 'assert' | 'output' | 'network_start' | 'network_events' | 'network_stop' | 'wait_for_navigation' | 'wait_for_timeout' | 'wait_for_function' | 'wait_for_network_idle' | 'element_text' | 'element_attribute' | 'bounding_box' | 'set_input_files' | 'cookies' | 'get_cookies' | 'add_cookies' | 'clear_cookies' | 'tabs' | 'list_tabs' | 'new_tab' | 'switch_tab' | 'select' | 'map' | 'filter' | 'sort' | 'limit' | 'fetch' | 'collect' | 'tap';
|
|
9
9
|
export interface BrowserArtifact {
|
|
10
10
|
type: 'screenshot' | 'file' | 'network_har';
|
|
11
11
|
path?: string;
|
|
@@ -45,8 +45,16 @@ export interface BrowserActionContext {
|
|
|
45
45
|
taskId: string;
|
|
46
46
|
supervisor?: CdpSupervisor;
|
|
47
47
|
signal?: AbortSignal;
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
pipeline?: {
|
|
49
|
+
args: Record<string, unknown>;
|
|
50
|
+
last: unknown;
|
|
51
|
+
outputs: unknown[];
|
|
52
|
+
vars: Record<string, unknown>;
|
|
53
|
+
error?: {
|
|
54
|
+
code?: string;
|
|
55
|
+
message?: string;
|
|
56
|
+
};
|
|
57
|
+
};
|
|
50
58
|
}
|
|
51
59
|
export type BrowserActionHandler = (ctx: BrowserActionContext, args: Record<string, unknown>) => Promise<BrowserActionResult>;
|
|
52
60
|
export interface BrowserActionRegistry {
|
|
@@ -9,9 +9,9 @@ import { checkBotDetection, cleanupOrphanProcesses, startTracing, stopTracing }
|
|
|
9
9
|
import { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserNavigateSchema, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema } from "./schemas.js";
|
|
10
10
|
import { generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, resolveHumanConfig } from "./humanize.js";
|
|
11
11
|
import { WEBDRIVER_OVERRIDE_SCRIPT, buildLocalStealthArgs, buildStealthArgs, generateFingerprintSeed, makeExecutable, removeQuarantineAttr } from "./stealth.js";
|
|
12
|
+
import { resolveTemplate, resolveTemplateDeep } from "./pipeline/template.js";
|
|
12
13
|
import { createBrowserActionRegistry } from "./actions/registry.js";
|
|
13
14
|
import { parseBrowserPipeline } from "./pipeline/schema.js";
|
|
14
|
-
import { resolveTemplate, resolveTemplateDeep } from "./pipeline/template.js";
|
|
15
|
-
import { runBrowserPipeline, validateBrowserPipeline } from "./pipeline/runner.js";
|
|
16
15
|
import { loadBrowserPipelineSource } from "./pipeline/source.js";
|
|
16
|
+
import { runBrowserPipeline, validateBrowserPipeline } from "./pipeline/runner.js";
|
|
17
17
|
export { BrowserBackSchema, BrowserCdpSchema, BrowserClickSchema, BrowserCloseSchema, BrowserConsoleSchema, BrowserDialogSchema, BrowserGetImagesSchema, BrowserManager, BrowserNavigateSchema, BrowserNotReadyError, BrowserPressSchema, BrowserScreenshotSchema, BrowserScrollSchema, BrowserSnapshotSchema, BrowserTypeSchema, BrowserVisionSchema, CdpSupervisor, WEBDRIVER_OVERRIDE_SCRIPT, assertBrowserUrlAllowed, buildBrowserSetupDeepLink, buildLocalStealthArgs, buildStealthArgs, checkBotDetection, checkBrowserReadiness, checkPostRedirectUrl, cleanupOrphanProcesses, containsApiKeyPattern, createBrowserActionRegistry, generateFingerprintSeed, generateMousePath, generateScrollPlan, generateTypingPlan, humanizedClick, humanizedFill, humanizedPress, humanizedScroll, isAlwaysBlockedUrl, loadBrowserPipelineSource, makeExecutable, parseBrowserPipeline, removeQuarantineAttr, resolveBrowserBackendFromConfig, resolveBrowserCommandTimeoutMs, resolveHumanConfig, resolveTemplate, resolveTemplateDeep, runBrowserPipeline, snapshotSummaryHeader, startTracing, stopTracing, truncateSnapshotAtBoundary, validateBrowserPipeline };
|
|
@@ -1,23 +1,28 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pipeline output formatting
|
|
2
|
+
* Pipeline output formatting.
|
|
3
3
|
*/
|
|
4
4
|
import type { BrowserActionResult, BrowserArtifact, BrowserDiagnostics } from '../actions/types.js';
|
|
5
|
+
export interface PipelineStepTrace {
|
|
6
|
+
index: number;
|
|
7
|
+
scope: string;
|
|
8
|
+
action: string;
|
|
9
|
+
ok: boolean;
|
|
10
|
+
elapsedMs: number;
|
|
11
|
+
text?: string;
|
|
12
|
+
data?: unknown;
|
|
13
|
+
error?: {
|
|
14
|
+
code: string;
|
|
15
|
+
message: string;
|
|
16
|
+
};
|
|
17
|
+
}
|
|
5
18
|
export interface PipelineOutput {
|
|
6
19
|
ok: boolean;
|
|
7
20
|
name: string;
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
/** All artifacts collected during the pipeline. */
|
|
21
|
+
last: unknown;
|
|
22
|
+
outputs: unknown[];
|
|
11
23
|
artifacts: BrowserArtifact[];
|
|
12
|
-
/** Diagnostics from failed steps or on_error. */
|
|
13
24
|
diagnostics: BrowserDiagnostics;
|
|
14
|
-
|
|
15
|
-
steps: {
|
|
16
|
-
action: string;
|
|
17
|
-
ok: boolean;
|
|
18
|
-
text?: string;
|
|
19
|
-
}[];
|
|
20
|
-
/** Error from the failed step (if any). */
|
|
25
|
+
trace: PipelineStepTrace[];
|
|
21
26
|
error?: {
|
|
22
27
|
step: number;
|
|
23
28
|
action: string;
|
|
@@ -26,8 +31,5 @@ export interface PipelineOutput {
|
|
|
26
31
|
};
|
|
27
32
|
}
|
|
28
33
|
export declare function createPipelineOutput(name: string): PipelineOutput;
|
|
29
|
-
export declare function
|
|
30
|
-
/**
|
|
31
|
-
* Format a PipelineOutput into a BrowserActionResult for tool consumption.
|
|
32
|
-
*/
|
|
34
|
+
export declare function addStepTrace(output: PipelineOutput, trace: PipelineStepTrace, result: BrowserActionResult): void;
|
|
33
35
|
export declare function formatPipelineResult(output: PipelineOutput): BrowserActionResult;
|
|
@@ -3,23 +3,20 @@ function createPipelineOutput(name) {
|
|
|
3
3
|
return {
|
|
4
4
|
ok: true,
|
|
5
5
|
name,
|
|
6
|
-
|
|
6
|
+
last: void 0,
|
|
7
|
+
outputs: [],
|
|
7
8
|
artifacts: [],
|
|
8
9
|
diagnostics: { warnings: [] },
|
|
9
|
-
|
|
10
|
+
trace: []
|
|
10
11
|
};
|
|
11
12
|
}
|
|
12
|
-
function
|
|
13
|
-
output.
|
|
14
|
-
action: result.action,
|
|
15
|
-
ok: result.ok,
|
|
16
|
-
text: result.text?.slice(0, 200)
|
|
17
|
-
});
|
|
13
|
+
function addStepTrace(output, trace, result) {
|
|
14
|
+
output.trace.push(trace);
|
|
18
15
|
if (result.artifacts) output.artifacts.push(...result.artifacts);
|
|
19
16
|
if (!result.ok) {
|
|
20
17
|
output.ok = false;
|
|
21
18
|
output.error = {
|
|
22
|
-
step:
|
|
19
|
+
step: trace.index,
|
|
23
20
|
action: result.action,
|
|
24
21
|
code: result.error?.code ?? "UNKNOWN",
|
|
25
22
|
message: result.error?.message ?? "Step failed"
|
|
@@ -32,25 +29,36 @@ function addStepResult(output, stepIndex, result) {
|
|
|
32
29
|
if (result.diagnostics.screenshot) output.diagnostics.screenshot = result.diagnostics.screenshot;
|
|
33
30
|
if (result.diagnostics.console) output.diagnostics.console = result.diagnostics.console;
|
|
34
31
|
if (result.diagnostics.network) output.diagnostics.network = result.diagnostics.network;
|
|
35
|
-
if (result.diagnostics.warnings)
|
|
32
|
+
if (result.diagnostics.warnings) {
|
|
33
|
+
output.diagnostics.warnings ??= [];
|
|
34
|
+
output.diagnostics.warnings.push(...result.diagnostics.warnings);
|
|
35
|
+
}
|
|
36
36
|
}
|
|
37
37
|
}
|
|
38
|
-
/**
|
|
39
|
-
* Format a PipelineOutput into a BrowserActionResult for tool consumption.
|
|
40
|
-
*/
|
|
41
38
|
function formatPipelineResult(output) {
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
artifacts: output.artifacts.length > 0 ? output.artifacts : void 0
|
|
39
|
+
const data = {
|
|
40
|
+
output: output.outputs.length === 0 ? output.last : output.outputs.length === 1 ? output.outputs[0] : output.outputs,
|
|
41
|
+
last: output.last,
|
|
42
|
+
outputs: output.outputs,
|
|
43
|
+
trace: output.trace
|
|
48
44
|
};
|
|
45
|
+
if (output.ok) {
|
|
46
|
+
const textValue = data.output;
|
|
47
|
+
return {
|
|
48
|
+
ok: true,
|
|
49
|
+
action: "pipeline",
|
|
50
|
+
text: textValue === void 0 ? `Pipeline "${output.name}" completed (${output.trace.length} steps).` : typeof textValue === "string" ? textValue : JSON.stringify(textValue, null, 2),
|
|
51
|
+
data,
|
|
52
|
+
artifacts: output.artifacts.length > 0 ? output.artifacts : void 0,
|
|
53
|
+
diagnostics: output.diagnostics
|
|
54
|
+
};
|
|
55
|
+
}
|
|
49
56
|
const errText = output.error ? `Pipeline "${output.name}" failed at step ${output.error.step + 1} (${output.error.action}): [${output.error.code}] ${output.error.message}` : `Pipeline "${output.name}" failed.`;
|
|
50
57
|
return {
|
|
51
58
|
ok: false,
|
|
52
59
|
action: "pipeline",
|
|
53
60
|
text: errText,
|
|
61
|
+
data,
|
|
54
62
|
error: output.error ? {
|
|
55
63
|
code: output.error.code,
|
|
56
64
|
message: output.error.message
|
|
@@ -63,6 +71,6 @@ function formatPipelineResult(output) {
|
|
|
63
71
|
};
|
|
64
72
|
}
|
|
65
73
|
//#endregion
|
|
66
|
-
export {
|
|
74
|
+
export { addStepTrace, createPipelineOutput, formatPipelineResult };
|
|
67
75
|
|
|
68
76
|
//# sourceMappingURL=output.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"output.js","names":[],"sources":["../../../../src/browser/pipeline/output.ts"],"sourcesContent":["/**\n * Pipeline output formatting
|
|
1
|
+
{"version":3,"file":"output.js","names":[],"sources":["../../../../src/browser/pipeline/output.ts"],"sourcesContent":["/**\n * Pipeline output formatting.\n */\n\nimport type { BrowserActionResult, BrowserArtifact, BrowserDiagnostics } from '../actions/types.js';\n\nexport interface PipelineStepTrace {\n index: number;\n scope: string;\n action: string;\n ok: boolean;\n elapsedMs: number;\n text?: string;\n data?: unknown;\n error?: { code: string; message: string };\n}\n\nexport interface PipelineOutput {\n ok: boolean;\n name: string;\n last: unknown;\n outputs: unknown[];\n artifacts: BrowserArtifact[];\n diagnostics: BrowserDiagnostics;\n trace: PipelineStepTrace[];\n error?: { step: number; action: string; code: string; message: string };\n}\n\nexport function createPipelineOutput(name: string): PipelineOutput {\n return {\n ok: true,\n name,\n last: undefined,\n outputs: [],\n artifacts: [],\n diagnostics: { warnings: [] },\n trace: [],\n };\n}\n\nexport function addStepTrace(output: PipelineOutput, trace: PipelineStepTrace, result: BrowserActionResult): void {\n output.trace.push(trace);\n\n if (result.artifacts) {\n output.artifacts.push(...result.artifacts);\n }\n\n if (!result.ok) {\n output.ok = false;\n output.error = {\n step: trace.index,\n action: result.action,\n code: result.error?.code ?? 'UNKNOWN',\n message: result.error?.message ?? 'Step failed',\n };\n }\n\n if (result.diagnostics) {\n if (result.diagnostics.url) output.diagnostics.url = result.diagnostics.url;\n if (result.diagnostics.title) output.diagnostics.title = result.diagnostics.title;\n if (result.diagnostics.snapshot) output.diagnostics.snapshot = result.diagnostics.snapshot;\n if (result.diagnostics.screenshot) output.diagnostics.screenshot = result.diagnostics.screenshot;\n if (result.diagnostics.console) output.diagnostics.console = result.diagnostics.console;\n if (result.diagnostics.network) output.diagnostics.network = result.diagnostics.network;\n if (result.diagnostics.warnings) {\n output.diagnostics.warnings ??= [];\n output.diagnostics.warnings.push(...result.diagnostics.warnings);\n }\n }\n}\n\nexport function formatPipelineResult(output: PipelineOutput): BrowserActionResult {\n const data = {\n output: output.outputs.length === 0 ? output.last : output.outputs.length === 1 ? output.outputs[0] : output.outputs,\n last: output.last,\n outputs: output.outputs,\n trace: output.trace,\n };\n\n if (output.ok) {\n const textValue = data.output;\n const text = textValue === undefined\n ? `Pipeline \"${output.name}\" completed (${output.trace.length} steps).`\n : typeof textValue === 'string'\n ? textValue\n : JSON.stringify(textValue, null, 2);\n return {\n ok: true,\n action: 'pipeline',\n text,\n data,\n artifacts: output.artifacts.length > 0 ? output.artifacts : undefined,\n diagnostics: output.diagnostics,\n };\n }\n\n const errText = output.error\n ? `Pipeline \"${output.name}\" failed at step ${output.error.step + 1} (${output.error.action}): [${output.error.code}] ${output.error.message}`\n : `Pipeline \"${output.name}\" failed.`;\n return {\n ok: false,\n action: 'pipeline',\n text: errText,\n data,\n error: output.error ? { code: output.error.code, message: output.error.message } : { code: 'PIPELINE_FAILED', message: errText },\n artifacts: output.artifacts.length > 0 ? output.artifacts : undefined,\n diagnostics: output.diagnostics,\n };\n}\n"],"mappings":";AA4BA,SAAgB,qBAAqB,MAA8B;AACjE,QAAO;EACL,IAAI;EACJ;EACA,MAAM,KAAA;EACN,SAAS,EAAE;EACX,WAAW,EAAE;EACb,aAAa,EAAE,UAAU,EAAE,EAAE;EAC7B,OAAO,EAAE;EACV;;AAGH,SAAgB,aAAa,QAAwB,OAA0B,QAAmC;AAChH,QAAO,MAAM,KAAK,MAAM;AAExB,KAAI,OAAO,UACT,QAAO,UAAU,KAAK,GAAG,OAAO,UAAU;AAG5C,KAAI,CAAC,OAAO,IAAI;AACd,SAAO,KAAK;AACZ,SAAO,QAAQ;GACb,MAAM,MAAM;GACZ,QAAQ,OAAO;GACf,MAAM,OAAO,OAAO,QAAQ;GAC5B,SAAS,OAAO,OAAO,WAAW;GACnC;;AAGH,KAAI,OAAO,aAAa;AACtB,MAAI,OAAO,YAAY,IAAK,QAAO,YAAY,MAAM,OAAO,YAAY;AACxE,MAAI,OAAO,YAAY,MAAO,QAAO,YAAY,QAAQ,OAAO,YAAY;AAC5E,MAAI,OAAO,YAAY,SAAU,QAAO,YAAY,WAAW,OAAO,YAAY;AAClF,MAAI,OAAO,YAAY,WAAY,QAAO,YAAY,aAAa,OAAO,YAAY;AACtF,MAAI,OAAO,YAAY,QAAS,QAAO,YAAY,UAAU,OAAO,YAAY;AAChF,MAAI,OAAO,YAAY,QAAS,QAAO,YAAY,UAAU,OAAO,YAAY;AAChF,MAAI,OAAO,YAAY,UAAU;AAC/B,UAAO,YAAY,aAAa,EAAE;AAClC,UAAO,YAAY,SAAS,KAAK,GAAG,OAAO,YAAY,SAAS;;;;AAKtE,SAAgB,qBAAqB,QAA6C;CAChF,MAAM,OAAO;EACX,QAAQ,OAAO,QAAQ,WAAW,IAAI,OAAO,OAAO,OAAO,QAAQ,WAAW,IAAI,OAAO,QAAQ,KAAK,OAAO;EAC7G,MAAM,OAAO;EACb,SAAS,OAAO;EAChB,OAAO,OAAO;EACf;AAED,KAAI,OAAO,IAAI;EACb,MAAM,YAAY,KAAK;AAMvB,SAAO;GACL,IAAI;GACJ,QAAQ;GACR,MARW,cAAc,KAAA,IACvB,aAAa,OAAO,KAAK,eAAe,OAAO,MAAM,OAAO,YAC5D,OAAO,cAAc,WACnB,YACA,KAAK,UAAU,WAAW,MAAM,EAAE;GAKtC;GACA,WAAW,OAAO,UAAU,SAAS,IAAI,OAAO,YAAY,KAAA;GAC5D,aAAa,OAAO;GACrB;;CAGH,MAAM,UAAU,OAAO,QACnB,aAAa,OAAO,KAAK,mBAAmB,OAAO,MAAM,OAAO,EAAE,IAAI,OAAO,MAAM,OAAO,MAAM,OAAO,MAAM,KAAK,IAAI,OAAO,MAAM,YACnI,aAAa,OAAO,KAAK;AAC7B,QAAO;EACL,IAAI;EACJ,QAAQ;EACR,MAAM;EACN;EACA,OAAO,OAAO,QAAQ;GAAE,MAAM,OAAO,MAAM;GAAM,SAAS,OAAO,MAAM;GAAS,GAAG;GAAE,MAAM;GAAmB,SAAS;GAAS;EAChI,WAAW,OAAO,UAAU,SAAS,IAAI,OAAO,YAAY,KAAA;EAC5D,aAAa,OAAO;EACrB"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* Pipeline runner
|
|
2
|
+
* Pipeline runner: deterministic browser automation DSL execution.
|
|
3
3
|
*/
|
|
4
4
|
import type { BrowserActionContext, BrowserActionRegistry, BrowserActionResult } from '../actions/types.js';
|
|
5
5
|
import { type PipelineDocument } from './schema.js';
|
|
@@ -11,17 +11,10 @@ export interface ValidateResult {
|
|
|
11
11
|
message: string;
|
|
12
12
|
}[];
|
|
13
13
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
14
|
+
export interface RunBrowserPipelineOptions {
|
|
15
|
+
dryRun?: boolean;
|
|
16
|
+
sourceLocation?: string;
|
|
17
|
+
}
|
|
17
18
|
export declare function validateBrowserPipeline(yamlSource: string, registry?: BrowserActionRegistry): ValidateResult;
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
*
|
|
21
|
-
* @param yamlSource - Raw YAML text.
|
|
22
|
-
* @param argOverrides - Runtime argument overrides.
|
|
23
|
-
* @param ctx - Browser action context (page, manager, config, etc.).
|
|
24
|
-
* @param registry - Action registry.
|
|
25
|
-
* @param dryRun - When true, only validate without executing.
|
|
26
|
-
*/
|
|
27
|
-
export declare function runBrowserPipeline(yamlSource: string, argOverrides: Record<string, unknown>, ctx: BrowserActionContext, registry: BrowserActionRegistry, dryRun?: boolean): Promise<BrowserActionResult>;
|
|
19
|
+
export declare function validateBrowserPipelineSource(yamlSource: string, registry?: BrowserActionRegistry, sourceLocation?: string): Promise<ValidateResult>;
|
|
20
|
+
export declare function runBrowserPipeline(yamlSource: string, argOverrides: Record<string, unknown>, ctx: BrowserActionContext, registry: BrowserActionRegistry, options?: RunBrowserPipelineOptions): Promise<BrowserActionResult>;
|