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
|
@@ -28,7 +28,7 @@ function terminalSummary(summary) {
|
|
|
28
28
|
...(summary.usage?.inputTokens === undefined ? {} : { inputTokens: summary.usage.inputTokens }),
|
|
29
29
|
...(summary.usage?.outputTokens === undefined ? {} : { outputTokens: summary.usage.outputTokens }),
|
|
30
30
|
...(summary.estimatedCostUSD === undefined ? {} : { estimatedCostUSD: summary.estimatedCostUSD }),
|
|
31
|
-
|
|
31
|
+
beforeCaches: summary.beforeCaches,
|
|
32
32
|
});
|
|
33
33
|
}
|
|
34
34
|
/**
|
|
@@ -325,7 +325,9 @@ function writeFailureOrError(io, event) {
|
|
|
325
325
|
locator: String(event.locator),
|
|
326
326
|
evalId: event.identity.evalId,
|
|
327
327
|
experimentId,
|
|
328
|
-
phase: event.phase
|
|
328
|
+
phase: event.phase === "agent.setup" ? "agent.before"
|
|
329
|
+
: event.phase === "agent.teardown" ? "agent.after"
|
|
330
|
+
: event.phase ?? "eval.run",
|
|
329
331
|
reason: event.reason,
|
|
330
332
|
});
|
|
331
333
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json.js","sourceRoot":"","sources":["json.ts"],"names":[],"mappings":"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","sourcesContent":["// JSON profile renderer(见 docs/feature/experiments/cli.md「机器怎么读:--json」与「事件与\n// 计划文档的 TypeScript 形状」)。合并了此前 agent.ts + ci.ts 两个 profile —— 逐项对照证实\n// agent 档/ci 档是同一消费者模型的两套参数(heartbeat 30/60s、失败展开上限 5/50、流路由、词法\n// 前缀……),没有模型差,见 memory/exp-output-two-forms-ruling.md。\n//\n// 目标读者是任何非交互解析者(coding agent、CI annotation adapter、脚本),不是人眼:\n// - 单一 stdout 上的 NDJSON 事件流,一行一个 JSON 对象,词法就是 JSON,没有自造 envelope\n// 语法。`stderr` 只留给 run 尚未建立前的 argv/config 错误(那些错误发生在 coordinator/renderer\n// 存在之前,根本不经过这个模块——所以这里没有任何写 `io.stderr` 的分支,不是遗漏)。\n// - 首行 `start` 携带 `format`/`schemaVersion` 标识整条流;其余事件不重复这两个字段。\n// - 失败/错误立即逐条追加,不做展开上限 suppression(机器逐事件消费,截断反而是信息损失,\n// 见 cli.md「'立即追加'也必须有上限」表:上限只约束人读文本)。\n// - 连续 30 秒没有永久事件才追加一条 `progress` 心跳;任意永久事件重置这个时钟。\n// - 事件形状按 `ExpEvent` 判别联合(判别字段 `event`)逐个实现,字段名复用 Record 词表\n// (locator/evalId/experimentId/phase/verdict),不为事件流发明第二套命名。\n//\n// 不实现 `clearDynamic`/`redrawDynamic`/`activity`/`onLifecycle`:JSON 流没有「动态区域」概念,\n// 不展示 active phase、不逐次输出 provisioning retry/backoff、不逐条打印 passed attempt —— 这些\n// 目标行为由「不实现对应可选钩子」天然满足(见 renderer.ts 的接口注释)。\n//\n// 为什么 diagnostic/budget-exhausted/interrupted/reporter-error 仍然去重(只在首次出现时追加)\n// 而 failure/error 不做 suppression:cli.md「什么动态更新,什么逐条追加」表把两者分成不同的行——\n// 「retry 耗尽、降级、budget 不可执行」是「去重后追加一次」的永久事件,「failed/errored + locator」\n// 是「立即追加,不设上限」的独立证据;`--json` 的「不做 suppression」只针对后者(每条失败一个\n// 有界事件),不是把去重规则也一起取消。\nimport type { FeedbackRenderer } from \"./renderer.ts\";\nimport type { FeedbackIO } from \"./io.ts\";\nimport type { DurableFeedbackEvent, InvocationCompletion, InvocationReceipt, InvocationSummary, LifecyclePhase, RunFeedbackState, } from \"../types.ts\";\nimport type { JsonValue, Verdict } from \"../../shared/types.ts\";\nimport type { ExpTerminalSummary } from \"../../experiment/host/cli/output-protocol.ts\";\nimport { evalConclusionRows, type EvalConclusionRow } from \"./eval-conclusions.ts\";\n/** `ExpEvent`/`ExpPlanDocument` 的 `format`/`schemaVersion` —— 只在破坏性形状变更时递增\n * (见 cli.md「事件与计划文档的 TypeScript 形状」)。 */\nconst EXP_STREAM_FORMAT = \"niceeval.exp\";\nconst EXP_PLAN_FORMAT = \"niceeval.exp-plan\";\nconst SCHEMA_VERSION = 2;\nconst EXP_PLAN_SCHEMA_VERSION = 4;\n/** 连续无永久事件多久才追加一条 `progress` 心跳(cli.md「机器怎么读:--json」:「连续 30 秒\n * 没有这些永久事件,才追加一条 progress 心跳」——两者合并前分别是 30s/60s,统一取 30s)。 */\nconst JSON_HEARTBEAT_IDLE_MS = 30000;\nexport interface JsonRendererOptions {\n io: FeedbackIO;\n}\nexport interface StartEvent {\n format: typeof EXP_STREAM_FORMAT;\n schemaVersion: number;\n event: \"start\";\n total: number;\n configs: number;\n concurrency: number;\n experimentConcurrency?: Readonly<globalThis.Record<string, number>>;\n reused: number;\n}\nexport interface ProgressEvent {\n event: \"progress\";\n elapsedMs: number;\n total: number;\n reused: number;\n running: number;\n elsewhere: number;\n queued: number;\n passed: number;\n failed: number;\n errored: number;\n skipped: number;\n}\nexport interface FailureEvent {\n event: \"failure\";\n locator: string;\n evalId: string;\n experimentId: string;\n verdict: \"failed\" | \"errored\";\n fact: string;\n matcher?: string;\n expected?: JsonValue;\n received?: JsonValue;\n}\nexport interface ErrorEvent {\n event: \"error\";\n locator: string;\n evalId: string;\n experimentId: string;\n phase: LifecyclePhase;\n reason: string;\n}\ninterface EvalEventBase {\n event: \"eval\";\n locator: string;\n evalId: string;\n experimentId: string;\n verdict: Verdict;\n attempts: number;\n}\nexport type EvalEvent = EvalEventBase & ({\n passed: number;\n planned?: never;\n unstarted?: never;\n reason?: never;\n} | {\n passed?: never;\n planned: number;\n unstarted: number;\n reason: \"early_exit\";\n});\nexport interface KeptEvent {\n event: \"kept\";\n locator: string;\n evalId: string;\n attempt: number;\n verdict: Exclude<Verdict, \"skipped\">;\n provider: string;\n sandboxId: string;\n enter: string;\n}\nexport interface WarningEvent {\n event: \"warning\";\n code: string;\n level: \"warning\" | \"error\";\n message: string;\n phase?: LifecyclePhase;\n experimentId?: string;\n evalId?: string;\n planned?: number;\n errored?: number;\n}\nexport interface NoticeEvent {\n event: \"notice\";\n code: string;\n level: \"info\";\n message: string;\n phase?: LifecyclePhase;\n experimentId?: string;\n evalId?: string;\n resource?: \"case-lock\";\n previousPid?: number;\n previousHost?: string;\n}\nexport interface BudgetExhaustedEvent {\n event: \"budget_exhausted\";\n experimentId: string;\n spent: number;\n unstarted: number;\n}\nexport interface ReporterErrorEvent {\n event: \"reporter_error\";\n reporter: string;\n required: boolean;\n message: string;\n}\nexport interface InterruptedEvent {\n event: \"interrupted\";\n}\nexport interface JudgePrecheckEvent {\n event: \"judge_precheck\";\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n}\nexport interface ExperimentSetupEvent {\n event: \"experiment_setup\";\n experimentId: string;\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n}\nexport interface ExperimentTeardownEvent {\n event: \"experiment_teardown\";\n experimentId: string;\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n}\nexport interface LockWaitEvent {\n event: \"lock_wait\";\n experimentId: string;\n evalId: string;\n status: \"started\" | \"resolved\";\n holderPid?: number;\n holderHost?: string;\n resolution?: \"carried\" | \"dispatched\";\n waitedMs?: number;\n}\n/** The final machine hand-off is the Record v1 receipt, without paths or snapshots. */\nexport interface ReceiptEvent {\n type: \"receipt\";\n receipt: InvocationReceipt;\n summary: ExpTerminalSummary;\n}\n/** `niceeval exp --json` 唯一公开事件词表;新增事件必须先进入已采纳文档与这个闭合联合。 */\nexport type ExpEvent = StartEvent | ProgressEvent | FailureEvent | ErrorEvent | EvalEvent | KeptEvent | NoticeEvent | WarningEvent | BudgetExhaustedEvent | ReporterErrorEvent | InterruptedEvent | JudgePrecheckEvent | ExperimentSetupEvent | ExperimentTeardownEvent | LockWaitEvent | ReceiptEvent;\nfunction writeEvent(io: FeedbackIO, event: ExpEvent): void {\n io.stdout.write(`${JSON.stringify(event)}\\n`);\n}\nfunction terminalSummary(summary: InvocationSummary): ExpTerminalSummary {\n return Object.freeze({\n startedAt: summary.startedAt,\n completedAt: summary.completedAt,\n passed: summary.passed,\n failed: summary.failed,\n skipped: summary.skipped,\n errored: summary.errored,\n durationMs: summary.durationMs,\n ...(summary.usage?.inputTokens === undefined ? {} : { inputTokens: summary.usage.inputTokens }),\n ...(summary.usage?.outputTokens === undefined ? {} : { outputTokens: summary.usage.outputTokens }),\n ...(summary.estimatedCostUSD === undefined ? {} : { estimatedCostUSD: summary.estimatedCostUSD }),\n setupPrefixes: summary.setupPrefixes,\n });\n}\n/**\n * 创建 JSON profile 的 `FeedbackRenderer`。只用 `io.stdout` 写文本——`--json` 的全部正常事件\n * 走一个 stdout sink,不拆到 stderr(两个 OS stream 被 CI runner 或 agent 工具层分开缓冲时会\n * 打乱顺序,单流才能保证事件序就是发生序)。\n */\nexport function createJsonRenderer(options: JsonRendererOptions): FeedbackRenderer {\n const { io } = options;\n // 距上一次「有意义的输出」(任意一次永久事件)过了多久,用来判断要不要追加一条心跳;\n // 由 appendDurable 无条件更新——\"plan\" 本身就是第一次永久事件,天然把这个时钟从 0 开始计。\n let lastCheckpointAtMs = 0;\n // \"summary\" 与 \"receipt\" 是 coordinator.finish() 里连续 emit 的两个独立永久事件(中间不会插入\n // 其它事件)。先暂存 summary,receipt 到达时再写 eval 结论行与唯一的最终 receipt。\n let pendingSummary: InvocationSummary | undefined;\n function noteCheckpoint(atMs: number): void {\n lastCheckpointAtMs = atMs;\n }\n return {\n appendDurable(event, state) {\n switch (event.type) {\n case \"plan\": {\n noteCheckpoint(event.at);\n const { shape, reused, experimentConcurrency } = event.plan;\n writeEvent(io, {\n format: EXP_STREAM_FORMAT,\n schemaVersion: SCHEMA_VERSION,\n event: \"start\",\n total: shape.totalAttempts,\n configs: shape.configs,\n concurrency: shape.maxConcurrency,\n // 一个实验都没声明 maxConcurrency 时省略整个字段,不输出空对象(cli.md 的 StartEvent)。\n ...(experimentConcurrency && Object.keys(experimentConcurrency).length > 0\n ? { experimentConcurrency }\n : {}),\n reused,\n });\n return;\n }\n case \"failure\": {\n noteCheckpoint(event.at);\n writeFailureOrError(io, event);\n return;\n }\n case \"diagnostic\": {\n noteCheckpoint(event.at);\n if (!isFirstOccurrence(state, event.key))\n return; // 去重后只追加一次(cli.md)\n const phase = lifecyclePhaseField(event.data?.phase);\n // `code` 是 cli.md notice/warning 事件的稳定词法(`coordination-recovered` /\n // `dispatch-halted`),**不是**去重 key:去重 key 常把折叠身份编进去,原样\n // 透出会让消费方拿到一个每次运行都不同的 code、没法按值分支。折叠到哪一条实验/用例\n // 由下面的 experimentId/evalId 两个具名字段回答。\n const code = event.code ?? event.key;\n // 身份两字段:attempt 级诊断从 identity 取;运行级诊断(实验闸 / eval 闸这类不属于\n // 任何单条 attempt 的事实)不许伪造 identity,从 `data` 的同名字段取(见 ../types.ts\n // \"diagnostic\" 变体的 identity 注释)。\n const experimentId = event.identity?.experimentId ?? stringField(event.data?.experimentId);\n const evalId = event.identity?.evalId ?? stringField(event.data?.evalId);\n const planned = numberField(event.data?.planned);\n const errored = numberField(event.data?.errored);\n const common = {\n code,\n message: event.message,\n ...(phase !== undefined ? { phase } : {}),\n ...(experimentId !== undefined ? { experimentId } : {}),\n ...(evalId !== undefined ? { evalId } : {}),\n ...(planned !== undefined ? { planned } : {}),\n ...(errored !== undefined ? { errored } : {}),\n };\n if (event.severity === \"info\") {\n const resource = coordinationResourceField(event.data?.resource);\n const previousPid = numberField(event.data?.previousPid);\n const previousHost = stringField(event.data?.previousHost);\n writeEvent(io, {\n event: \"notice\",\n level: \"info\",\n ...common,\n ...(resource !== undefined ? { resource } : {}),\n ...(previousPid !== undefined ? { previousPid } : {}),\n ...(previousHost !== undefined ? { previousHost } : {}),\n });\n }\n else {\n writeEvent(io, { event: \"warning\", level: event.severity, ...common });\n }\n return;\n }\n case \"budget-exhausted\": {\n noteCheckpoint(event.at);\n if (!isFirstOccurrence(state, `budget-exhausted:${event.experimentId}`))\n return;\n writeEvent(io, {\n event: \"budget_exhausted\",\n experimentId: event.experimentId,\n spent: event.spent,\n unstarted: event.unstarted,\n });\n return;\n }\n case \"experiment-hook\": {\n noteCheckpoint(event.at);\n writeEvent(io, {\n event: event.hook === \"setup\" ? \"experiment_setup\" : \"experiment_teardown\",\n experimentId: event.experimentId,\n status: event.status,\n ...(event.durationMs !== undefined ? { durationMs: event.durationMs } : {}),\n });\n return;\n }\n case \"precheck\": {\n noteCheckpoint(event.at);\n writeEvent(io, {\n event: \"judge_precheck\",\n status: event.status,\n ...(event.durationMs !== undefined ? { durationMs: event.durationMs } : {}),\n });\n return;\n }\n case \"lock-wait\": {\n noteCheckpoint(event.at);\n writeEvent(io, {\n event: \"lock_wait\",\n experimentId: event.experimentId,\n evalId: event.evalId,\n status: event.status,\n ...(event.holderPid !== undefined ? { holderPid: event.holderPid } : {}),\n ...(event.holderHost !== undefined ? { holderHost: event.holderHost } : {}),\n // 折叠 carried/dispatched 两个内部计数为一个公开 resolution:仍有 attempt 需要真实\n // 派发(dispatched > 0)记 \"dispatched\",全部由携带满足才记 \"carried\"\n // (见 ../types.ts 里 DurableFeedbackEvent \"lock-wait\" 变体的字段注释)。\n ...(event.status === \"resolved\"\n ? { resolution: (event.dispatched ?? 0) > 0 ? \"dispatched\" : \"carried\" }\n : {}),\n ...(event.waitedMs !== undefined ? { waitedMs: event.waitedMs } : {}),\n });\n return;\n }\n case \"run-activity\": {\n // Run activity 只服务 human live 面;ExpEvent 的已采纳词表没有这一种事件。\n return;\n }\n case \"interrupted\": {\n noteCheckpoint(event.at);\n if (!isFirstOccurrence(state, \"interrupted\"))\n return;\n writeEvent(io, { event: \"interrupted\" });\n return;\n }\n case \"reporter-error\": {\n noteCheckpoint(event.at);\n if (!isFirstOccurrence(state, `reporter-error:${event.reporter}`))\n return;\n writeEvent(io, {\n event: \"reporter_error\",\n reporter: event.reporter,\n required: event.required,\n message: event.message,\n });\n return;\n }\n case \"summary\":\n pendingSummary = event.summary;\n return;\n case \"kept\": {\n if (event.verdict === \"skipped\") {\n throw new Error(\"A skipped attempt cannot own a retained sandbox\");\n }\n writeEvent(io, {\n event: \"kept\",\n locator: String(event.locator),\n evalId: event.identity.evalId,\n attempt: event.identity.attempt,\n verdict: event.verdict,\n provider: event.provider,\n sandboxId: event.sandboxId,\n enter: event.enter ?? `niceeval sandbox enter ${event.sandboxId.slice(0, 12)}`,\n });\n return;\n }\n case \"receipt\":\n writeEvalConclusions(io, pendingSummary, state);\n if (pendingSummary === undefined) {\n throw new Error(\"A receipt cannot be rendered before its invocation summary\");\n }\n writeEvent(io, {\n type: \"receipt\",\n receipt: event.receipt,\n summary: terminalSummary(pendingSummary),\n });\n return;\n default: {\n // 穷尽性检查:新增 DurableFeedbackEvent 变体时这里编译期报错提醒补上对应分支。\n const exhaustive: never = event;\n return exhaustive;\n }\n }\n },\n onTick(event, state) {\n const idle = event.at - lastCheckpointAtMs;\n if (idle < JSON_HEARTBEAT_IDLE_MS)\n return;\n noteCheckpoint(event.at);\n writeEvent(io, {\n event: \"progress\",\n elapsedMs: event.elapsedMs,\n total: state.total,\n reused: state.reused,\n running: state.running,\n elsewhere: state.elsewhere,\n queued: state.queued,\n // 与 human 首行同一份状态、同一套划分:已了结的 attempt 按 verdict 分项,消费方不必\n // 自己从合计数里猜成败(契约见 docs/feature/experiments/cli.md 的 ProgressEvent)。\n passed: state.passed,\n failed: state.failed,\n errored: state.errored,\n skipped: state.skipped,\n });\n },\n // 没有 clearDynamic/redrawDynamic/activity/onLifecycle:见文件顶部注释——JSON 流不维护\n // 动态区域、不逐次输出 provisioning retry/backoff、不逐条展示 active phase 或 passed attempt。\n };\n}\n/** 某个去重 key 在 `state.diagnostics` 里是不是第一次出现(count === 1)。budget-exhausted /\n * interrupted / reporter-error 的去重 key 计算方式与 reducer.ts 完全一致(见该文件的\n * `budget-exhausted:${experimentId}` / `\"interrupted\"` / `reporter-error:${reporter}`)。 */\nfunction isFirstOccurrence(state: RunFeedbackState, key: string): boolean {\n return (state.diagnostics.find((d) => d.key === key)?.count ?? 0) <= 1;\n}\n/** `data` 里的一个字符串字段;非字符串(或缺失)一律当没有,不把数字/对象硬塞进只接受\n * 字符串的事件字段里。 */\nfunction stringField(value: JsonValue | undefined): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\nfunction numberField(value: JsonValue | undefined): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\nfunction coordinationResourceField(value: JsonValue | undefined): NoticeEvent[\"resource\"] {\n return value === \"case-lock\" ? value : undefined;\n}\n/** 通知 data 是 JSON 边界;只有全局 LifecyclePhase 闭集成员才能进入 notice/warning phase。 */\nfunction lifecyclePhaseField(value: JsonValue | undefined): LifecyclePhase | undefined {\n switch (value) {\n case \"judge.precheck\":\n case \"experiment.setup\":\n case \"experiment.teardown\":\n case \"attempt.setup\":\n case \"attempt.teardown\":\n case \"sandbox.queue\":\n case \"sandbox.create\":\n case \"sandbox.prepare\":\n case \"sandbox.prepare.eval\":\n case \"sandbox.prepare.group\":\n case \"sandbox.prepare.experiment\":\n case \"agent.ensure\":\n case \"workspace.baseline\":\n case \"agent.setup\":\n case \"telemetry.configure\":\n case \"eval.run\":\n case \"agent.run\":\n case \"workspace.diff\":\n case \"assertions.evaluate\":\n case \"telemetry.collect\":\n case \"agent.teardown\":\n case \"sandbox.cleanup\":\n case \"sandbox.suspend\":\n case \"sandbox.stop\":\n return value;\n default:\n return undefined;\n }\n}\n// ───────────────────────── failure / error 事件(不设上限) ─────────────────────────\nfunction writeFailureOrError(io: FeedbackIO, event: DurableFeedbackEvent & {\n type: \"failure\";\n}): void {\n const experimentId = requiredExperimentId(event.identity.experimentId, event.identity.evalId);\n const fact = event.fact;\n if (fact !== undefined) {\n writeEvent(io, {\n event: \"failure\",\n locator: String(event.locator),\n evalId: event.identity.evalId,\n experimentId,\n verdict: event.verdict,\n fact: fact.title,\n ...(fact.matcher !== undefined ? { matcher: fact.matcher } : {}),\n ...(fact.expected !== undefined ? { expected: fact.expected } : {}),\n ...(fact.received !== undefined ? { received: fact.received } : {}),\n });\n return;\n }\n if (event.verdict === \"errored\") {\n writeEvent(io, {\n event: \"error\",\n locator: String(event.locator),\n evalId: event.identity.evalId,\n experimentId,\n phase: event.phase ?? \"eval.run\",\n reason: event.reason,\n });\n return;\n }\n writeEvent(io, {\n event: \"failure\",\n locator: String(event.locator),\n evalId: event.identity.evalId,\n experimentId,\n verdict: event.verdict,\n fact: event.reason,\n });\n}\nfunction requiredExperimentId(experimentId: string | undefined, evalId: string): string {\n if (experimentId === undefined) {\n throw new Error(`JSON experiment event is missing experimentId for eval ${evalId}`);\n }\n return experimentId;\n}\n// ───────────────────────── 逐 eval 结论行(不设上限,写在 result 之前) ─────────────────────────\n/** 一条 `eval` 事件(cli.md「runs 与首过即停怎样展示」):字段随 earlyExit 是否触发在\n * planned/unstarted/reason 与 passed 两组间二选一,不同时出现两组字段。`rate` 是\n * `EvalConclusionRow` 派生出的额外读数,不在 `ExpEvent` 的 `EvalEvent` 形状里,这里不透出。 */\nfunction evalConclusionEvent(row: EvalConclusionRow): EvalEvent | undefined {\n const experimentId = requiredExperimentId(row.experimentId, row.evalId);\n if (row.locator === undefined) {\n // Pre-dispatch failures have no origin Attempt and therefore no locator.\n // `eval` events are locator-addressable conclusions, so the run-level\n // diagnostic and final result counts are their public projection.\n return undefined;\n }\n const base: EvalEventBase = {\n event: \"eval\",\n locator: row.locator,\n evalId: row.evalId,\n experimentId,\n verdict: row.verdict,\n attempts: row.attempts,\n };\n if (row.reason === \"early_exit\") {\n if (row.planned === undefined || row.unstarted === undefined) {\n throw new Error(`Early-exit eval event is missing planned counts for eval ${row.evalId}`);\n }\n return { ...base, planned: row.planned, unstarted: row.unstarted, reason: row.reason };\n }\n if (row.passed === undefined) {\n throw new Error(`Completed eval event is missing passed count for eval ${row.evalId}`);\n }\n return { ...base, passed: row.passed };\n}\nfunction writeEvalConclusions(io: FeedbackIO, pending: InvocationSummary | undefined, state: RunFeedbackState): void {\n if (!pending)\n return;\n const rows = evalConclusionRows(pending.results, state.earlyExitByEval, state.diagnostics);\n for (const row of rows) {\n const event = evalConclusionEvent(row);\n if (event !== undefined)\n writeEvent(io, event);\n }\n}\n// ───────────────────────── 退出码(CompletionStatus 驱动) ─────────────────────────\n/**\n * 把 `InvocationSummary` + `InvocationCompletion` 折成 CLI 退出码(cli.md「机器怎么读:--json」\n * 的退出码表)。纯函数,不看 CLI flag、不读 `process.env`;两种输出形态(human/json)共用同一套\n * 退出码,不是某一种 profile 专属——放在这个模块只是历史沿革(此前 `computeCiExitCode` 定义在\n * ci.ts,合并后更名为不带 profile 前缀的 `computeExitCode`)。\n *\n * 不在这里处理「2 = CLI/runner 未捕获崩溃」——那是进程级 uncaught exception/rejection 处理器\n * 的职责,不是「一次 run 正常收尾后该给什么退出码」的问题,不应该由 completion 驱动。\n */\nexport function computeExitCode(summary: InvocationSummary, completion: InvocationCompletion): number {\n if (completion.status === \"interrupted\")\n return 130;\n if (completion.status === \"incomplete\")\n return 1;\n if (completion.reporterErrors.some((e) => e.required))\n return 1;\n return summary.failed > 0 || summary.errored > 0 ? 1 : 0;\n}\n// ───────────────────────── `--dry --json`:单个 ExpPlanDocument,不是流 ─────────────────────────\n/** 一个 (experiment, eval) 组合在 `ExpPlanDocument.matrix` 里的一行(cli.md「`--dry --json`\n * 输出单个 `ExpPlanDocument`」)。 */\n/** 一条具名差异的机器面投影(`ExpPlanDelta`);selector 只解释本次指纹变化。 */\nexport interface JsonPlanDelta {\n /** 指纹差异词表:`config:<路径>` / `source:<路径>` / `data:<路径>` / `opaque:no-manifest`。 */\n selector: string;\n /** 差异方向。`unknown` 表示历史 manifest 缺失,无法列出具体值。 */\n kind: \"added\" | \"removed\" | \"changed\" | \"unknown\";\n /** 值或内容哈希的有界摘要;opaque 与新增/删除侧按缺省略。 */\n from?: string;\n to?: string;\n}\nexport interface JsonPlanFingerprintComparisonChanged {\n kind: \"changed\";\n deltas: [\n JsonPlanDelta,\n ...JsonPlanDelta[]\n ];\n}\nexport interface JsonPlanFingerprintComparisonUnexplained {\n kind: \"unexplained\";\n diagnostic: JsonPlanDiagnostic;\n}\nexport type JsonPlanDiagnosticFact = {\n label: string;\n value: JsonValue;\n} | {\n label: string;\n from: JsonValue;\n to: JsonValue;\n};\nexport interface JsonPlanDiagnostic {\n /** producer 命名空间内的开放 code;消费者不得按当前已知值穷举。 */\n code: string;\n /** 不依赖 code 才能读懂的单句摘要。 */\n summary: string;\n facts?: JsonPlanDiagnosticFact[];\n /** 省略=不可比较,[]=可比较字段未观察到差异,非空=观察到具名差异。 */\n observedDeltas?: JsonPlanDelta[];\n limitations?: string[];\n causes?: JsonPlanDiagnostic[];\n}\nexport type JsonPlanFingerprintComparison = JsonPlanFingerprintComparisonChanged | JsonPlanFingerprintComparisonUnexplained;\n/** 本行要派发的 attempt 按未携带原因分组(`ExpPlanDispatch`);gate 词表与六道门同名。 */\nexport interface JsonPlanDispatch {\n gate: \"fingerprint\" | \"terminal\" | \"eligibility\" | \"rerun\" | \"mode\" | \"missing\";\n /** 这组原因覆盖的 attempt 序号。 */\n attempts: number[];\n /** 指纹门的比较解释;其它 gate 省略。 */\n comparison?: JsonPlanFingerprintComparison;\n}\nexport interface JsonPlanRow {\n experimentId: string;\n evalId: string;\n evalGroupId?: string;\n /** 命中缓存指纹,本次不会派发新 attempt。 */\n reused: boolean;\n /** previous-result 历史结果。`acceptance: legacy-locator` 表示旧 locator 不符合当前命令语法,不能接受。 */\n prior?: readonly {\n locator: string;\n verdict: import(\"../../shared/types.ts\").Verdict;\n acceptance: \"available\" | \"legacy-locator\";\n evidenceState: \"local\" | \"borrowed\" | \"dangling\";\n }[];\n /** 本行要派发的 attempt 按未携带原因分组;全部携带时省略。 */\n dispatch?: JsonPlanDispatch[];\n /** 该用例正被另一条并行 Invocation 持锁运行,真实运行时将等待后携带或补跑(见\n * docs/feature/experiments/architecture.md「并发 Invocation:用例锁」)。`--dry` 只读锁\n * 目录,不取锁、不等待;省略等于 `false`(JSON.stringify 丢弃 `undefined` 属性,\n * 天然满足这条省略语义,不需要显式写 `locked: false`)。 */\n locked?: boolean;\n}\nexport interface JsonPlanInput {\n /** 与 `start` 事件同一口径的总 attempt 数。 */\n total: number;\n /** 去重后的 eval 数。 */\n evals: number;\n /** (agent, model, flags) 配置组合数。 */\n configs: number;\n /** 代表性的 `--attempts` 值(多个实验取值不同时,展示层不逐配置拆分——见 cli.md 未声明混合 attempts\n * 场景的展示规则,这里与 human/agent 既有的 dry 预览取同一个近似口径:最大值)。 */\n attempts: number;\n matrix: readonly JsonPlanRow[];\n}\n/**\n * `--dry --json`(cli.md:「一次完成的读取,不是事件流」)。dry run 不派发 attempt,没有\n * `RunFeedbackState` 可言,这是独立于 `FeedbackRenderer`/coordinator 的纯函数。\n */\nexport function renderJsonPlanDocument(input: JsonPlanInput): string {\n const reused = input.matrix.reduce((n, row) => n + (row.reused ? 1 : 0), 0);\n return `${JSON.stringify({\n format: EXP_PLAN_FORMAT,\n schemaVersion: EXP_PLAN_SCHEMA_VERSION,\n total: input.total,\n evals: input.evals,\n configs: input.configs,\n attempts: input.attempts,\n reused,\n matrix: input.matrix,\n })}\\n`;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"json.js","sourceRoot":"","sources":["json.ts"],"names":[],"mappings":"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","sourcesContent":["// JSON profile renderer(见 docs/feature/experiments/cli.md「机器怎么读:--json」与「事件与\n// 计划文档的 TypeScript 形状」)。合并了此前 agent.ts + ci.ts 两个 profile —— 逐项对照证实\n// agent 档/ci 档是同一消费者模型的两套参数(heartbeat 30/60s、失败展开上限 5/50、流路由、词法\n// 前缀……),没有模型差,见 memory/exp-output-two-forms-ruling.md。\n//\n// 目标读者是任何非交互解析者(coding agent、CI annotation adapter、脚本),不是人眼:\n// - 单一 stdout 上的 NDJSON 事件流,一行一个 JSON 对象,词法就是 JSON,没有自造 envelope\n// 语法。`stderr` 只留给 run 尚未建立前的 argv/config 错误(那些错误发生在 coordinator/renderer\n// 存在之前,根本不经过这个模块——所以这里没有任何写 `io.stderr` 的分支,不是遗漏)。\n// - 首行 `start` 携带 `format`/`schemaVersion` 标识整条流;其余事件不重复这两个字段。\n// - 失败/错误立即逐条追加,不做展开上限 suppression(机器逐事件消费,截断反而是信息损失,\n// 见 cli.md「'立即追加'也必须有上限」表:上限只约束人读文本)。\n// - 连续 30 秒没有永久事件才追加一条 `progress` 心跳;任意永久事件重置这个时钟。\n// - 事件形状按 `ExpEvent` 判别联合(判别字段 `event`)逐个实现,字段名复用 Record 词表\n// (locator/evalId/experimentId/phase/verdict),不为事件流发明第二套命名。\n//\n// 不实现 `clearDynamic`/`redrawDynamic`/`activity`/`onLifecycle`:JSON 流没有「动态区域」概念,\n// 不展示 active phase、不逐次输出 provisioning retry/backoff、不逐条打印 passed attempt —— 这些\n// 目标行为由「不实现对应可选钩子」天然满足(见 renderer.ts 的接口注释)。\n//\n// 为什么 diagnostic/budget-exhausted/interrupted/reporter-error 仍然去重(只在首次出现时追加)\n// 而 failure/error 不做 suppression:cli.md「什么动态更新,什么逐条追加」表把两者分成不同的行——\n// 「retry 耗尽、降级、budget 不可执行」是「去重后追加一次」的永久事件,「failed/errored + locator」\n// 是「立即追加,不设上限」的独立证据;`--json` 的「不做 suppression」只针对后者(每条失败一个\n// 有界事件),不是把去重规则也一起取消。\nimport type { FeedbackRenderer } from \"./renderer.ts\";\nimport type { FeedbackIO } from \"./io.ts\";\nimport type { DurableFeedbackEvent, InvocationCompletion, InvocationReceipt, InvocationSummary, LifecyclePhase, RunFeedbackState, } from \"../types.ts\";\nimport type { JsonValue, Verdict } from \"../../shared/types.ts\";\nimport type { ExpTerminalSummary } from \"../../experiment/host/cli/output-protocol.ts\";\nimport { evalConclusionRows, type EvalConclusionRow } from \"./eval-conclusions.ts\";\n/** `ExpEvent`/`ExpPlanDocument` 的 `format`/`schemaVersion` —— 只在破坏性形状变更时递增\n * (见 cli.md「事件与计划文档的 TypeScript 形状」)。 */\nconst EXP_STREAM_FORMAT = \"niceeval.exp\";\nconst EXP_PLAN_FORMAT = \"niceeval.exp-plan\";\nconst SCHEMA_VERSION = 2;\nconst EXP_PLAN_SCHEMA_VERSION = 4;\n/** 连续无永久事件多久才追加一条 `progress` 心跳(cli.md「机器怎么读:--json」:「连续 30 秒\n * 没有这些永久事件,才追加一条 progress 心跳」——两者合并前分别是 30s/60s,统一取 30s)。 */\nconst JSON_HEARTBEAT_IDLE_MS = 30000;\nexport interface JsonRendererOptions {\n io: FeedbackIO;\n}\nexport interface StartEvent {\n format: typeof EXP_STREAM_FORMAT;\n schemaVersion: number;\n event: \"start\";\n total: number;\n configs: number;\n concurrency: number;\n experimentConcurrency?: Readonly<globalThis.Record<string, number>>;\n reused: number;\n}\nexport interface ProgressEvent {\n event: \"progress\";\n elapsedMs: number;\n total: number;\n reused: number;\n running: number;\n elsewhere: number;\n queued: number;\n passed: number;\n failed: number;\n errored: number;\n skipped: number;\n}\nexport interface FailureEvent {\n event: \"failure\";\n locator: string;\n evalId: string;\n experimentId: string;\n verdict: \"failed\" | \"errored\";\n fact: string;\n matcher?: string;\n expected?: JsonValue;\n received?: JsonValue;\n}\nexport interface ErrorEvent {\n event: \"error\";\n locator: string;\n evalId: string;\n experimentId: string;\n phase: Exclude<LifecyclePhase, \"agent.setup\" | \"agent.teardown\"> | \"agent.before\" | \"agent.after\";\n reason: string;\n}\ninterface EvalEventBase {\n event: \"eval\";\n locator: string;\n evalId: string;\n experimentId: string;\n verdict: Verdict;\n attempts: number;\n}\nexport type EvalEvent = EvalEventBase & ({\n passed: number;\n planned?: never;\n unstarted?: never;\n reason?: never;\n} | {\n passed?: never;\n planned: number;\n unstarted: number;\n reason: \"early_exit\";\n});\nexport interface KeptEvent {\n event: \"kept\";\n locator: string;\n evalId: string;\n attempt: number;\n verdict: Exclude<Verdict, \"skipped\">;\n provider: string;\n sandboxId: string;\n enter: string;\n}\nexport interface WarningEvent {\n event: \"warning\";\n code: string;\n level: \"warning\" | \"error\";\n message: string;\n phase?: LifecyclePhase;\n experimentId?: string;\n evalId?: string;\n planned?: number;\n errored?: number;\n}\nexport interface NoticeEvent {\n event: \"notice\";\n code: string;\n level: \"info\";\n message: string;\n phase?: LifecyclePhase;\n experimentId?: string;\n evalId?: string;\n resource?: \"case-lock\";\n previousPid?: number;\n previousHost?: string;\n}\nexport interface BudgetExhaustedEvent {\n event: \"budget_exhausted\";\n experimentId: string;\n spent: number;\n unstarted: number;\n}\nexport interface ReporterErrorEvent {\n event: \"reporter_error\";\n reporter: string;\n required: boolean;\n message: string;\n}\nexport interface InterruptedEvent {\n event: \"interrupted\";\n}\nexport interface JudgePrecheckEvent {\n event: \"judge_precheck\";\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n}\nexport interface ExperimentSetupEvent {\n event: \"experiment_setup\";\n experimentId: string;\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n}\nexport interface ExperimentTeardownEvent {\n event: \"experiment_teardown\";\n experimentId: string;\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n}\nexport interface LockWaitEvent {\n event: \"lock_wait\";\n experimentId: string;\n evalId: string;\n status: \"started\" | \"resolved\";\n holderPid?: number;\n holderHost?: string;\n resolution?: \"carried\" | \"dispatched\";\n waitedMs?: number;\n}\n/** The final machine hand-off is the Record v1 receipt, without paths or snapshots. */\nexport interface ReceiptEvent {\n type: \"receipt\";\n receipt: InvocationReceipt;\n summary: ExpTerminalSummary;\n}\n/** `niceeval exp --json` 唯一公开事件词表;新增事件必须先进入已采纳文档与这个闭合联合。 */\nexport type ExpEvent = StartEvent | ProgressEvent | FailureEvent | ErrorEvent | EvalEvent | KeptEvent | NoticeEvent | WarningEvent | BudgetExhaustedEvent | ReporterErrorEvent | InterruptedEvent | JudgePrecheckEvent | ExperimentSetupEvent | ExperimentTeardownEvent | LockWaitEvent | ReceiptEvent;\nfunction writeEvent(io: FeedbackIO, event: ExpEvent): void {\n io.stdout.write(`${JSON.stringify(event)}\\n`);\n}\nfunction terminalSummary(summary: InvocationSummary): ExpTerminalSummary {\n return Object.freeze({\n startedAt: summary.startedAt,\n completedAt: summary.completedAt,\n passed: summary.passed,\n failed: summary.failed,\n skipped: summary.skipped,\n errored: summary.errored,\n durationMs: summary.durationMs,\n ...(summary.usage?.inputTokens === undefined ? {} : { inputTokens: summary.usage.inputTokens }),\n ...(summary.usage?.outputTokens === undefined ? {} : { outputTokens: summary.usage.outputTokens }),\n ...(summary.estimatedCostUSD === undefined ? {} : { estimatedCostUSD: summary.estimatedCostUSD }),\n beforeCaches: summary.beforeCaches,\n });\n}\n/**\n * 创建 JSON profile 的 `FeedbackRenderer`。只用 `io.stdout` 写文本——`--json` 的全部正常事件\n * 走一个 stdout sink,不拆到 stderr(两个 OS stream 被 CI runner 或 agent 工具层分开缓冲时会\n * 打乱顺序,单流才能保证事件序就是发生序)。\n */\nexport function createJsonRenderer(options: JsonRendererOptions): FeedbackRenderer {\n const { io } = options;\n // 距上一次「有意义的输出」(任意一次永久事件)过了多久,用来判断要不要追加一条心跳;\n // 由 appendDurable 无条件更新——\"plan\" 本身就是第一次永久事件,天然把这个时钟从 0 开始计。\n let lastCheckpointAtMs = 0;\n // \"summary\" 与 \"receipt\" 是 coordinator.finish() 里连续 emit 的两个独立永久事件(中间不会插入\n // 其它事件)。先暂存 summary,receipt 到达时再写 eval 结论行与唯一的最终 receipt。\n let pendingSummary: InvocationSummary | undefined;\n function noteCheckpoint(atMs: number): void {\n lastCheckpointAtMs = atMs;\n }\n return {\n appendDurable(event, state) {\n switch (event.type) {\n case \"plan\": {\n noteCheckpoint(event.at);\n const { shape, reused, experimentConcurrency } = event.plan;\n writeEvent(io, {\n format: EXP_STREAM_FORMAT,\n schemaVersion: SCHEMA_VERSION,\n event: \"start\",\n total: shape.totalAttempts,\n configs: shape.configs,\n concurrency: shape.maxConcurrency,\n // 一个实验都没声明 maxConcurrency 时省略整个字段,不输出空对象(cli.md 的 StartEvent)。\n ...(experimentConcurrency && Object.keys(experimentConcurrency).length > 0\n ? { experimentConcurrency }\n : {}),\n reused,\n });\n return;\n }\n case \"failure\": {\n noteCheckpoint(event.at);\n writeFailureOrError(io, event);\n return;\n }\n case \"diagnostic\": {\n noteCheckpoint(event.at);\n if (!isFirstOccurrence(state, event.key))\n return; // 去重后只追加一次(cli.md)\n const phase = lifecyclePhaseField(event.data?.phase);\n // `code` 是 cli.md notice/warning 事件的稳定词法(`coordination-recovered` /\n // `dispatch-halted`),**不是**去重 key:去重 key 常把折叠身份编进去,原样\n // 透出会让消费方拿到一个每次运行都不同的 code、没法按值分支。折叠到哪一条实验/用例\n // 由下面的 experimentId/evalId 两个具名字段回答。\n const code = event.code ?? event.key;\n // 身份两字段:attempt 级诊断从 identity 取;运行级诊断(实验闸 / eval 闸这类不属于\n // 任何单条 attempt 的事实)不许伪造 identity,从 `data` 的同名字段取(见 ../types.ts\n // \"diagnostic\" 变体的 identity 注释)。\n const experimentId = event.identity?.experimentId ?? stringField(event.data?.experimentId);\n const evalId = event.identity?.evalId ?? stringField(event.data?.evalId);\n const planned = numberField(event.data?.planned);\n const errored = numberField(event.data?.errored);\n const common = {\n code,\n message: event.message,\n ...(phase !== undefined ? { phase } : {}),\n ...(experimentId !== undefined ? { experimentId } : {}),\n ...(evalId !== undefined ? { evalId } : {}),\n ...(planned !== undefined ? { planned } : {}),\n ...(errored !== undefined ? { errored } : {}),\n };\n if (event.severity === \"info\") {\n const resource = coordinationResourceField(event.data?.resource);\n const previousPid = numberField(event.data?.previousPid);\n const previousHost = stringField(event.data?.previousHost);\n writeEvent(io, {\n event: \"notice\",\n level: \"info\",\n ...common,\n ...(resource !== undefined ? { resource } : {}),\n ...(previousPid !== undefined ? { previousPid } : {}),\n ...(previousHost !== undefined ? { previousHost } : {}),\n });\n }\n else {\n writeEvent(io, { event: \"warning\", level: event.severity, ...common });\n }\n return;\n }\n case \"budget-exhausted\": {\n noteCheckpoint(event.at);\n if (!isFirstOccurrence(state, `budget-exhausted:${event.experimentId}`))\n return;\n writeEvent(io, {\n event: \"budget_exhausted\",\n experimentId: event.experimentId,\n spent: event.spent,\n unstarted: event.unstarted,\n });\n return;\n }\n case \"experiment-hook\": {\n noteCheckpoint(event.at);\n writeEvent(io, {\n event: event.hook === \"setup\" ? \"experiment_setup\" : \"experiment_teardown\",\n experimentId: event.experimentId,\n status: event.status,\n ...(event.durationMs !== undefined ? { durationMs: event.durationMs } : {}),\n });\n return;\n }\n case \"precheck\": {\n noteCheckpoint(event.at);\n writeEvent(io, {\n event: \"judge_precheck\",\n status: event.status,\n ...(event.durationMs !== undefined ? { durationMs: event.durationMs } : {}),\n });\n return;\n }\n case \"lock-wait\": {\n noteCheckpoint(event.at);\n writeEvent(io, {\n event: \"lock_wait\",\n experimentId: event.experimentId,\n evalId: event.evalId,\n status: event.status,\n ...(event.holderPid !== undefined ? { holderPid: event.holderPid } : {}),\n ...(event.holderHost !== undefined ? { holderHost: event.holderHost } : {}),\n // 折叠 carried/dispatched 两个内部计数为一个公开 resolution:仍有 attempt 需要真实\n // 派发(dispatched > 0)记 \"dispatched\",全部由携带满足才记 \"carried\"\n // (见 ../types.ts 里 DurableFeedbackEvent \"lock-wait\" 变体的字段注释)。\n ...(event.status === \"resolved\"\n ? { resolution: (event.dispatched ?? 0) > 0 ? \"dispatched\" : \"carried\" }\n : {}),\n ...(event.waitedMs !== undefined ? { waitedMs: event.waitedMs } : {}),\n });\n return;\n }\n case \"run-activity\": {\n // Run activity 只服务 human live 面;ExpEvent 的已采纳词表没有这一种事件。\n return;\n }\n case \"interrupted\": {\n noteCheckpoint(event.at);\n if (!isFirstOccurrence(state, \"interrupted\"))\n return;\n writeEvent(io, { event: \"interrupted\" });\n return;\n }\n case \"reporter-error\": {\n noteCheckpoint(event.at);\n if (!isFirstOccurrence(state, `reporter-error:${event.reporter}`))\n return;\n writeEvent(io, {\n event: \"reporter_error\",\n reporter: event.reporter,\n required: event.required,\n message: event.message,\n });\n return;\n }\n case \"summary\":\n pendingSummary = event.summary;\n return;\n case \"kept\": {\n if (event.verdict === \"skipped\") {\n throw new Error(\"A skipped attempt cannot own a retained sandbox\");\n }\n writeEvent(io, {\n event: \"kept\",\n locator: String(event.locator),\n evalId: event.identity.evalId,\n attempt: event.identity.attempt,\n verdict: event.verdict,\n provider: event.provider,\n sandboxId: event.sandboxId,\n enter: event.enter ?? `niceeval sandbox enter ${event.sandboxId.slice(0, 12)}`,\n });\n return;\n }\n case \"receipt\":\n writeEvalConclusions(io, pendingSummary, state);\n if (pendingSummary === undefined) {\n throw new Error(\"A receipt cannot be rendered before its invocation summary\");\n }\n writeEvent(io, {\n type: \"receipt\",\n receipt: event.receipt,\n summary: terminalSummary(pendingSummary),\n });\n return;\n default: {\n // 穷尽性检查:新增 DurableFeedbackEvent 变体时这里编译期报错提醒补上对应分支。\n const exhaustive: never = event;\n return exhaustive;\n }\n }\n },\n onTick(event, state) {\n const idle = event.at - lastCheckpointAtMs;\n if (idle < JSON_HEARTBEAT_IDLE_MS)\n return;\n noteCheckpoint(event.at);\n writeEvent(io, {\n event: \"progress\",\n elapsedMs: event.elapsedMs,\n total: state.total,\n reused: state.reused,\n running: state.running,\n elsewhere: state.elsewhere,\n queued: state.queued,\n // 与 human 首行同一份状态、同一套划分:已了结的 attempt 按 verdict 分项,消费方不必\n // 自己从合计数里猜成败(契约见 docs/feature/experiments/cli.md 的 ProgressEvent)。\n passed: state.passed,\n failed: state.failed,\n errored: state.errored,\n skipped: state.skipped,\n });\n },\n // 没有 clearDynamic/redrawDynamic/activity/onLifecycle:见文件顶部注释——JSON 流不维护\n // 动态区域、不逐次输出 provisioning retry/backoff、不逐条展示 active phase 或 passed attempt。\n };\n}\n/** 某个去重 key 在 `state.diagnostics` 里是不是第一次出现(count === 1)。budget-exhausted /\n * interrupted / reporter-error 的去重 key 计算方式与 reducer.ts 完全一致(见该文件的\n * `budget-exhausted:${experimentId}` / `\"interrupted\"` / `reporter-error:${reporter}`)。 */\nfunction isFirstOccurrence(state: RunFeedbackState, key: string): boolean {\n return (state.diagnostics.find((d) => d.key === key)?.count ?? 0) <= 1;\n}\n/** `data` 里的一个字符串字段;非字符串(或缺失)一律当没有,不把数字/对象硬塞进只接受\n * 字符串的事件字段里。 */\nfunction stringField(value: JsonValue | undefined): string | undefined {\n return typeof value === \"string\" ? value : undefined;\n}\nfunction numberField(value: JsonValue | undefined): number | undefined {\n return typeof value === \"number\" ? value : undefined;\n}\nfunction coordinationResourceField(value: JsonValue | undefined): NoticeEvent[\"resource\"] {\n return value === \"case-lock\" ? value : undefined;\n}\n/** 通知 data 是 JSON 边界;只有全局 LifecyclePhase 闭集成员才能进入 notice/warning phase。 */\nfunction lifecyclePhaseField(value: JsonValue | undefined): LifecyclePhase | undefined {\n switch (value) {\n case \"judge.precheck\":\n case \"experiment.setup\":\n case \"experiment.teardown\":\n case \"attempt.setup\":\n case \"attempt.teardown\":\n case \"sandbox.queue\":\n case \"sandbox.create\":\n case \"sandbox.prepare\":\n case \"sandbox.prepare.eval\":\n case \"sandbox.prepare.group\":\n case \"sandbox.prepare.experiment\":\n case \"agent.ensure\":\n case \"workspace.baseline\":\n case \"agent.setup\":\n case \"telemetry.configure\":\n case \"eval.run\":\n case \"agent.run\":\n case \"workspace.diff\":\n case \"assertions.evaluate\":\n case \"telemetry.collect\":\n case \"agent.teardown\":\n case \"sandbox.cleanup\":\n case \"sandbox.suspend\":\n case \"sandbox.stop\":\n return value;\n default:\n return undefined;\n }\n}\n// ───────────────────────── failure / error 事件(不设上限) ─────────────────────────\nfunction writeFailureOrError(io: FeedbackIO, event: DurableFeedbackEvent & {\n type: \"failure\";\n}): void {\n const experimentId = requiredExperimentId(event.identity.experimentId, event.identity.evalId);\n const fact = event.fact;\n if (fact !== undefined) {\n writeEvent(io, {\n event: \"failure\",\n locator: String(event.locator),\n evalId: event.identity.evalId,\n experimentId,\n verdict: event.verdict,\n fact: fact.title,\n ...(fact.matcher !== undefined ? { matcher: fact.matcher } : {}),\n ...(fact.expected !== undefined ? { expected: fact.expected } : {}),\n ...(fact.received !== undefined ? { received: fact.received } : {}),\n });\n return;\n }\n if (event.verdict === \"errored\") {\n writeEvent(io, {\n event: \"error\",\n locator: String(event.locator),\n evalId: event.identity.evalId,\n experimentId,\n phase: event.phase === \"agent.setup\" ? \"agent.before\"\n : event.phase === \"agent.teardown\" ? \"agent.after\"\n : event.phase ?? \"eval.run\",\n reason: event.reason,\n });\n return;\n }\n writeEvent(io, {\n event: \"failure\",\n locator: String(event.locator),\n evalId: event.identity.evalId,\n experimentId,\n verdict: event.verdict,\n fact: event.reason,\n });\n}\nfunction requiredExperimentId(experimentId: string | undefined, evalId: string): string {\n if (experimentId === undefined) {\n throw new Error(`JSON experiment event is missing experimentId for eval ${evalId}`);\n }\n return experimentId;\n}\n// ───────────────────────── 逐 eval 结论行(不设上限,写在 result 之前) ─────────────────────────\n/** 一条 `eval` 事件(cli.md「runs 与首过即停怎样展示」):字段随 earlyExit 是否触发在\n * planned/unstarted/reason 与 passed 两组间二选一,不同时出现两组字段。`rate` 是\n * `EvalConclusionRow` 派生出的额外读数,不在 `ExpEvent` 的 `EvalEvent` 形状里,这里不透出。 */\nfunction evalConclusionEvent(row: EvalConclusionRow): EvalEvent | undefined {\n const experimentId = requiredExperimentId(row.experimentId, row.evalId);\n if (row.locator === undefined) {\n // Pre-dispatch failures have no origin Attempt and therefore no locator.\n // `eval` events are locator-addressable conclusions, so the run-level\n // diagnostic and final result counts are their public projection.\n return undefined;\n }\n const base: EvalEventBase = {\n event: \"eval\",\n locator: row.locator,\n evalId: row.evalId,\n experimentId,\n verdict: row.verdict,\n attempts: row.attempts,\n };\n if (row.reason === \"early_exit\") {\n if (row.planned === undefined || row.unstarted === undefined) {\n throw new Error(`Early-exit eval event is missing planned counts for eval ${row.evalId}`);\n }\n return { ...base, planned: row.planned, unstarted: row.unstarted, reason: row.reason };\n }\n if (row.passed === undefined) {\n throw new Error(`Completed eval event is missing passed count for eval ${row.evalId}`);\n }\n return { ...base, passed: row.passed };\n}\nfunction writeEvalConclusions(io: FeedbackIO, pending: InvocationSummary | undefined, state: RunFeedbackState): void {\n if (!pending)\n return;\n const rows = evalConclusionRows(pending.results, state.earlyExitByEval, state.diagnostics);\n for (const row of rows) {\n const event = evalConclusionEvent(row);\n if (event !== undefined)\n writeEvent(io, event);\n }\n}\n// ───────────────────────── 退出码(CompletionStatus 驱动) ─────────────────────────\n/**\n * 把 `InvocationSummary` + `InvocationCompletion` 折成 CLI 退出码(cli.md「机器怎么读:--json」\n * 的退出码表)。纯函数,不看 CLI flag、不读 `process.env`;两种输出形态(human/json)共用同一套\n * 退出码,不是某一种 profile 专属——放在这个模块只是历史沿革(此前 `computeCiExitCode` 定义在\n * ci.ts,合并后更名为不带 profile 前缀的 `computeExitCode`)。\n *\n * 不在这里处理「2 = CLI/runner 未捕获崩溃」——那是进程级 uncaught exception/rejection 处理器\n * 的职责,不是「一次 run 正常收尾后该给什么退出码」的问题,不应该由 completion 驱动。\n */\nexport function computeExitCode(summary: InvocationSummary, completion: InvocationCompletion): number {\n if (completion.status === \"interrupted\")\n return 130;\n if (completion.status === \"incomplete\")\n return 1;\n if (completion.reporterErrors.some((e) => e.required))\n return 1;\n return summary.failed > 0 || summary.errored > 0 ? 1 : 0;\n}\n// ───────────────────────── `--dry --json`:单个 ExpPlanDocument,不是流 ─────────────────────────\n/** 一个 (experiment, eval) 组合在 `ExpPlanDocument.matrix` 里的一行(cli.md「`--dry --json`\n * 输出单个 `ExpPlanDocument`」)。 */\n/** 一条具名差异的机器面投影(`ExpPlanDelta`);selector 只解释本次指纹变化。 */\nexport interface JsonPlanDelta {\n /** 指纹差异词表:`config:<路径>` / `source:<路径>` / `data:<路径>` / `opaque:no-manifest`。 */\n selector: string;\n /** 差异方向。`unknown` 表示历史 manifest 缺失,无法列出具体值。 */\n kind: \"added\" | \"removed\" | \"changed\" | \"unknown\";\n /** 值或内容哈希的有界摘要;opaque 与新增/删除侧按缺省略。 */\n from?: string;\n to?: string;\n}\nexport interface JsonPlanFingerprintComparisonChanged {\n kind: \"changed\";\n deltas: [\n JsonPlanDelta,\n ...JsonPlanDelta[]\n ];\n}\nexport interface JsonPlanFingerprintComparisonUnexplained {\n kind: \"unexplained\";\n diagnostic: JsonPlanDiagnostic;\n}\nexport type JsonPlanDiagnosticFact = {\n label: string;\n value: JsonValue;\n} | {\n label: string;\n from: JsonValue;\n to: JsonValue;\n};\nexport interface JsonPlanDiagnostic {\n /** producer 命名空间内的开放 code;消费者不得按当前已知值穷举。 */\n code: string;\n /** 不依赖 code 才能读懂的单句摘要。 */\n summary: string;\n facts?: JsonPlanDiagnosticFact[];\n /** 省略=不可比较,[]=可比较字段未观察到差异,非空=观察到具名差异。 */\n observedDeltas?: JsonPlanDelta[];\n limitations?: string[];\n causes?: JsonPlanDiagnostic[];\n}\nexport type JsonPlanFingerprintComparison = JsonPlanFingerprintComparisonChanged | JsonPlanFingerprintComparisonUnexplained;\n/** 本行要派发的 attempt 按未携带原因分组(`ExpPlanDispatch`);gate 词表与六道门同名。 */\nexport interface JsonPlanDispatch {\n gate: \"fingerprint\" | \"terminal\" | \"eligibility\" | \"rerun\" | \"mode\" | \"missing\";\n /** 这组原因覆盖的 attempt 序号。 */\n attempts: number[];\n /** 指纹门的比较解释;其它 gate 省略。 */\n comparison?: JsonPlanFingerprintComparison;\n}\nexport interface JsonPlanRow {\n experimentId: string;\n evalId: string;\n evalGroupId?: string;\n /** 命中缓存指纹,本次不会派发新 attempt。 */\n reused: boolean;\n /** previous-result 历史结果。`acceptance: legacy-locator` 表示旧 locator 不符合当前命令语法,不能接受。 */\n prior?: readonly {\n locator: string;\n verdict: import(\"../../shared/types.ts\").Verdict;\n acceptance: \"available\" | \"legacy-locator\";\n evidenceState: \"local\" | \"borrowed\" | \"dangling\";\n }[];\n /** 本行要派发的 attempt 按未携带原因分组;全部携带时省略。 */\n dispatch?: JsonPlanDispatch[];\n /** 该用例正被另一条并行 Invocation 持锁运行,真实运行时将等待后携带或补跑(见\n * docs/feature/experiments/architecture.md「并发 Invocation:用例锁」)。`--dry` 只读锁\n * 目录,不取锁、不等待;省略等于 `false`(JSON.stringify 丢弃 `undefined` 属性,\n * 天然满足这条省略语义,不需要显式写 `locked: false`)。 */\n locked?: boolean;\n}\nexport interface JsonPlanInput {\n /** 与 `start` 事件同一口径的总 attempt 数。 */\n total: number;\n /** 去重后的 eval 数。 */\n evals: number;\n /** (agent, model, flags) 配置组合数。 */\n configs: number;\n /** 代表性的 `--attempts` 值(多个实验取值不同时,展示层不逐配置拆分——见 cli.md 未声明混合 attempts\n * 场景的展示规则,这里与 human/agent 既有的 dry 预览取同一个近似口径:最大值)。 */\n attempts: number;\n matrix: readonly JsonPlanRow[];\n}\n/**\n * `--dry --json`(cli.md:「一次完成的读取,不是事件流」)。dry run 不派发 attempt,没有\n * `RunFeedbackState` 可言,这是独立于 `FeedbackRenderer`/coordinator 的纯函数。\n */\nexport function renderJsonPlanDocument(input: JsonPlanInput): string {\n const reused = input.matrix.reduce((n, row) => n + (row.reused ? 1 : 0), 0);\n return `${JSON.stringify({\n format: EXP_PLAN_FORMAT,\n schemaVersion: EXP_PLAN_SCHEMA_VERSION,\n total: input.total,\n evals: input.evals,\n configs: input.configs,\n attempts: input.attempts,\n reused,\n matrix: input.matrix,\n })}\\n`;\n}\n"]}
|
|
@@ -48,7 +48,7 @@ export interface ErrorEvent {
|
|
|
48
48
|
locator: string;
|
|
49
49
|
evalId: string;
|
|
50
50
|
experimentId: string;
|
|
51
|
-
phase: LifecyclePhase;
|
|
51
|
+
phase: Exclude<LifecyclePhase, "agent.setup" | "agent.teardown"> | "agent.before" | "agent.after";
|
|
52
52
|
reason: string;
|
|
53
53
|
}
|
|
54
54
|
interface EvalEventBase {
|
|
@@ -48,7 +48,7 @@ export interface ErrorEvent {
|
|
|
48
48
|
locator: string;
|
|
49
49
|
evalId: string;
|
|
50
50
|
experimentId: string;
|
|
51
|
-
phase: LifecyclePhase;
|
|
51
|
+
phase: Exclude<LifecyclePhase, "agent.setup" | "agent.teardown"> | "agent.before" | "agent.after";
|
|
52
52
|
reason: string;
|
|
53
53
|
}
|
|
54
54
|
interface EvalEventBase {
|
|
@@ -48,7 +48,7 @@ export interface ErrorEvent {
|
|
|
48
48
|
locator: string;
|
|
49
49
|
evalId: string;
|
|
50
50
|
experimentId: string;
|
|
51
|
-
phase: LifecyclePhase;
|
|
51
|
+
phase: Exclude<LifecyclePhase, "agent.setup" | "agent.teardown"> | "agent.before" | "agent.after";
|
|
52
52
|
reason: string;
|
|
53
53
|
}
|
|
54
54
|
interface EvalEventBase {
|
|
@@ -188,7 +188,7 @@ function reportAttemptLifecycle(event) {
|
|
|
188
188
|
}
|
|
189
189
|
/** 一个 reporter 的某次回调抛错(见 `runner/report.ts` 的 `runReporter`)。`reporter`/`required`
|
|
190
190
|
* 来自调用方注册这个 reporter 时的 `ReporterRegistration`(见其字段注释)——显式 `--junit`
|
|
191
|
-
* 传 `required: true`,用户 `config.reporters
|
|
191
|
+
* 传 `required: true`,用户 `config.reporters`
|
|
192
192
|
* 传 `required: false`。coordinator 把它折进 `RunFeedbackState.diagnostics`(reducer 按
|
|
193
193
|
* `reporter-error:<reporter>` 去重),调用方(`cli.ts` 的 `assembleInvocationCompletion`)据此把
|
|
194
194
|
* `required` 为真的失败折进 `InvocationCompletion.reporterErrors`,让 completion/CI 退出码判红。 */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sink.js","sourceRoot":"","sources":["sink.ts"],"names":[],"mappings":"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","sourcesContent":["// run 激活期间,底层模块(sandbox provider、budget 记账、reporter 兜底、中断处理……)不得\n// 直接写 stdout/stderr(见 docs/feature/experiments/cli.md「输出流和落盘节奏」与本文件对应的\n// PLAN 第 2 节「一个 run 内只有一个终端协调者」)。它们改调用这里的 reportXxx() 系列函数。\n//\n// - 有活跃 FeedbackCoordinator 时(coordinator.start() 之后、finish() 之前,见 cli.ts 的\n// run:start 接线),转发给它 —— coordinator 负责去重、clear→append→redraw 排序、按 profile\n// 分派给 renderer。\n// - 没有活跃 coordinator 时(run:start 之前的 bootstrap 错误、finish() 之后、或不经过\n// cli.ts 的直接库调用),透传回 `src/tty-line.ts` 的 bootstrap 出口。\n//\n// 活跃 coordinator 用一个栈而不是单个全局变量:允许嵌套/连续的 runEvals() 调用(如测试里\n// 同进程跑多个 run,或未来某种「run 之内再跑一个子 run」的场景)各自持有自己的活跃身份,\n// 不会互相覆盖对方的 sink。用显式栈(而不是旧 `tty-line.ts` 那套「广播给所有监听者」的\n// 订阅模式)是因为 reportXxx() 需要一个*唯一*目的地来做去重决策,不能让多个监听者都收到\n// 同一条消息。\nimport { writeStderrLine } from \"../../tty-line.ts\";\nimport type { AttemptLifecycleEvent, AttemptRef, DiagnosticSeverity, ExperimentHookName, FailureDetail } from \"../types.ts\";\nimport type { Verdict } from \"../../shared/types.ts\";\nimport type { JsonValue } from \"../../shared/types.ts\";\nimport type { AttemptLocator } from \"../../attempt-locator.ts\";\n/** `sink.diagnostic()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"diagnostic\" 变体字段一致,\n * 只是省略 `type`/`at`(由 coordinator 补上)。 */\nexport interface DiagnosticInput {\n /** 稳定去重 key —— 同一种 info/warning/error 用同一个 key(见 cli.md「同一 dedupeKey 并发出现时\n * 只留一条并显示次数」),不要把可变的实例细节(如具体 sandbox id)编进 key 本身,\n * 那些细节放 `data`。折叠身份(实验 / eval)可以编进 key,那是「折叠到多细」的表达;\n * 对外展示的稳定词由 `code` 单独给,不从 key 反推。 */\n key: string;\n /** 对外的稳定词法:`--json` 的 notice/warning `code`、human 通知行的标题都读它(见 cli.md)。\n * 省略 = 与 `key` 相同——\n * 折叠身份不进 key 的那些诊断天生就是干净字面量,不必重复写一遍。 */\n code?: string;\n severity: DiagnosticSeverity;\n /** 一句话人类可读摘要;renderer 的 appendDurable 直接展示,不需要再解析。 */\n message: string;\n identity?: AttemptRef;\n data?: Readonly<globalThis.Record<string, JsonValue>>;\n}\n/** `sink.failure()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"failure\" 变体字段一致,只省略\n * `type`/`at`(由 coordinator 补上)。`locator` 只有在 attempt 挂靠 experiment 时才存在\n * (writer 从精确 AttemptId 派生的短 locator);调用方(run.ts)只在拿到 locator 之后\n * 才应该调用这个函数——没有 locator 的裸 run 不产出这类永久失败通知。 */\nexport type FailureInput = FailureDetail;\n/** `sink.budgetExhausted()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"budget-exhausted\" 变体字段\n * 一致,只省略 `type`/`at`。调用方(run.ts)对每一个因预算到顶而不派发的 attempt 各调一次\n * (与 `AttemptLifecycleEvent` 的 \"attempt:early-exit\" 同构);`unstarted` 是调用方自己维护的、\n * 发出这条时的累计未派发数,不是 reducer 能推导的值(见 reducer.ts 对应事件的注释)。 */\nexport interface BudgetExhaustedInput {\n experimentId: string;\n spent: number;\n unstarted: number;\n}\n/** `sink.experimentHook()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"experiment-hook\" 变体字段\n * 一致,省略 `type`/`at`(由 coordinator 补上)。调用方(run.ts)在钩子真正开始/结束时各调\n * 一次;`durationMs` 只在 done/failed 上给。 */\nexport interface ExperimentHookInput {\n experimentId: string;\n hook: ExperimentHookName;\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n /** 强杀后启动自愈的补执行(只在 teardown 的 started 上有意义);省略 = 正常路径。 */\n recovery?: boolean;\n}\n/** `sink.experimentProgress()` 的输入 —— 实验级 `ctx.progress` 压好的单行文本。 */\nexport interface ExperimentProgressInput {\n experimentId: string;\n detail: string;\n}\n/** `sink.precheck()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"precheck\" 变体字段一致,省略\n * `type`/`at`(由 coordinator 补上)。调用方(run.ts)在预检真正开始/结束时各调一次;\n * `durationMs` 在 done 与 failed 上给。 */\nexport interface PrecheckInput {\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n}\n/** `sink.lockWait()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"lock-wait\" 变体字段一致,省略\n * `type`/`at`(由 coordinator 补上)。调用方(run.ts)只在真正探测到撞上新鲜锁、需要等待时才\n * 调一次 \"started\"(取锁立即成功或接管成功都不调用这个函数);等待解决(锁释放/接管后重查\n * 携带完毕)时调一次 \"resolved\"。 */\nexport interface LockWaitInput {\n experimentId: string;\n evalId: string;\n status: \"started\" | \"resolved\";\n holderPid?: number;\n holderHost?: string;\n attempts?: number;\n carried?: number;\n dispatched?: number;\n waitedMs?: number;\n}\n/** `sink.runActivity()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"run-activity\" 变体字段一致,\n * 省略 `type`/`at`。调用方(run.ts 经构建协调器钩子)在每个 Run 级 activity 真正开始/结束时\n * 各调一次,长 activity 可用 progress 更新当前标签;`durationMs` 只在 done/failed 上给。\n * `label` 是 producer 人读标签,展示层不查表。 */\nexport interface RunActivityInput {\n id: string;\n key: string;\n label: string;\n status: \"started\" | \"progress\" | \"done\" | \"failed\";\n durationMs?: number;\n}\n/** `sink.kept()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"kept\" 变体字段一致,省略 type/at。 */\nexport interface KeptInput {\n locator: AttemptLocator;\n identity: AttemptRef;\n who: string;\n verdict: Verdict;\n provider: string;\n sandboxId: string;\n enter?: string;\n}\n/** `sink.ts` façade 函数实际转发到的最小接口 —— `FeedbackCoordinator`(coordinator.ts)实现它。\n * 定义在这里(而不是从 coordinator.ts 导入)是为了让 sink.ts 不必在运行时依赖 coordinator.ts,\n * 避免两个模块互相 import 造成的循环依赖 —— coordinator.ts 反过来 `import type` 这个接口。 */\nexport interface FeedbackSink {\n activity(text: string): void;\n diagnostic(input: DiagnosticInput): void;\n interrupted(): void;\n reporterError(input: {\n reporter: string;\n required: boolean;\n message: string;\n }): void;\n /** 一次失败/errored attempt 的永久通知(见 `FailureInput`)。 */\n failure(input: FailureInput): void;\n /** 一个因预算到顶而未被派发的 attempt(见 `BudgetExhaustedInput`)。 */\n budgetExhausted(input: BudgetExhaustedInput): void;\n /** 一次留存授予(--keep-sandbox);见 `KeptInput` 与 docs/feature/sandbox/cli.md。 */\n kept(input: KeptInput): void;\n /** 实验级钩子(`ExperimentDef.setup` / teardown)的起止(见 `ExperimentHookInput`)。 */\n experimentHook(input: ExperimentHookInput): void;\n /** judge 预检的起止(见 `PrecheckInput`)。整次运行至多一次,发生在任何 attempt 派发之前。 */\n precheck(input: PrecheckInput): void;\n /** 用例锁等待的起止(见 `LockWaitInput`)。 */\n lockWait(input: LockWaitInput): void;\n /** Run 级开放 activity 的起止(见 `RunActivityInput`)。不占 attempt 并发位。 */\n runActivity(input: RunActivityInput): void;\n /** 实验级 `ctx.progress` 的短命投影:只更新运行级行的 detail。与 `lifecycle` 同级别的\n * 「只服务正在画着的 dashboard」信号,没有活跃 coordinator 时静默丢弃是安全的。 */\n experimentProgress(input: ExperimentProgressInput): void;\n /** attempt 生命周期事件(queued/start/phase/progress/complete/early-exit),见\n * `AttemptLifecycleEvent`。只驱动 human dashboard 的 active slot,不落 InvocationSummary/结果文件,\n * 所以没有活跃 coordinator 时(见 `reportAttemptLifecycle`)静默丢弃是安全的 —— 这类信息\n * 本身就只服务「正在画着的 dashboard」,不是必须留痕的诊断。 */\n lifecycle(event: AttemptLifecycleEvent): void;\n}\nconst activeStack: FeedbackSink[] = [];\n/**\n * coordinator 进入「活跃」阶段时调用一次(见 coordinator.ts 的 start()),把自己注册为当前\n * reportXxx() 调用的目的地。返回的函数用于退出活跃状态(见 coordinator.ts 的 finish())——\n * 调用一次即失效,重复调用是安全的 no-op。\n */\nexport function activateFeedbackSink(sink: FeedbackSink): () => void {\n activeStack.push(sink);\n let active = true;\n return () => {\n if (!active)\n return;\n active = false;\n const idx = activeStack.lastIndexOf(sink);\n if (idx !== -1)\n activeStack.splice(idx, 1);\n };\n}\nfunction current(): FeedbackSink | undefined {\n return activeStack[activeStack.length - 1];\n}\n/** 仅供测试:断言没有遗留未退出的活跃 coordinator(避免一个测试忘记 finish() 污染下一个)。 */\nexport function activeFeedbackSinkCount(): number {\n return activeStack.length;\n}\n/** 不需要去重、不进入 RunFeedbackState 的瞬时活动文本(docker 镜像拉取进度、vercel session\n * rotate 成功通知……)。没有活跃 coordinator 时退回一行 stderr,与迁移前的裸写视觉效果一致。 */\nexport function reportActivity(text: string): void {\n const sink = current();\n if (sink) {\n sink.activity(text);\n return;\n }\n writeStderrLine(text.endsWith(\"\\n\") ? text : `${text}\\n`);\n}\n/** 需要去重、要出现在两种 profile 永久事件流里的一条 info/warning/error。 */\nexport function reportDiagnostic(input: DiagnosticInput): void {\n const sink = current();\n if (sink) {\n sink.diagnostic(input);\n return;\n }\n writeStderrLine(input.message.endsWith(\"\\n\") ? input.message : `${input.message}\\n`);\n}\n/**\n * Error-assistance diagnostics are optional presentation enrichment. Library\n * calls without an active CLI/Host coordinator must stay silent: the owning\n * typed failure or Attempt fact remains the authoritative outcome.\n */\nexport function reportAssistedDiagnostic(input: DiagnosticInput): void {\n current()?.diagnostic(input);\n}\n/** 一次失败/errored attempt 的永久通知(见 `FailureInput`)。与 `reportDiagnostic` 同级别的\n * 「必须留痕」信号 —— 没有活跃 coordinator 时退回一行 stderr,不像 `reportAttemptLifecycle`\n * 那样静默丢弃(定位一次真实失败不该因为没接 coordinator 就彻底没有出口)。 */\nexport function reportFailure(input: FailureInput): void {\n const sink = current();\n if (sink) {\n sink.failure(input);\n return;\n }\n writeStderrLine(`${input.who} ${input.verdict}: ${input.reason}\\n`);\n}\n/** 一个因预算到顶而未被派发的 attempt(见 `BudgetExhaustedInput`)。没有活跃 coordinator 时的\n * 兜底文案与 coordinator.ts 的 `fallbackTextFor` 对 \"budget-exhausted\" 事件的格式化保持一致。 */\n/** 一次留存授予的永久通知(--keep-sandbox);没有活跃 coordinator 时退回一行 stderr。 */\nexport function reportKept(input: KeptInput): void {\n const sink = current();\n if (sink) {\n sink.kept(input);\n return;\n }\n writeStderrLine(`kept sandbox ${input.sandboxId} (${input.provider}) — ${input.identity.evalId} #${input.identity.attempt} ${input.verdict}\\n`);\n}\n/** 实验级钩子的起止(见 `ExperimentHookInput`)。没有活跃 coordinator 时退回一行 stderr ——\n * 长 setup 的可见性正是这条通道存在的理由,不能像 lifecycle 那样静默丢弃。 */\nexport function reportExperimentHook(input: ExperimentHookInput): void {\n const sink = current();\n if (sink) {\n sink.experimentHook(input);\n return;\n }\n const duration = input.durationMs !== undefined ? ` (${Math.round(input.durationMs / 1000)}s)` : \"\";\n writeStderrLine(`experiment ${input.hook} ${input.status} · ${input.experimentId}${duration}\\n`);\n}\n/** 实验级 `ctx.progress` 的短命投影。与 `reportAttemptLifecycle` 同理:只服务正在画着的\n * dashboard,没有活跃 coordinator 时静默 no-op。 */\nexport function reportExperimentProgress(input: ExperimentProgressInput): void {\n current()?.experimentProgress(input);\n}\n/** judge 预检的起止(见 `PrecheckInput`)。没有活跃 coordinator 时退回一行 stderr ——\n * 慢预检的可见性正是这条通道存在的理由,不能像 lifecycle 那样静默丢弃。 */\nexport function reportPrecheck(input: PrecheckInput): void {\n const sink = current();\n if (sink) {\n sink.precheck(input);\n return;\n }\n const duration = input.durationMs !== undefined ? ` (${Math.round(input.durationMs / 1000)}s)` : \"\";\n const word = input.status === \"done\" ? `judge config ok` : `judge precheck failed`;\n writeStderrLine(input.status === \"started\" ? `${`prechecking judge config`}\\n` : `${word}${duration}\\n`);\n}\n/** 用例锁等待的起止(见 `LockWaitInput`)。没有活跃 coordinator 时退回一行 stderr ——\n * 长等待期间的可见性正是这条通道存在的理由,不能像 lifecycle 那样静默丢弃。 */\nexport function reportLockWait(input: LockWaitInput): void {\n const sink = current();\n if (sink) {\n sink.lockWait(input);\n return;\n }\n writeStderrLine(input.status === \"started\"\n ? `waiting on another run · ${input.experimentId} ${input.evalId}\\n`\n : `lock wait resolved · ${input.experimentId} ${input.evalId}\\n`);\n}\nexport function reportRunActivity(input: RunActivityInput): void {\n const sink = current();\n if (sink) {\n sink.runActivity(input);\n return;\n }\n const duration = input.durationMs !== undefined ? ` (${input.durationMs}ms)` : \"\";\n const statusWord = input.status === \"started\" || input.status === \"progress\" ? \"\" : ` ${input.status}`;\n writeStderrLine(`${input.label}${statusWord}${duration}\\n`);\n}\nexport function reportBudgetExhausted(input: BudgetExhaustedInput): void {\n const sink = current();\n if (sink) {\n sink.budgetExhausted(input);\n return;\n }\n writeStderrLine(`budget exhausted for ${input.experimentId} (spent ${input.spent}, unstarted ${input.unstarted})\\n`);\n}\n/** 用户中断(Ctrl+C)。没有活跃 coordinator 时的兜底文案与迁移前的 `runner.interrupted` 完全\n * 相同 —— 调用方(run.ts)不再需要自己持有这段 i18n 文案。 */\nexport function reportInterrupted(): void {\n const sink = current();\n if (sink) {\n sink.interrupted();\n return;\n }\n writeStderrLine(` · interrupted: printing partial results completed so far.\n`);\n}\n/**\n * runner 自己驱动的 attempt 生命周期投影(见 docs/feature/experiments/cli.md「Attempt 阶段」)——\n * `src/runner/attempt.ts`(phase/progress)与 `src/runner/run.ts`(start/complete/early-exit)是\n * 目前仅有的两个调用方。没有活跃 coordinator 时(今天:CLI 还没接入 --output)静默 no-op ——\n * 与其它 reportXxx() 不同,这里不退回 `writeStderrLine` 兜底:这类事件只服务尚不存在的\n * dashboard,不是需要留痕的诊断,现有可观察行为(直到 CLI 接入真正的 coordinator 之前)因此\n * 完全不变。\n */\nexport function reportAttemptLifecycle(event: AttemptLifecycleEvent): void {\n current()?.lifecycle(event);\n}\n/** 一个 reporter 的某次回调抛错(见 `runner/report.ts` 的 `runReporter`)。`reporter`/`required`\n * 来自调用方注册这个 reporter 时的 `ReporterRegistration`(见其字段注释)——显式 `--junit`\n * 传 `required: true`,用户 `config.reporters`/`EvalDef.reporters`\n * 传 `required: false`。coordinator 把它折进 `RunFeedbackState.diagnostics`(reducer 按\n * `reporter-error:<reporter>` 去重),调用方(`cli.ts` 的 `assembleInvocationCompletion`)据此把\n * `required` 为真的失败折进 `InvocationCompletion.reporterErrors`,让 completion/CI 退出码判红。 */\nexport function reportReporterError(input: {\n reporter: string;\n required: boolean;\n message: string;\n}): void {\n const sink = current();\n if (sink) {\n sink.reporterError(input);\n return;\n }\n writeStderrLine(` · [diagnostic] ${input.reporter} failed (ignored): ${input.message}\n`);\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sink.js","sourceRoot":"","sources":["sink.ts"],"names":[],"mappings":";;AAwJA,oDAWC;AAKD,0DAEC;AAGD,wCAOC;AAED,4CAOC;AAMD,4DAEC;AAID,sCAOC;AAID,gCAOC;AAGD,oDAQC;AAGD,4DAEC;AAGD,wCASC;AAGD,wCASC;AACD,8CASC;AACD,sDAOC;AAGD,8CAQC;AASD,wDAEC;AAOD,kDAYC;AA9TD,iEAAiE;AACjE,uEAAuE;AACvE,4DAA4D;AAC5D,EAAE;AACF,4EAA4E;AAC5E,4EAA4E;AAC5E,kBAAkB;AAClB,mEAAmE;AACnE,yDAAyD;AACzD,EAAE;AACF,2DAA2D;AAC3D,oDAAoD;AACpD,uDAAuD;AACvD,qDAAqD;AACrD,SAAS;AACT,mDAAoD;AAmIpD,MAAM,WAAW,GAAmB,EAAE,CAAC;AACvC;;;;GAIG;AACH,SAAgB,oBAAoB,CAAC,IAAkB;IACnD,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,IAAI,MAAM,GAAG,IAAI,CAAC;IAClB,OAAO,GAAG,EAAE;QACR,IAAI,CAAC,MAAM;YACP,OAAO;QACX,MAAM,GAAG,KAAK,CAAC;QACf,MAAM,GAAG,GAAG,WAAW,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;QAC1C,IAAI,GAAG,KAAK,CAAC,CAAC;YACV,WAAW,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;IACnC,CAAC,CAAC;AACN,CAAC;AACD,SAAS,OAAO;IACZ,OAAO,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC/C,CAAC;AACD,8DAA8D;AAC9D,SAAgB,uBAAuB;IACnC,OAAO,WAAW,CAAC,MAAM,CAAC;AAC9B,CAAC;AACD;kEACkE;AAClE,SAAgB,cAAc,CAAC,IAAY;IACvC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QACpB,OAAO;IACX,CAAC;IACD,IAAA,6BAAe,EAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,CAAC,CAAC;AAC9D,CAAC;AACD,wDAAwD;AACxD,SAAgB,gBAAgB,CAAC,KAAsB;IACnD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QACvB,OAAO;IACX,CAAC;IACD,IAAA,6BAAe,EAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AACzF,CAAC;AACD;;;;GAIG;AACH,SAAgB,wBAAwB,CAAC,KAAsB;IAC3D,OAAO,EAAE,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC;AACjC,CAAC;AACD;;kDAEkD;AAClD,SAAgB,aAAa,CAAC,KAAmB;IAC7C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QACpB,OAAO;IACX,CAAC;IACD,IAAA,6BAAe,EAAC,GAAG,KAAK,CAAC,GAAG,IAAI,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;AACxE,CAAC;AACD;gFACgF;AAChF,iEAAiE;AACjE,SAAgB,UAAU,CAAC,KAAgB;IACvC,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACjB,OAAO;IACX,CAAC;IACD,IAAA,6BAAe,EAAC,gBAAgB,KAAK,CAAC,SAAS,KAAK,KAAK,CAAC,QAAQ,OAAO,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC,OAAO,IAAI,KAAK,CAAC,OAAO,IAAI,CAAC,CAAC;AACpJ,CAAC;AACD;oDACoD;AACpD,SAAgB,oBAAoB,CAAC,KAA0B;IAC3D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC;QAC3B,OAAO;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,IAAA,6BAAe,EAAC,cAAc,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,MAAM,MAAM,KAAK,CAAC,YAAY,GAAG,QAAQ,IAAI,CAAC,CAAC;AACrG,CAAC;AACD;4CAC4C;AAC5C,SAAgB,wBAAwB,CAAC,KAA8B;IACnE,OAAO,EAAE,EAAE,kBAAkB,CAAC,KAAK,CAAC,CAAC;AACzC,CAAC;AACD;+CAC+C;AAC/C,SAAgB,cAAc,CAAC,KAAoB;IAC/C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;IACpG,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,uBAAuB,CAAC;IACnF,IAAA,6BAAe,EAAC,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,0BAA0B,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,QAAQ,IAAI,CAAC,CAAC;AAC7G,CAAC;AACD;iDACiD;AACjD,SAAgB,cAAc,CAAC,KAAoB;IAC/C,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QACrB,OAAO;IACX,CAAC;IACD,IAAA,6BAAe,EAAC,KAAK,CAAC,MAAM,KAAK,SAAS;QACtC,CAAC,CAAC,4BAA4B,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,IAAI;QACpE,CAAC,CAAC,wBAAwB,KAAK,CAAC,YAAY,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,CAAC;AAC1E,CAAC;AACD,SAAgB,iBAAiB,CAAC,KAAuB;IACrD,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACxB,OAAO;IACX,CAAC;IACD,MAAM,QAAQ,GAAG,KAAK,CAAC,UAAU,KAAK,SAAS,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,UAAU,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;IAClF,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;IACvG,IAAA,6BAAe,EAAC,GAAG,KAAK,CAAC,KAAK,GAAG,UAAU,GAAG,QAAQ,IAAI,CAAC,CAAC;AAChE,CAAC;AACD,SAAgB,qBAAqB,CAAC,KAA2B;IAC7D,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO;IACX,CAAC;IACD,IAAA,6BAAe,EAAC,wBAAwB,KAAK,CAAC,YAAY,WAAW,KAAK,CAAC,KAAK,eAAe,KAAK,CAAC,SAAS,KAAK,CAAC,CAAC;AACzH,CAAC;AACD;2CAC2C;AAC3C,SAAgB,iBAAiB;IAC7B,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,OAAO;IACX,CAAC;IACD,IAAA,6BAAe,EAAC;CACnB,CAAC,CAAC;AACH,CAAC;AACD;;;;;;;GAOG;AACH,SAAgB,sBAAsB,CAAC,KAA4B;IAC/D,OAAO,EAAE,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC;AAChC,CAAC;AACD;;;;;sFAKsF;AACtF,SAAgB,mBAAmB,CAAC,KAInC;IACG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC;IACvB,IAAI,IAAI,EAAE,CAAC;QACP,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,CAAC;QAC1B,OAAO;IACX,CAAC;IACD,IAAA,6BAAe,EAAC,oBAAoB,KAAK,CAAC,QAAQ,sBAAsB,KAAK,CAAC,OAAO;CACxF,CAAC,CAAC;AACH,CAAC","sourcesContent":["// run 激活期间,底层模块(sandbox provider、budget 记账、reporter 兜底、中断处理……)不得\n// 直接写 stdout/stderr(见 docs/feature/experiments/cli.md「输出流和落盘节奏」与本文件对应的\n// PLAN 第 2 节「一个 run 内只有一个终端协调者」)。它们改调用这里的 reportXxx() 系列函数。\n//\n// - 有活跃 FeedbackCoordinator 时(coordinator.start() 之后、finish() 之前,见 cli.ts 的\n// run:start 接线),转发给它 —— coordinator 负责去重、clear→append→redraw 排序、按 profile\n// 分派给 renderer。\n// - 没有活跃 coordinator 时(run:start 之前的 bootstrap 错误、finish() 之后、或不经过\n// cli.ts 的直接库调用),透传回 `src/tty-line.ts` 的 bootstrap 出口。\n//\n// 活跃 coordinator 用一个栈而不是单个全局变量:允许嵌套/连续的 runEvals() 调用(如测试里\n// 同进程跑多个 run,或未来某种「run 之内再跑一个子 run」的场景)各自持有自己的活跃身份,\n// 不会互相覆盖对方的 sink。用显式栈(而不是旧 `tty-line.ts` 那套「广播给所有监听者」的\n// 订阅模式)是因为 reportXxx() 需要一个*唯一*目的地来做去重决策,不能让多个监听者都收到\n// 同一条消息。\nimport { writeStderrLine } from \"../../tty-line.ts\";\nimport type { AttemptLifecycleEvent, AttemptRef, DiagnosticSeverity, ExperimentHookName, FailureDetail } from \"../types.ts\";\nimport type { Verdict } from \"../../shared/types.ts\";\nimport type { JsonValue } from \"../../shared/types.ts\";\nimport type { AttemptLocator } from \"../../attempt-locator.ts\";\n/** `sink.diagnostic()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"diagnostic\" 变体字段一致,\n * 只是省略 `type`/`at`(由 coordinator 补上)。 */\nexport interface DiagnosticInput {\n /** 稳定去重 key —— 同一种 info/warning/error 用同一个 key(见 cli.md「同一 dedupeKey 并发出现时\n * 只留一条并显示次数」),不要把可变的实例细节(如具体 sandbox id)编进 key 本身,\n * 那些细节放 `data`。折叠身份(实验 / eval)可以编进 key,那是「折叠到多细」的表达;\n * 对外展示的稳定词由 `code` 单独给,不从 key 反推。 */\n key: string;\n /** 对外的稳定词法:`--json` 的 notice/warning `code`、human 通知行的标题都读它(见 cli.md)。\n * 省略 = 与 `key` 相同——\n * 折叠身份不进 key 的那些诊断天生就是干净字面量,不必重复写一遍。 */\n code?: string;\n severity: DiagnosticSeverity;\n /** 一句话人类可读摘要;renderer 的 appendDurable 直接展示,不需要再解析。 */\n message: string;\n identity?: AttemptRef;\n data?: Readonly<globalThis.Record<string, JsonValue>>;\n}\n/** `sink.failure()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"failure\" 变体字段一致,只省略\n * `type`/`at`(由 coordinator 补上)。`locator` 只有在 attempt 挂靠 experiment 时才存在\n * (writer 从精确 AttemptId 派生的短 locator);调用方(run.ts)只在拿到 locator 之后\n * 才应该调用这个函数——没有 locator 的裸 run 不产出这类永久失败通知。 */\nexport type FailureInput = FailureDetail;\n/** `sink.budgetExhausted()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"budget-exhausted\" 变体字段\n * 一致,只省略 `type`/`at`。调用方(run.ts)对每一个因预算到顶而不派发的 attempt 各调一次\n * (与 `AttemptLifecycleEvent` 的 \"attempt:early-exit\" 同构);`unstarted` 是调用方自己维护的、\n * 发出这条时的累计未派发数,不是 reducer 能推导的值(见 reducer.ts 对应事件的注释)。 */\nexport interface BudgetExhaustedInput {\n experimentId: string;\n spent: number;\n unstarted: number;\n}\n/** `sink.experimentHook()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"experiment-hook\" 变体字段\n * 一致,省略 `type`/`at`(由 coordinator 补上)。调用方(run.ts)在钩子真正开始/结束时各调\n * 一次;`durationMs` 只在 done/failed 上给。 */\nexport interface ExperimentHookInput {\n experimentId: string;\n hook: ExperimentHookName;\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n /** 强杀后启动自愈的补执行(只在 teardown 的 started 上有意义);省略 = 正常路径。 */\n recovery?: boolean;\n}\n/** `sink.experimentProgress()` 的输入 —— 实验级 `ctx.progress` 压好的单行文本。 */\nexport interface ExperimentProgressInput {\n experimentId: string;\n detail: string;\n}\n/** `sink.precheck()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"precheck\" 变体字段一致,省略\n * `type`/`at`(由 coordinator 补上)。调用方(run.ts)在预检真正开始/结束时各调一次;\n * `durationMs` 在 done 与 failed 上给。 */\nexport interface PrecheckInput {\n status: \"started\" | \"done\" | \"failed\";\n durationMs?: number;\n}\n/** `sink.lockWait()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"lock-wait\" 变体字段一致,省略\n * `type`/`at`(由 coordinator 补上)。调用方(run.ts)只在真正探测到撞上新鲜锁、需要等待时才\n * 调一次 \"started\"(取锁立即成功或接管成功都不调用这个函数);等待解决(锁释放/接管后重查\n * 携带完毕)时调一次 \"resolved\"。 */\nexport interface LockWaitInput {\n experimentId: string;\n evalId: string;\n status: \"started\" | \"resolved\";\n holderPid?: number;\n holderHost?: string;\n attempts?: number;\n carried?: number;\n dispatched?: number;\n waitedMs?: number;\n}\n/** `sink.runActivity()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"run-activity\" 变体字段一致,\n * 省略 `type`/`at`。调用方(run.ts 经构建协调器钩子)在每个 Run 级 activity 真正开始/结束时\n * 各调一次,长 activity 可用 progress 更新当前标签;`durationMs` 只在 done/failed 上给。\n * `label` 是 producer 人读标签,展示层不查表。 */\nexport interface RunActivityInput {\n id: string;\n key: string;\n label: string;\n status: \"started\" | \"progress\" | \"done\" | \"failed\";\n durationMs?: number;\n}\n/** `sink.kept()` 的输入 —— 与 `DurableFeedbackEvent` 的 \"kept\" 变体字段一致,省略 type/at。 */\nexport interface KeptInput {\n locator: AttemptLocator;\n identity: AttemptRef;\n who: string;\n verdict: Verdict;\n provider: string;\n sandboxId: string;\n enter?: string;\n}\n/** `sink.ts` façade 函数实际转发到的最小接口 —— `FeedbackCoordinator`(coordinator.ts)实现它。\n * 定义在这里(而不是从 coordinator.ts 导入)是为了让 sink.ts 不必在运行时依赖 coordinator.ts,\n * 避免两个模块互相 import 造成的循环依赖 —— coordinator.ts 反过来 `import type` 这个接口。 */\nexport interface FeedbackSink {\n activity(text: string): void;\n diagnostic(input: DiagnosticInput): void;\n interrupted(): void;\n reporterError(input: {\n reporter: string;\n required: boolean;\n message: string;\n }): void;\n /** 一次失败/errored attempt 的永久通知(见 `FailureInput`)。 */\n failure(input: FailureInput): void;\n /** 一个因预算到顶而未被派发的 attempt(见 `BudgetExhaustedInput`)。 */\n budgetExhausted(input: BudgetExhaustedInput): void;\n /** 一次留存授予(--keep-sandbox);见 `KeptInput` 与 docs/feature/sandbox/cli.md。 */\n kept(input: KeptInput): void;\n /** 实验级钩子(`ExperimentDef.setup` / teardown)的起止(见 `ExperimentHookInput`)。 */\n experimentHook(input: ExperimentHookInput): void;\n /** judge 预检的起止(见 `PrecheckInput`)。整次运行至多一次,发生在任何 attempt 派发之前。 */\n precheck(input: PrecheckInput): void;\n /** 用例锁等待的起止(见 `LockWaitInput`)。 */\n lockWait(input: LockWaitInput): void;\n /** Run 级开放 activity 的起止(见 `RunActivityInput`)。不占 attempt 并发位。 */\n runActivity(input: RunActivityInput): void;\n /** 实验级 `ctx.progress` 的短命投影:只更新运行级行的 detail。与 `lifecycle` 同级别的\n * 「只服务正在画着的 dashboard」信号,没有活跃 coordinator 时静默丢弃是安全的。 */\n experimentProgress(input: ExperimentProgressInput): void;\n /** attempt 生命周期事件(queued/start/phase/progress/complete/early-exit),见\n * `AttemptLifecycleEvent`。只驱动 human dashboard 的 active slot,不落 InvocationSummary/结果文件,\n * 所以没有活跃 coordinator 时(见 `reportAttemptLifecycle`)静默丢弃是安全的 —— 这类信息\n * 本身就只服务「正在画着的 dashboard」,不是必须留痕的诊断。 */\n lifecycle(event: AttemptLifecycleEvent): void;\n}\nconst activeStack: FeedbackSink[] = [];\n/**\n * coordinator 进入「活跃」阶段时调用一次(见 coordinator.ts 的 start()),把自己注册为当前\n * reportXxx() 调用的目的地。返回的函数用于退出活跃状态(见 coordinator.ts 的 finish())——\n * 调用一次即失效,重复调用是安全的 no-op。\n */\nexport function activateFeedbackSink(sink: FeedbackSink): () => void {\n activeStack.push(sink);\n let active = true;\n return () => {\n if (!active)\n return;\n active = false;\n const idx = activeStack.lastIndexOf(sink);\n if (idx !== -1)\n activeStack.splice(idx, 1);\n };\n}\nfunction current(): FeedbackSink | undefined {\n return activeStack[activeStack.length - 1];\n}\n/** 仅供测试:断言没有遗留未退出的活跃 coordinator(避免一个测试忘记 finish() 污染下一个)。 */\nexport function activeFeedbackSinkCount(): number {\n return activeStack.length;\n}\n/** 不需要去重、不进入 RunFeedbackState 的瞬时活动文本(docker 镜像拉取进度、vercel session\n * rotate 成功通知……)。没有活跃 coordinator 时退回一行 stderr,与迁移前的裸写视觉效果一致。 */\nexport function reportActivity(text: string): void {\n const sink = current();\n if (sink) {\n sink.activity(text);\n return;\n }\n writeStderrLine(text.endsWith(\"\\n\") ? text : `${text}\\n`);\n}\n/** 需要去重、要出现在两种 profile 永久事件流里的一条 info/warning/error。 */\nexport function reportDiagnostic(input: DiagnosticInput): void {\n const sink = current();\n if (sink) {\n sink.diagnostic(input);\n return;\n }\n writeStderrLine(input.message.endsWith(\"\\n\") ? input.message : `${input.message}\\n`);\n}\n/**\n * Error-assistance diagnostics are optional presentation enrichment. Library\n * calls without an active CLI/Host coordinator must stay silent: the owning\n * typed failure or Attempt fact remains the authoritative outcome.\n */\nexport function reportAssistedDiagnostic(input: DiagnosticInput): void {\n current()?.diagnostic(input);\n}\n/** 一次失败/errored attempt 的永久通知(见 `FailureInput`)。与 `reportDiagnostic` 同级别的\n * 「必须留痕」信号 —— 没有活跃 coordinator 时退回一行 stderr,不像 `reportAttemptLifecycle`\n * 那样静默丢弃(定位一次真实失败不该因为没接 coordinator 就彻底没有出口)。 */\nexport function reportFailure(input: FailureInput): void {\n const sink = current();\n if (sink) {\n sink.failure(input);\n return;\n }\n writeStderrLine(`${input.who} ${input.verdict}: ${input.reason}\\n`);\n}\n/** 一个因预算到顶而未被派发的 attempt(见 `BudgetExhaustedInput`)。没有活跃 coordinator 时的\n * 兜底文案与 coordinator.ts 的 `fallbackTextFor` 对 \"budget-exhausted\" 事件的格式化保持一致。 */\n/** 一次留存授予的永久通知(--keep-sandbox);没有活跃 coordinator 时退回一行 stderr。 */\nexport function reportKept(input: KeptInput): void {\n const sink = current();\n if (sink) {\n sink.kept(input);\n return;\n }\n writeStderrLine(`kept sandbox ${input.sandboxId} (${input.provider}) — ${input.identity.evalId} #${input.identity.attempt} ${input.verdict}\\n`);\n}\n/** 实验级钩子的起止(见 `ExperimentHookInput`)。没有活跃 coordinator 时退回一行 stderr ——\n * 长 setup 的可见性正是这条通道存在的理由,不能像 lifecycle 那样静默丢弃。 */\nexport function reportExperimentHook(input: ExperimentHookInput): void {\n const sink = current();\n if (sink) {\n sink.experimentHook(input);\n return;\n }\n const duration = input.durationMs !== undefined ? ` (${Math.round(input.durationMs / 1000)}s)` : \"\";\n writeStderrLine(`experiment ${input.hook} ${input.status} · ${input.experimentId}${duration}\\n`);\n}\n/** 实验级 `ctx.progress` 的短命投影。与 `reportAttemptLifecycle` 同理:只服务正在画着的\n * dashboard,没有活跃 coordinator 时静默 no-op。 */\nexport function reportExperimentProgress(input: ExperimentProgressInput): void {\n current()?.experimentProgress(input);\n}\n/** judge 预检的起止(见 `PrecheckInput`)。没有活跃 coordinator 时退回一行 stderr ——\n * 慢预检的可见性正是这条通道存在的理由,不能像 lifecycle 那样静默丢弃。 */\nexport function reportPrecheck(input: PrecheckInput): void {\n const sink = current();\n if (sink) {\n sink.precheck(input);\n return;\n }\n const duration = input.durationMs !== undefined ? ` (${Math.round(input.durationMs / 1000)}s)` : \"\";\n const word = input.status === \"done\" ? `judge config ok` : `judge precheck failed`;\n writeStderrLine(input.status === \"started\" ? `${`prechecking judge config`}\\n` : `${word}${duration}\\n`);\n}\n/** 用例锁等待的起止(见 `LockWaitInput`)。没有活跃 coordinator 时退回一行 stderr ——\n * 长等待期间的可见性正是这条通道存在的理由,不能像 lifecycle 那样静默丢弃。 */\nexport function reportLockWait(input: LockWaitInput): void {\n const sink = current();\n if (sink) {\n sink.lockWait(input);\n return;\n }\n writeStderrLine(input.status === \"started\"\n ? `waiting on another run · ${input.experimentId} ${input.evalId}\\n`\n : `lock wait resolved · ${input.experimentId} ${input.evalId}\\n`);\n}\nexport function reportRunActivity(input: RunActivityInput): void {\n const sink = current();\n if (sink) {\n sink.runActivity(input);\n return;\n }\n const duration = input.durationMs !== undefined ? ` (${input.durationMs}ms)` : \"\";\n const statusWord = input.status === \"started\" || input.status === \"progress\" ? \"\" : ` ${input.status}`;\n writeStderrLine(`${input.label}${statusWord}${duration}\\n`);\n}\nexport function reportBudgetExhausted(input: BudgetExhaustedInput): void {\n const sink = current();\n if (sink) {\n sink.budgetExhausted(input);\n return;\n }\n writeStderrLine(`budget exhausted for ${input.experimentId} (spent ${input.spent}, unstarted ${input.unstarted})\\n`);\n}\n/** 用户中断(Ctrl+C)。没有活跃 coordinator 时的兜底文案与迁移前的 `runner.interrupted` 完全\n * 相同 —— 调用方(run.ts)不再需要自己持有这段 i18n 文案。 */\nexport function reportInterrupted(): void {\n const sink = current();\n if (sink) {\n sink.interrupted();\n return;\n }\n writeStderrLine(` · interrupted: printing partial results completed so far.\n`);\n}\n/**\n * runner 自己驱动的 attempt 生命周期投影(见 docs/feature/experiments/cli.md「Attempt 阶段」)——\n * `src/runner/attempt.ts`(phase/progress)与 `src/runner/run.ts`(start/complete/early-exit)是\n * 目前仅有的两个调用方。没有活跃 coordinator 时(今天:CLI 还没接入 --output)静默 no-op ——\n * 与其它 reportXxx() 不同,这里不退回 `writeStderrLine` 兜底:这类事件只服务尚不存在的\n * dashboard,不是需要留痕的诊断,现有可观察行为(直到 CLI 接入真正的 coordinator 之前)因此\n * 完全不变。\n */\nexport function reportAttemptLifecycle(event: AttemptLifecycleEvent): void {\n current()?.lifecycle(event);\n}\n/** 一个 reporter 的某次回调抛错(见 `runner/report.ts` 的 `runReporter`)。`reporter`/`required`\n * 来自调用方注册这个 reporter 时的 `ReporterRegistration`(见其字段注释)——显式 `--junit`\n * 传 `required: true`,用户 `config.reporters`\n * 传 `required: false`。coordinator 把它折进 `RunFeedbackState.diagnostics`(reducer 按\n * `reporter-error:<reporter>` 去重),调用方(`cli.ts` 的 `assembleInvocationCompletion`)据此把\n * `required` 为真的失败折进 `InvocationCompletion.reporterErrors`,让 completion/CI 退出码判红。 */\nexport function reportReporterError(input: {\n reporter: string;\n required: boolean;\n message: string;\n}): void {\n const sink = current();\n if (sink) {\n sink.reporterError(input);\n return;\n }\n writeStderrLine(` · [diagnostic] ${input.reporter} failed (ignored): ${input.message}\n`);\n}\n"]}
|
|
@@ -183,7 +183,7 @@ export declare function reportInterrupted(): void;
|
|
|
183
183
|
export declare function reportAttemptLifecycle(event: AttemptLifecycleEvent): void;
|
|
184
184
|
/** 一个 reporter 的某次回调抛错(见 `runner/report.ts` 的 `runReporter`)。`reporter`/`required`
|
|
185
185
|
* 来自调用方注册这个 reporter 时的 `ReporterRegistration`(见其字段注释)——显式 `--junit`
|
|
186
|
-
* 传 `required: true`,用户 `config.reporters
|
|
186
|
+
* 传 `required: true`,用户 `config.reporters`
|
|
187
187
|
* 传 `required: false`。coordinator 把它折进 `RunFeedbackState.diagnostics`(reducer 按
|
|
188
188
|
* `reporter-error:<reporter>` 去重),调用方(`cli.ts` 的 `assembleInvocationCompletion`)据此把
|
|
189
189
|
* `required` 为真的失败折进 `InvocationCompletion.reporterErrors`,让 completion/CI 退出码判红。 */
|
|
@@ -183,7 +183,7 @@ export declare function reportInterrupted(): void;
|
|
|
183
183
|
export declare function reportAttemptLifecycle(event: AttemptLifecycleEvent): void;
|
|
184
184
|
/** 一个 reporter 的某次回调抛错(见 `runner/report.ts` 的 `runReporter`)。`reporter`/`required`
|
|
185
185
|
* 来自调用方注册这个 reporter 时的 `ReporterRegistration`(见其字段注释)——显式 `--junit`
|
|
186
|
-
* 传 `required: true`,用户 `config.reporters
|
|
186
|
+
* 传 `required: true`,用户 `config.reporters`
|
|
187
187
|
* 传 `required: false`。coordinator 把它折进 `RunFeedbackState.diagnostics`(reducer 按
|
|
188
188
|
* `reporter-error:<reporter>` 去重),调用方(`cli.ts` 的 `assembleInvocationCompletion`)据此把
|
|
189
189
|
* `required` 为真的失败折进 `InvocationCompletion.reporterErrors`,让 completion/CI 退出码判红。 */
|
|
@@ -183,7 +183,7 @@ export declare function reportInterrupted(): void;
|
|
|
183
183
|
export declare function reportAttemptLifecycle(event: AttemptLifecycleEvent): void;
|
|
184
184
|
/** 一个 reporter 的某次回调抛错(见 `runner/report.ts` 的 `runReporter`)。`reporter`/`required`
|
|
185
185
|
* 来自调用方注册这个 reporter 时的 `ReporterRegistration`(见其字段注释)——显式 `--junit`
|
|
186
|
-
* 传 `required: true`,用户 `config.reporters
|
|
186
|
+
* 传 `required: true`,用户 `config.reporters`
|
|
187
187
|
* 传 `required: false`。coordinator 把它折进 `RunFeedbackState.diagnostics`(reducer 按
|
|
188
188
|
* `reporter-error:<reporter>` 去重),调用方(`cli.ts` 的 `assembleInvocationCompletion`)据此把
|
|
189
189
|
* `required` 为真的失败折进 `InvocationCompletion.reporterErrors`,让 completion/CI 退出码判红。 */
|
|
@@ -298,7 +298,7 @@ function planPreparedProjectTarget(preparedPairs, options) {
|
|
|
298
298
|
const targetEvals = new Map();
|
|
299
299
|
yield* effect_1.Effect.forEach(preparedPairs, (pair) => effect_1.Effect.gen(function* () {
|
|
300
300
|
const resolvedJudge = yield* effect_1.Effect.try({
|
|
301
|
-
try: () => (0, judge_config_ts_1.resolveJudge)(pair.run.
|
|
301
|
+
try: () => (0, judge_config_ts_1.resolveJudge)(pair.run.judge, pair.evalDef.judge, options.configJudge),
|
|
302
302
|
catch: (cause) => fingerprintPlanningError("configuration", cause),
|
|
303
303
|
});
|
|
304
304
|
resolvedJudgesByKey.set(pair.key, resolvedJudge);
|