@theoremjs/agents 0.3.0 → 0.3.2
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 +277 -995
- package/esm/mod.d.ts +34 -20
- package/esm/mod.js +19 -12
- 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 +25 -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 +881 -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 +30 -22
- package/esm/src/guardrails/mod.js +19 -14
- 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 +4 -1
- package/esm/src/guardrails/quota.js +7 -2
- 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 +5 -2
- package/esm/src/guardrails/theorem-error.js +6 -3
- 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 +8 -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 +174 -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 +329 -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 +130 -88
- 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 +102 -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/api-error.d.ts +2 -0
- package/esm/src/providers/google/api-error.js +26 -18
- 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 +4 -210
- 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 +18 -0
- package/esm/src/providers/shared/retry.js +89 -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,5 +1,6 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
1
|
+
import { typoFolded } from './injection.js';
|
|
2
|
+
import { overrideFrame } from './injection-patterns.js';
|
|
3
|
+
import { normalizedView, normalizeForDetection } from './normalize.js';
|
|
3
4
|
/**
|
|
4
5
|
* Imperatives aimed at an agent rather than a reader.
|
|
5
6
|
*
|
|
@@ -23,8 +24,45 @@ const IMPERATIVES = [
|
|
|
23
24
|
* articles say "to remove a user", status reports say "the user has approved".
|
|
24
25
|
* Measured on a benign sample, directive signals alone produced false positives
|
|
25
26
|
* on most of it. Pairing a signal with a destination removed all of them.
|
|
27
|
+
*
|
|
28
|
+
* The pairing is close. A web page always carries an address somewhere, and a
|
|
29
|
+
* shop's page says "Remove This Item" and "if you need to exchange it, send us
|
|
30
|
+
* an email at …": of 20 real search results, a destination anywhere in the
|
|
31
|
+
* result flagged 3. An order or a claim counts when the destination is in what
|
|
32
|
+
* it orders, up to the next comma; a tool's name when one is in its sentence.
|
|
26
33
|
*/
|
|
27
34
|
const EXFIL_TARGET = /\b[\w.+-]{1,64}@[\w-]{1,63}(?:\.[\w-]{1,63}){1,4}\b|\bhttps?:\/\/\S{4,120}/i;
|
|
35
|
+
const EXFIL_TARGETS = new RegExp(EXFIL_TARGET.source, 'gi');
|
|
36
|
+
/** How far from a signal its sentence is read, where the text has no sentence ends. */
|
|
37
|
+
const SENTENCE_REACH = 240;
|
|
38
|
+
/** Whether a sentence of `text` ends at `at`: a line break, or `.`, `!`, or `?` before a space. */
|
|
39
|
+
function endsSentence(text, at) {
|
|
40
|
+
const ch = text[at];
|
|
41
|
+
if (ch === '\n')
|
|
42
|
+
return true;
|
|
43
|
+
return (ch === '.' || ch === '!' || ch === '?') && /\s/.test(text[at + 1] ?? ' ');
|
|
44
|
+
}
|
|
45
|
+
/** Whether a clause of `text` ends at `at`: where a sentence does, or at `,` or `;` before a space. */
|
|
46
|
+
function endsClause(text, at) {
|
|
47
|
+
const ch = text[at];
|
|
48
|
+
return endsSentence(text, at) || ((ch === ',' || ch === ';') && /\s/.test(text[at + 1] ?? ' '));
|
|
49
|
+
}
|
|
50
|
+
/** Where the stretch of `text` from `end` stops: at the first place `ends` holds, at most `SENTENCE_REACH` on. */
|
|
51
|
+
function reachFrom(text, end, ends) {
|
|
52
|
+
let to = end;
|
|
53
|
+
const ceiling = Math.min(text.length, end + SENTENCE_REACH);
|
|
54
|
+
while (to < ceiling && !ends(text, to))
|
|
55
|
+
to += 1;
|
|
56
|
+
return to;
|
|
57
|
+
}
|
|
58
|
+
/** Where the sentence of `text` holding `start` begins, at most `SENTENCE_REACH` back. */
|
|
59
|
+
function sentenceStart(text, start) {
|
|
60
|
+
let from = start;
|
|
61
|
+
const floor = Math.max(0, start - SENTENCE_REACH);
|
|
62
|
+
while (from > floor && !endsSentence(text, from - 1))
|
|
63
|
+
from -= 1;
|
|
64
|
+
return from;
|
|
65
|
+
}
|
|
28
66
|
/** Claims of permission or provenance the content cannot actually hold. */
|
|
29
67
|
const AUTHORITY = [
|
|
30
68
|
/\b(?:the\s+)?user\s+has\s+(?:already\s+)?(?:approved|authorised|authorized|confirmed|requested)\b/gi,
|
|
@@ -32,78 +70,126 @@ const AUTHORITY = [
|
|
|
32
70
|
/\bon\s+behalf\s+of\s+the\s+(?:user|operator|admin)\b/gi,
|
|
33
71
|
/\bthis\s+(?:is|was)\s+(?:pre-?)?(?:approved|authorised|authorized)\b/gi,
|
|
34
72
|
];
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
73
|
+
/**
|
|
74
|
+
* An order to set instructions aside. Data has no reason to address the
|
|
75
|
+
* agent's instructions, so here the order counts when negated and with more
|
|
76
|
+
* words between its verb and its object than `injection-patterns.ts` allows.
|
|
77
|
+
*/
|
|
78
|
+
const OVERRIDE = [new RegExp(overrideFrame(5), 'gi')];
|
|
79
|
+
/** Every destination in `text` between `from` and `to`. */
|
|
80
|
+
function targetsIn(text, from, to) {
|
|
81
|
+
return [...text.slice(from, to).matchAll(EXFIL_TARGETS)].map((match) => [
|
|
82
|
+
from + match.index,
|
|
83
|
+
from + match.index + match[0].length,
|
|
84
|
+
]);
|
|
85
|
+
}
|
|
86
|
+
/** Each match of `patterns` in `text` that names a destination before its clause ends, and the destinations it names. */
|
|
87
|
+
function directsOut(patterns, text) {
|
|
88
|
+
return patterns.flatMap((pattern) => [...text.matchAll(pattern)].flatMap((match) => {
|
|
89
|
+
const end = match.index + match[0].length;
|
|
90
|
+
const targets = targetsIn(text, match.index, reachFrom(text, end, endsClause));
|
|
91
|
+
return targets.length > 0 ? [[match.index, end], ...targets] : [];
|
|
92
|
+
}));
|
|
93
|
+
}
|
|
94
|
+
/** Each order in `text` to set instructions aside, read with its misspellings put right. */
|
|
95
|
+
function overrides(text) {
|
|
96
|
+
const folded = typoFolded(text);
|
|
97
|
+
return OVERRIDE.flatMap((pattern) => [...folded.text.matchAll(pattern)].map((match) => [folded.at(match.index), folded.at(match.index + match[0].length - 1) + 1]));
|
|
40
98
|
}
|
|
41
99
|
function isToolNameBoundary(ch) {
|
|
42
100
|
return ch === undefined || !/[a-z0-9_-]/i.test(ch);
|
|
43
101
|
}
|
|
44
|
-
/**
|
|
45
|
-
|
|
102
|
+
/**
|
|
103
|
+
* Where `text` names `tool`, at word boundaries, in a sentence with a
|
|
104
|
+
* destination: the name, and the destinations of its sentence. A name inside a
|
|
105
|
+
* destination (`https://shop.example/search`) is part of the address. Registry
|
|
106
|
+
* input is not compiled as a pattern.
|
|
107
|
+
*/
|
|
108
|
+
function directsToTool(text, tool) {
|
|
46
109
|
if (tool.length < 3) {
|
|
47
|
-
return
|
|
110
|
+
return [];
|
|
48
111
|
}
|
|
49
112
|
const haystack = text.toLowerCase();
|
|
50
113
|
const needle = tool.toLowerCase();
|
|
114
|
+
const found = [];
|
|
51
115
|
let at = haystack.indexOf(needle);
|
|
52
116
|
while (at >= 0) {
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
117
|
+
const end = at + needle.length;
|
|
118
|
+
if (isToolNameBoundary(haystack[at - 1]) && isToolNameBoundary(haystack[end])) {
|
|
119
|
+
const targets = targetsIn(text, sentenceStart(text, at), reachFrom(text, end, endsSentence));
|
|
120
|
+
const isInTarget = targets.some(([start, stop]) => start <= at && end <= stop);
|
|
121
|
+
if (targets.length > 0 && !isInTarget) {
|
|
122
|
+
found.push([at, end], ...targets);
|
|
123
|
+
}
|
|
57
124
|
}
|
|
58
|
-
at = haystack.indexOf(needle,
|
|
125
|
+
at = haystack.indexOf(needle, end);
|
|
126
|
+
}
|
|
127
|
+
return found;
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* What of a tool's text reads as an instruction to the agent: an order to set its instructions
|
|
131
|
+
* aside, the name of a tool it can call, an order, or a claim of authority. The last three count
|
|
132
|
+
* only beside a destination.
|
|
133
|
+
*/
|
|
134
|
+
const DIRECTIVE_SIGNALS = ['override', 'tool_name', 'order', 'authority'];
|
|
135
|
+
/** One range for each run of overlapping `ranges`, in order. */
|
|
136
|
+
function mergedRanges(ranges) {
|
|
137
|
+
const runs = [];
|
|
138
|
+
for (const [start, end] of [...ranges].sort((a, b) => a[0] - b[0])) {
|
|
139
|
+
const last = runs.at(-1);
|
|
140
|
+
if (last && start <= last[1])
|
|
141
|
+
last[1] = Math.max(last[1], end);
|
|
142
|
+
else
|
|
143
|
+
runs.push([start, end]);
|
|
59
144
|
}
|
|
60
|
-
return
|
|
145
|
+
return runs;
|
|
146
|
+
}
|
|
147
|
+
/** One directive for each run of overlapping `ranges`. */
|
|
148
|
+
function directivesOf(signal, ranges) {
|
|
149
|
+
return mergedRanges(ranges).map(([start, end]) => ({ signal, start, end }));
|
|
61
150
|
}
|
|
62
151
|
/**
|
|
63
152
|
* Real indirect injection rarely names what it attacks, so this looks for content that behaves
|
|
64
|
-
* like an instruction
|
|
65
|
-
* documenting an email API legitimately says "call send_email",
|
|
66
|
-
*
|
|
153
|
+
* like an instruction: each order, claim of authority, tool name, and destination, where it sits
|
|
154
|
+
* in `text`. A page documenting an email API legitimately says "call send_email", so the
|
|
155
|
+
* detector that reads with this (`tool_instructions`) starts at `flag`.
|
|
67
156
|
*
|
|
68
157
|
* `callableTools` is the set the model can invoke this turn. A result naming one is the
|
|
69
158
|
* highest-precision signal: ordinary data has no reason to, and no generic filter can check it
|
|
70
159
|
* without the turn's registry.
|
|
160
|
+
*
|
|
161
|
+
* The text is read normalized. Where that changes it, each signal found is placed on the
|
|
162
|
+
* stretch of `text` it was read from (`normalizedView`).
|
|
71
163
|
*/
|
|
72
|
-
function
|
|
73
|
-
if (!text
|
|
74
|
-
// No destination, no exfiltration. Action-shaped attacks that carry no target
|
|
75
|
-
// are left to the taint gate, which does not depend on reading the content.
|
|
164
|
+
function directives(text, callableTools = []) {
|
|
165
|
+
if (!text) {
|
|
76
166
|
return [];
|
|
77
167
|
}
|
|
78
168
|
const normalized = normalizeForDetection(text);
|
|
79
|
-
const
|
|
80
|
-
//
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
if (matches(IMPERATIVES, normalized)) {
|
|
85
|
-
hits.push({ rule: DIRECTIVE_RULES.imperative, severity: 'medium' });
|
|
86
|
-
}
|
|
87
|
-
if (matches(AUTHORITY, normalized)) {
|
|
88
|
-
hits.push({ rule: DIRECTIVE_RULES.authority, severity: 'medium' });
|
|
169
|
+
const found = directivesOf('override', overrides(normalized));
|
|
170
|
+
// why: No destination, no exfiltration. Action-shaped attacks that carry no target
|
|
171
|
+
// are left to the taint gate, which does not depend on reading the content.
|
|
172
|
+
if (EXFIL_TARGET.test(normalized)) {
|
|
173
|
+
found.push(...directivesOf('tool_name', callableTools.flatMap((tool) => directsToTool(normalized, tool))), ...directivesOf('order', directsOut(IMPERATIVES, normalized)), ...directivesOf('authority', directsOut(AUTHORITY, normalized)));
|
|
89
174
|
}
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
return
|
|
175
|
+
if (normalized === text || found.length === 0)
|
|
176
|
+
return found;
|
|
177
|
+
const view = normalizedView(text);
|
|
178
|
+
return found.map(({ signal, start, end }) => ({
|
|
179
|
+
signal,
|
|
180
|
+
start: view.start[start] ?? text.length,
|
|
181
|
+
end: view.end[end - 1] ?? text.length,
|
|
182
|
+
}));
|
|
94
183
|
}
|
|
95
184
|
/**
|
|
96
|
-
*
|
|
97
|
-
*
|
|
185
|
+
* How strongly a tool's text reads as instructions, by the `signals` found in it: `high` for an
|
|
186
|
+
* order to drop instructions, a callable tool's name, or two signals together.
|
|
98
187
|
*/
|
|
99
|
-
function advisoryLevel(
|
|
100
|
-
if (
|
|
188
|
+
function advisoryLevel(signals) {
|
|
189
|
+
if (signals.length === 0) {
|
|
101
190
|
return 'none';
|
|
102
191
|
}
|
|
103
|
-
const kinds = new Set(
|
|
104
|
-
|
|
105
|
-
return 'high';
|
|
106
|
-
}
|
|
107
|
-
return 'elevated';
|
|
192
|
+
const kinds = new Set(signals);
|
|
193
|
+
return kinds.has('tool_name') || kinds.has('override') || kinds.size > 1 ? 'high' : 'elevated';
|
|
108
194
|
}
|
|
109
|
-
export { advisoryLevel,
|
|
195
|
+
export { advisoryLevel, DIRECTIVE_SIGNALS, directives, mergedRanges };
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `tool_leak` reads for: the names of the profile's own tools, each as a word of its own,
|
|
3
|
+
* and the names of their parameters in double quotes, as tool-call JSON writes its keys. A
|
|
4
|
+
* parameter is often a plain word (`city`, `query`), so outside quotes it is left alone.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
import type { RedactSpan } from '../observability/spans.js';
|
|
9
|
+
/** The names of a profile's own tools, and of their parameters. */
|
|
10
|
+
interface OwnTools {
|
|
11
|
+
names: readonly string[];
|
|
12
|
+
params: readonly string[];
|
|
13
|
+
}
|
|
14
|
+
/** A literal of a name to find, and the pattern that reads a match of it. */
|
|
15
|
+
interface NamePattern {
|
|
16
|
+
literal: string;
|
|
17
|
+
regex: RegExp;
|
|
18
|
+
}
|
|
19
|
+
/** The pattern of each name of `own`. A tool's name starts and ends where a word does. */
|
|
20
|
+
declare function namePatterns(own: OwnTools): NamePattern[];
|
|
21
|
+
/** Every match of a name of `own` in `text`. */
|
|
22
|
+
declare function toolLeakSpans(text: string, own: OwnTools | undefined): RedactSpan[];
|
|
23
|
+
/** `own` without the names in `innocent`, or `undefined` when none is left. */
|
|
24
|
+
declare function ownToolsWithout(own: OwnTools | undefined, innocent?: readonly string[]): OwnTools | undefined;
|
|
25
|
+
export type { NamePattern, OwnTools };
|
|
26
|
+
export { namePatterns, ownToolsWithout, toolLeakSpans };
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What `tool_leak` reads for: the names of the profile's own tools, each as a word of its own,
|
|
3
|
+
* and the names of their parameters in double quotes, as tool-call JSON writes its keys. A
|
|
4
|
+
* parameter is often a plain word (`city`, `query`), so outside quotes it is left alone.
|
|
5
|
+
*
|
|
6
|
+
* @module
|
|
7
|
+
*/
|
|
8
|
+
const WORD = '[A-Za-z0-9_]';
|
|
9
|
+
function escaped(text) {
|
|
10
|
+
return text.replace(/[\\^$.*+?()[\]{}|/-]/g, '\\$&');
|
|
11
|
+
}
|
|
12
|
+
/** The pattern of each name of `own`. A tool's name starts and ends where a word does. */
|
|
13
|
+
function namePatterns(own) {
|
|
14
|
+
const after = `(?!${WORD})`;
|
|
15
|
+
const names = [...new Set(own.names)].filter(Boolean).map((name) => ({
|
|
16
|
+
literal: name,
|
|
17
|
+
regex: new RegExp(`(?<!${WORD})${escaped(name)}${after}`, 'g'),
|
|
18
|
+
}));
|
|
19
|
+
const keys = [...new Set(own.params)]
|
|
20
|
+
.filter(Boolean)
|
|
21
|
+
.flatMap((param) => [`"${param}"`, `\\"${param}\\"`])
|
|
22
|
+
.map((literal) => ({ literal, regex: new RegExp(escaped(literal), 'g') }));
|
|
23
|
+
return [...names, ...keys];
|
|
24
|
+
}
|
|
25
|
+
/** Every match of a name of `own` in `text`. */
|
|
26
|
+
function toolLeakSpans(text, own) {
|
|
27
|
+
if (!own)
|
|
28
|
+
return [];
|
|
29
|
+
return namePatterns(own).flatMap(({ literal, regex }) => text.includes(literal)
|
|
30
|
+
? [...text.matchAll(regex)].map(({ index, 0: match }) => ({
|
|
31
|
+
start: index,
|
|
32
|
+
end: index + match.length,
|
|
33
|
+
kind: 'tool',
|
|
34
|
+
}))
|
|
35
|
+
: []);
|
|
36
|
+
}
|
|
37
|
+
/** `own` without the names in `innocent`, or `undefined` when none is left. */
|
|
38
|
+
function ownToolsWithout(own, innocent = []) {
|
|
39
|
+
if (!own)
|
|
40
|
+
return undefined;
|
|
41
|
+
const names = own.names.filter((name) => !innocent.includes(name));
|
|
42
|
+
const params = own.params.filter((name) => !innocent.includes(name));
|
|
43
|
+
return names.length + params.length > 0 ? { names, params } : undefined;
|
|
44
|
+
}
|
|
45
|
+
export { namePatterns, ownToolsWithout, toolLeakSpans };
|
|
@@ -1,20 +1,26 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type { ToolBoundary } from './boundaries.js';
|
|
2
|
+
import { type DetectScope } from './detect-at.js';
|
|
3
|
+
import { type LabelOverrides } from './labels.js';
|
|
2
4
|
import type { AdvisoryLevel, GuardrailEvent, GuardrailHit, Provenance, ResolvedGuardrailPolicy, ToolOrigin, TurnTaint, Verdict } from './types.js';
|
|
5
|
+
/** The closing tag of the fence a tool result is wrapped in. */
|
|
3
6
|
declare const TOOL_CLOSE = "</tool_data>";
|
|
7
|
+
/** True when the tool's bytes come from outside the host. */
|
|
4
8
|
declare function isRemoteOrigin(origin: ToolOrigin): boolean;
|
|
5
9
|
/**
|
|
6
10
|
* The origin is on the tag rather than in prose so a result cannot claim a
|
|
7
11
|
* friendlier provenance than it has by writing one into its own body.
|
|
8
12
|
*/
|
|
9
|
-
declare function wrapToolData(text: string, provenance: Provenance, advisory?: AdvisoryLevel,
|
|
13
|
+
declare function wrapToolData(text: string, provenance: Provenance, advisory?: AdvisoryLevel, labels?: LabelOverrides): string;
|
|
14
|
+
/** A tool result after the guard: the text the model sees, any event, and the suspicious hits. */
|
|
10
15
|
export interface GuardedToolText {
|
|
11
|
-
|
|
16
|
+
/** Absent when a match blocks: the model does not read the text. */
|
|
17
|
+
text?: string;
|
|
12
18
|
/** Emitted when the guard did anything worth recording. */
|
|
13
19
|
event?: GuardrailEvent;
|
|
14
20
|
/**
|
|
15
|
-
*
|
|
16
|
-
* instruction-shaped, so
|
|
17
|
-
*
|
|
21
|
+
* What `tool_instructions` found. Legitimate tool output is frequently
|
|
22
|
+
* instruction-shaped, so the detector starts at `flag`; whatever its action,
|
|
23
|
+
* these raise the turn's taint.
|
|
18
24
|
*/
|
|
19
25
|
suspicious?: GuardrailHit[];
|
|
20
26
|
}
|
|
@@ -27,22 +33,45 @@ declare function composeToolText(finding: string, data: unknown): string;
|
|
|
27
33
|
* Local host tools are still detected — a host tool reading a database returns
|
|
28
34
|
* data the host did not write — but only remote origins are fenced, because
|
|
29
35
|
* fencing a local tool's output would change prompts hosts have already tuned.
|
|
36
|
+
* `boundary` is absent for text that crosses none: a provider builtin's, or a
|
|
37
|
+
* failure already read at its own boundary.
|
|
30
38
|
*/
|
|
31
|
-
declare function guardToolResult(finding: string, data: unknown, provenance: Provenance, policy: ResolvedGuardrailPolicy, callableTools?: readonly string[],
|
|
39
|
+
declare function guardToolResult(finding: string, data: unknown, provenance: Provenance, policy: ResolvedGuardrailPolicy, boundary: ToolBoundary | undefined, callableTools?: readonly string[], labels?: LabelOverrides): GuardedToolText;
|
|
32
40
|
/**
|
|
33
41
|
* A remote server authors its own error strings, so an unguarded failure message
|
|
34
42
|
* is the cleanest injection path across this boundary: it reaches the model
|
|
35
43
|
* verbatim and is framed by the kernel as a system report.
|
|
36
44
|
*/
|
|
37
|
-
declare function guardToolFailureText(message: string, provenance: Provenance, policy: ResolvedGuardrailPolicy): GuardedToolText;
|
|
45
|
+
declare function guardToolFailureText(message: string, provenance: Provenance, policy: ResolvedGuardrailPolicy, boundary: ToolBoundary | undefined): GuardedToolText;
|
|
46
|
+
/** What a call shows the person of one value, after it was read at `tool_shown_<kind>`. */
|
|
47
|
+
export interface ShownToolValue {
|
|
48
|
+
/** The value to show: every match set to `redact` replaced. Absent when a match blocks it. */
|
|
49
|
+
value?: unknown;
|
|
50
|
+
event?: GuardrailEvent;
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* A call's output, error, artifacts, and trace reach the person on the turn's events, apart from
|
|
54
|
+
* what the model read back: the host's server forwards them to the browser as they are. Each is
|
|
55
|
+
* read here at `tool_shown_<kind>`, so a key a tool returned is not shown. `readBack` is
|
|
56
|
+
* untouched: what the model read is settled at `tool_output_<kind>`.
|
|
57
|
+
*/
|
|
58
|
+
declare function guardShownValue(value: unknown, provenance: Provenance, policy: ResolvedGuardrailPolicy, boundary: ToolBoundary | undefined): ShownToolValue;
|
|
59
|
+
/** A tool call's arguments after they were read at their boundary. */
|
|
60
|
+
export interface InspectedToolArguments {
|
|
61
|
+
/** The arguments to call the tool with. Absent when a match blocks: the tool is not called. */
|
|
62
|
+
args?: unknown;
|
|
63
|
+
event?: GuardrailEvent;
|
|
64
|
+
}
|
|
38
65
|
/**
|
|
39
66
|
* Arguments are model-authored, so the risk is not instruction smuggling but
|
|
40
67
|
* exfiltration: a credential lifted from context and posted outward as a
|
|
41
|
-
* parameter.
|
|
42
|
-
*
|
|
43
|
-
*
|
|
68
|
+
* parameter. The whole call is read as it will be sent; `redact` then replaces
|
|
69
|
+
* the match inside each string it sits in, so the tool is called with the
|
|
70
|
+
* placeholder. `scope` is what the detectors of what is the profile's own
|
|
71
|
+
* read of the turn: the canary, and its system instruction.
|
|
44
72
|
*/
|
|
45
|
-
declare function inspectToolArguments(args: unknown, policy: ResolvedGuardrailPolicy):
|
|
73
|
+
declare function inspectToolArguments(args: unknown, provenance: Provenance, policy: ResolvedGuardrailPolicy, boundary: ToolBoundary | undefined, scope?: DetectScope): InspectedToolArguments;
|
|
74
|
+
/** The guardrail event for a tool call verdict, or `undefined` when it was allowed. */
|
|
46
75
|
declare function toolCallEvent(verdict: Verdict, provenance: Provenance): GuardrailEvent | undefined;
|
|
47
76
|
/**
|
|
48
77
|
* Only remote origins taint: a local host tool returns bytes the host's own code
|
|
@@ -50,12 +79,14 @@ declare function toolCallEvent(verdict: Verdict, provenance: Provenance): Guardr
|
|
|
50
79
|
* useless in practice.
|
|
51
80
|
*/
|
|
52
81
|
declare function recordTaint(taint: TurnTaint | undefined, provenance: Provenance, suspicious?: GuardrailHit[]): TurnTaint;
|
|
82
|
+
/** True when the turn has read content from outside the host. */
|
|
53
83
|
declare function isTainted(taint: TurnTaint | undefined): boolean;
|
|
84
|
+
/** True when something the turn read looked like instructions. */
|
|
54
85
|
declare function isSuspicious(taint: TurnTaint | undefined): boolean;
|
|
55
86
|
/**
|
|
56
87
|
* A `flag` says the call is happening on a tainted turn and is worth recording; a
|
|
57
88
|
* `block` says the profile asked for it to be refused. Reporting happens whether
|
|
58
89
|
* or not enforcement is configured, so the risk is visible before a host opts in.
|
|
59
90
|
*/
|
|
60
|
-
declare function checkTaintGate(taint: TurnTaint | undefined, access: string, policy: ResolvedGuardrailPolicy,
|
|
61
|
-
export { checkTaintGate, composeToolText, guardToolFailureText, guardToolResult, inspectToolArguments, isRemoteOrigin, isSuspicious, isTainted, recordTaint, TOOL_CLOSE, toolCallEvent, wrapToolData, };
|
|
91
|
+
declare function checkTaintGate(taint: TurnTaint | undefined, access: string, policy: ResolvedGuardrailPolicy, labels?: LabelOverrides): Verdict;
|
|
92
|
+
export { checkTaintGate, composeToolText, guardShownValue, guardToolFailureText, guardToolResult, inspectToolArguments, isRemoteOrigin, isSuspicious, isTainted, recordTaint, TOOL_CLOSE, toolCallEvent, wrapToolData, };
|