@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,36 +1,42 @@
|
|
|
1
|
-
// Imports nothing from `src/kernel/` but the dependency-free `Equals`: `src/kernel/turn-events.ts` imports these.
|
|
1
|
+
// invariant: Imports nothing from `src/kernel/` but the dependency-free `Equals`: `src/kernel/turn-events.ts` imports these.
|
|
2
2
|
import { z } from 'zod';
|
|
3
|
-
import {
|
|
3
|
+
import { BOUNDARIES } from './boundaries.js';
|
|
4
|
+
import { LABEL_KEYS } from './labels.js';
|
|
4
5
|
import { ERROR_KINDS } from './theorem-error.js';
|
|
5
6
|
import { GUARDRAIL_ACTIONS, GUARDRAIL_STAGES, SEVERITIES, TOOL_ORIGINS, TRUST_LEVELS, } from './types.js';
|
|
6
7
|
const errorKind = z.enum(ERROR_KINDS);
|
|
7
8
|
true;
|
|
9
|
+
/** The schema an error kind parses against. */
|
|
8
10
|
export const errorKindSchema = errorKind;
|
|
9
11
|
const errorCopy = z.object({
|
|
10
|
-
key: z.enum(
|
|
12
|
+
key: z.enum(LABEL_KEYS),
|
|
11
13
|
params: z.record(z.string(), z.union([z.string(), z.number()])).optional(),
|
|
12
14
|
});
|
|
13
15
|
true;
|
|
14
16
|
const errorCopies = z.union([errorCopy, z.array(errorCopy).readonly()]);
|
|
15
17
|
true;
|
|
18
|
+
/** The schema error wording parses against. */
|
|
16
19
|
export const errorCopiesSchema = errorCopies;
|
|
17
|
-
const provenance = z.object({
|
|
20
|
+
export const provenance = z.object({
|
|
18
21
|
origin: z.enum(TOOL_ORIGINS),
|
|
19
22
|
tool: z.string(),
|
|
20
23
|
depth: z.number(),
|
|
21
24
|
});
|
|
22
25
|
true;
|
|
23
|
-
const guardrailHit = z.object({
|
|
26
|
+
export const guardrailHit = z.object({
|
|
24
27
|
rule: z.string(),
|
|
25
28
|
severity: z.enum(SEVERITIES),
|
|
26
29
|
span: z.object({ start: z.number(), end: z.number() }).optional(),
|
|
27
30
|
match: z.string().optional(),
|
|
28
31
|
label: z.string().optional(),
|
|
29
32
|
doc: z.string().optional(),
|
|
33
|
+
pattern: z.string().optional(),
|
|
34
|
+
signal: z.string().optional(),
|
|
30
35
|
});
|
|
31
36
|
true;
|
|
32
37
|
const guardrailEvent = z.object({
|
|
33
38
|
stage: z.enum(GUARDRAIL_STAGES),
|
|
39
|
+
boundary: z.enum(BOUNDARIES).optional(),
|
|
34
40
|
trust: z.enum(TRUST_LEVELS),
|
|
35
41
|
action: z.enum(GUARDRAIL_ACTIONS),
|
|
36
42
|
hits: z.array(guardrailHit),
|
|
@@ -38,4 +44,5 @@ const guardrailEvent = z.object({
|
|
|
38
44
|
errorInternal: z.string().optional(),
|
|
39
45
|
});
|
|
40
46
|
true;
|
|
47
|
+
/** The schema a guardrail event parses against. */
|
|
41
48
|
export const guardrailEventSchema = guardrailEvent;
|
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
import type { TurnEvent, TurnEventOf } from '../kernel/turn-events.js';
|
|
2
2
|
import type { GuardrailAction, GuardrailEvent, GuardrailHit, GuardrailStage, Provenance, TrustLevel, Verdict } from './types.js';
|
|
3
|
+
/** Wraps a guardrail event as a turn event. */
|
|
3
4
|
declare function guardrailTurnEvent(guardrail: GuardrailEvent): TurnEventOf<'guardrail'>;
|
|
4
|
-
/** `allow` yields nothing; `flag`, `redact
|
|
5
|
+
/** `allow` yields nothing; `flag`, `redact`, and `block` all emit so hosts and traces can count hits. */
|
|
5
6
|
declare function guardrailFromVerdict(stage: GuardrailStage, trust: TrustLevel, verdict: Verdict, provenance?: Provenance): TurnEventOf<'guardrail'> | undefined;
|
|
7
|
+
/** Builds the guardrail event for the hits found at a stage. */
|
|
6
8
|
declare function guardrailFromHits(stage: GuardrailStage, trust: TrustLevel, hits: GuardrailHit[], action?: GuardrailAction, provenance?: Provenance): TurnEventOf<'guardrail'> | undefined;
|
|
9
|
+
/** The guardrail turn event, with the matched text kept or dropped. */
|
|
7
10
|
declare function projectGuardrailTurnEvent(event: TurnEventOf<'guardrail'>, includeMatch: boolean): TurnEventOf<'guardrail'>;
|
|
11
|
+
/** The turn event unchanged, or a guardrail one with the matched text kept or dropped. */
|
|
8
12
|
declare function projectGuardrailTurnEvent(event: TurnEvent, includeMatch: boolean): TurnEvent;
|
|
9
13
|
export { guardrailFromHits, guardrailFromVerdict, guardrailTurnEvent, projectGuardrailTurnEvent };
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { projectGuardrailEvent } from './hits.js';
|
|
2
|
+
/** Wraps a guardrail event as a turn event. */
|
|
2
3
|
function guardrailTurnEvent(guardrail) {
|
|
3
4
|
return { type: 'guardrail', guardrail };
|
|
4
5
|
}
|
|
5
|
-
/** `allow` yields nothing; `flag`, `redact
|
|
6
|
+
/** `allow` yields nothing; `flag`, `redact`, and `block` all emit so hosts and traces can count hits. */
|
|
6
7
|
function guardrailFromVerdict(stage, trust, verdict, provenance) {
|
|
7
8
|
if (verdict.action === 'allow') {
|
|
8
9
|
return undefined;
|
|
@@ -18,6 +19,7 @@ function guardrailFromVerdict(stage, trust, verdict, provenance) {
|
|
|
18
19
|
: {}),
|
|
19
20
|
});
|
|
20
21
|
}
|
|
22
|
+
/** Builds the guardrail event for the hits found at a stage. */
|
|
21
23
|
function guardrailFromHits(stage, trust, hits, action = 'redact', provenance) {
|
|
22
24
|
if (hits.length === 0) {
|
|
23
25
|
return undefined;
|
|
@@ -30,6 +32,7 @@ function guardrailFromHits(stage, trust, hits, action = 'redact', provenance) {
|
|
|
30
32
|
...(provenance ? { provenance } : {}),
|
|
31
33
|
});
|
|
32
34
|
}
|
|
35
|
+
/** The turn event unchanged, or a guardrail one with the matched text kept or dropped. */
|
|
33
36
|
function projectGuardrailTurnEvent(event, includeMatch) {
|
|
34
37
|
if (event.type !== 'guardrail') {
|
|
35
38
|
return event;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a model is told when a reply a detector blocked is retried: for each detector that
|
|
3
|
+
* matched, its hint and, where a match may be repeated, what it matched. The retry is read at the
|
|
4
|
+
* `repair` boundary like any other text on its way to the model, so a secret quoted here meets
|
|
5
|
+
* the action the profile set there.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { type ResolvedDetect } from './detectors.js';
|
|
10
|
+
import type { GuardrailHit } from './event-schemas.js';
|
|
11
|
+
import { type LabelOverrides } from './labels.js';
|
|
12
|
+
/** The rejection a retry carries for the `hits` that stopped a reply, a line for each rule among them. */
|
|
13
|
+
declare function retryRejection(hits: readonly GuardrailHit[], detect: ResolvedDetect, labels?: LabelOverrides): string;
|
|
14
|
+
export { retryRejection };
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a model is told when a reply a detector blocked is retried: for each detector that
|
|
3
|
+
* matched, its hint and, where a match may be repeated, what it matched. The retry is read at the
|
|
4
|
+
* `repair` boundary like any other text on its way to the model, so a secret quoted here meets
|
|
5
|
+
* the action the profile set there.
|
|
6
|
+
*
|
|
7
|
+
* @module
|
|
8
|
+
*/
|
|
9
|
+
import { isDetector } from './detectors.js';
|
|
10
|
+
import { labelText } from './labels.js';
|
|
11
|
+
import { DETECT_RULES, EGRESS_RULES } from './rules.js';
|
|
12
|
+
/** The hint of what stops a reply besides a detector's match. */
|
|
13
|
+
const OTHER_HINTS = {
|
|
14
|
+
[EGRESS_RULES.unscannable]: 'egress.hint_unscannable',
|
|
15
|
+
[EGRESS_RULES.providerToolLeak]: 'egress.hint_provider_tool_leak',
|
|
16
|
+
};
|
|
17
|
+
/** The rules whose match is the profile's own, and is never repeated. */
|
|
18
|
+
const UNQUOTED = [DETECT_RULES.canary_leak, DETECT_RULES.prompt_leak];
|
|
19
|
+
/** How many matches a detector's line quotes, and how much of each. */
|
|
20
|
+
const MAX_QUOTED = 3;
|
|
21
|
+
const MAX_QUOTE = 120;
|
|
22
|
+
const DETECT_PREFIX = 'detect.';
|
|
23
|
+
/** The hint of the rule `hit` reports: the profile's, or else the labels'. */
|
|
24
|
+
function hintOf(hit, detect, labels) {
|
|
25
|
+
const other = OTHER_HINTS[hit.rule];
|
|
26
|
+
if (other)
|
|
27
|
+
return labelText(other, {}, labels);
|
|
28
|
+
const key = hit.rule.startsWith(DETECT_PREFIX) ? hit.rule.slice(DETECT_PREFIX.length) : hit.rule;
|
|
29
|
+
if (isDetector(key)) {
|
|
30
|
+
return detect.hints?.[key] ?? labelText(`detect.hint.${key}`, {}, labels);
|
|
31
|
+
}
|
|
32
|
+
const host = detect.host?.find(({ id }) => id === key);
|
|
33
|
+
const label = host?.label ?? hit.label ?? key;
|
|
34
|
+
return host?.hint ?? labelText('detect.hint.own', { label }, labels);
|
|
35
|
+
}
|
|
36
|
+
/** The matched text of `hits` a line may quote: each once, the first few, cut to length. */
|
|
37
|
+
function quoted(hits) {
|
|
38
|
+
const matches = hits.flatMap(({ rule, match }) => match && !UNQUOTED.includes(rule) ? [match] : []);
|
|
39
|
+
return [...new Set(matches)]
|
|
40
|
+
.slice(0, MAX_QUOTED)
|
|
41
|
+
.map((match) => JSON.stringify(match.length > MAX_QUOTE ? match.slice(0, MAX_QUOTE) : match));
|
|
42
|
+
}
|
|
43
|
+
/** The rejection a retry carries for the `hits` that stopped a reply, a line for each rule among them. */
|
|
44
|
+
function retryRejection(hits, detect, labels) {
|
|
45
|
+
const byRule = new Map();
|
|
46
|
+
for (const hit of hits)
|
|
47
|
+
byRule.set(hit.rule, [...(byRule.get(hit.rule) ?? []), hit]);
|
|
48
|
+
const lines = [...byRule.values()].map((found) => {
|
|
49
|
+
const hint = hintOf(found[0], detect, labels);
|
|
50
|
+
const matches = quoted(found);
|
|
51
|
+
return matches.length > 0
|
|
52
|
+
? labelText('egress.rejection_found', { hint, matches: matches.join(', ') }, labels)
|
|
53
|
+
: hint;
|
|
54
|
+
});
|
|
55
|
+
return labelText('egress.rejection', { found: lines.join('\n') }, labels);
|
|
56
|
+
}
|
|
57
|
+
export { retryRejection };
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
import type { GuardrailEvent, GuardrailHit, Severity } from './types.js';
|
|
2
|
+
/** A canary leak. Never carries the live token, only a placeholder. */
|
|
3
|
+
declare const CANARY_HIT: GuardrailHit;
|
|
4
|
+
/** A prompt leak. Never carries the words: they are the private system instruction's. */
|
|
5
|
+
declare const PROMPT_ECHO_HIT: GuardrailHit;
|
|
6
|
+
/** A guardrail hit for a span of the text, with the matched text sliced from it. */
|
|
2
7
|
declare function hitFromSpan(text: string, span: {
|
|
3
8
|
start: number;
|
|
4
9
|
end: number;
|
|
10
|
+
name?: string;
|
|
5
11
|
}, rule: string, severity: Severity): GuardrailHit;
|
|
6
12
|
/** `match` is the caught text itself, so hosts and traces get it only via `observability.include.guardrailMatchPreview`. */
|
|
7
13
|
declare function projectGuardrailEvent(event: GuardrailEvent, includeMatch: boolean): GuardrailEvent;
|
|
8
|
-
export { hitFromSpan, projectGuardrailEvent };
|
|
14
|
+
export { CANARY_HIT, hitFromSpan, PROMPT_ECHO_HIT, projectGuardrailEvent };
|
|
@@ -1,9 +1,20 @@
|
|
|
1
|
+
import { DETECT_RULES } from './rules.js';
|
|
2
|
+
/** A canary leak. Never carries the live token, only a placeholder. */
|
|
3
|
+
const CANARY_HIT = {
|
|
4
|
+
rule: DETECT_RULES.canary_leak,
|
|
5
|
+
severity: 'high',
|
|
6
|
+
match: '[canary]',
|
|
7
|
+
};
|
|
8
|
+
/** A prompt leak. Never carries the words: they are the private system instruction's. */
|
|
9
|
+
const PROMPT_ECHO_HIT = { rule: DETECT_RULES.prompt_leak, severity: 'high' };
|
|
10
|
+
/** A guardrail hit for a span of the text, with the matched text sliced from it. */
|
|
1
11
|
function hitFromSpan(text, span, rule, severity) {
|
|
2
12
|
return {
|
|
3
13
|
rule,
|
|
4
14
|
severity,
|
|
5
15
|
span: { start: span.start, end: span.end },
|
|
6
16
|
match: text.slice(span.start, span.end),
|
|
17
|
+
...(span.name === undefined ? {} : { pattern: span.name }),
|
|
7
18
|
};
|
|
8
19
|
}
|
|
9
20
|
/** `match` is the caught text itself, so hosts and traces get it only via `observability.include.guardrailMatchPreview`. */
|
|
@@ -16,4 +27,4 @@ function projectGuardrailEvent(event, includeMatch) {
|
|
|
16
27
|
hits: event.hits.map(({ match: _match, ...hit }) => hit),
|
|
17
28
|
};
|
|
18
29
|
}
|
|
19
|
-
export { hitFromSpan, projectGuardrailEvent };
|
|
30
|
+
export { CANARY_HIT, hitFromSpan, PROMPT_ECHO_HIT, projectGuardrailEvent };
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/** labels-exempt-file: profile-registration diagnostics for a host's patterns — not runtime user or model copy (P2) */
|
|
2
|
+
/**
|
|
3
|
+
* A pattern of the host's own, as data: a regular expression, or words. Words match whole and
|
|
4
|
+
* without regard to case, and a space in one matches any run of whitespace.
|
|
5
|
+
*/
|
|
6
|
+
type HostPattern = {
|
|
7
|
+
/** What a match is called in the trace. */
|
|
8
|
+
name: string;
|
|
9
|
+
/** The source of a regular expression. */
|
|
10
|
+
pattern: string;
|
|
11
|
+
/** Any of `i`, `m`, `s`, and `u`. Every match is found, so `g` is implied; `y` is refused. */
|
|
12
|
+
flags?: string;
|
|
13
|
+
} | {
|
|
14
|
+
/** What a match is called in the trace. */
|
|
15
|
+
name: string;
|
|
16
|
+
words: readonly string[];
|
|
17
|
+
};
|
|
18
|
+
/**
|
|
19
|
+
* An automaton over UTF-16 code units, as tables.
|
|
20
|
+
*
|
|
21
|
+
* - `classStarts`: first code unit of each character class; class k covers
|
|
22
|
+
* `[classStarts[k], classStarts[k+1])`.
|
|
23
|
+
* - `charsets`: each charset as the sorted class ids it contains.
|
|
24
|
+
* - `initials`: the initial node of each pattern.
|
|
25
|
+
* - `leads`: per pattern, the charset an optional repeat opening it reads, or
|
|
26
|
+
* -1. The pattern's nodes are of what follows the repeat.
|
|
27
|
+
* - `nodes`: each node as `[pattern, final (0/1), target, charset, target, charset, ...]`.
|
|
28
|
+
*/
|
|
29
|
+
interface AutomatonData {
|
|
30
|
+
classStarts: readonly number[];
|
|
31
|
+
charsets: readonly (readonly number[])[];
|
|
32
|
+
initials: readonly number[];
|
|
33
|
+
leads: readonly number[];
|
|
34
|
+
nodes: readonly (readonly number[])[];
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* What compiling a list of patterns writes (`compilePatterns`, `agents detect-compile`): the
|
|
38
|
+
* patterns it read and checked, and their automaton. A stream holds exactly the text a match
|
|
39
|
+
* could still be under way in by it.
|
|
40
|
+
*/
|
|
41
|
+
interface CompiledPatterns {
|
|
42
|
+
/** `PATTERN_COMPILER_VERSION` of the compiler that wrote it. */
|
|
43
|
+
compiler: number;
|
|
44
|
+
/** Each pattern as compiled, in order: a table that no longer matches its patterns is refused. */
|
|
45
|
+
patterns: readonly PatternSource[];
|
|
46
|
+
automaton: AutomatonData;
|
|
47
|
+
}
|
|
48
|
+
/** A pattern as the kernel runs it: the source and flags of its regular expression. */
|
|
49
|
+
interface PatternSource {
|
|
50
|
+
name: string;
|
|
51
|
+
source: string;
|
|
52
|
+
flags: string;
|
|
53
|
+
}
|
|
54
|
+
/** A host pattern ready to run. */
|
|
55
|
+
interface HostMatcher {
|
|
56
|
+
name: string;
|
|
57
|
+
/** Global, so every match is found. */
|
|
58
|
+
regex: RegExp;
|
|
59
|
+
}
|
|
60
|
+
/** Bumped whenever the compiled table's layout or meaning changes. */
|
|
61
|
+
declare const PATTERN_COMPILER_VERSION = 3;
|
|
62
|
+
/** The most patterns one detector takes, and the longest each may be once written as a regular expression. */
|
|
63
|
+
declare const MAX_PATTERNS = 64;
|
|
64
|
+
declare const MAX_PATTERN_LENGTH = 1024;
|
|
65
|
+
/** The patterns as a compiled table records them. */
|
|
66
|
+
declare function patternSources(patterns: readonly HostPattern[]): PatternSource[];
|
|
67
|
+
/** What is wrong with one pattern, or `undefined` when it runs. */
|
|
68
|
+
declare function patternProblem(path: string, pattern: unknown): string | undefined;
|
|
69
|
+
/**
|
|
70
|
+
* What is wrong with a detector's `patterns` and the table `compiled` for them, or `undefined`
|
|
71
|
+
* when both are sound. Patterns need their table: compiling is where a pattern that could take
|
|
72
|
+
* more than linear time on hostile text is refused.
|
|
73
|
+
*/
|
|
74
|
+
declare function patternsProblem(path: string, patterns: unknown, compiled: unknown): string | undefined;
|
|
75
|
+
/**
|
|
76
|
+
* What is wrong with a list of patterns before it is compiled, or `undefined`: an editor checks
|
|
77
|
+
* with it as the patterns are written.
|
|
78
|
+
*/
|
|
79
|
+
declare function patternListProblem(path: string, patterns: unknown): string | undefined;
|
|
80
|
+
/** Whether any detector of `detect` lists patterns of the host's own, which need compiling. */
|
|
81
|
+
declare function listsPatterns(detect: unknown): boolean;
|
|
82
|
+
/** `patterns`, valid, ready to run. */
|
|
83
|
+
declare function matchersOf(patterns: readonly HostPattern[]): readonly HostMatcher[];
|
|
84
|
+
export type { AutomatonData, CompiledPatterns, HostMatcher, HostPattern, PatternSource };
|
|
85
|
+
export { listsPatterns, MAX_PATTERN_LENGTH, MAX_PATTERNS, matchersOf, PATTERN_COMPILER_VERSION, patternListProblem, patternProblem, patternSources, patternsProblem, };
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
// invariant: Leaf module. Imports nothing from `src/guardrails/types.ts` or `src/kernel/`, so
|
|
2
|
+
// `detectors.ts` can read a host's patterns without a cycle.
|
|
3
|
+
/** Bumped whenever the compiled table's layout or meaning changes. */
|
|
4
|
+
const PATTERN_COMPILER_VERSION = 3;
|
|
5
|
+
/** The most patterns one detector takes, and the longest each may be once written as a regular expression. */
|
|
6
|
+
const MAX_PATTERNS = 64;
|
|
7
|
+
const MAX_PATTERN_LENGTH = 1024;
|
|
8
|
+
const PATTERN_FLAGS = 'imsu';
|
|
9
|
+
/** A letter, digit, or underscore in any script: what a word may not touch on either side. */
|
|
10
|
+
const WORD_UNIT = '[\\p{L}\\p{N}_]';
|
|
11
|
+
function escaped(text) {
|
|
12
|
+
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
13
|
+
}
|
|
14
|
+
/** `words` as one alternation, longest first so a word is not cut short by one it starts with. */
|
|
15
|
+
function wordsSource(words) {
|
|
16
|
+
const alternatives = [...new Set(words.map((word) => word.trim()).filter(Boolean))]
|
|
17
|
+
.sort((left, right) => right.length - left.length)
|
|
18
|
+
.map((word) => word.split(/\s+/).map(escaped).join('\\s+'));
|
|
19
|
+
return `(?<!${WORD_UNIT})(?:${alternatives.join('|')})(?!${WORD_UNIT})`;
|
|
20
|
+
}
|
|
21
|
+
/** The regular expression `pattern` runs as. */
|
|
22
|
+
function patternSource(pattern) {
|
|
23
|
+
if ('words' in pattern) {
|
|
24
|
+
return { name: pattern.name, source: wordsSource(pattern.words), flags: 'iu' };
|
|
25
|
+
}
|
|
26
|
+
return { name: pattern.name, source: pattern.pattern, flags: pattern.flags ?? '' };
|
|
27
|
+
}
|
|
28
|
+
/** The patterns as a compiled table records them. */
|
|
29
|
+
function patternSources(patterns) {
|
|
30
|
+
return patterns.map(patternSource);
|
|
31
|
+
}
|
|
32
|
+
function isRecord(value) {
|
|
33
|
+
return typeof value === 'object' && value !== null && !Array.isArray(value);
|
|
34
|
+
}
|
|
35
|
+
function isStrings(value) {
|
|
36
|
+
return Array.isArray(value) && value.every((item) => typeof item === 'string');
|
|
37
|
+
}
|
|
38
|
+
/** What is wrong with the shape of one pattern, before it is compiled. */
|
|
39
|
+
function shapeProblem(path, pattern) {
|
|
40
|
+
if (!isRecord(pattern))
|
|
41
|
+
return `${path} must be an object`;
|
|
42
|
+
const { name, words, flags } = pattern;
|
|
43
|
+
if (typeof name !== 'string' || !name.trim())
|
|
44
|
+
return `${path}.name must be a non-empty string`;
|
|
45
|
+
const kinds = ['pattern', 'words'].filter((key) => pattern[key] !== undefined);
|
|
46
|
+
if (kinds.length !== 1)
|
|
47
|
+
return `${path} takes one of pattern and words`;
|
|
48
|
+
const unknown = Object.keys(pattern).find((key) => !['name', 'pattern', 'flags', 'words'].includes(key));
|
|
49
|
+
if (unknown !== undefined) {
|
|
50
|
+
return `${path}.${unknown} is not a setting of a pattern (name, pattern, flags, words)`;
|
|
51
|
+
}
|
|
52
|
+
if (words !== undefined) {
|
|
53
|
+
if (flags !== undefined)
|
|
54
|
+
return `${path}.flags is a setting of pattern, not of words`;
|
|
55
|
+
if (!isStrings(words) || !words.some((word) => word.trim())) {
|
|
56
|
+
return `${path}.words must be a list with at least one word`;
|
|
57
|
+
}
|
|
58
|
+
return undefined;
|
|
59
|
+
}
|
|
60
|
+
if (typeof pattern.pattern !== 'string' || !pattern.pattern) {
|
|
61
|
+
return `${path}.pattern must be a non-empty string`;
|
|
62
|
+
}
|
|
63
|
+
if (flags === undefined)
|
|
64
|
+
return undefined;
|
|
65
|
+
if (typeof flags !== 'string')
|
|
66
|
+
return `${path}.flags must be a string`;
|
|
67
|
+
const bad = [...flags].find((flag, at) => !PATTERN_FLAGS.includes(flag) || flags.indexOf(flag) < at);
|
|
68
|
+
if (bad === 'y')
|
|
69
|
+
return `${path}.flags: a sticky (y) pattern only matches where the last one ended`;
|
|
70
|
+
if (bad === 'g')
|
|
71
|
+
return `${path}.flags: g is implied, every match is found`;
|
|
72
|
+
return bad === undefined
|
|
73
|
+
? undefined
|
|
74
|
+
: `${path}.flags takes each of ${[...PATTERN_FLAGS].join(', ')} once, not ${JSON.stringify(bad)}`;
|
|
75
|
+
}
|
|
76
|
+
/** What is wrong with one pattern, or `undefined` when it runs. */
|
|
77
|
+
function patternProblem(path, pattern) {
|
|
78
|
+
const shape = shapeProblem(path, pattern);
|
|
79
|
+
if (shape !== undefined)
|
|
80
|
+
return shape;
|
|
81
|
+
const { source, flags } = patternSource(pattern);
|
|
82
|
+
if (source.length > MAX_PATTERN_LENGTH) {
|
|
83
|
+
return `${path} is ${source.length} characters as a regular expression; the most is ${MAX_PATTERN_LENGTH}`;
|
|
84
|
+
}
|
|
85
|
+
let regex;
|
|
86
|
+
try {
|
|
87
|
+
// why: this only checks that the pattern parses and tests it on the empty text; a pattern that
|
|
88
|
+
// could run away on hostile text is refused when it is compiled (compilePatterns).
|
|
89
|
+
regex = new RegExp(source, `${flags}g`);
|
|
90
|
+
}
|
|
91
|
+
catch (err) {
|
|
92
|
+
return `${path} does not compile (${err instanceof Error ? err.message : String(err)})`;
|
|
93
|
+
}
|
|
94
|
+
// why: A pattern the empty text matches matches between every two characters: it names nothing.
|
|
95
|
+
return regex.test('') ? `${path} matches the empty text` : undefined;
|
|
96
|
+
}
|
|
97
|
+
/** Whether `compiled` was written for `sources` by this compiler. */
|
|
98
|
+
function compiledProblem(path, compiled, sources) {
|
|
99
|
+
const again = 'run `agents detect-compile` or compilePatterns again';
|
|
100
|
+
if (!isRecord(compiled) || !isRecord(compiled.automaton) || !Array.isArray(compiled.patterns)) {
|
|
101
|
+
return `${path} must be the table compilePatterns or \`agents detect-compile\` writes`;
|
|
102
|
+
}
|
|
103
|
+
if (compiled.compiler !== PATTERN_COMPILER_VERSION) {
|
|
104
|
+
return `${path} comes from compiler ${String(compiled.compiler)}, this one is ${PATTERN_COMPILER_VERSION}; ${again}`;
|
|
105
|
+
}
|
|
106
|
+
return JSON.stringify(compiled.patterns) === JSON.stringify(sources)
|
|
107
|
+
? undefined
|
|
108
|
+
: `${path} was compiled from other patterns; ${again}`;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* What is wrong with a detector's `patterns` and the table `compiled` for them, or `undefined`
|
|
112
|
+
* when both are sound. Patterns need their table: compiling is where a pattern that could take
|
|
113
|
+
* more than linear time on hostile text is refused.
|
|
114
|
+
*/
|
|
115
|
+
function patternsProblem(path, patterns, compiled) {
|
|
116
|
+
if (patterns === undefined) {
|
|
117
|
+
return compiled === undefined ? undefined : `${path}.compiled is set without patterns`;
|
|
118
|
+
}
|
|
119
|
+
const problem = patternListProblem(path, patterns);
|
|
120
|
+
if (problem !== undefined)
|
|
121
|
+
return problem;
|
|
122
|
+
if (patterns.length === 0) {
|
|
123
|
+
return compiled === undefined ? undefined : `${path}.compiled is set without patterns`;
|
|
124
|
+
}
|
|
125
|
+
if (compiled === undefined) {
|
|
126
|
+
return `${path}.patterns need their compiled table: set ${path}.compiled from \`agents detect-compile\`, or wrap the detect setting in compileDetect from @theoremjs/agents/guardrails/compile`;
|
|
127
|
+
}
|
|
128
|
+
return compiledProblem(`${path}.compiled`, compiled, patternSources(patterns));
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* What is wrong with a list of patterns before it is compiled, or `undefined`: an editor checks
|
|
132
|
+
* with it as the patterns are written.
|
|
133
|
+
*/
|
|
134
|
+
function patternListProblem(path, patterns) {
|
|
135
|
+
if (!Array.isArray(patterns))
|
|
136
|
+
return `${path}.patterns must be a list`;
|
|
137
|
+
if (patterns.length > MAX_PATTERNS) {
|
|
138
|
+
return `${path}.patterns lists ${patterns.length} patterns; the most is ${MAX_PATTERNS}`;
|
|
139
|
+
}
|
|
140
|
+
const names = new Set();
|
|
141
|
+
for (const [index, pattern] of patterns.entries()) {
|
|
142
|
+
const at = `${path}.patterns[${index}]`;
|
|
143
|
+
const problem = patternProblem(at, pattern);
|
|
144
|
+
if (problem !== undefined)
|
|
145
|
+
return problem;
|
|
146
|
+
const { name } = pattern;
|
|
147
|
+
if (names.has(name))
|
|
148
|
+
return `${at}.name ${JSON.stringify(name)} is listed twice`;
|
|
149
|
+
names.add(name);
|
|
150
|
+
}
|
|
151
|
+
return undefined;
|
|
152
|
+
}
|
|
153
|
+
/** Whether any detector of `detect` lists patterns of the host's own, which need compiling. */
|
|
154
|
+
function listsPatterns(detect) {
|
|
155
|
+
if (!isRecord(detect))
|
|
156
|
+
return false;
|
|
157
|
+
return Object.values(detect).some((rule) => isRecord(rule) && Array.isArray(rule.patterns) && rule.patterns.length > 0);
|
|
158
|
+
}
|
|
159
|
+
/** The matchers of each list of patterns, built once: a profile's patterns are resolved every turn. */
|
|
160
|
+
const MATCHERS = new WeakMap();
|
|
161
|
+
/** `patterns`, valid, ready to run. */
|
|
162
|
+
function matchersOf(patterns) {
|
|
163
|
+
let matchers = MATCHERS.get(patterns);
|
|
164
|
+
if (!matchers) {
|
|
165
|
+
matchers = patternSources(patterns).map(({ name, source, flags }) => ({
|
|
166
|
+
name,
|
|
167
|
+
regex: new RegExp(source, `${flags}g`),
|
|
168
|
+
}));
|
|
169
|
+
MATCHERS.set(patterns, matchers);
|
|
170
|
+
}
|
|
171
|
+
return matchers;
|
|
172
|
+
}
|
|
173
|
+
export { listsPatterns, MAX_PATTERN_LENGTH, MAX_PATTERNS, matchersOf, PATTERN_COMPILER_VERSION, patternListProblem, patternProblem, patternSources, patternsProblem, };
|
|
@@ -5,6 +5,11 @@
|
|
|
5
5
|
*
|
|
6
6
|
* @module
|
|
7
7
|
*/
|
|
8
|
+
/**
|
|
9
|
+
* An order to set instructions aside, with up to `gap` words between the verb
|
|
10
|
+
* and its object. `word` is what a word in the gap may be.
|
|
11
|
+
*/
|
|
12
|
+
declare function overrideFrame(gap: number, word?: string): string;
|
|
8
13
|
declare const INJECTION_PATTERNS: RegExp[];
|
|
9
14
|
/** Runs that might encode an injection; each is decoded and checked in `injection.ts`. */
|
|
10
15
|
declare const BASE64_BLOB: RegExp;
|
|
@@ -12,4 +17,4 @@ declare const HEX_BLOB: RegExp;
|
|
|
12
17
|
declare const SPACED_LETTERS: RegExp;
|
|
13
18
|
/** Three+ alphabetic tokens joined by `|` (no shell spaces around pipes). */
|
|
14
19
|
declare const PIPE_SEPARATED: RegExp;
|
|
15
|
-
export { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, PIPE_SEPARATED, SPACED_LETTERS };
|
|
20
|
+
export { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, overrideFrame, PIPE_SEPARATED, SPACED_LETTERS };
|
|
@@ -45,6 +45,37 @@ const LLAMA_INST = /\[\/?INST\]/gi;
|
|
|
45
45
|
const IGNORE_YOUR_INSTRUCTIONS = /ignore\s+(all\s+)?(your\s+)?(instructions?|rules?)\b/gi;
|
|
46
46
|
const UNRESTRICTED_MODE = /\bunrestricted\s+(ai|mode|model)\b/gi;
|
|
47
47
|
const IGNORE_MULTILANG = /\b(?:ignorieren|ignorez|ignora|ignorer|oubliez|vergessen|olvida|desestima|missachten)\b[\s\S]{0,50}\b(?:anweisungen|instructions?|instrucciones|directives?|r[eè]gles|reglas)\b/gi;
|
|
48
|
+
/** The verbs that tell a reader to set a thing aside, as written to give an order. */
|
|
49
|
+
const OVERRIDE_VERB = 'ignore|disregard|forget|override|bypass';
|
|
50
|
+
/** What an agent is told to set aside. */
|
|
51
|
+
const OVERRIDE_OBJECT = 'instructions?|rules|guidelines?|constraints?|directives?|prompts?';
|
|
52
|
+
const FRAME_WORD = String.raw `[\w'’-]{1,40}`;
|
|
53
|
+
/**
|
|
54
|
+
* An order to set instructions aside, with up to `gap` words between the verb
|
|
55
|
+
* and its object. `word` is what a word in the gap may be.
|
|
56
|
+
*/
|
|
57
|
+
function overrideFrame(gap, word = FRAME_WORD) {
|
|
58
|
+
return String.raw `\b(?:${OVERRIDE_VERB})\s+(?:${word}\s+){0,${gap}}(?:${OVERRIDE_OBJECT})\b`;
|
|
59
|
+
}
|
|
60
|
+
/** The verb is negated: "never ignore the rules". */
|
|
61
|
+
const NEGATED = String.raw `(?<!(?:\b(?:not|never|cannot|without)|n['’]t)\s+(?:${FRAME_WORD}\s+)?)`;
|
|
62
|
+
/** The verb is a noun: "his disregard for the rules". */
|
|
63
|
+
const NOUN_USE = String.raw `(?<!\b(?:the|a|an|his|her|its|their|your|my|our)\s+)`;
|
|
64
|
+
/**
|
|
65
|
+
* The verb reports or describes, and "you" is not its subject: "an attempt to
|
|
66
|
+
* bypass the rules", "I must ignore the instructions", "they override
|
|
67
|
+
* constraints". "you must ignore the rules" and "I want you to ignore the
|
|
68
|
+
* rules" stay orders.
|
|
69
|
+
*/
|
|
70
|
+
const DESCRIBED = String.raw `(?:(?<=\byou\s+(?:${FRAME_WORD}\s+){0,2})|(?<!\b(?:to|must|should|would|will|can|could|may|might|shall|I|we|they|he|she|it|who|that|which)\s+(?:\w+ly\s+)?))`;
|
|
71
|
+
/** A word in the gap that is not the writer's own: "ignore my rules" speaks of the writer's rules. */
|
|
72
|
+
const NOT_OWN = String.raw `(?!(?:my|our)\b)${FRAME_WORD}`;
|
|
73
|
+
/**
|
|
74
|
+
* {@linkcode overrideFrame} where the verb gives the reader an order about
|
|
75
|
+
* the reader's instructions. The patterns above still match their own wording
|
|
76
|
+
* in every guarded case.
|
|
77
|
+
*/
|
|
78
|
+
const OVERRIDE_FRAME = new RegExp(`${NEGATED}${NOUN_USE}${DESCRIBED}${overrideFrame(3, NOT_OWN)}`, 'gi');
|
|
48
79
|
const INJECTION_PATTERNS = [
|
|
49
80
|
IGNORE_PREVIOUS,
|
|
50
81
|
DISREGARD_INSTRUCTIONS,
|
|
@@ -84,6 +115,7 @@ const INJECTION_PATTERNS = [
|
|
|
84
115
|
IGNORE_YOUR_INSTRUCTIONS,
|
|
85
116
|
UNRESTRICTED_MODE,
|
|
86
117
|
IGNORE_MULTILANG,
|
|
118
|
+
OVERRIDE_FRAME,
|
|
87
119
|
];
|
|
88
120
|
/** Runs that might encode an injection; each is decoded and checked in `injection.ts`. */
|
|
89
121
|
const BASE64_BLOB = /[A-Za-z0-9+/]{16,}={0,2}/g;
|
|
@@ -91,4 +123,4 @@ const HEX_BLOB = /(?:[0-9a-f]{2}[\s]?){8,}/gi;
|
|
|
91
123
|
const SPACED_LETTERS = /\b(?:[A-Za-z] ){3,}[A-Za-z]\b/g;
|
|
92
124
|
/** Three+ alphabetic tokens joined by `|` (no shell spaces around pipes). */
|
|
93
125
|
const PIPE_SEPARATED = /\b(?:[A-Za-z]+\|){2,}[A-Za-z]+\b/g;
|
|
94
|
-
export { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, PIPE_SEPARATED, SPACED_LETTERS };
|
|
126
|
+
export { BASE64_BLOB, HEX_BLOB, INJECTION_PATTERNS, overrideFrame, PIPE_SEPARATED, SPACED_LETTERS };
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by `scripts/gen-egress-automata.ts` from `egress-patterns.ts`.
|
|
3
|
+
* Do not edit: change the patterns and run the script.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
/** Each injection pattern reversed: it matches where the pattern matches the text written backwards. */
|
|
8
|
+
declare const REVERSED_INJECTION_PATTERNS: RegExp[];
|
|
9
|
+
export { REVERSED_INJECTION_PATTERNS };
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generated by `scripts/gen-egress-automata.ts` from `egress-patterns.ts`.
|
|
3
|
+
* Do not edit: change the patterns and run the script.
|
|
4
|
+
*
|
|
5
|
+
* @module
|
|
6
|
+
*/
|
|
7
|
+
/** Each injection pattern reversed: it matches where the pattern matches the text written backwards. */
|
|
8
|
+
const REVERSED_INJECTION_PATTERNS = [
|
|
9
|
+
/(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)(?:\s+(?:YTEFAS|YTIRUCES|METSYS|LANOITAREPO|LANRETNI|EROC|LANIGIRO|LAITINI|GNITSIXE|NEVIG|DETATS|DEDIVORP|DENIFED|DEIFICEPS|DEHSILBATSE))?\s+(?:SUOIVERP|ROIRP)(?:\s+LLA)?\s+ERONGI/gi,
|
|
10
|
+
/(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)\s+(?:SUOIVERP|ROIRP|EVOBA)(?:\s+LLA)?\s+DRAGERSID/gi,
|
|
11
|
+
/(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)\s+(?:SUOIVERP|ROIRP|EVOBA)(?:\s+LLA)?\s+TEGROF/gi,
|
|
12
|
+
/:S?NOITCURTSNI\s+WEN/gi,
|
|
13
|
+
/(?:METSYS|REPOLEVED|SUOIVERP|LANIGIRO)(?:\s+EHT)?\s+WOLLOF\s+TON\s+OD/gi,
|
|
14
|
+
/(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)\s+(?:ROIRP|SUOIVERP)(?:\s+LLA)?\s+S?EDESREPUS/gi,
|
|
15
|
+
/(?:DIOV|DILAVNI|LLUN|ETELOSBO|DELLECNAC|DEKOVER)\s+(?:ERA|SI)\s+S?NOITCURTSNI\s+(?:SUOIVERP|ROIRP)(?:\s+LLA)?/gi,
|
|
16
|
+
/EDOM\s+REPOLEVED(?:\s+NI)?\s+WON\s+ERA\s+UOY/gi,
|
|
17
|
+
/(?<!\b(?:NI|NO|AIV|HGUORHT|MORF|GNISU|ROF)\s+)EDOM\s+(?:REPOLEVED|NIMDA|GUBED|ECNANETNIAM)\s+RETNE/gi,
|
|
18
|
+
/(?<!\b(?:NI|NO|AIV|HGUORHT|MORF|GNISU|ROF)\s+)EDOM\s+(?:REPOLEVED|NIMDA|GUBED|KAERBLIAJ)\s+ETAVITCA/gi,
|
|
19
|
+
/\bEDIRREVO\s+METSYS\b/gi,
|
|
20
|
+
/(?:S?NOITCURTSNI|S?ELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID)(?:\s+RUOY)?\s+EDIRREVO/gi,
|
|
21
|
+
/\bTPMORP(?:\s+(?:METSYS|EMTSYS|MTESYS|P?METSYS))?(?:\s+(?:LLUF|NEDDIH|ETELPMOC|LANRETNI|TERCES|LANIGIRO|ERITNE|TCAXE|LAUTCA|LAER)){0,2}(?:\s+(?:R?UOY|UROY|ROUY|EHT|YM|STI|SIH|REH|RUO|RIEHT))?\s+LAEVER/gi,
|
|
22
|
+
/\bTPMORP(?:\s+(?:METSYS|EMTSYS|MTESYS|P?METSYS))?\s+(?:R?UOY|UROY|ROUY|EHT|YM|STI|SIH|REH|RUO|RIEHT)(?:\s+EM)?\s+WOHS/gi,
|
|
23
|
+
/SNOITCURTSNI(?:\s+TCAXE)?(?:\s+RUOY)?\s+(?:ERA|EREW)\s+TAHW/gi,
|
|
24
|
+
/(?:EVOBA|EROFEB)\s+(?:TXET|S?NOITCURTSNI)(?:\s+EHT)?\s+TAEPER/gi,
|
|
25
|
+
/(?:TPMORP|S?NOITCURTSNI)\s+(?:LAITINI|LANIGIRO|METSYS)(?:\s+RUOY)?\s+TUPTUO/gi,
|
|
26
|
+
/(?:DNUOB|DETCIRTSER|DETIMIL)\s+REGNOL\s+ON\s+ERA\s+UOY/gi,
|
|
27
|
+
/DNUOB\s+TON(?:\s+(?:ER'|ERA\s+)UOY)?\s+FI\s+SA\s+TCA/gi,
|
|
28
|
+
/(?:IA|TNATSISSA|LEDOM)\s+TNEREFFID(?:\s+A)?(?:\s+(?:ER'|ERA\s+)UOY)?\s+DNETERP/gi,
|
|
29
|
+
/(?:TCIRTSER(?:\s+YNA)?\s+TUOHTIW|(?:LLA|YNA|YREVE|VERP)\s+\w*RONGI|SSAPYB|TCIRTSERNU|TIMILNU|YLNO\s+YEBO|(?:SELUR|STIMIL|TCIRTSER|IRADNUOB)\s+ON).{0,40}\w+(?:\s+(?:A|NA))?\s+WON\s+ERA\s+UOY/gi,
|
|
30
|
+
/\bwon\s+gnihtyna\s+od\b[\s\S]{0,120}\bNAD\b/g,
|
|
31
|
+
/(?:EDOM|TPMORP)\s+(?:DE)?KAERBLIAJ/gi,
|
|
32
|
+
/\bWON\s+GNIHTYNA\s+OD\b/gi,
|
|
33
|
+
/(?:S?RETLIF|S?ERUSAEM|S?ENILEDIUG|S?NOITCIRTSER)\s+(?:YTEFAS|YTIRUCES|TNETNOC|LACIHTE)(?:\s+RUOY)?\s+SSAPYB/gi,
|
|
34
|
+
/(?:S?RETLIF|S?ERUSAEM|S?ELUR|S?ENILEDIUG|S?NOITCIRTSER)\s+(?:YTEFAS|YTIRUCES|TNETNOC)(?:\s+RUOY)?(?:\s+LLA)?\s+(?:ELBASID|ETELED|EVOMER|FFO\s+NRUT|ETANIMILE)/gi,
|
|
35
|
+
/(?:S?ENILEDIUG|S?ELUR|S?NOITCIRTSER|S?ERUSAEM|S?RETLIF|(?:Y|SEI)CILOP|S?LOCOTORP)\s+(?:YTEFAS|YTIRUCES|LACIHTE|TNETNOC)(?:\s+RUOY)?(?:\s+LLA)?\s+(?:ERONGI|DRAGERSID)/gi,
|
|
36
|
+
/>\/?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}METSYS[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\/?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}</gi,
|
|
37
|
+
/>\/?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}(?:TNATSISSA|REPOLEVED|LOOT|NOITCNUF)[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\/?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}</gi,
|
|
38
|
+
/:\]?(?:METSYS|TNATSISSA|RESU)\[?[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\n[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\]/gi,
|
|
39
|
+
/\][\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}(?:EGASSEM[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,8}METSYS|METSYS|TNATSISSA|LANRETNI)[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}\[/gi,
|
|
40
|
+
/(?:ERA\s+UOY|ERONGI|EDIRREVO)[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{1,32}:METSYS[\t\v\f \xa0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]{0,32}$/gim,
|
|
41
|
+
/>\|(?:trats_mi|dne_mi|di_toe|di_redaeh_trats|di_redaeh_dne|txetfodne)\|</g,
|
|
42
|
+
/>\uff5c(?:ecnetnes\u2581fo\u2581dne|ecnetnes\u2581fo\u2581nigeb)\uff5c</g,
|
|
43
|
+
/\]TSNI\/?\[/gi,
|
|
44
|
+
/\b(?:S?NOITCURTSNI|S?ELUR)(?:\s+RUOY)?(?:\s+LLA)?\s+ERONGI/gi,
|
|
45
|
+
/\b(?:IA|EDOM|LEDOM)\s+DETCIRTSERNU\b/gi,
|
|
46
|
+
/\b(?:NEGNUSIEWNA|S?NOITCURTSNI|SENOICCURTSNI|S?EVITCERID|SELG[E\xc8]R|SALGER)\b[\s\S]{0,50}\b(?:NEREIRONGI|ZERONGI|ARONGI|RERONGI|ZEILBUO|NESSEGREV|ADIVLO|AMITSESED|NETHCASSIM)\b/gi,
|
|
47
|
+
/\b(?:S?NOITCURTSNI|SELUR|S?ENILEDIUG|S?TNIARTSNOC|S?EVITCERID|S?TPMORP)(?:\s+[-\w'\u2019]{1,40}(?<!\b(?:YM|RUO))){0,3}\s+(?:ERONGI|DRAGERSID|TEGROF|EDIRREVO|SSAPYB)\b(?:(?=(?:\s+[-\w'\u2019]{1,40}){0,2}\s+UOY\b)|(?!(?:\s+YL\w+)?\s+(?:OT|TSUM|DLUOHS|DLUOW|LLIW|NAC|DLUOC|YAM|THGIM|LLAHS|I|EW|YEHT|EH|EHS|TI|OHW|TAHT|HCIHW)\b))(?!\s+(?:EHT|A|NA|SIH|REH|STI|RIEHT|RUOY|YM|RUO)\b)(?!(?:\s+[-\w'\u2019]{1,40})?\s+(?:(?:TON|REVEN|TONNAC|TUOHTIW)\b|T['\u2019]N))/gi,
|
|
48
|
+
];
|
|
49
|
+
export { REVERSED_INJECTION_PATTERNS };
|
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
import { type RedactSpan } from '../observability/spans.js';
|
|
2
2
|
declare const TYPO_TARGETS: string[];
|
|
3
3
|
declare function typoNormalize(text: string): string;
|
|
4
|
+
/**
|
|
5
|
+
* `typoNormalize(text)`, and for an index in it the index of `text` it stands
|
|
6
|
+
* for. A corrected word may be a letter longer or shorter than the word as
|
|
7
|
+
* written, so an index past the written word stands for its last letter.
|
|
8
|
+
*/
|
|
9
|
+
declare function typoFolded(text: string): {
|
|
10
|
+
text: string;
|
|
11
|
+
at: (index: number) => number;
|
|
12
|
+
};
|
|
4
13
|
/** Blob patterns whose match is a hit only when the blob decodes to an injection. */
|
|
5
14
|
declare const INJECTION_BLOBS: readonly {
|
|
6
15
|
pattern: RegExp;
|
|
@@ -9,6 +18,13 @@ declare const INJECTION_BLOBS: readonly {
|
|
|
9
18
|
declare function tryRot13(text: string): string;
|
|
10
19
|
/** Each run of `%XX` escapes decoded on its own, so one stray `%` cannot switch decoding off. */
|
|
11
20
|
declare function decodeUrlRuns(text: string): string;
|
|
21
|
+
declare const LEET_MAP: Record<string, string>;
|
|
12
22
|
declare function tryLeet(text: string): string | undefined;
|
|
23
|
+
/**
|
|
24
|
+
* The spans of injection in the text, each stretch once. The text is read as
|
|
25
|
+
* written and in each rewrite of it: typo-folded, normalized, decoded, and its
|
|
26
|
+
* encoded blobs. A match in a rewrite is the stretch of the text as written it
|
|
27
|
+
* was read from, so text around a match stays.
|
|
28
|
+
*/
|
|
13
29
|
declare function injectionSpans(text: string): RedactSpan[];
|
|
14
|
-
export { decodeUrlRuns, INJECTION_BLOBS, injectionSpans, TYPO_TARGETS, tryLeet, tryRot13, typoNormalize, };
|
|
30
|
+
export { decodeUrlRuns, INJECTION_BLOBS, injectionSpans, LEET_MAP, TYPO_TARGETS, tryLeet, tryRot13, typoFolded, typoNormalize, };
|