niceeval 0.13.1 → 0.13.2
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 +25 -2
- package/README.md +9 -10
- package/README.zh.md +9 -10
- package/dist/agents/ai-sdk.cjs.map +1 -1
- package/dist/agents/ai-sdk.d.cts +1 -1
- package/dist/agents/ai-sdk.d.mts +1 -1
- package/dist/agents/ai-sdk.d.ts +1 -1
- package/dist/agents/bub-install-spec.cjs +19 -5
- package/dist/agents/bub-install-spec.cjs.map +1 -1
- package/dist/agents/bub-install-spec.d.cts +9 -2
- package/dist/agents/bub-install-spec.d.mts +9 -2
- package/dist/agents/bub-install-spec.d.ts +9 -2
- package/dist/agents/bub-install-spec.js +14 -12
- package/dist/agents/bub.cjs +10 -6
- package/dist/agents/bub.cjs.map +1 -1
- package/dist/agents/bub.d.cts +2 -2
- package/dist/agents/bub.d.mts +2 -2
- package/dist/agents/bub.d.ts +2 -2
- package/dist/agents/claude-code.cjs.map +1 -1
- package/dist/agents/claude-code.d.cts +2 -2
- package/dist/agents/claude-code.d.mts +2 -2
- package/dist/agents/claude-code.d.ts +2 -2
- package/dist/agents/codex.cjs +4 -4
- package/dist/agents/codex.cjs.map +1 -1
- package/dist/agents/codex.d.cts +3 -3
- package/dist/agents/codex.d.mts +3 -3
- package/dist/agents/codex.d.ts +3 -3
- package/dist/agents/coding-cli-versions.cjs +10 -1
- package/dist/agents/coding-cli-versions.cjs.map +1 -1
- package/dist/agents/coding-cli-versions.d.cts +8 -3
- package/dist/agents/coding-cli-versions.d.mts +8 -3
- package/dist/agents/coding-cli-versions.d.ts +8 -3
- package/dist/agents/coding-cli-versions.js +18 -12
- package/dist/agents/deepseek-harness.cjs +151 -0
- package/dist/agents/deepseek-harness.cjs.map +1 -0
- package/dist/agents/deepseek-harness.d.cts +14 -0
- package/dist/agents/deepseek-harness.d.mts +14 -0
- package/dist/agents/deepseek-harness.d.ts +14 -0
- package/dist/agents/deepseek-harness.js +7 -0
- package/dist/agents/deepseek-harness.js.map +1 -0
- package/dist/agents/exact-npm-plugins.cjs +28 -0
- package/dist/agents/exact-npm-plugins.cjs.map +1 -0
- package/dist/agents/exact-npm-plugins.d.cts +10 -0
- package/dist/agents/exact-npm-plugins.d.mts +10 -0
- package/dist/agents/exact-npm-plugins.d.ts +10 -0
- package/dist/agents/exact-npm-plugins.js +8 -0
- package/dist/agents/exact-npm-plugins.js.map +1 -0
- package/dist/agents/index.cjs +5 -1
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +4 -0
- package/dist/agents/index.d.mts +4 -0
- package/dist/agents/index.d.ts +4 -0
- package/dist/agents/index.js +54 -50
- package/dist/agents/index.mjs +54 -50
- package/dist/agents/omp.cjs +170 -0
- package/dist/agents/omp.cjs.map +1 -0
- package/dist/agents/omp.d.cts +14 -0
- package/dist/agents/omp.d.mts +14 -0
- package/dist/agents/omp.d.ts +14 -0
- package/dist/agents/omp.js +7 -0
- package/dist/agents/omp.js.map +1 -0
- package/dist/agents/openclaw.cjs +51 -2
- package/dist/agents/openclaw.cjs.map +1 -1
- package/dist/agents/openclaw.d.cts +2 -0
- package/dist/agents/openclaw.d.mts +2 -0
- package/dist/agents/openclaw.d.ts +2 -0
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +4 -4
- package/dist/agents/types.d.mts +4 -4
- package/dist/agents/types.d.ts +4 -4
- package/dist/agents/ui-message-stream.cjs +24 -7
- package/dist/agents/ui-message-stream.cjs.map +1 -1
- package/dist/analysis/api.cjs +28 -2
- package/dist/analysis/api.cjs.map +1 -1
- package/dist/analysis/api.d.cts +22 -1
- package/dist/analysis/api.d.mts +22 -1
- package/dist/analysis/api.d.ts +22 -1
- package/dist/analysis/api.js +8 -6
- package/dist/analysis/bindings.cjs +11 -18
- package/dist/analysis/bindings.cjs.map +1 -1
- package/dist/analysis/bindings.d.cts +177 -49
- package/dist/analysis/bindings.d.mts +177 -49
- package/dist/analysis/bindings.d.ts +177 -49
- package/dist/analysis/contracts.cjs +1 -0
- package/dist/analysis/contracts.cjs.map +1 -1
- package/dist/analysis/contracts.d.cts +43 -3
- package/dist/analysis/contracts.d.mts +43 -3
- package/dist/analysis/contracts.d.ts +43 -3
- package/dist/analysis/cost-projection.cjs +2 -1
- package/dist/analysis/cost-projection.cjs.map +1 -1
- package/dist/analysis/cost-projection.d.cts +1 -1
- package/dist/analysis/cost-projection.d.mts +1 -1
- package/dist/analysis/cost-projection.d.ts +1 -1
- package/dist/analysis/cost.cjs +13 -3
- package/dist/analysis/cost.cjs.map +1 -1
- package/dist/analysis/cost.d.cts +10 -3
- package/dist/analysis/cost.d.mts +10 -3
- package/dist/analysis/cost.d.ts +10 -3
- package/dist/analysis/experiment-groups.cjs +96 -0
- package/dist/analysis/experiment-groups.cjs.map +1 -0
- package/dist/analysis/experiment-groups.d.cts +9 -0
- package/dist/analysis/experiment-groups.d.mts +9 -0
- package/dist/analysis/experiment-groups.d.ts +9 -0
- package/dist/analysis/experiment-groups.js +10 -0
- package/dist/analysis/experiment-groups.js.map +1 -0
- package/dist/analysis/index.cjs +4 -1
- package/dist/analysis/index.cjs.map +1 -1
- package/dist/analysis/index.d.cts +4 -2
- package/dist/analysis/index.d.mts +4 -2
- package/dist/analysis/index.d.ts +4 -2
- package/dist/analysis/index.js +40 -36
- package/dist/analysis/index.mjs +40 -36
- package/dist/assertions/limits.cjs +4 -0
- package/dist/assertions/limits.cjs.map +1 -1
- package/dist/assertions/limits.d.cts +4 -0
- package/dist/assertions/limits.d.mts +4 -0
- package/dist/assertions/limits.d.ts +4 -0
- package/dist/assertions/match.cjs +63 -25
- package/dist/assertions/match.cjs.map +1 -1
- package/dist/assertions/match.d.cts +7 -0
- package/dist/assertions/match.d.mts +7 -0
- package/dist/assertions/match.d.ts +7 -0
- package/dist/assertions/record/attachment.cjs +32 -4
- package/dist/assertions/record/attachment.cjs.map +1 -1
- package/dist/assertions/record/diff.cjs +10 -4
- package/dist/assertions/record/diff.cjs.map +1 -1
- package/dist/assertions/record/producer.cjs +101 -4
- package/dist/assertions/record/producer.cjs.map +1 -1
- package/dist/assertions/record/producer.d.cts +4 -1
- package/dist/assertions/record/producer.d.mts +4 -1
- package/dist/assertions/record/producer.d.ts +4 -1
- package/dist/assertions/runtime.cjs +45 -5
- package/dist/assertions/runtime.cjs.map +1 -1
- package/dist/cli/record.cjs +113 -8
- package/dist/cli/record.cjs.map +1 -1
- package/dist/cli/record.d.cts +20 -1
- package/dist/cli/record.d.mts +20 -1
- package/dist/cli/record.d.ts +20 -1
- package/dist/cli/record.js +4 -2
- package/dist/cli.cjs +386 -31
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.cts +10 -2
- package/dist/cli.d.mts +10 -2
- package/dist/cli.d.ts +10 -2
- package/dist/context/send-retry.cjs +4 -4
- package/dist/context/send-retry.cjs.map +1 -1
- package/dist/coordination/host/runtime.cjs +8 -30
- package/dist/coordination/host/runtime.cjs.map +1 -1
- package/dist/coordination/host/runtime.d.cts +3 -3
- package/dist/coordination/host/runtime.d.mts +3 -3
- package/dist/coordination/host/runtime.d.ts +3 -3
- package/dist/coordination/host/types.cjs.map +1 -1
- package/dist/coordination/host/types.d.cts +0 -5
- package/dist/coordination/host/types.d.mts +0 -5
- package/dist/coordination/host/types.d.ts +0 -5
- package/dist/coordination/platform/node.cjs +90 -9
- package/dist/coordination/platform/node.cjs.map +1 -1
- package/dist/define.cjs +25 -1
- package/dist/define.cjs.map +1 -1
- package/dist/experiment/host/index.cjs +1 -0
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/i18n/en.cjs +26 -8
- package/dist/i18n/en.cjs.map +1 -1
- package/dist/i18n/en.d.cts +19 -6
- package/dist/i18n/en.d.mts +19 -6
- package/dist/i18n/en.d.ts +19 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/o11y/parsers/hermes.cjs +1 -1
- package/dist/o11y/parsers/hermes.cjs.map +1 -1
- package/dist/o11y/prices.json +1 -1
- package/dist/o11y/record/families.cjs +12 -3
- package/dist/o11y/record/families.cjs.map +1 -1
- package/dist/o11y/record/families.d.cts +8 -8
- package/dist/o11y/record/families.d.mts +8 -8
- package/dist/o11y/record/families.d.ts +8 -8
- package/dist/o11y/record/family-projectors.d.cts +66 -18
- package/dist/o11y/record/family-projectors.d.mts +66 -18
- package/dist/o11y/record/family-projectors.d.ts +66 -18
- package/dist/o11y/record/family-writers.d.cts +11 -3
- package/dist/o11y/record/family-writers.d.mts +11 -3
- package/dist/o11y/record/family-writers.d.ts +11 -3
- package/dist/o11y/record/runner-producer.cjs +14 -4
- package/dist/o11y/record/runner-producer.cjs.map +1 -1
- package/dist/record/codec/core.d.cts +2 -2
- package/dist/record/codec/core.d.mts +2 -2
- package/dist/record/codec/core.d.ts +2 -2
- package/dist/record/family/catalog.d.cts +44 -12
- package/dist/record/family/catalog.d.mts +44 -12
- package/dist/record/family/catalog.d.ts +44 -12
- package/dist/record/family/index.js +128 -124
- package/dist/record/family/observability-v1.cjs +35 -0
- package/dist/record/family/observability-v1.cjs.map +1 -0
- package/dist/record/family/observability-v1.d.cts +3 -0
- package/dist/record/family/observability-v1.d.mts +3 -0
- package/dist/record/family/observability-v1.d.ts +3 -0
- package/dist/record/family/observability-v1.js +6 -0
- package/dist/record/family/observability-v1.js.map +1 -0
- package/dist/record/family/observability.cjs +58 -9
- package/dist/record/family/observability.cjs.map +1 -1
- package/dist/record/family/observability.d.cts +1014 -15
- package/dist/record/family/observability.d.mts +1014 -15
- package/dist/record/family/observability.d.ts +1014 -15
- package/dist/record/family/observability.js +22 -18
- package/dist/record/host/runtime.cjs +600 -31
- package/dist/record/host/runtime.cjs.map +1 -1
- package/dist/record/host/types.cjs.map +1 -1
- package/dist/record/host/types.d.cts +33 -9
- package/dist/record/host/types.d.mts +33 -9
- package/dist/record/host/types.d.ts +33 -9
- package/dist/record/maintenance/runtime.cjs +1 -2
- package/dist/record/maintenance/runtime.cjs.map +1 -1
- package/dist/record/model/core.cjs.map +1 -1
- package/dist/record/model/core.d.cts +1 -1
- package/dist/record/model/core.d.mts +1 -1
- package/dist/record/model/core.d.ts +1 -1
- package/dist/record/model/definition.d.cts +6 -6
- package/dist/record/model/definition.d.mts +6 -6
- package/dist/record/model/definition.d.ts +6 -6
- package/dist/record/model/identifiers.cjs +1 -1
- package/dist/record/model/identifiers.cjs.map +1 -1
- package/dist/record/model/identifiers.d.cts +1 -1
- package/dist/record/model/identifiers.d.mts +1 -1
- package/dist/record/model/identifiers.d.ts +1 -1
- package/dist/record/platform/node.cjs +159 -23
- package/dist/record/platform/node.cjs.map +1 -1
- package/dist/record/platform/services.cjs.map +1 -1
- package/dist/record/platform/services.d.cts +15 -2
- package/dist/record/platform/services.d.mts +15 -2
- package/dist/record/platform/services.d.ts +15 -2
- package/dist/record/reader/errors.cjs +37 -1
- package/dist/record/reader/errors.cjs.map +1 -1
- package/dist/record/reader/errors.d.cts +49 -1
- package/dist/record/reader/errors.d.mts +49 -1
- package/dist/record/reader/errors.d.ts +49 -1
- package/dist/record/reader/errors.js +22 -12
- package/dist/record/reader/format.cjs +76 -17
- package/dist/record/reader/format.cjs.map +1 -1
- package/dist/record/reader/format.d.cts +11 -4
- package/dist/record/reader/format.d.mts +11 -4
- package/dist/record/reader/format.d.ts +11 -4
- package/dist/record/reader/format.js +2 -0
- package/dist/record/reader/index.js +32 -18
- package/dist/record/reader/runtime.cjs +64 -0
- package/dist/record/reader/runtime.cjs.map +1 -1
- package/dist/record/reader/runtime.d.cts +15 -0
- package/dist/record/reader/runtime.d.mts +15 -0
- package/dist/record/reader/runtime.d.ts +15 -0
- package/dist/record/reader/runtime.js +2 -0
- package/dist/report/assets/styles.css +53 -29
- package/dist/report/built-in/analysis-values.cjs +21 -13
- package/dist/report/built-in/analysis-values.cjs.map +1 -1
- package/dist/report/built-in/analysis-values.d.cts +11 -22
- package/dist/report/built-in/analysis-values.d.mts +11 -22
- package/dist/report/built-in/analysis-values.d.ts +11 -22
- package/dist/report/built-in/analysis-values.js +4 -6
- package/dist/report/built-in/index.cjs +1 -3
- package/dist/report/built-in/index.cjs.map +1 -1
- package/dist/report/built-in/index.d.cts +1 -1
- package/dist/report/built-in/index.d.mts +1 -1
- package/dist/report/built-in/index.d.ts +1 -1
- package/dist/report/built-in/index.js +4 -8
- package/dist/report/built-in/index.mjs +4 -8
- package/dist/report/built-in/machine.cjs +0 -2
- package/dist/report/built-in/machine.cjs.map +1 -1
- package/dist/report/built-in/machine.d.cts +0 -2
- package/dist/report/built-in/machine.d.mts +0 -2
- package/dist/report/built-in/machine.d.ts +0 -2
- package/dist/report/built-in/result-components.cjs +49 -51
- package/dist/report/built-in/result-components.cjs.map +1 -1
- package/dist/report/built-in/result-components.d.cts +16 -17
- package/dist/report/built-in/result-components.d.mts +16 -17
- package/dist/report/built-in/result-components.d.ts +16 -17
- package/dist/report/built-in/result-components.js +0 -4
- package/dist/report/built-in/run-membership-overview.cjs +126 -17
- package/dist/report/built-in/run-membership-overview.cjs.map +1 -1
- package/dist/report/built-in/run-membership-overview.d.cts +14 -0
- package/dist/report/built-in/run-membership-overview.d.mts +14 -0
- package/dist/report/built-in/run-membership-overview.d.ts +14 -0
- package/dist/report/built-in/run-membership-overview.js +4 -2
- package/dist/report/built-in/standard.cjs +80 -45
- package/dist/report/built-in/standard.cjs.map +1 -1
- package/dist/report/built-in/standard.d.cts +19 -41
- package/dist/report/built-in/standard.d.mts +19 -41
- package/dist/report/built-in/standard.d.ts +19 -41
- package/dist/report/built-in/standard.js +6 -6
- package/dist/report/components/attempt-detail/compute.cjs +78 -2
- package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
- package/dist/report/components/attempt-detail/compute.d.cts +1 -1
- package/dist/report/components/attempt-detail/compute.d.mts +1 -1
- package/dist/report/components/attempt-detail/compute.d.ts +1 -1
- package/dist/report/components/attempt-detail/content.cjs +1 -1
- package/dist/report/components/attempt-detail/content.cjs.map +1 -1
- package/dist/report/components/entity-lists/compute.cjs +42 -5
- package/dist/report/components/entity-lists/compute.cjs.map +1 -1
- package/dist/report/components/entity-lists/compute.d.cts +10 -8
- package/dist/report/components/entity-lists/compute.d.mts +10 -8
- package/dist/report/components/entity-lists/compute.d.ts +10 -8
- package/dist/report/components/entity-lists/content.cjs +31 -6
- package/dist/report/components/entity-lists/content.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.cjs +9 -4
- package/dist/report/components/entity-lists/index.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.d.cts +4 -7
- package/dist/report/components/entity-lists/index.d.mts +4 -7
- package/dist/report/components/entity-lists/index.d.ts +4 -7
- package/dist/report/components/summaries/compute.cjs +8 -1
- package/dist/report/components/summaries/compute.cjs.map +1 -1
- package/dist/report/components/summaries/compute.d.cts +9 -1
- package/dist/report/components/summaries/compute.d.mts +9 -1
- package/dist/report/components/summaries/compute.d.ts +9 -1
- package/dist/report/components/summaries/index.cjs +48 -4
- package/dist/report/components/summaries/index.cjs.map +1 -1
- package/dist/report/components/summaries/index.d.cts +7 -4
- package/dist/report/components/summaries/index.d.mts +7 -4
- package/dist/report/components/summaries/index.d.ts +7 -4
- package/dist/report/definition/cell.cjs +3 -0
- package/dist/report/definition/cell.cjs.map +1 -1
- package/dist/report/definition/cell.d.cts +2 -0
- package/dist/report/definition/cell.d.mts +2 -0
- package/dist/report/definition/cell.d.ts +2 -0
- package/dist/report/definition/primitives/chart.cjs +8 -5
- package/dist/report/definition/primitives/chart.cjs.map +1 -1
- package/dist/report/definition/primitives/points-dataset.cjs +1 -0
- package/dist/report/definition/primitives/points-dataset.cjs.map +1 -1
- package/dist/report/definition/primitives.cjs +15 -2
- package/dist/report/definition/primitives.cjs.map +1 -1
- package/dist/report/definition/report.cjs +27 -3
- package/dist/report/definition/report.cjs.map +1 -1
- package/dist/report/definition/report.d.cts +8 -0
- package/dist/report/definition/report.d.mts +8 -0
- package/dist/report/definition/report.d.ts +8 -0
- package/dist/report/execution/machine.cjs +30 -14
- package/dist/report/execution/machine.cjs.map +1 -1
- package/dist/report/execution/machine.d.cts +20 -10
- package/dist/report/execution/machine.d.mts +20 -10
- package/dist/report/execution/machine.d.ts +20 -10
- package/dist/report/execution/machine.js +6 -6
- package/dist/report/host/execute.cjs +25 -16
- package/dist/report/host/execute.cjs.map +1 -1
- package/dist/report/host/execute.d.cts +4 -0
- package/dist/report/host/execute.d.mts +4 -0
- package/dist/report/host/execute.d.ts +4 -0
- package/dist/report/host/from-record.cjs +22 -5
- package/dist/report/host/from-record.cjs.map +1 -1
- package/dist/report/host/machine.cjs +53 -11
- package/dist/report/host/machine.cjs.map +1 -1
- package/dist/report/host/site-runtime.cjs +9 -8
- package/dist/report/host/site-runtime.cjs.map +1 -1
- package/dist/report/host/site-runtime.d.cts +1 -1
- package/dist/report/host/site-runtime.d.mts +1 -1
- package/dist/report/host/site-runtime.d.ts +1 -1
- package/dist/report/host/static.cjs +56 -9
- package/dist/report/host/static.cjs.map +1 -1
- package/dist/report/index.cjs.map +1 -1
- package/dist/report/index.d.cts +1 -1
- package/dist/report/index.d.mts +1 -1
- package/dist/report/index.d.ts +1 -1
- package/dist/report/model/dataset.cjs +7 -2
- package/dist/report/model/dataset.cjs.map +1 -1
- package/dist/report/model/locale.cjs +2 -0
- package/dist/report/model/locale.cjs.map +1 -1
- package/dist/report/model/locale.d.cts +1 -0
- package/dist/report/model/locale.d.mts +1 -0
- package/dist/report/model/locale.d.ts +1 -0
- package/dist/report/model/metrics.cjs +3 -1
- package/dist/report/model/metrics.cjs.map +1 -1
- package/dist/report/model/pricing.cjs +16 -11
- package/dist/report/model/pricing.cjs.map +1 -1
- package/dist/report/react/styles.css +53 -29
- package/dist/runner/adoption.cjs +1 -0
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/attempt.cjs +44 -5
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/runner/attempt.d.cts +13 -1
- package/dist/runner/attempt.d.mts +13 -1
- package/dist/runner/attempt.d.ts +13 -1
- package/dist/runner/config-identity.cjs +10 -2
- package/dist/runner/config-identity.cjs.map +1 -1
- package/dist/runner/config-identity.d.cts +4 -2
- package/dist/runner/config-identity.d.mts +4 -2
- package/dist/runner/config-identity.d.ts +4 -2
- package/dist/runner/feedback/human.cjs +298 -59
- package/dist/runner/feedback/human.cjs.map +1 -1
- package/dist/runner/feedback/json.cjs +14 -6
- package/dist/runner/feedback/json.cjs.map +1 -1
- package/dist/runner/feedback/json.d.cts +3 -2
- package/dist/runner/feedback/json.d.mts +3 -2
- package/dist/runner/feedback/json.d.ts +3 -2
- package/dist/runner/feedback/reducer.cjs +2 -0
- package/dist/runner/feedback/reducer.cjs.map +1 -1
- package/dist/runner/judge-config.cjs +1 -1
- package/dist/runner/judge-config.cjs.map +1 -1
- package/dist/runner/ledger.cjs +124 -12
- package/dist/runner/ledger.cjs.map +1 -1
- package/dist/runner/project-current.cjs +13 -5
- package/dist/runner/project-current.cjs.map +1 -1
- package/dist/runner/run.cjs +564 -256
- package/dist/runner/run.cjs.map +1 -1
- package/dist/runner/sandbox-pool.cjs +161 -30
- package/dist/runner/sandbox-pool.cjs.map +1 -1
- package/dist/runner/sandbox-pool.d.cts +34 -2
- package/dist/runner/sandbox-pool.d.mts +34 -2
- package/dist/runner/sandbox-pool.d.ts +34 -2
- package/dist/runner/shared-state-lease.cjs +803 -0
- package/dist/runner/shared-state-lease.cjs.map +1 -0
- package/dist/runner/shared-state-lease.d.cts +121 -0
- package/dist/runner/shared-state-lease.d.mts +121 -0
- package/dist/runner/shared-state-lease.d.ts +121 -0
- package/dist/runner/shared-state-lease.js +24 -0
- package/dist/runner/shared-state-lease.js.map +1 -0
- package/dist/runner/teardown-registry.cjs +97 -34
- package/dist/runner/teardown-registry.cjs.map +1 -1
- package/dist/runner/teardown-registry.d.cts +27 -1
- package/dist/runner/teardown-registry.d.mts +27 -1
- package/dist/runner/teardown-registry.d.ts +27 -1
- package/dist/runner/teardown-registry.js +20 -16
- package/dist/runner/types.cjs.map +1 -1
- package/dist/runner/types.d.cts +31 -5
- package/dist/runner/types.d.mts +31 -5
- package/dist/runner/types.d.ts +31 -5
- package/dist/sample/analysis.cjs +249 -459
- package/dist/sample/analysis.cjs.map +1 -1
- package/dist/sample/capability.cjs +138 -7
- package/dist/sample/capability.cjs.map +1 -1
- package/dist/sample/capability.d.cts +3 -1
- package/dist/sample/capability.d.mts +3 -1
- package/dist/sample/capability.d.ts +3 -1
- package/dist/sample/capability.js +8 -6
- package/dist/sandbox/docker-agent-image.cjs +5 -1
- package/dist/sandbox/docker-agent-image.cjs.map +1 -1
- package/dist/sandbox/docker-agent-image.d.cts +2 -0
- package/dist/sandbox/docker-agent-image.d.mts +2 -0
- package/dist/sandbox/docker-agent-image.d.ts +2 -0
- package/dist/sandbox/docker-agent-image.js +14 -10
- package/dist/sandbox/docker-profile/schema.cjs +283 -534
- package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.d.cts +10 -27
- package/dist/sandbox/docker-profile/schema.d.mts +10 -27
- package/dist/sandbox/docker-profile/schema.d.ts +10 -27
- package/dist/sandbox/e2b-agent-template.cjs +5 -2
- package/dist/sandbox/e2b-agent-template.cjs.map +1 -1
- package/dist/sandbox/index.cjs +4 -2
- package/dist/sandbox/index.cjs.map +1 -1
- package/dist/sandbox/index.d.cts +1 -1
- package/dist/sandbox/index.d.mts +1 -1
- package/dist/sandbox/index.d.ts +1 -1
- package/dist/sandbox/index.js +120 -116
- package/dist/sandbox/index.mjs +120 -116
- package/dist/sandbox/keep-registry.cjs +28 -66
- package/dist/sandbox/keep-registry.cjs.map +1 -1
- package/dist/sandbox/types.cjs.map +1 -1
- package/dist/sandbox/types.d.cts +1 -1
- package/dist/sandbox/types.d.mts +1 -1
- package/dist/sandbox/types.d.ts +1 -1
- package/dist/shared/aggregate.cjs +16 -6
- package/dist/shared/aggregate.cjs.map +1 -1
- package/dist/shared/aggregate.d.cts +12 -4
- package/dist/shared/aggregate.d.mts +12 -4
- package/dist/shared/aggregate.d.ts +12 -4
- package/dist/shared/turn-label.cjs +20 -2
- package/dist/shared/turn-label.cjs.map +1 -1
- package/dist/shared/turn-label.d.cts +2 -0
- package/dist/shared/turn-label.d.mts +2 -0
- package/dist/shared/turn-label.d.ts +2 -0
- package/dist/shared/turn-label.js +4 -2
- package/dist/vendor/remark/remark-gfm.cjs +7 -7
- package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
- package/dist/vendor/remark/remark-parse.cjs +12 -12
- package/dist/vendor/remark/remark-parse.cjs.map +1 -1
- package/dist/vendor/remark/remark.cjs +13 -13
- package/dist/vendor/remark/remark.cjs.map +1 -1
- package/dist/view/server.cjs +6 -0
- package/dist/view/server.cjs.map +1 -1
- package/docs-site/images/hitl-handshake-zh.svg +3 -3
- package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
- package/docs-site/zh/examples/coding-agent-extensions.mdx +1 -1
- package/docs-site/zh/examples/integrations/ai-sdk-v7.mdx +4 -3
- package/docs-site/zh/examples/integrations/claude-sdk.mdx +3 -3
- package/docs-site/zh/examples/integrations/codex-sdk.mdx +5 -5
- 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 +5 -5
- package/docs-site/zh/explanation/assert.mdx +7 -7
- package/docs-site/zh/explanation/drive.mdx +4 -2
- package/docs-site/zh/explanation/evals.mdx +10 -8
- package/docs-site/zh/explanation/experiment.mdx +2 -2
- package/docs-site/zh/explanation/hitl.mdx +9 -9
- package/docs-site/zh/explanation/judge.mdx +5 -5
- package/docs-site/zh/explanation/overview.mdx +3 -3
- package/docs-site/zh/explanation/runner.mdx +1 -1
- package/docs-site/zh/index.mdx +3 -3
- package/docs-site/zh/reference/builtin-agents.mdx +13 -13
- package/docs-site/zh/reference/capabilities.mdx +1 -1
- package/docs-site/zh/reference/cli.mdx +18 -12
- package/docs-site/zh/reference/define-agent.mdx +130 -5
- package/docs-site/zh/reference/define-config.mdx +2 -2
- package/docs-site/zh/reference/define-eval.mdx +4 -4
- package/docs-site/zh/reference/events.mdx +11 -11
- package/docs-site/zh/reference/official-adapters.mdx +6 -6
- package/docs-site/zh/reference/results-data.mdx +6 -0
- package/docs-site/zh/troubleshooting/debugging.mdx +1 -1
- package/docs-site/zh/troubleshooting/recover-after-kill.mdx +37 -5
- package/docs-site/zh/tutorials/accept-results.mdx +72 -0
- package/docs-site/zh/tutorials/agent-onboarding.mdx +6 -6
- package/docs-site/zh/tutorials/authoring.mdx +9 -13
- package/docs-site/zh/tutorials/ci-integration.mdx +6 -6
- package/docs-site/zh/tutorials/compare-runs.mdx +61 -0
- package/docs-site/zh/tutorials/concurrency.mdx +13 -12
- package/docs-site/zh/tutorials/configuration.mdx +4 -6
- package/docs-site/zh/tutorials/connect-your-agent.mdx +1 -1
- package/docs-site/zh/tutorials/control-run-cost.mdx +58 -0
- package/docs-site/zh/tutorials/criteria-files.mdx +2 -2
- package/docs-site/zh/tutorials/custom-reports.mdx +2 -2
- package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +46 -0
- package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -43
- package/docs-site/zh/tutorials/eval-groups.mdx +6 -6
- package/docs-site/zh/tutorials/evaluation-kinds.mdx +3 -3
- package/docs-site/zh/tutorials/experiments.mdx +2 -3
- package/docs-site/zh/tutorials/handle-execution-failures.mdx +18 -10
- package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +16 -8
- package/docs-site/zh/tutorials/nixos-managed-dind.mdx +160 -0
- package/docs-site/zh/tutorials/plugins.mdx +14 -0
- package/docs-site/zh/tutorials/rerun-and-cache.mdx +4 -2
- package/docs-site/zh/tutorials/sandbox-agent.mdx +17 -11
- package/docs-site/zh/tutorials/sandbox-providers.mdx +17 -13
- package/docs-site/zh/tutorials/sandbox-reuse.mdx +12 -19
- package/docs-site/zh/tutorials/select-and-preview.mdx +65 -0
- package/docs-site/zh/tutorials/verify-judge.mdx +78 -0
- package/docs-site/zh/tutorials/viewing-results.mdx +38 -1
- package/docs-site/zh/tutorials/write-experiment.mdx +7 -5
- package/docs-site/zh/tutorials/write-send.mdx +9 -8
- package/package.json +9 -5
- package/dist/report/built-in/overview.cjs +0 -44
- package/dist/report/built-in/overview.cjs.map +0 -1
- package/dist/report/built-in/overview.d.cts +0 -6
- package/dist/report/built-in/overview.d.mts +0 -6
- package/dist/report/built-in/overview.d.ts +0 -6
- package/dist/report/built-in/overview.js +0 -9
- package/dist/report/built-in/overview.js.map +0 -1
- package/dist/runner/gate-lease.cjs +0 -283
- package/dist/runner/gate-lease.cjs.map +0 -1
- package/dist/runner/gate-lease.d.cts +0 -62
- package/dist/runner/gate-lease.d.mts +0 -62
- package/dist/runner/gate-lease.d.ts +0 -62
- package/dist/runner/gate-lease.js +0 -22
- package/dist/runner/gate-lease.js.map +0 -1
|
@@ -58,6 +58,13 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
|
|
|
58
58
|
* 分类照常决议、只是无人消费。回调必须不抛错:它跑在 attempt 的失败路径上,不得掩盖原始失败。
|
|
59
59
|
*/
|
|
60
60
|
onFailureClass?: (declaration: AttemptFailureDeclaration) => void;
|
|
61
|
+
/**
|
|
62
|
+
* A fresh Sandbox owns its physical Scope inside this Attempt. Its lifecycle
|
|
63
|
+
* hooks normally turn cleanup errors into diagnostics so the remaining
|
|
64
|
+
* finalizers can run; an Experiment with sharedState must still retain that
|
|
65
|
+
* terminal cleanup fact until it decides whether releasing its lease is safe.
|
|
66
|
+
*/
|
|
67
|
+
onFreshSandboxCleanupFailure?: (failure: FreshSandboxCleanupFailure) => void;
|
|
61
68
|
/**
|
|
62
69
|
* Invocation coordination may consume the single sealed Assert-first result
|
|
63
70
|
* here and pass it to EvaluationRecordContract. The Attempt never opens a
|
|
@@ -71,7 +78,12 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
|
|
|
71
78
|
reuseOrdinal: number;
|
|
72
79
|
};
|
|
73
80
|
}
|
|
74
|
-
|
|
81
|
+
/** Internal handoff from a fresh Attempt Scope to its owning Experiment lifecycle. */
|
|
82
|
+
export interface FreshSandboxCleanupFailure {
|
|
83
|
+
readonly stage: "sandbox.lifecycle" | "sandbox.stop";
|
|
84
|
+
readonly error: Error;
|
|
85
|
+
}
|
|
86
|
+
export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onFreshSandboxCleanupFailure, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
|
|
75
87
|
/** Runner-originated failures before Fact folding still produce a closed Score terminal outcome. */
|
|
76
88
|
export declare function scoreFactOutcomeForAttemptError(error: AttemptError): import("../assertions/types.cjs").ScoreFactAttemptOutcome;
|
|
77
89
|
/** 把 catch 到的 e(body 里 test()/setup 抛错,或 Sample 层 squash 出来的原始错误)折成
|
|
@@ -58,6 +58,13 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
|
|
|
58
58
|
* 分类照常决议、只是无人消费。回调必须不抛错:它跑在 attempt 的失败路径上,不得掩盖原始失败。
|
|
59
59
|
*/
|
|
60
60
|
onFailureClass?: (declaration: AttemptFailureDeclaration) => void;
|
|
61
|
+
/**
|
|
62
|
+
* A fresh Sandbox owns its physical Scope inside this Attempt. Its lifecycle
|
|
63
|
+
* hooks normally turn cleanup errors into diagnostics so the remaining
|
|
64
|
+
* finalizers can run; an Experiment with sharedState must still retain that
|
|
65
|
+
* terminal cleanup fact until it decides whether releasing its lease is safe.
|
|
66
|
+
*/
|
|
67
|
+
onFreshSandboxCleanupFailure?: (failure: FreshSandboxCleanupFailure) => void;
|
|
61
68
|
/**
|
|
62
69
|
* Invocation coordination may consume the single sealed Assert-first result
|
|
63
70
|
* here and pass it to EvaluationRecordContract. The Attempt never opens a
|
|
@@ -71,7 +78,12 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
|
|
|
71
78
|
reuseOrdinal: number;
|
|
72
79
|
};
|
|
73
80
|
}
|
|
74
|
-
|
|
81
|
+
/** Internal handoff from a fresh Attempt Scope to its owning Experiment lifecycle. */
|
|
82
|
+
export interface FreshSandboxCleanupFailure {
|
|
83
|
+
readonly stage: "sandbox.lifecycle" | "sandbox.stop";
|
|
84
|
+
readonly error: Error;
|
|
85
|
+
}
|
|
86
|
+
export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onFreshSandboxCleanupFailure, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
|
|
75
87
|
/** Runner-originated failures before Fact folding still produce a closed Score terminal outcome. */
|
|
76
88
|
export declare function scoreFactOutcomeForAttemptError(error: AttemptError): import("../assertions/types.mjs").ScoreFactAttemptOutcome;
|
|
77
89
|
/** 把 catch 到的 e(body 里 test()/setup 抛错,或 Sample 层 squash 出来的原始错误)折成
|
package/dist/runner/attempt.d.ts
CHANGED
|
@@ -58,6 +58,13 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
|
|
|
58
58
|
* 分类照常决议、只是无人消费。回调必须不抛错:它跑在 attempt 的失败路径上,不得掩盖原始失败。
|
|
59
59
|
*/
|
|
60
60
|
onFailureClass?: (declaration: AttemptFailureDeclaration) => void;
|
|
61
|
+
/**
|
|
62
|
+
* A fresh Sandbox owns its physical Scope inside this Attempt. Its lifecycle
|
|
63
|
+
* hooks normally turn cleanup errors into diagnostics so the remaining
|
|
64
|
+
* finalizers can run; an Experiment with sharedState must still retain that
|
|
65
|
+
* terminal cleanup fact until it decides whether releasing its lease is safe.
|
|
66
|
+
*/
|
|
67
|
+
onFreshSandboxCleanupFailure?: (failure: FreshSandboxCleanupFailure) => void;
|
|
61
68
|
/**
|
|
62
69
|
* Invocation coordination may consume the single sealed Assert-first result
|
|
63
70
|
* here and pass it to EvaluationRecordContract. The Attempt never opens a
|
|
@@ -71,7 +78,12 @@ export interface RunAttemptEffectOptions<SealRequirements = never> {
|
|
|
71
78
|
reuseOrdinal: number;
|
|
72
79
|
};
|
|
73
80
|
}
|
|
74
|
-
|
|
81
|
+
/** Internal handoff from a fresh Attempt Scope to its owning Experiment lifecycle. */
|
|
82
|
+
export interface FreshSandboxCleanupFailure {
|
|
83
|
+
readonly stage: "sandbox.lifecycle" | "sandbox.stop";
|
|
84
|
+
readonly error: Error;
|
|
85
|
+
}
|
|
86
|
+
export declare function runAttemptEffect<SealRequirements, AttachmentError, AttachmentRequirements>(a: Attempt, opts: RunOptions<AttachmentError, AttachmentRequirements>, sandboxSem: Effect.Semaphore, { buildLocators, runTiming, parentSignal, invocationSignal, onPhase, concurrencySlot, onFailureClass, onFreshSandboxCleanupFailure, onSealedEvaluation, reusedSandbox, }: RunAttemptEffectOptions<SealRequirements>): Effect.Effect<EvalResult, never, SealRequirements | Exclude<SealRequirements, import("effect/Scope").Scope>>;
|
|
75
87
|
/** Runner-originated failures before Fact folding still produce a closed Score terminal outcome. */
|
|
76
88
|
export declare function scoreFactOutcomeForAttemptError(error: AttemptError): import("../assertions/types.js").ScoreFactAttemptOutcome;
|
|
77
89
|
/** 把 catch 到的 e(body 里 test()/setup 抛错,或 Sample 层 squash 出来的原始错误)折成
|
|
@@ -28,12 +28,14 @@ function freezeJson(value) {
|
|
|
28
28
|
return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, freezeJson(entry)])));
|
|
29
29
|
}
|
|
30
30
|
function freezeConfigIdentity(identity) {
|
|
31
|
+
const { sharedState, ...withoutSharedState } = identity;
|
|
31
32
|
return Object.freeze({
|
|
32
|
-
...
|
|
33
|
+
...withoutSharedState,
|
|
33
34
|
model: Object.freeze(identity.model),
|
|
34
35
|
reasoningEffort: Object.freeze(identity.reasoningEffort),
|
|
35
36
|
flags: freezeJson({ ...identity.flags }),
|
|
36
37
|
plugins: freezeJson(identity.plugins),
|
|
38
|
+
...(sharedState === undefined ? {} : { sharedState }),
|
|
37
39
|
sandboxLayer: freezeJson(identity.sandboxLayer),
|
|
38
40
|
judge: identity.judge._tag === "Unconfigured"
|
|
39
41
|
? Object.freeze({ _tag: "Unconfigured" })
|
|
@@ -104,6 +106,7 @@ function configIdentityForRun(run, plan, judge = run.judge) {
|
|
|
104
106
|
flags: run.flags,
|
|
105
107
|
plugins: run.pluginBehavior ?? [],
|
|
106
108
|
sandboxReuse: run.sandboxReuse ?? false,
|
|
109
|
+
...(run.sharedState === undefined ? {} : { sharedState: run.sharedState.key }),
|
|
107
110
|
sandboxLayer: (0, link_ts_1.sandboxLayerIdentityFor)(plan.pair, "experiment"),
|
|
108
111
|
judge: judgeIdentity(judge),
|
|
109
112
|
agentInstalls: agentInstallPlansForRun(run),
|
|
@@ -124,13 +127,14 @@ function configIdentityFromResult(result) {
|
|
|
124
127
|
flags: exp.flags ?? {},
|
|
125
128
|
plugins: exp.plugins ?? [],
|
|
126
129
|
sandboxReuse: exp.sandboxReuse ?? false,
|
|
130
|
+
...(exp.sharedState === undefined ? {} : { sharedState: exp.sharedState.key }),
|
|
127
131
|
sandboxLayer: exp.sandboxLayer,
|
|
128
132
|
judge: judgeIdentity(exp.judge),
|
|
129
133
|
agentInstalls: exp.agentInstalls,
|
|
130
134
|
});
|
|
131
135
|
}
|
|
132
136
|
/**
|
|
133
|
-
* 身份 →
|
|
137
|
+
* 身份 → 字段路径表。真正未声明的配置不会生成对象键或字段路径。
|
|
134
138
|
*/
|
|
135
139
|
function flatten(identity) {
|
|
136
140
|
const out = new Map();
|
|
@@ -143,6 +147,8 @@ function flatten(identity) {
|
|
|
143
147
|
putDeclared("model", identity.model);
|
|
144
148
|
putDeclared("reasoningEffort", identity.reasoningEffort);
|
|
145
149
|
put("sandboxReuse", identity.sandboxReuse);
|
|
150
|
+
if (identity.sharedState !== undefined)
|
|
151
|
+
put("sharedState.key", identity.sharedState);
|
|
146
152
|
for (const [key, value] of Object.entries(identity.flags))
|
|
147
153
|
put(`flags.${key}`, value);
|
|
148
154
|
put("plugins", identity.plugins);
|
|
@@ -242,6 +248,7 @@ function counterfactualConfigIdentity(current, historical, accepted) {
|
|
|
242
248
|
else
|
|
243
249
|
agentInstalls = historical.agentInstalls;
|
|
244
250
|
}
|
|
251
|
+
const sharedState = accepted.has("config:sharedState.key") ? historical.sharedState : current.sharedState;
|
|
245
252
|
return freezeConfigIdentity({
|
|
246
253
|
agent: accepted.has("config:agent") ? historical.agent : current.agent,
|
|
247
254
|
model: accepted.has("config:model") ? historical.model : current.model,
|
|
@@ -251,6 +258,7 @@ function counterfactualConfigIdentity(current, historical, accepted) {
|
|
|
251
258
|
flags,
|
|
252
259
|
plugins,
|
|
253
260
|
sandboxReuse: accepted.has("config:sandboxReuse") ? historical.sandboxReuse : current.sandboxReuse,
|
|
261
|
+
...(sharedState === undefined ? {} : { sharedState }),
|
|
254
262
|
sandboxLayer,
|
|
255
263
|
judge,
|
|
256
264
|
agentInstalls,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-identity.js","sourceRoot":"","sources":["config-identity.ts"],"names":[],"mappings":"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","sourcesContent":["// 配置身份的字段级投影:`configHash` 的哈希输入本身,加上「同一份输入怎样按字段路径比对」。\n//\n// 哈希只回答「等不等」,回答不了「哪里变了」。`--accept config:<字段路径>` 与 `--dry` 的逐条\n// 作废原因都要后一个答案,而两侧必须来自同一份字段集合——configHash 里有的字段,这里就能按\n// 点路径指名;这里指不出来的路径,`--accept` 也就没有对应的差异可授权。\n//\n// 历史侧的同名投影从落盘重建(`ExperimentRunInfo` + 结果顶层的 agent/model),这正是\n// 「进 configHash 的字段必须落进 run.json」那条规则存在的理由。\nimport type { LinkedRunPlan } from \"../sandbox/plan.ts\";\nimport { sandboxLayerIdentityFor } from \"../sandbox/link.ts\";\nimport type { AgentIdentity, AgentInstaller } from \"../agents/types.ts\";\nimport type { EvalResult, JsonValue, JudgeConfig, ResolvedJudgeConfig } from \"../types.ts\";\nimport type { AgentRun } from \"./types.ts\";\n/**\n * 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与\n * docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。\n *\n * 键恒存在(值可以是 `undefined`):稳定序列化把键本身也算进字节,少一个键就是另一个哈希。\n * 新增公开配置字段时只在这里裁决一次「进不进 configHash」。\n */\nexport interface ConfigIdentity {\n readonly agent: string;\n readonly model: DeclaredConfigValue<string>;\n readonly reasoningEffort: DeclaredConfigValue<string>;\n readonly flags: Readonly<globalThis.Record<string, JsonValue>>;\n /** Credential-free Experiment Plugin and receiver behavior. */\n readonly plugins: JsonValue;\n readonly sandboxReuse: boolean;\n /** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */\n readonly sandboxLayer: JsonValue;\n readonly judge: JudgeConfigIdentity;\n /** 声明顺序、精确 installer 配对、安装模式与计划目标平台的完整静态身份。 */\n readonly agentInstalls: readonly JsonValue[];\n}\nexport type DeclaredConfigValue<Value> = {\n readonly _tag: \"Omitted\";\n} | {\n readonly _tag: \"Configured\";\n readonly value: Value;\n};\nexport type JudgeConfigIdentity = {\n readonly _tag: \"Unconfigured\";\n} | {\n readonly _tag: \"Configured\";\n readonly model: DeclaredConfigValue<string>;\n readonly baseUrl: DeclaredConfigValue<string>;\n readonly apiKeyEnv: DeclaredConfigValue<string>;\n readonly timeoutMs: DeclaredConfigValue<number>;\n};\n/** manifest 相减得出的一条具名差异;`selector` 原样可复制进 `--accept`。 */\nexport type ConfigFieldDelta = {\n readonly _tag: \"Added\";\n readonly selector: string;\n readonly from?: never;\n readonly to: string;\n} | {\n readonly _tag: \"Removed\";\n readonly selector: string;\n readonly from: string;\n readonly to?: never;\n} | {\n readonly _tag: \"Changed\";\n readonly selector: string;\n readonly from: string;\n readonly to: string;\n};\nexport function addedConfigField(selector: string, to: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Added\", selector, to });\n}\nexport function removedConfigField(selector: string, from: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Removed\", selector, from });\n}\nexport function changedConfigField(selector: string, from: string, to: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Changed\", selector, from, to });\n}\nfunction freezeJson<Value extends JsonValue>(value: Value): Value {\n if (value === null || typeof value !== \"object\")\n return value;\n if (Array.isArray(value)) {\n return Object.freeze(value.map((entry) => freezeJson(entry))) as Value;\n }\n return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, freezeJson(entry)]))) as Value;\n}\nfunction freezeConfigIdentity(identity: ConfigIdentity): ConfigIdentity {\n return Object.freeze({\n ...identity,\n model: Object.freeze(identity.model),\n reasoningEffort: Object.freeze(identity.reasoningEffort),\n flags: freezeJson({ ...identity.flags }),\n plugins: freezeJson(identity.plugins),\n sandboxLayer: freezeJson(identity.sandboxLayer),\n judge: identity.judge._tag === \"Unconfigured\"\n ? Object.freeze({ _tag: \"Unconfigured\" as const })\n : Object.freeze({\n _tag: \"Configured\" as const,\n model: Object.freeze(identity.judge.model),\n baseUrl: Object.freeze(identity.judge.baseUrl),\n apiKeyEnv: Object.freeze(identity.judge.apiKeyEnv),\n timeoutMs: Object.freeze(identity.judge.timeoutMs),\n }),\n agentInstalls: Object.freeze(identity.agentInstalls.map((entry) => freezeJson(entry))),\n });\n}\nfunction sameAgentIdentity(left: AgentIdentity, right: AgentIdentity): boolean {\n return left.agent === right.agent && left.version === right.version && left.revision === right.revision;\n}\nfunction installerIdentity(installer: AgentInstaller | undefined): JsonValue {\n if (installer === undefined)\n return { _tag: \"Missing\" };\n return {\n _tag: \"Matched\",\n identity: {\n agent: installer.identity.agent,\n version: installer.identity.version,\n revision: installer.identity.revision,\n },\n installMode: installer.installMode,\n platforms: installer.platforms === undefined\n ? { _tag: \"All\" }\n : { _tag: \"Listed\", values: [...installer.platforms] },\n };\n}\n/** 计划期一次性冻结全部 ensure/installer 配对;运行事实与 staged digest 不反写配置身份。 */\nexport function agentInstallPlansForRun(run: AgentRun): readonly JsonValue[] {\n const agent = run.agent;\n if (agent.kind === \"direct\")\n return Object.freeze([]);\n return Object.freeze(agent.ensure.map((ensure, index) => freezeJson({\n order: index,\n ensure: {\n agent: ensure.identity.agent,\n version: ensure.identity.version,\n revision: ensure.identity.revision,\n },\n installer: installerIdentity(agent.installers.find((candidate) => sameAgentIdentity(candidate.identity, ensure.identity))),\n })));\n}\nfunction declaredString(value: string | undefined): DeclaredConfigValue<string> {\n return value === undefined ? { _tag: \"Omitted\" } : { _tag: \"Configured\", value };\n}\nfunction judgeIdentity(judge: JudgeConfig | ResolvedJudgeConfig | undefined): JudgeConfigIdentity {\n return judge === undefined\n ? { _tag: \"Unconfigured\" }\n : {\n _tag: \"Configured\",\n model: declaredString(judge.model),\n baseUrl: declaredString(judge.baseUrl),\n apiKeyEnv: declaredString(judge.apiKeyEnv),\n timeoutMs: judge.timeoutMs === undefined ? { _tag: \"Omitted\" } : { _tag: \"Configured\", value: judge.timeoutMs },\n };\n}\n/** 本次解析后配置的身份投影。 */\nexport function configIdentityForRun(run: AgentRun, plan: LinkedRunPlan, judge: JudgeConfig | ResolvedJudgeConfig | undefined = run.judge): ConfigIdentity {\n return freezeConfigIdentity({\n agent: run.agent.name,\n model: declaredString(run.model),\n reasoningEffort: declaredString(run.reasoningEffort),\n flags: run.flags,\n plugins: run.pluginBehavior ?? [],\n sandboxReuse: run.sandboxReuse ?? false,\n sandboxLayer: sandboxLayerIdentityFor(plan.pair, \"experiment\"),\n judge: judgeIdentity(judge),\n agentInstalls: agentInstallPlansForRun(run),\n });\n}\n/**\n * 历史条目的同一份投影,从落盘重建。缺 `ExperimentRunInfo`(第三方 harness 写的结果)时\n * 配置面无从重算,返回 `undefined`——差异算不出就如实算不出,不猜。\n */\nexport function configIdentityFromResult(result: EvalResult): ConfigIdentity | undefined {\n const exp = result.experiment;\n if (exp === undefined)\n return undefined;\n return freezeConfigIdentity({\n agent: result.agent,\n model: declaredString(result.model),\n reasoningEffort: declaredString(exp.reasoningEffort),\n flags: exp.flags ?? {},\n plugins: exp.plugins ?? [],\n sandboxReuse: exp.sandboxReuse ?? false,\n sandboxLayer: exp.sandboxLayer,\n judge: judgeIdentity(exp.judge),\n agentInstalls: exp.agentInstalls,\n });\n}\n/**\n * 身份 → 字段路径表。可省略配置先归一为完整 ADT,再由 `_tag` 决定是否产生字段路径。\n */\nfunction flatten(identity: ConfigIdentity): Map<string, JsonValue> {\n const out = new Map<string, JsonValue>();\n const put = (path: string, value: JsonValue): void => { out.set(path, value); };\n const putDeclared = <Value extends JsonValue>(path: string, value: DeclaredConfigValue<Value>): void => {\n if (value._tag === \"Configured\")\n put(path, value.value);\n };\n put(\"agent\", identity.agent);\n putDeclared(\"model\", identity.model);\n putDeclared(\"reasoningEffort\", identity.reasoningEffort);\n put(\"sandboxReuse\", identity.sandboxReuse);\n for (const [key, value] of Object.entries(identity.flags))\n put(`flags.${key}`, value);\n put(\"plugins\", identity.plugins);\n put(\"sandboxLayer\", identity.sandboxLayer);\n if (identity.judge._tag === \"Configured\") {\n putDeclared(\"judge.model\", identity.judge.model);\n putDeclared(\"judge.baseUrl\", identity.judge.baseUrl);\n putDeclared(\"judge.apiKeyEnv\", identity.judge.apiKeyEnv);\n putDeclared(\"judge.timeoutMs\", identity.judge.timeoutMs);\n }\n put(\"agentInstalls\", [...identity.agentInstalls]);\n return out;\n}\n/**\n * 身份的字段路径投影,供 manifest 的配置面落盘(见 `runner/manifest.ts`)。与差异比对读的是\n * 同一个 `flatten`:清单里指得出的路径,`--accept config:<路径>` 就授权得了,两侧不可能分叉。\n */\nexport function configIdentityPaths(identity: ConfigIdentity): Array<[\n string,\n JsonValue\n]> {\n return [...flatten(identity)];\n}\n/** 值的字符串投影:差异明细与 `carriedAccepting` 留痕共用完整值,有界呈现是人读 renderer(`feedback/human.ts`)的职责,不在构造点做。 */\nfunction serializeValue(value: JsonValue): string {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n/**\n * 历史侧与本次侧的字段级差异,按 selector 字典序。键的增删同样是一条差异。\n */\nexport function configDeltas(historical: ConfigIdentity, current: ConfigIdentity): ConfigFieldDelta[] {\n const from = flatten(historical);\n const to = flatten(current);\n const paths = [...new Set([...from.keys(), ...to.keys()])].sort();\n const out: ConfigFieldDelta[] = [];\n for (const path of paths) {\n const hasFrom = from.has(path);\n const hasTo = to.has(path);\n if (hasFrom && hasTo && JSON.stringify(from.get(path)) === JSON.stringify(to.get(path)))\n continue;\n const fromValue = from.get(path);\n const toValue = to.get(path);\n if (hasFrom && fromValue === undefined)\n throw new Error(`Missing historical config value for ${path}.`);\n if (hasTo && toValue === undefined)\n throw new Error(`Missing current config value for ${path}.`);\n const selector = `config:${path}`;\n if (!hasFrom)\n out.push(addedConfigField(selector, serializeValue(toValue!)));\n else if (!hasTo)\n out.push(removedConfigField(selector, serializeValue(fromValue!)));\n else\n out.push(changedConfigField(selector, serializeValue(fromValue!), serializeValue(toValue!)));\n }\n return out;\n}\n/**\n * 反事实身份:把本次身份里**被授权的那些字段**换回历史值,其余原样。\n *\n * 换出来的身份再算一次指纹,与历史条目落盘的那个相等,才证明「两侧只差这些被授权的字段」——\n * 授权因此不是绕开判据,而是把判据挪到一个明确写下来的口径上重算一次。\n *\n * `sandbox` / `judge` 是整对象进哈希的分组:键在不在本身改变字节,逐字段拼回去会造出两侧都\n * 不存在的形状。分组内**每一条**差异都被授权才整体换回历史对象,否则保持本次值——那样指纹\n * 自然对不上,条目照常重跑,不会静默跨过没被授权的那半。\n */\nexport function counterfactualConfigIdentity(current: ConfigIdentity, historical: ConfigIdentity, accepted: ReadonlySet<string>): ConfigIdentity {\n const differing = new Set(configDeltas(historical, current).map((d) => d.selector));\n const flags: globalThis.Record<string, JsonValue> = { ...current.flags };\n for (const selector of accepted) {\n if (!selector.startsWith(\"config:flags.\"))\n continue;\n const key = selector.slice(\"config:flags.\".length);\n if (Object.hasOwn(historical.flags, key)) {\n const value = historical.flags[key];\n if (value === undefined)\n throw new Error(`Missing historical flag value for ${key}.`);\n flags[key] = value;\n }\n else\n delete flags[key];\n }\n let sandboxLayer = current.sandboxLayer;\n let plugins = current.plugins;\n let judge = current.judge;\n let agentInstalls = current.agentInstalls;\n const rollbackGroups: readonly (\"sandboxLayer\" | \"plugins\" | \"judge\" | \"agentInstalls\")[] = [\n \"sandboxLayer\", \"plugins\", \"judge\", \"agentInstalls\",\n ];\n for (const group of rollbackGroups) {\n const paths = [...differing].filter((selector) => selector === `config:${group}` || selector.startsWith(`config:${group}.`));\n if (paths.length === 0 || !paths.every((selector) => accepted.has(selector)))\n continue;\n if (group === \"sandboxLayer\")\n sandboxLayer = historical.sandboxLayer;\n else if (group === \"plugins\")\n plugins = historical.plugins;\n else if (group === \"judge\")\n judge = historical.judge;\n else\n agentInstalls = historical.agentInstalls;\n }\n return freezeConfigIdentity({\n agent: accepted.has(\"config:agent\") ? historical.agent : current.agent,\n model: accepted.has(\"config:model\") ? historical.model : current.model,\n reasoningEffort: accepted.has(\"config:reasoningEffort\")\n ? historical.reasoningEffort\n : current.reasoningEffort,\n flags,\n plugins,\n sandboxReuse: accepted.has(\"config:sandboxReuse\") ? historical.sandboxReuse : current.sandboxReuse,\n sandboxLayer,\n judge,\n agentInstalls,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"config-identity.js","sourceRoot":"","sources":["config-identity.ts"],"names":[],"mappings":"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","sourcesContent":["// 配置身份的字段级投影:`configHash` 的哈希输入本身,加上「同一份输入怎样按字段路径比对」。\n//\n// 哈希只回答「等不等」,回答不了「哪里变了」。`--accept config:<字段路径>` 与 `--dry` 的逐条\n// 作废原因都要后一个答案,而两侧必须来自同一份字段集合——configHash 里有的字段,这里就能按\n// 点路径指名;这里指不出来的路径,`--accept` 也就没有对应的差异可授权。\n//\n// 历史侧的同名投影从落盘重建(`ExperimentRunInfo` + 结果顶层的 agent/model),这正是\n// 「进 configHash 的字段必须落进 run.json」那条规则存在的理由。\nimport type { LinkedRunPlan } from \"../sandbox/plan.ts\";\nimport { sandboxLayerIdentityFor } from \"../sandbox/link.ts\";\nimport type { AgentIdentity, AgentInstaller } from \"../agents/types.ts\";\nimport type { EvalResult, JsonValue, JudgeConfig, ResolvedJudgeConfig } from \"../types.ts\";\nimport type { AgentRun } from \"./types.ts\";\n/**\n * 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与\n * docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。\n *\n * 可选配置必须真的省略键,而不是写入 `undefined` 或一个 Omitted 哨兵;否则未声明配置会\n * 无端改变基础 configHash。新增公开配置字段时只在这里裁决一次「进不进 configHash」。\n */\nexport interface ConfigIdentity {\n readonly agent: string;\n readonly model: DeclaredConfigValue<string>;\n readonly reasoningEffort: DeclaredConfigValue<string>;\n readonly flags: Readonly<globalThis.Record<string, JsonValue>>;\n /** Credential-free Experiment Plugin and receiver behavior. */\n readonly plugins: JsonValue;\n readonly sandboxReuse: boolean;\n /** Stable public key for the shared-state mutex, never a secret or stored state. */\n readonly sharedState?: string;\n /** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */\n readonly sandboxLayer: JsonValue;\n readonly judge: JudgeConfigIdentity;\n /** 声明顺序、精确 installer 配对、安装模式与计划目标平台的完整静态身份。 */\n readonly agentInstalls: readonly JsonValue[];\n}\nexport type DeclaredConfigValue<Value> = {\n readonly _tag: \"Omitted\";\n} | {\n readonly _tag: \"Configured\";\n readonly value: Value;\n};\nexport type JudgeConfigIdentity = {\n readonly _tag: \"Unconfigured\";\n} | {\n readonly _tag: \"Configured\";\n readonly model: DeclaredConfigValue<string>;\n readonly baseUrl: DeclaredConfigValue<string>;\n readonly apiKeyEnv: DeclaredConfigValue<string>;\n readonly timeoutMs: DeclaredConfigValue<number>;\n};\n/** manifest 相减得出的一条具名差异;`selector` 原样可复制进 `--accept`。 */\nexport type ConfigFieldDelta = {\n readonly _tag: \"Added\";\n readonly selector: string;\n readonly from?: never;\n readonly to: string;\n} | {\n readonly _tag: \"Removed\";\n readonly selector: string;\n readonly from: string;\n readonly to?: never;\n} | {\n readonly _tag: \"Changed\";\n readonly selector: string;\n readonly from: string;\n readonly to: string;\n};\nexport function addedConfigField(selector: string, to: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Added\", selector, to });\n}\nexport function removedConfigField(selector: string, from: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Removed\", selector, from });\n}\nexport function changedConfigField(selector: string, from: string, to: string): ConfigFieldDelta {\n return Object.freeze({ _tag: \"Changed\", selector, from, to });\n}\nfunction freezeJson<Value extends JsonValue>(value: Value): Value {\n if (value === null || typeof value !== \"object\")\n return value;\n if (Array.isArray(value)) {\n return Object.freeze(value.map((entry) => freezeJson(entry))) as Value;\n }\n return Object.freeze(Object.fromEntries(Object.entries(value).map(([key, entry]) => [key, freezeJson(entry)]))) as Value;\n}\nfunction freezeConfigIdentity(identity: ConfigIdentity): ConfigIdentity {\n const { sharedState, ...withoutSharedState } = identity;\n return Object.freeze({\n ...withoutSharedState,\n model: Object.freeze(identity.model),\n reasoningEffort: Object.freeze(identity.reasoningEffort),\n flags: freezeJson({ ...identity.flags }),\n plugins: freezeJson(identity.plugins),\n ...(sharedState === undefined ? {} : { sharedState }),\n sandboxLayer: freezeJson(identity.sandboxLayer),\n judge: identity.judge._tag === \"Unconfigured\"\n ? Object.freeze({ _tag: \"Unconfigured\" as const })\n : Object.freeze({\n _tag: \"Configured\" as const,\n model: Object.freeze(identity.judge.model),\n baseUrl: Object.freeze(identity.judge.baseUrl),\n apiKeyEnv: Object.freeze(identity.judge.apiKeyEnv),\n timeoutMs: Object.freeze(identity.judge.timeoutMs),\n }),\n agentInstalls: Object.freeze(identity.agentInstalls.map((entry) => freezeJson(entry))),\n });\n}\nfunction sameAgentIdentity(left: AgentIdentity, right: AgentIdentity): boolean {\n return left.agent === right.agent && left.version === right.version && left.revision === right.revision;\n}\nfunction installerIdentity(installer: AgentInstaller | undefined): JsonValue {\n if (installer === undefined)\n return { _tag: \"Missing\" };\n return {\n _tag: \"Matched\",\n identity: {\n agent: installer.identity.agent,\n version: installer.identity.version,\n revision: installer.identity.revision,\n },\n installMode: installer.installMode,\n platforms: installer.platforms === undefined\n ? { _tag: \"All\" }\n : { _tag: \"Listed\", values: [...installer.platforms] },\n };\n}\n/** 计划期一次性冻结全部 ensure/installer 配对;运行事实与 staged digest 不反写配置身份。 */\nexport function agentInstallPlansForRun(run: AgentRun): readonly JsonValue[] {\n const agent = run.agent;\n if (agent.kind === \"direct\")\n return Object.freeze([]);\n return Object.freeze(agent.ensure.map((ensure, index) => freezeJson({\n order: index,\n ensure: {\n agent: ensure.identity.agent,\n version: ensure.identity.version,\n revision: ensure.identity.revision,\n },\n installer: installerIdentity(agent.installers.find((candidate) => sameAgentIdentity(candidate.identity, ensure.identity))),\n })));\n}\nfunction declaredString(value: string | undefined): DeclaredConfigValue<string> {\n return value === undefined ? { _tag: \"Omitted\" } : { _tag: \"Configured\", value };\n}\nfunction judgeIdentity(judge: JudgeConfig | ResolvedJudgeConfig | undefined): JudgeConfigIdentity {\n return judge === undefined\n ? { _tag: \"Unconfigured\" }\n : {\n _tag: \"Configured\",\n model: declaredString(judge.model),\n baseUrl: declaredString(judge.baseUrl),\n apiKeyEnv: declaredString(judge.apiKeyEnv),\n timeoutMs: judge.timeoutMs === undefined ? { _tag: \"Omitted\" } : { _tag: \"Configured\", value: judge.timeoutMs },\n };\n}\n/** 本次解析后配置的身份投影。 */\nexport function configIdentityForRun(run: AgentRun, plan: LinkedRunPlan, judge: JudgeConfig | ResolvedJudgeConfig | undefined = run.judge): ConfigIdentity {\n return freezeConfigIdentity({\n agent: run.agent.name,\n model: declaredString(run.model),\n reasoningEffort: declaredString(run.reasoningEffort),\n flags: run.flags,\n plugins: run.pluginBehavior ?? [],\n sandboxReuse: run.sandboxReuse ?? false,\n ...(run.sharedState === undefined ? {} : { sharedState: run.sharedState.key }),\n sandboxLayer: sandboxLayerIdentityFor(plan.pair, \"experiment\"),\n judge: judgeIdentity(judge),\n agentInstalls: agentInstallPlansForRun(run),\n });\n}\n/**\n * 历史条目的同一份投影,从落盘重建。缺 `ExperimentRunInfo`(第三方 harness 写的结果)时\n * 配置面无从重算,返回 `undefined`——差异算不出就如实算不出,不猜。\n */\nexport function configIdentityFromResult(result: EvalResult): ConfigIdentity | undefined {\n const exp = result.experiment;\n if (exp === undefined)\n return undefined;\n return freezeConfigIdentity({\n agent: result.agent,\n model: declaredString(result.model),\n reasoningEffort: declaredString(exp.reasoningEffort),\n flags: exp.flags ?? {},\n plugins: exp.plugins ?? [],\n sandboxReuse: exp.sandboxReuse ?? false,\n ...(exp.sharedState === undefined ? {} : { sharedState: exp.sharedState.key }),\n sandboxLayer: exp.sandboxLayer,\n judge: judgeIdentity(exp.judge),\n agentInstalls: exp.agentInstalls,\n });\n}\n/**\n * 身份 → 字段路径表。真正未声明的配置不会生成对象键或字段路径。\n */\nfunction flatten(identity: ConfigIdentity): Map<string, JsonValue> {\n const out = new Map<string, JsonValue>();\n const put = (path: string, value: JsonValue): void => { out.set(path, value); };\n const putDeclared = <Value extends JsonValue>(path: string, value: DeclaredConfigValue<Value>): void => {\n if (value._tag === \"Configured\")\n put(path, value.value);\n };\n put(\"agent\", identity.agent);\n putDeclared(\"model\", identity.model);\n putDeclared(\"reasoningEffort\", identity.reasoningEffort);\n put(\"sandboxReuse\", identity.sandboxReuse);\n if (identity.sharedState !== undefined)\n put(\"sharedState.key\", identity.sharedState);\n for (const [key, value] of Object.entries(identity.flags))\n put(`flags.${key}`, value);\n put(\"plugins\", identity.plugins);\n put(\"sandboxLayer\", identity.sandboxLayer);\n if (identity.judge._tag === \"Configured\") {\n putDeclared(\"judge.model\", identity.judge.model);\n putDeclared(\"judge.baseUrl\", identity.judge.baseUrl);\n putDeclared(\"judge.apiKeyEnv\", identity.judge.apiKeyEnv);\n putDeclared(\"judge.timeoutMs\", identity.judge.timeoutMs);\n }\n put(\"agentInstalls\", [...identity.agentInstalls]);\n return out;\n}\n/**\n * 身份的字段路径投影,供 manifest 的配置面落盘(见 `runner/manifest.ts`)。与差异比对读的是\n * 同一个 `flatten`:清单里指得出的路径,`--accept config:<路径>` 就授权得了,两侧不可能分叉。\n */\nexport function configIdentityPaths(identity: ConfigIdentity): Array<[\n string,\n JsonValue\n]> {\n return [...flatten(identity)];\n}\n/** 值的字符串投影:差异明细与 `carriedAccepting` 留痕共用完整值,有界呈现是人读 renderer(`feedback/human.ts`)的职责,不在构造点做。 */\nfunction serializeValue(value: JsonValue): string {\n return typeof value === \"string\" ? value : JSON.stringify(value);\n}\n/**\n * 历史侧与本次侧的字段级差异,按 selector 字典序。键的增删同样是一条差异。\n */\nexport function configDeltas(historical: ConfigIdentity, current: ConfigIdentity): ConfigFieldDelta[] {\n const from = flatten(historical);\n const to = flatten(current);\n const paths = [...new Set([...from.keys(), ...to.keys()])].sort();\n const out: ConfigFieldDelta[] = [];\n for (const path of paths) {\n const hasFrom = from.has(path);\n const hasTo = to.has(path);\n if (hasFrom && hasTo && JSON.stringify(from.get(path)) === JSON.stringify(to.get(path)))\n continue;\n const fromValue = from.get(path);\n const toValue = to.get(path);\n if (hasFrom && fromValue === undefined)\n throw new Error(`Missing historical config value for ${path}.`);\n if (hasTo && toValue === undefined)\n throw new Error(`Missing current config value for ${path}.`);\n const selector = `config:${path}`;\n if (!hasFrom)\n out.push(addedConfigField(selector, serializeValue(toValue!)));\n else if (!hasTo)\n out.push(removedConfigField(selector, serializeValue(fromValue!)));\n else\n out.push(changedConfigField(selector, serializeValue(fromValue!), serializeValue(toValue!)));\n }\n return out;\n}\n/**\n * 反事实身份:把本次身份里**被授权的那些字段**换回历史值,其余原样。\n *\n * 换出来的身份再算一次指纹,与历史条目落盘的那个相等,才证明「两侧只差这些被授权的字段」——\n * 授权因此不是绕开判据,而是把判据挪到一个明确写下来的口径上重算一次。\n *\n * `sandbox` / `judge` 是整对象进哈希的分组:键在不在本身改变字节,逐字段拼回去会造出两侧都\n * 不存在的形状。分组内**每一条**差异都被授权才整体换回历史对象,否则保持本次值——那样指纹\n * 自然对不上,条目照常重跑,不会静默跨过没被授权的那半。\n */\nexport function counterfactualConfigIdentity(current: ConfigIdentity, historical: ConfigIdentity, accepted: ReadonlySet<string>): ConfigIdentity {\n const differing = new Set(configDeltas(historical, current).map((d) => d.selector));\n const flags: globalThis.Record<string, JsonValue> = { ...current.flags };\n for (const selector of accepted) {\n if (!selector.startsWith(\"config:flags.\"))\n continue;\n const key = selector.slice(\"config:flags.\".length);\n if (Object.hasOwn(historical.flags, key)) {\n const value = historical.flags[key];\n if (value === undefined)\n throw new Error(`Missing historical flag value for ${key}.`);\n flags[key] = value;\n }\n else\n delete flags[key];\n }\n let sandboxLayer = current.sandboxLayer;\n let plugins = current.plugins;\n let judge = current.judge;\n let agentInstalls = current.agentInstalls;\n const rollbackGroups: readonly (\"sandboxLayer\" | \"plugins\" | \"judge\" | \"agentInstalls\")[] = [\n \"sandboxLayer\", \"plugins\", \"judge\", \"agentInstalls\",\n ];\n for (const group of rollbackGroups) {\n const paths = [...differing].filter((selector) => selector === `config:${group}` || selector.startsWith(`config:${group}.`));\n if (paths.length === 0 || !paths.every((selector) => accepted.has(selector)))\n continue;\n if (group === \"sandboxLayer\")\n sandboxLayer = historical.sandboxLayer;\n else if (group === \"plugins\")\n plugins = historical.plugins;\n else if (group === \"judge\")\n judge = historical.judge;\n else\n agentInstalls = historical.agentInstalls;\n }\n const sharedState = accepted.has(\"config:sharedState.key\") ? historical.sharedState : current.sharedState;\n return freezeConfigIdentity({\n agent: accepted.has(\"config:agent\") ? historical.agent : current.agent,\n model: accepted.has(\"config:model\") ? historical.model : current.model,\n reasoningEffort: accepted.has(\"config:reasoningEffort\")\n ? historical.reasoningEffort\n : current.reasoningEffort,\n flags,\n plugins,\n sandboxReuse: accepted.has(\"config:sandboxReuse\") ? historical.sandboxReuse : current.sandboxReuse,\n ...(sharedState === undefined ? {} : { sharedState }),\n sandboxLayer,\n judge,\n agentInstalls,\n });\n}\n"]}
|
|
@@ -5,8 +5,8 @@ import type { AgentRun } from "./types.cjs";
|
|
|
5
5
|
* 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与
|
|
6
6
|
* docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* 可选配置必须真的省略键,而不是写入 `undefined` 或一个 Omitted 哨兵;否则未声明配置会
|
|
9
|
+
* 无端改变基础 configHash。新增公开配置字段时只在这里裁决一次「进不进 configHash」。
|
|
10
10
|
*/
|
|
11
11
|
export interface ConfigIdentity {
|
|
12
12
|
readonly agent: string;
|
|
@@ -16,6 +16,8 @@ export interface ConfigIdentity {
|
|
|
16
16
|
/** Credential-free Experiment Plugin and receiver behavior. */
|
|
17
17
|
readonly plugins: JsonValue;
|
|
18
18
|
readonly sandboxReuse: boolean;
|
|
19
|
+
/** Stable public key for the shared-state mutex, never a secret or stored state. */
|
|
20
|
+
readonly sharedState?: string;
|
|
19
21
|
/** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */
|
|
20
22
|
readonly sandboxLayer: JsonValue;
|
|
21
23
|
readonly judge: JudgeConfigIdentity;
|
|
@@ -5,8 +5,8 @@ import type { AgentRun } from "./types.mjs";
|
|
|
5
5
|
* 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与
|
|
6
6
|
* docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* 可选配置必须真的省略键,而不是写入 `undefined` 或一个 Omitted 哨兵;否则未声明配置会
|
|
9
|
+
* 无端改变基础 configHash。新增公开配置字段时只在这里裁决一次「进不进 configHash」。
|
|
10
10
|
*/
|
|
11
11
|
export interface ConfigIdentity {
|
|
12
12
|
readonly agent: string;
|
|
@@ -16,6 +16,8 @@ export interface ConfigIdentity {
|
|
|
16
16
|
/** Credential-free Experiment Plugin and receiver behavior. */
|
|
17
17
|
readonly plugins: JsonValue;
|
|
18
18
|
readonly sandboxReuse: boolean;
|
|
19
|
+
/** Stable public key for the shared-state mutex, never a secret or stored state. */
|
|
20
|
+
readonly sharedState?: string;
|
|
19
21
|
/** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */
|
|
20
22
|
readonly sandboxLayer: JsonValue;
|
|
21
23
|
readonly judge: JudgeConfigIdentity;
|
|
@@ -5,8 +5,8 @@ import type { AgentRun } from "./types.js";
|
|
|
5
5
|
* 一次运行的**配置身份**:`computeConfigHash` 的哈希输入,字段集合与
|
|
6
6
|
* docs/feature/experiments/cache.md「指纹:两个哈希嵌套」逐字对应。
|
|
7
7
|
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
8
|
+
* 可选配置必须真的省略键,而不是写入 `undefined` 或一个 Omitted 哨兵;否则未声明配置会
|
|
9
|
+
* 无端改变基础 configHash。新增公开配置字段时只在这里裁决一次「进不进 configHash」。
|
|
10
10
|
*/
|
|
11
11
|
export interface ConfigIdentity {
|
|
12
12
|
readonly agent: string;
|
|
@@ -16,6 +16,8 @@ export interface ConfigIdentity {
|
|
|
16
16
|
/** Credential-free Experiment Plugin and receiver behavior. */
|
|
17
17
|
readonly plugins: JsonValue;
|
|
18
18
|
readonly sandboxReuse: boolean;
|
|
19
|
+
/** Stable public key for the shared-state mutex, never a secret or stored state. */
|
|
20
|
+
readonly sharedState?: string;
|
|
19
21
|
/** Experiment 作者 layer 身份;物理 provider plan 属于逐 Eval fingerprint,不进入 Run 级身份。 */
|
|
20
22
|
readonly sandboxLayer: JsonValue;
|
|
21
23
|
readonly judge: JudgeConfigIdentity;
|