@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,19 +1,23 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { scopeOf } from '../../../guardrails/detect-at.js';
|
|
2
|
+
import { readReply, refusalAfter, replyAfter, standingBlock, TURN_REPLY, } from '../../../guardrails/detect-reply.js';
|
|
3
|
+
import { WITHHELD_REASON } from '../../../guardrails/egress.js';
|
|
2
4
|
import { TheoremError, throwIfAborted, toErrorEvent } from '../../../guardrails/error.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
+
import { guardrailFromHits, guardrailTurnEvent } from '../../../guardrails/events.js';
|
|
6
|
+
import { retryRejection } from '../../../guardrails/hints.js';
|
|
7
|
+
import { labelText } from '../../../guardrails/labels.js';
|
|
5
8
|
import { resolveGuardrailPolicy } from '../../../guardrails/policy.js';
|
|
9
|
+
import { replyIsJudged } from '../../../guardrails/progressive-yield.js';
|
|
6
10
|
import { sanitizeTurnRequest } from '../../../guardrails/sanitize.js';
|
|
7
11
|
import { resolveInputParts } from '../../registry/ingress.js';
|
|
8
12
|
import { profileTurnOutputs } from '../../registry/profile-outputs.js';
|
|
9
13
|
import { injectWouldExceedMaxSteps } from '../../stages.js';
|
|
10
14
|
import { findLast } from '../../util/find-last.js';
|
|
11
15
|
import { guardrailCheckAttributes } from '../turn-trace.js';
|
|
12
|
-
import { collectValidationFailures, formatValidationFailures } from './schema-validation.js';
|
|
16
|
+
import { collectItemFailures, collectValidationFailures, formatValidationFailures, itemSchemaAt, valueAt, withListAt, } from './schema-validation.js';
|
|
13
17
|
import { applyTurnStage } from './stages.js';
|
|
14
|
-
import { appendUserInput } from './state.js';
|
|
18
|
+
import { appendUserInput, } from './state.js';
|
|
15
19
|
import { executeAttempt } from './steps.js';
|
|
16
|
-
import { isWithheldOnBlock } from './stream.js';
|
|
20
|
+
import { isWithheldOnBlock, shownToHost } from './stream.js';
|
|
17
21
|
/** A turn whose final output the egress check blocked (withheld or replaced by policy copy). */
|
|
18
22
|
const EGRESS_FILTERED_STOP = { kind: 'filtered', native: 'egress' };
|
|
19
23
|
/** Reply text only: thoughts are not guarded output (`isGuardedOutput`). */
|
|
@@ -26,7 +30,7 @@ function collectAttemptText(events) {
|
|
|
26
30
|
}
|
|
27
31
|
return parts.join('');
|
|
28
32
|
}
|
|
29
|
-
// Structured output travels with the text so `outputs.structured` meets egress rather than passing unexamined.
|
|
33
|
+
// why: Structured output travels with the text so `outputs.structured` meets egress rather than passing unexamined.
|
|
30
34
|
function projectOutbound(events) {
|
|
31
35
|
const structured = findLast(events, (e) => e.type === 'structured')?.structured;
|
|
32
36
|
return {
|
|
@@ -47,56 +51,61 @@ function buildRepairRequest(safe, previousOutput, rejection, repairGuidance) {
|
|
|
47
51
|
},
|
|
48
52
|
};
|
|
49
53
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
const
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
...(
|
|
61
|
-
|
|
62
|
-
};
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
? {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
54
|
+
/** The verdict on an attempt's reply, as `guardrails.detect` reads it whole. */
|
|
55
|
+
function evaluateEgressOutcome(args) {
|
|
56
|
+
const { attemptEvents, request, profile, canRetry, promptLeaks } = args;
|
|
57
|
+
const { detect, blockedReply } = args.policy;
|
|
58
|
+
const written = projectOutbound(attemptEvents);
|
|
59
|
+
const scope = scopeOf(args.policy, {
|
|
60
|
+
canary: args.generation.canary,
|
|
61
|
+
canaryGiven: args.canaryGiven,
|
|
62
|
+
privateSystem: args.privateSystem,
|
|
63
|
+
givenUrls: args.givenUrls,
|
|
64
|
+
...(args.ownTools ? { ownTools: args.ownTools } : {}),
|
|
65
|
+
...(profile.labels ? { labels: profile.labels } : {}),
|
|
66
|
+
});
|
|
67
|
+
const read = readReply(written, detect, {
|
|
68
|
+
boundary: 'reply',
|
|
69
|
+
...(args.withheld ? { reportedTo: args.released.length } : {}),
|
|
70
|
+
scope,
|
|
71
|
+
});
|
|
72
|
+
const { payload } = read;
|
|
73
|
+
/** Text that takes the written reply's place, as the host receives it. */
|
|
74
|
+
const replacement = (text) => ({
|
|
75
|
+
action: 'refusal',
|
|
76
|
+
event: { type: 'text', text },
|
|
77
|
+
});
|
|
78
|
+
const stopped = standingBlock(read, promptLeaks);
|
|
79
|
+
// why: A detector's block is reported by its own event, which names the boundary.
|
|
80
|
+
const judged = stopped && stopped !== read.blocked
|
|
81
|
+
? guardrailFromHits('output_final', 'untrusted', stopped, 'block')
|
|
82
|
+
: undefined;
|
|
83
|
+
const guardrails = [...read.events.map(guardrailTurnEvent), ...(judged ? [judged] : [])];
|
|
84
|
+
if (!stopped) {
|
|
85
|
+
if (read.rewritten) {
|
|
86
|
+
// why: Text the stream could not replace as it went: the reply goes out replaced, whole.
|
|
87
|
+
return { outcome: replacement(replyAfter(args.shown, payload.text)), guardrails };
|
|
69
88
|
}
|
|
70
|
-
|
|
71
|
-
const guardrail = guardrailFromVerdict('output_final', 'untrusted', verdict);
|
|
72
|
-
// `flag` is advisory: the hit is recorded, the turn still releases.
|
|
73
|
-
if (verdict.action === 'allow' || verdict.action === 'flag') {
|
|
74
|
-
return { outcome: { action: 'pass' }, guardrail };
|
|
75
|
-
}
|
|
76
|
-
// The policy supplied safe replacement prose — release that instead.
|
|
77
|
-
if (verdict.action === 'redact') {
|
|
89
|
+
const replaced = payload.structured !== written.structured;
|
|
78
90
|
return {
|
|
79
|
-
outcome: {
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
},
|
|
83
|
-
guardrail,
|
|
91
|
+
outcome: { action: 'pass' },
|
|
92
|
+
guardrails,
|
|
93
|
+
...(replaced ? { structured: payload.structured } : {}),
|
|
84
94
|
};
|
|
85
95
|
}
|
|
86
|
-
if (
|
|
87
|
-
|
|
88
|
-
return { outcome: { action: 'refusal', event: { type: 'text', text } }, guardrail };
|
|
96
|
+
if (blockedReply.onBlock === 'refuse') {
|
|
97
|
+
return { outcome: replacement(refusalAfter(args.shown, profile.labels)), guardrails };
|
|
89
98
|
}
|
|
90
99
|
if (canRetry) {
|
|
91
|
-
const nextRequest = buildRepairRequest(request, payload.text,
|
|
92
|
-
return { outcome: { action: 'retry', nextRequest },
|
|
100
|
+
const nextRequest = buildRepairRequest(request, payload.text, retryRejection(stopped, detect, profile.labels), labelText('egress.default_repair_guidance', {}, profile.labels));
|
|
101
|
+
return { outcome: { action: 'retry', nextRequest }, guardrails };
|
|
93
102
|
}
|
|
94
103
|
return {
|
|
95
104
|
outcome: {
|
|
96
105
|
action: 'withhold',
|
|
97
106
|
event: toErrorEvent(new TheoremError('safety', WITHHELD_REASON.egress)),
|
|
98
107
|
},
|
|
99
|
-
|
|
108
|
+
guardrails,
|
|
100
109
|
};
|
|
101
110
|
}
|
|
102
111
|
async function evaluateValidationOutcome(args) {
|
|
@@ -109,34 +118,31 @@ async function evaluateValidationOutcome(args) {
|
|
|
109
118
|
throw new TheoremError('config', 'outputs.validation requires outputs.structured with a JSON Schema');
|
|
110
119
|
}
|
|
111
120
|
const failures = await collectValidationFailures(structured.jsonSchema, latestStructured, validation.fields, request.input?.slots);
|
|
112
|
-
if (failures.length === 0)
|
|
121
|
+
if (failures.length === 0)
|
|
113
122
|
return { action: 'pass' };
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
return { action: 'retry', nextRequest };
|
|
119
|
-
}
|
|
120
|
-
return {
|
|
121
|
-
action: 'accept',
|
|
122
|
-
event: { type: 'structured', structured: latestStructured },
|
|
123
|
-
};
|
|
123
|
+
if (!canRetry)
|
|
124
|
+
return { action: 'pass', failed: failures };
|
|
125
|
+
const nextRequest = buildRepairRequest(request, latestStructured, formatValidationFailures(failures));
|
|
126
|
+
return { action: 'retry', nextRequest };
|
|
124
127
|
}
|
|
125
|
-
function* yieldBufferedAttemptEvents(events, alreadyStreamedUserVisible) {
|
|
128
|
+
function* yieldBufferedAttemptEvents(events, alreadyStreamedUserVisible, generation) {
|
|
126
129
|
for (const ev of events) {
|
|
127
130
|
if (ev.type === 'tokens') {
|
|
128
131
|
continue;
|
|
129
132
|
}
|
|
130
|
-
// Thoughts always streamed live; text and media did unless the attempt withheld them.
|
|
133
|
+
// why: Thoughts always streamed live; text and media did unless the attempt withheld them.
|
|
131
134
|
if (ev.type === 'thought' || (alreadyStreamedUserVisible && isWithheldOnBlock(ev))) {
|
|
132
135
|
continue;
|
|
133
136
|
}
|
|
134
|
-
|
|
137
|
+
// why: A held structured reply was judged whole; its drafts are the JSON before that check, so the `structured` event alone shows it.
|
|
138
|
+
const shown = shownToHost(ev, { ...generation, stream: false });
|
|
139
|
+
if (shown)
|
|
140
|
+
yield shown;
|
|
135
141
|
}
|
|
136
142
|
}
|
|
137
143
|
/**
|
|
138
144
|
* Start the next attempt with the repair added. The turn is not resolved again:
|
|
139
|
-
* the retry keeps attempt 1's canary, tools and system prompt, and only the
|
|
145
|
+
* the retry keeps attempt 1's canary, tools, and system prompt, and only the
|
|
140
146
|
* repair prompt is new.
|
|
141
147
|
*/
|
|
142
148
|
function updateFlowForRetry(flow, state, profile, nextReq, reason) {
|
|
@@ -146,34 +152,68 @@ function updateFlowForRetry(flow, state, profile, nextReq, reason) {
|
|
|
146
152
|
flow.currentReq = nextReq;
|
|
147
153
|
const safe = sanitizeTurnRequest(nextReq, profile);
|
|
148
154
|
if (profile.type === 'text') {
|
|
149
|
-
// The conversation is already in turn history: the repair is its next user message.
|
|
155
|
+
// why: The conversation is already in turn history: the repair is its next user message.
|
|
156
|
+
const before = state.currentHistory.length;
|
|
150
157
|
appendUserInput(state, resolveInputParts(profile, { ...safe, input: { repair: safe.input?.repair } }));
|
|
151
|
-
|
|
158
|
+
for (const message of state.currentHistory.slice(before))
|
|
159
|
+
quotesOwnReply(state, message);
|
|
152
160
|
}
|
|
153
|
-
|
|
154
|
-
|
|
161
|
+
else {
|
|
162
|
+
// why: An image or speech call reads only its input: the repair replaces the prompt.
|
|
163
|
+
const input = resolveInputParts(profile, safe);
|
|
164
|
+
quotesOwnReply(state, input);
|
|
165
|
+
flow.currentGen = { ...flow.currentGen, input };
|
|
166
|
+
}
|
|
167
|
+
const event = { type: 'attempt', attempt: flow.currentAttempt, reason };
|
|
168
|
+
state.allEmittedEvents.push(event);
|
|
169
|
+
return event;
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* A repair hands the stopped reply back, and the model wrote that reply. What
|
|
173
|
+
* carries it gives the model nothing: a canary or a URL in it is still a leak
|
|
174
|
+
* on the next attempt.
|
|
175
|
+
*/
|
|
176
|
+
function quotesOwnReply(state, carrier) {
|
|
177
|
+
state.canaryScanned.add(carrier);
|
|
178
|
+
state.givenUrls.own.add(carrier);
|
|
179
|
+
}
|
|
180
|
+
/** Whether an attempt holds its reply text to its end: one validated and not streamed. */
|
|
181
|
+
function holdsVisible(profile, generation) {
|
|
182
|
+
return profileTurnOutputs(profile)?.validation !== undefined && generation.stream === false;
|
|
155
183
|
}
|
|
156
|
-
async function* handleEgressGate(
|
|
157
|
-
const canRetry = flow.currentAttempt < maxRetries;
|
|
184
|
+
async function* handleEgressGate(policy, flow, state, profile, privateSystem) {
|
|
185
|
+
const canRetry = flow.currentAttempt < policy.blockedReply.maxRetries;
|
|
158
186
|
const checkStart = performance.now();
|
|
159
|
-
const { outcome,
|
|
160
|
-
|
|
187
|
+
const { outcome, guardrails, structured } = await evaluateEgressOutcome({
|
|
188
|
+
policy,
|
|
161
189
|
attemptEvents: state.attemptEvents,
|
|
190
|
+
withheld: state.withheldVisible === true,
|
|
191
|
+
released: state.released,
|
|
192
|
+
shown: holdsVisible(profile, flow.currentGen) ? '' : state.released,
|
|
162
193
|
generation: flow.currentGen,
|
|
163
194
|
request: flow.currentReq,
|
|
164
195
|
profile,
|
|
165
196
|
canRetry,
|
|
166
197
|
...(state.promptLeaks ? { promptLeaks: state.promptLeaks } : {}),
|
|
167
198
|
givenUrls: state.givenUrls,
|
|
199
|
+
canaryGiven: state.canaryGiven,
|
|
200
|
+
privateSystem,
|
|
201
|
+
...(state.ownTools ? { ownTools: state.ownTools } : {}),
|
|
168
202
|
});
|
|
169
|
-
state.trace.root.event('theorem.guardrail', guardrailCheckAttributes('egress', performance.now() - checkStart,
|
|
203
|
+
state.trace.root.event('theorem.guardrail', guardrailCheckAttributes('egress', performance.now() - checkStart, guardrails.at(-1)?.guardrail, {
|
|
170
204
|
stage: 'output_final',
|
|
171
205
|
trust: 'untrusted',
|
|
172
206
|
}));
|
|
173
|
-
|
|
207
|
+
for (const guardrail of guardrails) {
|
|
174
208
|
state.allEmittedEvents.push(guardrail);
|
|
175
209
|
yield guardrail;
|
|
176
210
|
}
|
|
211
|
+
if (structured !== undefined) {
|
|
212
|
+
// why: What validation reads and the host receives is the structured output as replaced.
|
|
213
|
+
const held = findLast(state.attemptEvents, (event) => event.type === 'structured');
|
|
214
|
+
if (held)
|
|
215
|
+
state.attemptEvents[state.attemptEvents.indexOf(held)] = { ...held, structured };
|
|
216
|
+
}
|
|
177
217
|
if (outcome.action === 'refusal') {
|
|
178
218
|
state.lastStop = EGRESS_FILTERED_STOP;
|
|
179
219
|
state.allEmittedEvents.push(outcome.event);
|
|
@@ -186,34 +226,175 @@ async function* handleEgressGate(egress, flow, state, profile, maxRetries) {
|
|
|
186
226
|
return 'terminal';
|
|
187
227
|
}
|
|
188
228
|
if (outcome.action === 'retry') {
|
|
189
|
-
updateFlowForRetry(flow, state, profile, outcome.nextRequest, 'egress');
|
|
229
|
+
yield updateFlowForRetry(flow, state, profile, outcome.nextRequest, 'egress');
|
|
190
230
|
return 'continue';
|
|
191
231
|
}
|
|
192
232
|
return 'pass';
|
|
193
233
|
}
|
|
194
|
-
|
|
195
|
-
|
|
234
|
+
/** The refused items of each list, in the reply's own shape and order. */
|
|
235
|
+
function refusedLists(refused) {
|
|
236
|
+
let lists = {};
|
|
237
|
+
for (const path of new Set(refused.map((failure) => failure.path))) {
|
|
238
|
+
const items = refused.filter((failure) => failure.path === path).map(({ item }) => item);
|
|
239
|
+
lists = withListAt(lists, path, items);
|
|
240
|
+
}
|
|
241
|
+
return lists;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* The schema a rewrite of refused items answers under: the reply's shape, holding
|
|
245
|
+
* only the lists that had a refused item.
|
|
246
|
+
*
|
|
247
|
+
* why: Under the reply's own schema the model would write the whole reply again to change one item.
|
|
248
|
+
*/
|
|
249
|
+
function fixSchemaFor(jsonSchema, paths) {
|
|
250
|
+
const root = { type: 'object', properties: {}, required: [] };
|
|
251
|
+
// why: An item schema may point into the reply schema's definitions.
|
|
252
|
+
if (jsonSchema.$defs !== undefined)
|
|
253
|
+
root.$defs = jsonSchema.$defs;
|
|
254
|
+
for (const path of paths) {
|
|
255
|
+
const items = itemSchemaAt(jsonSchema, path);
|
|
256
|
+
if (!items)
|
|
257
|
+
continue;
|
|
258
|
+
const keys = path.split('.');
|
|
259
|
+
let node = root;
|
|
260
|
+
for (const [depth, key] of keys.entries()) {
|
|
261
|
+
if (!node.required.includes(key))
|
|
262
|
+
node.required.push(key);
|
|
263
|
+
if (depth === keys.length - 1) {
|
|
264
|
+
node.properties[key] = { type: 'array', items };
|
|
265
|
+
break;
|
|
266
|
+
}
|
|
267
|
+
const next = node.properties[key];
|
|
268
|
+
const child = next?.type === 'object' ? next : { type: 'object', properties: {}, required: [] };
|
|
269
|
+
node.properties[key] = child;
|
|
270
|
+
node = child;
|
|
271
|
+
}
|
|
272
|
+
}
|
|
273
|
+
return root;
|
|
274
|
+
}
|
|
275
|
+
/** `fix.reply` with each refused item replaced by its rewrite, matched by position; one with no rewrite stays as it was. */
|
|
276
|
+
function withRewrittenItems(fix, rewrite) {
|
|
277
|
+
let reply = fix.reply;
|
|
278
|
+
for (const path of new Set(fix.refused.map((failure) => failure.path))) {
|
|
279
|
+
const list = valueAt(reply, path);
|
|
280
|
+
const rewritten = valueAt(rewrite, path);
|
|
281
|
+
if (!Array.isArray(list) || !Array.isArray(rewritten))
|
|
282
|
+
continue;
|
|
283
|
+
const next = [...list];
|
|
284
|
+
const refusedHere = fix.refused.filter((failure) => failure.path === path);
|
|
285
|
+
for (const [position, failure] of refusedHere.entries()) {
|
|
286
|
+
if (position < rewritten.length)
|
|
287
|
+
next[failure.index] = rewritten[position];
|
|
288
|
+
}
|
|
289
|
+
reply = withListAt(reply, path, next);
|
|
290
|
+
}
|
|
291
|
+
return reply;
|
|
292
|
+
}
|
|
293
|
+
/** `reply` without its refused items. */
|
|
294
|
+
function withoutItems(reply, refused) {
|
|
295
|
+
let next = reply;
|
|
296
|
+
for (const path of new Set(refused.map((failure) => failure.path))) {
|
|
297
|
+
const list = valueAt(next, path);
|
|
298
|
+
if (!Array.isArray(list))
|
|
299
|
+
continue;
|
|
300
|
+
const gone = new Set(refused.filter((failure) => failure.path === path).map(({ index }) => index));
|
|
301
|
+
next = withListAt(next, path, list.filter((_, index) => !gone.has(index)));
|
|
302
|
+
}
|
|
303
|
+
return next;
|
|
304
|
+
}
|
|
305
|
+
/**
|
|
306
|
+
* Makes `reply` the attempt's structured output, with what the item rules removed.
|
|
307
|
+
*
|
|
308
|
+
* why: The buffered text is the model's own JSON, which no longer matches; held text goes out as the reply that is kept, and streamed text is skipped at release as it always is.
|
|
309
|
+
*/
|
|
310
|
+
function holdReply(state, reply, removed, failed) {
|
|
311
|
+
const event = {
|
|
312
|
+
type: 'structured',
|
|
313
|
+
structured: reply,
|
|
314
|
+
...(removed.length
|
|
315
|
+
? { removed: removed.map(({ path, reason, item }) => ({ path, reason, item })) }
|
|
316
|
+
: {}),
|
|
317
|
+
...(failed ? { failed } : {}),
|
|
318
|
+
};
|
|
319
|
+
state.attemptEvents = [
|
|
320
|
+
...state.attemptEvents.filter((held) => held.type !== 'structured' && held.type !== 'text'),
|
|
321
|
+
{ type: 'text', text: JSON.stringify(reply) },
|
|
322
|
+
event,
|
|
323
|
+
];
|
|
324
|
+
}
|
|
325
|
+
/** The next attempt rewrites only the refused items, under a schema that holds only their lists. */
|
|
326
|
+
function startItemFix(args) {
|
|
327
|
+
const { flow, state, profile, reply, refused, structured } = args;
|
|
328
|
+
const positions = new Map();
|
|
329
|
+
const rejection = refused
|
|
330
|
+
.map(({ path, reason }) => {
|
|
331
|
+
const position = positions.get(path) ?? 0;
|
|
332
|
+
positions.set(path, position + 1);
|
|
333
|
+
return `${path}[${position}]: ${reason}`;
|
|
334
|
+
})
|
|
335
|
+
.join('\n');
|
|
336
|
+
const nextRequest = buildRepairRequest(flow.currentReq, refusedLists(refused), rejection, labelText('repair.items_guidance', {}, profile.labels));
|
|
337
|
+
flow.pendingItemFix = { reply, refused, structured };
|
|
338
|
+
const attempt = updateFlowForRetry(flow, state, profile, nextRequest, 'validation');
|
|
339
|
+
flow.currentGen = {
|
|
340
|
+
...flow.currentGen,
|
|
341
|
+
structured: {
|
|
342
|
+
id: structured.id,
|
|
343
|
+
jsonSchema: fixSchemaFor(structured.jsonSchema, refused.map(({ path }) => path)),
|
|
344
|
+
},
|
|
345
|
+
};
|
|
346
|
+
return attempt;
|
|
347
|
+
}
|
|
348
|
+
async function handleValidationGate(validation, flow, state, profile, latestStructured) {
|
|
349
|
+
const canRetry = flow.currentAttempt < (validation.maxRetries ?? 0);
|
|
350
|
+
const fix = flow.pendingItemFix;
|
|
351
|
+
let reply = latestStructured;
|
|
352
|
+
if (fix) {
|
|
353
|
+
// why: The attempt that just ended answered under the fix schema; the reply is the one the items were refused in, with the rewrites put back.
|
|
354
|
+
flow.pendingItemFix = undefined;
|
|
355
|
+
flow.currentGen = { ...flow.currentGen, structured: fix.structured };
|
|
356
|
+
reply = withRewrittenItems(fix, latestStructured);
|
|
357
|
+
holdReply(state, reply, []);
|
|
358
|
+
}
|
|
196
359
|
const outcome = await evaluateValidationOutcome({
|
|
197
360
|
validation,
|
|
198
361
|
generation: flow.currentGen,
|
|
199
|
-
latestStructured,
|
|
362
|
+
latestStructured: reply,
|
|
200
363
|
request: flow.currentReq,
|
|
201
364
|
canRetry,
|
|
202
365
|
});
|
|
203
366
|
if (outcome.action === 'retry') {
|
|
204
|
-
updateFlowForRetry(flow, state, profile, outcome.nextRequest, 'validation');
|
|
205
|
-
return 'continue';
|
|
367
|
+
return updateFlowForRetry(flow, state, profile, outcome.nextRequest, 'validation');
|
|
206
368
|
}
|
|
207
|
-
if (
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
369
|
+
if (reply === undefined)
|
|
370
|
+
return 'pass';
|
|
371
|
+
if (outcome.failed)
|
|
372
|
+
markFailed(state, outcome.failed);
|
|
373
|
+
const slots = flow.currentReq.input?.slots;
|
|
374
|
+
const refused = await collectItemFailures(reply, validation.items, {
|
|
375
|
+
...(slots ? { slots } : {}),
|
|
376
|
+
toolResults: state.toolResults,
|
|
377
|
+
});
|
|
378
|
+
if (refused.length === 0)
|
|
379
|
+
return 'pass';
|
|
380
|
+
const fixable = refused.filter((failure) => failure.onFail === 'fix');
|
|
381
|
+
const structured = flow.currentGen.structured;
|
|
382
|
+
// invariant: Refused items get one rewrite. Refused again, they are removed.
|
|
383
|
+
if (fixable.length > 0 && canRetry && !fix && structured) {
|
|
384
|
+
return startItemFix({ flow, state, profile, reply, refused: fixable, structured });
|
|
211
385
|
}
|
|
386
|
+
holdReply(state, withoutItems(reply, refused), refused, outcome.failed);
|
|
212
387
|
return 'pass';
|
|
213
388
|
}
|
|
214
|
-
|
|
389
|
+
/** Puts on the attempt's structured output the fields that still failed. */
|
|
390
|
+
function markFailed(state, failed) {
|
|
391
|
+
const held = findLast(state.attemptEvents, (event) => event.type === 'structured');
|
|
392
|
+
if (held)
|
|
393
|
+
state.attemptEvents[state.attemptEvents.indexOf(held)] = { ...held, failed };
|
|
394
|
+
}
|
|
395
|
+
function gateStatusToAction(status) {
|
|
215
396
|
if (status === 'terminal') {
|
|
216
|
-
return { status:
|
|
397
|
+
return { status: 'terminal' };
|
|
217
398
|
}
|
|
218
399
|
if (status === 'continue') {
|
|
219
400
|
return { status: 'continue' };
|
|
@@ -221,16 +402,17 @@ function gateStatusToAction(status, terminalStatus = 'terminal') {
|
|
|
221
402
|
return null;
|
|
222
403
|
}
|
|
223
404
|
async function* executeSingleAttemptCycle(args) {
|
|
224
|
-
const { flow, state, profile, system, provider
|
|
405
|
+
const { flow, state, profile, system, provider } = args;
|
|
225
406
|
const validation = profileTurnOutputs(profile)?.validation;
|
|
226
|
-
const
|
|
227
|
-
|
|
407
|
+
const policy = resolveGuardrailPolicy(profile.guardrails);
|
|
408
|
+
const judged = replyIsJudged(policy, TURN_REPLY);
|
|
409
|
+
// invariant: Fresh maxSteps budget per validation/egress attempt. before_end inject
|
|
228
410
|
// re-entry inside this cycle still accumulates stepCount (do not reset there).
|
|
229
411
|
state.stepCount = 0;
|
|
230
412
|
let latestStructured;
|
|
231
|
-
// before_end may inject and re-enter the step loop under maxSteps.
|
|
232
413
|
for (;;) {
|
|
233
414
|
state.attemptEvents = [];
|
|
415
|
+
state.released = '';
|
|
234
416
|
state.withheldVisible = false;
|
|
235
417
|
state.promptLeaks = undefined;
|
|
236
418
|
const attempt = yield* executeAttempt({
|
|
@@ -242,8 +424,10 @@ async function* executeSingleAttemptCycle(args) {
|
|
|
242
424
|
state,
|
|
243
425
|
});
|
|
244
426
|
latestStructured = attempt.latestStructured;
|
|
245
|
-
// Tool / gate suspension — do not before_end; finalize with that stop.
|
|
246
|
-
if (state.lastStop?.kind === 'tool' ||
|
|
427
|
+
// why: Tool / gate suspension, or no answer to check — do not before_end; finalize with that stop.
|
|
428
|
+
if (state.lastStop?.kind === 'tool' ||
|
|
429
|
+
state.lastStop?.kind === 'gate' ||
|
|
430
|
+
state.lastStop?.kind === 'step_limit') {
|
|
247
431
|
break;
|
|
248
432
|
}
|
|
249
433
|
if (state.lastStop?.kind === 'cancelled') {
|
|
@@ -270,35 +454,38 @@ async function* executeSingleAttemptCycle(args) {
|
|
|
270
454
|
return { status: 'terminal' };
|
|
271
455
|
}
|
|
272
456
|
if (beforeEnd.injectCount > 0) {
|
|
273
|
-
// Host extended the turn — another provider step under maxSteps.
|
|
274
457
|
continue;
|
|
275
458
|
}
|
|
276
459
|
break;
|
|
277
460
|
}
|
|
278
|
-
if (
|
|
279
|
-
const status = yield* handleEgressGate(
|
|
280
|
-
const action = gateStatusToAction(status
|
|
461
|
+
if (judged) {
|
|
462
|
+
const status = yield* handleEgressGate(policy, flow, state, profile, system.private);
|
|
463
|
+
const action = gateStatusToAction(status);
|
|
281
464
|
if (action) {
|
|
282
465
|
return action;
|
|
283
466
|
}
|
|
467
|
+
latestStructured = projectOutbound(state.attemptEvents).structured ?? latestStructured;
|
|
284
468
|
}
|
|
285
469
|
if (validation) {
|
|
286
|
-
const status =
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
return
|
|
470
|
+
const status = await handleValidationGate(validation, flow, state, profile, latestStructured);
|
|
471
|
+
if (status !== 'pass') {
|
|
472
|
+
yield status;
|
|
473
|
+
return { status: 'continue' };
|
|
290
474
|
}
|
|
291
475
|
}
|
|
292
|
-
if (validation ||
|
|
293
|
-
// Progressive-yield already released text and media live under egress — unless it
|
|
476
|
+
if (validation || judged) {
|
|
477
|
+
// why: Progressive-yield already released text and media live under egress — unless it
|
|
294
478
|
// withheld them mid-stream. A passing final verdict on the full text supersedes
|
|
295
479
|
// that partial-window decision, so the buffer is released instead of dropped.
|
|
296
|
-
|
|
480
|
+
const heldVisible = state.withheldVisible || holdsVisible(profile, flow.currentGen);
|
|
481
|
+
yield* yieldBufferedAttemptEvents(state.attemptEvents, !heldVisible, flow.currentGen);
|
|
297
482
|
}
|
|
298
483
|
return { status: 'success' };
|
|
299
484
|
}
|
|
300
485
|
async function* runAttemptsWithValidation(safe, profile, generation, system, provider, state) {
|
|
301
|
-
const
|
|
486
|
+
const { blockedReply } = resolveGuardrailPolicy(profile.guardrails);
|
|
487
|
+
// why: Each gate counts the attempts against its own cap; the turn runs while either has one left.
|
|
488
|
+
const maxRetries = Math.max(profileTurnOutputs(profile)?.validation?.maxRetries ?? 0, blockedReply.onBlock === 'retry' ? blockedReply.maxRetries : 0);
|
|
302
489
|
const flow = {
|
|
303
490
|
currentAttempt: 0,
|
|
304
491
|
currentGen: generation,
|
|
@@ -312,7 +499,6 @@ async function* runAttemptsWithValidation(safe, profile, generation, system, pro
|
|
|
312
499
|
profile,
|
|
313
500
|
system,
|
|
314
501
|
provider,
|
|
315
|
-
maxRetries,
|
|
316
502
|
});
|
|
317
503
|
if (step.status === 'terminal' || step.status === 'success') {
|
|
318
504
|
break;
|
|
@@ -1,15 +1,29 @@
|
|
|
1
1
|
import type { TraceSink } from '../../../observability/trace-sink.js';
|
|
2
|
+
import type { ProviderHostOptions } from '../../protocols/runtime.js';
|
|
2
3
|
import type { KernelRegistry } from '../../registry/kernel-registry.js';
|
|
3
|
-
import type {
|
|
4
|
+
import type { AgentCaller } from '../../tools/agent.js';
|
|
5
|
+
import type { InvokeToolRequest } from '../../tools/types.js';
|
|
6
|
+
import type { CompactHistoryRequest, CompactionResult, SessionRequest, TurnEvent, TurnModel, TurnRequest } from '../../types.js';
|
|
4
7
|
/**
|
|
5
8
|
* The trace record is written however the turn ends, including when the host stops reading early;
|
|
6
9
|
* spans still open then close as `ERROR` / `unclosed`.
|
|
7
10
|
*/
|
|
8
|
-
declare function runTurnInRegistry(registry: KernelRegistry, req: TurnRequest, provider:
|
|
11
|
+
declare function runTurnInRegistry(registry: KernelRegistry, req: TurnRequest, provider: TurnModel, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
|
|
12
|
+
/**
|
|
13
|
+
* A host's own call's agent tools: the host's provider, or the one `onAgentCall`
|
|
14
|
+
* returns, runs each. Its nested turns bind their canaries into `canaries`.
|
|
15
|
+
*/
|
|
16
|
+
declare function invokeAgentCaller(registry: KernelRegistry, request: InvokeToolRequest, canaries: string[]): AgentCaller;
|
|
17
|
+
/**
|
|
18
|
+
* A live session's agent tools: the session's own provider options, or those
|
|
19
|
+
* `onAgentCall` returns, run each. Its nested turns bind their canaries into
|
|
20
|
+
* `canaries`.
|
|
21
|
+
*/
|
|
22
|
+
declare function sessionAgentCaller(registry: KernelRegistry, req: Pick<SessionRequest, 'onAgentCall' | 'metadata'>, options: ProviderHostOptions & Pick<TurnRequest, 'execution'>, canaries: string[]): AgentCaller;
|
|
9
23
|
/**
|
|
10
24
|
* `timing: 'after'`: run the compactor on the history `done.compaction` carried,
|
|
11
|
-
* with the same split, failure rules and trace as `before`. `provider` runs the
|
|
25
|
+
* with the same split, failure rules, and trace as `before`. `provider` runs the
|
|
12
26
|
* compactor. `undefined` when the split leaves nothing to compact.
|
|
13
27
|
*/
|
|
14
|
-
declare function compactHistoryInRegistry(registry: KernelRegistry, req: CompactHistoryRequest, provider:
|
|
15
|
-
export { compactHistoryInRegistry, runTurnInRegistry };
|
|
28
|
+
declare function compactHistoryInRegistry(registry: KernelRegistry, req: CompactHistoryRequest, provider: TurnModel, sinkOverride?: TraceSink): Promise<CompactionResult | undefined>;
|
|
29
|
+
export { compactHistoryInRegistry, invokeAgentCaller, runTurnInRegistry, sessionAgentCaller };
|