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
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AttemptNotesCollector } from "./notes.cjs";
|
|
1
2
|
import { type MaterialMatch } from "../assertions/context-match.cjs";
|
|
2
3
|
import { type EvalUsage } from "../o11y/eval-usage.cjs";
|
|
3
4
|
import type { ExperimentFlags } from "../shared/types.cjs";
|
|
@@ -15,11 +16,13 @@ export interface AssertFirstLateResult {
|
|
|
15
16
|
scripts: globalThis.Record<string, import("../types.cjs").ScriptResult>;
|
|
16
17
|
}
|
|
17
18
|
export interface AssertFirstContextState {
|
|
19
|
+
readonly notes: AttemptNotesCollector;
|
|
18
20
|
readonly assertions: AssertionsRuntime<"pass" | "score">;
|
|
19
21
|
readonly manager: SessionManager;
|
|
20
22
|
readonly late: AssertFirstLateResult;
|
|
21
23
|
}
|
|
22
24
|
export interface AssertFirstCoreContextState {
|
|
25
|
+
readonly notes: AttemptNotesCollector;
|
|
23
26
|
readonly assertions: AssertionsRuntime<"pass" | "score">;
|
|
24
27
|
skipReason?: string;
|
|
25
28
|
}
|
|
@@ -38,6 +41,8 @@ export interface AssertFirstCoreContextDeps {
|
|
|
38
41
|
readonly evaluationKind: RuntimeKind;
|
|
39
42
|
}
|
|
40
43
|
export type AssertFirstCoreTestContext<Kind extends RuntimeKind = RuntimeKind> = JudgePresetMethods<Kind> & {
|
|
44
|
+
/** Record display data without affecting Assertions, Verdict or score. */
|
|
45
|
+
note(label: string, value: import("../shared/types.cjs").JsonValue | import("../assertions/quantity.cjs").Quantity): void;
|
|
41
46
|
readonly usage: EvalUsage;
|
|
42
47
|
readonly elapsedMs: import("../assertions/match.cjs").NumericMaterial;
|
|
43
48
|
maxTokens(max: number): BooleanAssertionHandle<Kind, number>;
|
|
@@ -82,7 +87,6 @@ export interface AssertFirstContextDeps {
|
|
|
82
87
|
readonly timingNow?: import("./session.cjs").SessionDeps["timingNow"];
|
|
83
88
|
readonly onTurn?: import("./session.cjs").SessionDeps["onTurn"];
|
|
84
89
|
readonly concurrencySlot?: ConcurrencySlot;
|
|
85
|
-
readonly experimentClassifier?: import("./session.cjs").SessionDeps["experimentClassifier"];
|
|
86
90
|
/** Attempt-owned source snapshot registry; never inferred from an Effect fiber. */
|
|
87
91
|
readonly sourceRegistry?: SourceRegistry;
|
|
88
92
|
readonly resources: import("../types.cjs").AttemptResourceRegistry;
|
|
@@ -131,7 +135,7 @@ export interface AssertFirstTurnHandle<Kind extends RuntimeKind> extends AgentJu
|
|
|
131
135
|
readonly toolCalls: ManagedToolCalls<"turn">;
|
|
132
136
|
readonly eventOccurrences: ManagedEventOccurrences<"turn">;
|
|
133
137
|
readonly status: "completed" | "failed" | "waiting";
|
|
134
|
-
readonly
|
|
138
|
+
readonly reply: string;
|
|
135
139
|
readonly data?: JsonValue;
|
|
136
140
|
readonly usage: EvalUsage;
|
|
137
141
|
check: import("../assertions/api.cjs").AssertionCheck<Kind, AgentMatchContext<"turn">>;
|
|
@@ -187,6 +191,8 @@ export interface AssertFirstSessionHandle<Kind extends RuntimeKind> extends Agen
|
|
|
187
191
|
}
|
|
188
192
|
type JudgeFunction<Kind extends RuntimeKind> = <Value>(value: AssertionSubject<Value>, definition: ScoreMatch<NoInfer<Value>>) => MeasurementAssertionHandle<Kind>;
|
|
189
193
|
export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetMethods<Kind, AgentMatchContext<"attempt">> & {
|
|
194
|
+
/** 保存 JSON 值或 Quantity 供结果展示,不登记 Assertion,也不影响 Verdict、score 或 coverage。 */
|
|
195
|
+
note: AssertFirstCoreTestContext<Kind>["note"];
|
|
190
196
|
readonly evaluationKind: Kind;
|
|
191
197
|
send(input: string | {
|
|
192
198
|
readonly text: string;
|
|
@@ -214,7 +220,7 @@ export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetM
|
|
|
214
220
|
judge: JudgeFunction<Kind>;
|
|
215
221
|
readonly toolCalls: ManagedToolCalls<"attempt">;
|
|
216
222
|
readonly sandbox: AssertFirstSandbox<Kind>;
|
|
217
|
-
readonly
|
|
223
|
+
readonly observability: import("../o11y/types.cjs").ObservabilitySummary;
|
|
218
224
|
readonly usage: EvalUsage;
|
|
219
225
|
succeeded(): BooleanAssertionHandle<Kind, void>;
|
|
220
226
|
calledTool(match: ToolMatch | ToolOccurrenceMatch): BooleanAssertionHandle<Kind, void>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AttemptNotesCollector } from "./notes.mjs";
|
|
1
2
|
import { type MaterialMatch } from "../assertions/context-match.mjs";
|
|
2
3
|
import { type EvalUsage } from "../o11y/eval-usage.mjs";
|
|
3
4
|
import type { ExperimentFlags } from "../shared/types.mjs";
|
|
@@ -15,11 +16,13 @@ export interface AssertFirstLateResult {
|
|
|
15
16
|
scripts: globalThis.Record<string, import("../types.mjs").ScriptResult>;
|
|
16
17
|
}
|
|
17
18
|
export interface AssertFirstContextState {
|
|
19
|
+
readonly notes: AttemptNotesCollector;
|
|
18
20
|
readonly assertions: AssertionsRuntime<"pass" | "score">;
|
|
19
21
|
readonly manager: SessionManager;
|
|
20
22
|
readonly late: AssertFirstLateResult;
|
|
21
23
|
}
|
|
22
24
|
export interface AssertFirstCoreContextState {
|
|
25
|
+
readonly notes: AttemptNotesCollector;
|
|
23
26
|
readonly assertions: AssertionsRuntime<"pass" | "score">;
|
|
24
27
|
skipReason?: string;
|
|
25
28
|
}
|
|
@@ -38,6 +41,8 @@ export interface AssertFirstCoreContextDeps {
|
|
|
38
41
|
readonly evaluationKind: RuntimeKind;
|
|
39
42
|
}
|
|
40
43
|
export type AssertFirstCoreTestContext<Kind extends RuntimeKind = RuntimeKind> = JudgePresetMethods<Kind> & {
|
|
44
|
+
/** Record display data without affecting Assertions, Verdict or score. */
|
|
45
|
+
note(label: string, value: import("../shared/types.mjs").JsonValue | import("../assertions/quantity.mjs").Quantity): void;
|
|
41
46
|
readonly usage: EvalUsage;
|
|
42
47
|
readonly elapsedMs: import("../assertions/match.mjs").NumericMaterial;
|
|
43
48
|
maxTokens(max: number): BooleanAssertionHandle<Kind, number>;
|
|
@@ -82,7 +87,6 @@ export interface AssertFirstContextDeps {
|
|
|
82
87
|
readonly timingNow?: import("./session.mjs").SessionDeps["timingNow"];
|
|
83
88
|
readonly onTurn?: import("./session.mjs").SessionDeps["onTurn"];
|
|
84
89
|
readonly concurrencySlot?: ConcurrencySlot;
|
|
85
|
-
readonly experimentClassifier?: import("./session.mjs").SessionDeps["experimentClassifier"];
|
|
86
90
|
/** Attempt-owned source snapshot registry; never inferred from an Effect fiber. */
|
|
87
91
|
readonly sourceRegistry?: SourceRegistry;
|
|
88
92
|
readonly resources: import("../types.mjs").AttemptResourceRegistry;
|
|
@@ -131,7 +135,7 @@ export interface AssertFirstTurnHandle<Kind extends RuntimeKind> extends AgentJu
|
|
|
131
135
|
readonly toolCalls: ManagedToolCalls<"turn">;
|
|
132
136
|
readonly eventOccurrences: ManagedEventOccurrences<"turn">;
|
|
133
137
|
readonly status: "completed" | "failed" | "waiting";
|
|
134
|
-
readonly
|
|
138
|
+
readonly reply: string;
|
|
135
139
|
readonly data?: JsonValue;
|
|
136
140
|
readonly usage: EvalUsage;
|
|
137
141
|
check: import("../assertions/api.mjs").AssertionCheck<Kind, AgentMatchContext<"turn">>;
|
|
@@ -187,6 +191,8 @@ export interface AssertFirstSessionHandle<Kind extends RuntimeKind> extends Agen
|
|
|
187
191
|
}
|
|
188
192
|
type JudgeFunction<Kind extends RuntimeKind> = <Value>(value: AssertionSubject<Value>, definition: ScoreMatch<NoInfer<Value>>) => MeasurementAssertionHandle<Kind>;
|
|
189
193
|
export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetMethods<Kind, AgentMatchContext<"attempt">> & {
|
|
194
|
+
/** 保存 JSON 值或 Quantity 供结果展示,不登记 Assertion,也不影响 Verdict、score 或 coverage。 */
|
|
195
|
+
note: AssertFirstCoreTestContext<Kind>["note"];
|
|
190
196
|
readonly evaluationKind: Kind;
|
|
191
197
|
send(input: string | {
|
|
192
198
|
readonly text: string;
|
|
@@ -214,7 +220,7 @@ export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetM
|
|
|
214
220
|
judge: JudgeFunction<Kind>;
|
|
215
221
|
readonly toolCalls: ManagedToolCalls<"attempt">;
|
|
216
222
|
readonly sandbox: AssertFirstSandbox<Kind>;
|
|
217
|
-
readonly
|
|
223
|
+
readonly observability: import("../o11y/types.mjs").ObservabilitySummary;
|
|
218
224
|
readonly usage: EvalUsage;
|
|
219
225
|
succeeded(): BooleanAssertionHandle<Kind, void>;
|
|
220
226
|
calledTool(match: ToolMatch | ToolOccurrenceMatch): BooleanAssertionHandle<Kind, void>;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { AttemptNotesCollector } from "./notes.js";
|
|
1
2
|
import { type MaterialMatch } from "../assertions/context-match.js";
|
|
2
3
|
import { type EvalUsage } from "../o11y/eval-usage.js";
|
|
3
4
|
import type { ExperimentFlags } from "../shared/types.js";
|
|
@@ -15,11 +16,13 @@ export interface AssertFirstLateResult {
|
|
|
15
16
|
scripts: globalThis.Record<string, import("../types.js").ScriptResult>;
|
|
16
17
|
}
|
|
17
18
|
export interface AssertFirstContextState {
|
|
19
|
+
readonly notes: AttemptNotesCollector;
|
|
18
20
|
readonly assertions: AssertionsRuntime<"pass" | "score">;
|
|
19
21
|
readonly manager: SessionManager;
|
|
20
22
|
readonly late: AssertFirstLateResult;
|
|
21
23
|
}
|
|
22
24
|
export interface AssertFirstCoreContextState {
|
|
25
|
+
readonly notes: AttemptNotesCollector;
|
|
23
26
|
readonly assertions: AssertionsRuntime<"pass" | "score">;
|
|
24
27
|
skipReason?: string;
|
|
25
28
|
}
|
|
@@ -38,6 +41,8 @@ export interface AssertFirstCoreContextDeps {
|
|
|
38
41
|
readonly evaluationKind: RuntimeKind;
|
|
39
42
|
}
|
|
40
43
|
export type AssertFirstCoreTestContext<Kind extends RuntimeKind = RuntimeKind> = JudgePresetMethods<Kind> & {
|
|
44
|
+
/** Record display data without affecting Assertions, Verdict or score. */
|
|
45
|
+
note(label: string, value: import("../shared/types.js").JsonValue | import("../assertions/quantity.js").Quantity): void;
|
|
41
46
|
readonly usage: EvalUsage;
|
|
42
47
|
readonly elapsedMs: import("../assertions/match.js").NumericMaterial;
|
|
43
48
|
maxTokens(max: number): BooleanAssertionHandle<Kind, number>;
|
|
@@ -82,7 +87,6 @@ export interface AssertFirstContextDeps {
|
|
|
82
87
|
readonly timingNow?: import("./session.js").SessionDeps["timingNow"];
|
|
83
88
|
readonly onTurn?: import("./session.js").SessionDeps["onTurn"];
|
|
84
89
|
readonly concurrencySlot?: ConcurrencySlot;
|
|
85
|
-
readonly experimentClassifier?: import("./session.js").SessionDeps["experimentClassifier"];
|
|
86
90
|
/** Attempt-owned source snapshot registry; never inferred from an Effect fiber. */
|
|
87
91
|
readonly sourceRegistry?: SourceRegistry;
|
|
88
92
|
readonly resources: import("../types.js").AttemptResourceRegistry;
|
|
@@ -131,7 +135,7 @@ export interface AssertFirstTurnHandle<Kind extends RuntimeKind> extends AgentJu
|
|
|
131
135
|
readonly toolCalls: ManagedToolCalls<"turn">;
|
|
132
136
|
readonly eventOccurrences: ManagedEventOccurrences<"turn">;
|
|
133
137
|
readonly status: "completed" | "failed" | "waiting";
|
|
134
|
-
readonly
|
|
138
|
+
readonly reply: string;
|
|
135
139
|
readonly data?: JsonValue;
|
|
136
140
|
readonly usage: EvalUsage;
|
|
137
141
|
check: import("../assertions/api.js").AssertionCheck<Kind, AgentMatchContext<"turn">>;
|
|
@@ -187,6 +191,8 @@ export interface AssertFirstSessionHandle<Kind extends RuntimeKind> extends Agen
|
|
|
187
191
|
}
|
|
188
192
|
type JudgeFunction<Kind extends RuntimeKind> = <Value>(value: AssertionSubject<Value>, definition: ScoreMatch<NoInfer<Value>>) => MeasurementAssertionHandle<Kind>;
|
|
189
193
|
export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetMethods<Kind, AgentMatchContext<"attempt">> & {
|
|
194
|
+
/** 保存 JSON 值或 Quantity 供结果展示,不登记 Assertion,也不影响 Verdict、score 或 coverage。 */
|
|
195
|
+
note: AssertFirstCoreTestContext<Kind>["note"];
|
|
190
196
|
readonly evaluationKind: Kind;
|
|
191
197
|
send(input: string | {
|
|
192
198
|
readonly text: string;
|
|
@@ -214,7 +220,7 @@ export type AssertFirstTestContext<Kind extends RuntimeKind> = AgentJudgePresetM
|
|
|
214
220
|
judge: JudgeFunction<Kind>;
|
|
215
221
|
readonly toolCalls: ManagedToolCalls<"attempt">;
|
|
216
222
|
readonly sandbox: AssertFirstSandbox<Kind>;
|
|
217
|
-
readonly
|
|
223
|
+
readonly observability: import("../o11y/types.js").ObservabilitySummary;
|
|
218
224
|
readonly usage: EvalUsage;
|
|
219
225
|
succeeded(): BooleanAssertionHandle<Kind, void>;
|
|
220
226
|
calledTool(match: ToolMatch | ToolOccurrenceMatch): BooleanAssertionHandle<Kind, void>;
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.AttemptNotesCollector = void 0;
|
|
4
|
+
const quantity_ts_1 = require("../assertions/quantity.cjs");
|
|
5
|
+
const json_value_ts_1 = require("../shared/json-value.cjs");
|
|
6
|
+
const schema_ts_1 = require("../record/family/attempt-note/schema.cjs");
|
|
7
|
+
/** Attempt-owned display data; this collector never registers an Assertion. */
|
|
8
|
+
class AttemptNotesCollector {
|
|
9
|
+
entries = [];
|
|
10
|
+
labels = new Set();
|
|
11
|
+
add(label, value) {
|
|
12
|
+
if (typeof label !== "string")
|
|
13
|
+
throw new TypeError("note() label must be a string.");
|
|
14
|
+
if (this.labels.has(label))
|
|
15
|
+
throw new TypeError(`note() label ${JSON.stringify(label)} is already recorded in this Attempt.`);
|
|
16
|
+
if (this.entries.length >= schema_ts_1.AttemptNoteLimits.maximumEntries)
|
|
17
|
+
throw new TypeError("note() accepts at most 64 entries per Attempt.");
|
|
18
|
+
const entry = (0, quantity_ts_1.isQuantity)(value)
|
|
19
|
+
? { label, sequence: this.entries.length, value: value.value, unit: value.unit }
|
|
20
|
+
: { label, sequence: this.entries.length, value };
|
|
21
|
+
if (!(0, json_value_ts_1.isJsonValue)(entry))
|
|
22
|
+
throw new TypeError("note() value must be JSON or a Quantity.");
|
|
23
|
+
let serialized;
|
|
24
|
+
try {
|
|
25
|
+
serialized = JSON.stringify(entry);
|
|
26
|
+
}
|
|
27
|
+
catch {
|
|
28
|
+
throw new TypeError("note() value must be serializable JSON.");
|
|
29
|
+
}
|
|
30
|
+
if (new TextEncoder().encode(serialized).byteLength > schema_ts_1.AttemptNoteLimits.maximumJsonBytes)
|
|
31
|
+
throw new TypeError("note() entry exceeds 64 KiB of JSON.");
|
|
32
|
+
const snapshot = JSON.parse(serialized);
|
|
33
|
+
this.entries.push(deepFreeze(snapshot));
|
|
34
|
+
this.labels.add(label);
|
|
35
|
+
}
|
|
36
|
+
snapshot() { return Object.freeze([...this.entries]); }
|
|
37
|
+
}
|
|
38
|
+
exports.AttemptNotesCollector = AttemptNotesCollector;
|
|
39
|
+
function deepFreeze(value) {
|
|
40
|
+
if (value !== null && typeof value === "object") {
|
|
41
|
+
for (const child of Object.values(value))
|
|
42
|
+
deepFreeze(child);
|
|
43
|
+
Object.freeze(value);
|
|
44
|
+
}
|
|
45
|
+
return value;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=notes.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.js","sourceRoot":"","sources":["notes.ts"],"names":[],"mappings":";;;AAAA,2DAAsE;AACtE,2DAAsD;AAEtD,uEAA8F;AAC9F,+EAA+E;AAC/E,MAAa,qBAAqB;IACb,OAAO,GAAkB,EAAE,CAAC;IAC5B,MAAM,GAAG,IAAI,GAAG,EAAU,CAAC;IAC5C,GAAG,CAAC,KAAa,EAAE,KAA2B;QAC1C,IAAI,OAAO,KAAK,KAAK,QAAQ;YACzB,MAAM,IAAI,SAAS,CAAC,gCAAgC,CAAC,CAAC;QAC1D,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC;YACtB,MAAM,IAAI,SAAS,CAAC,gBAAgB,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,uCAAuC,CAAC,CAAC;QACtG,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,6BAAiB,CAAC,cAAc;YACvD,MAAM,IAAI,SAAS,CAAC,gDAAgD,CAAC,CAAC;QAC1E,MAAM,KAAK,GAAG,IAAA,wBAAU,EAAC,KAAK,CAAC;YAC3B,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE;YAChF,CAAC,CAAC,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,KAAK,EAAE,CAAC;QACtD,IAAI,CAAC,IAAA,2BAAW,EAAC,KAAK,CAAC;YACnB,MAAM,IAAI,SAAS,CAAC,0CAA0C,CAAC,CAAC;QACpE,IAAI,UAAkB,CAAC;QACvB,IAAI,CAAC;YACD,UAAU,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,CAAC;YACH,MAAM,IAAI,SAAS,CAAC,yCAAyC,CAAC,CAAC;QACnE,CAAC;QACD,IAAI,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,UAAU,GAAG,6BAAiB,CAAC,gBAAgB;YACpF,MAAM,IAAI,SAAS,CAAC,sCAAsC,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAgB,CAAC;QACvD,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QACxC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IACD,QAAQ,KAA6B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC;CAClF;AA7BD,sDA6BC;AACD,SAAS,UAAU,CAAI,KAAQ;IAC3B,IAAI,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9C,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC;YACpC,UAAU,CAAC,KAAK,CAAC,CAAC;QACtB,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC","sourcesContent":["import { isQuantity, type Quantity } from \"../assertions/quantity.ts\";\nimport { isJsonValue } from \"../shared/json-value.ts\";\nimport type { JsonValue } from \"../shared/types.ts\";\nimport { AttemptNoteLimits, type AttemptNote } from \"../record/family/attempt-note/schema.ts\";\n/** Attempt-owned display data; this collector never registers an Assertion. */\nexport class AttemptNotesCollector {\n private readonly entries: AttemptNote[] = [];\n private readonly labels = new Set<string>();\n add(label: string, value: JsonValue | Quantity): void {\n if (typeof label !== \"string\")\n throw new TypeError(\"note() label must be a string.\");\n if (this.labels.has(label))\n throw new TypeError(`note() label ${JSON.stringify(label)} is already recorded in this Attempt.`);\n if (this.entries.length >= AttemptNoteLimits.maximumEntries)\n throw new TypeError(\"note() accepts at most 64 entries per Attempt.\");\n const entry = isQuantity(value)\n ? { label, sequence: this.entries.length, value: value.value, unit: value.unit }\n : { label, sequence: this.entries.length, value };\n if (!isJsonValue(entry))\n throw new TypeError(\"note() value must be JSON or a Quantity.\");\n let serialized: string;\n try {\n serialized = JSON.stringify(entry);\n }\n catch {\n throw new TypeError(\"note() value must be serializable JSON.\");\n }\n if (new TextEncoder().encode(serialized).byteLength > AttemptNoteLimits.maximumJsonBytes)\n throw new TypeError(\"note() entry exceeds 64 KiB of JSON.\");\n const snapshot = JSON.parse(serialized) as AttemptNote;\n this.entries.push(deepFreeze(snapshot));\n this.labels.add(label);\n }\n snapshot(): readonly AttemptNote[] { return Object.freeze([...this.entries]); }\n}\nfunction deepFreeze<T>(value: T): T {\n if (value !== null && typeof value === \"object\") {\n for (const child of Object.values(value))\n deepFreeze(child);\n Object.freeze(value);\n }\n return value;\n}\n"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Quantity } from "../assertions/quantity.cjs";
|
|
2
|
+
import type { JsonValue } from "../shared/types.cjs";
|
|
3
|
+
import { type AttemptNote } from "../record/family/attempt-note/schema.cjs";
|
|
4
|
+
/** Attempt-owned display data; this collector never registers an Assertion. */
|
|
5
|
+
export declare class AttemptNotesCollector {
|
|
6
|
+
private readonly entries;
|
|
7
|
+
private readonly labels;
|
|
8
|
+
add(label: string, value: JsonValue | Quantity): void;
|
|
9
|
+
snapshot(): readonly AttemptNote[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Quantity } from "../assertions/quantity.mjs";
|
|
2
|
+
import type { JsonValue } from "../shared/types.mjs";
|
|
3
|
+
import { type AttemptNote } from "../record/family/attempt-note/schema.mjs";
|
|
4
|
+
/** Attempt-owned display data; this collector never registers an Assertion. */
|
|
5
|
+
export declare class AttemptNotesCollector {
|
|
6
|
+
private readonly entries;
|
|
7
|
+
private readonly labels;
|
|
8
|
+
add(label: string, value: JsonValue | Quantity): void;
|
|
9
|
+
snapshot(): readonly AttemptNote[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { type Quantity } from "../assertions/quantity.js";
|
|
2
|
+
import type { JsonValue } from "../shared/types.js";
|
|
3
|
+
import { type AttemptNote } from "../record/family/attempt-note/schema.js";
|
|
4
|
+
/** Attempt-owned display data; this collector never registers an Assertion. */
|
|
5
|
+
export declare class AttemptNotesCollector {
|
|
6
|
+
private readonly entries;
|
|
7
|
+
private readonly labels;
|
|
8
|
+
add(label: string, value: JsonValue | Quantity): void;
|
|
9
|
+
snapshot(): readonly AttemptNote[];
|
|
10
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire as __niceevalCreateRequire } from "node:module";
|
|
2
|
+
const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
|
|
3
|
+
const __niceevalCanonical = __niceevalRequire("./notes.cjs");
|
|
4
|
+
const __niceevalExport0 = __niceevalCanonical["AttemptNotesCollector"];
|
|
5
|
+
export { __niceevalExport0 as AttemptNotesCollector };
|
|
6
|
+
//# sourceMappingURL=notes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"notes.js","sources":[],"names":[],"mappings":""}
|
|
@@ -81,16 +81,10 @@ function classifySendFailure(failure) {
|
|
|
81
81
|
}
|
|
82
82
|
return { retryable: false };
|
|
83
83
|
}
|
|
84
|
-
/**
|
|
84
|
+
/** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */
|
|
85
85
|
function resolveSendFailureClass(failure, classifiers = {}) {
|
|
86
86
|
const declared = (0, failure_class_ts_1.failureClassOf)(failure);
|
|
87
|
-
const info = {
|
|
88
|
-
phase: "agent.run",
|
|
89
|
-
text: sendFailureText(failure),
|
|
90
|
-
cause: (0, external_cause_ts_1.normalizeExternalCause)(failure),
|
|
91
|
-
};
|
|
92
87
|
const resolved = declared ??
|
|
93
|
-
(0, failure_class_ts_1.callClassifier)(classifiers.experiment, info) ??
|
|
94
88
|
(0, failure_class_ts_1.callClassifier)(classifiers.adapter, failure) ??
|
|
95
89
|
classifySendFailure(failure);
|
|
96
90
|
const hasStartedEvidence = failure.events !== undefined && sendAcceptanceFromEvents(failure.events) === "started";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-failures.js","sourceRoot":"","sources":["send-failures.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent send 执行失败的结构化 envelope 与分类链。Turn.status === \"failed\" 是已经取得\n// 可信协议终态的领域结果,不经过这里;只有 send() 无法返回可信 Turn 时才 reject\n// SendFailure(契约见 docs/feature/error-classification/architecture.md)。\nimport type { StreamEvent, Usage } from \"../types.ts\";\nimport { callClassifier, failureClassOf, type AttemptFailureClassifier, type FailureClass, } from \"../shared/failure-class.ts\";\nimport { externalCauseMessageChain, isExternalCause, normalizeExternalCause, type ExternalCause, } from \"../shared/external-cause.ts\";\nexport type SendAcceptance = \"rejected\" | \"started\" | \"unknown\";\n/** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */\nexport interface SendFailure {\n readonly type: \"agent-send-failed\";\n /** 只有协议能证明输入未被受理时才可写 rejected。 */\n readonly acceptance: SendAcceptance;\n readonly message: string;\n readonly cause?: ExternalCause;\n readonly events?: readonly StreamEvent[];\n readonly usage?: Usage;\n readonly process?: {\n readonly exitCode?: number;\n readonly signal?: string;\n readonly stdout?: string;\n readonly stderr?: string;\n };\n}\nexport type SendFailureClassifier = (failure: SendFailure) => FailureClass | undefined;\n/** 构造可跨 package 副本识别的纯数据 envelope;识别不依赖 instanceof。 */\nexport function makeSendFailure(input: Omit<SendFailure, \"type\">): SendFailure {\n if (input.acceptance !== \"rejected\" && input.acceptance !== \"started\" && input.acceptance !== \"unknown\") {\n throw new TypeError(`invalid SendFailure acceptance: ${String(input.acceptance)}`);\n }\n if (typeof input.message !== \"string\" || input.message.trim() === \"\") {\n throw new TypeError(\"SendFailure message must be a non-empty string\");\n }\n return { type: \"agent-send-failed\", ...input };\n}\n/** 结构守卫;自定义 adapter 即使来自第二份 niceeval,也能被 core 识别。 */\nexport function isSendFailure(value: unknown): value is SendFailure {\n if (typeof value !== \"object\" || value === null)\n return false;\n const v = value as Partial<SendFailure>;\n return (v.type === \"agent-send-failed\" &&\n (v.acceptance === \"rejected\" || v.acceptance === \"started\" || v.acceptance === \"unknown\") &&\n typeof v.message === \"string\" &&\n v.message.trim() !== \"\");\n}\nconst MAX_FAILURE_TEXT = 4096;\n// C0/C1 控制字符不进入终端/JSON 摘要;保留换行和 tab 便于 diagnoseFailure 的多行证据阅读。\nconst CONTROL_CHARACTERS = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/g;\nconst ANSI_ESCAPE = /\\u001b(?:\\[[0-?]*[ -/]*[@-~]|\\][^\\u0007]*(?:\\u0007|\\u001b\\\\))/g;\n/** 与最终 AttemptError 和分类器同源的有界、安全失败摘要。 */\nexport function sendFailureText(failure: SendFailure): string {\n const clean = failure.message.replace(ANSI_ESCAPE, \"\").replace(CONTROL_CHARACTERS, \"\").trim();\n if (clean.length <= MAX_FAILURE_TEXT)\n return clean;\n return `${clean.slice(0, MAX_FAILURE_TEXT - 1)}…`;\n}\n/**\n * 未遵守契约而直接抛出的任意值不会漏成 unexpected-error:运行时在唯一 send choke point\n * 把它保守归一为 acceptance=unknown,并保留 cause 供诊断和 fatal 分类穿透。\n */\nexport function normalizeSendFailure(error: unknown): SendFailure {\n if (isSendFailure(error)) {\n const rawCause = (error as {\n cause?: unknown;\n }).cause;\n if (rawCause === undefined || isExternalCause(rawCause))\n return error;\n return makeSendFailure({\n ...error,\n cause: normalizeExternalCause(rawCause),\n });\n }\n const cause = normalizeExternalCause(error);\n return makeSendFailure({\n acceptance: \"unknown\",\n message: externalCauseMessageChain(cause),\n cause,\n });\n}\nconst RATE_LIMIT_CODES = new Set([\"429\", \"RATE_LIMIT\", \"RATE_LIMITED\", \"TOO_MANY_REQUESTS\"]);\nconst NETWORK_CODES = /^(ECONNREFUSED|ENOTFOUND|EAI_AGAIN|ENETUNREACH|EHOSTUNREACH|CERT_|ERR_TLS)/i;\n/**\n * 保守回退只读结构化 code/status;自然语言、空 events 与非零退出码都不能证明未受理。\n * scope 永远留在默认 attempt 档。\n */\nexport function classifySendFailure(failure: SendFailure): FailureClass {\n for (const candidate of structuredFacts(failure.cause)) {\n const status = candidate.status._tag === \"Present\" ? candidate.status.value : undefined;\n const code = candidate.code._tag === \"Present\" ? String(candidate.code.value) : undefined;\n const normalizedCode = code?.toUpperCase().replace(/[ -]+/g, \"_\");\n if (status === 429 || (normalizedCode !== undefined && RATE_LIMIT_CODES.has(normalizedCode))) {\n return { retryable: true, reason: \"rate_limit\" };\n }\n if (normalizedCode !== undefined && NETWORK_CODES.test(normalizedCode)) {\n return { retryable: true, reason: \"network\" };\n }\n }\n return { retryable: false };\n}\nexport interface SendFailureClassifiers {\n experiment?: AttemptFailureClassifier;\n adapter?: SendFailureClassifier;\n}\n/** 完整五道链:声明 → 实验 → adapter → 保守回退 → acceptance 门。 */\nexport function resolveSendFailureClass(failure: SendFailure, classifiers: SendFailureClassifiers = {}): FailureClass {\n const declared = failureClassOf(failure);\n const info = {\n phase: \"agent.run\" as const,\n text: sendFailureText(failure),\n cause: normalizeExternalCause(failure),\n };\n const resolved = declared ??\n callClassifier(classifiers.experiment, info) ??\n callClassifier(classifiers.adapter, failure) ??\n classifySendFailure(failure);\n const hasStartedEvidence = failure.events !== undefined && sendAcceptanceFromEvents(failure.events) === \"started\";\n if (resolved.retryable && (failure.acceptance !== \"rejected\" || hasStartedEvidence)) {\n return { ...resolved, retryable: false };\n }\n return resolved;\n}\n/** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */\nexport function sendAcceptanceFromEvents(events: readonly StreamEvent[]): \"started\" | \"unknown\" {\n return events.some((event) => (event.type === \"message\" && event.role === \"assistant\") ||\n event.type === \"thinking\" ||\n event.type === \"operation.started\" ||\n event.type === \"operation.finished\")\n ? \"started\"\n : \"unknown\";\n}\nfunction* structuredFacts(cause: ExternalCause | undefined): Generator<Extract<ExternalCause, {\n _tag: \"Error\" | \"Object\";\n}>> {\n let current = cause;\n while (current) {\n if (current._tag !== \"ThrownValue\")\n yield current;\n current = current.cause._tag === \"Cause\" ? current.cause.value : undefined;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"send-failures.js","sourceRoot":"","sources":["send-failures.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent send 执行失败的结构化 envelope 与分类链。Turn.status === \"failed\" 是已经取得\n// 可信协议终态的领域结果,不经过这里;只有 send() 无法返回可信 Turn 时才 reject\n// SendFailure(契约见 docs/feature/error-classification/architecture.md)。\nimport type { StreamEvent, Usage } from \"../types.ts\";\nimport { callClassifier, failureClassOf, type FailureClass, } from \"../shared/failure-class.ts\";\nimport { externalCauseMessageChain, isExternalCause, normalizeExternalCause, type ExternalCause, } from \"../shared/external-cause.ts\";\nexport type SendAcceptance = \"rejected\" | \"started\" | \"unknown\";\n/** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */\nexport interface SendFailure {\n readonly type: \"agent-send-failed\";\n /** 只有协议能证明输入未被受理时才可写 rejected。 */\n readonly acceptance: SendAcceptance;\n readonly message: string;\n readonly cause?: ExternalCause;\n readonly events?: readonly StreamEvent[];\n readonly usage?: Usage;\n readonly process?: {\n readonly exitCode?: number;\n readonly signal?: string;\n readonly stdout?: string;\n readonly stderr?: string;\n };\n}\nexport type SendFailureClassifier = (failure: SendFailure) => FailureClass | undefined;\n/** 构造可跨 package 副本识别的纯数据 envelope;识别不依赖 instanceof。 */\nexport function makeSendFailure(input: Omit<SendFailure, \"type\">): SendFailure {\n if (input.acceptance !== \"rejected\" && input.acceptance !== \"started\" && input.acceptance !== \"unknown\") {\n throw new TypeError(`invalid SendFailure acceptance: ${String(input.acceptance)}`);\n }\n if (typeof input.message !== \"string\" || input.message.trim() === \"\") {\n throw new TypeError(\"SendFailure message must be a non-empty string\");\n }\n return { type: \"agent-send-failed\", ...input };\n}\n/** 结构守卫;自定义 adapter 即使来自第二份 niceeval,也能被 core 识别。 */\nexport function isSendFailure(value: unknown): value is SendFailure {\n if (typeof value !== \"object\" || value === null)\n return false;\n const v = value as Partial<SendFailure>;\n return (v.type === \"agent-send-failed\" &&\n (v.acceptance === \"rejected\" || v.acceptance === \"started\" || v.acceptance === \"unknown\") &&\n typeof v.message === \"string\" &&\n v.message.trim() !== \"\");\n}\nconst MAX_FAILURE_TEXT = 4096;\n// C0/C1 控制字符不进入终端/JSON 摘要;保留换行和 tab 便于 diagnoseFailure 的多行证据阅读。\nconst CONTROL_CHARACTERS = /[\\u0000-\\u0008\\u000b\\u000c\\u000e-\\u001f\\u007f-\\u009f]/g;\nconst ANSI_ESCAPE = /\\u001b(?:\\[[0-?]*[ -/]*[@-~]|\\][^\\u0007]*(?:\\u0007|\\u001b\\\\))/g;\n/** 与最终 AttemptError 和分类器同源的有界、安全失败摘要。 */\nexport function sendFailureText(failure: SendFailure): string {\n const clean = failure.message.replace(ANSI_ESCAPE, \"\").replace(CONTROL_CHARACTERS, \"\").trim();\n if (clean.length <= MAX_FAILURE_TEXT)\n return clean;\n return `${clean.slice(0, MAX_FAILURE_TEXT - 1)}…`;\n}\n/**\n * 未遵守契约而直接抛出的任意值不会漏成 unexpected-error:运行时在唯一 send choke point\n * 把它保守归一为 acceptance=unknown,并保留 cause 供诊断和 fatal 分类穿透。\n */\nexport function normalizeSendFailure(error: unknown): SendFailure {\n if (isSendFailure(error)) {\n const rawCause = (error as {\n cause?: unknown;\n }).cause;\n if (rawCause === undefined || isExternalCause(rawCause))\n return error;\n return makeSendFailure({\n ...error,\n cause: normalizeExternalCause(rawCause),\n });\n }\n const cause = normalizeExternalCause(error);\n return makeSendFailure({\n acceptance: \"unknown\",\n message: externalCauseMessageChain(cause),\n cause,\n });\n}\nconst RATE_LIMIT_CODES = new Set([\"429\", \"RATE_LIMIT\", \"RATE_LIMITED\", \"TOO_MANY_REQUESTS\"]);\nconst NETWORK_CODES = /^(ECONNREFUSED|ENOTFOUND|EAI_AGAIN|ENETUNREACH|EHOSTUNREACH|CERT_|ERR_TLS)/i;\n/**\n * 保守回退只读结构化 code/status;自然语言、空 events 与非零退出码都不能证明未受理。\n * scope 永远留在默认 attempt 档。\n */\nexport function classifySendFailure(failure: SendFailure): FailureClass {\n for (const candidate of structuredFacts(failure.cause)) {\n const status = candidate.status._tag === \"Present\" ? candidate.status.value : undefined;\n const code = candidate.code._tag === \"Present\" ? String(candidate.code.value) : undefined;\n const normalizedCode = code?.toUpperCase().replace(/[ -]+/g, \"_\");\n if (status === 429 || (normalizedCode !== undefined && RATE_LIMIT_CODES.has(normalizedCode))) {\n return { retryable: true, reason: \"rate_limit\" };\n }\n if (normalizedCode !== undefined && NETWORK_CODES.test(normalizedCode)) {\n return { retryable: true, reason: \"network\" };\n }\n }\n return { retryable: false };\n}\nexport interface SendFailureClassifiers {\n adapter?: SendFailureClassifier;\n}\n/** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */\nexport function resolveSendFailureClass(failure: SendFailure, classifiers: SendFailureClassifiers = {}): FailureClass {\n const declared = failureClassOf(failure);\n const resolved = declared ??\n callClassifier(classifiers.adapter, failure) ??\n classifySendFailure(failure);\n const hasStartedEvidence = failure.events !== undefined && sendAcceptanceFromEvents(failure.events) === \"started\";\n if (resolved.retryable && (failure.acceptance !== \"rejected\" || hasStartedEvidence)) {\n return { ...resolved, retryable: false };\n }\n return resolved;\n}\n/** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */\nexport function sendAcceptanceFromEvents(events: readonly StreamEvent[]): \"started\" | \"unknown\" {\n return events.some((event) => (event.type === \"message\" && event.role === \"assistant\") ||\n event.type === \"thinking\" ||\n event.type === \"operation.started\" ||\n event.type === \"operation.finished\")\n ? \"started\"\n : \"unknown\";\n}\nfunction* structuredFacts(cause: ExternalCause | undefined): Generator<Extract<ExternalCause, {\n _tag: \"Error\" | \"Object\";\n}>> {\n let current = cause;\n while (current) {\n if (current._tag !== \"ThrownValue\")\n yield current;\n current = current.cause._tag === \"Cause\" ? current.cause.value : undefined;\n }\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { StreamEvent, Usage } from "../types.cjs";
|
|
2
|
-
import { type
|
|
2
|
+
import { type FailureClass } from "../shared/failure-class.cjs";
|
|
3
3
|
import { type ExternalCause } from "../shared/external-cause.cjs";
|
|
4
4
|
export type SendAcceptance = "rejected" | "started" | "unknown";
|
|
5
5
|
/** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */
|
|
@@ -36,10 +36,9 @@ export declare function normalizeSendFailure(error: unknown): SendFailure;
|
|
|
36
36
|
*/
|
|
37
37
|
export declare function classifySendFailure(failure: SendFailure): FailureClass;
|
|
38
38
|
export interface SendFailureClassifiers {
|
|
39
|
-
experiment?: AttemptFailureClassifier;
|
|
40
39
|
adapter?: SendFailureClassifier;
|
|
41
40
|
}
|
|
42
|
-
/**
|
|
41
|
+
/** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */
|
|
43
42
|
export declare function resolveSendFailureClass(failure: SendFailure, classifiers?: SendFailureClassifiers): FailureClass;
|
|
44
43
|
/** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */
|
|
45
44
|
export declare function sendAcceptanceFromEvents(events: readonly StreamEvent[]): "started" | "unknown";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { StreamEvent, Usage } from "../types.mjs";
|
|
2
|
-
import { type
|
|
2
|
+
import { type FailureClass } from "../shared/failure-class.mjs";
|
|
3
3
|
import { type ExternalCause } from "../shared/external-cause.mjs";
|
|
4
4
|
export type SendAcceptance = "rejected" | "started" | "unknown";
|
|
5
5
|
/** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */
|
|
@@ -36,10 +36,9 @@ export declare function normalizeSendFailure(error: unknown): SendFailure;
|
|
|
36
36
|
*/
|
|
37
37
|
export declare function classifySendFailure(failure: SendFailure): FailureClass;
|
|
38
38
|
export interface SendFailureClassifiers {
|
|
39
|
-
experiment?: AttemptFailureClassifier;
|
|
40
39
|
adapter?: SendFailureClassifier;
|
|
41
40
|
}
|
|
42
|
-
/**
|
|
41
|
+
/** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */
|
|
43
42
|
export declare function resolveSendFailureClass(failure: SendFailure, classifiers?: SendFailureClassifiers): FailureClass;
|
|
44
43
|
/** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */
|
|
45
44
|
export declare function sendAcceptanceFromEvents(events: readonly StreamEvent[]): "started" | "unknown";
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { StreamEvent, Usage } from "../types.js";
|
|
2
|
-
import { type
|
|
2
|
+
import { type FailureClass } from "../shared/failure-class.js";
|
|
3
3
|
import { type ExternalCause } from "../shared/external-cause.js";
|
|
4
4
|
export type SendAcceptance = "rejected" | "started" | "unknown";
|
|
5
5
|
/** send() 无法返回可信 Turn 时 reject 的结构化 envelope。 */
|
|
@@ -36,10 +36,9 @@ export declare function normalizeSendFailure(error: unknown): SendFailure;
|
|
|
36
36
|
*/
|
|
37
37
|
export declare function classifySendFailure(failure: SendFailure): FailureClass;
|
|
38
38
|
export interface SendFailureClassifiers {
|
|
39
|
-
experiment?: AttemptFailureClassifier;
|
|
40
39
|
adapter?: SendFailureClassifier;
|
|
41
40
|
}
|
|
42
|
-
/**
|
|
41
|
+
/** 分类链:声明 → Adapter → 保守回退 → acceptance 门。 */
|
|
43
42
|
export declare function resolveSendFailureClass(failure: SendFailure, classifiers?: SendFailureClassifiers): FailureClass;
|
|
44
43
|
/** 内置 adapter 用:一旦已有 agent 产出,受理事实至少是 started。 */
|
|
45
44
|
export declare function sendAcceptanceFromEvents(events: readonly StreamEvent[]): "started" | "unknown";
|
|
@@ -52,7 +52,6 @@ function sendWithTurnRetry(callOnce, deps) {
|
|
|
52
52
|
const monotonicEndedAt = yield* effect_1.Clock.currentTimeNanos;
|
|
53
53
|
const durationMs = Math.max(0, Number(monotonicEndedAt - monotonicStartedAt) / 1000000);
|
|
54
54
|
const cls = (0, send_failures_ts_1.resolveSendFailureClass)(failure, {
|
|
55
|
-
experiment: deps.experimentClassifier,
|
|
56
55
|
adapter: deps.classifier,
|
|
57
56
|
});
|
|
58
57
|
if (!cls.retryable)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"send-retry.js","sourceRoot":"","sources":["send-retry.ts"],"names":[],"mappings":";;;AAYA,4DAEC;
|
|
1
|
+
{"version":3,"file":"send-retry.js","sourceRoot":"","sources":["send-retry.ts"],"names":[],"mappings":"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","sourcesContent":["// Agent send 的唯一重试执行体。正常返回的三种 Turn status 都原样交回;只有 reject 的\n// SendFailure 进入分类和重试(docs/feature/error-classification/architecture.md)。\nimport { Clock, Effect, Random } from \"effect\";\nimport { attachFailureClass, type FailureClass } from \"../shared/failure-class.ts\";\nimport { makeSendFailure, normalizeSendFailure, resolveSendFailureClass, sendFailureText, type SendFailure, type SendFailureClassifier, } from \"./send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nexport const SEND_MAX_ATTEMPTS = 4;\nexport const ATTEMPT_MAX_RETRIES = 8;\nconst BASE_DELAY_MS = 5000;\nexport interface AttemptRetryBudget {\n remaining: number;\n}\nexport function createAttemptRetryBudget(): AttemptRetryBudget {\n return { remaining: ATTEMPT_MAX_RETRIES };\n}\nexport interface ConcurrencySlot {\n readonly release: Effect.Effect<void>;\n readonly reacquire: Effect.Effect<void>;\n}\nexport interface RetriedSendFailure {\n /** 同一逻辑 send 内从 0 开始的物理尝试序号。 */\n sendAttempt: number;\n startedAt: string;\n durationMs: number;\n failure: SendFailure;\n classification: Extract<FailureClass, {\n retryable: true;\n }>;\n}\nexport interface SendRetryDeps {\n classifier?: SendFailureClassifier;\n /** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */\n onRetryAttempt?: (attempt: RetriedSendFailure) => void;\n budget: AttemptRetryBudget;\n slot?: ConcurrencySlot;\n reportRetry?: (message: string) => void;\n signal: AbortSignal;\n}\n/** Adapt the Attempt-owned AbortSignal into interruption, without turning it into a send failure. */\nfunction awaitAbort(signal: AbortSignal): Effect.Effect<void> {\n return Effect.callback<void>((resume) => {\n if (signal.aborted) {\n resume(Effect.void);\n return;\n }\n const onAbort = () => resume(Effect.void);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n return Effect.sync(() => signal.removeEventListener(\"abort\", onAbort));\n });\n}\nfunction retrySleep(signal: AbortSignal, delayMs: number): Effect.Effect<void> {\n return Effect.raceFirst(Effect.sleep(delayMs).pipe(Effect.as(\"delay\" as const)), awaitAbort(signal).pipe(Effect.as(\"aborted\" as const))).pipe(Effect.flatMap((winner) => winner === \"aborted\" ? Effect.interrupt : Effect.void));\n}\n/**\n * A retried Attempt gives its global slot back while waiting. acquireUseRelease\n * registers reacquire before entering the interruptible sleep, so interruption\n * cannot permanently shrink available capacity.\n */\nfunction sleepWithReleasedSlot(slot: ConcurrencySlot | undefined, sleep: Effect.Effect<void, unknown>): Effect.Effect<void, unknown> {\n if (slot === undefined)\n return sleep;\n return Effect.acquireUseRelease(Effect.suspend(() => slot.release), () => sleep, () => Effect.suspend(() => slot.reacquire));\n}\n/**\n * 对同一个物理输入至多调用四次。adapter 未使用 makeSendFailure 而直接抛出的值在这里\n * 保守归一为 acceptance=unknown,因此会得到稳定 agent-send-failed,而不会被误重发。\n */\nexport function sendWithTurnRetry<T>(callOnce: Effect.Effect<T, unknown>, deps: SendRetryDeps): Effect.Effect<T, unknown> {\n const retry = (sendAttempt: number): Effect.Effect<T, unknown> => Effect.gen(function* () {\n const startedAtMs = yield* Clock.currentTimeMillis;\n const monotonicStartedAt = yield* Clock.currentTimeNanos;\n return yield* callOnce.pipe(Effect.mapError(normalizeSendFailure), Effect.catch((failure) => Effect.gen(function* () {\n const monotonicEndedAt = yield* Clock.currentTimeNanos;\n const durationMs = Math.max(0, Number(monotonicEndedAt - monotonicStartedAt) / 1000000);\n const cls = resolveSendFailureClass(failure, {\n adapter: deps.classifier,\n });\n if (!cls.retryable)\n return yield* Effect.fail(attachFailureClass(failure, cls));\n if (sendAttempt + 1 >= SEND_MAX_ATTEMPTS) {\n return yield* Effect.fail(finalizeExhausted(failure, cls, \"send\"));\n }\n if (deps.budget.remaining <= 0) {\n return yield* Effect.fail(finalizeExhausted(failure, cls, \"attempt\"));\n }\n const jitter = yield* Random.next;\n const delayMs = BASE_DELAY_MS * 2 ** sendAttempt * jitter;\n yield* Effect.sync(() => {\n deps.onRetryAttempt?.({\n sendAttempt,\n startedAt: new Date(startedAtMs).toISOString(),\n durationMs,\n failure,\n classification: cls,\n });\n deps.budget.remaining -= 1;\n deps.reportRetry?.(`turn retry ${sendAttempt + 2}/${SEND_MAX_ATTEMPTS} (${cls.reason}) — waiting ${Math.round(delayMs / 1000)}s`);\n });\n yield* sleepWithReleasedSlot(deps.slot, retrySleep(deps.signal, delayMs));\n return yield* retry(sendAttempt + 1);\n })));\n });\n return retry(0);\n}\nfunction finalizeExhausted(failure: SendFailure, cls: Extract<FailureClass, {\n retryable: true;\n}>, layer: \"send\" | \"attempt\"): SendFailure {\n const suffix = layer === \"send\"\n ? ` · retries exhausted (${SEND_MAX_ATTEMPTS} attempts, ${cls.reason})`\n : ` · attempt retry budget exhausted (${ATTEMPT_MAX_RETRIES} retries, ${cls.reason})`;\n const wrapped = makeSendFailure({\n ...failure,\n message: sendFailureText(failure) + suffix,\n cause: normalizeExternalCause(failure),\n });\n return attachFailureClass(wrapped, cls);\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import { type
|
|
2
|
+
import { type FailureClass } from "../shared/failure-class.cjs";
|
|
3
3
|
import { type SendFailure, type SendFailureClassifier } from "./send-failures.cjs";
|
|
4
4
|
export declare const SEND_MAX_ATTEMPTS = 4;
|
|
5
5
|
export declare const ATTEMPT_MAX_RETRIES = 8;
|
|
@@ -23,7 +23,6 @@ export interface RetriedSendFailure {
|
|
|
23
23
|
}
|
|
24
24
|
export interface SendRetryDeps {
|
|
25
25
|
classifier?: SendFailureClassifier;
|
|
26
|
-
experimentClassifier?: AttemptFailureClassifier;
|
|
27
26
|
/** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */
|
|
28
27
|
onRetryAttempt?: (attempt: RetriedSendFailure) => void;
|
|
29
28
|
budget: AttemptRetryBudget;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import { type
|
|
2
|
+
import { type FailureClass } from "../shared/failure-class.mjs";
|
|
3
3
|
import { type SendFailure, type SendFailureClassifier } from "./send-failures.mjs";
|
|
4
4
|
export declare const SEND_MAX_ATTEMPTS = 4;
|
|
5
5
|
export declare const ATTEMPT_MAX_RETRIES = 8;
|
|
@@ -23,7 +23,6 @@ export interface RetriedSendFailure {
|
|
|
23
23
|
}
|
|
24
24
|
export interface SendRetryDeps {
|
|
25
25
|
classifier?: SendFailureClassifier;
|
|
26
|
-
experimentClassifier?: AttemptFailureClassifier;
|
|
27
26
|
/** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */
|
|
28
27
|
onRetryAttempt?: (attempt: RetriedSendFailure) => void;
|
|
29
28
|
budget: AttemptRetryBudget;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Effect } from "effect";
|
|
2
|
-
import { type
|
|
2
|
+
import { type FailureClass } from "../shared/failure-class.js";
|
|
3
3
|
import { type SendFailure, type SendFailureClassifier } from "./send-failures.js";
|
|
4
4
|
export declare const SEND_MAX_ATTEMPTS = 4;
|
|
5
5
|
export declare const ATTEMPT_MAX_RETRIES = 8;
|
|
@@ -23,7 +23,6 @@ export interface RetriedSendFailure {
|
|
|
23
23
|
}
|
|
24
24
|
export interface SendRetryDeps {
|
|
25
25
|
classifier?: SendFailureClassifier;
|
|
26
|
-
experimentClassifier?: AttemptFailureClassifier;
|
|
27
26
|
/** 只回报被自动重试吸收的物理失败;终局失败由抛出值承载。 */
|
|
28
27
|
onRetryAttempt?: (attempt: RetriedSendFailure) => void;
|
|
29
28
|
budget: AttemptRetryBudget;
|
package/dist/context/session.cjs
CHANGED
|
@@ -16,14 +16,14 @@ const send_failures_ts_1 = require("./send-failures.cjs");
|
|
|
16
16
|
const turn_label_ts_1 = require("../shared/turn-label.cjs");
|
|
17
17
|
const attempt_resources_ts_1 = require("./attempt-resources.cjs");
|
|
18
18
|
const callback_context_ts_1 = require("../agents/callback-context.cjs");
|
|
19
|
-
const
|
|
19
|
+
const agent_effects_ts_1 = require("../agents/agent-effects.cjs");
|
|
20
20
|
/**
|
|
21
21
|
* 一条会话线的存取器实现。slot 值只按 factory 创建的 symbol 身份存取;
|
|
22
22
|
* 从异构 Map 取出后立即依 typed slot 恢复 `T`,不让擦除后的值流入领域逻辑。
|
|
23
23
|
*/
|
|
24
|
-
class
|
|
24
|
+
class StoredSessionKeyValue {
|
|
25
25
|
}
|
|
26
|
-
class
|
|
26
|
+
class StoredSessionKeyValueOf extends StoredSessionKeyValue {
|
|
27
27
|
value;
|
|
28
28
|
constructor(value) {
|
|
29
29
|
super();
|
|
@@ -50,7 +50,7 @@ function createAgentSession() {
|
|
|
50
50
|
return stored === undefined ? undefined : valueFromStoredSlot(stored);
|
|
51
51
|
},
|
|
52
52
|
set(slot, value) {
|
|
53
|
-
slots.set(slot.key, new
|
|
53
|
+
slots.set(slot.key, new StoredSessionKeyValueOf(value));
|
|
54
54
|
},
|
|
55
55
|
take(slot) {
|
|
56
56
|
const stored = slots.get(slot.key);
|
|
@@ -295,6 +295,7 @@ class SessionManager {
|
|
|
295
295
|
...(sourceOrder === undefined ? {} : { sourceOrder }),
|
|
296
296
|
});
|
|
297
297
|
const ctx = (0, attempt_resources_ts_1.bindAttemptResources)({
|
|
298
|
+
sandbox: this.deps.sandbox,
|
|
298
299
|
turnId,
|
|
299
300
|
signal: this.deps.signal,
|
|
300
301
|
evalId: this.deps.evalId,
|
|
@@ -349,7 +350,6 @@ class SessionManager {
|
|
|
349
350
|
: this.sendAgentEffect({ text, files, responses }, ctx, observeUsage).pipe(effect_1.Effect.map((turn) => ({ turn })));
|
|
350
351
|
const retryDeps = {
|
|
351
352
|
classifier: this.deps.agent.classifySendFailure,
|
|
352
|
-
experimentClassifier: this.deps.experimentClassifier,
|
|
353
353
|
onRetryAttempt: ({ sendAttempt, startedAt, durationMs, failure, classification }) => {
|
|
354
354
|
const process = failure.process;
|
|
355
355
|
this.retryAttempts.push({
|
|
@@ -498,14 +498,12 @@ class SessionManager {
|
|
|
498
498
|
});
|
|
499
499
|
}
|
|
500
500
|
sendAgentEffect(input, ctx, observeUsage) {
|
|
501
|
-
const nativeContext =
|
|
502
|
-
|
|
503
|
-
: ctx;
|
|
504
|
-
const native = (0, effect_runtime_ts_1.agentSendEffect)(this.deps.agent, input, nativeContext);
|
|
501
|
+
const nativeContext = ctx;
|
|
502
|
+
const native = (0, agent_effects_ts_1.agentSendEffect)(this.deps.agent, input, nativeContext);
|
|
505
503
|
if (native !== undefined) {
|
|
506
|
-
return (0, callback_context_ts_1.withAgentCallbackContext)(nativeContext, (callbackContext) => observeUsage(effect_1.Effect.suspend(() => (0,
|
|
504
|
+
return (0, callback_context_ts_1.withAgentCallbackContext)(nativeContext, (callbackContext) => observeUsage(effect_1.Effect.suspend(() => (0, agent_effects_ts_1.agentSendEffect)(this.deps.agent, input, callbackContext)).pipe(effect_1.Effect.mapError(send_failures_ts_1.normalizeSendFailure))));
|
|
507
505
|
}
|
|
508
|
-
return (0, callback_context_ts_1.withAgentCallbackContext)(ctx, (callbackContext) => observeUsage((0,
|
|
506
|
+
return (0, callback_context_ts_1.withAgentCallbackContext)(ctx, (callbackContext) => observeUsage((0, agent_effects_ts_1.authorCallbackEffect)(() => this.sendAgent(input, callbackContext)).pipe(effect_1.Effect.mapError(send_failures_ts_1.normalizeSendFailure))));
|
|
509
507
|
}
|
|
510
508
|
/** Runs at the Agent invoke boundary, after ledger and OTLP preparation, once per retry. */
|
|
511
509
|
recordSendUsageEffect(callOnce, identity) {
|
|
@@ -617,12 +615,7 @@ class SessionManager {
|
|
|
617
615
|
return attributed;
|
|
618
616
|
}
|
|
619
617
|
sendAgent(input, ctx) {
|
|
620
|
-
|
|
621
|
-
if (agent.kind === "sandbox") {
|
|
622
|
-
const sandboxCtx = (0, attempt_resources_ts_1.bindAttemptResources)({ ...ctx, sandbox: this.deps.sandbox }, this.deps.resources);
|
|
623
|
-
return agent.send(input, sandboxCtx);
|
|
624
|
-
}
|
|
625
|
-
return agent.send(input, ctx);
|
|
618
|
+
return this.deps.agent.send(input, ctx);
|
|
626
619
|
}
|
|
627
620
|
}
|
|
628
621
|
exports.SessionManager = SessionManager;
|