@theoremjs/agents 0.0.0-stage → 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/LICENSE +21 -0
- package/README.md +545 -2
- package/esm/_dnt.polyfills.d.ts +66 -0
- package/esm/_dnt.polyfills.js +51 -0
- package/esm/mod.d.ts +79 -0
- package/esm/mod.js +49 -0
- package/esm/package.json +3 -0
- package/esm/src/cli/bin.d.ts +7 -0
- package/esm/src/cli/bin.js +9 -0
- package/esm/src/cli/commands/bench.d.ts +6 -0
- package/esm/src/cli/commands/bench.js +480 -0
- 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 +37 -0
- package/esm/src/cli/commands/eval.js +190 -0
- package/esm/src/cli/commands/fuzz-canary.d.ts +15 -0
- package/esm/src/cli/commands/fuzz-canary.js +241 -0
- package/esm/src/cli/commands/fuzz-guardrails.d.ts +2 -0
- package/esm/src/cli/commands/fuzz-guardrails.js +5 -0
- package/esm/src/cli/commands/profile.d.ts +2 -0
- package/esm/src/cli/commands/profile.js +80 -0
- package/esm/src/cli/commands/run.d.ts +13 -0
- package/esm/src/cli/commands/run.js +45 -0
- package/esm/src/cli/commands/test.d.ts +26 -0
- package/esm/src/cli/commands/test.js +143 -0
- package/esm/src/cli/event-log.d.ts +15 -0
- package/esm/src/cli/event-log.js +136 -0
- package/esm/src/cli/index.d.ts +10 -0
- package/esm/src/cli/index.js +267 -0
- package/esm/src/cli/matrix/fixtures.d.ts +10 -0
- package/esm/src/cli/matrix/fixtures.js +67 -0
- package/esm/src/cli/matrix/synthesizer.d.ts +18 -0
- package/esm/src/cli/matrix/synthesizer.js +103 -0
- package/esm/src/evals/attachments.d.ts +5 -0
- package/esm/src/evals/attachments.js +55 -0
- package/esm/src/evals/breakdown.d.ts +30 -0
- package/esm/src/evals/breakdown.js +69 -0
- package/esm/src/evals/graders/answer.d.ts +16 -0
- package/esm/src/evals/graders/answer.js +134 -0
- package/esm/src/evals/graders/code.d.ts +40 -0
- package/esm/src/evals/graders/code.js +184 -0
- package/esm/src/evals/graders/judge.d.ts +24 -0
- package/esm/src/evals/graders/judge.js +367 -0
- package/esm/src/evals/graders/latency.d.ts +6 -0
- package/esm/src/evals/graders/latency.js +82 -0
- package/esm/src/evals/graders/live.d.ts +14 -0
- package/esm/src/evals/graders/live.js +42 -0
- package/esm/src/evals/graders/media.d.ts +18 -0
- package/esm/src/evals/graders/media.js +91 -0
- package/esm/src/evals/graders/shared.d.ts +11 -0
- package/esm/src/evals/graders/shared.js +62 -0
- package/esm/src/evals/graders/transcript.d.ts +19 -0
- package/esm/src/evals/graders/transcript.js +202 -0
- package/esm/src/evals/mod.d.ts +34 -0
- package/esm/src/evals/mod.js +22 -0
- package/esm/src/evals/record.d.ts +41 -0
- package/esm/src/evals/record.js +107 -0
- package/esm/src/evals/rubrics/catalog.d.ts +148 -0
- package/esm/src/evals/rubrics/catalog.js +846 -0
- package/esm/src/evals/rubrics/mod.d.ts +24 -0
- package/esm/src/evals/rubrics/mod.js +55 -0
- package/esm/src/evals/rubrics/mustache.d.ts +23 -0
- package/esm/src/evals/rubrics/mustache.js +154 -0
- package/esm/src/evals/rubrics/types.d.ts +54 -0
- package/esm/src/evals/rubrics/types.js +74 -0
- package/esm/src/evals/run.d.ts +75 -0
- package/esm/src/evals/run.js +418 -0
- package/esm/src/evals/suite.d.ts +28 -0
- package/esm/src/evals/suite.js +97 -0
- package/esm/src/evals/summary.d.ts +35 -0
- package/esm/src/evals/summary.js +31 -0
- package/esm/src/evals/trial.d.ts +14 -0
- package/esm/src/evals/trial.js +135 -0
- package/esm/src/evals/types.d.ts +169 -0
- package/esm/src/evals/types.js +113 -0
- package/esm/src/evals/verdict.d.ts +23 -0
- package/esm/src/evals/verdict.js +48 -0
- 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 +22 -0
- package/esm/src/guardrails/canary-gate.js +40 -0
- package/esm/src/guardrails/canary.d.ts +146 -0
- package/esm/src/guardrails/canary.js +974 -0
- package/esm/src/guardrails/compile-egress.d.ts +12 -0
- package/esm/src/guardrails/compile-egress.js +12 -0
- package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +24 -0
- package/esm/src/guardrails/corpus/canary-egress-attacks.js +305 -0
- package/esm/src/guardrails/corpus/fuzz-inbound.d.ts +5 -0
- package/esm/src/guardrails/corpus/fuzz-inbound.js +199 -0
- package/esm/src/guardrails/corpus/inbound-payloads.d.ts +5 -0
- package/esm/src/guardrails/corpus/inbound-payloads.js +120 -0
- package/esm/src/guardrails/corpus/live-attacks.d.ts +15 -0
- package/esm/src/guardrails/corpus/live-attacks.js +229 -0
- package/esm/src/guardrails/corpus/mod.d.ts +7 -0
- package/esm/src/guardrails/corpus/mod.js +4 -0
- package/esm/src/guardrails/corpus/secrets.d.ts +12 -0
- package/esm/src/guardrails/corpus/secrets.js +16 -0
- package/esm/src/guardrails/corpus/strings.d.ts +23 -0
- package/esm/src/guardrails/corpus/strings.js +29 -0
- package/esm/src/guardrails/corpus/types.d.ts +36 -0
- package/esm/src/guardrails/corpus/types.js +1 -0
- 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 +12 -0
- package/esm/src/guardrails/egress-automata.js +25582 -0
- package/esm/src/guardrails/egress-compiler.d.ts +55 -0
- package/esm/src/guardrails/egress-compiler.js +431 -0
- package/esm/src/guardrails/egress-patterns.d.ts +26 -0
- package/esm/src/guardrails/egress-patterns.js +36 -0
- package/esm/src/guardrails/egress-stream.d.ts +123 -0
- package/esm/src/guardrails/egress-stream.js +774 -0
- package/esm/src/guardrails/egress-urls.d.ts +86 -0
- package/esm/src/guardrails/egress-urls.js +909 -0
- package/esm/src/guardrails/egress.d.ts +46 -0
- package/esm/src/guardrails/egress.js +124 -0
- package/esm/src/guardrails/error.d.ts +31 -0
- package/esm/src/guardrails/error.js +96 -0
- package/esm/src/guardrails/event-schemas.d.ts +100 -0
- package/esm/src/guardrails/event-schemas.js +48 -0
- package/esm/src/guardrails/events.d.ts +13 -0
- package/esm/src/guardrails/events.js +45 -0
- package/esm/src/guardrails/hints.d.ts +14 -0
- package/esm/src/guardrails/hints.js +57 -0
- package/esm/src/guardrails/hits.d.ts +14 -0
- package/esm/src/guardrails/hits.js +30 -0
- 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 +20 -0
- package/esm/src/guardrails/injection-patterns.js +126 -0
- 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 +30 -0
- package/esm/src/guardrails/injection.js +460 -0
- 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 +55 -0
- package/esm/src/guardrails/live-outbound-gate.js +298 -0
- package/esm/src/guardrails/mod.d.ts +54 -0
- package/esm/src/guardrails/mod.js +34 -0
- package/esm/src/guardrails/network.d.ts +46 -0
- package/esm/src/guardrails/network.js +330 -0
- package/esm/src/guardrails/normalize.d.ts +20 -0
- package/esm/src/guardrails/normalize.js +165 -0
- package/esm/src/guardrails/policy.d.ts +4 -0
- package/esm/src/guardrails/policy.js +21 -0
- package/esm/src/guardrails/progressive-yield.d.ts +110 -0
- package/esm/src/guardrails/progressive-yield.js +281 -0
- package/esm/src/guardrails/prompt-echo.d.ts +40 -0
- package/esm/src/guardrails/prompt-echo.js +306 -0
- package/esm/src/guardrails/quota.d.ts +21 -0
- package/esm/src/guardrails/quota.js +80 -0
- package/esm/src/guardrails/rules.d.ts +47 -0
- package/esm/src/guardrails/rules.js +47 -0
- package/esm/src/guardrails/sanitize.d.ts +40 -0
- package/esm/src/guardrails/sanitize.js +160 -0
- 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 +22 -0
- package/esm/src/guardrails/sensitive.js +234 -0
- package/esm/src/guardrails/serialize.d.ts +15 -0
- package/esm/src/guardrails/serialize.js +37 -0
- package/esm/src/guardrails/testing.d.ts +11 -0
- package/esm/src/guardrails/testing.js +10 -0
- package/esm/src/guardrails/theorem-error.d.ts +21 -0
- package/esm/src/guardrails/theorem-error.js +54 -0
- package/esm/src/guardrails/thought-guard.d.ts +76 -0
- package/esm/src/guardrails/thought-guard.js +664 -0
- package/esm/src/guardrails/tool-directives.d.ts +38 -0
- package/esm/src/guardrails/tool-directives.js +195 -0
- 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 +92 -0
- package/esm/src/guardrails/tool-result.js +272 -0
- package/esm/src/guardrails/types.d.ts +250 -0
- package/esm/src/guardrails/types.js +58 -0
- package/esm/src/host/client-turn.d.ts +36 -0
- package/esm/src/host/client-turn.js +80 -0
- package/esm/src/host/mint-trace.d.ts +29 -0
- package/esm/src/host/mint-trace.js +60 -0
- package/esm/src/host/mod.d.ts +13 -0
- package/esm/src/host/mod.js +11 -0
- package/esm/src/host/readStreamingJsonStringField.d.ts +2 -0
- package/esm/src/host/readStreamingJsonStringField.js +27 -0
- package/esm/src/host/reply.d.ts +13 -0
- package/esm/src/host/reply.js +41 -0
- package/esm/src/interface/blocks.d.ts +11 -0
- package/esm/src/interface/blocks.js +283 -0
- package/esm/src/interface/composer-actions.d.ts +24 -0
- package/esm/src/interface/composer-actions.js +33 -0
- package/esm/src/interface/draft.d.ts +20 -0
- package/esm/src/interface/draft.js +39 -0
- package/esm/src/interface/from-profile.d.ts +24 -0
- package/esm/src/interface/from-profile.js +179 -0
- package/esm/src/interface/history.d.ts +46 -0
- package/esm/src/interface/history.js +278 -0
- package/esm/src/interface/inputs.d.ts +11 -0
- package/esm/src/interface/inputs.js +67 -0
- package/esm/src/interface/mod.d.ts +33 -0
- package/esm/src/interface/mod.js +22 -0
- package/esm/src/interface/models.d.ts +26 -0
- package/esm/src/interface/models.js +50 -0
- package/esm/src/interface/pending.d.ts +57 -0
- package/esm/src/interface/pending.js +152 -0
- package/esm/src/interface/profile-interface.d.ts +4 -0
- package/esm/src/interface/profile-interface.js +237 -0
- package/esm/src/interface/session.d.ts +71 -0
- package/esm/src/interface/session.js +128 -0
- 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 +32 -0
- package/esm/src/interface/tool-calls.js +127 -0
- package/esm/src/interface/tool-invoke.d.ts +6 -0
- package/esm/src/interface/tool-invoke.js +22 -0
- package/esm/src/interface/tool-media.d.ts +11 -0
- package/esm/src/interface/tool-media.js +113 -0
- package/esm/src/interface/types.d.ts +278 -0
- package/esm/src/interface/types.js +5 -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/credential-source.d.ts +23 -0
- package/esm/src/kernel/auth/credential-source.js +11 -0
- package/esm/src/kernel/auth/crypto.d.ts +56 -0
- package/esm/src/kernel/auth/crypto.js +163 -0
- package/esm/src/kernel/auth/mod.d.ts +5 -0
- package/esm/src/kernel/auth/mod.js +5 -0
- package/esm/src/kernel/auth/oauth.d.ts +18 -0
- package/esm/src/kernel/auth/oauth.js +439 -0
- package/esm/src/kernel/auth/scope-refusal.d.ts +9 -0
- package/esm/src/kernel/auth/scope-refusal.js +8 -0
- package/esm/src/kernel/auth/typed-secret.d.ts +13 -0
- package/esm/src/kernel/auth/typed-secret.js +23 -0
- package/esm/src/kernel/auth/types.d.ts +152 -0
- package/esm/src/kernel/auth/types.js +1 -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 +72 -0
- package/esm/src/kernel/default-scope.js +121 -0
- 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 +71 -0
- package/esm/src/kernel/engine/compaction.js +203 -0
- package/esm/src/kernel/engine/decision.d.ts +43 -0
- package/esm/src/kernel/engine/decision.js +439 -0
- package/esm/src/kernel/engine/embedding.d.ts +8 -0
- package/esm/src/kernel/engine/embedding.js +118 -0
- package/esm/src/kernel/engine/hash.d.ts +6 -0
- package/esm/src/kernel/engine/hash.js +22 -0
- package/esm/src/kernel/engine/live-inbound.d.ts +19 -0
- package/esm/src/kernel/engine/live-inbound.js +44 -0
- package/esm/src/kernel/engine/live-ingress.d.ts +15 -0
- package/esm/src/kernel/engine/live-ingress.js +42 -0
- package/esm/src/kernel/engine/record.d.ts +3 -0
- package/esm/src/kernel/engine/record.js +11 -0
- package/esm/src/kernel/engine/repair.d.ts +7 -0
- package/esm/src/kernel/engine/repair.js +36 -0
- package/esm/src/kernel/engine/runner/gates.d.ts +5 -0
- package/esm/src/kernel/engine/runner/gates.js +508 -0
- package/esm/src/kernel/engine/runner/mod.d.ts +29 -0
- package/esm/src/kernel/engine/runner/mod.js +625 -0
- 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 +35 -0
- package/esm/src/kernel/engine/runner/schema-validation.js +179 -0
- package/esm/src/kernel/engine/runner/stages.d.ts +28 -0
- package/esm/src/kernel/engine/runner/stages.js +41 -0
- package/esm/src/kernel/engine/runner/state.d.ts +97 -0
- package/esm/src/kernel/engine/runner/state.js +50 -0
- 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 +14 -0
- package/esm/src/kernel/engine/runner/steps.js +519 -0
- package/esm/src/kernel/engine/runner/stream.d.ts +71 -0
- package/esm/src/kernel/engine/runner/stream.js +376 -0
- package/esm/src/kernel/engine/runner/usage.d.ts +45 -0
- package/esm/src/kernel/engine/runner/usage.js +148 -0
- package/esm/src/kernel/engine/session/mod.d.ts +33 -0
- package/esm/src/kernel/engine/session/mod.js +1182 -0
- package/esm/src/kernel/engine/session/session-trace.d.ts +115 -0
- package/esm/src/kernel/engine/session/session-trace.js +500 -0
- package/esm/src/kernel/engine/token-estimate.d.ts +23 -0
- package/esm/src/kernel/engine/token-estimate.js +38 -0
- package/esm/src/kernel/engine/tool-trace.d.ts +58 -0
- package/esm/src/kernel/engine/tool-trace.js +132 -0
- package/esm/src/kernel/engine/tree.d.ts +2 -0
- package/esm/src/kernel/engine/tree.js +17 -0
- package/esm/src/kernel/engine/turn-trace.d.ts +119 -0
- package/esm/src/kernel/engine/turn-trace.js +855 -0
- package/esm/src/kernel/engine/usage.d.ts +36 -0
- package/esm/src/kernel/engine/usage.js +151 -0
- package/esm/src/kernel/interaction-parts.d.ts +13 -0
- package/esm/src/kernel/interaction-parts.js +40 -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 +74 -0
- package/esm/src/kernel/mod.js +45 -0
- package/esm/src/kernel/profile-graph.d.ts +145 -0
- package/esm/src/kernel/profile-graph.js +158 -0
- package/esm/src/kernel/profile-presence.d.ts +18 -0
- package/esm/src/kernel/profile-presence.js +158 -0
- package/esm/src/kernel/profile-scope.d.ts +40 -0
- package/esm/src/kernel/profile-scope.js +274 -0
- 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 +46 -0
- package/esm/src/kernel/registry/attachments.js +220 -0
- package/esm/src/kernel/registry/catalog.d.ts +25 -0
- package/esm/src/kernel/registry/catalog.js +85 -0
- 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 +12 -0
- package/esm/src/kernel/registry/ingress.js +179 -0
- package/esm/src/kernel/registry/kernel-registry.d.ts +15 -0
- package/esm/src/kernel/registry/kernel-registry.js +15 -0
- package/esm/src/kernel/registry/profile-outputs.d.ts +3 -0
- package/esm/src/kernel/registry/profile-outputs.js +10 -0
- package/esm/src/kernel/registry/profiles.d.ts +116 -0
- package/esm/src/kernel/registry/profiles.js +773 -0
- package/esm/src/kernel/registry/provider-request.d.ts +6 -0
- package/esm/src/kernel/registry/provider-request.js +34 -0
- package/esm/src/kernel/registry/resolve.d.ts +17 -0
- package/esm/src/kernel/registry/resolve.js +238 -0
- package/esm/src/kernel/registry/schemas.d.ts +12 -0
- package/esm/src/kernel/registry/schemas.js +27 -0
- 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/sole-model.d.ts +2 -0
- package/esm/src/kernel/registry/sole-model.js +4 -0
- package/esm/src/kernel/registry/system-prompt.d.ts +8 -0
- package/esm/src/kernel/registry/system-prompt.js +32 -0
- package/esm/src/kernel/registry/system-role.d.ts +3 -0
- package/esm/src/kernel/registry/system-role.js +9 -0
- package/esm/src/kernel/registry/vault.d.ts +14 -0
- package/esm/src/kernel/registry/vault.js +1 -0
- package/esm/src/kernel/schema.d.ts +226 -0
- package/esm/src/kernel/schema.js +895 -0
- package/esm/src/kernel/scope.d.ts +29 -0
- package/esm/src/kernel/scope.js +45 -0
- package/esm/src/kernel/stages.d.ts +176 -0
- package/esm/src/kernel/stages.js +431 -0
- package/esm/src/kernel/stop.d.ts +116 -0
- package/esm/src/kernel/stop.js +137 -0
- package/esm/src/kernel/system-parts.d.ts +26 -0
- package/esm/src/kernel/system-parts.js +98 -0
- package/esm/src/kernel/tools/activity-label.d.ts +22 -0
- package/esm/src/kernel/tools/activity-label.js +435 -0
- 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 +66 -0
- package/esm/src/kernel/tools/events.js +184 -0
- package/esm/src/kernel/tools/execute.d.ts +100 -0
- package/esm/src/kernel/tools/execute.js +1173 -0
- package/esm/src/kernel/tools/gate-answer.d.ts +60 -0
- package/esm/src/kernel/tools/gate-answer.js +65 -0
- 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 +17 -0
- package/esm/src/kernel/tools/harness.js +43 -0
- 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 +32 -0
- package/esm/src/kernel/tools/invoke.js +282 -0
- package/esm/src/kernel/tools/mcp-sessions.d.ts +23 -0
- package/esm/src/kernel/tools/mcp-sessions.js +69 -0
- package/esm/src/kernel/tools/mod.d.ts +10 -0
- package/esm/src/kernel/tools/mod.js +7 -0
- package/esm/src/kernel/tools/model-text.d.ts +16 -0
- package/esm/src/kernel/tools/model-text.js +31 -0
- 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 +15 -0
- package/esm/src/kernel/tools/permission.js +38 -0
- package/esm/src/kernel/tools/project.d.ts +11 -0
- package/esm/src/kernel/tools/project.js +55 -0
- package/esm/src/kernel/tools/registry.d.ts +27 -0
- package/esm/src/kernel/tools/registry.js +143 -0
- package/esm/src/kernel/tools/remote.d.ts +144 -0
- package/esm/src/kernel/tools/remote.js +1125 -0
- package/esm/src/kernel/tools/resolve.d.ts +31 -0
- package/esm/src/kernel/tools/resolve.js +267 -0
- 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 +10 -0
- package/esm/src/kernel/tools/schema.js +95 -0
- package/esm/src/kernel/tools/signed-in-fetch.d.ts +19 -0
- package/esm/src/kernel/tools/signed-in-fetch.js +45 -0
- package/esm/src/kernel/tools/stage-run.d.ts +116 -0
- package/esm/src/kernel/tools/stage-run.js +198 -0
- package/esm/src/kernel/tools/types.d.ts +497 -0
- package/esm/src/kernel/tools/types.js +1 -0
- 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 +776 -0
- package/esm/src/kernel/turn-events.js +543 -0
- package/esm/src/kernel/types.d.ts +1025 -0
- package/esm/src/kernel/types.js +1 -0
- package/esm/src/kernel/util/base64.d.ts +4 -0
- package/esm/src/kernel/util/base64.js +15 -0
- package/esm/src/kernel/util/exact-type.d.ts +31 -0
- package/esm/src/kernel/util/exact-type.js +1 -0
- package/esm/src/kernel/util/find-last.d.ts +3 -0
- package/esm/src/kernel/util/find-last.js +9 -0
- package/esm/src/kernel/util/mime.d.ts +2 -0
- package/esm/src/kernel/util/mime.js +4 -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 +2 -0
- package/esm/src/kernel/util/record.js +4 -0
- package/esm/src/observability/destinations.d.ts +14 -0
- package/esm/src/observability/destinations.js +43 -0
- package/esm/src/observability/jsonl.d.ts +18 -0
- package/esm/src/observability/jsonl.js +110 -0
- package/esm/src/observability/mod.d.ts +22 -0
- package/esm/src/observability/mod.js +16 -0
- package/esm/src/observability/openinference.d.ts +11 -0
- package/esm/src/observability/openinference.js +205 -0
- package/esm/src/observability/otlp.d.ts +71 -0
- package/esm/src/observability/otlp.js +98 -0
- package/esm/src/observability/phoenix.d.ts +30 -0
- package/esm/src/observability/phoenix.js +71 -0
- package/esm/src/observability/policy.d.ts +17 -0
- package/esm/src/observability/policy.js +73 -0
- package/esm/src/observability/resolve-policy.d.ts +8 -0
- package/esm/src/observability/resolve-policy.js +64 -0
- package/esm/src/observability/spans.d.ts +22 -0
- package/esm/src/observability/spans.js +72 -0
- package/esm/src/observability/trace-catalog.d.ts +128 -0
- package/esm/src/observability/trace-catalog.js +906 -0
- package/esm/src/observability/trace-record.d.ts +23 -0
- package/esm/src/observability/trace-record.js +228 -0
- package/esm/src/observability/trace-schema.d.ts +57 -0
- package/esm/src/observability/trace-schema.js +59 -0
- package/esm/src/observability/trace-sink.d.ts +14 -0
- package/esm/src/observability/trace-sink.js +3 -0
- package/esm/src/observability/trace-span.d.ts +98 -0
- package/esm/src/observability/trace-span.js +201 -0
- package/esm/src/observability/trace.d.ts +13 -0
- package/esm/src/observability/trace.js +37 -0
- package/esm/src/observability/types.d.ts +109 -0
- package/esm/src/observability/types.js +3 -0
- package/esm/src/presets/google/speech-voices.d.ts +9 -0
- package/esm/src/presets/google/speech-voices.js +38 -0
- package/esm/src/presets/google-limits.d.ts +13 -0
- package/esm/src/presets/google-limits.js +18 -0
- package/esm/src/presets/google.d.ts +119 -0
- package/esm/src/presets/google.js +197 -0
- package/esm/src/presets/local.d.ts +26 -0
- package/esm/src/presets/local.js +30 -0
- package/esm/src/presets/mod.d.ts +11 -0
- package/esm/src/presets/mod.js +9 -0
- package/esm/src/presets/openrouter.d.ts +26 -0
- package/esm/src/presets/openrouter.js +31 -0
- 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/api-error.d.ts +8 -0
- package/esm/src/providers/google/api-error.js +123 -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 +5 -0
- package/esm/src/providers/google/grounding.js +226 -0
- package/esm/src/providers/google/interactions/framing.d.ts +27 -0
- package/esm/src/providers/google/interactions/framing.js +304 -0
- package/esm/src/providers/google/interactions/steps.d.ts +12 -0
- package/esm/src/providers/google/interactions/steps.js +200 -0
- package/esm/src/providers/google/interactions/stream.d.ts +23 -0
- package/esm/src/providers/google/interactions/stream.js +230 -0
- package/esm/src/providers/google/live/framing.d.ts +61 -0
- package/esm/src/providers/google/live/framing.js +597 -0
- package/esm/src/providers/google/live/stream.d.ts +13 -0
- package/esm/src/providers/google/live/stream.js +57 -0
- package/esm/src/providers/google/thinking.d.ts +3 -0
- package/esm/src/providers/google/thinking.js +8 -0
- package/esm/src/providers/google/urls.d.ts +4 -0
- package/esm/src/providers/google/urls.js +4 -0
- package/esm/src/providers/google/usage.d.ts +7 -0
- package/esm/src/providers/google/usage.js +49 -0
- 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 +32 -0
- package/esm/src/providers/mod.js +23 -0
- 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 +15 -0
- package/esm/src/providers/openrouter/image.js +34 -0
- 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 +19 -0
- package/esm/src/providers/openrouter/openai/compat.js +162 -0
- package/esm/src/providers/openrouter/openai/image-payload.d.ts +9 -0
- package/esm/src/providers/openrouter/openai/image-payload.js +115 -0
- 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/openai/usage.d.ts +8 -0
- package/esm/src/providers/openrouter/openai/usage.js +56 -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.d.ts +14 -0
- package/esm/src/providers/shared/pcm.js +78 -0
- 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 +11 -0
- package/esm/src/providers/shared/response-identity.js +12 -0
- 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 +6 -0
- package/esm/src/providers/shared/sse.js +93 -0
- package/esm/src/providers/shared/structured-output.d.ts +4 -0
- package/esm/src/providers/shared/structured-output.js +11 -0
- package/esm/src/providers/shared/tool-args.d.ts +24 -0
- package/esm/src/providers/shared/tool-args.js +88 -0
- 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 +8 -0
- package/esm/src/providers/shared/upstream-tap.js +85 -0
- package/esm/src/providers/shared/upstream-tape.d.ts +6 -0
- package/esm/src/providers/shared/upstream-tape.js +88 -0
- 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 +51 -0
- package/esm/src/providers/types.js +2 -0
- 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 +46 -0
- package/esm/src/surface/formats.js +178 -0
- package/esm/src/surface/mod.d.ts +16 -0
- package/esm/src/surface/mod.js +12 -0
- package/esm/src/surface/runtime.d.ts +44 -0
- package/esm/src/surface/runtime.js +441 -0
- package/esm/src/surface/tools.d.ts +9 -0
- package/esm/src/surface/tools.js +62 -0
- package/esm/src/surface/types.d.ts +110 -0
- package/esm/src/surface/types.js +4 -0
- package/package.json +100 -4
|
@@ -0,0 +1,435 @@
|
|
|
1
|
+
import { isRecord } from '../util/record.js';
|
|
2
|
+
const PLACEHOLDER = /\{\{?([^{}]*)\}\}?/g;
|
|
3
|
+
// why: Control and bidi-override characters would let a tool's output restyle or reorder the label.
|
|
4
|
+
const UNPRINTABLE = /[\p{Cc}\p{Cf}]/gu;
|
|
5
|
+
const INDEX = /^-?\d+$/;
|
|
6
|
+
const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/;
|
|
7
|
+
const NUMBER = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });
|
|
8
|
+
// why: Dates show the wall-clock time as the tool wrote it, not converted to the server's zone.
|
|
9
|
+
const DAY = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeZone: 'UTC' });
|
|
10
|
+
const DAY_TIME = new Intl.DateTimeFormat(undefined, {
|
|
11
|
+
dateStyle: 'medium',
|
|
12
|
+
timeStyle: 'short',
|
|
13
|
+
timeZone: 'UTC',
|
|
14
|
+
});
|
|
15
|
+
const JOINED = /^\+\s+/;
|
|
16
|
+
/** The colon that ends a line's condition: the first one followed by a space or the line's end. */
|
|
17
|
+
const WHEN_ENDS = /:(?:\s|$)/;
|
|
18
|
+
const CHECK = /^(\S+) is (?:(not) )?(\S.*)$/;
|
|
19
|
+
function parsePlaceholder(raw) {
|
|
20
|
+
const bar = raw.indexOf('|');
|
|
21
|
+
if (bar < 0)
|
|
22
|
+
return { path: raw.trim() };
|
|
23
|
+
return { path: raw.slice(0, bar).trim(), fallback: raw.slice(bar + 1).trim() };
|
|
24
|
+
}
|
|
25
|
+
/** `input.x` and `output.x` read one side; a bare path reads the input, then the output. */
|
|
26
|
+
function routes(path, sides) {
|
|
27
|
+
const keys = path.split('.');
|
|
28
|
+
const [head, ...rest] = keys;
|
|
29
|
+
if ((head === 'input' || head === 'output') && rest.length) {
|
|
30
|
+
return [{ side: head, keys: rest, prefixed: true }];
|
|
31
|
+
}
|
|
32
|
+
return sides.map((side) => ({ side, keys, prefixed: false }));
|
|
33
|
+
}
|
|
34
|
+
function valueAt(source, keys) {
|
|
35
|
+
let value = source;
|
|
36
|
+
for (const key of keys) {
|
|
37
|
+
if (Array.isArray(value)) {
|
|
38
|
+
if (key === 'length')
|
|
39
|
+
value = value.length;
|
|
40
|
+
else if (INDEX.test(key))
|
|
41
|
+
value = value.at(Number(key));
|
|
42
|
+
else
|
|
43
|
+
return undefined;
|
|
44
|
+
}
|
|
45
|
+
else if (isRecord(value) && Object.hasOwn(value, key))
|
|
46
|
+
value = value[key];
|
|
47
|
+
else
|
|
48
|
+
return undefined;
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
function dateText(text) {
|
|
53
|
+
const match = ISO_DATE.exec(text);
|
|
54
|
+
if (!match)
|
|
55
|
+
return undefined;
|
|
56
|
+
const [year = 0, month = 0, day = 0, hour = 0, minute = 0] = match
|
|
57
|
+
.slice(1)
|
|
58
|
+
.map((part) => Number(part ?? 0));
|
|
59
|
+
const at = new Date(Date.UTC(year, month - 1, day, hour, minute));
|
|
60
|
+
if (Number.isNaN(at.getTime()) || at.getUTCDate() !== day)
|
|
61
|
+
return undefined;
|
|
62
|
+
return (match[4] === undefined ? DAY : DAY_TIME).format(at);
|
|
63
|
+
}
|
|
64
|
+
function labelValue(value) {
|
|
65
|
+
if (typeof value === 'number')
|
|
66
|
+
return Number.isFinite(value) ? NUMBER.format(value) : undefined;
|
|
67
|
+
if (typeof value !== 'string')
|
|
68
|
+
return undefined;
|
|
69
|
+
const text = value.replace(UNPRINTABLE, ' ').replace(/\s+/g, ' ').trim();
|
|
70
|
+
return (dateText(text) ?? text) || undefined;
|
|
71
|
+
}
|
|
72
|
+
function parseChecks(raw) {
|
|
73
|
+
const checks = [];
|
|
74
|
+
// why: one space between words first, so no pattern below can try a run of spaces two ways.
|
|
75
|
+
for (const part of raw.replace(/\s+/g, ' ').split(' and ')) {
|
|
76
|
+
const match = CHECK.exec(part.trim());
|
|
77
|
+
const [, path, not, expected] = match ?? [];
|
|
78
|
+
if (!path || !expected)
|
|
79
|
+
return 'unreadable';
|
|
80
|
+
const literal = expected.trim();
|
|
81
|
+
checks.push({ path, negated: Boolean(not), expected: literal === 'null' ? null : literal });
|
|
82
|
+
}
|
|
83
|
+
return checks;
|
|
84
|
+
}
|
|
85
|
+
/** `+ when status is archived: archiving {name}` is a joined line, with one check, then its text. */
|
|
86
|
+
function parseLine(raw) {
|
|
87
|
+
const joined = JOINED.test(raw);
|
|
88
|
+
const rest = raw.replace(JOINED, '').trim();
|
|
89
|
+
if (!/^when(\s|$)/.test(rest))
|
|
90
|
+
return { joined, when: [], text: rest };
|
|
91
|
+
const end = rest.search(WHEN_ENDS);
|
|
92
|
+
if (end < 0)
|
|
93
|
+
return { joined, when: 'unreadable', text: '' };
|
|
94
|
+
return { joined, when: parseChecks(rest.slice(4, end)), text: rest.slice(end + 1).trim() };
|
|
95
|
+
}
|
|
96
|
+
function entriesOf(template) {
|
|
97
|
+
const raw = typeof template === 'string' ? [template] : template;
|
|
98
|
+
const entries = [];
|
|
99
|
+
raw.forEach((text, index) => {
|
|
100
|
+
const line = parseLine(text);
|
|
101
|
+
const last = entries.at(-1);
|
|
102
|
+
if (line.joined && last?.joined)
|
|
103
|
+
last.lines.push({ line, number: index + 1 });
|
|
104
|
+
else
|
|
105
|
+
entries.push({ joined: line.joined, lines: [{ line, number: index + 1 }] });
|
|
106
|
+
});
|
|
107
|
+
return entries;
|
|
108
|
+
}
|
|
109
|
+
/** The input keys a check reads, or `undefined` when it names the output. */
|
|
110
|
+
function checkKeys(path) {
|
|
111
|
+
const [route] = routes(path, ['input']);
|
|
112
|
+
return route?.side === 'input' ? route.keys : undefined;
|
|
113
|
+
}
|
|
114
|
+
// why: "is not" is the plain opposite of "is", so a field the model left out is not any value.
|
|
115
|
+
function checkHolds(check, input) {
|
|
116
|
+
const keys = checkKeys(check.path);
|
|
117
|
+
if (!keys)
|
|
118
|
+
return false;
|
|
119
|
+
const value = valueAt(input, keys);
|
|
120
|
+
const comparable = typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean';
|
|
121
|
+
const is = check.expected === null ? value === null : comparable && `${value}` === check.expected;
|
|
122
|
+
return is !== check.negated;
|
|
123
|
+
}
|
|
124
|
+
/** "a", "a and b", "a, b, and c". */
|
|
125
|
+
function joinedInWords(parts) {
|
|
126
|
+
if (parts.length <= 1)
|
|
127
|
+
return parts[0] ?? '';
|
|
128
|
+
return `${parts.slice(0, -1).join(', ')}${parts.length > 2 ? ',' : ''} and ${parts.at(-1)}`;
|
|
129
|
+
}
|
|
130
|
+
/** A tool's name as a label shows it: `manage_alert` reads "manage alert". */
|
|
131
|
+
export function toolNameInWords(name) {
|
|
132
|
+
return name
|
|
133
|
+
.replace(/([a-z\d])([A-Z])/g, '$1 $2')
|
|
134
|
+
.replace(/[_-]+/g, ' ')
|
|
135
|
+
.trim()
|
|
136
|
+
.toLowerCase();
|
|
137
|
+
}
|
|
138
|
+
function fillText(template, values, sides) {
|
|
139
|
+
let missing = false;
|
|
140
|
+
const filled = template.replace(PLACEHOLDER, (_, raw) => {
|
|
141
|
+
const { path, fallback } = parsePlaceholder(raw);
|
|
142
|
+
const value = path
|
|
143
|
+
? routes(path, sides)
|
|
144
|
+
.map((route) => labelValue(valueAt(values[route.side], route.keys)))
|
|
145
|
+
.find((text) => text !== undefined)
|
|
146
|
+
: undefined;
|
|
147
|
+
if (value === undefined && fallback === undefined)
|
|
148
|
+
missing = true;
|
|
149
|
+
return value ?? fallback ?? '';
|
|
150
|
+
});
|
|
151
|
+
const text = filled.replace(/\s+/g, ' ').trim();
|
|
152
|
+
return missing || !text ? undefined : text;
|
|
153
|
+
}
|
|
154
|
+
/**
|
|
155
|
+
* Fills each `{path}` or `{path|fallback}` from the call. Only text and numbers fill; a line fits
|
|
156
|
+
* when every placeholder has a value or a fallback and its `when` holds. A list shows its first
|
|
157
|
+
* line that fits, and a run of `+` lines shows every member that fits, joined in words. When no
|
|
158
|
+
* line fits the label is `undefined`, and the transcript names the tool.
|
|
159
|
+
*/
|
|
160
|
+
export function fillActivityLabel(template, values) {
|
|
161
|
+
if (template === undefined)
|
|
162
|
+
return undefined;
|
|
163
|
+
const sides = 'output' in values ? ['input', 'output'] : ['input'];
|
|
164
|
+
for (const entry of entriesOf(template)) {
|
|
165
|
+
const fitting = entry.lines.flatMap(({ line }) => {
|
|
166
|
+
if (line.when === 'unreadable')
|
|
167
|
+
return [];
|
|
168
|
+
if (!line.when.every((check) => checkHolds(check, values.input)))
|
|
169
|
+
return [];
|
|
170
|
+
const text = fillText(line.text, values, sides);
|
|
171
|
+
return text === undefined ? [] : [text];
|
|
172
|
+
});
|
|
173
|
+
if (fitting.length)
|
|
174
|
+
return joinedInWords(fitting);
|
|
175
|
+
}
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
const HOLDS_RANK = ['value', 'group', 'flag', 'missing'];
|
|
179
|
+
function schemaTypes(node) {
|
|
180
|
+
const types = Array.isArray(node.type) ? node.type : [node.type];
|
|
181
|
+
return types.filter((type) => typeof type === 'string' && type !== 'null');
|
|
182
|
+
}
|
|
183
|
+
function schemaBranches(node) {
|
|
184
|
+
return [node.anyOf, node.oneOf, node.allOf].flatMap((list) => Array.isArray(list) ? list.filter(isRecord) : []);
|
|
185
|
+
}
|
|
186
|
+
function mergeHolds(found) {
|
|
187
|
+
const holds = HOLDS_RANK.find((rank) => found.some((entry) => entry.holds === rank)) ?? 'missing';
|
|
188
|
+
const same = found.filter((entry) => entry.holds === holds);
|
|
189
|
+
return { holds, instead: same.flatMap((entry) => entry.instead ?? []) };
|
|
190
|
+
}
|
|
191
|
+
/** The paths under `node` a label can show, for suggestions. */
|
|
192
|
+
function placeholdersAt(node, prefix) {
|
|
193
|
+
const at = (key) => (prefix ? `${prefix}.${key}` : key);
|
|
194
|
+
if (!isRecord(node))
|
|
195
|
+
return [];
|
|
196
|
+
const branches = schemaBranches(node);
|
|
197
|
+
if (branches.length)
|
|
198
|
+
return branches.flatMap((branch) => placeholdersAt(branch, prefix));
|
|
199
|
+
if (schemaTypes(node).includes('array'))
|
|
200
|
+
return leavesAt(node.items, at('0'));
|
|
201
|
+
if (!isRecord(node.properties))
|
|
202
|
+
return [];
|
|
203
|
+
return Object.entries(node.properties).flatMap(([key, child]) => leavesAt(child, at(key)));
|
|
204
|
+
}
|
|
205
|
+
function leavesAt(node, path) {
|
|
206
|
+
if (!isRecord(node) || '$ref' in node)
|
|
207
|
+
return [path];
|
|
208
|
+
const types = schemaTypes(node);
|
|
209
|
+
if (types.length && types.every((type) => type === 'boolean'))
|
|
210
|
+
return [];
|
|
211
|
+
const branches = schemaBranches(node);
|
|
212
|
+
// why: A branch of text or null (a nullable field) is still one value a label can show.
|
|
213
|
+
const nested = branches.some((branch) => schemaTypes(branch).some((type) => type === 'array' || type === 'object'));
|
|
214
|
+
const group = types.includes('array') || types.includes('object') || nested;
|
|
215
|
+
if (!group && branches.length) {
|
|
216
|
+
return branches.every((branch) => schemaTypes(branch).every((type) => type === 'boolean'))
|
|
217
|
+
? []
|
|
218
|
+
: [path];
|
|
219
|
+
}
|
|
220
|
+
return group ? placeholdersAt(node, path) : [path];
|
|
221
|
+
}
|
|
222
|
+
// why: A schema that doesn't say what's there ($ref, no properties, no items) is taken on trust.
|
|
223
|
+
function schemaPathHolds(node, keys, walked) {
|
|
224
|
+
if (!isRecord(node) || '$ref' in node)
|
|
225
|
+
return { holds: 'value' };
|
|
226
|
+
const branches = schemaBranches(node);
|
|
227
|
+
if (branches.length) {
|
|
228
|
+
return mergeHolds(branches.map((branch) => schemaPathHolds(branch, keys, walked)));
|
|
229
|
+
}
|
|
230
|
+
const types = schemaTypes(node);
|
|
231
|
+
const [key, ...rest] = keys;
|
|
232
|
+
if (key === undefined) {
|
|
233
|
+
if (types.length && types.every((type) => type === 'boolean'))
|
|
234
|
+
return { holds: 'flag' };
|
|
235
|
+
if (types.includes('array') || types.includes('object')) {
|
|
236
|
+
return { holds: 'group', instead: placeholdersAt(node, walked) };
|
|
237
|
+
}
|
|
238
|
+
return { holds: 'value' };
|
|
239
|
+
}
|
|
240
|
+
const next = walked ? `${walked}.${key}` : key;
|
|
241
|
+
const missing = { holds: 'missing', instead: placeholdersAt(node, walked) };
|
|
242
|
+
if (types.includes('array')) {
|
|
243
|
+
if (key === 'length')
|
|
244
|
+
return rest.length ? missing : { holds: 'value' };
|
|
245
|
+
if (INDEX.test(key)) {
|
|
246
|
+
return isRecord(node.items) ? schemaPathHolds(node.items, rest, next) : { holds: 'value' };
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (isRecord(node.properties)) {
|
|
250
|
+
return Object.hasOwn(node.properties, key)
|
|
251
|
+
? schemaPathHolds(node.properties[key], rest, next)
|
|
252
|
+
: missing;
|
|
253
|
+
}
|
|
254
|
+
return types.length === 0 || types.includes('object') ? { holds: 'value' } : missing;
|
|
255
|
+
}
|
|
256
|
+
function tryInstead(paths) {
|
|
257
|
+
const shown = [...new Set(paths)].slice(0, 4).map((path) => `{${path}}`);
|
|
258
|
+
if (shown.length === 0)
|
|
259
|
+
return '';
|
|
260
|
+
const list = shown.length === 1
|
|
261
|
+
? shown[0]
|
|
262
|
+
: `${shown.slice(0, -1).join(', ')}${shown.length > 2 ? ',' : ''} or ${shown.at(-1)}`;
|
|
263
|
+
return ` Try ${list}.`;
|
|
264
|
+
}
|
|
265
|
+
function placeholderProblem(template, schemas, sides) {
|
|
266
|
+
for (const match of template.matchAll(PLACEHOLDER)) {
|
|
267
|
+
const { path } = parsePlaceholder(match[1] ?? '');
|
|
268
|
+
if (!path) {
|
|
269
|
+
const example = placeholdersAt(schemas.input, '')[0] ?? 'name';
|
|
270
|
+
return `Put a field name between the braces, like {${example}}.`; // labels-exempt: builder diagnostic
|
|
271
|
+
}
|
|
272
|
+
const paths = routes(path, sides);
|
|
273
|
+
const [route] = paths;
|
|
274
|
+
if (!route)
|
|
275
|
+
continue;
|
|
276
|
+
if (route.prefixed && !sides.includes(route.side)) {
|
|
277
|
+
return `{${path}} is only there once the call is done; use it in the Done label.`; // labels-exempt: builder diagnostic
|
|
278
|
+
}
|
|
279
|
+
const found = mergeHolds(paths.map(({ side, keys, prefixed }) => schemaPathHolds(schemas[side], keys, prefixed ? side : '')));
|
|
280
|
+
if (found.holds === 'value')
|
|
281
|
+
continue;
|
|
282
|
+
const all = found.instead ?? [];
|
|
283
|
+
const depth = route.prefixed ? 1 : 0;
|
|
284
|
+
const near = all.filter((candidate) => candidate.split('.')[depth] === route.keys[0]);
|
|
285
|
+
const from = route.prefixed ? route.side : sides.join(' or ');
|
|
286
|
+
const reason = {
|
|
287
|
+
missing: `is not a field of this tool's ${from}.`, // labels-exempt: builder diagnostic
|
|
288
|
+
group: 'is a list or group; a label shows text or a number.', // labels-exempt: builder diagnostic
|
|
289
|
+
flag: 'is true or false; a label shows text or a number.', // labels-exempt: builder diagnostic
|
|
290
|
+
}[found.holds];
|
|
291
|
+
return `{${path}} ${reason}${tryInstead(near.length ? near : all)}`;
|
|
292
|
+
}
|
|
293
|
+
return undefined;
|
|
294
|
+
}
|
|
295
|
+
const OPEN_LEAF = { texts: 'any', nullable: true };
|
|
296
|
+
function rawTypes(node) {
|
|
297
|
+
const types = Array.isArray(node.type) ? node.type : [node.type];
|
|
298
|
+
return types.filter((type) => typeof type === 'string');
|
|
299
|
+
}
|
|
300
|
+
function leafOf(node) {
|
|
301
|
+
const listed = Array.isArray(node.enum) ? node.enum : 'const' in node ? [node.const] : undefined;
|
|
302
|
+
if (listed) {
|
|
303
|
+
return {
|
|
304
|
+
texts: listed.filter((value) => value !== null).map((value) => `${value}`),
|
|
305
|
+
nullable: listed.includes(null),
|
|
306
|
+
};
|
|
307
|
+
}
|
|
308
|
+
const types = rawTypes(node);
|
|
309
|
+
if (types.length === 0)
|
|
310
|
+
return OPEN_LEAF;
|
|
311
|
+
const shown = types.filter((type) => type !== 'null');
|
|
312
|
+
const flag = shown.every((type) => type === 'boolean');
|
|
313
|
+
return {
|
|
314
|
+
texts: flag ? (shown.length ? ['true', 'false'] : []) : 'any',
|
|
315
|
+
nullable: types.includes('null'),
|
|
316
|
+
};
|
|
317
|
+
}
|
|
318
|
+
// why: A schema that doesn't say what's there ($ref, no properties, no items) is taken on trust.
|
|
319
|
+
function schemaLeavesAt(node, keys) {
|
|
320
|
+
if (!isRecord(node) || '$ref' in node)
|
|
321
|
+
return [OPEN_LEAF];
|
|
322
|
+
const branches = schemaBranches(node);
|
|
323
|
+
if (branches.length)
|
|
324
|
+
return branches.flatMap((branch) => schemaLeavesAt(branch, keys));
|
|
325
|
+
const [key, ...rest] = keys;
|
|
326
|
+
if (key === undefined)
|
|
327
|
+
return [leafOf(node)];
|
|
328
|
+
const types = schemaTypes(node);
|
|
329
|
+
if (types.includes('array')) {
|
|
330
|
+
if (key === 'length')
|
|
331
|
+
return rest.length ? [] : [{ texts: 'any', nullable: false }];
|
|
332
|
+
if (INDEX.test(key))
|
|
333
|
+
return schemaLeavesAt(node.items, rest);
|
|
334
|
+
}
|
|
335
|
+
if (isRecord(node.properties)) {
|
|
336
|
+
return Object.hasOwn(node.properties, key) ? schemaLeavesAt(node.properties[key], rest) : [];
|
|
337
|
+
}
|
|
338
|
+
return types.length === 0 && rawTypes(node).length === 0 ? [OPEN_LEAF] : [];
|
|
339
|
+
}
|
|
340
|
+
/** The input's own field names, flags included: what a `when` can compare. */
|
|
341
|
+
function inputFields(node) {
|
|
342
|
+
if (!isRecord(node))
|
|
343
|
+
return [];
|
|
344
|
+
const branches = schemaBranches(node).flatMap(inputFields);
|
|
345
|
+
const own = isRecord(node.properties) ? Object.keys(node.properties) : [];
|
|
346
|
+
return [...new Set([...own, ...branches])];
|
|
347
|
+
}
|
|
348
|
+
function oneOf(values) {
|
|
349
|
+
const shown = [...new Set(values)].map((value) => `"${value}"`);
|
|
350
|
+
return shown.length <= 1
|
|
351
|
+
? (shown[0] ?? '')
|
|
352
|
+
: `${shown.slice(0, -1).join(', ')}${shown.length > 2 ? ',' : ''} or ${shown.at(-1)}`;
|
|
353
|
+
}
|
|
354
|
+
function checkProblem(check, input) {
|
|
355
|
+
const keys = checkKeys(check.path);
|
|
356
|
+
if (!keys) {
|
|
357
|
+
return `A "when" reads what the model sent; "${check.path}" is only there once the call is done.`; // labels-exempt: builder diagnostic
|
|
358
|
+
}
|
|
359
|
+
const found = schemaPathHolds(input, keys, '');
|
|
360
|
+
if (found.holds === 'missing') {
|
|
361
|
+
const fields = inputFields(input).slice(0, 4);
|
|
362
|
+
const tryThese = fields.length ? ` Try ${oneOf(fields)}.` : ''; // labels-exempt: builder diagnostic
|
|
363
|
+
return `"${check.path}" in the "when" is not a field of this tool's input.${tryThese}`; // labels-exempt: builder diagnostic
|
|
364
|
+
}
|
|
365
|
+
if (found.holds === 'group') {
|
|
366
|
+
return `"${check.path}" in the "when" is a list or group; a "when" compares text, a number, or true or false.`; // labels-exempt: builder diagnostic
|
|
367
|
+
}
|
|
368
|
+
const leaves = schemaLeavesAt(input, keys);
|
|
369
|
+
if (check.expected === null) {
|
|
370
|
+
return leaves.some((leaf) => leaf.nullable) ? undefined : `"${check.path}" is never null.`; // labels-exempt: builder diagnostic
|
|
371
|
+
}
|
|
372
|
+
const texts = [];
|
|
373
|
+
for (const leaf of leaves) {
|
|
374
|
+
if (leaf.texts === 'any')
|
|
375
|
+
return undefined;
|
|
376
|
+
texts.push(...leaf.texts);
|
|
377
|
+
}
|
|
378
|
+
if (texts.includes(check.expected))
|
|
379
|
+
return undefined;
|
|
380
|
+
const itIs = texts.length ? ` It is ${oneOf(texts)}.` : ''; // labels-exempt: builder diagnostic
|
|
381
|
+
return `"${check.path}" is never "${check.expected}".${itIs}`; // labels-exempt: builder diagnostic
|
|
382
|
+
}
|
|
383
|
+
function lineProblem(line, schemas, sides, mustShow) {
|
|
384
|
+
if (line.when === 'unreadable') {
|
|
385
|
+
return 'A line that opens with "when" needs a condition and a colon, like "when status is archived: archiving {name}". A condition uses "is", "is not", "is null", and "and".'; // labels-exempt: builder diagnostic
|
|
386
|
+
}
|
|
387
|
+
for (const check of line.when) {
|
|
388
|
+
const problem = checkProblem(check, schemas.input);
|
|
389
|
+
if (problem)
|
|
390
|
+
return problem;
|
|
391
|
+
}
|
|
392
|
+
if (!line.text && (mustShow || line.when.length)) {
|
|
393
|
+
return 'It has no wording to show.'; // labels-exempt: builder diagnostic
|
|
394
|
+
}
|
|
395
|
+
return placeholderProblem(line.text, schemas, sides);
|
|
396
|
+
}
|
|
397
|
+
/** Whether a line shows for every call: no `when`, and a fallback on every placeholder. */
|
|
398
|
+
function alwaysFits(line) {
|
|
399
|
+
if (line.when === 'unreadable' || line.when.length)
|
|
400
|
+
return false;
|
|
401
|
+
let open = false;
|
|
402
|
+
const settled = line.text.replace(PLACEHOLDER, (_, raw) => {
|
|
403
|
+
const { fallback } = parsePlaceholder(raw);
|
|
404
|
+
if (fallback === undefined)
|
|
405
|
+
open = true;
|
|
406
|
+
return fallback ?? '';
|
|
407
|
+
});
|
|
408
|
+
return !open && settled.trim().length > 0;
|
|
409
|
+
}
|
|
410
|
+
function listProblem(entries) {
|
|
411
|
+
const fits = entries.map((entry) => entry.lines.some(({ line }) => alwaysFits(line)));
|
|
412
|
+
const early = fits.slice(0, -1).indexOf(true);
|
|
413
|
+
if (early >= 0) {
|
|
414
|
+
const number = entries[early]?.lines.find(({ line }) => alwaysFits(line))?.number;
|
|
415
|
+
return `Line ${number} always fits, so the lines below it are never read. Move it to the end.`; // labels-exempt: builder diagnostic
|
|
416
|
+
}
|
|
417
|
+
if (fits.at(-1))
|
|
418
|
+
return undefined;
|
|
419
|
+
return 'The last line must always fit, so every call gets a label: no "when", and a fallback on every {value}, like "saving the item".'; // labels-exempt: builder diagnostic
|
|
420
|
+
}
|
|
421
|
+
/**
|
|
422
|
+
* Why a label can't be used with these JSON schemas, as a sentence for its author, or `undefined`
|
|
423
|
+
* when it can. Pass `output` for a Done label. A list must end on a line that always fits.
|
|
424
|
+
*/
|
|
425
|
+
export function activityLabelProblem(template, schemas) {
|
|
426
|
+
const sides = 'output' in schemas ? ['input', 'output'] : ['input'];
|
|
427
|
+
const listed = typeof template !== 'string';
|
|
428
|
+
const entries = entriesOf(template);
|
|
429
|
+
for (const { line, number } of entries.flatMap((entry) => entry.lines)) {
|
|
430
|
+
const problem = lineProblem(line, schemas, sides, listed);
|
|
431
|
+
if (problem)
|
|
432
|
+
return listed ? `Line ${number}: ${problem}` : problem; // labels-exempt: builder diagnostic
|
|
433
|
+
}
|
|
434
|
+
return listed ? listProblem(entries) : undefined;
|
|
435
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import type { ToolOrigin } from '../../guardrails/types.js';
|
|
3
|
+
import type { SpanHandle } from '../../observability/trace-span.js';
|
|
4
|
+
import type { Profile, ProfileId, ProfileInputsSpec, TurnEvent, TurnTokens } from '../types.js';
|
|
5
|
+
import type { AgentToolDef, AgentToolInput, AgentToolOutput, RegisteredAgentTool, RegisteredTool, ToolFailure } from './types.js';
|
|
6
|
+
/** How one agent tool call settled, with what the called agent used. */
|
|
7
|
+
type AgentRun = {
|
|
8
|
+
output: AgentToolOutput;
|
|
9
|
+
tokens?: TurnTokens;
|
|
10
|
+
} | {
|
|
11
|
+
failure: ToolFailure;
|
|
12
|
+
tokens?: TurnTokens;
|
|
13
|
+
};
|
|
14
|
+
/** Runs agent tool calls for one turn, which supplies the scope, provider, and hook. */
|
|
15
|
+
interface AgentCaller {
|
|
16
|
+
run(call: {
|
|
17
|
+
tool: RegisteredAgentTool;
|
|
18
|
+
callId: string;
|
|
19
|
+
input: AgentToolInput;
|
|
20
|
+
caller: Profile;
|
|
21
|
+
/** The call's `execute_tool` span; the agent's turn opens under it. */
|
|
22
|
+
span?: SpanHandle;
|
|
23
|
+
signal?: AbortSignal;
|
|
24
|
+
}): AsyncGenerator<TurnEvent, AgentRun>;
|
|
25
|
+
}
|
|
26
|
+
/** A call that settled without a reply; the model reads `failure`. */
|
|
27
|
+
declare class AgentCallFailed extends Error {
|
|
28
|
+
readonly failure: ToolFailure;
|
|
29
|
+
constructor(failure: ToolFailure);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* What the model sent, split into what goes to the called agent and what only the host reads.
|
|
33
|
+
*
|
|
34
|
+
* why: A host field is the host's own word for something (an id it resolves); the called profile does not take it, so it never reaches the agent's turn.
|
|
35
|
+
*/
|
|
36
|
+
declare function splitHostInput(tool: Pick<AgentToolDef, 'hostFields'>, input: AgentToolInput): {
|
|
37
|
+
sent: AgentToolInput;
|
|
38
|
+
hostInput?: Record<string, unknown>;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* The input of an agent tool that runs `agent`: text, and each channel the
|
|
42
|
+
* profile's `inputs` declares. Anything else is refused, never dropped. The
|
|
43
|
+
* called turn's own ingress checks MIME types and sizes.
|
|
44
|
+
*/
|
|
45
|
+
declare function agentToolInputFor(agent: Pick<Profile, 'type'> & {
|
|
46
|
+
inputs?: Pick<ProfileInputsSpec, 'attachments' | 'voice' | 'slots'>;
|
|
47
|
+
}, tool?: Pick<AgentToolDef, 'name' | 'fieldText' | 'hostFields' | 'hostOnly'>): z.ZodType<AgentToolInput>;
|
|
48
|
+
declare const agentToolOutput: z.ZodType<AgentToolOutput>;
|
|
49
|
+
/** Why `profile` can't be run by an agent tool, or `undefined` when it can. */
|
|
50
|
+
declare function agentProfileProblem(profile: Profile, find: (name: string) => RegisteredTool | undefined): string | undefined;
|
|
51
|
+
/** The profile an agent tool runs; throws `config` when the tool can't run it. */
|
|
52
|
+
declare function agentToolProfile(def: AgentToolDef, findProfile: (id: ProfileId) => Profile | undefined, findTool: (name: string) => RegisteredTool | undefined): Profile;
|
|
53
|
+
/** An agent with no tools of its own read only what it was sent; one with tools may have read outside content. */
|
|
54
|
+
declare function agentToolOrigin(profile: Profile | undefined): ToolOrigin;
|
|
55
|
+
/**
|
|
56
|
+
* The called agent's reply: its text or its last structured reply, its media as parts, and what it cited.
|
|
57
|
+
*
|
|
58
|
+
* why: A structured reply's text is the same JSON as a string, so returning both would have the caller's model read the answer twice.
|
|
59
|
+
*/
|
|
60
|
+
declare function agentToolOutputOf(turn: readonly TurnEvent[]): AgentToolOutput;
|
|
61
|
+
declare function normalizeAgent(def: AgentToolDef, input: z.ZodType<AgentToolInput>, schemas: {
|
|
62
|
+
inputSchema: Record<string, unknown>;
|
|
63
|
+
outputSchema: Record<string, unknown>;
|
|
64
|
+
}): RegisteredAgentTool;
|
|
65
|
+
export type { AgentCaller, AgentRun };
|
|
66
|
+
export { AgentCallFailed, agentProfileProblem, agentToolInputFor, agentToolOrigin, agentToolOutput, agentToolOutputOf, agentToolProfile, normalizeAgent, splitHostInput, };
|