@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,29 +1,15 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { guardedEventTexts, scanTextForCanaryLeak } from './canary.js';
|
|
1
|
+
import { canaryNoteMarker, guardedEventTexts, scanTextForCanaryLeak } from './canary.js';
|
|
3
2
|
import { SYSTEM_BOUNDARY } from './egress-patterns.js';
|
|
4
|
-
import {
|
|
5
|
-
import { describeError } from './error.js';
|
|
6
|
-
import { hitFromSpan } from './hits.js';
|
|
7
|
-
import { injectionSpans } from './injection.js';
|
|
8
|
-
import { lexiconText } from './lexicon.js';
|
|
3
|
+
import { CANARY_HIT, PROMPT_ECHO_HIT } from './hits.js';
|
|
9
4
|
import { scanTextForPromptEcho } from './prompt-echo.js';
|
|
10
|
-
import { EGRESS_RULES } from './rules.js';
|
|
11
|
-
import { anySensitive, resolveSensitive, SENSITIVE_GROUPS, sensitiveSpans, } from './sensitive.js';
|
|
12
|
-
import { textForScan } from './serialize.js';
|
|
13
|
-
import { SEVERITIES } from './types.js';
|
|
14
|
-
function hitsFromSpans(text, spans, rule, severity) {
|
|
15
|
-
return spans.map((span) => hitFromSpan(text, span, rule, severity));
|
|
16
|
-
}
|
|
5
|
+
import { DETECT_RULES, EGRESS_RULES } from './rules.js';
|
|
17
6
|
/** Why a reply was withheld, for the builder (`errorInternal`); the user reads `error.safety`. */
|
|
18
7
|
const WITHHELD_REASON = {
|
|
19
8
|
canary: 'canary leaked',
|
|
20
|
-
promptEcho: 'system prompt echoed', //
|
|
21
|
-
providerToolLeak: 'a provider-side tool already sent the canary or system prompt', //
|
|
22
|
-
egress: 'Turn withheld: egress disclosure violation', //
|
|
9
|
+
promptEcho: 'system prompt echoed', // labels-exempt: internal diagnostic — the user reads error.safety
|
|
10
|
+
providerToolLeak: 'a provider-side tool already sent the canary or system prompt', // labels-exempt: internal diagnostic — the user reads error.safety
|
|
11
|
+
egress: 'Turn withheld: egress disclosure violation', // labels-exempt: internal diagnostic — the user reads error.safety
|
|
23
12
|
};
|
|
24
|
-
/** Never carries the live token, only a placeholder. */
|
|
25
|
-
const CANARY_HIT = { rule: EGRESS_RULES.canary, severity: 'high', match: '[canary]' };
|
|
26
|
-
const PROMPT_ECHO_HIT = { rule: EGRESS_RULES.promptEcho, severity: 'high' };
|
|
27
13
|
function canaryHits(text, canary) {
|
|
28
14
|
return canary && scanTextForCanaryLeak(text, canary) ? [CANARY_HIT] : [];
|
|
29
15
|
}
|
|
@@ -33,9 +19,13 @@ function promptEchoHits(text, privateSystem, canary) {
|
|
|
33
19
|
? [PROMPT_ECHO_HIT]
|
|
34
20
|
: [];
|
|
35
21
|
}
|
|
36
|
-
/** The system-prompt leak hits: the canary, and the prompt's own words when guarded. */
|
|
37
|
-
function promptLeakHits(text,
|
|
38
|
-
|
|
22
|
+
/** The system-prompt leak hits: the canary unless it was given, and the prompt's own words when guarded. */
|
|
23
|
+
function promptLeakHits(text, scope) {
|
|
24
|
+
const { canary, canaryGiven, privateSystem } = scope;
|
|
25
|
+
return [
|
|
26
|
+
...canaryHits(text, canaryGiven ? undefined : canary),
|
|
27
|
+
...promptEchoHits(text, privateSystem, canary),
|
|
28
|
+
];
|
|
39
29
|
}
|
|
40
30
|
const PROVIDER_TOOL_LEAK_HIT = {
|
|
41
31
|
rule: EGRESS_RULES.providerToolLeak,
|
|
@@ -61,19 +51,50 @@ function isProviderToolReport(event) {
|
|
|
61
51
|
* (`guardedEventTexts`). In the report of a provider-side tool they are one
|
|
62
52
|
* `egress.provider-tool-leak`: the call already ran.
|
|
63
53
|
*/
|
|
64
|
-
function eventPromptLeakHits(event,
|
|
65
|
-
const hits = guardedEventTexts(event).flatMap((text) => promptLeakHits(text,
|
|
54
|
+
function eventPromptLeakHits(event, scope) {
|
|
55
|
+
const hits = guardedEventTexts(event).flatMap((text) => promptLeakHits(text, scope));
|
|
66
56
|
if (hits.length > 0 && isProviderToolReport(event)) {
|
|
67
57
|
return [PROVIDER_TOOL_LEAK_HIT];
|
|
68
58
|
}
|
|
69
59
|
return [...new Map(hits.map((hit) => [hit.rule, hit])).values()];
|
|
70
60
|
}
|
|
61
|
+
/**
|
|
62
|
+
* What the detectors of what is ours find in an event's host content
|
|
63
|
+
* (`guardedEventTexts`) under their actions at `boundary`, as the event goes
|
|
64
|
+
* to the host with the reply. `flag` reports it; `redact` and `block` stop the
|
|
65
|
+
* turn, as an event has no text to replace. The report of a provider-side tool
|
|
66
|
+
* is read whatever the actions are and always stops: the call already ran.
|
|
67
|
+
*/
|
|
68
|
+
function eventLeak(event, scope, detect, boundary) {
|
|
69
|
+
if (isProviderToolReport(event)) {
|
|
70
|
+
const hits = eventPromptLeakHits(event, scope);
|
|
71
|
+
return hits.length > 0 ? { stop: true, hits } : undefined;
|
|
72
|
+
}
|
|
73
|
+
const texts = guardedEventTexts(event);
|
|
74
|
+
const found = [];
|
|
75
|
+
const canary = scope.canaryGiven ? undefined : scope.canary;
|
|
76
|
+
const canaryAction = detect.canary_leak[boundary];
|
|
77
|
+
if (canaryAction !== 'ignore' && texts.some((text) => canaryHits(text, canary).length > 0)) {
|
|
78
|
+
found.push([canaryAction, CANARY_HIT]);
|
|
79
|
+
}
|
|
80
|
+
const promptAction = detect.prompt_leak[boundary];
|
|
81
|
+
if (promptAction !== 'ignore' &&
|
|
82
|
+
texts.some((text) => promptEchoHits(text, scope.privateSystem, scope.canary).length > 0)) {
|
|
83
|
+
found.push([promptAction, PROMPT_ECHO_HIT]);
|
|
84
|
+
}
|
|
85
|
+
if (found.length === 0)
|
|
86
|
+
return undefined;
|
|
87
|
+
return {
|
|
88
|
+
stop: found.some(([action]) => action !== 'flag'),
|
|
89
|
+
hits: found.map(([, hit]) => hit),
|
|
90
|
+
};
|
|
91
|
+
}
|
|
71
92
|
const PROMPT_LEAK_RULES = new Set([
|
|
72
|
-
|
|
73
|
-
|
|
93
|
+
DETECT_RULES.canary_leak,
|
|
94
|
+
DETECT_RULES.prompt_leak,
|
|
74
95
|
EGRESS_RULES.providerToolLeak,
|
|
75
96
|
]);
|
|
76
|
-
/** Whether a hit is a system-prompt leak
|
|
97
|
+
/** Whether a hit is a system-prompt leak. */
|
|
77
98
|
function isPromptLeakHit(hit) {
|
|
78
99
|
return PROMPT_LEAK_RULES.has(hit.rule);
|
|
79
100
|
}
|
|
@@ -82,293 +103,22 @@ function promptLeakReason(hits) {
|
|
|
82
103
|
if (hits.some((hit) => hit.rule === EGRESS_RULES.providerToolLeak)) {
|
|
83
104
|
return WITHHELD_REASON.providerToolLeak;
|
|
84
105
|
}
|
|
85
|
-
return hits.some((hit) => hit.rule ===
|
|
106
|
+
return hits.some((hit) => hit.rule === DETECT_RULES.canary_leak)
|
|
86
107
|
? WITHHELD_REASON.canary
|
|
87
108
|
: WITHHELD_REASON.promptEcho;
|
|
88
109
|
}
|
|
89
|
-
|
|
90
|
-
ids: true,
|
|
91
|
-
financial: true,
|
|
92
|
-
network: false,
|
|
93
|
-
credentials: true,
|
|
94
|
-
};
|
|
95
|
-
function resolveUrlCheck(check, byDefault) {
|
|
96
|
-
if (check === undefined)
|
|
97
|
-
return byDefault ? {} : undefined;
|
|
98
|
-
if (typeof check === 'boolean')
|
|
99
|
-
return check ? {} : undefined;
|
|
100
|
-
return check;
|
|
101
|
-
}
|
|
102
|
-
function resolveEgressChecks(checks = {}) {
|
|
103
|
-
const images = resolveUrlCheck(checks.images, true);
|
|
104
|
-
const resolved = resolveUrlCheck(checks.links, false);
|
|
105
|
-
// A host images load from already takes data with no click, so a link there opens nothing new.
|
|
106
|
-
const links = resolved && images?.hosts
|
|
107
|
-
? { ...resolved, hosts: [...new Set([...(resolved.hosts ?? []), ...images.hosts])] }
|
|
108
|
-
: resolved;
|
|
109
|
-
return {
|
|
110
|
-
sensitive: resolveSensitive(checks.sensitive, EGRESS_SENSITIVE_DEFAULT),
|
|
111
|
-
boundary: checks.boundary ?? true,
|
|
112
|
-
injection: checks.injection ?? true,
|
|
113
|
-
...(images ? { images } : {}),
|
|
114
|
-
...(links ? { links } : {}),
|
|
115
|
-
};
|
|
116
|
-
}
|
|
117
|
-
/** Every check off: the system-prompt leak checks alone. */
|
|
118
|
-
const NO_CHECKS = resolveEgressChecks({
|
|
119
|
-
sensitive: false,
|
|
120
|
-
boundary: false,
|
|
121
|
-
injection: false,
|
|
122
|
-
images: false,
|
|
123
|
-
});
|
|
124
|
-
const DEFAULT_CHECKS = resolveEgressChecks();
|
|
125
|
-
function urlScope(check, given) {
|
|
126
|
-
return { ...check, ...(given ? { given } : {}) };
|
|
127
|
-
}
|
|
128
|
-
/** The bundled policy's hits in `text`, from the checks `checks` runs. */
|
|
129
|
-
function collectEgressHits(text, scope = {}, checks = DEFAULT_CHECKS) {
|
|
130
|
-
const hits = promptLeakHits(text, scope.canary, scope.privateSystem);
|
|
131
|
-
if (anySensitive(checks.sensitive)) {
|
|
132
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
133
|
-
hits.push(...hitsFromSpans(text, sensitiveSpans(text, checks.sensitive), EGRESS_RULES.sensitive, 'high'));
|
|
134
|
-
}
|
|
135
|
-
const boundary = checks.boundary ? SYSTEM_BOUNDARY.exec(text) : null;
|
|
136
|
-
if (boundary && boundary.index !== undefined) {
|
|
137
|
-
hits.push(hitFromSpan(text, { start: boundary.index, end: boundary.index + boundary[0].length }, EGRESS_RULES.boundary, 'medium'));
|
|
138
|
-
}
|
|
139
|
-
if (checks.injection) {
|
|
140
|
-
hits.push(...hitsFromSpans(text, injectionSpans(text), EGRESS_RULES.injection, 'medium')); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
141
|
-
}
|
|
142
|
-
if (checks.images) {
|
|
143
|
-
const spans = imageLeakSpans(text, urlScope(checks.images, scope.given));
|
|
144
|
-
hits.push(...hitsFromSpans(text, spans, EGRESS_RULES.image, 'high'));
|
|
145
|
-
}
|
|
146
|
-
if (checks.links) {
|
|
147
|
-
const spans = linkLeakSpans(text, urlScope(checks.links, scope.given), Boolean(checks.images));
|
|
148
|
-
hits.push(...hitsFromSpans(text, spans, EGRESS_RULES.link, 'high'));
|
|
149
|
-
}
|
|
150
|
-
return hits;
|
|
151
|
-
}
|
|
110
|
+
/** The distinct rule names among the hits. */
|
|
152
111
|
function hitRules(hits) {
|
|
153
112
|
return [...new Set(hits.map((hit) => hit.rule))];
|
|
154
113
|
}
|
|
155
|
-
function isGuardrailHit(value) {
|
|
156
|
-
if (!isRecord(value) ||
|
|
157
|
-
typeof value.rule !== 'string' ||
|
|
158
|
-
!value.rule.trim() ||
|
|
159
|
-
!SEVERITIES.includes(value.severity)) {
|
|
160
|
-
return false;
|
|
161
|
-
}
|
|
162
|
-
for (const key of ['match', 'label', 'doc']) {
|
|
163
|
-
if (value[key] !== undefined && typeof value[key] !== 'string')
|
|
164
|
-
return false;
|
|
165
|
-
}
|
|
166
|
-
if (value.span !== undefined) {
|
|
167
|
-
if (!isRecord(value.span) ||
|
|
168
|
-
typeof value.span.start !== 'number' ||
|
|
169
|
-
!Number.isFinite(value.span.start) ||
|
|
170
|
-
typeof value.span.end !== 'number' ||
|
|
171
|
-
!Number.isFinite(value.span.end)) {
|
|
172
|
-
return false;
|
|
173
|
-
}
|
|
174
|
-
}
|
|
175
|
-
return true;
|
|
176
|
-
}
|
|
177
|
-
function isGuardrailHits(value) {
|
|
178
|
-
return Array.isArray(value) && value.every(isGuardrailHit);
|
|
179
|
-
}
|
|
180
|
-
function isVerdict(value) {
|
|
181
|
-
if (!isRecord(value))
|
|
182
|
-
return false;
|
|
183
|
-
switch (value.action) {
|
|
184
|
-
case 'allow':
|
|
185
|
-
return true;
|
|
186
|
-
case 'redact':
|
|
187
|
-
return typeof value.text === 'string' && isGuardrailHits(value.hits);
|
|
188
|
-
case 'flag':
|
|
189
|
-
return isGuardrailHits(value.hits);
|
|
190
|
-
case 'block':
|
|
191
|
-
return (isGuardrailHits(value.hits) &&
|
|
192
|
-
typeof value.rejection === 'string' &&
|
|
193
|
-
(value.errorInternal === undefined || typeof value.errorInternal === 'string'));
|
|
194
|
-
default:
|
|
195
|
-
return false;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
function legacyHits(value) {
|
|
199
|
-
if (!Array.isArray(value)) {
|
|
200
|
-
return [{ rule: EGRESS_RULES.enforcerError, severity: 'high' }];
|
|
201
|
-
}
|
|
202
|
-
const hits = value
|
|
203
|
-
.map((hit) => {
|
|
204
|
-
if (typeof hit === 'string' && hit.trim()) {
|
|
205
|
-
return { rule: hit, severity: 'high' };
|
|
206
|
-
}
|
|
207
|
-
if (isRecord(hit) && typeof hit.rule === 'string' && hit.rule.trim()) {
|
|
208
|
-
const severity = SEVERITIES.includes(hit.severity)
|
|
209
|
-
? hit.severity
|
|
210
|
-
: 'high';
|
|
211
|
-
return {
|
|
212
|
-
rule: hit.rule,
|
|
213
|
-
severity,
|
|
214
|
-
...(typeof hit.label === 'string' ? { label: hit.label } : {}),
|
|
215
|
-
...(typeof hit.doc === 'string' ? { doc: hit.doc } : {}),
|
|
216
|
-
};
|
|
217
|
-
}
|
|
218
|
-
return undefined;
|
|
219
|
-
})
|
|
220
|
-
.filter((hit) => Boolean(hit));
|
|
221
|
-
return hits.length ? hits : [{ rule: EGRESS_RULES.enforcerError, severity: 'high' }];
|
|
222
|
-
}
|
|
223
|
-
function normalizeVerdict(value, context) {
|
|
224
|
-
if (isVerdict(value)) {
|
|
225
|
-
return value;
|
|
226
|
-
}
|
|
227
|
-
if (isRecord(value) && typeof value.blocked === 'boolean') {
|
|
228
|
-
if (!value.blocked) {
|
|
229
|
-
return { action: 'allow' };
|
|
230
|
-
}
|
|
231
|
-
const hits = legacyHits(value.hits);
|
|
232
|
-
const rejection = typeof value.rejectionMessage === 'string' && value.rejectionMessage.trim()
|
|
233
|
-
? value.rejectionMessage
|
|
234
|
-
: lexiconText('egress.rejection', { rules: hitRules(hits).join(', ') }, context.lexicon);
|
|
235
|
-
return { action: 'block', hits, rejection };
|
|
236
|
-
}
|
|
237
|
-
return {
|
|
238
|
-
action: 'block',
|
|
239
|
-
hits: [{ rule: EGRESS_RULES.enforcerError, severity: 'high' }],
|
|
240
|
-
rejection: lexiconText('egress.invalid_verdict', {}, context.lexicon),
|
|
241
|
-
};
|
|
242
|
-
}
|
|
243
|
-
/** An enforce that blocks on `collect`'s hits in the reply and in any structured output. */
|
|
244
|
-
function hitsEnforcer(collect) {
|
|
245
|
-
return (payload, context) => {
|
|
246
|
-
const hits = collect(payload.text, context);
|
|
247
|
-
if (payload.structured !== undefined) {
|
|
248
|
-
const structured = textForScan(payload.structured);
|
|
249
|
-
if (structured.unscannable) {
|
|
250
|
-
// Cannot inspect it, so cannot vouch for it. Fail closed.
|
|
251
|
-
hits.push({ rule: EGRESS_RULES.unscannable, severity: 'high' }); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
252
|
-
}
|
|
253
|
-
else {
|
|
254
|
-
hits.push(...collect(structured.text, context));
|
|
255
|
-
}
|
|
256
|
-
}
|
|
257
|
-
if (hits.length === 0) {
|
|
258
|
-
return { action: 'allow' };
|
|
259
|
-
}
|
|
260
|
-
return {
|
|
261
|
-
action: 'block',
|
|
262
|
-
hits,
|
|
263
|
-
rejection: lexiconText('egress.rejection', { rules: hitRules(hits).join(', ') }, context.lexicon),
|
|
264
|
-
};
|
|
265
|
-
};
|
|
266
|
-
}
|
|
267
|
-
/** What the bundled policy reads from a gate's context. */
|
|
268
|
-
function egressScope(context) {
|
|
269
|
-
return {
|
|
270
|
-
...(context.canary ? { canary: context.canary } : {}),
|
|
271
|
-
...(context.privateSystem ? { privateSystem: context.privateSystem } : {}),
|
|
272
|
-
...(context.givenUrls ? { given: context.givenUrls } : {}),
|
|
273
|
-
};
|
|
274
|
-
}
|
|
275
|
-
/** Default egress enforce: every bundled check at its default (`EgressChecks`). */
|
|
276
|
-
const standardEgressEnforce = hitsEnforcer((text, context) => collectEgressHits(text, egressScope(context)));
|
|
277
|
-
/** The bundled checks each enforce runs, for the enforces built from them. */
|
|
278
|
-
const KNOWN_CHECKS = new WeakMap([
|
|
279
|
-
[standardEgressEnforce, DEFAULT_CHECKS],
|
|
280
|
-
]);
|
|
281
|
-
function registerEgressChecks(enforce, checks) {
|
|
282
|
-
KNOWN_CHECKS.set(enforce, checks);
|
|
283
|
-
}
|
|
284
|
-
/** The bundled checks `enforce` runs; undefined for a host enforce, whose checks are its own. */
|
|
285
|
-
function egressChecksOf(enforce) {
|
|
286
|
-
return enforce && KNOWN_CHECKS.get(enforce);
|
|
287
|
-
}
|
|
288
|
-
const CHECK_NAMES = new Set(['sensitive', 'boundary', 'injection', 'images', 'links']);
|
|
289
|
-
const URL_CHECK_NAMES = new Set(['hosts', 'fromTools']);
|
|
290
|
-
const GROUP_NAMES = new Set(SENSITIVE_GROUPS);
|
|
291
|
-
/** A hostname is all a URL check's host is: a scheme, port or path would never match one. */
|
|
292
|
-
function urlCheckProblem(path, check) {
|
|
293
|
-
if (check === undefined || typeof check === 'boolean')
|
|
294
|
-
return undefined;
|
|
295
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
296
|
-
if (typeof check !== 'object' || check === null)
|
|
297
|
-
return `${path} must be a boolean or an object`;
|
|
298
|
-
const unknown = Object.keys(check).find((key) => !URL_CHECK_NAMES.has(key));
|
|
299
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
300
|
-
if (unknown !== undefined)
|
|
301
|
-
return `${path} has no option ${JSON.stringify(unknown)}`;
|
|
302
|
-
const { hosts, fromTools } = check;
|
|
303
|
-
if (fromTools !== undefined && typeof fromTools !== 'boolean') {
|
|
304
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
305
|
-
return `${path}.fromTools must be a boolean`;
|
|
306
|
-
}
|
|
307
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
308
|
-
if (hosts !== undefined && !Array.isArray(hosts))
|
|
309
|
-
return `${path}.hosts must be a list`;
|
|
310
|
-
const bad = (hosts ?? []).find((host) => typeof host !== 'string' || !/^[a-z0-9.-]+$/i.test(host) || host.startsWith('.'));
|
|
311
|
-
return bad === undefined
|
|
312
|
-
? undefined
|
|
313
|
-
: // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
314
|
-
`${path}.hosts lists ${JSON.stringify(bad)}, which is not a hostname`;
|
|
315
|
-
}
|
|
316
|
-
/** A misspelt check or group would leave the check it meant at its default, silently. */
|
|
317
|
-
function egressChecksProblem(path, checks) {
|
|
318
|
-
if (typeof checks === 'boolean')
|
|
319
|
-
return undefined;
|
|
320
|
-
if (typeof checks !== 'object' || checks === null)
|
|
321
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
322
|
-
return `${path} must be a boolean or an object`;
|
|
323
|
-
const unknown = Object.keys(checks).find((key) => !CHECK_NAMES.has(key));
|
|
324
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
325
|
-
if (unknown !== undefined)
|
|
326
|
-
return `${path} has no check ${JSON.stringify(unknown)}`;
|
|
327
|
-
const { sensitive, boundary, injection, images, links } = checks;
|
|
328
|
-
for (const [name, value] of [
|
|
329
|
-
['boundary', boundary],
|
|
330
|
-
['injection', injection],
|
|
331
|
-
]) {
|
|
332
|
-
if (value !== undefined && typeof value !== 'boolean')
|
|
333
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
334
|
-
return `${path}.${name} must be a boolean`;
|
|
335
|
-
}
|
|
336
|
-
if (sensitive !== undefined && typeof sensitive !== 'boolean') {
|
|
337
|
-
if (typeof sensitive !== 'object' || sensitive === null) {
|
|
338
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
339
|
-
return `${path}.sensitive must be a boolean or an object`;
|
|
340
|
-
}
|
|
341
|
-
const unknownGroup = Object.keys(sensitive).find((group) => !GROUP_NAMES.has(group));
|
|
342
|
-
if (unknownGroup !== undefined) {
|
|
343
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
344
|
-
return `${path}.sensitive has no group ${JSON.stringify(unknownGroup)} (${SENSITIVE_GROUPS.join(', ')})`;
|
|
345
|
-
}
|
|
346
|
-
const bad = Object.entries(sensitive).find(([, on]) => typeof on !== 'boolean');
|
|
347
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
348
|
-
if (bad !== undefined)
|
|
349
|
-
return `${path}.sensitive.${bad[0]} must be a boolean`;
|
|
350
|
-
}
|
|
351
|
-
// lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
352
|
-
return urlCheckProblem(`${path}.images`, images) ?? urlCheckProblem(`${path}.links`, links);
|
|
353
|
-
}
|
|
354
114
|
/**
|
|
355
|
-
*
|
|
356
|
-
*
|
|
357
|
-
* ordinary `onBlock` handling instead of surfacing a raw host stack trace. The
|
|
358
|
-
* thrown message may carry host internals, so it goes to the builder only
|
|
359
|
-
* (`errorInternal`); the model reads the lexicon's `egress.policy_failed`.
|
|
115
|
+
* The words of the canary note a turn binds, when the profile's labels
|
|
116
|
+
* rewords it so that `SYSTEM_BOUNDARY` no longer reads them.
|
|
360
117
|
*/
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
return
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
return {
|
|
367
|
-
action: 'block',
|
|
368
|
-
hits: [{ rule: EGRESS_RULES.enforcerError, severity: 'high' }],
|
|
369
|
-
rejection: lexiconText('egress.policy_failed', {}, context.lexicon),
|
|
370
|
-
errorInternal: describeError(err),
|
|
371
|
-
};
|
|
372
|
-
}
|
|
118
|
+
function boundaryNote({ canary, labels, }) {
|
|
119
|
+
if (!canary)
|
|
120
|
+
return undefined;
|
|
121
|
+
const marker = canaryNoteMarker(labels);
|
|
122
|
+
return marker && !SYSTEM_BOUNDARY.test(marker) ? marker : undefined;
|
|
373
123
|
}
|
|
374
|
-
export {
|
|
124
|
+
export { boundaryNote, eventLeak, eventPromptLeakHits, hitRules, isPromptLeakHit, promptEchoHits, promptLeakReason, WITHHELD_REASON, };
|
|
@@ -1,26 +1,31 @@
|
|
|
1
1
|
import type { TurnEventOf } from '../kernel/turn-events.js';
|
|
2
2
|
import type { TurnEvent } from '../kernel/types.js';
|
|
3
|
-
import { type
|
|
4
|
-
import { type ErrorKind, TheoremError } from './theorem-error.js';
|
|
3
|
+
import { type LabelOverrides } from './labels.js';
|
|
4
|
+
import { type ErrorCopies, type ErrorKind, TheoremError } from './theorem-error.js';
|
|
5
|
+
/** True when the value is an error named `AbortError`. */
|
|
5
6
|
declare function isAbortError(err: unknown): boolean;
|
|
6
7
|
/** `AbortSignal.timeout` rejects with a `TimeoutError`, not an `AbortError`. */
|
|
7
8
|
declare function isTimeoutError(err: unknown): boolean;
|
|
9
|
+
/** Throws when the signal has aborted: its framework, abort or timeout reason, else an `AbortError`. */
|
|
8
10
|
declare function throwIfAborted(signal?: AbortSignal): void;
|
|
9
11
|
/** Anything that is not a `TheoremError` or an abort escaped every boundary that names kinds: a THEOREM bug. */
|
|
10
12
|
declare function errorKind(err: unknown): ErrorKind;
|
|
13
|
+
/** The error kind for an HTTP status: 401, 402 and 403 are `auth`; 408, 504 and 524 `timeout`; 429 `rate_limit`; 500 and above `unavailable`; the rest `unsupported`. */
|
|
11
14
|
declare function kindOfHttpStatus(status: number): ErrorKind;
|
|
12
|
-
/**
|
|
13
|
-
declare function
|
|
14
|
-
/**
|
|
15
|
+
/** The named reasons an error carries, one line each, in the profile's wording. */
|
|
16
|
+
declare function errorCopyText(copy: ErrorCopies, labels?: LabelOverrides): string;
|
|
17
|
+
/** Pass the profile's `labels`, or the profile's wording is skipped. */
|
|
18
|
+
declare function publicError(err: unknown, labels?: LabelOverrides): string;
|
|
19
|
+
/** Raw diagnostic for hosts, traces, and logs; never shown to end users. */
|
|
15
20
|
declare function describeError(err: unknown): string;
|
|
16
21
|
type ProducedError = TurnEventOf<'error'> & {
|
|
17
22
|
errorInternal: string;
|
|
18
23
|
};
|
|
19
|
-
/** No user wording yet: `
|
|
24
|
+
/** No user wording yet: `withPublicLabels` adds it where the event reaches the host, the one place that knows the profile. */
|
|
20
25
|
declare function toErrorEvent(err: unknown): ProducedError;
|
|
21
26
|
/** Wording already set (host copy) is kept. */
|
|
22
|
-
declare function
|
|
27
|
+
declare function withPublicLabels(event: TurnEvent, labels?: LabelOverrides): TurnEvent;
|
|
23
28
|
export type { ErrorCopies, ErrorCopy, ErrorKind, TheoremErrorOptions } from './theorem-error.js';
|
|
24
29
|
export { ERROR_KINDS } from './theorem-error.js';
|
|
25
30
|
export type { ProducedError };
|
|
26
|
-
export { describeError, errorKind, isAbortError, isTimeoutError, kindOfHttpStatus, publicError, TheoremError, throwIfAborted, toErrorEvent,
|
|
31
|
+
export { describeError, errorCopyText, errorKind, isAbortError, isTimeoutError, kindOfHttpStatus, publicError, TheoremError, throwIfAborted, toErrorEvent, withPublicLabels, };
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { labelText } from './labels.js';
|
|
2
2
|
import { TheoremError } from './theorem-error.js';
|
|
3
|
+
/** True when the value is an error named `AbortError`. */
|
|
3
4
|
function isAbortError(err) {
|
|
4
5
|
return errorName(err) === 'AbortError';
|
|
5
6
|
}
|
|
@@ -10,15 +11,16 @@ function isTimeoutError(err) {
|
|
|
10
11
|
function errorName(err) {
|
|
11
12
|
return err && typeof err === 'object' ? err.name : undefined;
|
|
12
13
|
}
|
|
14
|
+
/** Throws when the signal has aborted: its framework, abort or timeout reason, else an `AbortError`. */
|
|
13
15
|
function throwIfAborted(signal) {
|
|
14
16
|
if (!signal?.aborted) {
|
|
15
17
|
return;
|
|
16
18
|
}
|
|
17
19
|
const { reason } = signal;
|
|
18
|
-
if (isAbortError(reason) || isTimeoutError(reason)) {
|
|
20
|
+
if (reason instanceof TheoremError || isAbortError(reason) || isTimeoutError(reason)) {
|
|
19
21
|
throw reason;
|
|
20
22
|
}
|
|
21
|
-
throw new DOMException('The operation was aborted.', 'AbortError'); //
|
|
23
|
+
throw new DOMException('The operation was aborted.', 'AbortError'); // labels-exempt: DOM AbortError fingerprint
|
|
22
24
|
}
|
|
23
25
|
/** Anything that is not a `TheoremError` or an abort escaped every boundary that names kinds: a THEOREM bug. */
|
|
24
26
|
function errorKind(err) {
|
|
@@ -30,6 +32,7 @@ function errorKind(err) {
|
|
|
30
32
|
return 'cancelled';
|
|
31
33
|
return 'internal';
|
|
32
34
|
}
|
|
35
|
+
/** The error kind for an HTTP status: 401, 402 and 403 are `auth`; 408, 504 and 524 `timeout`; 429 `rate_limit`; 500 and above `unavailable`; the rest `unsupported`. */
|
|
33
36
|
function kindOfHttpStatus(status) {
|
|
34
37
|
if (status === 401 || status === 402 || status === 403)
|
|
35
38
|
return 'auth';
|
|
@@ -41,20 +44,22 @@ function kindOfHttpStatus(status) {
|
|
|
41
44
|
return 'unavailable';
|
|
42
45
|
return 'unsupported';
|
|
43
46
|
}
|
|
44
|
-
function kindText(kind,
|
|
45
|
-
return
|
|
47
|
+
function kindText(kind, labels, params) {
|
|
48
|
+
return labelText(`error.${kind}`, params, labels);
|
|
46
49
|
}
|
|
47
|
-
function wording(kind, copy,
|
|
48
|
-
|
|
49
|
-
|
|
50
|
+
function wording(kind, copy, labels) {
|
|
51
|
+
return copy ? errorCopyText(copy, labels) : kindText(kind, labels);
|
|
52
|
+
}
|
|
53
|
+
/** The named reasons an error carries, one line each, in the profile's wording. */
|
|
54
|
+
function errorCopyText(copy, labels) {
|
|
50
55
|
const lines = 'key' in copy ? [copy] : copy;
|
|
51
|
-
return lines.map((line) =>
|
|
56
|
+
return lines.map((line) => labelText(line.key, line.params, labels)).join('\n');
|
|
52
57
|
}
|
|
53
|
-
/** Pass the profile's `
|
|
54
|
-
function publicError(err,
|
|
55
|
-
return wording(errorKind(err), err instanceof TheoremError ? err.copy : undefined,
|
|
58
|
+
/** Pass the profile's `labels`, or the profile's wording is skipped. */
|
|
59
|
+
function publicError(err, labels) {
|
|
60
|
+
return wording(errorKind(err), err instanceof TheoremError ? err.copy : undefined, labels);
|
|
56
61
|
}
|
|
57
|
-
/** Raw diagnostic for hosts, traces and logs; never shown to end users. */
|
|
62
|
+
/** Raw diagnostic for hosts, traces, and logs; never shown to end users. */
|
|
58
63
|
function describeError(err) {
|
|
59
64
|
if (typeof err === 'string') {
|
|
60
65
|
return err;
|
|
@@ -64,7 +69,7 @@ function describeError(err) {
|
|
|
64
69
|
}
|
|
65
70
|
return String(err);
|
|
66
71
|
}
|
|
67
|
-
/** No user wording yet: `
|
|
72
|
+
/** No user wording yet: `withPublicLabels` adds it where the event reaches the host, the one place that knows the profile. */
|
|
68
73
|
function toErrorEvent(err) {
|
|
69
74
|
return {
|
|
70
75
|
type: 'error',
|
|
@@ -74,18 +79,18 @@ function toErrorEvent(err) {
|
|
|
74
79
|
};
|
|
75
80
|
}
|
|
76
81
|
/** Wording already set (host copy) is kept. */
|
|
77
|
-
function
|
|
82
|
+
function withPublicLabels(event, labels) {
|
|
78
83
|
if (event.type === 'error' && event.error === undefined) {
|
|
79
|
-
return { ...event, error: wording(event.errorKind, event.errorCopy,
|
|
84
|
+
return { ...event, error: wording(event.errorKind, event.errorCopy, labels) };
|
|
80
85
|
}
|
|
81
86
|
if (event.type === 'tool' &&
|
|
82
87
|
event.tool.phase === 'error' &&
|
|
83
88
|
event.tool.failure.error === undefined) {
|
|
84
89
|
const { tool } = event;
|
|
85
|
-
const error = kindText(tool.failure.kind,
|
|
90
|
+
const error = kindText(tool.failure.kind, labels, { tool: tool.name });
|
|
86
91
|
return { ...event, tool: { ...tool, failure: { ...tool.failure, error } } };
|
|
87
92
|
}
|
|
88
93
|
return event;
|
|
89
94
|
}
|
|
90
95
|
export { ERROR_KINDS } from './theorem-error.js';
|
|
91
|
-
export { describeError, errorKind, isAbortError, isTimeoutError, kindOfHttpStatus, publicError, TheoremError, throwIfAborted, toErrorEvent,
|
|
96
|
+
export { describeError, errorCopyText, errorKind, isAbortError, isTimeoutError, kindOfHttpStatus, publicError, TheoremError, throwIfAborted, toErrorEvent, withPublicLabels, };
|
|
@@ -1,15 +1,18 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
|
-
import { type
|
|
2
|
+
import { type Boundary } from './boundaries.js';
|
|
3
|
+
import { type LabelKey } from './labels.js';
|
|
3
4
|
import { type ErrorKind } from './theorem-error.js';
|
|
4
5
|
import { type GuardrailAction, type GuardrailStage, type Severity, type ToolOrigin, type TrustLevel } from './types.js';
|
|
6
|
+
/** The schema an error kind parses against. */
|
|
5
7
|
export declare const errorKindSchema: z.ZodType<ErrorKind>;
|
|
6
|
-
/** Wording for the user more specific than its kind's: a
|
|
8
|
+
/** Wording for the user more specific than its kind's: a label key and its parameters. */
|
|
7
9
|
export interface ErrorCopy {
|
|
8
|
-
key:
|
|
10
|
+
key: LabelKey;
|
|
9
11
|
params?: Record<string, string | number>;
|
|
10
12
|
}
|
|
11
13
|
/** One line of wording, or one per problem found. */
|
|
12
14
|
export type ErrorCopies = ErrorCopy | readonly ErrorCopy[];
|
|
15
|
+
/** The schema error wording parses against. */
|
|
13
16
|
export declare const errorCopiesSchema: z.ZodType<ErrorCopies>;
|
|
14
17
|
/**
|
|
15
18
|
* `depth` is hops from the user's turn: a direct tool call is 1; a tool result
|
|
@@ -22,6 +25,18 @@ export interface Provenance {
|
|
|
22
25
|
tool: string;
|
|
23
26
|
depth: number;
|
|
24
27
|
}
|
|
28
|
+
export declare const provenance: z.ZodObject<{
|
|
29
|
+
origin: z.ZodEnum<{
|
|
30
|
+
http: "http";
|
|
31
|
+
mcp: "mcp";
|
|
32
|
+
builtin: "builtin";
|
|
33
|
+
local: "local";
|
|
34
|
+
delegated: "delegated";
|
|
35
|
+
}>;
|
|
36
|
+
tool: z.ZodString;
|
|
37
|
+
depth: z.ZodNumber;
|
|
38
|
+
}, z.core.$strip>;
|
|
39
|
+
/** One rule match: the rule id, its severity, where it matched and, when kept, the matched text. */
|
|
25
40
|
export interface GuardrailHit {
|
|
26
41
|
/** Stable rule id, e.g. `egress.canary-leak`. */
|
|
27
42
|
rule: string;
|
|
@@ -40,13 +55,40 @@ export interface GuardrailHit {
|
|
|
40
55
|
label?: string;
|
|
41
56
|
/** Why a match matters, in a sentence, for a host's own rule. */
|
|
42
57
|
doc?: string;
|
|
58
|
+
/** The name of the host's pattern that matched; unset for a match of Theorem's own patterns. */
|
|
59
|
+
pattern?: string;
|
|
60
|
+
/**
|
|
61
|
+
* What about the match made it one, for `tool_instructions`: `override`, `tool_name`, `order`
|
|
62
|
+
* or `authority`. For a host's `find` that failed, how: `find_threw` or `find_result`.
|
|
63
|
+
*/
|
|
64
|
+
signal?: string;
|
|
43
65
|
}
|
|
66
|
+
export declare const guardrailHit: z.ZodObject<{
|
|
67
|
+
rule: z.ZodString;
|
|
68
|
+
severity: z.ZodEnum<{
|
|
69
|
+
low: "low";
|
|
70
|
+
medium: "medium";
|
|
71
|
+
high: "high";
|
|
72
|
+
info: "info";
|
|
73
|
+
}>;
|
|
74
|
+
span: z.ZodOptional<z.ZodObject<{
|
|
75
|
+
start: z.ZodNumber;
|
|
76
|
+
end: z.ZodNumber;
|
|
77
|
+
}, z.core.$strip>>;
|
|
78
|
+
match: z.ZodOptional<z.ZodString>;
|
|
79
|
+
label: z.ZodOptional<z.ZodString>;
|
|
80
|
+
doc: z.ZodOptional<z.ZodString>;
|
|
81
|
+
pattern: z.ZodOptional<z.ZodString>;
|
|
82
|
+
signal: z.ZodOptional<z.ZodString>;
|
|
83
|
+
}, z.core.$strip>;
|
|
44
84
|
/**
|
|
45
85
|
* Matched text rides only under `observability.include.guardrailMatchPreview`, so by default a
|
|
46
86
|
* trace sink can count and locate hits without becoming a second copy of the secret.
|
|
47
87
|
*/
|
|
48
88
|
export interface GuardrailEvent {
|
|
49
89
|
stage: GuardrailStage;
|
|
90
|
+
/** Where the text was crossing, when a detector read it there. */
|
|
91
|
+
boundary?: Boundary;
|
|
50
92
|
trust: TrustLevel;
|
|
51
93
|
action: GuardrailAction;
|
|
52
94
|
hits: GuardrailHit[];
|
|
@@ -54,4 +96,5 @@ export interface GuardrailEvent {
|
|
|
54
96
|
/** The block verdict's `errorInternal`: builder-only, stripped by `forClient`. */
|
|
55
97
|
errorInternal?: string;
|
|
56
98
|
}
|
|
99
|
+
/** The schema a guardrail event parses against. */
|
|
57
100
|
export declare const guardrailEventSchema: z.ZodType<GuardrailEvent>;
|