niceeval 0.18.0 → 0.19.0
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/INDEX.md +4 -2
- package/dist/adapter-usage.cjs.map +1 -1
- package/dist/adapter-usage.d.cts +1 -1
- package/dist/adapter-usage.d.mts +1 -1
- package/dist/adapter-usage.d.ts +1 -1
- package/dist/adapter.cjs +8 -7
- package/dist/adapter.cjs.map +1 -1
- package/dist/adapter.d.cts +21 -21
- package/dist/adapter.d.mts +21 -21
- package/dist/adapter.d.ts +21 -21
- package/dist/agents/{effect-runtime.cjs → agent-effects.cjs} +12 -18
- package/dist/agents/agent-effects.cjs.map +1 -0
- package/dist/agents/agent-effects.d.cts +23 -0
- package/dist/agents/agent-effects.d.mts +23 -0
- package/dist/agents/agent-effects.d.ts +23 -0
- package/dist/agents/agent-effects.js +16 -0
- package/dist/agents/agent-effects.js.map +1 -0
- package/dist/agents/ai-sdk.cjs +1 -1
- package/dist/agents/ai-sdk.cjs.map +1 -1
- package/dist/agents/bub.cjs +31 -18
- package/dist/agents/bub.cjs.map +1 -1
- package/dist/agents/bub.d.cts +9 -12
- package/dist/agents/bub.d.mts +9 -12
- package/dist/agents/bub.d.ts +9 -12
- package/dist/agents/claude-code-native.cjs +2 -2
- package/dist/agents/claude-code-native.cjs.map +1 -1
- package/dist/agents/claude-code.cjs +17 -11
- package/dist/agents/claude-code.cjs.map +1 -1
- package/dist/agents/claude-code.d.cts +11 -11
- package/dist/agents/claude-code.d.mts +11 -11
- package/dist/agents/claude-code.d.ts +11 -11
- package/dist/agents/codex-app-server.cjs +2 -2
- package/dist/agents/codex-app-server.cjs.map +1 -1
- package/dist/agents/codex.cjs +18 -12
- package/dist/agents/codex.cjs.map +1 -1
- package/dist/agents/codex.d.cts +12 -12
- package/dist/agents/codex.d.mts +12 -12
- package/dist/agents/codex.d.ts +12 -12
- package/dist/agents/deepseek-harness.cjs +2 -2
- package/dist/agents/deepseek-harness.cjs.map +1 -1
- package/dist/agents/hermes.cjs +3 -3
- package/dist/agents/hermes.cjs.map +1 -1
- package/dist/agents/index.cjs +3 -3
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +3 -3
- package/dist/agents/index.d.mts +3 -3
- package/dist/agents/index.d.ts +3 -3
- package/dist/agents/index.js +2 -2
- package/dist/agents/index.mjs +2 -2
- package/dist/agents/mcp.cjs.map +1 -1
- package/dist/agents/mcp.d.cts +2 -2
- package/dist/agents/mcp.d.mts +2 -2
- package/dist/agents/mcp.d.ts +2 -2
- package/dist/agents/omp.cjs +2 -2
- package/dist/agents/omp.cjs.map +1 -1
- package/dist/agents/openai-compat.cjs +2 -2
- package/dist/agents/openai-compat.cjs.map +1 -1
- package/dist/agents/openclaw.cjs +3 -3
- package/dist/agents/openclaw.cjs.map +1 -1
- package/dist/agents/opencode.cjs +16 -4
- package/dist/agents/opencode.cjs.map +1 -1
- package/dist/agents/plugin-extensions.cjs +71 -0
- package/dist/agents/plugin-extensions.cjs.map +1 -0
- package/dist/agents/plugin-extensions.d.cts +26 -0
- package/dist/agents/plugin-extensions.d.mts +26 -0
- package/dist/agents/plugin-extensions.d.ts +26 -0
- package/dist/agents/plugin-extensions.js +8 -0
- package/dist/agents/plugin-extensions.js.map +1 -0
- package/dist/agents/post-setup.cjs +14 -3
- package/dist/agents/post-setup.cjs.map +1 -1
- package/dist/agents/post-setup.d.cts +4 -2
- package/dist/agents/post-setup.d.mts +4 -2
- package/dist/agents/post-setup.d.ts +4 -2
- package/dist/agents/post-setup.js +8 -6
- package/dist/agents/sdk-streams.cjs +3 -3
- package/dist/agents/sdk-streams.cjs.map +1 -1
- package/dist/agents/{session-slot.cjs → session-key.cjs} +4 -4
- package/dist/agents/session-key.cjs.map +1 -0
- package/dist/agents/session-key.d.cts +12 -0
- package/dist/agents/session-key.d.mts +12 -0
- package/dist/agents/session-key.d.ts +12 -0
- package/dist/agents/session-key.js +6 -0
- package/dist/agents/session-key.js.map +1 -0
- package/dist/agents/shared.cjs +2 -2
- package/dist/agents/shared.cjs.map +1 -1
- package/dist/agents/shared.d.cts +4 -4
- package/dist/agents/shared.d.mts +4 -4
- package/dist/agents/shared.d.ts +4 -4
- package/dist/agents/skills.cjs.map +1 -1
- package/dist/agents/skills.d.cts +3 -3
- package/dist/agents/skills.d.mts +3 -3
- package/dist/agents/skills.d.ts +3 -3
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +55 -54
- package/dist/agents/types.d.mts +55 -54
- package/dist/agents/types.d.ts +55 -54
- package/dist/agents/ui-message-stream.cjs +4 -4
- package/dist/agents/ui-message-stream.cjs.map +1 -1
- package/dist/agents/unrecognized-events.cjs +32 -0
- package/dist/agents/unrecognized-events.cjs.map +1 -0
- package/dist/agents/unrecognized-events.d.cts +8 -0
- package/dist/agents/unrecognized-events.d.mts +8 -0
- package/dist/agents/unrecognized-events.d.ts +8 -0
- package/dist/agents/unrecognized-events.js +6 -0
- package/dist/agents/unrecognized-events.js.map +1 -0
- package/dist/assertions/api.cjs.map +1 -1
- package/dist/assertions/api.d.cts +3 -0
- package/dist/assertions/api.d.mts +3 -0
- package/dist/assertions/api.d.ts +3 -0
- package/dist/assertions/collection.cjs +1 -1
- package/dist/assertions/collection.cjs.map +1 -1
- package/dist/assertions/judge.cjs +1 -1
- package/dist/assertions/judge.cjs.map +1 -1
- package/dist/assertions/match.cjs +52 -21
- package/dist/assertions/match.cjs.map +1 -1
- package/dist/assertions/match.d.cts +16 -5
- package/dist/assertions/match.d.mts +16 -5
- package/dist/assertions/match.d.ts +16 -5
- package/dist/assertions/match.js +96 -94
- package/dist/assertions/measurements.cjs +22 -6
- package/dist/assertions/measurements.cjs.map +1 -1
- package/dist/assertions/measurements.d.cts +8 -1
- package/dist/assertions/measurements.d.mts +8 -1
- package/dist/assertions/measurements.d.ts +8 -1
- package/dist/assertions/numeric.cjs +2 -0
- package/dist/assertions/numeric.cjs.map +1 -1
- package/dist/assertions/numeric.d.cts +1 -1
- package/dist/assertions/numeric.d.mts +1 -1
- package/dist/assertions/numeric.d.ts +1 -1
- package/dist/assertions/quantity.cjs +42 -0
- package/dist/assertions/quantity.cjs.map +1 -0
- package/dist/assertions/quantity.d.cts +18 -0
- package/dist/assertions/quantity.d.mts +18 -0
- package/dist/assertions/quantity.d.ts +18 -0
- package/dist/assertions/quantity.js +22 -0
- package/dist/assertions/quantity.js.map +1 -0
- package/dist/assertions/record/attachment.cjs +2 -0
- package/dist/assertions/record/attachment.cjs.map +1 -1
- package/dist/assertions/record/codec.cjs +5 -1
- package/dist/assertions/record/codec.cjs.map +1 -1
- package/dist/assertions/record/model.cjs.map +1 -1
- package/dist/assertions/record/model.d.cts +3 -1
- package/dist/assertions/record/model.d.mts +3 -1
- package/dist/assertions/record/model.d.ts +3 -1
- package/dist/assertions/runtime.cjs +11 -6
- package/dist/assertions/runtime.cjs.map +1 -1
- package/dist/cli/program.cjs +3 -0
- package/dist/cli/program.cjs.map +1 -1
- package/dist/context/assert-first.cjs +6 -4
- package/dist/context/assert-first.cjs.map +1 -1
- package/dist/context/assert-first.d.cts +9 -3
- package/dist/context/assert-first.d.mts +9 -3
- package/dist/context/assert-first.d.ts +9 -3
- package/dist/context/notes.cjs +47 -0
- package/dist/context/notes.cjs.map +1 -0
- package/dist/context/notes.d.cts +10 -0
- package/dist/context/notes.d.mts +10 -0
- package/dist/context/notes.d.ts +10 -0
- package/dist/context/notes.js +6 -0
- package/dist/context/notes.js.map +1 -0
- package/dist/context/send-failures.cjs +1 -7
- package/dist/context/send-failures.cjs.map +1 -1
- package/dist/context/send-failures.d.cts +2 -3
- package/dist/context/send-failures.d.mts +2 -3
- package/dist/context/send-failures.d.ts +2 -3
- package/dist/context/send-retry.cjs +0 -1
- package/dist/context/send-retry.cjs.map +1 -1
- package/dist/context/send-retry.d.cts +1 -2
- package/dist/context/send-retry.d.mts +1 -2
- package/dist/context/send-retry.d.ts +1 -2
- package/dist/context/session.cjs +10 -17
- package/dist/context/session.cjs.map +1 -1
- package/dist/context/session.d.cts +4 -10
- package/dist/context/session.d.mts +4 -10
- package/dist/context/session.d.ts +4 -10
- package/dist/define.cjs +88 -65
- package/dist/define.cjs.map +1 -1
- package/dist/define.d.cts +3 -3
- package/dist/define.d.mts +3 -3
- package/dist/define.d.ts +3 -3
- package/dist/eval/cli/contribution.cjs +1 -1
- package/dist/eval/cli/contribution.cjs.map +1 -1
- package/dist/eval/host/index.cjs +1 -1
- package/dist/eval/host/index.cjs.map +1 -1
- package/dist/eval/record/evaluation.cjs +1 -1
- package/dist/eval/record/evaluation.cjs.map +1 -1
- package/dist/eval/record/membership-provenance.d.cts +3 -3
- package/dist/eval/record/membership-provenance.d.mts +3 -3
- package/dist/eval/record/membership-provenance.d.ts +3 -3
- package/dist/eval/record/score.cjs +2 -2
- package/dist/eval/record/score.cjs.map +1 -1
- package/dist/eval/record/sealed-assertion.cjs +1 -1
- package/dist/eval/record/sealed-assertion.cjs.map +1 -1
- package/dist/eval/record/verdict.cjs +2 -2
- package/dist/eval/record/verdict.cjs.map +1 -1
- package/dist/expect/index.cjs +10 -1
- package/dist/expect/index.cjs.map +1 -1
- package/dist/expect/index.d.cts +3 -1
- package/dist/expect/index.d.mts +3 -1
- package/dist/expect/index.d.ts +3 -1
- package/dist/expect/index.js +92 -76
- package/dist/expect/index.mjs +92 -76
- package/dist/experiment/host/cli/contribution.cjs +52 -39
- package/dist/experiment/host/cli/contribution.cjs.map +1 -1
- package/dist/experiment/host/cli/contribution.d.cts +18 -4
- package/dist/experiment/host/cli/contribution.d.mts +18 -4
- package/dist/experiment/host/cli/contribution.d.ts +18 -4
- package/dist/experiment/host/cli/contribution.js +2 -2
- package/dist/experiment/host/cli/debug-protocol.cjs +2 -2
- package/dist/experiment/host/cli/debug-protocol.cjs.map +1 -1
- package/dist/experiment/host/cli/debug-protocol.d.cts +2 -2
- package/dist/experiment/host/cli/debug-protocol.d.mts +2 -2
- package/dist/experiment/host/cli/debug-protocol.d.ts +2 -2
- package/dist/experiment/host/cli/output-protocol.cjs +1 -1
- package/dist/experiment/host/cli/output-protocol.cjs.map +1 -1
- package/dist/experiment/host/cli/output-protocol.d.cts +2 -2
- package/dist/experiment/host/cli/output-protocol.d.mts +2 -2
- package/dist/experiment/host/cli/output-protocol.d.ts +2 -2
- package/dist/experiment/host/current.cjs +2 -2
- package/dist/experiment/host/current.cjs.map +1 -1
- package/dist/experiment/host/index.cjs +1 -1
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/experiment/host/operations.cjs +21 -22
- package/dist/experiment/host/operations.cjs.map +1 -1
- package/dist/experiment/host/runtime.cjs +8 -9
- package/dist/experiment/host/runtime.cjs.map +1 -1
- package/dist/experiment/host/runtime.d.cts +3 -3
- package/dist/experiment/host/runtime.d.mts +3 -3
- package/dist/experiment/host/runtime.d.ts +3 -3
- package/dist/experiment/host/teardown.cjs +3 -3
- package/dist/experiment/host/teardown.cjs.map +1 -1
- package/dist/experiment/host/teardown.d.cts +3 -3
- package/dist/experiment/host/teardown.d.mts +3 -3
- package/dist/experiment/host/teardown.d.ts +3 -3
- package/dist/experiment/host/types.cjs.map +1 -1
- package/dist/experiment/host/types.d.cts +19 -19
- package/dist/experiment/host/types.d.mts +19 -19
- package/dist/experiment/host/types.d.ts +19 -19
- package/dist/index.cjs +3 -3
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -3
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +2 -2
- package/dist/index.mjs +2 -2
- package/dist/inspection/assertions.cjs +1 -1
- package/dist/inspection/assertions.cjs.map +1 -1
- package/dist/inspection/cli/contribution.cjs +8 -7
- package/dist/inspection/cli/contribution.cjs.map +1 -1
- package/dist/inspection/facts.cjs +4 -4
- package/dist/inspection/facts.cjs.map +1 -1
- package/dist/inspection/index.cjs +1 -5
- package/dist/inspection/index.cjs.map +1 -1
- package/dist/inspection/index.d.cts +1 -2
- package/dist/inspection/index.d.mts +1 -2
- package/dist/inspection/index.d.ts +1 -2
- package/dist/inspection/index.js +20 -26
- package/dist/inspection/lifecycle.cjs +7 -0
- package/dist/inspection/lifecycle.cjs.map +1 -0
- package/dist/inspection/lifecycle.d.cts +4 -0
- package/dist/inspection/lifecycle.d.mts +4 -0
- package/dist/inspection/lifecycle.d.ts +4 -0
- package/dist/inspection/lifecycle.js +6 -0
- package/dist/inspection/lifecycle.js.map +1 -0
- package/dist/inspection/notes.cjs +40 -0
- package/dist/inspection/notes.cjs.map +1 -0
- package/dist/inspection/notes.d.cts +12 -0
- package/dist/inspection/notes.d.mts +12 -0
- package/dist/inspection/notes.d.ts +12 -0
- package/dist/inspection/notes.js +8 -0
- package/dist/inspection/notes.js.map +1 -0
- package/dist/inspection/overview.cjs +12 -15
- package/dist/inspection/overview.cjs.map +1 -1
- package/dist/inspection/overview.d.cts +8 -6
- package/dist/inspection/overview.d.mts +8 -6
- package/dist/inspection/overview.d.ts +8 -6
- package/dist/inspection/planned-attempt.cjs +45 -0
- package/dist/inspection/planned-attempt.cjs.map +1 -0
- package/dist/inspection/planned-attempt.d.cts +109 -0
- package/dist/inspection/planned-attempt.d.mts +109 -0
- package/dist/inspection/planned-attempt.d.ts +109 -0
- package/dist/inspection/planned-attempt.js +24 -0
- package/dist/inspection/planned-attempt.js.map +1 -0
- package/dist/inspection/project-result.cjs +5 -5
- package/dist/inspection/project-result.cjs.map +1 -1
- package/dist/inspection/project-result.d.cts +58 -57
- package/dist/inspection/project-result.d.mts +58 -57
- package/dist/inspection/project-result.d.ts +58 -57
- package/dist/inspection/project-result.js +4 -4
- package/dist/inspection/project.cjs +3 -3
- package/dist/inspection/project.cjs.map +1 -1
- package/dist/inspection/protocol-values.cjs +1 -1
- package/dist/inspection/protocol-values.cjs.map +1 -1
- package/dist/inspection/protocol-values.d.cts +1 -1
- package/dist/inspection/protocol-values.d.mts +1 -1
- package/dist/inspection/protocol-values.d.ts +1 -1
- package/dist/inspection/protocol.cjs +8 -8
- package/dist/inspection/protocol.cjs.map +1 -1
- package/dist/inspection/protocol.d.cts +237 -219
- package/dist/inspection/protocol.d.mts +237 -219
- package/dist/inspection/protocol.d.ts +237 -219
- package/dist/inspection/public.cjs +1 -5
- package/dist/inspection/public.cjs.map +1 -1
- package/dist/inspection/public.d.cts +1 -2
- package/dist/inspection/public.d.mts +1 -2
- package/dist/inspection/public.d.ts +1 -2
- package/dist/inspection/public.js +14 -20
- package/dist/inspection/public.mjs +166 -129
- package/dist/inspection/query.cjs +1 -1
- package/dist/inspection/query.cjs.map +1 -1
- package/dist/inspection/results.cjs +61 -52
- package/dist/inspection/results.cjs.map +1 -1
- package/dist/inspection/results.d.cts +157 -140
- package/dist/inspection/results.d.mts +157 -140
- package/dist/inspection/results.d.ts +157 -140
- package/dist/inspection/select.cjs +33 -28
- package/dist/inspection/select.cjs.map +1 -1
- package/dist/inspection/source.cjs +1 -1
- package/dist/inspection/source.cjs.map +1 -1
- package/dist/inspection/sources.cjs +2 -2
- package/dist/inspection/sources.cjs.map +1 -1
- package/dist/inspection/trace.cjs +9 -8
- package/dist/inspection/trace.cjs.map +1 -1
- package/dist/inspection/trace.d.cts +4 -4
- package/dist/inspection/trace.d.mts +4 -4
- package/dist/inspection/trace.d.ts +4 -4
- package/dist/loaders/index.cjs +7 -279
- package/dist/loaders/index.cjs.map +1 -1
- package/dist/loaders/index.d.cts +2 -95
- package/dist/loaders/index.d.mts +2 -95
- package/dist/loaders/index.d.ts +2 -95
- package/dist/loaders/index.js +10 -12
- package/dist/loaders/index.mjs +10 -12
- package/dist/loaders/runtime.cjs +283 -0
- package/dist/loaders/runtime.cjs.map +1 -0
- package/dist/loaders/runtime.d.cts +95 -0
- package/dist/loaders/runtime.d.mts +95 -0
- package/dist/loaders/runtime.d.ts +95 -0
- package/dist/loaders/runtime.js +16 -0
- package/dist/loaders/runtime.js.map +1 -0
- package/dist/migrations/judge-provider.md +6 -6
- package/dist/{model-slots.cjs → model-roles.cjs} +12 -12
- package/dist/{model-slots.cjs.map → model-roles.cjs.map} +1 -1
- package/dist/{model-slots.d.cts → model-roles.d.cts} +10 -10
- package/dist/{model-slots.d.mts → model-roles.d.mts} +10 -10
- package/dist/{model-slots.d.ts → model-roles.d.ts} +10 -10
- package/dist/model-roles.js +14 -0
- package/dist/model-roles.js.map +1 -0
- package/dist/o11y/adapter-usage-projection.cjs +9 -8
- package/dist/o11y/adapter-usage-projection.cjs.map +1 -1
- package/dist/o11y/adapter-usage-projection.d.cts +23 -15
- package/dist/o11y/adapter-usage-projection.d.mts +23 -15
- package/dist/o11y/adapter-usage-projection.d.ts +23 -15
- package/dist/o11y/cache-read.cjs +14 -14
- package/dist/o11y/cache-read.cjs.map +1 -1
- package/dist/o11y/cache-read.d.cts +5 -5
- package/dist/o11y/cache-read.d.mts +5 -5
- package/dist/o11y/cache-read.d.ts +5 -5
- package/dist/o11y/derive.cjs.map +1 -1
- package/dist/o11y/derive.d.cts +2 -2
- package/dist/o11y/derive.d.mts +2 -2
- package/dist/o11y/derive.d.ts +2 -2
- package/dist/o11y/eval-usage.cjs +9 -9
- package/dist/o11y/eval-usage.cjs.map +1 -1
- package/dist/o11y/eval-usage.d.cts +7 -7
- package/dist/o11y/eval-usage.d.mts +7 -7
- package/dist/o11y/eval-usage.d.ts +7 -7
- package/dist/o11y/parsers/bub.cjs +57 -81
- package/dist/o11y/parsers/bub.cjs.map +1 -1
- package/dist/o11y/parsers/index.cjs.map +1 -1
- package/dist/o11y/parsers/index.d.cts +2 -0
- package/dist/o11y/parsers/index.d.mts +2 -0
- package/dist/o11y/parsers/index.d.ts +2 -0
- package/dist/o11y/parsers/opencode.cjs +129 -217
- package/dist/o11y/parsers/opencode.cjs.map +1 -1
- package/dist/o11y/parsers/opencode.d.cts +2 -5
- package/dist/o11y/parsers/opencode.d.mts +2 -5
- package/dist/o11y/parsers/opencode.d.ts +2 -5
- package/dist/o11y/types.cjs.map +1 -1
- package/dist/o11y/types.d.cts +1 -1
- package/dist/o11y/types.d.mts +1 -1
- package/dist/o11y/types.d.ts +1 -1
- package/dist/plugin/contracts.cjs +170 -120
- package/dist/plugin/contracts.cjs.map +1 -1
- package/dist/plugin/contracts.d.cts +102 -90
- package/dist/plugin/contracts.d.mts +102 -90
- package/dist/plugin/contracts.d.ts +102 -90
- package/dist/plugin/contracts.js +16 -12
- package/dist/plugin/index.cjs.map +1 -1
- package/dist/plugin/index.d.cts +1 -1
- package/dist/plugin/index.d.mts +1 -1
- package/dist/plugin/index.d.ts +1 -1
- package/dist/plugin/link.cjs +69 -64
- package/dist/plugin/link.cjs.map +1 -1
- package/dist/plugin/link.d.cts +5 -3
- package/dist/plugin/link.d.mts +5 -3
- package/dist/plugin/link.d.ts +5 -3
- package/dist/plugin/link.js +12 -8
- package/dist/record/codec/seal-manifest.d.cts +3 -3
- package/dist/record/codec/seal-manifest.d.mts +3 -3
- package/dist/record/codec/seal-manifest.d.ts +3 -3
- package/dist/record/family/attempt-note/definition.cjs +12 -0
- package/dist/record/family/attempt-note/definition.cjs.map +1 -0
- package/dist/record/family/attempt-note/definition.d.cts +6 -0
- package/dist/record/family/attempt-note/definition.d.mts +6 -0
- package/dist/record/family/attempt-note/definition.d.ts +6 -0
- package/dist/record/family/attempt-note/definition.js +6 -0
- package/dist/record/family/attempt-note/definition.js.map +1 -0
- package/dist/record/family/attempt-note/persistence.cjs +10 -0
- package/dist/record/family/attempt-note/persistence.cjs.map +1 -0
- package/dist/record/family/attempt-note/persistence.d.cts +6 -0
- package/dist/record/family/attempt-note/persistence.d.mts +6 -0
- package/dist/record/family/attempt-note/persistence.d.ts +6 -0
- package/dist/record/family/attempt-note/persistence.js +6 -0
- package/dist/record/family/attempt-note/persistence.js.map +1 -0
- package/dist/record/family/attempt-note/schema.cjs +20 -0
- package/dist/record/family/attempt-note/schema.cjs.map +1 -0
- package/dist/record/family/attempt-note/schema.d.cts +21 -0
- package/dist/record/family/attempt-note/schema.d.mts +21 -0
- package/dist/record/family/attempt-note/schema.d.ts +21 -0
- package/dist/record/family/attempt-note/schema.js +10 -0
- package/dist/record/family/attempt-note/schema.js.map +1 -0
- package/dist/record/family/catalog.cjs +32 -29
- package/dist/record/family/catalog.cjs.map +1 -1
- package/dist/record/family/catalog.d.cts +7 -2
- package/dist/record/family/catalog.d.mts +7 -2
- package/dist/record/family/catalog.d.ts +7 -2
- package/dist/record/family/current.cjs +48 -45
- package/dist/record/family/current.cjs.map +1 -1
- package/dist/record/family/current.d.cts +15 -0
- package/dist/record/family/current.d.mts +15 -0
- package/dist/record/family/current.d.ts +15 -0
- package/dist/record/model/index.js +66 -64
- package/dist/record/model/run-context.cjs +9 -3
- package/dist/record/model/run-context.cjs.map +1 -1
- package/dist/record/model/run-context.d.cts +9 -2
- package/dist/record/model/run-context.d.mts +9 -2
- package/dist/record/model/run-context.d.ts +9 -2
- package/dist/record/model/run-context.js +8 -6
- package/dist/record/model/seal-manifest.d.cts +1 -1
- package/dist/record/model/seal-manifest.d.mts +1 -1
- package/dist/record/model/seal-manifest.d.ts +1 -1
- package/dist/run/cli/contribution.cjs +6 -32
- package/dist/run/cli/contribution.cjs.map +1 -1
- package/dist/run/host/runtime.cjs +1 -1
- package/dist/run/host/runtime.cjs.map +1 -1
- package/dist/run/storage/sqlite.cjs +7 -7
- package/dist/run/storage/sqlite.cjs.map +1 -1
- package/dist/runner/adapter-usage.cjs +5 -3
- package/dist/runner/adapter-usage.cjs.map +1 -1
- package/dist/runner/adapter-usage.d.cts +2 -2
- package/dist/runner/adapter-usage.d.mts +2 -2
- package/dist/runner/adapter-usage.d.ts +2 -2
- package/dist/runner/adoption.cjs +9 -12
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/attempt-notes.cjs +8 -0
- package/dist/runner/attempt-notes.cjs.map +1 -0
- package/dist/runner/attempt-notes.d.cts +4 -0
- package/dist/runner/attempt-notes.d.mts +4 -0
- package/dist/runner/attempt-notes.d.ts +4 -0
- package/dist/runner/attempt-notes.js +8 -0
- package/dist/runner/attempt-notes.js.map +1 -0
- package/dist/runner/attempt.cjs +61 -73
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/runner/attempt.d.cts +3 -3
- package/dist/runner/attempt.d.mts +3 -3
- package/dist/runner/attempt.d.ts +3 -3
- package/dist/runner/command-plan.cjs +21 -26
- package/dist/runner/command-plan.cjs.map +1 -1
- package/dist/runner/command-plan.d.cts +4 -4
- package/dist/runner/command-plan.d.mts +4 -4
- package/dist/runner/command-plan.d.ts +4 -4
- package/dist/runner/command-plan.js +4 -4
- package/dist/runner/config-identity.cjs.map +1 -1
- package/dist/runner/config-identity.d.cts +2 -2
- package/dist/runner/config-identity.d.mts +2 -2
- package/dist/runner/config-identity.d.ts +2 -2
- package/dist/runner/discover.cjs +6 -6
- package/dist/runner/discover.cjs.map +1 -1
- package/dist/runner/eval-selection.cjs +2 -2
- package/dist/runner/eval-selection.cjs.map +1 -1
- package/dist/runner/eval-selection.d.cts +2 -2
- package/dist/runner/eval-selection.d.mts +2 -2
- package/dist/runner/eval-selection.d.ts +2 -2
- package/dist/runner/feedback/human.cjs +1 -1
- package/dist/runner/feedback/human.cjs.map +1 -1
- package/dist/runner/feedback/json.cjs +4 -2
- package/dist/runner/feedback/json.cjs.map +1 -1
- package/dist/runner/feedback/json.d.cts +1 -1
- package/dist/runner/feedback/json.d.mts +1 -1
- package/dist/runner/feedback/json.d.ts +1 -1
- package/dist/runner/feedback/sink.cjs +1 -1
- package/dist/runner/feedback/sink.cjs.map +1 -1
- package/dist/runner/feedback/sink.d.cts +1 -1
- package/dist/runner/feedback/sink.d.mts +1 -1
- package/dist/runner/feedback/sink.d.ts +1 -1
- package/dist/runner/fingerprint.cjs +1 -1
- package/dist/runner/fingerprint.cjs.map +1 -1
- package/dist/runner/project-target.cjs.map +1 -1
- package/dist/runner/project-target.d.cts +2 -2
- package/dist/runner/project-target.d.mts +2 -2
- package/dist/runner/project-target.d.ts +2 -2
- package/dist/runner/record/attachments.cjs +2 -2
- package/dist/runner/record/attachments.cjs.map +1 -1
- package/dist/runner/record/planning.cjs +8 -2
- package/dist/runner/record/planning.cjs.map +1 -1
- package/dist/runner/record.cjs +2 -0
- package/dist/runner/record.cjs.map +1 -1
- package/dist/runner/report.cjs +3 -3
- package/dist/runner/report.cjs.map +1 -1
- package/dist/runner/report.d.cts +1 -1
- package/dist/runner/report.d.mts +1 -1
- package/dist/runner/report.d.ts +1 -1
- package/dist/runner/reuse-plan.cjs +2 -2
- package/dist/runner/reuse-plan.cjs.map +1 -1
- package/dist/runner/run.cjs +10 -45
- package/dist/runner/run.cjs.map +1 -1
- package/dist/runner/sandbox-pool.cjs +1 -2
- package/dist/runner/sandbox-pool.cjs.map +1 -1
- package/dist/runner/setup-prefix-preparation.cjs +1 -1
- package/dist/runner/setup-prefix-preparation.cjs.map +1 -1
- package/dist/runner/teardown-registry.cjs +2 -2
- package/dist/runner/teardown-registry.cjs.map +1 -1
- package/dist/runner/teardown-registry.d.cts +1 -1
- package/dist/runner/teardown-registry.d.mts +1 -1
- package/dist/runner/teardown-registry.d.ts +1 -1
- package/dist/runner/types.cjs +4 -4
- package/dist/runner/types.cjs.map +1 -1
- package/dist/runner/types.d.cts +64 -93
- package/dist/runner/types.d.mts +64 -93
- package/dist/runner/types.d.ts +64 -93
- package/dist/runner/types.js +2 -2
- package/dist/sandbox/action.cjs +1 -1
- package/dist/sandbox/action.cjs.map +1 -1
- package/dist/sandbox/cli/contribution.cjs +17 -14
- package/dist/sandbox/cli/contribution.cjs.map +1 -1
- package/dist/sandbox/cli/contribution.d.cts +1 -1
- package/dist/sandbox/cli/contribution.d.mts +1 -1
- package/dist/sandbox/cli/contribution.d.ts +1 -1
- package/dist/sandbox/commands.cjs +1 -1
- package/dist/sandbox/commands.cjs.map +1 -1
- package/dist/sandbox/commands.d.cts +1 -1
- package/dist/sandbox/commands.d.mts +1 -1
- package/dist/sandbox/commands.d.ts +1 -1
- package/dist/sandbox/compose.cjs +2 -2
- package/dist/sandbox/compose.cjs.map +1 -1
- package/dist/sandbox/docker-profile/registry.cjs +5 -9
- package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
- package/dist/sandbox/docker-profile/registry.d.cts +0 -3
- package/dist/sandbox/docker-profile/registry.d.mts +0 -3
- package/dist/sandbox/docker-profile/registry.d.ts +0 -3
- package/dist/sandbox/docker-profile/registry.js +6 -12
- package/dist/sandbox/docker-profile/runtime.cjs +1 -1
- package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.cjs +12 -16
- package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.d.cts +2 -6
- package/dist/sandbox/docker-profile/schema.d.mts +2 -6
- package/dist/sandbox/docker-profile/schema.d.ts +2 -6
- package/dist/sandbox/docker-profile/schema.js +24 -32
- package/dist/sandbox/incus.cjs +2 -2
- package/dist/sandbox/incus.cjs.map +1 -1
- package/dist/sandbox/index.cjs +4 -35
- package/dist/sandbox/index.cjs.map +1 -1
- package/dist/sandbox/index.d.cts +4 -8
- package/dist/sandbox/index.d.mts +4 -8
- package/dist/sandbox/index.d.ts +4 -8
- package/dist/sandbox/index.js +116 -172
- package/dist/sandbox/index.mjs +116 -172
- package/dist/sandbox/layer.cjs +3 -3
- package/dist/sandbox/layer.cjs.map +1 -1
- package/dist/sandbox/link.cjs +5 -0
- package/dist/sandbox/link.cjs.map +1 -1
- package/dist/sandbox/link.d.cts +3 -0
- package/dist/sandbox/link.d.mts +3 -0
- package/dist/sandbox/link.d.ts +3 -0
- package/dist/sandbox/runtime.cjs +9 -4
- package/dist/sandbox/runtime.cjs.map +1 -1
- package/dist/shared/failure-class.cjs +5 -5
- package/dist/shared/failure-class.cjs.map +1 -1
- package/dist/shared/failure-class.d.cts +4 -10
- package/dist/shared/failure-class.d.mts +4 -10
- package/dist/shared/failure-class.d.ts +4 -10
- package/dist/shared/types.cjs.map +1 -1
- package/dist/shared/types.d.cts +1 -1
- package/dist/shared/types.d.mts +1 -1
- package/dist/shared/types.d.ts +1 -1
- package/dist/show/contribution.cjs +17 -2
- package/dist/show/contribution.cjs.map +1 -1
- package/dist/show/contribution.d.cts +14 -0
- package/dist/show/contribution.d.mts +14 -0
- package/dist/show/contribution.d.ts +14 -0
- package/dist/show/model.cjs +8 -5
- package/dist/show/model.cjs.map +1 -1
- package/dist/show/model.d.cts +11 -8
- package/dist/show/model.d.mts +11 -8
- package/dist/show/model.d.ts +11 -8
- package/dist/show/render.cjs +34 -22
- package/dist/show/render.cjs.map +1 -1
- package/dist/sources/projector.cjs +1 -1
- package/dist/sources/projector.cjs.map +1 -1
- package/dist/types.cjs +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.js +2 -2
- package/dist/view/app-dist/.vite/manifest.json +2 -2
- package/dist/view/app-dist/assets/{index-B3ijZRph.js → index-CxrOUvHC.js} +17 -17
- package/dist/view/app-dist/assets/{quality-cost-scatter-B--DfJ9s.js → quality-cost-scatter-B6Aiss7x.js} +1 -1
- package/dist/view/app-dist/index.html +1 -1
- package/dist/view/cli/contribution.cjs +1 -1
- package/dist/view/cli/contribution.cjs.map +1 -1
- package/dist/view/function-runtime.mjs +318 -121
- package/dist/view/http-protocol.d.cts +1 -1
- package/dist/view/http-protocol.d.mts +1 -1
- package/dist/view/http-protocol.d.ts +1 -1
- package/dist/view/inspection-host.cjs +2 -2
- package/dist/view/inspection-host.cjs.map +1 -1
- package/dist/view/inspection-host.d.cts +349 -331
- package/dist/view/inspection-host.d.mts +349 -331
- package/dist/view/inspection-host.d.ts +349 -331
- package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +6 -6
- package/docs-site/zh/examples/integrations/claude-sdk.mdx +5 -5
- package/docs-site/zh/examples/integrations/codex-sdk.mdx +4 -4
- package/docs-site/zh/examples/integrations/langgraph.mdx +4 -4
- package/docs-site/zh/examples/integrations/pi-sdk.mdx +5 -5
- package/docs-site/zh/explanation/adapter.mdx +6 -6
- package/docs-site/zh/explanation/assert.mdx +7 -7
- package/docs-site/zh/explanation/drive.mdx +4 -4
- package/docs-site/zh/explanation/hitl.mdx +2 -2
- package/docs-site/zh/explanation/judge.mdx +2 -2
- package/docs-site/zh/introduction.mdx +2 -2
- package/docs-site/zh/reference/builtin-agents.mdx +46 -49
- package/docs-site/zh/reference/cli.mdx +16 -14
- package/docs-site/zh/reference/define-agent.mdx +19 -19
- package/docs-site/zh/reference/define-config.mdx +7 -15
- package/docs-site/zh/reference/define-eval.mdx +20 -14
- package/docs-site/zh/reference/define-experiment.mdx +18 -39
- package/docs-site/zh/reference/events.mdx +1 -1
- package/docs-site/zh/reference/expect.mdx +21 -0
- package/docs-site/zh/reference/official-adapters.mdx +12 -5
- package/docs-site/zh/troubleshooting/debugging.mdx +2 -2
- package/docs-site/zh/troubleshooting/recover-after-kill.mdx +1 -1
- package/docs-site/zh/tutorials/agent-onboarding.mdx +2 -2
- package/docs-site/zh/tutorials/authoring.mdx +2 -2
- package/docs-site/zh/tutorials/compare-runs.mdx +1 -1
- package/docs-site/zh/tutorials/concurrency.mdx +8 -8
- package/docs-site/zh/tutorials/configuration.mdx +5 -5
- package/docs-site/zh/tutorials/control-run-cost.mdx +19 -19
- package/docs-site/zh/tutorials/eval-groups.mdx +1 -1
- package/docs-site/zh/tutorials/evaluation-kinds.mdx +5 -5
- package/docs-site/zh/tutorials/experiment-services.mdx +32 -32
- package/docs-site/zh/tutorials/handle-execution-failures.mdx +2 -28
- package/docs-site/zh/tutorials/plugins.mdx +49 -143
- package/docs-site/zh/tutorials/sandbox-agent.mdx +1 -1
- package/docs-site/zh/tutorials/sandbox-reuse.mdx +7 -7
- package/docs-site/zh/tutorials/upgrade-0-18.mdx +1 -1
- package/docs-site/zh/tutorials/upgrade-0-19.mdx +121 -0
- package/docs-site/zh/tutorials/upgrade-0-20.mdx +12 -0
- package/docs-site/zh/tutorials/verify-judge.mdx +2 -2
- package/docs-site/zh/tutorials/viewing-results.mdx +2 -2
- package/docs-site/zh/tutorials/write-experiment.mdx +1 -1
- package/docs-site/zh/tutorials/write-send.mdx +13 -13
- package/package.json +1 -1
- package/dist/agents/effect-runtime.cjs.map +0 -1
- package/dist/agents/effect-runtime.d.cts +0 -29
- package/dist/agents/effect-runtime.d.mts +0 -29
- package/dist/agents/effect-runtime.d.ts +0 -29
- package/dist/agents/effect-runtime.js +0 -16
- package/dist/agents/effect-runtime.js.map +0 -1
- package/dist/agents/session-slot.cjs.map +0 -1
- package/dist/agents/session-slot.d.cts +0 -12
- package/dist/agents/session-slot.d.mts +0 -12
- package/dist/agents/session-slot.d.ts +0 -12
- package/dist/agents/session-slot.js +0 -6
- package/dist/agents/session-slot.js.map +0 -1
- package/dist/model-slots.js +0 -14
- package/dist/model-slots.js.map +0 -1
package/dist/agents/types.d.ts
CHANGED
|
@@ -7,8 +7,8 @@ import type { SandboxLayer } from "../sandbox/layer.js";
|
|
|
7
7
|
import type { AttemptRef, MaybePromise, SandboxCommandTarget, StableSandboxCommand } from "../sandbox/commands.js";
|
|
8
8
|
import type { RegisteredSandboxContent } from "../sandbox/content.js";
|
|
9
9
|
import type { SendFailureClassifier } from "../context/send-failures.js";
|
|
10
|
-
import type {
|
|
11
|
-
export type {
|
|
10
|
+
import type { SessionKey } from "./session-key.js";
|
|
11
|
+
export type { SessionKey } from "./session-key.js";
|
|
12
12
|
/**
|
|
13
13
|
* 本地 stdio 形态的 MCP server:沙箱内起子进程,按 stdio 说 MCP 协议。
|
|
14
14
|
* 与 {@link McpHttpServer} 按形状判别(有 `command` 的是 stdio,有 `url` 的是 HTTP)。
|
|
@@ -45,8 +45,8 @@ export interface McpHttpServer {
|
|
|
45
45
|
/**
|
|
46
46
|
* MCP server 描述符 —— 支持 MCP 的 adapter(Claude Code / Codex)共用的工具服务单元,
|
|
47
47
|
* 不是 native plugin 的一种。stdio 与 Streamable HTTP 两种形态按形状判别,不设 kind 标签
|
|
48
|
-
* (两种形态各有唯一必填判别字段);同时给出 `command` 与 `url` 属配置错误,
|
|
49
|
-
* 在 agent factory config 里声明,
|
|
48
|
+
* (两种形态各有唯一必填判别字段);同时给出 `command` 与 `url` 属配置错误,before 报错点名。
|
|
49
|
+
* 在 agent factory config 里声明,before 阶段写进各自的配置文件。
|
|
50
50
|
* 见 docs/feature/adapters/architecture/coding-agent-extensions.md「类型边界」。
|
|
51
51
|
*/
|
|
52
52
|
export type McpServer = McpStdioServer | McpHttpServer;
|
|
@@ -65,13 +65,13 @@ export type SkillSpec = {
|
|
|
65
65
|
kind: "repo";
|
|
66
66
|
/** GitHub `owner/repo` 或 Git URL。 */
|
|
67
67
|
source: string;
|
|
68
|
-
/** 多 Skill Repo 中要启用的 Skill;repo 只有一个 Skill 时可省略,多个时省略即
|
|
68
|
+
/** 多 Skill Repo 中要启用的 Skill;repo 只有一个 Skill 时可省略,多个时省略即 before 失败。 */
|
|
69
69
|
skills?: readonly string[];
|
|
70
70
|
/** Tag、Commit 或 Branch;省略表示 repo 默认 ref。 */
|
|
71
71
|
ref?: string;
|
|
72
72
|
};
|
|
73
73
|
/** Manifest 里的一条 Skill 安装记录:本地(带内容哈希)或 repo(带来源与 ref)。 */
|
|
74
|
-
export type
|
|
74
|
+
export type AgentInstallationSkill = {
|
|
75
75
|
kind: "local";
|
|
76
76
|
name: string;
|
|
77
77
|
path: string;
|
|
@@ -83,15 +83,15 @@ export type AgentSetupSkill = {
|
|
|
83
83
|
skills: string[];
|
|
84
84
|
};
|
|
85
85
|
/**
|
|
86
|
-
* 一次 Agent
|
|
87
|
-
* `ctx.
|
|
86
|
+
* 一次 Agent before 实际装了什么 —— 沙箱型 Coding Agent Adapter 在 before 收尾经
|
|
87
|
+
* `ctx.reportInstallation()` 交回的安装清单。它是宿主侧内存对象,运行器把它作为 attempt artifact 存成
|
|
88
88
|
* `agent-setup.json`(见 docs/feature/record/architecture.md);沙箱磁盘上不落它。不参与评分,
|
|
89
89
|
* 只回答「这次实际装了什么」;**环境变量值与 secret 不写进来**(所以 mcpServers 只记
|
|
90
90
|
* name/command/args)。
|
|
91
91
|
*/
|
|
92
|
-
export interface
|
|
92
|
+
export interface AgentInstallationManifest {
|
|
93
93
|
/** 装进去的 Skill(按配置顺序;同名来自多个来源时逐条保留,不静默合并)。 */
|
|
94
|
-
skills:
|
|
94
|
+
skills: AgentInstallationSkill[];
|
|
95
95
|
/** Agent 原生 Plugin(Claude Code / Codex 各自的 Marketplace 协议)。 */
|
|
96
96
|
nativePlugins?: Array<{
|
|
97
97
|
agent: "claude-code" | "codex";
|
|
@@ -229,7 +229,7 @@ export interface Telemetry {
|
|
|
229
229
|
}
|
|
230
230
|
/**
|
|
231
231
|
* agent 的 OTLP 导出配置 —— 「沙箱里怎么让这个 CLI 把 trace 发到 endpoint」。
|
|
232
|
-
* 刻意从
|
|
232
|
+
* 刻意从 before 里拆出来:before 管运行配置,这里只管 otel 导出。CLI 安装归 `agent.ensure`。两种投递方式
|
|
233
233
|
* (互不排斥,按 CLI 而定):
|
|
234
234
|
* · env-based(标准 OTEL_* 环境变量,如 bub/Python OTel SDK)—— 用 `env`;
|
|
235
235
|
* · file-based(CLI 自有配置文件,如 codex 的 config.toml [otel] 块)—— 用 `configure`。
|
|
@@ -257,8 +257,8 @@ export interface AgentTracing {
|
|
|
257
257
|
env?(endpoint: string): globalThis.Record<string, string>;
|
|
258
258
|
/**
|
|
259
259
|
* file-based 导出:给 sandbox + ctx(ctx.telemetry.endpoint 必有),自己写 / 追加配置文件。
|
|
260
|
-
* 运行器在 agent.
|
|
261
|
-
* 注:codex 的 [otel.trace_exporter.otlp-http] 是子表,configure 在
|
|
260
|
+
* 运行器在 agent.before 之后、首次 send 之前调一次(仅当 tracing 开 + 有 endpoint)。
|
|
261
|
+
* 注:codex 的 [otel.trace_exporter.otlp-http] 是子表,configure 在 before 写完主配置后
|
|
262
262
|
* 追加到 config.toml 末尾,天然满足「子表在所有上层表之后」。
|
|
263
263
|
*/
|
|
264
264
|
configure?(sandbox: Sandbox, ctx: SandboxAgentContext): Promise<void> | void;
|
|
@@ -267,19 +267,19 @@ export interface AgentTracing {
|
|
|
267
267
|
* 一条会话线。核心承诺只有一句:**同一条会话线的每次 send 拿到同一个 `ctx.session`,
|
|
268
268
|
* 新会话线(eval 第一轮 / t.newSession() 之后)拿到一个全新的。**
|
|
269
269
|
* 服务端历史用 `id` / `capture`,客户端历史与 HITL 停轮现场用 Adapter
|
|
270
|
-
* 私有的 typed
|
|
270
|
+
* 私有的 typed key。"第一轮"是新会话线的自然形态,没有要判断的分支。
|
|
271
271
|
*/
|
|
272
272
|
export interface AgentSession {
|
|
273
273
|
/** 会话续接:服务端记历史。本线记过的会话 id;新会话线是 undefined。 */
|
|
274
274
|
readonly id?: string;
|
|
275
275
|
/** 记回传的会话 id;只在还没记过时落地(first-writer-wins),空值忽略。 */
|
|
276
276
|
capture(id: string | undefined): void;
|
|
277
|
-
/** 读 Adapter 私有
|
|
278
|
-
get<T>(
|
|
279
|
-
/** 写 Adapter 私有
|
|
280
|
-
set<T>(
|
|
281
|
-
/** 读并删除 Adapter 私有
|
|
282
|
-
take<T>(
|
|
277
|
+
/** 读 Adapter 私有 key;新会话线或未写过的 key 为空。 */
|
|
278
|
+
get<T>(key: SessionKey<T>): T | undefined;
|
|
279
|
+
/** 写 Adapter 私有 key;同一 key 再写覆盖旧值。 */
|
|
280
|
+
set<T>(key: SessionKey<T>, value: T): void;
|
|
281
|
+
/** 读并删除 Adapter 私有 key,只消费一次。 */
|
|
282
|
+
take<T>(key: SessionKey<T>): T | undefined;
|
|
283
283
|
}
|
|
284
284
|
/** Runner-owned Attempt resource registry; adapters use it for cross-send drivers. */
|
|
285
285
|
export interface AttemptResourceRegistry {
|
|
@@ -297,7 +297,7 @@ export interface AgentContext {
|
|
|
297
297
|
* `Effect.timeoutTo` 兜底强制收尾(停 Sandbox 容器)。
|
|
298
298
|
*/
|
|
299
299
|
readonly signal: AbortSignal;
|
|
300
|
-
/** 本次 attempt 用的模型名,透传自 experiment 的 `model` 字段。sandbox 型 agent 通常在
|
|
300
|
+
/** 本次 attempt 用的模型名,透传自 experiment 的 `model` 字段。sandbox 型 agent 通常在 before 里用它写配置,direct 型通常在 send 里用它选模型。 */
|
|
301
301
|
readonly model?: string;
|
|
302
302
|
/** 模型推理努力程度;归属同 model——实验决定,省略时不覆盖 agent 原生默认。 */
|
|
303
303
|
readonly reasoningEffort?: string;
|
|
@@ -342,7 +342,7 @@ export interface AgentContext {
|
|
|
342
342
|
/**
|
|
343
343
|
* 作用域反馈:报告此刻正在做什么(turn / tool / 安装进度)。短命状态——Human profile
|
|
344
344
|
* 更新 active 行,`agent`/`ci` 不逐条打印,也不进最终结果;不要每个 token/delta 都调用。
|
|
345
|
-
* runner 按当前回调所处的生命周期阶段(agent.
|
|
345
|
+
* runner 按当前回调所处的生命周期阶段(agent.before / agent.run / agent.after)归因,
|
|
346
346
|
* 调用方不能冒充其它阶段(见 docs/feature/experiments/library.md)。
|
|
347
347
|
*/
|
|
348
348
|
progress(update: ProgressUpdate): void;
|
|
@@ -362,39 +362,40 @@ export interface AgentContext {
|
|
|
362
362
|
export interface SandboxAgentContext extends AgentContext {
|
|
363
363
|
readonly sandbox: Sandbox;
|
|
364
364
|
}
|
|
365
|
-
/** Per-send context;
|
|
366
|
-
export interface AgentSendContext extends
|
|
365
|
+
/** Per-send context; before and after deliberately never receive a turn identity. */
|
|
366
|
+
export interface AgentSendContext extends SandboxAgentContext {
|
|
367
367
|
readonly turnId: import("../record/family/source-receipt/model.js").TurnId;
|
|
368
368
|
}
|
|
369
|
-
export interface SandboxAgentSendContext extends
|
|
370
|
-
readonly turnId: import("../record/family/source-receipt/model.js").TurnId;
|
|
369
|
+
export interface SandboxAgentSendContext extends AgentSendContext {
|
|
371
370
|
}
|
|
372
371
|
/**
|
|
373
|
-
* Agent `
|
|
374
|
-
* 安装事实在这一步产生,`send` / `
|
|
372
|
+
* Agent `before` 的上下文:沙箱上下文再加一条宿主侧安装清单回执通道。只有 `before` 收得到它——
|
|
373
|
+
* 安装事实在这一步产生,`send` / `after` 不再补写。
|
|
375
374
|
*/
|
|
376
|
-
export interface
|
|
375
|
+
export interface AgentBeforeContext extends SandboxAgentContext {
|
|
377
376
|
/**
|
|
378
377
|
* 交回这次实际安装了什么(Skill / 原生 Plugin / MCP / 原生配置文件)。清单是宿主侧内存对象,
|
|
379
378
|
* 运行器直接存成 attempt artifact `agent-setup.json`;沙箱里不落任何框架文件
|
|
380
379
|
* (见 docs/observability.md「宿主侧行为断言:t.o11y」)。什么都没装就别调——空清单不生成
|
|
381
|
-
* artifact。同一次 `
|
|
380
|
+
* artifact。同一次 `before` 内多次调用后写覆盖先写。
|
|
382
381
|
*/
|
|
383
|
-
|
|
382
|
+
reportInstallation(manifest: AgentInstallationManifest): void;
|
|
384
383
|
}
|
|
385
384
|
/**
|
|
386
385
|
* agent 自己的沙箱运行时生命周期(每个 Attempt 一次,与「每轮 send」分开):
|
|
387
|
-
* CLI 安装属于 runner 的 agent.ensure;`
|
|
388
|
-
* 跑起来(第一次 fresh / 后续 resume)+ 解析 transcript,`
|
|
389
|
-
* 运行器在 layer prepare → agent.ensure → baseline 后、第一次 send 前调一次 `
|
|
390
|
-
* `
|
|
391
|
-
* 的现场同样要扫尾),在 finally 里跑。要把 `
|
|
386
|
+
* CLI 安装属于 runner 的 agent.ensure;`before` 只写 model/base/auth 等本 Attempt 运行配置,`send` 只管把一轮 prompt
|
|
387
|
+
* 跑起来(第一次 fresh / 后续 resume)+ 解析 transcript,`after` 清理。
|
|
388
|
+
* 运行器在 layer prepare → agent.ensure → baseline 后、第一次 send 前调一次 `before`,不返回值;
|
|
389
|
+
* `after` 当且仅当本 attempt 走到过 `before` 时点才执行(`before` 抛错不豁免——半初始化
|
|
390
|
+
* 的现场同样要扫尾),在 finally 里跑。要把 `before` 里创建的句柄传给 `after`,以
|
|
392
391
|
* `sandbox` 实例为键存取(同一个 Agent 实例服务并发 attempt,不要用实例字段或模块变量)。
|
|
393
392
|
*/
|
|
394
|
-
export
|
|
395
|
-
|
|
396
|
-
export type
|
|
397
|
-
export type
|
|
393
|
+
export interface SandboxAgentBeforeContext extends AgentBeforeContext {
|
|
394
|
+
}
|
|
395
|
+
export type AgentBefore = (sandbox: Sandbox, ctx: AgentBeforeContext) => MaybePromise<void>;
|
|
396
|
+
export type AgentAfter = (sandbox: Sandbox, ctx: SandboxAgentContext) => MaybePromise<void>;
|
|
397
|
+
export type DirectAgentBefore = (ctx: AgentContext) => MaybePromise<void>;
|
|
398
|
+
export type DirectAgentAfter = (ctx: AgentContext) => MaybePromise<void>;
|
|
398
399
|
/**
|
|
399
400
|
* 本 agent 的原生 OTLP span → canonical GenAI semconv 的薄 mapper。
|
|
400
401
|
* 由 adapter 声明(和 tracing.env 一样属于「连到谁」的特殊性),core 只调接口——
|
|
@@ -413,8 +414,8 @@ interface AgentBase {
|
|
|
413
414
|
/**
|
|
414
415
|
* 可选 send 执行失败分类器:归类 adapter reject 的 `SendFailure`;可信的 failed Turn
|
|
415
416
|
* 是领域结果,不进入这条链。
|
|
416
|
-
* 返回 `undefined`
|
|
417
|
-
*
|
|
417
|
+
* 返回 `undefined` 表示不认识、回落保守兜底。抛出点的内建失败声明优先。
|
|
418
|
+
* 分类器只声明决策轴与诊断词,不影响重试策略(次数、
|
|
418
419
|
* 退避对所有 agent 一致);抛错按 `undefined` 回落并被吞掉,不掩盖原始失败。形状与分类链、
|
|
419
420
|
* 执行体时序见 docs/feature/error-classification/architecture.md。
|
|
420
421
|
*/
|
|
@@ -533,22 +534,22 @@ export interface SandboxAgent extends AgentBase {
|
|
|
533
534
|
readonly kind: "sandbox";
|
|
534
535
|
/** Adapter-owned command-only contribution to the unified Sandbox action DAG. */
|
|
535
536
|
readonly sandbox?: SandboxLayer<"command-only">;
|
|
536
|
-
/** Runner 在 author layers 后、
|
|
537
|
+
/** Runner 在 author layers 后、before 前按声明顺序执行。 */
|
|
537
538
|
readonly ensure: readonly AgentEnsure[];
|
|
538
539
|
/** 官方或第三方随 adapter 提供的安装层;仅 identity 精确匹配时可接手。 */
|
|
539
540
|
readonly installers: readonly AgentInstaller[];
|
|
540
|
-
|
|
541
|
+
before?: AgentBefore;
|
|
541
542
|
tracing?: AgentTracing;
|
|
542
543
|
send(input: TurnInput, ctx: SandboxAgentSendContext): Promise<Turn>;
|
|
543
|
-
|
|
544
|
+
after?: AgentAfter;
|
|
544
545
|
}
|
|
545
546
|
/** 由 runner 直接调用函数、SDK 或服务端点的 Agent;目标进程可以在本地或远端。 */
|
|
546
547
|
export interface DirectAgent extends AgentBase {
|
|
547
548
|
readonly kind: "direct";
|
|
548
|
-
|
|
549
|
+
before?: DirectAgentBefore;
|
|
549
550
|
tracing?: Omit<AgentTracing, "configure">;
|
|
550
551
|
send(input: TurnInput, ctx: AgentSendContext): Promise<Turn>;
|
|
551
|
-
|
|
552
|
+
after?: DirectAgentAfter;
|
|
552
553
|
}
|
|
553
554
|
/** 注册表里的 Agent;判别值描述驱动拓扑,不描述目标所在位置。 */
|
|
554
555
|
export type Agent = SandboxAgent | DirectAgent;
|
|
@@ -572,8 +573,8 @@ export interface SandboxAgentDef {
|
|
|
572
573
|
* 本 Attempt 内不变的运行配置)。CLI 的 probe、安装与复检属于 `agent.ensure`。运行器在 Sandbox
|
|
573
574
|
* 备好(layer prepare/ensure/baseline 之后)、第一次 send 前调用一次,不返回值。
|
|
574
575
|
*/
|
|
575
|
-
|
|
576
|
-
/** OTLP 导出配置:Sandbox 里怎么让 CLI 把 trace 发到 endpoint(env / 配置文件),从
|
|
576
|
+
before?: AgentBefore;
|
|
577
|
+
/** OTLP 导出配置:Sandbox 里怎么让 CLI 把 trace 发到 endpoint(env / 配置文件),从 before 拆出。 */
|
|
577
578
|
tracing?: AgentTracing;
|
|
578
579
|
/** 原生 span → canonical 的薄 mapper;省略走通用 heuristic。只影响瀑布图。 */
|
|
579
580
|
spanMapper?: SpanMapper;
|
|
@@ -581,9 +582,9 @@ export interface SandboxAgentDef {
|
|
|
581
582
|
send(input: TurnInput, ctx: SandboxAgentSendContext): Promise<Turn>;
|
|
582
583
|
/** 可选 send 执行失败分类器:见 `Agent.classifySendFailure`。 */
|
|
583
584
|
classifySendFailure?: SendFailureClassifier;
|
|
584
|
-
/** Sandbox 销毁前的清理,当且仅当本 attempt 走到过 `
|
|
585
|
+
/** Sandbox 销毁前的清理,当且仅当本 attempt 走到过 `before` 时点才执行(`before` 抛错不豁免),
|
|
585
586
|
* 在 finally 里跑一次。 */
|
|
586
|
-
|
|
587
|
+
after?: AgentAfter;
|
|
587
588
|
}
|
|
588
589
|
/** `defineAgent()` 的入参形状(见 src/define.ts)——`kind: "direct"` 由 define 固定填入,不由用户声明。 */
|
|
589
590
|
export interface DirectAgentDef {
|
|
@@ -594,7 +595,7 @@ export interface DirectAgentDef {
|
|
|
594
595
|
/**
|
|
595
596
|
* 每个 attempt 一次。Direct Agent 不接收 Sandbox;常用于建立连接、鉴权等一次性准备。
|
|
596
597
|
*/
|
|
597
|
-
|
|
598
|
+
before?: DirectAgentBefore;
|
|
598
599
|
/** OTLP 导出配置:被测对象怎么把 trace 发到 endpoint(env-based 注入)。 */
|
|
599
600
|
tracing?: Omit<AgentTracing, "configure">;
|
|
600
601
|
/** 原生 span → canonical 的薄 mapper;省略走通用 heuristic。只影响瀑布图。 */
|
|
@@ -603,7 +604,7 @@ export interface DirectAgentDef {
|
|
|
603
604
|
send(input: TurnInput, ctx: AgentSendContext): Promise<Turn>;
|
|
604
605
|
/** 可选 send 执行失败分类器:见 `Agent.classifySendFailure`。 */
|
|
605
606
|
classifySendFailure?: SendFailureClassifier;
|
|
606
|
-
/** 运行结束前的清理,当且仅当本 attempt 走到过 `
|
|
607
|
+
/** 运行结束前的清理,当且仅当本 attempt 走到过 `before` 时点才执行(`before` 抛错不豁免),
|
|
607
608
|
* 在 finally 里跑一次。 */
|
|
608
|
-
|
|
609
|
+
after?: DirectAgentAfter;
|
|
609
610
|
}
|
|
@@ -32,7 +32,7 @@ const define_ts_1 = require("../define.cjs");
|
|
|
32
32
|
const send_failures_ts_1 = require("../context/send-failures.cjs");
|
|
33
33
|
const external_cause_ts_1 = require("../shared/external-cause.cjs");
|
|
34
34
|
const coverage_ts_1 = require("../assertions/coverage.cjs");
|
|
35
|
-
const
|
|
35
|
+
const session_key_ts_1 = require("./session-key.cjs");
|
|
36
36
|
const command_projection_ts_1 = require("../o11y/command-projection.cjs");
|
|
37
37
|
// UI Message Stream 帧里没有 usage(协议本身不带 token 计数,见 docs/engineering/testing/e2e/README.md
|
|
38
38
|
// 第 2 节);events/actions/messages/status 都直接来自完整归约的协议帧,和 turnFromAiSdk/aiSdkAgent
|
|
@@ -42,8 +42,8 @@ const COVERAGE = Object.freeze({
|
|
|
42
42
|
...coverage_ts_1.completeEvidenceCoverage,
|
|
43
43
|
usage: { status: "unavailable", reason: "UI Message Stream frames carry no token usage" },
|
|
44
44
|
});
|
|
45
|
-
const historySlot = (0,
|
|
46
|
-
const sessionStateSlot = (0,
|
|
45
|
+
const historySlot = (0, session_key_ts_1.createSessionKey)("ui-message-stream/history");
|
|
46
|
+
const sessionStateSlot = (0, session_key_ts_1.createSessionKey)("ui-message-stream/state");
|
|
47
47
|
// ai 是可选 peer 依赖:动态 import,缺了就把「装什么」直接说清楚。
|
|
48
48
|
// 说明符经变量传入,避免 TS 对字面量模块名做安装检查(niceeval 自身不依赖 ai)。
|
|
49
49
|
let aiModule;
|
|
@@ -467,7 +467,7 @@ function uiMessageStreamSendEffect(options, input, ctx) {
|
|
|
467
467
|
* });
|
|
468
468
|
* ```
|
|
469
469
|
*/
|
|
470
|
-
// @concord-code
|
|
470
|
+
// @concord-code
|
|
471
471
|
// @concord-implements docs/feature/adapters/README.md
|
|
472
472
|
// @concord-implements docs/feature/adapters/sdk/ai-sdk/README.md
|
|
473
473
|
function uiMessageStreamAgent(options) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-message-stream.js","sourceRoot":"","sources":["ui-message-stream.ts"],"names":[],"mappings":"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","sourcesContent":["// uiMessageStreamAgent():AI SDK UI Message Stream Protocol 的无侵入 HTTP adapter 工厂。\n//\n// 协议:https://ai-sdk.dev/docs/ai-sdk-ui/stream-protocol —— `useChat` 后端的标准 SSE\n// (`data: {UIMessageChunk}\\n\\n`,以 `data: [DONE]\\n\\n` 收尾)。这是「对着一个已部署的\n// AI SDK 应用的 HTTP 接口无侵入接入」:adapter 只 fetch,不 import 被测应用的任何代码。\n//\n// · 会话:协议是服务端零状态、「客户端带全量历史」——工厂用 typed slot 存整份\n// UIMessage[],每轮原样重放;ctx.session.id 未记录时开新 chat id 并 capture 回写。\n// · 事件流:从归约后的 assistant 消息 parts 直构(text → message,tool part 的\n// approval-requested → operation.started,output-available / output-error / 审批拒绝\n// → operation.finished),\n// 不要求应用接 OTel;跨 resume 轮次按 callId / 已报文本长度去重。\n// · HITL:v7 tool approval(`needsApproval` 工具)——part 停在 `approval-requested` 时\n// 整轮 `waiting` + `input.requested`;下一轮输入(approve / yes / 同意 / 批准 开头 =\n// 批准,其余拒绝)翻译成 `approval-responded` 原地改写该 part、原样重发 messages 触发\n// 服务端续跑 —— 和真实前端 `addToolApprovalResponse()` + `sendMessage()` 的协议行为\n// 完全一致,没有单独的 approve 端点。拒绝的调用协议里不会有任何 tool-output 帧\n// (从没真正执行),由工厂合成 `status: \"rejected\"` 的 operation.finished。\n// · chunk 归约用 `ai` 包官方导出的框架无关 reducer `readUIMessageStream`(`useChat`\n// 内部同款),保证重放回服务端的 UIMessage 形状协议正确 —— `ai` 是可选 peer 依赖,\n// 只在用到本工厂时需要安装。\n//\n// tracing / spanMapper 原样透传:应用有 OTel 时接上拿瀑布图(span 只进瀑布图,不喂断言),\n// 事件流始终从协议帧直构。\nimport { randomUUID } from \"node:crypto\";\nimport { Effect } from \"effect\";\nimport { makeDirectAgent } from \"../define.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport type { Agent, AgentContext, AgentTracing, CommandProjection, EvidenceCoverage, InputResponse, JsonValue, SpanMapper, StreamEvent, TurnInput } from \"../types.ts\";\nimport { createSessionSlot } from \"./session-slot.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\n// UI Message Stream 帧里没有 usage(协议本身不带 token 计数,见 docs/engineering/testing/e2e/README.md\n// 第 2 节);events/actions/messages/status 都直接来自完整归约的协议帧,和 turnFromAiSdk/aiSdkAgent\n// 同等完整——官方 SDK 适配器应声明全通道 complete(docs/feature/adapters/architecture/evidence.md),\n// 这里唯一的例外是协议本身没有的 usage 通道,如实标 unavailable 而不是留成 unknown。\nconst COVERAGE: EvidenceCoverage = Object.freeze({\n ...completeEvidenceCoverage,\n usage: { status: \"unavailable\" as const, reason: \"UI Message Stream frames carry no token usage\" },\n});\n// ───────────────────────── 协议的结构化类型(structural,不依赖 ai 包的类型) ─────────────────────────\n/** UIMessage 的最小结构面:只声明工厂真正要读的字段,其余原样透传。 */\nexport interface UIMessageLike {\n id: string;\n role: string;\n parts: UIMessagePartLike[];\n [key: string]: JsonValue | UIMessagePartLike[] | undefined;\n}\nexport interface UIMessagePartLike {\n type: string;\n state?: string;\n text?: string;\n toolCallId?: string;\n toolName?: string;\n input?: JsonValue;\n output?: JsonValue;\n errorText?: string;\n approval?: {\n id: string;\n approved?: boolean;\n reason?: string;\n };\n [key: string]: JsonValue | undefined;\n}\ninterface UIMessageChunkLike {\n type: string;\n errorText?: string;\n [key: string]: JsonValue | undefined;\n}\ninterface UiMessageSessionState {\n chatId?: string;\n reported?: ReportedState;\n}\nconst historySlot = createSessionSlot<UIMessageLike[]>(\"ui-message-stream/history\");\nconst sessionStateSlot = createSessionSlot<UiMessageSessionState>(\"ui-message-stream/state\");\ntype ReadUIMessageStream = (options: {\n message?: UIMessageLike;\n stream: ReadableStream<UIMessageChunkLike>;\n}) => AsyncIterable<UIMessageLike>;\n// ai 是可选 peer 依赖:动态 import,缺了就把「装什么」直接说清楚。\n// 说明符经变量传入,避免 TS 对字面量模块名做安装检查(niceeval 自身不依赖 ai)。\nlet aiModule: Promise<{\n readUIMessageStream: ReadUIMessageStream;\n}> | undefined;\nfunction missingAiModule(): Error {\n return new Error(\"uiMessageStreamAgent 需要 `ai` 包(AI SDK v5+,协议 reducer readUIMessageStream 来自它)。在你的 eval 项目里安装:npm install -D ai\");\n}\n/** Dynamic import is an SDK Promise boundary; a rejected load is never cached. */\nfunction loadAiEffect(): Effect.Effect<{\n readUIMessageStream: ReadUIMessageStream;\n}, Error> {\n const pending = aiModule;\n return Effect.tryPromise({\n try: () => {\n if (pending !== undefined)\n return pending;\n const specifier = \"ai\";\n const loading = __niceevalDynamicImport(specifier) as Promise<{\n readUIMessageStream: ReadUIMessageStream;\n }>;\n aiModule = loading;\n return loading;\n },\n catch: () => missingAiModule(),\n }).pipe(Effect.tapError(() => Effect.sync(() => {\n aiModule = undefined;\n })));\n}\n// ───────────────────────── SSE 解析 ─────────────────────────\nfunction drainSseEvents(buffer: string, controller: TransformStreamDefaultController<UIMessageChunkLike>, onChunk: (chunk: UIMessageChunkLike) => void, onDone: () => void): string {\n for (;;) {\n const sepIndex = buffer.indexOf(\"\\n\\n\");\n if (sepIndex === -1)\n return buffer;\n const rawEvent = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const line = rawEvent.split(\"\\n\").find((candidate) => candidate.startsWith(\"data: \"));\n if (!line)\n continue;\n const payload = line.slice(\"data: \".length);\n if (payload === \"[DONE]\") {\n onDone();\n // `[DONE]` is the protocol terminal, not an advisory event. Closing the\n // reducer input here prevents frames later in the same network chunk (or\n // later chunks) from manufacturing a successful Turn after termination.\n controller.terminate();\n return \"\";\n }\n const chunk = JSON.parse(payload) as UIMessageChunkLike;\n onChunk(chunk);\n controller.enqueue(chunk);\n }\n}\n/**\n * Build the AI SDK reducer input with native stream composition rather than a hand-owned reader.\n * Scope finalization below aborts/cancels this pipeline, so an interrupted reducer cannot retain a\n * body reader or live HTTP transport.\n */\nfunction toChunkStream(body: ReadableStream<Uint8Array>, onChunk: (c: UIMessageChunkLike) => void, onDone: () => void): ReadableStream<UIMessageChunkLike> {\n const decoder = new TextDecoder();\n let buffer = \"\";\n return body.pipeThrough(new TransformStream<Uint8Array, UIMessageChunkLike>({\n transform(value, controller) {\n buffer += decoder.decode(value, { stream: true });\n buffer = drainSseEvents(buffer, controller, onChunk, onDone);\n },\n flush(controller) {\n // Keep the original protocol rule: only a completed `\\n\\n` record is observable.\n buffer = drainSseEvents(buffer, controller, onChunk, onDone);\n },\n }));\n}\n// ───────────────────────── parts → 事件 ─────────────────────────\nfunction isToolPart(part: UIMessagePartLike): boolean {\n return part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\");\n}\nfunction toolNameOf(part: UIMessagePartLike): string {\n if (part.type === \"dynamic-tool\")\n return part.toolName ?? \"dynamic-tool\";\n return part.type.slice(\"tool-\".length);\n}\nfunction isApprovalRequested(part: UIMessagePartLike): boolean {\n return isToolPart(part) && part.state === \"approval-requested\";\n}\n/** 和 aiSdkAgent 同一词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准。 */\nfunction isApproved(text: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(text.trim());\n}\n/** 按 requestId 从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved,没答到直接报错。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string | undefined): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId ?? \"unknown\"}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text ?? \"\");\n}\n/** 已报告的进度:resume 续跑的是同一条 assistant 消息,跨轮去重靠它。 */\ninterface ReportedState {\n startedCalls: Set<string>;\n finishedCalls: Set<string>;\n liveProgressCalls: Set<string>;\n textLen: number;\n}\nconst COMPLETE_TOOL_INPUT_STATES = new Set([\n \"input-available\",\n \"approval-requested\",\n \"approval-responded\",\n \"output-available\",\n \"output-error\",\n \"output-denied\",\n]);\n/** Project only reducer-owned messages whose tool input is already complete. */\nfunction reportLiveToolProgress(message: UIMessageLike, reported: ReportedState, ctx: AgentContext): void {\n for (const part of message.parts) {\n if (!isToolPart(part) ||\n !COMPLETE_TOOL_INPUT_STATES.has(part.state ?? \"\") ||\n typeof part.toolCallId !== \"string\" || part.toolCallId === \"\" ||\n !Object.prototype.hasOwnProperty.call(part, \"input\") ||\n reported.liveProgressCalls.has(part.toolCallId))\n continue;\n const name = toolNameOf(part);\n if (name === \"\")\n continue;\n let input: string | undefined;\n try {\n input = JSON.stringify(part.input);\n }\n catch {\n continue;\n }\n if (input === undefined)\n continue;\n reported.liveProgressCalls.add(part.toolCallId);\n ctx.progress({ message: `tool: ${name} ${input}` });\n }\n}\n/**\n * 从归约后的最终消息派生本轮事件。工具事件按 part 顺序;文本合并成一条 message 事件\n * (resume 轮只报新增的后缀)。停在 approval-requested 的调用先报 started,\n * 因此它在审批轮是 pending;裁决后的续跑轮只补 finished,落成 completed 或 rejected。\n */\nfunction deriveTurnEvents(message: UIMessageLike, reported: ReportedState, projectToolCommand: UiMessageStreamAgentOptions[\"projectToolCommand\"]): StreamEvent[] {\n const events: StreamEvent[] = [];\n let fullText = \"\";\n for (const part of message.parts) {\n if (part.type === \"text\") {\n fullText += part.text ?? \"\";\n continue;\n }\n if (!isToolPart(part))\n continue;\n const callId = part.toolCallId ?? \"\";\n if (!callId || reported.finishedCalls.has(callId))\n continue;\n const name = toolNameOf(part);\n const input = (part.input ?? null) as JsonValue;\n const start = () => {\n if (reported.startedCalls.has(callId))\n return;\n const command = projectToolCommand?.({ name, input });\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name,\n input,\n ...(command === undefined ? {} : { command }),\n },\n });\n reported.startedCalls.add(callId);\n };\n if (part.state === \"output-available\") {\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: part.output as JsonValue, status: \"completed\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"output-error\") {\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: part.errorText, status: \"failed\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"output-denied\" ||\n (part.state === \"approval-responded\" && part.approval?.approved === false)) {\n // 拒绝的调用从没真正执行,协议里不会再有它的任何帧 —— 在裁决落地的这一轮合成。\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", status: \"rejected\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"approval-requested\") {\n start();\n }\n // input-* 中间态还没有可信的完整入参,等 approval-requested 或终态再报。\n }\n const newText = fullText.slice(reported.textLen);\n if (newText.trim())\n events.push({ type: \"message\", role: \"assistant\", text: newText });\n reported.textLen = fullText.length;\n return events;\n}\n// ───────────────────────── 工厂 ─────────────────────────\nexport interface UiMessageStreamAgentOptions {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ui-message-stream\"。 */\n name?: string;\n /** 被测应用的 chat 端点(完整 URL,应用在哪部署就指哪);函数形式每轮解析。 */\n url: string | ((ctx: AgentContext) => string | Promise<string>);\n /** 附加请求头(鉴权等);`ctx.telemetry.headers`(traceparent)总会自动并入。 */\n headers?: globalThis.Record<string, string> | ((ctx: AgentContext) => globalThis.Record<string, string>);\n /** 除 `messages` 外并入请求体的字段,如 `(ctx) => ({ model: ctx.model })`(undefined 字段序列化时自动丢弃)。 */\n body?: (ctx: AgentContext) => globalThis.Record<string, JsonValue | undefined>;\n /**\n * 由 endpoint owner 逐笔把逻辑工具调用分类为 command 或 not-command。\n * 未知调用返回 undefined 并保持 actions coverage partial;NiceEval 不按名称或 input 猜测。\n */\n projectToolCommand?: (tool: Readonly<{\n name: string;\n input: JsonValue;\n }>) => CommandProjection | undefined;\n /**\n * 拒绝审批时随 `approval-responded` 带出的理由。应用/SDK 会把它作为模型看到的工具结果\n * 文本 —— 写清楚「不要重试」能明显降低模型原样重发同一调用的概率(实测)。\n */\n denyReason?: string;\n /** 流结束后再等这么久才返回(毫秒),给应用侧的观测导出(如 BatchSpanProcessor)留时间。 */\n settleMs?: number;\n /** 应用有 OTel 时的端点投递方式(拿瀑布图);事件流不依赖它。 */\n tracing?: AgentTracing;\n /** 应用有 OTel 时的 span 归一函数(拿瀑布图);事件流不依赖它。 */\n spanMapper?: SpanMapper;\n}\nconst DEFAULT_DENY_REASON = \"用户拒绝了这次调用,不要重试,直接告知用户操作未执行。\";\ninterface PreparedUiMessageStreamSend {\n readonly bookkeeping: UiMessageSessionState;\n readonly messagesToSend: UIMessageLike[];\n readonly resumeFrom: UIMessageLike | undefined;\n}\n/** External SDK / transport Promise boundary. */\nfunction promiseEffect<Value>(run: (signal: AbortSignal) => PromiseLike<Value>): Effect.Effect<Value, unknown> {\n return Effect.tryPromise({ try: run, catch: (cause) => cause });\n}\nfunction resolveUrlEffect(options: UiMessageStreamAgentOptions, ctx: AgentContext): Effect.Effect<string, unknown> {\n const url = options.url;\n return typeof url === \"function\"\n ? promiseEffect(() => Promise.resolve(url(ctx)))\n : Effect.succeed(url);\n}\nfunction resolveHeadersEffect(options: UiMessageStreamAgentOptions, ctx: AgentContext): Effect.Effect<globalThis.Record<string, string>, unknown> {\n return Effect.try({\n try: () => typeof options.headers === \"function\" ? options.headers(ctx) : (options.headers ?? {}),\n catch: (cause) => cause,\n });\n}\nfunction transportController() {\n return Effect.acquireRelease(Effect.sync(() => new AbortController()), (controller) => Effect.sync(() => controller.abort()));\n}\nfunction cancelReadableStreamEffect<Value>(stream: ReadableStream<Value>): Effect.Effect<void> {\n return promiseEffect(() => stream.cancel()).pipe(Effect.catch(() => Effect.void), Effect.asVoid);\n}\nfunction prepareMessages(options: UiMessageStreamAgentOptions, input: TurnInput, ctx: AgentContext): PreparedUiMessageStreamSend {\n // 会话续接是「客户端带全量历史」模式:历史与协议簿记各用一个 typed slot,\n // 新线自然两者都为空;相同名字不会让其它 Adapter 的 slot 与它们碰撞。\n const priorMessages = ctx.session.get(historySlot) ?? [];\n const bookkeeping = ctx.session.get(sessionStateSlot) ?? {};\n ctx.session.set(sessionStateSlot, bookkeeping);\n let id = bookkeeping.chatId;\n if (!id) {\n id = `uims-${randomUUID()}`;\n bookkeeping.chatId = id;\n ctx.session.capture(id); // 镜像:t.sessionId / 报告可见\n }\n const lastMessage = priorMessages.at(-1);\n const pendingPart = lastMessage?.role === \"assistant\" ? lastMessage.parts.find(isApprovalRequested) : undefined;\n if (pendingPart && lastMessage) {\n // HITL 续跑:不追加新 user 消息 —— 把停在 approval-requested 的 part 原地改成\n // approval-responded,原样重发,服务端续跑同一条被打断的 assistant 消息。\n // 裁决按 requestId 从 input.responses 对位读取(t.respond 的结构化回答)。\n const requestId = pendingPart.approval?.id ?? pendingPart.toolCallId;\n const approved = approvalDecision(input.responses, requestId);\n const mutatedParts = lastMessage.parts.map((part) => isApprovalRequested(part) && part.approval?.id === pendingPart.approval?.id\n ? {\n ...part,\n state: \"approval-responded\",\n approval: {\n id: pendingPart.approval!.id,\n approved,\n ...(approved ? {} : { reason: options.denyReason ?? DEFAULT_DENY_REASON }),\n },\n }\n : part);\n const resumeFrom = { ...lastMessage, parts: mutatedParts };\n return {\n bookkeeping,\n resumeFrom,\n messagesToSend: [...priorMessages.slice(0, -1), resumeFrom],\n };\n }\n const parts: UIMessagePartLike[] = [{ type: \"text\", text: input.text }];\n for (const file of input.files ?? []) {\n parts.push({ type: \"file\", mediaType: file.mimeType, url: `data:${file.mimeType};base64,${file.dataBase64}` });\n }\n return {\n bookkeeping,\n resumeFrom: undefined,\n messagesToSend: [...priorMessages, { id: randomUUID(), role: \"user\", parts }],\n };\n}\n/** Consume the SDK's native async iterator only inside its named Effect Promise boundary. */\nfunction reduceUiMessageStreamEffect(readUIMessageStream: ReadUIMessageStream, resumeFrom: UIMessageLike | undefined, stream: ReadableStream<UIMessageChunkLike>, transport: AbortController, onMessage: (message: UIMessageLike) => void): Effect.Effect<UIMessageLike | undefined, unknown> {\n return promiseEffect(async (signal) => {\n const onAbort = () => transport.abort(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted)\n onAbort();\n try {\n let finalMessage: UIMessageLike | undefined;\n for await (const message of readUIMessageStream({ message: resumeFrom, stream })) {\n finalMessage = message;\n onMessage(message);\n }\n return finalMessage;\n }\n finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n });\n}\nfunction uiMessageStreamSendEffect(options: UiMessageStreamAgentOptions, input: TurnInput, ctx: AgentContext): Effect.Effect<import(\"../types.ts\").Turn, unknown> {\n return Effect.scoped(Effect.gen(function* () {\n const { readUIMessageStream } = yield* loadAiEffect();\n const prepared = yield* Effect.try({\n try: () => prepareMessages(options, input, ctx),\n catch: (cause) => cause,\n });\n const url = yield* resolveUrlEffect(options, ctx);\n const extraHeaders = yield* resolveHeadersEffect(options, ctx);\n const transport = yield* transportController();\n const res = yield* Effect.tryPromise({\n try: (signal) => fetch(url, {\n method: \"POST\",\n // traceparent 随请求带过去:应用埋点支持 context 传播时,span 归属精确到本轮。\n headers: { \"content-type\": \"application/json\", ...extraHeaders, ...ctx.telemetry?.headers },\n body: JSON.stringify({ ...options.body?.(ctx), messages: prepared.messagesToSend }),\n signal: AbortSignal.any([ctx.signal, signal, transport.signal]),\n }),\n catch: (err) => {\n if (ctx.signal.aborted)\n return err;\n const cause = err instanceof Error\n ? (err.cause instanceof Error ? err.cause.message : err.message)\n : String(err);\n return makeSendFailure({\n acceptance: \"unknown\",\n message: `Could not connect to ${url} (${cause}). Is the app under test running? Start it yourself first, or point url at a deployed instance via config.`,\n cause: normalizeExternalCause(err),\n });\n },\n });\n const responseBody = res.body;\n if (!res.ok || !responseBody) {\n const responseText = yield* promiseEffect(() => res.text()).pipe(Effect.catch(() => Effect.succeed(\"\")));\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: `POST ${url} failed: ${res.status} ${responseText}. Confirm the app is running and the endpoint speaks the UI Message Stream protocol (the backend useChat expects).`,\n cause: normalizeExternalCause({ status: res.status }),\n }));\n }\n const streamState: {\n sawDone: boolean;\n sawError: string | undefined;\n } = {\n sawDone: false,\n sawError: undefined,\n };\n const chunkStream = toChunkStream(responseBody, (chunk) => {\n if (chunk.type === \"error\")\n streamState.sawError = chunk.errorText;\n }, () => {\n streamState.sawDone = true;\n });\n yield* Effect.addFinalizer(() => Effect.sync(() => transport.abort()).pipe(Effect.andThen(cancelReadableStreamEffect(chunkStream))));\n const reported: ReportedState = prepared.resumeFrom && prepared.bookkeeping.reported\n ? prepared.bookkeeping.reported\n : { startedCalls: new Set(), finishedCalls: new Set(), liveProgressCalls: new Set(), textLen: 0 };\n prepared.bookkeeping.reported = reported;\n const finalMessage = yield* reduceUiMessageStreamEffect(readUIMessageStream, prepared.resumeFrom, chunkStream, transport, (message) => reportLiveToolProgress(message, reported, ctx));\n if (!streamState.sawDone) {\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: `POST ${url} ended before the UI Message Stream [DONE] marker. The response was truncated or the endpoint does not speak the complete UI Message Stream protocol.`,\n }));\n }\n if (!finalMessage) {\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: streamState.sawError !== undefined && streamState.sawError.trim() !== \"\"\n ? streamState.sawError\n : `POST ${url} ended without producing an assistant message. Confirm the endpoint speaks the complete UI Message Stream protocol.`,\n }));\n }\n const derived = yield* Effect.try({\n try: () => {\n // 续跑轮:finalMessage 是同一条消息的完整版,替换末尾半成品;全新轮:追加。\n ctx.session.set(historySlot, prepared.resumeFrom\n ? [...prepared.messagesToSend.slice(0, -1), finalMessage]\n : [...prepared.messagesToSend, finalMessage]);\n return {\n events: deriveTurnEvents(finalMessage, reported, options.projectToolCommand),\n request: finalMessage.parts.find(isApprovalRequested),\n };\n },\n catch: (cause) => cause,\n });\n const request = derived.request;\n if (request) {\n return yield* Effect.try({\n try: () => {\n const waitingEvents = [\n ...derived.events,\n {\n type: \"input.requested\" as const,\n request: {\n id: request.approval?.id ?? request.toolCallId,\n action: toolNameOf(request),\n input: (request.input ?? null) as JsonValue,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n },\n },\n ];\n const evidenceCoverage = unclassifiedToolActionsCoverage(waitingEvents);\n return {\n status: \"waiting\" as const,\n events: waitingEvents,\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n }\n if (options.settleMs)\n yield* Effect.sleep(options.settleMs);\n return yield* Effect.try({\n try: () => {\n const finalEvents = [\n ...derived.events,\n ...(streamState.sawError ? [{ type: \"error\" as const, message: streamState.sawError }] : []),\n ];\n const evidenceCoverage = unclassifiedToolActionsCoverage(finalEvents);\n return {\n status: streamState.sawError ? (\"failed\" as const) : (\"completed\" as const),\n events: finalEvents,\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n }));\n}\n/**\n * UI Message Stream Protocol(AI SDK `useChat` 后端的标准 SSE 协议)的内置无侵入 adapter。\n * 对着已部署应用的 HTTP 端点收发,不 import 应用代码:\n *\n * ```typescript\n * import { uiMessageStreamAgent } from \"niceeval/adapter\";\n *\n * export default uiMessageStreamAgent({\n * name: \"my-assistant\",\n * url: \"https://my-app.example.com/api/chat\",\n * body: (ctx) => ({ model: ctx.model }), // 应用支持请求级选模型时,模型对比零改动\n * });\n * ```\n */\n// @concord-code ne-adapter-ui-message-stream-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/ai-sdk/README.md\nexport function uiMessageStreamAgent(options: UiMessageStreamAgentOptions): Agent {\n return makeDirectAgent({\n name: options.name ?? \"ui-message-stream\",\n evidenceCoverage: COVERAGE,\n tracing: options.tracing,\n spanMapper: options.spanMapper,\n send: (input, ctx) => uiMessageStreamSendEffect(options, input, ctx),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ui-message-stream.js","sourceRoot":"","sources":["ui-message-stream.ts"],"names":[],"mappings":"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","sourcesContent":["// uiMessageStreamAgent():AI SDK UI Message Stream Protocol 的无侵入 HTTP adapter 工厂。\n//\n// 协议:https://ai-sdk.dev/docs/ai-sdk-ui/stream-protocol —— `useChat` 后端的标准 SSE\n// (`data: {UIMessageChunk}\\n\\n`,以 `data: [DONE]\\n\\n` 收尾)。这是「对着一个已部署的\n// AI SDK 应用的 HTTP 接口无侵入接入」:adapter 只 fetch,不 import 被测应用的任何代码。\n//\n// · 会话:协议是服务端零状态、「客户端带全量历史」——工厂用 typed slot 存整份\n// UIMessage[],每轮原样重放;ctx.session.id 未记录时开新 chat id 并 capture 回写。\n// · 事件流:从归约后的 assistant 消息 parts 直构(text → message,tool part 的\n// approval-requested → operation.started,output-available / output-error / 审批拒绝\n// → operation.finished),\n// 不要求应用接 OTel;跨 resume 轮次按 callId / 已报文本长度去重。\n// · HITL:v7 tool approval(`needsApproval` 工具)——part 停在 `approval-requested` 时\n// 整轮 `waiting` + `input.requested`;下一轮输入(approve / yes / 同意 / 批准 开头 =\n// 批准,其余拒绝)翻译成 `approval-responded` 原地改写该 part、原样重发 messages 触发\n// 服务端续跑 —— 和真实前端 `addToolApprovalResponse()` + `sendMessage()` 的协议行为\n// 完全一致,没有单独的 approve 端点。拒绝的调用协议里不会有任何 tool-output 帧\n// (从没真正执行),由工厂合成 `status: \"rejected\"` 的 operation.finished。\n// · chunk 归约用 `ai` 包官方导出的框架无关 reducer `readUIMessageStream`(`useChat`\n// 内部同款),保证重放回服务端的 UIMessage 形状协议正确 —— `ai` 是可选 peer 依赖,\n// 只在用到本工厂时需要安装。\n//\n// tracing / spanMapper 原样透传:应用有 OTel 时接上拿瀑布图(span 只进瀑布图,不喂断言),\n// 事件流始终从协议帧直构。\nimport { randomUUID } from \"node:crypto\";\nimport { Effect } from \"effect\";\nimport { makeDirectAgent } from \"../define.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport type { Agent, AgentContext, AgentTracing, CommandProjection, EvidenceCoverage, InputResponse, JsonValue, SpanMapper, StreamEvent, TurnInput } from \"../types.ts\";\nimport { createSessionKey } from \"./session-key.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\n// UI Message Stream 帧里没有 usage(协议本身不带 token 计数,见 docs/engineering/testing/e2e/README.md\n// 第 2 节);events/actions/messages/status 都直接来自完整归约的协议帧,和 turnFromAiSdk/aiSdkAgent\n// 同等完整——官方 SDK 适配器应声明全通道 complete(docs/feature/adapters/architecture/evidence.md),\n// 这里唯一的例外是协议本身没有的 usage 通道,如实标 unavailable 而不是留成 unknown。\nconst COVERAGE: EvidenceCoverage = Object.freeze({\n ...completeEvidenceCoverage,\n usage: { status: \"unavailable\" as const, reason: \"UI Message Stream frames carry no token usage\" },\n});\n// ───────────────────────── 协议的结构化类型(structural,不依赖 ai 包的类型) ─────────────────────────\n/** UIMessage 的最小结构面:只声明工厂真正要读的字段,其余原样透传。 */\nexport interface UIMessageLike {\n id: string;\n role: string;\n parts: UIMessagePartLike[];\n [key: string]: JsonValue | UIMessagePartLike[] | undefined;\n}\nexport interface UIMessagePartLike {\n type: string;\n state?: string;\n text?: string;\n toolCallId?: string;\n toolName?: string;\n input?: JsonValue;\n output?: JsonValue;\n errorText?: string;\n approval?: {\n id: string;\n approved?: boolean;\n reason?: string;\n };\n [key: string]: JsonValue | undefined;\n}\ninterface UIMessageChunkLike {\n type: string;\n errorText?: string;\n [key: string]: JsonValue | undefined;\n}\ninterface UiMessageSessionState {\n chatId?: string;\n reported?: ReportedState;\n}\nconst historySlot = createSessionKey<UIMessageLike[]>(\"ui-message-stream/history\");\nconst sessionStateSlot = createSessionKey<UiMessageSessionState>(\"ui-message-stream/state\");\ntype ReadUIMessageStream = (options: {\n message?: UIMessageLike;\n stream: ReadableStream<UIMessageChunkLike>;\n}) => AsyncIterable<UIMessageLike>;\n// ai 是可选 peer 依赖:动态 import,缺了就把「装什么」直接说清楚。\n// 说明符经变量传入,避免 TS 对字面量模块名做安装检查(niceeval 自身不依赖 ai)。\nlet aiModule: Promise<{\n readUIMessageStream: ReadUIMessageStream;\n}> | undefined;\nfunction missingAiModule(): Error {\n return new Error(\"uiMessageStreamAgent 需要 `ai` 包(AI SDK v5+,协议 reducer readUIMessageStream 来自它)。在你的 eval 项目里安装:npm install -D ai\");\n}\n/** Dynamic import is an SDK Promise boundary; a rejected load is never cached. */\nfunction loadAiEffect(): Effect.Effect<{\n readUIMessageStream: ReadUIMessageStream;\n}, Error> {\n const pending = aiModule;\n return Effect.tryPromise({\n try: () => {\n if (pending !== undefined)\n return pending;\n const specifier = \"ai\";\n const loading = __niceevalDynamicImport(specifier) as Promise<{\n readUIMessageStream: ReadUIMessageStream;\n }>;\n aiModule = loading;\n return loading;\n },\n catch: () => missingAiModule(),\n }).pipe(Effect.tapError(() => Effect.sync(() => {\n aiModule = undefined;\n })));\n}\n// ───────────────────────── SSE 解析 ─────────────────────────\nfunction drainSseEvents(buffer: string, controller: TransformStreamDefaultController<UIMessageChunkLike>, onChunk: (chunk: UIMessageChunkLike) => void, onDone: () => void): string {\n for (;;) {\n const sepIndex = buffer.indexOf(\"\\n\\n\");\n if (sepIndex === -1)\n return buffer;\n const rawEvent = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const line = rawEvent.split(\"\\n\").find((candidate) => candidate.startsWith(\"data: \"));\n if (!line)\n continue;\n const payload = line.slice(\"data: \".length);\n if (payload === \"[DONE]\") {\n onDone();\n // `[DONE]` is the protocol terminal, not an advisory event. Closing the\n // reducer input here prevents frames later in the same network chunk (or\n // later chunks) from manufacturing a successful Turn after termination.\n controller.terminate();\n return \"\";\n }\n const chunk = JSON.parse(payload) as UIMessageChunkLike;\n onChunk(chunk);\n controller.enqueue(chunk);\n }\n}\n/**\n * Build the AI SDK reducer input with native stream composition rather than a hand-owned reader.\n * Scope finalization below aborts/cancels this pipeline, so an interrupted reducer cannot retain a\n * body reader or live HTTP transport.\n */\nfunction toChunkStream(body: ReadableStream<Uint8Array>, onChunk: (c: UIMessageChunkLike) => void, onDone: () => void): ReadableStream<UIMessageChunkLike> {\n const decoder = new TextDecoder();\n let buffer = \"\";\n return body.pipeThrough(new TransformStream<Uint8Array, UIMessageChunkLike>({\n transform(value, controller) {\n buffer += decoder.decode(value, { stream: true });\n buffer = drainSseEvents(buffer, controller, onChunk, onDone);\n },\n flush(controller) {\n // Keep the original protocol rule: only a completed `\\n\\n` record is observable.\n buffer = drainSseEvents(buffer, controller, onChunk, onDone);\n },\n }));\n}\n// ───────────────────────── parts → 事件 ─────────────────────────\nfunction isToolPart(part: UIMessagePartLike): boolean {\n return part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\");\n}\nfunction toolNameOf(part: UIMessagePartLike): string {\n if (part.type === \"dynamic-tool\")\n return part.toolName ?? \"dynamic-tool\";\n return part.type.slice(\"tool-\".length);\n}\nfunction isApprovalRequested(part: UIMessagePartLike): boolean {\n return isToolPart(part) && part.state === \"approval-requested\";\n}\n/** 和 aiSdkAgent 同一词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准。 */\nfunction isApproved(text: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(text.trim());\n}\n/** 按 requestId 从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved,没答到直接报错。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string | undefined): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId ?? \"unknown\"}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text ?? \"\");\n}\n/** 已报告的进度:resume 续跑的是同一条 assistant 消息,跨轮去重靠它。 */\ninterface ReportedState {\n startedCalls: Set<string>;\n finishedCalls: Set<string>;\n liveProgressCalls: Set<string>;\n textLen: number;\n}\nconst COMPLETE_TOOL_INPUT_STATES = new Set([\n \"input-available\",\n \"approval-requested\",\n \"approval-responded\",\n \"output-available\",\n \"output-error\",\n \"output-denied\",\n]);\n/** Project only reducer-owned messages whose tool input is already complete. */\nfunction reportLiveToolProgress(message: UIMessageLike, reported: ReportedState, ctx: AgentContext): void {\n for (const part of message.parts) {\n if (!isToolPart(part) ||\n !COMPLETE_TOOL_INPUT_STATES.has(part.state ?? \"\") ||\n typeof part.toolCallId !== \"string\" || part.toolCallId === \"\" ||\n !Object.prototype.hasOwnProperty.call(part, \"input\") ||\n reported.liveProgressCalls.has(part.toolCallId))\n continue;\n const name = toolNameOf(part);\n if (name === \"\")\n continue;\n let input: string | undefined;\n try {\n input = JSON.stringify(part.input);\n }\n catch {\n continue;\n }\n if (input === undefined)\n continue;\n reported.liveProgressCalls.add(part.toolCallId);\n ctx.progress({ message: `tool: ${name} ${input}` });\n }\n}\n/**\n * 从归约后的最终消息派生本轮事件。工具事件按 part 顺序;文本合并成一条 message 事件\n * (resume 轮只报新增的后缀)。停在 approval-requested 的调用先报 started,\n * 因此它在审批轮是 pending;裁决后的续跑轮只补 finished,落成 completed 或 rejected。\n */\nfunction deriveTurnEvents(message: UIMessageLike, reported: ReportedState, projectToolCommand: UiMessageStreamAgentOptions[\"projectToolCommand\"]): StreamEvent[] {\n const events: StreamEvent[] = [];\n let fullText = \"\";\n for (const part of message.parts) {\n if (part.type === \"text\") {\n fullText += part.text ?? \"\";\n continue;\n }\n if (!isToolPart(part))\n continue;\n const callId = part.toolCallId ?? \"\";\n if (!callId || reported.finishedCalls.has(callId))\n continue;\n const name = toolNameOf(part);\n const input = (part.input ?? null) as JsonValue;\n const start = () => {\n if (reported.startedCalls.has(callId))\n return;\n const command = projectToolCommand?.({ name, input });\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name,\n input,\n ...(command === undefined ? {} : { command }),\n },\n });\n reported.startedCalls.add(callId);\n };\n if (part.state === \"output-available\") {\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: part.output as JsonValue, status: \"completed\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"output-error\") {\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: part.errorText, status: \"failed\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"output-denied\" ||\n (part.state === \"approval-responded\" && part.approval?.approved === false)) {\n // 拒绝的调用从没真正执行,协议里不会再有它的任何帧 —— 在裁决落地的这一轮合成。\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", status: \"rejected\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"approval-requested\") {\n start();\n }\n // input-* 中间态还没有可信的完整入参,等 approval-requested 或终态再报。\n }\n const newText = fullText.slice(reported.textLen);\n if (newText.trim())\n events.push({ type: \"message\", role: \"assistant\", text: newText });\n reported.textLen = fullText.length;\n return events;\n}\n// ───────────────────────── 工厂 ─────────────────────────\nexport interface UiMessageStreamAgentOptions {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ui-message-stream\"。 */\n name?: string;\n /** 被测应用的 chat 端点(完整 URL,应用在哪部署就指哪);函数形式每轮解析。 */\n url: string | ((ctx: AgentContext) => string | Promise<string>);\n /** 附加请求头(鉴权等);`ctx.telemetry.headers`(traceparent)总会自动并入。 */\n headers?: globalThis.Record<string, string> | ((ctx: AgentContext) => globalThis.Record<string, string>);\n /** 除 `messages` 外并入请求体的字段,如 `(ctx) => ({ model: ctx.model })`(undefined 字段序列化时自动丢弃)。 */\n body?: (ctx: AgentContext) => globalThis.Record<string, JsonValue | undefined>;\n /**\n * 由 endpoint owner 逐笔把逻辑工具调用分类为 command 或 not-command。\n * 未知调用返回 undefined 并保持 actions coverage partial;NiceEval 不按名称或 input 猜测。\n */\n projectToolCommand?: (tool: Readonly<{\n name: string;\n input: JsonValue;\n }>) => CommandProjection | undefined;\n /**\n * 拒绝审批时随 `approval-responded` 带出的理由。应用/SDK 会把它作为模型看到的工具结果\n * 文本 —— 写清楚「不要重试」能明显降低模型原样重发同一调用的概率(实测)。\n */\n denyReason?: string;\n /** 流结束后再等这么久才返回(毫秒),给应用侧的观测导出(如 BatchSpanProcessor)留时间。 */\n settleMs?: number;\n /** 应用有 OTel 时的端点投递方式(拿瀑布图);事件流不依赖它。 */\n tracing?: AgentTracing;\n /** 应用有 OTel 时的 span 归一函数(拿瀑布图);事件流不依赖它。 */\n spanMapper?: SpanMapper;\n}\nconst DEFAULT_DENY_REASON = \"用户拒绝了这次调用,不要重试,直接告知用户操作未执行。\";\ninterface PreparedUiMessageStreamSend {\n readonly bookkeeping: UiMessageSessionState;\n readonly messagesToSend: UIMessageLike[];\n readonly resumeFrom: UIMessageLike | undefined;\n}\n/** External SDK / transport Promise boundary. */\nfunction promiseEffect<Value>(run: (signal: AbortSignal) => PromiseLike<Value>): Effect.Effect<Value, unknown> {\n return Effect.tryPromise({ try: run, catch: (cause) => cause });\n}\nfunction resolveUrlEffect(options: UiMessageStreamAgentOptions, ctx: AgentContext): Effect.Effect<string, unknown> {\n const url = options.url;\n return typeof url === \"function\"\n ? promiseEffect(() => Promise.resolve(url(ctx)))\n : Effect.succeed(url);\n}\nfunction resolveHeadersEffect(options: UiMessageStreamAgentOptions, ctx: AgentContext): Effect.Effect<globalThis.Record<string, string>, unknown> {\n return Effect.try({\n try: () => typeof options.headers === \"function\" ? options.headers(ctx) : (options.headers ?? {}),\n catch: (cause) => cause,\n });\n}\nfunction transportController() {\n return Effect.acquireRelease(Effect.sync(() => new AbortController()), (controller) => Effect.sync(() => controller.abort()));\n}\nfunction cancelReadableStreamEffect<Value>(stream: ReadableStream<Value>): Effect.Effect<void> {\n return promiseEffect(() => stream.cancel()).pipe(Effect.catch(() => Effect.void), Effect.asVoid);\n}\nfunction prepareMessages(options: UiMessageStreamAgentOptions, input: TurnInput, ctx: AgentContext): PreparedUiMessageStreamSend {\n // 会话续接是「客户端带全量历史」模式:历史与协议簿记各用一个 typed slot,\n // 新线自然两者都为空;相同名字不会让其它 Adapter 的 slot 与它们碰撞。\n const priorMessages = ctx.session.get(historySlot) ?? [];\n const bookkeeping = ctx.session.get(sessionStateSlot) ?? {};\n ctx.session.set(sessionStateSlot, bookkeeping);\n let id = bookkeeping.chatId;\n if (!id) {\n id = `uims-${randomUUID()}`;\n bookkeeping.chatId = id;\n ctx.session.capture(id); // 镜像:t.sessionId / 报告可见\n }\n const lastMessage = priorMessages.at(-1);\n const pendingPart = lastMessage?.role === \"assistant\" ? lastMessage.parts.find(isApprovalRequested) : undefined;\n if (pendingPart && lastMessage) {\n // HITL 续跑:不追加新 user 消息 —— 把停在 approval-requested 的 part 原地改成\n // approval-responded,原样重发,服务端续跑同一条被打断的 assistant 消息。\n // 裁决按 requestId 从 input.responses 对位读取(t.respond 的结构化回答)。\n const requestId = pendingPart.approval?.id ?? pendingPart.toolCallId;\n const approved = approvalDecision(input.responses, requestId);\n const mutatedParts = lastMessage.parts.map((part) => isApprovalRequested(part) && part.approval?.id === pendingPart.approval?.id\n ? {\n ...part,\n state: \"approval-responded\",\n approval: {\n id: pendingPart.approval!.id,\n approved,\n ...(approved ? {} : { reason: options.denyReason ?? DEFAULT_DENY_REASON }),\n },\n }\n : part);\n const resumeFrom = { ...lastMessage, parts: mutatedParts };\n return {\n bookkeeping,\n resumeFrom,\n messagesToSend: [...priorMessages.slice(0, -1), resumeFrom],\n };\n }\n const parts: UIMessagePartLike[] = [{ type: \"text\", text: input.text }];\n for (const file of input.files ?? []) {\n parts.push({ type: \"file\", mediaType: file.mimeType, url: `data:${file.mimeType};base64,${file.dataBase64}` });\n }\n return {\n bookkeeping,\n resumeFrom: undefined,\n messagesToSend: [...priorMessages, { id: randomUUID(), role: \"user\", parts }],\n };\n}\n/** Consume the SDK's native async iterator only inside its named Effect Promise boundary. */\nfunction reduceUiMessageStreamEffect(readUIMessageStream: ReadUIMessageStream, resumeFrom: UIMessageLike | undefined, stream: ReadableStream<UIMessageChunkLike>, transport: AbortController, onMessage: (message: UIMessageLike) => void): Effect.Effect<UIMessageLike | undefined, unknown> {\n return promiseEffect(async (signal) => {\n const onAbort = () => transport.abort(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted)\n onAbort();\n try {\n let finalMessage: UIMessageLike | undefined;\n for await (const message of readUIMessageStream({ message: resumeFrom, stream })) {\n finalMessage = message;\n onMessage(message);\n }\n return finalMessage;\n }\n finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n });\n}\nfunction uiMessageStreamSendEffect(options: UiMessageStreamAgentOptions, input: TurnInput, ctx: AgentContext): Effect.Effect<import(\"../types.ts\").Turn, unknown> {\n return Effect.scoped(Effect.gen(function* () {\n const { readUIMessageStream } = yield* loadAiEffect();\n const prepared = yield* Effect.try({\n try: () => prepareMessages(options, input, ctx),\n catch: (cause) => cause,\n });\n const url = yield* resolveUrlEffect(options, ctx);\n const extraHeaders = yield* resolveHeadersEffect(options, ctx);\n const transport = yield* transportController();\n const res = yield* Effect.tryPromise({\n try: (signal) => fetch(url, {\n method: \"POST\",\n // traceparent 随请求带过去:应用埋点支持 context 传播时,span 归属精确到本轮。\n headers: { \"content-type\": \"application/json\", ...extraHeaders, ...ctx.telemetry?.headers },\n body: JSON.stringify({ ...options.body?.(ctx), messages: prepared.messagesToSend }),\n signal: AbortSignal.any([ctx.signal, signal, transport.signal]),\n }),\n catch: (err) => {\n if (ctx.signal.aborted)\n return err;\n const cause = err instanceof Error\n ? (err.cause instanceof Error ? err.cause.message : err.message)\n : String(err);\n return makeSendFailure({\n acceptance: \"unknown\",\n message: `Could not connect to ${url} (${cause}). Is the app under test running? Start it yourself first, or point url at a deployed instance via config.`,\n cause: normalizeExternalCause(err),\n });\n },\n });\n const responseBody = res.body;\n if (!res.ok || !responseBody) {\n const responseText = yield* promiseEffect(() => res.text()).pipe(Effect.catch(() => Effect.succeed(\"\")));\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: `POST ${url} failed: ${res.status} ${responseText}. Confirm the app is running and the endpoint speaks the UI Message Stream protocol (the backend useChat expects).`,\n cause: normalizeExternalCause({ status: res.status }),\n }));\n }\n const streamState: {\n sawDone: boolean;\n sawError: string | undefined;\n } = {\n sawDone: false,\n sawError: undefined,\n };\n const chunkStream = toChunkStream(responseBody, (chunk) => {\n if (chunk.type === \"error\")\n streamState.sawError = chunk.errorText;\n }, () => {\n streamState.sawDone = true;\n });\n yield* Effect.addFinalizer(() => Effect.sync(() => transport.abort()).pipe(Effect.andThen(cancelReadableStreamEffect(chunkStream))));\n const reported: ReportedState = prepared.resumeFrom && prepared.bookkeeping.reported\n ? prepared.bookkeeping.reported\n : { startedCalls: new Set(), finishedCalls: new Set(), liveProgressCalls: new Set(), textLen: 0 };\n prepared.bookkeeping.reported = reported;\n const finalMessage = yield* reduceUiMessageStreamEffect(readUIMessageStream, prepared.resumeFrom, chunkStream, transport, (message) => reportLiveToolProgress(message, reported, ctx));\n if (!streamState.sawDone) {\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: `POST ${url} ended before the UI Message Stream [DONE] marker. The response was truncated or the endpoint does not speak the complete UI Message Stream protocol.`,\n }));\n }\n if (!finalMessage) {\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: streamState.sawError !== undefined && streamState.sawError.trim() !== \"\"\n ? streamState.sawError\n : `POST ${url} ended without producing an assistant message. Confirm the endpoint speaks the complete UI Message Stream protocol.`,\n }));\n }\n const derived = yield* Effect.try({\n try: () => {\n // 续跑轮:finalMessage 是同一条消息的完整版,替换末尾半成品;全新轮:追加。\n ctx.session.set(historySlot, prepared.resumeFrom\n ? [...prepared.messagesToSend.slice(0, -1), finalMessage]\n : [...prepared.messagesToSend, finalMessage]);\n return {\n events: deriveTurnEvents(finalMessage, reported, options.projectToolCommand),\n request: finalMessage.parts.find(isApprovalRequested),\n };\n },\n catch: (cause) => cause,\n });\n const request = derived.request;\n if (request) {\n return yield* Effect.try({\n try: () => {\n const waitingEvents = [\n ...derived.events,\n {\n type: \"input.requested\" as const,\n request: {\n id: request.approval?.id ?? request.toolCallId,\n action: toolNameOf(request),\n input: (request.input ?? null) as JsonValue,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n },\n },\n ];\n const evidenceCoverage = unclassifiedToolActionsCoverage(waitingEvents);\n return {\n status: \"waiting\" as const,\n events: waitingEvents,\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n }\n if (options.settleMs)\n yield* Effect.sleep(options.settleMs);\n return yield* Effect.try({\n try: () => {\n const finalEvents = [\n ...derived.events,\n ...(streamState.sawError ? [{ type: \"error\" as const, message: streamState.sawError }] : []),\n ];\n const evidenceCoverage = unclassifiedToolActionsCoverage(finalEvents);\n return {\n status: streamState.sawError ? (\"failed\" as const) : (\"completed\" as const),\n events: finalEvents,\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n }));\n}\n/**\n * UI Message Stream Protocol(AI SDK `useChat` 后端的标准 SSE 协议)的内置无侵入 adapter。\n * 对着已部署应用的 HTTP 端点收发,不 import 应用代码:\n *\n * ```typescript\n * import { uiMessageStreamAgent } from \"niceeval/adapter\";\n *\n * export default uiMessageStreamAgent({\n * name: \"my-assistant\",\n * url: \"https://my-app.example.com/api/chat\",\n * body: (ctx) => ({ model: ctx.model }), // 应用支持请求级选模型时,模型对比零改动\n * });\n * ```\n */\n// @concord-code\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/ai-sdk/README.md\nexport function uiMessageStreamAgent(options: UiMessageStreamAgentOptions): Agent {\n return makeDirectAgent({\n name: options.name ?? \"ui-message-stream\",\n evidenceCoverage: COVERAGE,\n tracing: options.tracing,\n spanMapper: options.spanMapper,\n send: (input, ctx) => uiMessageStreamSendEffect(options, input, ctx),\n });\n}\n"]}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UnrecognizedAgentEvents = void 0;
|
|
4
|
+
/** One collector per Attempt; cumulative tapes replace their previous snapshot. */
|
|
5
|
+
class UnrecognizedAgentEvents {
|
|
6
|
+
sources = new Map();
|
|
7
|
+
sequence = 0;
|
|
8
|
+
observe(counts, source) {
|
|
9
|
+
if (counts === undefined)
|
|
10
|
+
return;
|
|
11
|
+
this.sources.set(source ?? `send:${++this.sequence}`, counts);
|
|
12
|
+
}
|
|
13
|
+
report(diagnostic) {
|
|
14
|
+
const totals = Object.create(null);
|
|
15
|
+
for (const counts of this.sources.values()) {
|
|
16
|
+
for (const [type, count] of Object.entries(counts))
|
|
17
|
+
totals[type] = (totals[type] ?? 0) + count;
|
|
18
|
+
}
|
|
19
|
+
this.sources.clear();
|
|
20
|
+
const types = Object.keys(totals).sort();
|
|
21
|
+
if (!types.length)
|
|
22
|
+
return;
|
|
23
|
+
diagnostic({
|
|
24
|
+
code: "agent-event-unrecognized",
|
|
25
|
+
level: "warning",
|
|
26
|
+
message: `Unrecognized agent events were excluded: ${types.map((type) => `${type} (${totals[type]})`).join(", ")}.`,
|
|
27
|
+
data: { events: types.map((type) => ({ type, count: totals[type] })) },
|
|
28
|
+
});
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.UnrecognizedAgentEvents = UnrecognizedAgentEvents;
|
|
32
|
+
//# sourceMappingURL=unrecognized-events.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unrecognized-events.js","sourceRoot":"","sources":["unrecognized-events.ts"],"names":[],"mappings":";;;AACA,mFAAmF;AACnF,MAAa,uBAAuB;IACf,OAAO,GAAG,IAAI,GAAG,EAA4C,CAAC;IACvE,QAAQ,GAAG,CAAC,CAAC;IACrB,OAAO,CAAC,MAAoD,EAAE,MAAe;QACzE,IAAI,MAAM,KAAK,SAAS;YACpB,OAAO;QACX,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,IAAI,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,MAAM,CAAC,CAAC;IAClE,CAAC;IACD,MAAM,CAAC,UAA4C;QAC/C,MAAM,MAAM,GAA2B,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC3D,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YACzC,KAAK,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;gBAC9C,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,MAAM;YACb,OAAO;QACX,UAAU,CAAC;YACP,IAAI,EAAE,0BAA0B;YAChC,KAAK,EAAE,SAAS;YAChB,OAAO,EAAE,4CAA4C,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;YACnH,IAAI,EAAE,EAAE,MAAM,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,IAAI,CAAE,EAAE,CAAC,CAAC,EAAE;SAC1E,CAAC,CAAC;IACP,CAAC;CACJ;AAzBD,0DAyBC","sourcesContent":["import type { DiagnosticInput } from \"../shared/types.ts\";\n/** One collector per Attempt; cumulative tapes replace their previous snapshot. */\nexport class UnrecognizedAgentEvents {\n private readonly sources = new Map<string, Readonly<Record<string, number>>>();\n private sequence = 0;\n observe(counts: Readonly<Record<string, number>> | undefined, source?: string): void {\n if (counts === undefined)\n return;\n this.sources.set(source ?? `send:${++this.sequence}`, counts);\n }\n report(diagnostic: (input: DiagnosticInput) => void): void {\n const totals: Record<string, number> = Object.create(null);\n for (const counts of this.sources.values()) {\n for (const [type, count] of Object.entries(counts))\n totals[type] = (totals[type] ?? 0) + count;\n }\n this.sources.clear();\n const types = Object.keys(totals).sort();\n if (!types.length)\n return;\n diagnostic({\n code: \"agent-event-unrecognized\",\n level: \"warning\",\n message: `Unrecognized agent events were excluded: ${types.map((type) => `${type} (${totals[type]})`).join(\", \")}.`,\n data: { events: types.map((type) => ({ type, count: totals[type]! })) },\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DiagnosticInput } from "../shared/types.cjs";
|
|
2
|
+
/** One collector per Attempt; cumulative tapes replace their previous snapshot. */
|
|
3
|
+
export declare class UnrecognizedAgentEvents {
|
|
4
|
+
private readonly sources;
|
|
5
|
+
private sequence;
|
|
6
|
+
observe(counts: Readonly<Record<string, number>> | undefined, source?: string): void;
|
|
7
|
+
report(diagnostic: (input: DiagnosticInput) => void): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DiagnosticInput } from "../shared/types.mjs";
|
|
2
|
+
/** One collector per Attempt; cumulative tapes replace their previous snapshot. */
|
|
3
|
+
export declare class UnrecognizedAgentEvents {
|
|
4
|
+
private readonly sources;
|
|
5
|
+
private sequence;
|
|
6
|
+
observe(counts: Readonly<Record<string, number>> | undefined, source?: string): void;
|
|
7
|
+
report(diagnostic: (input: DiagnosticInput) => void): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { DiagnosticInput } from "../shared/types.js";
|
|
2
|
+
/** One collector per Attempt; cumulative tapes replace their previous snapshot. */
|
|
3
|
+
export declare class UnrecognizedAgentEvents {
|
|
4
|
+
private readonly sources;
|
|
5
|
+
private sequence;
|
|
6
|
+
observe(counts: Readonly<Record<string, number>> | undefined, source?: string): void;
|
|
7
|
+
report(diagnostic: (input: DiagnosticInput) => void): void;
|
|
8
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire as __niceevalCreateRequire } from "node:module";
|
|
2
|
+
const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
|
|
3
|
+
const __niceevalCanonical = __niceevalRequire("./unrecognized-events.cjs");
|
|
4
|
+
const __niceevalExport0 = __niceevalCanonical["UnrecognizedAgentEvents"];
|
|
5
|
+
export { __niceevalExport0 as UnrecognizedAgentEvents };
|
|
6
|
+
//# sourceMappingURL=unrecognized-events.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"unrecognized-events.js","sources":[],"names":[],"mappings":""}
|