@theoremjs/agents 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +276 -995
- package/esm/mod.d.ts +33 -19
- package/esm/mod.js +18 -11
- package/esm/src/cli/commands/bench.js +36 -14
- package/esm/src/cli/commands/detect-compile.d.ts +17 -0
- package/esm/src/cli/commands/detect-compile.js +22 -0
- package/esm/src/cli/commands/eval.d.ts +3 -3
- package/esm/src/cli/commands/fuzz-canary.js +55 -16
- package/esm/src/cli/commands/profile.js +4 -4
- package/esm/src/cli/commands/run.d.ts +2 -2
- package/esm/src/cli/commands/run.js +1 -1
- package/esm/src/cli/commands/test.d.ts +4 -3
- package/esm/src/cli/commands/test.js +2 -2
- package/esm/src/cli/index.js +9 -9
- package/esm/src/cli/matrix/fixtures.js +25 -30
- package/esm/src/evals/attachments.d.ts +1 -0
- package/esm/src/evals/attachments.js +4 -2
- package/esm/src/evals/breakdown.d.ts +2 -0
- package/esm/src/evals/breakdown.js +1 -0
- package/esm/src/evals/graders/answer.d.ts +3 -0
- package/esm/src/evals/graders/answer.js +1 -0
- package/esm/src/evals/graders/code.d.ts +7 -31
- package/esm/src/evals/graders/code.js +4 -25
- package/esm/src/evals/graders/judge.d.ts +4 -0
- package/esm/src/evals/graders/judge.js +7 -5
- package/esm/src/evals/graders/latency.d.ts +1 -0
- package/esm/src/evals/graders/latency.js +3 -2
- package/esm/src/evals/graders/live.d.ts +3 -0
- package/esm/src/evals/graders/live.js +2 -0
- package/esm/src/evals/graders/media.js +1 -2
- package/esm/src/evals/graders/shared.js +1 -1
- package/esm/src/evals/graders/transcript.d.ts +2 -0
- package/esm/src/evals/graders/transcript.js +5 -3
- package/esm/src/evals/mod.d.ts +1 -9
- package/esm/src/evals/mod.js +1 -9
- package/esm/src/evals/record.d.ts +6 -0
- package/esm/src/evals/record.js +4 -2
- package/esm/src/evals/rubrics/mod.d.ts +1 -1
- package/esm/src/evals/rubrics/mod.js +1 -1
- package/esm/src/evals/rubrics/mustache.js +1 -1
- package/esm/src/evals/rubrics/types.js +1 -1
- package/esm/src/evals/run.d.ts +9 -52
- package/esm/src/evals/run.js +12 -46
- package/esm/src/evals/suite.d.ts +12 -3
- package/esm/src/evals/suite.js +9 -4
- package/esm/src/evals/summary.d.ts +3 -0
- package/esm/src/evals/summary.js +1 -0
- package/esm/src/evals/trial.d.ts +3 -16
- package/esm/src/evals/trial.js +7 -30
- package/esm/src/evals/types.d.ts +30 -121
- package/esm/src/evals/types.js +3 -16
- package/esm/src/evals/verdict.d.ts +5 -0
- package/esm/src/evals/verdict.js +4 -1
- package/esm/src/guardrails/boundaries.d.ts +41 -0
- package/esm/src/guardrails/boundaries.js +103 -0
- package/esm/src/guardrails/canary-gate.d.ts +1 -0
- package/esm/src/guardrails/canary.d.ts +49 -15
- package/esm/src/guardrails/canary.js +103 -30
- package/esm/src/guardrails/compile-egress.d.ts +6 -5
- package/esm/src/guardrails/compile-egress.js +6 -5
- package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
- package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
- package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
- package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
- package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
- package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
- package/esm/src/guardrails/corpus/live-attacks.js +6 -1
- package/esm/src/guardrails/corpus/mod.d.ts +1 -1
- package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
- package/esm/src/guardrails/corpus/secrets.js +2 -2
- package/esm/src/guardrails/corpus/strings.d.ts +1 -1
- package/esm/src/guardrails/corpus/strings.js +1 -1
- package/esm/src/guardrails/corpus/types.d.ts +5 -1
- package/esm/src/guardrails/credential-rules.d.ts +36 -0
- package/esm/src/guardrails/credential-rules.js +3001 -0
- package/esm/src/guardrails/credential-scan.d.ts +45 -0
- package/esm/src/guardrails/credential-scan.js +172 -0
- package/esm/src/guardrails/destinations.d.ts +45 -0
- package/esm/src/guardrails/destinations.js +234 -0
- package/esm/src/guardrails/detect-at.d.ts +107 -0
- package/esm/src/guardrails/detect-at.js +434 -0
- package/esm/src/guardrails/detect-reply.d.ts +61 -0
- package/esm/src/guardrails/detect-reply.js +95 -0
- package/esm/src/guardrails/detect-stream.d.ts +33 -0
- package/esm/src/guardrails/detect-stream.js +77 -0
- package/esm/src/guardrails/detectors.d.ts +216 -0
- package/esm/src/guardrails/detectors.js +503 -0
- package/esm/src/guardrails/egress-automata.d.ts +4 -6
- package/esm/src/guardrails/egress-automata.js +24095 -4572
- package/esm/src/guardrails/egress-compiler.d.ts +38 -16
- package/esm/src/guardrails/egress-compiler.js +254 -60
- package/esm/src/guardrails/egress-patterns.d.ts +4 -2
- package/esm/src/guardrails/egress-patterns.js +6 -2
- package/esm/src/guardrails/egress-stream.d.ts +54 -36
- package/esm/src/guardrails/egress-stream.js +253 -124
- package/esm/src/guardrails/egress-urls.d.ts +6 -3
- package/esm/src/guardrails/egress-urls.js +14 -22
- package/esm/src/guardrails/egress.d.ts +26 -86
- package/esm/src/guardrails/egress.js +59 -309
- package/esm/src/guardrails/error.d.ts +13 -8
- package/esm/src/guardrails/error.js +23 -18
- package/esm/src/guardrails/event-schemas.d.ts +46 -3
- package/esm/src/guardrails/event-schemas.js +12 -5
- package/esm/src/guardrails/events.d.ts +5 -1
- package/esm/src/guardrails/events.js +4 -1
- package/esm/src/guardrails/hints.d.ts +14 -0
- package/esm/src/guardrails/hints.js +57 -0
- package/esm/src/guardrails/hits.d.ts +7 -1
- package/esm/src/guardrails/hits.js +12 -1
- package/esm/src/guardrails/host-patterns.d.ts +85 -0
- package/esm/src/guardrails/host-patterns.js +173 -0
- package/esm/src/guardrails/injection-patterns.d.ts +6 -1
- package/esm/src/guardrails/injection-patterns.js +33 -1
- package/esm/src/guardrails/injection-reversed.d.ts +9 -0
- package/esm/src/guardrails/injection-reversed.js +49 -0
- package/esm/src/guardrails/injection.d.ts +17 -1
- package/esm/src/guardrails/injection.js +259 -36
- package/esm/src/guardrails/labels.d.ts +40 -0
- package/esm/src/guardrails/labels.js +874 -0
- package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
- package/esm/src/guardrails/live-outbound-gate.js +100 -107
- package/esm/src/guardrails/mod.d.ts +29 -21
- package/esm/src/guardrails/mod.js +18 -13
- package/esm/src/guardrails/network.d.ts +4 -0
- package/esm/src/guardrails/network.js +21 -19
- package/esm/src/guardrails/normalize.d.ts +15 -1
- package/esm/src/guardrails/normalize.js +34 -1
- package/esm/src/guardrails/policy.d.ts +2 -17
- package/esm/src/guardrails/policy.js +12 -41
- package/esm/src/guardrails/progressive-yield.d.ts +65 -24
- package/esm/src/guardrails/progressive-yield.js +191 -147
- package/esm/src/guardrails/prompt-echo.d.ts +4 -2
- package/esm/src/guardrails/prompt-echo.js +87 -6
- package/esm/src/guardrails/quota.d.ts +1 -0
- package/esm/src/guardrails/quota.js +1 -1
- package/esm/src/guardrails/rules.d.ts +20 -29
- package/esm/src/guardrails/rules.js +23 -30
- package/esm/src/guardrails/sanitize.d.ts +32 -15
- package/esm/src/guardrails/sanitize.js +100 -124
- package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
- package/esm/src/guardrails/sensitive-groups.js +12 -0
- package/esm/src/guardrails/sensitive.d.ts +16 -23
- package/esm/src/guardrails/sensitive.js +168 -47
- package/esm/src/guardrails/serialize.d.ts +1 -0
- package/esm/src/guardrails/testing.d.ts +4 -2
- package/esm/src/guardrails/testing.js +4 -2
- package/esm/src/guardrails/theorem-error.d.ts +4 -1
- package/esm/src/guardrails/theorem-error.js +3 -2
- package/esm/src/guardrails/thought-guard.d.ts +34 -13
- package/esm/src/guardrails/thought-guard.js +264 -64
- package/esm/src/guardrails/tool-directives.d.ts +29 -10
- package/esm/src/guardrails/tool-directives.js +133 -47
- package/esm/src/guardrails/tool-leak.d.ts +26 -0
- package/esm/src/guardrails/tool-leak.js +45 -0
- package/esm/src/guardrails/tool-result.d.ts +45 -14
- package/esm/src/guardrails/tool-result.js +94 -70
- package/esm/src/guardrails/types.d.ts +79 -71
- package/esm/src/guardrails/types.js +11 -7
- package/esm/src/host/client-turn.d.ts +29 -2
- package/esm/src/host/client-turn.js +46 -4
- package/esm/src/host/mint-trace.d.ts +1 -0
- package/esm/src/host/mint-trace.js +3 -2
- package/esm/src/host/mod.d.ts +2 -2
- package/esm/src/host/mod.js +1 -1
- package/esm/src/host/readStreamingJsonStringField.js +2 -43
- package/esm/src/host/reply.d.ts +6 -0
- package/esm/src/host/reply.js +7 -1
- package/esm/src/interface/blocks.d.ts +3 -0
- package/esm/src/interface/blocks.js +84 -14
- package/esm/src/interface/composer-actions.d.ts +4 -0
- package/esm/src/interface/composer-actions.js +5 -3
- package/esm/src/interface/draft.d.ts +6 -0
- package/esm/src/interface/draft.js +22 -11
- package/esm/src/interface/from-profile.d.ts +13 -1
- package/esm/src/interface/from-profile.js +66 -31
- package/esm/src/interface/history.d.ts +9 -3
- package/esm/src/interface/history.js +33 -24
- package/esm/src/interface/inputs.d.ts +1 -0
- package/esm/src/interface/inputs.js +3 -0
- package/esm/src/interface/mod.d.ts +4 -2
- package/esm/src/interface/mod.js +3 -2
- package/esm/src/interface/models.d.ts +7 -0
- package/esm/src/interface/models.js +5 -0
- package/esm/src/interface/pending.d.ts +9 -0
- package/esm/src/interface/pending.js +9 -3
- package/esm/src/interface/profile-interface.js +54 -40
- package/esm/src/interface/session.d.ts +12 -5
- package/esm/src/interface/session.js +17 -10
- package/esm/src/interface/stop.d.ts +13 -0
- package/esm/src/interface/stop.js +28 -0
- package/esm/src/interface/tool-calls.d.ts +14 -2
- package/esm/src/interface/tool-calls.js +64 -10
- package/esm/src/interface/tool-invoke.d.ts +2 -0
- package/esm/src/interface/tool-invoke.js +3 -1
- package/esm/src/interface/tool-media.d.ts +2 -0
- package/esm/src/interface/tool-media.js +2 -1
- package/esm/src/interface/types.d.ts +105 -40
- package/esm/src/interface/types.js +1 -0
- package/esm/src/kernel/api-catalog.d.ts +85 -0
- package/esm/src/kernel/api-catalog.js +229 -0
- package/esm/src/kernel/auth/crypto.d.ts +7 -2
- package/esm/src/kernel/auth/crypto.js +12 -10
- package/esm/src/kernel/auth/oauth.d.ts +2 -1
- package/esm/src/kernel/auth/oauth.js +23 -22
- package/esm/src/kernel/auth/typed-secret.js +2 -2
- package/esm/src/kernel/auth/types.d.ts +13 -0
- package/esm/src/kernel/checkpoint.d.ts +43 -0
- package/esm/src/kernel/checkpoint.js +58 -0
- package/esm/src/kernel/default-scope.d.ts +43 -5
- package/esm/src/kernel/default-scope.js +54 -5
- package/esm/src/kernel/engine/call-trace.d.ts +19 -0
- package/esm/src/kernel/engine/call-trace.js +29 -0
- package/esm/src/kernel/engine/compaction.d.ts +6 -5
- package/esm/src/kernel/engine/compaction.js +12 -11
- package/esm/src/kernel/engine/decision.d.ts +10 -8
- package/esm/src/kernel/engine/decision.js +173 -146
- package/esm/src/kernel/engine/embedding.d.ts +8 -0
- package/esm/src/kernel/engine/embedding.js +118 -0
- package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
- package/esm/src/kernel/engine/live-inbound.js +36 -11
- package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
- package/esm/src/kernel/engine/live-ingress.js +6 -1
- package/esm/src/kernel/engine/repair.js +12 -12
- package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
- package/esm/src/kernel/engine/runner/gates.js +287 -101
- package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
- package/esm/src/kernel/engine/runner/mod.js +107 -56
- package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
- package/esm/src/kernel/engine/runner/nested.js +134 -0
- package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
- package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
- package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
- package/esm/src/kernel/engine/runner/stages.js +1 -8
- package/esm/src/kernel/engine/runner/state.d.ts +33 -12
- package/esm/src/kernel/engine/runner/state.js +11 -1
- package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
- package/esm/src/kernel/engine/runner/step-order.js +165 -0
- package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
- package/esm/src/kernel/engine/runner/steps.js +328 -169
- package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
- package/esm/src/kernel/engine/runner/stream.js +197 -46
- package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
- package/esm/src/kernel/engine/runner/usage.js +12 -14
- package/esm/src/kernel/engine/session/mod.d.ts +8 -6
- package/esm/src/kernel/engine/session/mod.js +360 -129
- package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
- package/esm/src/kernel/engine/session/session-trace.js +41 -30
- package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
- package/esm/src/kernel/engine/token-estimate.js +14 -194
- package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
- package/esm/src/kernel/engine/tool-trace.js +2 -1
- package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
- package/esm/src/kernel/engine/turn-trace.js +28 -36
- package/esm/src/kernel/engine/usage.d.ts +6 -0
- package/esm/src/kernel/engine/usage.js +17 -0
- package/esm/src/kernel/interaction-parts.d.ts +3 -0
- package/esm/src/kernel/interaction-parts.js +18 -0
- package/esm/src/kernel/json.d.ts +10 -0
- package/esm/src/kernel/json.js +3 -0
- package/esm/src/kernel/mod.d.ts +38 -11
- package/esm/src/kernel/mod.js +22 -7
- package/esm/src/kernel/profile-graph.d.ts +11 -6
- package/esm/src/kernel/profile-graph.js +14 -7
- package/esm/src/kernel/profile-presence.d.ts +10 -1
- package/esm/src/kernel/profile-presence.js +90 -75
- package/esm/src/kernel/profile-scope.d.ts +7 -3
- package/esm/src/kernel/profile-scope.js +67 -55
- package/esm/src/kernel/protocols/binding.d.ts +65 -0
- package/esm/src/kernel/protocols/binding.js +125 -0
- package/esm/src/kernel/protocols/limits.d.ts +15 -0
- package/esm/src/kernel/protocols/limits.js +28 -0
- package/esm/src/kernel/protocols/mod.d.ts +5 -0
- package/esm/src/kernel/protocols/mod.js +5 -0
- package/esm/src/kernel/protocols/prices.d.ts +36 -0
- package/esm/src/kernel/protocols/prices.js +37 -0
- package/esm/src/kernel/protocols/protocol.d.ts +253 -0
- package/esm/src/kernel/protocols/protocol.js +253 -0
- package/esm/src/kernel/protocols/provider.d.ts +108 -0
- package/esm/src/kernel/protocols/provider.js +143 -0
- package/esm/src/kernel/protocols/runtime.d.ts +55 -0
- package/esm/src/kernel/protocols/runtime.js +534 -0
- package/esm/src/kernel/provider-budget.d.ts +32 -0
- package/esm/src/kernel/provider-budget.js +262 -0
- package/esm/src/kernel/provider-dispatch.d.ts +13 -0
- package/esm/src/kernel/provider-dispatch.js +36 -0
- package/esm/src/kernel/provider-live.d.ts +7 -0
- package/esm/src/kernel/provider-live.js +189 -0
- package/esm/src/kernel/provider-runtime.d.ts +57 -0
- package/esm/src/kernel/provider-runtime.js +524 -0
- package/esm/src/kernel/registry/attachments.d.ts +15 -4
- package/esm/src/kernel/registry/attachments.js +31 -22
- package/esm/src/kernel/registry/catalog.d.ts +6 -0
- package/esm/src/kernel/registry/catalog.js +9 -2
- package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
- package/esm/src/kernel/registry/embedding-rules.js +66 -0
- package/esm/src/kernel/registry/ingress.d.ts +6 -2
- package/esm/src/kernel/registry/ingress.js +55 -10
- package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
- package/esm/src/kernel/registry/kernel-registry.js +9 -2
- package/esm/src/kernel/registry/profile-outputs.js +4 -1
- package/esm/src/kernel/registry/profiles.d.ts +38 -14
- package/esm/src/kernel/registry/profiles.js +280 -205
- package/esm/src/kernel/registry/provider-request.d.ts +3 -3
- package/esm/src/kernel/registry/provider-request.js +5 -13
- package/esm/src/kernel/registry/resolve.d.ts +4 -1
- package/esm/src/kernel/registry/resolve.js +59 -58
- package/esm/src/kernel/registry/schemas.d.ts +3 -0
- package/esm/src/kernel/registry/schemas.js +3 -1
- package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
- package/esm/src/kernel/registry/slot-fill.js +22 -0
- package/esm/src/kernel/registry/system-prompt.js +7 -8
- package/esm/src/kernel/registry/vault.d.ts +14 -13
- package/esm/src/kernel/registry/vault.js +1 -14
- package/esm/src/kernel/schema.d.ts +100 -46
- package/esm/src/kernel/schema.js +499 -257
- package/esm/src/kernel/scope.d.ts +12 -5
- package/esm/src/kernel/scope.js +23 -3
- package/esm/src/kernel/stages.d.ts +38 -3
- package/esm/src/kernel/stages.js +82 -39
- package/esm/src/kernel/stop.d.ts +29 -6
- package/esm/src/kernel/stop.js +16 -4
- package/esm/src/kernel/system-parts.js +6 -6
- package/esm/src/kernel/tools/activity-label.d.ts +12 -6
- package/esm/src/kernel/tools/activity-label.js +258 -32
- package/esm/src/kernel/tools/agent.d.ts +66 -0
- package/esm/src/kernel/tools/agent.js +212 -0
- package/esm/src/kernel/tools/coordinate.d.ts +4 -0
- package/esm/src/kernel/tools/coordinate.js +165 -0
- package/esm/src/kernel/tools/events.d.ts +21 -6
- package/esm/src/kernel/tools/events.js +53 -18
- package/esm/src/kernel/tools/execute.d.ts +47 -11
- package/esm/src/kernel/tools/execute.js +508 -136
- package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
- package/esm/src/kernel/tools/gate-answer.js +17 -6
- package/esm/src/kernel/tools/handler-events.d.ts +45 -0
- package/esm/src/kernel/tools/handler-events.js +106 -0
- package/esm/src/kernel/tools/harness.d.ts +1 -0
- package/esm/src/kernel/tools/harness.js +2 -1
- package/esm/src/kernel/tools/http-limit.d.ts +27 -0
- package/esm/src/kernel/tools/http-limit.js +85 -0
- package/esm/src/kernel/tools/invoke.d.ts +27 -5
- package/esm/src/kernel/tools/invoke.js +223 -70
- package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
- package/esm/src/kernel/tools/mcp-sessions.js +13 -8
- package/esm/src/kernel/tools/mod.d.ts +4 -3
- package/esm/src/kernel/tools/mod.js +3 -2
- package/esm/src/kernel/tools/model-text.d.ts +10 -5
- package/esm/src/kernel/tools/model-text.js +18 -12
- package/esm/src/kernel/tools/operation.d.ts +76 -0
- package/esm/src/kernel/tools/operation.js +100 -0
- package/esm/src/kernel/tools/page-answer.d.ts +8 -0
- package/esm/src/kernel/tools/page-answer.js +19 -0
- package/esm/src/kernel/tools/permission.d.ts +11 -2
- package/esm/src/kernel/tools/permission.js +12 -12
- package/esm/src/kernel/tools/project.d.ts +4 -1
- package/esm/src/kernel/tools/project.js +32 -2
- package/esm/src/kernel/tools/registry.d.ts +9 -2
- package/esm/src/kernel/tools/registry.js +69 -10
- package/esm/src/kernel/tools/remote.d.ts +40 -6
- package/esm/src/kernel/tools/remote.js +219 -92
- package/esm/src/kernel/tools/resolve.d.ts +3 -0
- package/esm/src/kernel/tools/resolve.js +12 -4
- package/esm/src/kernel/tools/run.d.ts +28 -0
- package/esm/src/kernel/tools/run.js +86 -0
- package/esm/src/kernel/tools/schema.d.ts +3 -3
- package/esm/src/kernel/tools/schema.js +21 -100
- package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
- package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
- package/esm/src/kernel/tools/stage-run.d.ts +27 -4
- package/esm/src/kernel/tools/stage-run.js +75 -17
- package/esm/src/kernel/tools/types.d.ts +235 -25
- package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
- package/esm/src/kernel/tools/unchecked-output.js +18 -0
- package/esm/src/kernel/turn-events.d.ts +208 -31
- package/esm/src/kernel/turn-events.js +127 -9
- package/esm/src/kernel/types.d.ts +302 -161
- package/esm/src/kernel/util/base64.d.ts +2 -0
- package/esm/src/kernel/util/base64.js +2 -0
- package/esm/src/kernel/util/partial-json.d.ts +23 -0
- package/esm/src/kernel/util/partial-json.js +128 -0
- package/esm/src/kernel/util/record.d.ts +1 -0
- package/esm/src/kernel/util/record.js +1 -0
- package/esm/src/observability/destinations.d.ts +5 -0
- package/esm/src/observability/destinations.js +7 -2
- package/esm/src/observability/jsonl.d.ts +2 -2
- package/esm/src/observability/jsonl.js +15 -22
- package/esm/src/observability/mod.d.ts +3 -3
- package/esm/src/observability/mod.js +2 -2
- package/esm/src/observability/openinference.d.ts +1 -1
- package/esm/src/observability/openinference.js +3 -3
- package/esm/src/observability/otlp.d.ts +3 -0
- package/esm/src/observability/otlp.js +3 -3
- package/esm/src/observability/phoenix.d.ts +1 -0
- package/esm/src/observability/policy.d.ts +3 -0
- package/esm/src/observability/policy.js +5 -1
- package/esm/src/observability/resolve-policy.js +11 -5
- package/esm/src/observability/spans.d.ts +8 -2
- package/esm/src/observability/spans.js +21 -5
- package/esm/src/observability/trace-catalog.d.ts +19 -2
- package/esm/src/observability/trace-catalog.js +128 -87
- package/esm/src/observability/trace-record.js +22 -17
- package/esm/src/observability/trace-schema.d.ts +3 -0
- package/esm/src/observability/trace-schema.js +1 -1
- package/esm/src/observability/trace-sink.d.ts +1 -0
- package/esm/src/observability/trace-sink.js +1 -1
- package/esm/src/observability/trace-span.d.ts +7 -1
- package/esm/src/observability/trace-span.js +3 -1
- package/esm/src/observability/trace.d.ts +2 -0
- package/esm/src/observability/trace.js +4 -2
- package/esm/src/observability/types.d.ts +35 -11
- package/esm/src/observability/types.js +1 -1
- package/esm/src/presets/google/speech-voices.d.ts +1 -0
- package/esm/src/presets/google-limits.d.ts +1 -0
- package/esm/src/presets/google.d.ts +27 -12
- package/esm/src/presets/google.js +34 -25
- package/esm/src/presets/local.d.ts +26 -0
- package/esm/src/presets/local.js +30 -0
- package/esm/src/presets/mod.d.ts +5 -4
- package/esm/src/presets/mod.js +4 -4
- package/esm/src/presets/openrouter.d.ts +14 -1
- package/esm/src/presets/openrouter.js +19 -1
- package/esm/src/providers/embedding-limits.d.ts +7 -0
- package/esm/src/providers/embedding-limits.js +12 -0
- package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/embedding-protocol.js +125 -0
- package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/interactions-protocol.js +105 -0
- package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
- package/esm/src/providers/gemini/live-protocol.js +191 -0
- package/esm/src/providers/gemini/prices.d.ts +3 -0
- package/esm/src/providers/gemini/prices.js +63 -0
- package/esm/src/providers/gemini/provider.d.ts +7 -0
- package/esm/src/providers/gemini/provider.js +39 -0
- package/esm/src/providers/google/builtins.d.ts +14 -0
- package/esm/src/providers/google/builtins.js +57 -0
- package/esm/src/providers/google/grounding.d.ts +4 -4
- package/esm/src/providers/google/interactions/framing.d.ts +20 -8
- package/esm/src/providers/google/interactions/framing.js +85 -44
- package/esm/src/providers/google/interactions/steps.d.ts +5 -5
- package/esm/src/providers/google/interactions/steps.js +4 -4
- package/esm/src/providers/google/interactions/stream.d.ts +10 -11
- package/esm/src/providers/google/interactions/stream.js +33 -100
- package/esm/src/providers/google/live/framing.d.ts +15 -5
- package/esm/src/providers/google/live/framing.js +25 -25
- package/esm/src/providers/google/live/stream.d.ts +6 -44
- package/esm/src/providers/google/live/stream.js +3 -209
- package/esm/src/providers/google/urls.d.ts +1 -3
- package/esm/src/providers/google/urls.js +1 -3
- package/esm/src/providers/google/usage.js +2 -2
- package/esm/src/providers/live.d.ts +6 -0
- package/esm/src/providers/live.js +6 -0
- package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
- package/esm/src/providers/local/embedding-protocol.js +60 -0
- package/esm/src/providers/local/provider.d.ts +7 -0
- package/esm/src/providers/local/provider.js +28 -0
- package/esm/src/providers/mod.d.ts +28 -7
- package/esm/src/providers/mod.js +19 -3
- package/esm/src/providers/open-ai/protocol.d.ts +3 -0
- package/esm/src/providers/open-ai/protocol.js +189 -0
- package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
- package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
- package/esm/src/providers/openrouter/image.d.ts +0 -9
- package/esm/src/providers/openrouter/image.js +0 -153
- package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
- package/esm/src/providers/openrouter/images-protocol.js +82 -0
- package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/compat.js +6 -6
- package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
- package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
- package/esm/src/providers/openrouter/protocol.d.ts +8 -0
- package/esm/src/providers/openrouter/protocol.js +171 -0
- package/esm/src/providers/openrouter/provider.d.ts +10 -0
- package/esm/src/providers/openrouter/provider.js +50 -0
- package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
- package/esm/src/providers/shared/carried-tool-files.js +43 -0
- package/esm/src/providers/shared/pcm.js +2 -2
- package/esm/src/providers/shared/protocol-events.d.ts +8 -0
- package/esm/src/providers/shared/protocol-events.js +20 -0
- package/esm/src/providers/shared/response-identity.d.ts +2 -2
- package/esm/src/providers/shared/retry.d.ts +17 -0
- package/esm/src/providers/shared/retry.js +90 -0
- package/esm/src/providers/shared/sse.d.ts +0 -4
- package/esm/src/providers/shared/sse.js +50 -36
- package/esm/src/providers/shared/tool-args.d.ts +6 -7
- package/esm/src/providers/shared/tool-args.js +10 -6
- package/esm/src/providers/shared/tool-draft.d.ts +16 -0
- package/esm/src/providers/shared/tool-draft.js +14 -0
- package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
- package/esm/src/providers/shared/upstream-tape.js +1 -1
- package/esm/src/providers/system-one/protocol.d.ts +8 -0
- package/esm/src/providers/system-one/protocol.js +93 -0
- package/esm/src/providers/types.d.ts +48 -16
- package/esm/src/providers/types.js +2 -1
- package/esm/src/providers/typesafe/provider.d.ts +7 -0
- package/esm/src/providers/typesafe/provider.js +24 -0
- package/esm/src/surface/formats.d.ts +19 -1
- package/esm/src/surface/formats.js +68 -29
- package/esm/src/surface/mod.d.ts +4 -2
- package/esm/src/surface/mod.js +4 -2
- package/esm/src/surface/runtime.d.ts +4 -0
- package/esm/src/surface/runtime.js +2 -0
- package/esm/src/surface/tools.d.ts +2 -8
- package/esm/src/surface/tools.js +4 -22
- package/esm/src/surface/types.d.ts +6 -0
- package/package.json +5 -13
- package/esm/src/cli/commands/egress-compile.d.ts +0 -17
- package/esm/src/cli/commands/egress-compile.js +0 -25
- package/esm/src/guardrails/egress-policy.d.ts +0 -27
- package/esm/src/guardrails/egress-policy.js +0 -76
- package/esm/src/guardrails/egress-rules.d.ts +0 -54
- package/esm/src/guardrails/egress-rules.js +0 -49
- package/esm/src/guardrails/lexicon.d.ts +0 -30
- package/esm/src/guardrails/lexicon.js +0 -478
- package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
- package/esm/src/kernel/engine/media-probe/audio.js +0 -342
- package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
- package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
- package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/image.js +0 -171
- package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
- package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
- package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
- package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
- package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
- package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
- package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
- package/esm/src/kernel/engine/media-probe/opus.js +0 -23
- package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
- package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
- package/esm/src/kernel/engine/media-probe/video.js +0 -49
- package/esm/src/presets/typesafe.d.ts +0 -2
- package/esm/src/presets/typesafe.js +0 -2
- package/esm/src/providers/create-provider.d.ts +0 -21
- package/esm/src/providers/create-provider.js +0 -90
- package/esm/src/providers/decision/usage.d.ts +0 -3
- package/esm/src/providers/decision/usage.js +0 -25
- package/esm/src/providers/google/interactions/mod.d.ts +0 -2
- package/esm/src/providers/google/interactions/mod.js +0 -2
- package/esm/src/providers/google/keys.d.ts +0 -20
- package/esm/src/providers/google/keys.js +0 -87
- package/esm/src/providers/google/live/mod.d.ts +0 -7
- package/esm/src/providers/google/live/mod.js +0 -7
- package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
- package/esm/src/providers/google/live/openapi-schema.js +0 -42
- package/esm/src/providers/google/live/session.d.ts +0 -14
- package/esm/src/providers/google/live/session.js +0 -150
- package/esm/src/providers/local/local.d.ts +0 -12
- package/esm/src/providers/local/local.js +0 -186
- package/esm/src/providers/local/mod.d.ts +0 -8
- package/esm/src/providers/local/mod.js +0 -8
- package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
- package/esm/src/providers/openrouter/cache-control.js +0 -4
- package/esm/src/providers/openrouter/chat.d.ts +0 -64
- package/esm/src/providers/openrouter/chat.js +0 -490
- package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
- package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
- package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
- package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
- package/esm/src/providers/openrouter/speech.d.ts +0 -18
- package/esm/src/providers/openrouter/speech.js +0 -109
- package/esm/src/providers/probe.d.ts +0 -5
- package/esm/src/providers/probe.js +0 -15
- package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
- package/esm/src/providers/shared/builtin-wire.js +0 -9
- package/esm/src/providers/shared/vault.d.ts +0 -13
- package/esm/src/providers/shared/vault.js +0 -41
|
@@ -1,9 +1,11 @@
|
|
|
1
1
|
import type { GivenUrls } from '../../../guardrails/egress-urls.js';
|
|
2
|
+
import type { OwnTools } from '../../../guardrails/tool-leak.js';
|
|
2
3
|
import type { GuardrailHit } from '../../../guardrails/types.js';
|
|
3
|
-
import type {
|
|
4
|
+
import type { ToolRegistry } from '../../tools/registry.js';
|
|
5
|
+
import type { ModelEvent, ModelRequest, Profile, ResolvedGeneration, TurnEvent, TurnModel } from '../../types.js';
|
|
4
6
|
import type { CallTrace } from '../turn-trace.js';
|
|
5
7
|
/** What the stream yields to the step runner: every provider event but `response`, which only the trace reads. */
|
|
6
|
-
export type StreamEvent = Exclude<
|
|
8
|
+
export type StreamEvent = Exclude<ModelEvent, {
|
|
7
9
|
type: 'response';
|
|
8
10
|
}>;
|
|
9
11
|
interface OutboundStreamControl {
|
|
@@ -19,22 +21,51 @@ interface OutboundStreamControl {
|
|
|
19
21
|
/** What the turn's thoughts so far ended on (`ThoughtGuard.carryOut`): read in front of this call's, and replaced. */
|
|
20
22
|
thoughtCarry?: string;
|
|
21
23
|
}
|
|
22
|
-
declare function shouldSkipStreamEvent(event:
|
|
24
|
+
declare function shouldSkipStreamEvent(event: ModelEvent, profile: Profile): boolean;
|
|
23
25
|
/** Host-visible output a mid-stream block withholds. A thought is never withheld, only omitted from. */
|
|
24
|
-
declare function isWithheldOnBlock(event:
|
|
25
|
-
|
|
26
|
+
declare function isWithheldOnBlock(event: ModelEvent): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* An event as the host gets it, or nothing. The text of a call that asked for structured output is
|
|
29
|
+
* that output's JSON: under `sse` it goes out as `structured_draft`, and under `buffered` not at all,
|
|
30
|
+
* since the `structured` event is the reply whole. The turn keeps it as text, which its checks,
|
|
31
|
+
* repairs and history read.
|
|
32
|
+
*/
|
|
33
|
+
declare function shownToHost(event: TurnEvent, generation: Pick<ResolvedGeneration, 'structured' | 'stream'>): TurnEvent | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* A step's events as the host gets them (`shownToHost`), with a structured reply's drafts read
|
|
36
|
+
* first at `reply_structured`, where the whole is read. The reply's text has already passed the
|
|
37
|
+
* `reply` gate; a match at `reply_structured` stops the drafts, and the `structured` event still
|
|
38
|
+
* arrives as that check leaves it. The held tail is read and released when the step's stream ends.
|
|
39
|
+
*/
|
|
40
|
+
declare class StructuredDrafts {
|
|
41
|
+
private readonly drafts;
|
|
42
|
+
private readonly generation;
|
|
43
|
+
/** Reads the stream's own checks off what the step knows of the turn. */
|
|
44
|
+
constructor(seen: Pick<StreamArgs, 'profile' | 'generation' | 'privateSystem' | 'givenUrls' | 'canaryGiven' | 'ownTools'>);
|
|
45
|
+
show(event: TurnEvent): AsyncGenerator<TurnEvent>;
|
|
46
|
+
/** The drafts' tail the gate still holds, once the step's stream has ended. */
|
|
47
|
+
end(): Generator<TurnEvent>;
|
|
48
|
+
}
|
|
49
|
+
interface StreamArgs {
|
|
26
50
|
profile: Profile;
|
|
27
51
|
generation: ResolvedGeneration;
|
|
28
|
-
request:
|
|
52
|
+
request: ModelRequest;
|
|
29
53
|
/** The private stretches of `request.system` (`BoundSystem.private`). */
|
|
30
54
|
privateSystem: readonly string[];
|
|
31
|
-
provider:
|
|
55
|
+
provider: TurnModel;
|
|
32
56
|
/** This call's recorder: sees every tap row and every provider event before any gate. */
|
|
33
|
-
call: Pick<CallTrace, 'tap' | 'observe'> & Partial<Pick<CallTrace, 'guardTime'>>;
|
|
57
|
+
call: Pick<CallTrace, 'tap' | 'observe'> & Partial<Pick<CallTrace, 'guardTime' | 'guardrail'>>;
|
|
34
58
|
signal?: AbortSignal;
|
|
35
59
|
control?: OutboundStreamControl;
|
|
36
60
|
/** Every URL the model has been given this turn. */
|
|
37
61
|
givenUrls: GivenUrls;
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
62
|
+
/** Whether the model has been given the canary this turn. */
|
|
63
|
+
canaryGiven?: boolean;
|
|
64
|
+
/** The names of the profile's tools and of their parameters. */
|
|
65
|
+
ownTools?: OwnTools;
|
|
66
|
+
/** The turn's tools: a draft is read at the boundary its tool's calls are. */
|
|
67
|
+
tools: ToolRegistry;
|
|
68
|
+
}
|
|
69
|
+
declare function yieldProviderEvents(args: StreamArgs): AsyncGenerator<StreamEvent>;
|
|
70
|
+
export type { OutboundStreamControl, StreamArgs };
|
|
71
|
+
export { isWithheldOnBlock, StructuredDrafts, shouldSkipStreamEvent, shownToHost, yieldProviderEvents, };
|
|
@@ -1,20 +1,31 @@
|
|
|
1
1
|
import { isStreamedCanaryEvent } from '../../../guardrails/canary.js';
|
|
2
|
-
import {
|
|
2
|
+
import { detectEvent, leakScopeOf } from '../../../guardrails/detect-at.js';
|
|
3
|
+
import { eventLeak, isPromptLeakHit, promptLeakReason, WITHHELD_REASON, } from '../../../guardrails/egress.js';
|
|
3
4
|
import { TheoremError, throwIfAborted, toErrorEvent } from '../../../guardrails/error.js';
|
|
4
|
-
import { guardrailFromHits } from '../../../guardrails/events.js';
|
|
5
|
+
import { guardrailFromHits, guardrailTurnEvent } from '../../../guardrails/events.js';
|
|
5
6
|
import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
|
|
6
|
-
import { createOutboundProgressiveGate, } from '../../../guardrails/progressive-yield.js';
|
|
7
|
+
import { createDraftGate, createOutboundProgressiveGate, DraftReader, } from '../../../guardrails/progressive-yield.js';
|
|
8
|
+
import { EGRESS_RULES } from '../../../guardrails/rules.js';
|
|
7
9
|
import { thoughtGuardFor, } from '../../../guardrails/thought-guard.js';
|
|
8
10
|
import { profileTurnOutputs } from '../../registry/profile-outputs.js';
|
|
11
|
+
import { toolArgumentsBoundary } from '../../tools/execute.js';
|
|
9
12
|
function shouldSkipStreamEvent(event, profile) {
|
|
10
13
|
return (event.type === 'thought' && profileTurnOutputs(profile)?.streaming?.streamThoughts === false);
|
|
11
14
|
}
|
|
12
|
-
/**
|
|
13
|
-
|
|
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
|
+
}
|
|
15
26
|
const reason = promptLeakReason(hits);
|
|
16
27
|
yield toErrorEvent(new TheoremError('safety', reason));
|
|
17
|
-
// The turn ends because our guardrail blocked the output, not because the model finished.
|
|
28
|
+
// why: The turn ends because our guardrail blocked the output, not because the model finished.
|
|
18
29
|
const native = reason === WITHHELD_REASON.canary
|
|
19
30
|
? 'canary'
|
|
20
31
|
: reason === WITHHELD_REASON.promptEcho
|
|
@@ -28,8 +39,17 @@ function* yieldDeltaBlock(hits) {
|
|
|
28
39
|
yield guardrail;
|
|
29
40
|
}
|
|
30
41
|
}
|
|
31
|
-
/** What
|
|
32
|
-
function*
|
|
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);
|
|
33
53
|
const guardrail = guardrailFromHits('thought', 'untrusted', hits, 'redact');
|
|
34
54
|
if (guardrail)
|
|
35
55
|
yield guardrail;
|
|
@@ -48,11 +68,139 @@ function* flushThoughts(thoughts, control) {
|
|
|
48
68
|
function isWithheldOnBlock(event) {
|
|
49
69
|
return event.type === 'text' || event.type === 'media';
|
|
50
70
|
}
|
|
51
|
-
|
|
52
|
-
|
|
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
|
+
};
|
|
53
201
|
}
|
|
54
202
|
async function* yieldProviderEvents(args) {
|
|
55
|
-
const { profile,
|
|
203
|
+
const { profile, request, provider, call, signal, control } = args;
|
|
56
204
|
/** Runs one stream check and adds the run to the call's record of that check. */
|
|
57
205
|
async function timed(check, run) {
|
|
58
206
|
const start = performance.now();
|
|
@@ -63,27 +211,18 @@ async function* yieldProviderEvents(args) {
|
|
|
63
211
|
call.guardTime?.(check, performance.now() - start);
|
|
64
212
|
}
|
|
65
213
|
}
|
|
66
|
-
const { canary } = generation;
|
|
67
214
|
const policy = resolveGuardrailPolicy(profile.guardrails);
|
|
68
|
-
const context =
|
|
69
|
-
stage: 'output_final',
|
|
70
|
-
trust: 'untrusted',
|
|
71
|
-
profileId: profile.id,
|
|
72
|
-
...(profile.lexicon ? { lexicon: profile.lexicon } : {}),
|
|
73
|
-
...(canary ? { canary } : {}),
|
|
74
|
-
// The system prompt is guarded against echo alongside the canary that binds it.
|
|
75
|
-
...(canary && policy.promptEcho && privateSystem.length > 0 ? { privateSystem } : {}),
|
|
76
|
-
givenUrls,
|
|
77
|
-
};
|
|
215
|
+
const context = streamContext(args, policy);
|
|
78
216
|
const { canaryCarry, thoughtCarry } = control ?? {};
|
|
79
|
-
const gate = createOutboundProgressiveGate(policy, context, canaryCarry);
|
|
80
|
-
const thoughts = thoughtGuardFor(policy
|
|
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);
|
|
81
220
|
/** The streamed event whose reply sits in the gate's lookback; released tails keep its shape. */
|
|
82
221
|
let pendingStream = null;
|
|
83
222
|
let withholdVisible = false;
|
|
84
223
|
/**
|
|
85
|
-
*
|
|
86
|
-
*
|
|
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.
|
|
87
226
|
*/
|
|
88
227
|
function recordPromptLeak(hits) {
|
|
89
228
|
const leaks = hits.filter(isPromptLeakHit);
|
|
@@ -100,7 +239,7 @@ async function* yieldProviderEvents(args) {
|
|
|
100
239
|
}
|
|
101
240
|
async function* drainBlockedDelta(hits, template) {
|
|
102
241
|
yield* yieldDeltaBlock(hits);
|
|
103
|
-
// Arm withhold before recording the unreleased tail so the step runner
|
|
242
|
+
// why: Arm withhold before recording the unreleased tail so the step runner
|
|
104
243
|
// does not forward that text to the host.
|
|
105
244
|
armWithhold();
|
|
106
245
|
const tail = gate?.drainUnreleased();
|
|
@@ -117,19 +256,22 @@ async function* yieldProviderEvents(args) {
|
|
|
117
256
|
return (yield* releaseOrBlock(result, template)) === 'stop' ? 'stop' : 'pass';
|
|
118
257
|
}
|
|
119
258
|
/**
|
|
120
|
-
* Act on one gate step: release what it cleared, or
|
|
121
|
-
*
|
|
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.
|
|
122
261
|
*/
|
|
123
262
|
async function* releaseOrBlock(result, template) {
|
|
124
263
|
if (result.blocked) {
|
|
125
|
-
if (canary && canaryOnlyImmediateStop(policy)) {
|
|
126
|
-
yield* yieldCanaryLeak(result.hits);
|
|
127
|
-
return 'stop';
|
|
128
|
-
}
|
|
129
264
|
recordPromptLeak(result.hits);
|
|
130
|
-
|
|
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);
|
|
131
272
|
return 'go';
|
|
132
273
|
}
|
|
274
|
+
yield* yieldDetected('reply', result.found);
|
|
133
275
|
if (result.emit) {
|
|
134
276
|
yield { ...template, text: result.emit };
|
|
135
277
|
}
|
|
@@ -141,7 +283,7 @@ async function* yieldProviderEvents(args) {
|
|
|
141
283
|
return 'continue';
|
|
142
284
|
}
|
|
143
285
|
if (withholding()) {
|
|
144
|
-
// Keep recording ungated fragments for egress context; host will not see them.
|
|
286
|
+
// why: Keep recording ungated fragments for egress context; host will not see them.
|
|
145
287
|
yield { ...event, text: event.text ?? '' };
|
|
146
288
|
return 'continue';
|
|
147
289
|
}
|
|
@@ -172,7 +314,12 @@ async function* yieldProviderEvents(args) {
|
|
|
172
314
|
call.observe(event);
|
|
173
315
|
throwIfAborted(signal);
|
|
174
316
|
if (event.type === 'response') {
|
|
175
|
-
// Identity is the trace's alone; the call span already recorded it.
|
|
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;
|
|
176
323
|
continue;
|
|
177
324
|
}
|
|
178
325
|
if (yield* guardThought(event))
|
|
@@ -185,20 +332,24 @@ async function* yieldProviderEvents(args) {
|
|
|
185
332
|
}
|
|
186
333
|
continue;
|
|
187
334
|
}
|
|
188
|
-
// Release held reply text first so the host sees events in order.
|
|
335
|
+
// why: Release held reply text first so the host sees events in order.
|
|
189
336
|
const flushed = yield* flushGate();
|
|
190
337
|
if (flushed === 'stop') {
|
|
191
338
|
return;
|
|
192
339
|
}
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
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);
|
|
198
347
|
return;
|
|
199
348
|
}
|
|
349
|
+
if (leak)
|
|
350
|
+
yield* yieldDetected('reply', { action: 'flag', hits: leak.hits });
|
|
200
351
|
if (withholding() && isWithheldOnBlock(event)) {
|
|
201
|
-
// Record for attempt egress / repair; step runner withholds from host.
|
|
352
|
+
// why: Record for attempt egress / repair; step runner withholds from host.
|
|
202
353
|
yield event;
|
|
203
354
|
continue;
|
|
204
355
|
}
|
|
@@ -218,8 +369,8 @@ async function* yieldProviderEvents(args) {
|
|
|
218
369
|
control.canaryCarry = gate.carryOut();
|
|
219
370
|
}
|
|
220
371
|
if (providerFailed) {
|
|
221
|
-
// An error from the provider outranks any `done` it sent: the call's output is not whole.
|
|
372
|
+
// why: An error from the provider outranks any `done` it sent: the call's output is not whole.
|
|
222
373
|
yield { type: 'done', stop: { kind: 'provider_error' } };
|
|
223
374
|
}
|
|
224
375
|
}
|
|
225
|
-
export { isWithheldOnBlock, shouldSkipStreamEvent, yieldProviderEvents };
|
|
376
|
+
export { isWithheldOnBlock, StructuredDrafts, shouldSkipStreamEvent, shownToHost, yieldProviderEvents, };
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ToolCallRequest } from '../../tools/types.js';
|
|
2
|
-
import type { InteractionPart,
|
|
3
|
-
import { type
|
|
2
|
+
import type { InteractionPart, ModelEvent, ResolvedGeneration, TurnEventOf, TurnHistoryMessage, TurnTokens } from '../../types.js';
|
|
3
|
+
import { type TokenCount } from '../token-estimate.js';
|
|
4
4
|
type CallConversation = {
|
|
5
5
|
history: TurnHistoryMessage[];
|
|
6
6
|
input: InteractionPart[];
|
|
@@ -29,17 +29,17 @@ declare function startCallUsage(system: string, conversation: CallConversation,
|
|
|
29
29
|
* Record one provider event. Returns true for a `tokens` event, which the
|
|
30
30
|
* runner holds instead of streaming; `callTokensEvent` emits it at call end.
|
|
31
31
|
*/
|
|
32
|
-
declare function observeCallEvent(usage: CallUsage, event:
|
|
32
|
+
declare function observeCallEvent(usage: CallUsage, event: ModelEvent): boolean;
|
|
33
33
|
/**
|
|
34
34
|
* What the provider holds once `usage`'s call has ended: what it held before,
|
|
35
35
|
* what was sent for the call, and the call's output (not thoughts), counted
|
|
36
36
|
* as a continuation replays it.
|
|
37
37
|
*/
|
|
38
|
-
declare function heldAfter(usage: CallUsage
|
|
38
|
+
declare function heldAfter(usage: CallUsage): Promise<TokenCount>;
|
|
39
39
|
/**
|
|
40
40
|
* `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
|
|
41
41
|
* claim a completed read.
|
|
42
42
|
*/
|
|
43
|
-
declare function callTokensEvent(usage: CallUsage, generation: ResolvedGeneration
|
|
43
|
+
declare function callTokensEvent(usage: CallUsage, generation: ResolvedGeneration): Promise<TurnEventOf<'tokens'> | undefined>;
|
|
44
44
|
export type { CallConversation, CallUsage };
|
|
45
45
|
export { callTokensEvent, heldAfter, observeCallEvent, startCallUsage };
|
|
@@ -23,7 +23,7 @@ function observeCallEvent(usage, event) {
|
|
|
23
23
|
usage.failed = true;
|
|
24
24
|
return false;
|
|
25
25
|
case 'tool':
|
|
26
|
-
// The model wrote its call; a provider's phase event about it (a malformed call's failure) it did not.
|
|
26
|
+
// why: The model wrote its call; a provider's phase event about it (a malformed call's failure) it did not.
|
|
27
27
|
if (event.tool.phase === undefined)
|
|
28
28
|
usage.output.push({ type: 'tool', tool: event.tool });
|
|
29
29
|
return false;
|
|
@@ -80,17 +80,17 @@ async function countOutput(usage, thoughts) {
|
|
|
80
80
|
}
|
|
81
81
|
return count;
|
|
82
82
|
}
|
|
83
|
-
async function countConversation(usage
|
|
83
|
+
async function countConversation(usage) {
|
|
84
84
|
const estimator = await loadTokenEstimator();
|
|
85
85
|
const { conversation } = usage;
|
|
86
86
|
if ('previous' in conversation) {
|
|
87
|
-
const earlier = await countConversation(conversation.previous
|
|
87
|
+
const earlier = await countConversation(conversation.previous);
|
|
88
88
|
const replayed = await countOutput(conversation.previous, false);
|
|
89
|
-
const continuation =
|
|
89
|
+
const continuation = estimator.messages(conversation.continuation);
|
|
90
90
|
return addCounts(addCounts(earlier, replayed), continuation);
|
|
91
91
|
}
|
|
92
|
-
const history =
|
|
93
|
-
const sent = addCounts(history,
|
|
92
|
+
const history = estimator.messages(conversation.history);
|
|
93
|
+
const sent = addCounts(history, estimator.parts(conversation.input));
|
|
94
94
|
return usage.held ? addCounts(usage.held, sent) : sent;
|
|
95
95
|
}
|
|
96
96
|
/**
|
|
@@ -98,17 +98,17 @@ async function countConversation(usage, family) {
|
|
|
98
98
|
* what was sent for the call, and the call's output (not thoughts), counted
|
|
99
99
|
* as a continuation replays it.
|
|
100
100
|
*/
|
|
101
|
-
async function heldAfter(usage
|
|
102
|
-
return addCounts(await countConversation(usage
|
|
101
|
+
async function heldAfter(usage) {
|
|
102
|
+
return addCounts(await countConversation(usage), await countOutput(usage, false));
|
|
103
103
|
}
|
|
104
|
-
async function countPrompt(usage, generation
|
|
104
|
+
async function countPrompt(usage, generation) {
|
|
105
105
|
const estimator = await loadTokenEstimator();
|
|
106
106
|
const wire = generation.tools.wire;
|
|
107
107
|
const tools = wire.length > 0 ? estimator.text(JSON.stringify(wire)) : 0;
|
|
108
108
|
const schema = generation.structured
|
|
109
109
|
? estimator.text(JSON.stringify(generation.structured.jsonSchema))
|
|
110
110
|
: 0;
|
|
111
|
-
const conversation = await countConversation(usage
|
|
111
|
+
const conversation = await countConversation(usage);
|
|
112
112
|
return {
|
|
113
113
|
tokens: estimator.text(usage.system) + tools + schema + conversation.tokens,
|
|
114
114
|
unknownMedia: conversation.unknownMedia,
|
|
@@ -118,16 +118,14 @@ async function countPrompt(usage, generation, family) {
|
|
|
118
118
|
* `undefined` when the call failed with no usage: what was billed is unknown, and an estimate would
|
|
119
119
|
* claim a completed read.
|
|
120
120
|
*/
|
|
121
|
-
async function callTokensEvent(usage, generation
|
|
121
|
+
async function callTokensEvent(usage, generation) {
|
|
122
122
|
const reported = usage.reported;
|
|
123
123
|
if (!reported && usage.failed)
|
|
124
124
|
return undefined;
|
|
125
125
|
const estimated = reported ? (reported.estimated ?? []) : ['input', 'output'];
|
|
126
126
|
if (reported && estimated.length === 0)
|
|
127
127
|
return { type: 'tokens', tokens: reported };
|
|
128
|
-
const prompt = estimated.includes('input')
|
|
129
|
-
? await countPrompt(usage, generation, family)
|
|
130
|
-
: undefined;
|
|
128
|
+
const prompt = estimated.includes('input') ? await countPrompt(usage, generation) : undefined;
|
|
131
129
|
const written = estimated.includes('output') ? await countOutput(usage, true) : undefined;
|
|
132
130
|
const input = prompt?.tokens ?? reported?.input ?? 0;
|
|
133
131
|
const output = written?.tokens ?? reported?.output ?? 0;
|
|
@@ -1,14 +1,15 @@
|
|
|
1
1
|
import type { TraceSink } from '../../../observability/trace-sink.js';
|
|
2
|
-
import type {
|
|
2
|
+
import type { ProviderHostOptions } from '../../protocols/runtime.js';
|
|
3
3
|
import type { KernelRegistry } from '../../registry/kernel-registry.js';
|
|
4
|
+
import type { PageToolExecution, ToolExecutionCoordinator } from '../../tools/operation.js';
|
|
4
5
|
import type { KeyVault, LiveSession, SessionRequest } from '../../types.js';
|
|
5
6
|
export type { LiveSession, SessionRequest };
|
|
6
|
-
|
|
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;
|
|
7
11
|
/** The host's keys by slot; the session uses the slots its profile names. */
|
|
8
|
-
vault
|
|
9
|
-
gemini?: GeminiOptions;
|
|
10
|
-
/** Override socket open (Cloudflare fetch-upgrade, tests). Default: `new WebSocket(url)`. */
|
|
11
|
-
openWebSocket?: (url: string) => Promise<WebSocket>;
|
|
12
|
+
vault?: KeyVault;
|
|
12
13
|
/**
|
|
13
14
|
* Milliseconds a gated call waits for its decision (default 30 minutes). A later decision is
|
|
14
15
|
* refused (`session.gate_expired`), and the model reads the call as abandoned.
|
|
@@ -23,6 +24,7 @@ export interface RunSessionOptions {
|
|
|
23
24
|
*/
|
|
24
25
|
signInGate?: SignInGatePolicy;
|
|
25
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. */
|
|
26
28
|
export type SignInGatePolicy = 'hold' | 'answer';
|
|
27
29
|
/**
|
|
28
30
|
* The session record is written however the session ends, including when opening fails. An unknown
|