@xopcai/xopc 0.0.113 → 0.0.115
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/manifest.json +1 -1
- package/dist/extensions/feishu/src/outbound/media-load.js +1 -1
- package/dist/extensions/feishu/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/src/adapters/streaming-adapter.js +1 -1
- package/dist/extensions/telegram/src/inbound-processor.js +1 -1
- package/dist/extensions/telegram/src/plugin.js +1 -1
- package/dist/extensions/telegram/src/routing-integration.js +2 -2
- package/dist/extensions/telegram/src/update-offset-store.js +1 -1
- package/dist/extensions/telegram/src/workflow-progress.js +1 -1
- package/dist/extensions/telegram/xopc.extension.json +1 -1
- package/dist/extensions/weixin/src/api/api.js +2 -2
- package/dist/extensions/weixin/src/auth/accounts.js +1 -1
- package/dist/extensions/weixin/src/cdn/upload.js +1 -1
- package/dist/extensions/weixin/src/media/data-url.js +1 -1
- package/dist/extensions/weixin/src/messaging/debug-mode.js +1 -1
- package/dist/extensions/weixin/src/messaging/inbound.js +1 -1
- package/dist/extensions/weixin/src/messaging/process-message.js +1 -1
- package/dist/extensions/weixin/src/plugin.js +1 -1
- package/dist/extensions/weixin/src/storage/sync-buf.js +1 -1
- package/dist/extensions/weixin/src/workflow-progress.js +1 -1
- package/dist/gateway/static/root/assets/{agent-avatar-dicebear-CBlklyNr.js → agent-avatar-dicebear-DVnBfANm.js} +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-DPXc4hz8.js +6 -0
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CTJ0YnRQ.js +1 -0
- package/dist/gateway/static/root/assets/agents-zJXQfJ_W.js +71 -0
- package/dist/gateway/static/root/assets/{app-management-settings-panel-28E_WfMe.js → app-management-settings-panel-DzGbdr04.js} +1 -1
- package/dist/gateway/static/root/assets/{appearance-settings-Do1z0XgJ.js → appearance-settings-BQpPSTHD.js} +1 -1
- package/dist/gateway/static/root/assets/apps-page-CPjfyzSD.js +1 -0
- package/dist/gateway/static/root/assets/{archive-plugin-BAFlsov_.js → archive-plugin-CXu-Csep.js} +1 -1
- package/dist/gateway/static/root/assets/{attachment-load-V3qGPC3x.js → attachment-load-BAjgOoGY.js} +1 -1
- package/dist/gateway/static/root/assets/{binary-plugins-DT8NvA6W.js → binary-plugins-BSBgB2hO.js} +1 -1
- package/dist/gateway/static/root/assets/{block-editor-CdLMEcHd.js → block-editor-BpXw9TTR.js} +3 -3
- package/dist/gateway/static/root/assets/channels-settings-BbPUpzWB.js +1 -0
- package/dist/gateway/static/root/assets/{config-api-Bf5mjpu7.js → config-api-NOoPiIYz.js} +1 -1
- package/dist/gateway/static/root/assets/connectors-settings-CAXYMOdp.js +2 -0
- package/dist/gateway/static/root/assets/{cron-api--pAB_rps.js → cron-api-C9BOqAXd.js} +1 -1
- package/dist/gateway/static/root/assets/cron-page-DuUbBeKI.js +3 -0
- package/dist/gateway/static/root/assets/{dreaming-settings-6UZE1FSK.js → dreaming-settings-DQ4DtiK1.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-debug-page-BGhE7msg.js → extension-debug-page-D9kgUHCc.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-page-CvpI45WG.js → extension-page-CGyhXqzR.js} +1 -1
- package/dist/gateway/static/root/assets/{extension-settings-page-DAmR5FUe.js → extension-settings-page-DL8Xquqd.js} +1 -1
- package/dist/gateway/static/root/assets/{fetch-NZmjSXLl.js → fetch-D0VXA932.js} +1 -1
- package/dist/gateway/static/root/assets/{format-interval-label-qhth3BMV.js → format-interval-label-Be8SmgUw.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-config-api-CaXBt-9R.js → gateway-config-api-C-xjn__h.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-settings-DphpbLBc.js → gateway-settings-BMPwIjKI.js} +1 -1
- package/dist/gateway/static/root/assets/{gateway-startup-retry-Be1omjh3.js → gateway-startup-retry-DERUH61L.js} +1 -1
- package/dist/gateway/static/root/assets/goal-detail-page-BJsyjJnF.js +1 -0
- package/dist/gateway/static/root/assets/goals-config-api-BPmqWk90.js +1 -0
- package/dist/gateway/static/root/assets/goals-page-BerDgIhw.js +2 -0
- package/dist/gateway/static/root/assets/goals-settings-ByTjeAto.js +1 -0
- package/dist/gateway/static/root/assets/{heartbeat-config-api-BzO6G4fD.js → heartbeat-config-api-Bfdzr8oV.js} +1 -1
- package/dist/gateway/static/root/assets/{heartbeat-settings-DCST9-du.js → heartbeat-settings-TbHgcjTn.js} +1 -1
- package/dist/gateway/static/root/assets/index-AkTrf6Pb.js +122 -0
- package/dist/gateway/static/root/assets/index-fh5sXTj9.css +1 -0
- package/dist/gateway/static/root/assets/{interval-presets-DJmshV8n.js → interval-presets-utKbuCRY.js} +1 -1
- package/dist/gateway/static/root/assets/{keyboard-shortcuts-settings-9AUUlQ5Q.js → keyboard-shortcuts-settings-CjqS6c6V.js} +1 -1
- package/dist/gateway/static/root/assets/logs-page-DGXuPf5B.js +2 -0
- package/dist/gateway/static/root/assets/{markdown-split-CYYELqAr.js → markdown-split-DW8C47iB.js} +1 -1
- package/dist/gateway/static/root/assets/{media-plugins-BEcMR2M8.js → media-plugins-D6HwDhDT.js} +1 -1
- package/dist/gateway/static/root/assets/messages-upgxw6Ub.js +3 -0
- package/dist/gateway/static/root/assets/models-hub-panel-Bot16nn7.js +2 -0
- package/dist/gateway/static/root/assets/note-detail-page-Brlyou8M.js +2 -0
- package/dist/gateway/static/root/assets/{note-image-lightbox-DNAoPcmm.js → note-image-lightbox-pJM35Pz5.js} +1 -1
- package/dist/gateway/static/root/assets/notes-page-DvZ4pwc-.js +1 -0
- package/dist/gateway/static/root/assets/{preview-open-alternatives-BPLz0AIv.js → preview-open-alternatives-CVwHuyN6.js} +1 -1
- package/dist/gateway/static/root/assets/remote-access-hub-BZEDmxbZ.js +1 -0
- package/dist/gateway/static/root/assets/{save-bar-controls-CrWwWRVK.js → save-bar-controls-Ba-UEk7x.js} +1 -1
- package/dist/gateway/static/root/assets/{schedule-field-CF2sadvN.js → schedule-field-CNN9595U.js} +1 -1
- package/dist/gateway/static/root/assets/{schema-form-Di5cKjYE.js → schema-form-DnNMmtD5.js} +1 -1
- package/dist/gateway/static/root/assets/sessions-page-DdGGlsfn.js +1 -0
- package/dist/gateway/static/root/assets/settings-advanced-gate-DlkEkPf9.js +1 -0
- package/dist/gateway/static/root/assets/{settings-collapsible-section-Chh282jW.js → settings-collapsible-section-CmOz80i5.js} +1 -1
- package/dist/gateway/static/root/assets/{settings-form-section-Dq-83cQd.js → settings-form-section-BmK7JJOV.js} +1 -1
- package/dist/gateway/static/root/assets/settings-page-DFPTrsPF.js +1 -0
- package/dist/gateway/static/root/assets/setup-status-panel-CYCCfgh4.js +1 -0
- package/dist/gateway/static/root/assets/{share-preview-page-0FXYnSUA.js → share-preview-page-Dp2qGrHC.js} +1 -1
- package/dist/gateway/static/root/assets/shares-settings-Bff1pGd0.js +1 -0
- package/dist/gateway/static/root/assets/skill-reload-api-CJGKpBur.js +1 -0
- package/dist/gateway/static/root/assets/skills-page-C6ocduTD.js +2 -0
- package/dist/gateway/static/root/assets/{system-settings-panel-W1pTcojB.js → system-settings-panel-5jrIEr5b.js} +1 -1
- package/dist/gateway/static/root/assets/{use-agent-defaults-form-BVRvkK7m.js → use-agent-defaults-form-BuiXLIs5.js} +1 -1
- package/dist/gateway/static/root/assets/{use-channel-catalog-CgJibfMM.js → use-channel-catalog-CHlO8J9G.js} +1 -1
- package/dist/gateway/static/root/assets/{use-settings-tab-guard-Bw_qkRQE.js → use-settings-tab-guard-CW5JORnl.js} +1 -1
- package/dist/gateway/static/root/assets/voice-api-key-field-DDoQyghO.js +1 -0
- package/dist/gateway/static/root/assets/{voice-player-store-C7lziaAx.js → voice-player-store-DDDWYHvg.js} +1 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-CKjeEGqx.js +1 -0
- package/dist/gateway/static/root/assets/workflows-page-B604ehHG.js +18 -0
- package/dist/gateway/static/root/index.html +5 -5
- package/dist/gateway/static/root/logo.svg +4 -3
- package/dist/package.js +1 -1
- package/dist/src/agent/agent-manager.d.ts +8 -0
- package/dist/src/agent/agent-manager.js +63 -28
- package/dist/src/agent/agent-manager.js.map +1 -1
- package/dist/src/agent/agent-scope.js +1 -1
- package/dist/src/agent/bootstrap/load-bootstrap-files.js +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/context/workspace-seed.js +2 -2
- package/dist/src/agent/context/workspace-state.js +1 -1
- package/dist/src/agent/context/workspace.js +1 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js +8 -1
- package/dist/src/agent/embedded/session-tool-result-guard.js.map +1 -1
- package/dist/src/agent/goals/checklist-judge.d.ts +1 -0
- package/dist/src/agent/goals/checklist-judge.js +3 -2
- package/dist/src/agent/goals/checklist-judge.js.map +1 -1
- package/dist/src/agent/goals/evaluate-turn.d.ts +1 -1
- 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/goal-locale.js +2 -2
- 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/goals/post-turn.d.ts +6 -1
- package/dist/src/agent/goals/post-turn.js +15 -6
- package/dist/src/agent/goals/post-turn.js.map +1 -1
- package/dist/src/agent/image/load-image-media.js +2 -2
- 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/ipc/inbox.js +3 -3
- package/dist/src/agent/ipc/socket.js +1 -1
- package/dist/src/agent/mcp/bundle-mcp-materialize.d.ts +27 -0
- package/dist/src/agent/mcp/bundle-mcp-materialize.js +50 -2
- package/dist/src/agent/mcp/bundle-mcp-materialize.js.map +1 -1
- package/dist/src/agent/mcp/bundle-mcp-runtime.js +79 -4
- 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/mcp/mcp-transport-config.js +1 -1
- package/dist/src/agent/mcp/mcp-transport.js +1 -1
- package/dist/src/agent/memory/builtin-memory-store.js +1 -1
- package/dist/src/agent/memory/dreaming/deep-promotion.js +1 -1
- package/dist/src/agent/memory/dreaming/events.js +1 -1
- package/dist/src/agent/memory/dreaming/last-run.js +1 -1
- package/dist/src/agent/memory/dreaming/light-sweep.js +1 -1
- package/dist/src/agent/memory/dreaming/preview.js +1 -1
- package/dist/src/agent/memory/dreaming/rem-patterns.js +1 -1
- package/dist/src/agent/memory/dreaming/short-term-store.js +1 -1
- package/dist/src/agent/memory/dreaming/utils.js +1 -1
- package/dist/src/agent/memory/memory-flush.js +1 -1
- package/dist/src/agent/memory/plugin-discovery.js +1 -1
- package/dist/src/agent/models/manager.js +1 -1
- package/dist/src/agent/prompt/memory/index.js +1 -1
- package/dist/src/agent/prompt/service-prompt-builder.js +2 -2
- package/dist/src/agent/reply/post-compaction-context.js +1 -1
- package/dist/src/agent/reply/workspace-boundary-read.js +1 -1
- package/dist/src/agent/sandbox/path-policy.js +2 -2
- 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 +1 -1
- 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 +13 -9
- package/dist/src/agent/service.js.map +1 -1
- package/dist/src/agent/service.types.d.ts +5 -0
- package/dist/src/agent/session/session-inspector.js +1 -1
- package/dist/src/agent/skills/config.js +2 -2
- package/dist/src/agent/skills/filesystem-watcher.js +5 -4
- package/dist/src/agent/skills/filesystem-watcher.js.map +1 -1
- package/dist/src/agent/skills/hub-hash.js +2 -2
- package/dist/src/agent/skills/hub-lock.js +1 -1
- package/dist/src/agent/skills/hub-pull.js +2 -2
- package/dist/src/agent/skills/index.js +4 -3
- package/dist/src/agent/skills/index.js.map +1 -1
- package/dist/src/agent/skills/installer.js +2 -2
- package/dist/src/agent/skills/managed-store.js +1 -1
- package/dist/src/agent/skills/skill-manage-ops.js +3 -2
- package/dist/src/agent/skills/skill-manage-ops.js.map +1 -1
- package/dist/src/agent/skills/skill-manager.js +1 -1
- package/dist/src/agent/skills/skill-view-path.js +1 -1
- package/dist/src/agent/skills/test-framework.js +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/starter-agents.js +1 -1
- 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/dreaming-tool.js +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/find.js +1 -1
- package/dist/src/agent/tools/grep.js +1 -1
- package/dist/src/agent/tools/image-generate-tool.js +1 -1
- package/dist/src/agent/tools/skill-manage-tool.js +2 -2
- package/dist/src/agent/tools/skill-manage-tool.js.map +1 -1
- package/dist/src/agent/tools/workflow-tool.js +1 -1
- package/dist/src/agent/workflow/catalog.js +1 -1
- package/dist/src/agent/workflow/snapshot.d.ts +10 -0
- package/dist/src/agent/workflow/snapshot.js +136 -1
- package/dist/src/agent/workflow/snapshot.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.js +1 -1
- package/dist/src/auth/credentials.js +2 -2
- package/dist/src/auth/profiles/store.js +2 -2
- package/dist/src/auth/sync-provider-auth.js +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/cache-dir-policy.js +1 -1
- package/dist/src/browser/cdp-local-launcher.js +2 -2
- 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/browser/providers/browser-ext-install.js +4 -4
- package/dist/src/browser/providers/cloakbrowser.js +5 -5
- package/dist/src/browser/providers/playwright-doctor.js +1 -1
- package/dist/src/browser/stealth.js +1 -1
- package/dist/src/channels/catalog/channel-catalog-service.d.ts +2 -1
- package/dist/src/channels/catalog/channel-catalog-service.js +133 -16
- package/dist/src/channels/catalog/channel-catalog-service.js.map +1 -1
- package/dist/src/channels/catalog/channel-catalog-types.d.ts +13 -0
- package/dist/src/channels/outbound/persist-store.js +1 -1
- package/dist/src/channels/pairing/allow-from-file.js +1 -1
- package/dist/src/channels/pairing/pairing-store.js +2 -2
- package/dist/src/chat-commands/agent-edit.js +2 -2
- package/dist/src/chat-commands/builtins/config.js +5 -7
- 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/config.js +1 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js +14 -1
- package/dist/src/cli/commands/doctor/checks/channel-config.js.map +1 -1
- package/dist/src/cli/commands/doctor/checks/config-health.js +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 -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/cli/commands/doctor/checks/state-integrity.js +1 -1
- package/dist/src/cli/commands/doctor/checks/workspace-status.js +1 -1
- package/dist/src/cli/commands/extension-create.js +1 -1
- package/dist/src/cli/commands/extension-dev.js +2 -2
- package/dist/src/cli/commands/extension-marketplace.js +2 -2
- package/dist/src/cli/commands/extension-pack.js +2 -2
- package/dist/src/cli/commands/extension.js +3 -3
- package/dist/src/cli/commands/gateway/logs.js +1 -1
- package/dist/src/cli/commands/image.js +1 -1
- package/dist/src/cli/commands/init.js +2 -2
- package/dist/src/cli/commands/models.js +1 -1
- package/dist/src/cli/commands/skills-test.js +1 -1
- package/dist/src/cli/templates.js +1 -1
- package/dist/src/cli/utils/gateway-client.js +1 -1
- package/dist/src/cli/utils/init-workspace-core.js +2 -2
- package/dist/src/config/agent-profile.js +1 -1
- package/dist/src/config/agent-typed-models.js +1 -1
- package/dist/src/config/gateway-bind.js +1 -1
- package/dist/src/config/index.js +7 -7
- package/dist/src/config/loader.js +4 -4
- package/dist/src/config/models-json.js +2 -2
- package/dist/src/config/paths-state.js +1 -1
- package/dist/src/config/paths.js +1 -1
- package/dist/src/config/profile.js +1 -1
- package/dist/src/config/reload.js +1 -1
- package/dist/src/config/rules.js +5 -0
- package/dist/src/config/rules.js.map +1 -1
- package/dist/src/config/schema.d.ts +8 -0
- package/dist/src/config/schema.js +7 -0
- package/dist/src/config/schema.js.map +1 -1
- package/dist/src/config/web-patch.d.ts +1 -0
- package/dist/src/config/web-patch.js +1 -0
- package/dist/src/config/web-patch.js.map +1 -1
- package/dist/src/config/workspace-path.js +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 +1 -1
- package/dist/src/cron/service.js +1 -1
- package/dist/src/daemon/constants.js +1 -1
- package/dist/src/daemon/install-plan.js +2 -2
- package/dist/src/daemon/launchd.js +2 -2
- package/dist/src/daemon/schtasks.js +2 -2
- package/dist/src/daemon/systemd.js +2 -2
- package/dist/src/extensions/bundle-mcp.js +1 -1
- package/dist/src/extensions/discover-extensions.js +2 -2
- package/dist/src/extensions/health.js +1 -1
- package/dist/src/extensions/install.js +2 -2
- package/dist/src/extensions/loader.js +2 -2
- package/dist/src/extensions/lockfile.js +3 -3
- package/dist/src/extensions/security.js +1 -1
- package/dist/src/extensions/types/tui.d.ts +2 -0
- package/dist/src/extensions/update.js +2 -2
- package/dist/src/gateway/agents-admin.js +2 -2
- package/dist/src/gateway/file-path-classifier.js +2 -2
- package/dist/src/gateway/heartbeat/service.js +13 -1
- package/dist/src/gateway/heartbeat/service.js.map +1 -1
- package/dist/src/gateway/hono/app.js +18 -5
- package/dist/src/gateway/hono/app.js.map +1 -1
- package/dist/src/gateway/hono/lib/config-payload.d.ts +3 -1
- package/dist/src/gateway/hono/lib/config-payload.js +7 -4
- package/dist/src/gateway/hono/lib/config-payload.js.map +1 -1
- package/dist/src/gateway/hono/lib/extension-store.js +2 -2
- package/dist/src/gateway/hono/lib/static-ui.js +2 -2
- package/dist/src/gateway/hono/middleware/strict-rate-limit.d.ts +4 -0
- package/dist/src/gateway/hono/middleware/strict-rate-limit.js +19 -5
- package/dist/src/gateway/hono/middleware/strict-rate-limit.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/agents.js +1 -1
- package/dist/src/gateway/hono/routes/auth-registry-extensions.js +1 -1
- package/dist/src/gateway/hono/routes/channels.js +18 -14
- package/dist/src/gateway/hono/routes/channels.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/config-patch/misc.js +1 -1
- package/dist/src/gateway/hono/routes/deps.d.ts +1 -0
- package/dist/src/gateway/hono/routes/dreaming.js +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/host-fs.js +2 -2
- 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/models.js +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/shares.js +1 -1
- package/dist/src/gateway/hono/routes/workflows.js +1 -1
- package/dist/src/gateway/hono/routes/workspace.js +5 -68
- 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/lock.js +3 -3
- package/dist/src/gateway/ports.js +1 -1
- package/dist/src/gateway/rate-limit/buckets.d.ts +3 -0
- package/dist/src/gateway/rate-limit/buckets.js +12 -0
- package/dist/src/gateway/rate-limit/buckets.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/config-coordinator.js +1 -1
- package/dist/src/gateway/service/marketplace-service.js +2 -2
- 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 +23 -9
- 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/gateway/workspace-fs-file-list.js +1 -1
- 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/goals/goal-workflow-judge.js +2 -2
- package/dist/src/i18n/goals-bundle.js +1 -1
- package/dist/src/i18n/index.js +1 -1
- package/dist/src/i18n/share-tool-bundle.js +2 -2
- package/dist/src/infra/brew.js +1 -1
- package/dist/src/infra/package-json.js +1 -1
- package/dist/src/infra/package-update-steps.js +1 -1
- package/dist/src/infra/path-env.js +2 -2
- package/dist/src/infra/restart.js +1 -1
- package/dist/src/infra/stable-node-path.js +1 -1
- package/dist/src/infra/update-check.js +1 -1
- package/dist/src/infra/update-global.js +1 -1
- package/dist/src/infra/update-lock.js +2 -2
- package/dist/src/infra/update-restart.js +1 -1
- package/dist/src/infra/update-runner.js +1 -1
- package/dist/src/infra/update-startup.js +1 -1
- package/dist/src/infra/write-file-atomic.js +2 -2
- package/dist/src/media/store.js +1 -1
- package/dist/src/notes/agent-context.js +1 -1
- package/dist/src/notes/service.js +1 -1
- package/dist/src/notes/store.js +2 -2
- package/dist/src/project-trust/trust-store.js +4 -2
- package/dist/src/project-trust/trust-store.js.map +1 -1
- package/dist/src/providers/auth-runtime/auth-profile-store.js +1 -1
- package/dist/src/providers/index.js +1 -1
- package/dist/src/providers/model-registry.js +4 -4
- 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 +7 -10
- 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 +10 -21
- package/dist/src/session/resolve-session.js.map +1 -1
- package/dist/src/session/session-title.js +2 -2
- package/dist/src/session/store.d.ts +11 -3
- package/dist/src/session/store.js +30 -14
- 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/share/share-auto.js +2 -2
- package/dist/src/share/share-store.js +3 -3
- package/dist/src/share/share-thumbnail.js +2 -2
- package/dist/src/share/share-zip.js +1 -1
- package/dist/src/share/site-share-store.js +3 -3
- package/dist/src/share/site-static-serve.js +1 -1
- package/dist/src/storage/sqlite/connection.js +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/memory-index-repository.js +2 -2
- package/dist/src/storage/sqlite/migrations/010_session_id_identity.sql +30 -0
- package/dist/src/storage/sqlite/migrations/discover.js +1 -1
- package/dist/src/storage/sqlite/migrations/runner.d.ts +2 -2
- package/dist/src/storage/sqlite/migrations/runner.js +5 -5
- 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 +4 -4
- 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 +18 -4
- package/dist/src/tui/backends/embedded-backend.js +100 -1
- package/dist/src/tui/backends/embedded-backend.js.map +1 -1
- package/dist/src/tui/backends/gateway-sse-backend.d.ts +5 -1
- package/dist/src/tui/backends/gateway-sse-backend.js +45 -2
- package/dist/src/tui/backends/gateway-sse-backend.js.map +1 -1
- package/dist/src/tui/clipboard-image.js +3 -3
- package/dist/src/tui/components/chat-log.d.ts +2 -0
- package/dist/src/tui/components/chat-log.js +19 -0
- package/dist/src/tui/components/chat-log.js.map +1 -1
- package/dist/src/tui/extension-host/autocomplete.d.ts +3 -2
- package/dist/src/tui/extension-host/autocomplete.js +29 -12
- package/dist/src/tui/extension-host/autocomplete.js.map +1 -1
- package/dist/src/tui/extension-host/load-extensions.js +1 -1
- package/dist/src/tui/extension-host/runtime.d.ts +12 -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/theme-manager.js +1 -1
- package/dist/src/tui/tui-backend.d.ts +23 -0
- package/dist/src/tui/tui-command-formatters.js +4 -4
- package/dist/src/tui/tui-commands.d.ts +16 -3
- package/dist/src/tui/tui-commands.js +134 -27
- 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-keybindings-file.js +1 -1
- package/dist/src/tui/tui-picker-overlay.js +1 -1
- package/dist/src/tui/tui-scoped-models.js +2 -2
- package/dist/src/tui/tui-settings.js +1 -1
- package/dist/src/tui/tui-startup-resources.js +1 -1
- package/dist/src/tui/tui-startup-text.js +1 -1
- package/dist/src/tui/tui-startup-text.js.map +1 -1
- package/dist/src/tui/tui.js +106 -17
- package/dist/src/tui/tui.js.map +1 -1
- package/dist/src/tunnel/frpc-binary.js +4 -4
- package/dist/src/tunnel/frpc-config.js +1 -1
- package/dist/src/tunnel/frpc-extract.js +1 -1
- package/dist/src/tunnel/tunnel-state.js +1 -1
- package/dist/src/utils/logger/audit.js +1 -1
- package/dist/src/utils/logger/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 +2 -1
- 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/rotation.js +1 -1
- package/dist/src/utils/logger/streams.js +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/voice/tts/audio.js +1 -1
- package/dist/src/voice/tts/providers/edge-speech.js +2 -2
- package/dist/src/workflows/draft/workflow-draft-service.js +1 -1
- package/dist/src/workflows/service/workflow-run-service.js +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/dist/src/workflows/store/event-store.js +1 -1
- package/dist/src/workflows/store/run-store.js +1 -1
- package/package.json +1 -1
- package/dist/gateway/static/root/assets/agent-browser-settings-page-rGbKc2Hh.js +0 -6
- package/dist/gateway/static/root/assets/agent-defaults-tabbed-page-CtwVbjOA.js +0 -1
- package/dist/gateway/static/root/assets/agents-CCBmGcwc.js +0 -71
- package/dist/gateway/static/root/assets/apps-page-xwCsJS15.js +0 -1
- package/dist/gateway/static/root/assets/channels-settings-C044DcYk.js +0 -1
- package/dist/gateway/static/root/assets/connectors-settings-8VEWUOTj.js +0 -2
- package/dist/gateway/static/root/assets/cron-page-DqmNGNOy.js +0 -3
- package/dist/gateway/static/root/assets/goal-detail-page-bv0VRDaf.js +0 -1
- package/dist/gateway/static/root/assets/goals-page-1Ywnt4Cb.js +0 -2
- package/dist/gateway/static/root/assets/goals-settings-ceEBjnfc.js +0 -1
- package/dist/gateway/static/root/assets/index-Cxm6xsps.js +0 -122
- package/dist/gateway/static/root/assets/index-b_R4tKqt.css +0 -1
- package/dist/gateway/static/root/assets/logs-page-B_wrxhee.js +0 -2
- package/dist/gateway/static/root/assets/messages-CkT-lcgP.js +0 -3
- package/dist/gateway/static/root/assets/models-hub-panel-D0JDSbNu.js +0 -2
- package/dist/gateway/static/root/assets/note-detail-page-DpFV-EO6.js +0 -2
- package/dist/gateway/static/root/assets/notes-page-CdkjTch8.js +0 -1
- package/dist/gateway/static/root/assets/remote-access-hub-DSYVAi96.js +0 -1
- package/dist/gateway/static/root/assets/sessions-page-CenkcVjF.js +0 -1
- package/dist/gateway/static/root/assets/settings-advanced-gate-D9sva86V.js +0 -1
- package/dist/gateway/static/root/assets/settings-page-DL35U0x0.js +0 -1
- package/dist/gateway/static/root/assets/setup-status-panel-Ctwbp9Er.js +0 -1
- package/dist/gateway/static/root/assets/shares-settings-DIM3JNsr.js +0 -1
- package/dist/gateway/static/root/assets/skill-reload-api-DAlNaNzL.js +0 -1
- package/dist/gateway/static/root/assets/skills-page-CLrHVzAt.js +0 -2
- package/dist/gateway/static/root/assets/voice-api-key-field-vYAO71Gn.js +0 -1
- package/dist/gateway/static/root/assets/workflow-page.utils-sgHjOXOm.js +0 -1
- package/dist/gateway/static/root/assets/workflows-page-DYyOTmFx.js +0 -18
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"subagent-runner.js","names":[],"sources":["../../../../src/agent/workflow/subagent-runner.ts"],"sourcesContent":["/**\n * Adapter: spawns one isolated child agent per `agent()` call from a workflow.\n *\n * Wraps the existing `createDelegateChildHandle` so the workflow runtime stays\n * decoupled from the LLM stack (it sees only the `SubagentRunner` interface).\n *\n * Key behaviour:\n * - When `opts.schema` is provided, we inject `structured_output` into the child\n * tool set and unwrap the captured value on success. If the subagent finishes\n * without ever calling `structured_output`, we treat it as failure (`null`).\n * - Failures and aborts resolve to `null`. The workflow runtime continues — this\n * matches the pi-dynamic-workflows contract and keeps fan-out pipelines robust.\n * - We do NOT mutate `createDelegateChildHandle` — we just leverage its\n * `buildChildTools` injection point.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { emitSessionTranscriptUpdate } from '../../session/transcript-events.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n type BuildChildToolsOptions,\n createDelegateChildHandle,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\nimport {\n DEFAULT_DELEGATE_TOOLS,\n DELEGATE_BLOCKED_TOOLS,\n} from '../tools/delegate-tool.js';\nimport type { ToolExecutorConfig } from '../tools/executor.js';\n\nimport {\n createStructuredOutputTool,\n STRUCTURED_OUTPUT_TOOL_NAME,\n type StructuredOutputCapture,\n} from './structured-output-tool.js';\nimport type { SubagentRunOptions, SubagentRunner, SubagentProgressEvent } from './types.js';\n\nconst log = createLogger('Agent:WorkflowSubagent');\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport interface DelegateSubagentRunnerDeps {\n workspace: string;\n bus: MessageBus;\n /** Resolves the default subagent model (typically the parent agent's primary model). */\n getDefaultModel: () => Model<Api>;\n getConfig: () => Config | undefined;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n sessionStore?: SessionStore;\n /**\n * Provided by the workflow tool from `AgentToolsFactory` — mirrors how\n * `delegate-tool` is wired (avoids importing `tools/factory.ts` here and\n * breaking the existing factory ↔ delegate-tool ↔ child-agent-factory\n * dependency contract).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\nexport class DelegateSubagentRunner implements SubagentRunner {\n constructor(private readonly deps: DelegateSubagentRunnerDeps) {}\n\n async run<T = string>(prompt: string, opts: SubagentRunOptions<T>): Promise<T | null> {\n if (opts.signal?.aborted) return null;\n\n const capture: StructuredOutputCapture<T> = { called: false, value: undefined };\n const wantStructured = Boolean(opts.schema);\n\n const allowed = resolveAllowedToolNames(opts.allowedToolNames, wantStructured);\n const model = opts.model ?? safeResolveDefaultModel(this.deps.getDefaultModel);\n if (!model) {\n log.warn({ label: opts.label }, 'subagent run skipped: no primary model resolved');\n return null;\n }\n\n const fullPrompt = buildPrompt(prompt, opts, wantStructured);\n const streamMode = resolveSubagentStreamMode(this.deps.getConfig);\n\n let transcriptPersistQueue: Promise<void> = Promise.resolve();\n const persistTranscriptSnapshot = opts.sessionKey && this.deps.sessionStore\n ? (messages: Parameters<SessionStore['saveMessages']>[1]) => {\n const store = this.deps.sessionStore;\n const key = opts.sessionKey;\n if (!store || !key) return;\n const snapshot = cloneAgentMessages(messages);\n transcriptPersistQueue = transcriptPersistQueue\n .then(async () => {\n await store.saveMessages(key, snapshot);\n emitSessionTranscriptUpdate({ sessionKey: key });\n })\n .catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, sessionKey: key, errorMessage: msg },\n `Failed to persist workflow subagent transcript snapshot: ${msg}`,\n );\n });\n }\n : undefined;\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: this.deps.workspace,\n goal: fullPrompt,\n allowedToolNames: allowed,\n maxIterations: opts.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n model,\n bus: this.deps.bus,\n getConfig: this.deps.getConfig,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n buildChildTools: (childOpts) => {\n const base = this.deps.buildChildTools(childOpts);\n if (!wantStructured || !opts.schema) return base;\n // Replace any existing tool with the same name so the per-run capture wins.\n const filtered = base.filter((t) => t.name !== STRUCTURED_OUTPUT_TOOL_NAME);\n return [\n ...filtered,\n createStructuredOutputTool({ schema: opts.schema, capture }) as unknown as AgentTool<any, any>,\n ];\n },\n progressHooks:\n opts.onProgress && streamMode !== 'off'\n ? {\n mode: streamMode === 'full' ? 'full' : 'steps',\n onProgress: (event) => {\n opts.onProgress?.(mapChildProgressEvent(event));\n },\n }\n : undefined,\n onTranscriptSnapshot: persistTranscriptSnapshot,\n };\n\n if (opts.sessionKey && opts.sessionMetadata && this.deps.sessionStore) {\n await this.preparePersistentSubagentSession(opts.sessionKey, opts.sessionMetadata);\n }\n\n const handle = createDelegateChildHandle(childOptions);\n const onAbort = () => handle.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const { summary, messages } = await handle.run();\n await transcriptPersistQueue;\n if (opts.sessionKey && this.deps.sessionStore) {\n await this.deps.sessionStore.saveMessages(opts.sessionKey, messages);\n emitSessionTranscriptUpdate({ sessionKey: opts.sessionKey });\n }\n if (opts.signal?.aborted) return null;\n\n if (wantStructured) {\n if (!capture.called) {\n log.warn({ label: opts.label }, 'subagent finished without calling structured_output');\n return null;\n }\n return capture.value as T;\n }\n return summary as unknown as T;\n } catch (e) {\n if (opts.rethrow) throw e;\n const msg = e instanceof Error ? e.message : String(e);\n log.warn({ err: e, label: opts.label, errorMessage: msg }, `subagent run failed: ${msg}`);\n return null;\n } finally {\n opts.signal?.removeEventListener('abort', onAbort);\n }\n }\n\n private async preparePersistentSubagentSession(\n sessionKey: string,\n metadata: NonNullable<SubagentRunOptions['sessionMetadata']>,\n ): Promise<void> {\n const store = this.deps.sessionStore;\n if (!store) return;\n await store.resolveTranscriptPath(sessionKey);\n await store.updateMetadata(sessionKey, {\n sessionType: 'workflow-subagent',\n hiddenFromSessionList: true,\n parentSessionKey: metadata.parentSessionKey,\n workflowRunId: metadata.workflowRunId,\n workflowDefinitionId: metadata.workflowDefinitionId,\n workflowAgentId: metadata.workflowAgentId,\n workflowAgentLabel: metadata.workflowAgentLabel,\n name: metadata.workflowAgentLabel,\n tags: ['workflow-subagent', metadata.workflowDefinitionId],\n });\n }\n}\n\nfunction cloneAgentMessages(messages: Parameters<SessionStore['saveMessages']>[1]): Parameters<SessionStore['saveMessages']>[1] {\n return messages.map((message) => structuredClone(message));\n}\n\nfunction resolveAllowedToolNames(\n requested: string[] | undefined,\n wantStructured: boolean,\n): string[] {\n const base = requested && requested.length > 0 ? requested : [...DEFAULT_DELEGATE_TOOLS];\n const filtered = base\n .map((s) => String(s).trim())\n .filter((s) => s.length > 0)\n .filter((s) => !DELEGATE_BLOCKED_TOOLS.has(s));\n if (wantStructured && !filtered.includes(STRUCTURED_OUTPUT_TOOL_NAME)) {\n filtered.push(STRUCTURED_OUTPUT_TOOL_NAME);\n }\n return [...new Set(filtered)];\n}\n\nfunction buildPrompt(prompt: string, opts: SubagentRunOptions<unknown>, structured: boolean): string {\n const parts: string[] = [];\n if (opts.instructions?.trim()) parts.push(opts.instructions.trim());\n if (opts.label) parts.push(`Task label: ${opts.label}`);\n if (opts.phase) parts.push(`Workflow phase: ${opts.phase}`);\n parts.push(prompt);\n if (structured) {\n parts.push(\n [\n 'Final output contract:',\n '- Your final action MUST be a structured_output tool call.',\n '- The structured_output arguments are the return value of this subagent.',\n '- Do not emit a prose final answer instead of structured_output.',\n '- If you need to inspect files or run commands first, do so, then call structured_output exactly once.',\n ].join('\\n'),\n );\n }\n return parts.join('\\n\\n');\n}\n\nfunction safeResolveDefaultModel(get: () => Model<Api>): Model<Api> | null {\n try {\n return get();\n } catch (e) {\n log.warn({ err: e }, 'failed to resolve default subagent model');\n return null;\n }\n}\n\nfunction resolveSubagentStreamMode(\n getConfig: () => Config | undefined,\n): 'off' | 'steps' | 'full' {\n const mode = getConfig()?.agents?.defaults?.workflow?.subagentStream;\n if (mode === 'off' || mode === 'steps' || mode === 'full') return mode;\n return 'steps';\n}\n\nfunction mapChildProgressEvent(event: {\n type: 'tool_start' | 'tool_end' | 'iteration' | 'text_delta' | 'thinking_delta';\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n isError?: boolean;\n resultPreview?: string;\n error?: string;\n count?: number;\n max?: number;\n delta?: string;\n}): SubagentProgressEvent {\n switch (event.type) {\n case 'tool_start':\n return {\n type: 'tool_start',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n args: event.args ?? {},\n };\n case 'tool_end':\n return {\n type: 'tool_end',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n isError: Boolean(event.isError),\n resultPreview: event.resultPreview,\n error: event.error,\n };\n case 'iteration':\n return {\n type: 'iteration',\n count: event.count ?? 0,\n max: event.max ?? 0,\n };\n case 'text_delta':\n return { type: 'text_delta', delta: event.delta ?? '' };\n case 'thinking_delta':\n return { type: 'thinking_delta', delta: event.delta ?? '' };\n default:\n return { type: 'text_delta', delta: '' };\n }\n}\n"],"mappings":";;;;;;;aAuBqD;AAoBrD,MAAM,MAAM,aAAa,yBAAyB;AAElD,MAAM,yBAAyB;AAmB/B,IAAa,yBAAb,MAA8D;CAC5D,YAAY,MAAmD;AAAlC,OAAA,OAAA;;CAE7B,MAAM,IAAgB,QAAgB,MAAgD;AACpF,MAAI,KAAK,QAAQ,QAAS,QAAO;EAEjC,MAAM,UAAsC;GAAE,QAAQ;GAAO,OAAO,KAAA;GAAW;EAC/E,MAAM,iBAAiB,QAAQ,KAAK,OAAO;EAE3C,MAAM,UAAU,wBAAwB,KAAK,kBAAkB,eAAe;EAC9E,MAAM,QAAQ,KAAK,SAAS,wBAAwB,KAAK,KAAK,gBAAgB;AAC9E,MAAI,CAAC,OAAO;AACV,OAAI,KAAK,EAAE,OAAO,KAAK,OAAO,EAAE,kDAAkD;AAClF,UAAO;;EAGT,MAAM,aAAa,YAAY,QAAQ,MAAM,eAAe;EAC5D,MAAM,aAAa,0BAA0B,KAAK,KAAK,UAAU;EAEjE,IAAI,yBAAwC,QAAQ,SAAS;EAC7D,MAAM,4BAA4B,KAAK,cAAc,KAAK,KAAK,gBAC1D,aAA0D;GACzD,MAAM,QAAQ,KAAK,KAAK;GACxB,MAAM,MAAM,KAAK;AACjB,OAAI,CAAC,SAAS,CAAC,IAAK;GACpB,MAAM,WAAW,mBAAmB,SAAS;AAC7C,4BAAyB,uBACtB,KAAK,YAAY;AAChB,UAAM,MAAM,aAAa,KAAK,SAAS;AACvC,gCAA4B,EAAE,YAAY,KAAK,CAAC;KAChD,CACD,OAAO,QAAQ;IACd,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,QAAI,KACF;KAAE;KAAK,YAAY;KAAK,cAAc;KAAK,EAC3C,4DAA4D,MAC7D;KACD;MAEN,KAAA;EAEJ,MAAM,eAA2C;GAC/C,WAAW,KAAK,KAAK;GACrB,MAAM;GACN,kBAAkB;GAClB,eAAe,KAAK,iBAAiB;GACrC;GACA,KAAK,KAAK,KAAK;GACf,WAAW,KAAK,KAAK;GACrB,oBAAoB,KAAK,KAAK;GAC9B,kBAAkB,cAAc;IAC9B,MAAM,OAAO,KAAK,KAAK,gBAAgB,UAAU;AACjD,QAAI,CAAC,kBAAkB,CAAC,KAAK,OAAQ,QAAO;AAG5C,WAAO,CACL,GAFe,KAAK,QAAQ,MAAM,EAAE,SAAS,4BAElC,EACX,2BAA2B;KAAE,QAAQ,KAAK;KAAQ;KAAS,CAAC,CAC7D;;GAEH,eACE,KAAK,cAAc,eAAe,QAC9B;IACE,MAAM,eAAe,SAAS,SAAS;IACvC,aAAa,UAAU;AACrB,UAAK,aAAa,sBAAsB,MAAM,CAAC;;IAElD,GACD,KAAA;GACN,sBAAsB;GACvB;AAED,MAAI,KAAK,cAAc,KAAK,mBAAmB,KAAK,KAAK,aACvD,OAAM,KAAK,iCAAiC,KAAK,YAAY,KAAK,gBAAgB;EAGpF,MAAM,SAAS,0BAA0B,aAAa;EACtD,MAAM,gBAAgB,OAAO,OAAO;AACpC,OAAK,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;AAE/D,MAAI;GACF,MAAM,EAAE,SAAS,aAAa,MAAM,OAAO,KAAK;AAChD,SAAM;AACN,OAAI,KAAK,cAAc,KAAK,KAAK,cAAc;AAC7C,UAAM,KAAK,KAAK,aAAa,aAAa,KAAK,YAAY,SAAS;AACpE,gCAA4B,EAAE,YAAY,KAAK,YAAY,CAAC;;AAE9D,OAAI,KAAK,QAAQ,QAAS,QAAO;AAEjC,OAAI,gBAAgB;AAClB,QAAI,CAAC,QAAQ,QAAQ;AACnB,SAAI,KAAK,EAAE,OAAO,KAAK,OAAO,EAAE,sDAAsD;AACtF,YAAO;;AAET,WAAO,QAAQ;;AAEjB,UAAO;WACA,GAAG;AACV,OAAI,KAAK,QAAS,OAAM;GACxB,MAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACtD,OAAI,KAAK;IAAE,KAAK;IAAG,OAAO,KAAK;IAAO,cAAc;IAAK,EAAE,wBAAwB,MAAM;AACzF,UAAO;YACC;AACR,QAAK,QAAQ,oBAAoB,SAAS,QAAQ;;;CAItD,MAAc,iCACZ,YACA,UACe;EACf,MAAM,QAAQ,KAAK,KAAK;AACxB,MAAI,CAAC,MAAO;AACZ,QAAM,MAAM,sBAAsB,WAAW;AAC7C,QAAM,MAAM,eAAe,YAAY;GACrC,aAAa;GACb,uBAAuB;GACvB,kBAAkB,SAAS;GAC3B,eAAe,SAAS;GACxB,sBAAsB,SAAS;GAC/B,iBAAiB,SAAS;GAC1B,oBAAoB,SAAS;GAC7B,MAAM,SAAS;GACf,MAAM,CAAC,qBAAqB,SAAS,qBAAqB;GAC3D,CAAC;;;AAIN,SAAS,mBAAmB,UAAoG;AAC9H,QAAO,SAAS,KAAK,YAAY,gBAAgB,QAAQ,CAAC;;AAG5D,SAAS,wBACP,WACA,gBACU;CAEV,MAAM,YADO,aAAa,UAAU,SAAS,IAAI,YAAY,CAAC,GAAG,uBAAuB,EAErF,KAAK,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,CAC5B,QAAQ,MAAM,EAAE,SAAS,EAAE,CAC3B,QAAQ,MAAM,CAAC,uBAAuB,IAAI,EAAE,CAAC;AAChD,KAAI,kBAAkB,CAAC,SAAS,SAAA,oBAAqC,CACnE,UAAS,KAAK,4BAA4B;AAE5C,QAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;;AAG/B,SAAS,YAAY,QAAgB,MAAmC,YAA6B;CACnG,MAAM,QAAkB,EAAE;AAC1B,KAAI,KAAK,cAAc,MAAM,CAAE,OAAM,KAAK,KAAK,aAAa,MAAM,CAAC;AACnE,KAAI,KAAK,MAAO,OAAM,KAAK,eAAe,KAAK,QAAQ;AACvD,KAAI,KAAK,MAAO,OAAM,KAAK,mBAAmB,KAAK,QAAQ;AAC3D,OAAM,KAAK,OAAO;AAClB,KAAI,WACF,OAAM,KACJ;EACE;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK,CACb;AAEH,QAAO,MAAM,KAAK,OAAO;;AAG3B,SAAS,wBAAwB,KAA0C;AACzE,KAAI;AACF,SAAO,KAAK;UACL,GAAG;AACV,MAAI,KAAK,EAAE,KAAK,GAAG,EAAE,2CAA2C;AAChE,SAAO;;;AAIX,SAAS,0BACP,WAC0B;CAC1B,MAAM,OAAO,WAAW,EAAE,QAAQ,UAAU,UAAU;AACtD,KAAI,SAAS,SAAS,SAAS,WAAW,SAAS,OAAQ,QAAO;AAClE,QAAO;;AAGT,SAAS,sBAAsB,OAWL;AACxB,SAAQ,MAAM,MAAd;EACE,KAAK,aACH,QAAO;GACL,MAAM;GACN,YAAY,MAAM,cAAc;GAChC,UAAU,MAAM,YAAY;GAC5B,MAAM,MAAM,QAAQ,EAAE;GACvB;EACH,KAAK,WACH,QAAO;GACL,MAAM;GACN,YAAY,MAAM,cAAc;GAChC,UAAU,MAAM,YAAY;GAC5B,SAAS,QAAQ,MAAM,QAAQ;GAC/B,eAAe,MAAM;GACrB,OAAO,MAAM;GACd;EACH,KAAK,YACH,QAAO;GACL,MAAM;GACN,OAAO,MAAM,SAAS;GACtB,KAAK,MAAM,OAAO;GACnB;EACH,KAAK,aACH,QAAO;GAAE,MAAM;GAAc,OAAO,MAAM,SAAS;GAAI;EACzD,KAAK,iBACH,QAAO;GAAE,MAAM;GAAkB,OAAO,MAAM,SAAS;GAAI;EAC7D,QACE,QAAO;GAAE,MAAM;GAAc,OAAO;GAAI"}
|
|
1
|
+
{"version":3,"file":"subagent-runner.js","names":[],"sources":["../../../../src/agent/workflow/subagent-runner.ts"],"sourcesContent":["/**\n * Adapter: spawns one isolated child agent per `agent()` call from a workflow.\n *\n * Wraps the existing `createDelegateChildHandle` so the workflow runtime stays\n * decoupled from the LLM stack (it sees only the `SubagentRunner` interface).\n *\n * Key behaviour:\n * - When `opts.schema` is provided, we inject `structured_output` into the child\n * tool set and unwrap the captured value on success. If the subagent finishes\n * without ever calling `structured_output`, we treat it as failure (`null`).\n * - Failures and aborts resolve to `null`. The workflow runtime continues — this\n * matches the pi-dynamic-workflows contract and keeps fan-out pipelines robust.\n * - We do NOT mutate `createDelegateChildHandle` — we just leverage its\n * `buildChildTools` injection point.\n */\n\nimport type { AgentTool } from '@earendil-works/pi-agent-core';\nimport type { Api, Model } from '@earendil-works/pi-ai';\n\nimport type { Config } from '../../config/schema.js';\nimport type { MessageBus } from '../../infra/bus/index.js';\nimport type { SessionStore } from '../../session/store.js';\nimport { emitSessionTranscriptUpdate } from '../../session/transcript-events.js';\nimport { createLogger } from '../../utils/logger.js';\n\nimport {\n type BuildChildToolsOptions,\n createDelegateChildHandle,\n type DelegateChildHandleOptions,\n} from '../child-agent-factory.js';\nimport {\n DEFAULT_DELEGATE_TOOLS,\n DELEGATE_BLOCKED_TOOLS,\n} from '../tools/delegate-tool.js';\nimport type { ToolExecutorConfig } from '../tools/executor.js';\n\nimport {\n createStructuredOutputTool,\n STRUCTURED_OUTPUT_TOOL_NAME,\n type StructuredOutputCapture,\n} from './structured-output-tool.js';\nimport type { SubagentRunOptions, SubagentRunner, SubagentProgressEvent } from './types.js';\n\nconst log = createLogger('Agent:WorkflowSubagent');\n\nconst DEFAULT_MAX_ITERATIONS = 30;\n\nexport interface DelegateSubagentRunnerDeps {\n workspace: string;\n bus: MessageBus;\n /** Resolves the default subagent model (typically the parent agent's primary model). */\n getDefaultModel: () => Model<Api>;\n getConfig: () => Config | undefined;\n toolExecutorConfig?: Partial<ToolExecutorConfig>;\n sessionStore?: SessionStore;\n /**\n * Provided by the workflow tool from `AgentToolsFactory` — mirrors how\n * `delegate-tool` is wired (avoids importing `tools/factory.ts` here and\n * breaking the existing factory ↔ delegate-tool ↔ child-agent-factory\n * dependency contract).\n */\n buildChildTools: (opts: BuildChildToolsOptions) => AgentTool<any, any>[];\n}\n\nexport class DelegateSubagentRunner implements SubagentRunner {\n constructor(private readonly deps: DelegateSubagentRunnerDeps) {}\n\n async run<T = string>(prompt: string, opts: SubagentRunOptions<T>): Promise<T | null> {\n if (opts.signal?.aborted) return null;\n\n const capture: StructuredOutputCapture<T> = { called: false, value: undefined };\n const wantStructured = Boolean(opts.schema);\n\n const allowed = resolveAllowedToolNames(opts.allowedToolNames, wantStructured);\n const model = opts.model ?? safeResolveDefaultModel(this.deps.getDefaultModel);\n if (!model) {\n log.warn({ label: opts.label }, 'subagent run skipped: no primary model resolved');\n return null;\n }\n\n const fullPrompt = buildPrompt(prompt, opts, wantStructured);\n const streamMode = resolveSubagentStreamMode(this.deps.getConfig);\n\n let transcriptPersistQueue: Promise<void> = Promise.resolve();\n const persistTranscriptSnapshot = opts.sessionKey && this.deps.sessionStore\n ? (messages: Parameters<SessionStore['saveMessages']>[1]) => {\n const store = this.deps.sessionStore;\n const key = opts.sessionKey;\n if (!store || !key) return;\n const snapshot = cloneAgentMessages(messages);\n transcriptPersistQueue = transcriptPersistQueue\n .then(async () => {\n await store.saveMessages(key, snapshot);\n emitSessionTranscriptUpdate({ sessionKey: key });\n })\n .catch((err) => {\n const msg = err instanceof Error ? err.message : String(err);\n log.warn(\n { err, sessionKey: key, errorMessage: msg },\n `Failed to persist workflow subagent transcript snapshot: ${msg}`,\n );\n });\n }\n : undefined;\n\n const childOptions: DelegateChildHandleOptions = {\n workspace: this.deps.workspace,\n goal: fullPrompt,\n allowedToolNames: allowed,\n maxIterations: opts.maxIterations ?? DEFAULT_MAX_ITERATIONS,\n model,\n bus: this.deps.bus,\n getConfig: this.deps.getConfig,\n toolExecutorConfig: this.deps.toolExecutorConfig,\n buildChildTools: (childOpts) => {\n const base = this.deps.buildChildTools(childOpts);\n if (!wantStructured || !opts.schema) return base;\n // Replace any existing tool with the same name so the per-run capture wins.\n const filtered = base.filter((t) => t.name !== STRUCTURED_OUTPUT_TOOL_NAME);\n return [\n ...filtered,\n createStructuredOutputTool({ schema: opts.schema, capture }) as unknown as AgentTool<any, any>,\n ];\n },\n progressHooks:\n opts.onProgress && streamMode !== 'off'\n ? {\n mode: streamMode === 'full' ? 'full' : 'steps',\n onProgress: (event) => {\n opts.onProgress?.(mapChildProgressEvent(event));\n },\n }\n : undefined,\n onTranscriptSnapshot: persistTranscriptSnapshot,\n };\n\n if (opts.sessionKey && opts.sessionMetadata && this.deps.sessionStore) {\n await this.preparePersistentSubagentSession(opts.sessionKey, opts.sessionMetadata);\n }\n\n const handle = createDelegateChildHandle(childOptions);\n const onAbort = () => handle.abort();\n opts.signal?.addEventListener('abort', onAbort, { once: true });\n\n try {\n const { summary, messages } = await handle.run();\n await transcriptPersistQueue;\n if (opts.sessionKey && this.deps.sessionStore) {\n await this.deps.sessionStore.saveMessages(opts.sessionKey, messages);\n emitSessionTranscriptUpdate({ sessionKey: opts.sessionKey });\n }\n if (opts.signal?.aborted) return null;\n\n if (wantStructured) {\n if (!capture.called) {\n log.warn({ label: opts.label }, 'subagent finished without calling structured_output');\n return null;\n }\n return capture.value as T;\n }\n return summary as unknown as T;\n } catch (e) {\n if (opts.rethrow) throw e;\n const msg = e instanceof Error ? e.message : String(e);\n log.warn({ err: e, label: opts.label, errorMessage: msg }, `subagent run failed: ${msg}`);\n return null;\n } finally {\n opts.signal?.removeEventListener('abort', onAbort);\n }\n }\n\n private async preparePersistentSubagentSession(\n sessionKey: string,\n metadata: NonNullable<SubagentRunOptions['sessionMetadata']>,\n ): Promise<void> {\n const store = this.deps.sessionStore;\n if (!store) return;\n await store.resolveTranscriptPath(sessionKey, {\n metadata: {\n sessionType: 'workflow-subagent',\n hiddenFromSessionList: true,\n parentSessionKey: metadata.parentSessionKey,\n workflowRunId: metadata.workflowRunId,\n workflowDefinitionId: metadata.workflowDefinitionId,\n workflowAgentId: metadata.workflowAgentId,\n workflowAgentLabel: metadata.workflowAgentLabel,\n sourceChannel: 'workflow',\n sourceChatId: metadata.workflowRunId,\n routing: {\n agentId: metadata.workflowAgentId || 'main',\n source: 'workflow',\n accountId: 'default',\n peerKind: 'subagent',\n peerId: metadata.workflowRunId,\n },\n },\n });\n await store.updateMetadata(sessionKey, {\n sessionType: 'workflow-subagent',\n hiddenFromSessionList: true,\n parentSessionKey: metadata.parentSessionKey,\n workflowRunId: metadata.workflowRunId,\n workflowDefinitionId: metadata.workflowDefinitionId,\n workflowAgentId: metadata.workflowAgentId,\n workflowAgentLabel: metadata.workflowAgentLabel,\n name: metadata.workflowAgentLabel,\n tags: ['workflow-subagent', metadata.workflowDefinitionId],\n });\n }\n}\n\nfunction cloneAgentMessages(messages: Parameters<SessionStore['saveMessages']>[1]): Parameters<SessionStore['saveMessages']>[1] {\n return messages.map((message) => structuredClone(message));\n}\n\nfunction resolveAllowedToolNames(\n requested: string[] | undefined,\n wantStructured: boolean,\n): string[] {\n const base = requested && requested.length > 0 ? requested : [...DEFAULT_DELEGATE_TOOLS];\n const filtered = base\n .map((s) => String(s).trim())\n .filter((s) => s.length > 0)\n .filter((s) => !DELEGATE_BLOCKED_TOOLS.has(s));\n if (wantStructured && !filtered.includes(STRUCTURED_OUTPUT_TOOL_NAME)) {\n filtered.push(STRUCTURED_OUTPUT_TOOL_NAME);\n }\n return [...new Set(filtered)];\n}\n\nfunction buildPrompt(prompt: string, opts: SubagentRunOptions<unknown>, structured: boolean): string {\n const parts: string[] = [];\n if (opts.instructions?.trim()) parts.push(opts.instructions.trim());\n if (opts.label) parts.push(`Task label: ${opts.label}`);\n if (opts.phase) parts.push(`Workflow phase: ${opts.phase}`);\n parts.push(prompt);\n if (structured) {\n parts.push(\n [\n 'Final output contract:',\n '- Your final action MUST be a structured_output tool call.',\n '- The structured_output arguments are the return value of this subagent.',\n '- Do not emit a prose final answer instead of structured_output.',\n '- If you need to inspect files or run commands first, do so, then call structured_output exactly once.',\n ].join('\\n'),\n );\n }\n return parts.join('\\n\\n');\n}\n\nfunction safeResolveDefaultModel(get: () => Model<Api>): Model<Api> | null {\n try {\n return get();\n } catch (e) {\n log.warn({ err: e }, 'failed to resolve default subagent model');\n return null;\n }\n}\n\nfunction resolveSubagentStreamMode(\n getConfig: () => Config | undefined,\n): 'off' | 'steps' | 'full' {\n const mode = getConfig()?.agents?.defaults?.workflow?.subagentStream;\n if (mode === 'off' || mode === 'steps' || mode === 'full') return mode;\n return 'steps';\n}\n\nfunction mapChildProgressEvent(event: {\n type: 'tool_start' | 'tool_end' | 'iteration' | 'text_delta' | 'thinking_delta';\n toolCallId?: string;\n toolName?: string;\n args?: Record<string, unknown>;\n isError?: boolean;\n resultPreview?: string;\n error?: string;\n count?: number;\n max?: number;\n delta?: string;\n}): SubagentProgressEvent {\n switch (event.type) {\n case 'tool_start':\n return {\n type: 'tool_start',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n args: event.args ?? {},\n };\n case 'tool_end':\n return {\n type: 'tool_end',\n toolCallId: event.toolCallId ?? '',\n toolName: event.toolName ?? 'tool',\n isError: Boolean(event.isError),\n resultPreview: event.resultPreview,\n error: event.error,\n };\n case 'iteration':\n return {\n type: 'iteration',\n count: event.count ?? 0,\n max: event.max ?? 0,\n };\n case 'text_delta':\n return { type: 'text_delta', delta: event.delta ?? '' };\n case 'thinking_delta':\n return { type: 'thinking_delta', delta: event.delta ?? '' };\n default:\n return { type: 'text_delta', delta: '' };\n }\n}\n"],"mappings":";;;;;;;aAuBqD;AAoBrD,MAAM,MAAM,aAAa,yBAAyB;AAElD,MAAM,yBAAyB;AAmB/B,IAAa,yBAAb,MAA8D;CAC5D,YAAY,MAAmD;AAAlC,OAAA,OAAA;;CAE7B,MAAM,IAAgB,QAAgB,MAAgD;AACpF,MAAI,KAAK,QAAQ,QAAS,QAAO;EAEjC,MAAM,UAAsC;GAAE,QAAQ;GAAO,OAAO,KAAA;GAAW;EAC/E,MAAM,iBAAiB,QAAQ,KAAK,OAAO;EAE3C,MAAM,UAAU,wBAAwB,KAAK,kBAAkB,eAAe;EAC9E,MAAM,QAAQ,KAAK,SAAS,wBAAwB,KAAK,KAAK,gBAAgB;AAC9E,MAAI,CAAC,OAAO;AACV,OAAI,KAAK,EAAE,OAAO,KAAK,OAAO,EAAE,kDAAkD;AAClF,UAAO;;EAGT,MAAM,aAAa,YAAY,QAAQ,MAAM,eAAe;EAC5D,MAAM,aAAa,0BAA0B,KAAK,KAAK,UAAU;EAEjE,IAAI,yBAAwC,QAAQ,SAAS;EAC7D,MAAM,4BAA4B,KAAK,cAAc,KAAK,KAAK,gBAC1D,aAA0D;GACzD,MAAM,QAAQ,KAAK,KAAK;GACxB,MAAM,MAAM,KAAK;AACjB,OAAI,CAAC,SAAS,CAAC,IAAK;GACpB,MAAM,WAAW,mBAAmB,SAAS;AAC7C,4BAAyB,uBACtB,KAAK,YAAY;AAChB,UAAM,MAAM,aAAa,KAAK,SAAS;AACvC,gCAA4B,EAAE,YAAY,KAAK,CAAC;KAChD,CACD,OAAO,QAAQ;IACd,MAAM,MAAM,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;AAC5D,QAAI,KACF;KAAE;KAAK,YAAY;KAAK,cAAc;KAAK,EAC3C,4DAA4D,MAC7D;KACD;MAEN,KAAA;EAEJ,MAAM,eAA2C;GAC/C,WAAW,KAAK,KAAK;GACrB,MAAM;GACN,kBAAkB;GAClB,eAAe,KAAK,iBAAiB;GACrC;GACA,KAAK,KAAK,KAAK;GACf,WAAW,KAAK,KAAK;GACrB,oBAAoB,KAAK,KAAK;GAC9B,kBAAkB,cAAc;IAC9B,MAAM,OAAO,KAAK,KAAK,gBAAgB,UAAU;AACjD,QAAI,CAAC,kBAAkB,CAAC,KAAK,OAAQ,QAAO;AAG5C,WAAO,CACL,GAFe,KAAK,QAAQ,MAAM,EAAE,SAAS,4BAElC,EACX,2BAA2B;KAAE,QAAQ,KAAK;KAAQ;KAAS,CAAC,CAC7D;;GAEH,eACE,KAAK,cAAc,eAAe,QAC9B;IACE,MAAM,eAAe,SAAS,SAAS;IACvC,aAAa,UAAU;AACrB,UAAK,aAAa,sBAAsB,MAAM,CAAC;;IAElD,GACD,KAAA;GACN,sBAAsB;GACvB;AAED,MAAI,KAAK,cAAc,KAAK,mBAAmB,KAAK,KAAK,aACvD,OAAM,KAAK,iCAAiC,KAAK,YAAY,KAAK,gBAAgB;EAGpF,MAAM,SAAS,0BAA0B,aAAa;EACtD,MAAM,gBAAgB,OAAO,OAAO;AACpC,OAAK,QAAQ,iBAAiB,SAAS,SAAS,EAAE,MAAM,MAAM,CAAC;AAE/D,MAAI;GACF,MAAM,EAAE,SAAS,aAAa,MAAM,OAAO,KAAK;AAChD,SAAM;AACN,OAAI,KAAK,cAAc,KAAK,KAAK,cAAc;AAC7C,UAAM,KAAK,KAAK,aAAa,aAAa,KAAK,YAAY,SAAS;AACpE,gCAA4B,EAAE,YAAY,KAAK,YAAY,CAAC;;AAE9D,OAAI,KAAK,QAAQ,QAAS,QAAO;AAEjC,OAAI,gBAAgB;AAClB,QAAI,CAAC,QAAQ,QAAQ;AACnB,SAAI,KAAK,EAAE,OAAO,KAAK,OAAO,EAAE,sDAAsD;AACtF,YAAO;;AAET,WAAO,QAAQ;;AAEjB,UAAO;WACA,GAAG;AACV,OAAI,KAAK,QAAS,OAAM;GACxB,MAAM,MAAM,aAAa,QAAQ,EAAE,UAAU,OAAO,EAAE;AACtD,OAAI,KAAK;IAAE,KAAK;IAAG,OAAO,KAAK;IAAO,cAAc;IAAK,EAAE,wBAAwB,MAAM;AACzF,UAAO;YACC;AACR,QAAK,QAAQ,oBAAoB,SAAS,QAAQ;;;CAItD,MAAc,iCACZ,YACA,UACe;EACf,MAAM,QAAQ,KAAK,KAAK;AACxB,MAAI,CAAC,MAAO;AACZ,QAAM,MAAM,sBAAsB,YAAY,EAC5C,UAAU;GACR,aAAa;GACb,uBAAuB;GACvB,kBAAkB,SAAS;GAC3B,eAAe,SAAS;GACxB,sBAAsB,SAAS;GAC/B,iBAAiB,SAAS;GAC1B,oBAAoB,SAAS;GAC7B,eAAe;GACf,cAAc,SAAS;GACvB,SAAS;IACP,SAAS,SAAS,mBAAmB;IACrC,QAAQ;IACR,WAAW;IACX,UAAU;IACV,QAAQ,SAAS;IAClB;GACF,EACF,CAAC;AACF,QAAM,MAAM,eAAe,YAAY;GACrC,aAAa;GACb,uBAAuB;GACvB,kBAAkB,SAAS;GAC3B,eAAe,SAAS;GACxB,sBAAsB,SAAS;GAC/B,iBAAiB,SAAS;GAC1B,oBAAoB,SAAS;GAC7B,MAAM,SAAS;GACf,MAAM,CAAC,qBAAqB,SAAS,qBAAqB;GAC3D,CAAC;;;AAIN,SAAS,mBAAmB,UAAoG;AAC9H,QAAO,SAAS,KAAK,YAAY,gBAAgB,QAAQ,CAAC;;AAG5D,SAAS,wBACP,WACA,gBACU;CAEV,MAAM,YADO,aAAa,UAAU,SAAS,IAAI,YAAY,CAAC,GAAG,uBAAuB,EAErF,KAAK,MAAM,OAAO,EAAE,CAAC,MAAM,CAAC,CAC5B,QAAQ,MAAM,EAAE,SAAS,EAAE,CAC3B,QAAQ,MAAM,CAAC,uBAAuB,IAAI,EAAE,CAAC;AAChD,KAAI,kBAAkB,CAAC,SAAS,SAAA,oBAAqC,CACnE,UAAS,KAAK,4BAA4B;AAE5C,QAAO,CAAC,GAAG,IAAI,IAAI,SAAS,CAAC;;AAG/B,SAAS,YAAY,QAAgB,MAAmC,YAA6B;CACnG,MAAM,QAAkB,EAAE;AAC1B,KAAI,KAAK,cAAc,MAAM,CAAE,OAAM,KAAK,KAAK,aAAa,MAAM,CAAC;AACnE,KAAI,KAAK,MAAO,OAAM,KAAK,eAAe,KAAK,QAAQ;AACvD,KAAI,KAAK,MAAO,OAAM,KAAK,mBAAmB,KAAK,QAAQ;AAC3D,OAAM,KAAK,OAAO;AAClB,KAAI,WACF,OAAM,KACJ;EACE;EACA;EACA;EACA;EACA;EACD,CAAC,KAAK,KAAK,CACb;AAEH,QAAO,MAAM,KAAK,OAAO;;AAG3B,SAAS,wBAAwB,KAA0C;AACzE,KAAI;AACF,SAAO,KAAK;UACL,GAAG;AACV,MAAI,KAAK,EAAE,KAAK,GAAG,EAAE,2CAA2C;AAChE,SAAO;;;AAIX,SAAS,0BACP,WAC0B;CAC1B,MAAM,OAAO,WAAW,EAAE,QAAQ,UAAU,UAAU;AACtD,KAAI,SAAS,SAAS,SAAS,WAAW,SAAS,OAAQ,QAAO;AAClE,QAAO;;AAGT,SAAS,sBAAsB,OAWL;AACxB,SAAQ,MAAM,MAAd;EACE,KAAK,aACH,QAAO;GACL,MAAM;GACN,YAAY,MAAM,cAAc;GAChC,UAAU,MAAM,YAAY;GAC5B,MAAM,MAAM,QAAQ,EAAE;GACvB;EACH,KAAK,WACH,QAAO;GACL,MAAM;GACN,YAAY,MAAM,cAAc;GAChC,UAAU,MAAM,YAAY;GAC5B,SAAS,QAAQ,MAAM,QAAQ;GAC/B,eAAe,MAAM;GACrB,OAAO,MAAM;GACd;EACH,KAAK,YACH,QAAO;GACL,MAAM;GACN,OAAO,MAAM,SAAS;GACtB,KAAK,MAAM,OAAO;GACnB;EACH,KAAK,aACH,QAAO;GAAE,MAAM;GAAc,OAAO,MAAM,SAAS;GAAI;EACzD,KAAK,iBACH,QAAO;GAAE,MAAM;GAAkB,OAAO,MAAM,SAAS;GAAI;EAC7D,QACE,QAAO;GAAE,MAAM;GAAc,OAAO;GAAI"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { createLogger } from "../utils/logger/index.js";
|
|
2
2
|
import { init_logger } from "../utils/logger.js";
|
|
3
3
|
import { getApiKey, getDefaultModelSync, init_providers, resolveModel } from "../providers/index.js";
|
|
4
|
-
import { getAssistantMessageErrorReason, stripCodeFences } from "../agent/goals/judge.js";
|
|
5
4
|
import { createExtensionAwareStreamFn } from "../providers/extension-stream-bridge.js";
|
|
5
|
+
import { getAssistantMessageErrorReason, stripCodeFences } from "../agent/goals/judge.js";
|
|
6
6
|
//#region src/ai-assist/text-assist.ts
|
|
7
7
|
init_providers();
|
|
8
8
|
init_logger();
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
-
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
3
|
-
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
4
2
|
import { createLogger } from "../utils/logger/index.js";
|
|
5
3
|
import { init_logger } from "../utils/logger.js";
|
|
4
|
+
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveCredentialsDir, resolveOAuthPath } from "../config/paths.js";
|
|
5
|
+
import { init_write_file_atomic, writeTextAtomic } from "../infra/write-file-atomic.js";
|
|
6
6
|
import { getApiKeyFromEnv, init_env_keys } from "../providers/env-keys.js";
|
|
7
7
|
import { dirname, join } from "path";
|
|
8
8
|
import { mkdir, readFile, readdir, rm } from "fs/promises";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
2
1
|
import { init_paths, resolveCredentialsDir } from "../../config/paths.js";
|
|
3
|
-
import {
|
|
2
|
+
import { init_write_file_atomic, writeTextAtomicSync } from "../../infra/write-file-atomic.js";
|
|
4
3
|
import path from "node:path";
|
|
4
|
+
import { chmodSync, existsSync, mkdirSync, readFileSync } from "node:fs";
|
|
5
5
|
//#region src/auth/profiles/store.ts
|
|
6
6
|
/**
|
|
7
7
|
* Auth Profile Store
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { __esmMin } from "../../_virtual/_rolldown/runtime.js";
|
|
2
|
+
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
2
3
|
import { init_paths, resolveAgentAuthProfilesPath, resolveAuthProfilesPath, resolveOAuthPath } from "../config/paths.js";
|
|
3
4
|
import { init_loader, loadConfig } from "../config/loader.js";
|
|
4
|
-
import { getDefaultAgentId, init_resolve_route } from "../routing/resolve-route.js";
|
|
5
5
|
import { existsSync, readFileSync } from "node:fs";
|
|
6
6
|
//#region src/auth/sync-provider-auth.ts
|
|
7
7
|
/**
|
|
@@ -2,6 +2,7 @@ import { checkWebsiteBlocklist } from "../../agent/tools/url-safety.js";
|
|
|
2
2
|
import { resolveBrowserCommandTimeoutMs } from "../browser-command-timeout.js";
|
|
3
3
|
import { assertBrowserUrlAllowed, checkPostRedirectUrl, containsApiKeyPattern } from "../url-policy.js";
|
|
4
4
|
import { truncateSnapshotAtBoundary } from "../snapshot-helpers.js";
|
|
5
|
+
import { isTruthyValue, resolvePath, valueContains } from "../pipeline/template.js";
|
|
5
6
|
//#region src/browser/actions/extension-registry-bridge.ts
|
|
6
7
|
/**
|
|
7
8
|
* Runs browser registry actions against the Chrome Extension bridge (no Playwright page).
|
|
@@ -31,6 +32,21 @@ function fail(action, code, message, diagnostics) {
|
|
|
31
32
|
diagnostics
|
|
32
33
|
};
|
|
33
34
|
}
|
|
35
|
+
function pipelineLast(ctx) {
|
|
36
|
+
return ctx.pipeline?.last;
|
|
37
|
+
}
|
|
38
|
+
function valueFromArgs(ctx, args) {
|
|
39
|
+
if ("value" in args) return args.value;
|
|
40
|
+
if (typeof args.path === "string") return resolvePath(pipelineLast(ctx), args.path);
|
|
41
|
+
return pipelineLast(ctx);
|
|
42
|
+
}
|
|
43
|
+
function compareValues(a, b) {
|
|
44
|
+
const av = typeof a === "number" ? a : String(a ?? "");
|
|
45
|
+
const bv = typeof b === "number" ? b : String(b ?? "");
|
|
46
|
+
if (av < bv) return -1;
|
|
47
|
+
if (av > bv) return 1;
|
|
48
|
+
return 0;
|
|
49
|
+
}
|
|
34
50
|
function formatAxSnapshot(data, maxLen) {
|
|
35
51
|
const nodes = data?.nodes ?? [];
|
|
36
52
|
if (nodes.length === 0) return "(empty snapshot)";
|
|
@@ -208,19 +224,87 @@ async function runExtensionRegistryAction(name, ctx, args) {
|
|
|
208
224
|
if (!r.ok) return fail(name, "WAIT_TIMEOUT", r.error ?? "wait failed");
|
|
209
225
|
return ok(name, "Wait completed.");
|
|
210
226
|
}
|
|
211
|
-
case "
|
|
227
|
+
case "wait_for_timeout": {
|
|
228
|
+
const ms = typeof args.ms === "number" ? args.ms : typeof args.timeout_ms === "number" ? args.timeout_ms : 1e3;
|
|
229
|
+
const r = await ext.sendCommand("wait", { ms }, { timeout: ms + 1e3 });
|
|
230
|
+
if (!r.ok) return fail(name, "WAIT_TIMEOUT", r.error ?? "wait failed");
|
|
231
|
+
return ok(name, `Waited ${ms}ms.`);
|
|
232
|
+
}
|
|
233
|
+
case "output": return ok(name, "Output captured.", valueFromArgs(ctx, args));
|
|
212
234
|
case "assert": {
|
|
213
|
-
const
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
if (
|
|
217
|
-
if (
|
|
235
|
+
const actual = valueFromArgs(ctx, args);
|
|
236
|
+
if ("equals" in args && JSON.stringify(actual) !== JSON.stringify(args.equals)) return fail(name, "ASSERTION_FAILED", `Expected value to equal ${JSON.stringify(args.equals)}`);
|
|
237
|
+
if ("contains" in args && !valueContains(actual, args.contains)) return fail(name, "ASSERTION_FAILED", `Expected value to contain ${JSON.stringify(args.contains)}`);
|
|
238
|
+
if (args.truthy === true && !isTruthyValue(actual)) return fail(name, "ASSERTION_FAILED", "Expected value to be truthy");
|
|
239
|
+
if (args.exists === true && (actual === void 0 || actual === null || actual === "")) return fail(name, "ASSERTION_FAILED", "Expected value to exist");
|
|
218
240
|
return ok(name, "Assertion passed.");
|
|
219
241
|
}
|
|
242
|
+
case "select": {
|
|
243
|
+
const source = "from" in args ? args.from : pipelineLast(ctx);
|
|
244
|
+
const path = String(args.path ?? args.value ?? "");
|
|
245
|
+
const value = path ? resolvePath(source, path) : source;
|
|
246
|
+
return ok(name, typeof value === "string" ? value : JSON.stringify(value, null, 2), value);
|
|
247
|
+
}
|
|
248
|
+
case "map": {
|
|
249
|
+
const source = "from" in args ? args.from : pipelineLast(ctx);
|
|
250
|
+
if (!Array.isArray(source)) return fail(name, "INVALID_INPUT", "map input must be an array");
|
|
251
|
+
const path = String(args.path ?? "");
|
|
252
|
+
const value = path ? source.map((item) => resolvePath(item, path)) : source;
|
|
253
|
+
return ok(name, JSON.stringify(value, null, 2), value);
|
|
254
|
+
}
|
|
255
|
+
case "filter": {
|
|
256
|
+
const source = "from" in args ? args.from : pipelineLast(ctx);
|
|
257
|
+
if (!Array.isArray(source)) return fail(name, "INVALID_INPUT", "filter input must be an array");
|
|
258
|
+
const path = String(args.path ?? "");
|
|
259
|
+
const value = source.filter((item) => {
|
|
260
|
+
const itemValue = path ? resolvePath(item, path) : item;
|
|
261
|
+
if ("equals" in args) return JSON.stringify(itemValue) === JSON.stringify(args.equals);
|
|
262
|
+
if ("contains" in args) return valueContains(itemValue, args.contains);
|
|
263
|
+
return isTruthyValue(itemValue);
|
|
264
|
+
});
|
|
265
|
+
return ok(name, JSON.stringify(value, null, 2), value);
|
|
266
|
+
}
|
|
267
|
+
case "sort": {
|
|
268
|
+
const source = "from" in args ? args.from : pipelineLast(ctx);
|
|
269
|
+
if (!Array.isArray(source)) return fail(name, "INVALID_INPUT", "sort input must be an array");
|
|
270
|
+
const path = String(args.path ?? "");
|
|
271
|
+
const direction = String(args.direction ?? "asc");
|
|
272
|
+
const value = [...source].sort((a, b) => {
|
|
273
|
+
const cmp = compareValues(path ? resolvePath(a, path) : a, path ? resolvePath(b, path) : b);
|
|
274
|
+
return direction === "desc" ? -cmp : cmp;
|
|
275
|
+
});
|
|
276
|
+
return ok(name, JSON.stringify(value, null, 2), value);
|
|
277
|
+
}
|
|
278
|
+
case "limit": {
|
|
279
|
+
const source = "from" in args ? args.from : pipelineLast(ctx);
|
|
280
|
+
if (!Array.isArray(source)) return fail(name, "INVALID_INPUT", "limit input must be an array");
|
|
281
|
+
const count = Math.max(0, Number(args.count ?? args.limit ?? 10));
|
|
282
|
+
const offset = Math.max(0, Number(args.offset ?? 0));
|
|
283
|
+
const value = source.slice(offset, offset + count);
|
|
284
|
+
return ok(name, JSON.stringify(value, null, 2), value);
|
|
285
|
+
}
|
|
220
286
|
case "network_start":
|
|
221
287
|
case "network_events":
|
|
222
288
|
case "network_stop":
|
|
223
|
-
case "cdp":
|
|
289
|
+
case "cdp":
|
|
290
|
+
case "wait_for_navigation":
|
|
291
|
+
case "wait_for_function":
|
|
292
|
+
case "wait_for_network_idle":
|
|
293
|
+
case "element_text":
|
|
294
|
+
case "element_attribute":
|
|
295
|
+
case "bounding_box":
|
|
296
|
+
case "set_input_files":
|
|
297
|
+
case "cookies":
|
|
298
|
+
case "get_cookies":
|
|
299
|
+
case "add_cookies":
|
|
300
|
+
case "clear_cookies":
|
|
301
|
+
case "tabs":
|
|
302
|
+
case "list_tabs":
|
|
303
|
+
case "new_tab":
|
|
304
|
+
case "switch_tab":
|
|
305
|
+
case "fetch":
|
|
306
|
+
case "collect":
|
|
307
|
+
case "tap": return fail(name, "NOT_SUPPORTED", `Action "${name}" is not available with the Chrome Extension backend`);
|
|
224
308
|
default: return fail(name, "UNKNOWN_ACTION", `Unknown browser action: ${name}`);
|
|
225
309
|
}
|
|
226
310
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extension-registry-bridge.js","names":["d"],"sources":["../../../../src/browser/actions/extension-registry-bridge.ts"],"sourcesContent":["/**\n * Runs browser registry actions against the Chrome Extension bridge (no Playwright page).\n */\n\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';\n\nimport type { BrowserActionContext, BrowserActionResult } from './types.js';\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst AUTO_SNAPSHOT_MAX = 8_000;\n\nfunction toMs(ctx: BrowserActionContext): number {\n return resolveBrowserCommandTimeoutMs(ctx.config);\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 formatAxSnapshot(data: unknown, maxLen: number): string {\n const d = data as { nodes?: Array<{ role?: string; name?: string }> } | undefined;\n const nodes = d?.nodes ?? [];\n if (nodes.length === 0) return '(empty snapshot)';\n const lines = nodes.map((n) => `${n.role ?? '?'}: ${n.name ?? ''}`);\n let text = lines.join('\\n');\n if (text.length > maxLen) text = truncateSnapshotAtBoundary(text, maxLen);\n return text;\n}\n\nexport async function runExtensionRegistryAction(\n name: string,\n ctx: BrowserActionContext,\n args: Record<string, unknown>,\n): Promise<BrowserActionResult> {\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n const ext = ctx.manager.getExtensionProvider();\n if (!ext) {\n return fail(name, 'NO_EXTENSION', 'Extension backend not connected');\n }\n\n const timeout = toMs(ctx);\n const allowPrivate = ctx.config?.agents?.defaults?.browser?.allowPrivateUrls === true;\n\n switch (name) {\n case 'open':\n case 'navigate': {\n const url = String(args.url ?? '');\n if (!url) return fail(name, 'MISSING_URL', 'url is required');\n if (containsApiKeyPattern(url)) return fail(name, 'BLOCKED', 'URL contains API key/token');\n const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);\n if (block) return fail(name, 'BLOCKED', block.message);\n assertBrowserUrlAllowed(url, { allowPrivateUrls: allowPrivate });\n\n const r = await ext.sendCommand('navigate', { url }, { timeout });\n if (!r.ok) return fail(name, 'NAVIGATE_FAILED', r.error ?? 'navigate failed');\n\n const data = r.data as { url?: string; title?: string } | undefined;\n const finalUrl = data?.url ?? url;\n const title = data?.title ?? '';\n\n if (finalUrl && finalUrl !== url) {\n const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });\n if (redirectBlock) {\n await ext.sendCommand('navigate', { url: 'about:blank' }, { timeout: Math.min(10_000, timeout) }).catch(() => {});\n return fail(name, 'REDIRECT_BLOCKED', redirectBlock);\n }\n }\n\n let snapshot = '';\n try {\n const snap = await ext.sendCommand('snapshot', {}, { timeout });\n if (snap.ok && snap.data) {\n snapshot = formatAxSnapshot(snap.data, AUTO_SNAPSHOT_MAX);\n }\n } catch {\n /* non-fatal */\n }\n\n const text = `Navigated to: ${title}\\nURL: ${finalUrl}${snapshot ? `\\n--- Page Snapshot ---\\n${snapshot}` : ''}`;\n return ok(name, text, { url: finalUrl, title });\n }\n\n case 'state':\n case 'snapshot': {\n const maxLen = typeof args.maxLength === 'number' ? args.maxLength : DEFAULT_SNAPSHOT_MAX;\n if (args.selector && String(args.selector).trim()) {\n return fail(name, 'NOT_SUPPORTED', 'selector-scoped state is not supported with the Chrome Extension backend');\n }\n const r = await ext.sendCommand('snapshot', {}, { timeout });\n if (!r.ok) return fail(name, 'SNAPSHOT_FAILED', r.error ?? 'snapshot failed');\n const body = formatAxSnapshot(r.data, maxLen);\n const data = r.data as { url?: string; title?: string } | undefined;\n const header = data?.url ? `URL: ${data.url}\\nTitle: ${data.title ?? ''}\\n\\n` : '';\n return ok(name, `${header}--- Page Snapshot ---\\n${body}`, { length: body.length });\n }\n\n case 'click': {\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 if (role?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'role-based click is not supported with the Chrome Extension backend; use selector or text');\n }\n const n = (Boolean(selector?.trim()) ? 1 : 0) + (Boolean(text?.trim()) ? 1 : 0);\n if (n !== 1) {\n return fail(name, 'INVALID_ARGS', 'Provide exactly one of: selector, text');\n }\n const r = await ext.sendCommand('click', { selector: selector?.trim(), text: text?.trim() }, { timeout });\n if (!r.ok) return fail(name, 'CLICK_FAILED', r.error ?? 'click failed');\n return ok(name, 'Click succeeded.');\n }\n\n case 'type':\n case 'input': {\n const selector = args.selector as string | undefined;\n const label = args.label as string | undefined;\n if (label?.trim() && !selector?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'label-based typing is not supported with the Chrome Extension backend; use selector');\n }\n const text = String(args.text ?? '');\n if (!text) return fail(name, 'MISSING_TEXT', 'text is required');\n const r = await ext.sendCommand(\n 'type',\n { selector: selector?.trim(), text, pressEnter: args.pressEnter === true },\n { timeout },\n );\n if (!r.ok) return fail(name, 'TYPE_FAILED', r.error ?? 'type failed');\n return ok(name, 'Typed into field.');\n }\n\n case 'scroll': {\n const direction = (args.direction as string) ?? 'down';\n const amount = typeof args.amount === 'number' ? args.amount : 500;\n const deltaY = direction === 'down' ? amount : -amount;\n const r = await ext.sendCommand('scroll', { deltaY }, { timeout });\n if (!r.ok) return fail(name, 'SCROLL_FAILED', r.error ?? 'scroll failed');\n return ok(name, `Scrolled ${direction} by ${amount}px.`);\n }\n\n case 'back': {\n const r = await ext.sendCommand('back', {}, { timeout });\n if (!r.ok) return fail(name, 'BACK_FAILED', r.error ?? 'back failed');\n const data = r.data as { url?: string; title?: string } | undefined;\n return ok(name, `Navigated back to: ${data?.title ?? ''}\\nURL: ${data?.url ?? ''}`, { url: data?.url, title: data?.title });\n }\n\n case 'screenshot': {\n const fullPage = args.full_page === true || args.fullPage === true;\n const path = args.path as string | undefined;\n const selector = args.selector as string | undefined;\n if (selector?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'selector-scoped screenshots are not supported with the Chrome Extension backend');\n }\n const r = await ext.sendCommand('screenshot', { fullPage }, { timeout });\n if (!r.ok) return fail(name, 'SCREENSHOT_FAILED', r.error ?? 'screenshot failed');\n const b64 = (r.data as { base64?: string } | undefined)?.base64;\n if (!b64) return fail(name, 'SCREENSHOT_FAILED', 'no image data');\n const artifact = { type: 'screenshot' as const, path, data: b64, mimeType: 'image/png' };\n const approxBytes = Math.floor((b64.length * 3) / 4);\n return ok(name, `Screenshot captured (~${approxBytes} bytes).`, { bytes: approxBytes }, [artifact]);\n }\n\n case 'keys':\n case 'press': {\n const key = String(args.key ?? '');\n if (!key) return fail(name, 'MISSING_KEY', 'key is required');\n const r = await ext.sendCommand('keys', { key }, { timeout });\n if (!r.ok) return fail(name, 'PRESS_FAILED', r.error ?? 'keys failed');\n return ok(name, `Pressed key: ${key}`);\n }\n\n case 'console':\n case 'eval':\n case 'evaluate': {\n const js =\n (args.javascript as string) ?? (args.expression as string) ?? (args.code as string) ?? '';\n if (!js.trim()) return fail(name, 'MISSING_JS', 'javascript expression is required');\n const r = await ext.sendCommand('evaluate', { expression: js }, { timeout });\n if (!r.ok) return fail(name, 'EVAL_FAILED', r.error ?? 'evaluate failed');\n const result = (r.data as { result?: unknown } | undefined)?.result;\n const serialized = result === undefined ? 'undefined' : JSON.stringify(result, null, 2);\n const text =\n serialized.length > DEFAULT_SNAPSHOT_MAX\n ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\\n... (truncated)`\n : serialized;\n return ok(name, text, result);\n }\n\n case 'images': {\n const selector = args.selector as string | undefined;\n const maxImages = typeof args.maxImages === 'number' ? args.maxImages : 20;\n const expr = `(() => {\n const sel = ${JSON.stringify(selector?.trim() || null)};\n const max = ${JSON.stringify(maxImages)};\n const d = globalThis.document;\n const root = sel ? d.querySelector(sel) : d;\n if (!root) return [];\n const imgs = Array.from(root.querySelectorAll('img'));\n return imgs.slice(0, max).map((img) => ({\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 const r = await ext.sendCommand('evaluate', { expression: expr }, { timeout });\n if (!r.ok) return fail(name, 'IMAGES_FAILED', r.error ?? 'evaluate failed');\n const images = (r.data as { result?: unknown[] } | undefined)?.result as\n | Array<{ src: string; alt: string; width: number; height: number }>\n | undefined;\n if (!images || images.length === 0) return ok(name, 'No images found on the page.', []);\n const lines = images.map(\n (img, i) => `${i + 1}. ${img.alt || '(no alt)'} — ${img.width}×${img.height}\\n ${img.src}`,\n );\n return ok(name, `Found ${images.length} image(s):\\n${lines.join('\\n')}`, images);\n }\n\n case 'dialog': {\n const action = args.action as string;\n if (action !== 'accept' && action !== 'dismiss') {\n return fail(name, 'INVALID_ACTION', 'action must be \"accept\" or \"dismiss\"');\n }\n const r = await ext.sendCommand('dialog', { accept: action === 'accept' }, { timeout });\n if (!r.ok) return fail(name, 'DIALOG_FAILED', r.error ?? 'dialog failed');\n return ok(name, `Dialog ${action}ed.`);\n }\n\n case 'close': {\n return ok(name, 'Browser page closed.');\n }\n\n case 'wait': {\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 : timeout;\n if (text?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'text-based wait is not supported with the Chrome Extension backend; use selector or ms');\n }\n const extArgs: Record<string, unknown> = {};\n if (selector?.trim()) {\n extArgs.selector = selector.trim();\n } else {\n extArgs.ms = typeof args.ms === 'number' ? args.ms : 1000;\n }\n const r = await ext.sendCommand('wait', extArgs, { timeout: timeoutMs });\n if (!r.ok) return fail(name, 'WAIT_TIMEOUT', r.error ?? 'wait failed');\n return ok(name, 'Wait completed.');\n }\n\n case 'output':\n return ok(name, 'Output captured.', args.value ?? ctx.pipelineData);\n\n case 'assert': {\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(name, 'ASSERTION_FAILED', `Expected value to contain \"${contains}\"`);\n }\n if (equals !== undefined && value !== equals) {\n return fail(name, 'ASSERTION_FAILED', `Expected value to equal \"${equals}\"`);\n }\n return ok(name, 'Assertion passed.');\n }\n\n case 'network_start':\n case 'network_events':\n case 'network_stop':\n case 'cdp':\n return fail(name, 'NOT_SUPPORTED', `Action \"${name}\" is not available with the Chrome Extension backend`);\n\n default:\n return fail(name, 'UNKNOWN_ACTION', `Unknown browser action: ${name}`);\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extension-registry-bridge.js","names":["d"],"sources":["../../../../src/browser/actions/extension-registry-bridge.ts"],"sourcesContent":["/**\n * Runs browser registry actions against the Chrome Extension bridge (no Playwright page).\n */\n\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 { isTruthyValue, resolvePath, valueContains } from '../pipeline/template.js';\n\nimport type { BrowserActionContext, BrowserActionResult } from './types.js';\n\nconst DEFAULT_SNAPSHOT_MAX = 30_000;\nconst AUTO_SNAPSHOT_MAX = 8_000;\n\nfunction toMs(ctx: BrowserActionContext): number {\n return resolveBrowserCommandTimeoutMs(ctx.config);\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 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 formatAxSnapshot(data: unknown, maxLen: number): string {\n const d = data as { nodes?: Array<{ role?: string; name?: string }> } | undefined;\n const nodes = d?.nodes ?? [];\n if (nodes.length === 0) return '(empty snapshot)';\n const lines = nodes.map((n) => `${n.role ?? '?'}: ${n.name ?? ''}`);\n let text = lines.join('\\n');\n if (text.length > maxLen) text = truncateSnapshotAtBoundary(text, maxLen);\n return text;\n}\n\nexport async function runExtensionRegistryAction(\n name: string,\n ctx: BrowserActionContext,\n args: Record<string, unknown>,\n): Promise<BrowserActionResult> {\n if (ctx.signal?.aborted) {\n return fail(name, 'ABORTED', 'Operation was aborted');\n }\n const ext = ctx.manager.getExtensionProvider();\n if (!ext) {\n return fail(name, 'NO_EXTENSION', 'Extension backend not connected');\n }\n\n const timeout = toMs(ctx);\n const allowPrivate = ctx.config?.agents?.defaults?.browser?.allowPrivateUrls === true;\n\n switch (name) {\n case 'open':\n case 'navigate': {\n const url = String(args.url ?? '');\n if (!url) return fail(name, 'MISSING_URL', 'url is required');\n if (containsApiKeyPattern(url)) return fail(name, 'BLOCKED', 'URL contains API key/token');\n const block = checkWebsiteBlocklist(url, ctx.config?.tools?.web?.blocklist);\n if (block) return fail(name, 'BLOCKED', block.message);\n assertBrowserUrlAllowed(url, { allowPrivateUrls: allowPrivate });\n\n const r = await ext.sendCommand('navigate', { url }, { timeout });\n if (!r.ok) return fail(name, 'NAVIGATE_FAILED', r.error ?? 'navigate failed');\n\n const data = r.data as { url?: string; title?: string } | undefined;\n const finalUrl = data?.url ?? url;\n const title = data?.title ?? '';\n\n if (finalUrl && finalUrl !== url) {\n const redirectBlock = checkPostRedirectUrl(finalUrl, { allowPrivateUrls: allowPrivate });\n if (redirectBlock) {\n await ext.sendCommand('navigate', { url: 'about:blank' }, { timeout: Math.min(10_000, timeout) }).catch(() => {});\n return fail(name, 'REDIRECT_BLOCKED', redirectBlock);\n }\n }\n\n let snapshot = '';\n try {\n const snap = await ext.sendCommand('snapshot', {}, { timeout });\n if (snap.ok && snap.data) {\n snapshot = formatAxSnapshot(snap.data, AUTO_SNAPSHOT_MAX);\n }\n } catch {\n /* non-fatal */\n }\n\n const text = `Navigated to: ${title}\\nURL: ${finalUrl}${snapshot ? `\\n--- Page Snapshot ---\\n${snapshot}` : ''}`;\n return ok(name, text, { url: finalUrl, title });\n }\n\n case 'state':\n case 'snapshot': {\n const maxLen = typeof args.maxLength === 'number' ? args.maxLength : DEFAULT_SNAPSHOT_MAX;\n if (args.selector && String(args.selector).trim()) {\n return fail(name, 'NOT_SUPPORTED', 'selector-scoped state is not supported with the Chrome Extension backend');\n }\n const r = await ext.sendCommand('snapshot', {}, { timeout });\n if (!r.ok) return fail(name, 'SNAPSHOT_FAILED', r.error ?? 'snapshot failed');\n const body = formatAxSnapshot(r.data, maxLen);\n const data = r.data as { url?: string; title?: string } | undefined;\n const header = data?.url ? `URL: ${data.url}\\nTitle: ${data.title ?? ''}\\n\\n` : '';\n return ok(name, `${header}--- Page Snapshot ---\\n${body}`, { length: body.length });\n }\n\n case 'click': {\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 if (role?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'role-based click is not supported with the Chrome Extension backend; use selector or text');\n }\n const n = (Boolean(selector?.trim()) ? 1 : 0) + (Boolean(text?.trim()) ? 1 : 0);\n if (n !== 1) {\n return fail(name, 'INVALID_ARGS', 'Provide exactly one of: selector, text');\n }\n const r = await ext.sendCommand('click', { selector: selector?.trim(), text: text?.trim() }, { timeout });\n if (!r.ok) return fail(name, 'CLICK_FAILED', r.error ?? 'click failed');\n return ok(name, 'Click succeeded.');\n }\n\n case 'type':\n case 'input': {\n const selector = args.selector as string | undefined;\n const label = args.label as string | undefined;\n if (label?.trim() && !selector?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'label-based typing is not supported with the Chrome Extension backend; use selector');\n }\n const text = String(args.text ?? '');\n if (!text) return fail(name, 'MISSING_TEXT', 'text is required');\n const r = await ext.sendCommand(\n 'type',\n { selector: selector?.trim(), text, pressEnter: args.pressEnter === true },\n { timeout },\n );\n if (!r.ok) return fail(name, 'TYPE_FAILED', r.error ?? 'type failed');\n return ok(name, 'Typed into field.');\n }\n\n case 'scroll': {\n const direction = (args.direction as string) ?? 'down';\n const amount = typeof args.amount === 'number' ? args.amount : 500;\n const deltaY = direction === 'down' ? amount : -amount;\n const r = await ext.sendCommand('scroll', { deltaY }, { timeout });\n if (!r.ok) return fail(name, 'SCROLL_FAILED', r.error ?? 'scroll failed');\n return ok(name, `Scrolled ${direction} by ${amount}px.`);\n }\n\n case 'back': {\n const r = await ext.sendCommand('back', {}, { timeout });\n if (!r.ok) return fail(name, 'BACK_FAILED', r.error ?? 'back failed');\n const data = r.data as { url?: string; title?: string } | undefined;\n return ok(name, `Navigated back to: ${data?.title ?? ''}\\nURL: ${data?.url ?? ''}`, { url: data?.url, title: data?.title });\n }\n\n case 'screenshot': {\n const fullPage = args.full_page === true || args.fullPage === true;\n const path = args.path as string | undefined;\n const selector = args.selector as string | undefined;\n if (selector?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'selector-scoped screenshots are not supported with the Chrome Extension backend');\n }\n const r = await ext.sendCommand('screenshot', { fullPage }, { timeout });\n if (!r.ok) return fail(name, 'SCREENSHOT_FAILED', r.error ?? 'screenshot failed');\n const b64 = (r.data as { base64?: string } | undefined)?.base64;\n if (!b64) return fail(name, 'SCREENSHOT_FAILED', 'no image data');\n const artifact = { type: 'screenshot' as const, path, data: b64, mimeType: 'image/png' };\n const approxBytes = Math.floor((b64.length * 3) / 4);\n return ok(name, `Screenshot captured (~${approxBytes} bytes).`, { bytes: approxBytes }, [artifact]);\n }\n\n case 'keys':\n case 'press': {\n const key = String(args.key ?? '');\n if (!key) return fail(name, 'MISSING_KEY', 'key is required');\n const r = await ext.sendCommand('keys', { key }, { timeout });\n if (!r.ok) return fail(name, 'PRESS_FAILED', r.error ?? 'keys failed');\n return ok(name, `Pressed key: ${key}`);\n }\n\n case 'console':\n case 'eval':\n case 'evaluate': {\n const js =\n (args.javascript as string) ?? (args.expression as string) ?? (args.code as string) ?? '';\n if (!js.trim()) return fail(name, 'MISSING_JS', 'javascript expression is required');\n const r = await ext.sendCommand('evaluate', { expression: js }, { timeout });\n if (!r.ok) return fail(name, 'EVAL_FAILED', r.error ?? 'evaluate failed');\n const result = (r.data as { result?: unknown } | undefined)?.result;\n const serialized = result === undefined ? 'undefined' : JSON.stringify(result, null, 2);\n const text =\n serialized.length > DEFAULT_SNAPSHOT_MAX\n ? `${serialized.slice(0, DEFAULT_SNAPSHOT_MAX)}\\n... (truncated)`\n : serialized;\n return ok(name, text, result);\n }\n\n case 'images': {\n const selector = args.selector as string | undefined;\n const maxImages = typeof args.maxImages === 'number' ? args.maxImages : 20;\n const expr = `(() => {\n const sel = ${JSON.stringify(selector?.trim() || null)};\n const max = ${JSON.stringify(maxImages)};\n const d = globalThis.document;\n const root = sel ? d.querySelector(sel) : d;\n if (!root) return [];\n const imgs = Array.from(root.querySelectorAll('img'));\n return imgs.slice(0, max).map((img) => ({\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 const r = await ext.sendCommand('evaluate', { expression: expr }, { timeout });\n if (!r.ok) return fail(name, 'IMAGES_FAILED', r.error ?? 'evaluate failed');\n const images = (r.data as { result?: unknown[] } | undefined)?.result as\n | Array<{ src: string; alt: string; width: number; height: number }>\n | undefined;\n if (!images || images.length === 0) return ok(name, 'No images found on the page.', []);\n const lines = images.map(\n (img, i) => `${i + 1}. ${img.alt || '(no alt)'} — ${img.width}×${img.height}\\n ${img.src}`,\n );\n return ok(name, `Found ${images.length} image(s):\\n${lines.join('\\n')}`, images);\n }\n\n case 'dialog': {\n const action = args.action as string;\n if (action !== 'accept' && action !== 'dismiss') {\n return fail(name, 'INVALID_ACTION', 'action must be \"accept\" or \"dismiss\"');\n }\n const r = await ext.sendCommand('dialog', { accept: action === 'accept' }, { timeout });\n if (!r.ok) return fail(name, 'DIALOG_FAILED', r.error ?? 'dialog failed');\n return ok(name, `Dialog ${action}ed.`);\n }\n\n case 'close': {\n return ok(name, 'Browser page closed.');\n }\n\n case 'wait': {\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 : timeout;\n if (text?.trim()) {\n return fail(name, 'NOT_SUPPORTED', 'text-based wait is not supported with the Chrome Extension backend; use selector or ms');\n }\n const extArgs: Record<string, unknown> = {};\n if (selector?.trim()) {\n extArgs.selector = selector.trim();\n } else {\n extArgs.ms = typeof args.ms === 'number' ? args.ms : 1000;\n }\n const r = await ext.sendCommand('wait', extArgs, { timeout: timeoutMs });\n if (!r.ok) return fail(name, 'WAIT_TIMEOUT', r.error ?? 'wait failed');\n return ok(name, 'Wait completed.');\n }\n\n case 'wait_for_timeout': {\n const ms = typeof args.ms === 'number' ? args.ms : typeof args.timeout_ms === 'number' ? args.timeout_ms : 1000;\n const r = await ext.sendCommand('wait', { ms }, { timeout: ms + 1000 });\n if (!r.ok) return fail(name, 'WAIT_TIMEOUT', r.error ?? 'wait failed');\n return ok(name, `Waited ${ms}ms.`);\n }\n\n case 'output':\n return ok(name, 'Output captured.', valueFromArgs(ctx, args));\n\n case 'assert': {\n const actual = valueFromArgs(ctx, args);\n if ('equals' in args && JSON.stringify(actual) !== JSON.stringify(args.equals)) {\n return fail(name, 'ASSERTION_FAILED', `Expected value to equal ${JSON.stringify(args.equals)}`);\n }\n if ('contains' in args && !valueContains(actual, args.contains)) {\n return fail(name, 'ASSERTION_FAILED', `Expected value to contain ${JSON.stringify(args.contains)}`);\n }\n if (args.truthy === true && !isTruthyValue(actual)) {\n return fail(name, 'ASSERTION_FAILED', 'Expected value to be truthy');\n }\n if (args.exists === true && (actual === undefined || actual === null || actual === '')) {\n return fail(name, 'ASSERTION_FAILED', 'Expected value to exist');\n }\n return ok(name, 'Assertion passed.');\n }\n\n case 'select': {\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(name, typeof value === 'string' ? value : JSON.stringify(value, null, 2), value);\n }\n\n case 'map': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'map input must be an array');\n const path = String(args.path ?? '');\n const value = path ? source.map((item) => resolvePath(item, path)) : source;\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'filter': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'filter input must be an array');\n const path = String(args.path ?? '');\n const value = source.filter((item) => {\n const itemValue = path ? resolvePath(item, path) : item;\n if ('equals' in args) return JSON.stringify(itemValue) === JSON.stringify(args.equals);\n if ('contains' in args) return valueContains(itemValue, args.contains);\n return isTruthyValue(itemValue);\n });\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'sort': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, 'INVALID_INPUT', 'sort input must be an array');\n const path = String(args.path ?? '');\n const direction = String(args.direction ?? 'asc');\n const value = [...source].sort((a, b) => {\n const cmp = compareValues(path ? resolvePath(a, path) : a, path ? resolvePath(b, path) : b);\n return direction === 'desc' ? -cmp : cmp;\n });\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'limit': {\n const source = 'from' in args ? args.from : pipelineLast(ctx);\n if (!Array.isArray(source)) return fail(name, '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 value = source.slice(offset, offset + count);\n return ok(name, JSON.stringify(value, null, 2), value);\n }\n\n case 'network_start':\n case 'network_events':\n case 'network_stop':\n case 'cdp':\n case 'wait_for_navigation':\n case 'wait_for_function':\n case 'wait_for_network_idle':\n case 'element_text':\n case 'element_attribute':\n case 'bounding_box':\n case 'set_input_files':\n case 'cookies':\n case 'get_cookies':\n case 'add_cookies':\n case 'clear_cookies':\n case 'tabs':\n case 'list_tabs':\n case 'new_tab':\n case 'switch_tab':\n case 'fetch':\n case 'collect':\n case 'tap':\n return fail(name, 'NOT_SUPPORTED', `Action \"${name}\" is not available with the Chrome Extension backend`);\n\n default:\n return fail(name, 'UNKNOWN_ACTION', `Unknown browser action: ${name}`);\n }\n}\n"],"mappings":"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"}
|