@e2edev/e2e 0.5.0 → 0.6.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 +64 -25
- package/dist/agent/act.d.ts +2 -2
- package/dist/agent/act.js +14 -37
- package/dist/agent/act.js.map +1 -1
- package/dist/agent/actions.d.ts +2 -2
- package/dist/agent/actions.d.ts.map +1 -1
- package/dist/agent/actions.js +1 -1
- package/dist/agent/ai-sdk.d.ts +1 -2
- package/dist/agent/ai-sdk.d.ts.map +1 -1
- package/dist/agent/ai-sdk.js +1 -2
- package/dist/agent/ai-sdk.js.map +1 -1
- package/dist/agent/default-agent.d.ts +10 -32
- package/dist/agent/default-agent.d.ts.map +1 -1
- package/dist/agent/default-agent.js +6 -13
- package/dist/agent/default-agent.js.map +1 -1
- package/dist/agent/derived.d.ts +1 -1
- package/dist/agent/derived.js +1 -1
- package/dist/agent/error.d.ts +2 -4
- package/dist/agent/error.d.ts.map +1 -1
- package/dist/agent/error.js +3 -5
- package/dist/agent/error.js.map +1 -1
- package/dist/agent/executor.d.ts +23 -52
- package/dist/agent/executor.d.ts.map +1 -1
- package/dist/agent/executor.js +1 -2
- package/dist/agent/executor.js.map +1 -1
- package/dist/agent/index.d.ts +1 -1
- package/dist/agent/index.d.ts.map +1 -1
- package/dist/agent/index.js +10 -7
- package/dist/agent/index.js.map +1 -1
- package/dist/agent/invocation.d.ts +8 -6
- package/dist/agent/invocation.d.ts.map +1 -1
- package/dist/agent/invocation.js +9 -4
- package/dist/agent/invocation.js.map +1 -1
- package/dist/agent/ledger.d.ts +17 -12
- package/dist/agent/ledger.d.ts.map +1 -1
- package/dist/agent/ledger.js +6 -9
- package/dist/agent/ledger.js.map +1 -1
- package/dist/agent/model/adapter.d.ts +7 -4
- package/dist/agent/model/adapter.d.ts.map +1 -1
- package/dist/agent/model/adapter.js +2 -2
- package/dist/agent/model/adapter.js.map +1 -1
- package/dist/agent/model/router.d.ts +1 -1
- package/dist/agent/model/router.d.ts.map +1 -1
- package/dist/agent/model/router.js +1 -1
- package/dist/agent/model/router.js.map +1 -1
- package/dist/agent/model/sdk.d.ts +11 -1
- package/dist/agent/model/sdk.d.ts.map +1 -1
- package/dist/agent/model/sdk.js +54 -10
- package/dist/agent/model/sdk.js.map +1 -1
- package/dist/agent/observation.d.ts +7 -7
- package/dist/agent/observation.d.ts.map +1 -1
- package/dist/agent/observation.js +7 -7
- package/dist/agent/observation.js.map +1 -1
- package/dist/agent/phases.d.ts +3 -3
- package/dist/agent/phases.d.ts.map +1 -1
- package/dist/agent/phases.js +4 -4
- package/dist/agent/phases.js.map +1 -1
- package/dist/agent/primitives.d.ts +4 -25
- package/dist/agent/primitives.d.ts.map +1 -1
- package/dist/agent/primitives.js +3 -36
- package/dist/agent/primitives.js.map +1 -1
- package/dist/agent/prompts.d.ts +1 -1
- package/dist/agent/prompts.js +1 -1
- package/dist/agent/protocol.d.ts +2 -3
- package/dist/agent/protocol.d.ts.map +1 -1
- package/dist/agent/protocol.js +2 -3
- package/dist/agent/protocol.js.map +1 -1
- package/dist/agent/public.d.ts +8 -10
- package/dist/agent/public.d.ts.map +1 -1
- package/dist/agent/public.js +7 -8
- package/dist/agent/public.js.map +1 -1
- package/dist/agent/replay.d.ts +2 -2
- package/dist/agent/replay.d.ts.map +1 -1
- package/dist/agent/replay.js +1 -1
- package/dist/agent/secrets.d.ts +3 -3
- package/dist/agent/secrets.d.ts.map +1 -1
- package/dist/agent/secrets.js +4 -4
- package/dist/agent/secrets.js.map +1 -1
- package/dist/agent/step-cache.d.ts +1 -1
- package/dist/agent/step-cache.d.ts.map +1 -1
- package/dist/agent/step-cache.js +7 -1
- package/dist/agent/step-cache.js.map +1 -1
- package/dist/agent/tool-loop.d.ts +9 -33
- package/dist/agent/tool-loop.d.ts.map +1 -1
- package/dist/agent/tool-loop.js +15 -38
- package/dist/agent/tool-loop.js.map +1 -1
- package/dist/agent/tool.d.ts +4 -5
- package/dist/agent/tool.d.ts.map +1 -1
- package/dist/agent/tool.js +2 -7
- package/dist/agent/tool.js.map +1 -1
- package/dist/cache/anchors.d.ts +2 -2
- package/dist/cache/anchors.d.ts.map +1 -1
- package/dist/cache/anchors.js +1 -1
- package/dist/cache/context.d.ts +6 -1
- package/dist/cache/context.d.ts.map +1 -1
- package/dist/cache/context.js +2 -1
- package/dist/cache/context.js.map +1 -1
- package/dist/cache/decide.d.ts +1 -1
- package/dist/cache/decide.js +1 -1
- package/dist/cache/identity.d.ts +9 -9
- package/dist/cache/identity.d.ts.map +1 -1
- package/dist/cache/identity.js +6 -6
- package/dist/cache/identity.js.map +1 -1
- package/dist/cache/recorder.d.ts +4 -2
- package/dist/cache/recorder.d.ts.map +1 -1
- package/dist/cache/recorder.js +10 -1
- package/dist/cache/recorder.js.map +1 -1
- package/dist/cache/relocate.d.ts +2 -2
- package/dist/cache/relocate.d.ts.map +1 -1
- package/dist/cache/relocate.js +1 -1
- package/dist/cache/store.d.ts +1 -1
- package/dist/cache/store.js +1 -1
- package/dist/cache/trace.d.ts +16 -1
- package/dist/cache/trace.d.ts.map +1 -1
- package/dist/cache/trace.js +22 -1
- package/dist/cache/trace.js.map +1 -1
- package/dist/cli/bin.js +9 -1
- package/dist/cli/bin.js.map +1 -1
- package/dist/cli/cache.d.ts +25 -0
- package/dist/cli/cache.d.ts.map +1 -0
- package/dist/cli/cache.js +249 -0
- package/dist/cli/cache.js.map +1 -0
- package/dist/cli/docs-url.d.ts +3 -0
- package/dist/cli/docs-url.d.ts.map +1 -0
- package/dist/cli/docs-url.js +3 -0
- package/dist/cli/docs-url.js.map +1 -0
- package/dist/cli/guide.d.ts +4 -0
- package/dist/cli/guide.d.ts.map +1 -0
- package/dist/cli/guide.js +16 -0
- package/dist/cli/guide.js.map +1 -0
- package/dist/cli/index.d.ts +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +211 -42
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/init/agent-skill.d.ts +34 -0
- package/dist/cli/init/agent-skill.d.ts.map +1 -0
- package/dist/cli/init/agent-skill.js +44 -0
- package/dist/cli/init/agent-skill.js.map +1 -0
- package/dist/cli/init/{backends.d.ts → engines.d.ts} +39 -32
- package/dist/cli/init/engines.d.ts.map +1 -0
- package/dist/cli/init/{backends.js → engines.js} +43 -34
- package/dist/cli/init/engines.js.map +1 -0
- package/dist/cli/init/package.d.ts +19 -3
- package/dist/cli/init/package.d.ts.map +1 -1
- package/dist/cli/init/package.js +20 -20
- package/dist/cli/init/package.js.map +1 -1
- package/dist/cli/init/scaffold.d.ts +3 -3
- package/dist/cli/init/scaffold.d.ts.map +1 -1
- package/dist/cli/init/scaffold.js +13 -12
- package/dist/cli/init/scaffold.js.map +1 -1
- package/dist/cli/init.d.ts +14 -2
- package/dist/cli/init.d.ts.map +1 -1
- package/dist/cli/init.js +104 -25
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/signals.d.ts +5 -2
- package/dist/cli/signals.d.ts.map +1 -1
- package/dist/cli/signals.js +9 -3
- package/dist/cli/signals.js.map +1 -1
- package/dist/cli/skill.d.ts +16 -0
- package/dist/cli/skill.d.ts.map +1 -0
- package/dist/cli/skill.js +57 -0
- package/dist/cli/skill.js.map +1 -0
- package/dist/collect/collect.d.ts +40 -3
- package/dist/collect/collect.d.ts.map +1 -1
- package/dist/collect/collect.js +142 -19
- package/dist/collect/collect.js.map +1 -1
- package/dist/collect/registry.d.ts +1 -1
- package/dist/collect/registry.d.ts.map +1 -1
- package/dist/collect/registry.js +2 -2
- package/dist/collect/registry.js.map +1 -1
- package/dist/collect/select.d.ts +1 -1
- package/dist/collect/select.d.ts.map +1 -1
- package/dist/collect/select.js +81 -8
- package/dist/collect/select.js.map +1 -1
- package/dist/config/agent.d.ts +14 -2
- package/dist/config/agent.d.ts.map +1 -1
- package/dist/config/agent.js +36 -11
- package/dist/config/agent.js.map +1 -1
- package/dist/config/app.d.ts +76 -19
- package/dist/config/app.d.ts.map +1 -1
- package/dist/config/app.js +159 -104
- package/dist/config/app.js.map +1 -1
- package/dist/config/diagnose.d.ts +15 -0
- package/dist/config/diagnose.d.ts.map +1 -0
- package/dist/config/diagnose.js +122 -0
- package/dist/config/diagnose.js.map +1 -0
- package/dist/config/load.d.ts +9 -1
- package/dist/config/load.d.ts.map +1 -1
- package/dist/config/load.js +35 -3
- package/dist/config/load.js.map +1 -1
- package/dist/config/resolve.d.ts +8 -7
- package/dist/config/resolve.d.ts.map +1 -1
- package/dist/config/resolve.js +73 -40
- package/dist/config/resolve.js.map +1 -1
- package/dist/config/validate.d.ts +6 -2
- package/dist/config/validate.d.ts.map +1 -1
- package/dist/config/validate.js +20 -3
- package/dist/config/validate.js.map +1 -1
- package/dist/credentials.d.ts +1 -1
- package/dist/credentials.d.ts.map +1 -1
- package/dist/credentials.js +1 -1
- package/dist/credentials.js.map +1 -1
- package/dist/{backend → engine}/contract.d.ts +27 -19
- package/dist/engine/contract.d.ts.map +1 -0
- package/dist/{backend → engine}/contract.js +18 -18
- package/dist/engine/contract.js.map +1 -0
- package/dist/{backend → engine}/index.d.ts +141 -79
- package/dist/engine/index.d.ts.map +1 -0
- package/dist/{backend → engine}/index.js +62 -37
- package/dist/engine/index.js.map +1 -0
- package/dist/engine/session.d.ts +23 -0
- package/dist/engine/session.d.ts.map +1 -0
- package/dist/{backend → engine}/session.js +58 -51
- package/dist/engine/session.js.map +1 -0
- package/dist/{backend → engine}/surface.d.ts +11 -11
- package/dist/engine/surface.d.ts.map +1 -0
- package/dist/{backend → engine}/surface.js +2 -2
- package/dist/engine/surface.js.map +1 -0
- package/dist/engine/timing.d.ts.map +1 -0
- package/dist/engine/timing.js +8 -0
- package/dist/engine/timing.js.map +1 -0
- package/dist/expect/async.d.ts +1 -1
- package/dist/expect/async.d.ts.map +1 -1
- package/dist/expect/async.js +37 -1
- package/dist/expect/async.js.map +1 -1
- package/dist/expect/index.js +1 -1
- package/dist/expect/values.d.ts +1 -1
- package/dist/expect/values.d.ts.map +1 -1
- package/dist/expect/values.js +1 -1
- package/dist/expect/values.js.map +1 -1
- package/dist/index.d.ts +3 -5
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -5
- package/dist/index.js.map +1 -1
- package/dist/internal/brands.d.ts +1 -1
- package/dist/internal/brands.d.ts.map +1 -1
- package/dist/internal/brands.js +1 -1
- package/dist/internal/brands.js.map +1 -1
- package/dist/internal/errors.d.ts +37 -19
- package/dist/internal/errors.d.ts.map +1 -1
- package/dist/internal/errors.js +94 -44
- package/dist/internal/errors.js.map +1 -1
- package/dist/internal/globs.d.ts +2 -2
- package/dist/internal/globs.d.ts.map +1 -1
- package/dist/internal/globs.js +2 -2
- package/dist/internal/globs.js.map +1 -1
- package/dist/internal/ids.d.ts +3 -3
- package/dist/internal/ids.d.ts.map +1 -1
- package/dist/internal/ids.js +3 -3
- package/dist/internal/ids.js.map +1 -1
- package/dist/internal/node-version.d.ts +10 -0
- package/dist/internal/node-version.d.ts.map +1 -0
- package/dist/internal/node-version.js +28 -0
- package/dist/internal/node-version.js.map +1 -0
- package/dist/internal/objects.d.ts +21 -0
- package/dist/internal/objects.d.ts.map +1 -0
- package/dist/internal/objects.js +14 -0
- package/dist/internal/objects.js.map +1 -0
- package/dist/internal/package-manager.d.ts +10 -0
- package/dist/internal/package-manager.d.ts.map +1 -0
- package/dist/internal/package-manager.js +43 -0
- package/dist/internal/package-manager.js.map +1 -0
- package/dist/internal/redact.d.ts +1 -1
- package/dist/internal/redact.d.ts.map +1 -1
- package/dist/internal/redact.js +1 -1
- package/dist/internal/redact.js.map +1 -1
- package/dist/internal/suggest.d.ts +16 -0
- package/dist/internal/suggest.d.ts.map +1 -0
- package/dist/internal/suggest.js +61 -0
- package/dist/internal/suggest.js.map +1 -0
- package/dist/internal/text.d.ts +1 -1
- package/dist/internal/text.d.ts.map +1 -1
- package/dist/internal/text.js +1 -1
- package/dist/internal/text.js.map +1 -1
- package/dist/internal/urls.d.ts +3 -3
- package/dist/internal/urls.d.ts.map +1 -1
- package/dist/internal/urls.js +8 -3
- package/dist/internal/urls.js.map +1 -1
- package/dist/locator/engine.d.ts +7 -7
- package/dist/locator/engine.d.ts.map +1 -1
- package/dist/locator/engine.js +14 -14
- package/dist/locator/engine.js.map +1 -1
- package/dist/locator/expression.d.ts +5 -3
- package/dist/locator/expression.d.ts.map +1 -1
- package/dist/locator/expression.js +25 -5
- package/dist/locator/expression.js.map +1 -1
- package/dist/locator/screen.d.ts +1 -1
- package/dist/locator/screen.d.ts.map +1 -1
- package/dist/locator/screen.js +3 -3
- package/dist/locator/screen.js.map +1 -1
- package/dist/report/build.d.ts +10 -9
- package/dist/report/build.d.ts.map +1 -1
- package/dist/report/build.js +25 -22
- package/dist/report/build.js.map +1 -1
- package/dist/report/code-frame.d.ts +8 -4
- package/dist/report/code-frame.d.ts.map +1 -1
- package/dist/report/code-frame.js +23 -18
- package/dist/report/code-frame.js.map +1 -1
- package/dist/report/debug-steps.js +1 -1
- package/dist/report/debug-steps.js.map +1 -1
- package/dist/report/format.d.ts +73 -0
- package/dist/report/format.d.ts.map +1 -0
- package/dist/report/format.js +147 -0
- package/dist/report/format.js.map +1 -0
- package/dist/report/junit.d.ts +1 -1
- package/dist/report/junit.d.ts.map +1 -1
- package/dist/report/junit.js +1 -1
- package/dist/report/junit.js.map +1 -1
- package/dist/report/list.d.ts +96 -47
- package/dist/report/list.d.ts.map +1 -1
- package/dist/report/list.js +489 -244
- package/dist/report/list.js.map +1 -1
- package/dist/report/live-window.d.ts +28 -0
- package/dist/report/live-window.d.ts.map +1 -0
- package/dist/report/live-window.js +102 -0
- package/dist/report/live-window.js.map +1 -0
- package/dist/report/write.d.ts +1 -1
- package/dist/report/write.d.ts.map +1 -1
- package/dist/report/write.js +1 -1
- package/dist/report/write.js.map +1 -1
- package/dist/run/budget.d.ts +2 -2
- package/dist/run/budget.js +2 -2
- package/dist/run/declared-processes.d.ts +30 -0
- package/dist/run/declared-processes.d.ts.map +1 -0
- package/dist/run/declared-processes.js +61 -0
- package/dist/run/declared-processes.js.map +1 -0
- package/dist/run/events.d.ts +30 -2
- package/dist/run/events.d.ts.map +1 -1
- package/dist/run/events.js.map +1 -1
- package/dist/run/execute.d.ts +19 -16
- package/dist/run/execute.d.ts.map +1 -1
- package/dist/run/execute.js +65 -67
- package/dist/run/execute.js.map +1 -1
- package/dist/run/fixture-recording.d.ts +10 -4
- package/dist/run/fixture-recording.d.ts.map +1 -1
- package/dist/run/fixture-recording.js +19 -6
- package/dist/run/fixture-recording.js.map +1 -1
- package/dist/run/fixtures.d.ts +2 -2
- package/dist/run/fixtures.d.ts.map +1 -1
- package/dist/run/fixtures.js +72 -44
- package/dist/run/fixtures.js.map +1 -1
- package/dist/run/in-process.d.ts +1 -1
- package/dist/run/in-process.js +1 -1
- package/dist/run/managed-process.d.ts +46 -9
- package/dist/run/managed-process.d.ts.map +1 -1
- package/dist/run/managed-process.js +136 -50
- package/dist/run/managed-process.js.map +1 -1
- package/dist/run/realm.d.ts +2 -2
- package/dist/run/realm.js +2 -2
- package/dist/run/runner.d.ts +23 -1
- package/dist/run/runner.d.ts.map +1 -1
- package/dist/run/runner.js +111 -40
- package/dist/run/runner.js.map +1 -1
- package/dist/run/scheduler.d.ts +5 -5
- package/dist/run/scheduler.d.ts.map +1 -1
- package/dist/run/scheduler.js +7 -7
- package/dist/run/scheduler.js.map +1 -1
- package/dist/run/serial.d.ts +10 -2
- package/dist/run/serial.d.ts.map +1 -1
- package/dist/run/serial.js +5 -3
- package/dist/run/serial.js.map +1 -1
- package/dist/run/sessions.d.ts +10 -10
- package/dist/run/sessions.d.ts.map +1 -1
- package/dist/run/sessions.js +11 -11
- package/dist/run/sessions.js.map +1 -1
- package/dist/run/steps.d.ts +3 -3
- package/dist/run/steps.d.ts.map +1 -1
- package/dist/run/steps.js +1 -1
- package/dist/run/steps.js.map +1 -1
- package/dist/run/units.d.ts +1 -1
- package/dist/run/units.js +1 -1
- package/dist/run/worker/entry.d.ts +1 -1
- package/dist/run/worker/entry.js +2 -2
- package/dist/run/worker/entry.js.map +1 -1
- package/dist/run/worker/protocol.d.ts +18 -6
- package/dist/run/worker/protocol.d.ts.map +1 -1
- package/dist/run/worker/protocol.js +1 -1
- package/dist/run/worker/protocol.js.map +1 -1
- package/dist/run/worker/session.d.ts +2 -2
- package/dist/run/worker/session.d.ts.map +1 -1
- package/dist/run/worker/session.js +5 -3
- package/dist/run/worker/session.js.map +1 -1
- package/dist/types.d.ts +58 -41
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +2 -2
- package/package.json +13 -12
- package/skills/e2e/SKILL.md +110 -0
- package/skills/e2e/references/agent.md +210 -0
- package/skills/e2e/references/debugging.md +81 -0
- package/skills/e2e/references/running.md +153 -0
- package/skills/e2e/references/setup.md +238 -0
- package/skills/e2e/references/writing-tests.md +289 -0
- package/dist/backend/contract.d.ts.map +0 -1
- package/dist/backend/contract.js.map +0 -1
- package/dist/backend/index.d.ts.map +0 -1
- package/dist/backend/index.js.map +0 -1
- package/dist/backend/session.d.ts +0 -23
- package/dist/backend/session.d.ts.map +0 -1
- package/dist/backend/session.js.map +0 -1
- package/dist/backend/surface.d.ts.map +0 -1
- package/dist/backend/surface.js.map +0 -1
- package/dist/backend/timing.d.ts.map +0 -1
- package/dist/backend/timing.js +0 -8
- package/dist/backend/timing.js.map +0 -1
- package/dist/cli/init/backends.d.ts.map +0 -1
- package/dist/cli/init/backends.js.map +0 -1
- package/dist/report/live-status.d.ts +0 -51
- package/dist/report/live-status.d.ts.map +0 -1
- package/dist/report/live-status.js +0 -163
- package/dist/report/live-status.js.map +0 -1
- package/dist/run/fixture-legacy.d.ts +0 -36
- package/dist/run/fixture-legacy.d.ts.map +0 -1
- package/dist/run/fixture-legacy.js +0 -143
- package/dist/run/fixture-legacy.js.map +0 -1
- /package/dist/{backend → engine}/timing.d.ts +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
3
|
-
*
|
|
4
|
-
* `@e2edev/e2e/
|
|
2
|
+
* The engine contract vocabulary: the platform-neutral types every
|
|
3
|
+
* engine speaks and the harness consumes. An engine imports these from
|
|
4
|
+
* `@e2edev/e2e/engine`; core never imports anything from an engine.
|
|
5
5
|
*
|
|
6
6
|
* Everything here is capability vocabulary - semantic nodes, locator
|
|
7
7
|
* expressions, action kinds, the error contract - never a platform noun. A
|
|
@@ -9,18 +9,18 @@
|
|
|
9
9
|
* words, which is what lets `screen`, `expect`, and the agent work identically
|
|
10
10
|
* on all of them.
|
|
11
11
|
*/
|
|
12
|
-
/** The
|
|
13
|
-
export const
|
|
12
|
+
/** The engine contract version this runner speaks. */
|
|
13
|
+
export const ENGINE_SPI_VERSION = 1;
|
|
14
14
|
/**
|
|
15
|
-
* Per-field bounds
|
|
15
|
+
* Per-field bounds an engine applies to observation-tree nodes. A `name` or
|
|
16
16
|
* `text` whose length reaches its limit was cut at exactly that limit, so
|
|
17
17
|
* "length >= limit" is a precise truncation signal; every shorter value is
|
|
18
18
|
* complete. Single-node reads are unbounded and always carry the full value.
|
|
19
19
|
*/
|
|
20
20
|
export const OBSERVED_NAME_LIMIT = 256;
|
|
21
21
|
export const OBSERVED_TEXT_LIMIT = 512;
|
|
22
|
-
/** The closed
|
|
23
|
-
export const
|
|
22
|
+
/** The closed engine error code set; the type is derived from it, so the two cannot drift. */
|
|
23
|
+
export const ENGINE_ERROR_CODES = [
|
|
24
24
|
'NODE_STALE',
|
|
25
25
|
'FRAME_NOT_FOUND',
|
|
26
26
|
'FRAME_AMBIGUOUS',
|
|
@@ -30,31 +30,31 @@ export const BACKEND_ERROR_CODES = [
|
|
|
30
30
|
'CANCELLED',
|
|
31
31
|
'UNSUPPORTED_CAPABILITY',
|
|
32
32
|
'INVALID_STATE',
|
|
33
|
-
'
|
|
33
|
+
'ENGINE_FAILURE',
|
|
34
34
|
];
|
|
35
35
|
/**
|
|
36
36
|
* The only codes that may be retryable: both describe a repeatable read. Any
|
|
37
37
|
* other retryable claim, from this module's class or a foreign copy of it, is
|
|
38
|
-
* coerced to a non-retryable `
|
|
38
|
+
* coerced to a non-retryable `ENGINE_FAILURE`.
|
|
39
39
|
*/
|
|
40
|
-
export const
|
|
40
|
+
export const RETRYABLE_ENGINE_ERROR_CODES = new Set([
|
|
41
41
|
'NODE_STALE',
|
|
42
42
|
'FRAME_NOT_FOUND',
|
|
43
43
|
]);
|
|
44
44
|
/**
|
|
45
|
-
* The error contract
|
|
46
|
-
* to `
|
|
47
|
-
* a non-retryable `
|
|
45
|
+
* The error contract an engine throws across the seam. Retryability is closed
|
|
46
|
+
* to `RETRYABLE_ENGINE_ERROR_CODES`; any other retryable claim is coerced to
|
|
47
|
+
* a non-retryable `ENGINE_FAILURE` so an engine can never talk the harness
|
|
48
48
|
* into repeating an action that may have committed.
|
|
49
49
|
*/
|
|
50
|
-
export class
|
|
50
|
+
export class EngineError extends Error {
|
|
51
51
|
code;
|
|
52
52
|
retryable;
|
|
53
53
|
constructor(code, message, options) {
|
|
54
54
|
super(message, options.cause === undefined ? undefined : { cause: options.cause });
|
|
55
|
-
this.name = '
|
|
56
|
-
if (options.retryable && !
|
|
57
|
-
this.code = '
|
|
55
|
+
this.name = 'EngineError';
|
|
56
|
+
if (options.retryable && !RETRYABLE_ENGINE_ERROR_CODES.has(code)) {
|
|
57
|
+
this.code = 'ENGINE_FAILURE';
|
|
58
58
|
this.retryable = false;
|
|
59
59
|
return;
|
|
60
60
|
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../../src/engine/contract.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAIH,sDAAsD;AACtD,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC;AAuEpC;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AACvC,MAAM,CAAC,MAAM,mBAAmB,GAAG,GAAG,CAAC;AAgGvC,8FAA8F;AAC9F,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,YAAY;IACZ,iBAAiB;IACjB,iBAAiB;IACjB,gBAAgB;IAChB,2BAA2B;IAC3B,mBAAmB;IACnB,WAAW;IACX,wBAAwB;IACxB,eAAe;IACf,gBAAgB;CACR,CAAC;AAIX;;;;GAIG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAiC,IAAI,GAAG,CAAC;IAChF,YAAY;IACZ,iBAAiB;CAClB,CAAC,CAAC;AAEH;;;;;GAKG;AACH,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,SAAS,CAAU;IAE5B,YACE,IAAqB,EACrB,OAAe,EACf,OAAgD;QAEhD,KAAK,CAAC,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QACnF,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,OAAO,CAAC,SAAS,IAAI,CAAC,4BAA4B,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACjE,IAAI,CAAC,IAAI,GAAG,gBAAgB,CAAC;YAC7B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;YACvB,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,SAAS,CAAC;IACrC,CAAC;CACF"}
|
|
@@ -1,24 +1,24 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* The
|
|
2
|
+
* The engine contract: the typed, model-free body of one target.
|
|
3
3
|
*
|
|
4
|
-
*
|
|
4
|
+
* An engine never talks to a model. It declares capabilities - observation,
|
|
5
5
|
* actions, location, state, artifacts, contributed fixtures - and the harness
|
|
6
|
-
* grades what a target can do from what its
|
|
6
|
+
* grades what a target can do from what its engine declares: observation
|
|
7
7
|
* unlocks the judgment tier and prompt snapshots, `perform` unlocks the
|
|
8
8
|
* harness-routed node actions (the agent's grammar verbs and the `screen`
|
|
9
9
|
* tier's actions alike), location unlocks `screen`/`expect`. Every piece of
|
|
10
10
|
* model-facing vocabulary is an agent-side `defineTool`; a target with no
|
|
11
|
-
*
|
|
11
|
+
* engine at all is valid and simply runs everything opaque.
|
|
12
12
|
*
|
|
13
|
-
* Core knows this contract and never
|
|
14
|
-
* appears here. A document
|
|
13
|
+
* Core knows this contract and never an engine's internals: no platform noun
|
|
14
|
+
* appears here. A document engine, a simulator engine, and a desktop engine
|
|
15
15
|
* fill in the same members with different bodies.
|
|
16
16
|
*
|
|
17
|
-
* `
|
|
18
|
-
* synchronously, at config load - a malformed
|
|
17
|
+
* `defineEngine` is the loud manifest: capability detection happens here,
|
|
18
|
+
* synchronously, at config load - a malformed engine fails the run instead
|
|
19
19
|
* of silently demoting itself to a lower tier.
|
|
20
20
|
*/
|
|
21
|
-
import {
|
|
21
|
+
import { engineBrand } from '../internal/brands.ts';
|
|
22
22
|
export { ConfigurationError, InfrastructureError, TestError } from '../internal/errors.ts';
|
|
23
23
|
export { validateJsonValue, type JsonValueRules } from '../internal/json-value.ts';
|
|
24
24
|
export { describePattern, matchesText, toTextPattern } from '../internal/text.ts';
|
|
@@ -26,23 +26,83 @@ export type { TextMatch } from '../types.ts';
|
|
|
26
26
|
export { raceAbort } from './timing.ts';
|
|
27
27
|
export { Deadline, pollCondition, withTimeout, withinCleanupBudget, type PollConditionOptions } from '../internal/time.ts';
|
|
28
28
|
export { urlMatches } from '../internal/urls.ts';
|
|
29
|
-
|
|
30
|
-
import {
|
|
29
|
+
export { obj, type WithoutUndefined } from '../internal/objects.ts';
|
|
30
|
+
import type { CommandConfig, Expectable, Locator, Momentum, Screen, ScrollDirection, ServiceConfig } from '../types.ts';
|
|
31
|
+
import { type EngineSpiVersion, type LocatorAction, type LocatorExpression, type NodeRef, type ObservationPixels, type OperationContext, type SemanticNode } from './contract.ts';
|
|
31
32
|
export type * from './contract.ts';
|
|
32
|
-
export {
|
|
33
|
-
export type { Expectable, JsonValue, Locator, Momentum, Platform, Screen, ScrollDirection, SelectOption, } from '../types.ts';
|
|
33
|
+
export { ENGINE_ERROR_CODES, ENGINE_SPI_VERSION, EngineError, OBSERVED_NAME_LIMIT, OBSERVED_TEXT_LIMIT, RETRYABLE_ENGINE_ERROR_CODES, } from './contract.ts';
|
|
34
|
+
export type { CommandConfig, ServiceConfig, Expectable, JsonValue, Locator, Momentum, Platform, Screen, ScrollDirection, SelectOption, } from '../types.ts';
|
|
34
35
|
/**
|
|
35
36
|
* Capability names: the closed harness capabilities plus one name per
|
|
36
37
|
* contributed fixture. `actions` is `perform`; `location` is `locate`. Both
|
|
37
38
|
* require observation, because their refs live in the observation's id space.
|
|
38
39
|
*/
|
|
39
|
-
export type
|
|
40
|
-
/**
|
|
41
|
-
|
|
40
|
+
export type EngineCapability = 'observation' | 'actions' | 'location' | 'state' | 'artifacts' | (string & {});
|
|
41
|
+
/**
|
|
42
|
+
* What an engine declares about the app it drives. The app
|
|
43
|
+
* under test is the engine's to describe: a browser engine names a URL, a
|
|
44
|
+
* device engine a bundle id. The harness resolves the declaration once per
|
|
45
|
+
* target and owns everything built on it - navigation and origin policy,
|
|
46
|
+
* cache and session identity, the report's target record, and the app
|
|
47
|
+
* process it starts before the run.
|
|
48
|
+
*/
|
|
49
|
+
export interface EngineAppDeclaration {
|
|
50
|
+
/**
|
|
51
|
+
* Base URL of an addressable app: `app.open()` opens it and relative
|
|
52
|
+
* navigation resolves against it. WHATWG-normalized; no userinfo, query, or
|
|
53
|
+
* fragment; a missing scheme becomes `https://`, or `http://` for a
|
|
54
|
+
* loopback host. Plain HTTP is accepted for loopback hosts only.
|
|
55
|
+
*/
|
|
56
|
+
readonly url?: string;
|
|
57
|
+
/**
|
|
58
|
+
* Origins navigation and secret fills admit; each entry a serialized
|
|
59
|
+
* origin. Defaults to the URL's origin, or to none without a URL.
|
|
60
|
+
*/
|
|
61
|
+
readonly allowedOrigins?: readonly string[];
|
|
62
|
+
/**
|
|
63
|
+
* Labels the target in the report and joins the cache and session identity
|
|
64
|
+
* digest; never gates a run. Defaults to `test` for loopback, `.localhost`,
|
|
65
|
+
* and `.test` hosts and for a surface without a URL, `production` otherwise.
|
|
66
|
+
*/
|
|
67
|
+
readonly environment?: 'test' | 'staging' | 'production';
|
|
68
|
+
/**
|
|
69
|
+
* Stable logical identity of the app under test, keying trace cache and
|
|
70
|
+
* session entries. Defaults to the URL's origin and base path, so an
|
|
71
|
+
* ephemeral per-deploy origin (a PR preview) cold-starts every entry; an
|
|
72
|
+
* explicit identity keys them by what the app *is* instead of where it is
|
|
73
|
+
* served this run. A surface without a URL has no default: declare one
|
|
74
|
+
* (a bundle id, say) or entries key on the target alone. Never share one
|
|
75
|
+
* identity across genuinely different apps: recorded traces would replay
|
|
76
|
+
* across them.
|
|
77
|
+
*/
|
|
78
|
+
readonly identity?: string;
|
|
79
|
+
/**
|
|
80
|
+
* Process the runner starts before the first test and stops on every exit
|
|
81
|
+
* path (a dev server). Structured, never shell-interpreted; the child
|
|
82
|
+
* inherits only `PATH`, `HOME`, the temp-directory variables, and
|
|
83
|
+
* `command.env`. Targets declaring the same command share one process,
|
|
84
|
+
* probed at the first declaring target's `readyUrl`.
|
|
85
|
+
*/
|
|
86
|
+
readonly command?: CommandConfig;
|
|
87
|
+
/** URL polled until `command` is ready (a 200-499 status); defaults to `url`. */
|
|
88
|
+
readonly readyUrl?: string;
|
|
89
|
+
/**
|
|
90
|
+
* Dependency processes the app needs before it can boot (a database
|
|
91
|
+
* container, a migration step), started in declaration order before any
|
|
92
|
+
* app command and torn down in reverse after it. Valid without `command`:
|
|
93
|
+
* the app may already be running, or be one of the services itself.
|
|
94
|
+
* Services declared identically by several targets start once; shared
|
|
95
|
+
* services must be declared in one order, and an explicit `name` must mean
|
|
96
|
+
* one process across the run.
|
|
97
|
+
*/
|
|
98
|
+
readonly services?: readonly ServiceConfig[];
|
|
99
|
+
}
|
|
100
|
+
/** The app under test as the harness resolved the engine's declaration, handed back at init. */
|
|
101
|
+
export interface EngineAppInfo {
|
|
42
102
|
/**
|
|
43
103
|
* Normalized base URL; the target of `app.open()` with no path. Absent when
|
|
44
|
-
* the
|
|
45
|
-
*
|
|
104
|
+
* the engine declared no `url`: a surface that needs one then fails the
|
|
105
|
+
* call that needs it, and never navigates to a placeholder.
|
|
46
106
|
*/
|
|
47
107
|
readonly baseUrl?: string;
|
|
48
108
|
/** Origins navigation and cookie policy admit. */
|
|
@@ -62,14 +122,14 @@ export type FixtureOperations<T extends object> = {
|
|
|
62
122
|
readonly [Key in keyof T]?: T[Key] extends (...args: infer Args) => Promise<unknown> ? FixtureOperation<Args> : T[Key] extends object ? FixtureOperations<T[Key]> : never;
|
|
63
123
|
};
|
|
64
124
|
/** Context handed to a contributed fixture factory, once per attempt. */
|
|
65
|
-
export interface
|
|
125
|
+
export interface EngineFixtureContext {
|
|
66
126
|
readonly targetName: string;
|
|
67
127
|
/** Records the declared operations before invoking them; undeclared accessors retain their identity. */
|
|
68
128
|
fixture<T extends object>(name: string, surface: T, operations: FixtureOperations<T>): T;
|
|
69
|
-
readonly app:
|
|
129
|
+
readonly app: EngineAppInfo & {
|
|
70
130
|
/**
|
|
71
131
|
* Resolves a navigation target against the base URL and the origin
|
|
72
|
-
* policy. Throws `APP_URL_REQUIRED` when
|
|
132
|
+
* policy. Throws `APP_URL_REQUIRED` when the engine declared no URL and
|
|
73
133
|
* `POLICY_DENIED` for a disallowed origin or scheme, so a fixture never
|
|
74
134
|
* re-implements the policy the harness owns.
|
|
75
135
|
*/
|
|
@@ -111,22 +171,22 @@ export interface BackendFixtureContext {
|
|
|
111
171
|
}
|
|
112
172
|
/**
|
|
113
173
|
* A contributed fixture: any record of async methods, sync accessors, and
|
|
114
|
-
* nested namespaces
|
|
115
|
-
*
|
|
116
|
-
*
|
|
174
|
+
* nested namespaces, declared through context.fixture so its metadata controls
|
|
175
|
+
* labels, deadlines and verification. The factory must return the declared
|
|
176
|
+
* surface; a plain one is rejected with INVALID_CONFIG.
|
|
117
177
|
*/
|
|
118
|
-
export type
|
|
178
|
+
export type EngineFixtureFactory = (context: EngineFixtureContext) => object;
|
|
119
179
|
/**
|
|
120
|
-
* An opaque, restorable snapshot of
|
|
180
|
+
* An opaque, restorable snapshot of an engine's state. `data` is JSON the
|
|
121
181
|
* harness never inspects - a document platform's storage state, a device's app state, a
|
|
122
182
|
* desktop's window state all satisfy it identically. `format`/`version` let a
|
|
123
|
-
*
|
|
183
|
+
* engine reject a snapshot it can no longer read.
|
|
124
184
|
*/
|
|
125
|
-
export interface
|
|
185
|
+
export interface EngineState {
|
|
126
186
|
readonly format: string;
|
|
127
187
|
readonly version: number;
|
|
128
188
|
readonly data: unknown;
|
|
129
|
-
/** Earliest moment the state is known to be invalid, if the
|
|
189
|
+
/** Earliest moment the state is known to be invalid, if the engine knows one. */
|
|
130
190
|
readonly expiresAt?: string;
|
|
131
191
|
}
|
|
132
192
|
/**
|
|
@@ -137,23 +197,23 @@ export interface BackendState {
|
|
|
137
197
|
* the app under test. The duties split at the seam. The harness owns the
|
|
138
198
|
* snapshot from the moment `capture` returns: it encrypts it at rest with a
|
|
139
199
|
* per-run AES-256-GCM key that never touches disk, stores it under the run's
|
|
140
|
-
* private session directory, binds it to the run, target,
|
|
200
|
+
* private session directory, binds it to the run, target, engine, and app
|
|
141
201
|
* identity, and deletes it when the run ends; it never logs it, reports it,
|
|
142
|
-
* digests it, or sends it to a model.
|
|
202
|
+
* digests it, or sends it to a model. An engine MUST NOT persist, cache, or
|
|
143
203
|
* log a snapshot on its own, MUST NOT echo snapshot contents in an error
|
|
144
204
|
* message, and MUST treat `restore` as a replacement of the surface's whole
|
|
145
205
|
* persisted state, never a merge, so a restored session cannot leak into the
|
|
146
206
|
* next attempt.
|
|
147
207
|
*/
|
|
148
|
-
export interface
|
|
149
|
-
capture(context: OperationContext): Promise<
|
|
150
|
-
restore(state:
|
|
208
|
+
export interface EngineStateCapability {
|
|
209
|
+
capture(context: OperationContext): Promise<EngineState>;
|
|
210
|
+
restore(state: EngineState, context: OperationContext): Promise<void>;
|
|
151
211
|
}
|
|
152
212
|
/**
|
|
153
213
|
* Evidence capture. Paths are relative to the attempt artifact directory the
|
|
154
|
-
*
|
|
214
|
+
* engine received in `startAttempt`.
|
|
155
215
|
*/
|
|
156
|
-
export interface
|
|
216
|
+
export interface EngineArtifacts {
|
|
157
217
|
/** Captures a redacted screenshot; secure fields are masked at the source. */
|
|
158
218
|
screenshot(label: string | undefined, context: OperationContext): Promise<string>;
|
|
159
219
|
/** Starts recording an execution trace for the attempt. */
|
|
@@ -162,10 +222,12 @@ export interface BackendArtifacts {
|
|
|
162
222
|
stopTrace?(context: OperationContext): Promise<string>;
|
|
163
223
|
}
|
|
164
224
|
/**
|
|
165
|
-
*
|
|
166
|
-
* `
|
|
225
|
+
* The app under test: what the engine declares about it
|
|
226
|
+
* (`EngineAppDeclaration`) and the app-level hooks behind the universal
|
|
227
|
+
* `app` fixture and the agent's `navigate` verb. Node actions never live
|
|
228
|
+
* here; they are `perform`.
|
|
167
229
|
*/
|
|
168
|
-
export interface
|
|
230
|
+
export interface EngineApp extends EngineAppDeclaration {
|
|
169
231
|
/**
|
|
170
232
|
* Opens one URL the harness already resolved against the base URL and the
|
|
171
233
|
* origin policy. Absent on a surface without addressable locations.
|
|
@@ -182,7 +244,7 @@ export interface BackendApp {
|
|
|
182
244
|
* Facts handed to `prepare`, once per run and target in the runner process,
|
|
183
245
|
* before any worker exists.
|
|
184
246
|
*/
|
|
185
|
-
export interface
|
|
247
|
+
export interface EnginePrepareInfo {
|
|
186
248
|
readonly runId: string;
|
|
187
249
|
readonly targetName: string;
|
|
188
250
|
/**
|
|
@@ -207,17 +269,17 @@ export interface BackendPrepareInfo {
|
|
|
207
269
|
readonly log: (line: string) => void;
|
|
208
270
|
}
|
|
209
271
|
/** Run identity and harness-resolved facts handed to `init`, once per worker before the first step. */
|
|
210
|
-
export interface
|
|
272
|
+
export interface EngineInitInfo {
|
|
211
273
|
readonly runId: string;
|
|
212
274
|
readonly targetName: string;
|
|
213
275
|
/**
|
|
214
276
|
* Directory relative paths in the config resolve against: the config file's
|
|
215
|
-
* directory, or the run's `cwd` for a programmatic config.
|
|
277
|
+
* directory, or the run's `cwd` for a programmatic config. An engine option
|
|
216
278
|
* naming a file (a build to install) resolves here, never against
|
|
217
279
|
* `process.cwd()`, which an in-process run does not change.
|
|
218
280
|
*/
|
|
219
281
|
readonly projectRoot: string;
|
|
220
|
-
readonly app:
|
|
282
|
+
readonly app: EngineAppInfo;
|
|
221
283
|
/** Attribute the `testId` query resolves against. */
|
|
222
284
|
readonly testIdAttribute: string;
|
|
223
285
|
/** Whether the run asked for a visible surface (`--headed`). */
|
|
@@ -226,11 +288,11 @@ export interface BackendInitInfo {
|
|
|
226
288
|
readonly signal: AbortSignal;
|
|
227
289
|
}
|
|
228
290
|
/**
|
|
229
|
-
* Per-attempt isolation context.
|
|
291
|
+
* Per-attempt isolation context. An engine that must give each test a fresh
|
|
230
292
|
* surface (a fresh isolated context per test, a reset device) sets it up in
|
|
231
293
|
* `startAttempt` and tears it down in `endAttempt`.
|
|
232
294
|
*/
|
|
233
|
-
export interface
|
|
295
|
+
export interface EngineAttemptContext {
|
|
234
296
|
readonly attemptId: string;
|
|
235
297
|
/** Absolute directory every artifact of this attempt is written under. */
|
|
236
298
|
readonly artifactsDir: string;
|
|
@@ -246,22 +308,22 @@ export interface BackendAttemptContext {
|
|
|
246
308
|
* the budget is exhausted, so a hook that cannot finish in time stops instead
|
|
247
309
|
* of running on into the next attempt's setup.
|
|
248
310
|
*/
|
|
249
|
-
export interface
|
|
311
|
+
export interface EngineCleanupContext {
|
|
250
312
|
readonly signal: AbortSignal;
|
|
251
313
|
/** Remaining cleanup budget when the call starts. */
|
|
252
314
|
readonly timeoutMs: number;
|
|
253
315
|
}
|
|
254
|
-
export interface
|
|
316
|
+
export interface EngineObserveOptions {
|
|
255
317
|
/** Requests masked viewport pixels for the same revision as the tree. */
|
|
256
318
|
readonly pixels?: boolean;
|
|
257
319
|
}
|
|
258
320
|
/**
|
|
259
321
|
* One fresh semantic snapshot of the surface under test. The harness owns
|
|
260
322
|
* everything downstream: revision minting, secret redaction, and the
|
|
261
|
-
* observation byte budget apply to every
|
|
323
|
+
* observation byte budget apply to every engine equally.
|
|
262
324
|
*/
|
|
263
|
-
export interface
|
|
264
|
-
/** Location captured with this tree, when the
|
|
325
|
+
export interface EngineSnapshot {
|
|
326
|
+
/** Location captured with this tree, when the engine can provide it. */
|
|
265
327
|
readonly url?: string;
|
|
266
328
|
readonly nodes: readonly SemanticNode[];
|
|
267
329
|
readonly viewport?: {
|
|
@@ -275,24 +337,24 @@ export interface BackendSnapshot {
|
|
|
275
337
|
readonly maskedRegionCount?: number;
|
|
276
338
|
}
|
|
277
339
|
/** The body of one target: typed, model-free, capability-graded. */
|
|
278
|
-
export interface
|
|
340
|
+
export interface Engine {
|
|
279
341
|
readonly name: string;
|
|
280
342
|
/**
|
|
281
343
|
* Implementation version, recorded as provenance and part of the trace
|
|
282
|
-
* cache identity:
|
|
283
|
-
* another version's traces, so an unversioned
|
|
344
|
+
* cache identity: an engine that resolves nodes differently must not replay
|
|
345
|
+
* another version's traces, so an unversioned engine is not accepted.
|
|
284
346
|
*/
|
|
285
347
|
readonly version: string;
|
|
286
348
|
/**
|
|
287
349
|
* Contract version literal. Additive optional members never bump it;
|
|
288
350
|
* changed required semantics do.
|
|
289
351
|
*/
|
|
290
|
-
readonly spiVersion:
|
|
352
|
+
readonly spiVersion: EngineSpiVersion;
|
|
291
353
|
/** capability: observation. */
|
|
292
|
-
observe?(context: OperationContext, options?:
|
|
354
|
+
observe?(context: OperationContext, options?: EngineObserveOptions): Promise<EngineSnapshot>;
|
|
293
355
|
/**
|
|
294
356
|
* capability: actions - requires observation. Performs exactly one action
|
|
295
|
-
* on a ref this
|
|
357
|
+
* on a ref this engine minted, from the newest observation or from
|
|
296
358
|
* `locate` (both live in one id space), with the platform's actionability
|
|
297
359
|
* checks. The agent's grammar verbs (tap, type, press, select, node scroll)
|
|
298
360
|
* and the `screen` tier's actions both bottom out here, so a surface
|
|
@@ -308,7 +370,7 @@ export interface Backend {
|
|
|
308
370
|
* capability: location - requires observation. Deterministic locator
|
|
309
371
|
* resolution for the `screen`/`expect` tier: resolve one expression to the
|
|
310
372
|
* nodes it currently matches. The harness owns polling, strictness, and
|
|
311
|
-
* staleness;
|
|
373
|
+
* staleness; an engine resolves once, immediately.
|
|
312
374
|
*/
|
|
313
375
|
locate?(expression: LocatorExpression, context: OperationContext): Promise<readonly SemanticNode[]>;
|
|
314
376
|
/**
|
|
@@ -317,17 +379,17 @@ export interface Backend {
|
|
|
317
379
|
*/
|
|
318
380
|
swipe?(direction: ScrollDirection, momentum: Momentum | undefined, context: OperationContext): Promise<void>;
|
|
319
381
|
/**
|
|
320
|
-
* Named deterministic surfaces this
|
|
382
|
+
* Named deterministic surfaces this engine contributes to TestFixtures
|
|
321
383
|
* (a device fixture, a document fixture - anything). Keys become fixture and
|
|
322
384
|
* capability names; `requires: ['<name>']` gates at selection.
|
|
323
385
|
*/
|
|
324
|
-
readonly fixtures?: Readonly<Record<string,
|
|
386
|
+
readonly fixtures?: Readonly<Record<string, EngineFixtureFactory>>;
|
|
325
387
|
/** capability: state - opaque snapshot capture/restore for session reuse. */
|
|
326
|
-
readonly state?:
|
|
388
|
+
readonly state?: EngineStateCapability;
|
|
327
389
|
/** capability: artifacts - screenshots and traces under the attempt directory. */
|
|
328
|
-
readonly artifacts?:
|
|
329
|
-
/**
|
|
330
|
-
readonly app?:
|
|
390
|
+
readonly artifacts?: EngineArtifacts;
|
|
391
|
+
/** The app under test: its declaration (url, identity, command...) and hooks (navigate, back, restart, clearState). */
|
|
392
|
+
readonly app?: EngineApp;
|
|
331
393
|
/**
|
|
332
394
|
* Current top-level URL of the surface, when the platform has one. Enables
|
|
333
395
|
* trace start anchors and the secret-fill origin check.
|
|
@@ -335,40 +397,40 @@ export interface Backend {
|
|
|
335
397
|
url?(context: OperationContext): Promise<string>;
|
|
336
398
|
/**
|
|
337
399
|
* Once per run and target, in the runner process, before any worker starts
|
|
338
|
-
* and outside every launch budget. Provision what the
|
|
400
|
+
* and outside every launch budget. Provision what the engine needs on this
|
|
339
401
|
* machine here (a first-run browser download, a toolchain fetch), so it
|
|
340
402
|
* happens once instead of per worker and its progress reaches the reporter
|
|
341
403
|
* through `info.log`. Failure is infrastructure and ends the run before any
|
|
342
404
|
* test executes.
|
|
343
405
|
*/
|
|
344
|
-
prepare?(info:
|
|
406
|
+
prepare?(info: EnginePrepareInfo): Promise<void>;
|
|
345
407
|
/**
|
|
346
408
|
* Once per worker, before the first step; boot devices here, not in a step
|
|
347
409
|
* budget. The same handle can be booted again after `dispose`: a config-held
|
|
348
410
|
* handle outlives an in-process worker, so init MUST work on a disposed
|
|
349
|
-
*
|
|
411
|
+
* engine as it does on a fresh one.
|
|
350
412
|
*/
|
|
351
|
-
init?(info:
|
|
413
|
+
init?(info: EngineInitInfo): Promise<void>;
|
|
352
414
|
/** Before each attempt: set up per-test isolation. */
|
|
353
|
-
startAttempt?(context:
|
|
415
|
+
startAttempt?(context: EngineAttemptContext): Promise<void>;
|
|
354
416
|
/**
|
|
355
417
|
* After each attempt, within the cleanup budget: tear that isolation down.
|
|
356
418
|
* MUST be idempotent, and safe to call after a failed `startAttempt`.
|
|
357
419
|
*/
|
|
358
|
-
endAttempt?(context:
|
|
420
|
+
endAttempt?(context: EngineCleanupContext): Promise<void>;
|
|
359
421
|
/**
|
|
360
422
|
* Worker shutdown, within the cleanup budget; failure is a run error. Runs
|
|
361
|
-
* whether or not `init` ran, so it MUST tolerate a cold
|
|
423
|
+
* whether or not `init` ran, so it MUST tolerate a cold engine.
|
|
362
424
|
*/
|
|
363
|
-
dispose?(context:
|
|
425
|
+
dispose?(context: EngineCleanupContext): Promise<void>;
|
|
364
426
|
}
|
|
365
|
-
/** A validated
|
|
366
|
-
export interface
|
|
367
|
-
readonly [
|
|
368
|
-
readonly capabilities: ReadonlySet<
|
|
427
|
+
/** A validated engine: branded, frozen, capabilities computed. */
|
|
428
|
+
export interface EngineHandle extends Engine {
|
|
429
|
+
readonly [engineBrand]: true;
|
|
430
|
+
readonly capabilities: ReadonlySet<EngineCapability>;
|
|
369
431
|
}
|
|
370
432
|
/**
|
|
371
|
-
* Validates
|
|
433
|
+
* Validates an engine and computes its capability set. Runs synchronously at
|
|
372
434
|
* config load and fails loud: a misspelled member or an undeclared dependency
|
|
373
435
|
* is `INVALID_CONFIG`, never a silent demotion to a lower tier.
|
|
374
436
|
*
|
|
@@ -376,7 +438,7 @@ export interface BackendHandle extends Backend {
|
|
|
376
438
|
* through the prototype chain and binding every function to the spec, so a
|
|
377
439
|
* class instance (own state fields included) is as valid a body as a literal.
|
|
378
440
|
*/
|
|
379
|
-
export declare function
|
|
380
|
-
/** True for a
|
|
381
|
-
export declare function
|
|
441
|
+
export declare function defineEngine(spec: Engine): EngineHandle;
|
|
442
|
+
/** True for a defineEngine-branded handle, across realms. */
|
|
443
|
+
export declare function isEngineHandle(value: unknown): value is EngineHandle;
|
|
382
444
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/engine/index.ts"],"names":[],"mappings":"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"}
|