@theoremjs/agents 0.3.0 → 0.3.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +276 -995
- package/esm/mod.d.ts +33 -19
- package/esm/mod.js +18 -11
- package/esm/src/cli/commands/bench.js +36 -14
- package/esm/src/cli/commands/detect-compile.d.ts +17 -0
- package/esm/src/cli/commands/detect-compile.js +22 -0
- package/esm/src/cli/commands/eval.d.ts +3 -3
- package/esm/src/cli/commands/fuzz-canary.js +55 -16
- package/esm/src/cli/commands/profile.js +4 -4
- package/esm/src/cli/commands/run.d.ts +2 -2
- package/esm/src/cli/commands/run.js +1 -1
- package/esm/src/cli/commands/test.d.ts +4 -3
- package/esm/src/cli/commands/test.js +2 -2
- package/esm/src/cli/index.js +9 -9
- package/esm/src/cli/matrix/fixtures.js +25 -30
- package/esm/src/evals/attachments.d.ts +1 -0
- package/esm/src/evals/attachments.js +4 -2
- package/esm/src/evals/breakdown.d.ts +2 -0
- package/esm/src/evals/breakdown.js +1 -0
- package/esm/src/evals/graders/answer.d.ts +3 -0
- package/esm/src/evals/graders/answer.js +1 -0
- package/esm/src/evals/graders/code.d.ts +7 -31
- package/esm/src/evals/graders/code.js +4 -25
- package/esm/src/evals/graders/judge.d.ts +4 -0
- package/esm/src/evals/graders/judge.js +7 -5
- package/esm/src/evals/graders/latency.d.ts +1 -0
- package/esm/src/evals/graders/latency.js +3 -2
- package/esm/src/evals/graders/live.d.ts +3 -0
- package/esm/src/evals/graders/live.js +2 -0
- package/esm/src/evals/graders/media.js +1 -2
- package/esm/src/evals/graders/shared.js +1 -1
- package/esm/src/evals/graders/transcript.d.ts +2 -0
- package/esm/src/evals/graders/transcript.js +5 -3
- package/esm/src/evals/mod.d.ts +1 -9
- package/esm/src/evals/mod.js +1 -9
- package/esm/src/evals/record.d.ts +6 -0
- package/esm/src/evals/record.js +4 -2
- package/esm/src/evals/rubrics/mod.d.ts +1 -1
- package/esm/src/evals/rubrics/mod.js +1 -1
- package/esm/src/evals/rubrics/mustache.js +1 -1
- package/esm/src/evals/rubrics/types.js +1 -1
- package/esm/src/evals/run.d.ts +9 -52
- package/esm/src/evals/run.js +12 -46
- package/esm/src/evals/suite.d.ts +12 -3
- package/esm/src/evals/suite.js +9 -4
- package/esm/src/evals/summary.d.ts +3 -0
- package/esm/src/evals/summary.js +1 -0
- package/esm/src/evals/trial.d.ts +3 -16
- package/esm/src/evals/trial.js +7 -30
- package/esm/src/evals/types.d.ts +30 -121
- package/esm/src/evals/types.js +3 -16
- package/esm/src/evals/verdict.d.ts +5 -0
- package/esm/src/evals/verdict.js +4 -1
- package/esm/src/guardrails/boundaries.d.ts +41 -0
- package/esm/src/guardrails/boundaries.js +103 -0
- package/esm/src/guardrails/canary-gate.d.ts +1 -0
- package/esm/src/guardrails/canary.d.ts +49 -15
- package/esm/src/guardrails/canary.js +103 -30
- package/esm/src/guardrails/compile-egress.d.ts +6 -5
- package/esm/src/guardrails/compile-egress.js +6 -5
- package/esm/src/guardrails/corpus/canary-egress-attacks.d.ts +3 -1
- package/esm/src/guardrails/corpus/canary-egress-attacks.js +4 -2
- package/esm/src/guardrails/corpus/fuzz-inbound.js +14 -17
- package/esm/src/guardrails/corpus/inbound-payloads.d.ts +2 -0
- package/esm/src/guardrails/corpus/inbound-payloads.js +4 -2
- package/esm/src/guardrails/corpus/live-attacks.d.ts +2 -0
- package/esm/src/guardrails/corpus/live-attacks.js +6 -1
- package/esm/src/guardrails/corpus/mod.d.ts +1 -1
- package/esm/src/guardrails/corpus/secrets.d.ts +3 -3
- package/esm/src/guardrails/corpus/secrets.js +2 -2
- package/esm/src/guardrails/corpus/strings.d.ts +1 -1
- package/esm/src/guardrails/corpus/strings.js +1 -1
- package/esm/src/guardrails/corpus/types.d.ts +5 -1
- package/esm/src/guardrails/credential-rules.d.ts +36 -0
- package/esm/src/guardrails/credential-rules.js +3001 -0
- package/esm/src/guardrails/credential-scan.d.ts +45 -0
- package/esm/src/guardrails/credential-scan.js +172 -0
- package/esm/src/guardrails/destinations.d.ts +45 -0
- package/esm/src/guardrails/destinations.js +234 -0
- package/esm/src/guardrails/detect-at.d.ts +107 -0
- package/esm/src/guardrails/detect-at.js +434 -0
- package/esm/src/guardrails/detect-reply.d.ts +61 -0
- package/esm/src/guardrails/detect-reply.js +95 -0
- package/esm/src/guardrails/detect-stream.d.ts +33 -0
- package/esm/src/guardrails/detect-stream.js +77 -0
- package/esm/src/guardrails/detectors.d.ts +216 -0
- package/esm/src/guardrails/detectors.js +503 -0
- package/esm/src/guardrails/egress-automata.d.ts +4 -6
- package/esm/src/guardrails/egress-automata.js +24095 -4572
- package/esm/src/guardrails/egress-compiler.d.ts +38 -16
- package/esm/src/guardrails/egress-compiler.js +254 -60
- package/esm/src/guardrails/egress-patterns.d.ts +4 -2
- package/esm/src/guardrails/egress-patterns.js +6 -2
- package/esm/src/guardrails/egress-stream.d.ts +54 -36
- package/esm/src/guardrails/egress-stream.js +253 -124
- package/esm/src/guardrails/egress-urls.d.ts +6 -3
- package/esm/src/guardrails/egress-urls.js +14 -22
- package/esm/src/guardrails/egress.d.ts +26 -86
- package/esm/src/guardrails/egress.js +59 -309
- package/esm/src/guardrails/error.d.ts +13 -8
- package/esm/src/guardrails/error.js +23 -18
- package/esm/src/guardrails/event-schemas.d.ts +46 -3
- package/esm/src/guardrails/event-schemas.js +12 -5
- package/esm/src/guardrails/events.d.ts +5 -1
- package/esm/src/guardrails/events.js +4 -1
- package/esm/src/guardrails/hints.d.ts +14 -0
- package/esm/src/guardrails/hints.js +57 -0
- package/esm/src/guardrails/hits.d.ts +7 -1
- package/esm/src/guardrails/hits.js +12 -1
- package/esm/src/guardrails/host-patterns.d.ts +85 -0
- package/esm/src/guardrails/host-patterns.js +173 -0
- package/esm/src/guardrails/injection-patterns.d.ts +6 -1
- package/esm/src/guardrails/injection-patterns.js +33 -1
- package/esm/src/guardrails/injection-reversed.d.ts +9 -0
- package/esm/src/guardrails/injection-reversed.js +49 -0
- package/esm/src/guardrails/injection.d.ts +17 -1
- package/esm/src/guardrails/injection.js +259 -36
- package/esm/src/guardrails/labels.d.ts +40 -0
- package/esm/src/guardrails/labels.js +874 -0
- package/esm/src/guardrails/live-outbound-gate.d.ts +9 -8
- package/esm/src/guardrails/live-outbound-gate.js +100 -107
- package/esm/src/guardrails/mod.d.ts +29 -21
- package/esm/src/guardrails/mod.js +18 -13
- package/esm/src/guardrails/network.d.ts +4 -0
- package/esm/src/guardrails/network.js +21 -19
- package/esm/src/guardrails/normalize.d.ts +15 -1
- package/esm/src/guardrails/normalize.js +34 -1
- package/esm/src/guardrails/policy.d.ts +2 -17
- package/esm/src/guardrails/policy.js +12 -41
- package/esm/src/guardrails/progressive-yield.d.ts +65 -24
- package/esm/src/guardrails/progressive-yield.js +191 -147
- package/esm/src/guardrails/prompt-echo.d.ts +4 -2
- package/esm/src/guardrails/prompt-echo.js +87 -6
- package/esm/src/guardrails/quota.d.ts +1 -0
- package/esm/src/guardrails/quota.js +1 -1
- package/esm/src/guardrails/rules.d.ts +20 -29
- package/esm/src/guardrails/rules.js +23 -30
- package/esm/src/guardrails/sanitize.d.ts +32 -15
- package/esm/src/guardrails/sanitize.js +100 -124
- package/esm/src/guardrails/sensitive-groups.d.ts +21 -0
- package/esm/src/guardrails/sensitive-groups.js +12 -0
- package/esm/src/guardrails/sensitive.d.ts +16 -23
- package/esm/src/guardrails/sensitive.js +168 -47
- package/esm/src/guardrails/serialize.d.ts +1 -0
- package/esm/src/guardrails/testing.d.ts +4 -2
- package/esm/src/guardrails/testing.js +4 -2
- package/esm/src/guardrails/theorem-error.d.ts +4 -1
- package/esm/src/guardrails/theorem-error.js +3 -2
- package/esm/src/guardrails/thought-guard.d.ts +34 -13
- package/esm/src/guardrails/thought-guard.js +264 -64
- package/esm/src/guardrails/tool-directives.d.ts +29 -10
- package/esm/src/guardrails/tool-directives.js +133 -47
- package/esm/src/guardrails/tool-leak.d.ts +26 -0
- package/esm/src/guardrails/tool-leak.js +45 -0
- package/esm/src/guardrails/tool-result.d.ts +45 -14
- package/esm/src/guardrails/tool-result.js +94 -70
- package/esm/src/guardrails/types.d.ts +79 -71
- package/esm/src/guardrails/types.js +11 -7
- package/esm/src/host/client-turn.d.ts +29 -2
- package/esm/src/host/client-turn.js +46 -4
- package/esm/src/host/mint-trace.d.ts +1 -0
- package/esm/src/host/mint-trace.js +3 -2
- package/esm/src/host/mod.d.ts +2 -2
- package/esm/src/host/mod.js +1 -1
- package/esm/src/host/readStreamingJsonStringField.js +2 -43
- package/esm/src/host/reply.d.ts +6 -0
- package/esm/src/host/reply.js +7 -1
- package/esm/src/interface/blocks.d.ts +3 -0
- package/esm/src/interface/blocks.js +84 -14
- package/esm/src/interface/composer-actions.d.ts +4 -0
- package/esm/src/interface/composer-actions.js +5 -3
- package/esm/src/interface/draft.d.ts +6 -0
- package/esm/src/interface/draft.js +22 -11
- package/esm/src/interface/from-profile.d.ts +13 -1
- package/esm/src/interface/from-profile.js +66 -31
- package/esm/src/interface/history.d.ts +9 -3
- package/esm/src/interface/history.js +33 -24
- package/esm/src/interface/inputs.d.ts +1 -0
- package/esm/src/interface/inputs.js +3 -0
- package/esm/src/interface/mod.d.ts +4 -2
- package/esm/src/interface/mod.js +3 -2
- package/esm/src/interface/models.d.ts +7 -0
- package/esm/src/interface/models.js +5 -0
- package/esm/src/interface/pending.d.ts +9 -0
- package/esm/src/interface/pending.js +9 -3
- package/esm/src/interface/profile-interface.js +54 -40
- package/esm/src/interface/session.d.ts +12 -5
- package/esm/src/interface/session.js +17 -10
- package/esm/src/interface/stop.d.ts +13 -0
- package/esm/src/interface/stop.js +28 -0
- package/esm/src/interface/tool-calls.d.ts +14 -2
- package/esm/src/interface/tool-calls.js +64 -10
- package/esm/src/interface/tool-invoke.d.ts +2 -0
- package/esm/src/interface/tool-invoke.js +3 -1
- package/esm/src/interface/tool-media.d.ts +2 -0
- package/esm/src/interface/tool-media.js +2 -1
- package/esm/src/interface/types.d.ts +105 -40
- package/esm/src/interface/types.js +1 -0
- package/esm/src/kernel/api-catalog.d.ts +85 -0
- package/esm/src/kernel/api-catalog.js +229 -0
- package/esm/src/kernel/auth/crypto.d.ts +7 -2
- package/esm/src/kernel/auth/crypto.js +12 -10
- package/esm/src/kernel/auth/oauth.d.ts +2 -1
- package/esm/src/kernel/auth/oauth.js +23 -22
- package/esm/src/kernel/auth/typed-secret.js +2 -2
- package/esm/src/kernel/auth/types.d.ts +13 -0
- package/esm/src/kernel/checkpoint.d.ts +43 -0
- package/esm/src/kernel/checkpoint.js +58 -0
- package/esm/src/kernel/default-scope.d.ts +43 -5
- package/esm/src/kernel/default-scope.js +54 -5
- package/esm/src/kernel/engine/call-trace.d.ts +19 -0
- package/esm/src/kernel/engine/call-trace.js +29 -0
- package/esm/src/kernel/engine/compaction.d.ts +6 -5
- package/esm/src/kernel/engine/compaction.js +12 -11
- package/esm/src/kernel/engine/decision.d.ts +10 -8
- package/esm/src/kernel/engine/decision.js +173 -146
- package/esm/src/kernel/engine/embedding.d.ts +8 -0
- package/esm/src/kernel/engine/embedding.js +118 -0
- package/esm/src/kernel/engine/live-inbound.d.ts +14 -4
- package/esm/src/kernel/engine/live-inbound.js +36 -11
- package/esm/src/kernel/engine/live-ingress.d.ts +6 -0
- package/esm/src/kernel/engine/live-ingress.js +6 -1
- package/esm/src/kernel/engine/repair.js +12 -12
- package/esm/src/kernel/engine/runner/gates.d.ts +2 -2
- package/esm/src/kernel/engine/runner/gates.js +287 -101
- package/esm/src/kernel/engine/runner/mod.d.ts +19 -5
- package/esm/src/kernel/engine/runner/mod.js +107 -56
- package/esm/src/kernel/engine/runner/nested.d.ts +32 -0
- package/esm/src/kernel/engine/runner/nested.js +134 -0
- package/esm/src/kernel/engine/runner/schema-validation.d.ts +24 -3
- package/esm/src/kernel/engine/runner/schema-validation.js +78 -4
- package/esm/src/kernel/engine/runner/stages.d.ts +1 -1
- package/esm/src/kernel/engine/runner/stages.js +1 -8
- package/esm/src/kernel/engine/runner/state.d.ts +33 -12
- package/esm/src/kernel/engine/runner/state.js +11 -1
- package/esm/src/kernel/engine/runner/step-order.d.ts +27 -0
- package/esm/src/kernel/engine/runner/step-order.js +165 -0
- package/esm/src/kernel/engine/runner/steps.d.ts +2 -2
- package/esm/src/kernel/engine/runner/steps.js +328 -169
- package/esm/src/kernel/engine/runner/stream.d.ts +42 -11
- package/esm/src/kernel/engine/runner/stream.js +197 -46
- package/esm/src/kernel/engine/runner/usage.d.ts +5 -5
- package/esm/src/kernel/engine/runner/usage.js +12 -14
- package/esm/src/kernel/engine/session/mod.d.ts +8 -6
- package/esm/src/kernel/engine/session/mod.js +360 -129
- package/esm/src/kernel/engine/session/session-trace.d.ts +10 -10
- package/esm/src/kernel/engine/session/session-trace.js +41 -30
- package/esm/src/kernel/engine/token-estimate.d.ts +10 -64
- package/esm/src/kernel/engine/token-estimate.js +14 -194
- package/esm/src/kernel/engine/tool-trace.d.ts +3 -3
- package/esm/src/kernel/engine/tool-trace.js +2 -1
- package/esm/src/kernel/engine/turn-trace.d.ts +8 -7
- package/esm/src/kernel/engine/turn-trace.js +28 -36
- package/esm/src/kernel/engine/usage.d.ts +6 -0
- package/esm/src/kernel/engine/usage.js +17 -0
- package/esm/src/kernel/interaction-parts.d.ts +3 -0
- package/esm/src/kernel/interaction-parts.js +18 -0
- package/esm/src/kernel/json.d.ts +10 -0
- package/esm/src/kernel/json.js +3 -0
- package/esm/src/kernel/mod.d.ts +38 -11
- package/esm/src/kernel/mod.js +22 -7
- package/esm/src/kernel/profile-graph.d.ts +11 -6
- package/esm/src/kernel/profile-graph.js +14 -7
- package/esm/src/kernel/profile-presence.d.ts +10 -1
- package/esm/src/kernel/profile-presence.js +90 -75
- package/esm/src/kernel/profile-scope.d.ts +7 -3
- package/esm/src/kernel/profile-scope.js +67 -55
- package/esm/src/kernel/protocols/binding.d.ts +65 -0
- package/esm/src/kernel/protocols/binding.js +125 -0
- package/esm/src/kernel/protocols/limits.d.ts +15 -0
- package/esm/src/kernel/protocols/limits.js +28 -0
- package/esm/src/kernel/protocols/mod.d.ts +5 -0
- package/esm/src/kernel/protocols/mod.js +5 -0
- package/esm/src/kernel/protocols/prices.d.ts +36 -0
- package/esm/src/kernel/protocols/prices.js +37 -0
- package/esm/src/kernel/protocols/protocol.d.ts +253 -0
- package/esm/src/kernel/protocols/protocol.js +253 -0
- package/esm/src/kernel/protocols/provider.d.ts +108 -0
- package/esm/src/kernel/protocols/provider.js +143 -0
- package/esm/src/kernel/protocols/runtime.d.ts +55 -0
- package/esm/src/kernel/protocols/runtime.js +534 -0
- package/esm/src/kernel/provider-budget.d.ts +32 -0
- package/esm/src/kernel/provider-budget.js +262 -0
- package/esm/src/kernel/provider-dispatch.d.ts +13 -0
- package/esm/src/kernel/provider-dispatch.js +36 -0
- package/esm/src/kernel/provider-live.d.ts +7 -0
- package/esm/src/kernel/provider-live.js +189 -0
- package/esm/src/kernel/provider-runtime.d.ts +57 -0
- package/esm/src/kernel/provider-runtime.js +524 -0
- package/esm/src/kernel/registry/attachments.d.ts +15 -4
- package/esm/src/kernel/registry/attachments.js +31 -22
- package/esm/src/kernel/registry/catalog.d.ts +6 -0
- package/esm/src/kernel/registry/catalog.js +9 -2
- package/esm/src/kernel/registry/embedding-rules.d.ts +28 -0
- package/esm/src/kernel/registry/embedding-rules.js +66 -0
- package/esm/src/kernel/registry/ingress.d.ts +6 -2
- package/esm/src/kernel/registry/ingress.js +55 -10
- package/esm/src/kernel/registry/kernel-registry.d.ts +3 -0
- package/esm/src/kernel/registry/kernel-registry.js +9 -2
- package/esm/src/kernel/registry/profile-outputs.js +4 -1
- package/esm/src/kernel/registry/profiles.d.ts +38 -14
- package/esm/src/kernel/registry/profiles.js +280 -205
- package/esm/src/kernel/registry/provider-request.d.ts +3 -3
- package/esm/src/kernel/registry/provider-request.js +5 -13
- package/esm/src/kernel/registry/resolve.d.ts +4 -1
- package/esm/src/kernel/registry/resolve.js +59 -58
- package/esm/src/kernel/registry/schemas.d.ts +3 -0
- package/esm/src/kernel/registry/schemas.js +3 -1
- package/esm/src/kernel/registry/slot-fill.d.ts +7 -0
- package/esm/src/kernel/registry/slot-fill.js +22 -0
- package/esm/src/kernel/registry/system-prompt.js +7 -8
- package/esm/src/kernel/registry/vault.d.ts +14 -13
- package/esm/src/kernel/registry/vault.js +1 -14
- package/esm/src/kernel/schema.d.ts +100 -46
- package/esm/src/kernel/schema.js +499 -257
- package/esm/src/kernel/scope.d.ts +12 -5
- package/esm/src/kernel/scope.js +23 -3
- package/esm/src/kernel/stages.d.ts +38 -3
- package/esm/src/kernel/stages.js +82 -39
- package/esm/src/kernel/stop.d.ts +29 -6
- package/esm/src/kernel/stop.js +16 -4
- package/esm/src/kernel/system-parts.js +6 -6
- package/esm/src/kernel/tools/activity-label.d.ts +12 -6
- package/esm/src/kernel/tools/activity-label.js +258 -32
- package/esm/src/kernel/tools/agent.d.ts +66 -0
- package/esm/src/kernel/tools/agent.js +212 -0
- package/esm/src/kernel/tools/coordinate.d.ts +4 -0
- package/esm/src/kernel/tools/coordinate.js +165 -0
- package/esm/src/kernel/tools/events.d.ts +21 -6
- package/esm/src/kernel/tools/events.js +53 -18
- package/esm/src/kernel/tools/execute.d.ts +47 -11
- package/esm/src/kernel/tools/execute.js +508 -136
- package/esm/src/kernel/tools/gate-answer.d.ts +12 -2
- package/esm/src/kernel/tools/gate-answer.js +17 -6
- package/esm/src/kernel/tools/handler-events.d.ts +45 -0
- package/esm/src/kernel/tools/handler-events.js +106 -0
- package/esm/src/kernel/tools/harness.d.ts +1 -0
- package/esm/src/kernel/tools/harness.js +2 -1
- package/esm/src/kernel/tools/http-limit.d.ts +27 -0
- package/esm/src/kernel/tools/http-limit.js +85 -0
- package/esm/src/kernel/tools/invoke.d.ts +27 -5
- package/esm/src/kernel/tools/invoke.js +223 -70
- package/esm/src/kernel/tools/mcp-sessions.d.ts +4 -1
- package/esm/src/kernel/tools/mcp-sessions.js +13 -8
- package/esm/src/kernel/tools/mod.d.ts +4 -3
- package/esm/src/kernel/tools/mod.js +3 -2
- package/esm/src/kernel/tools/model-text.d.ts +10 -5
- package/esm/src/kernel/tools/model-text.js +18 -12
- package/esm/src/kernel/tools/operation.d.ts +76 -0
- package/esm/src/kernel/tools/operation.js +100 -0
- package/esm/src/kernel/tools/page-answer.d.ts +8 -0
- package/esm/src/kernel/tools/page-answer.js +19 -0
- package/esm/src/kernel/tools/permission.d.ts +11 -2
- package/esm/src/kernel/tools/permission.js +12 -12
- package/esm/src/kernel/tools/project.d.ts +4 -1
- package/esm/src/kernel/tools/project.js +32 -2
- package/esm/src/kernel/tools/registry.d.ts +9 -2
- package/esm/src/kernel/tools/registry.js +69 -10
- package/esm/src/kernel/tools/remote.d.ts +40 -6
- package/esm/src/kernel/tools/remote.js +219 -92
- package/esm/src/kernel/tools/resolve.d.ts +3 -0
- package/esm/src/kernel/tools/resolve.js +12 -4
- package/esm/src/kernel/tools/run.d.ts +28 -0
- package/esm/src/kernel/tools/run.js +86 -0
- package/esm/src/kernel/tools/schema.d.ts +3 -3
- package/esm/src/kernel/tools/schema.js +21 -100
- package/esm/src/kernel/tools/signed-in-fetch.d.ts +2 -1
- package/esm/src/kernel/tools/signed-in-fetch.js +3 -3
- package/esm/src/kernel/tools/stage-run.d.ts +27 -4
- package/esm/src/kernel/tools/stage-run.js +75 -17
- package/esm/src/kernel/tools/types.d.ts +235 -25
- package/esm/src/kernel/tools/unchecked-output.d.ts +14 -0
- package/esm/src/kernel/tools/unchecked-output.js +18 -0
- package/esm/src/kernel/turn-events.d.ts +208 -31
- package/esm/src/kernel/turn-events.js +127 -9
- package/esm/src/kernel/types.d.ts +302 -161
- package/esm/src/kernel/util/base64.d.ts +2 -0
- package/esm/src/kernel/util/base64.js +2 -0
- package/esm/src/kernel/util/partial-json.d.ts +23 -0
- package/esm/src/kernel/util/partial-json.js +128 -0
- package/esm/src/kernel/util/record.d.ts +1 -0
- package/esm/src/kernel/util/record.js +1 -0
- package/esm/src/observability/destinations.d.ts +5 -0
- package/esm/src/observability/destinations.js +7 -2
- package/esm/src/observability/jsonl.d.ts +2 -2
- package/esm/src/observability/jsonl.js +15 -22
- package/esm/src/observability/mod.d.ts +3 -3
- package/esm/src/observability/mod.js +2 -2
- package/esm/src/observability/openinference.d.ts +1 -1
- package/esm/src/observability/openinference.js +3 -3
- package/esm/src/observability/otlp.d.ts +3 -0
- package/esm/src/observability/otlp.js +3 -3
- package/esm/src/observability/phoenix.d.ts +1 -0
- package/esm/src/observability/policy.d.ts +3 -0
- package/esm/src/observability/policy.js +5 -1
- package/esm/src/observability/resolve-policy.js +11 -5
- package/esm/src/observability/spans.d.ts +8 -2
- package/esm/src/observability/spans.js +21 -5
- package/esm/src/observability/trace-catalog.d.ts +19 -2
- package/esm/src/observability/trace-catalog.js +128 -87
- package/esm/src/observability/trace-record.js +22 -17
- package/esm/src/observability/trace-schema.d.ts +3 -0
- package/esm/src/observability/trace-schema.js +1 -1
- package/esm/src/observability/trace-sink.d.ts +1 -0
- package/esm/src/observability/trace-sink.js +1 -1
- package/esm/src/observability/trace-span.d.ts +7 -1
- package/esm/src/observability/trace-span.js +3 -1
- package/esm/src/observability/trace.d.ts +2 -0
- package/esm/src/observability/trace.js +4 -2
- package/esm/src/observability/types.d.ts +35 -11
- package/esm/src/observability/types.js +1 -1
- package/esm/src/presets/google/speech-voices.d.ts +1 -0
- package/esm/src/presets/google-limits.d.ts +1 -0
- package/esm/src/presets/google.d.ts +27 -12
- package/esm/src/presets/google.js +34 -25
- package/esm/src/presets/local.d.ts +26 -0
- package/esm/src/presets/local.js +30 -0
- package/esm/src/presets/mod.d.ts +5 -4
- package/esm/src/presets/mod.js +4 -4
- package/esm/src/presets/openrouter.d.ts +14 -1
- package/esm/src/presets/openrouter.js +19 -1
- package/esm/src/providers/embedding-limits.d.ts +7 -0
- package/esm/src/providers/embedding-limits.js +12 -0
- package/esm/src/providers/gemini/embedding-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/embedding-protocol.js +125 -0
- package/esm/src/providers/gemini/interactions-protocol.d.ts +8 -0
- package/esm/src/providers/gemini/interactions-protocol.js +105 -0
- package/esm/src/providers/gemini/live-protocol.d.ts +3 -0
- package/esm/src/providers/gemini/live-protocol.js +191 -0
- package/esm/src/providers/gemini/prices.d.ts +3 -0
- package/esm/src/providers/gemini/prices.js +63 -0
- package/esm/src/providers/gemini/provider.d.ts +7 -0
- package/esm/src/providers/gemini/provider.js +39 -0
- package/esm/src/providers/google/builtins.d.ts +14 -0
- package/esm/src/providers/google/builtins.js +57 -0
- package/esm/src/providers/google/grounding.d.ts +4 -4
- package/esm/src/providers/google/interactions/framing.d.ts +20 -8
- package/esm/src/providers/google/interactions/framing.js +85 -44
- package/esm/src/providers/google/interactions/steps.d.ts +5 -5
- package/esm/src/providers/google/interactions/steps.js +4 -4
- package/esm/src/providers/google/interactions/stream.d.ts +10 -11
- package/esm/src/providers/google/interactions/stream.js +33 -100
- package/esm/src/providers/google/live/framing.d.ts +15 -5
- package/esm/src/providers/google/live/framing.js +25 -25
- package/esm/src/providers/google/live/stream.d.ts +6 -44
- package/esm/src/providers/google/live/stream.js +3 -209
- package/esm/src/providers/google/urls.d.ts +1 -3
- package/esm/src/providers/google/urls.js +1 -3
- package/esm/src/providers/google/usage.js +2 -2
- package/esm/src/providers/live.d.ts +6 -0
- package/esm/src/providers/live.js +6 -0
- package/esm/src/providers/local/embedding-protocol.d.ts +7 -0
- package/esm/src/providers/local/embedding-protocol.js +60 -0
- package/esm/src/providers/local/provider.d.ts +7 -0
- package/esm/src/providers/local/provider.js +28 -0
- package/esm/src/providers/mod.d.ts +28 -7
- package/esm/src/providers/mod.js +19 -3
- package/esm/src/providers/open-ai/protocol.d.ts +3 -0
- package/esm/src/providers/open-ai/protocol.js +189 -0
- package/esm/src/providers/openrouter/embedding-protocol.d.ts +6 -0
- package/esm/src/providers/openrouter/embedding-protocol.js +86 -0
- package/esm/src/providers/openrouter/image.d.ts +0 -9
- package/esm/src/providers/openrouter/image.js +0 -153
- package/esm/src/providers/openrouter/images-protocol.d.ts +3 -0
- package/esm/src/providers/openrouter/images-protocol.js +82 -0
- package/esm/src/providers/openrouter/openai/compat.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/compat.js +6 -6
- package/esm/src/providers/openrouter/openai/image-payload.d.ts +2 -2
- package/esm/src/providers/openrouter/openai/reasoning-state.d.ts +2 -0
- package/esm/src/providers/openrouter/openai/reasoning-state.js +31 -0
- package/esm/src/providers/openrouter/protocol.d.ts +8 -0
- package/esm/src/providers/openrouter/protocol.js +171 -0
- package/esm/src/providers/openrouter/provider.d.ts +10 -0
- package/esm/src/providers/openrouter/provider.js +50 -0
- package/esm/src/providers/shared/carried-tool-files.d.ts +7 -0
- package/esm/src/providers/shared/carried-tool-files.js +43 -0
- package/esm/src/providers/shared/pcm.js +2 -2
- package/esm/src/providers/shared/protocol-events.d.ts +8 -0
- package/esm/src/providers/shared/protocol-events.js +20 -0
- package/esm/src/providers/shared/response-identity.d.ts +2 -2
- package/esm/src/providers/shared/retry.d.ts +17 -0
- package/esm/src/providers/shared/retry.js +90 -0
- package/esm/src/providers/shared/sse.d.ts +0 -4
- package/esm/src/providers/shared/sse.js +50 -36
- package/esm/src/providers/shared/tool-args.d.ts +6 -7
- package/esm/src/providers/shared/tool-args.js +10 -6
- package/esm/src/providers/shared/tool-draft.d.ts +16 -0
- package/esm/src/providers/shared/tool-draft.js +14 -0
- package/esm/src/providers/shared/upstream-tap.d.ts +2 -2
- package/esm/src/providers/shared/upstream-tape.js +1 -1
- package/esm/src/providers/system-one/protocol.d.ts +8 -0
- package/esm/src/providers/system-one/protocol.js +93 -0
- package/esm/src/providers/types.d.ts +48 -16
- package/esm/src/providers/types.js +2 -1
- package/esm/src/providers/typesafe/provider.d.ts +7 -0
- package/esm/src/providers/typesafe/provider.js +24 -0
- package/esm/src/surface/formats.d.ts +19 -1
- package/esm/src/surface/formats.js +68 -29
- package/esm/src/surface/mod.d.ts +4 -2
- package/esm/src/surface/mod.js +4 -2
- package/esm/src/surface/runtime.d.ts +4 -0
- package/esm/src/surface/runtime.js +2 -0
- package/esm/src/surface/tools.d.ts +2 -8
- package/esm/src/surface/tools.js +4 -22
- package/esm/src/surface/types.d.ts +6 -0
- package/package.json +5 -13
- package/esm/src/cli/commands/egress-compile.d.ts +0 -17
- package/esm/src/cli/commands/egress-compile.js +0 -25
- package/esm/src/guardrails/egress-policy.d.ts +0 -27
- package/esm/src/guardrails/egress-policy.js +0 -76
- package/esm/src/guardrails/egress-rules.d.ts +0 -54
- package/esm/src/guardrails/egress-rules.js +0 -49
- package/esm/src/guardrails/lexicon.d.ts +0 -30
- package/esm/src/guardrails/lexicon.js +0 -478
- package/esm/src/kernel/engine/media-probe/audio.d.ts +0 -7
- package/esm/src/kernel/engine/media-probe/audio.js +0 -342
- package/esm/src/kernel/engine/media-probe/bytes.d.ts +0 -6
- package/esm/src/kernel/engine/media-probe/bytes.js +0 -26
- package/esm/src/kernel/engine/media-probe/image.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/image.js +0 -171
- package/esm/src/kernel/engine/media-probe/iso-bmff.d.ts +0 -19
- package/esm/src/kernel/engine/media-probe/iso-bmff.js +0 -48
- package/esm/src/kernel/engine/media-probe/matroska.d.ts +0 -35
- package/esm/src/kernel/engine/media-probe/matroska.js +0 -226
- package/esm/src/kernel/engine/media-probe/mp4.d.ts +0 -22
- package/esm/src/kernel/engine/media-probe/mp4.js +0 -279
- package/esm/src/kernel/engine/media-probe/opus.d.ts +0 -4
- package/esm/src/kernel/engine/media-probe/opus.js +0 -23
- package/esm/src/kernel/engine/media-probe/pdf.d.ts +0 -5
- package/esm/src/kernel/engine/media-probe/pdf.js +0 -117
- package/esm/src/kernel/engine/media-probe/video.d.ts +0 -15
- package/esm/src/kernel/engine/media-probe/video.js +0 -49
- package/esm/src/presets/typesafe.d.ts +0 -2
- package/esm/src/presets/typesafe.js +0 -2
- package/esm/src/providers/create-provider.d.ts +0 -21
- package/esm/src/providers/create-provider.js +0 -90
- package/esm/src/providers/decision/usage.d.ts +0 -3
- package/esm/src/providers/decision/usage.js +0 -25
- package/esm/src/providers/google/interactions/mod.d.ts +0 -2
- package/esm/src/providers/google/interactions/mod.js +0 -2
- package/esm/src/providers/google/keys.d.ts +0 -20
- package/esm/src/providers/google/keys.js +0 -87
- package/esm/src/providers/google/live/mod.d.ts +0 -7
- package/esm/src/providers/google/live/mod.js +0 -7
- package/esm/src/providers/google/live/openapi-schema.d.ts +0 -1
- package/esm/src/providers/google/live/openapi-schema.js +0 -42
- package/esm/src/providers/google/live/session.d.ts +0 -14
- package/esm/src/providers/google/live/session.js +0 -150
- package/esm/src/providers/local/local.d.ts +0 -12
- package/esm/src/providers/local/local.js +0 -186
- package/esm/src/providers/local/mod.d.ts +0 -8
- package/esm/src/providers/local/mod.js +0 -8
- package/esm/src/providers/openrouter/cache-control.d.ts +0 -5
- package/esm/src/providers/openrouter/cache-control.js +0 -4
- package/esm/src/providers/openrouter/chat.d.ts +0 -64
- package/esm/src/providers/openrouter/chat.js +0 -490
- package/esm/src/providers/openrouter/openai/sdk-messages.d.ts +0 -10
- package/esm/src/providers/openrouter/openai/sdk-messages.js +0 -99
- package/esm/src/providers/openrouter/resolve-api-key.d.ts +0 -3
- package/esm/src/providers/openrouter/resolve-api-key.js +0 -8
- package/esm/src/providers/openrouter/speech.d.ts +0 -18
- package/esm/src/providers/openrouter/speech.js +0 -109
- package/esm/src/providers/probe.d.ts +0 -5
- package/esm/src/providers/probe.js +0 -15
- package/esm/src/providers/shared/builtin-wire.d.ts +0 -4
- package/esm/src/providers/shared/builtin-wire.js +0 -9
- package/esm/src/providers/shared/vault.d.ts +0 -13
- package/esm/src/providers/shared/vault.js +0 -41
|
@@ -1,20 +1,27 @@
|
|
|
1
1
|
import type { TraceSink } from '../observability/trace-sink.js';
|
|
2
2
|
import { type RunDecisionOptions } from './engine/decision.js';
|
|
3
|
+
import { type RunEmbeddingOptions } from './engine/embedding.js';
|
|
3
4
|
import { type RunSessionOptions } from './engine/session/mod.js';
|
|
5
|
+
import type { ProviderHostOptions } from './protocols/runtime.js';
|
|
4
6
|
import { type KernelRegistry } from './registry/kernel-registry.js';
|
|
5
7
|
import { resolveTurnInRegistry } from './registry/resolve.js';
|
|
6
|
-
import type
|
|
7
|
-
import type {
|
|
8
|
+
import { type ToolCallResult, type ToolStepCallResult } from './tools/run.js';
|
|
9
|
+
import type { InvokeToolRequest, InvokeToolStepRequest } from './tools/types.js';
|
|
10
|
+
import type { CompactHistoryRequest, CompactionResult, DecisionRequest, DecisionResult, EmbeddingRequest, EmbeddingResult, LiveSession, ProjectedProfile, SessionRequest, TurnEvent, TurnRequest } from './types.js';
|
|
11
|
+
/** A kernel scope: its registries and the operations that run against them (turns, live sessions, history compaction, tool invocation, turn resolution, profile projection, and decisions). */
|
|
8
12
|
interface KernelScope extends KernelRegistry {
|
|
9
|
-
runTurn(req: TurnRequest,
|
|
13
|
+
runTurn(req: TurnRequest, options?: ProviderHostOptions, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
|
|
10
14
|
runSession(req: SessionRequest, options: RunSessionOptions, sinkOverride?: TraceSink): Promise<LiveSession>;
|
|
11
|
-
compactHistory(req: CompactHistoryRequest,
|
|
15
|
+
compactHistory(req: CompactHistoryRequest, options?: ProviderHostOptions, sinkOverride?: TraceSink): Promise<CompactionResult | undefined>;
|
|
12
16
|
invokeTool(request: InvokeToolRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
|
|
17
|
+
invokeToolStep(request: InvokeToolStepRequest, sinkOverride?: TraceSink): AsyncGenerator<TurnEvent>;
|
|
18
|
+
runTool(request: InvokeToolRequest, sinkOverride?: TraceSink): Promise<ToolCallResult>;
|
|
19
|
+
runToolStep(request: InvokeToolStepRequest, sinkOverride?: TraceSink): AsyncGenerator<ToolStepCallResult>;
|
|
13
20
|
resolveTurn(req: TurnRequest): ReturnType<typeof resolveTurnInRegistry>;
|
|
14
21
|
projectProfile(id: string): ProjectedProfile;
|
|
15
22
|
runDecision(request: DecisionRequest, options: RunDecisionOptions): Promise<DecisionResult>;
|
|
23
|
+
runEmbedding(request: EmbeddingRequest, options?: RunEmbeddingOptions): Promise<EmbeddingResult>;
|
|
16
24
|
}
|
|
17
|
-
/** Isolated from every other scope: a host that registers per request gives each its own. */
|
|
18
25
|
declare function createKernelScope(): KernelScope;
|
|
19
26
|
/** The process-wide scope behind the package's global API. */
|
|
20
27
|
declare const defaultKernelScope: KernelScope;
|
package/esm/src/kernel/scope.js
CHANGED
|
@@ -1,23 +1,43 @@
|
|
|
1
1
|
import { runDecisionInRegistry } from './engine/decision.js';
|
|
2
|
+
import { runEmbeddingInRegistry } from './engine/embedding.js';
|
|
2
3
|
import { compactHistoryInRegistry, runTurnInRegistry } from './engine/runner/mod.js';
|
|
3
4
|
import { runSessionInRegistry } from './engine/session/mod.js';
|
|
5
|
+
import { resolveRegisteredTurnModel } from './provider-dispatch.js';
|
|
4
6
|
import { createKernelRegistry } from './registry/kernel-registry.js';
|
|
5
7
|
import { projectProfileInRegistry, resolveTurnInRegistry } from './registry/resolve.js';
|
|
6
|
-
import { invokeTool } from './tools/invoke.js';
|
|
8
|
+
import { invokeTool, invokeToolStep, startInvoke, startInvokeStep } from './tools/invoke.js';
|
|
9
|
+
import { settledCall, settledCalls, } from './tools/run.js';
|
|
7
10
|
/** Isolated from every other scope: a host that registers per request gives each its own. */
|
|
11
|
+
function selectedTurnProvider(registry, req, options) {
|
|
12
|
+
try {
|
|
13
|
+
return resolveRegisteredTurnModel(registry, req.profile, req.model, options, req);
|
|
14
|
+
}
|
|
15
|
+
catch (error) {
|
|
16
|
+
return {
|
|
17
|
+
complete() {
|
|
18
|
+
throw error;
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
}
|
|
8
23
|
function createKernelScope() {
|
|
9
24
|
const registry = createKernelRegistry();
|
|
10
25
|
return {
|
|
26
|
+
providers: registry.providers,
|
|
11
27
|
tools: registry.tools,
|
|
12
28
|
profiles: registry.profiles,
|
|
13
29
|
schemas: registry.schemas,
|
|
14
|
-
runTurn: (req,
|
|
30
|
+
runTurn: (req, options = {}, sinkOverride) => runTurnInRegistry(registry, req, selectedTurnProvider(registry, req, options), sinkOverride),
|
|
15
31
|
runSession: (req, options, sinkOverride) => runSessionInRegistry(registry, req, options, sinkOverride),
|
|
16
|
-
compactHistory: (req,
|
|
32
|
+
compactHistory: (req, options = {}, sinkOverride) => compactHistoryInRegistry(registry, req, resolveRegisteredTurnModel(registry, req.profile, req.model, options), sinkOverride),
|
|
17
33
|
invokeTool: (request, sinkOverride) => invokeTool(registry, request, sinkOverride),
|
|
34
|
+
invokeToolStep: (request, sinkOverride) => invokeToolStep(registry, request, sinkOverride),
|
|
35
|
+
runTool: (request, sinkOverride) => settledCall(startInvoke(registry, request, sinkOverride)),
|
|
36
|
+
runToolStep: (request, sinkOverride) => settledCalls(startInvokeStep(registry, request, sinkOverride)),
|
|
18
37
|
resolveTurn: (req) => resolveTurnInRegistry(registry, req),
|
|
19
38
|
projectProfile: (id) => projectProfileInRegistry(registry, id),
|
|
20
39
|
runDecision: (request, options) => runDecisionInRegistry(registry, request, options),
|
|
40
|
+
runEmbedding: (request, options = {}) => runEmbeddingInRegistry(registry, request, options),
|
|
21
41
|
};
|
|
22
42
|
}
|
|
23
43
|
/** The process-wide scope behind the package's global API. */
|
|
@@ -2,25 +2,43 @@ import type { SpanHandle } from '../observability/trace-span.js';
|
|
|
2
2
|
import type { StageApplyWarningCode, TurnStage } from './schema.js';
|
|
3
3
|
import type { TurnStop } from './stop.js';
|
|
4
4
|
import type { ModelToolResult, ToolFailure, ToolGate } from './tools/types.js';
|
|
5
|
-
import {
|
|
5
|
+
import type { AwaitingUserInput, StageApplyWarning, TurnEventOf } from './turn-events.js';
|
|
6
6
|
import type { Profile, TurnEvent, TurnHistoryMessage } from './types.js';
|
|
7
7
|
export type { AwaitingUserInput, ToolGate };
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* What a stage handler can ask for: inject messages, abort, deny a tool call, ask for
|
|
10
|
+
* confirmation, mutate it, label it failed, or have it wait for other calls in its step.
|
|
11
|
+
*/
|
|
12
|
+
export declare const STAGE_AFFORDANCES: readonly ["inject", "abort", "deny", "confirm", "mutate", "labelFailed", "waitFor"];
|
|
13
|
+
/** One of {@linkcode STAGE_AFFORDANCES}. */
|
|
9
14
|
export type StageAffordance = (typeof STAGE_AFFORDANCES)[number];
|
|
10
15
|
/** Inject still needs the inject gate at apply time. Empty = observe only. */
|
|
11
16
|
export declare const STAGE_AFFORDANCE_MATRIX: Readonly<Record<TurnStage, readonly StageAffordance[]>>;
|
|
17
|
+
/** A call the model made in this step, as the host was shown it. */
|
|
18
|
+
export interface StepCall {
|
|
19
|
+
callId: string;
|
|
20
|
+
tool: string;
|
|
21
|
+
input: unknown;
|
|
22
|
+
}
|
|
12
23
|
export type StageCallBag = {
|
|
13
24
|
callId?: string;
|
|
14
25
|
tool?: string;
|
|
15
26
|
input?: unknown;
|
|
27
|
+
/** `pre_tool` in a turn's step: every call the model made in the step, in the order it made them. */
|
|
28
|
+
stepCalls?: readonly StepCall[];
|
|
16
29
|
callNotStarted?: boolean;
|
|
17
30
|
outputRaw?: unknown;
|
|
18
31
|
outputModel?: ModelToolResult;
|
|
32
|
+
/** `post_tool`: the tool's past activity label, filled from the input and `outputRaw`. */
|
|
33
|
+
activityPast?: string;
|
|
34
|
+
/** `post_tool`: the tool's failed activity label, filled from the input. */
|
|
35
|
+
activityFailed?: string;
|
|
19
36
|
failure?: ToolFailure;
|
|
20
37
|
awaiting?: boolean;
|
|
21
38
|
stop?: TurnStop;
|
|
22
39
|
gate?: ToolGate;
|
|
23
40
|
};
|
|
41
|
+
/** What a stage handler is given: the stage, the step, and what has happened so far. */
|
|
24
42
|
export interface StageContext extends StageCallBag {
|
|
25
43
|
stage: TurnStage;
|
|
26
44
|
/** 1-based provider step (text) or utterance cycle index (live). */
|
|
@@ -29,6 +47,7 @@ export interface StageContext extends StageCallBag {
|
|
|
29
47
|
/** Opaque host slot — never traced or client-forwarded by the kernel. */
|
|
30
48
|
host?: unknown;
|
|
31
49
|
}
|
|
50
|
+
/** What a stage handler returns: what it asks the turn to do. */
|
|
32
51
|
export interface StageResult {
|
|
33
52
|
inject?: TurnHistoryMessage[];
|
|
34
53
|
/**
|
|
@@ -50,14 +69,27 @@ export interface StageResult {
|
|
|
50
69
|
};
|
|
51
70
|
/** `pre_tool`: replace the call input. `post_tool`: replace the raw output. Both re-validate. */
|
|
52
71
|
mutate?: StageMutate;
|
|
72
|
+
/**
|
|
73
|
+
* `post_tool` only: the call completed, but show its failed label (`activityFailed`) on the
|
|
74
|
+
* terminal `tool` event. The result and the phase stay as they are.
|
|
75
|
+
*/
|
|
76
|
+
labelFailed?: true;
|
|
77
|
+
/**
|
|
78
|
+
* `pre_tool` only: the call ids in `stepCalls` whose calls must settle before this call's body
|
|
79
|
+
* starts. A call held for confirmation is held at once and does not wait.
|
|
80
|
+
*/
|
|
81
|
+
waitFor?: string[];
|
|
53
82
|
}
|
|
83
|
+
/** A rewrite of a tool call's input or output. */
|
|
54
84
|
export type StageMutate = {
|
|
55
85
|
input: unknown;
|
|
56
86
|
} | {
|
|
57
87
|
output: unknown;
|
|
58
88
|
};
|
|
89
|
+
/** A host function the turn calls at each stage. */
|
|
59
90
|
export type StageHandler = (ctx: StageContext) => StageResult | undefined | Promise<StageResult | undefined>;
|
|
60
91
|
export type { StageApplyWarning, StageApplyWarningCode };
|
|
92
|
+
/** A stage handler's result and the stage it came from, to be applied. */
|
|
61
93
|
export interface StageApplyInput {
|
|
62
94
|
stage: TurnStage;
|
|
63
95
|
result: unknown;
|
|
@@ -74,6 +106,7 @@ export interface InjectUnit {
|
|
|
74
106
|
id?: string;
|
|
75
107
|
messages: TurnHistoryMessage[];
|
|
76
108
|
}
|
|
109
|
+
/** A stage handler's result after validation: the parts the turn will act on. */
|
|
77
110
|
export interface StageApplyOutput {
|
|
78
111
|
inject?: InjectUnit;
|
|
79
112
|
abort?: boolean | {
|
|
@@ -87,13 +120,15 @@ export interface StageApplyOutput {
|
|
|
87
120
|
summary?: string;
|
|
88
121
|
};
|
|
89
122
|
mutate?: StageMutate;
|
|
123
|
+
labelFailed?: true;
|
|
124
|
+
waitFor?: string[];
|
|
90
125
|
warnings: StageApplyWarning[];
|
|
91
126
|
}
|
|
92
127
|
/** True when the affordance is physically allowed at `stage` (ignores inject gate). */
|
|
93
128
|
export declare function stageAllowsAffordance(stage: TurnStage, affordance: StageAffordance): boolean;
|
|
94
|
-
export declare function isAwaitingUserInput(output: unknown): output is AwaitingUserInput;
|
|
95
129
|
/** Never throws: invalid fields become warnings and are dropped. */
|
|
96
130
|
export declare function applyStageResult(input: StageApplyInput): StageApplyOutput;
|
|
131
|
+
/** What a `stage` event records beside the stage: the tool call, its gate, and any injected messages. */
|
|
97
132
|
export type StageEventExtra = {
|
|
98
133
|
callId?: string;
|
|
99
134
|
toolName?: string;
|
package/esm/src/kernel/stages.js
CHANGED
|
@@ -1,16 +1,28 @@
|
|
|
1
|
+
import { boundaryReader, detectEvent } from '../guardrails/detect-at.js';
|
|
1
2
|
import { throwIfAborted } from '../guardrails/error.js';
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import { sanitizeHistory } from '../guardrails/sanitize.js';
|
|
3
|
+
import { guardrailTurnEvent } from '../guardrails/events.js';
|
|
4
|
+
import { resolveGuardrailPolicy } from '../guardrails/policy.js';
|
|
5
|
+
import { requestRefused, sanitizeHistory } from '../guardrails/sanitize.js';
|
|
5
6
|
import { guardrailAttributes } from './engine/turn-trace.js';
|
|
6
|
-
import { awaitingUserInputSchema, } from './turn-events.js';
|
|
7
7
|
import { isRecord } from './util/record.js';
|
|
8
|
-
|
|
8
|
+
/**
|
|
9
|
+
* What a stage handler can ask for: inject messages, abort, deny a tool call, ask for
|
|
10
|
+
* confirmation, mutate it, label it failed, or have it wait for other calls in its step.
|
|
11
|
+
*/
|
|
12
|
+
export const STAGE_AFFORDANCES = [
|
|
13
|
+
'inject',
|
|
14
|
+
'abort',
|
|
15
|
+
'deny',
|
|
16
|
+
'confirm',
|
|
17
|
+
'mutate',
|
|
18
|
+
'labelFailed',
|
|
19
|
+
'waitFor',
|
|
20
|
+
];
|
|
9
21
|
/** Inject still needs the inject gate at apply time. Empty = observe only. */
|
|
10
22
|
export const STAGE_AFFORDANCE_MATRIX = Object.freeze({
|
|
11
23
|
pre_turn: Object.freeze(['inject', 'abort']),
|
|
12
|
-
pre_tool: Object.freeze(['abort', 'deny', 'confirm', 'mutate']),
|
|
13
|
-
post_tool: Object.freeze(['inject', 'abort', 'deny', 'mutate']),
|
|
24
|
+
pre_tool: Object.freeze(['abort', 'deny', 'confirm', 'mutate', 'waitFor']),
|
|
25
|
+
post_tool: Object.freeze(['inject', 'abort', 'deny', 'mutate', 'labelFailed']),
|
|
14
26
|
before_end: Object.freeze(['inject', 'abort']),
|
|
15
27
|
post_turn: Object.freeze([]),
|
|
16
28
|
});
|
|
@@ -22,13 +34,10 @@ export function stageAllowsAffordance(stage, affordance) {
|
|
|
22
34
|
function warn(warnings, code, field, message) {
|
|
23
35
|
warnings.push({ code, field, message });
|
|
24
36
|
}
|
|
25
|
-
export function isAwaitingUserInput(output) {
|
|
26
|
-
return awaitingUserInputSchema.safeParse(output).success;
|
|
27
|
-
}
|
|
28
37
|
/** Drops unknown keys and rejects `role: 'tool'`; sanitizeHistory runs at the inject site. */
|
|
29
38
|
function coerceInjectMessage(item, warnings) {
|
|
30
39
|
if (!isRecord(item)) {
|
|
31
|
-
warn(warnings, 'inject_invalid_messages', 'inject', 'inject entry must be an object'); //
|
|
40
|
+
warn(warnings, 'inject_invalid_messages', 'inject', 'inject entry must be an object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
32
41
|
return undefined;
|
|
33
42
|
}
|
|
34
43
|
if (item.role === 'tool') {
|
|
@@ -63,14 +72,14 @@ function coerceInjectMessage(item, warnings) {
|
|
|
63
72
|
}
|
|
64
73
|
if (item.name !== undefined) {
|
|
65
74
|
if (typeof item.name !== 'string') {
|
|
66
|
-
warn(warnings, 'inject_invalid_messages', 'inject', 'inject name must be a string'); //
|
|
75
|
+
warn(warnings, 'inject_invalid_messages', 'inject', 'inject name must be a string'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
67
76
|
return undefined;
|
|
68
77
|
}
|
|
69
78
|
msg.name = item.name;
|
|
70
79
|
}
|
|
71
80
|
if (item.metadata !== undefined) {
|
|
72
81
|
if (!isRecord(item.metadata)) {
|
|
73
|
-
warn(warnings, 'inject_invalid_messages', 'inject', 'inject metadata must be a plain object'); //
|
|
82
|
+
warn(warnings, 'inject_invalid_messages', 'inject', 'inject metadata must be a plain object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
74
83
|
return undefined;
|
|
75
84
|
}
|
|
76
85
|
msg.metadata = { ...item.metadata };
|
|
@@ -109,7 +118,7 @@ function injectUnit(result, warnings) {
|
|
|
109
118
|
function applyInjectField(result, input, out) {
|
|
110
119
|
if (!('inject' in result) || result.inject === undefined) {
|
|
111
120
|
if (result.injectId !== undefined) {
|
|
112
|
-
warn(out.warnings, 'inject_id_invalid', 'injectId', 'injectId without inject ignored'); //
|
|
121
|
+
warn(out.warnings, 'inject_id_invalid', 'injectId', 'injectId without inject ignored'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
113
122
|
}
|
|
114
123
|
return;
|
|
115
124
|
}
|
|
@@ -133,7 +142,7 @@ function applyAbortField(result, stage, out) {
|
|
|
133
142
|
if (!('abort' in result) || result.abort === undefined)
|
|
134
143
|
return;
|
|
135
144
|
if (!stageAllowsAffordance(stage, 'abort')) {
|
|
136
|
-
warn(out.warnings, 'affordance_not_allowed', 'abort', 'abort is not allowed at post_turn'); //
|
|
145
|
+
warn(out.warnings, 'affordance_not_allowed', 'abort', 'abort is not allowed at post_turn'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
137
146
|
}
|
|
138
147
|
else if (result.abort === true) {
|
|
139
148
|
out.abort = true;
|
|
@@ -145,17 +154,17 @@ function applyAbortField(result, stage, out) {
|
|
|
145
154
|
out.abort = reason ? { reason } : true;
|
|
146
155
|
}
|
|
147
156
|
else if (result.abort !== false) {
|
|
148
|
-
warn(out.warnings, 'abort_invalid', 'abort', 'abort must be boolean or { reason?: string }'); //
|
|
157
|
+
warn(out.warnings, 'abort_invalid', 'abort', 'abort must be boolean or { reason?: string }'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
149
158
|
}
|
|
150
159
|
}
|
|
151
160
|
function applyDenyField(result, stage, out) {
|
|
152
161
|
if (!('deny' in result) || result.deny === undefined)
|
|
153
162
|
return;
|
|
154
163
|
if (!stageAllowsAffordance(stage, 'deny')) {
|
|
155
|
-
warn(out.warnings, 'affordance_not_allowed', 'deny', `deny is not allowed at stage ${stage}`); //
|
|
164
|
+
warn(out.warnings, 'affordance_not_allowed', 'deny', `deny is not allowed at stage ${stage}`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
156
165
|
}
|
|
157
166
|
else if (!isRecord(result.deny)) {
|
|
158
|
-
warn(out.warnings, 'deny_invalid', 'deny', 'deny must be an object'); //
|
|
167
|
+
warn(out.warnings, 'deny_invalid', 'deny', 'deny must be an object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
159
168
|
}
|
|
160
169
|
else {
|
|
161
170
|
const code = typeof result.deny.code === 'string' && result.deny.code.trim()
|
|
@@ -163,10 +172,23 @@ function applyDenyField(result, stage, out) {
|
|
|
163
172
|
: 'not_authorized';
|
|
164
173
|
const message = typeof result.deny.message === 'string' && result.deny.message.trim()
|
|
165
174
|
? result.deny.message.trim()
|
|
166
|
-
: 'Tool execution not authorized'; //
|
|
175
|
+
: 'Tool execution not authorized'; // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
167
176
|
out.deny = { code, message };
|
|
168
177
|
}
|
|
169
178
|
}
|
|
179
|
+
function applyLabelFailedField(result, stage, out) {
|
|
180
|
+
if (!('labelFailed' in result) || result.labelFailed === undefined)
|
|
181
|
+
return;
|
|
182
|
+
if (!stageAllowsAffordance(stage, 'labelFailed')) {
|
|
183
|
+
warn(out.warnings, 'affordance_not_allowed', 'labelFailed', `labelFailed is not allowed at stage ${stage}`);
|
|
184
|
+
}
|
|
185
|
+
else if (result.labelFailed === true) {
|
|
186
|
+
out.labelFailed = true;
|
|
187
|
+
}
|
|
188
|
+
else if (result.labelFailed !== false) {
|
|
189
|
+
warn(out.warnings, 'label_failed_invalid', 'labelFailed', 'labelFailed must be true'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
190
|
+
}
|
|
191
|
+
}
|
|
170
192
|
function applyConfirmField(result, stage, out) {
|
|
171
193
|
if (!('confirm' in result) || result.confirm === undefined)
|
|
172
194
|
return;
|
|
@@ -186,6 +208,20 @@ function applyConfirmField(result, stage, out) {
|
|
|
186
208
|
warn(out.warnings, 'confirm_invalid', 'confirm', 'confirm must be true or { summary?: string }');
|
|
187
209
|
}
|
|
188
210
|
}
|
|
211
|
+
function applyWaitForField(result, stage, out) {
|
|
212
|
+
if (!('waitFor' in result) || result.waitFor === undefined)
|
|
213
|
+
return;
|
|
214
|
+
if (!stageAllowsAffordance(stage, 'waitFor')) {
|
|
215
|
+
warn(out.warnings, 'affordance_not_allowed', 'waitFor', `waitFor is not allowed at stage ${stage}`);
|
|
216
|
+
}
|
|
217
|
+
else if (!Array.isArray(result.waitFor) ||
|
|
218
|
+
!result.waitFor.every((id) => typeof id === 'string' && id.trim() !== '')) {
|
|
219
|
+
warn(out.warnings, 'wait_for_invalid', 'waitFor', 'waitFor must be an array of call ids');
|
|
220
|
+
}
|
|
221
|
+
else if (result.waitFor.length > 0) {
|
|
222
|
+
out.waitFor = [...new Set(result.waitFor)];
|
|
223
|
+
}
|
|
224
|
+
}
|
|
189
225
|
const MUTATE_SUBJECT = { pre_tool: 'input', post_tool: 'output' };
|
|
190
226
|
function mutateSubject(stage) {
|
|
191
227
|
return stage in MUTATE_SUBJECT ? MUTATE_SUBJECT[stage] : undefined;
|
|
@@ -200,21 +236,21 @@ function applyMutateField(result, input, out) {
|
|
|
200
236
|
}
|
|
201
237
|
const subject = mutateSubject(stage);
|
|
202
238
|
if (!subject) {
|
|
203
|
-
// Matrix allows mutate but no subject is mapped: a kernel drift, surfaced not swallowed.
|
|
239
|
+
// why: Matrix allows mutate but no subject is mapped: a kernel drift, surfaced not swallowed.
|
|
204
240
|
warn(out.warnings, 'mutate_invalid', 'mutate',
|
|
205
|
-
//
|
|
241
|
+
// labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
206
242
|
`no mutate subject is defined at stage ${stage}`);
|
|
207
243
|
return;
|
|
208
244
|
}
|
|
209
245
|
if (!isRecord(result.mutate) || result.mutate[subject] === undefined) {
|
|
210
246
|
warn(out.warnings, 'mutate_invalid', 'mutate',
|
|
211
|
-
//
|
|
247
|
+
// labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
212
248
|
`mutate must be { ${subject}: unknown } at stage ${stage}`);
|
|
213
249
|
return;
|
|
214
250
|
}
|
|
215
251
|
if (input.mutable === false) {
|
|
216
252
|
warn(out.warnings, 'mutate_invalid', 'mutate',
|
|
217
|
-
//
|
|
253
|
+
// labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
218
254
|
`there is no ${subject} to replace at this ${stage} fire`);
|
|
219
255
|
return;
|
|
220
256
|
}
|
|
@@ -229,12 +265,12 @@ export function applyStageResult(input) {
|
|
|
229
265
|
if (result == null)
|
|
230
266
|
return out;
|
|
231
267
|
if (!isRecord(result)) {
|
|
232
|
-
warn(warnings, 'result_invalid', 'result', 'StageResult must be a plain object'); //
|
|
268
|
+
warn(warnings, 'result_invalid', 'result', 'StageResult must be a plain object'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
233
269
|
return out;
|
|
234
270
|
}
|
|
235
271
|
for (const key of Object.keys(result)) {
|
|
236
272
|
if (!STAGE_RESULT_KEYS.has(key)) {
|
|
237
|
-
warn(warnings, 'unknown_field', key, `unknown StageResult field "${key}" ignored`); //
|
|
273
|
+
warn(warnings, 'unknown_field', key, `unknown StageResult field "${key}" ignored`); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
238
274
|
}
|
|
239
275
|
}
|
|
240
276
|
applyInjectField(result, input, out);
|
|
@@ -242,9 +278,10 @@ export function applyStageResult(input) {
|
|
|
242
278
|
applyDenyField(result, stage, out);
|
|
243
279
|
applyConfirmField(result, stage, out);
|
|
244
280
|
applyMutateField(result, input, out);
|
|
245
|
-
|
|
281
|
+
applyLabelFailedField(result, stage, out);
|
|
282
|
+
applyWaitForField(result, stage, out);
|
|
246
283
|
if (out.deny && out.confirm) {
|
|
247
|
-
warn(warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); //
|
|
284
|
+
warn(warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
248
285
|
delete out.confirm;
|
|
249
286
|
}
|
|
250
287
|
return out;
|
|
@@ -294,8 +331,8 @@ function appliedAffordance(applied, key) {
|
|
|
294
331
|
}
|
|
295
332
|
/**
|
|
296
333
|
* Merge per-handler applied outputs in call order. Later scalars win, `inject`
|
|
297
|
-
* lists concatenate, warnings accumulate. `deny` beats `confirm`
|
|
298
|
-
* exactly as it does within one return.
|
|
334
|
+
* lists concatenate, `waitFor` ids join, warnings accumulate. `deny` beats `confirm`
|
|
335
|
+
* across handlers exactly as it does within one return.
|
|
299
336
|
*/
|
|
300
337
|
function mergeApplied(parts) {
|
|
301
338
|
const out = { warnings: parts.flatMap((part) => part.warnings), inject: [] };
|
|
@@ -308,11 +345,15 @@ function mergeApplied(parts) {
|
|
|
308
345
|
out.confirm = part.confirm;
|
|
309
346
|
if (part.mutate)
|
|
310
347
|
out.mutate = part.mutate;
|
|
348
|
+
if (part.labelFailed)
|
|
349
|
+
out.labelFailed = true;
|
|
350
|
+
if (part.waitFor)
|
|
351
|
+
out.waitFor = [...new Set([...(out.waitFor ?? []), ...part.waitFor])];
|
|
311
352
|
if (part.inject)
|
|
312
353
|
out.inject.push(part.inject);
|
|
313
354
|
}
|
|
314
355
|
if (out.deny && out.confirm) {
|
|
315
|
-
warn(out.warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); //
|
|
356
|
+
warn(out.warnings, 'confirm_invalid', 'confirm', 'confirm ignored because deny is set'); // labels-exempt: developer contract / internal diagnostic — not end-user or model copy (P2)
|
|
316
357
|
delete out.confirm;
|
|
317
358
|
}
|
|
318
359
|
return out;
|
|
@@ -342,7 +383,7 @@ async function applyHandlers(handlers, ctx, apply, signal) {
|
|
|
342
383
|
export async function* runStage(args) {
|
|
343
384
|
const { stage, step, history, handlers, guardrails, injectAllowed, injectWouldExceedMaxSteps, mutable, host, signal, span, ...bag } = args;
|
|
344
385
|
throwIfAborted(signal);
|
|
345
|
-
// Stream stage events stay lean (no outputRaw/failure). Hosts read those on
|
|
386
|
+
// why: Stream stage events stay lean (no outputRaw/failure). Hosts read those on
|
|
346
387
|
// StageContext via onStage; tool failures also ride tool events.
|
|
347
388
|
yield stageEventFields(stage, {
|
|
348
389
|
callId: bag.callId,
|
|
@@ -373,16 +414,18 @@ export async function* runStage(args) {
|
|
|
373
414
|
}
|
|
374
415
|
if (applied.inject.length === 0)
|
|
375
416
|
return applied;
|
|
376
|
-
const
|
|
377
|
-
const detection = detectionForTrust(resolveGuardrailPolicy(guardrails), 'untrusted');
|
|
417
|
+
const reader = boundaryReader('injected', resolveGuardrailPolicy(guardrails).detect);
|
|
378
418
|
const sanitized = applied.inject.map((unit) => ({
|
|
379
419
|
...unit,
|
|
380
|
-
messages: sanitizeHistory(unit.messages,
|
|
420
|
+
messages: sanitizeHistory(unit.messages, reader),
|
|
381
421
|
}));
|
|
382
|
-
const
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
yield
|
|
422
|
+
const found = reader.found();
|
|
423
|
+
const event = detectEvent('injected', found);
|
|
424
|
+
if (event) {
|
|
425
|
+
span?.event('theorem.guardrail', guardrailAttributes(event));
|
|
426
|
+
yield guardrailTurnEvent(event);
|
|
427
|
+
}
|
|
428
|
+
if (found.action === 'block')
|
|
429
|
+
throw requestRefused('injected');
|
|
387
430
|
return { ...applied, inject: sanitized };
|
|
388
431
|
}
|
package/esm/src/kernel/stop.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type ContinueStopKind, type ProfileType } from './schema.js';
|
|
1
|
+
import { type ContinueStopKind, type ProfileType, type StepLimitMode } from './schema.js';
|
|
2
2
|
import type { TurnStop } from './turn-events.js';
|
|
3
3
|
export type { TurnStop };
|
|
4
4
|
/**
|
|
@@ -6,11 +6,13 @@ export type { TurnStop };
|
|
|
6
6
|
* speech continue by re-sending the host's request unchanged.
|
|
7
7
|
*/
|
|
8
8
|
export declare const CONTINUE_INSTRUCTION_TYPES: readonly ProfileType[];
|
|
9
|
+
/** The stop kinds that offer Continue when a profile names none. */
|
|
9
10
|
export declare const DEFAULT_ALLOW_CONTINUE: readonly ContinueStopKind[];
|
|
10
11
|
/** Hosts wait briefly, then continue once on their own. */
|
|
11
12
|
export declare const DEFAULT_AUTO_CONTINUE: readonly ContinueStopKind[];
|
|
12
|
-
/** Pause before
|
|
13
|
+
/** Pause before an auto-continue, the host's or the turn's own, so a flaky tunnel can settle. */
|
|
13
14
|
export declare const AUTO_CONTINUE_DELAY_MS = 1500;
|
|
15
|
+
/** Which stops a profile offers Continue for, and which the host continues on its own. */
|
|
14
16
|
export interface ProfileTurnResumptionSpec {
|
|
15
17
|
/**
|
|
16
18
|
* The host's UI policy for offering Continue: the kernel does not refuse a `continueFrom`
|
|
@@ -19,13 +21,22 @@ export interface ProfileTurnResumptionSpec {
|
|
|
19
21
|
*/
|
|
20
22
|
allowContinue?: ContinueStopKind[];
|
|
21
23
|
/**
|
|
22
|
-
* Omit → length / stream_incomplete; `[]` = none.
|
|
23
|
-
* sends the `continueFrom` turn
|
|
24
|
+
* Omit → length / stream_incomplete; `[]` = none. Apart from `allowContinue`: a stop can be
|
|
25
|
+
* continued without Continue being offered for it. The host sends the `continueFrom` turn
|
|
26
|
+
* with `continuation`. A text turn also sends a failed model call (`provider_error`,
|
|
27
|
+
* `stream_incomplete`) again itself when this list is set and names that stop, and the
|
|
28
|
+
* call gave no reply and no tool call: the turn keeps its history, its step count and
|
|
29
|
+
* what it has read. A failure the same call would meet again (the provider refused the
|
|
30
|
+
* request) is not sent again. Omitted, a turn sends nothing again.
|
|
24
31
|
*/
|
|
25
32
|
autoContinue?: ContinueStopKind[];
|
|
26
|
-
/**
|
|
33
|
+
/**
|
|
34
|
+
* Compared against `TurnRequest.continuation`; omit → no count cap. Also how many model
|
|
35
|
+
* calls one text turn sends again itself; omit → one.
|
|
36
|
+
*/
|
|
27
37
|
maxContinues?: number;
|
|
28
38
|
}
|
|
39
|
+
/** True when the stop kind can be continued. */
|
|
29
40
|
export declare function isContinueStopKind(kind: string): kind is ContinueStopKind;
|
|
30
41
|
/**
|
|
31
42
|
* `allowSteering` is text / live only; image and speech omit it. Stop is not a profile knob:
|
|
@@ -35,6 +46,11 @@ export interface ProfileTurnBehaviourSpec {
|
|
|
35
46
|
resumption?: ProfileTurnResumptionSpec;
|
|
36
47
|
/** Default true on text / live. Gates injects only; stage events still emit. */
|
|
37
48
|
allowSteering?: boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Text only. What the last model call under `maxSteps` may do. Omit = `'stop'`: it may call
|
|
51
|
+
* tools, and if it does the turn stops as `step_limit`. `'answer'` sends it without tools.
|
|
52
|
+
*/
|
|
53
|
+
atStepLimit?: StepLimitMode;
|
|
38
54
|
}
|
|
39
55
|
/**
|
|
40
56
|
* Image / speech turn behaviour: resumption only. A continue re-sends the
|
|
@@ -52,15 +68,20 @@ export interface MediaTurnBehaviourSpec {
|
|
|
52
68
|
export interface TurnContinueFrom {
|
|
53
69
|
stop: TurnStop;
|
|
54
70
|
}
|
|
71
|
+
/** True when the stop can be continued under the allowed kinds. */
|
|
55
72
|
export declare function isResumeableStop(stop: TurnStop | undefined, allowContinue?: readonly ContinueStopKind[]): boolean;
|
|
73
|
+
/** True for a stop where the model call failed; the rest either finished or were stopped on purpose. */
|
|
74
|
+
export declare function isFailedStopKind(kind: TurnStop['kind']): boolean;
|
|
56
75
|
export declare function stageAbortStop(abort: true | {
|
|
57
76
|
reason?: string;
|
|
58
77
|
}): TurnStop & {
|
|
59
78
|
kind: 'cancelled';
|
|
60
79
|
};
|
|
80
|
+
/** True when the user cancelled the turn. */
|
|
61
81
|
export declare function isUserCancelledStop(stop: TurnStop | undefined): boolean;
|
|
62
82
|
/** `policy` is the profile's `profileTurnResumption(profile)`. */
|
|
63
|
-
export declare function shouldAutoContinue(stop: TurnStop | undefined, policy?: Pick<ProfileTurnResumptionSpec, '
|
|
83
|
+
export declare function shouldAutoContinue(stop: TurnStop | undefined, policy?: Pick<ProfileTurnResumptionSpec, 'autoContinue'>): boolean;
|
|
84
|
+
/** The profile's resumption policy, or `undefined` for a live profile. */
|
|
64
85
|
export declare function profileTurnResumption(profile: {
|
|
65
86
|
type: string;
|
|
66
87
|
turnBehaviour?: ProfileTurnBehaviourSpec;
|
|
@@ -85,9 +106,11 @@ export declare function turnStopFromClientStreamEnd(opts: {
|
|
|
85
106
|
sawTerminal: boolean;
|
|
86
107
|
hadPartial?: boolean;
|
|
87
108
|
}): TurnStop | null;
|
|
109
|
+
/** Thrown when a model call stops before it finishes, carrying the stop. */
|
|
88
110
|
export declare class GenerationStopError extends Error {
|
|
89
111
|
readonly name = "GenerationStopError";
|
|
90
112
|
readonly stop: TurnStop;
|
|
91
113
|
constructor(stop: TurnStop, message?: string);
|
|
92
114
|
}
|
|
115
|
+
/** True when the error is a `GenerationStopError`. */
|
|
93
116
|
export declare function isGenerationStopError(err: unknown): err is GenerationStopError;
|
package/esm/src/kernel/stop.js
CHANGED
|
@@ -1,19 +1,22 @@
|
|
|
1
|
-
import { CONTINUE_STOP_KINDS } from './schema.js';
|
|
1
|
+
import { CONTINUE_STOP_KINDS, } from './schema.js';
|
|
2
2
|
/**
|
|
3
3
|
* Profile types whose continue turn sends the continue instruction. Image and
|
|
4
4
|
* speech continue by re-sending the host's request unchanged.
|
|
5
5
|
*/
|
|
6
6
|
export const CONTINUE_INSTRUCTION_TYPES = ['text'];
|
|
7
|
+
/** The stop kinds that offer Continue when a profile names none. */
|
|
7
8
|
export const DEFAULT_ALLOW_CONTINUE = CONTINUE_STOP_KINDS;
|
|
8
9
|
/** Hosts wait briefly, then continue once on their own. */
|
|
9
10
|
export const DEFAULT_AUTO_CONTINUE = ['length', 'stream_incomplete'];
|
|
10
|
-
/** Pause before
|
|
11
|
+
/** Pause before an auto-continue, the host's or the turn's own, so a flaky tunnel can settle. */
|
|
11
12
|
export const AUTO_CONTINUE_DELAY_MS = 1_500;
|
|
12
13
|
const CONTINUE_KIND_SET = new Set(CONTINUE_STOP_KINDS);
|
|
14
|
+
/** True when the stop kind can be continued. */
|
|
13
15
|
export function isContinueStopKind(kind) {
|
|
14
16
|
return CONTINUE_KIND_SET.has(kind);
|
|
15
17
|
}
|
|
16
18
|
const RESUMEABLE_DEFAULT = new Set(DEFAULT_ALLOW_CONTINUE);
|
|
19
|
+
/** True when the stop can be continued under the allowed kinds. */
|
|
17
20
|
export function isResumeableStop(stop, allowContinue) {
|
|
18
21
|
if (!stop)
|
|
19
22
|
return false;
|
|
@@ -22,11 +25,17 @@ export function isResumeableStop(stop, allowContinue) {
|
|
|
22
25
|
const allow = allowContinue ? new Set(allowContinue) : RESUMEABLE_DEFAULT;
|
|
23
26
|
return allow.has(stop.kind);
|
|
24
27
|
}
|
|
28
|
+
const FAILED_STOP_KINDS = new Set(['provider_error', 'stream_incomplete']);
|
|
29
|
+
/** True for a stop where the model call failed; the rest either finished or were stopped on purpose. */
|
|
30
|
+
export function isFailedStopKind(kind) {
|
|
31
|
+
return FAILED_STOP_KINDS.has(kind);
|
|
32
|
+
}
|
|
25
33
|
export function stageAbortStop(abort) {
|
|
26
34
|
return typeof abort === 'object' && abort.reason
|
|
27
35
|
? { kind: 'cancelled', native: abort.reason }
|
|
28
36
|
: { kind: 'cancelled' };
|
|
29
37
|
}
|
|
38
|
+
/** True when the user cancelled the turn. */
|
|
30
39
|
export function isUserCancelledStop(stop) {
|
|
31
40
|
return stop?.kind === 'cancelled';
|
|
32
41
|
}
|
|
@@ -34,9 +43,10 @@ export function isUserCancelledStop(stop) {
|
|
|
34
43
|
export function shouldAutoContinue(stop, policy) {
|
|
35
44
|
if (!stop || !isContinueStopKind(stop.kind))
|
|
36
45
|
return false;
|
|
37
|
-
|
|
38
|
-
return
|
|
46
|
+
// why: Offering Continue (`allowContinue`) is the host's own choice, apart from this one.
|
|
47
|
+
return (policy?.autoContinue ?? DEFAULT_AUTO_CONTINUE).includes(stop.kind);
|
|
39
48
|
}
|
|
49
|
+
/** The profile's resumption policy, or `undefined` for a live profile. */
|
|
40
50
|
export function profileTurnResumption(profile) {
|
|
41
51
|
if (profile.type === 'live')
|
|
42
52
|
return undefined;
|
|
@@ -112,6 +122,7 @@ export function turnStopFromClientStreamEnd(opts) {
|
|
|
112
122
|
return { kind: 'cancelled' };
|
|
113
123
|
return { kind: 'stream_incomplete' };
|
|
114
124
|
}
|
|
125
|
+
/** Thrown when a model call stops before it finishes, carrying the stop. */
|
|
115
126
|
export class GenerationStopError extends Error {
|
|
116
127
|
name = 'GenerationStopError';
|
|
117
128
|
stop;
|
|
@@ -120,6 +131,7 @@ export class GenerationStopError extends Error {
|
|
|
120
131
|
this.stop = stop;
|
|
121
132
|
}
|
|
122
133
|
}
|
|
134
|
+
/** True when the error is a `GenerationStopError`. */
|
|
123
135
|
export function isGenerationStopError(err) {
|
|
124
136
|
return err instanceof GenerationStopError;
|
|
125
137
|
}
|