@theoremjs/agents 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +545 -2
- package/esm/_dnt.polyfills.d.ts +66 -0
- package/esm/_dnt.polyfills.js +51 -0
- package/esm/mod.d.ts +79 -0
- package/esm/mod.js +49 -0
- package/esm/package.json +3 -0
- package/esm/src/cli/bin.d.ts +7 -0
- package/esm/src/cli/bin.js +9 -0
- package/esm/src/cli/commands/bench.d.ts +6 -0
- package/esm/src/cli/commands/bench.js +480 -0
- 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 +37 -0
- package/esm/src/cli/commands/eval.js +190 -0
- package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
- package/esm/src/cli/commands/fuzz-canary.js +241 -0
- package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
- package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
- package/esm/src/cli/commands/profile.d.ts +2 -0
- package/esm/src/cli/commands/profile.js +80 -0
- package/esm/src/cli/commands/run.d.ts +13 -0
- package/esm/src/cli/commands/run.js +45 -0
- package/esm/src/cli/commands/test.d.ts +26 -0
- package/esm/src/cli/commands/test.js +143 -0
- package/esm/src/cli/event-log.d.ts +15 -0
- package/esm/src/cli/event-log.js +136 -0
- package/esm/src/cli/index.d.ts +10 -0
- package/esm/src/cli/index.js +267 -0
- package/esm/src/cli/matrix/fixtures.d.ts +10 -0
- package/esm/src/cli/matrix/fixtures.js +67 -0
- package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
- package/esm/src/cli/matrix/synthesizer.js +103 -0
- package/esm/src/evals/attachments.d.ts +5 -0
- package/esm/src/evals/attachments.js +55 -0
- package/esm/src/evals/breakdown.d.ts +30 -0
- package/esm/src/evals/breakdown.js +69 -0
- package/esm/src/evals/graders/answer.d.ts +16 -0
- package/esm/src/evals/graders/answer.js +134 -0
- package/esm/src/evals/graders/code.d.ts +40 -0
- package/esm/src/evals/graders/code.js +184 -0
- package/esm/src/evals/graders/judge.d.ts +24 -0
- package/esm/src/evals/graders/judge.js +367 -0
- package/esm/src/evals/graders/latency.d.ts +6 -0
- package/esm/src/evals/graders/latency.js +82 -0
- package/esm/src/evals/graders/live.d.ts +14 -0
- package/esm/src/evals/graders/live.js +42 -0
- package/esm/src/evals/graders/media.d.ts +18 -0
- package/esm/src/evals/graders/media.js +91 -0
- package/esm/src/evals/graders/shared.d.ts +11 -0
- package/esm/src/evals/graders/shared.js +62 -0
- package/esm/src/evals/graders/transcript.d.ts +19 -0
- package/esm/src/evals/graders/transcript.js +202 -0
- package/esm/src/evals/mod.d.ts +34 -0
- package/esm/src/evals/mod.js +22 -0
- package/esm/src/evals/record.d.ts +41 -0
- package/esm/src/evals/record.js +107 -0
- package/esm/src/evals/rubrics/catalog.d.ts +148 -0
- package/esm/src/evals/rubrics/catalog.js +846 -0
- package/esm/src/evals/rubrics/mod.d.ts +24 -0
- package/esm/src/evals/rubrics/mod.js +55 -0
- package/esm/src/evals/rubrics/mustache.d.ts +23 -0
- package/esm/src/evals/rubrics/mustache.js +154 -0
- package/esm/src/evals/rubrics/types.d.ts +54 -0
- package/esm/src/evals/rubrics/types.js +74 -0
- package/esm/src/evals/run.d.ts +75 -0
- package/esm/src/evals/run.js +418 -0
- package/esm/src/evals/suite.d.ts +28 -0
- package/esm/src/evals/suite.js +97 -0
- package/esm/src/evals/summary.d.ts +35 -0
- package/esm/src/evals/summary.js +31 -0
- package/esm/src/evals/trial.d.ts +14 -0
- package/esm/src/evals/trial.js +135 -0
- package/esm/src/evals/types.d.ts +169 -0
- package/esm/src/evals/types.js +113 -0
- package/esm/src/evals/verdict.d.ts +23 -0
- package/esm/src/evals/verdict.js +48 -0
- 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 +22 -0
- package/esm/src/guardrails/canary-gate.js +40 -0
- package/esm/src/guardrails/canary.d.ts +146 -0
- package/esm/src/guardrails/canary.js +974 -0
- package/esm/src/guardrails/compile-egress.d.ts +12 -0
- package/esm/src/guardrails/compile-egress.js +12 -0
- package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
- package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
- package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
- package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
- package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
- package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
- package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
- package/esm/src/guardrails/corpus/live-attacks.js +229 -0
- package/esm/src/guardrails/corpus/mod.d.ts +7 -0
- package/esm/src/guardrails/corpus/mod.js +4 -0
- package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
- package/esm/src/guardrails/corpus/secrets.js +16 -0
- package/esm/src/guardrails/corpus/strings.d.ts +23 -0
- package/esm/src/guardrails/corpus/strings.js +29 -0
- package/esm/src/guardrails/corpus/types.d.ts +36 -0
- package/esm/src/guardrails/corpus/types.js +1 -0
- 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 +12 -0
- package/esm/src/guardrails/egress-automata.js +25582 -0
- package/esm/src/guardrails/egress-compiler.d.ts +55 -0
- package/esm/src/guardrails/egress-compiler.js +431 -0
- package/esm/src/guardrails/egress-patterns.d.ts +26 -0
- package/esm/src/guardrails/egress-patterns.js +36 -0
- package/esm/src/guardrails/egress-stream.d.ts +123 -0
- package/esm/src/guardrails/egress-stream.js +774 -0
- package/esm/src/guardrails/egress-urls.d.ts +86 -0
- package/esm/src/guardrails/egress-urls.js +909 -0
- package/esm/src/guardrails/egress.d.ts +46 -0
- package/esm/src/guardrails/egress.js +124 -0
- package/esm/src/guardrails/error.d.ts +31 -0
- package/esm/src/guardrails/error.js +96 -0
- package/esm/src/guardrails/event-schemas.d.ts +100 -0
- package/esm/src/guardrails/event-schemas.js +48 -0
- package/esm/src/guardrails/events.d.ts +13 -0
- package/esm/src/guardrails/events.js +45 -0
- package/esm/src/guardrails/hints.d.ts +14 -0
- package/esm/src/guardrails/hints.js +57 -0
- package/esm/src/guardrails/hits.d.ts +14 -0
- package/esm/src/guardrails/hits.js +30 -0
- 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 +20 -0
- package/esm/src/guardrails/injection-patterns.js +126 -0
- 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 +30 -0
- package/esm/src/guardrails/injection.js +460 -0
- 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 +55 -0
- package/esm/src/guardrails/live-outbound-gate.js +298 -0
- package/esm/src/guardrails/mod.d.ts +54 -0
- package/esm/src/guardrails/mod.js +34 -0
- package/esm/src/guardrails/network.d.ts +46 -0
- package/esm/src/guardrails/network.js +330 -0
- package/esm/src/guardrails/normalize.d.ts +20 -0
- package/esm/src/guardrails/normalize.js +165 -0
- package/esm/src/guardrails/policy.d.ts +4 -0
- package/esm/src/guardrails/policy.js +21 -0
- package/esm/src/guardrails/progressive-yield.d.ts +110 -0
- package/esm/src/guardrails/progressive-yield.js +281 -0
- package/esm/src/guardrails/prompt-echo.d.ts +40 -0
- package/esm/src/guardrails/prompt-echo.js +306 -0
- package/esm/src/guardrails/quota.d.ts +21 -0
- package/esm/src/guardrails/quota.js +80 -0
- package/esm/src/guardrails/rules.d.ts +47 -0
- package/esm/src/guardrails/rules.js +47 -0
- package/esm/src/guardrails/sanitize.d.ts +40 -0
- package/esm/src/guardrails/sanitize.js +160 -0
- 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 +22 -0
- package/esm/src/guardrails/sensitive.js +234 -0
- package/esm/src/guardrails/serialize.d.ts +15 -0
- package/esm/src/guardrails/serialize.js +37 -0
- package/esm/src/guardrails/testing.d.ts +11 -0
- package/esm/src/guardrails/testing.js +10 -0
- package/esm/src/guardrails/theorem-error.d.ts +21 -0
- package/esm/src/guardrails/theorem-error.js +54 -0
- package/esm/src/guardrails/thought-guard.d.ts +76 -0
- package/esm/src/guardrails/thought-guard.js +664 -0
- package/esm/src/guardrails/tool-directives.d.ts +38 -0
- package/esm/src/guardrails/tool-directives.js +195 -0
- 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 +92 -0
- package/esm/src/guardrails/tool-result.js +272 -0
- package/esm/src/guardrails/types.d.ts +250 -0
- package/esm/src/guardrails/types.js +58 -0
- package/esm/src/host/client-turn.d.ts +36 -0
- package/esm/src/host/client-turn.js +80 -0
- package/esm/src/host/mint-trace.d.ts +29 -0
- package/esm/src/host/mint-trace.js +60 -0
- package/esm/src/host/mod.d.ts +13 -0
- package/esm/src/host/mod.js +11 -0
- package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
- package/esm/src/host/readStreamingJsonStringField.js +27 -0
- package/esm/src/host/reply.d.ts +13 -0
- package/esm/src/host/reply.js +41 -0
- package/esm/src/interface/blocks.d.ts +11 -0
- package/esm/src/interface/blocks.js +283 -0
- package/esm/src/interface/composer-actions.d.ts +24 -0
- package/esm/src/interface/composer-actions.js +33 -0
- package/esm/src/interface/draft.d.ts +20 -0
- package/esm/src/interface/draft.js +39 -0
- package/esm/src/interface/from-profile.d.ts +24 -0
- package/esm/src/interface/from-profile.js +179 -0
- package/esm/src/interface/history.d.ts +46 -0
- package/esm/src/interface/history.js +278 -0
- package/esm/src/interface/inputs.d.ts +11 -0
- package/esm/src/interface/inputs.js +67 -0
- package/esm/src/interface/mod.d.ts +33 -0
- package/esm/src/interface/mod.js +22 -0
- package/esm/src/interface/models.d.ts +26 -0
- package/esm/src/interface/models.js +50 -0
- package/esm/src/interface/pending.d.ts +57 -0
- package/esm/src/interface/pending.js +152 -0
- package/esm/src/interface/profile-interface.d.ts +4 -0
- package/esm/src/interface/profile-interface.js +237 -0
- package/esm/src/interface/session.d.ts +71 -0
- package/esm/src/interface/session.js +128 -0
- 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 +32 -0
- package/esm/src/interface/tool-calls.js +127 -0
- package/esm/src/interface/tool-invoke.d.ts +6 -0
- package/esm/src/interface/tool-invoke.js +22 -0
- package/esm/src/interface/tool-media.d.ts +11 -0
- package/esm/src/interface/tool-media.js +113 -0
- package/esm/src/interface/types.d.ts +278 -0
- package/esm/src/interface/types.js +5 -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/credential-source.d.ts +23 -0
- package/esm/src/kernel/auth/credential-source.js +11 -0
- package/esm/src/kernel/auth/crypto.d.ts +56 -0
- package/esm/src/kernel/auth/crypto.js +163 -0
- package/esm/src/kernel/auth/mod.d.ts +5 -0
- package/esm/src/kernel/auth/mod.js +5 -0
- package/esm/src/kernel/auth/oauth.d.ts +18 -0
- package/esm/src/kernel/auth/oauth.js +439 -0
- package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
- package/esm/src/kernel/auth/scope-refusal.js +8 -0
- package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
- package/esm/src/kernel/auth/typed-secret.js +23 -0
- package/esm/src/kernel/auth/types.d.ts +152 -0
- package/esm/src/kernel/auth/types.js +1 -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 +72 -0
- package/esm/src/kernel/default-scope.js +121 -0
- 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 +71 -0
- package/esm/src/kernel/engine/compaction.js +203 -0
- package/esm/src/kernel/engine/decision.d.ts +43 -0
- package/esm/src/kernel/engine/decision.js +439 -0
- package/esm/src/kernel/engine/embedding.d.ts +8 -0
- package/esm/src/kernel/engine/embedding.js +118 -0
- package/esm/src/kernel/engine/hash.d.ts +6 -0
- package/esm/src/kernel/engine/hash.js +22 -0
- package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
- package/esm/src/kernel/engine/live-inbound.js +44 -0
- package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
- package/esm/src/kernel/engine/live-ingress.js +42 -0
- package/esm/src/kernel/engine/record.d.ts +3 -0
- package/esm/src/kernel/engine/record.js +11 -0
- package/esm/src/kernel/engine/repair.d.ts +7 -0
- package/esm/src/kernel/engine/repair.js +36 -0
- package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
- package/esm/src/kernel/engine/runner/gates.js +508 -0
- package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
- package/esm/src/kernel/engine/runner/mod.js +625 -0
- 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 +35 -0
- package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
- package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
- package/esm/src/kernel/engine/runner/stages.js +41 -0
- package/esm/src/kernel/engine/runner/state.d.ts +97 -0
- package/esm/src/kernel/engine/runner/state.js +50 -0
- 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 +14 -0
- package/esm/src/kernel/engine/runner/steps.js +519 -0
- package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
- package/esm/src/kernel/engine/runner/stream.js +376 -0
- package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
- package/esm/src/kernel/engine/runner/usage.js +148 -0
- package/esm/src/kernel/engine/session/mod.d.ts +33 -0
- package/esm/src/kernel/engine/session/mod.js +1182 -0
- package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
- package/esm/src/kernel/engine/session/session-trace.js +500 -0
- package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
- package/esm/src/kernel/engine/token-estimate.js +38 -0
- package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
- package/esm/src/kernel/engine/tool-trace.js +132 -0
- package/esm/src/kernel/engine/tree.d.ts +2 -0
- package/esm/src/kernel/engine/tree.js +17 -0
- package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
- package/esm/src/kernel/engine/turn-trace.js +855 -0
- package/esm/src/kernel/engine/usage.d.ts +36 -0
- package/esm/src/kernel/engine/usage.js +151 -0
- package/esm/src/kernel/interaction-parts.d.ts +13 -0
- package/esm/src/kernel/interaction-parts.js +40 -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 +74 -0
- package/esm/src/kernel/mod.js +45 -0
- package/esm/src/kernel/profile-graph.d.ts +145 -0
- package/esm/src/kernel/profile-graph.js +158 -0
- package/esm/src/kernel/profile-presence.d.ts +18 -0
- package/esm/src/kernel/profile-presence.js +158 -0
- package/esm/src/kernel/profile-scope.d.ts +40 -0
- package/esm/src/kernel/profile-scope.js +274 -0
- 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 +46 -0
- package/esm/src/kernel/registry/attachments.js +220 -0
- package/esm/src/kernel/registry/catalog.d.ts +25 -0
- package/esm/src/kernel/registry/catalog.js +85 -0
- 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 +12 -0
- package/esm/src/kernel/registry/ingress.js +179 -0
- package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
- package/esm/src/kernel/registry/kernel-registry.js +15 -0
- package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
- package/esm/src/kernel/registry/profile-outputs.js +10 -0
- package/esm/src/kernel/registry/profiles.d.ts +116 -0
- package/esm/src/kernel/registry/profiles.js +773 -0
- package/esm/src/kernel/registry/provider-request.d.ts +6 -0
- package/esm/src/kernel/registry/provider-request.js +34 -0
- package/esm/src/kernel/registry/resolve.d.ts +17 -0
- package/esm/src/kernel/registry/resolve.js +238 -0
- package/esm/src/kernel/registry/schemas.d.ts +12 -0
- package/esm/src/kernel/registry/schemas.js +27 -0
- 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/sole-model.d.ts +2 -0
- package/esm/src/kernel/registry/sole-model.js +4 -0
- package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
- package/esm/src/kernel/registry/system-prompt.js +32 -0
- package/esm/src/kernel/registry/system-role.d.ts +3 -0
- package/esm/src/kernel/registry/system-role.js +9 -0
- package/esm/src/kernel/registry/vault.d.ts +14 -0
- package/esm/src/kernel/registry/vault.js +1 -0
- package/esm/src/kernel/schema.d.ts +226 -0
- package/esm/src/kernel/schema.js +895 -0
- package/esm/src/kernel/scope.d.ts +29 -0
- package/esm/src/kernel/scope.js +45 -0
- package/esm/src/kernel/stages.d.ts +176 -0
- package/esm/src/kernel/stages.js +431 -0
- package/esm/src/kernel/stop.d.ts +116 -0
- package/esm/src/kernel/stop.js +137 -0
- package/esm/src/kernel/system-parts.d.ts +26 -0
- package/esm/src/kernel/system-parts.js +98 -0
- package/esm/src/kernel/tools/activity-label.d.ts +22 -0
- package/esm/src/kernel/tools/activity-label.js +435 -0
- 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 +66 -0
- package/esm/src/kernel/tools/events.js +184 -0
- package/esm/src/kernel/tools/execute.d.ts +100 -0
- package/esm/src/kernel/tools/execute.js +1173 -0
- package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
- package/esm/src/kernel/tools/gate-answer.js +65 -0
- 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 +17 -0
- package/esm/src/kernel/tools/harness.js +43 -0
- 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 +32 -0
- package/esm/src/kernel/tools/invoke.js +282 -0
- package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
- package/esm/src/kernel/tools/mcp-sessions.js +69 -0
- package/esm/src/kernel/tools/mod.d.ts +10 -0
- package/esm/src/kernel/tools/mod.js +7 -0
- package/esm/src/kernel/tools/model-text.d.ts +16 -0
- package/esm/src/kernel/tools/model-text.js +31 -0
- 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 +15 -0
- package/esm/src/kernel/tools/permission.js +38 -0
- package/esm/src/kernel/tools/project.d.ts +11 -0
- package/esm/src/kernel/tools/project.js +55 -0
- package/esm/src/kernel/tools/registry.d.ts +27 -0
- package/esm/src/kernel/tools/registry.js +143 -0
- package/esm/src/kernel/tools/remote.d.ts +144 -0
- package/esm/src/kernel/tools/remote.js +1125 -0
- package/esm/src/kernel/tools/resolve.d.ts +31 -0
- package/esm/src/kernel/tools/resolve.js +267 -0
- 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 +10 -0
- package/esm/src/kernel/tools/schema.js +95 -0
- package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
- package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
- package/esm/src/kernel/tools/stage-run.d.ts +116 -0
- package/esm/src/kernel/tools/stage-run.js +198 -0
- package/esm/src/kernel/tools/types.d.ts +497 -0
- package/esm/src/kernel/tools/types.js +1 -0
- 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 +776 -0
- package/esm/src/kernel/turn-events.js +543 -0
- package/esm/src/kernel/types.d.ts +1025 -0
- package/esm/src/kernel/types.js +1 -0
- package/esm/src/kernel/util/base64.d.ts +4 -0
- package/esm/src/kernel/util/base64.js +15 -0
- package/esm/src/kernel/util/exact-type.d.ts +31 -0
- package/esm/src/kernel/util/exact-type.js +1 -0
- package/esm/src/kernel/util/find-last.d.ts +3 -0
- package/esm/src/kernel/util/find-last.js +9 -0
- package/esm/src/kernel/util/mime.d.ts +2 -0
- package/esm/src/kernel/util/mime.js +4 -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 +2 -0
- package/esm/src/kernel/util/record.js +4 -0
- package/esm/src/observability/destinations.d.ts +14 -0
- package/esm/src/observability/destinations.js +43 -0
- package/esm/src/observability/jsonl.d.ts +18 -0
- package/esm/src/observability/jsonl.js +110 -0
- package/esm/src/observability/mod.d.ts +22 -0
- package/esm/src/observability/mod.js +16 -0
- package/esm/src/observability/openinference.d.ts +11 -0
- package/esm/src/observability/openinference.js +205 -0
- package/esm/src/observability/otlp.d.ts +71 -0
- package/esm/src/observability/otlp.js +98 -0
- package/esm/src/observability/phoenix.d.ts +30 -0
- package/esm/src/observability/phoenix.js +71 -0
- package/esm/src/observability/policy.d.ts +17 -0
- package/esm/src/observability/policy.js +73 -0
- package/esm/src/observability/resolve-policy.d.ts +8 -0
- package/esm/src/observability/resolve-policy.js +64 -0
- package/esm/src/observability/spans.d.ts +22 -0
- package/esm/src/observability/spans.js +72 -0
- package/esm/src/observability/trace-catalog.d.ts +128 -0
- package/esm/src/observability/trace-catalog.js +906 -0
- package/esm/src/observability/trace-record.d.ts +23 -0
- package/esm/src/observability/trace-record.js +228 -0
- package/esm/src/observability/trace-schema.d.ts +57 -0
- package/esm/src/observability/trace-schema.js +59 -0
- package/esm/src/observability/trace-sink.d.ts +14 -0
- package/esm/src/observability/trace-sink.js +3 -0
- package/esm/src/observability/trace-span.d.ts +98 -0
- package/esm/src/observability/trace-span.js +201 -0
- package/esm/src/observability/trace.d.ts +13 -0
- package/esm/src/observability/trace.js +37 -0
- package/esm/src/observability/types.d.ts +109 -0
- package/esm/src/observability/types.js +3 -0
- package/esm/src/presets/google/speech-voices.d.ts +9 -0
- package/esm/src/presets/google/speech-voices.js +38 -0
- package/esm/src/presets/google-limits.d.ts +13 -0
- package/esm/src/presets/google-limits.js +18 -0
- package/esm/src/presets/google.d.ts +119 -0
- package/esm/src/presets/google.js +197 -0
- package/esm/src/presets/local.d.ts +26 -0
- package/esm/src/presets/local.js +30 -0
- package/esm/src/presets/mod.d.ts +11 -0
- package/esm/src/presets/mod.js +9 -0
- package/esm/src/presets/openrouter.d.ts +26 -0
- package/esm/src/presets/openrouter.js +31 -0
- 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/api-error.d.ts +8 -0
- package/esm/src/providers/google/api-error.js +123 -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 +5 -0
- package/esm/src/providers/google/grounding.js +226 -0
- package/esm/src/providers/google/interactions/framing.d.ts +27 -0
- package/esm/src/providers/google/interactions/framing.js +304 -0
- package/esm/src/providers/google/interactions/steps.d.ts +12 -0
- package/esm/src/providers/google/interactions/steps.js +200 -0
- package/esm/src/providers/google/interactions/stream.d.ts +23 -0
- package/esm/src/providers/google/interactions/stream.js +230 -0
- package/esm/src/providers/google/live/framing.d.ts +61 -0
- package/esm/src/providers/google/live/framing.js +597 -0
- package/esm/src/providers/google/live/stream.d.ts +13 -0
- package/esm/src/providers/google/live/stream.js +57 -0
- package/esm/src/providers/google/thinking.d.ts +3 -0
- package/esm/src/providers/google/thinking.js +8 -0
- package/esm/src/providers/google/urls.d.ts +4 -0
- package/esm/src/providers/google/urls.js +4 -0
- package/esm/src/providers/google/usage.d.ts +7 -0
- package/esm/src/providers/google/usage.js +49 -0
- 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 +32 -0
- package/esm/src/providers/mod.js +23 -0
- 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 +15 -0
- package/esm/src/providers/openrouter/image.js +34 -0
- 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 +19 -0
- package/esm/src/providers/openrouter/openai/compat.js +162 -0
- package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
- package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
- 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/openai/usage.d.ts +8 -0
- package/esm/src/providers/openrouter/openai/usage.js +56 -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.d.ts +14 -0
- package/esm/src/providers/shared/pcm.js +78 -0
- 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 +11 -0
- package/esm/src/providers/shared/response-identity.js +12 -0
- 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 +6 -0
- package/esm/src/providers/shared/sse.js +93 -0
- package/esm/src/providers/shared/structured-output.d.ts +4 -0
- package/esm/src/providers/shared/structured-output.js +11 -0
- package/esm/src/providers/shared/tool-args.d.ts +24 -0
- package/esm/src/providers/shared/tool-args.js +88 -0
- 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 +8 -0
- package/esm/src/providers/shared/upstream-tap.js +85 -0
- package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
- package/esm/src/providers/shared/upstream-tape.js +88 -0
- 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 +51 -0
- package/esm/src/providers/types.js +2 -0
- 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 +46 -0
- package/esm/src/surface/formats.js +178 -0
- package/esm/src/surface/mod.d.ts +16 -0
- package/esm/src/surface/mod.js +12 -0
- package/esm/src/surface/runtime.d.ts +44 -0
- package/esm/src/surface/runtime.js +441 -0
- package/esm/src/surface/tools.d.ts +9 -0
- package/esm/src/surface/tools.js +62 -0
- package/esm/src/surface/types.d.ts +110 -0
- package/esm/src/surface/types.js +4 -0
- package/package.json +100 -4
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { LiveIngressSpec, Profile } from '../types.js';
|
|
2
|
+
/** A channel a live session can take input on: audio, video, or text. */
|
|
3
|
+
export type LiveIngressChannel = keyof LiveIngressSpec;
|
|
4
|
+
/** Default when `live.ingress.<channel>` is omitted — mic and camera on, typed text off. */
|
|
5
|
+
export declare function liveIngressChannelDefault(channel: LiveIngressChannel): boolean;
|
|
6
|
+
/** True when the ingress spec enables the channel. */
|
|
7
|
+
export declare function liveIngressEnabledFromSpec(ingress: LiveIngressSpec | undefined, channel: LiveIngressChannel): boolean;
|
|
8
|
+
/** True when the live profile enables the channel. */
|
|
9
|
+
export declare function liveIngressEnabled(profile: Profile, channel: LiveIngressChannel): boolean;
|
|
10
|
+
/** True when the live profile enables at least one channel. */
|
|
11
|
+
export declare function hasAnyLiveIngress(profile: Profile): boolean;
|
|
12
|
+
/** Throws when the live profile enables no input channel. */
|
|
13
|
+
export declare function assertLiveIngressConfigured(profile: Profile): void;
|
|
14
|
+
/** Throws when the live profile does not enable the channel. */
|
|
15
|
+
export declare function assertLiveIngress(profile: Profile, channel: LiveIngressChannel): void;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { TheoremError } from '../../guardrails/error.js';
|
|
2
|
+
const LIVE_INGRESS_CHANNELS = ['audio', 'video', 'text'];
|
|
3
|
+
function assertLiveProfile(profile) {
|
|
4
|
+
if (profile.type !== 'live') {
|
|
5
|
+
throw new TheoremError('request', `Profile '${profile.id}' is not type 'live'`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
6
|
+
}
|
|
7
|
+
return profile;
|
|
8
|
+
}
|
|
9
|
+
/** Default when `live.ingress.<channel>` is omitted — mic and camera on, typed text off. */
|
|
10
|
+
export function liveIngressChannelDefault(channel) {
|
|
11
|
+
return channel !== 'text';
|
|
12
|
+
}
|
|
13
|
+
/** True when the ingress spec enables the channel. */
|
|
14
|
+
export function liveIngressEnabledFromSpec(ingress, channel) {
|
|
15
|
+
const value = ingress?.[channel];
|
|
16
|
+
if (value === undefined)
|
|
17
|
+
return liveIngressChannelDefault(channel);
|
|
18
|
+
return value;
|
|
19
|
+
}
|
|
20
|
+
/** True when the live profile enables the channel. */
|
|
21
|
+
export function liveIngressEnabled(profile, channel) {
|
|
22
|
+
const live = assertLiveProfile(profile);
|
|
23
|
+
return liveIngressEnabledFromSpec(live.live.ingress, channel);
|
|
24
|
+
}
|
|
25
|
+
/** True when the live profile enables at least one channel. */
|
|
26
|
+
export function hasAnyLiveIngress(profile) {
|
|
27
|
+
const live = assertLiveProfile(profile);
|
|
28
|
+
return LIVE_INGRESS_CHANNELS.some((channel) => liveIngressEnabledFromSpec(live.live.ingress, channel));
|
|
29
|
+
}
|
|
30
|
+
/** Throws when the live profile enables no input channel. */
|
|
31
|
+
export function assertLiveIngressConfigured(profile) {
|
|
32
|
+
const live = assertLiveProfile(profile);
|
|
33
|
+
if (hasAnyLiveIngress(live))
|
|
34
|
+
return;
|
|
35
|
+
throw new TheoremError('config', `Profile '${live.id}': at least one live.ingress channel (audio, video, text) must be enabled`);
|
|
36
|
+
}
|
|
37
|
+
/** Throws when the live profile does not enable the channel. */
|
|
38
|
+
export function assertLiveIngress(profile, channel) {
|
|
39
|
+
if (liveIngressEnabled(profile, channel))
|
|
40
|
+
return;
|
|
41
|
+
throw new TheoremError('request', `Profile '${profile.id}' live.ingress.${channel} is disabled — cannot send on this channel`);
|
|
42
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { isRecord } from '../util/record.js';
|
|
2
|
+
function asRecord(value) {
|
|
3
|
+
return isRecord(value) ? value : undefined;
|
|
4
|
+
}
|
|
5
|
+
function nonEmptyString(value) {
|
|
6
|
+
if (typeof value === 'string' && value.trim()) {
|
|
7
|
+
return value;
|
|
8
|
+
}
|
|
9
|
+
return undefined;
|
|
10
|
+
}
|
|
11
|
+
export { asRecord, nonEmptyString };
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { labelText } from '../../guardrails/labels.js';
|
|
2
|
+
const MAX_REPAIR_HISTORY_EXCHANGES = 2;
|
|
3
|
+
const MAX_REPAIR_HISTORY_MESSAGES = MAX_REPAIR_HISTORY_EXCHANGES * 2;
|
|
4
|
+
function scopeHistory(history) {
|
|
5
|
+
if (!history || history.length === 0) {
|
|
6
|
+
return [];
|
|
7
|
+
}
|
|
8
|
+
return history.slice(-MAX_REPAIR_HISTORY_MESSAGES);
|
|
9
|
+
}
|
|
10
|
+
function formatHistoryBlock(messages, labels) {
|
|
11
|
+
if (messages.length === 0) {
|
|
12
|
+
return '';
|
|
13
|
+
}
|
|
14
|
+
const lines = messages.map((m) => `${m.role === 'user' ? 'User' : 'Assistant'}: ${m.content}`);
|
|
15
|
+
const heading = labelText('repair.history_heading', { count: messages.length }, labels);
|
|
16
|
+
return `${heading}\n${lines.join('\n')}\n\n`;
|
|
17
|
+
}
|
|
18
|
+
function synthesizeRepairPrompt(args) {
|
|
19
|
+
const { profile, repair, history } = args;
|
|
20
|
+
const guidance = repair.guidance || labelText('repair.default_guidance', {}, profile.labels);
|
|
21
|
+
const historyBlock = formatHistoryBlock(scopeHistory(history), profile.labels);
|
|
22
|
+
let prompt = `${labelText('repair.prompt_header', {}, profile.labels)}\n\n`;
|
|
23
|
+
prompt += `${labelText('repair.prompt_intro', {}, profile.labels)}\n\n`;
|
|
24
|
+
prompt += `${labelText('repair.section_previous_output', {}, profile.labels)}\n\`\`\`\n${repair.previousOutput.trim()}\n\`\`\`\n\n`;
|
|
25
|
+
prompt += `${labelText('repair.section_validator_rejection', {}, profile.labels)}\n${repair.rejection.trim()}\n\n`;
|
|
26
|
+
if (guidance.trim()) {
|
|
27
|
+
prompt += `${labelText('repair.section_repair_guidance', {}, profile.labels)}\n${guidance.trim()}\n\n`;
|
|
28
|
+
}
|
|
29
|
+
if (historyBlock) {
|
|
30
|
+
prompt += historyBlock;
|
|
31
|
+
}
|
|
32
|
+
prompt += `${labelText('repair.section_instructions', {}, profile.labels)}\n`;
|
|
33
|
+
prompt += labelText('repair.prompt_instructions', {}, profile.labels);
|
|
34
|
+
return prompt;
|
|
35
|
+
}
|
|
36
|
+
export { synthesizeRepairPrompt };
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { BoundSystem } from '../../system-parts.js';
|
|
2
|
+
import type { Profile, ResolvedGeneration, TurnEvent, TurnModel, TurnRequest } from '../../types.js';
|
|
3
|
+
import { type StepExecutionState } from './state.js';
|
|
4
|
+
declare function runAttemptsWithValidation(safe: TurnRequest, profile: Profile, generation: ResolvedGeneration, system: BoundSystem, provider: TurnModel, state: StepExecutionState): AsyncGenerator<TurnEvent>;
|
|
5
|
+
export { runAttemptsWithValidation };
|
|
@@ -0,0 +1,508 @@
|
|
|
1
|
+
import { scopeOf } from '../../../guardrails/detect-at.js';
|
|
2
|
+
import { readReply, refusalAfter, replyAfter, standingBlock, TURN_REPLY, } from '../../../guardrails/detect-reply.js';
|
|
3
|
+
import { WITHHELD_REASON } from '../../../guardrails/egress.js';
|
|
4
|
+
import { TheoremError, throwIfAborted, toErrorEvent } from '../../../guardrails/error.js';
|
|
5
|
+
import { guardrailFromHits, guardrailTurnEvent } from '../../../guardrails/events.js';
|
|
6
|
+
import { retryRejection } from '../../../guardrails/hints.js';
|
|
7
|
+
import { labelText } from '../../../guardrails/labels.js';
|
|
8
|
+
import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
|
|
9
|
+
import { replyIsJudged } from '../../../guardrails/progressive-yield.js';
|
|
10
|
+
import { sanitizeTurnRequest } from '../../../guardrails/sanitize.js';
|
|
11
|
+
import { resolveInputParts } from '../../registry/ingress.js';
|
|
12
|
+
import { profileTurnOutputs } from '../../registry/profile-outputs.js';
|
|
13
|
+
import { injectWouldExceedMaxSteps } from '../../stages.js';
|
|
14
|
+
import { findLast } from '../../util/find-last.js';
|
|
15
|
+
import { guardrailCheckAttributes } from '../turn-trace.js';
|
|
16
|
+
import { collectItemFailures, collectValidationFailures, formatValidationFailures, itemSchemaAt, valueAt, withListAt, } from './schema-validation.js';
|
|
17
|
+
import { applyTurnStage } from './stages.js';
|
|
18
|
+
import { appendUserInput, } from './state.js';
|
|
19
|
+
import { executeAttempt } from './steps.js';
|
|
20
|
+
import { isWithheldOnBlock, shownToHost } from './stream.js';
|
|
21
|
+
/** A turn whose final output the egress check blocked (withheld or replaced by policy copy). */
|
|
22
|
+
const EGRESS_FILTERED_STOP = { kind: 'filtered', native: 'egress' };
|
|
23
|
+
/** Reply text only: thoughts are not guarded output (`isGuardedOutput`). */
|
|
24
|
+
function collectAttemptText(events) {
|
|
25
|
+
const parts = [];
|
|
26
|
+
for (const event of events) {
|
|
27
|
+
if (event.type === 'text' && event.text) {
|
|
28
|
+
parts.push(event.text);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return parts.join('');
|
|
32
|
+
}
|
|
33
|
+
// why: Structured output travels with the text so `outputs.structured` meets egress rather than passing unexamined.
|
|
34
|
+
function projectOutbound(events) {
|
|
35
|
+
const structured = findLast(events, (e) => e.type === 'structured')?.structured;
|
|
36
|
+
return {
|
|
37
|
+
text: collectAttemptText(events),
|
|
38
|
+
...(structured !== undefined ? { structured } : {}),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
function buildRepairRequest(safe, previousOutput, rejection, repairGuidance) {
|
|
42
|
+
return {
|
|
43
|
+
...safe,
|
|
44
|
+
input: {
|
|
45
|
+
...safe.input,
|
|
46
|
+
repair: {
|
|
47
|
+
previousOutput: typeof previousOutput === 'string' ? previousOutput : JSON.stringify(previousOutput),
|
|
48
|
+
rejection,
|
|
49
|
+
guidance: repairGuidance,
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
/** The verdict on an attempt's reply, as `guardrails.detect` reads it whole. */
|
|
55
|
+
function evaluateEgressOutcome(args) {
|
|
56
|
+
const { attemptEvents, request, profile, canRetry, promptLeaks } = args;
|
|
57
|
+
const { detect, blockedReply } = args.policy;
|
|
58
|
+
const written = projectOutbound(attemptEvents);
|
|
59
|
+
const scope = scopeOf(args.policy, {
|
|
60
|
+
canary: args.generation.canary,
|
|
61
|
+
canaryGiven: args.canaryGiven,
|
|
62
|
+
privateSystem: args.privateSystem,
|
|
63
|
+
givenUrls: args.givenUrls,
|
|
64
|
+
...(args.ownTools ? { ownTools: args.ownTools } : {}),
|
|
65
|
+
...(profile.labels ? { labels: profile.labels } : {}),
|
|
66
|
+
});
|
|
67
|
+
const read = readReply(written, detect, {
|
|
68
|
+
boundary: 'reply',
|
|
69
|
+
...(args.withheld ? { reportedTo: args.released.length } : {}),
|
|
70
|
+
scope,
|
|
71
|
+
});
|
|
72
|
+
const { payload } = read;
|
|
73
|
+
/** Text that takes the written reply's place, as the host receives it. */
|
|
74
|
+
const replacement = (text) => ({
|
|
75
|
+
action: 'refusal',
|
|
76
|
+
event: { type: 'text', text },
|
|
77
|
+
});
|
|
78
|
+
const stopped = standingBlock(read, promptLeaks);
|
|
79
|
+
// why: A detector's block is reported by its own event, which names the boundary.
|
|
80
|
+
const judged = stopped && stopped !== read.blocked
|
|
81
|
+
? guardrailFromHits('output_final', 'untrusted', stopped, 'block')
|
|
82
|
+
: undefined;
|
|
83
|
+
const guardrails = [...read.events.map(guardrailTurnEvent), ...(judged ? [judged] : [])];
|
|
84
|
+
if (!stopped) {
|
|
85
|
+
if (read.rewritten) {
|
|
86
|
+
// why: Text the stream could not replace as it went: the reply goes out replaced, whole.
|
|
87
|
+
return { outcome: replacement(replyAfter(args.shown, payload.text)), guardrails };
|
|
88
|
+
}
|
|
89
|
+
const replaced = payload.structured !== written.structured;
|
|
90
|
+
return {
|
|
91
|
+
outcome: { action: 'pass' },
|
|
92
|
+
guardrails,
|
|
93
|
+
...(replaced ? { structured: payload.structured } : {}),
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
if (blockedReply.onBlock === 'refuse') {
|
|
97
|
+
return { outcome: replacement(refusalAfter(args.shown, profile.labels)), guardrails };
|
|
98
|
+
}
|
|
99
|
+
if (canRetry) {
|
|
100
|
+
const nextRequest = buildRepairRequest(request, payload.text, retryRejection(stopped, detect, profile.labels), labelText('egress.default_repair_guidance', {}, profile.labels));
|
|
101
|
+
return { outcome: { action: 'retry', nextRequest }, guardrails };
|
|
102
|
+
}
|
|
103
|
+
return {
|
|
104
|
+
outcome: {
|
|
105
|
+
action: 'withhold',
|
|
106
|
+
event: toErrorEvent(new TheoremError('safety', WITHHELD_REASON.egress)),
|
|
107
|
+
},
|
|
108
|
+
guardrails,
|
|
109
|
+
};
|
|
110
|
+
}
|
|
111
|
+
async function evaluateValidationOutcome(args) {
|
|
112
|
+
const { validation, generation, latestStructured, request, canRetry } = args;
|
|
113
|
+
if (latestStructured === undefined) {
|
|
114
|
+
return { action: 'pass' };
|
|
115
|
+
}
|
|
116
|
+
const structured = generation.structured;
|
|
117
|
+
if (!structured) {
|
|
118
|
+
throw new TheoremError('config', 'outputs.validation requires outputs.structured with a JSON Schema');
|
|
119
|
+
}
|
|
120
|
+
const failures = await collectValidationFailures(structured.jsonSchema, latestStructured, validation.fields, request.input?.slots);
|
|
121
|
+
if (failures.length === 0)
|
|
122
|
+
return { action: 'pass' };
|
|
123
|
+
if (!canRetry)
|
|
124
|
+
return { action: 'pass', failed: failures };
|
|
125
|
+
const nextRequest = buildRepairRequest(request, latestStructured, formatValidationFailures(failures));
|
|
126
|
+
return { action: 'retry', nextRequest };
|
|
127
|
+
}
|
|
128
|
+
function* yieldBufferedAttemptEvents(events, alreadyStreamedUserVisible, generation) {
|
|
129
|
+
for (const ev of events) {
|
|
130
|
+
if (ev.type === 'tokens') {
|
|
131
|
+
continue;
|
|
132
|
+
}
|
|
133
|
+
// why: Thoughts always streamed live; text and media did unless the attempt withheld them.
|
|
134
|
+
if (ev.type === 'thought' || (alreadyStreamedUserVisible && isWithheldOnBlock(ev))) {
|
|
135
|
+
continue;
|
|
136
|
+
}
|
|
137
|
+
// why: A held structured reply was judged whole; its drafts are the JSON before that check, so the `structured` event alone shows it.
|
|
138
|
+
const shown = shownToHost(ev, { ...generation, stream: false });
|
|
139
|
+
if (shown)
|
|
140
|
+
yield shown;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
/**
|
|
144
|
+
* Start the next attempt with the repair added. The turn is not resolved again:
|
|
145
|
+
* the retry keeps attempt 1's canary, tools, and system prompt, and only the
|
|
146
|
+
* repair prompt is new.
|
|
147
|
+
*/
|
|
148
|
+
function updateFlowForRetry(flow, state, profile, nextReq, reason) {
|
|
149
|
+
flow.currentAttempt++;
|
|
150
|
+
state.trace.attempt = flow.currentAttempt;
|
|
151
|
+
state.trace.root.event('theorem.attempt.retry', { attempt: flow.currentAttempt, reason });
|
|
152
|
+
flow.currentReq = nextReq;
|
|
153
|
+
const safe = sanitizeTurnRequest(nextReq, profile);
|
|
154
|
+
if (profile.type === 'text') {
|
|
155
|
+
// why: The conversation is already in turn history: the repair is its next user message.
|
|
156
|
+
const before = state.currentHistory.length;
|
|
157
|
+
appendUserInput(state, resolveInputParts(profile, { ...safe, input: { repair: safe.input?.repair } }));
|
|
158
|
+
for (const message of state.currentHistory.slice(before))
|
|
159
|
+
quotesOwnReply(state, message);
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
// why: An image or speech call reads only its input: the repair replaces the prompt.
|
|
163
|
+
const input = resolveInputParts(profile, safe);
|
|
164
|
+
quotesOwnReply(state, input);
|
|
165
|
+
flow.currentGen = { ...flow.currentGen, input };
|
|
166
|
+
}
|
|
167
|
+
const event = { type: 'attempt', attempt: flow.currentAttempt, reason };
|
|
168
|
+
state.allEmittedEvents.push(event);
|
|
169
|
+
return event;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* A repair hands the stopped reply back, and the model wrote that reply. What
|
|
173
|
+
* carries it gives the model nothing: a canary or a URL in it is still a leak
|
|
174
|
+
* on the next attempt.
|
|
175
|
+
*/
|
|
176
|
+
function quotesOwnReply(state, carrier) {
|
|
177
|
+
state.canaryScanned.add(carrier);
|
|
178
|
+
state.givenUrls.own.add(carrier);
|
|
179
|
+
}
|
|
180
|
+
/** Whether an attempt holds its reply text to its end: one validated and not streamed. */
|
|
181
|
+
function holdsVisible(profile, generation) {
|
|
182
|
+
return profileTurnOutputs(profile)?.validation !== undefined && generation.stream === false;
|
|
183
|
+
}
|
|
184
|
+
async function* handleEgressGate(policy, flow, state, profile, privateSystem) {
|
|
185
|
+
const canRetry = flow.currentAttempt < policy.blockedReply.maxRetries;
|
|
186
|
+
const checkStart = performance.now();
|
|
187
|
+
const { outcome, guardrails, structured } = await evaluateEgressOutcome({
|
|
188
|
+
policy,
|
|
189
|
+
attemptEvents: state.attemptEvents,
|
|
190
|
+
withheld: state.withheldVisible === true,
|
|
191
|
+
released: state.released,
|
|
192
|
+
shown: holdsVisible(profile, flow.currentGen) ? '' : state.released,
|
|
193
|
+
generation: flow.currentGen,
|
|
194
|
+
request: flow.currentReq,
|
|
195
|
+
profile,
|
|
196
|
+
canRetry,
|
|
197
|
+
...(state.promptLeaks ? { promptLeaks: state.promptLeaks } : {}),
|
|
198
|
+
givenUrls: state.givenUrls,
|
|
199
|
+
canaryGiven: state.canaryGiven,
|
|
200
|
+
privateSystem,
|
|
201
|
+
...(state.ownTools ? { ownTools: state.ownTools } : {}),
|
|
202
|
+
});
|
|
203
|
+
state.trace.root.event('theorem.guardrail', guardrailCheckAttributes('egress', performance.now() - checkStart, guardrails.at(-1)?.guardrail, {
|
|
204
|
+
stage: 'output_final',
|
|
205
|
+
trust: 'untrusted',
|
|
206
|
+
}));
|
|
207
|
+
for (const guardrail of guardrails) {
|
|
208
|
+
state.allEmittedEvents.push(guardrail);
|
|
209
|
+
yield guardrail;
|
|
210
|
+
}
|
|
211
|
+
if (structured !== undefined) {
|
|
212
|
+
// why: What validation reads and the host receives is the structured output as replaced.
|
|
213
|
+
const held = findLast(state.attemptEvents, (event) => event.type === 'structured');
|
|
214
|
+
if (held)
|
|
215
|
+
state.attemptEvents[state.attemptEvents.indexOf(held)] = { ...held, structured };
|
|
216
|
+
}
|
|
217
|
+
if (outcome.action === 'refusal') {
|
|
218
|
+
state.lastStop = EGRESS_FILTERED_STOP;
|
|
219
|
+
state.allEmittedEvents.push(outcome.event);
|
|
220
|
+
yield outcome.event;
|
|
221
|
+
return 'terminal';
|
|
222
|
+
}
|
|
223
|
+
if (outcome.action === 'withhold') {
|
|
224
|
+
state.lastStop = EGRESS_FILTERED_STOP;
|
|
225
|
+
yield outcome.event;
|
|
226
|
+
return 'terminal';
|
|
227
|
+
}
|
|
228
|
+
if (outcome.action === 'retry') {
|
|
229
|
+
yield updateFlowForRetry(flow, state, profile, outcome.nextRequest, 'egress');
|
|
230
|
+
return 'continue';
|
|
231
|
+
}
|
|
232
|
+
return 'pass';
|
|
233
|
+
}
|
|
234
|
+
/** The refused items of each list, in the reply's own shape and order. */
|
|
235
|
+
function refusedLists(refused) {
|
|
236
|
+
let lists = {};
|
|
237
|
+
for (const path of new Set(refused.map((failure) => failure.path))) {
|
|
238
|
+
const items = refused.filter((failure) => failure.path === path).map(({ item }) => item);
|
|
239
|
+
lists = withListAt(lists, path, items);
|
|
240
|
+
}
|
|
241
|
+
return lists;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The schema a rewrite of refused items answers under: the reply's shape, holding
|
|
245
|
+
* only the lists that had a refused item.
|
|
246
|
+
*
|
|
247
|
+
* why: Under the reply's own schema the model would write the whole reply again to change one item.
|
|
248
|
+
*/
|
|
249
|
+
function fixSchemaFor(jsonSchema, paths) {
|
|
250
|
+
const root = { type: 'object', properties: {}, required: [] };
|
|
251
|
+
// why: An item schema may point into the reply schema's definitions.
|
|
252
|
+
if (jsonSchema.$defs !== undefined)
|
|
253
|
+
root.$defs = jsonSchema.$defs;
|
|
254
|
+
for (const path of paths) {
|
|
255
|
+
const items = itemSchemaAt(jsonSchema, path);
|
|
256
|
+
if (!items)
|
|
257
|
+
continue;
|
|
258
|
+
const keys = path.split('.');
|
|
259
|
+
let node = root;
|
|
260
|
+
for (const [depth, key] of keys.entries()) {
|
|
261
|
+
if (!node.required.includes(key))
|
|
262
|
+
node.required.push(key);
|
|
263
|
+
if (depth === keys.length - 1) {
|
|
264
|
+
node.properties[key] = { type: 'array', items };
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
const next = node.properties[key];
|
|
268
|
+
const child = next?.type === 'object' ? next : { type: 'object', properties: {}, required: [] };
|
|
269
|
+
node.properties[key] = child;
|
|
270
|
+
node = child;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return root;
|
|
274
|
+
}
|
|
275
|
+
/** `fix.reply` with each refused item replaced by its rewrite, matched by position; one with no rewrite stays as it was. */
|
|
276
|
+
function withRewrittenItems(fix, rewrite) {
|
|
277
|
+
let reply = fix.reply;
|
|
278
|
+
for (const path of new Set(fix.refused.map((failure) => failure.path))) {
|
|
279
|
+
const list = valueAt(reply, path);
|
|
280
|
+
const rewritten = valueAt(rewrite, path);
|
|
281
|
+
if (!Array.isArray(list) || !Array.isArray(rewritten))
|
|
282
|
+
continue;
|
|
283
|
+
const next = [...list];
|
|
284
|
+
const refusedHere = fix.refused.filter((failure) => failure.path === path);
|
|
285
|
+
for (const [position, failure] of refusedHere.entries()) {
|
|
286
|
+
if (position < rewritten.length)
|
|
287
|
+
next[failure.index] = rewritten[position];
|
|
288
|
+
}
|
|
289
|
+
reply = withListAt(reply, path, next);
|
|
290
|
+
}
|
|
291
|
+
return reply;
|
|
292
|
+
}
|
|
293
|
+
/** `reply` without its refused items. */
|
|
294
|
+
function withoutItems(reply, refused) {
|
|
295
|
+
let next = reply;
|
|
296
|
+
for (const path of new Set(refused.map((failure) => failure.path))) {
|
|
297
|
+
const list = valueAt(next, path);
|
|
298
|
+
if (!Array.isArray(list))
|
|
299
|
+
continue;
|
|
300
|
+
const gone = new Set(refused.filter((failure) => failure.path === path).map(({ index }) => index));
|
|
301
|
+
next = withListAt(next, path, list.filter((_, index) => !gone.has(index)));
|
|
302
|
+
}
|
|
303
|
+
return next;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Makes `reply` the attempt's structured output, with what the item rules removed.
|
|
307
|
+
*
|
|
308
|
+
* why: The buffered text is the model's own JSON, which no longer matches; held text goes out as the reply that is kept, and streamed text is skipped at release as it always is.
|
|
309
|
+
*/
|
|
310
|
+
function holdReply(state, reply, removed, failed) {
|
|
311
|
+
const event = {
|
|
312
|
+
type: 'structured',
|
|
313
|
+
structured: reply,
|
|
314
|
+
...(removed.length
|
|
315
|
+
? { removed: removed.map(({ path, reason, item }) => ({ path, reason, item })) }
|
|
316
|
+
: {}),
|
|
317
|
+
...(failed ? { failed } : {}),
|
|
318
|
+
};
|
|
319
|
+
state.attemptEvents = [
|
|
320
|
+
...state.attemptEvents.filter((held) => held.type !== 'structured' && held.type !== 'text'),
|
|
321
|
+
{ type: 'text', text: JSON.stringify(reply) },
|
|
322
|
+
event,
|
|
323
|
+
];
|
|
324
|
+
}
|
|
325
|
+
/** The next attempt rewrites only the refused items, under a schema that holds only their lists. */
|
|
326
|
+
function startItemFix(args) {
|
|
327
|
+
const { flow, state, profile, reply, refused, structured } = args;
|
|
328
|
+
const positions = new Map();
|
|
329
|
+
const rejection = refused
|
|
330
|
+
.map(({ path, reason }) => {
|
|
331
|
+
const position = positions.get(path) ?? 0;
|
|
332
|
+
positions.set(path, position + 1);
|
|
333
|
+
return `${path}[${position}]: ${reason}`;
|
|
334
|
+
})
|
|
335
|
+
.join('\n');
|
|
336
|
+
const nextRequest = buildRepairRequest(flow.currentReq, refusedLists(refused), rejection, labelText('repair.items_guidance', {}, profile.labels));
|
|
337
|
+
flow.pendingItemFix = { reply, refused, structured };
|
|
338
|
+
const attempt = updateFlowForRetry(flow, state, profile, nextRequest, 'validation');
|
|
339
|
+
flow.currentGen = {
|
|
340
|
+
...flow.currentGen,
|
|
341
|
+
structured: {
|
|
342
|
+
id: structured.id,
|
|
343
|
+
jsonSchema: fixSchemaFor(structured.jsonSchema, refused.map(({ path }) => path)),
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
return attempt;
|
|
347
|
+
}
|
|
348
|
+
async function handleValidationGate(validation, flow, state, profile, latestStructured) {
|
|
349
|
+
const canRetry = flow.currentAttempt < (validation.maxRetries ?? 0);
|
|
350
|
+
const fix = flow.pendingItemFix;
|
|
351
|
+
let reply = latestStructured;
|
|
352
|
+
if (fix) {
|
|
353
|
+
// why: The attempt that just ended answered under the fix schema; the reply is the one the items were refused in, with the rewrites put back.
|
|
354
|
+
flow.pendingItemFix = undefined;
|
|
355
|
+
flow.currentGen = { ...flow.currentGen, structured: fix.structured };
|
|
356
|
+
reply = withRewrittenItems(fix, latestStructured);
|
|
357
|
+
holdReply(state, reply, []);
|
|
358
|
+
}
|
|
359
|
+
const outcome = await evaluateValidationOutcome({
|
|
360
|
+
validation,
|
|
361
|
+
generation: flow.currentGen,
|
|
362
|
+
latestStructured: reply,
|
|
363
|
+
request: flow.currentReq,
|
|
364
|
+
canRetry,
|
|
365
|
+
});
|
|
366
|
+
if (outcome.action === 'retry') {
|
|
367
|
+
return updateFlowForRetry(flow, state, profile, outcome.nextRequest, 'validation');
|
|
368
|
+
}
|
|
369
|
+
if (reply === undefined)
|
|
370
|
+
return 'pass';
|
|
371
|
+
if (outcome.failed)
|
|
372
|
+
markFailed(state, outcome.failed);
|
|
373
|
+
const slots = flow.currentReq.input?.slots;
|
|
374
|
+
const refused = await collectItemFailures(reply, validation.items, {
|
|
375
|
+
...(slots ? { slots } : {}),
|
|
376
|
+
toolResults: state.toolResults,
|
|
377
|
+
});
|
|
378
|
+
if (refused.length === 0)
|
|
379
|
+
return 'pass';
|
|
380
|
+
const fixable = refused.filter((failure) => failure.onFail === 'fix');
|
|
381
|
+
const structured = flow.currentGen.structured;
|
|
382
|
+
// invariant: Refused items get one rewrite. Refused again, they are removed.
|
|
383
|
+
if (fixable.length > 0 && canRetry && !fix && structured) {
|
|
384
|
+
return startItemFix({ flow, state, profile, reply, refused: fixable, structured });
|
|
385
|
+
}
|
|
386
|
+
holdReply(state, withoutItems(reply, refused), refused, outcome.failed);
|
|
387
|
+
return 'pass';
|
|
388
|
+
}
|
|
389
|
+
/** Puts on the attempt's structured output the fields that still failed. */
|
|
390
|
+
function markFailed(state, failed) {
|
|
391
|
+
const held = findLast(state.attemptEvents, (event) => event.type === 'structured');
|
|
392
|
+
if (held)
|
|
393
|
+
state.attemptEvents[state.attemptEvents.indexOf(held)] = { ...held, failed };
|
|
394
|
+
}
|
|
395
|
+
function gateStatusToAction(status) {
|
|
396
|
+
if (status === 'terminal') {
|
|
397
|
+
return { status: 'terminal' };
|
|
398
|
+
}
|
|
399
|
+
if (status === 'continue') {
|
|
400
|
+
return { status: 'continue' };
|
|
401
|
+
}
|
|
402
|
+
return null;
|
|
403
|
+
}
|
|
404
|
+
async function* executeSingleAttemptCycle(args) {
|
|
405
|
+
const { flow, state, profile, system, provider } = args;
|
|
406
|
+
const validation = profileTurnOutputs(profile)?.validation;
|
|
407
|
+
const policy = resolveGuardrailPolicy(profile.guardrails);
|
|
408
|
+
const judged = replyIsJudged(policy, TURN_REPLY);
|
|
409
|
+
// invariant: Fresh maxSteps budget per validation/egress attempt. before_end inject
|
|
410
|
+
// re-entry inside this cycle still accumulates stepCount (do not reset there).
|
|
411
|
+
state.stepCount = 0;
|
|
412
|
+
let latestStructured;
|
|
413
|
+
for (;;) {
|
|
414
|
+
state.attemptEvents = [];
|
|
415
|
+
state.released = '';
|
|
416
|
+
state.withheldVisible = false;
|
|
417
|
+
state.promptLeaks = undefined;
|
|
418
|
+
const attempt = yield* executeAttempt({
|
|
419
|
+
safe: flow.currentReq,
|
|
420
|
+
profile,
|
|
421
|
+
generation: flow.currentGen,
|
|
422
|
+
system,
|
|
423
|
+
provider,
|
|
424
|
+
state,
|
|
425
|
+
});
|
|
426
|
+
latestStructured = attempt.latestStructured;
|
|
427
|
+
// why: Tool / gate suspension, or no answer to check — do not before_end; finalize with that stop.
|
|
428
|
+
if (state.lastStop?.kind === 'tool' ||
|
|
429
|
+
state.lastStop?.kind === 'gate' ||
|
|
430
|
+
state.lastStop?.kind === 'step_limit') {
|
|
431
|
+
break;
|
|
432
|
+
}
|
|
433
|
+
if (state.lastStop?.kind === 'cancelled') {
|
|
434
|
+
return { status: 'terminal' };
|
|
435
|
+
}
|
|
436
|
+
const beforeEnd = yield* applyTurnStage({
|
|
437
|
+
profile,
|
|
438
|
+
generation: flow.currentGen,
|
|
439
|
+
state,
|
|
440
|
+
stage: 'before_end',
|
|
441
|
+
step: Math.max(state.stepCount, 1),
|
|
442
|
+
onStage: flow.currentReq.onStage,
|
|
443
|
+
signal: flow.currentReq.signal,
|
|
444
|
+
host: flow.currentGen.host,
|
|
445
|
+
injectWouldExceedMaxSteps: injectWouldExceedMaxSteps(state.stepCount, flow.currentGen.maxSteps),
|
|
446
|
+
});
|
|
447
|
+
if (beforeEnd.abort) {
|
|
448
|
+
state.lastStop = {
|
|
449
|
+
kind: 'cancelled',
|
|
450
|
+
...(typeof beforeEnd.abort === 'object' && beforeEnd.abort.reason
|
|
451
|
+
? { native: beforeEnd.abort.reason }
|
|
452
|
+
: {}),
|
|
453
|
+
};
|
|
454
|
+
return { status: 'terminal' };
|
|
455
|
+
}
|
|
456
|
+
if (beforeEnd.injectCount > 0) {
|
|
457
|
+
continue;
|
|
458
|
+
}
|
|
459
|
+
break;
|
|
460
|
+
}
|
|
461
|
+
if (judged) {
|
|
462
|
+
const status = yield* handleEgressGate(policy, flow, state, profile, system.private);
|
|
463
|
+
const action = gateStatusToAction(status);
|
|
464
|
+
if (action) {
|
|
465
|
+
return action;
|
|
466
|
+
}
|
|
467
|
+
latestStructured = projectOutbound(state.attemptEvents).structured ?? latestStructured;
|
|
468
|
+
}
|
|
469
|
+
if (validation) {
|
|
470
|
+
const status = await handleValidationGate(validation, flow, state, profile, latestStructured);
|
|
471
|
+
if (status !== 'pass') {
|
|
472
|
+
yield status;
|
|
473
|
+
return { status: 'continue' };
|
|
474
|
+
}
|
|
475
|
+
}
|
|
476
|
+
if (validation || judged) {
|
|
477
|
+
// why: Progressive-yield already released text and media live under egress — unless it
|
|
478
|
+
// withheld them mid-stream. A passing final verdict on the full text supersedes
|
|
479
|
+
// that partial-window decision, so the buffer is released instead of dropped.
|
|
480
|
+
const heldVisible = state.withheldVisible || holdsVisible(profile, flow.currentGen);
|
|
481
|
+
yield* yieldBufferedAttemptEvents(state.attemptEvents, !heldVisible, flow.currentGen);
|
|
482
|
+
}
|
|
483
|
+
return { status: 'success' };
|
|
484
|
+
}
|
|
485
|
+
async function* runAttemptsWithValidation(safe, profile, generation, system, provider, state) {
|
|
486
|
+
const { blockedReply } = resolveGuardrailPolicy(profile.guardrails);
|
|
487
|
+
// why: Each gate counts the attempts against its own cap; the turn runs while either has one left.
|
|
488
|
+
const maxRetries = Math.max(profileTurnOutputs(profile)?.validation?.maxRetries ?? 0, blockedReply.onBlock === 'retry' ? blockedReply.maxRetries : 0);
|
|
489
|
+
const flow = {
|
|
490
|
+
currentAttempt: 0,
|
|
491
|
+
currentGen: generation,
|
|
492
|
+
currentReq: safe,
|
|
493
|
+
};
|
|
494
|
+
while (flow.currentAttempt <= maxRetries) {
|
|
495
|
+
throwIfAborted(safe.signal);
|
|
496
|
+
const step = yield* executeSingleAttemptCycle({
|
|
497
|
+
flow,
|
|
498
|
+
state,
|
|
499
|
+
profile,
|
|
500
|
+
system,
|
|
501
|
+
provider,
|
|
502
|
+
});
|
|
503
|
+
if (step.status === 'terminal' || step.status === 'success') {
|
|
504
|
+
break;
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
}
|
|
508
|
+
export { runAttemptsWithValidation };
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import type { TraceSink } from '../../../observability/trace-sink.js';
|
|
2
|
+
import type { ProviderHostOptions } from '../../protocols/runtime.js';
|
|
3
|
+
import type { KernelRegistry } from '../../registry/kernel-registry.js';
|
|
4
|
+
import type { AgentCaller } from '../../tools/agent.js';
|
|
5
|
+
import type { InvokeToolRequest } from '../../tools/types.js';
|
|
6
|
+
import type { CompactHistoryRequest, CompactionResult, SessionRequest, TurnEvent, TurnModel, TurnRequest } from '../../types.js';
|
|
7
|
+
/**
|
|
8
|
+
* The trace record is written however the turn ends, including when the host stops reading early;
|
|
9
|
+
* spans still open then close as `ERROR` / `unclosed`.
|
|
10
|
+
*/
|
|
11
|
+
declare function runTurnInRegistry(registry: KernelRegistry, req: TurnRequest, provider: TurnModel, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
|
|
12
|
+
/**
|
|
13
|
+
* A host's own call's agent tools: the host's provider, or the one `onAgentCall`
|
|
14
|
+
* returns, runs each. Its nested turns bind their canaries into `canaries`.
|
|
15
|
+
*/
|
|
16
|
+
declare function invokeAgentCaller(registry: KernelRegistry, request: InvokeToolRequest, canaries: string[]): AgentCaller;
|
|
17
|
+
/**
|
|
18
|
+
* A live session's agent tools: the session's own provider options, or those
|
|
19
|
+
* `onAgentCall` returns, run each. Its nested turns bind their canaries into
|
|
20
|
+
* `canaries`.
|
|
21
|
+
*/
|
|
22
|
+
declare function sessionAgentCaller(registry: KernelRegistry, req: Pick<SessionRequest, 'onAgentCall' | 'metadata'>, options: ProviderHostOptions & Pick<TurnRequest, 'execution'>, canaries: string[]): AgentCaller;
|
|
23
|
+
/**
|
|
24
|
+
* `timing: 'after'`: run the compactor on the history `done.compaction` carried,
|
|
25
|
+
* with the same split, failure rules, and trace as `before`. `provider` runs the
|
|
26
|
+
* compactor. `undefined` when the split leaves nothing to compact.
|
|
27
|
+
*/
|
|
28
|
+
declare function compactHistoryInRegistry(registry: KernelRegistry, req: CompactHistoryRequest, provider: TurnModel, sinkOverride?: TraceSink): Promise<CompactionResult | undefined>;
|
|
29
|
+
export { compactHistoryInRegistry, invokeAgentCaller, runTurnInRegistry, sessionAgentCaller };
|