@theoremjs/agents 0.3.0 → 0.3.1
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 +276 -995
- package/esm/mod.d.ts +33 -19
- package/esm/mod.js +18 -11
- package/esm/src/cli/commands/bench.js +36 -14
- package/esm/src/cli/commands/detect-compile.d.ts +17 -0
- package/esm/src/cli/commands/detect-compile.js +22 -0
- package/esm/src/cli/commands/eval.d.ts +3 -3
- package/esm/src/cli/commands/fuzz-canary.js +55 -16
- package/esm/src/cli/commands/profile.js +4 -4
- package/esm/src/cli/commands/run.d.ts +2 -2
- package/esm/src/cli/commands/run.js +1 -1
- package/esm/src/cli/commands/test.d.ts +4 -3
- package/esm/src/cli/commands/test.js +2 -2
- package/esm/src/cli/index.js +9 -9
- package/esm/src/cli/matrix/fixtures.js +25 -30
- package/esm/src/evals/attachments.d.ts +1 -0
- package/esm/src/evals/attachments.js +4 -2
- package/esm/src/evals/breakdown.d.ts +2 -0
- package/esm/src/evals/breakdown.js +1 -0
- package/esm/src/evals/graders/answer.d.ts +3 -0
- package/esm/src/evals/graders/answer.js +1 -0
- package/esm/src/evals/graders/code.d.ts +7 -31
- package/esm/src/evals/graders/code.js +4 -25
- package/esm/src/evals/graders/judge.d.ts +4 -0
- package/esm/src/evals/graders/judge.js +7 -5
- package/esm/src/evals/graders/latency.d.ts +1 -0
- package/esm/src/evals/graders/latency.js +3 -2
- package/esm/src/evals/graders/live.d.ts +3 -0
- package/esm/src/evals/graders/live.js +2 -0
- package/esm/src/evals/graders/media.js +1 -2
- package/esm/src/evals/graders/shared.js +1 -1
- package/esm/src/evals/graders/transcript.d.ts +2 -0
- package/esm/src/evals/graders/transcript.js +5 -3
- package/esm/src/evals/mod.d.ts +1 -9
- package/esm/src/evals/mod.js +1 -9
- package/esm/src/evals/record.d.ts +6 -0
- package/esm/src/evals/record.js +4 -2
- package/esm/src/evals/rubrics/mod.d.ts +1 -1
- package/esm/src/evals/rubrics/mod.js +1 -1
- package/esm/src/evals/rubrics/mustache.js +1 -1
- package/esm/src/evals/rubrics/types.js +1 -1
- package/esm/src/evals/run.d.ts +9 -52
- package/esm/src/evals/run.js +12 -46
- package/esm/src/evals/suite.d.ts +12 -3
- package/esm/src/evals/suite.js +9 -4
- package/esm/src/evals/summary.d.ts +3 -0
- package/esm/src/evals/summary.js +1 -0
- package/esm/src/evals/trial.d.ts +3 -16
- package/esm/src/evals/trial.js +7 -30
- package/esm/src/evals/types.d.ts +30 -121
- package/esm/src/evals/types.js +3 -16
- package/esm/src/evals/verdict.d.ts +5 -0
- package/esm/src/evals/verdict.js +4 -1
- package/esm/src/guardrails/boundaries.d.ts +41 -0
- package/esm/src/guardrails/boundaries.js +103 -0
- package/esm/src/guardrails/canary-gate.d.ts +1 -0
- package/esm/src/guardrails/canary.d.ts +49 -15
- package/esm/src/guardrails/canary.js +103 -30
- package/esm/src/guardrails/compile-egress.d.ts +6 -5
- package/esm/src/guardrails/compile-egress.js +6 -5
- package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
- package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
- package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
- package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
- package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
- package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
- package/esm/src/guardrails/corpus/live-attacks.js +6 -1
- package/esm/src/guardrails/corpus/mod.d.ts +1 -1
- package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
- package/esm/src/guardrails/corpus/secrets.js +2 -2
- package/esm/src/guardrails/corpus/strings.d.ts +1 -1
- package/esm/src/guardrails/corpus/strings.js +1 -1
- package/esm/src/guardrails/corpus/types.d.ts +5 -1
- package/esm/src/guardrails/credential-rules.d.ts +36 -0
- package/esm/src/guardrails/credential-rules.js +3001 -0
- package/esm/src/guardrails/credential-scan.d.ts +45 -0
- package/esm/src/guardrails/credential-scan.js +172 -0
- package/esm/src/guardrails/destinations.d.ts +45 -0
- package/esm/src/guardrails/destinations.js +234 -0
- package/esm/src/guardrails/detect-at.d.ts +107 -0
- package/esm/src/guardrails/detect-at.js +434 -0
- package/esm/src/guardrails/detect-reply.d.ts +61 -0
- package/esm/src/guardrails/detect-reply.js +95 -0
- package/esm/src/guardrails/detect-stream.d.ts +33 -0
- package/esm/src/guardrails/detect-stream.js +77 -0
- package/esm/src/guardrails/detectors.d.ts +216 -0
- package/esm/src/guardrails/detectors.js +503 -0
- package/esm/src/guardrails/egress-automata.d.ts +4 -6
- package/esm/src/guardrails/egress-automata.js +24095 -4572
- package/esm/src/guardrails/egress-compiler.d.ts +38 -16
- package/esm/src/guardrails/egress-compiler.js +254 -60
- package/esm/src/guardrails/egress-patterns.d.ts +4 -2
- package/esm/src/guardrails/egress-patterns.js +6 -2
- package/esm/src/guardrails/egress-stream.d.ts +54 -36
- package/esm/src/guardrails/egress-stream.js +253 -124
- package/esm/src/guardrails/egress-urls.d.ts +6 -3
- package/esm/src/guardrails/egress-urls.js +14 -22
- package/esm/src/guardrails/egress.d.ts +26 -86
- package/esm/src/guardrails/egress.js +59 -309
- package/esm/src/guardrails/error.d.ts +13 -8
- package/esm/src/guardrails/error.js +23 -18
- package/esm/src/guardrails/event-schemas.d.ts +46 -3
- package/esm/src/guardrails/event-schemas.js +12 -5
- package/esm/src/guardrails/events.d.ts +5 -1
- package/esm/src/guardrails/events.js +4 -1
- package/esm/src/guardrails/hints.d.ts +14 -0
- package/esm/src/guardrails/hints.js +57 -0
- package/esm/src/guardrails/hits.d.ts +7 -1
- package/esm/src/guardrails/hits.js +12 -1
- package/esm/src/guardrails/host-patterns.d.ts +85 -0
- package/esm/src/guardrails/host-patterns.js +173 -0
- package/esm/src/guardrails/injection-patterns.d.ts +6 -1
- package/esm/src/guardrails/injection-patterns.js +33 -1
- package/esm/src/guardrails/injection-reversed.d.ts +9 -0
- package/esm/src/guardrails/injection-reversed.js +49 -0
- package/esm/src/guardrails/injection.d.ts +17 -1
- package/esm/src/guardrails/injection.js +259 -36
- package/esm/src/guardrails/labels.d.ts +40 -0
- package/esm/src/guardrails/labels.js +874 -0
- package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
- package/esm/src/guardrails/live-outbound-gate.js +100 -107
- package/esm/src/guardrails/mod.d.ts +29 -21
- package/esm/src/guardrails/mod.js +18 -13
- package/esm/src/guardrails/network.d.ts +4 -0
- package/esm/src/guardrails/network.js +21 -19
- package/esm/src/guardrails/normalize.d.ts +15 -1
- package/esm/src/guardrails/normalize.js +34 -1
- package/esm/src/guardrails/policy.d.ts +2 -17
- package/esm/src/guardrails/policy.js +12 -41
- package/esm/src/guardrails/progressive-yield.d.ts +65 -24
- package/esm/src/guardrails/progressive-yield.js +191 -147
- package/esm/src/guardrails/prompt-echo.d.ts +4 -2
- package/esm/src/guardrails/prompt-echo.js +87 -6
- package/esm/src/guardrails/quota.d.ts +1 -0
- package/esm/src/guardrails/quota.js +1 -1
- package/esm/src/guardrails/rules.d.ts +20 -29
- package/esm/src/guardrails/rules.js +23 -30
- package/esm/src/guardrails/sanitize.d.ts +32 -15
- package/esm/src/guardrails/sanitize.js +100 -124
- package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
- package/esm/src/guardrails/sensitive-groups.js +12 -0
- package/esm/src/guardrails/sensitive.d.ts +16 -23
- package/esm/src/guardrails/sensitive.js +168 -47
- package/esm/src/guardrails/serialize.d.ts +1 -0
- package/esm/src/guardrails/testing.d.ts +4 -2
- package/esm/src/guardrails/testing.js +4 -2
- package/esm/src/guardrails/theorem-error.d.ts +4 -1
- package/esm/src/guardrails/theorem-error.js +3 -2
- package/esm/src/guardrails/thought-guard.d.ts +34 -13
- package/esm/src/guardrails/thought-guard.js +264 -64
- package/esm/src/guardrails/tool-directives.d.ts +29 -10
- package/esm/src/guardrails/tool-directives.js +133 -47
- package/esm/src/guardrails/tool-leak.d.ts +26 -0
- package/esm/src/guardrails/tool-leak.js +45 -0
- package/esm/src/guardrails/tool-result.d.ts +45 -14
- package/esm/src/guardrails/tool-result.js +94 -70
- package/esm/src/guardrails/types.d.ts +79 -71
- package/esm/src/guardrails/types.js +11 -7
- package/esm/src/host/client-turn.d.ts +29 -2
- package/esm/src/host/client-turn.js +46 -4
- package/esm/src/host/mint-trace.d.ts +1 -0
- package/esm/src/host/mint-trace.js +3 -2
- package/esm/src/host/mod.d.ts +2 -2
- package/esm/src/host/mod.js +1 -1
- package/esm/src/host/readStreamingJsonStringField.js +2 -43
- package/esm/src/host/reply.d.ts +6 -0
- package/esm/src/host/reply.js +7 -1
- package/esm/src/interface/blocks.d.ts +3 -0
- package/esm/src/interface/blocks.js +84 -14
- package/esm/src/interface/composer-actions.d.ts +4 -0
- package/esm/src/interface/composer-actions.js +5 -3
- package/esm/src/interface/draft.d.ts +6 -0
- package/esm/src/interface/draft.js +22 -11
- package/esm/src/interface/from-profile.d.ts +13 -1
- package/esm/src/interface/from-profile.js +66 -31
- package/esm/src/interface/history.d.ts +9 -3
- package/esm/src/interface/history.js +33 -24
- package/esm/src/interface/inputs.d.ts +1 -0
- package/esm/src/interface/inputs.js +3 -0
- package/esm/src/interface/mod.d.ts +4 -2
- package/esm/src/interface/mod.js +3 -2
- package/esm/src/interface/models.d.ts +7 -0
- package/esm/src/interface/models.js +5 -0
- package/esm/src/interface/pending.d.ts +9 -0
- package/esm/src/interface/pending.js +9 -3
- package/esm/src/interface/profile-interface.js +54 -40
- package/esm/src/interface/session.d.ts +12 -5
- package/esm/src/interface/session.js +17 -10
- package/esm/src/interface/stop.d.ts +13 -0
- package/esm/src/interface/stop.js +28 -0
- package/esm/src/interface/tool-calls.d.ts +14 -2
- package/esm/src/interface/tool-calls.js +64 -10
- package/esm/src/interface/tool-invoke.d.ts +2 -0
- package/esm/src/interface/tool-invoke.js +3 -1
- package/esm/src/interface/tool-media.d.ts +2 -0
- package/esm/src/interface/tool-media.js +2 -1
- package/esm/src/interface/types.d.ts +105 -40
- package/esm/src/interface/types.js +1 -0
- package/esm/src/kernel/api-catalog.d.ts +85 -0
- package/esm/src/kernel/api-catalog.js +229 -0
- package/esm/src/kernel/auth/crypto.d.ts +7 -2
- package/esm/src/kernel/auth/crypto.js +12 -10
- package/esm/src/kernel/auth/oauth.d.ts +2 -1
- package/esm/src/kernel/auth/oauth.js +23 -22
- package/esm/src/kernel/auth/typed-secret.js +2 -2
- package/esm/src/kernel/auth/types.d.ts +13 -0
- package/esm/src/kernel/checkpoint.d.ts +43 -0
- package/esm/src/kernel/checkpoint.js +58 -0
- package/esm/src/kernel/default-scope.d.ts +43 -5
- package/esm/src/kernel/default-scope.js +54 -5
- package/esm/src/kernel/engine/call-trace.d.ts +19 -0
- package/esm/src/kernel/engine/call-trace.js +29 -0
- package/esm/src/kernel/engine/compaction.d.ts +6 -5
- package/esm/src/kernel/engine/compaction.js +12 -11
- package/esm/src/kernel/engine/decision.d.ts +10 -8
- package/esm/src/kernel/engine/decision.js +173 -146
- package/esm/src/kernel/engine/embedding.d.ts +8 -0
- package/esm/src/kernel/engine/embedding.js +118 -0
- package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
- package/esm/src/kernel/engine/live-inbound.js +36 -11
- package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
- package/esm/src/kernel/engine/live-ingress.js +6 -1
- package/esm/src/kernel/engine/repair.js +12 -12
- package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
- package/esm/src/kernel/engine/runner/gates.js +287 -101
- package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
- package/esm/src/kernel/engine/runner/mod.js +107 -56
- package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
- package/esm/src/kernel/engine/runner/nested.js +134 -0
- package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
- package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
- package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
- package/esm/src/kernel/engine/runner/stages.js +1 -8
- package/esm/src/kernel/engine/runner/state.d.ts +33 -12
- package/esm/src/kernel/engine/runner/state.js +11 -1
- package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
- package/esm/src/kernel/engine/runner/step-order.js +165 -0
- package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
- package/esm/src/kernel/engine/runner/steps.js +328 -169
- package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
- package/esm/src/kernel/engine/runner/stream.js +197 -46
- package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
- package/esm/src/kernel/engine/runner/usage.js +12 -14
- package/esm/src/kernel/engine/session/mod.d.ts +8 -6
- package/esm/src/kernel/engine/session/mod.js +360 -129
- package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
- package/esm/src/kernel/engine/session/session-trace.js +41 -30
- package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
- package/esm/src/kernel/engine/token-estimate.js +14 -194
- package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
- package/esm/src/kernel/engine/tool-trace.js +2 -1
- package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
- package/esm/src/kernel/engine/turn-trace.js +28 -36
- package/esm/src/kernel/engine/usage.d.ts +6 -0
- package/esm/src/kernel/engine/usage.js +17 -0
- package/esm/src/kernel/interaction-parts.d.ts +3 -0
- package/esm/src/kernel/interaction-parts.js +18 -0
- package/esm/src/kernel/json.d.ts +10 -0
- package/esm/src/kernel/json.js +3 -0
- package/esm/src/kernel/mod.d.ts +38 -11
- package/esm/src/kernel/mod.js +22 -7
- package/esm/src/kernel/profile-graph.d.ts +11 -6
- package/esm/src/kernel/profile-graph.js +14 -7
- package/esm/src/kernel/profile-presence.d.ts +10 -1
- package/esm/src/kernel/profile-presence.js +90 -75
- package/esm/src/kernel/profile-scope.d.ts +7 -3
- package/esm/src/kernel/profile-scope.js +67 -55
- package/esm/src/kernel/protocols/binding.d.ts +65 -0
- package/esm/src/kernel/protocols/binding.js +125 -0
- package/esm/src/kernel/protocols/limits.d.ts +15 -0
- package/esm/src/kernel/protocols/limits.js +28 -0
- package/esm/src/kernel/protocols/mod.d.ts +5 -0
- package/esm/src/kernel/protocols/mod.js +5 -0
- package/esm/src/kernel/protocols/prices.d.ts +36 -0
- package/esm/src/kernel/protocols/prices.js +37 -0
- package/esm/src/kernel/protocols/protocol.d.ts +253 -0
- package/esm/src/kernel/protocols/protocol.js +253 -0
- package/esm/src/kernel/protocols/provider.d.ts +108 -0
- package/esm/src/kernel/protocols/provider.js +143 -0
- package/esm/src/kernel/protocols/runtime.d.ts +55 -0
- package/esm/src/kernel/protocols/runtime.js +534 -0
- package/esm/src/kernel/provider-budget.d.ts +32 -0
- package/esm/src/kernel/provider-budget.js +262 -0
- package/esm/src/kernel/provider-dispatch.d.ts +13 -0
- package/esm/src/kernel/provider-dispatch.js +36 -0
- package/esm/src/kernel/provider-live.d.ts +7 -0
- package/esm/src/kernel/provider-live.js +189 -0
- package/esm/src/kernel/provider-runtime.d.ts +57 -0
- package/esm/src/kernel/provider-runtime.js +524 -0
- package/esm/src/kernel/registry/attachments.d.ts +15 -4
- package/esm/src/kernel/registry/attachments.js +31 -22
- package/esm/src/kernel/registry/catalog.d.ts +6 -0
- package/esm/src/kernel/registry/catalog.js +9 -2
- package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
- package/esm/src/kernel/registry/embedding-rules.js +66 -0
- package/esm/src/kernel/registry/ingress.d.ts +6 -2
- package/esm/src/kernel/registry/ingress.js +55 -10
- package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
- package/esm/src/kernel/registry/kernel-registry.js +9 -2
- package/esm/src/kernel/registry/profile-outputs.js +4 -1
- package/esm/src/kernel/registry/profiles.d.ts +38 -14
- package/esm/src/kernel/registry/profiles.js +280 -205
- package/esm/src/kernel/registry/provider-request.d.ts +3 -3
- package/esm/src/kernel/registry/provider-request.js +5 -13
- package/esm/src/kernel/registry/resolve.d.ts +4 -1
- package/esm/src/kernel/registry/resolve.js +59 -58
- package/esm/src/kernel/registry/schemas.d.ts +3 -0
- package/esm/src/kernel/registry/schemas.js +3 -1
- package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
- package/esm/src/kernel/registry/slot-fill.js +22 -0
- package/esm/src/kernel/registry/system-prompt.js +7 -8
- package/esm/src/kernel/registry/vault.d.ts +14 -13
- package/esm/src/kernel/registry/vault.js +1 -14
- package/esm/src/kernel/schema.d.ts +100 -46
- package/esm/src/kernel/schema.js +499 -257
- package/esm/src/kernel/scope.d.ts +12 -5
- package/esm/src/kernel/scope.js +23 -3
- package/esm/src/kernel/stages.d.ts +38 -3
- package/esm/src/kernel/stages.js +82 -39
- package/esm/src/kernel/stop.d.ts +29 -6
- package/esm/src/kernel/stop.js +16 -4
- package/esm/src/kernel/system-parts.js +6 -6
- package/esm/src/kernel/tools/activity-label.d.ts +12 -6
- package/esm/src/kernel/tools/activity-label.js +258 -32
- package/esm/src/kernel/tools/agent.d.ts +66 -0
- package/esm/src/kernel/tools/agent.js +212 -0
- package/esm/src/kernel/tools/coordinate.d.ts +4 -0
- package/esm/src/kernel/tools/coordinate.js +165 -0
- package/esm/src/kernel/tools/events.d.ts +21 -6
- package/esm/src/kernel/tools/events.js +53 -18
- package/esm/src/kernel/tools/execute.d.ts +47 -11
- package/esm/src/kernel/tools/execute.js +508 -136
- package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
- package/esm/src/kernel/tools/gate-answer.js +17 -6
- package/esm/src/kernel/tools/handler-events.d.ts +45 -0
- package/esm/src/kernel/tools/handler-events.js +106 -0
- package/esm/src/kernel/tools/harness.d.ts +1 -0
- package/esm/src/kernel/tools/harness.js +2 -1
- package/esm/src/kernel/tools/http-limit.d.ts +27 -0
- package/esm/src/kernel/tools/http-limit.js +85 -0
- package/esm/src/kernel/tools/invoke.d.ts +27 -5
- package/esm/src/kernel/tools/invoke.js +223 -70
- package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
- package/esm/src/kernel/tools/mcp-sessions.js +13 -8
- package/esm/src/kernel/tools/mod.d.ts +4 -3
- package/esm/src/kernel/tools/mod.js +3 -2
- package/esm/src/kernel/tools/model-text.d.ts +10 -5
- package/esm/src/kernel/tools/model-text.js +18 -12
- package/esm/src/kernel/tools/operation.d.ts +76 -0
- package/esm/src/kernel/tools/operation.js +100 -0
- package/esm/src/kernel/tools/page-answer.d.ts +8 -0
- package/esm/src/kernel/tools/page-answer.js +19 -0
- package/esm/src/kernel/tools/permission.d.ts +11 -2
- package/esm/src/kernel/tools/permission.js +12 -12
- package/esm/src/kernel/tools/project.d.ts +4 -1
- package/esm/src/kernel/tools/project.js +32 -2
- package/esm/src/kernel/tools/registry.d.ts +9 -2
- package/esm/src/kernel/tools/registry.js +69 -10
- package/esm/src/kernel/tools/remote.d.ts +40 -6
- package/esm/src/kernel/tools/remote.js +219 -92
- package/esm/src/kernel/tools/resolve.d.ts +3 -0
- package/esm/src/kernel/tools/resolve.js +12 -4
- package/esm/src/kernel/tools/run.d.ts +28 -0
- package/esm/src/kernel/tools/run.js +86 -0
- package/esm/src/kernel/tools/schema.d.ts +3 -3
- package/esm/src/kernel/tools/schema.js +21 -100
- package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
- package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
- package/esm/src/kernel/tools/stage-run.d.ts +27 -4
- package/esm/src/kernel/tools/stage-run.js +75 -17
- package/esm/src/kernel/tools/types.d.ts +235 -25
- package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
- package/esm/src/kernel/tools/unchecked-output.js +18 -0
- package/esm/src/kernel/turn-events.d.ts +208 -31
- package/esm/src/kernel/turn-events.js +127 -9
- package/esm/src/kernel/types.d.ts +302 -161
- package/esm/src/kernel/util/base64.d.ts +2 -0
- package/esm/src/kernel/util/base64.js +2 -0
- package/esm/src/kernel/util/partial-json.d.ts +23 -0
- package/esm/src/kernel/util/partial-json.js +128 -0
- package/esm/src/kernel/util/record.d.ts +1 -0
- package/esm/src/kernel/util/record.js +1 -0
- package/esm/src/observability/destinations.d.ts +5 -0
- package/esm/src/observability/destinations.js +7 -2
- package/esm/src/observability/jsonl.d.ts +2 -2
- package/esm/src/observability/jsonl.js +15 -22
- package/esm/src/observability/mod.d.ts +3 -3
- package/esm/src/observability/mod.js +2 -2
- package/esm/src/observability/openinference.d.ts +1 -1
- package/esm/src/observability/openinference.js +3 -3
- package/esm/src/observability/otlp.d.ts +3 -0
- package/esm/src/observability/otlp.js +3 -3
- package/esm/src/observability/phoenix.d.ts +1 -0
- package/esm/src/observability/policy.d.ts +3 -0
- package/esm/src/observability/policy.js +5 -1
- package/esm/src/observability/resolve-policy.js +11 -5
- package/esm/src/observability/spans.d.ts +8 -2
- package/esm/src/observability/spans.js +21 -5
- package/esm/src/observability/trace-catalog.d.ts +19 -2
- package/esm/src/observability/trace-catalog.js +128 -87
- package/esm/src/observability/trace-record.js +22 -17
- package/esm/src/observability/trace-schema.d.ts +3 -0
- package/esm/src/observability/trace-schema.js +1 -1
- package/esm/src/observability/trace-sink.d.ts +1 -0
- package/esm/src/observability/trace-sink.js +1 -1
- package/esm/src/observability/trace-span.d.ts +7 -1
- package/esm/src/observability/trace-span.js +3 -1
- package/esm/src/observability/trace.d.ts +2 -0
- package/esm/src/observability/trace.js +4 -2
- package/esm/src/observability/types.d.ts +35 -11
- package/esm/src/observability/types.js +1 -1
- package/esm/src/presets/google/speech-voices.d.ts +1 -0
- package/esm/src/presets/google-limits.d.ts +1 -0
- package/esm/src/presets/google.d.ts +27 -12
- package/esm/src/presets/google.js +34 -25
- package/esm/src/presets/local.d.ts +26 -0
- package/esm/src/presets/local.js +30 -0
- package/esm/src/presets/mod.d.ts +5 -4
- package/esm/src/presets/mod.js +4 -4
- package/esm/src/presets/openrouter.d.ts +14 -1
- package/esm/src/presets/openrouter.js +19 -1
- package/esm/src/providers/embedding-limits.d.ts +7 -0
- package/esm/src/providers/embedding-limits.js +12 -0
- package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/embedding-protocol.js +125 -0
- package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/interactions-protocol.js +105 -0
- package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
- package/esm/src/providers/gemini/live-protocol.js +191 -0
- package/esm/src/providers/gemini/prices.d.ts +3 -0
- package/esm/src/providers/gemini/prices.js +63 -0
- package/esm/src/providers/gemini/provider.d.ts +7 -0
- package/esm/src/providers/gemini/provider.js +39 -0
- package/esm/src/providers/google/builtins.d.ts +14 -0
- package/esm/src/providers/google/builtins.js +57 -0
- package/esm/src/providers/google/grounding.d.ts +4 -4
- package/esm/src/providers/google/interactions/framing.d.ts +20 -8
- package/esm/src/providers/google/interactions/framing.js +85 -44
- package/esm/src/providers/google/interactions/steps.d.ts +5 -5
- package/esm/src/providers/google/interactions/steps.js +4 -4
- package/esm/src/providers/google/interactions/stream.d.ts +10 -11
- package/esm/src/providers/google/interactions/stream.js +33 -100
- package/esm/src/providers/google/live/framing.d.ts +15 -5
- package/esm/src/providers/google/live/framing.js +25 -25
- package/esm/src/providers/google/live/stream.d.ts +6 -44
- package/esm/src/providers/google/live/stream.js +3 -209
- package/esm/src/providers/google/urls.d.ts +1 -3
- package/esm/src/providers/google/urls.js +1 -3
- package/esm/src/providers/google/usage.js +2 -2
- package/esm/src/providers/live.d.ts +6 -0
- package/esm/src/providers/live.js +6 -0
- package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
- package/esm/src/providers/local/embedding-protocol.js +60 -0
- package/esm/src/providers/local/provider.d.ts +7 -0
- package/esm/src/providers/local/provider.js +28 -0
- package/esm/src/providers/mod.d.ts +28 -7
- package/esm/src/providers/mod.js +19 -3
- package/esm/src/providers/open-ai/protocol.d.ts +3 -0
- package/esm/src/providers/open-ai/protocol.js +189 -0
- package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
- package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
- package/esm/src/providers/openrouter/image.d.ts +0 -9
- package/esm/src/providers/openrouter/image.js +0 -153
- package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
- package/esm/src/providers/openrouter/images-protocol.js +82 -0
- package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/compat.js +6 -6
- package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
- package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
- package/esm/src/providers/openrouter/protocol.d.ts +8 -0
- package/esm/src/providers/openrouter/protocol.js +171 -0
- package/esm/src/providers/openrouter/provider.d.ts +10 -0
- package/esm/src/providers/openrouter/provider.js +50 -0
- package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
- package/esm/src/providers/shared/carried-tool-files.js +43 -0
- package/esm/src/providers/shared/pcm.js +2 -2
- package/esm/src/providers/shared/protocol-events.d.ts +8 -0
- package/esm/src/providers/shared/protocol-events.js +20 -0
- package/esm/src/providers/shared/response-identity.d.ts +2 -2
- package/esm/src/providers/shared/retry.d.ts +17 -0
- package/esm/src/providers/shared/retry.js +90 -0
- package/esm/src/providers/shared/sse.d.ts +0 -4
- package/esm/src/providers/shared/sse.js +50 -36
- package/esm/src/providers/shared/tool-args.d.ts +6 -7
- package/esm/src/providers/shared/tool-args.js +10 -6
- package/esm/src/providers/shared/tool-draft.d.ts +16 -0
- package/esm/src/providers/shared/tool-draft.js +14 -0
- package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
- package/esm/src/providers/shared/upstream-tape.js +1 -1
- package/esm/src/providers/system-one/protocol.d.ts +8 -0
- package/esm/src/providers/system-one/protocol.js +93 -0
- package/esm/src/providers/types.d.ts +48 -16
- package/esm/src/providers/types.js +2 -1
- package/esm/src/providers/typesafe/provider.d.ts +7 -0
- package/esm/src/providers/typesafe/provider.js +24 -0
- package/esm/src/surface/formats.d.ts +19 -1
- package/esm/src/surface/formats.js +68 -29
- package/esm/src/surface/mod.d.ts +4 -2
- package/esm/src/surface/mod.js +4 -2
- package/esm/src/surface/runtime.d.ts +4 -0
- package/esm/src/surface/runtime.js +2 -0
- package/esm/src/surface/tools.d.ts +2 -8
- package/esm/src/surface/tools.js +4 -22
- package/esm/src/surface/types.d.ts +6 -0
- package/package.json +5 -13
- package/esm/src/cli/commands/egress-compile.d.ts +0 -17
- package/esm/src/cli/commands/egress-compile.js +0 -25
- package/esm/src/guardrails/egress-policy.d.ts +0 -27
- package/esm/src/guardrails/egress-policy.js +0 -76
- package/esm/src/guardrails/egress-rules.d.ts +0 -54
- package/esm/src/guardrails/egress-rules.js +0 -49
- package/esm/src/guardrails/lexicon.d.ts +0 -30
- package/esm/src/guardrails/lexicon.js +0 -478
- package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
- package/esm/src/kernel/engine/media-probe/audio.js +0 -342
- package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
- package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
- package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/image.js +0 -171
- package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
- package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
- package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
- package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
- package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
- package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
- package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
- package/esm/src/kernel/engine/media-probe/opus.js +0 -23
- package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
- package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
- package/esm/src/kernel/engine/media-probe/video.js +0 -49
- package/esm/src/presets/typesafe.d.ts +0 -2
- package/esm/src/presets/typesafe.js +0 -2
- package/esm/src/providers/create-provider.d.ts +0 -21
- package/esm/src/providers/create-provider.js +0 -90
- package/esm/src/providers/decision/usage.d.ts +0 -3
- package/esm/src/providers/decision/usage.js +0 -25
- package/esm/src/providers/google/interactions/mod.d.ts +0 -2
- package/esm/src/providers/google/interactions/mod.js +0 -2
- package/esm/src/providers/google/keys.d.ts +0 -20
- package/esm/src/providers/google/keys.js +0 -87
- package/esm/src/providers/google/live/mod.d.ts +0 -7
- package/esm/src/providers/google/live/mod.js +0 -7
- package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
- package/esm/src/providers/google/live/openapi-schema.js +0 -42
- package/esm/src/providers/google/live/session.d.ts +0 -14
- package/esm/src/providers/google/live/session.js +0 -150
- package/esm/src/providers/local/local.d.ts +0 -12
- package/esm/src/providers/local/local.js +0 -186
- package/esm/src/providers/local/mod.d.ts +0 -8
- package/esm/src/providers/local/mod.js +0 -8
- package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
- package/esm/src/providers/openrouter/cache-control.js +0 -4
- package/esm/src/providers/openrouter/chat.d.ts +0 -64
- package/esm/src/providers/openrouter/chat.js +0 -490
- package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
- package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
- package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
- package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
- package/esm/src/providers/openrouter/speech.d.ts +0 -18
- package/esm/src/providers/openrouter/speech.js +0 -109
- package/esm/src/providers/probe.d.ts +0 -5
- package/esm/src/providers/probe.js +0 -15
- package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
- package/esm/src/providers/shared/builtin-wire.js +0 -9
- package/esm/src/providers/shared/vault.d.ts +0 -13
- package/esm/src/providers/shared/vault.js +0 -41
|
@@ -1,45 +1,44 @@
|
|
|
1
|
+
import { requestGivesCanary } from '../../../guardrails/canary.js';
|
|
2
|
+
import { addRequestDestinations, addResultDestinations } from '../../../guardrails/destinations.js';
|
|
3
|
+
import { TURN_REPLY } from '../../../guardrails/detect-reply.js';
|
|
1
4
|
import { addRequestUrls } from '../../../guardrails/egress-urls.js';
|
|
2
5
|
import { isAbortError, throwIfAborted } from '../../../guardrails/error.js';
|
|
3
6
|
import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
|
|
7
|
+
import { replyIsJudged } from '../../../guardrails/progressive-yield.js';
|
|
4
8
|
import { recordTaint } from '../../../guardrails/tool-result.js';
|
|
9
|
+
import { waitDefault } from '../../../providers/shared/retry.js';
|
|
10
|
+
import { historyToolCalls } from '../../interaction-parts.js';
|
|
5
11
|
import { profileTurnOutputs } from '../../registry/profile-outputs.js';
|
|
6
12
|
import { providerCompleteRequest } from '../../registry/provider-request.js';
|
|
7
13
|
import { injectWouldExceedMaxSteps } from '../../stages.js';
|
|
8
|
-
import { profileAllowsInject, stageAbortStop } from '../../stop.js';
|
|
9
|
-
import { failureEvent, toolCallRequestEvent } from '../../tools/events.js';
|
|
10
|
-
import { executeRegisteredTool } from '../../tools/execute.js';
|
|
14
|
+
import { AUTO_CONTINUE_DELAY_MS, isFailedStopKind, profileAllowsInject, profileTurnResumption, shouldAutoContinue, stageAbortStop, } from '../../stop.js';
|
|
15
|
+
import { failedActivity, failureEvent, toolCallRequestEvent, } from '../../tools/events.js';
|
|
16
|
+
import { executeRegisteredTool, shownToolArguments, } from '../../tools/execute.js';
|
|
11
17
|
import { formatToolFailureForModel, formatToolResult } from '../../tools/model-text.js';
|
|
18
|
+
import { profileToolsParallel } from '../../tools/resolve.js';
|
|
12
19
|
import { findLast } from '../../util/find-last.js';
|
|
13
20
|
import { startToolTrace } from '../tool-trace.js';
|
|
14
21
|
import { startCallTrace } from '../turn-trace.js';
|
|
15
22
|
import { applyStageInjects } from './stages.js';
|
|
16
23
|
import { recordStepEvent } from './state.js';
|
|
17
|
-
import {
|
|
24
|
+
import { inStep, runSideBySide, stepOrder } from './step-order.js';
|
|
25
|
+
import { isWithheldOnBlock, StructuredDrafts, yieldProviderEvents, } from './stream.js';
|
|
18
26
|
import { callTokensEvent, observeCallEvent, startCallUsage } from './usage.js';
|
|
19
27
|
function isStepLimitReached(step, maxSteps) {
|
|
20
|
-
|
|
21
|
-
return false;
|
|
22
|
-
}
|
|
23
|
-
return step >= maxSteps;
|
|
28
|
+
return maxSteps > 0 && step >= maxSteps;
|
|
24
29
|
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
return
|
|
30
|
-
|
|
31
|
-
history: [],
|
|
32
|
-
input: [],
|
|
33
|
-
previousInteractionId,
|
|
34
|
-
continuation: [...messages],
|
|
35
|
-
};
|
|
36
|
-
}
|
|
37
|
-
return { ...generation, history: state.currentHistory };
|
|
30
|
+
/** The step's generation: the turn's history so far, and no tools when the step must answer. */
|
|
31
|
+
function generationForProviderStep(generation, state, answerOnly) {
|
|
32
|
+
const forStep = { ...generation, history: state.currentHistory };
|
|
33
|
+
if (!answerOnly)
|
|
34
|
+
return forStep;
|
|
35
|
+
return { ...forStep, builtins: [], tools: { ...generation.tools, wire: [] } };
|
|
38
36
|
}
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
37
|
+
/** True on the last step `maxSteps` allows, for a profile whose `atStepLimit` is `'answer'`. */
|
|
38
|
+
function isAnswerOnlyStep(profile, generation, step) {
|
|
39
|
+
return (profile.type === 'text' &&
|
|
40
|
+
profile.turnBehaviour?.atStepLimit === 'answer' &&
|
|
41
|
+
isStepLimitReached(step, generation.maxSteps ?? 0));
|
|
43
42
|
}
|
|
44
43
|
/**
|
|
45
44
|
* Hold the model's calls until its stream ends: a raw call, and a provider's
|
|
@@ -51,7 +50,6 @@ function holdModelCall(calls, tool) {
|
|
|
51
50
|
name: tool.name,
|
|
52
51
|
callId: tool.callId,
|
|
53
52
|
arguments: tool.arguments,
|
|
54
|
-
...(tool.thoughtSignature ? { thoughtSignature: tool.thoughtSignature } : {}),
|
|
55
53
|
});
|
|
56
54
|
return true;
|
|
57
55
|
}
|
|
@@ -61,18 +59,20 @@ function holdModelCall(calls, tool) {
|
|
|
61
59
|
call.failure = tool.failure;
|
|
62
60
|
return true;
|
|
63
61
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
? { previous: state.lastCall, continuation: continuation.messages }
|
|
71
|
-
: { history: state.currentHistory, input: generation.input });
|
|
62
|
+
/** The step's request, with what it gives the model noted on `state`, and its call's usage and trace. */
|
|
63
|
+
function startProviderCall(generation, system, state, answerOnly) {
|
|
64
|
+
const usage = startCallUsage(system.text, {
|
|
65
|
+
history: state.currentHistory,
|
|
66
|
+
input: generation.input,
|
|
67
|
+
});
|
|
72
68
|
state.lastCall = usage;
|
|
73
|
-
const genForStep = generationForProviderStep(generation, state);
|
|
69
|
+
const genForStep = generationForProviderStep(generation, state, answerOnly);
|
|
74
70
|
const request = providerCompleteRequest(state.tools, genForStep, system.text);
|
|
75
71
|
addRequestUrls(state.givenUrls, request);
|
|
72
|
+
addRequestDestinations(state.destinations, request, state.givenUrls.own);
|
|
73
|
+
if (generation.canary && !state.canaryGiven) {
|
|
74
|
+
state.canaryGiven = requestGivesCanary(request, generation.canary, state.canaryScanned);
|
|
75
|
+
}
|
|
76
76
|
state.trace.calls += 1;
|
|
77
77
|
const call = startCallTrace((name, options) => state.trace.root.child(name, options), {
|
|
78
78
|
req: request,
|
|
@@ -82,79 +82,202 @@ async function* executeAutonomousStep(args, state, buffer = {
|
|
|
82
82
|
step: state.stepCount,
|
|
83
83
|
attempt: state.trace.attempt,
|
|
84
84
|
});
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
85
|
+
return { usage, genForStep, request, call };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* True when the profile itself lists the stop in `turnBehaviour.resumption.autoContinue`.
|
|
89
|
+
*
|
|
90
|
+
* why: `DEFAULT_AUTO_CONTINUE` advises a host; a turn spends another model call only where the profile says so.
|
|
91
|
+
*/
|
|
92
|
+
function resendsFailedCall(profile, stop) {
|
|
93
|
+
const policy = profileTurnResumption(profile);
|
|
94
|
+
return policy?.autoContinue !== undefined && shouldAutoContinue(stop, policy);
|
|
95
|
+
}
|
|
96
|
+
/** The events that are a model call's reply, as opposed to its thoughts, usage, or failure. */
|
|
97
|
+
const REPLY_EVENTS = new Set([
|
|
98
|
+
'text',
|
|
99
|
+
'media',
|
|
100
|
+
'structured',
|
|
101
|
+
'citation',
|
|
102
|
+
]);
|
|
103
|
+
/** Takes what an event says about the call itself. True when the event goes no further. */
|
|
104
|
+
function tallyCallEvent(event, tally, call) {
|
|
105
|
+
if (event.type === 'error') {
|
|
106
|
+
tally.failures.push(event);
|
|
107
|
+
return true;
|
|
108
|
+
}
|
|
109
|
+
if (event.type === 'tool')
|
|
110
|
+
return holdModelCall(tally.calls, event.tool);
|
|
111
|
+
if (event.type === 'guardrail')
|
|
112
|
+
call.guardrail(event.guardrail);
|
|
113
|
+
if (event.type === 'structured')
|
|
114
|
+
tally.latestStructured = event.structured;
|
|
115
|
+
if (REPLY_EVENTS.has(event.type))
|
|
116
|
+
tally.replied = true;
|
|
117
|
+
return false;
|
|
118
|
+
}
|
|
119
|
+
/** Records an event the call gave. True when the host gets it now. */
|
|
120
|
+
function releasesNow(event, control, state, buffer) {
|
|
121
|
+
recordStepEvent(event, state);
|
|
122
|
+
if (control.withholdVisible && isWithheldOnBlock(event)) {
|
|
123
|
+
// why: Progressive-yield blocked this attempt — keep events for egress/repair only.
|
|
124
|
+
// Record the decision so the attempt gate knows nothing reached the host.
|
|
125
|
+
state.withheldVisible = true;
|
|
126
|
+
return false;
|
|
127
|
+
}
|
|
128
|
+
if (event.type === 'text')
|
|
129
|
+
state.released += event.text;
|
|
130
|
+
// why: Text and media stream via progressive-yield under egress, thoughts
|
|
131
|
+
// stream unguarded; holdLate only buffers non-visible events (e.g.
|
|
132
|
+
// structured) for validation.
|
|
133
|
+
const isUserVisible = event.type === 'thought' || (!buffer.holdVisible && isWithheldOnBlock(event));
|
|
134
|
+
return !buffer.holdLate || isUserVisible;
|
|
135
|
+
}
|
|
136
|
+
// why: Every other kind is the provider's answer to the request itself (it refused a part, a key, a setting); the same call sent again gets the same answer.
|
|
137
|
+
const PASSING_ERROR_KINDS = new Set([
|
|
138
|
+
'unavailable',
|
|
139
|
+
'bad_response',
|
|
140
|
+
'network',
|
|
141
|
+
'timeout',
|
|
142
|
+
'rate_limit',
|
|
143
|
+
]);
|
|
144
|
+
/**
|
|
145
|
+
* The re-send a finished call is due, if any.
|
|
146
|
+
*
|
|
147
|
+
* A failure the same call would meet again is not sent again (`PASSING_ERROR_KINDS`).
|
|
148
|
+
*
|
|
149
|
+
* why: A failed call that gave no reply and no tool call left nothing behind, so sending it again repeats
|
|
150
|
+
* nothing. A reply cut at `length` is not a failure: the same call would be cut at the same place.
|
|
151
|
+
*/
|
|
152
|
+
function resumeOf(mayResume, profile, tally) {
|
|
153
|
+
const { stop } = tally;
|
|
154
|
+
if (!mayResume || tally.replied || tally.calls.length > 0 || !stop)
|
|
155
|
+
return undefined;
|
|
156
|
+
if (!isFailedStopKind(stop.kind) || !resendsFailedCall(profile, stop))
|
|
157
|
+
return undefined;
|
|
158
|
+
const failure = tally.failures[0];
|
|
159
|
+
if (failure?.errorKind && !PASSING_ERROR_KINDS.has(failure.errorKind))
|
|
160
|
+
return undefined;
|
|
161
|
+
return { stop, failure };
|
|
162
|
+
}
|
|
163
|
+
/** Carries what the call's stream guards still hold into the turn's next call. */
|
|
164
|
+
function keepStreamCarry(state, control) {
|
|
165
|
+
state.canaryCarry = control.canaryCarry;
|
|
166
|
+
state.thoughtCarry = control.thoughtCarry;
|
|
167
|
+
if (control.promptLeaks) {
|
|
168
|
+
state.promptLeaks = [...(state.promptLeaks ?? []), ...control.promptLeaks];
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
async function* executeAutonomousStep(args, state, buffer = {
|
|
172
|
+
holdLate: false,
|
|
173
|
+
holdVisible: false,
|
|
174
|
+
}) {
|
|
175
|
+
const { profile, generation, system, provider, signal } = args;
|
|
176
|
+
const { usage, genForStep, request, call } = startProviderCall(generation, system, state, isAnswerOnlyStep(profile, generation, state.stepCount));
|
|
177
|
+
const tally = { calls: [], reasoning: [], failures: [], replied: false };
|
|
90
178
|
const control = {
|
|
91
179
|
withholdVisible: false,
|
|
92
180
|
...(state.canaryCarry ? { canaryCarry: state.canaryCarry } : {}),
|
|
93
181
|
...(state.thoughtCarry ? { thoughtCarry: state.thoughtCarry } : {}),
|
|
94
182
|
};
|
|
183
|
+
const seen = {
|
|
184
|
+
profile: args.profile,
|
|
185
|
+
generation: genForStep,
|
|
186
|
+
privateSystem: system.private,
|
|
187
|
+
givenUrls: state.givenUrls,
|
|
188
|
+
canaryGiven: state.canaryGiven,
|
|
189
|
+
...(state.ownTools ? { ownTools: state.ownTools } : {}),
|
|
190
|
+
};
|
|
191
|
+
const shown = new StructuredDrafts(seen);
|
|
95
192
|
try {
|
|
96
193
|
for await (const event of yieldProviderEvents({
|
|
97
|
-
|
|
98
|
-
generation: genForStep,
|
|
194
|
+
...seen,
|
|
99
195
|
request,
|
|
100
|
-
privateSystem: system.private,
|
|
101
196
|
provider,
|
|
102
197
|
call,
|
|
103
198
|
signal,
|
|
104
199
|
control,
|
|
105
|
-
|
|
200
|
+
tools: state.tools,
|
|
106
201
|
})) {
|
|
107
|
-
|
|
108
|
-
|
|
202
|
+
if (observeCallEvent(usage, event))
|
|
203
|
+
continue;
|
|
204
|
+
if (event.type === 'reasoning') {
|
|
205
|
+
const { type: _type, ...part } = event;
|
|
206
|
+
tally.reasoning.push(part);
|
|
109
207
|
continue;
|
|
110
|
-
}
|
|
111
|
-
if (event.type === 'guardrail') {
|
|
112
|
-
call.guardrail(event.guardrail);
|
|
113
|
-
}
|
|
114
|
-
if (event.type === 'structured') {
|
|
115
|
-
latestStructured = event.structured;
|
|
116
208
|
}
|
|
117
209
|
if (event.type === 'done') {
|
|
118
|
-
|
|
210
|
+
state.providerState = event.providerState;
|
|
211
|
+
tally.stop = event.stop;
|
|
119
212
|
state.lastStop = event.stop;
|
|
120
213
|
continue;
|
|
121
214
|
}
|
|
122
|
-
if (event.type === '
|
|
215
|
+
if (event.type === 'tool_draft') {
|
|
216
|
+
// why: A preview of the call that follows, which owns the arguments: not the turn's record. It streams
|
|
217
|
+
// as the reply's text does, through its own gate, and like that text is held only when delivery is buffered.
|
|
218
|
+
if (!buffer.holdVisible)
|
|
219
|
+
yield event;
|
|
123
220
|
continue;
|
|
124
221
|
}
|
|
125
|
-
|
|
126
|
-
if (control.withholdVisible && isWithheldOnBlock(event)) {
|
|
127
|
-
// Progressive-yield blocked this attempt — keep events for egress/repair only.
|
|
128
|
-
// Record the decision so the attempt gate knows nothing reached the host.
|
|
129
|
-
state.withheldVisible = true;
|
|
222
|
+
if (tallyCallEvent(event, tally, call))
|
|
130
223
|
continue;
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
// structured) for validation.
|
|
135
|
-
const isUserVisible = event.type === 'thought' || event.type === 'text' || event.type === 'media';
|
|
136
|
-
const streamNow = !buffer.holdLate || isUserVisible;
|
|
137
|
-
if (streamNow) {
|
|
138
|
-
yield event;
|
|
139
|
-
}
|
|
224
|
+
if (!releasesNow(event, control, state, buffer))
|
|
225
|
+
continue;
|
|
226
|
+
yield* shown.show(event);
|
|
140
227
|
}
|
|
141
228
|
}
|
|
142
229
|
catch (err) {
|
|
143
|
-
call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop, thrown: err });
|
|
230
|
+
call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop: tally.stop, thrown: err });
|
|
144
231
|
throw err;
|
|
145
232
|
}
|
|
146
|
-
|
|
147
|
-
state
|
|
148
|
-
|
|
149
|
-
|
|
233
|
+
yield* shown.end();
|
|
234
|
+
keepStreamCarry(state, control);
|
|
235
|
+
const resume = resumeOf(args.mayResume, profile, tally);
|
|
236
|
+
if (!resume) {
|
|
237
|
+
for (const failure of tally.failures) {
|
|
238
|
+
recordStepEvent(failure, state);
|
|
239
|
+
if (!buffer.holdLate)
|
|
240
|
+
yield failure;
|
|
241
|
+
}
|
|
150
242
|
}
|
|
151
|
-
const tokens = await callTokensEvent(usage, generation
|
|
152
|
-
call.end({ tokens: tokens?.tokens, stop });
|
|
243
|
+
const tokens = await callTokensEvent(usage, generation);
|
|
244
|
+
call.end({ tokens: tokens?.tokens, stop: tally.stop });
|
|
153
245
|
if (tokens) {
|
|
154
246
|
recordStepEvent(tokens, state);
|
|
155
247
|
yield tokens;
|
|
156
248
|
}
|
|
157
|
-
return {
|
|
249
|
+
return {
|
|
250
|
+
calls: tally.calls,
|
|
251
|
+
reasoning: tally.reasoning,
|
|
252
|
+
latestStructured: tally.latestStructured,
|
|
253
|
+
...(resume ? { resume } : {}),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
/**
|
|
257
|
+
* One step of a text turn. A model call that fails (`provider_error`,
|
|
258
|
+
* `stream_incomplete`) on a kind the profile's own `turnBehaviour.resumption.autoContinue`
|
|
259
|
+
* lists, having given no reply and no tool call, is sent again in the same turn
|
|
260
|
+
* after a pause, up to `maxContinues` times a turn (once when the profile sets
|
|
261
|
+
* none). The turn's history, its step count, and what it has read stay as they were.
|
|
262
|
+
*/
|
|
263
|
+
async function* executeResumedStep(args, state, buffer) {
|
|
264
|
+
const limit = profileTurnResumption(args.profile)?.maxContinues ?? 1;
|
|
265
|
+
for (;;) {
|
|
266
|
+
const mayResume = args.profile.type === 'text' && state.resumes < limit;
|
|
267
|
+
const outcome = yield* executeAutonomousStep({ ...args, mayResume }, state, buffer);
|
|
268
|
+
if (!outcome.resume)
|
|
269
|
+
return outcome;
|
|
270
|
+
state.resumes += 1;
|
|
271
|
+
const detail = outcome.resume.failure?.errorInternal ?? outcome.resume.failure?.error;
|
|
272
|
+
state.trace.root.event('theorem.step.resume', {
|
|
273
|
+
step: state.stepCount,
|
|
274
|
+
resume: state.resumes,
|
|
275
|
+
stop: outcome.resume.stop.kind,
|
|
276
|
+
...(detail ? { error: detail } : {}),
|
|
277
|
+
});
|
|
278
|
+
state.lastStop = undefined;
|
|
279
|
+
await waitDefault(AUTO_CONTINUE_DELAY_MS, args.signal);
|
|
280
|
+
}
|
|
158
281
|
}
|
|
159
282
|
function toolResultMessage(call, result) {
|
|
160
283
|
return {
|
|
@@ -170,41 +293,9 @@ function toolResultMessage(call, result) {
|
|
|
170
293
|
* Providers read a step's calls together, then their results: Google rejects
|
|
171
294
|
* a call replayed after an earlier call's result (probe 25/09/2026).
|
|
172
295
|
*/
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
tool_calls: calls.map((call) => ({
|
|
177
|
-
id: call.callId,
|
|
178
|
-
type: 'function',
|
|
179
|
-
function: { name: call.name, arguments: JSON.stringify(call.arguments) },
|
|
180
|
-
...(call.thoughtSignature ? { thoughtSignature: call.thoughtSignature } : {}),
|
|
181
|
-
})),
|
|
182
|
-
};
|
|
183
|
-
}
|
|
184
|
-
/**
|
|
185
|
-
* The stored interaction a step's results chain on, or `undefined` when they go
|
|
186
|
-
* in history: the turn does not chain, or no interaction id arrived to chain on.
|
|
187
|
-
*/
|
|
188
|
-
function chainedInteractionId(generation, state) {
|
|
189
|
-
return generation.chains
|
|
190
|
-
? (state.lastInteractionId ?? generation.previousInteractionId)
|
|
191
|
-
: undefined;
|
|
192
|
-
}
|
|
193
|
-
function queueInteractionsToolContinuation(state, message, previousInteractionId) {
|
|
194
|
-
if (state.interactionsContinuation?.previousInteractionId === previousInteractionId) {
|
|
195
|
-
state.interactionsContinuation.messages.push(message);
|
|
196
|
-
return;
|
|
197
|
-
}
|
|
198
|
-
state.interactionsContinuation = { previousInteractionId, messages: [message] };
|
|
199
|
-
}
|
|
200
|
-
/** A call's result: chained on the stored interaction, else after the step's calls in history. */
|
|
201
|
-
function recordToolModelResult(state, call, modelResult, chainOn) {
|
|
202
|
-
const message = toolResultMessage(call, modelResult);
|
|
203
|
-
if (chainOn) {
|
|
204
|
-
queueInteractionsToolContinuation(state, message, chainOn);
|
|
205
|
-
return;
|
|
206
|
-
}
|
|
207
|
-
state.currentHistory.push(message);
|
|
296
|
+
/** Record the approved read-back in portable history. */
|
|
297
|
+
function recordToolModelResult(state, call, modelResult) {
|
|
298
|
+
state.currentHistory.push(toolResultMessage(call, modelResult));
|
|
208
299
|
}
|
|
209
300
|
async function* forwardToolEvents(exec, state) {
|
|
210
301
|
let next = await exec.next();
|
|
@@ -222,7 +313,7 @@ function toolSpanOpener(state) {
|
|
|
222
313
|
* Settle a call the provider handed over already failed (malformed arguments,
|
|
223
314
|
* no function name): nothing runs, and the model reads the failure back.
|
|
224
315
|
*/
|
|
225
|
-
function recordProviderToolFailure(state, call, failure
|
|
316
|
+
function recordProviderToolFailure(state, call, failure) {
|
|
226
317
|
const event = failureEvent(call, failure);
|
|
227
318
|
state.allEmittedEvents.push(event);
|
|
228
319
|
const modelResult = formatToolFailureForModel(failure);
|
|
@@ -236,10 +327,10 @@ function recordProviderToolFailure(state, call, failure, chainOn) {
|
|
|
236
327
|
result: { text: formatToolResult(modelResult) },
|
|
237
328
|
failure,
|
|
238
329
|
});
|
|
239
|
-
recordToolModelResult(state, call, modelResult
|
|
330
|
+
recordToolModelResult(state, call, modelResult);
|
|
240
331
|
return event;
|
|
241
332
|
}
|
|
242
|
-
function* applyToolSettlement(settlement, state, call
|
|
333
|
+
function* applyToolSettlement(settlement, state, call) {
|
|
243
334
|
if (settlement.aborted) {
|
|
244
335
|
state.lastStop = stageAbortStop(settlement.aborted);
|
|
245
336
|
return 'stop_cancelled';
|
|
@@ -249,10 +340,14 @@ function* applyToolSettlement(settlement, state, call, chainOn) {
|
|
|
249
340
|
}
|
|
250
341
|
if (settlement.modelResult?.provenance) {
|
|
251
342
|
state.taint = recordTaint(state.taint, settlement.modelResult.provenance, settlement.modelResult.suspicious);
|
|
343
|
+
addResultDestinations(state.destinations, settlement.modelResult, settlement.modelResult.provenance);
|
|
252
344
|
}
|
|
253
345
|
if (!settlement.modelResult)
|
|
254
346
|
return 'continue';
|
|
255
|
-
|
|
347
|
+
if (!settlement.failure && 'outputRaw' in settlement) {
|
|
348
|
+
state.toolResults.push({ tool: call.name, output: settlement.outputRaw });
|
|
349
|
+
}
|
|
350
|
+
recordToolModelResult(state, call, settlement.modelResult);
|
|
256
351
|
if (settlement.pendingInject) {
|
|
257
352
|
yield* applyStageInjects(state, 'post_tool', settlement.pendingInject, {
|
|
258
353
|
callId: call.callId,
|
|
@@ -262,68 +357,125 @@ function* applyToolSettlement(settlement, state, call, chainOn) {
|
|
|
262
357
|
return 'continue';
|
|
263
358
|
}
|
|
264
359
|
/**
|
|
265
|
-
* Run the model's calls
|
|
266
|
-
*
|
|
267
|
-
*
|
|
360
|
+
* Run the model's calls. Each reaches the host as its raw call first, all of them before
|
|
361
|
+
* any runs; their phases then arrive as each tool gives them. With `tools.parallel` they
|
|
362
|
+
* run side by side; otherwise one at a time, in the order the model made them. A call
|
|
363
|
+
* whose `pre_tool` answers `waitFor` starts its body once those calls settle
|
|
364
|
+
* (`step-order.ts`). A call the provider handed over already failed does not run. A call
|
|
365
|
+
* reads the turn's taint, destinations, and visible tools as they stood when the step
|
|
366
|
+
* began: the model chose every call in the step before any of their results came back.
|
|
367
|
+
*
|
|
368
|
+
* Results are recorded in the order the model made the calls, each followed by its
|
|
369
|
+
* `post_tool` inject. A call that gates waits for its own approval while the others run.
|
|
370
|
+
* After the step, any gate stops the turn. A call a stage cancelled stops the turn too,
|
|
371
|
+
* once every result that did come back is recorded.
|
|
268
372
|
*/
|
|
269
|
-
async function* handleModelCalls(calls, generation, profile, state, { onStage, signal, credentials, resolveHost } = {}) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
state.currentHistory.push(stepCallsMessage(calls));
|
|
373
|
+
async function* handleModelCalls({ calls: upstreamCalls, reasoning }, generation, profile, state, system, { onStage, signal, credentials, resolveHost } = {}) {
|
|
374
|
+
if (upstreamCalls.length > 0) {
|
|
375
|
+
state.currentHistory.push(historyToolCalls(upstreamCalls.map((call, index) => (index === 0 ? { ...call, reasoning } : call))));
|
|
273
376
|
}
|
|
274
|
-
// One id for every call this model response made.
|
|
275
377
|
const stepId = crypto.randomUUID();
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
|
|
378
|
+
const leakScope = {
|
|
379
|
+
canary: generation.canary,
|
|
380
|
+
canaryGiven: state.canaryGiven,
|
|
381
|
+
privateSystem: system.private,
|
|
382
|
+
};
|
|
383
|
+
const calls = upstreamCalls.map((call) => ({
|
|
384
|
+
...call,
|
|
385
|
+
operationId: crypto.randomUUID(),
|
|
386
|
+
// why: The host and every `pre_tool` see the call as its tool gets it; a failed call never reaches a tool.
|
|
387
|
+
shown: call.failure
|
|
388
|
+
? call.arguments
|
|
389
|
+
: shownToolArguments({
|
|
390
|
+
tools: state.tools,
|
|
391
|
+
profile,
|
|
392
|
+
name: call.name,
|
|
393
|
+
input: call.arguments,
|
|
394
|
+
scope: leakScope,
|
|
395
|
+
}),
|
|
396
|
+
}));
|
|
397
|
+
for (const [index, call] of calls.entries()) {
|
|
398
|
+
const request = toolCallRequestEvent(call, call.shown, {
|
|
399
|
+
...(index === 0 && reasoning.length ? { reasoning } : {}),
|
|
279
400
|
stepId,
|
|
401
|
+
stepCallCount: calls.length,
|
|
280
402
|
});
|
|
281
403
|
state.allEmittedEvents.push(request);
|
|
282
|
-
|
|
404
|
+
yield request;
|
|
405
|
+
}
|
|
406
|
+
const order = stepOrder(calls.map((call) => call.callId), profileToolsParallel(profile) === true, signal);
|
|
407
|
+
const stages = {
|
|
408
|
+
handlers: onStage ? [onStage] : [],
|
|
409
|
+
profile,
|
|
410
|
+
step: state.stepCount,
|
|
411
|
+
history: () => state.currentHistory,
|
|
412
|
+
injectAllowed: profileAllowsInject(profile),
|
|
413
|
+
injectWouldExceedMaxSteps: injectWouldExceedMaxSteps(state.stepCount, generation.maxSteps),
|
|
414
|
+
host: generation.host,
|
|
415
|
+
signal,
|
|
416
|
+
stepCalls: calls.map((call) => ({ callId: call.callId, tool: call.name, input: call.shown })),
|
|
417
|
+
wait: order.wait,
|
|
418
|
+
drafts: generation.stream !== false,
|
|
283
419
|
};
|
|
284
|
-
|
|
420
|
+
const turn = {
|
|
421
|
+
step: state.stepCount,
|
|
422
|
+
taint: state.taint,
|
|
423
|
+
destinations: state.destinations,
|
|
424
|
+
visible: [...generation.tools.visible],
|
|
425
|
+
};
|
|
426
|
+
const execute = (call) => forwardToolEvents(executeRegisteredTool({
|
|
427
|
+
tools: state.tools,
|
|
428
|
+
execution: generation.execution,
|
|
429
|
+
invocation: {
|
|
430
|
+
model: generation.model,
|
|
431
|
+
input: generation.input,
|
|
432
|
+
history: generation.history,
|
|
433
|
+
},
|
|
434
|
+
...(state.agents ? { agents: state.agents } : {}),
|
|
435
|
+
profile,
|
|
436
|
+
name: call.name,
|
|
437
|
+
input: call.arguments,
|
|
438
|
+
callId: call.callId,
|
|
439
|
+
ctx: {
|
|
440
|
+
operationId: call.operationId,
|
|
441
|
+
pageExecution: generation.pageExecution,
|
|
442
|
+
sessionPermissions: generation.sessionPermissions,
|
|
443
|
+
path: generation.tools.path,
|
|
444
|
+
turn,
|
|
445
|
+
credentials,
|
|
446
|
+
resolveHost,
|
|
447
|
+
host: generation.host,
|
|
448
|
+
resume: undefined,
|
|
449
|
+
signal,
|
|
450
|
+
},
|
|
451
|
+
snapshot: generation.tools,
|
|
452
|
+
stages,
|
|
453
|
+
scope: leakScope,
|
|
454
|
+
openSpan: toolSpanOpener(state),
|
|
455
|
+
}), state);
|
|
285
456
|
for (const call of calls) {
|
|
286
|
-
|
|
457
|
+
if (call.failure)
|
|
458
|
+
order.settle(call.callId);
|
|
459
|
+
}
|
|
460
|
+
const settlements = yield* runSideBySide(calls.map((call) => call.failure ? undefined : inStep(order, call.callId, () => execute(call))));
|
|
461
|
+
let gated = false;
|
|
462
|
+
let cancelled = false;
|
|
463
|
+
for (const [index, call] of calls.entries()) {
|
|
287
464
|
if (call.failure) {
|
|
288
|
-
yield recordProviderToolFailure(state, call, call.
|
|
465
|
+
yield recordProviderToolFailure(state, { ...call, activityFailed: failedActivity(call.name, profile.labels) }, call.failure);
|
|
289
466
|
continue;
|
|
290
467
|
}
|
|
291
|
-
const
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
history: () => state.currentHistory,
|
|
296
|
-
injectAllowed: profileAllowsInject(profile),
|
|
297
|
-
injectWouldExceedMaxSteps: injectWouldExceedMaxSteps(state.stepCount, generation.maxSteps),
|
|
298
|
-
host: generation.host,
|
|
299
|
-
signal,
|
|
300
|
-
};
|
|
301
|
-
const settlement = yield* forwardToolEvents(executeRegisteredTool({
|
|
302
|
-
tools: state.tools,
|
|
303
|
-
profile,
|
|
304
|
-
name: call.name,
|
|
305
|
-
input: call.arguments,
|
|
306
|
-
callId: call.callId,
|
|
307
|
-
ctx: {
|
|
308
|
-
sessionPermissions: generation.sessionPermissions,
|
|
309
|
-
path: generation.tools.path,
|
|
310
|
-
turn: { step: state.stepCount, taint: state.taint },
|
|
311
|
-
credentials,
|
|
312
|
-
resolveHost,
|
|
313
|
-
host: generation.host,
|
|
314
|
-
resume: undefined,
|
|
315
|
-
signal,
|
|
316
|
-
},
|
|
317
|
-
snapshot: generation.tools,
|
|
318
|
-
stages,
|
|
319
|
-
openSpan: toolSpanOpener(state),
|
|
320
|
-
}), state);
|
|
321
|
-
const outcome = yield* applyToolSettlement(settlement, state, call, chainOn);
|
|
468
|
+
const settlement = settlements[index];
|
|
469
|
+
if (!settlement)
|
|
470
|
+
continue;
|
|
471
|
+
const outcome = yield* applyToolSettlement(settlement, state, call);
|
|
322
472
|
if (outcome === 'stop_cancelled')
|
|
323
|
-
|
|
473
|
+
cancelled = true;
|
|
324
474
|
if (outcome === 'gated')
|
|
325
475
|
gated = true;
|
|
326
476
|
}
|
|
477
|
+
if (cancelled)
|
|
478
|
+
return false;
|
|
327
479
|
if (gated) {
|
|
328
480
|
state.lastStop = { kind: 'gate' };
|
|
329
481
|
return false;
|
|
@@ -333,27 +485,34 @@ async function* handleModelCalls(calls, generation, profile, state, { onStage, s
|
|
|
333
485
|
async function* executeAttempt(args) {
|
|
334
486
|
const { profile, generation, system, provider, state } = args;
|
|
335
487
|
let latestStructured;
|
|
336
|
-
// Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
|
|
488
|
+
// why: Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
|
|
337
489
|
// both hold non-visible events (structured) until the attempt gate, so a policy
|
|
338
490
|
// sees the structured payload before any of it reaches the host.
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
491
|
+
const validation = profileTurnOutputs(profile)?.validation;
|
|
492
|
+
const holdLate = validation !== undefined ||
|
|
493
|
+
replyIsJudged(resolveGuardrailPolicy(profile.guardrails), TURN_REPLY);
|
|
494
|
+
// why: Buffered delivery holds each attempt's text and media until it passes; streamed delivery shows them live.
|
|
495
|
+
const holdVisible = validation !== undefined && generation.stream === false;
|
|
496
|
+
// why: Ceiling is cumulative `state.stepCount` across before_end inject re-entries
|
|
342
497
|
// within this attempt. Validation/egress repair resets stepCount at the start
|
|
343
498
|
// of each attempt cycle.
|
|
344
499
|
while (!isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
|
|
345
500
|
throwIfAborted(args.safe.signal);
|
|
346
501
|
state.stepCount++;
|
|
347
|
-
// Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
|
|
502
|
+
// why: Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
|
|
348
503
|
// outside this loop.
|
|
349
|
-
const stepResult = yield*
|
|
504
|
+
const stepResult = yield* executeResumedStep({ profile, generation, system, provider, signal: args.safe.signal }, state, { holdLate, holdVisible });
|
|
350
505
|
if (stepResult.latestStructured !== undefined) {
|
|
351
506
|
latestStructured = stepResult.latestStructured;
|
|
352
507
|
}
|
|
353
|
-
const executed = yield* handleModelCalls(stepResult
|
|
508
|
+
const executed = yield* handleModelCalls(stepResult, generation, profile, state, system, args.safe);
|
|
354
509
|
if (!executed) {
|
|
355
510
|
break;
|
|
356
511
|
}
|
|
512
|
+
// why: The tools ran and no step is left to read them, so the turn has no answer.
|
|
513
|
+
if (isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
|
|
514
|
+
state.lastStop = { kind: 'step_limit' };
|
|
515
|
+
}
|
|
357
516
|
}
|
|
358
517
|
return { latestStructured };
|
|
359
518
|
}
|