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
package/docs/cache.mdx
ADDED
|
@@ -0,0 +1,306 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Caching agent steps
|
|
3
|
+
description: Replay verified agent actions without model calls, and let the agent take over when the app changes.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
The replay cache records the actions in an `agent.act()` step after a later
|
|
7
|
+
check verifies the result. On the next run, the runner replays those actions
|
|
8
|
+
without calling the model. If a control or the expected end state no longer
|
|
9
|
+
matches, the agent takes over from the current screen.
|
|
10
|
+
|
|
11
|
+
`agent.assert`, `agent.waitFor`, and `agent.extract` always run live.
|
|
12
|
+
|
|
13
|
+
The run summary reports the outcomes:
|
|
14
|
+
|
|
15
|
+
```text
|
|
16
|
+
AI 4.1k tokens · 2 model calls · anthropic/claude-sonnet-4.5
|
|
17
|
+
Cache 4 replayed · 1 handed off · 1 missed
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
| Run summary | `step.cache.mode` | Meaning |
|
|
21
|
+
| --- | --- | --- |
|
|
22
|
+
| `replayed` | `self-finalized` | The recording completed without a model call. |
|
|
23
|
+
| `handed off` | `agent-concluded` | Replay started, then the agent took over. |
|
|
24
|
+
| `missed` | `missed` | The agent ran the step from the beginning. |
|
|
25
|
+
|
|
26
|
+
Misses and hand-offs also include `step.cache.reason`. `agent.act()` returns
|
|
27
|
+
the same cache object as `result.cache`. The cache object is absent when
|
|
28
|
+
caching is off for the step.
|
|
29
|
+
|
|
30
|
+
To rule the cache out of a failure, run once without it:
|
|
31
|
+
|
|
32
|
+
<CodeGroup>
|
|
33
|
+
```bash npm
|
|
34
|
+
npx e2e run --no-cache
|
|
35
|
+
```
|
|
36
|
+
|
|
37
|
+
```bash pnpm
|
|
38
|
+
pnpm exec e2e run --no-cache
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
```bash bun
|
|
42
|
+
bunx e2e run --no-cache
|
|
43
|
+
```
|
|
44
|
+
</CodeGroup>
|
|
45
|
+
|
|
46
|
+
## How a replay works
|
|
47
|
+
|
|
48
|
+
1. Check the starting screen: the same route, whatever the record id, the
|
|
49
|
+
query, or the fragment. Retries always run live.
|
|
50
|
+
2. Find each recorded control and repeat its action. The runner matches
|
|
51
|
+
controls by their role, name, test id, and surrounding context. It waits
|
|
52
|
+
for missing controls and stops if a match is ambiguous. A control with no
|
|
53
|
+
name is found by its place among the unnamed controls of its kind.
|
|
54
|
+
3. Check the final path and controls that appeared during the original step.
|
|
55
|
+
Text that changes with the data, a count, a date, an id, is not used.
|
|
56
|
+
4. Finish without a model call, or let the agent continue with a record of
|
|
57
|
+
what ran and why replay stopped.
|
|
58
|
+
|
|
59
|
+
Typed values replay as recorded, even when an earlier run left the same
|
|
60
|
+
value on screen. Secret fills resolve the current value by name and run
|
|
61
|
+
through authorization again.
|
|
62
|
+
|
|
63
|
+
## What must match
|
|
64
|
+
|
|
65
|
+
A cache entry belongs to a specific test, target, instruction, and set of
|
|
66
|
+
params. Renaming the test or target, changing the instruction or an ordinary
|
|
67
|
+
param, or upgrading the engine's major or minor version causes a miss.
|
|
68
|
+
Changing the model does not.
|
|
69
|
+
|
|
70
|
+
A timestamp or a fresh email address would cause a miss on every run. Wrap
|
|
71
|
+
values like these in `unique()` so the runner substitutes the current value
|
|
72
|
+
when replaying:
|
|
73
|
+
|
|
74
|
+
```ts
|
|
75
|
+
import { unique } from 'e2e';
|
|
76
|
+
|
|
77
|
+
const name = `E2E ${Date.now()} Company`;
|
|
78
|
+
await agent.act('create a company named {name}', { params: { name: unique(name) } });
|
|
79
|
+
await expect(screen.getByRole('heading', { name })).toBeVisible();
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Use `unique()` for data the flow enters or checks. Keep choices that change
|
|
83
|
+
the flow, such as a plan name, as ordinary params. The substitution covers
|
|
84
|
+
the value as a URL spells it too, `%20` in a path or `+` in a search query.
|
|
85
|
+
|
|
86
|
+
When a `unique()` value equals another param's value or appears inside one,
|
|
87
|
+
the step passes but is not recorded, and `step.cache.notRecorded` reads
|
|
88
|
+
`param-collision`. The next run, with a fresh value, records it.
|
|
89
|
+
|
|
90
|
+
For preview URLs that change on each deploy, set
|
|
91
|
+
[`app.identity`](/reference/config#the-app-under-test) to keep the same cache
|
|
92
|
+
identity. On devices, replay uses the
|
|
93
|
+
[screen title](/reference/mobile#replay-cache-on-a-device) as the path.
|
|
94
|
+
|
|
95
|
+
## When a recording is written
|
|
96
|
+
|
|
97
|
+
In `read-write` mode, the runner saves a recording at the end of the
|
|
98
|
+
attempt when a later verification step passed. A step that took no action
|
|
99
|
+
records nothing.
|
|
100
|
+
|
|
101
|
+
| Counts as verification | Does not count |
|
|
102
|
+
| --- | --- |
|
|
103
|
+
| `expect(locator).toHaveText(...)` and other locator matchers | `expect(value).toBe(...)` on a plain value |
|
|
104
|
+
| `expect(browser).toHaveURL(...)` and other engine assertions | `expect.poll(...)` |
|
|
105
|
+
| `locator.waitFor()`, `browser.waitForURL()` | `locator.textContent()` and other reads |
|
|
106
|
+
| `agent.assert(...)`, `agent.waitFor(...)` | `agent.extract(...)`, another `act`, the attempt passing |
|
|
107
|
+
|
|
108
|
+
Follow each `act` with a check of its outcome:
|
|
109
|
+
|
|
110
|
+
```ts title="tests/cart.e2e.ts"
|
|
111
|
+
import { expect, test } from 'e2e';
|
|
112
|
+
|
|
113
|
+
test('adds an item', async ({ app, agent, screen }) => {
|
|
114
|
+
await app.open('/cart');
|
|
115
|
+
await agent.act('add one item to the cart');
|
|
116
|
+
await expect(screen.getByRole('status')).toHaveText('1 item');
|
|
117
|
+
});
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
A failing attempt can still save steps verified before the failure. It
|
|
121
|
+
deletes unverified entries and replays implicated in the failure, including
|
|
122
|
+
an `end-mismatch`. Custom stores need a `delete` method for this cleanup.
|
|
123
|
+
|
|
124
|
+
Cancelling a run leaves the cache unchanged. An attempt whose only failures
|
|
125
|
+
are ones where no model answered leaves every entry it did not confirm
|
|
126
|
+
unchanged: `MODEL_UNAVAILABLE`
|
|
127
|
+
(no model configured) and `MODEL_PROVIDER_FAILED` (the provider returned an
|
|
128
|
+
error such as a missing or rejected key, a rate limit, or a 5xx, or a request
|
|
129
|
+
got no response within 120 seconds). Those say nothing about the app, so a
|
|
130
|
+
read-write run without model access keeps its recordings, including one a
|
|
131
|
+
step replayed before an `agent.assert` that could not reach its model, and
|
|
132
|
+
still saves steps verified before the failure. A model that answered with
|
|
133
|
+
something unusable (`MODEL_OUTPUT_INVALID`, `CONTEXT_OVERFLOW`) or a step that
|
|
134
|
+
ran out of time (`STEP_TIMEOUT`, even while a request was still open) counts
|
|
135
|
+
as a failure of the flow, and so does any other failure in the same attempt,
|
|
136
|
+
such as an `afterEach` assertion.
|
|
137
|
+
|
|
138
|
+
## Why a step was not replayed
|
|
139
|
+
|
|
140
|
+
`step.cache.reason` in the report says why:
|
|
141
|
+
|
|
142
|
+
| Reason | What happened | What to do |
|
|
143
|
+
| --- | --- | --- |
|
|
144
|
+
| `no-entry` | No recording matches this step and its params. | The next verified pass records it. |
|
|
145
|
+
| `retry` | Retries never replay. | Nothing. |
|
|
146
|
+
| `invalid-entry` | The file is unreadable, over 1 MiB, or from another schema version. | `npx e2e cache clear`. |
|
|
147
|
+
| `truncated` | The recording hit a limit, see [below](#limits-and-gaps). | Split the step, or pass the secret as a `Secret`. |
|
|
148
|
+
| `wrong-context` | The app was on another screen than when the step was recorded: a different route, not a different record, query, or fragment. | Open the same screen before the step. |
|
|
149
|
+
| `target-not-found` | A recorded control did not appear within 15 seconds. | The UI changed. The next passing run re-records. |
|
|
150
|
+
| `target-ambiguous` | The number of matching controls changed. | Give repeated controls distinct names or use unique test data. |
|
|
151
|
+
| `gap` | An action cannot be replayed, see [below](#limits-and-gaps). | The agent continues this part live. Put stable values in `params`. |
|
|
152
|
+
| `action-failed` | The app rejected a replayed action. | Check the app. |
|
|
153
|
+
| `action-uncertain` | A replayed action failed with an unknown commit state. The agent is told to check before acting again. | Check the app. |
|
|
154
|
+
| `viewport-changed` | A bare-point tap or hover was recorded on a viewport of another size. | Keep the viewport fixed. |
|
|
155
|
+
| `end-mismatch` | Every action ran, but the recorded path or a control that should have appeared did not come back. | Leftover data from an earlier run, a banner that comes and goes, or a regression. |
|
|
156
|
+
|
|
157
|
+
A stop before any action ran is a miss. After replay starts, it is a
|
|
158
|
+
hand-off. Unique test data and cleanup in `afterEach` help avoid stale
|
|
159
|
+
state between runs.
|
|
160
|
+
|
|
161
|
+
### Limits and gaps
|
|
162
|
+
|
|
163
|
+
A recording is `truncated` when the step took more than 50 actions (only
|
|
164
|
+
possible with `maxSteps` raised above 50), typed a value or URL over 4,096
|
|
165
|
+
characters or one holding a registered secret, or acted on a control with no
|
|
166
|
+
usable description.
|
|
167
|
+
|
|
168
|
+
A `gap` is an action the cache cannot repeat: a mutating
|
|
169
|
+
[project tool](/tools), or a value the agent read off the screen, typed after
|
|
170
|
+
seeing a screenshot, or worked out from the date. `step.cache.derived` names
|
|
171
|
+
the rule: `whole-node` (a control's whole name or text), `minted-token` (a
|
|
172
|
+
code or id the app showed as its own word), `date`, or `pixels`. Values from
|
|
173
|
+
the instruction or `params`, or ones the agent composed itself, replay.
|
|
174
|
+
|
|
175
|
+
## What a recording holds
|
|
176
|
+
|
|
177
|
+
Each entry is a JSON file under `.e2e/cache/`, named by a hash of its key.
|
|
178
|
+
It contains actions, target descriptions, typed text, a step summary, and
|
|
179
|
+
checks for the final state. Those checks include the path and up to eight
|
|
180
|
+
controls that appeared during the step.
|
|
181
|
+
|
|
182
|
+
Entries contain no prompts, conversations, screenshots, observed trees, or
|
|
183
|
+
secret values. A secret fill stores only the secret's name. Other typed
|
|
184
|
+
values are stored verbatim, so review recordings before sharing them; see
|
|
185
|
+
[cache trust](/security#cache-trust).
|
|
186
|
+
|
|
187
|
+
## Modes
|
|
188
|
+
|
|
189
|
+
| Mode | Replays | Records | Default |
|
|
190
|
+
| --- | --- | --- | --- |
|
|
191
|
+
| `'read-write'` | yes | yes | locally |
|
|
192
|
+
| `'read-only'` | yes | no | in CI when `cache` is unset |
|
|
193
|
+
| `'off'` | no | no | `--no-cache` for one run |
|
|
194
|
+
|
|
195
|
+
```ts title="e2e.config.ts fragment"
|
|
196
|
+
cache: 'off',
|
|
197
|
+
// or
|
|
198
|
+
cache: { mode: 'read-write', dir: '.e2e/cache' },
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
`--no-cache` overrides the config. To let CI update recordings, explicitly
|
|
202
|
+
set `cache: 'read-write'`. In `read-only` mode, stale entries remain until
|
|
203
|
+
a read-write run replaces them.
|
|
204
|
+
|
|
205
|
+
A custom `cache.store` replaces the file store and does not default to
|
|
206
|
+
read-only in CI. `e2e explore` and `e2e mcp` do not use the cache. See the
|
|
207
|
+
[config reference](/reference/config#cache).
|
|
208
|
+
|
|
209
|
+
## Commit the replay cache
|
|
210
|
+
|
|
211
|
+
<span id="commit-your-traces" />
|
|
212
|
+
|
|
213
|
+
`e2e init` adds `.e2e/cache/` to `.gitignore`, so every machine records its
|
|
214
|
+
own and CI starts with none. To share replays, remove that line and commit
|
|
215
|
+
the directory. CI stays `read-only` unless you set `cache: 'read-write'`.
|
|
216
|
+
Treat committed entries as test data and review them in the pull request
|
|
217
|
+
that re-recorded them.
|
|
218
|
+
|
|
219
|
+
Local runs leave a committed directory clean unless something changed. A
|
|
220
|
+
replayed step never rewrites its entry, and a live re-recording with the same
|
|
221
|
+
actions, paths, and anchors is not written: the summary, the measured end
|
|
222
|
+
wait, and the rule that flagged a typed run-time value differ between two
|
|
223
|
+
live runs of the same flow and do not count. A file changes when:
|
|
224
|
+
|
|
225
|
+
- a step records for the first time,
|
|
226
|
+
- the agent finishes a step after a hand-off, re-recording what it saw,
|
|
227
|
+
- a step fails after replaying, or ends in an `end-mismatch` the agent had
|
|
228
|
+
to repair, which deletes the entry,
|
|
229
|
+
- no verification step confirmed the entry by the end of the attempt, which
|
|
230
|
+
deletes it.
|
|
231
|
+
|
|
232
|
+
A replay that still finds every control refreshes nothing, so an entry for a
|
|
233
|
+
drifting UI is repaired only once a control can no longer be found.
|
|
234
|
+
|
|
235
|
+
## Fail on a stale recording
|
|
236
|
+
|
|
237
|
+
A committed recording that stops replaying is quiet by default: the agent
|
|
238
|
+
takes the step over, the test passes, and every CI run pays for the model
|
|
239
|
+
calls until someone re-records. `--strict-cache` (or `cache: { strict: true }`)
|
|
240
|
+
makes it loud. A step whose recording exists but no longer replays fails
|
|
241
|
+
with `REPLAY_STALE` and makes no model call:
|
|
242
|
+
|
|
243
|
+
<CodeGroup>
|
|
244
|
+
```bash npm
|
|
245
|
+
CI=1 npx e2e run --strict-cache
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
```bash pnpm
|
|
249
|
+
CI=1 pnpm exec e2e run --strict-cache
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
```bash bun
|
|
253
|
+
CI=1 bunx e2e run --strict-cache
|
|
254
|
+
```
|
|
255
|
+
</CodeGroup>
|
|
256
|
+
|
|
257
|
+
The reasons that fail are the ones that mean the app or the entry changed:
|
|
258
|
+
`invalid-entry`, `wrong-context`, `target-not-found`, `target-ambiguous`,
|
|
259
|
+
`viewport-changed`, `action-failed`, `action-uncertain`, and `end-mismatch`.
|
|
260
|
+
A step with no recording (`no-entry`), a retry, a `gap`, and a `truncated`
|
|
261
|
+
recording still run live. `REPLAY_STALE` exits 2 and is not retried, since a
|
|
262
|
+
retry never replays and would pass live. The entry stays where it is, even
|
|
263
|
+
in `read-write` mode, so every strict run fails on it until it is re-recorded:
|
|
264
|
+
run the test in `read-write` mode without the flag, and with `cache.strict`
|
|
265
|
+
off when the config set it, then commit the changed entry; a custom
|
|
266
|
+
`cache.store` receives the new entry from that run instead. The message
|
|
267
|
+
names the knob that turned strict on and where the entry lives: the cache
|
|
268
|
+
directory, or the configured `cache.store`. A store whose read fails is not
|
|
269
|
+
a stale recording; the step runs live.
|
|
270
|
+
|
|
271
|
+
## Inspect the cache
|
|
272
|
+
|
|
273
|
+
<CodeGroup>
|
|
274
|
+
```bash npm
|
|
275
|
+
npx e2e cache ls # one row per entry: test, target, instruction digest, age, actions
|
|
276
|
+
npx e2e cache stats # entry count and size
|
|
277
|
+
npx e2e cache clear # delete every entry
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
```bash pnpm
|
|
281
|
+
pnpm exec e2e cache ls # one row per entry: test, target, instruction digest, age, actions
|
|
282
|
+
pnpm exec e2e cache stats # entry count and size
|
|
283
|
+
pnpm exec e2e cache clear # delete every entry
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
```bash bun
|
|
287
|
+
bunx e2e cache ls # one row per entry: test, target, instruction digest, age, actions
|
|
288
|
+
bunx e2e cache stats # entry count and size
|
|
289
|
+
bunx e2e cache clear # delete every entry
|
|
290
|
+
```
|
|
291
|
+
</CodeGroup>
|
|
292
|
+
|
|
293
|
+
<Note>
|
|
294
|
+
The `cached` percentage in AI usage is the provider's prompt cache. It
|
|
295
|
+
reduces the cost of a model call. The replay cache described here skips the
|
|
296
|
+
call entirely.
|
|
297
|
+
</Note>
|
|
298
|
+
|
|
299
|
+
<CardGroup cols={2}>
|
|
300
|
+
<Card title="Config reference" icon="sliders" href="/reference/config#cache">
|
|
301
|
+
`mode`, `store`, `dir`.
|
|
302
|
+
</Card>
|
|
303
|
+
<Card title="CLI reference" icon="terminal" href="/reference/cli#e2e-cache">
|
|
304
|
+
`e2e cache ls`, `stats`, `clear`.
|
|
305
|
+
</Card>
|
|
306
|
+
</CardGroup>
|
package/docs/ci.mdx
ADDED
|
@@ -0,0 +1,210 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Continuous integration
|
|
3
|
+
description: Run tests on pull requests, upload reports, and configure model credentials in CI.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
Run deterministic and agent tests in the same CI job. This workflow assumes
|
|
7
|
+
your config includes a [command](/starting-your-app) to start the app and
|
|
8
|
+
uses AI Gateway for model calls:
|
|
9
|
+
|
|
10
|
+
```yaml title=".github/workflows/e2e.yml"
|
|
11
|
+
name: e2e
|
|
12
|
+
|
|
13
|
+
on:
|
|
14
|
+
pull_request:
|
|
15
|
+
push:
|
|
16
|
+
branches: [main]
|
|
17
|
+
|
|
18
|
+
permissions:
|
|
19
|
+
contents: read
|
|
20
|
+
|
|
21
|
+
concurrency:
|
|
22
|
+
group: ${{ github.workflow }}-${{ github.ref }}
|
|
23
|
+
cancel-in-progress: ${{ github.event_name == 'pull_request' }}
|
|
24
|
+
|
|
25
|
+
jobs:
|
|
26
|
+
e2e:
|
|
27
|
+
runs-on: ubuntu-latest
|
|
28
|
+
steps:
|
|
29
|
+
- uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1
|
|
30
|
+
- uses: pnpm/action-setup@9fd676a19091d4595eefd76e4bd31c97133911f1 # v4.2.0
|
|
31
|
+
- uses: actions/setup-node@820762786026740c76f36085b0efc47a31fe5020 # v7.0.0
|
|
32
|
+
with:
|
|
33
|
+
node-version: 26
|
|
34
|
+
cache: pnpm
|
|
35
|
+
- run: pnpm install --frozen-lockfile
|
|
36
|
+
|
|
37
|
+
- name: Install browsers
|
|
38
|
+
run: npx playwright install chromium --with-deps
|
|
39
|
+
|
|
40
|
+
- name: Run e2e
|
|
41
|
+
run: npx e2e run --reporter list,junit
|
|
42
|
+
env:
|
|
43
|
+
APP_URL: http://127.0.0.1:3000
|
|
44
|
+
AI_GATEWAY_API_KEY: ${{ secrets.AI_GATEWAY_API_KEY }}
|
|
45
|
+
E2E_USER_ADMIN_USERNAME: ${{ secrets.E2E_USER_ADMIN_USERNAME }}
|
|
46
|
+
E2E_USER_ADMIN_PASSWORD: ${{ secrets.E2E_USER_ADMIN_PASSWORD }}
|
|
47
|
+
|
|
48
|
+
- name: Upload report
|
|
49
|
+
if: ${{ !cancelled() }}
|
|
50
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
51
|
+
with:
|
|
52
|
+
name: e2e-report
|
|
53
|
+
path: |
|
|
54
|
+
.e2e/report.json
|
|
55
|
+
.e2e/junit.xml
|
|
56
|
+
if-no-files-found: warn
|
|
57
|
+
|
|
58
|
+
- name: Upload artifacts
|
|
59
|
+
if: ${{ !cancelled() }}
|
|
60
|
+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
|
|
61
|
+
with:
|
|
62
|
+
name: e2e-artifacts
|
|
63
|
+
path: .e2e/artifacts
|
|
64
|
+
if-no-files-found: warn
|
|
65
|
+
retention-days: 7
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
The workflow pins actions to commit SHAs and installs dependencies from the
|
|
69
|
+
lockfile. `npx e2e` runs the installed version.
|
|
70
|
+
|
|
71
|
+
Artifacts upload on every run that is not cancelled, so a test that failed
|
|
72
|
+
and then passed on retry still has its evidence.
|
|
73
|
+
|
|
74
|
+
For iOS and Android suites, see [Mobile CI](/mobile-ci): GitHub Actions, EAS
|
|
75
|
+
Workflows, Bitrise, and Codemagic.
|
|
76
|
+
|
|
77
|
+
Configure your CI's test-report integration to read `.e2e/junit.xml`. It
|
|
78
|
+
includes startup failures such as `APP_UNREACHABLE` in a `run` suite. Add
|
|
79
|
+
the [GitHub reporter](/github) to post results on the pull request. Make the
|
|
80
|
+
e2e job a required check in your repository settings if it should block merges.
|
|
81
|
+
|
|
82
|
+
## What CI changes
|
|
83
|
+
|
|
84
|
+
CI mode is on when `CI` is set to a value other than an empty string, `0`,
|
|
85
|
+
or `false`. Use `CI=1 npx e2e run` to reproduce these defaults locally:
|
|
86
|
+
|
|
87
|
+
| Setting | Local | CI |
|
|
88
|
+
| --- | --- | --- |
|
|
89
|
+
| `retries` | `0` | `1` |
|
|
90
|
+
| `workers` | half your cores | `1` |
|
|
91
|
+
| `cache` when unset | `read-write` | `read-only` |
|
|
92
|
+
| `.only` | allowed | rejected with `ONLY_IN_CI` |
|
|
93
|
+
| `command.reuseExisting` | honored | ignored, with a notice |
|
|
94
|
+
|
|
95
|
+
Override worker and retry defaults with flags:
|
|
96
|
+
|
|
97
|
+
<CodeGroup>
|
|
98
|
+
```bash npm
|
|
99
|
+
npx e2e run --workers 4 --retries 0
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
```bash pnpm
|
|
103
|
+
pnpm exec e2e run --workers 4 --retries 0
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
```bash bun
|
|
107
|
+
bunx e2e run --workers 4 --retries 0
|
|
108
|
+
```
|
|
109
|
+
</CodeGroup>
|
|
110
|
+
|
|
111
|
+
Add `E2E_TELEMETRY_DISABLED: '1'` to the job's `env` to send no
|
|
112
|
+
[telemetry](/telemetry#in-ci) from CI.
|
|
113
|
+
|
|
114
|
+
## Sharding
|
|
115
|
+
|
|
116
|
+
`--shard <index/total>` runs one slice of the suite per job. Every job runs
|
|
117
|
+
the same command with its own index, and the same suite shards the same way
|
|
118
|
+
on every machine. A shard that gets no test fails with `NO_TESTS`; add
|
|
119
|
+
`--pass-with-no-tests` when a matrix may have more shards than tests. The
|
|
120
|
+
[CLI reference](/reference/cli#flags) has the slicing rules.
|
|
121
|
+
|
|
122
|
+
```yaml
|
|
123
|
+
jobs:
|
|
124
|
+
e2e:
|
|
125
|
+
strategy:
|
|
126
|
+
fail-fast: false
|
|
127
|
+
matrix:
|
|
128
|
+
shard: [1, 2, 3]
|
|
129
|
+
steps:
|
|
130
|
+
# ...
|
|
131
|
+
- run: npx e2e run --shard ${{ matrix.shard }}/3 --reporter list,junit
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Each shard writes its own `report.json` and `junit.xml`; upload them under a
|
|
135
|
+
name that includes the shard index. Combining the documents into one is not
|
|
136
|
+
implemented yet.
|
|
137
|
+
|
|
138
|
+
## Rerunning failures
|
|
139
|
+
|
|
140
|
+
`--last-failed` runs only the tests the previous run did not pass, read from
|
|
141
|
+
`report.json` in the [`output`](/reference/config#output) directory (`.e2e`
|
|
142
|
+
by default). The rerun empties `artifacts/` there when it starts, so
|
|
143
|
+
upload the first run's artifacts before rerunning in the same job if you want
|
|
144
|
+
both. The [CLI reference](/reference/cli#flags) lists what counts as not
|
|
145
|
+
passed. Locally it is the loop after a red run:
|
|
146
|
+
|
|
147
|
+
<CodeGroup>
|
|
148
|
+
```bash npm
|
|
149
|
+
npx e2e run
|
|
150
|
+
npx e2e run --last-failed
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
```bash pnpm
|
|
154
|
+
pnpm exec e2e run
|
|
155
|
+
pnpm exec e2e run --last-failed
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
```bash bun
|
|
159
|
+
bunx e2e run
|
|
160
|
+
bunx e2e run --last-failed
|
|
161
|
+
```
|
|
162
|
+
</CodeGroup>
|
|
163
|
+
|
|
164
|
+
In CI the report is a job artifact, not a file on the next runner; download
|
|
165
|
+
it into `.e2e/` before the rerun step, or rerun the failed job whole.
|
|
166
|
+
|
|
167
|
+
## Model credentials
|
|
168
|
+
|
|
169
|
+
Pass the credential your configured provider needs, such as
|
|
170
|
+
`AI_GATEWAY_API_KEY` in the workflow above. See [Models](/models)
|
|
171
|
+
for provider setup. Tests that never use `agent` need no model credentials.
|
|
172
|
+
|
|
173
|
+
Store keys in CI secrets and use spending limits where available. The code
|
|
174
|
+
running in the job can read those keys, including test code and dependencies.
|
|
175
|
+
GitHub withholds secrets from fork pull requests. Fully replayed action
|
|
176
|
+
steps need no model call, but live actions and agent judgments still do.
|
|
177
|
+
Run untrusted code without secrets or write tokens. See the
|
|
178
|
+
[security model](/security).
|
|
179
|
+
|
|
180
|
+
## Gating pull requests on agent steps
|
|
181
|
+
|
|
182
|
+
A failed agent step fails the job like a failed `expect`. Keep the checks
|
|
183
|
+
predictable by giving each `agent.act` one goal and checking its outcome
|
|
184
|
+
with a locator assertion or `agent.assert`.
|
|
185
|
+
|
|
186
|
+
To reuse verified actions in CI, [share the replay cache](/cache#commit-the-replay-cache).
|
|
187
|
+
A cache hit avoids a model call for that action step. Agent judgments still
|
|
188
|
+
run live, and a cache miss or hand-off uses the model.
|
|
189
|
+
|
|
190
|
+
CI retries once by default. A test that passes only on retry is reported as
|
|
191
|
+
flaky, so you can identify flows that need investigation.
|
|
192
|
+
|
|
193
|
+
`--max-failures <n>` stops the run once that many tests have failed, so a
|
|
194
|
+
broken deploy does not spend a model call on every remaining agent step. The
|
|
195
|
+
tests not started are skipped with cause `failure-limit`, the ones running
|
|
196
|
+
end as `interrupted`, and the job exits 1.
|
|
197
|
+
|
|
198
|
+
## Exit codes
|
|
199
|
+
|
|
200
|
+
Any non-zero exit fails the job. [Debugging a run](/debugging#read-the-failure)
|
|
201
|
+
lists each code and whether a retry of the job can help.
|
|
202
|
+
|
|
203
|
+
<CardGroup cols={2}>
|
|
204
|
+
<Card title="Pull request comments" icon="code-pull-request" href="/github">
|
|
205
|
+
One comment per run, edited in place on a rerun.
|
|
206
|
+
</Card>
|
|
207
|
+
<Card title="CLI reference" icon="terminal" href="/reference/cli">
|
|
208
|
+
Flags, reporters, and every exit code.
|
|
209
|
+
</Card>
|
|
210
|
+
</CardGroup>
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
---
|
|
2
|
+
title: Coding agents
|
|
3
|
+
description: Give a coding agent the skill, a live app session, and reports it can use to write and debug tests.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
`e2e init` installs a skill for writing and running tests, plus MCP
|
|
7
|
+
configuration for inspecting the app. Coding agents use the CLI to run
|
|
8
|
+
tests and the reports to investigate failures.
|
|
9
|
+
|
|
10
|
+
## The skill
|
|
11
|
+
|
|
12
|
+
<CodeGroup>
|
|
13
|
+
```bash npm
|
|
14
|
+
npx e2e init
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
```bash pnpm
|
|
18
|
+
pnpm dlx e2e init
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```bash bun
|
|
22
|
+
bunx e2e init
|
|
23
|
+
```
|
|
24
|
+
</CodeGroup>
|
|
25
|
+
|
|
26
|
+
| Path | Used by |
|
|
27
|
+
| --- | --- |
|
|
28
|
+
| `.agents/skills/e2e/` | Agents that read `.agents/skills` |
|
|
29
|
+
| `.claude/skills/e2e/` | Claude Code; a symlink to `.agents/skills/e2e/` when both are installed |
|
|
30
|
+
|
|
31
|
+
The copy holds `SKILL.md` and topic references; the link is the layout
|
|
32
|
+
`npx skills add` produces, so one copy serves every agent. Run `init` again
|
|
33
|
+
after upgrading e2e to refresh it.
|
|
34
|
+
|
|
35
|
+
Without `init`, `npx skills add tester-army/e2e` installs the skill from the
|
|
36
|
+
repository, and `npx e2e guide [topic]` prints it from the
|
|
37
|
+
installed package.
|
|
38
|
+
|
|
39
|
+
The package also ships these docs as `.mdx` pages in its `docs/` directory
|
|
40
|
+
(`node_modules/e2e/docs` in a single-package project), so an agent can read
|
|
41
|
+
any page offline. A link such as `/reference/cli` is `docs/reference/cli.mdx`.
|
|
42
|
+
|
|
43
|
+
For agents that need an explicit pointer, add this line to your project
|
|
44
|
+
instructions. `init` leaves those files unchanged:
|
|
45
|
+
|
|
46
|
+
```md title="AGENTS.md"
|
|
47
|
+
End-to-end tests use e2e; read .agents/skills/e2e/SKILL.md before writing or running one.
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## How an agent looks at the app
|
|
51
|
+
|
|
52
|
+
`e2e mcp` lets the coding agent open and interact with the app. Each agent,
|
|
53
|
+
subagents included, opens its own session, so several can drive the app at
|
|
54
|
+
once. Its `locate` tool checks a `screen.*` locator against the current app and returns
|
|
55
|
+
the test code when exactly one element matches.
|
|
56
|
+
|
|
57
|
+
`init` registers the server in `.mcp.json` for Claude Code and
|
|
58
|
+
`.cursor/mcp.json` for Cursor. To register it with Claude Code by hand:
|
|
59
|
+
|
|
60
|
+
<CodeGroup>
|
|
61
|
+
```bash npm
|
|
62
|
+
claude mcp add e2e -- npx e2e mcp
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
```bash pnpm
|
|
66
|
+
claude mcp add e2e -- pnpm exec e2e mcp
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
```bash bun
|
|
70
|
+
claude mcp add e2e -- bunx e2e mcp
|
|
71
|
+
```
|
|
72
|
+
</CodeGroup>
|
|
73
|
+
|
|
74
|
+
See the [MCP server reference](/reference/mcp) for its tools, session rules,
|
|
75
|
+
and flags. Run tests and read reports through the CLI.
|
|
76
|
+
|
|
77
|
+
## How an agent writes a test
|
|
78
|
+
|
|
79
|
+
The skill tells the coding agent to read the config and an existing test
|
|
80
|
+
first. It uses `agent.act` for one goal at a time and checks the outcome
|
|
81
|
+
with `expect`. Known fields and exact values can use `screen` directly:
|
|
82
|
+
|
|
83
|
+
```ts title="tests/checkout.e2e.ts"
|
|
84
|
+
import { test, expect, credentials } from 'e2e';
|
|
85
|
+
|
|
86
|
+
test('a signed-in user reaches checkout', async ({ screen, app, agent }) => {
|
|
87
|
+
const user = credentials.user('customer');
|
|
88
|
+
await app.open('/login');
|
|
89
|
+
await screen.getByLabel('Email').fill(user.username);
|
|
90
|
+
await screen.getByLabel('Password').fill(user.password);
|
|
91
|
+
await screen.getByRole('button', 'Sign in').click();
|
|
92
|
+
await expect(screen.getByRole('heading', 'Welcome back')).toBeVisible();
|
|
93
|
+
|
|
94
|
+
await agent.act('Add the cheapest item on the page to the cart and open the cart');
|
|
95
|
+
await expect(screen.getByRole('heading', 'Your cart')).toBeVisible();
|
|
96
|
+
});
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
The main rules are:
|
|
100
|
+
|
|
101
|
+
- One `agent.act` per goal, followed by an `expect`. The assertion makes the
|
|
102
|
+
step's cache entry eligible for replay, and it is what fails when the agent
|
|
103
|
+
did the wrong thing.
|
|
104
|
+
- No sleeps. Locators poll, actions wait for their target, and `expect`
|
|
105
|
+
retries until its timeout.
|
|
106
|
+
- Secrets through `credentials.user(name)`, declared in the config, never
|
|
107
|
+
literal in a test.
|
|
108
|
+
|
|
109
|
+
## How an agent runs it
|
|
110
|
+
|
|
111
|
+
<CodeGroup>
|
|
112
|
+
```bash npm
|
|
113
|
+
npx e2e run tests/checkout.e2e.ts
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
```bash pnpm
|
|
117
|
+
pnpm exec e2e run tests/checkout.e2e.ts
|
|
118
|
+
```
|
|
119
|
+
|
|
120
|
+
```bash bun
|
|
121
|
+
bunx e2e run tests/checkout.e2e.ts
|
|
122
|
+
```
|
|
123
|
+
</CodeGroup>
|
|
124
|
+
|
|
125
|
+
Run one file while iterating. For model configuration and credentials, see
|
|
126
|
+
[Models](/models). Fix CLI, config, and collection errors before
|
|
127
|
+
retrying a run.
|
|
128
|
+
|
|
129
|
+
## How an agent reads the result
|
|
130
|
+
|
|
131
|
+
Every run that gets to its tests writes `.e2e/report.json`. For a report that is easier to read,
|
|
132
|
+
run:
|
|
133
|
+
|
|
134
|
+
<CodeGroup>
|
|
135
|
+
```bash npm
|
|
136
|
+
npx e2e run tests/checkout.e2e.ts --reporter list,markdown
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
```bash pnpm
|
|
140
|
+
pnpm exec e2e run tests/checkout.e2e.ts --reporter list,markdown
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
```bash bun
|
|
144
|
+
bunx e2e run tests/checkout.e2e.ts --reporter list,markdown
|
|
145
|
+
```
|
|
146
|
+
</CodeGroup>
|
|
147
|
+
|
|
148
|
+
This writes `.e2e/summary.md` and a page for each failed or flaky test under
|
|
149
|
+
`.e2e/failures/`. Start with the failure page. It includes the failing line,
|
|
150
|
+
steps, recent model turns, and the screen at failure.
|
|
151
|
+
|
|
152
|
+
When reading JSON, check `run.errors` for run-level failures, then the last
|
|
153
|
+
attempt of each failed result. Its `error`, `steps`, and `artifacts` show
|
|
154
|
+
what failed and how far the test got. `--reporter json` also prints the JSON
|
|
155
|
+
report to stdout.
|
|
156
|
+
|
|
157
|
+
For model-call details, use `--ai-trace` and read the trace with
|
|
158
|
+
[unbox-ai](/debugging#agent-steps). Avoid opening the raw trace in an agent's
|
|
159
|
+
context; it repeats prompts and can be several megabytes.
|
|
160
|
+
|
|
161
|
+
## How an agent treats the cache
|
|
162
|
+
|
|
163
|
+
A verified `agent.act` can replay from `.e2e/cache/` on later runs. Use
|
|
164
|
+
`--no-cache` to check the live agent behavior after changing a test or to
|
|
165
|
+
investigate a replay failure. Pair it with `--ai-trace` to capture every
|
|
166
|
+
model call in the flow.
|
|
167
|
+
|
|
168
|
+
Do not edit recordings by hand. A failed read-write run removes implicated
|
|
169
|
+
entries so a later verified run can replace them. A failure where no model
|
|
170
|
+
answered implicates nothing and removes none. See
|
|
171
|
+
[Caching agent steps](/cache).
|
|
172
|
+
|
|
173
|
+
<CardGroup cols={2}>
|
|
174
|
+
<Card title="CLI reference" icon="terminal" href="/reference/cli">
|
|
175
|
+
init, guide, mcp, and run, flag by flag.
|
|
176
|
+
</Card>
|
|
177
|
+
<Card title="MCP server" icon="server" href="/reference/mcp">
|
|
178
|
+
Inspect the app before writing a test.
|
|
179
|
+
</Card>
|
|
180
|
+
<Card title="Debugging a run" icon="bug" href="/debugging">
|
|
181
|
+
The report, the artifacts, and the agent flags.
|
|
182
|
+
</Card>
|
|
183
|
+
</CardGroup>
|