@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,376 @@
|
|
|
1
|
+
import { isStreamedCanaryEvent } from '../../../guardrails/canary.js';
|
|
2
|
+
import { detectEvent, leakScopeOf } from '../../../guardrails/detect-at.js';
|
|
3
|
+
import { eventLeak, isPromptLeakHit, promptLeakReason, 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 { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
|
|
7
|
+
import { createDraftGate, createOutboundProgressiveGate, DraftReader, } from '../../../guardrails/progressive-yield.js';
|
|
8
|
+
import { EGRESS_RULES } from '../../../guardrails/rules.js';
|
|
9
|
+
import { thoughtGuardFor, } from '../../../guardrails/thought-guard.js';
|
|
10
|
+
import { profileTurnOutputs } from '../../registry/profile-outputs.js';
|
|
11
|
+
import { toolArgumentsBoundary } from '../../tools/execute.js';
|
|
12
|
+
function shouldSkipStreamEvent(event, profile) {
|
|
13
|
+
return (event.type === 'thought' && profileTurnOutputs(profile)?.streaming?.streamThoughts === false);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* A leak in an event that is not the reply's text ends the turn there: the
|
|
17
|
+
* event never reaches the host, and it has no text to replace.
|
|
18
|
+
*/
|
|
19
|
+
function* yieldLeakStop(hits) {
|
|
20
|
+
if (hits.some((hit) => hit.rule === EGRESS_RULES.providerToolLeak)) {
|
|
21
|
+
yield* yieldDeltaBlock(hits);
|
|
22
|
+
}
|
|
23
|
+
else {
|
|
24
|
+
yield* yieldDetected('reply', { action: 'block', hits });
|
|
25
|
+
}
|
|
26
|
+
const reason = promptLeakReason(hits);
|
|
27
|
+
yield toErrorEvent(new TheoremError('safety', reason));
|
|
28
|
+
// why: The turn ends because our guardrail blocked the output, not because the model finished.
|
|
29
|
+
const native = reason === WITHHELD_REASON.canary
|
|
30
|
+
? 'canary'
|
|
31
|
+
: reason === WITHHELD_REASON.promptEcho
|
|
32
|
+
? 'prompt_echo'
|
|
33
|
+
: 'provider_tool_leak';
|
|
34
|
+
yield { type: 'done', stop: { kind: 'filtered', native } };
|
|
35
|
+
}
|
|
36
|
+
function* yieldDeltaBlock(hits) {
|
|
37
|
+
const guardrail = guardrailFromHits('output_delta', 'untrusted', hits, 'block');
|
|
38
|
+
if (guardrail) {
|
|
39
|
+
yield guardrail;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
/** What `guardrails.detect` found at `boundary` in text released as it streamed. */
|
|
43
|
+
function* yieldDetected(boundary, found) {
|
|
44
|
+
const event = found && detectEvent(boundary, found, undefined, STREAMED_STAGE[boundary]);
|
|
45
|
+
if (event)
|
|
46
|
+
yield guardrailTurnEvent(event);
|
|
47
|
+
}
|
|
48
|
+
/** The stage a boundary reports under while its text streams, where that is not its own. */
|
|
49
|
+
const STREAMED_STAGE = { reply: 'output_delta' };
|
|
50
|
+
/** What the guard released, after the events saying what was found in it and omitted from it. */
|
|
51
|
+
function* yieldThought({ text, hits, found }, event) {
|
|
52
|
+
yield* yieldDetected('thought', found);
|
|
53
|
+
const guardrail = guardrailFromHits('thought', 'untrusted', hits, 'redact');
|
|
54
|
+
if (guardrail)
|
|
55
|
+
yield guardrail;
|
|
56
|
+
if (text)
|
|
57
|
+
yield { ...event, text };
|
|
58
|
+
}
|
|
59
|
+
/** The thought held at the end of a call, and what the next call's thoughts read on from. */
|
|
60
|
+
function* flushThoughts(thoughts, control) {
|
|
61
|
+
if (!thoughts)
|
|
62
|
+
return;
|
|
63
|
+
yield* yieldThought(thoughts.flush(), { type: 'thought', text: '' });
|
|
64
|
+
if (control)
|
|
65
|
+
control.thoughtCarry = thoughts.carryOut();
|
|
66
|
+
}
|
|
67
|
+
/** Host-visible output a mid-stream block withholds. A thought is never withheld, only omitted from. */
|
|
68
|
+
function isWithheldOnBlock(event) {
|
|
69
|
+
return event.type === 'text' || event.type === 'media';
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* An event as the host gets it, or nothing. The text of a call that asked for structured output is
|
|
73
|
+
* that output's JSON: under `sse` it goes out as `structured_draft`, and under `buffered` not at all,
|
|
74
|
+
* since the `structured` event is the reply whole. The turn keeps it as text, which its checks,
|
|
75
|
+
* repairs and history read.
|
|
76
|
+
*/
|
|
77
|
+
function shownToHost(event, generation) {
|
|
78
|
+
if (!generation.structured || event.type !== 'text')
|
|
79
|
+
return event;
|
|
80
|
+
return generation.stream === false ? undefined : { type: 'structured_draft', text: event.text };
|
|
81
|
+
}
|
|
82
|
+
/**
|
|
83
|
+
* A step's events as the host gets them (`shownToHost`), with a structured reply's drafts read
|
|
84
|
+
* first at `reply_structured`, where the whole is read. The reply's text has already passed the
|
|
85
|
+
* `reply` gate; a match at `reply_structured` stops the drafts, and the `structured` event still
|
|
86
|
+
* arrives as that check leaves it. The held tail is read and released when the step's stream ends.
|
|
87
|
+
*/
|
|
88
|
+
class StructuredDrafts {
|
|
89
|
+
drafts;
|
|
90
|
+
generation;
|
|
91
|
+
/** Reads the stream's own checks off what the step knows of the turn. */
|
|
92
|
+
constructor(seen) {
|
|
93
|
+
const policy = resolveGuardrailPolicy(seen.profile.guardrails);
|
|
94
|
+
const context = streamContext(seen, policy);
|
|
95
|
+
this.drafts = new DraftReader(() => createDraftGate(policy, context, 'reply_structured'));
|
|
96
|
+
this.generation = seen.generation;
|
|
97
|
+
}
|
|
98
|
+
async *show(event) {
|
|
99
|
+
const shown = shownToHost(event, this.generation);
|
|
100
|
+
if (shown?.type !== 'structured_draft') {
|
|
101
|
+
if (shown)
|
|
102
|
+
yield shown;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const text = await this.drafts.read(shown.text);
|
|
106
|
+
if (text)
|
|
107
|
+
yield { ...shown, text };
|
|
108
|
+
}
|
|
109
|
+
/** The drafts' tail the gate still holds, once the step's stream has ended. */
|
|
110
|
+
*end() {
|
|
111
|
+
const text = this.drafts.end();
|
|
112
|
+
if (text)
|
|
113
|
+
yield { type: 'structured_draft', text };
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Events read at a boundary of their own, not with the reply's text: the
|
|
118
|
+
* model's tool call at its `tool_arguments` boundary, and the structured
|
|
119
|
+
* output at `reply_structured`.
|
|
120
|
+
*/
|
|
121
|
+
function isReadElsewhere(event) {
|
|
122
|
+
return event.type === 'structured' || event.type === 'tool';
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* The tool calls the model is drafting, each through a gate of its own at the boundary its call is
|
|
126
|
+
* read at (`createDraftGate`). A draft is a preview: one its gate stops, or whose tool's name
|
|
127
|
+
* changes, shows nothing more, and the call itself is still read whole. A draft's gate closes when
|
|
128
|
+
* its call arrives; its held tail is not released, because the call shows all of it.
|
|
129
|
+
*/
|
|
130
|
+
class ToolDrafts {
|
|
131
|
+
policy;
|
|
132
|
+
context;
|
|
133
|
+
tools;
|
|
134
|
+
drafts = new Map();
|
|
135
|
+
constructor(policy, context, tools) {
|
|
136
|
+
this.policy = policy;
|
|
137
|
+
this.context = context;
|
|
138
|
+
this.tools = tools;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Shows `event` when it is a draft and says whether it was; any other event closes its call's
|
|
142
|
+
* draft. Nothing shows while the reply is `withheld`.
|
|
143
|
+
*/
|
|
144
|
+
async *take(event, withheld, timed) {
|
|
145
|
+
if (event.type !== 'tool_draft') {
|
|
146
|
+
this.close(event);
|
|
147
|
+
return false;
|
|
148
|
+
}
|
|
149
|
+
// why: A withheld reply is judged whole when its attempt ends; nothing more of it previews before then.
|
|
150
|
+
if (!withheld)
|
|
151
|
+
yield* this.release(event, timed);
|
|
152
|
+
return true;
|
|
153
|
+
}
|
|
154
|
+
async *release(event, timed) {
|
|
155
|
+
const draft = this.drafts.get(event.callId) ?? (await this.open(event));
|
|
156
|
+
if (draft === 'stopped')
|
|
157
|
+
return;
|
|
158
|
+
if (draft.name !== event.name) {
|
|
159
|
+
this.drafts.set(event.callId, 'stopped');
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
if (!draft.gate) {
|
|
163
|
+
yield event;
|
|
164
|
+
return;
|
|
165
|
+
}
|
|
166
|
+
const { gate } = draft;
|
|
167
|
+
// why: What the gate finds is reported once, by the check on the whole call.
|
|
168
|
+
const result = await timed('tool_draft', () => gate.process(event.text));
|
|
169
|
+
if (result.blocked) {
|
|
170
|
+
this.drafts.set(event.callId, 'stopped');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
if (result.emit)
|
|
174
|
+
yield { ...event, text: result.emit };
|
|
175
|
+
}
|
|
176
|
+
close(event) {
|
|
177
|
+
if (event.type === 'tool')
|
|
178
|
+
this.drafts.delete(event.tool.callId);
|
|
179
|
+
}
|
|
180
|
+
async open(event) {
|
|
181
|
+
const boundary = toolArgumentsBoundary(this.tools, event.name);
|
|
182
|
+
const gate = boundary ? await createDraftGate(this.policy, this.context, boundary) : null;
|
|
183
|
+
const draft = { name: event.name, gate };
|
|
184
|
+
this.drafts.set(event.callId, draft);
|
|
185
|
+
return draft;
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
/** What the stream's checks know of the turn. */
|
|
189
|
+
function streamContext(args, policy) {
|
|
190
|
+
const { profile, privateSystem, canaryGiven } = args;
|
|
191
|
+
const { canary } = args.generation;
|
|
192
|
+
return {
|
|
193
|
+
stage: 'output_final',
|
|
194
|
+
trust: 'untrusted',
|
|
195
|
+
profileId: profile.id,
|
|
196
|
+
...(profile.labels ? { labels: profile.labels } : {}),
|
|
197
|
+
...leakScopeOf(policy.detect, { canary, canaryGiven, privateSystem }),
|
|
198
|
+
givenUrls: args.givenUrls,
|
|
199
|
+
...(args.ownTools ? { ownTools: args.ownTools } : {}),
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
async function* yieldProviderEvents(args) {
|
|
203
|
+
const { profile, request, provider, call, signal, control } = args;
|
|
204
|
+
/** Runs one stream check and adds the run to the call's record of that check. */
|
|
205
|
+
async function timed(check, run) {
|
|
206
|
+
const start = performance.now();
|
|
207
|
+
try {
|
|
208
|
+
return await run();
|
|
209
|
+
}
|
|
210
|
+
finally {
|
|
211
|
+
call.guardTime?.(check, performance.now() - start);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
const policy = resolveGuardrailPolicy(profile.guardrails);
|
|
215
|
+
const context = streamContext(args, policy);
|
|
216
|
+
const { canaryCarry, thoughtCarry } = control ?? {};
|
|
217
|
+
const gate = await createOutboundProgressiveGate(policy, context, 'reply', canaryCarry);
|
|
218
|
+
const thoughts = await thoughtGuardFor(policy, context, thoughtCarry);
|
|
219
|
+
const drafts = new ToolDrafts(policy, context, args.tools);
|
|
220
|
+
/** The streamed event whose reply sits in the gate's lookback; released tails keep its shape. */
|
|
221
|
+
let pendingStream = null;
|
|
222
|
+
let withholdVisible = false;
|
|
223
|
+
/**
|
|
224
|
+
* A leak the gate stopped on goes to the end-of-attempt verdict, which reads
|
|
225
|
+
* the whole reply for it: one that reading misses still blocks.
|
|
226
|
+
*/
|
|
227
|
+
function recordPromptLeak(hits) {
|
|
228
|
+
const leaks = hits.filter(isPromptLeakHit);
|
|
229
|
+
if (control && leaks.length > 0)
|
|
230
|
+
control.promptLeaks = leaks;
|
|
231
|
+
}
|
|
232
|
+
function armWithhold() {
|
|
233
|
+
withholdVisible = true;
|
|
234
|
+
if (control)
|
|
235
|
+
control.withholdVisible = true;
|
|
236
|
+
}
|
|
237
|
+
function withholding() {
|
|
238
|
+
return withholdVisible;
|
|
239
|
+
}
|
|
240
|
+
async function* drainBlockedDelta(hits, template) {
|
|
241
|
+
yield* yieldDeltaBlock(hits);
|
|
242
|
+
// why: Arm withhold before recording the unreleased tail so the step runner
|
|
243
|
+
// does not forward that text to the host.
|
|
244
|
+
armWithhold();
|
|
245
|
+
const tail = gate?.drainUnreleased();
|
|
246
|
+
if (tail)
|
|
247
|
+
yield { ...template, text: tail };
|
|
248
|
+
}
|
|
249
|
+
async function* flushGate() {
|
|
250
|
+
if (!(gate && pendingStream)) {
|
|
251
|
+
return 'pass';
|
|
252
|
+
}
|
|
253
|
+
const template = pendingStream;
|
|
254
|
+
const result = await timed('output_stream', () => gate.flush());
|
|
255
|
+
pendingStream = null;
|
|
256
|
+
return (yield* releaseOrBlock(result, template)) === 'stop' ? 'stop' : 'pass';
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Act on one gate step: release what it cleared, or withhold the rest of the
|
|
260
|
+
* reply for the verdict on the whole of it.
|
|
261
|
+
*/
|
|
262
|
+
async function* releaseOrBlock(result, template) {
|
|
263
|
+
if (result.blocked) {
|
|
264
|
+
recordPromptLeak(result.hits);
|
|
265
|
+
// why: A detector's stop is reported once, by the verdict on the whole reply. The trace
|
|
266
|
+
// still records that this check is the one that stopped it.
|
|
267
|
+
const stopped = result.boundary &&
|
|
268
|
+
detectEvent(result.boundary, { action: 'block', hits: result.hits }, undefined, 'output_delta');
|
|
269
|
+
if (stopped)
|
|
270
|
+
call.guardrail?.(stopped);
|
|
271
|
+
yield* drainBlockedDelta(result.boundary ? [] : result.hits, template);
|
|
272
|
+
return 'go';
|
|
273
|
+
}
|
|
274
|
+
yield* yieldDetected('reply', result.found);
|
|
275
|
+
if (result.emit) {
|
|
276
|
+
yield { ...template, text: result.emit };
|
|
277
|
+
}
|
|
278
|
+
return 'go';
|
|
279
|
+
}
|
|
280
|
+
async function* gateStreamEvent(event) {
|
|
281
|
+
if (!gate) {
|
|
282
|
+
yield event;
|
|
283
|
+
return 'continue';
|
|
284
|
+
}
|
|
285
|
+
if (withholding()) {
|
|
286
|
+
// why: Keep recording ungated fragments for egress context; host will not see them.
|
|
287
|
+
yield { ...event, text: event.text ?? '' };
|
|
288
|
+
return 'continue';
|
|
289
|
+
}
|
|
290
|
+
pendingStream = event;
|
|
291
|
+
const result = await timed('output_stream', () => gate.process(event.text ?? ''));
|
|
292
|
+
return (yield* releaseOrBlock(result, event)) === 'stop' ? 'stop' : 'continue';
|
|
293
|
+
}
|
|
294
|
+
/** Whether a thought has streamed since the guard last flushed. */
|
|
295
|
+
let thinking = false;
|
|
296
|
+
/** A thought, through the guard when there is one; false for any other event. */
|
|
297
|
+
function* guardThought(event) {
|
|
298
|
+
if (event.type !== 'thought' || !thoughts)
|
|
299
|
+
return false;
|
|
300
|
+
thinking = true;
|
|
301
|
+
yield* yieldThought(thoughts.push(event.text), event);
|
|
302
|
+
return true;
|
|
303
|
+
}
|
|
304
|
+
/** The reply ends the thought: release its hold, as a call's end does, reading on from the carry. */
|
|
305
|
+
function* endThought() {
|
|
306
|
+
if (!thinking)
|
|
307
|
+
return;
|
|
308
|
+
thinking = false;
|
|
309
|
+
yield* flushThoughts(thoughts, control);
|
|
310
|
+
}
|
|
311
|
+
throwIfAborted(signal);
|
|
312
|
+
let providerFailed = false;
|
|
313
|
+
for await (const event of provider.complete({ ...request, signal, tapUpstream: call.tap })) {
|
|
314
|
+
call.observe(event);
|
|
315
|
+
throwIfAborted(signal);
|
|
316
|
+
if (event.type === 'response') {
|
|
317
|
+
// why: Identity is the trace's alone; the call span already recorded it.
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
if (event.type === 'reasoning') {
|
|
321
|
+
// why: Signed reasoning goes back to the model as it came; no one reads it in between.
|
|
322
|
+
yield event;
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
if (yield* guardThought(event))
|
|
326
|
+
continue;
|
|
327
|
+
if (isStreamedCanaryEvent(event)) {
|
|
328
|
+
yield* endThought();
|
|
329
|
+
const status = yield* gateStreamEvent(event);
|
|
330
|
+
if (status === 'stop') {
|
|
331
|
+
return;
|
|
332
|
+
}
|
|
333
|
+
continue;
|
|
334
|
+
}
|
|
335
|
+
// why: Release held reply text first so the host sees events in order.
|
|
336
|
+
const flushed = yield* flushGate();
|
|
337
|
+
if (flushed === 'stop') {
|
|
338
|
+
return;
|
|
339
|
+
}
|
|
340
|
+
if (yield* drafts.take(event, withholding(), timed))
|
|
341
|
+
continue;
|
|
342
|
+
const leak = isReadElsewhere(event)
|
|
343
|
+
? undefined
|
|
344
|
+
: await timed('stream_canary', () => eventLeak(event, context, policy.detect, 'reply'));
|
|
345
|
+
if (leak?.stop) {
|
|
346
|
+
yield* yieldLeakStop(leak.hits);
|
|
347
|
+
return;
|
|
348
|
+
}
|
|
349
|
+
if (leak)
|
|
350
|
+
yield* yieldDetected('reply', { action: 'flag', hits: leak.hits });
|
|
351
|
+
if (withholding() && isWithheldOnBlock(event)) {
|
|
352
|
+
// why: Record for attempt egress / repair; step runner withholds from host.
|
|
353
|
+
yield event;
|
|
354
|
+
continue;
|
|
355
|
+
}
|
|
356
|
+
if (event.type === 'error') {
|
|
357
|
+
providerFailed = true;
|
|
358
|
+
}
|
|
359
|
+
if (event.type === 'done')
|
|
360
|
+
yield* flushThoughts(thoughts, control);
|
|
361
|
+
yield event;
|
|
362
|
+
}
|
|
363
|
+
yield* flushThoughts(thoughts, control);
|
|
364
|
+
const flushed = yield* flushGate();
|
|
365
|
+
if (flushed === 'stop') {
|
|
366
|
+
return;
|
|
367
|
+
}
|
|
368
|
+
if (control && gate) {
|
|
369
|
+
control.canaryCarry = gate.carryOut();
|
|
370
|
+
}
|
|
371
|
+
if (providerFailed) {
|
|
372
|
+
// why: An error from the provider outranks any `done` it sent: the call's output is not whole.
|
|
373
|
+
yield { type: 'done', stop: { kind: 'provider_error' } };
|
|
374
|
+
}
|
|
375
|
+
}
|
|
376
|
+
export { isWithheldOnBlock, StructuredDrafts, shouldSkipStreamEvent, shownToHost, yieldProviderEvents, };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import type { ToolCallRequest } from '../../tools/types.js';
|
|
2
|
+
import type { InteractionPart, ModelEvent, ResolvedGeneration, TurnEventOf, TurnHistoryMessage, TurnTokens } from '../../types.js';
|
|
3
|
+
import { type TokenCount } from '../token-estimate.js';
|
|
4
|
+
type CallConversation = {
|
|
5
|
+
history: TurnHistoryMessage[];
|
|
6
|
+
input: InteractionPart[];
|
|
7
|
+
} | {
|
|
8
|
+
previous: CallUsage;
|
|
9
|
+
continuation: TurnHistoryMessage[];
|
|
10
|
+
};
|
|
11
|
+
/** What a call wrote that the output estimate counts: text, thoughts, media, and its tool calls. */
|
|
12
|
+
export type CallOutput = TurnEventOf<'text' | 'thought' | 'media'> | {
|
|
13
|
+
type: 'tool';
|
|
14
|
+
tool: ToolCallRequest;
|
|
15
|
+
};
|
|
16
|
+
interface CallUsage {
|
|
17
|
+
system: string;
|
|
18
|
+
/** Copied before the stream: the runner mutates history as tools run. */
|
|
19
|
+
conversation: CallConversation;
|
|
20
|
+
/** Context the provider already holds from earlier calls (a Live session). */
|
|
21
|
+
held?: TokenCount;
|
|
22
|
+
/** Last usage the provider reported for this call. */
|
|
23
|
+
reported?: TurnTokens;
|
|
24
|
+
output: CallOutput[];
|
|
25
|
+
failed: boolean;
|
|
26
|
+
}
|
|
27
|
+
declare function startCallUsage(system: string, conversation: CallConversation, held?: TokenCount): CallUsage;
|
|
28
|
+
/**
|
|
29
|
+
* Record one provider event. Returns true for a `tokens` event, which the
|
|
30
|
+
* runner holds instead of streaming; `callTokensEvent` emits it at call end.
|
|
31
|
+
*/
|
|
32
|
+
declare function observeCallEvent(usage: CallUsage, event: ModelEvent): boolean;
|
|
33
|
+
/**
|
|
34
|
+
* What the provider holds once `usage`'s call has ended: what it held before,
|
|
35
|
+
* what was sent for the call, and the call's output (not thoughts), counted
|
|
36
|
+
* as a continuation replays it.
|
|
37
|
+
*/
|
|
38
|
+
declare function heldAfter(usage: CallUsage): Promise<TokenCount>;
|
|
39
|
+
/**
|
|
40
|
+
* `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
|
|
41
|
+
* claim a completed read.
|
|
42
|
+
*/
|
|
43
|
+
declare function callTokensEvent(usage: CallUsage, generation: ResolvedGeneration): Promise<TurnEventOf<'tokens'> | undefined>;
|
|
44
|
+
export type { CallConversation, CallUsage };
|
|
45
|
+
export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import { loadTokenEstimator } from '../token-estimate.js';
|
|
2
|
+
function startCallUsage(system, conversation, held) {
|
|
3
|
+
return {
|
|
4
|
+
system,
|
|
5
|
+
...(held ? { held } : {}),
|
|
6
|
+
conversation: 'previous' in conversation
|
|
7
|
+
? { previous: conversation.previous, continuation: [...conversation.continuation] }
|
|
8
|
+
: { history: [...conversation.history], input: [...conversation.input] },
|
|
9
|
+
output: [],
|
|
10
|
+
failed: false,
|
|
11
|
+
};
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Record one provider event. Returns true for a `tokens` event, which the
|
|
15
|
+
* runner holds instead of streaming; `callTokensEvent` emits it at call end.
|
|
16
|
+
*/
|
|
17
|
+
function observeCallEvent(usage, event) {
|
|
18
|
+
switch (event.type) {
|
|
19
|
+
case 'tokens':
|
|
20
|
+
usage.reported = event.tokens;
|
|
21
|
+
return true;
|
|
22
|
+
case 'error':
|
|
23
|
+
usage.failed = true;
|
|
24
|
+
return false;
|
|
25
|
+
case 'tool':
|
|
26
|
+
// why: The model wrote its call; a provider's phase event about it (a malformed call's failure) it did not.
|
|
27
|
+
if (event.tool.phase === undefined)
|
|
28
|
+
usage.output.push({ type: 'tool', tool: event.tool });
|
|
29
|
+
return false;
|
|
30
|
+
case 'text':
|
|
31
|
+
case 'thought':
|
|
32
|
+
case 'media':
|
|
33
|
+
usage.output.push(event);
|
|
34
|
+
return false;
|
|
35
|
+
default:
|
|
36
|
+
return false;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
function addCounts(a, b) {
|
|
40
|
+
return { tokens: a.tokens + b.tokens, unknownMedia: a.unknownMedia + b.unknownMedia };
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* The output's streamed text as the model wrote it: consecutive chunks of one
|
|
44
|
+
* kind joined, so the estimate does not depend on how the stream was split.
|
|
45
|
+
*/
|
|
46
|
+
function textRuns(output, thoughts) {
|
|
47
|
+
const runs = [];
|
|
48
|
+
let kind;
|
|
49
|
+
for (const event of output) {
|
|
50
|
+
if (event.type === 'tool' || event.type === 'media') {
|
|
51
|
+
kind = undefined;
|
|
52
|
+
}
|
|
53
|
+
else if (event.text && (thoughts || event.type !== 'thought')) {
|
|
54
|
+
if (event.type === kind) {
|
|
55
|
+
runs.push(`${runs.pop() ?? ''}${event.text}`);
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
runs.push(event.text);
|
|
59
|
+
kind = event.type;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
return runs;
|
|
64
|
+
}
|
|
65
|
+
/** Output events counted; thoughts only when counting what the model wrote. */
|
|
66
|
+
async function countOutput(usage, thoughts) {
|
|
67
|
+
const estimator = await loadTokenEstimator();
|
|
68
|
+
const count = { tokens: 0, unknownMedia: 0 };
|
|
69
|
+
for (const event of usage.output) {
|
|
70
|
+
if (event.type === 'media') {
|
|
71
|
+
count.unknownMedia += 1;
|
|
72
|
+
}
|
|
73
|
+
else if (event.type === 'tool') {
|
|
74
|
+
count.tokens +=
|
|
75
|
+
estimator.text(event.tool.name) + estimator.text(JSON.stringify(event.tool.arguments));
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
for (const run of textRuns(usage.output, thoughts)) {
|
|
79
|
+
count.tokens += estimator.text(run);
|
|
80
|
+
}
|
|
81
|
+
return count;
|
|
82
|
+
}
|
|
83
|
+
async function countConversation(usage) {
|
|
84
|
+
const estimator = await loadTokenEstimator();
|
|
85
|
+
const { conversation } = usage;
|
|
86
|
+
if ('previous' in conversation) {
|
|
87
|
+
const earlier = await countConversation(conversation.previous);
|
|
88
|
+
const replayed = await countOutput(conversation.previous, false);
|
|
89
|
+
const continuation = estimator.messages(conversation.continuation);
|
|
90
|
+
return addCounts(addCounts(earlier, replayed), continuation);
|
|
91
|
+
}
|
|
92
|
+
const history = estimator.messages(conversation.history);
|
|
93
|
+
const sent = addCounts(history, estimator.parts(conversation.input));
|
|
94
|
+
return usage.held ? addCounts(usage.held, sent) : sent;
|
|
95
|
+
}
|
|
96
|
+
/**
|
|
97
|
+
* What the provider holds once `usage`'s call has ended: what it held before,
|
|
98
|
+
* what was sent for the call, and the call's output (not thoughts), counted
|
|
99
|
+
* as a continuation replays it.
|
|
100
|
+
*/
|
|
101
|
+
async function heldAfter(usage) {
|
|
102
|
+
return addCounts(await countConversation(usage), await countOutput(usage, false));
|
|
103
|
+
}
|
|
104
|
+
async function countPrompt(usage, generation) {
|
|
105
|
+
const estimator = await loadTokenEstimator();
|
|
106
|
+
const wire = generation.tools.wire;
|
|
107
|
+
const tools = wire.length > 0 ? estimator.text(JSON.stringify(wire)) : 0;
|
|
108
|
+
const schema = generation.structured
|
|
109
|
+
? estimator.text(JSON.stringify(generation.structured.jsonSchema))
|
|
110
|
+
: 0;
|
|
111
|
+
const conversation = await countConversation(usage);
|
|
112
|
+
return {
|
|
113
|
+
tokens: estimator.text(usage.system) + tools + schema + conversation.tokens,
|
|
114
|
+
unknownMedia: conversation.unknownMedia,
|
|
115
|
+
};
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
|
|
119
|
+
* claim a completed read.
|
|
120
|
+
*/
|
|
121
|
+
async function callTokensEvent(usage, generation) {
|
|
122
|
+
const reported = usage.reported;
|
|
123
|
+
if (!reported && usage.failed)
|
|
124
|
+
return undefined;
|
|
125
|
+
const estimated = reported ? (reported.estimated ?? []) : ['input', 'output'];
|
|
126
|
+
if (reported && estimated.length === 0)
|
|
127
|
+
return { type: 'tokens', tokens: reported };
|
|
128
|
+
const prompt = estimated.includes('input') ? await countPrompt(usage, generation) : undefined;
|
|
129
|
+
const written = estimated.includes('output') ? await countOutput(usage, true) : undefined;
|
|
130
|
+
const input = prompt?.tokens ?? reported?.input ?? 0;
|
|
131
|
+
const output = written?.tokens ?? reported?.output ?? 0;
|
|
132
|
+
const unknownMedia = {
|
|
133
|
+
...(prompt?.unknownMedia ? { input: prompt.unknownMedia } : {}),
|
|
134
|
+
...(written?.unknownMedia ? { output: written.unknownMedia } : {}),
|
|
135
|
+
};
|
|
136
|
+
return {
|
|
137
|
+
type: 'tokens',
|
|
138
|
+
tokens: {
|
|
139
|
+
...reported,
|
|
140
|
+
input,
|
|
141
|
+
output,
|
|
142
|
+
total: input + output,
|
|
143
|
+
estimated: [...estimated],
|
|
144
|
+
...(Object.keys(unknownMedia).length > 0 ? { unknownMedia } : {}),
|
|
145
|
+
},
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
|
|
@@ -0,0 +1,33 @@
|
|
|
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 { PageToolExecution, ToolExecutionCoordinator } from '../../tools/operation.js';
|
|
5
|
+
import type { KeyVault, LiveSession, SessionRequest } from '../../types.js';
|
|
6
|
+
export type { LiveSession, SessionRequest };
|
|
7
|
+
/** Options for opening a live session: the key vault, a provider's own settings, a WebSocket opener, how long a gated call waits for its decision, and the sign-in gate policy. */
|
|
8
|
+
export interface RunSessionOptions extends ProviderHostOptions {
|
|
9
|
+
execution?: ToolExecutionCoordinator;
|
|
10
|
+
pageExecution?: PageToolExecution;
|
|
11
|
+
/** The host's keys by slot; the session uses the slots its profile names. */
|
|
12
|
+
vault?: KeyVault;
|
|
13
|
+
/**
|
|
14
|
+
* Milliseconds a gated call waits for its decision (default 30 minutes). A later decision is
|
|
15
|
+
* refused (`session.gate_expired`), and the model reads the call as abandoned.
|
|
16
|
+
*/
|
|
17
|
+
gateTtlMs?: number;
|
|
18
|
+
/**
|
|
19
|
+
* `hold` (default): a sign-in gate waits for its decision, as any gate does. `answer`: the
|
|
20
|
+
* model reads the gate's pending note at once and the call is released, for a host whose
|
|
21
|
+
* sign-in finishes outside the session. A released call still takes its outcome for
|
|
22
|
+
* `gateTtlMs` (`executeTool` with a decision, or `answerToolCall`), which the model reads as
|
|
23
|
+
* the call's next result; unanswered by then, the model reads that the sign-in expired.
|
|
24
|
+
*/
|
|
25
|
+
signInGate?: SignInGatePolicy;
|
|
26
|
+
}
|
|
27
|
+
/** How a sign-in gate behaves in a live session: `hold` waits for the decision, `answer` tells the model the sign-in is pending and releases the call. */
|
|
28
|
+
export type SignInGatePolicy = 'hold' | 'answer';
|
|
29
|
+
/**
|
|
30
|
+
* The session record is written however the session ends, including when opening fails. An unknown
|
|
31
|
+
* profile fails to open and is recorded under the standard observability policy.
|
|
32
|
+
*/
|
|
33
|
+
export declare function runSessionInRegistry(registry: KernelRegistry, req: SessionRequest, options: RunSessionOptions, sinkOverride?: TraceSink): Promise<LiveSession>;
|