@theoremjs/agents 0.3.0 → 0.3.2
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 +277 -995
- package/esm/mod.d.ts +34 -20
- package/esm/mod.js +19 -12
- 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 +25 -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 +881 -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 +30 -22
- package/esm/src/guardrails/mod.js +19 -14
- 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 +4 -1
- package/esm/src/guardrails/quota.js +7 -2
- 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 +5 -2
- package/esm/src/guardrails/theorem-error.js +6 -3
- 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 +8 -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 +174 -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 +329 -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 +130 -88
- 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 +102 -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/api-error.d.ts +2 -0
- package/esm/src/providers/google/api-error.js +26 -18
- 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 +4 -210
- 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 +18 -0
- package/esm/src/providers/shared/retry.js +89 -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,203 @@ 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
|
+
'busy',
|
|
139
|
+
'unavailable',
|
|
140
|
+
'bad_response',
|
|
141
|
+
'network',
|
|
142
|
+
'timeout',
|
|
143
|
+
'rate_limit',
|
|
144
|
+
]);
|
|
145
|
+
/**
|
|
146
|
+
* The re-send a finished call is due, if any.
|
|
147
|
+
*
|
|
148
|
+
* A failure the same call would meet again is not sent again (`PASSING_ERROR_KINDS`).
|
|
149
|
+
*
|
|
150
|
+
* why: A failed call that gave no reply and no tool call left nothing behind, so sending it again repeats
|
|
151
|
+
* nothing. A reply cut at `length` is not a failure: the same call would be cut at the same place.
|
|
152
|
+
*/
|
|
153
|
+
function resumeOf(mayResume, profile, tally) {
|
|
154
|
+
const { stop } = tally;
|
|
155
|
+
if (!mayResume || tally.replied || tally.calls.length > 0 || !stop)
|
|
156
|
+
return undefined;
|
|
157
|
+
if (!isFailedStopKind(stop.kind) || !resendsFailedCall(profile, stop))
|
|
158
|
+
return undefined;
|
|
159
|
+
const failure = tally.failures[0];
|
|
160
|
+
if (failure?.errorKind && !PASSING_ERROR_KINDS.has(failure.errorKind))
|
|
161
|
+
return undefined;
|
|
162
|
+
return { stop, failure };
|
|
163
|
+
}
|
|
164
|
+
/** Carries what the call's stream guards still hold into the turn's next call. */
|
|
165
|
+
function keepStreamCarry(state, control) {
|
|
166
|
+
state.canaryCarry = control.canaryCarry;
|
|
167
|
+
state.thoughtCarry = control.thoughtCarry;
|
|
168
|
+
if (control.promptLeaks) {
|
|
169
|
+
state.promptLeaks = [...(state.promptLeaks ?? []), ...control.promptLeaks];
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
async function* executeAutonomousStep(args, state, buffer = {
|
|
173
|
+
holdLate: false,
|
|
174
|
+
holdVisible: false,
|
|
175
|
+
}) {
|
|
176
|
+
const { profile, generation, system, provider, signal } = args;
|
|
177
|
+
const { usage, genForStep, request, call } = startProviderCall(generation, system, state, isAnswerOnlyStep(profile, generation, state.stepCount));
|
|
178
|
+
const tally = { calls: [], reasoning: [], failures: [], replied: false };
|
|
90
179
|
const control = {
|
|
91
180
|
withholdVisible: false,
|
|
92
181
|
...(state.canaryCarry ? { canaryCarry: state.canaryCarry } : {}),
|
|
93
182
|
...(state.thoughtCarry ? { thoughtCarry: state.thoughtCarry } : {}),
|
|
94
183
|
};
|
|
184
|
+
const seen = {
|
|
185
|
+
profile: args.profile,
|
|
186
|
+
generation: genForStep,
|
|
187
|
+
privateSystem: system.private,
|
|
188
|
+
givenUrls: state.givenUrls,
|
|
189
|
+
canaryGiven: state.canaryGiven,
|
|
190
|
+
...(state.ownTools ? { ownTools: state.ownTools } : {}),
|
|
191
|
+
};
|
|
192
|
+
const shown = new StructuredDrafts(seen);
|
|
95
193
|
try {
|
|
96
194
|
for await (const event of yieldProviderEvents({
|
|
97
|
-
|
|
98
|
-
generation: genForStep,
|
|
195
|
+
...seen,
|
|
99
196
|
request,
|
|
100
|
-
privateSystem: system.private,
|
|
101
197
|
provider,
|
|
102
198
|
call,
|
|
103
199
|
signal,
|
|
104
200
|
control,
|
|
105
|
-
|
|
201
|
+
tools: state.tools,
|
|
106
202
|
})) {
|
|
107
|
-
|
|
108
|
-
|
|
203
|
+
if (observeCallEvent(usage, event))
|
|
204
|
+
continue;
|
|
205
|
+
if (event.type === 'reasoning') {
|
|
206
|
+
const { type: _type, ...part } = event;
|
|
207
|
+
tally.reasoning.push(part);
|
|
109
208
|
continue;
|
|
110
|
-
}
|
|
111
|
-
if (event.type === 'guardrail') {
|
|
112
|
-
call.guardrail(event.guardrail);
|
|
113
|
-
}
|
|
114
|
-
if (event.type === 'structured') {
|
|
115
|
-
latestStructured = event.structured;
|
|
116
209
|
}
|
|
117
210
|
if (event.type === 'done') {
|
|
118
|
-
|
|
211
|
+
state.providerState = event.providerState;
|
|
212
|
+
tally.stop = event.stop;
|
|
119
213
|
state.lastStop = event.stop;
|
|
120
214
|
continue;
|
|
121
215
|
}
|
|
122
|
-
if (event.type === '
|
|
216
|
+
if (event.type === 'tool_draft') {
|
|
217
|
+
// why: A preview of the call that follows, which owns the arguments: not the turn's record. It streams
|
|
218
|
+
// as the reply's text does, through its own gate, and like that text is held only when delivery is buffered.
|
|
219
|
+
if (!buffer.holdVisible)
|
|
220
|
+
yield event;
|
|
123
221
|
continue;
|
|
124
222
|
}
|
|
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;
|
|
223
|
+
if (tallyCallEvent(event, tally, call))
|
|
130
224
|
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
|
-
}
|
|
225
|
+
if (!releasesNow(event, control, state, buffer))
|
|
226
|
+
continue;
|
|
227
|
+
yield* shown.show(event);
|
|
140
228
|
}
|
|
141
229
|
}
|
|
142
230
|
catch (err) {
|
|
143
|
-
call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop, thrown: err });
|
|
231
|
+
call.end(isAbortError(err) ? { stop: { kind: 'cancelled' } } : { stop: tally.stop, thrown: err });
|
|
144
232
|
throw err;
|
|
145
233
|
}
|
|
146
|
-
|
|
147
|
-
state
|
|
148
|
-
|
|
149
|
-
|
|
234
|
+
yield* shown.end();
|
|
235
|
+
keepStreamCarry(state, control);
|
|
236
|
+
const resume = resumeOf(args.mayResume, profile, tally);
|
|
237
|
+
if (!resume) {
|
|
238
|
+
for (const failure of tally.failures) {
|
|
239
|
+
recordStepEvent(failure, state);
|
|
240
|
+
if (!buffer.holdLate)
|
|
241
|
+
yield failure;
|
|
242
|
+
}
|
|
150
243
|
}
|
|
151
|
-
const tokens = await callTokensEvent(usage, generation
|
|
152
|
-
call.end({ tokens: tokens?.tokens, stop });
|
|
244
|
+
const tokens = await callTokensEvent(usage, generation);
|
|
245
|
+
call.end({ tokens: tokens?.tokens, stop: tally.stop });
|
|
153
246
|
if (tokens) {
|
|
154
247
|
recordStepEvent(tokens, state);
|
|
155
248
|
yield tokens;
|
|
156
249
|
}
|
|
157
|
-
return {
|
|
250
|
+
return {
|
|
251
|
+
calls: tally.calls,
|
|
252
|
+
reasoning: tally.reasoning,
|
|
253
|
+
latestStructured: tally.latestStructured,
|
|
254
|
+
...(resume ? { resume } : {}),
|
|
255
|
+
};
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* One step of a text turn. A model call that fails (`provider_error`,
|
|
259
|
+
* `stream_incomplete`) on a kind the profile's own `turnBehaviour.resumption.autoContinue`
|
|
260
|
+
* lists, having given no reply and no tool call, is sent again in the same turn
|
|
261
|
+
* after a pause, up to `maxContinues` times a turn (once when the profile sets
|
|
262
|
+
* none). The turn's history, its step count, and what it has read stay as they were.
|
|
263
|
+
*/
|
|
264
|
+
async function* executeResumedStep(args, state, buffer) {
|
|
265
|
+
const limit = profileTurnResumption(args.profile)?.maxContinues ?? 1;
|
|
266
|
+
for (;;) {
|
|
267
|
+
const mayResume = args.profile.type === 'text' && state.resumes < limit;
|
|
268
|
+
const outcome = yield* executeAutonomousStep({ ...args, mayResume }, state, buffer);
|
|
269
|
+
if (!outcome.resume)
|
|
270
|
+
return outcome;
|
|
271
|
+
state.resumes += 1;
|
|
272
|
+
const detail = outcome.resume.failure?.errorInternal ?? outcome.resume.failure?.error;
|
|
273
|
+
state.trace.root.event('theorem.step.resume', {
|
|
274
|
+
step: state.stepCount,
|
|
275
|
+
resume: state.resumes,
|
|
276
|
+
stop: outcome.resume.stop.kind,
|
|
277
|
+
...(detail ? { error: detail } : {}),
|
|
278
|
+
});
|
|
279
|
+
state.lastStop = undefined;
|
|
280
|
+
await waitDefault(AUTO_CONTINUE_DELAY_MS, args.signal);
|
|
281
|
+
}
|
|
158
282
|
}
|
|
159
283
|
function toolResultMessage(call, result) {
|
|
160
284
|
return {
|
|
@@ -170,41 +294,9 @@ function toolResultMessage(call, result) {
|
|
|
170
294
|
* Providers read a step's calls together, then their results: Google rejects
|
|
171
295
|
* a call replayed after an earlier call's result (probe 25/09/2026).
|
|
172
296
|
*/
|
|
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);
|
|
297
|
+
/** Record the approved read-back in portable history. */
|
|
298
|
+
function recordToolModelResult(state, call, modelResult) {
|
|
299
|
+
state.currentHistory.push(toolResultMessage(call, modelResult));
|
|
208
300
|
}
|
|
209
301
|
async function* forwardToolEvents(exec, state) {
|
|
210
302
|
let next = await exec.next();
|
|
@@ -222,7 +314,7 @@ function toolSpanOpener(state) {
|
|
|
222
314
|
* Settle a call the provider handed over already failed (malformed arguments,
|
|
223
315
|
* no function name): nothing runs, and the model reads the failure back.
|
|
224
316
|
*/
|
|
225
|
-
function recordProviderToolFailure(state, call, failure
|
|
317
|
+
function recordProviderToolFailure(state, call, failure) {
|
|
226
318
|
const event = failureEvent(call, failure);
|
|
227
319
|
state.allEmittedEvents.push(event);
|
|
228
320
|
const modelResult = formatToolFailureForModel(failure);
|
|
@@ -236,10 +328,10 @@ function recordProviderToolFailure(state, call, failure, chainOn) {
|
|
|
236
328
|
result: { text: formatToolResult(modelResult) },
|
|
237
329
|
failure,
|
|
238
330
|
});
|
|
239
|
-
recordToolModelResult(state, call, modelResult
|
|
331
|
+
recordToolModelResult(state, call, modelResult);
|
|
240
332
|
return event;
|
|
241
333
|
}
|
|
242
|
-
function* applyToolSettlement(settlement, state, call
|
|
334
|
+
function* applyToolSettlement(settlement, state, call) {
|
|
243
335
|
if (settlement.aborted) {
|
|
244
336
|
state.lastStop = stageAbortStop(settlement.aborted);
|
|
245
337
|
return 'stop_cancelled';
|
|
@@ -249,10 +341,14 @@ function* applyToolSettlement(settlement, state, call, chainOn) {
|
|
|
249
341
|
}
|
|
250
342
|
if (settlement.modelResult?.provenance) {
|
|
251
343
|
state.taint = recordTaint(state.taint, settlement.modelResult.provenance, settlement.modelResult.suspicious);
|
|
344
|
+
addResultDestinations(state.destinations, settlement.modelResult, settlement.modelResult.provenance);
|
|
252
345
|
}
|
|
253
346
|
if (!settlement.modelResult)
|
|
254
347
|
return 'continue';
|
|
255
|
-
|
|
348
|
+
if (!settlement.failure && 'outputRaw' in settlement) {
|
|
349
|
+
state.toolResults.push({ tool: call.name, output: settlement.outputRaw });
|
|
350
|
+
}
|
|
351
|
+
recordToolModelResult(state, call, settlement.modelResult);
|
|
256
352
|
if (settlement.pendingInject) {
|
|
257
353
|
yield* applyStageInjects(state, 'post_tool', settlement.pendingInject, {
|
|
258
354
|
callId: call.callId,
|
|
@@ -262,68 +358,125 @@ function* applyToolSettlement(settlement, state, call, chainOn) {
|
|
|
262
358
|
return 'continue';
|
|
263
359
|
}
|
|
264
360
|
/**
|
|
265
|
-
* Run the model's calls
|
|
266
|
-
*
|
|
267
|
-
*
|
|
361
|
+
* Run the model's calls. Each reaches the host as its raw call first, all of them before
|
|
362
|
+
* any runs; their phases then arrive as each tool gives them. With `tools.parallel` they
|
|
363
|
+
* run side by side; otherwise one at a time, in the order the model made them. A call
|
|
364
|
+
* whose `pre_tool` answers `waitFor` starts its body once those calls settle
|
|
365
|
+
* (`step-order.ts`). A call the provider handed over already failed does not run. A call
|
|
366
|
+
* reads the turn's taint, destinations, and visible tools as they stood when the step
|
|
367
|
+
* began: the model chose every call in the step before any of their results came back.
|
|
368
|
+
*
|
|
369
|
+
* Results are recorded in the order the model made the calls, each followed by its
|
|
370
|
+
* `post_tool` inject. A call that gates waits for its own approval while the others run.
|
|
371
|
+
* After the step, any gate stops the turn. A call a stage cancelled stops the turn too,
|
|
372
|
+
* once every result that did come back is recorded.
|
|
268
373
|
*/
|
|
269
|
-
async function* handleModelCalls(calls, generation, profile, state, { onStage, signal, credentials, resolveHost } = {}) {
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
state.currentHistory.push(stepCallsMessage(calls));
|
|
374
|
+
async function* handleModelCalls({ calls: upstreamCalls, reasoning }, generation, profile, state, system, { onStage, signal, credentials, resolveHost } = {}) {
|
|
375
|
+
if (upstreamCalls.length > 0) {
|
|
376
|
+
state.currentHistory.push(historyToolCalls(upstreamCalls.map((call, index) => (index === 0 ? { ...call, reasoning } : call))));
|
|
273
377
|
}
|
|
274
|
-
// One id for every call this model response made.
|
|
275
378
|
const stepId = crypto.randomUUID();
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
|
|
379
|
+
const leakScope = {
|
|
380
|
+
canary: generation.canary,
|
|
381
|
+
canaryGiven: state.canaryGiven,
|
|
382
|
+
privateSystem: system.private,
|
|
383
|
+
};
|
|
384
|
+
const calls = upstreamCalls.map((call) => ({
|
|
385
|
+
...call,
|
|
386
|
+
operationId: crypto.randomUUID(),
|
|
387
|
+
// why: The host and every `pre_tool` see the call as its tool gets it; a failed call never reaches a tool.
|
|
388
|
+
shown: call.failure
|
|
389
|
+
? call.arguments
|
|
390
|
+
: shownToolArguments({
|
|
391
|
+
tools: state.tools,
|
|
392
|
+
profile,
|
|
393
|
+
name: call.name,
|
|
394
|
+
input: call.arguments,
|
|
395
|
+
scope: leakScope,
|
|
396
|
+
}),
|
|
397
|
+
}));
|
|
398
|
+
for (const [index, call] of calls.entries()) {
|
|
399
|
+
const request = toolCallRequestEvent(call, call.shown, {
|
|
400
|
+
...(index === 0 && reasoning.length ? { reasoning } : {}),
|
|
279
401
|
stepId,
|
|
402
|
+
stepCallCount: calls.length,
|
|
280
403
|
});
|
|
281
404
|
state.allEmittedEvents.push(request);
|
|
282
|
-
|
|
405
|
+
yield request;
|
|
406
|
+
}
|
|
407
|
+
const order = stepOrder(calls.map((call) => call.callId), profileToolsParallel(profile) === true, signal);
|
|
408
|
+
const stages = {
|
|
409
|
+
handlers: onStage ? [onStage] : [],
|
|
410
|
+
profile,
|
|
411
|
+
step: state.stepCount,
|
|
412
|
+
history: () => state.currentHistory,
|
|
413
|
+
injectAllowed: profileAllowsInject(profile),
|
|
414
|
+
injectWouldExceedMaxSteps: injectWouldExceedMaxSteps(state.stepCount, generation.maxSteps),
|
|
415
|
+
host: generation.host,
|
|
416
|
+
signal,
|
|
417
|
+
stepCalls: calls.map((call) => ({ callId: call.callId, tool: call.name, input: call.shown })),
|
|
418
|
+
wait: order.wait,
|
|
419
|
+
drafts: generation.stream !== false,
|
|
283
420
|
};
|
|
284
|
-
|
|
421
|
+
const turn = {
|
|
422
|
+
step: state.stepCount,
|
|
423
|
+
taint: state.taint,
|
|
424
|
+
destinations: state.destinations,
|
|
425
|
+
visible: [...generation.tools.visible],
|
|
426
|
+
};
|
|
427
|
+
const execute = (call) => forwardToolEvents(executeRegisteredTool({
|
|
428
|
+
tools: state.tools,
|
|
429
|
+
execution: generation.execution,
|
|
430
|
+
invocation: {
|
|
431
|
+
model: generation.model,
|
|
432
|
+
input: generation.input,
|
|
433
|
+
history: generation.history,
|
|
434
|
+
},
|
|
435
|
+
...(state.agents ? { agents: state.agents } : {}),
|
|
436
|
+
profile,
|
|
437
|
+
name: call.name,
|
|
438
|
+
input: call.arguments,
|
|
439
|
+
callId: call.callId,
|
|
440
|
+
ctx: {
|
|
441
|
+
operationId: call.operationId,
|
|
442
|
+
pageExecution: generation.pageExecution,
|
|
443
|
+
sessionPermissions: generation.sessionPermissions,
|
|
444
|
+
path: generation.tools.path,
|
|
445
|
+
turn,
|
|
446
|
+
credentials,
|
|
447
|
+
resolveHost,
|
|
448
|
+
host: generation.host,
|
|
449
|
+
resume: undefined,
|
|
450
|
+
signal,
|
|
451
|
+
},
|
|
452
|
+
snapshot: generation.tools,
|
|
453
|
+
stages,
|
|
454
|
+
scope: leakScope,
|
|
455
|
+
openSpan: toolSpanOpener(state),
|
|
456
|
+
}), state);
|
|
285
457
|
for (const call of calls) {
|
|
286
|
-
|
|
458
|
+
if (call.failure)
|
|
459
|
+
order.settle(call.callId);
|
|
460
|
+
}
|
|
461
|
+
const settlements = yield* runSideBySide(calls.map((call) => call.failure ? undefined : inStep(order, call.callId, () => execute(call))));
|
|
462
|
+
let gated = false;
|
|
463
|
+
let cancelled = false;
|
|
464
|
+
for (const [index, call] of calls.entries()) {
|
|
287
465
|
if (call.failure) {
|
|
288
|
-
yield recordProviderToolFailure(state, call, call.
|
|
466
|
+
yield recordProviderToolFailure(state, { ...call, activityFailed: failedActivity(call.name, profile.labels) }, call.failure);
|
|
289
467
|
continue;
|
|
290
468
|
}
|
|
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);
|
|
469
|
+
const settlement = settlements[index];
|
|
470
|
+
if (!settlement)
|
|
471
|
+
continue;
|
|
472
|
+
const outcome = yield* applyToolSettlement(settlement, state, call);
|
|
322
473
|
if (outcome === 'stop_cancelled')
|
|
323
|
-
|
|
474
|
+
cancelled = true;
|
|
324
475
|
if (outcome === 'gated')
|
|
325
476
|
gated = true;
|
|
326
477
|
}
|
|
478
|
+
if (cancelled)
|
|
479
|
+
return false;
|
|
327
480
|
if (gated) {
|
|
328
481
|
state.lastStop = { kind: 'gate' };
|
|
329
482
|
return false;
|
|
@@ -333,27 +486,34 @@ async function* handleModelCalls(calls, generation, profile, state, { onStage, s
|
|
|
333
486
|
async function* executeAttempt(args) {
|
|
334
487
|
const { profile, generation, system, provider, state } = args;
|
|
335
488
|
let latestStructured;
|
|
336
|
-
// Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
|
|
489
|
+
// why: Text streams via progressive-yield under egress, thoughts unguarded; validation and egress
|
|
337
490
|
// both hold non-visible events (structured) until the attempt gate, so a policy
|
|
338
491
|
// sees the structured payload before any of it reaches the host.
|
|
339
|
-
const
|
|
340
|
-
|
|
341
|
-
|
|
492
|
+
const validation = profileTurnOutputs(profile)?.validation;
|
|
493
|
+
const holdLate = validation !== undefined ||
|
|
494
|
+
replyIsJudged(resolveGuardrailPolicy(profile.guardrails), TURN_REPLY);
|
|
495
|
+
// why: Buffered delivery holds each attempt's text and media until it passes; streamed delivery shows them live.
|
|
496
|
+
const holdVisible = validation !== undefined && generation.stream === false;
|
|
497
|
+
// why: Ceiling is cumulative `state.stepCount` across before_end inject re-entries
|
|
342
498
|
// within this attempt. Validation/egress repair resets stepCount at the start
|
|
343
499
|
// of each attempt cycle.
|
|
344
500
|
while (!isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
|
|
345
501
|
throwIfAborted(args.safe.signal);
|
|
346
502
|
state.stepCount++;
|
|
347
|
-
// Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
|
|
503
|
+
// why: Mid-loop inject lives on `post_tool` (after tools). Opening inject is `pre_turn`
|
|
348
504
|
// outside this loop.
|
|
349
|
-
const stepResult = yield*
|
|
505
|
+
const stepResult = yield* executeResumedStep({ profile, generation, system, provider, signal: args.safe.signal }, state, { holdLate, holdVisible });
|
|
350
506
|
if (stepResult.latestStructured !== undefined) {
|
|
351
507
|
latestStructured = stepResult.latestStructured;
|
|
352
508
|
}
|
|
353
|
-
const executed = yield* handleModelCalls(stepResult
|
|
509
|
+
const executed = yield* handleModelCalls(stepResult, generation, profile, state, system, args.safe);
|
|
354
510
|
if (!executed) {
|
|
355
511
|
break;
|
|
356
512
|
}
|
|
513
|
+
// why: The tools ran and no step is left to read them, so the turn has no answer.
|
|
514
|
+
if (isStepLimitReached(state.stepCount, generation.maxSteps ?? 0)) {
|
|
515
|
+
state.lastStop = { kind: 'step_limit' };
|
|
516
|
+
}
|
|
357
517
|
}
|
|
358
518
|
return { latestStructured };
|
|
359
519
|
}
|