e2e 0.15.1 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -24
- package/dist/.build.json +1 -1
- package/dist/agent/act-validation.d.ts +10 -1
- package/dist/agent/act-validation.js +48 -1
- package/dist/agent/act.d.ts +1 -2
- package/dist/agent/act.js +25 -8
- package/dist/agent/action-dispatcher.d.ts +0 -1
- package/dist/agent/action-dispatcher.js +0 -1
- package/dist/agent/action-names.d.ts +0 -1
- package/dist/agent/action-names.js +0 -1
- package/dist/agent/actions.d.ts +0 -1
- package/dist/agent/actions.js +0 -1
- package/dist/agent/agent-brand.d.ts +0 -1
- package/dist/agent/agent-brand.js +0 -1
- package/dist/agent/ai-sdk.d.ts +7 -1
- package/dist/agent/ai-sdk.js +11 -1
- package/dist/agent/call-options.d.ts +0 -1
- package/dist/agent/call-options.js +0 -1
- package/dist/agent/default-agent.d.ts +0 -1
- package/dist/agent/default-agent.js +0 -1
- package/dist/agent/derived.d.ts +0 -1
- package/dist/agent/derived.js +0 -1
- package/dist/agent/error.d.ts +16 -4
- package/dist/agent/error.js +25 -7
- package/dist/agent/executor.d.ts +0 -1
- package/dist/agent/executor.js +0 -1
- package/dist/agent/index.d.ts +0 -1
- package/dist/agent/index.js +0 -1
- package/dist/agent/interactive-step.d.ts +0 -1
- package/dist/agent/interactive-step.js +0 -1
- package/dist/agent/invocation.d.ts +0 -1
- package/dist/agent/invocation.js +10 -5
- package/dist/agent/ledger.d.ts +0 -1
- package/dist/agent/ledger.js +0 -1
- package/dist/agent/loop-guards.d.ts +0 -1
- package/dist/agent/loop-guards.js +0 -1
- package/dist/agent/model/adapter.d.ts +0 -1
- package/dist/agent/model/adapter.js +0 -1
- package/dist/agent/model/overflow.d.ts +0 -1
- package/dist/agent/model/overflow.js +0 -1
- package/dist/agent/model/provider-hints.d.ts +0 -1
- package/dist/agent/model/provider-hints.js +0 -1
- package/dist/agent/model/schema.d.ts +0 -1
- package/dist/agent/model/schema.js +0 -1
- package/dist/agent/model/sdk.d.ts +0 -1
- package/dist/agent/model/sdk.js +0 -1
- package/dist/agent/model/stall.d.ts +0 -1
- package/dist/agent/model/stall.js +0 -1
- package/dist/agent/model/tool-choice.d.ts +24 -2
- package/dist/agent/model/tool-choice.js +27 -2
- package/dist/agent/observation-budget.d.ts +0 -1
- package/dist/agent/observation-budget.js +0 -1
- package/dist/agent/observation-feed.d.ts +0 -1
- package/dist/agent/observation-feed.js +0 -1
- package/dist/agent/observation.d.ts +0 -1
- package/dist/agent/observation.js +0 -1
- package/dist/agent/operation-queue.d.ts +0 -1
- package/dist/agent/operation-queue.js +0 -1
- package/dist/agent/phases.d.ts +0 -1
- package/dist/agent/phases.js +0 -1
- package/dist/agent/pixels.d.ts +0 -1
- package/dist/agent/pixels.js +0 -1
- package/dist/agent/point-tap.d.ts +0 -1
- package/dist/agent/point-tap.js +0 -1
- package/dist/agent/primitives.d.ts +6 -1
- package/dist/agent/primitives.js +4 -2
- package/dist/agent/prompts.d.ts +0 -1
- package/dist/agent/prompts.js +0 -1
- package/dist/agent/protocol.d.ts +0 -1
- package/dist/agent/protocol.js +0 -1
- package/dist/agent/public.d.ts +0 -1
- package/dist/agent/public.js +0 -1
- package/dist/agent/reading.d.ts +0 -1
- package/dist/agent/reading.js +0 -1
- package/dist/agent/replay.d.ts +0 -1
- package/dist/agent/replay.js +0 -1
- package/dist/agent/screen-update.d.ts +0 -1
- package/dist/agent/screen-update.js +0 -1
- package/dist/agent/scroll-target.d.ts +0 -1
- package/dist/agent/scroll-target.js +0 -1
- package/dist/agent/secrets.d.ts +0 -1
- package/dist/agent/secrets.js +0 -1
- package/dist/agent/settle-policy.d.ts +0 -1
- package/dist/agent/settle-policy.js +0 -1
- package/dist/agent/step-accounting.d.ts +0 -1
- package/dist/agent/step-accounting.js +0 -1
- package/dist/agent/step-cache.d.ts +14 -4
- package/dist/agent/step-cache.js +13 -4
- package/dist/agent/tool-loop.d.ts +0 -1
- package/dist/agent/tool-loop.js +62 -10
- package/dist/agent/tool-output.d.ts +0 -1
- package/dist/agent/tool-output.js +0 -1
- package/dist/agent/tool.d.ts +0 -1
- package/dist/agent/tool.js +0 -1
- package/dist/agent/transcript-compaction.d.ts +0 -1
- package/dist/agent/transcript-compaction.js +0 -1
- package/dist/agent/upload-paths.d.ts +0 -1
- package/dist/agent/upload-paths.js +0 -1
- package/dist/agent/usage.d.ts +0 -1
- package/dist/agent/usage.js +0 -1
- package/dist/cache/anchors.d.ts +0 -1
- package/dist/cache/anchors.js +0 -1
- package/dist/cache/context.d.ts +19 -7
- package/dist/cache/context.js +15 -22
- package/dist/cache/decide.d.ts +0 -1
- package/dist/cache/decide.js +0 -1
- package/dist/cache/identity.d.ts +0 -1
- package/dist/cache/identity.js +0 -1
- package/dist/cache/recorder.d.ts +0 -1
- package/dist/cache/recorder.js +0 -1
- package/dist/cache/relocate.d.ts +0 -1
- package/dist/cache/relocate.js +0 -1
- package/dist/cache/route.d.ts +0 -1
- package/dist/cache/route.js +0 -1
- package/dist/cache/store.d.ts +0 -1
- package/dist/cache/store.js +0 -1
- package/dist/cache/template.d.ts +0 -1
- package/dist/cache/template.js +0 -1
- package/dist/cache/trace.d.ts +0 -1
- package/dist/cache/trace.js +0 -1
- package/dist/cli/bin.d.ts +0 -1
- package/dist/cli/bin.js +0 -1
- package/dist/cli/cache.d.ts +0 -1
- package/dist/cli/cache.js +0 -1
- package/dist/cli/docs-url.d.ts +0 -1
- package/dist/cli/docs-url.js +0 -1
- package/dist/cli/feedback.d.ts +0 -1
- package/dist/cli/feedback.js +0 -1
- package/dist/cli/guide.d.ts +0 -1
- package/dist/cli/guide.js +0 -1
- package/dist/cli/index.d.ts +0 -1
- package/dist/cli/index.js +2 -3
- package/dist/cli/init/agent-skill.d.ts +0 -1
- package/dist/cli/init/agent-skill.js +0 -1
- package/dist/cli/init/engines.d.ts +0 -1
- package/dist/cli/init/engines.js +0 -1
- package/dist/cli/init/gateways.d.ts +0 -1
- package/dist/cli/init/gateways.js +0 -1
- package/dist/cli/init/mcp-config.d.ts +0 -1
- package/dist/cli/init/mcp-config.js +0 -1
- package/dist/cli/init/package.d.ts +0 -1
- package/dist/cli/init/package.js +0 -1
- package/dist/cli/init/scaffold.d.ts +1 -1
- package/dist/cli/init/scaffold.js +2 -2
- package/dist/cli/init/sibling-versions.json +1 -1
- package/dist/cli/init/versions.d.ts +0 -1
- package/dist/cli/init/versions.js +0 -1
- package/dist/cli/init.d.ts +0 -1
- package/dist/cli/init.js +0 -1
- package/dist/cli/mcp.d.ts +9 -2
- package/dist/cli/mcp.js +14 -2
- package/dist/cli/signals.d.ts +0 -1
- package/dist/cli/signals.js +0 -1
- package/dist/cli/skill.d.ts +0 -1
- package/dist/cli/skill.js +0 -1
- package/dist/cli/telemetry.d.ts +0 -1
- package/dist/cli/telemetry.js +1 -2
- package/dist/cli/wordmark.d.ts +0 -1
- package/dist/cli/wordmark.js +0 -1
- package/dist/collect/collect.d.ts +0 -1
- package/dist/collect/collect.js +3 -2
- package/dist/collect/registry.d.ts +6 -3
- package/dist/collect/registry.js +31 -14
- package/dist/collect/select.d.ts +0 -1
- package/dist/collect/select.js +0 -1
- package/dist/config/agent.d.ts +0 -1
- package/dist/config/agent.js +0 -1
- package/dist/config/app.d.ts +0 -1
- package/dist/config/app.js +0 -1
- package/dist/config/command.d.ts +0 -1
- package/dist/config/command.js +0 -1
- package/dist/config/diagnose.d.ts +0 -1
- package/dist/config/diagnose.js +0 -1
- package/dist/config/esm-hooks.d.ts +0 -1
- package/dist/config/esm-hooks.js +0 -1
- package/dist/config/load.d.ts +0 -1
- package/dist/config/load.js +0 -1
- package/dist/config/resolve.d.ts +0 -1
- package/dist/config/resolve.js +0 -1
- package/dist/config/secrets.d.ts +0 -1
- package/dist/config/secrets.js +0 -1
- package/dist/config/targets.d.ts +0 -1
- package/dist/config/targets.js +0 -1
- package/dist/config/validate.d.ts +0 -1
- package/dist/config/validate.js +0 -1
- package/dist/engine/contract.d.ts +0 -1
- package/dist/engine/contract.js +0 -1
- package/dist/engine/index.d.ts +1 -2
- package/dist/engine/index.js +4 -4
- package/dist/engine/manifest.d.ts +0 -1
- package/dist/engine/manifest.js +0 -1
- package/dist/engine/recording.d.ts +0 -1
- package/dist/engine/recording.js +0 -1
- package/dist/engine/resolve.d.ts +0 -1
- package/dist/engine/resolve.js +0 -1
- package/dist/engine/session.d.ts +0 -1
- package/dist/engine/session.js +0 -1
- package/dist/engine/surface.d.ts +0 -1
- package/dist/engine/surface.js +0 -1
- package/dist/engine/timing.d.ts +0 -1
- package/dist/engine/timing.js +0 -1
- package/dist/expect/async.d.ts +0 -1
- package/dist/expect/async.js +99 -58
- package/dist/expect/attempt.d.ts +0 -1
- package/dist/expect/attempt.js +0 -1
- package/dist/expect/index.d.ts +0 -1
- package/dist/expect/index.js +0 -1
- package/dist/expect/poll.d.ts +0 -1
- package/dist/expect/poll.js +0 -1
- package/dist/expect/soft.d.ts +0 -1
- package/dist/expect/soft.js +0 -1
- package/dist/expect/values.d.ts +0 -1
- package/dist/expect/values.js +1 -2
- package/dist/explore/body.d.ts +0 -1
- package/dist/explore/body.js +0 -1
- package/dist/explore/executor.d.ts +0 -1
- package/dist/explore/executor.js +0 -1
- package/dist/explore/index.d.ts +0 -1
- package/dist/explore/index.js +16 -2
- package/dist/explore/plan.d.ts +0 -1
- package/dist/explore/plan.js +0 -1
- package/dist/explore/progress.d.ts +0 -1
- package/dist/explore/progress.js +0 -1
- package/dist/explore/state.d.ts +0 -1
- package/dist/explore/state.js +0 -1
- package/dist/index.d.ts +0 -1
- package/dist/index.js +0 -1
- package/dist/internal/ai-trace.d.ts +0 -1
- package/dist/internal/ai-trace.js +0 -1
- package/dist/internal/atomic-write.d.ts +0 -1
- package/dist/internal/atomic-write.js +0 -1
- package/dist/internal/brands.d.ts +0 -1
- package/dist/internal/brands.js +0 -1
- package/dist/internal/debug.d.ts +0 -1
- package/dist/internal/debug.js +0 -1
- package/dist/internal/env.d.ts +0 -1
- package/dist/internal/env.js +0 -1
- package/dist/internal/errors.d.ts +0 -1
- package/dist/internal/errors.js +0 -1
- package/dist/internal/geometry.d.ts +0 -1
- package/dist/internal/geometry.js +0 -1
- package/dist/internal/git.d.ts +0 -1
- package/dist/internal/git.js +0 -1
- package/dist/internal/globs.d.ts +0 -1
- package/dist/internal/globs.js +0 -1
- package/dist/internal/ids.d.ts +0 -1
- package/dist/internal/ids.js +0 -1
- package/dist/internal/json-value.d.ts +0 -1
- package/dist/internal/json-value.js +0 -1
- package/dist/internal/keys.d.ts +0 -1
- package/dist/internal/keys.js +0 -1
- package/dist/internal/node-version.d.ts +0 -1
- package/dist/internal/node-version.js +0 -1
- package/dist/internal/objects.d.ts +0 -1
- package/dist/internal/objects.js +0 -1
- package/dist/internal/options.d.ts +0 -1
- package/dist/internal/options.js +0 -1
- package/dist/internal/package-manager.d.ts +0 -1
- package/dist/internal/package-manager.js +0 -1
- package/dist/internal/package-version.d.ts +0 -1
- package/dist/internal/package-version.js +0 -1
- package/dist/internal/paths.d.ts +0 -1
- package/dist/internal/paths.js +0 -1
- package/dist/internal/realm-slot.d.ts +0 -1
- package/dist/internal/realm-slot.js +0 -1
- package/dist/internal/recording-modes.d.ts +0 -1
- package/dist/internal/recording-modes.js +0 -1
- package/dist/internal/redact.d.ts +0 -1
- package/dist/internal/redact.js +0 -1
- package/dist/internal/regexp.d.ts +0 -1
- package/dist/internal/regexp.js +0 -1
- package/dist/internal/roles.d.ts +0 -1
- package/dist/internal/roles.js +0 -1
- package/dist/internal/skip.d.ts +0 -1
- package/dist/internal/skip.js +0 -1
- package/dist/internal/source.d.ts +0 -1
- package/dist/internal/source.js +0 -1
- package/dist/internal/standard-schema.d.ts +0 -1
- package/dist/internal/standard-schema.js +0 -1
- package/dist/internal/suggest.d.ts +0 -1
- package/dist/internal/suggest.js +0 -1
- package/dist/internal/text.d.ts +8 -1
- package/dist/internal/text.js +13 -2
- package/dist/internal/time.d.ts +0 -1
- package/dist/internal/time.js +0 -1
- package/dist/internal/urls.d.ts +0 -1
- package/dist/internal/urls.js +0 -1
- package/dist/internal/vcs.d.ts +0 -1
- package/dist/internal/vcs.js +0 -1
- package/dist/internal/zip.d.ts +0 -1
- package/dist/internal/zip.js +0 -1
- package/dist/locator/engine.d.ts +0 -1
- package/dist/locator/engine.js +0 -1
- package/dist/locator/expression.d.ts +0 -1
- package/dist/locator/expression.js +0 -1
- package/dist/locator/screen.d.ts +0 -1
- package/dist/locator/screen.js +0 -1
- package/dist/mcp/catalog.d.ts +4 -1
- package/dist/mcp/catalog.js +2 -3
- package/dist/mcp/config.d.ts +0 -1
- package/dist/mcp/config.js +0 -1
- package/dist/mcp/recording.d.ts +0 -1
- package/dist/mcp/recording.js +0 -1
- package/dist/mcp/server.d.ts +8 -1
- package/dist/mcp/server.js +8 -5
- package/dist/mcp/session.d.ts +4 -2
- package/dist/mcp/session.js +43 -21
- package/dist/mcp/sessions.d.ts +2 -1
- package/dist/mcp/sessions.js +5 -2
- package/dist/mcp/tools.d.ts +7 -6
- package/dist/mcp/tools.js +36 -11
- package/dist/mcp/usage.d.ts +61 -0
- package/dist/mcp/usage.js +73 -0
- package/dist/oauth/callback-server.d.ts +0 -1
- package/dist/oauth/callback-server.js +0 -1
- package/dist/oauth/chatgpt.d.ts +0 -1
- package/dist/oauth/chatgpt.js +0 -1
- package/dist/oauth/cli.d.ts +0 -1
- package/dist/oauth/cli.js +0 -1
- package/dist/oauth/copilot.d.ts +0 -1
- package/dist/oauth/copilot.js +0 -1
- package/dist/oauth/device-code.d.ts +0 -1
- package/dist/oauth/device-code.js +0 -1
- package/dist/oauth/errors.d.ts +0 -1
- package/dist/oauth/errors.js +0 -1
- package/dist/oauth/fetch.d.ts +0 -1
- package/dist/oauth/fetch.js +0 -1
- package/dist/oauth/grok.d.ts +0 -1
- package/dist/oauth/grok.js +0 -1
- package/dist/oauth/jwt.d.ts +0 -1
- package/dist/oauth/jwt.js +0 -1
- package/dist/oauth/login.d.ts +0 -1
- package/dist/oauth/login.js +0 -1
- package/dist/oauth/models.d.ts +0 -1
- package/dist/oauth/models.js +0 -1
- package/dist/oauth/pkce.d.ts +0 -1
- package/dist/oauth/pkce.js +0 -1
- package/dist/oauth/providers/github-copilot.d.ts +0 -1
- package/dist/oauth/providers/github-copilot.js +10 -3
- package/dist/oauth/providers/openai.d.ts +0 -1
- package/dist/oauth/providers/openai.js +1 -2
- package/dist/oauth/providers/xai.d.ts +0 -1
- package/dist/oauth/providers/xai.js +0 -1
- package/dist/oauth/providers.d.ts +0 -1
- package/dist/oauth/providers.js +0 -1
- package/dist/oauth/sse.d.ts +0 -1
- package/dist/oauth/sse.js +0 -1
- package/dist/oauth/store.d.ts +0 -1
- package/dist/oauth/store.js +0 -1
- package/dist/oauth/token-endpoint.d.ts +0 -1
- package/dist/oauth/token-endpoint.js +0 -1
- package/dist/oauth/types.d.ts +0 -1
- package/dist/oauth/types.js +0 -1
- package/dist/params.d.ts +0 -1
- package/dist/params.js +0 -1
- package/dist/report/build.d.ts +0 -1
- package/dist/report/build.js +0 -1
- package/dist/report/builtin.d.ts +0 -1
- package/dist/report/builtin.js +0 -1
- package/dist/report/code-frame.d.ts +0 -1
- package/dist/report/code-frame.js +0 -1
- package/dist/report/debug-steps.d.ts +0 -1
- package/dist/report/debug-steps.js +0 -1
- package/dist/report/explore-text.d.ts +0 -1
- package/dist/report/explore-text.js +0 -1
- package/dist/report/failure-text.d.ts +0 -1
- package/dist/report/failure-text.js +0 -1
- package/dist/report/format.d.ts +0 -1
- package/dist/report/format.js +0 -1
- package/dist/report/json.d.ts +0 -1
- package/dist/report/json.js +0 -1
- package/dist/report/junit.d.ts +0 -1
- package/dist/report/junit.js +0 -1
- package/dist/report/list-explore.d.ts +0 -1
- package/dist/report/list-explore.js +0 -1
- package/dist/report/list-model.d.ts +0 -1
- package/dist/report/list-model.js +0 -1
- package/dist/report/list-steps.d.ts +0 -1
- package/dist/report/list-steps.js +0 -1
- package/dist/report/list.d.ts +0 -1
- package/dist/report/list.js +0 -1
- package/dist/report/live-window.d.ts +0 -1
- package/dist/report/live-window.js +0 -1
- package/dist/report/markdown-text.d.ts +0 -1
- package/dist/report/markdown-text.js +0 -1
- package/dist/report/markdown.d.ts +0 -1
- package/dist/report/markdown.js +0 -1
- package/dist/report/outcome.d.ts +0 -1
- package/dist/report/outcome.js +0 -1
- package/dist/report/repeats.d.ts +0 -1
- package/dist/report/repeats.js +0 -1
- package/dist/report/running-tree.d.ts +0 -1
- package/dist/report/running-tree.js +0 -1
- package/dist/report/write.d.ts +0 -1
- package/dist/report/write.js +0 -1
- package/dist/run/app-ports.d.ts +0 -1
- package/dist/run/app-ports.js +0 -1
- package/dist/run/artifacts.d.ts +0 -1
- package/dist/run/artifacts.js +0 -1
- package/dist/run/budget.d.ts +0 -1
- package/dist/run/budget.js +0 -1
- package/dist/run/declared-processes.d.ts +0 -1
- package/dist/run/declared-processes.js +0 -1
- package/dist/run/events.d.ts +0 -1
- package/dist/run/events.js +0 -1
- package/dist/run/execute.d.ts +0 -1
- package/dist/run/execute.js +27 -13
- package/dist/run/extended-fixtures.d.ts +0 -1
- package/dist/run/extended-fixtures.js +0 -1
- package/dist/run/failure-evidence.d.ts +0 -1
- package/dist/run/failure-evidence.js +0 -1
- package/dist/run/fixture-recording.d.ts +0 -1
- package/dist/run/fixture-recording.js +0 -1
- package/dist/run/fixtures.d.ts +0 -1
- package/dist/run/fixtures.js +0 -1
- package/dist/run/in-process.d.ts +0 -1
- package/dist/run/in-process.js +0 -1
- package/dist/run/last-run.d.ts +0 -1
- package/dist/run/last-run.js +0 -1
- package/dist/run/managed-process.d.ts +0 -1
- package/dist/run/managed-process.js +0 -1
- package/dist/run/output.d.ts +0 -1
- package/dist/run/output.js +0 -1
- package/dist/run/process-pool.d.ts +0 -1
- package/dist/run/process-pool.js +0 -1
- package/dist/run/provision.d.ts +0 -1
- package/dist/run/provision.js +0 -1
- package/dist/run/realm.d.ts +2 -1
- package/dist/run/realm.js +1 -2
- package/dist/run/records.d.ts +0 -1
- package/dist/run/records.js +0 -1
- package/dist/run/retry.d.ts +0 -1
- package/dist/run/retry.js +0 -1
- package/dist/run/runner.d.ts +2 -1
- package/dist/run/runner.js +1 -2
- package/dist/run/scheduler.d.ts +0 -1
- package/dist/run/scheduler.js +0 -1
- package/dist/run/secrecy.d.ts +15 -1
- package/dist/run/secrecy.js +27 -2
- package/dist/run/serial.d.ts +0 -1
- package/dist/run/serial.js +0 -1
- package/dist/run/sessions.d.ts +0 -1
- package/dist/run/sessions.js +0 -1
- package/dist/run/standalone.d.ts +0 -1
- package/dist/run/standalone.js +3 -3
- package/dist/run/steps.d.ts +2 -3
- package/dist/run/steps.js +4 -2
- package/dist/run/trace-redaction.d.ts +0 -1
- package/dist/run/trace-redaction.js +0 -1
- package/dist/run/unit-runner.d.ts +0 -1
- package/dist/run/unit-runner.js +0 -1
- package/dist/run/units.d.ts +0 -1
- package/dist/run/units.js +0 -1
- package/dist/run/worker/entry.d.ts +0 -1
- package/dist/run/worker/entry.js +2 -3
- package/dist/run/worker/handle.d.ts +0 -1
- package/dist/run/worker/handle.js +0 -1
- package/dist/run/worker/protocol.d.ts +0 -1
- package/dist/run/worker/protocol.js +0 -1
- package/dist/run/worker/session.d.ts +0 -1
- package/dist/run/worker/session.js +0 -1
- package/dist/run/worker-models.d.ts +0 -1
- package/dist/run/worker-models.js +0 -1
- package/dist/secrets.d.ts +0 -1
- package/dist/secrets.js +0 -1
- package/dist/telemetry/checkout.d.ts +0 -1
- package/dist/telemetry/checkout.js +0 -1
- package/dist/telemetry/environment.d.ts +0 -1
- package/dist/telemetry/environment.js +0 -1
- package/dist/telemetry/events.d.ts +26 -10
- package/dist/telemetry/events.js +107 -13
- package/dist/telemetry/failure-kind.d.ts +0 -1
- package/dist/telemetry/failure-kind.js +0 -1
- package/dist/telemetry/posthog.d.ts +0 -1
- package/dist/telemetry/posthog.js +0 -1
- package/dist/telemetry/project.d.ts +0 -1
- package/dist/telemetry/project.js +0 -1
- package/dist/telemetry/store.d.ts +0 -1
- package/dist/telemetry/store.js +0 -1
- package/dist/telemetry/telemetry.d.ts +19 -8
- package/dist/telemetry/telemetry.js +26 -9
- package/dist/telemetry/token.d.ts +0 -1
- package/dist/telemetry/token.js +0 -1
- package/dist/types.d.ts +26 -24
- package/dist/types.js +0 -1
- package/docs/agent-steps.mdx +126 -0
- package/docs/agents.mdx +217 -0
- package/docs/api-testing.mdx +65 -0
- package/docs/authentication.mdx +345 -0
- package/docs/browser.mdx +440 -0
- package/docs/bug-bash.mdx +90 -0
- package/docs/cache.mdx +306 -0
- package/docs/ci.mdx +210 -0
- package/docs/coding-agents.mdx +183 -0
- package/docs/debugging.mdx +291 -0
- package/docs/executors.mdx +243 -0
- package/docs/explore.mdx +174 -0
- package/docs/github.mdx +184 -0
- package/docs/index.mdx +82 -0
- package/docs/integrations/eas.mdx +216 -0
- package/docs/integrations/index.mdx +24 -0
- package/docs/integrations/kernel.mdx +163 -0
- package/docs/migrate/cypress.mdx +124 -0
- package/docs/migrate/detox.mdx +140 -0
- package/docs/migrate/maestro.mdx +229 -0
- package/docs/migrate/playwright.mdx +430 -0
- package/docs/migrate/selenium.mdx +110 -0
- package/docs/mobile-ci.mdx +567 -0
- package/docs/mobile.mdx +595 -0
- package/docs/models.mdx +241 -0
- package/docs/quickstart.mdx +260 -0
- package/docs/reference/agent.mdx +524 -0
- package/docs/reference/app.mdx +72 -0
- package/docs/reference/cli.mdx +819 -0
- package/docs/reference/config.mdx +986 -0
- package/docs/reference/engine.mdx +1363 -0
- package/docs/reference/environment.mdx +113 -0
- package/docs/reference/errors.mdx +143 -0
- package/docs/reference/expect.mdx +546 -0
- package/docs/reference/mcp.mdx +205 -0
- package/docs/reference/mobile.mdx +522 -0
- package/docs/reference/reporters.mdx +216 -0
- package/docs/reference/screen.mdx +688 -0
- package/docs/reference/test.mdx +449 -0
- package/docs/reference/web.mdx +615 -0
- package/docs/security.mdx +308 -0
- package/docs/starting-your-app.mdx +231 -0
- package/docs/subscriptions.mdx +166 -0
- package/docs/telemetry.mdx +227 -0
- package/docs/tools.mdx +150 -0
- package/docs/viewports.mdx +146 -0
- package/docs/writing-an-engine.mdx +316 -0
- package/docs/writing-tests.mdx +256 -0
- package/package.json +5 -3
- package/skills/e2e/SKILL.md +4 -1
- package/skills/e2e/references/agent.md +3 -1
- package/skills/e2e/references/mcp.md +3 -0
- package/skills/e2e/references/setup.md +19 -4
- package/skills/e2e/references/writing-tests.md +11 -0
- package/dist/agent/act-validation.d.ts.map +0 -1
- package/dist/agent/act-validation.js.map +0 -1
- package/dist/agent/act.d.ts.map +0 -1
- package/dist/agent/act.js.map +0 -1
- package/dist/agent/action-dispatcher.d.ts.map +0 -1
- package/dist/agent/action-dispatcher.js.map +0 -1
- package/dist/agent/action-names.d.ts.map +0 -1
- package/dist/agent/action-names.js.map +0 -1
- package/dist/agent/actions.d.ts.map +0 -1
- package/dist/agent/actions.js.map +0 -1
- package/dist/agent/agent-brand.d.ts.map +0 -1
- package/dist/agent/agent-brand.js.map +0 -1
- package/dist/agent/ai-sdk.d.ts.map +0 -1
- package/dist/agent/ai-sdk.js.map +0 -1
- package/dist/agent/call-options.d.ts.map +0 -1
- package/dist/agent/call-options.js.map +0 -1
- package/dist/agent/default-agent.d.ts.map +0 -1
- package/dist/agent/default-agent.js.map +0 -1
- package/dist/agent/derived.d.ts.map +0 -1
- package/dist/agent/derived.js.map +0 -1
- package/dist/agent/error.d.ts.map +0 -1
- package/dist/agent/error.js.map +0 -1
- package/dist/agent/executor.d.ts.map +0 -1
- package/dist/agent/executor.js.map +0 -1
- package/dist/agent/index.d.ts.map +0 -1
- package/dist/agent/index.js.map +0 -1
- package/dist/agent/interactive-step.d.ts.map +0 -1
- package/dist/agent/interactive-step.js.map +0 -1
- package/dist/agent/invocation.d.ts.map +0 -1
- package/dist/agent/invocation.js.map +0 -1
- package/dist/agent/ledger.d.ts.map +0 -1
- package/dist/agent/ledger.js.map +0 -1
- package/dist/agent/loop-guards.d.ts.map +0 -1
- package/dist/agent/loop-guards.js.map +0 -1
- package/dist/agent/model/adapter.d.ts.map +0 -1
- package/dist/agent/model/adapter.js.map +0 -1
- package/dist/agent/model/overflow.d.ts.map +0 -1
- package/dist/agent/model/overflow.js.map +0 -1
- package/dist/agent/model/provider-hints.d.ts.map +0 -1
- package/dist/agent/model/provider-hints.js.map +0 -1
- package/dist/agent/model/schema.d.ts.map +0 -1
- package/dist/agent/model/schema.js.map +0 -1
- package/dist/agent/model/sdk.d.ts.map +0 -1
- package/dist/agent/model/sdk.js.map +0 -1
- package/dist/agent/model/stall.d.ts.map +0 -1
- package/dist/agent/model/stall.js.map +0 -1
- package/dist/agent/model/tool-choice.d.ts.map +0 -1
- package/dist/agent/model/tool-choice.js.map +0 -1
- package/dist/agent/observation-budget.d.ts.map +0 -1
- package/dist/agent/observation-budget.js.map +0 -1
- package/dist/agent/observation-feed.d.ts.map +0 -1
- package/dist/agent/observation-feed.js.map +0 -1
- package/dist/agent/observation.d.ts.map +0 -1
- package/dist/agent/observation.js.map +0 -1
- package/dist/agent/operation-queue.d.ts.map +0 -1
- package/dist/agent/operation-queue.js.map +0 -1
- package/dist/agent/phases.d.ts.map +0 -1
- package/dist/agent/phases.js.map +0 -1
- package/dist/agent/pixels.d.ts.map +0 -1
- package/dist/agent/pixels.js.map +0 -1
- package/dist/agent/point-tap.d.ts.map +0 -1
- package/dist/agent/point-tap.js.map +0 -1
- package/dist/agent/primitives.d.ts.map +0 -1
- package/dist/agent/primitives.js.map +0 -1
- package/dist/agent/prompts.d.ts.map +0 -1
- package/dist/agent/prompts.js.map +0 -1
- package/dist/agent/protocol.d.ts.map +0 -1
- package/dist/agent/protocol.js.map +0 -1
- package/dist/agent/public.d.ts.map +0 -1
- package/dist/agent/public.js.map +0 -1
- package/dist/agent/reading.d.ts.map +0 -1
- package/dist/agent/reading.js.map +0 -1
- package/dist/agent/replay.d.ts.map +0 -1
- package/dist/agent/replay.js.map +0 -1
- package/dist/agent/screen-update.d.ts.map +0 -1
- package/dist/agent/screen-update.js.map +0 -1
- package/dist/agent/scroll-target.d.ts.map +0 -1
- package/dist/agent/scroll-target.js.map +0 -1
- package/dist/agent/secrets.d.ts.map +0 -1
- package/dist/agent/secrets.js.map +0 -1
- package/dist/agent/settle-policy.d.ts.map +0 -1
- package/dist/agent/settle-policy.js.map +0 -1
- package/dist/agent/step-accounting.d.ts.map +0 -1
- package/dist/agent/step-accounting.js.map +0 -1
- package/dist/agent/step-cache.d.ts.map +0 -1
- package/dist/agent/step-cache.js.map +0 -1
- package/dist/agent/tool-loop.d.ts.map +0 -1
- package/dist/agent/tool-loop.js.map +0 -1
- package/dist/agent/tool-output.d.ts.map +0 -1
- package/dist/agent/tool-output.js.map +0 -1
- package/dist/agent/tool.d.ts.map +0 -1
- package/dist/agent/tool.js.map +0 -1
- package/dist/agent/transcript-compaction.d.ts.map +0 -1
- package/dist/agent/transcript-compaction.js.map +0 -1
- package/dist/agent/upload-paths.d.ts.map +0 -1
- package/dist/agent/upload-paths.js.map +0 -1
- package/dist/agent/usage.d.ts.map +0 -1
- package/dist/agent/usage.js.map +0 -1
- package/dist/cache/anchors.d.ts.map +0 -1
- package/dist/cache/anchors.js.map +0 -1
- package/dist/cache/context.d.ts.map +0 -1
- package/dist/cache/context.js.map +0 -1
- package/dist/cache/decide.d.ts.map +0 -1
- package/dist/cache/decide.js.map +0 -1
- package/dist/cache/identity.d.ts.map +0 -1
- package/dist/cache/identity.js.map +0 -1
- package/dist/cache/recorder.d.ts.map +0 -1
- package/dist/cache/recorder.js.map +0 -1
- package/dist/cache/relocate.d.ts.map +0 -1
- package/dist/cache/relocate.js.map +0 -1
- package/dist/cache/route.d.ts.map +0 -1
- package/dist/cache/route.js.map +0 -1
- package/dist/cache/store.d.ts.map +0 -1
- package/dist/cache/store.js.map +0 -1
- package/dist/cache/template.d.ts.map +0 -1
- package/dist/cache/template.js.map +0 -1
- package/dist/cache/trace.d.ts.map +0 -1
- package/dist/cache/trace.js.map +0 -1
- package/dist/cli/bin.d.ts.map +0 -1
- package/dist/cli/bin.js.map +0 -1
- package/dist/cli/cache.d.ts.map +0 -1
- package/dist/cli/cache.js.map +0 -1
- package/dist/cli/docs-url.d.ts.map +0 -1
- package/dist/cli/docs-url.js.map +0 -1
- package/dist/cli/feedback.d.ts.map +0 -1
- package/dist/cli/feedback.js.map +0 -1
- package/dist/cli/guide.d.ts.map +0 -1
- package/dist/cli/guide.js.map +0 -1
- package/dist/cli/index.d.ts.map +0 -1
- package/dist/cli/index.js.map +0 -1
- package/dist/cli/init/agent-skill.d.ts.map +0 -1
- package/dist/cli/init/agent-skill.js.map +0 -1
- package/dist/cli/init/engines.d.ts.map +0 -1
- package/dist/cli/init/engines.js.map +0 -1
- package/dist/cli/init/gateways.d.ts.map +0 -1
- package/dist/cli/init/gateways.js.map +0 -1
- package/dist/cli/init/mcp-config.d.ts.map +0 -1
- package/dist/cli/init/mcp-config.js.map +0 -1
- package/dist/cli/init/package.d.ts.map +0 -1
- package/dist/cli/init/package.js.map +0 -1
- package/dist/cli/init/scaffold.d.ts.map +0 -1
- package/dist/cli/init/scaffold.js.map +0 -1
- package/dist/cli/init/versions.d.ts.map +0 -1
- package/dist/cli/init/versions.js.map +0 -1
- package/dist/cli/init.d.ts.map +0 -1
- package/dist/cli/init.js.map +0 -1
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js.map +0 -1
- package/dist/cli/signals.d.ts.map +0 -1
- package/dist/cli/signals.js.map +0 -1
- package/dist/cli/skill.d.ts.map +0 -1
- package/dist/cli/skill.js.map +0 -1
- package/dist/cli/telemetry.d.ts.map +0 -1
- package/dist/cli/telemetry.js.map +0 -1
- package/dist/cli/wordmark.d.ts.map +0 -1
- package/dist/cli/wordmark.js.map +0 -1
- package/dist/collect/collect.d.ts.map +0 -1
- package/dist/collect/collect.js.map +0 -1
- package/dist/collect/registry.d.ts.map +0 -1
- package/dist/collect/registry.js.map +0 -1
- package/dist/collect/select.d.ts.map +0 -1
- package/dist/collect/select.js.map +0 -1
- package/dist/config/agent.d.ts.map +0 -1
- package/dist/config/agent.js.map +0 -1
- package/dist/config/app.d.ts.map +0 -1
- package/dist/config/app.js.map +0 -1
- package/dist/config/command.d.ts.map +0 -1
- package/dist/config/command.js.map +0 -1
- package/dist/config/diagnose.d.ts.map +0 -1
- package/dist/config/diagnose.js.map +0 -1
- package/dist/config/esm-hooks.d.ts.map +0 -1
- package/dist/config/esm-hooks.js.map +0 -1
- package/dist/config/load.d.ts.map +0 -1
- package/dist/config/load.js.map +0 -1
- package/dist/config/resolve.d.ts.map +0 -1
- package/dist/config/resolve.js.map +0 -1
- package/dist/config/secrets.d.ts.map +0 -1
- package/dist/config/secrets.js.map +0 -1
- package/dist/config/targets.d.ts.map +0 -1
- package/dist/config/targets.js.map +0 -1
- package/dist/config/validate.d.ts.map +0 -1
- package/dist/config/validate.js.map +0 -1
- package/dist/engine/contract.d.ts.map +0 -1
- package/dist/engine/contract.js.map +0 -1
- package/dist/engine/index.d.ts.map +0 -1
- package/dist/engine/index.js.map +0 -1
- package/dist/engine/manifest.d.ts.map +0 -1
- package/dist/engine/manifest.js.map +0 -1
- package/dist/engine/recording.d.ts.map +0 -1
- package/dist/engine/recording.js.map +0 -1
- package/dist/engine/resolve.d.ts.map +0 -1
- package/dist/engine/resolve.js.map +0 -1
- package/dist/engine/session.d.ts.map +0 -1
- package/dist/engine/session.js.map +0 -1
- package/dist/engine/surface.d.ts.map +0 -1
- package/dist/engine/surface.js.map +0 -1
- package/dist/engine/timing.d.ts.map +0 -1
- package/dist/engine/timing.js.map +0 -1
- package/dist/expect/async.d.ts.map +0 -1
- package/dist/expect/async.js.map +0 -1
- package/dist/expect/attempt.d.ts.map +0 -1
- package/dist/expect/attempt.js.map +0 -1
- package/dist/expect/index.d.ts.map +0 -1
- package/dist/expect/index.js.map +0 -1
- package/dist/expect/poll.d.ts.map +0 -1
- package/dist/expect/poll.js.map +0 -1
- package/dist/expect/soft.d.ts.map +0 -1
- package/dist/expect/soft.js.map +0 -1
- package/dist/expect/values.d.ts.map +0 -1
- package/dist/expect/values.js.map +0 -1
- package/dist/explore/body.d.ts.map +0 -1
- package/dist/explore/body.js.map +0 -1
- package/dist/explore/executor.d.ts.map +0 -1
- package/dist/explore/executor.js.map +0 -1
- package/dist/explore/index.d.ts.map +0 -1
- package/dist/explore/index.js.map +0 -1
- package/dist/explore/plan.d.ts.map +0 -1
- package/dist/explore/plan.js.map +0 -1
- package/dist/explore/progress.d.ts.map +0 -1
- package/dist/explore/progress.js.map +0 -1
- package/dist/explore/state.d.ts.map +0 -1
- package/dist/explore/state.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/internal/ai-trace.d.ts.map +0 -1
- package/dist/internal/ai-trace.js.map +0 -1
- package/dist/internal/atomic-write.d.ts.map +0 -1
- package/dist/internal/atomic-write.js.map +0 -1
- package/dist/internal/brands.d.ts.map +0 -1
- package/dist/internal/brands.js.map +0 -1
- package/dist/internal/debug.d.ts.map +0 -1
- package/dist/internal/debug.js.map +0 -1
- package/dist/internal/env.d.ts.map +0 -1
- package/dist/internal/env.js.map +0 -1
- package/dist/internal/errors.d.ts.map +0 -1
- package/dist/internal/errors.js.map +0 -1
- package/dist/internal/geometry.d.ts.map +0 -1
- package/dist/internal/geometry.js.map +0 -1
- package/dist/internal/git.d.ts.map +0 -1
- package/dist/internal/git.js.map +0 -1
- package/dist/internal/globs.d.ts.map +0 -1
- package/dist/internal/globs.js.map +0 -1
- package/dist/internal/ids.d.ts.map +0 -1
- package/dist/internal/ids.js.map +0 -1
- package/dist/internal/json-value.d.ts.map +0 -1
- package/dist/internal/json-value.js.map +0 -1
- package/dist/internal/keys.d.ts.map +0 -1
- package/dist/internal/keys.js.map +0 -1
- package/dist/internal/node-version.d.ts.map +0 -1
- package/dist/internal/node-version.js.map +0 -1
- package/dist/internal/objects.d.ts.map +0 -1
- package/dist/internal/objects.js.map +0 -1
- package/dist/internal/options.d.ts.map +0 -1
- package/dist/internal/options.js.map +0 -1
- package/dist/internal/package-manager.d.ts.map +0 -1
- package/dist/internal/package-manager.js.map +0 -1
- package/dist/internal/package-version.d.ts.map +0 -1
- package/dist/internal/package-version.js.map +0 -1
- package/dist/internal/paths.d.ts.map +0 -1
- package/dist/internal/paths.js.map +0 -1
- package/dist/internal/realm-slot.d.ts.map +0 -1
- package/dist/internal/realm-slot.js.map +0 -1
- package/dist/internal/recording-modes.d.ts.map +0 -1
- package/dist/internal/recording-modes.js.map +0 -1
- package/dist/internal/redact.d.ts.map +0 -1
- package/dist/internal/redact.js.map +0 -1
- package/dist/internal/regexp.d.ts.map +0 -1
- package/dist/internal/regexp.js.map +0 -1
- package/dist/internal/roles.d.ts.map +0 -1
- package/dist/internal/roles.js.map +0 -1
- package/dist/internal/skip.d.ts.map +0 -1
- package/dist/internal/skip.js.map +0 -1
- package/dist/internal/source.d.ts.map +0 -1
- package/dist/internal/source.js.map +0 -1
- package/dist/internal/standard-schema.d.ts.map +0 -1
- package/dist/internal/standard-schema.js.map +0 -1
- package/dist/internal/suggest.d.ts.map +0 -1
- package/dist/internal/suggest.js.map +0 -1
- package/dist/internal/text.d.ts.map +0 -1
- package/dist/internal/text.js.map +0 -1
- package/dist/internal/time.d.ts.map +0 -1
- package/dist/internal/time.js.map +0 -1
- package/dist/internal/urls.d.ts.map +0 -1
- package/dist/internal/urls.js.map +0 -1
- package/dist/internal/vcs.d.ts.map +0 -1
- package/dist/internal/vcs.js.map +0 -1
- package/dist/internal/zip.d.ts.map +0 -1
- package/dist/internal/zip.js.map +0 -1
- package/dist/locator/engine.d.ts.map +0 -1
- package/dist/locator/engine.js.map +0 -1
- package/dist/locator/expression.d.ts.map +0 -1
- package/dist/locator/expression.js.map +0 -1
- package/dist/locator/screen.d.ts.map +0 -1
- package/dist/locator/screen.js.map +0 -1
- package/dist/mcp/catalog.d.ts.map +0 -1
- package/dist/mcp/catalog.js.map +0 -1
- package/dist/mcp/config.d.ts.map +0 -1
- package/dist/mcp/config.js.map +0 -1
- package/dist/mcp/recording.d.ts.map +0 -1
- package/dist/mcp/recording.js.map +0 -1
- package/dist/mcp/server.d.ts.map +0 -1
- package/dist/mcp/server.js.map +0 -1
- package/dist/mcp/session.d.ts.map +0 -1
- package/dist/mcp/session.js.map +0 -1
- package/dist/mcp/sessions.d.ts.map +0 -1
- package/dist/mcp/sessions.js.map +0 -1
- package/dist/mcp/tools.d.ts.map +0 -1
- package/dist/mcp/tools.js.map +0 -1
- package/dist/oauth/callback-server.d.ts.map +0 -1
- package/dist/oauth/callback-server.js.map +0 -1
- package/dist/oauth/chatgpt.d.ts.map +0 -1
- package/dist/oauth/chatgpt.js.map +0 -1
- package/dist/oauth/cli.d.ts.map +0 -1
- package/dist/oauth/cli.js.map +0 -1
- package/dist/oauth/copilot.d.ts.map +0 -1
- package/dist/oauth/copilot.js.map +0 -1
- package/dist/oauth/device-code.d.ts.map +0 -1
- package/dist/oauth/device-code.js.map +0 -1
- package/dist/oauth/errors.d.ts.map +0 -1
- package/dist/oauth/errors.js.map +0 -1
- package/dist/oauth/fetch.d.ts.map +0 -1
- package/dist/oauth/fetch.js.map +0 -1
- package/dist/oauth/grok.d.ts.map +0 -1
- package/dist/oauth/grok.js.map +0 -1
- package/dist/oauth/jwt.d.ts.map +0 -1
- package/dist/oauth/jwt.js.map +0 -1
- package/dist/oauth/login.d.ts.map +0 -1
- package/dist/oauth/login.js.map +0 -1
- package/dist/oauth/models.d.ts.map +0 -1
- package/dist/oauth/models.js.map +0 -1
- package/dist/oauth/pkce.d.ts.map +0 -1
- package/dist/oauth/pkce.js.map +0 -1
- package/dist/oauth/providers/github-copilot.d.ts.map +0 -1
- package/dist/oauth/providers/github-copilot.js.map +0 -1
- package/dist/oauth/providers/openai.d.ts.map +0 -1
- package/dist/oauth/providers/openai.js.map +0 -1
- package/dist/oauth/providers/xai.d.ts.map +0 -1
- package/dist/oauth/providers/xai.js.map +0 -1
- package/dist/oauth/providers.d.ts.map +0 -1
- package/dist/oauth/providers.js.map +0 -1
- package/dist/oauth/sse.d.ts.map +0 -1
- package/dist/oauth/sse.js.map +0 -1
- package/dist/oauth/store.d.ts.map +0 -1
- package/dist/oauth/store.js.map +0 -1
- package/dist/oauth/token-endpoint.d.ts.map +0 -1
- package/dist/oauth/token-endpoint.js.map +0 -1
- package/dist/oauth/types.d.ts.map +0 -1
- package/dist/oauth/types.js.map +0 -1
- package/dist/params.d.ts.map +0 -1
- package/dist/params.js.map +0 -1
- package/dist/report/build.d.ts.map +0 -1
- package/dist/report/build.js.map +0 -1
- package/dist/report/builtin.d.ts.map +0 -1
- package/dist/report/builtin.js.map +0 -1
- package/dist/report/code-frame.d.ts.map +0 -1
- package/dist/report/code-frame.js.map +0 -1
- package/dist/report/debug-steps.d.ts.map +0 -1
- package/dist/report/debug-steps.js.map +0 -1
- package/dist/report/explore-text.d.ts.map +0 -1
- package/dist/report/explore-text.js.map +0 -1
- package/dist/report/failure-text.d.ts.map +0 -1
- package/dist/report/failure-text.js.map +0 -1
- package/dist/report/format.d.ts.map +0 -1
- package/dist/report/format.js.map +0 -1
- package/dist/report/json.d.ts.map +0 -1
- package/dist/report/json.js.map +0 -1
- package/dist/report/junit.d.ts.map +0 -1
- package/dist/report/junit.js.map +0 -1
- package/dist/report/list-explore.d.ts.map +0 -1
- package/dist/report/list-explore.js.map +0 -1
- package/dist/report/list-model.d.ts.map +0 -1
- package/dist/report/list-model.js.map +0 -1
- package/dist/report/list-steps.d.ts.map +0 -1
- package/dist/report/list-steps.js.map +0 -1
- package/dist/report/list.d.ts.map +0 -1
- package/dist/report/list.js.map +0 -1
- package/dist/report/live-window.d.ts.map +0 -1
- package/dist/report/live-window.js.map +0 -1
- package/dist/report/markdown-text.d.ts.map +0 -1
- package/dist/report/markdown-text.js.map +0 -1
- package/dist/report/markdown.d.ts.map +0 -1
- package/dist/report/markdown.js.map +0 -1
- package/dist/report/outcome.d.ts.map +0 -1
- package/dist/report/outcome.js.map +0 -1
- package/dist/report/repeats.d.ts.map +0 -1
- package/dist/report/repeats.js.map +0 -1
- package/dist/report/running-tree.d.ts.map +0 -1
- package/dist/report/running-tree.js.map +0 -1
- package/dist/report/write.d.ts.map +0 -1
- package/dist/report/write.js.map +0 -1
- package/dist/run/app-ports.d.ts.map +0 -1
- package/dist/run/app-ports.js.map +0 -1
- package/dist/run/artifacts.d.ts.map +0 -1
- package/dist/run/artifacts.js.map +0 -1
- package/dist/run/budget.d.ts.map +0 -1
- package/dist/run/budget.js.map +0 -1
- package/dist/run/declared-processes.d.ts.map +0 -1
- package/dist/run/declared-processes.js.map +0 -1
- package/dist/run/events.d.ts.map +0 -1
- package/dist/run/events.js.map +0 -1
- package/dist/run/execute.d.ts.map +0 -1
- package/dist/run/execute.js.map +0 -1
- package/dist/run/extended-fixtures.d.ts.map +0 -1
- package/dist/run/extended-fixtures.js.map +0 -1
- package/dist/run/failure-evidence.d.ts.map +0 -1
- package/dist/run/failure-evidence.js.map +0 -1
- package/dist/run/fixture-recording.d.ts.map +0 -1
- package/dist/run/fixture-recording.js.map +0 -1
- package/dist/run/fixtures.d.ts.map +0 -1
- package/dist/run/fixtures.js.map +0 -1
- package/dist/run/in-process.d.ts.map +0 -1
- package/dist/run/in-process.js.map +0 -1
- package/dist/run/last-run.d.ts.map +0 -1
- package/dist/run/last-run.js.map +0 -1
- package/dist/run/managed-process.d.ts.map +0 -1
- package/dist/run/managed-process.js.map +0 -1
- package/dist/run/output.d.ts.map +0 -1
- package/dist/run/output.js.map +0 -1
- package/dist/run/process-pool.d.ts.map +0 -1
- package/dist/run/process-pool.js.map +0 -1
- package/dist/run/provision.d.ts.map +0 -1
- package/dist/run/provision.js.map +0 -1
- package/dist/run/realm.d.ts.map +0 -1
- package/dist/run/realm.js.map +0 -1
- package/dist/run/records.d.ts.map +0 -1
- package/dist/run/records.js.map +0 -1
- package/dist/run/retry.d.ts.map +0 -1
- package/dist/run/retry.js.map +0 -1
- package/dist/run/runner.d.ts.map +0 -1
- package/dist/run/runner.js.map +0 -1
- package/dist/run/scheduler.d.ts.map +0 -1
- package/dist/run/scheduler.js.map +0 -1
- package/dist/run/secrecy.d.ts.map +0 -1
- package/dist/run/secrecy.js.map +0 -1
- package/dist/run/serial.d.ts.map +0 -1
- package/dist/run/serial.js.map +0 -1
- package/dist/run/sessions.d.ts.map +0 -1
- package/dist/run/sessions.js.map +0 -1
- package/dist/run/standalone.d.ts.map +0 -1
- package/dist/run/standalone.js.map +0 -1
- package/dist/run/steps.d.ts.map +0 -1
- package/dist/run/steps.js.map +0 -1
- package/dist/run/trace-redaction.d.ts.map +0 -1
- package/dist/run/trace-redaction.js.map +0 -1
- package/dist/run/unit-runner.d.ts.map +0 -1
- package/dist/run/unit-runner.js.map +0 -1
- package/dist/run/units.d.ts.map +0 -1
- package/dist/run/units.js.map +0 -1
- package/dist/run/worker/entry.d.ts.map +0 -1
- package/dist/run/worker/entry.js.map +0 -1
- package/dist/run/worker/handle.d.ts.map +0 -1
- package/dist/run/worker/handle.js.map +0 -1
- package/dist/run/worker/protocol.d.ts.map +0 -1
- package/dist/run/worker/protocol.js.map +0 -1
- package/dist/run/worker/session.d.ts.map +0 -1
- package/dist/run/worker/session.js.map +0 -1
- package/dist/run/worker-models.d.ts.map +0 -1
- package/dist/run/worker-models.js.map +0 -1
- package/dist/secrets.d.ts.map +0 -1
- package/dist/secrets.js.map +0 -1
- package/dist/telemetry/checkout.d.ts.map +0 -1
- package/dist/telemetry/checkout.js.map +0 -1
- package/dist/telemetry/environment.d.ts.map +0 -1
- package/dist/telemetry/environment.js.map +0 -1
- package/dist/telemetry/events.d.ts.map +0 -1
- package/dist/telemetry/events.js.map +0 -1
- package/dist/telemetry/failure-kind.d.ts.map +0 -1
- package/dist/telemetry/failure-kind.js.map +0 -1
- package/dist/telemetry/posthog.d.ts.map +0 -1
- package/dist/telemetry/posthog.js.map +0 -1
- package/dist/telemetry/project.d.ts.map +0 -1
- package/dist/telemetry/project.js.map +0 -1
- package/dist/telemetry/store.d.ts.map +0 -1
- package/dist/telemetry/store.js.map +0 -1
- package/dist/telemetry/telemetry.d.ts.map +0 -1
- package/dist/telemetry/telemetry.js.map +0 -1
- package/dist/telemetry/token.d.ts.map +0 -1
- package/dist/telemetry/token.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Debugging a run
|
|
3
|
+
description: Read the report, open the evidence, watch the browser, and see what the model was sent.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Start with the failure in the terminal. Every run also writes
|
|
7
|
+
`.e2e/report.json`, with links to the screenshots, traces, downloads, and
|
|
8
|
+
recordings captured by the selected engine.
|
|
9
|
+
|
|
10
|
+
## Read the failure
|
|
11
|
+
|
|
12
|
+
The `list` reporter's `Failed Tests` section shows the error, failing line,
|
|
13
|
+
and screen at failure. For a failed locator, it also lists nearby matches
|
|
14
|
+
that may explain the problem. The exit code identifies the failure type:
|
|
15
|
+
|
|
16
|
+
| Exit | Meaning | Retry the job? |
|
|
17
|
+
| ---: | --- | --- |
|
|
18
|
+
| 1 | A test failed | Only if the test is flaky |
|
|
19
|
+
| 2 | Configuration, collection, or policy | Fix the reported problem first |
|
|
20
|
+
| 3 | Engine, app process, model provider, or artifact failure | If the cause is temporary |
|
|
21
|
+
| 4 | An internal runner error | Report it |
|
|
22
|
+
| 130 | The run was interrupted | |
|
|
23
|
+
|
|
24
|
+
## The failure pages
|
|
25
|
+
|
|
26
|
+
Use `--reporter list,markdown` to write `.e2e/summary.md` and a page for each
|
|
27
|
+
failed or flaky test under `.e2e/failures/`. A failure page includes the
|
|
28
|
+
source line, steps, recent model turns, and screen text:
|
|
29
|
+
|
|
30
|
+
````markdown
|
|
31
|
+
# ✗ todos › archives a todo
|
|
32
|
+
|
|
33
|
+
`tests/todos.e2e.ts` · failed · 16.2s
|
|
34
|
+
|
|
35
|
+
**ASSERTION_FAILED**
|
|
36
|
+
|
|
37
|
+
```text
|
|
38
|
+
agent.act failed: the todo exposes only a "Delete" button; no "Archive" button is present.
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
Look at: `tests/todos.e2e.ts:8`
|
|
42
|
+
Failed the same way on both attempts: **ASSERTION_FAILED** at step 2.
|
|
43
|
+
|
|
44
|
+
## Steps
|
|
45
|
+
1. ✓ `app.open` "/todos" (35ms) — `tests/todos.e2e.ts:4`
|
|
46
|
+
2. ✗ `agent.act` "Archive the todo" (16.1s, 6 model calls) — **ASSERTION_FAILED** — `tests/todos.e2e.ts:8`
|
|
47
|
+
|
|
48
|
+
## Agent turns of step 2
|
|
49
|
+
**Turn 2** `tap({"target":"n19"})`
|
|
50
|
+
> Tapped #n19.
|
|
51
|
+
> Screen changes since revision b4 (now revision b6, path /todos, 29 nodes): 4 added, 2 changed.
|
|
52
|
+
> added #n29 button "Delete Groceries"
|
|
53
|
+
|
|
54
|
+
## Screen at failure
|
|
55
|
+
URL: `http://127.0.0.1:3000/todos`
|
|
56
|
+
```text
|
|
57
|
+
#n18 textbox "New todo"
|
|
58
|
+
#n19 button "Add"
|
|
59
|
+
#n34 listitem "Groceries" testid="todo"
|
|
60
|
+
#n37 button "Delete Groceries"
|
|
61
|
+
```
|
|
62
|
+
````
|
|
63
|
+
|
|
64
|
+
`Look at` points to the failing call. Assertion failures include expected
|
|
65
|
+
and observed values; locator failures include the requested locator and
|
|
66
|
+
nearby matches. Repeated failure details help you compare attempts.
|
|
67
|
+
|
|
68
|
+
## The report
|
|
69
|
+
|
|
70
|
+
Use `.e2e/report.json` for scripts and integrations. `--reporter json` prints
|
|
71
|
+
the same document to stdout:
|
|
72
|
+
|
|
73
|
+
```bash
|
|
74
|
+
jq '.run | {status, exitCode, errors}' .e2e/report.json
|
|
75
|
+
jq '.run.results[] | select(.status != "passed") | {titlePath, file, status}' .e2e/report.json
|
|
76
|
+
jq '.run.results[] | select(.status != "passed") | .attempts[-1]
|
|
77
|
+
| {status, error, failure, steps: [.steps[] | select(.status != "passed") | {api, label, source, status, error}], artifacts}' .e2e/report.json
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Check `run.errors` for run-level failures, then the last attempt of each
|
|
81
|
+
failed result:
|
|
82
|
+
|
|
83
|
+
- `error` contains the code, message, source line, and assertion details.
|
|
84
|
+
- `failure` identifies the screen and screenshot artifacts and any locator
|
|
85
|
+
candidates.
|
|
86
|
+
- `steps` shows the calls leading to the failure. Failed agent steps include
|
|
87
|
+
recent model turns.
|
|
88
|
+
- `artifacts` lists the captured files.
|
|
89
|
+
|
|
90
|
+
## Artifacts
|
|
91
|
+
|
|
92
|
+
Artifacts land under `.e2e/artifacts/` (`<output>/artifacts/` when the
|
|
93
|
+
[`output`](/reference/config#output) is moved), one directory per attempt.
|
|
94
|
+
Each run empties it first, so it holds the latest run's evidence:
|
|
95
|
+
|
|
96
|
+
- **Screenshots.** Failed attempts capture one whenever the engine can and
|
|
97
|
+
pixels are allowed. The built-in `agent.assert` also captures one after
|
|
98
|
+
either verdict unless `screenshot: false` disables it. Capture can fail or
|
|
99
|
+
be withheld. Use `app.screenshot('label')` to capture one explicitly.
|
|
100
|
+
- **Playwright traces** on the attempts the [`trace`](/reference/config#trace)
|
|
101
|
+
mode records: every attempt locally, the first retry in CI. Open one with
|
|
102
|
+
`npx playwright show-trace <file>`; `--trace off` skips the cost for one
|
|
103
|
+
run, `--trace` records every attempt of a CI run.
|
|
104
|
+
- **Downloads** saved through `browser.waitForDownload`, recorded with kind
|
|
105
|
+
`download`. They are the app's bytes: `redaction: "incomplete"` unless a
|
|
106
|
+
secret reached the session (filled, or held by the engine for basic auth)
|
|
107
|
+
and the file is text, which the runner rewrites and marks `complete`.
|
|
108
|
+
- **Videos** and **agent transcripts** when you ask for them; see below.
|
|
109
|
+
|
|
110
|
+
After a secret fill, no screenshots are taken for the rest of the attempt; see
|
|
111
|
+
[screenshots after a secret fill](/security#screenshots-after-a-secret-fill).
|
|
112
|
+
|
|
113
|
+
Playwright traces and videos need separate care. Trace redaction replaces
|
|
114
|
+
secret text with `<secret:name>` and drops the trace's screencast frames, so
|
|
115
|
+
the viewer shows actions, DOM snapshots, and network, but no filmstrip. An
|
|
116
|
+
image the app served itself stays, even one that draws the secret. Videos
|
|
117
|
+
mask nothing and are marked `redaction: "incomplete"`.
|
|
118
|
+
|
|
119
|
+
If trace rewriting fails, the runner deletes the trace from the attempt's
|
|
120
|
+
artifact directory. For a path outside that directory, it withholds the
|
|
121
|
+
artifact with `TRACE_WITHHELD` and leaves the file untouched. See the
|
|
122
|
+
[security model](/security#where-redaction-stops) for all redaction limits.
|
|
123
|
+
|
|
124
|
+
## Watch it happen
|
|
125
|
+
|
|
126
|
+
<CodeGroup>
|
|
127
|
+
```bash npm
|
|
128
|
+
npx e2e run --headed # a visible browser
|
|
129
|
+
npx e2e run --video # record every attempt
|
|
130
|
+
npx e2e run --video=retain-on-failure # record every attempt, keep the failures
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
```bash pnpm
|
|
134
|
+
pnpm exec e2e run --headed # a visible browser
|
|
135
|
+
pnpm exec e2e run --video # record every attempt
|
|
136
|
+
pnpm exec e2e run --video=retain-on-failure # record every attempt, keep the failures
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```bash bun
|
|
140
|
+
bunx e2e run --headed # a visible browser
|
|
141
|
+
bunx e2e run --video # record every attempt
|
|
142
|
+
bunx e2e run --video=retain-on-failure # record every attempt, keep the failures
|
|
143
|
+
```
|
|
144
|
+
</CodeGroup>
|
|
145
|
+
|
|
146
|
+
Each recording lands under its attempt's artifact directory. Playwright
|
|
147
|
+
writes WebM, one file per page the attempt opened; agent-device writes MP4.
|
|
148
|
+
The failure recap prints the path, or the URL of a recording a hosted
|
|
149
|
+
browser keeps. Each recording carries `startedAt`, so a step's `startedAt`
|
|
150
|
+
minus the recording's is where that step is in the video.
|
|
151
|
+
|
|
152
|
+
To record without the flag, set `video` in the config. `on-first-retry` is
|
|
153
|
+
the cheap CI mode: a test that passes first time records nothing, and a
|
|
154
|
+
flaky one leaves a recording of its retry.
|
|
155
|
+
|
|
156
|
+
```ts
|
|
157
|
+
export default {
|
|
158
|
+
video: 'on-first-retry',
|
|
159
|
+
retries: 1,
|
|
160
|
+
targets: [
|
|
161
|
+
{ name: 'chromium', engine: web(), app: { url } },
|
|
162
|
+
{ name: 'firefox', engine: web({ browser: 'firefox' }), app: { url }, video: 'retain-on-failure' },
|
|
163
|
+
],
|
|
164
|
+
} satisfies E2EConfig;
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
A target's `video` wins over the config's, `--video` over both. A test's own
|
|
168
|
+
option wins over all of them, which records one flow you are chasing
|
|
169
|
+
without recording the suite. `trace` takes the same modes and follows the
|
|
170
|
+
same order:
|
|
171
|
+
|
|
172
|
+
```ts
|
|
173
|
+
test('checkout', { video: 'on' }, async ({ agent }) => {
|
|
174
|
+
await agent.act('Buy the first product in the catalog');
|
|
175
|
+
});
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
`--video [mode]` takes an optional value, so put test files before it or
|
|
179
|
+
write `--video=<mode>`. The flag and the config's `video` apply to the targets
|
|
180
|
+
whose engine can record, with one notice naming the rest. A mode set on a
|
|
181
|
+
target or a test is required: an engine that cannot record it fails the run
|
|
182
|
+
with `UNSUPPORTED_ARTIFACT` before any test starts.
|
|
183
|
+
[Recording](/reference/config#recording) has every mode and file.
|
|
184
|
+
|
|
185
|
+
## Console output
|
|
186
|
+
|
|
187
|
+
`console.log` and `console.error` inside a test print as the test runs, above
|
|
188
|
+
the live view, under a heading that names the stream, the target, the file,
|
|
189
|
+
and the test:
|
|
190
|
+
|
|
191
|
+
```text
|
|
192
|
+
stdout | web tests/todos.e2e.ts > adds a todo
|
|
193
|
+
hello from the test
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Nothing is buffered or dropped: every line appears when it is written, in a
|
|
197
|
+
pipe or a CI log as much as in a terminal. The output is not part of the
|
|
198
|
+
report; use `expect` or an artifact for anything a later reader needs.
|
|
199
|
+
|
|
200
|
+
## Agent steps
|
|
201
|
+
|
|
202
|
+
Use these flags to inspect agent behavior:
|
|
203
|
+
|
|
204
|
+
<CodeGroup>
|
|
205
|
+
```bash npm
|
|
206
|
+
npx e2e run --debug # timings and a step table on stderr
|
|
207
|
+
npx e2e run --ai-trace # every model call, for a trace viewer
|
|
208
|
+
npx e2e run --no-cache # run the agent live instead of replaying
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
```bash pnpm
|
|
212
|
+
pnpm exec e2e run --debug # timings and a step table on stderr
|
|
213
|
+
pnpm exec e2e run --ai-trace # every model call, for a trace viewer
|
|
214
|
+
pnpm exec e2e run --no-cache # run the agent live instead of replaying
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
```bash bun
|
|
218
|
+
bunx e2e run --debug # timings and a step table on stderr
|
|
219
|
+
bunx e2e run --ai-trace # every model call, for a trace viewer
|
|
220
|
+
bunx e2e run --no-cache # run the agent live instead of replaying
|
|
221
|
+
```
|
|
222
|
+
</CodeGroup>
|
|
223
|
+
|
|
224
|
+
`--debug` appends two tables after the reporter's output: phase timings for
|
|
225
|
+
the run, and one row per agent step with its duration, model calls, tokens,
|
|
226
|
+
prompt-cache share, and cost when the provider reports one. Each planned
|
|
227
|
+
step also saves its model transcript as an artifact.
|
|
228
|
+
|
|
229
|
+
```console
|
|
230
|
+
[e2e debug] agent steps (execution order, model anthropic/claude-sonnet-4.5, total $0.0312)
|
|
231
|
+
step total model observe action calls tokens in/out cached cost
|
|
232
|
+
act "add a todo named groceries" 3.9s 2.8s 410ms 620ms 3 9412/388 61% (5740) $0.0198
|
|
233
|
+
assert "the list shows groceries" 1.2s 1.1s 88ms 0ms 1 3120/41 0% (0) $0.0114
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
`--ai-trace` writes model requests and responses to `.e2e/ai-trace.json`.
|
|
237
|
+
Read it with [unbox-ai](https://github.com/tester-army/unbox-ai) to inspect
|
|
238
|
+
prompts, tool calls, and token usage:
|
|
239
|
+
|
|
240
|
+
<CodeGroup>
|
|
241
|
+
```bash npm
|
|
242
|
+
npx unbox-ai runs .e2e/ai-trace.json
|
|
243
|
+
npx unbox-ai summary .e2e/ai-trace.json --run 1
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
```bash pnpm
|
|
247
|
+
pnpm dlx unbox-ai runs .e2e/ai-trace.json
|
|
248
|
+
pnpm dlx unbox-ai summary .e2e/ai-trace.json --run 1
|
|
249
|
+
```
|
|
250
|
+
|
|
251
|
+
```bash bun
|
|
252
|
+
bunx unbox-ai runs .e2e/ai-trace.json
|
|
253
|
+
bunx unbox-ai summary .e2e/ai-trace.json --run 1
|
|
254
|
+
```
|
|
255
|
+
</CodeGroup>
|
|
256
|
+
|
|
257
|
+
Each agent step appears as a run in the AI trace, with one entry per model
|
|
258
|
+
call. It contains the redacted input sent to the model; image bytes are
|
|
259
|
+
replaced with byte counts. Use unbox-ai to inspect it instead of reading the
|
|
260
|
+
large raw JSON file.
|
|
261
|
+
|
|
262
|
+
Replayed steps make no model call and leave no AI trace. Add `--no-cache`
|
|
263
|
+
when you need to inspect the whole flow or rule out a stale recording. See
|
|
264
|
+
[Caching agent steps](/cache).
|
|
265
|
+
|
|
266
|
+
## Common errors
|
|
267
|
+
|
|
268
|
+
| Code | Usual cause | Fix |
|
|
269
|
+
| --- | --- | --- |
|
|
270
|
+
| `APP_UNREACHABLE` | Nothing answers at `app.url`, or `app.command` never became ready; on a device, the message may name the iOS automation runner instead (busy, wedged, or a snapshot it could not present) | Set `app.command.log` and read it; check the port; raise `app.command.startupTimeout`. For the runner, follow the recovery in the message: `npx agent-device daemon stop`, reboot the simulator (see [Testing iOS and Android](/mobile#troubleshooting)) |
|
|
271
|
+
| `APP_ALREADY_RUNNING` | Something already serves `app.url` when the runner wanted to start `app.command` | Stop it, or set `reuseExisting: true` for local runs |
|
|
272
|
+
| `LOCATOR_NOT_FOUND` | Wrong role or name, text not exact, element inside an iframe, page not open | Read the markup for the accessible name; try `exact: false`; `browser.frameLocator` for iframes; `--headed` to look |
|
|
273
|
+
| `LOCATOR_AMBIGUOUS` | Two matches: a hidden duplicate, a repeated label | Add `{ name }`, scope under a container, `filter`, `first()`, or `{ visible: true }` |
|
|
274
|
+
| `ASSERTION_FAILED` | The expectation is wrong, or the state settles after 5 s; for `agent.assert`, the judgment was false | Compare with the screenshot; `{ timeout }` on the matcher; rewrite the question |
|
|
275
|
+
| `ASSERTION_INCONCLUSIVE` | `agent.assert` asked about, or `agent.extract` asked for, something the screen does not show: the value is on another page, still loading, or only in pixels | Open or wait for the right screen first; ask about what is visible; add `vision: true` when the answer is in pixels (the message says so when the judge read the tree alone) |
|
|
276
|
+
| `ACTION_FAILED` | Element covered, disabled, or detached, or an operation timed out | Wait on the right condition with `expect` first; close overlays |
|
|
277
|
+
| `STEP_BUDGET_EXHAUSTED`, `STEP_TIMEOUT` | The agent ran out of actions, model calls, or time | Scope the goal to one step. Raise the agent entry's `maxSteps` or `maxModelCalls` for the budget, the config `timeout` for an `act` step, or the agent's `judgmentTimeout` for `assert`, `waitFor`, and `extract` |
|
|
278
|
+
| `MODEL_UNAVAILABLE` | No model constructed in the config | See [Models](/models) |
|
|
279
|
+
| `MODEL_PROVIDER_FAILED` | Bad key, rate limit, no credits, or every try of one request went 120 s without an answer | Check the key the provider reads and the quota; for a slow local model, a smaller screen (`agents.<name>.maxObservationBytes`) or a faster model |
|
|
280
|
+
|
|
281
|
+
Every code, its class, and its exit code are in the
|
|
282
|
+
[errors reference](/reference/errors).
|
|
283
|
+
|
|
284
|
+
<CardGroup cols={2}>
|
|
285
|
+
<Card title="CLI reference" icon="terminal" href="/reference/cli#e2e-run">
|
|
286
|
+
Every flag of `e2e run`.
|
|
287
|
+
</Card>
|
|
288
|
+
<Card title="Errors" icon="triangle-exclamation" href="/reference/errors">
|
|
289
|
+
Every error code.
|
|
290
|
+
</Card>
|
|
291
|
+
</CardGroup>
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Custom executors
|
|
3
|
+
description: Customize the agent loop or implement your own step executor.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Use a custom executor when a `system` prompt and [project tools](/tools) are
|
|
7
|
+
not enough. There are two options:
|
|
8
|
+
|
|
9
|
+
1. `createToolLoopExecutor` keeps the built-in loop: budgets, repeated-call
|
|
10
|
+
detection, verdicts, usage accounting, and debug transcripts. Your tools
|
|
11
|
+
replace the built-in actions; the loop adds only `complete_step`.
|
|
12
|
+
2. `StepExecutor` lets you implement `runStep(ctx)` yourself. A model and
|
|
13
|
+
the AI SDK are optional; the `e2e` and `e2e/engine` types compile with no
|
|
14
|
+
`ai` package installed.
|
|
15
|
+
|
|
16
|
+
Both receive a deadline, redacted observations, and checked action methods.
|
|
17
|
+
The runner records their verdicts. Either goes under `executor` in an agents
|
|
18
|
+
entry, beside the options that still apply: `model`, `judge`, `context`, and
|
|
19
|
+
the budgets. An entry with `executor` rejects `system` and `tools`; pass
|
|
20
|
+
them to `createToolLoopExecutor` instead.
|
|
21
|
+
|
|
22
|
+
## Keep the loop, change the vocabulary
|
|
23
|
+
|
|
24
|
+
This example gives the agent two tools: one reads the screen, one taps a
|
|
25
|
+
node by its id.
|
|
26
|
+
|
|
27
|
+
```ts title="e2e.config.ts"
|
|
28
|
+
import type { E2EConfig } from 'e2e';
|
|
29
|
+
import { createToolLoopExecutor } from 'e2e/agent';
|
|
30
|
+
import { web } from '@e2e-dev/web';
|
|
31
|
+
import { gateway, tool } from 'ai';
|
|
32
|
+
import { z } from 'zod';
|
|
33
|
+
|
|
34
|
+
export default {
|
|
35
|
+
targets: [{ engine: web(), app: { url: 'http://localhost:3000' } }],
|
|
36
|
+
agents: {
|
|
37
|
+
default: {
|
|
38
|
+
model: gateway('openai/gpt-6-luna-fast'),
|
|
39
|
+
maxModelCalls: 15,
|
|
40
|
+
executor: createToolLoopExecutor({
|
|
41
|
+
name: 'tap-only',
|
|
42
|
+
system: 'Read the screen before acting. Tap controls by their id from the latest read.',
|
|
43
|
+
buildPrompt: (ctx) => ctx.step.instruction,
|
|
44
|
+
tools: (ctx, { guard }) => ({
|
|
45
|
+
read_screen: tool({
|
|
46
|
+
description: 'Read the screen as text, one node per line as #id role "name"',
|
|
47
|
+
inputSchema: z.object({}),
|
|
48
|
+
execute: () => guard(async () => (await ctx.observe()).text),
|
|
49
|
+
}),
|
|
50
|
+
tap: tool({
|
|
51
|
+
description: 'Tap a node by its id from the latest read_screen',
|
|
52
|
+
inputSchema: z.object({ id: z.string() }),
|
|
53
|
+
execute: ({ id }) =>
|
|
54
|
+
guard(async () => {
|
|
55
|
+
await ctx.actions.tap({ id: id.replace(/^#/, '') });
|
|
56
|
+
return `Tapped ${id}.`;
|
|
57
|
+
}),
|
|
58
|
+
}),
|
|
59
|
+
}),
|
|
60
|
+
}),
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
} satisfies E2EConfig;
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
The loop reads the entry's `model` unless `createToolLoopExecutor({ model })`
|
|
67
|
+
brings its own, and its model turns per step are the entry's `maxModelCalls`.
|
|
68
|
+
`buildPrompt` returns a string or message history. Use `prepareMessages`
|
|
69
|
+
between turns to shorten the history or return `{ messages, stop }` when
|
|
70
|
+
the step is not progressing.
|
|
71
|
+
|
|
72
|
+
`guard()` stops new tool calls once the step is concluding and hands a
|
|
73
|
+
failure back to the model as text. `ctx.actions` authorizes, counts, and
|
|
74
|
+
records each action, so these steps replay from the [cache](/cache) like the
|
|
75
|
+
built-in agent's and run on any engine that supports `tap`.
|
|
76
|
+
|
|
77
|
+
A tool that works outside `ctx.actions`, such as a call to your test API,
|
|
78
|
+
wraps its body in `ctx.budgets.runTool({ name, mutates })` to take an action
|
|
79
|
+
slot and record the outcome. Never call `ctx.actions` or `ctx.observe` inside
|
|
80
|
+
`runTool`: the call queues behind its own operation and deadlocks. Keep tool
|
|
81
|
+
bodies short and support cancellation. The step deadline cannot cancel an
|
|
82
|
+
underlying operation that ignores its signal.
|
|
83
|
+
|
|
84
|
+
A custom executor can bring its own `model` or `judge`, as
|
|
85
|
+
`createToolLoopExecutor({ model })` does. If the agents entry sets one too,
|
|
86
|
+
they must name the same provider and model, or the config load fails with
|
|
87
|
+
`INVALID_CONFIG`.
|
|
88
|
+
|
|
89
|
+
## Replace the executor
|
|
90
|
+
|
|
91
|
+
This model-free executor supports one assertion,
|
|
92
|
+
`agent.assert('the screen says Ready')`. Other instructions return a blocked
|
|
93
|
+
verdict so the executor cannot claim to have checked something it does not
|
|
94
|
+
understand.
|
|
95
|
+
|
|
96
|
+
```ts title="e2e.config.ts"
|
|
97
|
+
import type { E2EConfig, StepExecutor } from 'e2e';
|
|
98
|
+
import { web } from '@e2e-dev/web';
|
|
99
|
+
|
|
100
|
+
const scripted: StepExecutor = {
|
|
101
|
+
name: 'scripted',
|
|
102
|
+
version: '1',
|
|
103
|
+
cache: 'off',
|
|
104
|
+
async runStep(ctx) {
|
|
105
|
+
if (ctx.step.kind !== 'assert' || ctx.step.instruction !== 'the screen says Ready') {
|
|
106
|
+
return {
|
|
107
|
+
status: 'blocked',
|
|
108
|
+
errorCode: 'AUTOMATION_UNSUPPORTED',
|
|
109
|
+
summary: 'This executor only checks whether the screen says Ready.',
|
|
110
|
+
};
|
|
111
|
+
}
|
|
112
|
+
const screen = await ctx.observe();
|
|
113
|
+
const ready = screen.text.includes('Ready');
|
|
114
|
+
return {
|
|
115
|
+
status: ready ? 'passed' : 'failed',
|
|
116
|
+
summary: ready ? 'The screen says Ready.' : 'Ready is absent from the screen.',
|
|
117
|
+
};
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
export default {
|
|
122
|
+
targets: [{ engine: web(), app: { url: 'http://localhost:3000' } }],
|
|
123
|
+
agents: { default: { executor: scripted } },
|
|
124
|
+
} satisfies E2EConfig;
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
The executor receives this context:
|
|
128
|
+
|
|
129
|
+
| Member | What it is |
|
|
130
|
+
| --- | --- |
|
|
131
|
+
| `ctx.step` | The instruction, params, and `index` in the attempt's timeline. A registered secret value the test spelled into the instruction or a param string reads `<secret:name>`; a `secrets.get()` handle is a placeholder you fill with `typeSecret` |
|
|
132
|
+
| `ctx.observe({ tree, pixels })` | Redacted screen text, with an optional node tree and masked screenshot |
|
|
133
|
+
| `ctx.actions` | Checked and recorded actions: `tap`, `doubleTap`, `longPress`, `secondaryTap`, `hover`, `type`, `typeSecret`, `press`, `select`, `check`, `drag`, `scrollTo`, `scrollUntil`, `upload`, `scroll`, `navigate`, `back`, and the point and keyboard verbs below |
|
|
134
|
+
| `ctx.target` | The target's `name` and `platform`, and `verbs`, the actions its engine supports. Offer only these to the model. |
|
|
135
|
+
| `ctx.pixelsTainted` | True after a [secret fill](/security#screenshots-after-a-secret-fill), when no screenshots are available. A secret an engine option holds (a basic-auth password) is redacted from text only and does not set it |
|
|
136
|
+
| `ctx.signal` | Aborts on cancellation, at the step deadline, or on any other hard stop. Stop promptly when it fires |
|
|
137
|
+
| `ctx.replayedPrefix` | Set when a cache replay ran part of the step before handing it over: the replayed actions and why replay stopped |
|
|
138
|
+
| `ctx.model`, `ctx.providerOptions` | The agent's configured model and `providerOptions`, when set |
|
|
139
|
+
| `ctx.agentContext` | The agent's `context` plus the test's `agentContext` |
|
|
140
|
+
| `ctx.ledger` | Completed steps in the test |
|
|
141
|
+
| `ctx.attempt` | Test and attempt ids, retry index, abort signal, and a `memory` map that is never reported |
|
|
142
|
+
| `ctx.budgets` | Accounting for custom tools and model calls |
|
|
143
|
+
| `ctx.attachTranscript(text)` | Attaches the model transcript to the step. Kept as a `log` artifact under `--debug`, a no-op otherwise; call once, at conclusion |
|
|
144
|
+
| `ctx.attachTurns(turns)` | Keeps a clipped record of the step's model turns (`{ index, calls, outcome }`) on the step record whatever the debug setting; the report shows the last ones under a failed step |
|
|
145
|
+
| `ctx.attachScreenshot(pixels, label)` | Keeps observed pixels as a `screenshot` artifact of the step and resolves with its report id |
|
|
146
|
+
|
|
147
|
+
`tapAt(point)` and `hoverAt(point)` use a node id when a listed control
|
|
148
|
+
occupies the point and otherwise call the engine's coordinate action.
|
|
149
|
+
`hitTest(point)` finds the listed control without acting. Keyboard-capable
|
|
150
|
+
engines also provide `typeText`, `pressKey`, and `dismissKeyboard` for the
|
|
151
|
+
focused control. `upload(target, paths)` authorizes every path against the
|
|
152
|
+
project root before the engine sees it: outside the project or hidden is
|
|
153
|
+
`POLICY_DENIED`, a missing file `INVALID_ARGUMENT`.
|
|
154
|
+
|
|
155
|
+
If semantic capture fails, an observation sets `treeUnavailable: true` and
|
|
156
|
+
omits `tree`. It includes a screenshot when policy allows one, even if pixels
|
|
157
|
+
were not requested. Earlier node ids are invalid, and a missing tree does
|
|
158
|
+
not prove a control is absent. Use fresh ids once the tree returns.
|
|
159
|
+
|
|
160
|
+
Secrets in params arrive as name-only placeholders.
|
|
161
|
+
`ctx.actions.typeSecret(target, name)` fills an authorized field without
|
|
162
|
+
passing the plaintext through your executor.
|
|
163
|
+
|
|
164
|
+
### What the executor handles
|
|
165
|
+
|
|
166
|
+
A custom executor handles `act` and `assert` through `runStep`. Both use the
|
|
167
|
+
agent's `maxSteps` and `maxModelCalls` and default to the configured
|
|
168
|
+
`timeout`. On `assert`, `vision` raises `UNSUPPORTED_CAPABILITY`, since your
|
|
169
|
+
executor chooses what it observes; `screenshot` still attaches evidence after
|
|
170
|
+
your verdict.
|
|
171
|
+
|
|
172
|
+
`waitFor` and `extract` still use the built-in judgments. They require a
|
|
173
|
+
configured model and raise `MODEL_UNAVAILABLE` without one.
|
|
174
|
+
|
|
175
|
+
### Driving the page yourself
|
|
176
|
+
|
|
177
|
+
Use `surfaceOf(handle)` from `@e2e-dev/web` to access the current
|
|
178
|
+
attempt's `Page` and `BrowserContext`. Both accessors throw `INVALID_STATE`
|
|
179
|
+
outside an active attempt.
|
|
180
|
+
|
|
181
|
+
```ts
|
|
182
|
+
import type { E2EConfig, StepExecutor } from 'e2e';
|
|
183
|
+
import { web, surfaceOf } from '@e2e-dev/web';
|
|
184
|
+
|
|
185
|
+
const engine = web();
|
|
186
|
+
const own: StepExecutor = {
|
|
187
|
+
name: 'own-tools',
|
|
188
|
+
version: '1',
|
|
189
|
+
cache: 'off',
|
|
190
|
+
async runStep(ctx) {
|
|
191
|
+
const page = surfaceOf(engine)!.page(); // the page app.open() navigated
|
|
192
|
+
await ctx.budgets.runTool({ name: 'click', mutates: true }, () =>
|
|
193
|
+
page.getByRole('button', { name: 'Save' }).click(),
|
|
194
|
+
);
|
|
195
|
+
return { status: 'passed', summary: 'saved' };
|
|
196
|
+
},
|
|
197
|
+
};
|
|
198
|
+
|
|
199
|
+
export default {
|
|
200
|
+
targets: [{ engine, app: { url: 'http://localhost:3000' } }],
|
|
201
|
+
agents: { default: { executor: own } },
|
|
202
|
+
} satisfies E2EConfig;
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
Direct Playwright calls bypass the runner's action authorization and the
|
|
206
|
+
replay cache. The runner still enforces the step deadline and records the
|
|
207
|
+
verdict, but these calls have no automatic replay or artifacts. Use
|
|
208
|
+
`ctx.budgets` to count custom tool and model calls.
|
|
209
|
+
|
|
210
|
+
### Replay cache
|
|
211
|
+
|
|
212
|
+
`cache` on a `StepExecutor` sets how its `act` steps use the
|
|
213
|
+
[replay cache](/cache); `assert` steps are never cached. `'inherit'`, the
|
|
214
|
+
default, follows the configured cache mode. A recorded step replays without
|
|
215
|
+
calling `runStep`. A replay that stops partway calls `runStep` with
|
|
216
|
+
`ctx.replayedPrefix`: continue from the current screen and do not redo the
|
|
217
|
+
replayed actions. What a step does through `ctx.actions` is recorded; a
|
|
218
|
+
mutating tool call leaves a gap the executor fills on replay. Entries are not
|
|
219
|
+
keyed by executor, so an entry one agent recorded replays for another.
|
|
220
|
+
|
|
221
|
+
`'off'` never replays or records the executor's steps, so every step reaches
|
|
222
|
+
`runStep`. Use it for a brain whose own history or memory is the source of
|
|
223
|
+
truth, or one that must see every step run. The two `StepExecutor` samples on
|
|
224
|
+
this page set it so their code runs on every call.
|
|
225
|
+
|
|
226
|
+
## The verdict
|
|
227
|
+
|
|
228
|
+
Return `passed`, `failed`, or `blocked` with a summary. A blocked verdict
|
|
229
|
+
also needs an error code, and a passed one carries none.
|
|
230
|
+
[How agent steps work](/agent-steps#how-a-step-ends) lists the codes and
|
|
231
|
+
resulting exits. `STEP_BUDGET_EXHAUSTED`, `STEP_TIMEOUT`, and `CANCELLED`
|
|
232
|
+
belong to the runner: return one only when that budget is spent, the step
|
|
233
|
+
deadline has passed, or the test was cancelled. Returning one otherwise, or
|
|
234
|
+
a passed verdict with any code, is refused with `MODEL_OUTPUT_INVALID`.
|
|
235
|
+
|
|
236
|
+
<CardGroup cols={2}>
|
|
237
|
+
<Card title="agent reference" icon="wand-magic-sparkles" href="/reference/agent">
|
|
238
|
+
Every method, option, and budget.
|
|
239
|
+
</Card>
|
|
240
|
+
<Card title="Writing an engine" icon="plug" href="/writing-an-engine">
|
|
241
|
+
Add support for another platform.
|
|
242
|
+
</Card>
|
|
243
|
+
</CardGroup>
|