@theoremjs/agents 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +276 -995
- package/esm/mod.d.ts +33 -19
- package/esm/mod.js +18 -11
- package/esm/src/cli/commands/bench.js +36 -14
- package/esm/src/cli/commands/detect-compile.d.ts +17 -0
- package/esm/src/cli/commands/detect-compile.js +22 -0
- package/esm/src/cli/commands/eval.d.ts +3 -3
- package/esm/src/cli/commands/fuzz-canary.js +55 -16
- package/esm/src/cli/commands/profile.js +4 -4
- package/esm/src/cli/commands/run.d.ts +2 -2
- package/esm/src/cli/commands/run.js +1 -1
- package/esm/src/cli/commands/test.d.ts +4 -3
- package/esm/src/cli/commands/test.js +2 -2
- package/esm/src/cli/index.js +9 -9
- package/esm/src/cli/matrix/fixtures.js +25 -30
- package/esm/src/evals/attachments.d.ts +1 -0
- package/esm/src/evals/attachments.js +4 -2
- package/esm/src/evals/breakdown.d.ts +2 -0
- package/esm/src/evals/breakdown.js +1 -0
- package/esm/src/evals/graders/answer.d.ts +3 -0
- package/esm/src/evals/graders/answer.js +1 -0
- package/esm/src/evals/graders/code.d.ts +7 -31
- package/esm/src/evals/graders/code.js +4 -25
- package/esm/src/evals/graders/judge.d.ts +4 -0
- package/esm/src/evals/graders/judge.js +7 -5
- package/esm/src/evals/graders/latency.d.ts +1 -0
- package/esm/src/evals/graders/latency.js +3 -2
- package/esm/src/evals/graders/live.d.ts +3 -0
- package/esm/src/evals/graders/live.js +2 -0
- package/esm/src/evals/graders/media.js +1 -2
- package/esm/src/evals/graders/shared.js +1 -1
- package/esm/src/evals/graders/transcript.d.ts +2 -0
- package/esm/src/evals/graders/transcript.js +5 -3
- package/esm/src/evals/mod.d.ts +1 -9
- package/esm/src/evals/mod.js +1 -9
- package/esm/src/evals/record.d.ts +6 -0
- package/esm/src/evals/record.js +4 -2
- package/esm/src/evals/rubrics/mod.d.ts +1 -1
- package/esm/src/evals/rubrics/mod.js +1 -1
- package/esm/src/evals/rubrics/mustache.js +1 -1
- package/esm/src/evals/rubrics/types.js +1 -1
- package/esm/src/evals/run.d.ts +9 -52
- package/esm/src/evals/run.js +12 -46
- package/esm/src/evals/suite.d.ts +12 -3
- package/esm/src/evals/suite.js +9 -4
- package/esm/src/evals/summary.d.ts +3 -0
- package/esm/src/evals/summary.js +1 -0
- package/esm/src/evals/trial.d.ts +3 -16
- package/esm/src/evals/trial.js +7 -30
- package/esm/src/evals/types.d.ts +30 -121
- package/esm/src/evals/types.js +3 -16
- package/esm/src/evals/verdict.d.ts +5 -0
- package/esm/src/evals/verdict.js +4 -1
- package/esm/src/guardrails/boundaries.d.ts +41 -0
- package/esm/src/guardrails/boundaries.js +103 -0
- package/esm/src/guardrails/canary-gate.d.ts +1 -0
- package/esm/src/guardrails/canary.d.ts +49 -15
- package/esm/src/guardrails/canary.js +103 -30
- package/esm/src/guardrails/compile-egress.d.ts +6 -5
- package/esm/src/guardrails/compile-egress.js +6 -5
- package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
- package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
- package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
- package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
- package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
- package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
- package/esm/src/guardrails/corpus/live-attacks.js +6 -1
- package/esm/src/guardrails/corpus/mod.d.ts +1 -1
- package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
- package/esm/src/guardrails/corpus/secrets.js +2 -2
- package/esm/src/guardrails/corpus/strings.d.ts +1 -1
- package/esm/src/guardrails/corpus/strings.js +1 -1
- package/esm/src/guardrails/corpus/types.d.ts +5 -1
- package/esm/src/guardrails/credential-rules.d.ts +36 -0
- package/esm/src/guardrails/credential-rules.js +3001 -0
- package/esm/src/guardrails/credential-scan.d.ts +45 -0
- package/esm/src/guardrails/credential-scan.js +172 -0
- package/esm/src/guardrails/destinations.d.ts +45 -0
- package/esm/src/guardrails/destinations.js +234 -0
- package/esm/src/guardrails/detect-at.d.ts +107 -0
- package/esm/src/guardrails/detect-at.js +434 -0
- package/esm/src/guardrails/detect-reply.d.ts +61 -0
- package/esm/src/guardrails/detect-reply.js +95 -0
- package/esm/src/guardrails/detect-stream.d.ts +33 -0
- package/esm/src/guardrails/detect-stream.js +77 -0
- package/esm/src/guardrails/detectors.d.ts +216 -0
- package/esm/src/guardrails/detectors.js +503 -0
- package/esm/src/guardrails/egress-automata.d.ts +4 -6
- package/esm/src/guardrails/egress-automata.js +24095 -4572
- package/esm/src/guardrails/egress-compiler.d.ts +38 -16
- package/esm/src/guardrails/egress-compiler.js +254 -60
- package/esm/src/guardrails/egress-patterns.d.ts +4 -2
- package/esm/src/guardrails/egress-patterns.js +6 -2
- package/esm/src/guardrails/egress-stream.d.ts +54 -36
- package/esm/src/guardrails/egress-stream.js +253 -124
- package/esm/src/guardrails/egress-urls.d.ts +6 -3
- package/esm/src/guardrails/egress-urls.js +14 -22
- package/esm/src/guardrails/egress.d.ts +26 -86
- package/esm/src/guardrails/egress.js +59 -309
- package/esm/src/guardrails/error.d.ts +13 -8
- package/esm/src/guardrails/error.js +23 -18
- package/esm/src/guardrails/event-schemas.d.ts +46 -3
- package/esm/src/guardrails/event-schemas.js +12 -5
- package/esm/src/guardrails/events.d.ts +5 -1
- package/esm/src/guardrails/events.js +4 -1
- package/esm/src/guardrails/hints.d.ts +14 -0
- package/esm/src/guardrails/hints.js +57 -0
- package/esm/src/guardrails/hits.d.ts +7 -1
- package/esm/src/guardrails/hits.js +12 -1
- package/esm/src/guardrails/host-patterns.d.ts +85 -0
- package/esm/src/guardrails/host-patterns.js +173 -0
- package/esm/src/guardrails/injection-patterns.d.ts +6 -1
- package/esm/src/guardrails/injection-patterns.js +33 -1
- package/esm/src/guardrails/injection-reversed.d.ts +9 -0
- package/esm/src/guardrails/injection-reversed.js +49 -0
- package/esm/src/guardrails/injection.d.ts +17 -1
- package/esm/src/guardrails/injection.js +259 -36
- package/esm/src/guardrails/labels.d.ts +40 -0
- package/esm/src/guardrails/labels.js +874 -0
- package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
- package/esm/src/guardrails/live-outbound-gate.js +100 -107
- package/esm/src/guardrails/mod.d.ts +29 -21
- package/esm/src/guardrails/mod.js +18 -13
- package/esm/src/guardrails/network.d.ts +4 -0
- package/esm/src/guardrails/network.js +21 -19
- package/esm/src/guardrails/normalize.d.ts +15 -1
- package/esm/src/guardrails/normalize.js +34 -1
- package/esm/src/guardrails/policy.d.ts +2 -17
- package/esm/src/guardrails/policy.js +12 -41
- package/esm/src/guardrails/progressive-yield.d.ts +65 -24
- package/esm/src/guardrails/progressive-yield.js +191 -147
- package/esm/src/guardrails/prompt-echo.d.ts +4 -2
- package/esm/src/guardrails/prompt-echo.js +87 -6
- package/esm/src/guardrails/quota.d.ts +1 -0
- package/esm/src/guardrails/quota.js +1 -1
- package/esm/src/guardrails/rules.d.ts +20 -29
- package/esm/src/guardrails/rules.js +23 -30
- package/esm/src/guardrails/sanitize.d.ts +32 -15
- package/esm/src/guardrails/sanitize.js +100 -124
- package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
- package/esm/src/guardrails/sensitive-groups.js +12 -0
- package/esm/src/guardrails/sensitive.d.ts +16 -23
- package/esm/src/guardrails/sensitive.js +168 -47
- package/esm/src/guardrails/serialize.d.ts +1 -0
- package/esm/src/guardrails/testing.d.ts +4 -2
- package/esm/src/guardrails/testing.js +4 -2
- package/esm/src/guardrails/theorem-error.d.ts +4 -1
- package/esm/src/guardrails/theorem-error.js +3 -2
- package/esm/src/guardrails/thought-guard.d.ts +34 -13
- package/esm/src/guardrails/thought-guard.js +264 -64
- package/esm/src/guardrails/tool-directives.d.ts +29 -10
- package/esm/src/guardrails/tool-directives.js +133 -47
- package/esm/src/guardrails/tool-leak.d.ts +26 -0
- package/esm/src/guardrails/tool-leak.js +45 -0
- package/esm/src/guardrails/tool-result.d.ts +45 -14
- package/esm/src/guardrails/tool-result.js +94 -70
- package/esm/src/guardrails/types.d.ts +79 -71
- package/esm/src/guardrails/types.js +11 -7
- package/esm/src/host/client-turn.d.ts +29 -2
- package/esm/src/host/client-turn.js +46 -4
- package/esm/src/host/mint-trace.d.ts +1 -0
- package/esm/src/host/mint-trace.js +3 -2
- package/esm/src/host/mod.d.ts +2 -2
- package/esm/src/host/mod.js +1 -1
- package/esm/src/host/readStreamingJsonStringField.js +2 -43
- package/esm/src/host/reply.d.ts +6 -0
- package/esm/src/host/reply.js +7 -1
- package/esm/src/interface/blocks.d.ts +3 -0
- package/esm/src/interface/blocks.js +84 -14
- package/esm/src/interface/composer-actions.d.ts +4 -0
- package/esm/src/interface/composer-actions.js +5 -3
- package/esm/src/interface/draft.d.ts +6 -0
- package/esm/src/interface/draft.js +22 -11
- package/esm/src/interface/from-profile.d.ts +13 -1
- package/esm/src/interface/from-profile.js +66 -31
- package/esm/src/interface/history.d.ts +9 -3
- package/esm/src/interface/history.js +33 -24
- package/esm/src/interface/inputs.d.ts +1 -0
- package/esm/src/interface/inputs.js +3 -0
- package/esm/src/interface/mod.d.ts +4 -2
- package/esm/src/interface/mod.js +3 -2
- package/esm/src/interface/models.d.ts +7 -0
- package/esm/src/interface/models.js +5 -0
- package/esm/src/interface/pending.d.ts +9 -0
- package/esm/src/interface/pending.js +9 -3
- package/esm/src/interface/profile-interface.js +54 -40
- package/esm/src/interface/session.d.ts +12 -5
- package/esm/src/interface/session.js +17 -10
- package/esm/src/interface/stop.d.ts +13 -0
- package/esm/src/interface/stop.js +28 -0
- package/esm/src/interface/tool-calls.d.ts +14 -2
- package/esm/src/interface/tool-calls.js +64 -10
- package/esm/src/interface/tool-invoke.d.ts +2 -0
- package/esm/src/interface/tool-invoke.js +3 -1
- package/esm/src/interface/tool-media.d.ts +2 -0
- package/esm/src/interface/tool-media.js +2 -1
- package/esm/src/interface/types.d.ts +105 -40
- package/esm/src/interface/types.js +1 -0
- package/esm/src/kernel/api-catalog.d.ts +85 -0
- package/esm/src/kernel/api-catalog.js +229 -0
- package/esm/src/kernel/auth/crypto.d.ts +7 -2
- package/esm/src/kernel/auth/crypto.js +12 -10
- package/esm/src/kernel/auth/oauth.d.ts +2 -1
- package/esm/src/kernel/auth/oauth.js +23 -22
- package/esm/src/kernel/auth/typed-secret.js +2 -2
- package/esm/src/kernel/auth/types.d.ts +13 -0
- package/esm/src/kernel/checkpoint.d.ts +43 -0
- package/esm/src/kernel/checkpoint.js +58 -0
- package/esm/src/kernel/default-scope.d.ts +43 -5
- package/esm/src/kernel/default-scope.js +54 -5
- package/esm/src/kernel/engine/call-trace.d.ts +19 -0
- package/esm/src/kernel/engine/call-trace.js +29 -0
- package/esm/src/kernel/engine/compaction.d.ts +6 -5
- package/esm/src/kernel/engine/compaction.js +12 -11
- package/esm/src/kernel/engine/decision.d.ts +10 -8
- package/esm/src/kernel/engine/decision.js +173 -146
- package/esm/src/kernel/engine/embedding.d.ts +8 -0
- package/esm/src/kernel/engine/embedding.js +118 -0
- package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
- package/esm/src/kernel/engine/live-inbound.js +36 -11
- package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
- package/esm/src/kernel/engine/live-ingress.js +6 -1
- package/esm/src/kernel/engine/repair.js +12 -12
- package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
- package/esm/src/kernel/engine/runner/gates.js +287 -101
- package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
- package/esm/src/kernel/engine/runner/mod.js +107 -56
- package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
- package/esm/src/kernel/engine/runner/nested.js +134 -0
- package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
- package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
- package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
- package/esm/src/kernel/engine/runner/stages.js +1 -8
- package/esm/src/kernel/engine/runner/state.d.ts +33 -12
- package/esm/src/kernel/engine/runner/state.js +11 -1
- package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
- package/esm/src/kernel/engine/runner/step-order.js +165 -0
- package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
- package/esm/src/kernel/engine/runner/steps.js +328 -169
- package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
- package/esm/src/kernel/engine/runner/stream.js +197 -46
- package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
- package/esm/src/kernel/engine/runner/usage.js +12 -14
- package/esm/src/kernel/engine/session/mod.d.ts +8 -6
- package/esm/src/kernel/engine/session/mod.js +360 -129
- package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
- package/esm/src/kernel/engine/session/session-trace.js +41 -30
- package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
- package/esm/src/kernel/engine/token-estimate.js +14 -194
- package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
- package/esm/src/kernel/engine/tool-trace.js +2 -1
- package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
- package/esm/src/kernel/engine/turn-trace.js +28 -36
- package/esm/src/kernel/engine/usage.d.ts +6 -0
- package/esm/src/kernel/engine/usage.js +17 -0
- package/esm/src/kernel/interaction-parts.d.ts +3 -0
- package/esm/src/kernel/interaction-parts.js +18 -0
- package/esm/src/kernel/json.d.ts +10 -0
- package/esm/src/kernel/json.js +3 -0
- package/esm/src/kernel/mod.d.ts +38 -11
- package/esm/src/kernel/mod.js +22 -7
- package/esm/src/kernel/profile-graph.d.ts +11 -6
- package/esm/src/kernel/profile-graph.js +14 -7
- package/esm/src/kernel/profile-presence.d.ts +10 -1
- package/esm/src/kernel/profile-presence.js +90 -75
- package/esm/src/kernel/profile-scope.d.ts +7 -3
- package/esm/src/kernel/profile-scope.js +67 -55
- package/esm/src/kernel/protocols/binding.d.ts +65 -0
- package/esm/src/kernel/protocols/binding.js +125 -0
- package/esm/src/kernel/protocols/limits.d.ts +15 -0
- package/esm/src/kernel/protocols/limits.js +28 -0
- package/esm/src/kernel/protocols/mod.d.ts +5 -0
- package/esm/src/kernel/protocols/mod.js +5 -0
- package/esm/src/kernel/protocols/prices.d.ts +36 -0
- package/esm/src/kernel/protocols/prices.js +37 -0
- package/esm/src/kernel/protocols/protocol.d.ts +253 -0
- package/esm/src/kernel/protocols/protocol.js +253 -0
- package/esm/src/kernel/protocols/provider.d.ts +108 -0
- package/esm/src/kernel/protocols/provider.js +143 -0
- package/esm/src/kernel/protocols/runtime.d.ts +55 -0
- package/esm/src/kernel/protocols/runtime.js +534 -0
- package/esm/src/kernel/provider-budget.d.ts +32 -0
- package/esm/src/kernel/provider-budget.js +262 -0
- package/esm/src/kernel/provider-dispatch.d.ts +13 -0
- package/esm/src/kernel/provider-dispatch.js +36 -0
- package/esm/src/kernel/provider-live.d.ts +7 -0
- package/esm/src/kernel/provider-live.js +189 -0
- package/esm/src/kernel/provider-runtime.d.ts +57 -0
- package/esm/src/kernel/provider-runtime.js +524 -0
- package/esm/src/kernel/registry/attachments.d.ts +15 -4
- package/esm/src/kernel/registry/attachments.js +31 -22
- package/esm/src/kernel/registry/catalog.d.ts +6 -0
- package/esm/src/kernel/registry/catalog.js +9 -2
- package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
- package/esm/src/kernel/registry/embedding-rules.js +66 -0
- package/esm/src/kernel/registry/ingress.d.ts +6 -2
- package/esm/src/kernel/registry/ingress.js +55 -10
- package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
- package/esm/src/kernel/registry/kernel-registry.js +9 -2
- package/esm/src/kernel/registry/profile-outputs.js +4 -1
- package/esm/src/kernel/registry/profiles.d.ts +38 -14
- package/esm/src/kernel/registry/profiles.js +280 -205
- package/esm/src/kernel/registry/provider-request.d.ts +3 -3
- package/esm/src/kernel/registry/provider-request.js +5 -13
- package/esm/src/kernel/registry/resolve.d.ts +4 -1
- package/esm/src/kernel/registry/resolve.js +59 -58
- package/esm/src/kernel/registry/schemas.d.ts +3 -0
- package/esm/src/kernel/registry/schemas.js +3 -1
- package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
- package/esm/src/kernel/registry/slot-fill.js +22 -0
- package/esm/src/kernel/registry/system-prompt.js +7 -8
- package/esm/src/kernel/registry/vault.d.ts +14 -13
- package/esm/src/kernel/registry/vault.js +1 -14
- package/esm/src/kernel/schema.d.ts +100 -46
- package/esm/src/kernel/schema.js +499 -257
- package/esm/src/kernel/scope.d.ts +12 -5
- package/esm/src/kernel/scope.js +23 -3
- package/esm/src/kernel/stages.d.ts +38 -3
- package/esm/src/kernel/stages.js +82 -39
- package/esm/src/kernel/stop.d.ts +29 -6
- package/esm/src/kernel/stop.js +16 -4
- package/esm/src/kernel/system-parts.js +6 -6
- package/esm/src/kernel/tools/activity-label.d.ts +12 -6
- package/esm/src/kernel/tools/activity-label.js +258 -32
- package/esm/src/kernel/tools/agent.d.ts +66 -0
- package/esm/src/kernel/tools/agent.js +212 -0
- package/esm/src/kernel/tools/coordinate.d.ts +4 -0
- package/esm/src/kernel/tools/coordinate.js +165 -0
- package/esm/src/kernel/tools/events.d.ts +21 -6
- package/esm/src/kernel/tools/events.js +53 -18
- package/esm/src/kernel/tools/execute.d.ts +47 -11
- package/esm/src/kernel/tools/execute.js +508 -136
- package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
- package/esm/src/kernel/tools/gate-answer.js +17 -6
- package/esm/src/kernel/tools/handler-events.d.ts +45 -0
- package/esm/src/kernel/tools/handler-events.js +106 -0
- package/esm/src/kernel/tools/harness.d.ts +1 -0
- package/esm/src/kernel/tools/harness.js +2 -1
- package/esm/src/kernel/tools/http-limit.d.ts +27 -0
- package/esm/src/kernel/tools/http-limit.js +85 -0
- package/esm/src/kernel/tools/invoke.d.ts +27 -5
- package/esm/src/kernel/tools/invoke.js +223 -70
- package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
- package/esm/src/kernel/tools/mcp-sessions.js +13 -8
- package/esm/src/kernel/tools/mod.d.ts +4 -3
- package/esm/src/kernel/tools/mod.js +3 -2
- package/esm/src/kernel/tools/model-text.d.ts +10 -5
- package/esm/src/kernel/tools/model-text.js +18 -12
- package/esm/src/kernel/tools/operation.d.ts +76 -0
- package/esm/src/kernel/tools/operation.js +100 -0
- package/esm/src/kernel/tools/page-answer.d.ts +8 -0
- package/esm/src/kernel/tools/page-answer.js +19 -0
- package/esm/src/kernel/tools/permission.d.ts +11 -2
- package/esm/src/kernel/tools/permission.js +12 -12
- package/esm/src/kernel/tools/project.d.ts +4 -1
- package/esm/src/kernel/tools/project.js +32 -2
- package/esm/src/kernel/tools/registry.d.ts +9 -2
- package/esm/src/kernel/tools/registry.js +69 -10
- package/esm/src/kernel/tools/remote.d.ts +40 -6
- package/esm/src/kernel/tools/remote.js +219 -92
- package/esm/src/kernel/tools/resolve.d.ts +3 -0
- package/esm/src/kernel/tools/resolve.js +12 -4
- package/esm/src/kernel/tools/run.d.ts +28 -0
- package/esm/src/kernel/tools/run.js +86 -0
- package/esm/src/kernel/tools/schema.d.ts +3 -3
- package/esm/src/kernel/tools/schema.js +21 -100
- package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
- package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
- package/esm/src/kernel/tools/stage-run.d.ts +27 -4
- package/esm/src/kernel/tools/stage-run.js +75 -17
- package/esm/src/kernel/tools/types.d.ts +235 -25
- package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
- package/esm/src/kernel/tools/unchecked-output.js +18 -0
- package/esm/src/kernel/turn-events.d.ts +208 -31
- package/esm/src/kernel/turn-events.js +127 -9
- package/esm/src/kernel/types.d.ts +302 -161
- package/esm/src/kernel/util/base64.d.ts +2 -0
- package/esm/src/kernel/util/base64.js +2 -0
- package/esm/src/kernel/util/partial-json.d.ts +23 -0
- package/esm/src/kernel/util/partial-json.js +128 -0
- package/esm/src/kernel/util/record.d.ts +1 -0
- package/esm/src/kernel/util/record.js +1 -0
- package/esm/src/observability/destinations.d.ts +5 -0
- package/esm/src/observability/destinations.js +7 -2
- package/esm/src/observability/jsonl.d.ts +2 -2
- package/esm/src/observability/jsonl.js +15 -22
- package/esm/src/observability/mod.d.ts +3 -3
- package/esm/src/observability/mod.js +2 -2
- package/esm/src/observability/openinference.d.ts +1 -1
- package/esm/src/observability/openinference.js +3 -3
- package/esm/src/observability/otlp.d.ts +3 -0
- package/esm/src/observability/otlp.js +3 -3
- package/esm/src/observability/phoenix.d.ts +1 -0
- package/esm/src/observability/policy.d.ts +3 -0
- package/esm/src/observability/policy.js +5 -1
- package/esm/src/observability/resolve-policy.js +11 -5
- package/esm/src/observability/spans.d.ts +8 -2
- package/esm/src/observability/spans.js +21 -5
- package/esm/src/observability/trace-catalog.d.ts +19 -2
- package/esm/src/observability/trace-catalog.js +128 -87
- package/esm/src/observability/trace-record.js +22 -17
- package/esm/src/observability/trace-schema.d.ts +3 -0
- package/esm/src/observability/trace-schema.js +1 -1
- package/esm/src/observability/trace-sink.d.ts +1 -0
- package/esm/src/observability/trace-sink.js +1 -1
- package/esm/src/observability/trace-span.d.ts +7 -1
- package/esm/src/observability/trace-span.js +3 -1
- package/esm/src/observability/trace.d.ts +2 -0
- package/esm/src/observability/trace.js +4 -2
- package/esm/src/observability/types.d.ts +35 -11
- package/esm/src/observability/types.js +1 -1
- package/esm/src/presets/google/speech-voices.d.ts +1 -0
- package/esm/src/presets/google-limits.d.ts +1 -0
- package/esm/src/presets/google.d.ts +27 -12
- package/esm/src/presets/google.js +34 -25
- package/esm/src/presets/local.d.ts +26 -0
- package/esm/src/presets/local.js +30 -0
- package/esm/src/presets/mod.d.ts +5 -4
- package/esm/src/presets/mod.js +4 -4
- package/esm/src/presets/openrouter.d.ts +14 -1
- package/esm/src/presets/openrouter.js +19 -1
- package/esm/src/providers/embedding-limits.d.ts +7 -0
- package/esm/src/providers/embedding-limits.js +12 -0
- package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/embedding-protocol.js +125 -0
- package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/interactions-protocol.js +105 -0
- package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
- package/esm/src/providers/gemini/live-protocol.js +191 -0
- package/esm/src/providers/gemini/prices.d.ts +3 -0
- package/esm/src/providers/gemini/prices.js +63 -0
- package/esm/src/providers/gemini/provider.d.ts +7 -0
- package/esm/src/providers/gemini/provider.js +39 -0
- package/esm/src/providers/google/builtins.d.ts +14 -0
- package/esm/src/providers/google/builtins.js +57 -0
- package/esm/src/providers/google/grounding.d.ts +4 -4
- package/esm/src/providers/google/interactions/framing.d.ts +20 -8
- package/esm/src/providers/google/interactions/framing.js +85 -44
- package/esm/src/providers/google/interactions/steps.d.ts +5 -5
- package/esm/src/providers/google/interactions/steps.js +4 -4
- package/esm/src/providers/google/interactions/stream.d.ts +10 -11
- package/esm/src/providers/google/interactions/stream.js +33 -100
- package/esm/src/providers/google/live/framing.d.ts +15 -5
- package/esm/src/providers/google/live/framing.js +25 -25
- package/esm/src/providers/google/live/stream.d.ts +6 -44
- package/esm/src/providers/google/live/stream.js +3 -209
- package/esm/src/providers/google/urls.d.ts +1 -3
- package/esm/src/providers/google/urls.js +1 -3
- package/esm/src/providers/google/usage.js +2 -2
- package/esm/src/providers/live.d.ts +6 -0
- package/esm/src/providers/live.js +6 -0
- package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
- package/esm/src/providers/local/embedding-protocol.js +60 -0
- package/esm/src/providers/local/provider.d.ts +7 -0
- package/esm/src/providers/local/provider.js +28 -0
- package/esm/src/providers/mod.d.ts +28 -7
- package/esm/src/providers/mod.js +19 -3
- package/esm/src/providers/open-ai/protocol.d.ts +3 -0
- package/esm/src/providers/open-ai/protocol.js +189 -0
- package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
- package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
- package/esm/src/providers/openrouter/image.d.ts +0 -9
- package/esm/src/providers/openrouter/image.js +0 -153
- package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
- package/esm/src/providers/openrouter/images-protocol.js +82 -0
- package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/compat.js +6 -6
- package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
- package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
- package/esm/src/providers/openrouter/protocol.d.ts +8 -0
- package/esm/src/providers/openrouter/protocol.js +171 -0
- package/esm/src/providers/openrouter/provider.d.ts +10 -0
- package/esm/src/providers/openrouter/provider.js +50 -0
- package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
- package/esm/src/providers/shared/carried-tool-files.js +43 -0
- package/esm/src/providers/shared/pcm.js +2 -2
- package/esm/src/providers/shared/protocol-events.d.ts +8 -0
- package/esm/src/providers/shared/protocol-events.js +20 -0
- package/esm/src/providers/shared/response-identity.d.ts +2 -2
- package/esm/src/providers/shared/retry.d.ts +17 -0
- package/esm/src/providers/shared/retry.js +90 -0
- package/esm/src/providers/shared/sse.d.ts +0 -4
- package/esm/src/providers/shared/sse.js +50 -36
- package/esm/src/providers/shared/tool-args.d.ts +6 -7
- package/esm/src/providers/shared/tool-args.js +10 -6
- package/esm/src/providers/shared/tool-draft.d.ts +16 -0
- package/esm/src/providers/shared/tool-draft.js +14 -0
- package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
- package/esm/src/providers/shared/upstream-tape.js +1 -1
- package/esm/src/providers/system-one/protocol.d.ts +8 -0
- package/esm/src/providers/system-one/protocol.js +93 -0
- package/esm/src/providers/types.d.ts +48 -16
- package/esm/src/providers/types.js +2 -1
- package/esm/src/providers/typesafe/provider.d.ts +7 -0
- package/esm/src/providers/typesafe/provider.js +24 -0
- package/esm/src/surface/formats.d.ts +19 -1
- package/esm/src/surface/formats.js +68 -29
- package/esm/src/surface/mod.d.ts +4 -2
- package/esm/src/surface/mod.js +4 -2
- package/esm/src/surface/runtime.d.ts +4 -0
- package/esm/src/surface/runtime.js +2 -0
- package/esm/src/surface/tools.d.ts +2 -8
- package/esm/src/surface/tools.js +4 -22
- package/esm/src/surface/types.d.ts +6 -0
- package/package.json +5 -13
- package/esm/src/cli/commands/egress-compile.d.ts +0 -17
- package/esm/src/cli/commands/egress-compile.js +0 -25
- package/esm/src/guardrails/egress-policy.d.ts +0 -27
- package/esm/src/guardrails/egress-policy.js +0 -76
- package/esm/src/guardrails/egress-rules.d.ts +0 -54
- package/esm/src/guardrails/egress-rules.js +0 -49
- package/esm/src/guardrails/lexicon.d.ts +0 -30
- package/esm/src/guardrails/lexicon.js +0 -478
- package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
- package/esm/src/kernel/engine/media-probe/audio.js +0 -342
- package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
- package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
- package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/image.js +0 -171
- package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
- package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
- package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
- package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
- package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
- package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
- package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
- package/esm/src/kernel/engine/media-probe/opus.js +0 -23
- package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
- package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
- package/esm/src/kernel/engine/media-probe/video.js +0 -49
- package/esm/src/presets/typesafe.d.ts +0 -2
- package/esm/src/presets/typesafe.js +0 -2
- package/esm/src/providers/create-provider.d.ts +0 -21
- package/esm/src/providers/create-provider.js +0 -90
- package/esm/src/providers/decision/usage.d.ts +0 -3
- package/esm/src/providers/decision/usage.js +0 -25
- package/esm/src/providers/google/interactions/mod.d.ts +0 -2
- package/esm/src/providers/google/interactions/mod.js +0 -2
- package/esm/src/providers/google/keys.d.ts +0 -20
- package/esm/src/providers/google/keys.js +0 -87
- package/esm/src/providers/google/live/mod.d.ts +0 -7
- package/esm/src/providers/google/live/mod.js +0 -7
- package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
- package/esm/src/providers/google/live/openapi-schema.js +0 -42
- package/esm/src/providers/google/live/session.d.ts +0 -14
- package/esm/src/providers/google/live/session.js +0 -150
- package/esm/src/providers/local/local.d.ts +0 -12
- package/esm/src/providers/local/local.js +0 -186
- package/esm/src/providers/local/mod.d.ts +0 -8
- package/esm/src/providers/local/mod.js +0 -8
- package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
- package/esm/src/providers/openrouter/cache-control.js +0 -4
- package/esm/src/providers/openrouter/chat.d.ts +0 -64
- package/esm/src/providers/openrouter/chat.js +0 -490
- package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
- package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
- package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
- package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
- package/esm/src/providers/openrouter/speech.d.ts +0 -18
- package/esm/src/providers/openrouter/speech.js +0 -109
- package/esm/src/providers/probe.d.ts +0 -5
- package/esm/src/providers/probe.js +0 -15
- package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
- package/esm/src/providers/shared/builtin-wire.js +0 -9
- package/esm/src/providers/shared/vault.d.ts +0 -13
- package/esm/src/providers/shared/vault.js +0 -41
|
@@ -4,17 +4,17 @@ function partProblem(part) {
|
|
|
4
4
|
if (typeof part === 'string')
|
|
5
5
|
return undefined;
|
|
6
6
|
if (typeof part !== 'object' || part === null || Array.isArray(part)) {
|
|
7
|
-
return 'must be a string or { private: string }'; //
|
|
7
|
+
return 'must be a string or { private: string }'; // labels-exempt: developer contract error
|
|
8
8
|
}
|
|
9
9
|
const keys = Object.keys(part);
|
|
10
10
|
if (keys.length !== 1 || keys[0] !== 'private') {
|
|
11
|
-
return 'must have exactly one key, private'; //
|
|
11
|
+
return 'must have exactly one key, private'; // labels-exempt: developer contract error
|
|
12
12
|
}
|
|
13
13
|
const text = part.private;
|
|
14
14
|
if (typeof text !== 'string')
|
|
15
|
-
return 'must be a string'; //
|
|
15
|
+
return 'must be a string'; // labels-exempt: developer contract error
|
|
16
16
|
if (text === '')
|
|
17
|
-
return 'must not be empty'; //
|
|
17
|
+
return 'must not be empty'; // labels-exempt: developer contract error
|
|
18
18
|
return undefined;
|
|
19
19
|
}
|
|
20
20
|
/** What is wrong with `prompt` as a system prompt, `where` naming it, or undefined. */
|
|
@@ -22,9 +22,9 @@ function systemPromptProblem(prompt, where) {
|
|
|
22
22
|
if (typeof prompt === 'string')
|
|
23
23
|
return undefined;
|
|
24
24
|
if (!Array.isArray(prompt))
|
|
25
|
-
return `${where} must be a string or an array of parts`; //
|
|
25
|
+
return `${where} must be a string or an array of parts`; // labels-exempt: developer contract error
|
|
26
26
|
if (prompt.length === 0)
|
|
27
|
-
return `${where} must not be an empty array`; //
|
|
27
|
+
return `${where} must not be an empty array`; // labels-exempt: developer contract error
|
|
28
28
|
for (const [at, part] of prompt.entries()) {
|
|
29
29
|
const problem = partProblem(part);
|
|
30
30
|
if (!problem)
|
|
@@ -1,16 +1,22 @@
|
|
|
1
|
+
/** One line of wording, or a list of lines read top to bottom: the first that fits is shown. */
|
|
2
|
+
export type LabelTemplate = string | readonly string[];
|
|
3
|
+
/** A tool's name as a label shows it: `manage_alert` reads "manage alert". */
|
|
4
|
+
export declare function toolNameInWords(name: string): string;
|
|
1
5
|
/**
|
|
2
|
-
* Fills each `{path}` or `{path|fallback}` from the call. Only text and numbers fill; a
|
|
3
|
-
*
|
|
6
|
+
* Fills each `{path}` or `{path|fallback}` from the call. Only text and numbers fill; a line fits
|
|
7
|
+
* when every placeholder has a value or a fallback and its `when` holds. A list shows its first
|
|
8
|
+
* line that fits, and a run of `+` lines shows every member that fits, joined in words. When no
|
|
9
|
+
* line fits the label is `undefined`, and the transcript names the tool.
|
|
4
10
|
*/
|
|
5
|
-
export declare function fillActivityLabel(template:
|
|
11
|
+
export declare function fillActivityLabel(template: LabelTemplate | undefined, values: {
|
|
6
12
|
input: unknown;
|
|
7
13
|
output?: unknown;
|
|
8
14
|
}): string | undefined;
|
|
9
15
|
/**
|
|
10
|
-
* Why a label can't
|
|
11
|
-
* when
|
|
16
|
+
* Why a label can't be used with these JSON schemas, as a sentence for its author, or `undefined`
|
|
17
|
+
* when it can. Pass `output` for a Done label. A list must end on a line that always fits.
|
|
12
18
|
*/
|
|
13
|
-
export declare function activityLabelProblem(template:
|
|
19
|
+
export declare function activityLabelProblem(template: LabelTemplate, schemas: {
|
|
14
20
|
input: unknown;
|
|
15
21
|
output?: unknown;
|
|
16
22
|
}): string | undefined;
|
|
@@ -1,18 +1,21 @@
|
|
|
1
1
|
import { isRecord } from '../util/record.js';
|
|
2
|
-
const MAX_VALUE_CHARS = 40;
|
|
3
2
|
const PLACEHOLDER = /\{\{?([^{}]*)\}\}?/g;
|
|
4
|
-
// Control and bidi-override characters would let a tool's output restyle or reorder the label.
|
|
3
|
+
// why: Control and bidi-override characters would let a tool's output restyle or reorder the label.
|
|
5
4
|
const UNPRINTABLE = /[\p{Cc}\p{Cf}]/gu;
|
|
6
5
|
const INDEX = /^-?\d+$/;
|
|
7
6
|
const ISO_DATE = /^(\d{4})-(\d{2})-(\d{2})(?:[T ](\d{2}):(\d{2})(?::\d{2}(?:\.\d+)?)?(?:Z|[+-]\d{2}:?\d{2})?)?$/;
|
|
8
7
|
const NUMBER = new Intl.NumberFormat(undefined, { maximumFractionDigits: 2 });
|
|
9
|
-
// Dates show the wall-clock time as the tool wrote it, not converted to the server's zone.
|
|
8
|
+
// why: Dates show the wall-clock time as the tool wrote it, not converted to the server's zone.
|
|
10
9
|
const DAY = new Intl.DateTimeFormat(undefined, { dateStyle: 'medium', timeZone: 'UTC' });
|
|
11
10
|
const DAY_TIME = new Intl.DateTimeFormat(undefined, {
|
|
12
11
|
dateStyle: 'medium',
|
|
13
12
|
timeStyle: 'short',
|
|
14
13
|
timeZone: 'UTC',
|
|
15
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.*)$/;
|
|
16
19
|
function parsePlaceholder(raw) {
|
|
17
20
|
const bar = raw.indexOf('|');
|
|
18
21
|
if (bar < 0)
|
|
@@ -64,22 +67,75 @@ function labelValue(value) {
|
|
|
64
67
|
if (typeof value !== 'string')
|
|
65
68
|
return undefined;
|
|
66
69
|
const text = value.replace(UNPRINTABLE, ' ').replace(/\s+/g, ' ').trim();
|
|
67
|
-
|
|
68
|
-
if (chars.length === 0)
|
|
69
|
-
return undefined;
|
|
70
|
-
if (chars.length <= MAX_VALUE_CHARS)
|
|
71
|
-
return chars.join('');
|
|
72
|
-
const head = chars.slice(0, MAX_VALUE_CHARS - 1).join('');
|
|
73
|
-
return `${head.trimEnd()}…`;
|
|
70
|
+
return (dateText(text) ?? text) || undefined;
|
|
74
71
|
}
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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) {
|
|
83
139
|
let missing = false;
|
|
84
140
|
const filled = template.replace(PLACEHOLDER, (_, raw) => {
|
|
85
141
|
const { path, fallback } = parsePlaceholder(raw);
|
|
@@ -95,6 +151,30 @@ export function fillActivityLabel(template, values) {
|
|
|
95
151
|
const text = filled.replace(/\s+/g, ' ').trim();
|
|
96
152
|
return missing || !text ? undefined : text;
|
|
97
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
|
+
}
|
|
98
178
|
const HOLDS_RANK = ['value', 'group', 'flag', 'missing'];
|
|
99
179
|
function schemaTypes(node) {
|
|
100
180
|
const types = Array.isArray(node.type) ? node.type : [node.type];
|
|
@@ -128,10 +208,18 @@ function leavesAt(node, path) {
|
|
|
128
208
|
const types = schemaTypes(node);
|
|
129
209
|
if (types.length && types.every((type) => type === 'boolean'))
|
|
130
210
|
return [];
|
|
131
|
-
const
|
|
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
|
+
}
|
|
132
220
|
return group ? placeholdersAt(node, path) : [path];
|
|
133
221
|
}
|
|
134
|
-
// A schema that doesn't say what's there ($ref, no properties, no items) is taken on trust.
|
|
222
|
+
// why: A schema that doesn't say what's there ($ref, no properties, no items) is taken on trust.
|
|
135
223
|
function schemaPathHolds(node, keys, walked) {
|
|
136
224
|
if (!isRecord(node) || '$ref' in node)
|
|
137
225
|
return { holds: 'value' };
|
|
@@ -169,27 +257,24 @@ function tryInstead(paths) {
|
|
|
169
257
|
const shown = [...new Set(paths)].slice(0, 4).map((path) => `{${path}}`);
|
|
170
258
|
if (shown.length === 0)
|
|
171
259
|
return '';
|
|
172
|
-
const list = shown.length === 1
|
|
260
|
+
const list = shown.length === 1
|
|
261
|
+
? shown[0]
|
|
262
|
+
: `${shown.slice(0, -1).join(', ')}${shown.length > 2 ? ',' : ''} or ${shown.at(-1)}`;
|
|
173
263
|
return ` Try ${list}.`;
|
|
174
264
|
}
|
|
175
|
-
|
|
176
|
-
* Why a label can't fill from these JSON schemas, as a sentence for its author, or `undefined`
|
|
177
|
-
* when every placeholder can. Pass `output` for a Done label.
|
|
178
|
-
*/
|
|
179
|
-
export function activityLabelProblem(template, schemas) {
|
|
180
|
-
const sides = 'output' in schemas ? ['input', 'output'] : ['input'];
|
|
265
|
+
function placeholderProblem(template, schemas, sides) {
|
|
181
266
|
for (const match of template.matchAll(PLACEHOLDER)) {
|
|
182
267
|
const { path } = parsePlaceholder(match[1] ?? '');
|
|
183
268
|
if (!path) {
|
|
184
269
|
const example = placeholdersAt(schemas.input, '')[0] ?? 'name';
|
|
185
|
-
return `Put a field name between the braces, like {${example}}.`; //
|
|
270
|
+
return `Put a field name between the braces, like {${example}}.`; // labels-exempt: builder diagnostic
|
|
186
271
|
}
|
|
187
272
|
const paths = routes(path, sides);
|
|
188
273
|
const [route] = paths;
|
|
189
274
|
if (!route)
|
|
190
275
|
continue;
|
|
191
276
|
if (route.prefixed && !sides.includes(route.side)) {
|
|
192
|
-
return `{${path}} is only there once the call is done; use it in the Done label.`; //
|
|
277
|
+
return `{${path}} is only there once the call is done; use it in the Done label.`; // labels-exempt: builder diagnostic
|
|
193
278
|
}
|
|
194
279
|
const found = mergeHolds(paths.map(({ side, keys, prefixed }) => schemaPathHolds(schemas[side], keys, prefixed ? side : '')));
|
|
195
280
|
if (found.holds === 'value')
|
|
@@ -199,11 +284,152 @@ export function activityLabelProblem(template, schemas) {
|
|
|
199
284
|
const near = all.filter((candidate) => candidate.split('.')[depth] === route.keys[0]);
|
|
200
285
|
const from = route.prefixed ? route.side : sides.join(' or ');
|
|
201
286
|
const reason = {
|
|
202
|
-
missing: `is not a field of this tool's ${from}.`, //
|
|
203
|
-
group: 'is a list or group; a label shows text or a number.', //
|
|
204
|
-
flag: 'is true or false; a label shows text or a number.', //
|
|
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
|
|
205
290
|
}[found.holds];
|
|
206
291
|
return `{${path}} ${reason}${tryInstead(near.length ? near : all)}`;
|
|
207
292
|
}
|
|
208
293
|
return undefined;
|
|
209
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, };
|