@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
|
@@ -6,51 +6,42 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
/**
|
|
10
|
-
export declare const
|
|
11
|
-
readonly
|
|
12
|
-
readonly
|
|
9
|
+
/** What a detector found, the same id at every boundary; the event names the boundary. */
|
|
10
|
+
export declare const DETECT_RULES: {
|
|
11
|
+
readonly ids: "detect.ids";
|
|
12
|
+
readonly financial: "detect.financial";
|
|
13
|
+
readonly network: "detect.network";
|
|
14
|
+
readonly credentials: "detect.credentials";
|
|
15
|
+
readonly injection: "detect.injection";
|
|
16
|
+
readonly tool_instructions: "detect.tool_instructions";
|
|
17
|
+
readonly canary_leak: "detect.canary_leak";
|
|
18
|
+
readonly prompt_leak: "detect.prompt_leak";
|
|
19
|
+
readonly marker_leak: "detect.marker_leak";
|
|
20
|
+
readonly ungiven_images: "detect.ungiven_images";
|
|
21
|
+
readonly ungiven_links: "detect.ungiven_links";
|
|
22
|
+
readonly tool_leak: "detect.tool_leak";
|
|
13
23
|
};
|
|
14
|
-
/**
|
|
24
|
+
/** The rule a match of `key` reports: a detector of Theorem's, or the id of one of the host's own (`detect.acme.record`). */
|
|
25
|
+
export declare function detectRule(key: string): string;
|
|
26
|
+
/** What stops a reply besides a detector's match. */
|
|
15
27
|
export declare const EGRESS_RULES: {
|
|
16
|
-
readonly canary: "egress.canary-leak";
|
|
17
|
-
/** The reply repeats the system prompt (`guardrails.promptEcho`). */
|
|
18
|
-
readonly promptEcho: "egress.prompt-echo";
|
|
19
28
|
/**
|
|
20
29
|
* A provider-side built-in tool carried the canary or the system prompt. It
|
|
21
30
|
* ran before Theorem saw it: the data already left, so this is an incident.
|
|
22
31
|
*/
|
|
23
32
|
readonly providerToolLeak: "egress.provider-tool-leak";
|
|
24
|
-
readonly sensitive: "egress.sensitive-echo";
|
|
25
|
-
readonly boundary: "egress.system-boundary";
|
|
26
|
-
readonly injection: "egress.injection-echo";
|
|
27
|
-
/** An image loads a URL the model was not given, from a host not allowed. */
|
|
28
|
-
readonly image: "egress.image-exfil";
|
|
29
|
-
/** A link goes to a URL the model was not given, on a host not allowed. */
|
|
30
|
-
readonly link: "egress.link-exfil";
|
|
31
33
|
/** Payload could not be rendered for inspection — released output is unverified. */
|
|
32
34
|
readonly unscannable: "egress.unscannable";
|
|
33
|
-
readonly enforcerError: "egress.enforcer-error";
|
|
34
|
-
/** The progressive gate stopped the stream on a host verdict that named no rule. */
|
|
35
|
-
readonly blocked: "egress.blocked";
|
|
36
35
|
};
|
|
37
|
-
/**
|
|
38
|
-
export declare const DIRECTIVE_RULES: {
|
|
39
|
-
readonly toolName: "tool_result.names-callable-tool";
|
|
40
|
-
readonly imperative: "tool_result.imperative";
|
|
41
|
-
readonly authority: "tool_result.authority-claim";
|
|
42
|
-
};
|
|
43
|
-
/** The tool boundary: results and failures redacted, and calls flagged or blocked. */
|
|
36
|
+
/** A tool call refused for what the turn read before it. */
|
|
44
37
|
export declare const TOOL_RULES: {
|
|
45
|
-
readonly resultRedacted: "tool_result.redacted";
|
|
46
|
-
readonly failureRedacted: "tool_failure.redacted";
|
|
47
|
-
readonly sensitiveArgument: "tool_call.sensitive-argument";
|
|
48
38
|
readonly taintedTurn: "tool_call.tainted-turn";
|
|
49
39
|
readonly steeredTurn: "tool_call.steered-turn";
|
|
40
|
+
readonly remoteDestination: "tool_call.remote-destination";
|
|
50
41
|
};
|
|
51
42
|
/** A tool's network target refused before any request was made. */
|
|
52
43
|
export declare const NETWORK_RULES: {
|
|
53
44
|
readonly blocked: "network.blocked";
|
|
54
45
|
};
|
|
55
46
|
/** A rule id Theorem's own guardrails report. */
|
|
56
|
-
export type GuardrailRule = (typeof
|
|
47
|
+
export type GuardrailRule = (typeof DETECT_RULES)[keyof typeof DETECT_RULES] | (typeof EGRESS_RULES)[keyof typeof EGRESS_RULES] | (typeof TOOL_RULES)[keyof typeof TOOL_RULES] | (typeof NETWORK_RULES)[keyof typeof NETWORK_RULES];
|
|
@@ -6,47 +6,40 @@
|
|
|
6
6
|
*
|
|
7
7
|
* @module
|
|
8
8
|
*/
|
|
9
|
-
/**
|
|
10
|
-
export const
|
|
11
|
-
|
|
12
|
-
|
|
9
|
+
/** What a detector found, the same id at every boundary; the event names the boundary. */
|
|
10
|
+
export const DETECT_RULES = {
|
|
11
|
+
ids: 'detect.ids',
|
|
12
|
+
financial: 'detect.financial',
|
|
13
|
+
network: 'detect.network',
|
|
14
|
+
credentials: 'detect.credentials',
|
|
15
|
+
injection: 'detect.injection',
|
|
16
|
+
tool_instructions: 'detect.tool_instructions',
|
|
17
|
+
canary_leak: 'detect.canary_leak',
|
|
18
|
+
prompt_leak: 'detect.prompt_leak',
|
|
19
|
+
marker_leak: 'detect.marker_leak',
|
|
20
|
+
ungiven_images: 'detect.ungiven_images',
|
|
21
|
+
ungiven_links: 'detect.ungiven_links',
|
|
22
|
+
tool_leak: 'detect.tool_leak',
|
|
13
23
|
};
|
|
14
|
-
/**
|
|
24
|
+
/** The rule a match of `key` reports: a detector of Theorem's, or the id of one of the host's own (`detect.acme.record`). */
|
|
25
|
+
export function detectRule(key) {
|
|
26
|
+
return `detect.${key}`;
|
|
27
|
+
}
|
|
28
|
+
/** What stops a reply besides a detector's match. */
|
|
15
29
|
export const EGRESS_RULES = {
|
|
16
|
-
canary: 'egress.canary-leak',
|
|
17
|
-
/** The reply repeats the system prompt (`guardrails.promptEcho`). */
|
|
18
|
-
promptEcho: 'egress.prompt-echo', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
19
30
|
/**
|
|
20
31
|
* A provider-side built-in tool carried the canary or the system prompt. It
|
|
21
32
|
* ran before Theorem saw it: the data already left, so this is an incident.
|
|
22
33
|
*/
|
|
23
|
-
providerToolLeak: 'egress.provider-tool-leak', //
|
|
24
|
-
sensitive: 'egress.sensitive-echo',
|
|
25
|
-
boundary: 'egress.system-boundary',
|
|
26
|
-
injection: 'egress.injection-echo', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
27
|
-
/** An image loads a URL the model was not given, from a host not allowed. */
|
|
28
|
-
image: 'egress.image-exfil', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
29
|
-
/** A link goes to a URL the model was not given, on a host not allowed. */
|
|
30
|
-
link: 'egress.link-exfil', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
34
|
+
providerToolLeak: 'egress.provider-tool-leak', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
31
35
|
/** Payload could not be rendered for inspection — released output is unverified. */
|
|
32
|
-
unscannable: 'egress.unscannable', //
|
|
33
|
-
enforcerError: 'egress.enforcer-error', // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
34
|
-
/** The progressive gate stopped the stream on a host verdict that named no rule. */
|
|
35
|
-
blocked: 'egress.blocked',
|
|
36
|
+
unscannable: 'egress.unscannable', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
36
37
|
};
|
|
37
|
-
/**
|
|
38
|
-
export const DIRECTIVE_RULES = {
|
|
39
|
-
toolName: 'tool_result.names-callable-tool',
|
|
40
|
-
imperative: 'tool_result.imperative',
|
|
41
|
-
authority: 'tool_result.authority-claim',
|
|
42
|
-
};
|
|
43
|
-
/** The tool boundary: results and failures redacted, and calls flagged or blocked. */
|
|
38
|
+
/** A tool call refused for what the turn read before it. */
|
|
44
39
|
export const TOOL_RULES = {
|
|
45
|
-
resultRedacted: 'tool_result.redacted',
|
|
46
|
-
failureRedacted: 'tool_failure.redacted',
|
|
47
|
-
sensitiveArgument: 'tool_call.sensitive-argument',
|
|
48
40
|
taintedTurn: 'tool_call.tainted-turn',
|
|
49
41
|
steeredTurn: 'tool_call.steered-turn',
|
|
42
|
+
remoteDestination: 'tool_call.remote-destination',
|
|
50
43
|
};
|
|
51
44
|
/** A tool's network target refused before any request was made. */
|
|
52
45
|
export const NETWORK_RULES = {
|
|
@@ -1,23 +1,40 @@
|
|
|
1
|
-
import type { NormalizedTurnRequest, Profile, TurnEvent, TurnRequest } from '../kernel/types.js';
|
|
2
|
-
import { type
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
1
|
+
import type { NormalizedTurnRequest, Profile, TurnContext, TurnEvent, TurnHistoryMessage, TurnRequest } from '../kernel/types.js';
|
|
2
|
+
import { type Boundary } from './boundaries.js';
|
|
3
|
+
import { type BoundaryReader } from './detect-at.js';
|
|
4
|
+
import { TheoremError } from './theorem-error.js';
|
|
5
|
+
import type { GuardrailEvent } from './types.js';
|
|
6
|
+
/** A context package as the model reads it: text as written, anything else as JSON. */
|
|
7
|
+
declare function contextText(value: unknown): string;
|
|
8
|
+
/** Each sender's package read at the `context` boundary, with what was found there. */
|
|
9
|
+
declare function sanitizeContext(context: TurnContext | undefined, readerFor: () => BoundaryReader): {
|
|
10
|
+
context: TurnContext | undefined;
|
|
11
|
+
events: GuardrailEvent[];
|
|
12
|
+
blocked: boolean;
|
|
7
13
|
};
|
|
8
|
-
|
|
9
|
-
declare function redactSensitiveOnly(text: string): string;
|
|
14
|
+
/** The project id trimmed, or `undefined` when it is empty or has illegal characters. */
|
|
10
15
|
declare function sanitizeProjectId(id: string | undefined): string | undefined;
|
|
11
16
|
/**
|
|
12
17
|
* Exported because every path that injects messages into a turn needs it — turn
|
|
13
18
|
* history, and host steer injects mid-turn. A second copy would drift.
|
|
14
19
|
*/
|
|
15
|
-
declare function sanitizeHistory(history:
|
|
16
|
-
|
|
17
|
-
declare function
|
|
18
|
-
/**
|
|
19
|
-
|
|
20
|
+
declare function sanitizeHistory(history: TurnHistoryMessage[], reader: BoundaryReader): TurnHistoryMessage[];
|
|
21
|
+
/** The error a turn ends on when a detector set to `block` matched at `boundary`. */
|
|
22
|
+
declare function requestRefused(boundary: Boundary): TheoremError;
|
|
23
|
+
/** A turn request read at each boundary it crosses. */
|
|
24
|
+
interface SanitizedTurnRequest {
|
|
20
25
|
request: NormalizedTurnRequest;
|
|
26
|
+
/** One guardrail event for each boundary where something matched. */
|
|
21
27
|
events: TurnEvent[];
|
|
22
|
-
|
|
23
|
-
|
|
28
|
+
/** Set when a match blocks: the request does not reach the model, and the turn ends on this. */
|
|
29
|
+
refusal?: TheoremError;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* `req.system` is host-assembled per turn — it interpolates retrieval and user
|
|
33
|
+
* data, so it is read at its own boundary. `identity.system` never reaches this
|
|
34
|
+
* path and stays verbatim.
|
|
35
|
+
*/
|
|
36
|
+
declare function sanitizeTurnRequestWithEvents(req: TurnRequest, profile: Profile): SanitizedTurnRequest;
|
|
37
|
+
/** The turn request with its input cleaned under the profile's guardrails. Throws when a match blocks it. */
|
|
38
|
+
declare function sanitizeTurnRequest(req: TurnRequest, profile: Profile): NormalizedTurnRequest;
|
|
39
|
+
export type { SanitizedTurnRequest };
|
|
40
|
+
export { contextText, requestRefused, sanitizeContext, sanitizeHistory, sanitizeProjectId, sanitizeTurnRequest, sanitizeTurnRequestWithEvents, };
|
|
@@ -1,67 +1,71 @@
|
|
|
1
1
|
import { sanitizeTurnBlobs } from '../kernel/registry/attachments.js';
|
|
2
|
+
import { CONTEXT_SENDERS } from '../kernel/schema.js';
|
|
2
3
|
import { mapSystemPrompt } from '../kernel/system-parts.js';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
}
|
|
20
|
-
function sanitizeText(text, options) {
|
|
21
|
-
return detectText(text, options).text;
|
|
22
|
-
}
|
|
23
|
-
function redactSensitiveOnly(text) {
|
|
24
|
-
return detectText(text, { sanitizeInput: false, redactSensitive: true }).text;
|
|
25
|
-
}
|
|
26
|
-
function appendHits(into, hits) {
|
|
27
|
-
for (const hit of hits) {
|
|
28
|
-
into.push(hit);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function sanitizeSlots(slots, options, hits) {
|
|
4
|
+
import { recordOf } from './boundaries.js';
|
|
5
|
+
import { boundaryReader, detectEvent } from './detect-at.js';
|
|
6
|
+
import { guardrailTurnEvent } from './events.js';
|
|
7
|
+
import { resolveGuardrailPolicy } from './policy.js';
|
|
8
|
+
import { TheoremError } from './theorem-error.js';
|
|
9
|
+
/** The boundaries one turn request crosses, in the order their events are reported. */
|
|
10
|
+
const REQUEST_BOUNDARIES = [
|
|
11
|
+
'user',
|
|
12
|
+
'slots',
|
|
13
|
+
'repair',
|
|
14
|
+
'attachment',
|
|
15
|
+
'voice',
|
|
16
|
+
'history',
|
|
17
|
+
'system',
|
|
18
|
+
];
|
|
19
|
+
function sanitizeSlots(slots, reader) {
|
|
32
20
|
if (!slots) {
|
|
33
21
|
return slots;
|
|
34
22
|
}
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
23
|
+
return Object.fromEntries(Object.entries(slots).map(([key, value]) => [key, reader.read(value)]));
|
|
24
|
+
}
|
|
25
|
+
/** The browser's context is the visitor's to change; the host's is built by its own code, like turn system text. */
|
|
26
|
+
const CONTEXT_TRUST = {
|
|
27
|
+
client: 'untrusted',
|
|
28
|
+
server: 'assembled',
|
|
29
|
+
};
|
|
30
|
+
/** A context package as the model reads it: text as written, anything else as JSON. */
|
|
31
|
+
function contextText(value) {
|
|
32
|
+
return typeof value === 'string' ? value : JSON.stringify(value);
|
|
33
|
+
}
|
|
34
|
+
/** Each sender's package read at the `context` boundary, with what was found there. */
|
|
35
|
+
function sanitizeContext(context, readerFor) {
|
|
36
|
+
const events = [];
|
|
37
|
+
let blocked = false;
|
|
38
|
+
if (!context)
|
|
39
|
+
return { context, events, blocked };
|
|
40
|
+
const read = {};
|
|
41
|
+
for (const sender of CONTEXT_SENDERS) {
|
|
42
|
+
const value = context[sender];
|
|
43
|
+
if (value === undefined)
|
|
44
|
+
continue;
|
|
45
|
+
const reader = readerFor();
|
|
46
|
+
read[sender] = reader.read(contextText(value));
|
|
47
|
+
const found = reader.found();
|
|
48
|
+
const event = detectEvent('context', found);
|
|
49
|
+
if (event)
|
|
50
|
+
events.push({ ...event, trust: CONTEXT_TRUST[sender] });
|
|
51
|
+
blocked ||= found.action === 'block';
|
|
40
52
|
}
|
|
41
|
-
return
|
|
53
|
+
return { context: read, events, blocked };
|
|
42
54
|
}
|
|
43
55
|
const PROJECT_ID_OK = /^[A-Za-z0-9._-]+$/;
|
|
56
|
+
/** The project id trimmed, or `undefined` when it is empty or has illegal characters. */
|
|
44
57
|
function sanitizeProjectId(id) {
|
|
45
58
|
const trimmed = id?.trim();
|
|
46
59
|
return trimmed && PROJECT_ID_OK.test(trimmed) ? trimmed : undefined;
|
|
47
60
|
}
|
|
48
|
-
function sanitizeRepair(repair,
|
|
61
|
+
function sanitizeRepair(repair, reader) {
|
|
49
62
|
if (!repair) {
|
|
50
63
|
return repair;
|
|
51
64
|
}
|
|
52
|
-
const
|
|
53
|
-
const rejection = detectText(repair.rejection, options);
|
|
54
|
-
appendHits(hits, previous.hits);
|
|
55
|
-
appendHits(hits, rejection.hits);
|
|
56
|
-
let guidance = repair.guidance;
|
|
57
|
-
if (guidance) {
|
|
58
|
-
const detected = detectText(guidance, options);
|
|
59
|
-
appendHits(hits, detected.hits);
|
|
60
|
-
guidance = detected.text;
|
|
61
|
-
}
|
|
65
|
+
const guidance = repair.guidance ? reader.read(repair.guidance) : undefined;
|
|
62
66
|
return {
|
|
63
|
-
previousOutput:
|
|
64
|
-
rejection: rejection
|
|
67
|
+
previousOutput: reader.read(repair.previousOutput),
|
|
68
|
+
rejection: reader.read(repair.rejection),
|
|
65
69
|
...(guidance ? { guidance } : {}),
|
|
66
70
|
};
|
|
67
71
|
}
|
|
@@ -69,25 +73,10 @@ function sanitizeRepair(repair, options, hits) {
|
|
|
69
73
|
* Exported because every path that injects messages into a turn needs it — turn
|
|
70
74
|
* history, and host steer injects mid-turn. A second copy would drift.
|
|
71
75
|
*/
|
|
72
|
-
function sanitizeHistory(history,
|
|
76
|
+
function sanitizeHistory(history, reader) {
|
|
73
77
|
return history.map((m) => {
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
const detected = detectText(content, options);
|
|
77
|
-
appendHits(hits, detected.hits);
|
|
78
|
-
content = detected.text;
|
|
79
|
-
}
|
|
80
|
-
let parts = m.parts;
|
|
81
|
-
if (parts) {
|
|
82
|
-
parts = parts.map((p) => {
|
|
83
|
-
if (p.type !== 'text') {
|
|
84
|
-
return p;
|
|
85
|
-
}
|
|
86
|
-
const detected = detectText(p.text, options);
|
|
87
|
-
appendHits(hits, detected.hits);
|
|
88
|
-
return { ...p, text: detected.text };
|
|
89
|
-
});
|
|
90
|
-
}
|
|
78
|
+
const content = m.content === undefined ? undefined : reader.read(m.content);
|
|
79
|
+
const parts = m.parts?.map((p) => p.type === 'text' ? { ...p, text: reader.read(p.text) } : p);
|
|
91
80
|
return {
|
|
92
81
|
role: m.role,
|
|
93
82
|
...(content !== undefined ? { content } : {}),
|
|
@@ -96,53 +85,51 @@ function sanitizeHistory(history, options, hits = []) {
|
|
|
96
85
|
...(m.tool_call_id ? { tool_call_id: m.tool_call_id } : {}),
|
|
97
86
|
...(m.name ? { name: m.name } : {}),
|
|
98
87
|
...(m.metadata ? { metadata: m.metadata } : {}),
|
|
88
|
+
// why: Google refuses a call from the current turn replayed without its thought signature, so a reply resumed after a gate needs it.
|
|
89
|
+
...(m.reasoning ? { reasoning: m.reasoning } : {}),
|
|
99
90
|
};
|
|
100
91
|
});
|
|
101
92
|
}
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
events.push(event);
|
|
109
|
-
}
|
|
93
|
+
/** The error a turn ends on when a detector set to `block` matched at `boundary`. */
|
|
94
|
+
function requestRefused(boundary) {
|
|
95
|
+
// labels-exempt: developer contract / internal diagnostic — the user's wording is `detect.blocked`
|
|
96
|
+
return new TheoremError('input', `guardrails.detect blocked the request at ${boundary}`, {
|
|
97
|
+
copy: { key: 'detect.blocked' },
|
|
98
|
+
});
|
|
110
99
|
}
|
|
111
100
|
/**
|
|
112
101
|
* `req.system` is host-assembled per turn — it interpolates retrieval and user
|
|
113
|
-
* data, so it is
|
|
114
|
-
*
|
|
102
|
+
* data, so it is read at its own boundary. `identity.system` never reaches this
|
|
103
|
+
* path and stays verbatim.
|
|
115
104
|
*/
|
|
116
|
-
function
|
|
117
|
-
const
|
|
118
|
-
const
|
|
105
|
+
function sanitizeTurnRequestWithEvents(req, profile) {
|
|
106
|
+
const { detect } = resolveGuardrailPolicy(profile.guardrails);
|
|
107
|
+
const at = recordOf(REQUEST_BOUNDARIES, (boundary) => boundaryReader(boundary, detect));
|
|
119
108
|
const input = req.input ?? {};
|
|
120
|
-
const
|
|
121
|
-
const inputHits = [];
|
|
122
|
-
const historyHits = [];
|
|
123
|
-
const systemHits = [];
|
|
124
|
-
const { text: rawText } = input;
|
|
125
|
-
let text = rawText;
|
|
126
|
-
if (rawText !== undefined) {
|
|
127
|
-
const detected = detectText(rawText, untrusted);
|
|
128
|
-
appendHits(inputHits, detected.hits);
|
|
129
|
-
text = detected.text;
|
|
130
|
-
}
|
|
109
|
+
const text = input.text === undefined ? undefined : at.user.read(input.text);
|
|
131
110
|
const system = req.system === undefined
|
|
132
111
|
? undefined
|
|
133
|
-
: mapSystemPrompt(req.system, 'TurnRequest.system', (part) =>
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
112
|
+
: mapSystemPrompt(req.system, 'TurnRequest.system', (part) => at.system.read(part));
|
|
113
|
+
const slots = sanitizeSlots(input.slots, at.slots);
|
|
114
|
+
const told = sanitizeContext(input.context, () => boundaryReader('context', detect));
|
|
115
|
+
const repair = sanitizeRepair(input.repair, at.repair);
|
|
116
|
+
const history = input.history ? sanitizeHistory(input.history, at.history) : undefined;
|
|
117
|
+
const { attachments, voice } = input.attachments?.length || input.voice?.length
|
|
118
|
+
? sanitizeTurnBlobs(profile, input.attachments, input.voice, at)
|
|
119
|
+
: input;
|
|
120
|
+
const events = [];
|
|
121
|
+
let refusal;
|
|
122
|
+
for (const boundary of REQUEST_BOUNDARIES) {
|
|
123
|
+
const found = at[boundary].found();
|
|
124
|
+
const event = detectEvent(boundary, found);
|
|
125
|
+
if (event)
|
|
126
|
+
events.push(guardrailTurnEvent(event));
|
|
127
|
+
if (found.action === 'block')
|
|
128
|
+
refusal ??= requestRefused(boundary);
|
|
129
|
+
}
|
|
130
|
+
events.push(...told.events.map(guardrailTurnEvent));
|
|
131
|
+
if (told.blocked)
|
|
132
|
+
refusal ??= requestRefused('context');
|
|
146
133
|
return {
|
|
147
134
|
request: {
|
|
148
135
|
...req,
|
|
@@ -152,33 +139,22 @@ function sanitizeTurnRequestText(req, profile) {
|
|
|
152
139
|
...input,
|
|
153
140
|
text,
|
|
154
141
|
slots,
|
|
142
|
+
...(told.context ? { context: told.context } : {}),
|
|
155
143
|
repair,
|
|
156
144
|
history,
|
|
157
|
-
},
|
|
158
|
-
},
|
|
159
|
-
events,
|
|
160
|
-
};
|
|
161
|
-
}
|
|
162
|
-
function sanitizeTurnRequest(req, profile) {
|
|
163
|
-
return sanitizeTurnRequestWithEvents(req, profile).request;
|
|
164
|
-
}
|
|
165
|
-
/** Attachments and voice are validated but emit no guardrail events. */
|
|
166
|
-
function sanitizeTurnRequestWithEvents(req, profile) {
|
|
167
|
-
const { request: textSafe, events } = sanitizeTurnRequestText(req, profile);
|
|
168
|
-
const input = textSafe.input ?? {};
|
|
169
|
-
const { attachments, voice } = input.attachments?.length || input.voice?.length
|
|
170
|
-
? sanitizeTurnBlobs(profile, input.attachments, input.voice)
|
|
171
|
-
: input;
|
|
172
|
-
return {
|
|
173
|
-
request: {
|
|
174
|
-
...textSafe,
|
|
175
|
-
input: {
|
|
176
|
-
...input,
|
|
177
145
|
attachments,
|
|
178
146
|
voice,
|
|
179
147
|
},
|
|
180
148
|
},
|
|
181
149
|
events,
|
|
150
|
+
...(refusal ? { refusal } : {}),
|
|
182
151
|
};
|
|
183
152
|
}
|
|
184
|
-
|
|
153
|
+
/** The turn request with its input cleaned under the profile's guardrails. Throws when a match blocks it. */
|
|
154
|
+
function sanitizeTurnRequest(req, profile) {
|
|
155
|
+
const { request, refusal } = sanitizeTurnRequestWithEvents(req, profile);
|
|
156
|
+
if (refusal)
|
|
157
|
+
throw refusal;
|
|
158
|
+
return request;
|
|
159
|
+
}
|
|
160
|
+
export { contextText, requestRefused, sanitizeContext, sanitizeHistory, sanitizeProjectId, sanitizeTurnRequest, sanitizeTurnRequestWithEvents, };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The names of the sensitive-data groups and how a profile switches them, apart from the patterns
|
|
3
|
+
* that find them: what reads or shows a profile's settings has no need of the patterns.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The families of sensitive data, each switched on its own: a profile can
|
|
9
|
+
* redact credentials and card numbers but leave network addresses alone.
|
|
10
|
+
*/
|
|
11
|
+
declare const SENSITIVE_GROUPS: readonly ["ids", "financial", "network", "credentials"];
|
|
12
|
+
/** A group of sensitive-value checks: ids, financial, network, or credentials. */
|
|
13
|
+
type SensitiveGroup = (typeof SENSITIVE_GROUPS)[number];
|
|
14
|
+
/** Per group, whether it runs. A group left out keeps its default. */
|
|
15
|
+
type SensitiveSwitches = Partial<Record<SensitiveGroup, boolean>>;
|
|
16
|
+
/** `true` runs every group, `false` none; an object switches the groups it names. */
|
|
17
|
+
type SensitiveSelection = boolean | SensitiveSwitches;
|
|
18
|
+
/** Every group's switch, defaults applied. */
|
|
19
|
+
type SensitiveGroups = Readonly<Record<SensitiveGroup, boolean>>;
|
|
20
|
+
export type { SensitiveGroup, SensitiveGroups, SensitiveSelection, SensitiveSwitches };
|
|
21
|
+
export { SENSITIVE_GROUPS };
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The names of the sensitive-data groups and how a profile switches them, apart from the patterns
|
|
3
|
+
* that find them: what reads or shows a profile's settings has no need of the patterns.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
/**
|
|
8
|
+
* The families of sensitive data, each switched on its own: a profile can
|
|
9
|
+
* redact credentials and card numbers but leave network addresses alone.
|
|
10
|
+
*/
|
|
11
|
+
const SENSITIVE_GROUPS = ['ids', 'financial', 'network', 'credentials'];
|
|
12
|
+
export { SENSITIVE_GROUPS };
|
|
@@ -1,29 +1,22 @@
|
|
|
1
1
|
import { type RedactSpan } from '../observability/spans.js';
|
|
2
|
+
import type { SensitiveGroup, SensitiveSelection } from './sensitive-groups.js';
|
|
2
3
|
declare const CARD_CANDIDATE: RegExp;
|
|
3
|
-
|
|
4
|
-
* The families of sensitive data, each switched on its own: a profile can
|
|
5
|
-
* redact credentials and card numbers but leave network addresses alone.
|
|
6
|
-
*/
|
|
7
|
-
declare const SENSITIVE_GROUPS: readonly ["ids", "financial", "network", "credentials"];
|
|
8
|
-
type SensitiveGroup = (typeof SENSITIVE_GROUPS)[number];
|
|
9
|
-
/** Per group, whether it runs. A group left out keeps its default. */
|
|
10
|
-
type SensitiveSwitches = Partial<Record<SensitiveGroup, boolean>>;
|
|
11
|
-
/** `true` runs every group, `false` none; an object switches the groups it names. */
|
|
12
|
-
type SensitiveSelection = boolean | SensitiveSwitches;
|
|
13
|
-
/** Every group's switch, defaults applied. */
|
|
14
|
-
type SensitiveGroups = Readonly<Record<SensitiveGroup, boolean>>;
|
|
15
|
-
/** Every pattern, with its group. */
|
|
16
|
-
declare const SENSITIVE_PATTERNS: readonly {
|
|
4
|
+
interface SensitivePattern {
|
|
17
5
|
group: SensitiveGroup;
|
|
18
6
|
pattern: RegExp;
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
declare
|
|
24
|
-
/**
|
|
25
|
-
|
|
7
|
+
/** Whether a match at `at` of `text` counts. */
|
|
8
|
+
hit?: (match: string, text: string, at: number) => boolean;
|
|
9
|
+
}
|
|
10
|
+
/** Every pattern, with its group. */
|
|
11
|
+
declare const SENSITIVE_PATTERNS: readonly SensitivePattern[];
|
|
12
|
+
/**
|
|
13
|
+
* A card-number candidate at `at` of `text` that is a card: digits a card
|
|
14
|
+
* network issues, passing the Luhn check, outside a web address. A run of
|
|
15
|
+
* digits in an address is the address's own identifier: one random 19-digit
|
|
16
|
+
* identifier in a hundred passes the first two tests.
|
|
17
|
+
*/
|
|
18
|
+
declare function cardHit(blob: string, text: string, at: number): boolean;
|
|
26
19
|
/** Sensitive-data spans in `text`, from the groups `selection` runs (every group by default). */
|
|
27
20
|
declare function sensitiveSpans(text: string, selection?: SensitiveSelection): RedactSpan[];
|
|
28
|
-
export type {
|
|
29
|
-
export {
|
|
21
|
+
export type { SensitivePattern };
|
|
22
|
+
export { CARD_CANDIDATE, cardHit, SENSITIVE_PATTERNS, sensitiveSpans };
|