@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,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Prior-step context for agent prompts (spec 10-determinism.md).
|
|
3
|
+
*
|
|
4
|
+
* The ledger is not stored anywhere: it is derived on demand from the step
|
|
5
|
+
* timeline the run layer already records, so there is exactly one account of
|
|
6
|
+
* what happened. Serial-group members see each other's prior steps through the
|
|
7
|
+
* shared accumulator the run layer maintains; independent tests never do.
|
|
8
|
+
* Entries are untrusted quoted evidence and never carry policy authority.
|
|
9
|
+
*/
|
|
10
|
+
import { sanitizeText, truncateUtf8 } from '../internal/errors.js';
|
|
11
|
+
/** Maximum size of one handoff, before ledger-wide compaction. */
|
|
12
|
+
export const MAX_HANDOFF_BYTES = 700;
|
|
13
|
+
const MAX_LABEL_BYTES = 256;
|
|
14
|
+
/**
|
|
15
|
+
* Serializes completed steps as prompt context: newest entries first until the
|
|
16
|
+
* byte budget is reached, then emitted chronologically with the dropped count
|
|
17
|
+
* prepended. Labels and handoffs are sanitized and bounded here, at the trust
|
|
18
|
+
* boundary where they become model input.
|
|
19
|
+
*/
|
|
20
|
+
export function serializeLedger(steps, maxBytes) {
|
|
21
|
+
const encoder = new TextEncoder();
|
|
22
|
+
const lines = [];
|
|
23
|
+
let bytes = 0;
|
|
24
|
+
let index = steps.length - 1;
|
|
25
|
+
for (; index >= 0; index -= 1) {
|
|
26
|
+
const line = formatEntry(steps[index], index + 1);
|
|
27
|
+
const size = encoder.encode(`${line}\n`).byteLength;
|
|
28
|
+
if (bytes + size > maxBytes)
|
|
29
|
+
break;
|
|
30
|
+
bytes += size;
|
|
31
|
+
lines.push(line);
|
|
32
|
+
}
|
|
33
|
+
lines.reverse();
|
|
34
|
+
const dropped = index + 1;
|
|
35
|
+
if (dropped > 0)
|
|
36
|
+
lines.unshift(`[${dropped} earlier step(s) omitted]`);
|
|
37
|
+
const text = lines.join('\n');
|
|
38
|
+
return { text, bytes: encoder.encode(text).byteLength };
|
|
39
|
+
}
|
|
40
|
+
function formatEntry(step, position) {
|
|
41
|
+
const label = truncateUtf8(sanitizeText(step.label), MAX_LABEL_BYTES);
|
|
42
|
+
const head = `${position}. ${step.api} ${step.status}${label === '' ? '' : ` :: ${label}`}`;
|
|
43
|
+
if (step.explanation === undefined)
|
|
44
|
+
return head;
|
|
45
|
+
const handoff = truncateUtf8(sanitizeText(step.explanation), MAX_HANDOFF_BYTES);
|
|
46
|
+
return `${head}\n observed: ${handoff}`;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=ledger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["../../src/agent/ledger.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAGnE,kEAAkE;AAClE,MAAM,CAAC,MAAM,iBAAiB,GAAG,GAAG,CAAC;AAErC,MAAM,eAAe,GAAG,GAAG,CAAC;AAO5B;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAA4B,EAAE,QAAgB;IAC5E,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IAC7B,OAAO,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAE,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,OAAO,CAAC,MAAM,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC,UAAU,CAAC;QACpD,IAAI,KAAK,GAAG,IAAI,GAAG,QAAQ;YAAE,MAAM;QACnC,KAAK,IAAI,IAAI,CAAC;QACd,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACnB,CAAC;IACD,KAAK,CAAC,OAAO,EAAE,CAAC;IAChB,MAAM,OAAO,GAAG,KAAK,GAAG,CAAC,CAAC;IAC1B,IAAI,OAAO,GAAG,CAAC;QAAE,KAAK,CAAC,OAAO,CAAC,IAAI,OAAO,2BAA2B,CAAC,CAAC;IACvE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,CAAC;AAC1D,CAAC;AAED,SAAS,WAAW,CAAC,IAAgB,EAAE,QAAgB;IACrD,MAAM,KAAK,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,eAAe,CAAC,CAAC;IACtE,MAAM,IAAI,GAAG,GAAG,QAAQ,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,MAAM,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,EAAE,EAAE,CAAC;IAC5F,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAChD,MAAM,OAAO,GAAG,YAAY,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,iBAAiB,CAAC,CAAC;IAChF,OAAO,GAAG,IAAI,kBAAkB,OAAO,EAAE,CAAC;AAC5C,CAAC"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop guards: pure detectors over the tool-call transcript that catch an
|
|
3
|
+
* executor loop going in circles before the budget does. Ported from the
|
|
4
|
+
* shape proven in production — a wandering model repeats itself long before
|
|
5
|
+
* it runs out of calls, and every repeated turn is spent money.
|
|
6
|
+
*
|
|
7
|
+
* A guard never invents a verdict: a warning injects a notice the model can
|
|
8
|
+
* react to, and a stop forces the conclusion tool so the model still writes
|
|
9
|
+
* its own summary. Budgets remain the outer bound either way.
|
|
10
|
+
*/
|
|
11
|
+
import type { ModelMessage } from 'ai';
|
|
12
|
+
/** One tool call as identity: the name plus its exact serialized input. */
|
|
13
|
+
export interface GuardToolCall {
|
|
14
|
+
readonly toolName: string;
|
|
15
|
+
readonly input: string;
|
|
16
|
+
}
|
|
17
|
+
export type LoopGuardVerdict = {
|
|
18
|
+
readonly kind: 'clear';
|
|
19
|
+
} | {
|
|
20
|
+
readonly kind: 'warn' | 'stop';
|
|
21
|
+
readonly reason: string;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Extracts the tool-call identity sequence from a model transcript,
|
|
25
|
+
* excluding the conclusion tool: concluding attempts are never "loops".
|
|
26
|
+
*/
|
|
27
|
+
export declare function extractGuardCalls(messages: readonly ModelMessage[], concludeToolName: string): GuardToolCall[];
|
|
28
|
+
/**
|
|
29
|
+
* Checks the trailing calls for exact repetition (period 1) and short exact
|
|
30
|
+
* cycles (periods 2..4). Identity includes the serialized input, so two taps
|
|
31
|
+
* on different targets never count as a repeat — only literally re-issuing
|
|
32
|
+
* the same work does.
|
|
33
|
+
*/
|
|
34
|
+
export declare function checkLoopGuards(calls: readonly GuardToolCall[]): LoopGuardVerdict;
|
|
35
|
+
//# sourceMappingURL=loop-guards.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-guards.d.ts","sourceRoot":"","sources":["../../src/agent/loop-guards.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAEvC,2EAA2E;AAC3E,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAA;CAAE,GAC1B;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAahE;;;GAGG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,SAAS,YAAY,EAAE,EACjC,gBAAgB,EAAE,MAAM,GACvB,aAAa,EAAE,CAUjB;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,gBAAgB,CAajF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Loop guards: pure detectors over the tool-call transcript that catch an
|
|
3
|
+
* executor loop going in circles before the budget does. Ported from the
|
|
4
|
+
* shape proven in production — a wandering model repeats itself long before
|
|
5
|
+
* it runs out of calls, and every repeated turn is spent money.
|
|
6
|
+
*
|
|
7
|
+
* A guard never invents a verdict: a warning injects a notice the model can
|
|
8
|
+
* react to, and a stop forces the conclusion tool so the model still writes
|
|
9
|
+
* its own summary. Budgets remain the outer bound either way.
|
|
10
|
+
*/
|
|
11
|
+
/** Longest cycle period the detector considers. */
|
|
12
|
+
const MAX_CYCLE_PERIOD = 4;
|
|
13
|
+
/** Identical-call (period 1) thresholds: warn, then force the conclusion. */
|
|
14
|
+
const REPEAT_WARN = 3;
|
|
15
|
+
const REPEAT_STOP = 5;
|
|
16
|
+
/** Cycle (period 2..4) thresholds, counted in whole repetitions. */
|
|
17
|
+
const CYCLE_WARN = 2;
|
|
18
|
+
const CYCLE_STOP = 3;
|
|
19
|
+
/**
|
|
20
|
+
* Extracts the tool-call identity sequence from a model transcript,
|
|
21
|
+
* excluding the conclusion tool: concluding attempts are never "loops".
|
|
22
|
+
*/
|
|
23
|
+
export function extractGuardCalls(messages, concludeToolName) {
|
|
24
|
+
const calls = [];
|
|
25
|
+
for (const message of messages) {
|
|
26
|
+
if (message.role !== 'assistant' || !Array.isArray(message.content))
|
|
27
|
+
continue;
|
|
28
|
+
for (const part of message.content) {
|
|
29
|
+
if (part.type !== 'tool-call' || part.toolName === concludeToolName)
|
|
30
|
+
continue;
|
|
31
|
+
calls.push({ toolName: part.toolName, input: safeStringify(part.input) });
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return calls;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Checks the trailing calls for exact repetition (period 1) and short exact
|
|
38
|
+
* cycles (periods 2..4). Identity includes the serialized input, so two taps
|
|
39
|
+
* on different targets never count as a repeat — only literally re-issuing
|
|
40
|
+
* the same work does.
|
|
41
|
+
*/
|
|
42
|
+
export function checkLoopGuards(calls) {
|
|
43
|
+
let warning;
|
|
44
|
+
for (let period = 1; period <= MAX_CYCLE_PERIOD; period += 1) {
|
|
45
|
+
const repeats = trailingRepeats(calls, period);
|
|
46
|
+
const [warnAt, stopAt] = period === 1 ? [REPEAT_WARN, REPEAT_STOP] : [CYCLE_WARN, CYCLE_STOP];
|
|
47
|
+
if (repeats >= stopAt) {
|
|
48
|
+
return { kind: 'stop', reason: describe(calls, period, repeats) };
|
|
49
|
+
}
|
|
50
|
+
if (repeats >= warnAt && warning === undefined) {
|
|
51
|
+
warning = { kind: 'warn', reason: describe(calls, period, repeats) };
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return warning ?? { kind: 'clear' };
|
|
55
|
+
}
|
|
56
|
+
/** How many times the trailing window of `period` calls repeats consecutively. */
|
|
57
|
+
function trailingRepeats(calls, period) {
|
|
58
|
+
if (calls.length < period)
|
|
59
|
+
return 0;
|
|
60
|
+
// A period-p cycle must not be a disguised shorter cycle: "A A A A" matches
|
|
61
|
+
// period 2 as well, but period 1 owns it and applies the stricter policy.
|
|
62
|
+
if (period > 1 && isUniformWindow(calls, period))
|
|
63
|
+
return 0;
|
|
64
|
+
const same = (a, b) => a !== undefined && b !== undefined && a.toolName === b.toolName && a.input === b.input;
|
|
65
|
+
let repeats = 1;
|
|
66
|
+
for (let offset = period; calls.length - offset - period >= 0; offset += period) {
|
|
67
|
+
let matches = true;
|
|
68
|
+
for (let index = 0; index < period; index += 1) {
|
|
69
|
+
if (!same(calls[calls.length - period + index], calls[calls.length - offset - period + index])) {
|
|
70
|
+
matches = false;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (!matches)
|
|
75
|
+
break;
|
|
76
|
+
repeats += 1;
|
|
77
|
+
}
|
|
78
|
+
return repeats;
|
|
79
|
+
}
|
|
80
|
+
/** True when the trailing window consists of one identical call repeated. */
|
|
81
|
+
function isUniformWindow(calls, period) {
|
|
82
|
+
const first = calls[calls.length - period];
|
|
83
|
+
if (first === undefined)
|
|
84
|
+
return false;
|
|
85
|
+
for (let index = 1; index < period; index += 1) {
|
|
86
|
+
const call = calls[calls.length - period + index];
|
|
87
|
+
if (call === undefined || call.toolName !== first.toolName || call.input !== first.input) {
|
|
88
|
+
return false;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
return true;
|
|
92
|
+
}
|
|
93
|
+
function describe(calls, period, repeats) {
|
|
94
|
+
const names = calls
|
|
95
|
+
.slice(calls.length - period)
|
|
96
|
+
.map((call) => call.toolName)
|
|
97
|
+
.join(', ');
|
|
98
|
+
return period === 1
|
|
99
|
+
? `the same "${names}" call with identical input was issued ${repeats} times in a row`
|
|
100
|
+
: `the same ${period}-call sequence (${names}) repeated ${repeats} times with identical inputs`;
|
|
101
|
+
}
|
|
102
|
+
function safeStringify(value) {
|
|
103
|
+
try {
|
|
104
|
+
return JSON.stringify(value) ?? 'undefined';
|
|
105
|
+
}
|
|
106
|
+
catch {
|
|
107
|
+
return String(value);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=loop-guards.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"loop-guards.js","sourceRoot":"","sources":["../../src/agent/loop-guards.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
/** Model adapter contract (spec 05-config.md, 10-determinism.md, 14-security.md). */
|
|
2
|
+
import type { JSONSchema7 } from 'ai';
|
|
3
|
+
import { AgentError } from '../error.ts';
|
|
4
|
+
import type { ProtocolValidation } from '../protocol.ts';
|
|
5
|
+
/** Token accounting for one model call. */
|
|
6
|
+
export interface ModelUsage {
|
|
7
|
+
readonly inputTokens: number;
|
|
8
|
+
readonly outputTokens: number;
|
|
9
|
+
readonly accounting: 'provider' | 'adapter-upper-bound';
|
|
10
|
+
readonly estimatedCostUsd: number | undefined;
|
|
11
|
+
}
|
|
12
|
+
/** Provenance recorded for every model-backed step (13-reporting.md). */
|
|
13
|
+
export interface ModelProvenance {
|
|
14
|
+
readonly provider: string;
|
|
15
|
+
readonly model: string;
|
|
16
|
+
/**
|
|
17
|
+
* `local` for in-process adapters, `provider-default` when a caller-supplied
|
|
18
|
+
* model instance owns its own transport, otherwise an absolute endpoint URI.
|
|
19
|
+
*/
|
|
20
|
+
readonly endpoint: string;
|
|
21
|
+
readonly adapterVersion: string;
|
|
22
|
+
}
|
|
23
|
+
/** Untrusted pixel evidence sent alongside the prompt (spec 14-security.md). */
|
|
24
|
+
export interface ModelImage {
|
|
25
|
+
readonly data: Uint8Array;
|
|
26
|
+
readonly mediaType: string;
|
|
27
|
+
/** CSS pixel geometry, used for the pre-flight token bound. */
|
|
28
|
+
readonly width: number;
|
|
29
|
+
readonly height: number;
|
|
30
|
+
}
|
|
31
|
+
/** One bounded, stateless model request. There is no shared transcript. */
|
|
32
|
+
export interface ModelCall<Value> {
|
|
33
|
+
/** Trusted runner policy followed by trusted project context. */
|
|
34
|
+
readonly system: string;
|
|
35
|
+
/** Untrusted evidence and the method instruction. */
|
|
36
|
+
readonly prompt: string;
|
|
37
|
+
/**
|
|
38
|
+
* Untrusted image evidence attached to the same user message. Present only
|
|
39
|
+
* for vision calls; a non-multimodal provider rejects the request.
|
|
40
|
+
*/
|
|
41
|
+
readonly images?: readonly ModelImage[] | undefined;
|
|
42
|
+
readonly schemaName: string;
|
|
43
|
+
/**
|
|
44
|
+
* Closed response grammar sent to the provider as a structured-output
|
|
45
|
+
* schema. Omitted when only the runner can validate the payload, in which
|
|
46
|
+
* case the adapter parses one JSON object from the response text.
|
|
47
|
+
*/
|
|
48
|
+
readonly schema: JSONSchema7 | undefined;
|
|
49
|
+
readonly validate: (value: unknown) => ProtocolValidation<Value>;
|
|
50
|
+
readonly maxOutputTokens: number;
|
|
51
|
+
readonly maxInputTokens: number;
|
|
52
|
+
readonly signal: AbortSignal;
|
|
53
|
+
readonly timeoutMs: number;
|
|
54
|
+
}
|
|
55
|
+
export interface ModelResult<Value> {
|
|
56
|
+
readonly value: Value;
|
|
57
|
+
readonly usage: ModelUsage;
|
|
58
|
+
}
|
|
59
|
+
export interface ModelAdapter {
|
|
60
|
+
readonly provenance: ModelProvenance;
|
|
61
|
+
/** Performs exactly one model request and validates its response. */
|
|
62
|
+
generate<Value>(call: ModelCall<Value>): Promise<ModelResult<Value>>;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Raised when a provider response cannot be parsed or fails the closed
|
|
66
|
+
* grammar. The raw text is carried so the caller may spend remaining budget on
|
|
67
|
+
* one repair attempt.
|
|
68
|
+
*/
|
|
69
|
+
export declare class ModelOutputInvalidError extends AgentError {
|
|
70
|
+
readonly rawText: string | undefined;
|
|
71
|
+
constructor(issue: string, options?: {
|
|
72
|
+
rawText?: string;
|
|
73
|
+
cause?: unknown;
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Conservative token upper bound. UTF-8 byte length bounds every byte-level
|
|
78
|
+
* tokenizer from above, so it is used when a provider reports no usage and for
|
|
79
|
+
* the pre-flight ceiling required by 14-security.md.
|
|
80
|
+
*
|
|
81
|
+
* Every budget that mixes with this one — reserves, ledger size, observation
|
|
82
|
+
* size — is therefore in the same byte-scaled units, not in real tokens.
|
|
83
|
+
*/
|
|
84
|
+
export declare function tokenUpperBound(text: string): number;
|
|
85
|
+
/**
|
|
86
|
+
* Conservative token bound for one image. Vision providers bill images by
|
|
87
|
+
* fixed-size patches rather than bytes, so the count of patches covering the
|
|
88
|
+
* image bounds every such encoder from above closely enough to keep a vision
|
|
89
|
+
* call inside `limits.maxModelTokensPerCall`. Compressed byte length would be
|
|
90
|
+
* meaningless here: a blank screenshot is small and a photograph is not, while
|
|
91
|
+
* both cost the same number of patches.
|
|
92
|
+
*/
|
|
93
|
+
export declare function imageTokenUpperBound(image: {
|
|
94
|
+
width: number;
|
|
95
|
+
height: number;
|
|
96
|
+
}): number;
|
|
97
|
+
//# sourceMappingURL=adapter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../src/agent/model/adapter.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAErF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAEzD,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,UAAU,GAAG,qBAAqB,CAAC;IACxD,QAAQ,CAAC,gBAAgB,EAAE,MAAM,GAAG,SAAS,CAAC;CAC/C;AAED,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;CACjC;AAED,gFAAgF;AAChF,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,UAAU,CAAC;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,+DAA+D;IAC/D,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,2EAA2E;AAC3E,MAAM,WAAW,SAAS,CAAC,KAAK;IAC9B,iEAAiE;IACjE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,qDAAqD;IACrD,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB;;;OAGG;IACH,QAAQ,CAAC,MAAM,CAAC,EAAE,SAAS,UAAU,EAAE,GAAG,SAAS,CAAC;IACpD,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B;;;;OAIG;IACH,QAAQ,CAAC,MAAM,EAAE,WAAW,GAAG,SAAS,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,kBAAkB,CAAC,KAAK,CAAC,CAAC;IACjE,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,WAAW,CAAC,KAAK;IAChC,QAAQ,CAAC,KAAK,EAAE,KAAK,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;CAC5B;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,UAAU,EAAE,eAAe,CAAC;IACrC,qEAAqE;IACrE,QAAQ,CAAC,KAAK,EAAE,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;CACtE;AAED;;;;GAIG;AACH,qBAAa,uBAAwB,SAAQ,UAAU;IACrD,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,CAAC;IAErC,YAAY,KAAK,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,OAAO,CAAA;KAAO,EAG7E;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEpD;AAKD;;;;;;;GAOG;AACH,wBAAgB,oBAAoB,CAAC,KAAK,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAKrF"}
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/** Model adapter contract (spec 05-config.md, 10-determinism.md, 14-security.md). */
|
|
2
|
+
import { AgentError } from '../error.js';
|
|
3
|
+
/**
|
|
4
|
+
* Raised when a provider response cannot be parsed or fails the closed
|
|
5
|
+
* grammar. The raw text is carried so the caller may spend remaining budget on
|
|
6
|
+
* one repair attempt.
|
|
7
|
+
*/
|
|
8
|
+
export class ModelOutputInvalidError extends AgentError {
|
|
9
|
+
rawText;
|
|
10
|
+
constructor(issue, options = {}) {
|
|
11
|
+
super('MODEL_OUTPUT_INVALID', issue, options.cause === undefined ? {} : { cause: options.cause });
|
|
12
|
+
this.rawText = options.rawText;
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Conservative token upper bound. UTF-8 byte length bounds every byte-level
|
|
17
|
+
* tokenizer from above, so it is used when a provider reports no usage and for
|
|
18
|
+
* the pre-flight ceiling required by 14-security.md.
|
|
19
|
+
*
|
|
20
|
+
* Every budget that mixes with this one — reserves, ledger size, observation
|
|
21
|
+
* size — is therefore in the same byte-scaled units, not in real tokens.
|
|
22
|
+
*/
|
|
23
|
+
export function tokenUpperBound(text) {
|
|
24
|
+
return new TextEncoder().encode(text).byteLength;
|
|
25
|
+
}
|
|
26
|
+
/** Side of the square patch tile-based vision encoders consume an image in. */
|
|
27
|
+
const IMAGE_TILE_PX = 28;
|
|
28
|
+
/**
|
|
29
|
+
* Conservative token bound for one image. Vision providers bill images by
|
|
30
|
+
* fixed-size patches rather than bytes, so the count of patches covering the
|
|
31
|
+
* image bounds every such encoder from above closely enough to keep a vision
|
|
32
|
+
* call inside `limits.maxModelTokensPerCall`. Compressed byte length would be
|
|
33
|
+
* meaningless here: a blank screenshot is small and a photograph is not, while
|
|
34
|
+
* both cost the same number of patches.
|
|
35
|
+
*/
|
|
36
|
+
export function imageTokenUpperBound(image) {
|
|
37
|
+
return (Math.ceil(Math.max(1, image.width) / IMAGE_TILE_PX) *
|
|
38
|
+
Math.ceil(Math.max(1, image.height) / IMAGE_TILE_PX));
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=adapter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../src/agent/model/adapter.ts"],"names":[],"mappings":"AAAA,qFAAqF;AAGrF,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAoEzC;;;;GAIG;AACH,MAAM,OAAO,uBAAwB,SAAQ,UAAU;IAC5C,OAAO,CAAqB;IAErC,YAAY,KAAa,EAAE,OAAO,GAA0C,EAAE;QAC5E,KAAK,CAAC,sBAAsB,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;QAClG,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY;IAC1C,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC;AACnD,CAAC;AAED,+EAA+E;AAC/E,MAAM,aAAa,GAAG,EAAE,CAAC;AAEzB;;;;;;;GAOG;AACH,MAAM,UAAU,oBAAoB,CAAC,KAAwC;IAC3E,OAAO,CACL,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,aAAa,CAAC;QACnD,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,CACrD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
/** Which model an invocation talks to (spec 05-config.md). */
|
|
2
|
+
import type { ResolvedAgentConfig } from '../../config/agent.ts';
|
|
3
|
+
import type { ModelAdapter } from './adapter.ts';
|
|
4
|
+
/**
|
|
5
|
+
* Picks the adapter for one invocation.
|
|
6
|
+
*
|
|
7
|
+
* `agent.visionModel` exists because visual grounding is a much higher bar than
|
|
8
|
+
* accepting an image, and pinning it separately keeps every text-only call on the
|
|
9
|
+
* cheaper model. The vision adapter is built on first use rather than at fixture
|
|
10
|
+
* acquisition: a project that pins a vision model must not fail a run that never
|
|
11
|
+
* asks for pixels, for example because that model's credential is absent from
|
|
12
|
+
* this environment.
|
|
13
|
+
*/
|
|
14
|
+
export declare class ModelRouter {
|
|
15
|
+
private readonly buildBase;
|
|
16
|
+
private readonly buildVision;
|
|
17
|
+
private baseAdapter;
|
|
18
|
+
private visionAdapter;
|
|
19
|
+
constructor(buildBase: () => ModelAdapter, buildVision: (() => ModelAdapter) | undefined);
|
|
20
|
+
/**
|
|
21
|
+
* The adapter for a call. An invocation that is sending pixels keeps the vision
|
|
22
|
+
* model for the rest of its lifetime, including rounds whose pixels were
|
|
23
|
+
* withheld, so a polling method never switches models between rounds.
|
|
24
|
+
*/
|
|
25
|
+
select(vision: boolean): ModelAdapter;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Builds the router for one attempt from resolved agent config.
|
|
29
|
+
*
|
|
30
|
+
* The base adapter is built on first use, like the vision adapter: a run whose
|
|
31
|
+
* `agent.act()` steps go to a custom executor may legitimately have no model at
|
|
32
|
+
* all, and must not fail on a MODEL_UNAVAILABLE it would never hit. Judgment
|
|
33
|
+
* and locate methods still fail with MODEL_UNAVAILABLE on their first call.
|
|
34
|
+
*/
|
|
35
|
+
export declare function createModelRouter(agent: ResolvedAgentConfig, build: (model: ResolvedAgentConfig['model']) => ModelAdapter): ModelRouter;
|
|
36
|
+
//# sourceMappingURL=router.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.d.ts","sourceRoot":"","sources":["../../../src/agent/model/router.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAE9D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;;;;;;;;GASG;AACH,qBAAa,WAAW;IAKpB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL9B,OAAO,CAAC,WAAW,CAA2B;IAC9C,OAAO,CAAC,aAAa,CAA2B;IAEhD,YACmB,SAAS,EAAE,MAAM,YAAY,EAC7B,WAAW,EAAE,CAAC,MAAM,YAAY,CAAC,GAAG,SAAS,EAC5D;IAEJ;;;;OAIG;IACH,MAAM,CAAC,MAAM,EAAE,OAAO,GAAG,YAAY,CAKpC;CACF;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,mBAAmB,EAC1B,KAAK,EAAE,CAAC,KAAK,EAAE,mBAAmB,CAAC,OAAO,CAAC,KAAK,YAAY,GAC3D,WAAW,CAMb"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/** Which model an invocation talks to (spec 05-config.md). */
|
|
2
|
+
/**
|
|
3
|
+
* Picks the adapter for one invocation.
|
|
4
|
+
*
|
|
5
|
+
* `agent.visionModel` exists because visual grounding is a much higher bar than
|
|
6
|
+
* accepting an image, and pinning it separately keeps every text-only call on the
|
|
7
|
+
* cheaper model. The vision adapter is built on first use rather than at fixture
|
|
8
|
+
* acquisition: a project that pins a vision model must not fail a run that never
|
|
9
|
+
* asks for pixels, for example because that model's credential is absent from
|
|
10
|
+
* this environment.
|
|
11
|
+
*/
|
|
12
|
+
export class ModelRouter {
|
|
13
|
+
buildBase;
|
|
14
|
+
buildVision;
|
|
15
|
+
baseAdapter;
|
|
16
|
+
visionAdapter;
|
|
17
|
+
constructor(buildBase, buildVision) {
|
|
18
|
+
this.buildBase = buildBase;
|
|
19
|
+
this.buildVision = buildVision;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* The adapter for a call. An invocation that is sending pixels keeps the vision
|
|
23
|
+
* model for the rest of its lifetime, including rounds whose pixels were
|
|
24
|
+
* withheld, so a polling method never switches models between rounds.
|
|
25
|
+
*/
|
|
26
|
+
select(vision) {
|
|
27
|
+
if (!vision || this.buildVision === undefined) {
|
|
28
|
+
return (this.baseAdapter ??= this.buildBase());
|
|
29
|
+
}
|
|
30
|
+
return (this.visionAdapter ??= this.buildVision());
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Builds the router for one attempt from resolved agent config.
|
|
35
|
+
*
|
|
36
|
+
* The base adapter is built on first use, like the vision adapter: a run whose
|
|
37
|
+
* `agent.act()` steps go to a custom executor may legitimately have no model at
|
|
38
|
+
* all, and must not fail on a MODEL_UNAVAILABLE it would never hit. Judgment
|
|
39
|
+
* and locate methods still fail with MODEL_UNAVAILABLE on their first call.
|
|
40
|
+
*/
|
|
41
|
+
export function createModelRouter(agent, build) {
|
|
42
|
+
const visionModel = agent.visionModel;
|
|
43
|
+
return new ModelRouter(() => build(agent.model), visionModel === undefined ? undefined : () => build(visionModel));
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=router.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"router.js","sourceRoot":"","sources":["../../../src/agent/model/router.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAK9D;;;;;;;;;GASG;AACH,MAAM,OAAO,WAAW;IAKH,SAAS;IACT,WAAW;IALtB,WAAW,CAA2B;IACtC,aAAa,CAA2B;IAEhD,YACmB,SAA6B,EAC7B,WAA6C;yBAD7C,SAAS;2BACT,WAAW;IAC3B,CAAC;IAEJ;;;;OAIG;IACH,MAAM,CAAC,MAAe;QACpB,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,WAAW,KAAK,SAAS,EAAE,CAAC;YAC9C,OAAO,CAAC,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;QACjD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,aAAa,KAAK,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;IACrD,CAAC;CACF;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,KAA0B,EAC1B,KAA4D;IAE5D,MAAM,WAAW,GAAG,KAAK,CAAC,WAAW,CAAC;IACtC,OAAO,IAAI,WAAW,CACpB,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,EACxB,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,KAAK,CAAC,WAAW,CAAC,CACjE,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort JSON Schema projection of a caller-supplied Standard Schema v1.
|
|
3
|
+
*
|
|
4
|
+
* Standard Schema v1 has no required JSON Schema projection, but zod and any
|
|
5
|
+
* vendor exposing the `~standard.jsonSchema` converter can produce one. When a
|
|
6
|
+
* projection exists the runner sends it as a provider structured-output schema
|
|
7
|
+
* so the shape is enforced instead of guessed; otherwise the extraction falls
|
|
8
|
+
* back to text mode plus the validation-issue repair loop.
|
|
9
|
+
*
|
|
10
|
+
* The projection is only a provider hint. The caller's `~standard.validate`
|
|
11
|
+
* remains the sole authority over the extracted value.
|
|
12
|
+
*/
|
|
13
|
+
import type { JSONSchema7 } from 'ai';
|
|
14
|
+
import type { StandardSchemaV1 } from '../../types.ts';
|
|
15
|
+
export declare function deriveJsonSchema(schema: StandardSchemaV1): Promise<JSONSchema7 | undefined>;
|
|
16
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../../src/agent/model/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,IAAI,CAAC;AACtC,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAGvD,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,WAAW,GAAG,SAAS,CAAC,CAUlC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Best-effort JSON Schema projection of a caller-supplied Standard Schema v1.
|
|
3
|
+
*
|
|
4
|
+
* Standard Schema v1 has no required JSON Schema projection, but zod and any
|
|
5
|
+
* vendor exposing the `~standard.jsonSchema` converter can produce one. When a
|
|
6
|
+
* projection exists the runner sends it as a provider structured-output schema
|
|
7
|
+
* so the shape is enforced instead of guessed; otherwise the extraction falls
|
|
8
|
+
* back to text mode plus the validation-issue repair loop.
|
|
9
|
+
*
|
|
10
|
+
* The projection is only a provider hint. The caller's `~standard.validate`
|
|
11
|
+
* remains the sole authority over the extracted value.
|
|
12
|
+
*/
|
|
13
|
+
import { loadAiSdk } from '../ai-sdk.js';
|
|
14
|
+
export async function deriveJsonSchema(schema) {
|
|
15
|
+
try {
|
|
16
|
+
// The projection is best-effort by contract, so a missing optional AI SDK
|
|
17
|
+
// degrades to text mode here; the model call itself reports it properly.
|
|
18
|
+
const { asSchema } = await loadAiSdk();
|
|
19
|
+
const projected = await asSchema(schema).jsonSchema;
|
|
20
|
+
return isUsable(projected) ? projected : undefined;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return undefined;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/** A schema with no type or members constrains nothing and is rejected by some providers. */
|
|
27
|
+
function isUsable(schema) {
|
|
28
|
+
if (typeof schema !== 'object' || schema === null || Array.isArray(schema))
|
|
29
|
+
return false;
|
|
30
|
+
const record = schema;
|
|
31
|
+
return (record['type'] !== undefined ||
|
|
32
|
+
record['properties'] !== undefined ||
|
|
33
|
+
record['anyOf'] !== undefined ||
|
|
34
|
+
record['oneOf'] !== undefined ||
|
|
35
|
+
record['$ref'] !== undefined);
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../../src/agent/model/schema.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAIH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,MAAwB;IAExB,IAAI,CAAC;QACH,0EAA0E;QAC1E,yEAAyE;QACzE,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,SAAS,EAAE,CAAC;QACvC,MAAM,SAAS,GAAG,MAAM,QAAQ,CAAC,MAAe,CAAC,CAAC,UAAU,CAAC;QAC7D,OAAO,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAE,SAAyB,CAAC,CAAC,CAAC,SAAS,CAAC;IACtE,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,6FAA6F;AAC7F,SAAS,QAAQ,CAAC,MAAe;IAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC;QAAE,OAAO,KAAK,CAAC;IACzF,MAAM,MAAM,GAAG,MAAiC,CAAC;IACjD,OAAO,CACL,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS;QAC5B,MAAM,CAAC,YAAY,CAAC,KAAK,SAAS;QAClC,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS;QAC7B,MAAM,CAAC,OAAO,CAAC,KAAK,SAAS;QAC7B,MAAM,CAAC,MAAM,CAAC,KAAK,SAAS,CAC7B,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* AI SDK adapter (spec 05-config.md). One implementation serves every
|
|
3
|
+
* provider: a `provider/model-id` reference resolves through the AI Gateway,
|
|
4
|
+
* and a caller-supplied AI SDK model instance (`openai('gpt-4o')`, a local
|
|
5
|
+
* provider, a scripted test model) is used directly. Everything after model
|
|
6
|
+
* construction — bounded requests, closed-grammar validation, usage and error
|
|
7
|
+
* translation — is provider-independent.
|
|
8
|
+
*/
|
|
9
|
+
import { type ResolvedModel, type SdkLanguageModel } from '../../config/agent.ts';
|
|
10
|
+
import { type ModelAdapter } from './adapter.ts';
|
|
11
|
+
/** Creates the adapter for one resolved model, or fails with MODEL_UNAVAILABLE. */
|
|
12
|
+
export declare function createModelAdapter(model: ResolvedModel | undefined): ModelAdapter;
|
|
13
|
+
/**
|
|
14
|
+
* Builds the bare AI SDK language model for one resolved model reference, for
|
|
15
|
+
* callers that drive the SDK directly (the default step executor) rather than
|
|
16
|
+
* through the adapter. Fails with MODEL_UNAVAILABLE exactly like the adapter.
|
|
17
|
+
* Gateway references require the AI SDK to be loaded (loadAiSdk) first; model
|
|
18
|
+
* instances never touch it.
|
|
19
|
+
*/
|
|
20
|
+
export declare function instantiateLanguageModel(model: ResolvedModel): SdkLanguageModel;
|
|
21
|
+
/**
|
|
22
|
+
* The AI Gateway reports per-request cost in provider metadata when available;
|
|
23
|
+
* other providers simply lack the key. `cost` is what the gateway bills; BYOK
|
|
24
|
+
* routes bill the provider key directly and report `cost: "0"`, so fall back
|
|
25
|
+
* to `marketCost`, the list-price estimate of the same request.
|
|
26
|
+
*/
|
|
27
|
+
export declare function readCost(metadata: Readonly<Record<string, Readonly<Record<string, unknown>>>> | undefined): number | undefined;
|
|
28
|
+
//# sourceMappingURL=sdk.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdk.d.ts","sourceRoot":"","sources":["../../../src/agent/model/sdk.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,gBAAgB,EACtB,MAAM,uBAAuB,CAAC;AAI/B,OAAO,EAIL,KAAK,YAAY,EAKlB,MAAM,cAAc,CAAC;AAmBtB,mFAAmF;AACnF,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,aAAa,GAAG,SAAS,GAAG,YAAY,CAqFjF;AAsBD;;;;;;GAMG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,aAAa,GAAG,gBAAgB,CAE/E;AA6ED;;;;;GAKG;AACH,wBAAgB,QAAQ,CACtB,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,GAChF,MAAM,GAAG,SAAS,CAIpB"}
|