@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,4 +1,29 @@
|
|
|
1
|
+
import { toErrorEvent, withPublicLabels, } from '../guardrails/error.js';
|
|
1
2
|
import { projectGuardrailTurnEvent } from '../guardrails/events.js';
|
|
3
|
+
/**
|
|
4
|
+
* For the builder, the wording of a failure is its raw reason, wherever a visitor's wording
|
|
5
|
+
* stands: a failed turn, an ended session, a tool call's failure.
|
|
6
|
+
*/
|
|
7
|
+
function builderWording(event) {
|
|
8
|
+
if (event.type === 'error' && event.errorInternal !== undefined) {
|
|
9
|
+
// why: `errorCopy` stays: worded raw or not, its key still names what failed for the page.
|
|
10
|
+
const { errorInternal, ...rest } = event;
|
|
11
|
+
return { ...rest, error: errorInternal };
|
|
12
|
+
}
|
|
13
|
+
if (event.type === 'session' &&
|
|
14
|
+
event.session.kind === 'ended' &&
|
|
15
|
+
event.errorInternal !== undefined) {
|
|
16
|
+
const { errorInternal, ...rest } = event;
|
|
17
|
+
return { ...rest, session: { ...event.session, message: errorInternal } };
|
|
18
|
+
}
|
|
19
|
+
if (event.type === 'tool' &&
|
|
20
|
+
event.tool.phase === 'error' &&
|
|
21
|
+
event.tool.failure.error !== undefined) {
|
|
22
|
+
const { failure } = event.tool;
|
|
23
|
+
return { ...event, tool: { ...event.tool, failure: { ...failure, error: failure.message } } };
|
|
24
|
+
}
|
|
25
|
+
return event;
|
|
26
|
+
}
|
|
2
27
|
/** Raw diagnostics ride on error events, an ended session's close, and a tool call's failure. */
|
|
3
28
|
function stripErrorInternal(event) {
|
|
4
29
|
if ((event.type !== 'error' && event.type !== 'session' && event.type !== 'tool') ||
|
|
@@ -22,17 +47,34 @@ function stripEvidenceRaw(event) {
|
|
|
22
47
|
const { raw: _raw, ...evidence } = event.evidence;
|
|
23
48
|
return { ...event, evidence };
|
|
24
49
|
}
|
|
25
|
-
/**
|
|
50
|
+
/**
|
|
51
|
+
* The copy of an event its reader may have. For a visitor (the default) host-only diagnostics are
|
|
52
|
+
* stripped, so the copy is safe to forward to browsers or end-user SSE.
|
|
53
|
+
*/
|
|
26
54
|
function forClient(event, options) {
|
|
27
|
-
let out =
|
|
55
|
+
let out = options?.reader === 'builder'
|
|
56
|
+
? builderWording(event)
|
|
57
|
+
: stripGuardrailInternal(stripErrorInternal(event));
|
|
28
58
|
if (!options?.includeEvidenceRaw) {
|
|
29
59
|
out = stripEvidenceRaw(out);
|
|
30
60
|
}
|
|
31
|
-
// Clients never receive matched substrings, even if the host opted into guardrailMatchPreview.
|
|
61
|
+
// invariant: Clients never receive matched substrings, even if the host opted into guardrailMatchPreview.
|
|
32
62
|
out = projectGuardrailTurnEvent(out, false);
|
|
33
63
|
return out;
|
|
34
64
|
}
|
|
65
|
+
/** `forClient` over a list of events. */
|
|
35
66
|
function forClientEvents(events, options) {
|
|
36
67
|
return events.map((event) => forClient(event, options));
|
|
37
68
|
}
|
|
38
|
-
|
|
69
|
+
/**
|
|
70
|
+
* A caught failure as its reader may have it, by the same rule as `forClient`: the profile's
|
|
71
|
+
* wording (pass its `labels`) for a visitor, the raw diagnostic for a builder.
|
|
72
|
+
*/
|
|
73
|
+
function clientError(err, labels, options) {
|
|
74
|
+
const event = forClient(withPublicLabels(toErrorEvent(err), labels), options);
|
|
75
|
+
// why: An error event stays one through `withPublicLabels` and `forClient`, worded by the first.
|
|
76
|
+
const { error = '', errorKind, errorCopy } = event;
|
|
77
|
+
// why: The key tells the page what failed (a conversation the host lost), which `errorKind` cannot.
|
|
78
|
+
return { error, errorKind, ...(errorCopy ? { errorCopy } : {}) };
|
|
79
|
+
}
|
|
80
|
+
export { clientError, forClient, forClientEvents };
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import type { Profile } from '../kernel/types.js';
|
|
2
2
|
import { type TraceRecord } from '../observability/trace-record.js';
|
|
3
3
|
import type { TraceSink } from '../observability/trace-sink.js';
|
|
4
|
+
/** The record of a cutout call kept on the trace: whether it succeeded, how long it took, its URL, the hashes of its input, and output, the upstream exchange and any error. */
|
|
4
5
|
interface CutoutTape {
|
|
5
6
|
ok: boolean;
|
|
6
7
|
/** How long the cutout took; the span ends now and starts this long before. */
|
|
@@ -30,10 +30,11 @@ async function flushMintTrace(args) {
|
|
|
30
30
|
const { sink, policy } = resolveTraceWriter({
|
|
31
31
|
override: args.sink,
|
|
32
32
|
observability: args.profile.observability,
|
|
33
|
+
guardrails: args.profile.guardrails,
|
|
33
34
|
});
|
|
34
35
|
await writeTrace(sink, Promise.resolve(record), policy);
|
|
35
36
|
const { cutout } = args;
|
|
36
|
-
// One instant: the cutout was reported done now and ran for `ms` before it.
|
|
37
|
+
// why: One instant: the cutout was reported done now and ran for `ms` before it.
|
|
37
38
|
const now = BigInt(Date.now()) * BigInt(NANOS_PER_MS);
|
|
38
39
|
const tree = startTrace('cutout', {
|
|
39
40
|
clock: { nowUnixNano: () => now },
|
|
@@ -45,7 +46,7 @@ async function flushMintTrace(args) {
|
|
|
45
46
|
if (cutout.http !== undefined) {
|
|
46
47
|
tree.root.event('theorem.upstream.row', { row: traceJson(cutout.http) });
|
|
47
48
|
}
|
|
48
|
-
// The host's error text is free text: stored by hash under the scrub, like any exception.
|
|
49
|
+
// why: The host's error text is free text: stored by hash under the scrub, like any exception.
|
|
49
50
|
if (cutout.error) {
|
|
50
51
|
tree.root.event('exception', { 'exception.message': traceContent(cutout.error) });
|
|
51
52
|
}
|
package/esm/src/host/mod.d.ts
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
7
|
import "../../_dnt.polyfills.js";
|
|
8
|
-
export type { ClientTurnOptions } from './client-turn.js';
|
|
9
|
-
export { forClient, forClientEvents } from './client-turn.js';
|
|
8
|
+
export type { ClientError, ClientTurnOptions } from './client-turn.js';
|
|
9
|
+
export { clientError, forClient, forClientEvents } from './client-turn.js';
|
|
10
10
|
export type { CutoutTape } from './mint-trace.js';
|
|
11
11
|
export { flushMintTrace } from './mint-trace.js';
|
|
12
12
|
export { readStreamingJsonStringField } from './readStreamingJsonStringField.js';
|
package/esm/src/host/mod.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* @module
|
|
6
6
|
*/
|
|
7
7
|
import "../../_dnt.polyfills.js";
|
|
8
|
-
export { forClient, forClientEvents } from './client-turn.js';
|
|
8
|
+
export { clientError, forClient, forClientEvents } from './client-turn.js';
|
|
9
9
|
export { flushMintTrace } from './mint-trace.js';
|
|
10
10
|
export { readStreamingJsonStringField } from './readStreamingJsonStringField.js';
|
|
11
11
|
export { caughtStatus, HTTP_BUSY, HTTP_METHOD, HTTP_NOT_FOUND, HTTP_OK, json, } from './reply.js';
|
|
@@ -1,21 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
n: '\n',
|
|
3
|
-
t: '\t',
|
|
4
|
-
r: '\r',
|
|
5
|
-
'"': '"',
|
|
6
|
-
'\\': '\\',
|
|
7
|
-
'/': '/',
|
|
8
|
-
};
|
|
9
|
-
function decodeEscapedChar(ch, jsonText, index) {
|
|
10
|
-
if (ch === 'u' && index + 4 < jsonText.length) {
|
|
11
|
-
const hex = jsonText.slice(index + 1, index + 5);
|
|
12
|
-
if (/^[0-9a-fA-F]{4}$/.test(hex)) {
|
|
13
|
-
return { text: String.fromCharCode(Number.parseInt(hex, 16)), next: index + 4 };
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
const mapped = JSON_ESCAPES[ch];
|
|
17
|
-
return { text: mapped ?? ch, next: index };
|
|
18
|
-
}
|
|
1
|
+
import { readJsonString } from '../kernel/util/partial-json.js';
|
|
19
2
|
/** The buffer may lack a closing quote; any decoded prefix is returned for live preview. */
|
|
20
3
|
export function readStreamingJsonStringField(jsonText, key) {
|
|
21
4
|
const keyLiteral = JSON.stringify(key);
|
|
@@ -40,29 +23,5 @@ export function readStreamingJsonStringField(jsonText, key) {
|
|
|
40
23
|
if (keyAt < 0 || jsonText[i] !== '"') {
|
|
41
24
|
return null;
|
|
42
25
|
}
|
|
43
|
-
|
|
44
|
-
let result = '';
|
|
45
|
-
let escaped = false;
|
|
46
|
-
while (i < jsonText.length) {
|
|
47
|
-
const ch = jsonText[i];
|
|
48
|
-
if (escaped) {
|
|
49
|
-
const decoded = decodeEscapedChar(ch, jsonText, i);
|
|
50
|
-
result += decoded.text;
|
|
51
|
-
i = decoded.next;
|
|
52
|
-
escaped = false;
|
|
53
|
-
i += 1;
|
|
54
|
-
continue;
|
|
55
|
-
}
|
|
56
|
-
if (ch === '\\') {
|
|
57
|
-
escaped = true;
|
|
58
|
-
}
|
|
59
|
-
else if (ch === '"') {
|
|
60
|
-
return result;
|
|
61
|
-
}
|
|
62
|
-
else {
|
|
63
|
-
result += ch;
|
|
64
|
-
}
|
|
65
|
-
i += 1;
|
|
66
|
-
}
|
|
67
|
-
return result;
|
|
26
|
+
return readJsonString(jsonText, i).text;
|
|
68
27
|
}
|
package/esm/src/host/reply.d.ts
CHANGED
|
@@ -1,7 +1,13 @@
|
|
|
1
|
+
/** HTTP status for a success. */
|
|
1
2
|
declare const HTTP_OK = 200;
|
|
3
|
+
/** HTTP status for an unknown route. */
|
|
2
4
|
declare const HTTP_NOT_FOUND = 404;
|
|
5
|
+
/** HTTP status for a method the route does not take. */
|
|
3
6
|
declare const HTTP_METHOD = 405;
|
|
7
|
+
/** HTTP status for a request refused because the host is busy. */
|
|
4
8
|
declare const HTTP_BUSY = 429;
|
|
9
|
+
/** A JSON response with the status and the CORS headers. */
|
|
5
10
|
declare function json(status: number, body: unknown, cors: Record<string, string>): Response;
|
|
11
|
+
/** The HTTP status for a caught error, by its kind. */
|
|
6
12
|
declare function caughtStatus(err: unknown): number;
|
|
7
13
|
export { caughtStatus, HTTP_BUSY, HTTP_METHOD, HTTP_NOT_FOUND, HTTP_OK, json };
|
package/esm/src/host/reply.js
CHANGED
|
@@ -1,7 +1,11 @@
|
|
|
1
1
|
import { errorKind } from '../guardrails/error.js';
|
|
2
|
+
/** HTTP status for a success. */
|
|
2
3
|
const HTTP_OK = 200;
|
|
4
|
+
/** HTTP status for an unknown route. */
|
|
3
5
|
const HTTP_NOT_FOUND = 404;
|
|
6
|
+
/** HTTP status for a method the route does not take. */
|
|
4
7
|
const HTTP_METHOD = 405;
|
|
8
|
+
/** HTTP status for a request refused because the host is busy. */
|
|
5
9
|
const HTTP_BUSY = 429;
|
|
6
10
|
const STATUS_BY_KIND = {
|
|
7
11
|
config: 500,
|
|
@@ -19,16 +23,18 @@ const STATUS_BY_KIND = {
|
|
|
19
23
|
blocked: 403,
|
|
20
24
|
declined: 409,
|
|
21
25
|
failed: 502,
|
|
22
|
-
// Client closed request (nginx convention): the caller went away.
|
|
26
|
+
// why: Client closed request (nginx convention): the caller went away.
|
|
23
27
|
cancelled: 499,
|
|
24
28
|
internal: 500,
|
|
25
29
|
};
|
|
30
|
+
/** A JSON response with the status and the CORS headers. */
|
|
26
31
|
function json(status, body, cors) {
|
|
27
32
|
return new Response(JSON.stringify(body), {
|
|
28
33
|
status,
|
|
29
34
|
headers: { ...cors, 'Content-Type': 'application/json' },
|
|
30
35
|
});
|
|
31
36
|
}
|
|
37
|
+
/** The HTTP status for a caught error, by its kind. */
|
|
32
38
|
function caughtStatus(err) {
|
|
33
39
|
return STATUS_BY_KIND[errorKind(err)];
|
|
34
40
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import type { TurnEvent } from '../kernel/types.js';
|
|
2
2
|
import type { FoldTurnEventsOptions, TranscriptBlock, UserTurnDraft } from './types.js';
|
|
3
|
+
/** Restarts block id numbering at zero. */
|
|
3
4
|
declare function resetBlockIds(): void;
|
|
5
|
+
/** Turns a user draft into transcript blocks: a `user-text` block for the trimmed text, then one block per attachment and per voice clip. */
|
|
4
6
|
declare function buildUserTurnBlocks(draft: UserTurnDraft, idPrefix?: string): TranscriptBlock[];
|
|
5
7
|
/** Resets only the turn id sequence, so streaming refolds keep stable `turn-*` keys. */
|
|
6
8
|
declare function foldTurnEvents(events: readonly TurnEvent[], options?: FoldTurnEventsOptions): TranscriptBlock[];
|
|
9
|
+
/** One conversation turn as blocks: the user draft's blocks followed by the assistant events folded into blocks. */
|
|
7
10
|
declare function foldConversationTurn(draft: UserTurnDraft, assistantEvents: readonly TurnEvent[], options?: FoldTurnEventsOptions): TranscriptBlock[];
|
|
8
11
|
export { buildUserTurnBlocks, foldConversationTurn, foldTurnEvents, resetBlockIds };
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { keptReply } from '../kernel/turn-events.js';
|
|
2
|
+
import { partialJsonObject } from '../kernel/util/partial-json.js';
|
|
3
|
+
import { applyToolDraft, applyToolEvent } from './tool-calls.js';
|
|
2
4
|
import { collectPromotedMediaFromToolOutput } from './tool-media.js';
|
|
3
5
|
let turnBlockCounter = 0;
|
|
4
6
|
/**
|
|
@@ -12,6 +14,7 @@ function nextBlockId(prefix) {
|
|
|
12
14
|
turnBlockCounter += 1;
|
|
13
15
|
return `${prefix}-${String(turnBlockCounter)}`;
|
|
14
16
|
}
|
|
17
|
+
/** Restarts block id numbering at zero. */
|
|
15
18
|
function resetBlockIds() {
|
|
16
19
|
turnBlockCounter = 0;
|
|
17
20
|
}
|
|
@@ -30,17 +33,77 @@ function appendText(blocks, kind, text, idPrefix) {
|
|
|
30
33
|
text,
|
|
31
34
|
});
|
|
32
35
|
}
|
|
33
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* A decision made while text streams goes ahead of that text's block, so the block stays last and
|
|
38
|
+
* the rest of the text joins it.
|
|
39
|
+
*/
|
|
40
|
+
function addGuardrailBlock(blocks, block) {
|
|
41
|
+
const last = blocks.at(-1);
|
|
42
|
+
const streaming = last?.kind === 'text' || last?.kind === 'thought';
|
|
43
|
+
blocks.splice(streaming ? blocks.length - 1 : blocks.length, 0, block);
|
|
44
|
+
}
|
|
45
|
+
function findToolBlock(blocks, id) {
|
|
46
|
+
return blocks.find((block) => block.kind === 'tool' && block.id === id);
|
|
47
|
+
}
|
|
48
|
+
/** invariant: Issued operation IDs separate action blocks; historical events use callId. */
|
|
34
49
|
function upsertToolBlock(blocks, tool) {
|
|
35
|
-
const id = `tool-${tool.callId}`;
|
|
36
|
-
const existing = blocks
|
|
50
|
+
const id = `tool-${tool.operationId ?? tool.callId}`;
|
|
51
|
+
const existing = findToolBlock(blocks, id);
|
|
37
52
|
const call = applyToolEvent(existing?.tool, tool);
|
|
38
53
|
if (existing) {
|
|
39
54
|
existing.tool = call;
|
|
40
55
|
return;
|
|
41
56
|
}
|
|
57
|
+
// why: The call the model was drafting arrives whole where its draft stood.
|
|
58
|
+
const draft = tool.phase === undefined ? findToolBlock(blocks, `tool-${tool.callId}`) : undefined;
|
|
59
|
+
if (draft?.tool.draft !== undefined) {
|
|
60
|
+
draft.id = id;
|
|
61
|
+
draft.tool = call;
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
blocks.push({ id, kind: 'tool', tool: call });
|
|
65
|
+
}
|
|
66
|
+
/** The call the model is still writing, as far as its draft has come. */
|
|
67
|
+
function upsertToolDraft(blocks, draft) {
|
|
68
|
+
const id = `tool-${draft.callId}`;
|
|
69
|
+
const existing = findToolBlock(blocks, id);
|
|
70
|
+
const call = applyToolDraft(existing?.tool, draft);
|
|
71
|
+
if (existing) {
|
|
72
|
+
existing.tool = call;
|
|
73
|
+
return;
|
|
74
|
+
}
|
|
42
75
|
blocks.push({ id, kind: 'tool', tool: call });
|
|
43
76
|
}
|
|
77
|
+
/** The structured reply the model is still writing, if one is showing. */
|
|
78
|
+
function openStructuredDraft(blocks) {
|
|
79
|
+
return blocks.findLast((block) => block.kind === 'structured' && block.draft !== undefined);
|
|
80
|
+
}
|
|
81
|
+
/** The structured reply the model is still writing, as far as its draft has come. */
|
|
82
|
+
function upsertStructuredDraft(blocks, text, idPrefix) {
|
|
83
|
+
const open = openStructuredDraft(blocks);
|
|
84
|
+
const draft = (open?.draft ?? '') + text;
|
|
85
|
+
if (open) {
|
|
86
|
+
open.draft = draft;
|
|
87
|
+
open.value = partialJsonObject(draft);
|
|
88
|
+
return;
|
|
89
|
+
}
|
|
90
|
+
blocks.push({
|
|
91
|
+
id: nextBlockId(idPrefix),
|
|
92
|
+
kind: 'structured',
|
|
93
|
+
value: partialJsonObject(draft),
|
|
94
|
+
draft,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
/** The structured reply, in its draft's place when one is showing. */
|
|
98
|
+
function settleStructured(blocks, value, idPrefix) {
|
|
99
|
+
const open = openStructuredDraft(blocks);
|
|
100
|
+
if (open) {
|
|
101
|
+
open.value = value;
|
|
102
|
+
delete open.draft;
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
blocks.push({ id: nextBlockId(idPrefix), kind: 'structured', value });
|
|
106
|
+
}
|
|
44
107
|
/** Same source: one place, or one link. */
|
|
45
108
|
function sameSource(a, b) {
|
|
46
109
|
if (a.type !== b.type)
|
|
@@ -89,6 +152,7 @@ function appendPromotedToolMedia(blocks, tool, idPrefix, seenUrls) {
|
|
|
89
152
|
});
|
|
90
153
|
}
|
|
91
154
|
}
|
|
155
|
+
/** Turns a user draft into transcript blocks: a `user-text` block for the trimmed text, then one block per attachment and per voice clip. */
|
|
92
156
|
function buildUserTurnBlocks(draft, idPrefix = 'user') {
|
|
93
157
|
const blocks = [];
|
|
94
158
|
const text = draft.text?.trim();
|
|
@@ -128,7 +192,7 @@ function foldTurnEvents(events, options = {}) {
|
|
|
128
192
|
turnBlockCounter = 0;
|
|
129
193
|
const blocks = [];
|
|
130
194
|
const promotedMediaUrls = new Set();
|
|
131
|
-
for (const event of events) {
|
|
195
|
+
for (const event of keptReply(events)) {
|
|
132
196
|
switch (event.type) {
|
|
133
197
|
case 'thought':
|
|
134
198
|
if (showThoughts && event.text) {
|
|
@@ -140,16 +204,18 @@ function foldTurnEvents(events, options = {}) {
|
|
|
140
204
|
appendText(blocks, 'text', event.text, idPrefix);
|
|
141
205
|
}
|
|
142
206
|
break;
|
|
207
|
+
case 'tool_draft':
|
|
208
|
+
upsertToolDraft(blocks, event);
|
|
209
|
+
break;
|
|
143
210
|
case 'tool':
|
|
144
211
|
upsertToolBlock(blocks, event.tool);
|
|
145
212
|
appendPromotedToolMedia(blocks, event.tool, idPrefix, promotedMediaUrls);
|
|
146
213
|
break;
|
|
214
|
+
case 'structured_draft':
|
|
215
|
+
upsertStructuredDraft(blocks, event.text, idPrefix);
|
|
216
|
+
break;
|
|
147
217
|
case 'structured':
|
|
148
|
-
blocks.
|
|
149
|
-
id: nextBlockId(idPrefix),
|
|
150
|
-
kind: 'structured',
|
|
151
|
-
value: event.structured,
|
|
152
|
-
});
|
|
218
|
+
settleStructured(blocks, event.structured, idPrefix);
|
|
153
219
|
break;
|
|
154
220
|
case 'media':
|
|
155
221
|
if (event.media) {
|
|
@@ -178,6 +244,13 @@ function foldTurnEvents(events, options = {}) {
|
|
|
178
244
|
evidence: event.evidence,
|
|
179
245
|
});
|
|
180
246
|
break;
|
|
247
|
+
case 'guardrail':
|
|
248
|
+
addGuardrailBlock(blocks, {
|
|
249
|
+
id: nextBlockId(idPrefix),
|
|
250
|
+
kind: 'guardrail',
|
|
251
|
+
guardrail: event.guardrail,
|
|
252
|
+
});
|
|
253
|
+
break;
|
|
181
254
|
case 'error':
|
|
182
255
|
if (event.error) {
|
|
183
256
|
blocks.push({
|
|
@@ -197,16 +270,13 @@ function foldTurnEvents(events, options = {}) {
|
|
|
197
270
|
compaction: event.compaction !== undefined,
|
|
198
271
|
});
|
|
199
272
|
break;
|
|
200
|
-
case 'tokens':
|
|
201
|
-
case 'session':
|
|
202
|
-
case 'stage':
|
|
203
|
-
break;
|
|
204
273
|
default:
|
|
205
274
|
break;
|
|
206
275
|
}
|
|
207
276
|
}
|
|
208
277
|
return blocks;
|
|
209
278
|
}
|
|
279
|
+
/** One conversation turn as blocks: the user draft's blocks followed by the assistant events folded into blocks. */
|
|
210
280
|
function foldConversationTurn(draft, assistantEvents, options = {}) {
|
|
211
281
|
return [...buildUserTurnBlocks(draft, 'user'), ...foldTurnEvents(assistantEvents, options)];
|
|
212
282
|
}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { ComposerPendingKind } from './pending.js';
|
|
2
|
+
/** Where a run is: idle, streaming, or held at a tool gate. */
|
|
2
3
|
export type ComposerRunPhase = 'idle' | 'streaming' | 'gated';
|
|
3
4
|
/** Primary button / Enter target. */
|
|
4
5
|
export type ComposerPrimaryAction = 'send' | 'stop' | 'queue' | 'none';
|
|
@@ -7,6 +8,7 @@ export type ComposerPrimaryAction = 'send' | 'stop' | 'queue' | 'none';
|
|
|
7
8
|
* abandon the tool gate (no model continue) + send while gated; not a pending kind.
|
|
8
9
|
*/
|
|
9
10
|
export type ComposerMenuAction = ComposerPendingKind | 'send_now';
|
|
11
|
+
/** What decides the composer's actions: the run phase, whether there is something to send, and whether steering and stop are allowed. */
|
|
10
12
|
export type ComposerActionContext = {
|
|
11
13
|
phase: ComposerRunPhase;
|
|
12
14
|
hasPayload: boolean;
|
|
@@ -15,6 +17,8 @@ export type ComposerActionContext = {
|
|
|
15
17
|
/** Composer profiles always project `canStop: true`. */
|
|
16
18
|
canStop?: boolean;
|
|
17
19
|
};
|
|
20
|
+
/** The action of the primary button and Enter: `send` when idle with a draft, `queue` mid-run with one, `stop` while streaming with none (when stop is allowed), else `none`. */
|
|
18
21
|
declare function resolveComposerPrimary(ctx: ComposerActionContext): ComposerPrimaryAction;
|
|
22
|
+
/** The split menu's actions: none without a draft; `stash` when idle; mid-run `queue`, `steer` while streaming when steering is allowed, `send_now` and `stash`. */
|
|
19
23
|
declare function resolveComposerMenuActions(ctx: ComposerActionContext): ComposerMenuAction[];
|
|
20
24
|
export { resolveComposerMenuActions, resolveComposerPrimary };
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
/** The action of the primary button and Enter: `send` when idle with a draft, `queue` mid-run with one, `stop` while streaming with none (when stop is allowed), else `none`. */
|
|
1
2
|
function resolveComposerPrimary(ctx) {
|
|
2
3
|
const canStop = ctx.canStop !== false;
|
|
3
4
|
if (ctx.phase === 'idle') {
|
|
@@ -8,9 +9,10 @@ function resolveComposerPrimary(ctx) {
|
|
|
8
9
|
return canStop ? 'stop' : 'none';
|
|
9
10
|
return 'queue';
|
|
10
11
|
}
|
|
11
|
-
// Gated is still the same run: queue only, no stream to stop.
|
|
12
|
+
// why: Gated is still the same run: queue only, no stream to stop.
|
|
12
13
|
return ctx.hasPayload ? 'queue' : 'none';
|
|
13
14
|
}
|
|
15
|
+
/** The split menu's actions: none without a draft; `stash` when idle; mid-run `queue`, `steer` while streaming when steering is allowed, `send_now` and `stash`. */
|
|
14
16
|
function resolveComposerMenuActions(ctx) {
|
|
15
17
|
if (!ctx.hasPayload)
|
|
16
18
|
return [];
|
|
@@ -24,8 +26,8 @@ function resolveComposerMenuActions(ctx) {
|
|
|
24
26
|
actions.push('send_now', 'stash');
|
|
25
27
|
return actions;
|
|
26
28
|
}
|
|
27
|
-
// gated: no steer (not an inject stage); send_now = host ends wait + send
|
|
29
|
+
// why: gated: no steer (not an inject stage); send_now = host ends wait + send
|
|
28
30
|
return ['queue', 'send_now', 'stash'];
|
|
29
31
|
}
|
|
30
|
-
// Emits semantic action keys only: English labels live in the rendering layer or the host UI.
|
|
32
|
+
// invariant: Emits semantic action keys only: English labels live in the rendering layer or the host UI.
|
|
31
33
|
export { resolveComposerMenuActions, resolveComposerPrimary };
|
|
@@ -1,6 +1,12 @@
|
|
|
1
1
|
import type { AttachmentValidationIssue } from '../kernel/types.js';
|
|
2
2
|
import type { ProfileGuardrailsView, ProfileInputsInterface, TranscriptBlock, UserTurnDraft } from './types.js';
|
|
3
|
+
/**
|
|
4
|
+
* Reads a draft's text at the `user` boundary with Theorem's patterns, as the kernel will: a
|
|
5
|
+
* match set to redact shows as its placeholder. A match set to block leaves the draft as typed;
|
|
6
|
+
* the kernel refuses the turn. A match of the host's own patterns is the kernel's to find.
|
|
7
|
+
*/
|
|
3
8
|
declare function sanitizeUserDraft(draft: UserTurnDraft, guardrails?: ProfileGuardrailsView): UserTurnDraft;
|
|
9
|
+
/** The result of preparing a user turn: the sanitized draft with its transcript blocks, or the attachment issues that rejected it. */
|
|
4
10
|
export type PrepareUserTurnResult = {
|
|
5
11
|
ok: true;
|
|
6
12
|
draft: UserTurnDraft;
|
|
@@ -1,20 +1,31 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import { anySensitive } from '../guardrails/sensitive.js';
|
|
1
|
+
import { detectAt } from '../guardrails/detect-at.js';
|
|
2
|
+
import { DETECT_DEFAULTS } from '../guardrails/detectors.js';
|
|
4
3
|
import { buildUserTurnBlocks } from './blocks.js';
|
|
5
4
|
import { validateProfileInputs } from './inputs.js';
|
|
5
|
+
/** The view's matrix with Theorem's patterns off where the profile turned them off. The host's own patterns stay with the kernel. */
|
|
6
|
+
function detectOf(guardrails) {
|
|
7
|
+
if (!guardrails)
|
|
8
|
+
return DETECT_DEFAULTS;
|
|
9
|
+
const { detect, patterns } = guardrails;
|
|
10
|
+
if (!patterns)
|
|
11
|
+
return detect;
|
|
12
|
+
const sources = Object.fromEntries(Object.entries(patterns).map(([detector, { theorem }]) => [
|
|
13
|
+
detector,
|
|
14
|
+
{ theorem, matchers: [] },
|
|
15
|
+
]));
|
|
16
|
+
return { ...detect, sources };
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Reads a draft's text at the `user` boundary with Theorem's patterns, as the kernel will: a
|
|
20
|
+
* match set to redact shows as its placeholder. A match set to block leaves the draft as typed;
|
|
21
|
+
* the kernel refuses the turn. A match of the host's own patterns is the kernel's to find.
|
|
22
|
+
*/
|
|
6
23
|
function sanitizeUserDraft(draft, guardrails) {
|
|
7
|
-
const options = guardrails ?? resolveGuardrailPolicy(undefined);
|
|
8
|
-
if (!options.sanitizeInput && !anySensitive(options.redactSensitive)) {
|
|
9
|
-
return draft;
|
|
10
|
-
}
|
|
11
24
|
if (draft.text === undefined) {
|
|
12
25
|
return draft;
|
|
13
26
|
}
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
text: sanitizeText(draft.text, options),
|
|
17
|
-
};
|
|
27
|
+
const detected = detectAt(draft.text, 'user', detectOf(guardrails));
|
|
28
|
+
return { ...draft, text: detected.text ?? draft.text };
|
|
18
29
|
}
|
|
19
30
|
/** Call before appending to the thread and before `runTurn` ingress. */
|
|
20
31
|
function prepareUserTurn(inputs, draft, guardrails) {
|
|
@@ -6,7 +6,19 @@ import type { ComposerProfileInterface, LiveProfileInterface, ProfileInterface }
|
|
|
6
6
|
* the scope that runs the profile.
|
|
7
7
|
*/
|
|
8
8
|
declare function interfaceFromProfile(input: LiveProfile, tools: ToolRegistry): LiveProfileInterface;
|
|
9
|
+
/** The interface for a profile that is not live. */
|
|
9
10
|
declare function interfaceFromProfile(input: Exclude<Profile, LiveProfile>, tools: ToolRegistry): ComposerProfileInterface;
|
|
11
|
+
/** The interface for any profile. */
|
|
10
12
|
declare function interfaceFromProfile(input: Profile, tools: ToolRegistry): ProfileInterface;
|
|
13
|
+
/** The interface for a profile the host has already projected, without resolving its tools again. */
|
|
11
14
|
declare function interfaceFromProjected(projected: ProjectedProfile): ProfileInterface;
|
|
12
|
-
|
|
15
|
+
/**
|
|
16
|
+
* The interface a browser may read: {@linkcode interfaceFromProfile} without `identity.system` and
|
|
17
|
+
* `systemByRole`, which stay on the server. Labels, turn behaviour, guardrails, and observability are kept.
|
|
18
|
+
*/
|
|
19
|
+
declare function clientProfileInterface(input: LiveProfile, tools: ToolRegistry): LiveProfileInterface;
|
|
20
|
+
/** The client-safe interface for a profile that is not live. */
|
|
21
|
+
declare function clientProfileInterface(input: Exclude<Profile, LiveProfile>, tools: ToolRegistry): ComposerProfileInterface;
|
|
22
|
+
/** The client-safe interface for any profile. */
|
|
23
|
+
declare function clientProfileInterface(input: Profile, tools: ToolRegistry): ProfileInterface;
|
|
24
|
+
export { clientProfileInterface, interfaceFromProfile, interfaceFromProjected };
|