@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,7 +1,7 @@
|
|
|
1
|
-
import { canaryNote, userDataNote } from '../../../guardrails/canary.js';
|
|
2
|
-
import { isAbortError, TheoremError, throwIfAborted,
|
|
1
|
+
import { canaryNote, contextNote, profileCanary, userDataNote, } from '../../../guardrails/canary.js';
|
|
2
|
+
import { isAbortError, TheoremError, throwIfAborted, withPublicLabels, } from '../../../guardrails/error.js';
|
|
3
3
|
import { projectGuardrailTurnEvent } from '../../../guardrails/events.js';
|
|
4
|
-
import {
|
|
4
|
+
import { labelText } from '../../../guardrails/labels.js';
|
|
5
5
|
import { sanitizeTurnRequestWithEvents } from '../../../guardrails/sanitize.js';
|
|
6
6
|
import { resolveTraceWriter } from '../../../observability/policy.js';
|
|
7
7
|
import { resolveObservabilityPolicy } from '../../../observability/resolve-policy.js';
|
|
@@ -9,17 +9,18 @@ import { writeTrace } from '../../../observability/trace.js';
|
|
|
9
9
|
import { buildRecord } from '../../../observability/trace-record.js';
|
|
10
10
|
import { startTrace, traceContent, } from '../../../observability/trace-span.js';
|
|
11
11
|
import { profileTypesForField } from '../../profile-scope.js';
|
|
12
|
-
import {
|
|
12
|
+
import { hostAgentModel, nestedTurnModel } from '../../provider-dispatch.js';
|
|
13
|
+
import { profileInputs, requireModelBinding } from '../../registry/catalog.js';
|
|
13
14
|
import { resolveTurnInRegistry } from '../../registry/resolve.js';
|
|
14
15
|
import { bindSystem } from '../../system-parts.js';
|
|
15
16
|
import { cloneTurnToolSnapshot, expandT1Policy } from '../../tools/resolve.js';
|
|
16
|
-
import { turnDoneOf } from '../../turn-events.js';
|
|
17
|
+
import { keptReply, turnDoneOf } from '../../turn-events.js';
|
|
17
18
|
import { findLast } from '../../util/find-last.js';
|
|
18
19
|
import { compactionMeter, compactionResult, compactorHistory, resolveCompactionTokens, shouldCompact, splitForCompaction, } from '../compaction.js';
|
|
19
|
-
import { mediaTokenFamily } from '../token-estimate.js';
|
|
20
20
|
import { endThrownSpan, endTurnSpan, guardrailAttributes, guardrailCheckAttributes, OutputFold, turnSpanOptions, } from '../turn-trace.js';
|
|
21
|
-
import { sumEventTokens } from '../usage.js';
|
|
21
|
+
import { sumEventTokens, sumTurnTokens } from '../usage.js';
|
|
22
22
|
import { runAttemptsWithValidation } from './gates.js';
|
|
23
|
+
import { createAgentCaller, NESTED_THROWS, turnError } from './nested.js';
|
|
23
24
|
import { applyTurnStage } from './stages.js';
|
|
24
25
|
import { openTurnState } from './state.js';
|
|
25
26
|
import { shouldSkipStreamEvent } from './stream.js';
|
|
@@ -32,8 +33,8 @@ const MS_PER_S = 1000;
|
|
|
32
33
|
* through here, so it is where an error gets the user's wording.
|
|
33
34
|
*/
|
|
34
35
|
function deliver(ctx, event) {
|
|
35
|
-
const out =
|
|
36
|
-
if (out.type === 'text' && !ctx.shownText) {
|
|
36
|
+
const out = withPublicLabels(event, ctx.known?.labels);
|
|
37
|
+
if ((out.type === 'text' || out.type === 'structured_draft') && !ctx.shownText) {
|
|
37
38
|
ctx.shownText = true;
|
|
38
39
|
ctx.root.set({ 'theorem.turn.time_to_first_text': ctx.root.msSinceStart() / MS_PER_S });
|
|
39
40
|
}
|
|
@@ -50,19 +51,27 @@ function* emitObservedStage(ctx, stageEv, profile) {
|
|
|
50
51
|
function getCompactionSpec(profile, modelId) {
|
|
51
52
|
return profile.models[modelId]?.compaction;
|
|
52
53
|
}
|
|
53
|
-
/** Errors only the host can fix: the compactor throws them rather than failing quietly every turn. */
|
|
54
54
|
/** A turn's tools when it offers none: an agent summarising its own history. */
|
|
55
55
|
function noTools() {
|
|
56
56
|
return { builtins: [], gated: [], visible: [], executable: [], wire: [] };
|
|
57
57
|
}
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Run `req` as a turn under `parent`: its spans join that record, it writes
|
|
60
|
+
* none of its own, and it shares the record's canaries. A compactor's turn and
|
|
61
|
+
* an agent tool's call both run here.
|
|
62
|
+
*/
|
|
63
|
+
function runNestedTurn(args) {
|
|
64
|
+
const ctx = newTraceCtx(args.registry, args.req, args.parent.child(`invoke_agent ${args.req.profile}`, turnSpanOptions(args.req)), args.canaries);
|
|
65
|
+
ctx.agentDepth = args.agentDepth;
|
|
66
|
+
if (args.compacting)
|
|
67
|
+
ctx.compacting = args.compacting;
|
|
68
|
+
ctx.observability = resolveObservabilityPolicy(ctx.known?.observability);
|
|
69
|
+
return runTracedTurn(ctx, nestedTurnModel(args.provider, args.req.profile, args.req.model, args.req));
|
|
61
70
|
}
|
|
62
71
|
/**
|
|
63
72
|
* Run the compaction profile as a turn under `span`: its spans join that
|
|
64
73
|
* record and it writes none of its own. Anything short of a completed,
|
|
65
|
-
* non-empty summary is a failure; the host's abort and `
|
|
74
|
+
* non-empty summary is a failure; the host's abort and `NESTED_THROWS`
|
|
66
75
|
* errors are thrown. With no `spec.profile` the owner compacts itself, on the
|
|
67
76
|
* model it is compacting for and with no tools.
|
|
68
77
|
*/
|
|
@@ -75,24 +84,29 @@ async function runCompactor(args) {
|
|
|
75
84
|
return { droppedMedia, failure: { unreadable: true } };
|
|
76
85
|
const req = {
|
|
77
86
|
profile: compactorId,
|
|
78
|
-
// The turn already passed model selection; its default needs no naming.
|
|
87
|
+
// why: The turn already passed model selection; its default needs no naming.
|
|
79
88
|
...(self && args.model !== compactor.defaultModel ? { model: args.model } : {}),
|
|
80
|
-
input: { text:
|
|
89
|
+
input: { text: labelText('compaction.request', {}, compactor.labels), history },
|
|
81
90
|
signal: args.signal,
|
|
82
91
|
};
|
|
83
|
-
const ctx = newTraceCtx(args.registry, req, args.parent.child(`invoke_agent ${req.profile}`, turnSpanOptions(req)), args.canaries);
|
|
84
|
-
ctx.compacting = self ? 'self' : 'other';
|
|
85
|
-
ctx.observability = resolveObservabilityPolicy(ctx.known?.observability);
|
|
86
92
|
const events = [];
|
|
87
93
|
try {
|
|
88
|
-
for await (const event of
|
|
94
|
+
for await (const event of runNestedTurn({
|
|
95
|
+
registry: args.registry,
|
|
96
|
+
req,
|
|
97
|
+
provider: args.provider,
|
|
98
|
+
parent: args.parent,
|
|
99
|
+
canaries: args.canaries,
|
|
100
|
+
agentDepth: 0,
|
|
101
|
+
compacting: self ? 'self' : 'other',
|
|
102
|
+
})) {
|
|
89
103
|
events.push(event);
|
|
90
104
|
}
|
|
91
105
|
}
|
|
92
106
|
catch (err) {
|
|
93
107
|
throwIfAborted(args.signal);
|
|
94
108
|
const error = err instanceof TheoremError ? err.kind : 'internal';
|
|
95
|
-
if (
|
|
109
|
+
if (NESTED_THROWS.has(error))
|
|
96
110
|
throw err;
|
|
97
111
|
return { droppedMedia, failure: { error } };
|
|
98
112
|
}
|
|
@@ -101,7 +115,7 @@ async function runCompactor(args) {
|
|
|
101
115
|
const usage = tokens ? { tokens } : {};
|
|
102
116
|
const stop = findLast(events, (e) => e.type === 'done')?.stop.kind;
|
|
103
117
|
const reported = turnError(events);
|
|
104
|
-
if (reported &&
|
|
118
|
+
if (reported && NESTED_THROWS.has(reported.errorKind)) {
|
|
105
119
|
throw new TheoremError(reported.errorKind, `Compactor '${compactorId}' failed: ${reported.errorInternal ?? reported.error}`);
|
|
106
120
|
}
|
|
107
121
|
const error = reported?.errorKind;
|
|
@@ -112,9 +126,10 @@ async function runCompactor(args) {
|
|
|
112
126
|
...usage,
|
|
113
127
|
};
|
|
114
128
|
}
|
|
115
|
-
const
|
|
129
|
+
const reply = keptReply(events);
|
|
130
|
+
const structured = findLast(reply, (e) => e.type === 'structured')?.structured;
|
|
116
131
|
const summary = structured === undefined
|
|
117
|
-
?
|
|
132
|
+
? reply.flatMap((e) => (e.type === 'text' ? [e.text] : [])).join('')
|
|
118
133
|
: JSON.stringify(structured);
|
|
119
134
|
if (!summary.trim()) {
|
|
120
135
|
return { droppedMedia, failure: { stop, empty: true }, ...usage };
|
|
@@ -157,7 +172,6 @@ async function compactHistoryBeforeTurn(args) {
|
|
|
157
172
|
const decision = await resolveCompactionTokens({
|
|
158
173
|
spec: args.spec,
|
|
159
174
|
input: args.input,
|
|
160
|
-
family: args.family,
|
|
161
175
|
});
|
|
162
176
|
const needed = decision !== undefined && (await shouldCompact(decision, args.spec));
|
|
163
177
|
const attributes = compactionDecision(args.spec, decision, needed);
|
|
@@ -165,7 +179,7 @@ async function compactHistoryBeforeTurn(args) {
|
|
|
165
179
|
args.parent.event('theorem.compaction', attributes);
|
|
166
180
|
return undefined;
|
|
167
181
|
}
|
|
168
|
-
const split = await splitForCompaction(args.history, args.spec
|
|
182
|
+
const split = await splitForCompaction(args.history, args.spec);
|
|
169
183
|
if (split.toCompact.length === 0) {
|
|
170
184
|
args.parent.event('theorem.compaction', attributes);
|
|
171
185
|
return undefined;
|
|
@@ -195,7 +209,6 @@ async function attachAfterCompaction(event, args) {
|
|
|
195
209
|
spec: args.spec,
|
|
196
210
|
input: args.input,
|
|
197
211
|
prompt,
|
|
198
|
-
family: args.family,
|
|
199
212
|
});
|
|
200
213
|
const needed = decision !== undefined && (await shouldCompact(decision, args.spec));
|
|
201
214
|
args.span.event('theorem.compaction', compactionDecision(args.spec, decision, needed));
|
|
@@ -222,7 +235,7 @@ async function* emitTurn(args) {
|
|
|
222
235
|
profile,
|
|
223
236
|
generation,
|
|
224
237
|
trace: args.trace,
|
|
225
|
-
|
|
238
|
+
...(args.agents ? { agents: args.agents } : {}),
|
|
226
239
|
});
|
|
227
240
|
args.outState.state = state;
|
|
228
241
|
const pre = yield* applyTurnStage({
|
|
@@ -257,9 +270,14 @@ async function* emitTurn(args) {
|
|
|
257
270
|
return;
|
|
258
271
|
}
|
|
259
272
|
yield* runAttemptsWithValidation(safe, profile, generation, system, provider, state);
|
|
260
|
-
const tokens =
|
|
273
|
+
const tokens = sumTurnTokens(state.allEmittedEvents);
|
|
261
274
|
const done = turnDoneOf({
|
|
262
275
|
stop: state.lastStop ?? { kind: 'completed' },
|
|
276
|
+
...(state.providerState &&
|
|
277
|
+
!('providerContinuation' in profile && profile.providerContinuation?.history === 'stateless') &&
|
|
278
|
+
(!state.lastStop || ['completed', 'tool', 'gate'].includes(state.lastStop.kind))
|
|
279
|
+
? { providerState: state.providerState }
|
|
280
|
+
: {}),
|
|
263
281
|
traceparent: state.trace.root.traceparent(),
|
|
264
282
|
...(tokens ? { tokens } : {}),
|
|
265
283
|
}, cloneTurnToolSnapshot(generation.tools));
|
|
@@ -277,7 +295,7 @@ async function* streamTurnEvents(ctx, profile, gen, provider, compactionSpec) {
|
|
|
277
295
|
system: ctx.system,
|
|
278
296
|
provider,
|
|
279
297
|
trace: ctx.trace,
|
|
280
|
-
|
|
298
|
+
agents: ctx.agents,
|
|
281
299
|
outState: ctx,
|
|
282
300
|
})) {
|
|
283
301
|
const attached = await maybeAttachAfter(event, ctx, gen, compactionSpec);
|
|
@@ -285,7 +303,7 @@ async function* streamTurnEvents(ctx, profile, gen, provider, compactionSpec) {
|
|
|
285
303
|
if (!shouldSkipStreamEvent(out, profile))
|
|
286
304
|
yield deliver(ctx, out);
|
|
287
305
|
if (out.type === 'done' && ctx.state) {
|
|
288
|
-
// Skip duplicate post_turn when pre_turn abort already emitted it inside emitTurn.
|
|
306
|
+
// why: Skip duplicate post_turn when pre_turn abort already emitted it inside emitTurn.
|
|
289
307
|
const alreadyPost = ctx.state.allEmittedEvents.some((e) => e.type === 'stage' && e.stage === 'post_turn');
|
|
290
308
|
if (!alreadyPost) {
|
|
291
309
|
for await (const stageEv of applyTurnStage({
|
|
@@ -314,6 +332,7 @@ function newTraceCtx(registry, req, root, canaries) {
|
|
|
314
332
|
delivered: new OutputFold(),
|
|
315
333
|
root,
|
|
316
334
|
compacting: false,
|
|
335
|
+
agentDepth: 0,
|
|
317
336
|
canary: '',
|
|
318
337
|
canaries,
|
|
319
338
|
};
|
|
@@ -357,6 +376,7 @@ async function* runTurnInRegistry(registry, req, provider, sinkOverride) {
|
|
|
357
376
|
const { sink, policy } = resolveTraceWriter({
|
|
358
377
|
override: sinkOverride,
|
|
359
378
|
observability: ctx.known?.observability,
|
|
379
|
+
guardrails: ctx.known?.guardrails,
|
|
360
380
|
});
|
|
361
381
|
ctx.observability = policy;
|
|
362
382
|
try {
|
|
@@ -383,14 +403,13 @@ async function* emitCancelledDoneAfterAbort(ctx) {
|
|
|
383
403
|
const gen = ctx.generation;
|
|
384
404
|
if (!(profile && gen && ctx.safe && ctx.trace))
|
|
385
405
|
return;
|
|
386
|
-
// The turn's own state when it got that far, so post_turn sees the history the model saw.
|
|
406
|
+
// why: The turn's own state when it got that far, so post_turn sees the history the model saw.
|
|
387
407
|
const state = ctx.state ??
|
|
388
408
|
openTurnState({
|
|
389
409
|
tools: ctx.registry.tools,
|
|
390
410
|
profile,
|
|
391
411
|
generation: gen,
|
|
392
412
|
trace: ctx.trace,
|
|
393
|
-
mediaFamily: ctx.mediaFamily,
|
|
394
413
|
allEmittedEvents: [...ctx.seen],
|
|
395
414
|
});
|
|
396
415
|
for await (const stageEv of applyTurnStage({
|
|
@@ -412,7 +431,7 @@ async function* runTurnBody(ctx, provider) {
|
|
|
412
431
|
const checkMs = performance.now() - checkStart;
|
|
413
432
|
ctx.safe = sanitized.request;
|
|
414
433
|
const hits = sanitized.events.filter((event) => event.type === 'guardrail');
|
|
415
|
-
// The check's time rides on its last decision, or on a pass when it found nothing.
|
|
434
|
+
// why: The check's time rides on its last decision, or on a pass when it found nothing.
|
|
416
435
|
if (hits.length === 0) {
|
|
417
436
|
ctx.root.event('theorem.guardrail', guardrailCheckAttributes('input', checkMs, undefined, { stage: 'input', trust: 'untrusted' }));
|
|
418
437
|
}
|
|
@@ -424,48 +443,82 @@ async function* runTurnBody(ctx, provider) {
|
|
|
424
443
|
}
|
|
425
444
|
yield deliver(ctx, projectForObs(event, ctx.observability));
|
|
426
445
|
}
|
|
446
|
+
if (sanitized.refusal)
|
|
447
|
+
throw sanitized.refusal;
|
|
427
448
|
const { profile, generation: gen } = resolveTurnInRegistry(ctx.registry, ctx.safe);
|
|
428
449
|
await expandT1Policy(ctx.registry.tools, gen.tools, profile, ctx.safe);
|
|
429
450
|
if (ctx.compacting === 'self')
|
|
430
451
|
gen.tools = noTools();
|
|
431
452
|
gen.builtins = gen.tools.builtins;
|
|
453
|
+
if (gen.canary)
|
|
454
|
+
gen.canary = await profileCanary(profile.id, gen.resolvedSystem);
|
|
432
455
|
ctx.generation = gen;
|
|
433
456
|
ctx.canary = gen.canary;
|
|
434
457
|
ctx.canaries.push(gen.canary);
|
|
435
458
|
const binding = profile.models[gen.model];
|
|
436
|
-
ctx.mediaFamily = binding ? mediaTokenFamily(binding) : undefined;
|
|
437
459
|
ctx.trace = { root: ctx.root, attempt: 0, calls: 0, binding };
|
|
460
|
+
if (!ctx.compacting)
|
|
461
|
+
ctx.agents = agentCallerFor(ctx, provider, binding);
|
|
438
462
|
throwIfAborted(ctx.safe.signal);
|
|
439
463
|
const compactionSpec = ctx.compacting ? undefined : getCompactionSpec(profile, gen.model);
|
|
440
464
|
const compaction = await maybeCompactBefore(ctx, profile, gen, compactionSpec, provider);
|
|
441
465
|
if (compaction)
|
|
442
466
|
yield deliver(ctx, projectForObs(compaction, ctx.observability));
|
|
443
467
|
ctx.system = bindSystem(gen.resolvedSystem, [
|
|
444
|
-
canaryNote(ctx.canary, profile.
|
|
468
|
+
canaryNote(ctx.canary, profile.labels),
|
|
445
469
|
profileTypesForField('identity.system').includes(profile.type)
|
|
446
|
-
? userDataNote(profile.
|
|
470
|
+
? userDataNote(profile.labels)
|
|
447
471
|
: '',
|
|
472
|
+
profileInputs(profile)?.context ? contextNote(profile.labels) : '',
|
|
448
473
|
]);
|
|
449
474
|
yield* streamTurnEvents(ctx, profile, gen, provider, compactionSpec);
|
|
450
475
|
}
|
|
476
|
+
/** The turn's agent tool calls: each runs nested under its tool's span, in this record. */
|
|
477
|
+
function agentCallerFor(ctx, provider, own) {
|
|
478
|
+
return createAgentCaller({
|
|
479
|
+
registry: ctx.registry,
|
|
480
|
+
req: ctx.safe ?? ctx.req,
|
|
481
|
+
provider,
|
|
482
|
+
own,
|
|
483
|
+
depth: ctx.agentDepth,
|
|
484
|
+
runNested: (nested) => runNestedTurn({ ...nested, registry: ctx.registry, canaries: ctx.canaries }),
|
|
485
|
+
});
|
|
486
|
+
}
|
|
487
|
+
/**
|
|
488
|
+
* A host's own call's agent tools: the host's provider, or the one `onAgentCall`
|
|
489
|
+
* returns, runs each. Its nested turns bind their canaries into `canaries`.
|
|
490
|
+
*/
|
|
491
|
+
function invokeAgentCaller(registry, request, canaries) {
|
|
492
|
+
return createAgentCaller({
|
|
493
|
+
registry,
|
|
494
|
+
req: request,
|
|
495
|
+
provider: request.provider ? hostAgentModel(registry, request.provider) : undefined,
|
|
496
|
+
own: undefined,
|
|
497
|
+
depth: 0,
|
|
498
|
+
runNested: (nested) => runNestedTurn({ ...nested, registry, canaries }),
|
|
499
|
+
});
|
|
500
|
+
}
|
|
501
|
+
/**
|
|
502
|
+
* A live session's agent tools: the session's own provider options, or those
|
|
503
|
+
* `onAgentCall` returns, run each. Its nested turns bind their canaries into
|
|
504
|
+
* `canaries`.
|
|
505
|
+
*/
|
|
506
|
+
function sessionAgentCaller(registry, req, options, canaries) {
|
|
507
|
+
return createAgentCaller({
|
|
508
|
+
registry,
|
|
509
|
+
req: { ...req, execution: options.execution },
|
|
510
|
+
provider: hostAgentModel(registry, options),
|
|
511
|
+
own: undefined,
|
|
512
|
+
depth: 0,
|
|
513
|
+
runNested: (nested) => runNestedTurn({ ...nested, registry, canaries }),
|
|
514
|
+
});
|
|
515
|
+
}
|
|
451
516
|
/**
|
|
452
517
|
* The turn's provider runs the compactor only when it is the one the compactor
|
|
453
518
|
* would get: a text profile on the same protocol and provider.
|
|
454
519
|
*/
|
|
455
520
|
function compactorProvider(ctx, profile, spec, provider) {
|
|
456
|
-
|
|
457
|
-
return ctx.req.compactionProvider;
|
|
458
|
-
if (spec.profile === undefined)
|
|
459
|
-
return provider;
|
|
460
|
-
const compactor = ctx.registry.profiles.get(spec.profile);
|
|
461
|
-
const own = ctx.trace?.binding;
|
|
462
|
-
const theirs = compactor.models[compactor.defaultModel];
|
|
463
|
-
if (profile.type !== 'text' ||
|
|
464
|
-
own?.provider !== theirs?.provider ||
|
|
465
|
-
own?.protocol !== theirs?.protocol) {
|
|
466
|
-
throw new TheoremError('config', `Profile ${profile.id} compacts with '${spec.profile}', which this turn's provider cannot run; pass compactionProvider`);
|
|
467
|
-
}
|
|
468
|
-
return provider;
|
|
521
|
+
return nestedTurnModel(provider, spec.profile ?? profile.id, spec.profile ? undefined : ctx.req.model);
|
|
469
522
|
}
|
|
470
523
|
async function maybeCompactBefore(ctx, profile, gen, compactionSpec, provider) {
|
|
471
524
|
if (!(compactionSpec?.timing === 'before' && ctx.safe))
|
|
@@ -478,7 +531,6 @@ async function maybeCompactBefore(ctx, profile, gen, compactionSpec, provider) {
|
|
|
478
531
|
owner: profile.id,
|
|
479
532
|
model: gen.model,
|
|
480
533
|
spec: compactionSpec,
|
|
481
|
-
family: ctx.mediaFamily,
|
|
482
534
|
history: gen.history,
|
|
483
535
|
input: ctx.safe.input,
|
|
484
536
|
provider: compactor,
|
|
@@ -496,7 +548,6 @@ async function maybeAttachAfter(event, ctx, gen, compactionSpec) {
|
|
|
496
548
|
}
|
|
497
549
|
return await attachAfterCompaction(event, {
|
|
498
550
|
spec: compactionSpec,
|
|
499
|
-
family: ctx.mediaFamily,
|
|
500
551
|
history: gen.history ?? [],
|
|
501
552
|
input: ctx.safe.input,
|
|
502
553
|
seen: ctx.seen,
|
|
@@ -505,7 +556,7 @@ async function maybeAttachAfter(event, ctx, gen, compactionSpec) {
|
|
|
505
556
|
}
|
|
506
557
|
/**
|
|
507
558
|
* `timing: 'after'`: run the compactor on the history `done.compaction` carried,
|
|
508
|
-
* with the same split, failure rules and trace as `before`. `provider` runs the
|
|
559
|
+
* with the same split, failure rules, and trace as `before`. `provider` runs the
|
|
509
560
|
* compactor. `undefined` when the split leaves nothing to compact.
|
|
510
561
|
*/
|
|
511
562
|
async function compactHistoryInRegistry(registry, req, provider, sinkOverride) {
|
|
@@ -516,8 +567,7 @@ async function compactHistoryInRegistry(registry, req, provider, sinkOverride) {
|
|
|
516
567
|
if (!spec) {
|
|
517
568
|
throw new TheoremError('config', `Profile ${profile.id} model '${model}' has no compaction`);
|
|
518
569
|
}
|
|
519
|
-
const
|
|
520
|
-
const split = await splitForCompaction(req.history, spec, family);
|
|
570
|
+
const split = await splitForCompaction(req.history, spec);
|
|
521
571
|
if (split.toCompact.length === 0)
|
|
522
572
|
return undefined;
|
|
523
573
|
const turnReq = {
|
|
@@ -532,6 +582,7 @@ async function compactHistoryInRegistry(registry, req, provider, sinkOverride) {
|
|
|
532
582
|
const { sink, policy } = resolveTraceWriter({
|
|
533
583
|
override: sinkOverride,
|
|
534
584
|
observability: profile.observability,
|
|
585
|
+
guardrails: profile.guardrails,
|
|
535
586
|
});
|
|
536
587
|
const canaries = [];
|
|
537
588
|
try {
|
|
@@ -571,4 +622,4 @@ async function compactHistoryInRegistry(registry, req, provider, sinkOverride) {
|
|
|
571
622
|
}), policy);
|
|
572
623
|
}
|
|
573
624
|
}
|
|
574
|
-
export { compactHistoryInRegistry, runTurnInRegistry };
|
|
625
|
+
export { compactHistoryInRegistry, invokeAgentCaller, runTurnInRegistry, sessionAgentCaller };
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import type { ErrorKind } from '../../../guardrails/error.js';
|
|
2
|
+
import type { SpanHandle } from '../../../observability/trace-span.js';
|
|
3
|
+
import type { KernelRegistry } from '../../registry/kernel-registry.js';
|
|
4
|
+
import { type AgentCaller } from '../../tools/agent.js';
|
|
5
|
+
import type { ModelBinding, TurnEvent, TurnEventOf, TurnModel, TurnRequest } from '../../types.js';
|
|
6
|
+
/** Errors only the host can fix: a nested turn throws them rather than failing quietly every call. */
|
|
7
|
+
declare const NESTED_THROWS: ReadonlySet<ErrorKind>;
|
|
8
|
+
declare function turnError(events: readonly TurnEvent[]): TurnEventOf<'error'> | undefined;
|
|
9
|
+
/** Runs one turn of a profile under a parent span, sharing the parent's record and canaries. */
|
|
10
|
+
type RunNestedTurn = (args: {
|
|
11
|
+
req: TurnRequest;
|
|
12
|
+
provider: TurnModel;
|
|
13
|
+
parent: SpanHandle;
|
|
14
|
+
agentDepth: number;
|
|
15
|
+
}) => AsyncGenerator<TurnEvent>;
|
|
16
|
+
/**
|
|
17
|
+
* Agent tool calls for one turn. `own` is the turn's model binding: its
|
|
18
|
+
* provider runs a called agent on the same provider and protocol, and the
|
|
19
|
+
* host's hook supplies any other. Without `own` (an invoke) the provider is
|
|
20
|
+
* the host's own choice and runs as given.
|
|
21
|
+
*/
|
|
22
|
+
declare function createAgentCaller(args: {
|
|
23
|
+
registry: KernelRegistry;
|
|
24
|
+
req: Pick<TurnRequest, 'onAgentCall' | 'metadata' | 'execution' | 'pageExecution'>;
|
|
25
|
+
provider: TurnModel | undefined;
|
|
26
|
+
own: ModelBinding | undefined;
|
|
27
|
+
/** 0 for the host's own turn or invoke. */
|
|
28
|
+
depth: number;
|
|
29
|
+
runNested: RunNestedTurn;
|
|
30
|
+
}): AgentCaller;
|
|
31
|
+
export type { RunNestedTurn };
|
|
32
|
+
export { createAgentCaller, NESTED_THROWS, turnError };
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
import { errorCopyText, isAbortError, TheoremError, throwIfAborted, toErrorEvent, } from '../../../guardrails/error.js';
|
|
2
|
+
import { labelText } from '../../../guardrails/labels.js';
|
|
3
|
+
import { nestedTurnModel, resolveRegisteredTurnModel } from '../../provider-dispatch.js';
|
|
4
|
+
import { agentProfileProblem, agentToolOutputOf, splitHostInput, } from '../../tools/agent.js';
|
|
5
|
+
import { findLast } from '../../util/find-last.js';
|
|
6
|
+
import { sumEventTokens } from '../usage.js';
|
|
7
|
+
/** Errors only the host can fix: a nested turn throws them rather than failing quietly every call. */
|
|
8
|
+
const NESTED_THROWS = new Set(['config', 'request', 'auth', 'internal']);
|
|
9
|
+
function turnError(events) {
|
|
10
|
+
return events.find((e) => e.type === 'error');
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Agent tool calls for one turn. `own` is the turn's model binding: its
|
|
14
|
+
* provider runs a called agent on the same provider and protocol, and the
|
|
15
|
+
* host's hook supplies any other. Without `own` (an invoke) the provider is
|
|
16
|
+
* the host's own choice and runs as given.
|
|
17
|
+
*/
|
|
18
|
+
function createAgentCaller(args) {
|
|
19
|
+
const calls = new Map();
|
|
20
|
+
const { registry, req } = args;
|
|
21
|
+
return {
|
|
22
|
+
async *run({ tool, callId, input, caller, span, signal }) {
|
|
23
|
+
const labels = caller.labels;
|
|
24
|
+
const settled = (code, kind, message) => ({
|
|
25
|
+
failure: { code, kind, message },
|
|
26
|
+
});
|
|
27
|
+
const made = calls.get(tool.name) ?? 0;
|
|
28
|
+
if (tool.maxCallsPerTurn !== undefined && made >= tool.maxCallsPerTurn) {
|
|
29
|
+
return settled('call_limit', 'declined', labelText('tool.agent_call_limit', { tool: tool.name }, labels));
|
|
30
|
+
}
|
|
31
|
+
calls.set(tool.name, made + 1);
|
|
32
|
+
const profile = registry.profiles.get(tool.profile);
|
|
33
|
+
const problem = agentProfileProblem(profile, (name) => registry.tools.get(name));
|
|
34
|
+
if (problem) {
|
|
35
|
+
throw new TheoremError('config', `Agent tool "${tool.name}" can't run '${tool.profile}': ${problem}`);
|
|
36
|
+
}
|
|
37
|
+
const { sent: modelInput, hostInput } = splitHostInput(tool, input);
|
|
38
|
+
if (hostInput && !req.onAgentCall) {
|
|
39
|
+
throw new TheoremError('config', `Agent tool "${tool.name}" declares host fields, which need the request's onAgentCall`);
|
|
40
|
+
}
|
|
41
|
+
const shaped = await req.onAgentCall?.({
|
|
42
|
+
tool: tool.name,
|
|
43
|
+
callId,
|
|
44
|
+
profile: tool.profile,
|
|
45
|
+
input: modelInput,
|
|
46
|
+
...(hostInput ? { hostInput } : {}),
|
|
47
|
+
caller: caller.id,
|
|
48
|
+
depth: args.depth + 1,
|
|
49
|
+
...(req.metadata ? { metadata: req.metadata } : {}),
|
|
50
|
+
...(signal ? { signal } : {}),
|
|
51
|
+
});
|
|
52
|
+
if (shaped && 'refuse' in shaped) {
|
|
53
|
+
return settled('refused_by_host', 'declined', shaped.refuse);
|
|
54
|
+
}
|
|
55
|
+
const { provider: hostProvider, ...fields } = shaped ?? {};
|
|
56
|
+
const provider = agentProvider(args, profile.id, fields.model, hostProvider);
|
|
57
|
+
if (!span) {
|
|
58
|
+
throw new TheoremError('internal', `Agent tool "${tool.name}" ran without a span`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
59
|
+
}
|
|
60
|
+
const { speech, ...sent } = modelInput;
|
|
61
|
+
const events = [];
|
|
62
|
+
try {
|
|
63
|
+
for await (const event of args.runNested({
|
|
64
|
+
req: {
|
|
65
|
+
...(speech ? { speech } : {}),
|
|
66
|
+
...fields,
|
|
67
|
+
profile: tool.profile,
|
|
68
|
+
execution: req.execution,
|
|
69
|
+
pageExecution: req.pageExecution,
|
|
70
|
+
input: fields.input ?? sent,
|
|
71
|
+
...(signal ? { signal } : {}),
|
|
72
|
+
...(req.onAgentCall ? { onAgentCall: req.onAgentCall } : {}),
|
|
73
|
+
},
|
|
74
|
+
provider,
|
|
75
|
+
parent: span,
|
|
76
|
+
agentDepth: args.depth + 1,
|
|
77
|
+
})) {
|
|
78
|
+
events.push(event);
|
|
79
|
+
yield event;
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
catch (err) {
|
|
83
|
+
// why: A turn refused before it starts (a file the agent does not take) throws; the caller's model reads it like any other failed call.
|
|
84
|
+
if (!(err instanceof TheoremError) || NESTED_THROWS.has(err.kind) || isAbortError(err)) {
|
|
85
|
+
throw err;
|
|
86
|
+
}
|
|
87
|
+
events.push(toErrorEvent(err));
|
|
88
|
+
}
|
|
89
|
+
throwIfAborted(signal);
|
|
90
|
+
return agentRunOf(events, tool.name, tool.profile, labels);
|
|
91
|
+
},
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
/** The provider an agent's turn runs on: the host's for this call, else the caller's, else the registry's. */
|
|
95
|
+
function agentProvider(from, profileId, model, hostProvider) {
|
|
96
|
+
if (hostProvider)
|
|
97
|
+
return resolveRegisteredTurnModel(from.registry, profileId, model, hostProvider);
|
|
98
|
+
if (from.provider)
|
|
99
|
+
return nestedTurnModel(from.provider, profileId, model);
|
|
100
|
+
return resolveRegisteredTurnModel(from.registry, profileId, model, {});
|
|
101
|
+
}
|
|
102
|
+
/** The agent's reply, or why there is none. Errors only the host can fix are thrown. */
|
|
103
|
+
function agentRunOf(events, toolName, profileId, labels) {
|
|
104
|
+
const done = findLast(events, (e) => e.type === 'done');
|
|
105
|
+
const tokens = done?.tokens ?? sumEventTokens(events);
|
|
106
|
+
const usage = tokens ? { tokens } : {};
|
|
107
|
+
const reported = turnError(events);
|
|
108
|
+
if (reported && NESTED_THROWS.has(reported.errorKind)) {
|
|
109
|
+
throw new TheoremError(reported.errorKind, `Agent '${profileId}' failed: ${reported.errorInternal ?? reported.error}`);
|
|
110
|
+
}
|
|
111
|
+
const stop = done?.stop.kind;
|
|
112
|
+
if (stop !== 'completed' || reported) {
|
|
113
|
+
const failed = labelText('tool.agent_failed', { tool: toolName }, labels);
|
|
114
|
+
// why: Reasons the agent's turn named (a file it does not take, a model that is busy) let the caller's model correct the call or say why.
|
|
115
|
+
const reason = reported?.errorCopy
|
|
116
|
+
? errorCopyText(reported.errorCopy, labels)
|
|
117
|
+
: reported?.error;
|
|
118
|
+
return {
|
|
119
|
+
failure: {
|
|
120
|
+
code: 'agent_failed',
|
|
121
|
+
kind: reported?.errorKind ?? 'failed',
|
|
122
|
+
message: reason ? `${failed}\n${reason}` : failed,
|
|
123
|
+
details: {
|
|
124
|
+
agent: profileId,
|
|
125
|
+
...(stop ? { stop } : {}),
|
|
126
|
+
...(reported?.errorCopy ? { reasons: reported.errorCopy } : {}),
|
|
127
|
+
},
|
|
128
|
+
},
|
|
129
|
+
...usage,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return { output: agentToolOutputOf(events), ...usage };
|
|
133
|
+
}
|
|
134
|
+
export { createAgentCaller, NESTED_THROWS, turnError };
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ProfileValidator } from '../../types.js';
|
|
1
|
+
import type { ItemCheckTurn, ProfileItemRule, ProfileValidator } from '../../types.js';
|
|
2
2
|
interface ValidationFailure {
|
|
3
3
|
path: string;
|
|
4
4
|
error: string;
|
|
@@ -9,6 +9,27 @@ declare function isAbsent(value: unknown): boolean;
|
|
|
9
9
|
* paths and for optional paths that are present. Throws when the root is not an object schema.
|
|
10
10
|
*/
|
|
11
11
|
declare function collectValidationFailures(jsonSchema: Record<string, unknown>, structured: unknown, fields: Record<string, ProfileValidator> | undefined, slots?: Record<string, string>): Promise<ValidationFailure[]>;
|
|
12
|
+
/**
|
|
13
|
+
* Whether a validator keyed by `path` can run against `jsonSchema`: each segment is a
|
|
14
|
+
* property or required key of an object schema, as `collectValidationFailures` walks it.
|
|
15
|
+
*/
|
|
16
|
+
declare function schemaReaches(jsonSchema: Record<string, unknown>, path: string): boolean;
|
|
12
17
|
declare function formatValidationFailures(failures: ValidationFailure[]): string;
|
|
13
|
-
|
|
14
|
-
|
|
18
|
+
/** One list item an item rule refused: where it sat, the item, and why. */
|
|
19
|
+
interface ItemFailure {
|
|
20
|
+
path: string;
|
|
21
|
+
index: number;
|
|
22
|
+
item: unknown;
|
|
23
|
+
reason: string;
|
|
24
|
+
onFail: ProfileItemRule['onFail'];
|
|
25
|
+
}
|
|
26
|
+
/** The value at a dotted path, reached through object properties only. */
|
|
27
|
+
declare function valueAt(structured: unknown, path: string): unknown;
|
|
28
|
+
/** `structured` with the list at `path` replaced; every object on the way is copied. */
|
|
29
|
+
declare function withListAt(structured: unknown, path: string, list: unknown[]): unknown;
|
|
30
|
+
/** Each item an item rule refuses, in the reply's own order. A path with no list has no items. */
|
|
31
|
+
declare function collectItemFailures(structured: unknown, items: Record<string, ProfileItemRule> | undefined, turn: ItemCheckTurn): Promise<ItemFailure[]>;
|
|
32
|
+
/** The schema of one item of the list at `path`, or `undefined` when the path reaches no list with one. */
|
|
33
|
+
declare function itemSchemaAt(jsonSchema: Record<string, unknown>, path: string): Record<string, unknown> | undefined;
|
|
34
|
+
export type { ItemFailure, ValidationFailure };
|
|
35
|
+
export { collectItemFailures, collectValidationFailures, formatValidationFailures, isAbsent, itemSchemaAt, schemaReaches, valueAt, withListAt, };
|