@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
|
@@ -5,6 +5,8 @@ export declare function pathMatches(catalogPaths?: string[], turnPath?: string):
|
|
|
5
5
|
export declare function applyBuiltinMutualExclusions(tools: ToolRegistry, requested: string[]): string[];
|
|
6
6
|
export declare function profileToolAllow(profile: Profile): readonly ToolId[];
|
|
7
7
|
export declare function profileToolsSpec(profile: Profile): ProfileToolsSpec | undefined;
|
|
8
|
+
/** `tools.parallel` as the profile sets it: whether a step's calls run side by side. */
|
|
9
|
+
export declare function profileToolsParallel(profile: Profile): boolean | undefined;
|
|
8
10
|
export declare function resolveAllowedCustomToolIds(tools: ToolRegistry, profile: Profile, req: TurnRequest): ToolId[];
|
|
9
11
|
export declare function resolveModelBuiltinIds(tools: ToolRegistry, profile: ModelProfile, req: TurnRequest, modelId: ModelId): ToolId[];
|
|
10
12
|
export declare function wireForTool(tools: ToolRegistry, name: string): WireFunctionTool | undefined;
|
|
@@ -15,6 +17,7 @@ export declare function promoteBuiltin(tools: ToolRegistry, state: TurnToolSnaps
|
|
|
15
17
|
export declare function initialVisible(tools: ToolRegistry, profile: Profile, gated: ToolId[]): ToolId[];
|
|
16
18
|
export declare function initialBuiltins(tools: ToolRegistry, profile: Profile, gated: ToolId[]): ToolId[];
|
|
17
19
|
export declare function resolveTurnTools(tools: ToolRegistry, profile: Profile, req: TurnRequest, modelId: ModelId | undefined): TurnToolSnapshot;
|
|
20
|
+
/** Resolves the tools a turn may call into a snapshot, then applies the profile's `t1Policy` to it. */
|
|
18
21
|
export declare function prepareTurnToolSnapshot(tools: ToolRegistry, profile: Profile, req: TurnRequest, modelId: ModelId | undefined): Promise<TurnToolSnapshot>;
|
|
19
22
|
/** So concurrent host invokes do not share mutable state. */
|
|
20
23
|
export declare function cloneTurnToolSnapshot(state: TurnToolSnapshot): TurnToolSnapshot;
|
|
@@ -30,6 +30,10 @@ export function profileToolAllow(profile) {
|
|
|
30
30
|
export function profileToolsSpec(profile) {
|
|
31
31
|
return profile.type === 'text' || profile.type === 'image' ? profile.tools : undefined;
|
|
32
32
|
}
|
|
33
|
+
/** `tools.parallel` as the profile sets it: whether a step's calls run side by side. */
|
|
34
|
+
export function profileToolsParallel(profile) {
|
|
35
|
+
return 'tools' in profile ? profile.tools.parallel : undefined;
|
|
36
|
+
}
|
|
33
37
|
export function resolveAllowedCustomToolIds(tools, profile, req) {
|
|
34
38
|
return profileToolAllow(profile).filter((id) => {
|
|
35
39
|
const tool = tools.get(id);
|
|
@@ -117,7 +121,10 @@ export function initialBuiltins(tools, profile, gated) {
|
|
|
117
121
|
}
|
|
118
122
|
export function resolveTurnTools(tools, profile, req, modelId) {
|
|
119
123
|
const customAllowed = resolveAllowedCustomToolIds(tools, profile, req);
|
|
120
|
-
const modelBuiltins = profile.type === 'host' ||
|
|
124
|
+
const modelBuiltins = profile.type === 'host' ||
|
|
125
|
+
profile.type === 'decision' ||
|
|
126
|
+
profile.type === 'embedding' ||
|
|
127
|
+
modelId === undefined
|
|
121
128
|
? []
|
|
122
129
|
: resolveModelBuiltinIds(tools, profile, req, modelId);
|
|
123
130
|
const gated = [...customAllowed, ...modelBuiltins];
|
|
@@ -134,6 +141,7 @@ export function resolveTurnTools(tools, profile, req, modelId) {
|
|
|
134
141
|
wire: buildWire(tools, visible),
|
|
135
142
|
};
|
|
136
143
|
}
|
|
144
|
+
/** Resolves the tools a turn may call into a snapshot, then applies the profile's `t1Policy` to it. */
|
|
137
145
|
export async function prepareTurnToolSnapshot(tools, profile, req, modelId) {
|
|
138
146
|
const snapshot = resolveTurnTools(tools, profile, req, modelId);
|
|
139
147
|
await expandT1Policy(tools, snapshot, profile, req);
|
|
@@ -174,14 +182,14 @@ export async function expandT1Policy(tools, state, profile, req) {
|
|
|
174
182
|
});
|
|
175
183
|
}
|
|
176
184
|
if (!Array.isArray(selected)) {
|
|
177
|
-
throw new TheoremError('config', `Profile '${profile.id}' tools.t1Policy must return ToolId[]`); //
|
|
185
|
+
throw new TheoremError('config', `Profile '${profile.id}' tools.t1Policy must return ToolId[]`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
178
186
|
}
|
|
179
187
|
for (const id of selected) {
|
|
180
188
|
if (!state.gated.includes(id)) {
|
|
181
189
|
continue;
|
|
182
190
|
}
|
|
183
191
|
const tool = tools.get(id);
|
|
184
|
-
if (
|
|
192
|
+
if (tool?.loadTier !== 'T2') {
|
|
185
193
|
continue;
|
|
186
194
|
}
|
|
187
195
|
if (tool.type === 'builtin') {
|
|
@@ -216,7 +224,7 @@ export function promoteLoadedTools(tools, state, loaded, profile) {
|
|
|
216
224
|
failure: {
|
|
217
225
|
code: 'invalid_output',
|
|
218
226
|
kind: 'bad_response',
|
|
219
|
-
message: 'tools.t2Loader loaded ids must be plain strings', //
|
|
227
|
+
message: 'tools.t2Loader loaded ids must be plain strings', // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
220
228
|
},
|
|
221
229
|
};
|
|
222
230
|
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A call's end, for a host that wants how a call settled rather than its stream:
|
|
3
|
+
* `settledCall` and `settledCalls` read a started `invokeTool` or `invokeToolStep` and give each
|
|
4
|
+
* call's terminal `tool` event with every event it emitted. `runTool` and `runToolStep` use them.
|
|
5
|
+
*/
|
|
6
|
+
import type { ToolPhaseEvent, TurnEvent } from '../turn-events.js';
|
|
7
|
+
import type { StartedInvoke, StartedStep } from './invoke.js';
|
|
8
|
+
/** The phase a call ends on: it completed, a gate held it, or it failed. */
|
|
9
|
+
export type SettledToolCall = Extract<ToolPhaseEvent, {
|
|
10
|
+
phase: 'complete' | 'gate' | 'error';
|
|
11
|
+
}> & {
|
|
12
|
+
/** Kernel-issued identity; a gate's resume carries it. */
|
|
13
|
+
operationId?: string;
|
|
14
|
+
};
|
|
15
|
+
/** A settled call, every event it emitted in order, and the last activity label it ran under. */
|
|
16
|
+
export type ToolCallResult = SettledToolCall & {
|
|
17
|
+
events: TurnEvent[];
|
|
18
|
+
activity?: string;
|
|
19
|
+
};
|
|
20
|
+
/** A step's call, settled: its place in the step's `calls` beside its result. */
|
|
21
|
+
export type ToolStepCallResult = ToolCallResult & {
|
|
22
|
+
index: number;
|
|
23
|
+
};
|
|
24
|
+
/** Run one call to its end. */
|
|
25
|
+
declare function settledCall(started: StartedInvoke): Promise<ToolCallResult>;
|
|
26
|
+
/** Run a step's calls, yielding each one's result as it settles; a call the step never settled comes last. */
|
|
27
|
+
declare function settledCalls(started: StartedStep): AsyncGenerator<ToolStepCallResult>;
|
|
28
|
+
export { settledCall, settledCalls };
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A call's end, for a host that wants how a call settled rather than its stream:
|
|
3
|
+
* `settledCall` and `settledCalls` read a started `invokeTool` or `invokeToolStep` and give each
|
|
4
|
+
* call's terminal `tool` event with every event it emitted. `runTool` and `runToolStep` use them.
|
|
5
|
+
*/
|
|
6
|
+
import { labelText } from '../../guardrails/labels.js';
|
|
7
|
+
function isSettled(tool) {
|
|
8
|
+
return tool.phase === 'complete' || tool.phase === 'gate' || tool.phase === 'error';
|
|
9
|
+
}
|
|
10
|
+
function foldTool(fold, tool) {
|
|
11
|
+
if (tool.phase === 'running')
|
|
12
|
+
fold.activity = tool.activity ?? fold.activity;
|
|
13
|
+
if (isSettled(tool))
|
|
14
|
+
fold.settled = tool;
|
|
15
|
+
}
|
|
16
|
+
/** The call's result; a call that never settled failed as the invoke's own error says, else as not run. */
|
|
17
|
+
function settle(fold, invokeError) {
|
|
18
|
+
const settled = fold.settled ?? {
|
|
19
|
+
phase: 'error',
|
|
20
|
+
name: fold.name,
|
|
21
|
+
callId: fold.callId,
|
|
22
|
+
at: Date.now(),
|
|
23
|
+
failure: {
|
|
24
|
+
code: 'invoke_failed',
|
|
25
|
+
kind: invokeError?.errorKind ?? 'internal',
|
|
26
|
+
message: invokeError?.errorInternal ??
|
|
27
|
+
invokeError?.error ??
|
|
28
|
+
labelText('tool.did_not_run', { tool: fold.name }),
|
|
29
|
+
},
|
|
30
|
+
};
|
|
31
|
+
return {
|
|
32
|
+
...settled,
|
|
33
|
+
events: fold.events,
|
|
34
|
+
...(fold.activity ? { activity: fold.activity } : {}),
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
/** Run one call to its end. */
|
|
38
|
+
async function settledCall(started) {
|
|
39
|
+
const fold = {
|
|
40
|
+
name: started.name,
|
|
41
|
+
callId: started.callId,
|
|
42
|
+
events: [],
|
|
43
|
+
};
|
|
44
|
+
let invokeError;
|
|
45
|
+
for await (const event of started.events) {
|
|
46
|
+
fold.events.push(event);
|
|
47
|
+
if (event.type === 'error')
|
|
48
|
+
invokeError = event;
|
|
49
|
+
if (event.type === 'tool' && event.tool.callId === started.callId) {
|
|
50
|
+
foldTool(fold, event.tool);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return settle(fold, invokeError);
|
|
54
|
+
}
|
|
55
|
+
/** Run a step's calls, yielding each one's result as it settles; a call the step never settled comes last. */
|
|
56
|
+
async function* settledCalls(started) {
|
|
57
|
+
const folds = started.calls.map(({ name, callId }) => ({
|
|
58
|
+
name,
|
|
59
|
+
callId,
|
|
60
|
+
events: [],
|
|
61
|
+
}));
|
|
62
|
+
const byCallId = new Map(started.calls.map(({ callId }, index) => [callId, index]));
|
|
63
|
+
const yielded = new Set();
|
|
64
|
+
let invokeError;
|
|
65
|
+
for await (const event of started.events) {
|
|
66
|
+
if (event.type === 'error')
|
|
67
|
+
invokeError = event;
|
|
68
|
+
if (event.type !== 'tool')
|
|
69
|
+
continue;
|
|
70
|
+
const index = byCallId.get(event.tool.callId);
|
|
71
|
+
const fold = index === undefined ? undefined : folds[index];
|
|
72
|
+
if (index === undefined || !fold)
|
|
73
|
+
continue;
|
|
74
|
+
fold.events.push(event);
|
|
75
|
+
foldTool(fold, event.tool);
|
|
76
|
+
if (fold.settled && !yielded.has(index)) {
|
|
77
|
+
yielded.add(index);
|
|
78
|
+
yield { ...settle(fold, invokeError), index };
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
for (const [index, fold] of folds.entries()) {
|
|
82
|
+
if (!yielded.has(index))
|
|
83
|
+
yield { ...settle(fold, invokeError), index };
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
export { settledCall, settledCalls };
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { type ZodType } from 'zod';
|
|
2
2
|
export type JsonSchema = Record<string, unknown>;
|
|
3
|
-
|
|
4
|
-
declare function
|
|
3
|
+
/** A structural check only: what a provider accepts is its own API's answer. */
|
|
4
|
+
declare function validateToolSchema(schema: JsonSchema, label: 'input' | 'output'): void;
|
|
5
5
|
declare function jsonSchemaFromZod(schema: ZodType, io?: 'input' | 'output'): JsonSchema;
|
|
6
|
-
export { jsonSchemaFromZod,
|
|
6
|
+
export { jsonSchemaFromZod, validateToolSchema };
|
|
7
7
|
/** Strips prototype-pollution keys before validation. */
|
|
8
8
|
export declare function plainToolInput(input: unknown): unknown;
|
|
9
9
|
/** A placeholder in the scheme or authority would let tool input choose where the credential goes. */
|
|
@@ -1,153 +1,74 @@
|
|
|
1
1
|
import { z } from 'zod';
|
|
2
2
|
import { TheoremError } from '../../guardrails/error.js';
|
|
3
|
-
|
|
4
|
-
'type',
|
|
5
|
-
'format',
|
|
6
|
-
'title',
|
|
7
|
-
'description',
|
|
8
|
-
'nullable',
|
|
9
|
-
'enum',
|
|
10
|
-
'default',
|
|
11
|
-
'example',
|
|
12
|
-
'items',
|
|
13
|
-
'minItems',
|
|
14
|
-
'maxItems',
|
|
15
|
-
'properties',
|
|
16
|
-
'required',
|
|
17
|
-
'propertyOrdering',
|
|
18
|
-
'minProperties',
|
|
19
|
-
'maxProperties',
|
|
20
|
-
'minimum',
|
|
21
|
-
'maximum',
|
|
22
|
-
'pattern',
|
|
23
|
-
'minLength',
|
|
24
|
-
'maxLength',
|
|
25
|
-
'anyOf',
|
|
26
|
-
'oneOf',
|
|
27
|
-
];
|
|
28
|
-
function validateGeminiKeys(schema, path, errors) {
|
|
29
|
-
for (const key of Object.keys(schema)) {
|
|
30
|
-
if (!GEMINI_SUPPORTED_SCHEMA_KEYS.includes(key)) {
|
|
31
|
-
errors.push(`${path}: unsupported Gemini schema key '${key}'`); // lexicon-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
32
|
-
}
|
|
33
|
-
}
|
|
34
|
-
}
|
|
35
|
-
function validateSchemaShape(schema, path, mode, errors) {
|
|
3
|
+
function validateSchemaShape(schema, path, errors) {
|
|
36
4
|
if (!schema || typeof schema !== 'object' || Array.isArray(schema)) {
|
|
37
|
-
errors.push(`${path}: schema must be an object`); //
|
|
5
|
+
errors.push(`${path}: schema must be an object`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
38
6
|
return false;
|
|
39
7
|
}
|
|
40
8
|
const hasType = typeof schema.type === 'string' || Array.isArray(schema.type);
|
|
41
9
|
const hasCombinator = schema.anyOf !== undefined || schema.oneOf !== undefined;
|
|
42
10
|
if (!hasType && !hasCombinator) {
|
|
43
|
-
if (
|
|
11
|
+
if (path !== '$') {
|
|
44
12
|
return true;
|
|
45
13
|
}
|
|
46
|
-
errors.push(`${path}: missing type or combinator`); //
|
|
47
|
-
}
|
|
48
|
-
if (mode === 'gemini') {
|
|
49
|
-
validateGeminiKeys(schema, path, errors);
|
|
14
|
+
errors.push(`${path}: missing type or combinator`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
50
15
|
}
|
|
51
16
|
if (schema.type === 'array' && schema.items === undefined) {
|
|
52
|
-
errors.push(`${path}: array schema must define items`); //
|
|
17
|
+
errors.push(`${path}: array schema must define items`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
53
18
|
}
|
|
54
19
|
return true;
|
|
55
20
|
}
|
|
56
|
-
function walkSchemaProperties(props, required, path,
|
|
21
|
+
function walkSchemaProperties(props, required, path, errors) {
|
|
57
22
|
const reqList = Array.isArray(required) ? required : [];
|
|
58
23
|
for (const req of reqList) {
|
|
59
|
-
if (typeof req === 'string' && !(req
|
|
60
|
-
errors.push(`${path}: required key '${req}' missing from properties`); //
|
|
24
|
+
if (typeof req === 'string' && !Object.hasOwn(props, req)) {
|
|
25
|
+
errors.push(`${path}: required key '${req}' missing from properties`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
61
26
|
}
|
|
62
27
|
}
|
|
63
28
|
for (const [key, child] of Object.entries(props)) {
|
|
64
29
|
if (child && typeof child === 'object') {
|
|
65
|
-
walkSchema(child, `${path}.properties.${key}`,
|
|
30
|
+
walkSchema(child, `${path}.properties.${key}`, errors);
|
|
66
31
|
}
|
|
67
32
|
}
|
|
68
33
|
}
|
|
69
|
-
function walkSchema(schema, path,
|
|
70
|
-
if (!validateSchemaShape(schema, path,
|
|
34
|
+
function walkSchema(schema, path, errors) {
|
|
35
|
+
if (!validateSchemaShape(schema, path, errors))
|
|
71
36
|
return;
|
|
72
37
|
const props = schema.properties;
|
|
73
38
|
if (props && typeof props === 'object' && !Array.isArray(props)) {
|
|
74
|
-
walkSchemaProperties(props, schema.required, path,
|
|
39
|
+
walkSchemaProperties(props, schema.required, path, errors);
|
|
75
40
|
}
|
|
76
41
|
if (schema.items && typeof schema.items === 'object' && !Array.isArray(schema.items)) {
|
|
77
|
-
walkSchema(schema.items, `${path}.items`,
|
|
42
|
+
walkSchema(schema.items, `${path}.items`, errors);
|
|
78
43
|
}
|
|
79
44
|
for (const combinator of ['anyOf', 'oneOf']) {
|
|
80
45
|
const branch = schema[combinator];
|
|
81
46
|
if (Array.isArray(branch)) {
|
|
82
47
|
branch.forEach((entry, index) => {
|
|
83
48
|
if (entry && typeof entry === 'object') {
|
|
84
|
-
walkSchema(entry, `${path}.${combinator}[${index}]`,
|
|
49
|
+
walkSchema(entry, `${path}.${combinator}[${index}]`, errors);
|
|
85
50
|
}
|
|
86
51
|
});
|
|
87
52
|
}
|
|
88
53
|
}
|
|
89
54
|
}
|
|
90
|
-
|
|
55
|
+
/** A structural check only: what a provider accepts is its own API's answer. */
|
|
56
|
+
function validateToolSchema(schema, label) {
|
|
91
57
|
const errors = [];
|
|
92
|
-
walkSchema(schema, '$',
|
|
58
|
+
walkSchema(schema, '$', errors);
|
|
93
59
|
if (errors.length > 0) {
|
|
94
|
-
throw new TheoremError('config', `Invalid tool ${label} schema: ${errors.join('; ')}`); //
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
function validateToolInputSchema(schema, mode = 'gemini') {
|
|
98
|
-
validateToolWireSchema(schema, mode, 'input');
|
|
99
|
-
}
|
|
100
|
-
function validateToolOutputSchema(schema, mode = 'structural') {
|
|
101
|
-
validateToolWireSchema(schema, mode, 'output');
|
|
102
|
-
}
|
|
103
|
-
function stripProperties(value) {
|
|
104
|
-
const props = {};
|
|
105
|
-
if (value && typeof value === 'object' && !Array.isArray(value)) {
|
|
106
|
-
for (const [propKey, propValue] of Object.entries(value)) {
|
|
107
|
-
if (propValue && typeof propValue === 'object') {
|
|
108
|
-
props[propKey] = stripUnsupportedGeminiKeys(propValue);
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
}
|
|
112
|
-
return props;
|
|
113
|
-
}
|
|
114
|
-
function stripBranches(branches) {
|
|
115
|
-
return branches.map((entry) => entry && typeof entry === 'object' ? stripUnsupportedGeminiKeys(entry) : entry);
|
|
116
|
-
}
|
|
117
|
-
function stripUnsupportedGeminiKeys(schema) {
|
|
118
|
-
const out = {};
|
|
119
|
-
for (const [key, value] of Object.entries(schema)) {
|
|
120
|
-
if (!GEMINI_SUPPORTED_SCHEMA_KEYS.includes(key)) {
|
|
121
|
-
continue;
|
|
122
|
-
}
|
|
123
|
-
if (key === 'properties') {
|
|
124
|
-
out.properties = stripProperties(value);
|
|
125
|
-
continue;
|
|
126
|
-
}
|
|
127
|
-
if (key === 'items' && value && typeof value === 'object' && !Array.isArray(value)) {
|
|
128
|
-
out.items = stripUnsupportedGeminiKeys(value);
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
if ((key === 'anyOf' || key === 'oneOf') && Array.isArray(value)) {
|
|
132
|
-
out[key] = stripBranches(value);
|
|
133
|
-
continue;
|
|
134
|
-
}
|
|
135
|
-
out[key] = value;
|
|
60
|
+
throw new TheoremError('config', `Invalid tool ${label} schema: ${errors.join('; ')}`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
136
61
|
}
|
|
137
|
-
return out;
|
|
138
62
|
}
|
|
139
63
|
function jsonSchemaFromZod(schema, io = 'output') {
|
|
140
|
-
const json = z.toJSONSchema(schema, {
|
|
141
|
-
target: 'openApi3',
|
|
142
|
-
io,
|
|
143
|
-
});
|
|
64
|
+
const json = z.toJSONSchema(schema, { target: 'draft-7', io });
|
|
144
65
|
delete json.$schema;
|
|
145
66
|
if (!json.type) {
|
|
146
67
|
json.type = 'object';
|
|
147
68
|
}
|
|
148
|
-
return
|
|
69
|
+
return json;
|
|
149
70
|
}
|
|
150
|
-
export { jsonSchemaFromZod,
|
|
71
|
+
export { jsonSchemaFromZod, validateToolSchema };
|
|
151
72
|
/** Strips prototype-pollution keys before validation. */
|
|
152
73
|
export function plainToolInput(input) {
|
|
153
74
|
if (input === null || typeof input !== 'object') {
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
7
|
import type { RequestChecks } from './events.js';
|
|
8
|
-
import { type CredentialRefusal } from './remote.js';
|
|
8
|
+
import { type CredentialQuery, type CredentialRefusal } from './remote.js';
|
|
9
9
|
import type { SignedInFetch, ToolContext } from './types.js';
|
|
10
10
|
/** Thrown by a signed-in fetch when the service refuses the credential; the kernel settles it. */
|
|
11
11
|
export declare class CredentialRefusedError extends Error {
|
|
@@ -14,5 +14,6 @@ export declare class CredentialRefusedError extends Error {
|
|
|
14
14
|
}
|
|
15
15
|
export declare function signedInFetch(prepared: {
|
|
16
16
|
authHeaders: Record<string, string>;
|
|
17
|
+
query?: CredentialQuery;
|
|
17
18
|
audience?: string;
|
|
18
19
|
}, ctx: ToolContext, checks: RequestChecks): SignedInFetch;
|
|
@@ -7,12 +7,12 @@
|
|
|
7
7
|
import { fetchGuarded } from '../../guardrails/network.js';
|
|
8
8
|
import { TheoremError } from '../../guardrails/theorem-error.js';
|
|
9
9
|
import { toolNetworkPolicy } from './events.js';
|
|
10
|
-
import { audienceMismatch, credentialRefusal, refusalAsksForSignIn, } from './remote.js';
|
|
10
|
+
import { audienceMismatch, credentialRefusal, refusalAsksForSignIn, withCredentialQuery, } from './remote.js';
|
|
11
11
|
/** Thrown by a signed-in fetch when the service refuses the credential; the kernel settles it. */
|
|
12
12
|
export class CredentialRefusedError extends Error {
|
|
13
13
|
refusal;
|
|
14
14
|
constructor(refusal) {
|
|
15
|
-
super(`The service refused the credential (HTTP ${refusal.status}).`); //
|
|
15
|
+
super(`The service refused the credential (HTTP ${refusal.status}).`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
16
16
|
this.name = 'CredentialRefusedError';
|
|
17
17
|
this.refusal = refusal;
|
|
18
18
|
}
|
|
@@ -23,7 +23,7 @@ export function signedInFetch(prepared, ctx, checks) {
|
|
|
23
23
|
const mismatch = audienceMismatch(prepared.audience, target);
|
|
24
24
|
if (mismatch)
|
|
25
25
|
throw new TheoremError('config', mismatch);
|
|
26
|
-
const response = await fetchGuarded(target.href, {
|
|
26
|
+
const response = await fetchGuarded(withCredentialQuery(target, prepared.query).href, {
|
|
27
27
|
method: request.method ?? 'GET',
|
|
28
28
|
headers: request.headers,
|
|
29
29
|
body: request.body,
|
|
@@ -1,10 +1,21 @@
|
|
|
1
1
|
import type { z } from 'zod';
|
|
2
|
-
import { type
|
|
2
|
+
import { type LabelOverrides } from '../../guardrails/labels.js';
|
|
3
3
|
import type { SpanHandle } from '../../observability/trace-span.js';
|
|
4
|
-
import
|
|
4
|
+
import type { ToolAccess } from '../schema.js';
|
|
5
|
+
import { type InjectUnit, type StageHandler, type StageResult, type StepCall } from '../stages.js';
|
|
5
6
|
import type { Profile, TurnEvent, TurnHistoryMessage } from '../types.js';
|
|
6
7
|
import { type ToolCallBase } from './events.js';
|
|
7
|
-
import type { ModelToolResult, ToolContext, ToolFailure, ToolGate } from './types.js';
|
|
8
|
+
import type { ModelToolResult, ToolContext, ToolFailure, ToolGate, ToolLabels } from './types.js';
|
|
9
|
+
/** How a call's wait for other calls in its step ended: they settled, or the wait cannot end. */
|
|
10
|
+
export type StepWaitOutcome = {
|
|
11
|
+
ok: true;
|
|
12
|
+
} | {
|
|
13
|
+
ok: false;
|
|
14
|
+
reason: 'unknown' | 'cycle';
|
|
15
|
+
callIds: string[];
|
|
16
|
+
};
|
|
17
|
+
/** Holds `callId` until the calls it names have settled. */
|
|
18
|
+
export type StepWait = (callId: string, waitFor: readonly string[]) => Promise<StepWaitOutcome>;
|
|
8
19
|
export interface ToolStageSupport {
|
|
9
20
|
/** In order: request `onStage`, then turn/session ambient. */
|
|
10
21
|
handlers: StageHandler[];
|
|
@@ -17,6 +28,12 @@ export interface ToolStageSupport {
|
|
|
17
28
|
host?: unknown;
|
|
18
29
|
signal?: AbortSignal;
|
|
19
30
|
span?: SpanHandle;
|
|
31
|
+
/** The step's calls, shown to `pre_tool`. Unset outside a turn's step. */
|
|
32
|
+
stepCalls?: readonly StepCall[];
|
|
33
|
+
/** Holds a call for the calls its `pre_tool` `waitFor` names. Unset outside a turn's step. */
|
|
34
|
+
wait?: StepWait;
|
|
35
|
+
/** The host sees a handler's drafts: `outputs.streaming.mode` `sse`. Unset outside a turn's step. */
|
|
36
|
+
drafts?: boolean;
|
|
20
37
|
}
|
|
21
38
|
export type PreBodyOutcome = {
|
|
22
39
|
ok: true;
|
|
@@ -31,6 +48,7 @@ export type PreBodyOutcome = {
|
|
|
31
48
|
ok: false;
|
|
32
49
|
kind: 'gated';
|
|
33
50
|
gate: ToolGate;
|
|
51
|
+
input?: unknown;
|
|
34
52
|
} | {
|
|
35
53
|
ok: false;
|
|
36
54
|
kind: 'failed';
|
|
@@ -52,6 +70,7 @@ export type PostToolStageOutcome = {
|
|
|
52
70
|
mutate?: {
|
|
53
71
|
output: unknown;
|
|
54
72
|
};
|
|
73
|
+
labelFailed?: true;
|
|
55
74
|
};
|
|
56
75
|
/** Tool `preTool` → host `pre_tool` → mutate re-parse. */
|
|
57
76
|
export declare function runPreToolPipeline(args: {
|
|
@@ -60,6 +79,8 @@ export declare function runPreToolPipeline(args: {
|
|
|
60
79
|
input: {
|
|
61
80
|
safeParse: (value: unknown) => z.ZodSafeParseResult<unknown>;
|
|
62
81
|
};
|
|
82
|
+
access: ToolAccess;
|
|
83
|
+
labels?: ToolLabels;
|
|
63
84
|
preTool?: (input: never, ctx: ToolContext) => StageResult | undefined | Promise<StageResult | undefined>;
|
|
64
85
|
};
|
|
65
86
|
input: unknown;
|
|
@@ -75,6 +96,8 @@ export declare function runPostToolStages(args: {
|
|
|
75
96
|
callNotStarted?: boolean;
|
|
76
97
|
outputRaw?: unknown;
|
|
77
98
|
outputModel?: ModelToolResult;
|
|
99
|
+
activityPast?: string;
|
|
100
|
+
activityFailed?: string;
|
|
78
101
|
failure?: ToolFailure;
|
|
79
102
|
awaiting?: boolean;
|
|
80
103
|
/** False when there is no completed output for `mutate` to replace. */
|
|
@@ -89,5 +112,5 @@ export declare function emitGateSettlement(args: {
|
|
|
89
112
|
gate: ToolGate;
|
|
90
113
|
callId: string;
|
|
91
114
|
toolName: string;
|
|
92
|
-
|
|
115
|
+
labels: LabelOverrides | undefined;
|
|
93
116
|
}): AsyncGenerator<TurnEvent, string | undefined>;
|
|
@@ -1,7 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { labelText } from '../../guardrails/labels.js';
|
|
2
|
+
import { jsonObjectSchema } from '../json.js';
|
|
2
3
|
import { runStage, stageEventFields, } from '../stages.js';
|
|
3
4
|
import { toolEvent } from './events.js';
|
|
4
|
-
import {
|
|
5
|
+
import { operationWireValue } from './operation.js';
|
|
6
|
+
import { gateDetails, isGateResumeGranted } from './permission.js';
|
|
5
7
|
import { plainToolInput } from './schema.js';
|
|
6
8
|
function defaultToolStageSupport(ctx) {
|
|
7
9
|
return {
|
|
@@ -18,8 +20,11 @@ function defaultToolStageSupport(ctx) {
|
|
|
18
20
|
export async function* runPreToolPipeline(args) {
|
|
19
21
|
const { tool, ctx, base, stages } = args;
|
|
20
22
|
let toolPreTool;
|
|
21
|
-
// An approval skips the tool's own check it already passed — unless the user edited the arguments.
|
|
22
|
-
const approvedAsIs = isGateResumeGranted(ctx.resume) &&
|
|
23
|
+
// why: An approval skips the tool's own check it already passed — unless the user edited the arguments.
|
|
24
|
+
const approvedAsIs = isGateResumeGranted(ctx.resume) &&
|
|
25
|
+
ctx.resume?.edited === undefined &&
|
|
26
|
+
ctx.resume?.gateKind !== 'permission' &&
|
|
27
|
+
ctx.resume?.gateKind !== 'auth';
|
|
23
28
|
if (tool.preTool && !approvedAsIs) {
|
|
24
29
|
toolPreTool = (await tool.preTool(args.input, ctx)) ?? undefined;
|
|
25
30
|
}
|
|
@@ -32,31 +37,61 @@ export async function* runPreToolPipeline(args) {
|
|
|
32
37
|
callId: base.callId,
|
|
33
38
|
input: args.input,
|
|
34
39
|
toolPreTool,
|
|
40
|
+
details: gateDetails(tool, args.input),
|
|
35
41
|
});
|
|
36
42
|
if (!pre.ok) {
|
|
37
|
-
if (pre.kind === 'gated')
|
|
43
|
+
if (pre.kind === 'gated') {
|
|
44
|
+
if ('input' in pre) {
|
|
45
|
+
const candidate = pre.input;
|
|
46
|
+
const parsed = tool.input.safeParse(plainToolInput(candidate));
|
|
47
|
+
if (!parsed.success) {
|
|
48
|
+
return {
|
|
49
|
+
ok: false,
|
|
50
|
+
kind: 'failed',
|
|
51
|
+
failure: {
|
|
52
|
+
code: 'invalid_input',
|
|
53
|
+
kind: 'bad_response',
|
|
54
|
+
message: labelText('tool.input_invalid_after_mutate', {}, ctx.profile.labels),
|
|
55
|
+
details: parsed.error.flatten(),
|
|
56
|
+
},
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
pre.gate = {
|
|
60
|
+
...pre.gate,
|
|
61
|
+
...gateDetails(tool, parsed.data),
|
|
62
|
+
preparedArguments: jsonObjectSchema.parse(operationWireValue(plainToolInput(candidate))),
|
|
63
|
+
};
|
|
64
|
+
}
|
|
65
|
+
yield stageEventFields('pre_tool', {
|
|
66
|
+
callId: base.callId,
|
|
67
|
+
toolName: tool.name,
|
|
68
|
+
callNotStarted: true,
|
|
69
|
+
gate: pre.gate,
|
|
70
|
+
});
|
|
38
71
|
yield toolEvent(base, { phase: 'gate', gate: pre.gate });
|
|
72
|
+
}
|
|
39
73
|
return pre;
|
|
40
74
|
}
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const reparsed = tool.input.safeParse(plainToolInput(pre.input));
|
|
44
|
-
if (!reparsed.success) {
|
|
75
|
+
const reparsed = pre.mutated ? tool.input.safeParse(plainToolInput(pre.input)) : undefined;
|
|
76
|
+
if (reparsed && !reparsed.success) {
|
|
45
77
|
return {
|
|
46
78
|
ok: false,
|
|
47
79
|
kind: 'failed',
|
|
48
80
|
failure: {
|
|
49
81
|
code: 'invalid_input',
|
|
50
82
|
kind: 'bad_response',
|
|
51
|
-
message:
|
|
83
|
+
message: labelText('tool.input_invalid_after_mutate', {}, args.ctx.profile.labels),
|
|
52
84
|
details: reparsed.error.flatten(),
|
|
53
85
|
},
|
|
54
86
|
};
|
|
55
87
|
}
|
|
56
|
-
|
|
88
|
+
const waitFailure = await waitForStepCalls(stages, base.callId, tool.name, pre.waitFor, ctx.profile.labels);
|
|
89
|
+
if (waitFailure)
|
|
90
|
+
return { ok: false, kind: 'failed', failure: waitFailure };
|
|
91
|
+
return { ok: true, input: reparsed ? reparsed.data : pre.input };
|
|
57
92
|
}
|
|
58
93
|
async function* runPreToolStages(args) {
|
|
59
|
-
const { stages, toolName, callId, input, toolPreTool } = args;
|
|
94
|
+
const { stages, toolName, callId, input, toolPreTool, details } = args;
|
|
60
95
|
const applied = yield* runStage({
|
|
61
96
|
stage: 'pre_tool',
|
|
62
97
|
step: stages.step,
|
|
@@ -70,6 +105,7 @@ async function* runPreToolStages(args) {
|
|
|
70
105
|
callId,
|
|
71
106
|
tool: toolName,
|
|
72
107
|
input,
|
|
108
|
+
...(stages.stepCalls ? { stepCalls: stages.stepCalls } : {}),
|
|
73
109
|
});
|
|
74
110
|
if (applied.abort) {
|
|
75
111
|
return { ok: false, kind: 'aborted', aborted: applied.abort };
|
|
@@ -87,14 +123,35 @@ async function* runPreToolStages(args) {
|
|
|
87
123
|
kind: 'confirmation',
|
|
88
124
|
tool: toolName,
|
|
89
125
|
...(applied.confirm.summary ? { summary: applied.confirm.summary } : {}),
|
|
126
|
+
...details,
|
|
127
|
+
};
|
|
128
|
+
return {
|
|
129
|
+
ok: false,
|
|
130
|
+
kind: 'gated',
|
|
131
|
+
gate,
|
|
132
|
+
...(applied.mutate && 'input' in applied.mutate ? { input: applied.mutate.input } : {}),
|
|
90
133
|
};
|
|
91
|
-
yield stageEventFields('pre_tool', { callId, toolName, callNotStarted: true, gate });
|
|
92
|
-
return { ok: false, kind: 'gated', gate };
|
|
93
134
|
}
|
|
135
|
+
const waitFor = applied.waitFor ? { waitFor: applied.waitFor } : {};
|
|
94
136
|
if (applied.mutate && 'input' in applied.mutate) {
|
|
95
|
-
return { ok: true, input: applied.mutate.input, mutated: true };
|
|
137
|
+
return { ok: true, input: applied.mutate.input, mutated: true, ...waitFor };
|
|
96
138
|
}
|
|
97
|
-
return { ok: true, input, mutated: false };
|
|
139
|
+
return { ok: true, input, mutated: false, ...waitFor };
|
|
140
|
+
}
|
|
141
|
+
/** Holds the call for the calls its `pre_tool` named; a wait that cannot end fails the call. */
|
|
142
|
+
async function waitForStepCalls(stages, callId, toolName, waitFor, labels) {
|
|
143
|
+
if (!waitFor)
|
|
144
|
+
return undefined;
|
|
145
|
+
const outcome = stages?.wait
|
|
146
|
+
? await stages.wait(callId, waitFor)
|
|
147
|
+
: { ok: false, reason: 'unknown', callIds: [...waitFor] };
|
|
148
|
+
if (outcome.ok)
|
|
149
|
+
return undefined;
|
|
150
|
+
return {
|
|
151
|
+
code: outcome.reason === 'unknown' ? 'wait_unknown' : 'wait_cycle',
|
|
152
|
+
kind: 'request',
|
|
153
|
+
message: labelText(outcome.reason === 'unknown' ? 'tool.wait_unknown' : 'tool.wait_cycle', { tool: toolName, calls: outcome.callIds.join(', ') }, labels),
|
|
154
|
+
};
|
|
98
155
|
}
|
|
99
156
|
export async function* runPostToolStages(args) {
|
|
100
157
|
const { stages, toolName, callId, mutable, ...call } = args;
|
|
@@ -118,6 +175,7 @@ export async function* runPostToolStages(args) {
|
|
|
118
175
|
...(applied.abort !== undefined ? { abort: applied.abort } : {}),
|
|
119
176
|
...(applied.deny ? { deny: applied.deny } : {}),
|
|
120
177
|
...(applied.mutate && 'output' in applied.mutate ? { mutate: applied.mutate } : {}),
|
|
178
|
+
...(applied.labelFailed ? { labelFailed: true } : {}),
|
|
121
179
|
inject: applied.inject,
|
|
122
180
|
};
|
|
123
181
|
}
|
|
@@ -133,7 +191,7 @@ export async function* emitGateSettlement(args) {
|
|
|
133
191
|
gate: args.gate,
|
|
134
192
|
});
|
|
135
193
|
const readBack = args.gate.kind === 'auth'
|
|
136
|
-
?
|
|
194
|
+
? labelText('sign_in.pending', { service: args.gate.authChallenge.service }, args.labels)
|
|
137
195
|
: undefined;
|
|
138
196
|
yield toolEvent(args.base, { phase: 'gate', gate: args.gate, ...(readBack ? { readBack } : {}) });
|
|
139
197
|
return readBack;
|