@e2edev/e2e 0.2.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/LICENSE +21 -0
- package/README.md +104 -0
- package/dist/agent/act-validation.d.ts +27 -0
- package/dist/agent/act-validation.d.ts.map +1 -0
- package/dist/agent/act-validation.js +121 -0
- package/dist/agent/act-validation.js.map +1 -0
- package/dist/agent/act.d.ts +27 -0
- package/dist/agent/act.d.ts.map +1 -0
- package/dist/agent/act.js +775 -0
- package/dist/agent/act.js.map +1 -0
- package/dist/agent/actions.d.ts +66 -0
- package/dist/agent/actions.d.ts.map +1 -0
- package/dist/agent/actions.js +82 -0
- package/dist/agent/actions.js.map +1 -0
- package/dist/agent/ai-sdk.d.ts +16 -0
- package/dist/agent/ai-sdk.d.ts.map +1 -0
- package/dist/agent/ai-sdk.js +59 -0
- package/dist/agent/ai-sdk.js.map +1 -0
- package/dist/agent/call-options.d.ts +10 -0
- package/dist/agent/call-options.d.ts.map +1 -0
- package/dist/agent/call-options.js +28 -0
- package/dist/agent/call-options.js.map +1 -0
- package/dist/agent/default-agent.d.ts +22 -0
- package/dist/agent/default-agent.d.ts.map +1 -0
- package/dist/agent/default-agent.js +354 -0
- package/dist/agent/default-agent.js.map +1 -0
- package/dist/agent/error.d.ts +53 -0
- package/dist/agent/error.d.ts.map +1 -0
- package/dist/agent/error.js +94 -0
- package/dist/agent/error.js.map +1 -0
- package/dist/agent/executor.d.ts +238 -0
- package/dist/agent/executor.d.ts.map +1 -0
- package/dist/agent/executor.js +56 -0
- package/dist/agent/executor.js.map +1 -0
- package/dist/agent/index.d.ts +15 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +304 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/agent/invocation.d.ts +194 -0
- package/dist/agent/invocation.d.ts.map +1 -0
- package/dist/agent/invocation.js +389 -0
- package/dist/agent/invocation.js.map +1 -0
- package/dist/agent/ledger.d.ts +24 -0
- package/dist/agent/ledger.d.ts.map +1 -0
- package/dist/agent/ledger.js +48 -0
- package/dist/agent/ledger.js.map +1 -0
- package/dist/agent/loop-guards.d.ts +35 -0
- package/dist/agent/loop-guards.d.ts.map +1 -0
- package/dist/agent/loop-guards.js +110 -0
- package/dist/agent/loop-guards.js.map +1 -0
- package/dist/agent/model/adapter.d.ts +97 -0
- package/dist/agent/model/adapter.d.ts.map +1 -0
- package/dist/agent/model/adapter.js +40 -0
- package/dist/agent/model/adapter.js.map +1 -0
- package/dist/agent/model/router.d.ts +36 -0
- package/dist/agent/model/router.d.ts.map +1 -0
- package/dist/agent/model/router.js +45 -0
- package/dist/agent/model/router.js.map +1 -0
- package/dist/agent/model/schema.d.ts +16 -0
- package/dist/agent/model/schema.d.ts.map +1 -0
- package/dist/agent/model/schema.js +37 -0
- package/dist/agent/model/schema.js.map +1 -0
- package/dist/agent/model/sdk.d.ts +28 -0
- package/dist/agent/model/sdk.d.ts.map +1 -0
- package/dist/agent/model/sdk.js +258 -0
- package/dist/agent/model/sdk.js.map +1 -0
- package/dist/agent/observation.d.ts +70 -0
- package/dist/agent/observation.d.ts.map +1 -0
- package/dist/agent/observation.js +174 -0
- package/dist/agent/observation.js.map +1 -0
- package/dist/agent/phases.d.ts +71 -0
- package/dist/agent/phases.d.ts.map +1 -0
- package/dist/agent/phases.js +124 -0
- package/dist/agent/phases.js.map +1 -0
- package/dist/agent/prompts.d.ts +40 -0
- package/dist/agent/prompts.d.ts.map +1 -0
- package/dist/agent/prompts.js +104 -0
- package/dist/agent/prompts.js.map +1 -0
- package/dist/agent/protocol.d.ts +31 -0
- package/dist/agent/protocol.d.ts.map +1 -0
- package/dist/agent/protocol.js +67 -0
- package/dist/agent/protocol.js.map +1 -0
- package/dist/agent/public.d.ts +12 -0
- package/dist/agent/public.d.ts.map +1 -0
- package/dist/agent/public.js +12 -0
- package/dist/agent/public.js.map +1 -0
- package/dist/agent/replay.d.ts +61 -0
- package/dist/agent/replay.d.ts.map +1 -0
- package/dist/agent/replay.js +185 -0
- package/dist/agent/replay.js.map +1 -0
- package/dist/agent/secrets.d.ts +22 -0
- package/dist/agent/secrets.d.ts.map +1 -0
- package/dist/agent/secrets.js +63 -0
- package/dist/agent/secrets.js.map +1 -0
- package/dist/agent/step-cache.d.ts +156 -0
- package/dist/agent/step-cache.d.ts.map +1 -0
- package/dist/agent/step-cache.js +301 -0
- package/dist/agent/step-cache.js.map +1 -0
- package/dist/agent/tool-loop.d.ts +51 -0
- package/dist/agent/tool-loop.d.ts.map +1 -0
- package/dist/agent/tool-loop.js +331 -0
- package/dist/agent/tool-loop.js.map +1 -0
- package/dist/agent/tool.d.ts +39 -0
- package/dist/agent/tool.d.ts.map +1 -0
- package/dist/agent/tool.js +52 -0
- package/dist/agent/tool.js.map +1 -0
- package/dist/backend/contract.d.ts +186 -0
- package/dist/backend/contract.d.ts.map +1 -0
- package/dist/backend/contract.js +65 -0
- package/dist/backend/contract.js.map +1 -0
- package/dist/backend/index.d.ts +316 -0
- package/dist/backend/index.d.ts.map +1 -0
- package/dist/backend/index.js +219 -0
- package/dist/backend/index.js.map +1 -0
- package/dist/backend/session.d.ts +23 -0
- package/dist/backend/session.d.ts.map +1 -0
- package/dist/backend/session.js +213 -0
- package/dist/backend/session.js.map +1 -0
- package/dist/backend/surface.d.ts +83 -0
- package/dist/backend/surface.d.ts.map +1 -0
- package/dist/backend/surface.js +11 -0
- package/dist/backend/surface.js.map +1 -0
- package/dist/cache/anchors.d.ts +37 -0
- package/dist/cache/anchors.d.ts.map +1 -0
- package/dist/cache/anchors.js +89 -0
- package/dist/cache/anchors.js.map +1 -0
- package/dist/cache/context.d.ts +74 -0
- package/dist/cache/context.d.ts.map +1 -0
- package/dist/cache/context.js +82 -0
- package/dist/cache/context.js.map +1 -0
- package/dist/cache/decide.d.ts +42 -0
- package/dist/cache/decide.d.ts.map +1 -0
- package/dist/cache/decide.js +47 -0
- package/dist/cache/decide.js.map +1 -0
- package/dist/cache/identity.d.ts +113 -0
- package/dist/cache/identity.d.ts.map +1 -0
- package/dist/cache/identity.js +109 -0
- package/dist/cache/identity.js.map +1 -0
- package/dist/cache/recorder.d.ts +76 -0
- package/dist/cache/recorder.d.ts.map +1 -0
- package/dist/cache/recorder.js +143 -0
- package/dist/cache/recorder.js.map +1 -0
- package/dist/cache/relocate.d.ts +69 -0
- package/dist/cache/relocate.d.ts.map +1 -0
- package/dist/cache/relocate.js +125 -0
- package/dist/cache/relocate.js.map +1 -0
- package/dist/cache/store.d.ts +68 -0
- package/dist/cache/store.d.ts.map +1 -0
- package/dist/cache/store.js +106 -0
- package/dist/cache/store.js.map +1 -0
- package/dist/cache/trace.d.ts +146 -0
- package/dist/cache/trace.d.ts.map +1 -0
- package/dist/cache/trace.js +249 -0
- package/dist/cache/trace.js.map +1 -0
- package/dist/cli/bin.d.ts +3 -0
- package/dist/cli/bin.d.ts.map +1 -0
- package/dist/cli/bin.js +4 -0
- package/dist/cli/bin.js.map +1 -0
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +108 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/init.d.ts +6 -0
- package/dist/cli/init.d.ts.map +1 -0
- package/dist/cli/init.js +101 -0
- package/dist/cli/init.js.map +1 -0
- package/dist/collect/collect.d.ts +44 -0
- package/dist/collect/collect.d.ts.map +1 -0
- package/dist/collect/collect.js +89 -0
- package/dist/collect/collect.js.map +1 -0
- package/dist/collect/registry.d.ts +47 -0
- package/dist/collect/registry.d.ts.map +1 -0
- package/dist/collect/registry.js +262 -0
- package/dist/collect/registry.js.map +1 -0
- package/dist/collect/select.d.ts +54 -0
- package/dist/collect/select.d.ts.map +1 -0
- package/dist/collect/select.js +230 -0
- package/dist/collect/select.js.map +1 -0
- package/dist/config/agent.d.ts +91 -0
- package/dist/config/agent.d.ts.map +1 -0
- package/dist/config/agent.js +232 -0
- package/dist/config/agent.js.map +1 -0
- package/dist/config/load.d.ts +23 -0
- package/dist/config/load.d.ts.map +1 -0
- package/dist/config/load.js +75 -0
- package/dist/config/load.js.map +1 -0
- package/dist/config/resolve.d.ts +94 -0
- package/dist/config/resolve.d.ts.map +1 -0
- package/dist/config/resolve.js +500 -0
- package/dist/config/resolve.js.map +1 -0
- package/dist/config/validate.d.ts +6 -0
- package/dist/config/validate.d.ts.map +1 -0
- package/dist/config/validate.js +21 -0
- package/dist/config/validate.js.map +1 -0
- package/dist/credentials.d.ts +7 -0
- package/dist/credentials.d.ts.map +1 -0
- package/dist/credentials.js +42 -0
- package/dist/credentials.js.map +1 -0
- package/dist/expect/async.d.ts +5 -0
- package/dist/expect/async.d.ts.map +1 -0
- package/dist/expect/async.js +186 -0
- package/dist/expect/async.js.map +1 -0
- package/dist/expect/index.d.ts +7 -0
- package/dist/expect/index.d.ts.map +1 -0
- package/dist/expect/index.js +23 -0
- package/dist/expect/index.js.map +1 -0
- package/dist/expect/values.d.ts +4 -0
- package/dist/expect/values.d.ts.map +1 -0
- package/dist/expect/values.js +108 -0
- package/dist/expect/values.js.map +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +15 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/ai-trace.d.ts +151 -0
- package/dist/internal/ai-trace.d.ts.map +1 -0
- package/dist/internal/ai-trace.js +360 -0
- package/dist/internal/ai-trace.js.map +1 -0
- package/dist/internal/brands.d.ts +9 -0
- package/dist/internal/brands.d.ts.map +1 -0
- package/dist/internal/brands.js +9 -0
- package/dist/internal/brands.js.map +1 -0
- package/dist/internal/debug.d.ts +43 -0
- package/dist/internal/debug.d.ts.map +1 -0
- package/dist/internal/debug.js +102 -0
- package/dist/internal/debug.js.map +1 -0
- package/dist/internal/errors.d.ts +98 -0
- package/dist/internal/errors.d.ts.map +1 -0
- package/dist/internal/errors.js +212 -0
- package/dist/internal/errors.js.map +1 -0
- package/dist/internal/globs.d.ts +29 -0
- package/dist/internal/globs.d.ts.map +1 -0
- package/dist/internal/globs.js +126 -0
- package/dist/internal/globs.js.map +1 -0
- package/dist/internal/ids.d.ts +32 -0
- package/dist/internal/ids.d.ts.map +1 -0
- package/dist/internal/ids.js +124 -0
- package/dist/internal/ids.js.map +1 -0
- package/dist/internal/json-value.d.ts +15 -0
- package/dist/internal/json-value.d.ts.map +1 -0
- package/dist/internal/json-value.js +61 -0
- package/dist/internal/json-value.js.map +1 -0
- package/dist/internal/package-version.d.ts +6 -0
- package/dist/internal/package-version.d.ts.map +1 -0
- package/dist/internal/package-version.js +14 -0
- package/dist/internal/package-version.js.map +1 -0
- package/dist/internal/realm-slot.d.ts +13 -0
- package/dist/internal/realm-slot.d.ts.map +1 -0
- package/dist/internal/realm-slot.js +23 -0
- package/dist/internal/realm-slot.js.map +1 -0
- package/dist/internal/redact.d.ts +33 -0
- package/dist/internal/redact.d.ts.map +1 -0
- package/dist/internal/redact.js +56 -0
- package/dist/internal/redact.js.map +1 -0
- package/dist/internal/regexp.d.ts +10 -0
- package/dist/internal/regexp.d.ts.map +1 -0
- package/dist/internal/regexp.js +27 -0
- package/dist/internal/regexp.js.map +1 -0
- package/dist/internal/text.d.ts +39 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +66 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/time.d.ts +37 -0
- package/dist/internal/time.d.ts.map +1 -0
- package/dist/internal/time.js +91 -0
- package/dist/internal/time.js.map +1 -0
- package/dist/internal/trace.d.ts +18 -0
- package/dist/internal/trace.d.ts.map +1 -0
- package/dist/internal/trace.js +46 -0
- package/dist/internal/trace.js.map +1 -0
- package/dist/internal/urls.d.ts +31 -0
- package/dist/internal/urls.d.ts.map +1 -0
- package/dist/internal/urls.js +95 -0
- package/dist/internal/urls.js.map +1 -0
- package/dist/locator/engine.d.ts +65 -0
- package/dist/locator/engine.d.ts.map +1 -0
- package/dist/locator/engine.js +164 -0
- package/dist/locator/engine.js.map +1 -0
- package/dist/locator/expression.d.ts +19 -0
- package/dist/locator/expression.d.ts.map +1 -0
- package/dist/locator/expression.js +85 -0
- package/dist/locator/expression.js.map +1 -0
- package/dist/locator/screen.d.ts +36 -0
- package/dist/locator/screen.d.ts.map +1 -0
- package/dist/locator/screen.js +281 -0
- package/dist/locator/screen.js.map +1 -0
- package/dist/report/build.d.ts +214 -0
- package/dist/report/build.d.ts.map +1 -0
- package/dist/report/build.js +346 -0
- package/dist/report/build.js.map +1 -0
- package/dist/report/code-frame.d.ts +20 -0
- package/dist/report/code-frame.d.ts.map +1 -0
- package/dist/report/code-frame.js +73 -0
- package/dist/report/code-frame.js.map +1 -0
- package/dist/report/debug-steps.d.ts +14 -0
- package/dist/report/debug-steps.d.ts.map +1 -0
- package/dist/report/debug-steps.js +85 -0
- package/dist/report/debug-steps.js.map +1 -0
- package/dist/report/list.d.ts +80 -0
- package/dist/report/list.d.ts.map +1 -0
- package/dist/report/list.js +372 -0
- package/dist/report/list.js.map +1 -0
- package/dist/report/live-status.d.ts +51 -0
- package/dist/report/live-status.d.ts.map +1 -0
- package/dist/report/live-status.js +162 -0
- package/dist/report/live-status.js.map +1 -0
- package/dist/report/write.d.ts +4 -0
- package/dist/report/write.d.ts.map +1 -0
- package/dist/report/write.js +13 -0
- package/dist/report/write.js.map +1 -0
- package/dist/run/app-process.d.ts +18 -0
- package/dist/run/app-process.d.ts.map +1 -0
- package/dist/run/app-process.js +112 -0
- package/dist/run/app-process.js.map +1 -0
- package/dist/run/artifacts.d.ts +51 -0
- package/dist/run/artifacts.d.ts.map +1 -0
- package/dist/run/artifacts.js +114 -0
- package/dist/run/artifacts.js.map +1 -0
- package/dist/run/events.d.ts +100 -0
- package/dist/run/events.d.ts.map +1 -0
- package/dist/run/events.js +59 -0
- package/dist/run/events.js.map +1 -0
- package/dist/run/execute.d.ts +119 -0
- package/dist/run/execute.d.ts.map +1 -0
- package/dist/run/execute.js +555 -0
- package/dist/run/execute.js.map +1 -0
- package/dist/run/fixtures.d.ts +40 -0
- package/dist/run/fixtures.d.ts.map +1 -0
- package/dist/run/fixtures.js +408 -0
- package/dist/run/fixtures.js.map +1 -0
- package/dist/run/in-process.d.ts +24 -0
- package/dist/run/in-process.d.ts.map +1 -0
- package/dist/run/in-process.js +120 -0
- package/dist/run/in-process.js.map +1 -0
- package/dist/run/public.d.ts +19 -0
- package/dist/run/public.d.ts.map +1 -0
- package/dist/run/public.js +11 -0
- package/dist/run/public.js.map +1 -0
- package/dist/run/realm.d.ts +52 -0
- package/dist/run/realm.d.ts.map +1 -0
- package/dist/run/realm.js +101 -0
- package/dist/run/realm.js.map +1 -0
- package/dist/run/records.d.ts +87 -0
- package/dist/run/records.d.ts.map +1 -0
- package/dist/run/records.js +3 -0
- package/dist/run/records.js.map +1 -0
- package/dist/run/retry.d.ts +18 -0
- package/dist/run/retry.d.ts.map +1 -0
- package/dist/run/retry.js +33 -0
- package/dist/run/retry.js.map +1 -0
- package/dist/run/runner.d.ts +49 -0
- package/dist/run/runner.d.ts.map +1 -0
- package/dist/run/runner.js +375 -0
- package/dist/run/runner.js.map +1 -0
- package/dist/run/scheduler.d.ts +45 -0
- package/dist/run/scheduler.d.ts.map +1 -0
- package/dist/run/scheduler.js +512 -0
- package/dist/run/scheduler.js.map +1 -0
- package/dist/run/serial.d.ts +52 -0
- package/dist/run/serial.d.ts.map +1 -0
- package/dist/run/serial.js +247 -0
- package/dist/run/serial.js.map +1 -0
- package/dist/run/sessions.d.ts +54 -0
- package/dist/run/sessions.d.ts.map +1 -0
- package/dist/run/sessions.js +221 -0
- package/dist/run/sessions.js.map +1 -0
- package/dist/run/steps.d.ts +196 -0
- package/dist/run/steps.d.ts.map +1 -0
- package/dist/run/steps.js +151 -0
- package/dist/run/steps.js.map +1 -0
- package/dist/run/unit-runner.d.ts +30 -0
- package/dist/run/unit-runner.d.ts.map +1 -0
- package/dist/run/unit-runner.js +11 -0
- package/dist/run/unit-runner.js.map +1 -0
- package/dist/run/units.d.ts +50 -0
- package/dist/run/units.d.ts.map +1 -0
- package/dist/run/units.js +103 -0
- package/dist/run/units.js.map +1 -0
- package/dist/run/worker/entry.d.ts +8 -0
- package/dist/run/worker/entry.d.ts.map +1 -0
- package/dist/run/worker/entry.js +137 -0
- package/dist/run/worker/entry.js.map +1 -0
- package/dist/run/worker/handle.d.ts +10 -0
- package/dist/run/worker/handle.d.ts.map +1 -0
- package/dist/run/worker/handle.js +74 -0
- package/dist/run/worker/handle.js.map +1 -0
- package/dist/run/worker/protocol.d.ts +129 -0
- package/dist/run/worker/protocol.d.ts.map +1 -0
- package/dist/run/worker/protocol.js +18 -0
- package/dist/run/worker/protocol.js.map +1 -0
- package/dist/run/worker/session.d.ts +69 -0
- package/dist/run/worker/session.d.ts.map +1 -0
- package/dist/run/worker/session.js +123 -0
- package/dist/run/worker/session.js.map +1 -0
- package/dist/types.d.ts +630 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/package.json +91 -0
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* One step's trace-cache session (RFC0001 layer 3, cache-in decision): key
|
|
3
|
+
* derivation, the replay attempt, live recording, and the stage-or-evict
|
|
4
|
+
* decision once the step has settled — everything cache-shaped about one
|
|
5
|
+
* dispatched act step, kept beside the dispatch rather than threaded through
|
|
6
|
+
* it. The dispatch owns budgets, the grammar, and the verdict; this class owns
|
|
7
|
+
* nothing but the cache.
|
|
8
|
+
*
|
|
9
|
+
* Cost: in read-write mode the session takes two settled looks at the screen
|
|
10
|
+
* the executor never asked for — one before any action, one after the passing
|
|
11
|
+
* verdict — because the trace's end anchors are the delta between them. A
|
|
12
|
+
* read-only run pays neither.
|
|
13
|
+
*/
|
|
14
|
+
import { describeAnchors } from '../cache/anchors.js';
|
|
15
|
+
import { decideTraceReplay, opensWithNavigate, samePathname, } from '../cache/decide.js';
|
|
16
|
+
import { TraceRecorder } from '../cache/recorder.js';
|
|
17
|
+
import { readTraceEntry } from '../cache/trace.js';
|
|
18
|
+
import { isRuntimeHardStop } from './executor.js';
|
|
19
|
+
import { replayTrace, verifyAnchors, } from './replay.js';
|
|
20
|
+
export class StepTraceSession {
|
|
21
|
+
host;
|
|
22
|
+
cache;
|
|
23
|
+
keyHash;
|
|
24
|
+
recorder;
|
|
25
|
+
options;
|
|
26
|
+
info;
|
|
27
|
+
prefix;
|
|
28
|
+
startPath;
|
|
29
|
+
/**
|
|
30
|
+
* The screen before any action, captured only when this step may write: the
|
|
31
|
+
* staged trace's end anchors are the delta between this and the passing
|
|
32
|
+
* observation, so a replay must reproduce the step's effect to pass alone.
|
|
33
|
+
* Undefined after `begin` when the surface could not be observed; the step
|
|
34
|
+
* still runs — an executor that never looks at the screen owes the cache
|
|
35
|
+
* nothing — but nothing is staged, because a trace without its baseline has
|
|
36
|
+
* no anchors and would replay on mechanics alone.
|
|
37
|
+
*/
|
|
38
|
+
startNodes;
|
|
39
|
+
/**
|
|
40
|
+
* The trace a full replay reproduced, kept for the re-stage: its executor
|
|
41
|
+
* is the write's provenance, and its summary is the original verdict prose.
|
|
42
|
+
* The step's own summary after a replay is the synthesized "replayed N
|
|
43
|
+
* actions…" wrapper; storing that would nest the summary one level deeper
|
|
44
|
+
* on every replay until the bound truncated it.
|
|
45
|
+
*/
|
|
46
|
+
replayed;
|
|
47
|
+
/** True once a cached entry's actions were run this step, fully or partly. */
|
|
48
|
+
consumedReplay = false;
|
|
49
|
+
/** Grammar actions recorded so far when an end-mismatch hand-off happened. */
|
|
50
|
+
actionsAtEndMismatch;
|
|
51
|
+
constructor(host, options) {
|
|
52
|
+
this.host = host;
|
|
53
|
+
this.options = options;
|
|
54
|
+
this.cache = options.cache;
|
|
55
|
+
this.keyHash = options.cache.claimKeyHash('act', options.instruction, options.params);
|
|
56
|
+
if (options.cache.mode === 'read-write') {
|
|
57
|
+
this.recorder = new TraceRecorder({
|
|
58
|
+
redact: options.redact,
|
|
59
|
+
testIdAttribute: options.testIdAttribute,
|
|
60
|
+
maxActions: options.maxActions,
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
/** How the cache participated, for the step's report detail. */
|
|
65
|
+
get cacheInfo() {
|
|
66
|
+
return this.info;
|
|
67
|
+
}
|
|
68
|
+
/** The mid-step hand-off, when a replay diverged after real progress. */
|
|
69
|
+
get replayedPrefix() {
|
|
70
|
+
return this.prefix;
|
|
71
|
+
}
|
|
72
|
+
/** Records one committed grammar action into the step trace. */
|
|
73
|
+
record(action) {
|
|
74
|
+
this.recorder?.record(action);
|
|
75
|
+
}
|
|
76
|
+
/** Records one mutating project-tool call as a replay-ending gap. */
|
|
77
|
+
recordGap(toolName) {
|
|
78
|
+
this.recorder?.recordGap(toolName);
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Opens the step: captures the write-side preconditions — the start path
|
|
82
|
+
* and, when this step may write, the baseline screen — then attempts a
|
|
83
|
+
* zero-turn replay. Returns the self-finalized verdict on a full replay
|
|
84
|
+
* whose postcondition holds; undefined dispatches the executor — after a
|
|
85
|
+
* miss from the top, after a divergence mid-step with `replayedPrefix` set.
|
|
86
|
+
* Every failure to replay is a miss, never an error; only runtime hard stops
|
|
87
|
+
* propagate.
|
|
88
|
+
*/
|
|
89
|
+
async begin() {
|
|
90
|
+
// Captured before any action for the write's start-path precondition, and
|
|
91
|
+
// doubling as the replay decision's current path.
|
|
92
|
+
this.startPath = await this.host.currentPath();
|
|
93
|
+
if (this.recorder !== undefined)
|
|
94
|
+
this.startNodes = await probeScreen(this.host);
|
|
95
|
+
if (!this.cache.replayEligible)
|
|
96
|
+
return undefined;
|
|
97
|
+
const read = await this.readEntry();
|
|
98
|
+
if (read.status === 'miss') {
|
|
99
|
+
this.info = this.missed(read.reason, 0);
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
const trace = read.entry.payload;
|
|
103
|
+
const decision = decideTraceReplay(read.entry, this.startPath);
|
|
104
|
+
if (decision.action === 'miss') {
|
|
105
|
+
this.info = this.missed(decision.reason, trace.actions.length);
|
|
106
|
+
return undefined;
|
|
107
|
+
}
|
|
108
|
+
const outcome = await replayTrace(this.host, trace);
|
|
109
|
+
this.consumedReplay = true;
|
|
110
|
+
// Actions that all ran prove the clicks happened; only the postcondition
|
|
111
|
+
// proves the save took. A flow whose destination changed, or whose effect
|
|
112
|
+
// is not on screen again, hands off like any other divergence.
|
|
113
|
+
const stopReason = outcome.completed
|
|
114
|
+
? (await this.endStateMatches(trace))
|
|
115
|
+
? undefined
|
|
116
|
+
: 'end-mismatch'
|
|
117
|
+
: (outcome.stopReason ?? 'action-failed');
|
|
118
|
+
if (stopReason === undefined)
|
|
119
|
+
return this.selfFinalize(trace, outcome);
|
|
120
|
+
if (outcome.executed === 0) {
|
|
121
|
+
// A prefix that performed nothing is a miss with a name, not a hand-off:
|
|
122
|
+
// the executor starts from the top and owes the notice nothing.
|
|
123
|
+
this.info = this.missed(stopReason, outcome.total);
|
|
124
|
+
return undefined;
|
|
125
|
+
}
|
|
126
|
+
this.handOff(outcome, stopReason);
|
|
127
|
+
return undefined;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Closes the session once the step has settled. The whole write-side
|
|
131
|
+
* decision lives here, in read-write mode only:
|
|
132
|
+
*
|
|
133
|
+
* - passed, after an end-mismatch the executor had to act to repair: evict.
|
|
134
|
+
* Every recorded action ran and the effect was still missing, so the
|
|
135
|
+
* recorded flow is proven not to produce it. Re-staging would freeze the
|
|
136
|
+
* failed flow plus its repair — a typo, its deletion, the retype — as the
|
|
137
|
+
* thing to replay forever; the next pass records a clean flow instead. A
|
|
138
|
+
* hand-off the executor settled without acting is different: the flow was
|
|
139
|
+
* fine and only the anchors were stale, so it heals by re-staging.
|
|
140
|
+
* - passed otherwise: stage the recorded trace for attempt-end settlement.
|
|
141
|
+
* - failed after consuming a replay: evict. Without this, a diverged replay
|
|
142
|
+
* whose step then fails stages nothing — and the poisoned entry would
|
|
143
|
+
* replay its bad prefix on every future first attempt.
|
|
144
|
+
* - cancelled: nothing, exactly like an interrupted attempt.
|
|
145
|
+
*/
|
|
146
|
+
async conclude(outcome, verdictSummary) {
|
|
147
|
+
const recorder = this.recorder;
|
|
148
|
+
if (recorder === undefined)
|
|
149
|
+
return;
|
|
150
|
+
switch (outcome) {
|
|
151
|
+
case 'cancelled':
|
|
152
|
+
return;
|
|
153
|
+
case 'failed':
|
|
154
|
+
if (this.consumedReplay)
|
|
155
|
+
await this.evict();
|
|
156
|
+
return;
|
|
157
|
+
case 'passed':
|
|
158
|
+
if (this.repairedAfterEndMismatch(recorder))
|
|
159
|
+
await this.evict();
|
|
160
|
+
else
|
|
161
|
+
await this.stage(recorder, verdictSummary);
|
|
162
|
+
return;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* One store read, revalidated through the trace-1 framing whichever store
|
|
167
|
+
* produced it: a custom store's entry can never be trusted more loosely
|
|
168
|
+
* than a file entry, however the store author built their read path. A
|
|
169
|
+
* store outage is a slower run, never a failed test — every failure to read
|
|
170
|
+
* degrades to a miss.
|
|
171
|
+
*/
|
|
172
|
+
async readEntry() {
|
|
173
|
+
let read;
|
|
174
|
+
try {
|
|
175
|
+
read = await this.cache.store.read(this.keyHash);
|
|
176
|
+
}
|
|
177
|
+
catch {
|
|
178
|
+
return { status: 'miss', reason: 'invalid-entry' };
|
|
179
|
+
}
|
|
180
|
+
if (read.status === 'miss')
|
|
181
|
+
return { status: 'miss', reason: 'no-entry' };
|
|
182
|
+
if (read.status === 'invalid')
|
|
183
|
+
return { status: 'miss', reason: 'invalid-entry' };
|
|
184
|
+
const entry = readTraceEntry(read.entry);
|
|
185
|
+
return entry === undefined ? { status: 'miss', reason: 'invalid-entry' } : { status: 'hit', entry };
|
|
186
|
+
}
|
|
187
|
+
/**
|
|
188
|
+
* The trace's postcondition against the live screen: the recorded end path
|
|
189
|
+
* (pathname only, when the live location is known) and every recorded end
|
|
190
|
+
* anchor present again.
|
|
191
|
+
*/
|
|
192
|
+
async endStateMatches(trace) {
|
|
193
|
+
if (trace.endPath !== undefined) {
|
|
194
|
+
const current = await this.host.currentPath();
|
|
195
|
+
if (current !== undefined && !samePathname(current, trace.endPath))
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
return verifyAnchors(this.host, trace.endAnchors ?? []);
|
|
199
|
+
}
|
|
200
|
+
selfFinalize(trace, outcome) {
|
|
201
|
+
this.replayed = trace;
|
|
202
|
+
this.info = {
|
|
203
|
+
mode: 'self-finalized',
|
|
204
|
+
replayedActions: outcome.executed,
|
|
205
|
+
totalActions: outcome.total,
|
|
206
|
+
};
|
|
207
|
+
return {
|
|
208
|
+
status: 'passed',
|
|
209
|
+
summary: `replayed ${outcome.executed} recorded action(s) zero-turn from the trace cache; recorded verdict: ${trace.summary}`,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
handOff(outcome, stopReason) {
|
|
213
|
+
if (stopReason === 'end-mismatch')
|
|
214
|
+
this.actionsAtEndMismatch = this.recorder?.recordedCount ?? 0;
|
|
215
|
+
this.prefix = {
|
|
216
|
+
replayedActions: outcome.summaries,
|
|
217
|
+
totalActions: outcome.total,
|
|
218
|
+
stopReason,
|
|
219
|
+
...(outcome.uncertainAction === undefined ? {} : { uncertainAction: outcome.uncertainAction }),
|
|
220
|
+
};
|
|
221
|
+
this.info = {
|
|
222
|
+
mode: 'agent-concluded',
|
|
223
|
+
reason: stopReason,
|
|
224
|
+
replayedActions: outcome.executed,
|
|
225
|
+
totalActions: outcome.total,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
/**
|
|
229
|
+
* Stages the recorded trace for attempt-end settlement. The write is
|
|
230
|
+
* deferred, not immediate: the trace is confirmed or evicted at attempt end
|
|
231
|
+
* (`flushStagedTraces`), because the verification step after this one — not
|
|
232
|
+
* the verdict alone — is what proves the flow reached the right state. A
|
|
233
|
+
* replayed step re-stages its own entry with fresh descriptors, which is
|
|
234
|
+
* how staleness self-heals.
|
|
235
|
+
*
|
|
236
|
+
* The end path and a fresh settled observation are the trace's
|
|
237
|
+
* postcondition — the state the step passed in. The delta between the
|
|
238
|
+
* baseline and the passing observation becomes the end anchors. When the
|
|
239
|
+
* step moved to another pathname the whole screen is the delta and the path
|
|
240
|
+
* is the postcondition, so anchors are recorded only for a step that ended
|
|
241
|
+
* where it began (or on a surface without a location at all, where they are
|
|
242
|
+
* the only check). A postcondition that cannot be captured stages nothing:
|
|
243
|
+
* a trace without its check would replay on mechanics alone.
|
|
244
|
+
*/
|
|
245
|
+
async stage(recorder, verdictSummary) {
|
|
246
|
+
if (this.startNodes === undefined)
|
|
247
|
+
return;
|
|
248
|
+
const endNodes = await probeScreen(this.host);
|
|
249
|
+
if (endNodes === undefined)
|
|
250
|
+
return;
|
|
251
|
+
const endPath = await this.host.currentPath();
|
|
252
|
+
const moved = this.startPath !== undefined && endPath !== undefined && !samePathname(this.startPath, endPath);
|
|
253
|
+
const endAnchors = moved ? undefined : describeAnchors(this.startNodes, endNodes, this.options);
|
|
254
|
+
const trace = recorder.finalize({
|
|
255
|
+
executor: this.replayed?.executor ?? this.options.executor,
|
|
256
|
+
summary: this.replayed?.summary ?? verdictSummary ?? 'step passed',
|
|
257
|
+
...(this.startPath === undefined ? {} : { startPath: this.startPath }),
|
|
258
|
+
...(endPath === undefined ? {} : { endPath }),
|
|
259
|
+
...(endAnchors === undefined ? {} : { endAnchors }),
|
|
260
|
+
});
|
|
261
|
+
if (trace === undefined)
|
|
262
|
+
return;
|
|
263
|
+
// A trace with no start anchor — no recorded path (a surface without a URL)
|
|
264
|
+
// and no opening navigate — could never replay: `wrong-context` forever.
|
|
265
|
+
// Writing it would be pure store traffic, so it is not written at all.
|
|
266
|
+
if (trace.startPath === undefined && !opensWithNavigate(trace))
|
|
267
|
+
return;
|
|
268
|
+
this.cache.staged.push({ keyHash: this.keyHash, trace, stepIndex: this.options.stepIndex });
|
|
269
|
+
}
|
|
270
|
+
/**
|
|
271
|
+
* Awaited so the step does not close — and a later read cannot be served
|
|
272
|
+
* the stale flow — before the eviction has settled. The cache is
|
|
273
|
+
* disposable; a failed eviction is a slower next run only.
|
|
274
|
+
*/
|
|
275
|
+
async evict() {
|
|
276
|
+
await this.cache.store.delete?.(this.keyHash).catch(() => undefined);
|
|
277
|
+
}
|
|
278
|
+
repairedAfterEndMismatch(recorder) {
|
|
279
|
+
return this.actionsAtEndMismatch !== undefined && recorder.recordedCount > this.actionsAtEndMismatch;
|
|
280
|
+
}
|
|
281
|
+
missed(reason, totalActions) {
|
|
282
|
+
return { mode: 'missed', reason, replayedActions: 0, totalActions };
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* One settled look at the screen, or undefined when the surface cannot be
|
|
287
|
+
* observed right now — the executor's business, not the cache's. Runtime hard
|
|
288
|
+
* stops (timeout, cancellation) are the step's truth even when they land
|
|
289
|
+
* during cache bookkeeping, and propagate.
|
|
290
|
+
*/
|
|
291
|
+
async function probeScreen(host) {
|
|
292
|
+
try {
|
|
293
|
+
return await host.observeSettled();
|
|
294
|
+
}
|
|
295
|
+
catch (cause) {
|
|
296
|
+
if (isRuntimeHardStop(cause))
|
|
297
|
+
throw cause;
|
|
298
|
+
return undefined;
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
//# sourceMappingURL=step-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"step-cache.js","sourceRoot":"","sources":["../../src/agent/step-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The tool-loop chassis (RFC0001, layer 4): everything an AI SDK step
|
|
3
|
+
* executor needs except its tool vocabulary. `createAgent` is this chassis
|
|
4
|
+
* plus the grammar toolset; a device or API executor brings different
|
|
5
|
+
* tools and inherits the whole discipline unchanged:
|
|
6
|
+
*
|
|
7
|
+
* - the `complete_step` verdict tool and the closed blocked-code policy;
|
|
8
|
+
* - hard-stop handling (budget/timeout/cancel end the loop, never the model);
|
|
9
|
+
* - loop guards (repeated calls and short cycles warn, then force a verdict);
|
|
10
|
+
* - the wind-down notice and forced conclusion on the final turns;
|
|
11
|
+
* - model-call accounting and a step transcript for `--debug`.
|
|
12
|
+
*/
|
|
13
|
+
import type { ModelMessage, ToolSet } from 'ai';
|
|
14
|
+
import { type SdkLanguageModel } from '../config/agent.ts';
|
|
15
|
+
import { AgentError } from './error.ts';
|
|
16
|
+
import { type StepExecutor, type StepExecutorContext } from './executor.ts';
|
|
17
|
+
/** Loop services the executor's tool bodies run under. */
|
|
18
|
+
export interface ToolLoopHelpers {
|
|
19
|
+
/**
|
|
20
|
+
* Runs one string-returning tool body under loop policy: nothing executes
|
|
21
|
+
* once the step is concluding, a runtime hard stop ends the loop, and every
|
|
22
|
+
* other failure goes back to the model as text it can react to.
|
|
23
|
+
*/
|
|
24
|
+
guard(body: () => Promise<string>): Promise<string>;
|
|
25
|
+
/** True once a verdict or hard stop landed; late tool calls should no-op. */
|
|
26
|
+
concluding(): boolean;
|
|
27
|
+
/** Records a runtime hard stop (budget/timeout/cancel) that ends the loop. */
|
|
28
|
+
reportHardStop(error: AgentError): void;
|
|
29
|
+
}
|
|
30
|
+
export interface ToolLoopExecutorOptions {
|
|
31
|
+
readonly name: string;
|
|
32
|
+
readonly version?: string;
|
|
33
|
+
/** AI SDK language model; defaults to the config-resolved `agent.model`. */
|
|
34
|
+
readonly model?: SdkLanguageModel;
|
|
35
|
+
/**
|
|
36
|
+
* Executor-specific system guidance (what the tools are, how to address
|
|
37
|
+
* targets). The chassis appends the project context and the verdict rules.
|
|
38
|
+
*/
|
|
39
|
+
readonly system?: string;
|
|
40
|
+
/** Builds the step's tool vocabulary; `complete_step` is added by the chassis. */
|
|
41
|
+
readonly tools: (context: StepExecutorContext, helpers: ToolLoopHelpers) => ToolSet;
|
|
42
|
+
/** Builds the first user message of the step. */
|
|
43
|
+
readonly buildPrompt: (context: StepExecutorContext) => string | Promise<string>;
|
|
44
|
+
/** Upper bound on model turns; capped at the harness model-call budget. */
|
|
45
|
+
readonly maxTurns?: number;
|
|
46
|
+
/** Between-turn history compaction; identity when omitted. */
|
|
47
|
+
readonly compactMessages?: (messages: ModelMessage[]) => ModelMessage[];
|
|
48
|
+
}
|
|
49
|
+
/** Builds a step executor from a tool vocabulary and the shared loop chassis. */
|
|
50
|
+
export declare function createToolLoopExecutor(options: ToolLoopExecutorOptions): StepExecutor;
|
|
51
|
+
//# sourceMappingURL=tool-loop.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tool-loop.d.ts","sourceRoot":"","sources":["../../src/agent/tool-loop.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAiB,YAAY,EAAc,OAAO,EAAE,MAAM,IAAI,CAAC;AAE3E,OAAO,EAAsB,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAG/E,OAAO,EAAE,UAAU,EAAgB,MAAM,YAAY,CAAC;AACtD,OAAO,EAGL,KAAK,YAAY,EACjB,KAAK,mBAAmB,EAEzB,MAAM,eAAe,CAAC;AA4CvB,0DAA0D;AAC1D,MAAM,WAAW,eAAe;IAC9B;;;;OAIG;IACH,KAAK,CAAC,IAAI,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACpD,6EAA6E;IAC7E,UAAU,IAAI,OAAO,CAAC;IACtB,8EAA8E;IAC9E,cAAc,CAAC,KAAK,EAAE,UAAU,GAAG,IAAI,CAAC;CACzC;AAED,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,OAAO,CAAC,EAAE,MAAM,CAAC;IAC1B,4EAA4E;IAC5E,QAAQ,CAAC,KAAK,CAAC,EAAE,gBAAgB,CAAC;IAClC;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,kFAAkF;IAClF,QAAQ,CAAC,KAAK,EAAE,CAAC,OAAO,EAAE,mBAAmB,EAAE,OAAO,EAAE,eAAe,KAAK,OAAO,CAAC;IACpF,iDAAiD;IACjD,QAAQ,CAAC,WAAW,EAAE,CAAC,OAAO,EAAE,mBAAmB,KAAK,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;IACjF,2EAA2E;IAC3E,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,8DAA8D;IAC9D,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,YAAY,EAAE,CAAC;CACzE;AAED,iFAAiF;AACjF,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,uBAAuB,GAAG,YAAY,CAuBrF"}
|