@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,14 +1,16 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
1
|
+
import { mapStrings } from '../kernel/engine/tree.js';
|
|
2
|
+
import { detectAt, detectEvent, detectReads, } from './detect-at.js';
|
|
3
|
+
import { readValue } from './detect-reply.js';
|
|
4
|
+
import { labelText } from './labels.js';
|
|
5
|
+
import { DETECT_RULES, EGRESS_RULES, TOOL_RULES } from './rules.js';
|
|
6
6
|
import { textForScan } from './serialize.js';
|
|
7
|
-
import { advisoryLevel
|
|
7
|
+
import { advisoryLevel } from './tool-directives.js';
|
|
8
|
+
/** The closing tag of the fence a tool result is wrapped in. */
|
|
8
9
|
const TOOL_CLOSE = '</tool_data>';
|
|
9
10
|
const TOOL_OPEN = '<tool_data';
|
|
10
11
|
/** Origins whose bytes the host does not author and cannot vouch for. */
|
|
11
12
|
const REMOTE_ORIGINS = new Set(['http', 'mcp', 'delegated']);
|
|
13
|
+
/** True when the tool's bytes come from outside the host. */
|
|
12
14
|
function isRemoteOrigin(origin) {
|
|
13
15
|
return REMOTE_ORIGINS.has(origin);
|
|
14
16
|
}
|
|
@@ -55,24 +57,24 @@ function stripToolFences(text) {
|
|
|
55
57
|
* The origin is on the tag rather than in prose so a result cannot claim a
|
|
56
58
|
* friendlier provenance than it has by writing one into its own body.
|
|
57
59
|
*/
|
|
58
|
-
function wrapToolData(text, provenance, advisory = 'none',
|
|
59
|
-
const guidance =
|
|
60
|
+
function wrapToolData(text, provenance, advisory = 'none', labels) {
|
|
61
|
+
const guidance = labelText('advisory.guidance', {}, labels).trim();
|
|
60
62
|
const attrs = `tool="${provenance.tool}" origin="${provenance.origin}"` +
|
|
61
63
|
(advisory === 'none' ? '' : ` advisory="${advisory}"`);
|
|
62
64
|
const notice = advisory === 'none'
|
|
63
65
|
? ''
|
|
64
|
-
: `${advisoryNotice(advisory,
|
|
66
|
+
: `${advisoryNotice(advisory, labels)}${guidance ? ` ${guidance}` : ''}\n`;
|
|
65
67
|
return `<${'tool_data'} ${attrs}>\n${notice}${stripToolFences(text)}\n${TOOL_CLOSE}`;
|
|
66
68
|
}
|
|
67
69
|
/**
|
|
68
70
|
* Deliberately an observation, not an instruction: what the agent should do about
|
|
69
|
-
* it is product behaviour, supplied by the host as
|
|
71
|
+
* it is product behaviour, supplied by the host as labels `advisory.guidance`. Emitted
|
|
70
72
|
* only when signals fired, so it stays rare enough to carry weight — a warning on
|
|
71
73
|
* every fetch is one the model learns to skip.
|
|
72
74
|
*/
|
|
73
|
-
function advisoryNotice(advisory,
|
|
75
|
+
function advisoryNotice(advisory, labels) {
|
|
74
76
|
const key = advisory === 'high' ? 'advisory.notice_high' : 'advisory.notice_elevated';
|
|
75
|
-
return
|
|
77
|
+
return labelText(key, {}, labels);
|
|
76
78
|
}
|
|
77
79
|
/**
|
|
78
80
|
* `finding` is the tool's summary and `data` its structured payload; both reach
|
|
@@ -88,88 +90,108 @@ function composeToolText(finding, data) {
|
|
|
88
90
|
}
|
|
89
91
|
return `${finding}\n${rendered.text}`;
|
|
90
92
|
}
|
|
93
|
+
const NOTHING_FOUND = { action: 'allow', hits: [] };
|
|
94
|
+
/** `text` read at `boundary`, or passed as it is when the text crosses none. */
|
|
95
|
+
function readAt(text, boundary, detect, scope) {
|
|
96
|
+
return boundary ? detectAt(text, boundary, detect, scope) : { ...NOTHING_FOUND, text };
|
|
97
|
+
}
|
|
91
98
|
/**
|
|
92
99
|
* Local host tools are still detected — a host tool reading a database returns
|
|
93
100
|
* data the host did not write — but only remote origins are fenced, because
|
|
94
101
|
* fencing a local tool's output would change prompts hosts have already tuned.
|
|
102
|
+
* `boundary` is absent for text that crosses none: a provider builtin's, or a
|
|
103
|
+
* failure already read at its own boundary.
|
|
95
104
|
*/
|
|
96
|
-
function guardToolResult(finding, data, provenance, policy, callableTools = [],
|
|
105
|
+
function guardToolResult(finding, data, provenance, policy, boundary, callableTools = [], labels) {
|
|
97
106
|
const composed = composeToolText(finding, data);
|
|
98
|
-
const
|
|
99
|
-
const
|
|
100
|
-
const changed = redacted !== composed;
|
|
101
|
-
// Directive detection runs on remote content only: a local tool's output is
|
|
102
|
-
// bytes the host's own code produced.
|
|
107
|
+
const detected = readAt(composed, boundary, policy.detect, { callable: callableTools });
|
|
108
|
+
const suspicious = detected.hits.filter(({ rule }) => rule === DETECT_RULES.tool_instructions);
|
|
103
109
|
const remote = isRemoteOrigin(provenance.origin);
|
|
104
|
-
const
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
const hits = [
|
|
108
|
-
...(changed ? [{ rule: TOOL_RULES.resultRedacted, severity: 'medium' }] : []),
|
|
109
|
-
...suspicious,
|
|
110
|
-
];
|
|
111
|
-
if (hits.length === 0) {
|
|
112
|
-
return { text: fenced };
|
|
113
|
-
}
|
|
114
|
-
return {
|
|
115
|
-
text: fenced,
|
|
116
|
-
...(suspicious.length > 0 ? { suspicious } : {}),
|
|
117
|
-
event: {
|
|
110
|
+
const event = detected.action === 'allow'
|
|
111
|
+
? undefined
|
|
112
|
+
: {
|
|
118
113
|
stage: 'tool_result',
|
|
114
|
+
...(boundary ? { boundary } : {}),
|
|
119
115
|
trust: 'untrusted',
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
hits,
|
|
116
|
+
action: detected.action,
|
|
117
|
+
hits: detected.hits,
|
|
123
118
|
provenance,
|
|
124
|
-
}
|
|
119
|
+
};
|
|
120
|
+
const found = {
|
|
121
|
+
...(suspicious.length > 0 ? { suspicious } : {}),
|
|
122
|
+
...(event ? { event } : {}),
|
|
125
123
|
};
|
|
124
|
+
if (detected.text === undefined)
|
|
125
|
+
return found;
|
|
126
|
+
const fenced = remote
|
|
127
|
+
? wrapToolData(detected.text, provenance, advisoryLevel(suspicious.map(({ signal }) => signal)), labels)
|
|
128
|
+
: detected.text;
|
|
129
|
+
return { text: fenced, ...found };
|
|
126
130
|
}
|
|
127
131
|
/**
|
|
128
132
|
* A remote server authors its own error strings, so an unguarded failure message
|
|
129
133
|
* is the cleanest injection path across this boundary: it reaches the model
|
|
130
134
|
* verbatim and is framed by the kernel as a system report.
|
|
131
135
|
*/
|
|
132
|
-
function guardToolFailureText(message, provenance, policy) {
|
|
133
|
-
const
|
|
134
|
-
const
|
|
135
|
-
if (redacted === message) {
|
|
136
|
-
return { text: redacted };
|
|
137
|
-
}
|
|
136
|
+
function guardToolFailureText(message, provenance, policy, boundary) {
|
|
137
|
+
const detected = readAt(stripToolFences(message), boundary, policy.detect);
|
|
138
|
+
const event = boundary ? detectEvent(boundary, detected, provenance) : undefined;
|
|
138
139
|
return {
|
|
139
|
-
text:
|
|
140
|
-
event: {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
140
|
+
...(detected.text === undefined ? {} : { text: detected.text }),
|
|
141
|
+
...(event ? { event } : {}),
|
|
142
|
+
};
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* A call's output, error, artifacts, and trace reach the person on the turn's events, apart from
|
|
146
|
+
* what the model read back: the host's server forwards them to the browser as they are. Each is
|
|
147
|
+
* read here at `tool_shown_<kind>`, so a key a tool returned is not shown. `readBack` is
|
|
148
|
+
* untouched: what the model read is settled at `tool_output_<kind>`.
|
|
149
|
+
*/
|
|
150
|
+
function guardShownValue(value, provenance, policy, boundary) {
|
|
151
|
+
if (!boundary || value === undefined)
|
|
152
|
+
return { value };
|
|
153
|
+
const found = readValue(value, boundary, policy.detect);
|
|
154
|
+
const event = detectEvent(boundary, found, provenance);
|
|
155
|
+
return {
|
|
156
|
+
...(found.action === 'block' ? {} : { value: found.value }),
|
|
157
|
+
...(event ? { event } : {}),
|
|
147
158
|
};
|
|
148
159
|
}
|
|
149
160
|
/**
|
|
150
161
|
* Arguments are model-authored, so the risk is not instruction smuggling but
|
|
151
162
|
* exfiltration: a credential lifted from context and posted outward as a
|
|
152
|
-
* parameter.
|
|
153
|
-
*
|
|
154
|
-
*
|
|
163
|
+
* parameter. The whole call is read as it will be sent; `redact` then replaces
|
|
164
|
+
* the match inside each string it sits in, so the tool is called with the
|
|
165
|
+
* placeholder. `scope` is what the detectors of what is the profile's own
|
|
166
|
+
* read of the turn: the canary, and its system instruction.
|
|
155
167
|
*/
|
|
156
|
-
function inspectToolArguments(args, policy) {
|
|
157
|
-
if (!
|
|
158
|
-
return {
|
|
168
|
+
function inspectToolArguments(args, provenance, policy, boundary, scope = {}) {
|
|
169
|
+
if (!(boundary && detectReads([boundary], policy.detect))) {
|
|
170
|
+
return { args };
|
|
159
171
|
}
|
|
172
|
+
const stopped = (hits) => {
|
|
173
|
+
const event = detectEvent(boundary, { action: 'block', hits }, provenance);
|
|
174
|
+
return event ? { event } : {};
|
|
175
|
+
};
|
|
160
176
|
const rendered = textForScan(args);
|
|
161
177
|
if (rendered.unscannable) {
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
const options = { sanitizeInput: false, redactSensitive: policy.redactSensitive };
|
|
165
|
-
if (sanitizeText(rendered.text, options) === rendered.text) {
|
|
166
|
-
return { action: 'allow' };
|
|
178
|
+
// why: Cannot inspect it, so cannot vouch for it. Fail closed.
|
|
179
|
+
return stopped([{ rule: EGRESS_RULES.unscannable, severity: 'high' }]);
|
|
167
180
|
}
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
181
|
+
const detected = detectAt(rendered.text, boundary, policy.detect, scope);
|
|
182
|
+
if (detected.action === 'block')
|
|
183
|
+
return stopped(detected.hits);
|
|
184
|
+
const event = detectEvent(boundary, detected, provenance);
|
|
185
|
+
if (detected.action !== 'redact')
|
|
186
|
+
return { args, ...(event ? { event } : {}) };
|
|
187
|
+
const safe = mapStrings(args, (text) => detectAt(text, boundary, policy.detect, scope).text ?? '');
|
|
188
|
+
const left = detectAt(textForScan(safe).text, boundary, policy.detect, scope).action;
|
|
189
|
+
// why: A match in a key, or one that runs across values, has no string to replace: the tool is not called.
|
|
190
|
+
if (left === 'redact' || left === 'block')
|
|
191
|
+
return stopped(detected.hits);
|
|
192
|
+
return { args: safe, ...(event ? { event } : {}) };
|
|
172
193
|
}
|
|
194
|
+
/** The guardrail event for a tool call verdict, or `undefined` when it was allowed. */
|
|
173
195
|
function toolCallEvent(verdict, provenance) {
|
|
174
196
|
if (verdict.action === 'allow') {
|
|
175
197
|
return undefined;
|
|
@@ -195,9 +217,11 @@ function recordTaint(taint, provenance, suspicious = []) {
|
|
|
195
217
|
}
|
|
196
218
|
return { sources: [...sources, provenance], suspicious: [...prior, ...suspicious] };
|
|
197
219
|
}
|
|
220
|
+
/** True when the turn has read content from outside the host. */
|
|
198
221
|
function isTainted(taint) {
|
|
199
222
|
return (taint?.sources.length ?? 0) > 0;
|
|
200
223
|
}
|
|
224
|
+
/** True when something the turn read looked like instructions. */
|
|
201
225
|
function isSuspicious(taint) {
|
|
202
226
|
return (taint?.suspicious.length ?? 0) > 0;
|
|
203
227
|
}
|
|
@@ -217,7 +241,7 @@ const GATE_RANK = {
|
|
|
217
241
|
* `block` says the profile asked for it to be refused. Reporting happens whether
|
|
218
242
|
* or not enforcement is configured, so the risk is visible before a host opts in.
|
|
219
243
|
*/
|
|
220
|
-
function checkTaintGate(taint, access, policy,
|
|
244
|
+
function checkTaintGate(taint, access, policy, labels) {
|
|
221
245
|
if (!isTainted(taint)) {
|
|
222
246
|
return { action: 'allow' };
|
|
223
247
|
}
|
|
@@ -232,17 +256,17 @@ function checkTaintGate(taint, access, policy, lexicon) {
|
|
|
232
256
|
severity: 'high',
|
|
233
257
|
},
|
|
234
258
|
];
|
|
235
|
-
// Gated on origin alone. Whether the content looked directive changes the rule
|
|
259
|
+
// why: Gated on origin alone. Whether the content looked directive changes the rule
|
|
236
260
|
// reported, never whether the call is refused.
|
|
237
261
|
if (rank < GATE_RANK[policy.taint?.afterRemoteRead ?? 'off']) {
|
|
238
262
|
return { action: 'flag', hits };
|
|
239
263
|
}
|
|
240
264
|
const read = taint?.sources.map((s) => s.tool).join(', ') ?? '';
|
|
241
|
-
const reason =
|
|
265
|
+
const reason = labelText(suspicious ? 'taint.reason_steered' : 'taint.reason_tainted', {}, labels);
|
|
242
266
|
return {
|
|
243
267
|
action: 'block',
|
|
244
268
|
hits,
|
|
245
|
-
rejection:
|
|
269
|
+
rejection: labelText('taint.blocked', { access, sources: read, reason }, labels),
|
|
246
270
|
};
|
|
247
271
|
}
|
|
248
|
-
export { checkTaintGate, composeToolText, guardToolFailureText, guardToolResult, inspectToolArguments, isRemoteOrigin, isSuspicious, isTainted, recordTaint, TOOL_CLOSE, toolCallEvent, wrapToolData, };
|
|
272
|
+
export { checkTaintGate, composeToolText, guardShownValue, guardToolFailureText, guardToolResult, inspectToolArguments, isRemoteOrigin, isSuspicious, isTainted, recordTaint, TOOL_CLOSE, toolCallEvent, wrapToolData, };
|
|
@@ -1,25 +1,47 @@
|
|
|
1
|
-
import type {
|
|
1
|
+
import type { DetectSpec, ResolvedAllow, ResolvedDetect } from './detectors.js';
|
|
2
2
|
import type { GivenUrls } from './egress-urls.js';
|
|
3
3
|
import type { GuardrailEvent, GuardrailHit, Provenance } from './event-schemas.js';
|
|
4
|
-
import type {
|
|
5
|
-
import type {
|
|
4
|
+
import type { LabelOverrides } from './labels.js';
|
|
5
|
+
import type { OwnTools } from './tool-leak.js';
|
|
6
6
|
export type { GuardrailEvent, GuardrailHit, Provenance };
|
|
7
7
|
/**
|
|
8
|
-
* - `trusted` — author-time profile text (`identity.system`).
|
|
9
|
-
*
|
|
8
|
+
* - `trusted` — author-time profile text (`identity.system`). Left verbatim: no
|
|
9
|
+
* injection or sensitive redaction, which would mangle the host's own instructions.
|
|
10
10
|
* - `assembled` — host-built per turn (`req.system`). Interpolates retrieval and
|
|
11
11
|
* user data, so it is permeable and takes full detection.
|
|
12
12
|
* - `untrusted` — user input, tool results, attachments, delegated agents.
|
|
13
13
|
*/
|
|
14
14
|
export declare const TRUST_LEVELS: readonly ["trusted", "assembled", "untrusted"];
|
|
15
|
+
/** One of {@linkcode TRUST_LEVELS}. */
|
|
15
16
|
export type TrustLevel = (typeof TRUST_LEVELS)[number];
|
|
17
|
+
/** The points a guardrail can run: input, history, system, attachments, tool calls, and results, output, thoughts, network, live audio, and traces. */
|
|
16
18
|
export declare const GUARDRAIL_STAGES: readonly ["input", "history", "system", "attachment", "tool_call", "tool_result", "output_delta", "output_final", "thought", "network", "live_inbound", "live_outbound", "trace"];
|
|
19
|
+
/** One of {@linkcode GUARDRAIL_STAGES}. */
|
|
17
20
|
export type GuardrailStage = (typeof GUARDRAIL_STAGES)[number];
|
|
18
|
-
/** Does not decide what happens next; that is `
|
|
21
|
+
/** Does not decide what happens next; that is `blockedReply`. */
|
|
19
22
|
export declare const SEVERITIES: readonly ["info", "low", "medium", "high"];
|
|
23
|
+
/** One of {@linkcode SEVERITIES}. */
|
|
20
24
|
export type Severity = (typeof SEVERITIES)[number];
|
|
21
|
-
|
|
22
|
-
export
|
|
25
|
+
/** What follows a blocked reply: the model rewrites it, or the user reads a refusal. */
|
|
26
|
+
export declare const BLOCKED_REPLY_ON_BLOCK: readonly ["retry", "refuse"];
|
|
27
|
+
/** One of {@linkcode BLOCKED_REPLY_ON_BLOCK}. */
|
|
28
|
+
export type BlockedReplyOnBlock = (typeof BLOCKED_REPLY_ON_BLOCK)[number];
|
|
29
|
+
/** What happens once a detector blocks a reply. */
|
|
30
|
+
export interface BlockedReplySpec {
|
|
31
|
+
/**
|
|
32
|
+
* `retry` (the default) tells the model what blocked the reply and has it write another;
|
|
33
|
+
* `refuse` sends the user the labels' `egress.refusal` in its place, or ends the part
|
|
34
|
+
* they already have with `egress.refusal_cut`.
|
|
35
|
+
*/
|
|
36
|
+
onBlock?: BlockedReplyOnBlock;
|
|
37
|
+
/**
|
|
38
|
+
* Under `retry`, how many times the model may rewrite a blocked reply (default 1). Once they
|
|
39
|
+
* are spent the reply is withheld and the turn ends in a `safety` error.
|
|
40
|
+
*/
|
|
41
|
+
maxRetries?: number;
|
|
42
|
+
}
|
|
43
|
+
/** {@linkcode BlockedReplySpec} with its defaults applied. */
|
|
44
|
+
export type ResolvedBlockedReply = Required<BlockedReplySpec>;
|
|
23
45
|
/**
|
|
24
46
|
* A discriminated union so a new variant fails every unhandled `switch` at
|
|
25
47
|
* compile time rather than falling through at runtime.
|
|
@@ -37,8 +59,8 @@ export type Verdict = {
|
|
|
37
59
|
action: 'block';
|
|
38
60
|
hits: GuardrailHit[];
|
|
39
61
|
/**
|
|
40
|
-
* Sent to the model on a repair turn when `onBlock` is `
|
|
41
|
-
* With `
|
|
62
|
+
* Sent to the model on a repair turn when `blockedReply.onBlock` is `retry`.
|
|
63
|
+
* With `refuse` the user reads the labels' `egress.refusal`.
|
|
42
64
|
*/
|
|
43
65
|
rejection: string;
|
|
44
66
|
/**
|
|
@@ -48,6 +70,7 @@ export type Verdict = {
|
|
|
48
70
|
errorInternal?: string;
|
|
49
71
|
};
|
|
50
72
|
export declare const GUARDRAIL_ACTIONS: readonly ["allow", "redact", "flag", "block"];
|
|
73
|
+
/** One of {@linkcode GUARDRAIL_ACTIONS}. */
|
|
51
74
|
export type GuardrailAction = (typeof GUARDRAIL_ACTIONS)[number];
|
|
52
75
|
/**
|
|
53
76
|
* `local` is host TypeScript the profile registered; `http` and `mcp` are remote
|
|
@@ -56,6 +79,7 @@ export type GuardrailAction = (typeof GUARDRAIL_ACTIONS)[number];
|
|
|
56
79
|
* reads as authoritative, which is why depth is tracked separately.
|
|
57
80
|
*/
|
|
58
81
|
export declare const TOOL_ORIGINS: readonly ["local", "builtin", "http", "mcp", "delegated"];
|
|
82
|
+
/** One of {@linkcode TOOL_ORIGINS}. */
|
|
59
83
|
export type ToolOrigin = (typeof TOOL_ORIGINS)[number];
|
|
60
84
|
/**
|
|
61
85
|
* Once a turn has read attacker-influenceable bytes, a later tool call is a
|
|
@@ -78,9 +102,16 @@ export interface TurnTaint {
|
|
|
78
102
|
* named a tool the model can call, or several signals agreed.
|
|
79
103
|
*/
|
|
80
104
|
export declare const ADVISORY_LEVELS: readonly ["none", "elevated", "high"];
|
|
105
|
+
/** One of {@linkcode ADVISORY_LEVELS}. */
|
|
81
106
|
export type AdvisoryLevel = (typeof ADVISORY_LEVELS)[number];
|
|
107
|
+
/** Which tool access levels refuse to run once a turn has read untrusted content. */
|
|
82
108
|
export declare const TAINT_GATES: readonly ["off", "destructive", "write"];
|
|
109
|
+
/** One of {@linkcode TAINT_GATES}. */
|
|
83
110
|
export type TaintGate = (typeof TAINT_GATES)[number];
|
|
111
|
+
/** What happens to a tool call that sends to a destination only remote content named. */
|
|
112
|
+
export declare const DESTINATION_GATES: readonly ["off", "confirm", "block"];
|
|
113
|
+
/** One of {@linkcode DESTINATION_GATES}. */
|
|
114
|
+
export type DestinationGate = (typeof DESTINATION_GATES)[number];
|
|
84
115
|
/**
|
|
85
116
|
* Enforcement is opt-in: every remote read is reported, but refusing tool calls
|
|
86
117
|
* changes what working agents may do, so the host declares which access levels
|
|
@@ -95,15 +126,12 @@ export type TaintGate = (typeof TAINT_GATES)[number];
|
|
|
95
126
|
*/
|
|
96
127
|
export interface TaintGuardrailSpec {
|
|
97
128
|
/**
|
|
98
|
-
* - `off` (default) — report only.
|
|
99
|
-
* - `destructive` — refuse hard-to-undo calls.
|
|
100
|
-
* - `write` — refuse those and any state-changing call.
|
|
101
|
-
*
|
|
102
129
|
* Stated as a capability threshold rather than a list of tool `access` values so
|
|
103
130
|
* the guardrail vocabulary stays independent of the tool registry; the kernel
|
|
104
131
|
* maps a tool's declared access onto it.
|
|
105
132
|
*/
|
|
106
133
|
afterRemoteRead?: TaintGate;
|
|
134
|
+
remoteDestination?: DestinationGate;
|
|
107
135
|
}
|
|
108
136
|
/** Facts a check may read. Deliberately excludes the full profile. */
|
|
109
137
|
export interface GuardrailContext {
|
|
@@ -111,10 +139,16 @@ export interface GuardrailContext {
|
|
|
111
139
|
trust: TrustLevel;
|
|
112
140
|
profileId: string;
|
|
113
141
|
canary?: string;
|
|
142
|
+
/**
|
|
143
|
+
* The canary was in what the model was given besides the system prompt (its
|
|
144
|
+
* input, the user's and tools' history): a reply repeating it is not a
|
|
145
|
+
* leak. It still binds prompt echo.
|
|
146
|
+
*/
|
|
147
|
+
canaryGiven?: boolean;
|
|
114
148
|
/**
|
|
115
149
|
* The private stretches of the system prompt as sent (`BoundSystem.private`),
|
|
116
|
-
*
|
|
117
|
-
*
|
|
150
|
+
* while the `prompt_leak` detector reads somewhere: text repeating one is a
|
|
151
|
+
* leak.
|
|
118
152
|
*/
|
|
119
153
|
privateSystem?: readonly string[];
|
|
120
154
|
role?: string;
|
|
@@ -128,41 +162,23 @@ export interface GuardrailContext {
|
|
|
128
162
|
* server. The kernel adds to them as the model is given more. Unset: none.
|
|
129
163
|
*/
|
|
130
164
|
givenUrls?: GivenUrls;
|
|
131
|
-
/** The profile's
|
|
132
|
-
|
|
165
|
+
/** The names of the profile's tools and of their parameters, for `tool_leak`. Unset: none. */
|
|
166
|
+
ownTools?: OwnTools;
|
|
167
|
+
/** The profile's labels, so a rejection reads in the host's wording. */
|
|
168
|
+
labels?: LabelOverrides;
|
|
133
169
|
}
|
|
134
170
|
/**
|
|
135
171
|
* Structured output travels alongside text so a profile with `outputs.structured`
|
|
136
|
-
*
|
|
172
|
+
* has it read by the detectors too.
|
|
137
173
|
*/
|
|
138
174
|
export interface OutboundPayload {
|
|
139
175
|
/** Concatenated user-visible text for this attempt. */
|
|
140
176
|
text: string;
|
|
141
177
|
structured?: unknown;
|
|
142
178
|
}
|
|
143
|
-
|
|
144
|
-
/** `enforce` or `checks`, never both. */
|
|
145
|
-
export interface ProfileEgressSpec {
|
|
146
|
-
/** The host's own check. */
|
|
147
|
-
enforce?: EgressEnforcer;
|
|
148
|
-
/**
|
|
149
|
-
* The bundled policy's checks: `true` runs each at its default, `false` none
|
|
150
|
-
* but the system-prompt leak checks, and an object switches the ones it names.
|
|
151
|
-
*/
|
|
152
|
-
checks?: boolean | EgressChecks;
|
|
153
|
-
onBlock?: EgressOnBlock;
|
|
154
|
-
maxRetries?: number;
|
|
155
|
-
/**
|
|
156
|
-
* For a host `enforce` only: characters the progressive gate holds back so
|
|
157
|
-
* `enforce` sees a match split across stream chunks before any of it is
|
|
158
|
-
* released (default `DEFAULT_HOLDBACK`, 256; on Live `LIVE_DEFAULT_HOLDBACK`,
|
|
159
|
-
* 96). The bundled `standardEgressEnforce` holds exactly what could still
|
|
160
|
-
* become a match, and setting this with it is a profile error.
|
|
161
|
-
*/
|
|
162
|
-
holdback?: number;
|
|
163
|
-
}
|
|
179
|
+
/** Which hosts and networks a tool's requests may reach. */
|
|
164
180
|
export interface NetworkGuardrailSpec {
|
|
165
|
-
/** Allows localhost, loopback and private subnets (local dev and testing). Default false. */
|
|
181
|
+
/** Allows localhost, loopback, and private subnets (local dev and testing). Default false. */
|
|
166
182
|
allowPrivateNetworks?: boolean;
|
|
167
183
|
/** Hostnames or IP addresses permitted regardless of private subnet status. */
|
|
168
184
|
allowedHosts?: string[];
|
|
@@ -176,30 +192,20 @@ export interface NetworkGuardrailSpec {
|
|
|
176
192
|
export interface QuotaGuardrailSpec {
|
|
177
193
|
perDay: number;
|
|
178
194
|
}
|
|
195
|
+
/** The guardrails a profile turns on, each with its own settings. */
|
|
179
196
|
export interface ProfileGuardrailsSpec {
|
|
180
197
|
/** Omitted means quota enforcement is not configured. */
|
|
181
198
|
quota?: QuotaGuardrailSpec;
|
|
182
199
|
/**
|
|
183
|
-
*
|
|
184
|
-
*
|
|
185
|
-
*
|
|
200
|
+
* What the kernel does when a detector finds a match, per boundary: one action
|
|
201
|
+
* for everything, or a rule for the detectors it names. Anything left out keeps
|
|
202
|
+
* its default (`DETECT_DEFAULTS`). A canary is bound into the system prompt
|
|
203
|
+
* while `canary_leak` is above `ignore` somewhere; the note that binds it is
|
|
204
|
+
* the labels' `canary.bind_note` (the profile's `labels` may replace it).
|
|
186
205
|
*/
|
|
187
|
-
|
|
188
|
-
/**
|
|
189
|
-
|
|
190
|
-
* (12) consecutive words of the system prompt as a leak: the dump the token
|
|
191
|
-
* alone cannot see. Default true; set false when the prompt holds text the
|
|
192
|
-
* agent is meant to quote word for word.
|
|
193
|
-
*/
|
|
194
|
-
promptEcho?: boolean;
|
|
195
|
-
sanitizeInput?: boolean;
|
|
196
|
-
/**
|
|
197
|
-
* Redact sensitive data from untrusted text before the model reads it:
|
|
198
|
-
* `true` (the default) every group, `false` none, an object the groups it
|
|
199
|
-
* switches, the rest on (`ids`, `financial`, `network`, `credentials`).
|
|
200
|
-
*/
|
|
201
|
-
redactSensitive?: SensitiveSelection;
|
|
202
|
-
egress?: ProfileEgressSpec;
|
|
206
|
+
detect?: DetectSpec;
|
|
207
|
+
/** What happens once a reply is blocked. Left out, the model rewrites it once. */
|
|
208
|
+
blockedReply?: BlockedReplySpec;
|
|
203
209
|
network?: NetworkGuardrailSpec;
|
|
204
210
|
taint?: TaintGuardrailSpec;
|
|
205
211
|
}
|
|
@@ -208,10 +214,15 @@ export type DecisionDisclosureVerdict = Extract<Verdict, {
|
|
|
208
214
|
action: 'allow' | 'block';
|
|
209
215
|
}>;
|
|
210
216
|
export type DecisionDisclosureEnforcer = (state: unknown, context: {
|
|
211
|
-
destination:
|
|
217
|
+
destination: string;
|
|
212
218
|
profileId: string;
|
|
213
219
|
model: string;
|
|
214
220
|
questionIds: string[];
|
|
221
|
+
/** The images the call sends with the state, by reference. Absent: none. */
|
|
222
|
+
assets?: Record<string, {
|
|
223
|
+
mimeType: 'image/png' | 'image/jpeg';
|
|
224
|
+
data: string;
|
|
225
|
+
}>;
|
|
215
226
|
}) => DecisionDisclosureVerdict | Promise<DecisionDisclosureVerdict>;
|
|
216
227
|
/**
|
|
217
228
|
* Keeps the shared guardrail vocabulary structurally compatible while the
|
|
@@ -223,20 +234,17 @@ export interface DecisionGuardrailsSpec extends Partial<ProfileGuardrailsSpec> {
|
|
|
223
234
|
};
|
|
224
235
|
}
|
|
225
236
|
/** The guardrail field names a `host` profile may set. */
|
|
226
|
-
export declare const HOST_GUARDRAIL_FIELDS: readonly ["
|
|
237
|
+
export declare const HOST_GUARDRAIL_FIELDS: readonly ["detect", "network"];
|
|
227
238
|
/** The guardrails that fire on the `invokeTool` path; the rest guard a model turn. */
|
|
228
239
|
export type HostGuardrailsSpec = Pick<ProfileGuardrailsSpec, (typeof HOST_GUARDRAIL_FIELDS)[number]>;
|
|
240
|
+
/** A profile's guardrails after defaults are applied. */
|
|
229
241
|
export interface ResolvedGuardrailPolicy {
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
egress?: ResolvedEgressSpec;
|
|
242
|
+
/** Every detector's action at every boundary. */
|
|
243
|
+
detect: ResolvedDetect;
|
|
244
|
+
/** What `ungiven_images` and `ungiven_links` let through besides the given URLs. */
|
|
245
|
+
allow: ResolvedAllow;
|
|
246
|
+
blockedReply: ResolvedBlockedReply;
|
|
236
247
|
network?: NetworkGuardrailSpec;
|
|
237
248
|
quota?: QuotaGuardrailSpec;
|
|
238
249
|
taint?: TaintGuardrailSpec;
|
|
239
250
|
}
|
|
240
|
-
export type ResolvedEgressSpec = Omit<ProfileEgressSpec, 'enforce' | 'checks'> & {
|
|
241
|
-
enforce: EgressEnforcer;
|
|
242
|
-
};
|
|
@@ -1,13 +1,14 @@
|
|
|
1
|
-
// Must not import from `src/kernel/`: the kernel type-imports `ProfileGuardrailsSpec`, and that edge
|
|
1
|
+
// invariant: Must not import from `src/kernel/`: the kernel type-imports `ProfileGuardrailsSpec`, and that edge
|
|
2
2
|
// stays one-directional. Other modules under `src/guardrails/` may import kernel types.
|
|
3
3
|
/**
|
|
4
|
-
* - `trusted` — author-time profile text (`identity.system`).
|
|
5
|
-
*
|
|
4
|
+
* - `trusted` — author-time profile text (`identity.system`). Left verbatim: no
|
|
5
|
+
* injection or sensitive redaction, which would mangle the host's own instructions.
|
|
6
6
|
* - `assembled` — host-built per turn (`req.system`). Interpolates retrieval and
|
|
7
7
|
* user data, so it is permeable and takes full detection.
|
|
8
8
|
* - `untrusted` — user input, tool results, attachments, delegated agents.
|
|
9
9
|
*/
|
|
10
10
|
export const TRUST_LEVELS = ['trusted', 'assembled', 'untrusted'];
|
|
11
|
+
/** The points a guardrail can run: input, history, system, attachments, tool calls, and results, output, thoughts, network, live audio, and traces. */
|
|
11
12
|
export const GUARDRAIL_STAGES = [
|
|
12
13
|
'input',
|
|
13
14
|
'history',
|
|
@@ -23,9 +24,10 @@ export const GUARDRAIL_STAGES = [
|
|
|
23
24
|
'live_outbound',
|
|
24
25
|
'trace',
|
|
25
26
|
];
|
|
26
|
-
/** Does not decide what happens next; that is `
|
|
27
|
+
/** Does not decide what happens next; that is `blockedReply`. */
|
|
27
28
|
export const SEVERITIES = ['info', 'low', 'medium', 'high'];
|
|
28
|
-
|
|
29
|
+
/** What follows a blocked reply: the model rewrites it, or the user reads a refusal. */
|
|
30
|
+
export const BLOCKED_REPLY_ON_BLOCK = ['retry', 'refuse'];
|
|
29
31
|
export const GUARDRAIL_ACTIONS = [
|
|
30
32
|
'allow',
|
|
31
33
|
'redact',
|
|
@@ -45,10 +47,12 @@ export const TOOL_ORIGINS = ['local', 'builtin', 'http', 'mcp', 'delegated'];
|
|
|
45
47
|
* named a tool the model can call, or several signals agreed.
|
|
46
48
|
*/
|
|
47
49
|
export const ADVISORY_LEVELS = ['none', 'elevated', 'high'];
|
|
50
|
+
/** Which tool access levels refuse to run once a turn has read untrusted content. */
|
|
48
51
|
export const TAINT_GATES = ['off', 'destructive', 'write'];
|
|
52
|
+
/** What happens to a tool call that sends to a destination only remote content named. */
|
|
53
|
+
export const DESTINATION_GATES = ['off', 'confirm', 'block'];
|
|
49
54
|
/** The guardrail field names a `host` profile may set. */
|
|
50
55
|
export const HOST_GUARDRAIL_FIELDS = [
|
|
51
|
-
'
|
|
52
|
-
'redactSensitive',
|
|
56
|
+
'detect',
|
|
53
57
|
'network',
|
|
54
58
|
];
|
|
@@ -1,9 +1,36 @@
|
|
|
1
|
+
import { type ErrorCopies, type ErrorKind } from '../guardrails/error.js';
|
|
2
|
+
import type { LabelOverrides } from '../guardrails/labels.js';
|
|
1
3
|
import type { TurnEvent } from '../kernel/types.js';
|
|
4
|
+
/** Options for `forClient` and `clientError`: who reads the copy, and whether evidence keeps its provider-native payload. */
|
|
2
5
|
export interface ClientTurnOptions {
|
|
3
6
|
/** Keep provider-native payloads on `evidence` events. Default: false; parsed fields remain. */
|
|
4
7
|
includeEvidenceRaw?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Who reads the copy. A `'visitor'` (the default) reads the profile's wording, and every
|
|
10
|
+
* builder-only diagnostic is stripped. A `'builder'` is whoever builds the app, on their own
|
|
11
|
+
* machine and keys, as in a local development tool: a failed turn, an ended session, and a tool
|
|
12
|
+
* call's failure read their raw reason in place of the profile's wording, and builder-only
|
|
13
|
+
* diagnostics stay. Never for a page visitors reach.
|
|
14
|
+
*/
|
|
15
|
+
reader?: 'visitor' | 'builder';
|
|
5
16
|
}
|
|
6
|
-
/**
|
|
17
|
+
/**
|
|
18
|
+
* The copy of an event its reader may have. For a visitor (the default) host-only diagnostics are
|
|
19
|
+
* stripped, so the copy is safe to forward to browsers or end-user SSE.
|
|
20
|
+
*/
|
|
7
21
|
declare function forClient(event: TurnEvent, options?: ClientTurnOptions): TurnEvent;
|
|
22
|
+
/** `forClient` over a list of events. */
|
|
8
23
|
declare function forClientEvents(events: TurnEvent[], options?: ClientTurnOptions): TurnEvent[];
|
|
9
|
-
|
|
24
|
+
/** A failure's wording and kind as a client reads them: the body of an error reply or line. */
|
|
25
|
+
type ClientError = {
|
|
26
|
+
error: string;
|
|
27
|
+
errorKind: ErrorKind;
|
|
28
|
+
errorCopy?: ErrorCopies;
|
|
29
|
+
};
|
|
30
|
+
/**
|
|
31
|
+
* A caught failure as its reader may have it, by the same rule as `forClient`: the profile's
|
|
32
|
+
* wording (pass its `labels`) for a visitor, the raw diagnostic for a builder.
|
|
33
|
+
*/
|
|
34
|
+
declare function clientError(err: unknown, labels?: LabelOverrides, options?: ClientTurnOptions): ClientError;
|
|
35
|
+
export type { ClientError };
|
|
36
|
+
export { clientError, forClient, forClientEvents };
|