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
package/dist/runner/ledger.cjs
CHANGED
|
@@ -2,6 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.LEDGER_GIT_DIR = void 0;
|
|
4
4
|
exports.createChangeLedger = createChangeLedger;
|
|
5
|
+
// 变更分类账(私有 git ledger):回答「**agent** 改了什么」,不是「workspace 相对空目录变了什么」。
|
|
6
|
+
// 契约见 docs/feature/sandbox/architecture.md「变更归因:send 窗口与分类账」:
|
|
7
|
+
// - ledger 的 git 目录在沙箱内、workdir 外(runner 私有路径),以 workdir 为 work-tree——
|
|
8
|
+
// workdir 保持素净:agent 看不到 runner 的 .git,eval 需要真实 git repo 时自己 git init,
|
|
9
|
+
// agent 在 workdir 里的任何 git 操作都碰不到分类账。
|
|
10
|
+
// - 三类 commit 时点:锚点一笔(workspace.baseline);每次 t.send() 进入前 workdir 有未记录
|
|
11
|
+
// 变化就落一笔 eval 归因;t.send() 返回后落一笔 agent 归因(send 窗口内的全部变化)。
|
|
12
|
+
// - 归因排除清单 runner 私有、锚点时冻结:项目自己的 .gitignore 不参与归因判断(add -f 绕过),
|
|
13
|
+
// 排除靠 pathspec,include 显式打洞加回。
|
|
14
|
+
// - agent 归因增量 = 逐窗口 delta 序列(DiffWindow[]),不做跨窗口压缩。
|
|
15
|
+
const node_crypto_1 = require("node:crypto");
|
|
5
16
|
const backend_ts_1 = require("../sandbox/backend.cjs");
|
|
6
17
|
const ledger_paths_ts_1 = require("../sandbox/ledger-paths.cjs");
|
|
7
18
|
/**
|
|
@@ -55,15 +66,22 @@ function canonicalPolicyEntries(entries, name) {
|
|
|
55
66
|
return Object.freeze([...new Set(entries)].sort(compareAscii));
|
|
56
67
|
}
|
|
57
68
|
/**
|
|
58
|
-
* 单个 send
|
|
69
|
+
* 单个 send 窗口的导出扫描安全上限。File Changes 的 10,000-change durable 上限由 collector
|
|
70
|
+
* 保留确定性前缀并写 collection-cap-reached;导出层必须先把更大的候选集合交给 collector,
|
|
71
|
+
* 不能在同一个 10,000 边界提前把已知 partial 证据降格成 unavailable。
|
|
59
72
|
* 字节预算只数**真正要传输的文本** before/after:二进制与超过单文件阈值的文本不内联内容、
|
|
60
73
|
* 只记字节数(WindowChange.elided),因此不占预算——编译产物型窗口(成百上千个 .o 加几个大
|
|
61
74
|
* 文本)不该因为「按尺寸计」被判越界。
|
|
62
75
|
*/
|
|
63
|
-
const
|
|
64
|
-
const
|
|
76
|
+
const MAX_EXPORTED_WINDOW_PATHS = 100000;
|
|
77
|
+
const MAX_EXPORTED_WINDOW_TEXT_BYTES = 256 * 1024 * 1024;
|
|
65
78
|
/** 单个文本 blob 的内联阈值:任一侧超过它,该条目按二进制同款处理(记字节数、内容省略)。 */
|
|
66
79
|
const MAX_FILE_TEXT_BYTES = 1024 * 1024;
|
|
80
|
+
/** Provider 文件 API 的单次安全读取边界,以及整次 Attempt 导出的硬上限。 */
|
|
81
|
+
const EXPORT_PART_BYTES = 4000000;
|
|
82
|
+
const MAX_EXPORT_BYTES = 512 * 1024 * 1024;
|
|
83
|
+
const MAX_EXPORT_PARTS = Math.ceil(MAX_EXPORT_BYTES / EXPORT_PART_BYTES);
|
|
84
|
+
const EXPORT_MANIFEST_HEADER = "niceeval-ledger-export-parts v1";
|
|
67
85
|
/**
|
|
68
86
|
* 整相导出:一条 POSIX shell 命令枚举**全部** agent 窗口并把证据写进沙箱内导出文件,宿主随后
|
|
69
87
|
* 经文件通道一次下载——provider 往返数与窗口数、文件数都无关。对沙箱环境的全部要求是 git 与
|
|
@@ -99,7 +117,7 @@ function buildExportScript(exportDir) {
|
|
|
99
117
|
// 非 -z 的 diff-tree 把特殊路径引号转义成单行,一行 = 一个条目:wc -l 即路径数,awk 列取 sha 不碰路径。
|
|
100
118
|
' git diff-tree -r --no-renames "$hash^" "$hash" > "$D/dt.txt"',
|
|
101
119
|
' n=$(($(wc -l < "$D/dt.txt")))',
|
|
102
|
-
` [ "$n" -le ${
|
|
120
|
+
` [ "$n" -le ${MAX_EXPORTED_WINDOW_PATHS} ] || fail "niceeval diff window contains $n paths; export scan limit is ${MAX_EXPORTED_WINDOW_PATHS}; narrow defineEval({ diff }) include/ignore rules"`,
|
|
103
121
|
' git diff-tree -r --no-renames --numstat "$hash^" "$hash" > "$D/ns.txt"',
|
|
104
122
|
// 全部 blob 出现次数(before + after,零 sha = 无此侧,排除)→ 逐次尺寸核算。
|
|
105
123
|
" awk '$3 !~ /^0+$/ { print $3 } $4 !~ /^0+$/ { print $4 }' \"$D/dt.txt\" > \"$D/occ.txt\"",
|
|
@@ -111,7 +129,7 @@ function buildExportScript(exportDir) {
|
|
|
111
129
|
// 也不计入窗口预算——它们只出字节数(宿主据同一份 sizes 判成 elided)。
|
|
112
130
|
` awk -v LIMIT=${MAX_FILE_TEXT_BYTES} -v TOTAL="$D/total.txt" 'NR==FNR { sz[$1] = $3; next } $1 == "T" { b = $2; a = $3; if (b !~ /^0+$/ && sz[b] > LIMIT) next; if (a !~ /^0+$/ && sz[a] > LIMIT) next; if (b !~ /^0+$/ && !(b in seen)) { seen[b] = 1; total += sz[b]; print b } if (a !~ /^0+$/ && !(a in seen)) { seen[a] = 1; total += sz[a]; print a } } END { print total+0 > TOTAL }' "$D/sizes.txt" "$D/entries.txt" > "$D/text.txt"`,
|
|
113
131
|
' bytes=$(cat "$D/total.txt")',
|
|
114
|
-
` [ "$bytes" -le ${
|
|
132
|
+
` [ "$bytes" -le ${MAX_EXPORTED_WINDOW_TEXT_BYTES} ] || fail "niceeval diff window transfers $bytes text blob bytes; export scan limit is ${MAX_EXPORTED_WINDOW_TEXT_BYTES}; narrow defineEval({ diff }) include/ignore rules"`,
|
|
115
133
|
' git cat-file --batch < "$D/text.txt" > "$D/blobs.bin"',
|
|
116
134
|
' git diff-tree -r --no-renames -z "$hash^" "$hash" > "$D/dtz.bin"',
|
|
117
135
|
' git diff-tree -r --no-renames --numstat -z "$hash^" "$hash" > "$D/nsz.bin"',
|
|
@@ -121,9 +139,31 @@ function buildExportScript(exportDir) {
|
|
|
121
139
|
' emit sizes "$D/sizes.txt"',
|
|
122
140
|
' emit blobs "$D/blobs.bin"',
|
|
123
141
|
'done < "$D/log.txt"',
|
|
124
|
-
//
|
|
125
|
-
//
|
|
126
|
-
'
|
|
142
|
+
// Provider 文件 API 可能拒绝超过 4 MiB 的单对象读取。这里按固定原始字节切片,并在最后
|
|
143
|
+
// 原子发布 manifest;宿主只接受连续序号、精确长度和 Git blob checksum。
|
|
144
|
+
'total=$(($(wc -c < "$OUT")))',
|
|
145
|
+
` [ "$total" -le ${MAX_EXPORT_BYTES} ] || fail "niceeval ledger export contains $total bytes; attempt export limit is ${MAX_EXPORT_BYTES}"`,
|
|
146
|
+
`parts=$(( (total + ${EXPORT_PART_BYTES} - 1) / ${EXPORT_PART_BYTES} ))`,
|
|
147
|
+
` [ "$parts" -le ${MAX_EXPORT_PARTS} ] || fail "niceeval ledger export needs $parts parts; attempt part limit is ${MAX_EXPORT_PARTS}"`,
|
|
148
|
+
'MANIFEST_TMP=$D/manifest.tmp',
|
|
149
|
+
'MANIFEST=$D/manifest.txt',
|
|
150
|
+
`printf "%s\\ntotal %s\\nparts %s\\n" "${EXPORT_MANIFEST_HEADER}" "$total" "$parts" > "$MANIFEST_TMP"`,
|
|
151
|
+
'i=0',
|
|
152
|
+
'while [ "$i" -lt "$parts" ]; do',
|
|
153
|
+
' suffix=$(printf "%06d" "$i")',
|
|
154
|
+
' part=$D/export.part.$suffix',
|
|
155
|
+
` dd if="$OUT" of="$part" bs=${EXPORT_PART_BYTES} skip="$i" count=1 2>/dev/null`,
|
|
156
|
+
' size=$(($(wc -c < "$part")))',
|
|
157
|
+
' oid=$(git hash-object --no-filters "$part")',
|
|
158
|
+
' printf "part %s %s %s\\n" "$suffix" "$size" "$oid" >> "$MANIFEST_TMP"',
|
|
159
|
+
' i=$((i + 1))',
|
|
160
|
+
'done',
|
|
161
|
+
'mv "$MANIFEST_TMP" "$MANIFEST"',
|
|
162
|
+
'rm -f "$OUT"',
|
|
163
|
+
// root ledger commands may create private exports with a restrictive umask. These artifacts are
|
|
164
|
+
// outside workdir and are deleted immediately after the provider file channel consumes them.
|
|
165
|
+
'chmod 0644 "$MANIFEST"',
|
|
166
|
+
'for part in "$D"/export.part.*; do [ -f "$part" ] || continue; chmod 0644 "$part"; done',
|
|
127
167
|
].join("\n");
|
|
128
168
|
}
|
|
129
169
|
/** 每条 git 命令都带上私有 GIT_DIR + workdir work-tree;项目/全局 gitignore 一律不参与。 */
|
|
@@ -316,10 +356,82 @@ async function createChangeLedger(sandbox, opts) {
|
|
|
316
356
|
};
|
|
317
357
|
}
|
|
318
358
|
async function exportAgentWindows(sandbox, commandOptions, exportDir, rootCommands) {
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
359
|
+
try {
|
|
360
|
+
const result = await sandbox.runShell(buildExportScript(exportDir), commandOptions);
|
|
361
|
+
ensureCommandSucceeded(result, "export agent windows", rootCommands);
|
|
362
|
+
const manifest = parseExportManifest(await sandbox.readText(`${exportDir}/manifest.txt`));
|
|
363
|
+
const chunks = [];
|
|
364
|
+
for (const part of manifest.parts) {
|
|
365
|
+
const bytes = Buffer.from(await sandbox.readBytes(`${exportDir}/export.part.${part.suffix}`));
|
|
366
|
+
if (bytes.byteLength !== part.bytes) {
|
|
367
|
+
throw new Error(`niceeval ledger export: part ${part.suffix} has ${bytes.byteLength} bytes, expected ${part.bytes}`);
|
|
368
|
+
}
|
|
369
|
+
const algorithm = part.oid.length === 40 ? "sha1" : "sha256";
|
|
370
|
+
const actual = (0, node_crypto_1.createHash)(algorithm)
|
|
371
|
+
.update(`blob ${bytes.byteLength}\0`, "utf8")
|
|
372
|
+
.update(bytes)
|
|
373
|
+
.digest("hex");
|
|
374
|
+
if (actual !== part.oid) {
|
|
375
|
+
throw new Error(`niceeval ledger export: checksum mismatch for part ${part.suffix}`);
|
|
376
|
+
}
|
|
377
|
+
chunks.push(bytes);
|
|
378
|
+
}
|
|
379
|
+
const payload = Buffer.concat(chunks, manifest.totalBytes);
|
|
380
|
+
if (payload.byteLength !== manifest.totalBytes) {
|
|
381
|
+
throw new Error("niceeval ledger export: assembled payload length mismatch");
|
|
382
|
+
}
|
|
383
|
+
return parseExportPayload(payload);
|
|
384
|
+
}
|
|
385
|
+
finally {
|
|
386
|
+
await sandbox.runShell(`rm -rf ${shellQuote(exportDir)}`, commandOptions).catch(() => undefined);
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
function manifestInteger(text, label, maximum) {
|
|
390
|
+
if (!/^(?:0|[1-9][0-9]*)$/.test(text)) {
|
|
391
|
+
throw new Error(`niceeval ledger export: invalid manifest ${label}`);
|
|
392
|
+
}
|
|
393
|
+
const value = Number(text);
|
|
394
|
+
if (!Number.isSafeInteger(value) || value < 0 || value > maximum) {
|
|
395
|
+
throw new Error(`niceeval ledger export: manifest ${label} exceeds its limit`);
|
|
396
|
+
}
|
|
397
|
+
return value;
|
|
398
|
+
}
|
|
399
|
+
function parseExportManifest(text) {
|
|
400
|
+
const lines = text.endsWith("\n") ? text.slice(0, -1).split("\n") : text.split("\n");
|
|
401
|
+
if (lines[0] !== EXPORT_MANIFEST_HEADER) {
|
|
402
|
+
throw new Error("niceeval ledger export: unsupported manifest header");
|
|
403
|
+
}
|
|
404
|
+
const totalMatch = /^total ([0-9]+)$/.exec(lines[1] ?? "");
|
|
405
|
+
const partsMatch = /^parts ([0-9]+)$/.exec(lines[2] ?? "");
|
|
406
|
+
if (totalMatch === null || partsMatch === null) {
|
|
407
|
+
throw new Error("niceeval ledger export: malformed manifest summary");
|
|
408
|
+
}
|
|
409
|
+
const totalBytes = manifestInteger(totalMatch[1], "total bytes", MAX_EXPORT_BYTES);
|
|
410
|
+
const partCount = manifestInteger(partsMatch[1], "part count", MAX_EXPORT_PARTS);
|
|
411
|
+
const expectedPartCount = Math.ceil(totalBytes / EXPORT_PART_BYTES);
|
|
412
|
+
if (partCount !== expectedPartCount || lines.length !== partCount + 3) {
|
|
413
|
+
throw new Error("niceeval ledger export: manifest part count mismatch");
|
|
414
|
+
}
|
|
415
|
+
const parts = [];
|
|
416
|
+
let retainedBytes = 0;
|
|
417
|
+
for (let index = 0; index < partCount; index += 1) {
|
|
418
|
+
const match = /^part ([0-9]{6}) ([0-9]+) ([0-9a-f]{40}|[0-9a-f]{64})$/.exec(lines[index + 3] ?? "");
|
|
419
|
+
const suffix = String(index).padStart(6, "0");
|
|
420
|
+
if (match === null || match[1] !== suffix) {
|
|
421
|
+
throw new Error(`niceeval ledger export: invalid or non-contiguous part ${suffix}`);
|
|
422
|
+
}
|
|
423
|
+
const expectedBytes = Math.min(EXPORT_PART_BYTES, totalBytes - retainedBytes);
|
|
424
|
+
const bytes = manifestInteger(match[2], `part ${suffix} bytes`, EXPORT_PART_BYTES);
|
|
425
|
+
if (bytes !== expectedBytes || bytes === 0) {
|
|
426
|
+
throw new Error(`niceeval ledger export: invalid length for part ${suffix}`);
|
|
427
|
+
}
|
|
428
|
+
retainedBytes += bytes;
|
|
429
|
+
parts.push(Object.freeze({ suffix, bytes, oid: match[3] }));
|
|
430
|
+
}
|
|
431
|
+
if (retainedBytes !== totalBytes) {
|
|
432
|
+
throw new Error("niceeval ledger export: manifest total length mismatch");
|
|
433
|
+
}
|
|
434
|
+
return Object.freeze({ totalBytes, parts: Object.freeze(parts) });
|
|
323
435
|
}
|
|
324
436
|
function ensureCommandSucceeded(result, operation, rootCommands, permissionGuidance) {
|
|
325
437
|
if (result.exitCode === 0)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":";;;AA4QA,gDA+EC;AA/UD,sDAAoE;AACpE,gEAAoF;AACpF;;;;;GAKG;AACU,QAAA,cAAc,GAAG,wCAAsB,CAAC;AACrD,sDAAsD;AACtD,MAAM,UAAU,GAAG,8BAA8B,CAAC;AAClD;;oBAEoB;AACpB,MAAM,gBAAgB,GAAG;IACrB,MAAM;IACN,cAAc;IACd,OAAO;IACP,MAAM;IACN,OAAO;IACP,QAAQ;IACR,WAAW;IACX,UAAU;IACV,QAAQ;IACR,aAAa;IACb,MAAM;IACN,OAAO;IACP,SAAS;IACT,OAAO;IACP,aAAa;CAChB,CAAC;AACF,MAAM,kBAAkB,GAAG,GAAG,CAAC;AAC/B,MAAM,2BAA2B,GAAG,IAAI,CAAC;AACzC,MAAM,aAAa,GAAG,IAAI,WAAW,EAAE,CAAC;AACxC,SAAS,YAAY,CAAC,IAAY,EAAE,KAAa;IAC7C,OAAO,IAAI,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACtD,CAAC;AACD,0GAA0G;AAC1G,SAAS,sBAAsB,CAAC,OAA0B,EAAE,IAA0B;IAClF,IAAI,OAAO,CAAC,MAAM,GAAG,kBAAkB,EAAE,CAAC;QACtC,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,wBAAwB,kBAAkB,UAAU,CAAC,CAAC;IACtG,CAAC;IACD,KAAK,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC;QAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC5B,MAAM,IAAI,SAAS,CAAC,wBAAwB,IAAI,IAAI,KAAK,oBAAoB,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,UAAU,GAAG,2BAA2B,EAAE,CAAC;YACvE,MAAM,IAAI,KAAK,CAAC,wBAAwB,IAAI,IAAI,KAAK,aAAa,2BAA2B,cAAc,CAAC,CAAC;QACjH,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC;AACnE,CAAC;AACD;;;;;GAKG;AACH,MAAM,gBAAgB,GAAG,KAAK,CAAC;AAC/B,MAAM,qBAAqB,GAAG,EAAE,GAAG,IAAI,GAAG,IAAI,CAAC;AAC/C,qDAAqD;AACrD,MAAM,mBAAmB,GAAG,IAAI,GAAG,IAAI,CAAC;AACxC;;;;;;;;;;;;;GAaG;AACH,SAAS,iBAAiB,CAAC,SAAiB;IACxC,OAAO;QACH,SAAS;QACT,sEAAsE;QACtE,uDAAuD;QACvD,KAAK,UAAU,CAAC,SAAS,CAAC,EAAE;QAC5B,8BAA8B;QAC9B,mBAAmB;QACnB,YAAY;QACZ,6CAA6C;QAC7C,4DAA4D;QAC5D,iGAAiG;QACjG,mDAAmD;QACnD,6BAA6B;QAC7B,oBAAoB;QACpB,sBAAsB;QACtB,sDAAsD;QACtD,2BAA2B;QAC3B,sEAAsE;QACtE,gEAAgE;QAChE,iCAAiC;QACjC,gBAAgB,gBAAgB,gEAAgE,gBAAgB,GAAG;QACnH,0EAA0E;QAC1E,uDAAuD;QACvD,4FAA4F;QAC5F,8DAA8D;QAC9D,sGAAsG;QACtG,gEAAgE;QAChE,wJAAwJ;QACxJ,+CAA+C;QAC/C,6CAA6C;QAC7C,kBAAkB,mBAAmB,0YAA0Y;QAC/a,+BAA+B;QAC/B,oBAAoB,qBAAqB,+EAA+E,qBAAqB,qDAAqD;QAClM,yDAAyD;QACzD,oEAAoE;QACpE,8EAA8E;QAC9E,uDAAuD;QACvD,8BAA8B;QAC9B,6BAA6B;QAC7B,6BAA6B;QAC7B,6BAA6B;QAC7B,qBAAqB;QACrB,mGAAmG;QACnG,8FAA8F;QAC9F,mBAAmB;KACtB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AAwBD,wEAAwE;AACxE,SAAS,MAAM,CAAC,OAAgB,EAAE,MAAc;IAC5C,OAAO;QACH,OAAO,EAAE,MAAM;QACf,aAAa,EAAE,OAAO,CAAC,OAAO;QAC9B,eAAe,EAAE,UAAU;QAC3B,gBAAgB,EAAE,oBAAoB;QACtC,kBAAkB,EAAE,UAAU;QAC9B,mBAAmB,EAAE,oBAAoB;QACzC,qFAAqF;QACrF,mBAAmB,EAAE,GAAG;QACxB,iBAAiB,EAAE,WAAW;QAC9B,gBAAgB,EAAE,GAAG;QACrB,gBAAgB,EAAE,gBAAgB;QAClC,kBAAkB,EAAE,WAAW;QAC/B,mBAAmB,EAAE,GAAG;QACxB,IAAI,EAAE,MAAM;KACf,CAAC;AACN,CAAC;AACD,SAAS,UAAU,CAAC,CAAS;IACzB,OAAO,IAAI,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC;AAC7C,CAAC;AACD;;;;GAIG;AACH,SAAS,6BAA6B;IAClC,OAAO;QACH,4CAA4C;QAC5C,uDAAuD;QACvD,aAAa;QACb,2CAA2C;QAC3C,YAAY;QACZ,6BAA6B;QAC7B,0BAA0B;QAC1B,gDAAgD;QAChD,oEAAoE;QACpE,sDAAsD;QACtD,uBAAuB;QACvB,+BAA+B;QAC/B,iCAAiC;QACjC,iCAAiC;QACjC,sDAAsD;QACtD,oGAAoG;QACpG,2DAA2D;QAC3D,UAAU;QACV,yBAAyB;QACzB,UAAU;QACV,QAAQ;QACR,iBAAiB;QACjB,6FAA6F;QAC7F,oGAAoG;QACpG,yBAAyB;KAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AACD,SAAS,6BAA6B;IAClC,OAAO;QACH,4CAA4C;QAC5C,aAAa;QACb,+BAA+B;QAC/B,kEAAkE;QAClE,gBAAgB;QAChB,+BAA+B;QAC/B,kCAAkC;QAClC,qDAAqD;QACrD,wEAAwE;QACxE,qCAAqC;QACrC,qDAAqD;QACrD,UAAU;QACV,UAAU;QACV,2BAA2B;QAC3B,IAAI;QACJ,gGAAgG;QAChG,8BAA8B;QAC9B,4EAA4E;QAC5E,gBAAgB;QAChB,sBAAsB;QACtB,4BAA4B;QAC5B,kCAAkC;QAClC,iCAAiC;QACjC,wEAAwE;QACxE,6DAA6D;QAC7D,UAAU;QACV,UAAU;QACV,+BAA+B;QAC/B,IAAI;QACJ,yBAAyB;KAC5B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjB,CAAC;AACD;;;GAGG;AACH,SAAS,kBAAkB,CAAC,OAAe,EAAE,OAAgB;IACzD,IAAI,UAAU,GAAG,OAAO,CAAC;IACzB,OAAO,UAAU,CAAC,UAAU,CAAC,IAAI,CAAC;QAC9B,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC;QAC1B,UAAU,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACrC,UAAU,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAC5C,IAAI,CAAC,UAAU;QACX,OAAO,EAAE,CAAC;IACd,MAAM,IAAI,GAAG,UAAU,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,UAAU,EAAE,CAAC;IACxE,MAAM,KAAK,GAAG,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,GAAG,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC/E,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,SAAS,CAAC;IACtD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,KAAK,GAAG,KAAK,EAAE,CAAC,CAAC;AAClE,CAAC;AACD,2EAA2E;AACpE,KAAK,UAAU,kBAAkB,CAAC,OAAgB,EAAE,IAAoB;IAC3E,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,EAAE,OAAO,IAAI,EAAE,EAAE,SAAS,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,sBAAsB,CAAC,IAAI,EAAE,MAAM,IAAI,EAAE,EAAE,QAAQ,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,OAAO,CAAC,CAAC;IACnD,mDAAmD;IACnD,wDAAwD;IACxD,wDAAwD;IACxD,MAAM,KAAK,GAAG,IAAA,gCAAc,EAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,KAAK,EAAE,MAAM,IAAI,sBAAc,CAAC;IAC/C,MAAM,SAAS,GAAG,KAAK,EAAE,SAAS,IAAI,UAAU,CAAC;IACjD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACpC,MAAM,YAAY,GAAG,IAAA,wCAA2B,EAAC,OAAO,CAAC,CAAC;IAC1D,2DAA2D;IAC3D,2DAA2D;IAC3D,MAAM,cAAc,GAAG,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,MAAe,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,CAAC;IAC/E,MAAM,eAAe,GAAG,YAAY,CAAC,CAAC,CAAC,OAAO,6BAA6B,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACrF,MAAM,iBAAiB,GAAG,YAAY,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;IAC5E,IAAI,WAA+B,CAAC;IACpC,IAAI,YAAY,EAAE,CAAC;QACf,8FAA8F;QAC9F,8EAA8E;QAC9E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,kBAAkB,EAAE,EAAE,GAAG,EAAE,CAAC,CAAC;QACrE,sBAAsB,CAAC,QAAQ,EAAE,6CAA6C,EAAE,KAAK,CAAC,CAAC;QACvF,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IACD,+DAA+D;IAC/D,0EAA0E;IAC1E,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAChH,8DAA8D;IAC9D,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACjH,MAAM,UAAU,GAAG,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,0DAA0D,YAAY,yBAAyB,CAAC,CAAC,CAAC,EAAE,CAAC;IAClJ,MAAM,cAAc,GAAG,uGAAuG;QAC1H,uSAAuS,CAAC;IAC5S,MAAM,MAAM,GAAG,sDAAsD,YAAY,GAAG,UAAU,GAAG,cAAc,EAAE,CAAC;IAClH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ;IACrC,2FAA2F;IAC3F,gGAAgG;IAChG,aAAa,UAAU,CAAC,MAAM,CAAC,2BAA2B,UAAU,CAAC,MAAM,CAAC,MAAM;QAC9E,gBAAgB,MAAM,QAAQ,MAAM,iDAAiD;QACrF,+FAA+F;QAC/F,eAAe,EAAE;QACjB,GAAG,cAAc;KACpB,CAAC,CAAC;IACH,sBAAsB,CAAC,MAAM,EAAE,6BAA6B,EAAE,YAAY,CAAC,CAAC;IAC5E,OAAO;QACH,qBAAqB,EAAE,WAAW,KAAK,GAAG;QAC1C,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;YACvB,aAAa,EAAE,6CAAsD;YACrE,OAAO,EAAE,QAAQ;YACjB,MAAM,EAAE,OAAO;SAClB,CAAC;QACF,KAAK,CAAC,gBAAgB,CAAC,KAAa;YAChC,uCAAuC;YACvC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,sDAAsD,UAAU,CAAC,QAAQ,KAAK,EAAE,CAAC,IAAI,iBAAiB,EAAE,EAAE;gBACrJ,GAAG,cAAc;aACpB,CAAC,CAAC;YACH,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,CAAC,iBAAiB,CAAC,KAAa;YACjC,2DAA2D;YAC3D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,MAAM,sCAAsC,UAAU,CAAC,SAAS,KAAK,EAAE,CAAC,GAAG,iBAAiB,EAAE,EAAE,cAAc,CAAC,CAAC;YACzJ,sBAAsB,CAAC,MAAM,EAAE,uBAAuB,KAAK,EAAE,EAAE,YAAY,CAAC,CAAC;QACjF,CAAC;QACD,KAAK,CAAC,aAAa;YACf,OAAO,kBAAkB,CAAC,OAAO,EAAE,cAAc,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;QAChF,CAAC;QACD,KAAK,CAAC,aAAa;YACf,IAAI,WAAW,KAAK,GAAG,EAAE,CAAC;gBACtB,MAAM,IAAI,KAAK,CAAC,+KAA+K,CAAC,CAAC;YACrM,CAAC;YACD,4FAA4F;YAC5F,2FAA2F;YAC3F,0FAA0F;YAC1F,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,+CAA+C;gBACjF,iBAAiB,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,MAAM,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM;gBACvF,6BAA6B,EAAE,EAAE,cAAc,CAAC,CAAC;YACrD,sBAAsB,CAAC,MAAM,EAAE,wDAAwD,EAAE,YAAY,CAAC,CAAC;QAC3G,CAAC;KACJ,CAAC;AACN,CAAC;AACD,KAAK,UAAU,kBAAkB,CAAC,OAAgB,EAAE,cAGnD,EAAE,SAAiB,EAAE,YAAqB;IACvC,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,cAAc,CAAC,CAAC;IACpF,sBAAsB,CAAC,MAAM,EAAE,sBAAsB,EAAE,YAAY,CAAC,CAAC;IACrE,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,SAAS,CAAC,GAAG,SAAS,aAAa,CAAC,CAAC;IACnE,OAAO,kBAAkB,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;AACpD,CAAC;AACD,SAAS,sBAAsB,CAAC,MAG/B,EAAE,SAAiB,EAAE,YAAqB,EAAE,kBAA2B;IACpE,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC;QACrB,OAAO;IACX,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,UAAU,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,4CAA4C,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACjG,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;QAC3B,MAAM,QAAQ,GAAG,kBAAkB,IAAI,CAAC,YAAY;YAChD,CAAC,CAAC,0IAA0I;YAC5I,CAAC,CAAC,qMAAqM,CAAC,CAAC;QAC7M,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,iBAAiB,MAAM,CAAC,QAAQ,MAAM,UAAU,KAAK,QAAQ,EAAE,CAAC,CAAC;IACjG,CAAC;IACD,8DAA8D;IAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,MAAM,IAAI,KAAK,CAAC,GAAG,SAAS,iBAAiB,MAAM,CAAC,QAAQ,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACnG,CAAC;AACD,8DAA8D;AAC9D,MAAM,QAAQ,GAAG,MAAM,CAAC;AACxB,SAAS,kBAAkB,CAAC,OAAe;IACvC,MAAM,OAAO,GAAiB,EAAE,CAAC;IACjC,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,QAAQ,GAAG,GAAW,EAAE;QAC1B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,CAAC,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAChE,MAAM,GAAG,OAAO,GAAG,CAAC,CAAC;QACrB,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,MAAM,WAAW,GAAG,CAAC,QAAgB,EAAU,EAAE;QAC7C,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,IAAI,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,4CAA4C,QAAQ,SAAS,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC;QACrH,CAAC;QACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,IAAI,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;YACpE,MAAM,IAAI,KAAK,CAAC,mCAAmC,QAAQ,iBAAiB,CAAC,CAAC;QAClF,CAAC;QACD,MAAM,IAAI,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,CAAC;QACvD,MAAM,IAAI,MAAM,CAAC;QACjB,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC;IACF,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1B,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,SAAS,CAAC;YAC7B,MAAM,IAAI,KAAK,CAAC,uDAAuD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrG,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAC5C,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAChC,MAAM,KAAK,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC;QACxD,MAAM,OAAO,GAAG,aAAa,CAAC,WAAW,CAAC,UAAU,CAAC,EAAE,KAAK,CAAC,CAAC;QAC9D,MAAM,WAAW,GAAG,gBAAgB,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE,KAAK,CAAC,CAAC;QACpE,MAAM,SAAS,GAAG,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QAC1D,MAAM,YAAY,GAAG,cAAc,CAAC,WAAW,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;QACjE,MAAM,OAAO,GAA4C,EAAE,CAAC;QAC5D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC1B,MAAM,MAAM,GAAiB,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,CAAC;YACtD,6DAA6D;YAC7D,oCAAoC;YACpC,MAAM,WAAW,GAAG,KAAK,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtH,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACtH,MAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,SAAS,GAAG,CAAC,WAAW,IAAI,CAAC,CAAC,GAAG,mBAAmB,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC,GAAG,mBAAmB,CAAC;YACtG,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;gBACtB,MAAM,CAAC,MAAM,GAAG,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,gBAAgB,EAAE,CAAC;gBACjE,IAAI,WAAW,KAAK,SAAS;oBACzB,MAAM,CAAC,MAAM,CAAC,WAAW,GAAG,WAAW,CAAC;gBAC5C,IAAI,UAAU,KAAK,SAAS;oBACxB,MAAM,CAAC,MAAM,CAAC,UAAU,GAAG,UAAU,CAAC;YAC9C,CAAC;iBACI,CAAC;gBACF,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO;oBACxB,MAAM,CAAC,MAAM,GAAG,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,SAAS,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;gBACrF,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS;oBAC1B,MAAM,CAAC,KAAK,GAAG,cAAc,CAAC,YAAY,EAAE,KAAK,CAAC,QAAQ,EAAE,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YACvF,CAAC;YACD,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC;QACjC,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAOD,2FAA2F;AAC3F,SAAS,aAAa,CAAC,OAAe,EAAE,KAAa;IACjD,MAAM,KAAK,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACnD,MAAM,OAAO,GAAoB,EAAE,CAAC;IACpC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC;QAChC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI;YACL,SAAS;QACb,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3E,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,kCAAkC,CAAC,CAAC;QAC9E,CAAC;QACD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC;QACxB,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,UAAU,CAAC;QAC9F,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAE,EAAE,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AACD,iEAAiE;AACjE,SAAS,gBAAgB,CAAC,OAAe,EAAE,KAAa;IACpD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAU,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACxD,IAAI,CAAC,MAAM;YACP,SAAS;QACb,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QACrD,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,CAAC,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,kCAAkC,CAAC,CAAC;QAC9E,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,KAAK,GAAG,IAAI,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,EAAE,SAAS,CAAC,KAAK,GAAG,EAAE,CAAC;YACrF,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,2EAA2E;AAC3E,SAAS,UAAU,CAAC,OAAe,EAAE,KAAa;IAC9C,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAC;IACxC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI;YACL,SAAS;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,+CAA+C,CAAC,CAAC;QAC3F,CAAC;QACD,KAAK,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,0EAA0E;AAC1E,SAAS,cAAc,CAAC,OAAe,EAAE,KAAa;IAClD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC3C,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,OAAO,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;QAC7B,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC9C,IAAI,OAAO,KAAK,CAAC,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,yCAAyC,CAAC,CAAC;QACrF,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC7E,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QAC/C,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,EAAE,CAAC;YACnD,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,yCAAyC,CAAC,CAAC;QACrF,CAAC;QACD,MAAM,YAAY,GAAG,OAAO,GAAG,CAAC,CAAC;QACjC,MAAM,UAAU,GAAG,YAAY,GAAG,IAAI,CAAC;QACvC,IAAI,UAAU,IAAI,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,IAAI,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,0CAA0C,CAAC,CAAC;QACtF,CAAC;QACD,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAE,EAAE,OAAO,CAAC,QAAQ,CAAC,YAAY,EAAE,UAAU,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QACtF,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,OAAO,QAAQ,CAAC;AACpB,CAAC;AACD,SAAS,WAAW,CAAC,KAA0B,EAAE,GAAW,EAAE,KAAa,EAAE,IAAY;IACrF,MAAM,IAAI,GAAG,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAC5B,IAAI,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QACxC,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,2BAA2B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7F,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,cAAc,CAAC,QAA6B,EAAE,GAAW,EAAE,KAAa,EAAE,IAAY;IAC3F,MAAM,OAAO,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;IAClC,IAAI,OAAO,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,iBAAiB,KAAK,8BAA8B,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChG,OAAO,OAAO,CAAC;AACnB,CAAC;AACD,SAAS,oBAAoB,CAAC,KAAc;IACxC,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,aAAa,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC;AAClF,CAAC","sourcesContent":["// 变更分类账(私有 git ledger):回答「**agent** 改了什么」,不是「workspace 相对空目录变了什么」。\n// 契约见 docs/feature/sandbox/architecture.md「变更归因:send 窗口与分类账」:\n// - ledger 的 git 目录在沙箱内、workdir 外(runner 私有路径),以 workdir 为 work-tree——\n// workdir 保持素净:agent 看不到 runner 的 .git,eval 需要真实 git repo 时自己 git init,\n// agent 在 workdir 里的任何 git 操作都碰不到分类账。\n// - 三类 commit 时点:锚点一笔(workspace.baseline);每次 t.send() 进入前 workdir 有未记录\n// 变化就落一笔 eval 归因;t.send() 返回后落一笔 agent 归因(send 窗口内的全部变化)。\n// - 归因排除清单 runner 私有、锚点时冻结:项目自己的 .gitignore 不参与归因判断(add -f 绕过),\n// 排除靠 pathspec,include 显式打洞加回。\n// - agent 归因增量 = 逐窗口 delta 序列(DiffWindow[]),不做跨窗口压缩。\nimport type { DiffArtifact, DiffWindow, Sandbox, WindowChange } from \"../types.ts\";\nimport type { AgentWorkspaceDiffPolicy } from \"../assertions/workspace-diff.ts\";\nimport { sandboxSupportsRootCommands } from \"../sandbox/backend.ts\";\nimport { DEFAULT_LEDGER_GIT_DIR, ledgerPathsFor } from \"../sandbox/ledger-paths.ts\";\n/**\n * ledger 的私有 git 目录:workdir 之外、runner 控制;agent 的工具默认不会去 /tmp 翻它。这是\n * 沙箱内 provider(docker/e2b/vercel)的默认值——每个实例都是全新隔离文件系统,固定路径不会\n * 跨实例踩踏。宿主本身即工作树的 provider(如 local)按 sandboxId 登记专属路径覆盖它\n * (见 sandbox/ledger-paths.ts),避免同机多次运行共享同一个 /tmp。\n */\nexport const LEDGER_GIT_DIR = DEFAULT_LEDGER_GIT_DIR;\n/** 整相导出文件的落点(与 ledger 同前缀,同样是 runner 私有路径;覆盖规则同上)。 */\nconst EXPORT_DIR = \"/tmp/.niceeval-ledger-export\";\n/** 默认归因排除清单(锚点时冻结):依赖、构建产物、包管理器缓存与用户项目里的 .niceeval 记录目录。\n * 框架自己不往 workdir 写任何东西(见 docs/observability.md「宿主侧行为断言:t.o11y」),\n * 所以这里没有框架路径要排。 */\nconst DEFAULT_EXCLUDES = [\n \".git\",\n \"node_modules\",\n \".next\",\n \"dist\",\n \"build\",\n \".turbo\",\n \".niceeval\",\n \"coverage\",\n \".cache\",\n \".pnpm-store\",\n \".npm\",\n \".yarn\",\n \"*venv*/\",\n \".venv\",\n \"__pycache__\",\n];\nconst MAX_POLICY_ENTRIES = 256;\nconst MAX_POLICY_ENTRY_UTF8_BYTES = 4096;\nconst policyEncoder = new TextEncoder();\nfunction compareAscii(left: string, right: string): number {\n return left === right ? 0 : left < right ? -1 : 1;\n}\n/** Reject an unrecordable policy before the collector starts, then freeze its canonical evidence form. */\nfunction canonicalPolicyEntries(entries: readonly string[], name: \"include\" | \"ignore\"): readonly string[] {\n if (entries.length > MAX_POLICY_ENTRIES) {\n throw new Error(`defineEval({ diff }).${name} may contain at most ${MAX_POLICY_ENTRIES} entries`);\n }\n for (const [index, entry] of entries.entries()) {\n if (typeof entry !== \"string\") {\n throw new TypeError(`defineEval({ diff }).${name}[${index}] must be a string`);\n }\n if (policyEncoder.encode(entry).byteLength > MAX_POLICY_ENTRY_UTF8_BYTES) {\n throw new Error(`defineEval({ diff }).${name}[${index}] exceeds ${MAX_POLICY_ENTRY_UTF8_BYTES} UTF-8 bytes`);\n }\n }\n return Object.freeze([...new Set(entries)].sort(compareAscii));\n}\n/**\n * 单个 send 窗口的证据安全上限。越界必须让 workspace.diff 失败,不能产出误导性的空窗口。\n * 字节预算只数**真正要传输的文本** before/after:二进制与超过单文件阈值的文本不内联内容、\n * 只记字节数(WindowChange.elided),因此不占预算——编译产物型窗口(成百上千个 .o 加几个大\n * 文本)不该因为「按尺寸计」被判越界。\n */\nconst MAX_WINDOW_PATHS = 10000;\nconst MAX_WINDOW_TEXT_BYTES = 64 * 1024 * 1024;\n/** 单个文本 blob 的内联阈值:任一侧超过它,该条目按二进制同款处理(记字节数、内容省略)。 */\nconst MAX_FILE_TEXT_BYTES = 1024 * 1024;\n/**\n * 整相导出:一条 POSIX shell 命令枚举**全部** agent 窗口并把证据写进沙箱内导出文件,宿主随后\n * 经文件通道一次下载——provider 往返数与窗口数、文件数都无关。对沙箱环境的全部要求是 git 与\n * POSIX 工具(sh/awk/wc/sort/grep),不依赖 node、python 等运行时。\n *\n * 沙箱内不组装 JSON:导出文件直接拼接 git 原生输出——每窗口四段,`diff-tree -z`(状态 + 前后\n * blob sha + 路径,NUL 安全)、`numstat -z`(二进制识别)、`cat-file --batch-check`(全部 blob\n * 尺寸)、`cat-file --batch`(要内联的文本 blob 内容,输出自带长度帧)——解析与校验全部在宿主侧完成。\n * 需要在沙箱内做的两个判断都不解析路径列:sha 提取用 awk 取 diff-tree 原始输出的第 3/4 列\n * (路径在其后,含空格也不影响);二进制排除靠 numstat 与 diff-tree 输出的行号对齐。\n * 尺寸核算(--batch-check)先于内容读取(--batch),越界在产出任何内容前失败;预算只累计真正\n * 要传输的文本 blob(二进制与单文件超限文本只出字节数,不进 --batch 请求、不计预算)。\n * 宿主侧从 sizes + numstat 两段就能判出哪些条目内容被省略,沙箱不额外输出一份判定清单。\n */\nfunction buildExportScript(exportDir: string): string {\n return [\n \"set -eu\",\n // shellQuote:多数 provider 的 exportDir 是固定字面量(无空格);local 的 exportDir 来自\n // mkdtemp(可能落在含空格的自定义 TMPDIR 下),赋值行不加引号会被 shell 拆成多个词。\n `D=${shellQuote(exportDir)}`,\n 'rm -rf \"$D\" && mkdir -p \"$D\"',\n 'OUT=$D/export.bin',\n ': > \"$OUT\"',\n 'fail() { printf \"%s\\\\n\" \"$1\" >&2; exit 2; }',\n // 帧格式:`section <name> <bytes>` 头一行,后跟原始字节;长度前缀让内容里的任意字节都安全。\n 'emit() { printf \"section %s %s\\\\n\" \"$1\" \"$(($(wc -c < \"$2\")))\" >> \"$OUT\"; cat \"$2\" >> \"$OUT\"; }',\n 'git log --reverse --format=\"%H %s\" > \"$D/log.txt\"',\n \"while IFS= read -r line; do\",\n ' hash=${line%% *}',\n ' subject=${line#* }',\n ' case $subject in \"agent \"*) ;; *) continue ;; esac',\n ' label=${subject#agent }',\n // 非 -z 的 diff-tree 把特殊路径引号转义成单行,一行 = 一个条目:wc -l 即路径数,awk 列取 sha 不碰路径。\n ' git diff-tree -r --no-renames \"$hash^\" \"$hash\" > \"$D/dt.txt\"',\n ' n=$(($(wc -l < \"$D/dt.txt\")))',\n ` [ \"$n\" -le ${MAX_WINDOW_PATHS} ] || fail \"niceeval diff window contains $n paths; limit is ${MAX_WINDOW_PATHS}\"`,\n ' git diff-tree -r --no-renames --numstat \"$hash^\" \"$hash\" > \"$D/ns.txt\"',\n // 全部 blob 出现次数(before + after,零 sha = 无此侧,排除)→ 逐次尺寸核算。\n \" awk '$3 !~ /^0+$/ { print $3 } $4 !~ /^0+$/ { print $4 }' \\\"$D/dt.txt\\\" > \\\"$D/occ.txt\\\"\",\n ' git cat-file --batch-check < \"$D/occ.txt\" > \"$D/sizes.txt\"',\n ' if grep -q \" missing$\" \"$D/sizes.txt\"; then fail \"niceeval ledger export: blob object missing\"; fi',\n // 逐条目分类:numstat 第 1 列为 \"-\" 的行是二进制,按行号对齐标 B,其余标 T,后跟前后 blob sha。\n ' awk \\'NR==FNR { bin[FNR] = ($1 == \"-\"); next } { printf \"%s %s %s\\\\n\", (bin[FNR] ? \"B\" : \"T\"), $3, $4 }\\' \"$D/ns.txt\" \"$D/dt.txt\" > \"$D/entries.txt\"',\n // 要内联的文本 blob(去重):二进制条目与任一侧超过单文件阈值的文本条目都不请求内容,\n // 也不计入窗口预算——它们只出字节数(宿主据同一份 sizes 判成 elided)。\n ` awk -v LIMIT=${MAX_FILE_TEXT_BYTES} -v TOTAL=\"$D/total.txt\" 'NR==FNR { sz[$1] = $3; next } $1 == \"T\" { b = $2; a = $3; if (b !~ /^0+$/ && sz[b] > LIMIT) next; if (a !~ /^0+$/ && sz[a] > LIMIT) next; if (b !~ /^0+$/ && !(b in seen)) { seen[b] = 1; total += sz[b]; print b } if (a !~ /^0+$/ && !(a in seen)) { seen[a] = 1; total += sz[a]; print a } } END { print total+0 > TOTAL }' \"$D/sizes.txt\" \"$D/entries.txt\" > \"$D/text.txt\"`,\n ' bytes=$(cat \"$D/total.txt\")',\n ` [ \"$bytes\" -le ${MAX_WINDOW_TEXT_BYTES} ] || fail \"niceeval diff window transfers $bytes text blob bytes; limit is ${MAX_WINDOW_TEXT_BYTES}; narrow defineEval({ diff }) include/ignore rules\"`,\n ' git cat-file --batch < \"$D/text.txt\" > \"$D/blobs.bin\"',\n ' git diff-tree -r --no-renames -z \"$hash^\" \"$hash\" > \"$D/dtz.bin\"',\n ' git diff-tree -r --no-renames --numstat -z \"$hash^\" \"$hash\" > \"$D/nsz.bin\"',\n ' printf \"window %s %s\\\\n\" \"$hash\" \"$label\" >> \"$OUT\"',\n ' emit difftree \"$D/dtz.bin\"',\n ' emit numstat \"$D/nsz.bin\"',\n ' emit sizes \"$D/sizes.txt\"',\n ' emit blobs \"$D/blobs.bin\"',\n 'done < \"$D/log.txt\"',\n // root ledger commands may create the private export with a restrictive umask. The file is outside\n // workdir; making only this runner artifact readable lets the provider file channel fetch it.\n 'chmod 0644 \"$OUT\"',\n ].join(\"\\n\");\n}\nexport interface ChangeLedger {\n /** send 进入前:workdir 有未记录变化就落一笔 eval 归因(fixture / setup / runCommand 副作用)。 */\n commitEvalWindow(label: string): Promise<void>;\n /** send 返回后:落一笔 agent 归因——这个 send 窗口内的全部 workspace 变化(无变化也落空窗口)。 */\n commitAgentWindow(label: string): Promise<void>;\n /** workspace.diff 阶段:从分类账导出每个 send 窗口自己的 before/after,按时序。 */\n exportWindows(): Promise<DiffArtifact>;\n /** 回到创建时的题间锚点,并保留归因排除清单排除的动态环境。 */\n resetToAnchor(): Promise<void>;\n /**\n * 建账时探测到的执行身份是否为 root(仅当 provider 支持 root ledger 命令时才探测得到,\n * 否则恒为 false)。sandboxReuse 复用池据此在实例进池前拒绝(见 docs/feature/sandbox/reuse.md);\n * `resetToAnchor()` 内的同款判断作纵深防御保留。\n */\n readonly rootExecutionIdentity: boolean;\n /** Frozen semantic identity consumed by the Attempt-owned diff Attachment. */\n readonly attribution: AgentWorkspaceDiffPolicy;\n}\ninterface LedgerOptions {\n /** defineEval({ diff }) 的归因调整:ignore 追加排除,include 打洞加回(优先级最高)。 */\n include?: string[];\n ignore?: string[];\n}\n/** 每条 git 命令都带上私有 GIT_DIR + workdir work-tree;项目/全局 gitignore 一律不参与。 */\nfunction gitEnv(sandbox: Sandbox, gitDir: string): globalThis.Record<string, string> {\n return {\n GIT_DIR: gitDir,\n GIT_WORK_TREE: sandbox.workdir,\n GIT_AUTHOR_NAME: \"niceeval\",\n GIT_AUTHOR_EMAIL: \"niceeval@localhost\",\n GIT_COMMITTER_NAME: \"niceeval\",\n GIT_COMMITTER_EMAIL: \"niceeval@localhost\",\n // Internal root Git must never consume configuration or hooks writable by the Agent.\n GIT_CONFIG_NOSYSTEM: \"1\",\n GIT_CONFIG_GLOBAL: \"/dev/null\",\n GIT_CONFIG_COUNT: \"1\",\n GIT_CONFIG_KEY_0: \"core.hooksPath\",\n GIT_CONFIG_VALUE_0: \"/dev/null\",\n GIT_TERMINAL_PROMPT: \"0\",\n HOME: \"/tmp\",\n };\n}\nfunction shellQuote(s: string): string {\n return `'${s.replaceAll(\"'\", `'\\\\''`)}'`;\n}\n/**\n * Root Git can faithfully restore bytes but would otherwise recreate ordinary fixture files as root.\n * Keep a content-free metadata mirror inside the private (0700) ledger and reapply uid/gid/mode after\n * reset. The batched xargs loops preserve arbitrary Git path bytes without exposing objects to the Agent.\n */\nfunction captureBaselineMetadataScript(): string {\n return [\n 'META=\"$GIT_DIR/niceeval-baseline-metadata\"',\n 'rm -rf \"$META\" && mkdir -p \"$META/files\" \"$META/dirs\"',\n \"export META\",\n \"git ls-files -z | xargs -0 -n 100 sh -c '\",\n \" for p do\",\n ' src=\"$GIT_WORK_TREE/$p\"',\n ' ref=\"$META/files/$p\"',\n ' mkdir -p \"$(dirname \"$ref\")\" && : > \"$ref\"',\n ' owner=$(stat -c \"%u:%g\" \"$src\") && mode=$(stat -c \"%a\" \"$src\")',\n ' chown -h \"$owner\" \"$ref\" && chmod \"$mode\" \"$ref\"',\n ' d=$(dirname \"$p\")',\n ' while [ \"$d\" != \".\" ]; do',\n ' dref=\"$META/dirs/$d/.ref\"',\n ' if [ ! -e \"$dref\" ]; then',\n ' mkdir -p \"$(dirname \"$dref\")\" && : > \"$dref\"',\n ' downer=$(stat -c \"%u:%g\" \"$GIT_WORK_TREE/$d\") && dmode=$(stat -c \"%a\" \"$GIT_WORK_TREE/$d\")',\n ' chown \"$downer\" \"$dref\" && chmod \"$dmode\" \"$dref\"',\n \" fi\",\n ' d=$(dirname \"$d\")',\n \" done\",\n \" done\",\n \"' niceeval-meta\",\n // Agent and any background process share the ordinary sandbox uid. Keep both objects and the\n // metadata mirror root-private for the whole attempt; reset never opens this directory to that uid.\n 'chmod go-rwx \"$GIT_DIR\"',\n ].join(\"\\n\");\n}\nfunction restoreBaselineMetadataScript(): string {\n return [\n 'META=\"$GIT_DIR/niceeval-baseline-metadata\"',\n \"export META\",\n 'if [ -d \"$META/files\" ]; then',\n \" find \\\"$META/files\\\" -type f -print0 | xargs -0 -n 100 sh -c '\",\n \" for ref do\",\n ' p=${ref#\"$META/files/\"}',\n ' target=\"$GIT_WORK_TREE/$p\"',\n ' if [ -e \"$target\" ] || [ -L \"$target\" ]; then',\n ' owner=$(stat -c \"%u:%g\" \"$ref\") && mode=$(stat -c \"%a\" \"$ref\")',\n ' chown -h \"$owner\" \"$target\"',\n ' [ -L \"$target\" ] || chmod \"$mode\" \"$target\"',\n \" fi\",\n \" done\",\n \" ' niceeval-meta-restore\",\n \"fi\",\n // Apply directory metadata last so restrictive parent modes cannot interfere with child repair.\n 'if [ -d \"$META/dirs\" ]; then',\n \" find \\\"$META/dirs\\\" -type f -name .ref -print0 | xargs -0 -n 100 sh -c '\",\n \" for ref do\",\n ' d=${ref%/.ref}',\n ' p=${d#\"$META/dirs/\"}',\n ' target=\"$GIT_WORK_TREE/$p\"',\n ' if [ -d \"$target\" ]; then',\n ' owner=$(stat -c \"%u:%g\" \"$ref\") && mode=$(stat -c \"%a\" \"$ref\")',\n ' chown \"$owner\" \"$target\" && chmod \"$mode\" \"$target\"',\n \" fi\",\n \" done\",\n \" ' niceeval-dir-meta-restore\",\n \"fi\",\n 'chmod go-rwx \"$GIT_DIR\"',\n ].join(\"\\n\");\n}\n/**\n * 把仓库根语义的 gitignore 风格规则编译成 ledger pathspec。\n * 无斜杠的名字匹配任意深度;有斜杠的规则相对 workdir 根;目录本身与后代一起处理。\n */\nfunction gitignorePathspecs(pattern: string, exclude: boolean): string[] {\n let normalized = pattern;\n while (normalized.startsWith(\"./\"))\n normalized = normalized.slice(2);\n if (normalized.startsWith(\"/\"))\n normalized = normalized.slice(1);\n normalized = normalized.replace(/\\/+$/, \"\");\n if (!normalized)\n return [];\n const glob = normalized.includes(\"/\") ? normalized : `**/${normalized}`;\n const globs = exclude && !glob.endsWith(\"/**\") ? [glob, `${glob}/**`] : [glob];\n const magic = exclude ? \":(glob,exclude)\" : \":(glob)\";\n return [...new Set(globs)].map((value) => `${magic}${value}`);\n}\n/** 打分类账锚点(workspace.baseline 阶段,环境层钩子之后):git init + 冻结排除清单 + 首笔 commit。 */\nexport async function createChangeLedger(sandbox: Sandbox, opts?: LedgerOptions): Promise<ChangeLedger> {\n const includes = canonicalPolicyEntries(opts?.include ?? [], \"include\");\n const ignored = canonicalPolicyEntries(opts?.ignore ?? [], \"ignore\");\n const excludes = [...DEFAULT_EXCLUDES, ...ignored];\n // 多数 provider 用固定的宿主内私有路径(每实例全新隔离文件系统,天然不冲突);宿主本身即\n // 工作树的 provider(如 local)按 sandboxId 登记专属路径,避免同机多次运行互相踩踏\n // (见 sandbox/ledger-paths.ts —— 这里不认 provider 名,只问登记表)。\n const paths = ledgerPathsFor(sandbox.sandboxId);\n const gitDir = paths?.gitDir ?? LEDGER_GIT_DIR;\n const exportDir = paths?.exportDir ?? EXPORT_DIR;\n const env = gitEnv(sandbox, gitDir);\n const rootCommands = sandboxSupportsRootCommands(sandbox);\n // 只给 runner 私有 ledger 命令提权,以便读取题目故意设置的受限文件。脚本不 chmod/chown\n // workdir,Agent 命令仍沿标准非 root 身份;不支持提权的 provider 保持既有用户态路径。\n const commandOptions = rootCommands ? { env, user: \"root\" as const } : { env };\n const captureMetadata = rootCommands ? ` && ${captureBaselineMetadataScript()}` : \"\";\n const lockPrivateLedger = rootCommands ? ' && chmod go-rwx \"$GIT_DIR\"' : \"\";\n let ordinaryUid: string | undefined;\n if (rootCommands) {\n // Capture before Agent setup/send can mutate the VM. A post-attempt `id` probe would not be a\n // trustworthy boundary when the configured execution identity itself is root.\n const identity = await sandbox.runShell(\"command -p id -u\", { env });\n ensureCommandSucceeded(identity, \"detect sandbox execution identity for reuse\", false);\n ordinaryUid = identity.stdout.trim();\n }\n // add -A -f:绕过项目自己的 .gitignore(项目 ignore 的文件照常记录);排除靠 pathspec\n // (runner 私有清单,agent / fixture 写 .gitignore 影响不了它);include 用第二次 add 打洞加回。\n const excludeSpecs = excludes.flatMap((pattern) => gitignorePathspecs(pattern, true)).map(shellQuote).join(\" \");\n // include 打洞:路径此刻可能还不存在(如 agent 之后才写),unmatched pathspec 不算错。\n const includeSpecs = includes.flatMap((pattern) => gitignorePathspecs(pattern, false)).map(shellQuote).join(\" \");\n const includeAdd = includeSpecs.length > 0 ? ` && { git -c advice.addEmbeddedRepo=false add -A -f -- ${includeSpecs} 2>/dev/null || true; }` : \"\";\n const rejectGitlinks = \" && nested=$(git ls-files --stage | awk '$1 == \\\"160000\\\" { sub(/^[^\\\\t]*\\\\t/, \\\"\\\"); print; exit }')\" +\n ' && if [ -n \"$nested\" ]; then printf \\'%s\\\\n\\' \"niceeval ledger cannot track nested Git repository $nested as file-level evidence; move the checkout to sandbox.workdir root, or add the whole path to defineEval({ diff: { ignore: [...] } }) when it is intentionally out of scope\" >&2; exit 2; fi';\n const addAll = `git -c advice.addEmbeddedRepo=false add -A -f -- . ${excludeSpecs}${includeAdd}${rejectGitlinks}`;\n const anchor = await sandbox.runShell(\n // The path is predictable inside an isolated VM. Remove any image/prepare-time occupant or\n // symlink, then recreate the exact runner-private directory as root 0700 before Git touches it.\n `rm -rf -- ${shellQuote(gitDir)} && mkdir -p -m 0700 -- ${shellQuote(gitDir)} && ` +\n `git init -q \"${gitDir}\" && ${addAll} && git commit -q --allow-empty -m \"anchor\" && ` +\n `(git rev-parse -q --verify niceeval-reuse-anchor >/dev/null || git tag niceeval-reuse-anchor)` +\n captureMetadata, {\n ...commandOptions,\n });\n ensureCommandSucceeded(anchor, \"create change ledger anchor\", rootCommands);\n return {\n rootExecutionIdentity: ordinaryUid === \"0\",\n attribution: Object.freeze({\n defaultPolicy: \"niceeval.sandbox-ledger/default-excludes/v1\" as const,\n include: includes,\n ignore: ignored,\n }),\n async commitEvalWindow(label: string): Promise<void> {\n // 有未记录变化才落这一笔;干净时不产生空的 eval 归因 commit。\n const result = await sandbox.runShell(`${addAll} && (git diff --cached --quiet || git commit -q -m ${shellQuote(`eval ${label}`)})${lockPrivateLedger}`, {\n ...commandOptions,\n });\n ensureCommandSucceeded(result, `commit eval window ${label}`, rootCommands);\n },\n async commitAgentWindow(label: string): Promise<void> {\n // 窗口内没有变化时也落一条(--allow-empty),diff.json 里该窗口 changes 为空对象。\n const result = await sandbox.runShell(`${addAll} && git commit -q --allow-empty -m ${shellQuote(`agent ${label}`)}${lockPrivateLedger}`, commandOptions);\n ensureCommandSucceeded(result, `commit agent window ${label}`, rootCommands);\n },\n async exportWindows(): Promise<DiffArtifact> {\n return exportAgentWindows(sandbox, commandOptions, exportDir, rootCommands);\n },\n async resetToAnchor(): Promise<void> {\n if (ordinaryUid === \"0\") {\n throw new Error(\"sandboxReuse cannot safely reuse a root-agent sandbox: the Agent could read private ledger objects from prior attempts; use a non-root execution user or disable sandboxReuse\");\n }\n // Root performs the byte reset, then reapplies the content-free baseline metadata mirror so\n // ordinary files return to their original uid/gid/mode instead of becoming root-owned. The\n // private object database stays 0700 throughout; no Agent/background process can read it.\n const result = await sandbox.runShell(`git reset -q --hard niceeval-reuse-anchor && ` +\n `git clean -fd ${excludes.map((pattern) => `-e ${shellQuote(pattern)}`).join(\" \")} && ` +\n restoreBaselineMetadataScript(), commandOptions);\n ensureCommandSucceeded(result, \"reset reusable sandbox to anchor and restore ownership\", rootCommands);\n },\n };\n}\nasync function exportAgentWindows(sandbox: Sandbox, commandOptions: {\n readonly env: globalThis.Record<string, string>;\n readonly user?: \"root\";\n}, exportDir: string, rootCommands: boolean): Promise<DiffArtifact> {\n const result = await sandbox.runShell(buildExportScript(exportDir), commandOptions);\n ensureCommandSucceeded(result, \"export agent windows\", rootCommands);\n const payload = await sandbox.readBytes(`${exportDir}/export.bin`);\n return parseExportPayload(Buffer.from(payload));\n}\nfunction ensureCommandSucceeded(result: {\n exitCode: number;\n stderr: string;\n}, operation: string, rootCommands: boolean, permissionGuidance?: string): void {\n if (result.exitCode === 0)\n return;\n const lines = result.stderr.trim().split(\"\\n\").filter(Boolean);\n const permission = lines.find((line) => /permission denied|operation not permitted/i.test(line));\n if (permission !== undefined) {\n const guidance = permissionGuidance ?? (rootCommands\n ? \"the provider declared root command support, but root ledger execution still could not read the workspace; check its root command mapping\"\n : \"this sandbox provider does not support root ledger commands; use a root-capable provider for tasks that intentionally start with unreadable files instead of chmod/chowning away the task condition\");\n throw new Error(`${operation} failed (exit ${result.exitCode}): ${permission}; ${guidance}`);\n }\n // git 可能先输出 advisory warning,再输出 niceeval 的可操作诊断;最后一行最接近失败根因。\n const detail = lines.at(-1);\n throw new Error(`${operation} failed (exit ${result.exitCode})${detail ? `: ${detail}` : \"\"}`);\n}\n// ---------- 导出文件的宿主侧解析(严格校验:帧、git 输出形状、尺寸与内容的完备性) ----------\nconst ZERO_SHA = /^0+$/;\nfunction parseExportPayload(payload: Buffer): DiffArtifact {\n const windows: DiffWindow[] = [];\n let offset = 0;\n const readLine = (): string => {\n const newline = payload.indexOf(0x0a, offset);\n if (newline === -1)\n throw new Error(\"niceeval ledger export: truncated header\");\n const line = payload.subarray(offset, newline).toString(\"utf8\");\n offset = newline + 1;\n return line;\n };\n const readSection = (expected: string): Buffer => {\n const header = readLine().split(\" \");\n if (header.length !== 3 || header[0] !== \"section\" || header[1] !== expected) {\n throw new Error(`niceeval ledger export: expected section ${expected}, got ${JSON.stringify(header.join(\" \"))}`);\n }\n const length = Number(header[2]);\n if (!isNonNegativeInteger(length) || offset + length > payload.length) {\n throw new Error(`niceeval ledger export: invalid ${expected} section length`);\n }\n const body = payload.subarray(offset, offset + length);\n offset += length;\n return body;\n };\n while (offset < payload.length) {\n const header = readLine();\n if (!header.startsWith(\"window \"))\n throw new Error(`niceeval ledger export: expected window header, got ${JSON.stringify(header)}`);\n const rest = header.slice(\"window \".length);\n const space = rest.indexOf(\" \");\n const label = space === -1 ? \"\" : rest.slice(space + 1);\n const entries = parseDiffTree(readSection(\"difftree\"), label);\n const binaryPaths = parseBinaryPaths(readSection(\"numstat\"), label);\n const sizeBySha = parseSizes(readSection(\"sizes\"), label);\n const contentBySha = parseBlobBatch(readSection(\"blobs\"), label);\n const changes: globalThis.Record<string, WindowChange> = {};\n for (const entry of entries) {\n const change: WindowChange = { status: entry.status };\n // 沙箱侧决定「哪些文本 blob 进 --batch」的两条判据在宿主侧同样成立(binary 段 + sizes 段\n // 都在导出文件里),所以这里独立重算,不需要沙箱再输出一份省略清单。\n const beforeBytes = entry.status === \"added\" ? undefined : requireSize(sizeBySha, entry.beforeSha, label, entry.path);\n const afterBytes = entry.status === \"deleted\" ? undefined : requireSize(sizeBySha, entry.afterSha, label, entry.path);\n const binary = binaryPaths.has(entry.path);\n const oversized = (beforeBytes ?? 0) > MAX_FILE_TEXT_BYTES || (afterBytes ?? 0) > MAX_FILE_TEXT_BYTES;\n if (binary || oversized) {\n change.elided = { reason: binary ? \"binary\" : \"oversized-text\" };\n if (beforeBytes !== undefined)\n change.elided.beforeBytes = beforeBytes;\n if (afterBytes !== undefined)\n change.elided.afterBytes = afterBytes;\n }\n else {\n if (entry.status !== \"added\")\n change.before = requireContent(contentBySha, entry.beforeSha, label, entry.path);\n if (entry.status !== \"deleted\")\n change.after = requireContent(contentBySha, entry.afterSha, label, entry.path);\n }\n changes[entry.path] = change;\n }\n windows.push({ window: label, changes });\n }\n return windows;\n}\ninterface DiffTreeEntry {\n path: string;\n status: WindowChange[\"status\"];\n beforeSha: string;\n afterSha: string;\n}\n/** `git diff-tree -r --no-renames -z` 原始输出:`:mode mode sha sha status NUL path NUL` 重复。 */\nfunction parseDiffTree(section: Buffer, label: string): DiffTreeEntry[] {\n const parts = section.toString(\"utf8\").split(\"\\0\");\n const entries: DiffTreeEntry[] = [];\n for (let i = 0; i < parts.length;) {\n const meta = parts[i++];\n if (!meta)\n continue;\n const path = parts[i++];\n const fields = meta.split(\" \");\n if (path === undefined || fields.length !== 5 || !fields[0]!.startsWith(\":\")) {\n throw new Error(`export window ${label}: malformed git diff-tree output`);\n }\n const code = fields[4]!;\n const status = code.startsWith(\"A\") ? \"added\" : code.startsWith(\"D\") ? \"deleted\" : \"modified\";\n entries.push({ path, status, beforeSha: fields[2]!, afterSha: fields[3]! });\n }\n return entries;\n}\n/** `git diff-tree --numstat -z`:二进制条目的 added/removed 计数是 `-`。 */\nfunction parseBinaryPaths(section: Buffer, label: string): Set<string> {\n const paths = new Set<string>();\n for (const record of section.toString(\"utf8\").split(\"\\0\")) {\n if (!record)\n continue;\n const firstTab = record.indexOf(\"\\t\");\n const secondTab = record.indexOf(\"\\t\", firstTab + 1);\n if (firstTab === -1 || secondTab === -1)\n throw new Error(`export window ${label}: malformed git --numstat output`);\n if (record.slice(0, firstTab) === \"-\" && record.slice(firstTab + 1, secondTab) === \"-\") {\n paths.add(record.slice(secondTab + 1));\n }\n }\n return paths;\n}\n/** `git cat-file --batch-check`:每行 `sha type size`(输入是逐出现次数的 sha,重复无害)。 */\nfunction parseSizes(section: Buffer, label: string): Map<string, number> {\n const sizes = new Map<string, number>();\n for (const line of section.toString(\"utf8\").split(\"\\n\")) {\n if (!line)\n continue;\n const fields = line.split(\" \");\n const size = Number(fields[fields.length - 1]);\n if (fields.length < 3 || !isNonNegativeInteger(size)) {\n throw new Error(`export window ${label}: malformed git cat-file --batch-check output`);\n }\n sizes.set(fields[0]!, size);\n }\n return sizes;\n}\n/** `git cat-file --batch`:自带长度帧——`sha type size\\n` + size 字节内容 + `\\n`。 */\nfunction parseBlobBatch(section: Buffer, label: string): Map<string, string> {\n const contents = new Map<string, string>();\n let offset = 0;\n while (offset < section.length) {\n const newline = section.indexOf(0x0a, offset);\n if (newline === -1)\n throw new Error(`export window ${label}: malformed git cat-file --batch header`);\n const fields = section.subarray(offset, newline).toString(\"utf8\").split(\" \");\n const size = Number(fields[fields.length - 1]);\n if (fields.length < 3 || !isNonNegativeInteger(size)) {\n throw new Error(`export window ${label}: malformed git cat-file --batch header`);\n }\n const contentStart = newline + 1;\n const contentEnd = contentStart + size;\n if (contentEnd >= section.length || section[contentEnd] !== 0x0a) {\n throw new Error(`export window ${label}: truncated git cat-file --batch content`);\n }\n contents.set(fields[0]!, section.subarray(contentStart, contentEnd).toString(\"utf8\"));\n offset = contentEnd + 1;\n }\n return contents;\n}\nfunction requireSize(sizes: Map<string, number>, sha: string, label: string, path: string): number {\n const size = sizes.get(sha);\n if (size === undefined || ZERO_SHA.test(sha))\n throw new Error(`export window ${label}: missing blob size for ${JSON.stringify(path)}`);\n return size;\n}\nfunction requireContent(contents: Map<string, string>, sha: string, label: string, path: string): string {\n const content = contents.get(sha);\n if (content === undefined || ZERO_SHA.test(sha))\n throw new Error(`export window ${label}: missing blob content for ${JSON.stringify(path)}`);\n return content;\n}\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ledger.js","sourceRoot":"","sources":["ledger.ts"],"names":[],"mappings":"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","sourcesContent":["// 变更分类账(私有 git ledger):回答「**agent** 改了什么」,不是「workspace 相对空目录变了什么」。\n// 契约见 docs/feature/sandbox/architecture.md「变更归因:send 窗口与分类账」:\n// - ledger 的 git 目录在沙箱内、workdir 外(runner 私有路径),以 workdir 为 work-tree——\n// workdir 保持素净:agent 看不到 runner 的 .git,eval 需要真实 git repo 时自己 git init,\n// agent 在 workdir 里的任何 git 操作都碰不到分类账。\n// - 三类 commit 时点:锚点一笔(workspace.baseline);每次 t.send() 进入前 workdir 有未记录\n// 变化就落一笔 eval 归因;t.send() 返回后落一笔 agent 归因(send 窗口内的全部变化)。\n// - 归因排除清单 runner 私有、锚点时冻结:项目自己的 .gitignore 不参与归因判断(add -f 绕过),\n// 排除靠 pathspec,include 显式打洞加回。\n// - agent 归因增量 = 逐窗口 delta 序列(DiffWindow[]),不做跨窗口压缩。\nimport { createHash } from \"node:crypto\";\nimport type { DiffArtifact, DiffWindow, Sandbox, WindowChange } from \"../types.ts\";\nimport type { AgentWorkspaceDiffPolicy } from \"../assertions/workspace-diff.ts\";\nimport { sandboxSupportsRootCommands } from \"../sandbox/backend.ts\";\nimport { DEFAULT_LEDGER_GIT_DIR, ledgerPathsFor } from \"../sandbox/ledger-paths.ts\";\n/**\n * ledger 的私有 git 目录:workdir 之外、runner 控制;agent 的工具默认不会去 /tmp 翻它。这是\n * 沙箱内 provider(docker/e2b/vercel)的默认值——每个实例都是全新隔离文件系统,固定路径不会\n * 跨实例踩踏。宿主本身即工作树的 provider(如 local)按 sandboxId 登记专属路径覆盖它\n * (见 sandbox/ledger-paths.ts),避免同机多次运行共享同一个 /tmp。\n */\nexport const LEDGER_GIT_DIR = DEFAULT_LEDGER_GIT_DIR;\n/** 整相导出文件的落点(与 ledger 同前缀,同样是 runner 私有路径;覆盖规则同上)。 */\nconst EXPORT_DIR = \"/tmp/.niceeval-ledger-export\";\n/** 默认归因排除清单(锚点时冻结):依赖、构建产物、包管理器缓存与用户项目里的 .niceeval 记录目录。\n * 框架自己不往 workdir 写任何东西(见 docs/observability.md「宿主侧行为断言:t.o11y」),\n * 所以这里没有框架路径要排。 */\nconst DEFAULT_EXCLUDES = [\n \".git\",\n \"node_modules\",\n \".next\",\n \"dist\",\n \"build\",\n \".turbo\",\n \".niceeval\",\n \"coverage\",\n \".cache\",\n \".pnpm-store\",\n \".npm\",\n \".yarn\",\n \"*venv*/\",\n \".venv\",\n \"__pycache__\",\n];\nconst MAX_POLICY_ENTRIES = 256;\nconst MAX_POLICY_ENTRY_UTF8_BYTES = 4096;\nconst policyEncoder = new TextEncoder();\nfunction compareAscii(left: string, right: string): number {\n return left === right ? 0 : left < right ? -1 : 1;\n}\n/** Reject an unrecordable policy before the collector starts, then freeze its canonical evidence form. */\nfunction canonicalPolicyEntries(entries: readonly string[], name: \"include\" | \"ignore\"): readonly string[] {\n if (entries.length > MAX_POLICY_ENTRIES) {\n throw new Error(`defineEval({ diff }).${name} may contain at most ${MAX_POLICY_ENTRIES} entries`);\n }\n for (const [index, entry] of entries.entries()) {\n if (typeof entry !== \"string\") {\n throw new TypeError(`defineEval({ diff }).${name}[${index}] must be a string`);\n }\n if (policyEncoder.encode(entry).byteLength > MAX_POLICY_ENTRY_UTF8_BYTES) {\n throw new Error(`defineEval({ diff }).${name}[${index}] exceeds ${MAX_POLICY_ENTRY_UTF8_BYTES} UTF-8 bytes`);\n }\n }\n return Object.freeze([...new Set(entries)].sort(compareAscii));\n}\n/**\n * 单个 send 窗口的导出扫描安全上限。File Changes 的 10,000-change durable 上限由 collector\n * 保留确定性前缀并写 collection-cap-reached;导出层必须先把更大的候选集合交给 collector,\n * 不能在同一个 10,000 边界提前把已知 partial 证据降格成 unavailable。\n * 字节预算只数**真正要传输的文本** before/after:二进制与超过单文件阈值的文本不内联内容、\n * 只记字节数(WindowChange.elided),因此不占预算——编译产物型窗口(成百上千个 .o 加几个大\n * 文本)不该因为「按尺寸计」被判越界。\n */\nconst MAX_EXPORTED_WINDOW_PATHS = 100000;\nconst MAX_EXPORTED_WINDOW_TEXT_BYTES = 256 * 1024 * 1024;\n/** 单个文本 blob 的内联阈值:任一侧超过它,该条目按二进制同款处理(记字节数、内容省略)。 */\nconst MAX_FILE_TEXT_BYTES = 1024 * 1024;\n/** Provider 文件 API 的单次安全读取边界,以及整次 Attempt 导出的硬上限。 */\nconst EXPORT_PART_BYTES = 4000000;\nconst MAX_EXPORT_BYTES = 512 * 1024 * 1024;\nconst MAX_EXPORT_PARTS = Math.ceil(MAX_EXPORT_BYTES / EXPORT_PART_BYTES);\nconst EXPORT_MANIFEST_HEADER = \"niceeval-ledger-export-parts v1\";\n/**\n * 整相导出:一条 POSIX shell 命令枚举**全部** agent 窗口并把证据写进沙箱内导出文件,宿主随后\n * 经文件通道一次下载——provider 往返数与窗口数、文件数都无关。对沙箱环境的全部要求是 git 与\n * POSIX 工具(sh/awk/wc/sort/grep),不依赖 node、python 等运行时。\n *\n * 沙箱内不组装 JSON:导出文件直接拼接 git 原生输出——每窗口四段,`diff-tree -z`(状态 + 前后\n * blob sha + 路径,NUL 安全)、`numstat -z`(二进制识别)、`cat-file --batch-check`(全部 blob\n * 尺寸)、`cat-file --batch`(要内联的文本 blob 内容,输出自带长度帧)——解析与校验全部在宿主侧完成。\n * 需要在沙箱内做的两个判断都不解析路径列:sha 提取用 awk 取 diff-tree 原始输出的第 3/4 列\n * (路径在其后,含空格也不影响);二进制排除靠 numstat 与 diff-tree 输出的行号对齐。\n * 尺寸核算(--batch-check)先于内容读取(--batch),越界在产出任何内容前失败;预算只累计真正\n * 要传输的文本 blob(二进制与单文件超限文本只出字节数,不进 --batch 请求、不计预算)。\n * 宿主侧从 sizes + numstat 两段就能判出哪些条目内容被省略,沙箱不额外输出一份判定清单。\n */\nfunction buildExportScript(exportDir: string): string {\n return [\n \"set -eu\",\n // shellQuote:多数 provider 的 exportDir 是固定字面量(无空格);local 的 exportDir 来自\n // mkdtemp(可能落在含空格的自定义 TMPDIR 下),赋值行不加引号会被 shell 拆成多个词。\n `D=${shellQuote(exportDir)}`,\n 'rm -rf \"$D\" && mkdir -p \"$D\"',\n 'OUT=$D/export.bin',\n ': > \"$OUT\"',\n 'fail() { printf \"%s\\\\n\" \"$1\" >&2; exit 2; }',\n // 帧格式:`section <name> <bytes>` 头一行,后跟原始字节;长度前缀让内容里的任意字节都安全。\n 'emit() { printf \"section %s %s\\\\n\" \"$1\" \"$(($(wc -c < \"$2\")))\" >> \"$OUT\"; cat \"$2\" >> \"$OUT\"; }',\n 'git log --reverse --format=\"%H %s\" > \"$D/log.txt\"',\n \"while IFS= read -r line; do\",\n ' hash=${line%% *}',\n ' subject=${line#* }',\n ' case $subject in \"agent \"*) ;; *) continue ;; esac',\n ' label=${subject#agent }',\n // 非 -z 的 diff-tree 把特殊路径引号转义成单行,一行 = 一个条目:wc -l 即路径数,awk 列取 sha 不碰路径。\n ' git diff-tree -r --no-renames \"$hash^\" \"$hash\" > \"$D/dt.txt\"',\n ' n=$(($(wc -l < \"$D/dt.txt\")))',\n ` [ \"$n\" -le ${MAX_EXPORTED_WINDOW_PATHS} ] || fail \"niceeval diff window contains $n paths; export scan limit is ${MAX_EXPORTED_WINDOW_PATHS}; narrow defineEval({ diff }) include/ignore rules\"`,\n ' git diff-tree -r --no-renames --numstat \"$hash^\" \"$hash\" > \"$D/ns.txt\"',\n // 全部 blob 出现次数(before + after,零 sha = 无此侧,排除)→ 逐次尺寸核算。\n \" awk '$3 !~ /^0+$/ { print $3 } $4 !~ /^0+$/ { print $4 }' \\\"$D/dt.txt\\\" > \\\"$D/occ.txt\\\"\",\n ' git cat-file --batch-check < \"$D/occ.txt\" > \"$D/sizes.txt\"',\n ' if grep -q \" missing$\" \"$D/sizes.txt\"; then fail \"niceeval ledger export: blob object missing\"; fi',\n // 逐条目分类:numstat 第 1 列为 \"-\" 的行是二进制,按行号对齐标 B,其余标 T,后跟前后 blob sha。\n ' awk \\'NR==FNR { bin[FNR] = ($1 == \"-\"); next } { printf \"%s %s %s\\\\n\", (bin[FNR] ? \"B\" : \"T\"), $3, $4 }\\' \"$D/ns.txt\" \"$D/dt.txt\" > \"$D/entries.txt\"',\n // 要内联的文本 blob(去重):二进制条目与任一侧超过单文件阈值的文本条目都不请求内容,\n // 也不计入窗口预算——它们只出字节数(宿主据同一份 sizes 判成 elided)。\n ` awk -v LIMIT=${MAX_FILE_TEXT_BYTES} -v TOTAL=\"$D/total.txt\" 'NR==FNR { sz[$1] = $3; next } $1 == \"T\" { b = $2; a = $3; if (b !~ /^0+$/ && sz[b] > LIMIT) next; if (a !~ /^0+$/ && sz[a] > LIMIT) next; if (b !~ /^0+$/ && !(b in seen)) { seen[b] = 1; total += sz[b]; print b } if (a !~ /^0+$/ && !(a in seen)) { seen[a] = 1; total += sz[a]; print a } } END { print total+0 > TOTAL }' \"$D/sizes.txt\" \"$D/entries.txt\" > \"$D/text.txt\"`,\n ' bytes=$(cat \"$D/total.txt\")',\n ` [ \"$bytes\" -le ${MAX_EXPORTED_WINDOW_TEXT_BYTES} ] || fail \"niceeval diff window transfers $bytes text blob bytes; export scan limit is ${MAX_EXPORTED_WINDOW_TEXT_BYTES}; narrow defineEval({ diff }) include/ignore rules\"`,\n ' git cat-file --batch < \"$D/text.txt\" > \"$D/blobs.bin\"',\n ' git diff-tree -r --no-renames -z \"$hash^\" \"$hash\" > \"$D/dtz.bin\"',\n ' git diff-tree -r --no-renames --numstat -z \"$hash^\" \"$hash\" > \"$D/nsz.bin\"',\n ' printf \"window %s %s\\\\n\" \"$hash\" \"$label\" >> \"$OUT\"',\n ' emit difftree \"$D/dtz.bin\"',\n ' emit numstat \"$D/nsz.bin\"',\n ' emit sizes \"$D/sizes.txt\"',\n ' emit blobs \"$D/blobs.bin\"',\n 'done < \"$D/log.txt\"',\n // Provider 文件 API 可能拒绝超过 4 MiB 的单对象读取。这里按固定原始字节切片,并在最后\n // 原子发布 manifest;宿主只接受连续序号、精确长度和 Git blob checksum。\n 'total=$(($(wc -c < \"$OUT\")))',\n ` [ \"$total\" -le ${MAX_EXPORT_BYTES} ] || fail \"niceeval ledger export contains $total bytes; attempt export limit is ${MAX_EXPORT_BYTES}\"`,\n `parts=$(( (total + ${EXPORT_PART_BYTES} - 1) / ${EXPORT_PART_BYTES} ))`,\n ` [ \"$parts\" -le ${MAX_EXPORT_PARTS} ] || fail \"niceeval ledger export needs $parts parts; attempt part limit is ${MAX_EXPORT_PARTS}\"`,\n 'MANIFEST_TMP=$D/manifest.tmp',\n 'MANIFEST=$D/manifest.txt',\n `printf \"%s\\\\ntotal %s\\\\nparts %s\\\\n\" \"${EXPORT_MANIFEST_HEADER}\" \"$total\" \"$parts\" > \"$MANIFEST_TMP\"`,\n 'i=0',\n 'while [ \"$i\" -lt \"$parts\" ]; do',\n ' suffix=$(printf \"%06d\" \"$i\")',\n ' part=$D/export.part.$suffix',\n ` dd if=\"$OUT\" of=\"$part\" bs=${EXPORT_PART_BYTES} skip=\"$i\" count=1 2>/dev/null`,\n ' size=$(($(wc -c < \"$part\")))',\n ' oid=$(git hash-object --no-filters \"$part\")',\n ' printf \"part %s %s %s\\\\n\" \"$suffix\" \"$size\" \"$oid\" >> \"$MANIFEST_TMP\"',\n ' i=$((i + 1))',\n 'done',\n 'mv \"$MANIFEST_TMP\" \"$MANIFEST\"',\n 'rm -f \"$OUT\"',\n // root ledger commands may create private exports with a restrictive umask. These artifacts are\n // outside workdir and are deleted immediately after the provider file channel consumes them.\n 'chmod 0644 \"$MANIFEST\"',\n 'for part in \"$D\"/export.part.*; do [ -f \"$part\" ] || continue; chmod 0644 \"$part\"; done',\n ].join(\"\\n\");\n}\nexport interface ChangeLedger {\n /** send 进入前:workdir 有未记录变化就落一笔 eval 归因(fixture / setup / runCommand 副作用)。 */\n commitEvalWindow(label: string): Promise<void>;\n /** send 返回后:落一笔 agent 归因——这个 send 窗口内的全部 workspace 变化(无变化也落空窗口)。 */\n commitAgentWindow(label: string): Promise<void>;\n /** workspace.diff 阶段:从分类账导出每个 send 窗口自己的 before/after,按时序。 */\n exportWindows(): Promise<DiffArtifact>;\n /** 回到创建时的题间锚点,并保留归因排除清单排除的动态环境。 */\n resetToAnchor(): Promise<void>;\n /**\n * 建账时探测到的执行身份是否为 root(仅当 provider 支持 root ledger 命令时才探测得到,\n * 否则恒为 false)。sandboxReuse 复用池据此在实例进池前拒绝(见 docs/feature/sandbox/reuse.md);\n * `resetToAnchor()` 内的同款判断作纵深防御保留。\n */\n readonly rootExecutionIdentity: boolean;\n /** Frozen semantic identity consumed by the Attempt-owned diff Attachment. */\n readonly attribution: AgentWorkspaceDiffPolicy;\n}\ninterface LedgerOptions {\n /** defineEval({ diff }) 的归因调整:ignore 追加排除,include 打洞加回(优先级最高)。 */\n include?: string[];\n ignore?: string[];\n}\n/** 每条 git 命令都带上私有 GIT_DIR + workdir work-tree;项目/全局 gitignore 一律不参与。 */\nfunction gitEnv(sandbox: Sandbox, gitDir: string): globalThis.Record<string, string> {\n return {\n GIT_DIR: gitDir,\n GIT_WORK_TREE: sandbox.workdir,\n GIT_AUTHOR_NAME: \"niceeval\",\n GIT_AUTHOR_EMAIL: \"niceeval@localhost\",\n GIT_COMMITTER_NAME: \"niceeval\",\n GIT_COMMITTER_EMAIL: \"niceeval@localhost\",\n // Internal root Git must never consume configuration or hooks writable by the Agent.\n GIT_CONFIG_NOSYSTEM: \"1\",\n GIT_CONFIG_GLOBAL: \"/dev/null\",\n GIT_CONFIG_COUNT: \"1\",\n GIT_CONFIG_KEY_0: \"core.hooksPath\",\n GIT_CONFIG_VALUE_0: \"/dev/null\",\n GIT_TERMINAL_PROMPT: \"0\",\n HOME: \"/tmp\",\n };\n}\nfunction shellQuote(s: string): string {\n return `'${s.replaceAll(\"'\", `'\\\\''`)}'`;\n}\n/**\n * Root Git can faithfully restore bytes but would otherwise recreate ordinary fixture files as root.\n * Keep a content-free metadata mirror inside the private (0700) ledger and reapply uid/gid/mode after\n * reset. The batched xargs loops preserve arbitrary Git path bytes without exposing objects to the Agent.\n */\nfunction captureBaselineMetadataScript(): string {\n return [\n 'META=\"$GIT_DIR/niceeval-baseline-metadata\"',\n 'rm -rf \"$META\" && mkdir -p \"$META/files\" \"$META/dirs\"',\n \"export META\",\n \"git ls-files -z | xargs -0 -n 100 sh -c '\",\n \" for p do\",\n ' src=\"$GIT_WORK_TREE/$p\"',\n ' ref=\"$META/files/$p\"',\n ' mkdir -p \"$(dirname \"$ref\")\" && : > \"$ref\"',\n ' owner=$(stat -c \"%u:%g\" \"$src\") && mode=$(stat -c \"%a\" \"$src\")',\n ' chown -h \"$owner\" \"$ref\" && chmod \"$mode\" \"$ref\"',\n ' d=$(dirname \"$p\")',\n ' while [ \"$d\" != \".\" ]; do',\n ' dref=\"$META/dirs/$d/.ref\"',\n ' if [ ! -e \"$dref\" ]; then',\n ' mkdir -p \"$(dirname \"$dref\")\" && : > \"$dref\"',\n ' downer=$(stat -c \"%u:%g\" \"$GIT_WORK_TREE/$d\") && dmode=$(stat -c \"%a\" \"$GIT_WORK_TREE/$d\")',\n ' chown \"$downer\" \"$dref\" && chmod \"$dmode\" \"$dref\"',\n \" fi\",\n ' d=$(dirname \"$d\")',\n \" done\",\n \" done\",\n \"' niceeval-meta\",\n // Agent and any background process share the ordinary sandbox uid. Keep both objects and the\n // metadata mirror root-private for the whole attempt; reset never opens this directory to that uid.\n 'chmod go-rwx \"$GIT_DIR\"',\n ].join(\"\\n\");\n}\nfunction restoreBaselineMetadataScript(): string {\n return [\n 'META=\"$GIT_DIR/niceeval-baseline-metadata\"',\n \"export META\",\n 'if [ -d \"$META/files\" ]; then',\n \" find \\\"$META/files\\\" -type f -print0 | xargs -0 -n 100 sh -c '\",\n \" for ref do\",\n ' p=${ref#\"$META/files/\"}',\n ' target=\"$GIT_WORK_TREE/$p\"',\n ' if [ -e \"$target\" ] || [ -L \"$target\" ]; then',\n ' owner=$(stat -c \"%u:%g\" \"$ref\") && mode=$(stat -c \"%a\" \"$ref\")',\n ' chown -h \"$owner\" \"$target\"',\n ' [ -L \"$target\" ] || chmod \"$mode\" \"$target\"',\n \" fi\",\n \" done\",\n \" ' niceeval-meta-restore\",\n \"fi\",\n // Apply directory metadata last so restrictive parent modes cannot interfere with child repair.\n 'if [ -d \"$META/dirs\" ]; then',\n \" find \\\"$META/dirs\\\" -type f -name .ref -print0 | xargs -0 -n 100 sh -c '\",\n \" for ref do\",\n ' d=${ref%/.ref}',\n ' p=${d#\"$META/dirs/\"}',\n ' target=\"$GIT_WORK_TREE/$p\"',\n ' if [ -d \"$target\" ]; then',\n ' owner=$(stat -c \"%u:%g\" \"$ref\") && mode=$(stat -c \"%a\" \"$ref\")',\n ' chown \"$owner\" \"$target\" && chmod \"$mode\" \"$target\"',\n \" fi\",\n \" done\",\n \" ' niceeval-dir-meta-restore\",\n \"fi\",\n 'chmod go-rwx \"$GIT_DIR\"',\n ].join(\"\\n\");\n}\n/**\n * 把仓库根语义的 gitignore 风格规则编译成 ledger pathspec。\n * 无斜杠的名字匹配任意深度;有斜杠的规则相对 workdir 根;目录本身与后代一起处理。\n */\nfunction gitignorePathspecs(pattern: string, exclude: boolean): string[] {\n let normalized = pattern;\n while (normalized.startsWith(\"./\"))\n normalized = normalized.slice(2);\n if (normalized.startsWith(\"/\"))\n normalized = normalized.slice(1);\n normalized = normalized.replace(/\\/+$/, \"\");\n if (!normalized)\n return [];\n const glob = normalized.includes(\"/\") ? normalized : `**/${normalized}`;\n const globs = exclude && !glob.endsWith(\"/**\") ? [glob, `${glob}/**`] : [glob];\n const magic = exclude ? \":(glob,exclude)\" : \":(glob)\";\n return [...new Set(globs)].map((value) => `${magic}${value}`);\n}\n/** 打分类账锚点(workspace.baseline 阶段,环境层钩子之后):git init + 冻结排除清单 + 首笔 commit。 */\nexport async function createChangeLedger(sandbox: Sandbox, opts?: LedgerOptions): Promise<ChangeLedger> {\n const includes = canonicalPolicyEntries(opts?.include ?? [], \"include\");\n const ignored = canonicalPolicyEntries(opts?.ignore ?? [], \"ignore\");\n const excludes = [...DEFAULT_EXCLUDES, ...ignored];\n // 多数 provider 用固定的宿主内私有路径(每实例全新隔离文件系统,天然不冲突);宿主本身即\n // 工作树的 provider(如 local)按 sandboxId 登记专属路径,避免同机多次运行互相踩踏\n // (见 sandbox/ledger-paths.ts —— 这里不认 provider 名,只问登记表)。\n const paths = ledgerPathsFor(sandbox.sandboxId);\n const gitDir = paths?.gitDir ?? LEDGER_GIT_DIR;\n const exportDir = paths?.exportDir ?? EXPORT_DIR;\n const env = gitEnv(sandbox, gitDir);\n const rootCommands = sandboxSupportsRootCommands(sandbox);\n // 只给 runner 私有 ledger 命令提权,以便读取题目故意设置的受限文件。脚本不 chmod/chown\n // workdir,Agent 命令仍沿标准非 root 身份;不支持提权的 provider 保持既有用户态路径。\n const commandOptions = rootCommands ? { env, user: \"root\" as const } : { env };\n const captureMetadata = rootCommands ? ` && ${captureBaselineMetadataScript()}` : \"\";\n const lockPrivateLedger = rootCommands ? ' && chmod go-rwx \"$GIT_DIR\"' : \"\";\n let ordinaryUid: string | undefined;\n if (rootCommands) {\n // Capture before Agent setup/send can mutate the VM. A post-attempt `id` probe would not be a\n // trustworthy boundary when the configured execution identity itself is root.\n const identity = await sandbox.runShell(\"command -p id -u\", { env });\n ensureCommandSucceeded(identity, \"detect sandbox execution identity for reuse\", false);\n ordinaryUid = identity.stdout.trim();\n }\n // add -A -f:绕过项目自己的 .gitignore(项目 ignore 的文件照常记录);排除靠 pathspec\n // (runner 私有清单,agent / fixture 写 .gitignore 影响不了它);include 用第二次 add 打洞加回。\n const excludeSpecs = excludes.flatMap((pattern) => gitignorePathspecs(pattern, true)).map(shellQuote).join(\" \");\n // include 打洞:路径此刻可能还不存在(如 agent 之后才写),unmatched pathspec 不算错。\n const includeSpecs = includes.flatMap((pattern) => gitignorePathspecs(pattern, false)).map(shellQuote).join(\" \");\n const includeAdd = includeSpecs.length > 0 ? ` && { git -c advice.addEmbeddedRepo=false add -A -f -- ${includeSpecs} 2>/dev/null || true; }` : \"\";\n const rejectGitlinks = \" && nested=$(git ls-files --stage | awk '$1 == \\\"160000\\\" { sub(/^[^\\\\t]*\\\\t/, \\\"\\\"); print; exit }')\" +\n ' && if [ -n \"$nested\" ]; then printf \\'%s\\\\n\\' \"niceeval ledger cannot track nested Git repository $nested as file-level evidence; move the checkout to sandbox.workdir root, or add the whole path to defineEval({ diff: { ignore: [...] } }) when it is intentionally out of scope\" >&2; exit 2; fi';\n const addAll = `git -c advice.addEmbeddedRepo=false add -A -f -- . ${excludeSpecs}${includeAdd}${rejectGitlinks}`;\n const anchor = await sandbox.runShell(\n // The path is predictable inside an isolated VM. Remove any image/prepare-time occupant or\n // symlink, then recreate the exact runner-private directory as root 0700 before Git touches it.\n `rm -rf -- ${shellQuote(gitDir)} && mkdir -p -m 0700 -- ${shellQuote(gitDir)} && ` +\n `git init -q \"${gitDir}\" && ${addAll} && git commit -q --allow-empty -m \"anchor\" && ` +\n `(git rev-parse -q --verify niceeval-reuse-anchor >/dev/null || git tag niceeval-reuse-anchor)` +\n captureMetadata, {\n ...commandOptions,\n });\n ensureCommandSucceeded(anchor, \"create change ledger anchor\", rootCommands);\n return {\n rootExecutionIdentity: ordinaryUid === \"0\",\n attribution: Object.freeze({\n defaultPolicy: \"niceeval.sandbox-ledger/default-excludes/v1\" as const,\n include: includes,\n ignore: ignored,\n }),\n async commitEvalWindow(label: string): Promise<void> {\n // 有未记录变化才落这一笔;干净时不产生空的 eval 归因 commit。\n const result = await sandbox.runShell(`${addAll} && (git diff --cached --quiet || git commit -q -m ${shellQuote(`eval ${label}`)})${lockPrivateLedger}`, {\n ...commandOptions,\n });\n ensureCommandSucceeded(result, `commit eval window ${label}`, rootCommands);\n },\n async commitAgentWindow(label: string): Promise<void> {\n // 窗口内没有变化时也落一条(--allow-empty),diff.json 里该窗口 changes 为空对象。\n const result = await sandbox.runShell(`${addAll} && git commit -q --allow-empty -m ${shellQuote(`agent ${label}`)}${lockPrivateLedger}`, commandOptions);\n ensureCommandSucceeded(result, `commit agent window ${label}`, rootCommands);\n },\n async exportWindows(): Promise<DiffArtifact> {\n return exportAgentWindows(sandbox, commandOptions, exportDir, rootCommands);\n },\n async resetToAnchor(): Promise<void> {\n if (ordinaryUid === \"0\") {\n throw new Error(\"sandboxReuse cannot safely reuse a root-agent sandbox: the Agent could read private ledger objects from prior attempts; use a non-root execution user or disable sandboxReuse\");\n }\n // Root performs the byte reset, then reapplies the content-free baseline metadata mirror so\n // ordinary files return to their original uid/gid/mode instead of becoming root-owned. The\n // private object database stays 0700 throughout; no Agent/background process can read it.\n const result = await sandbox.runShell(`git reset -q --hard niceeval-reuse-anchor && ` +\n `git clean -fd ${excludes.map((pattern) => `-e ${shellQuote(pattern)}`).join(\" \")} && ` +\n restoreBaselineMetadataScript(), commandOptions);\n ensureCommandSucceeded(result, \"reset reusable sandbox to anchor and restore ownership\", rootCommands);\n },\n };\n}\nasync function exportAgentWindows(sandbox: Sandbox, commandOptions: {\n readonly env: globalThis.Record<string, string>;\n readonly user?: \"root\";\n}, exportDir: string, rootCommands: boolean): Promise<DiffArtifact> {\n try {\n const result = await sandbox.runShell(buildExportScript(exportDir), commandOptions);\n ensureCommandSucceeded(result, \"export agent windows\", rootCommands);\n const manifest = parseExportManifest(await sandbox.readText(`${exportDir}/manifest.txt`));\n const chunks: Buffer[] = [];\n for (const part of manifest.parts) {\n const bytes = Buffer.from(await sandbox.readBytes(`${exportDir}/export.part.${part.suffix}`));\n if (bytes.byteLength !== part.bytes) {\n throw new Error(`niceeval ledger export: part ${part.suffix} has ${bytes.byteLength} bytes, expected ${part.bytes}`);\n }\n const algorithm = part.oid.length === 40 ? \"sha1\" : \"sha256\";\n const actual = createHash(algorithm)\n .update(`blob ${bytes.byteLength}\\0`, \"utf8\")\n .update(bytes)\n .digest(\"hex\");\n if (actual !== part.oid) {\n throw new Error(`niceeval ledger export: checksum mismatch for part ${part.suffix}`);\n }\n chunks.push(bytes);\n }\n const payload = Buffer.concat(chunks, manifest.totalBytes);\n if (payload.byteLength !== manifest.totalBytes) {\n throw new Error(\"niceeval ledger export: assembled payload length mismatch\");\n }\n return parseExportPayload(payload);\n }\n finally {\n await sandbox.runShell(`rm -rf ${shellQuote(exportDir)}`, commandOptions).catch(() => undefined);\n }\n}\ninterface ExportManifestPart {\n readonly suffix: string;\n readonly bytes: number;\n readonly oid: string;\n}\ninterface ExportManifest {\n readonly totalBytes: number;\n readonly parts: readonly ExportManifestPart[];\n}\nfunction manifestInteger(text: string, label: string, maximum: number): number {\n if (!/^(?:0|[1-9][0-9]*)$/.test(text)) {\n throw new Error(`niceeval ledger export: invalid manifest ${label}`);\n }\n const value = Number(text);\n if (!Number.isSafeInteger(value) || value < 0 || value > maximum) {\n throw new Error(`niceeval ledger export: manifest ${label} exceeds its limit`);\n }\n return value;\n}\nfunction parseExportManifest(text: string): ExportManifest {\n const lines = text.endsWith(\"\\n\") ? text.slice(0, -1).split(\"\\n\") : text.split(\"\\n\");\n if (lines[0] !== EXPORT_MANIFEST_HEADER) {\n throw new Error(\"niceeval ledger export: unsupported manifest header\");\n }\n const totalMatch = /^total ([0-9]+)$/.exec(lines[1] ?? \"\");\n const partsMatch = /^parts ([0-9]+)$/.exec(lines[2] ?? \"\");\n if (totalMatch === null || partsMatch === null) {\n throw new Error(\"niceeval ledger export: malformed manifest summary\");\n }\n const totalBytes = manifestInteger(totalMatch[1]!, \"total bytes\", MAX_EXPORT_BYTES);\n const partCount = manifestInteger(partsMatch[1]!, \"part count\", MAX_EXPORT_PARTS);\n const expectedPartCount = Math.ceil(totalBytes / EXPORT_PART_BYTES);\n if (partCount !== expectedPartCount || lines.length !== partCount + 3) {\n throw new Error(\"niceeval ledger export: manifest part count mismatch\");\n }\n const parts: ExportManifestPart[] = [];\n let retainedBytes = 0;\n for (let index = 0; index < partCount; index += 1) {\n const match = /^part ([0-9]{6}) ([0-9]+) ([0-9a-f]{40}|[0-9a-f]{64})$/.exec(lines[index + 3] ?? \"\");\n const suffix = String(index).padStart(6, \"0\");\n if (match === null || match[1] !== suffix) {\n throw new Error(`niceeval ledger export: invalid or non-contiguous part ${suffix}`);\n }\n const expectedBytes = Math.min(EXPORT_PART_BYTES, totalBytes - retainedBytes);\n const bytes = manifestInteger(match[2]!, `part ${suffix} bytes`, EXPORT_PART_BYTES);\n if (bytes !== expectedBytes || bytes === 0) {\n throw new Error(`niceeval ledger export: invalid length for part ${suffix}`);\n }\n retainedBytes += bytes;\n parts.push(Object.freeze({ suffix, bytes, oid: match[3]! }));\n }\n if (retainedBytes !== totalBytes) {\n throw new Error(\"niceeval ledger export: manifest total length mismatch\");\n }\n return Object.freeze({ totalBytes, parts: Object.freeze(parts) });\n}\nfunction ensureCommandSucceeded(result: {\n exitCode: number;\n stderr: string;\n}, operation: string, rootCommands: boolean, permissionGuidance?: string): void {\n if (result.exitCode === 0)\n return;\n const lines = result.stderr.trim().split(\"\\n\").filter(Boolean);\n const permission = lines.find((line) => /permission denied|operation not permitted/i.test(line));\n if (permission !== undefined) {\n const guidance = permissionGuidance ?? (rootCommands\n ? \"the provider declared root command support, but root ledger execution still could not read the workspace; check its root command mapping\"\n : \"this sandbox provider does not support root ledger commands; use a root-capable provider for tasks that intentionally start with unreadable files instead of chmod/chowning away the task condition\");\n throw new Error(`${operation} failed (exit ${result.exitCode}): ${permission}; ${guidance}`);\n }\n // git 可能先输出 advisory warning,再输出 niceeval 的可操作诊断;最后一行最接近失败根因。\n const detail = lines.at(-1);\n throw new Error(`${operation} failed (exit ${result.exitCode})${detail ? `: ${detail}` : \"\"}`);\n}\n// ---------- 导出文件的宿主侧解析(严格校验:帧、git 输出形状、尺寸与内容的完备性) ----------\nconst ZERO_SHA = /^0+$/;\nfunction parseExportPayload(payload: Buffer): DiffArtifact {\n const windows: DiffWindow[] = [];\n let offset = 0;\n const readLine = (): string => {\n const newline = payload.indexOf(0x0a, offset);\n if (newline === -1)\n throw new Error(\"niceeval ledger export: truncated header\");\n const line = payload.subarray(offset, newline).toString(\"utf8\");\n offset = newline + 1;\n return line;\n };\n const readSection = (expected: string): Buffer => {\n const header = readLine().split(\" \");\n if (header.length !== 3 || header[0] !== \"section\" || header[1] !== expected) {\n throw new Error(`niceeval ledger export: expected section ${expected}, got ${JSON.stringify(header.join(\" \"))}`);\n }\n const length = Number(header[2]);\n if (!isNonNegativeInteger(length) || offset + length > payload.length) {\n throw new Error(`niceeval ledger export: invalid ${expected} section length`);\n }\n const body = payload.subarray(offset, offset + length);\n offset += length;\n return body;\n };\n while (offset < payload.length) {\n const header = readLine();\n if (!header.startsWith(\"window \"))\n throw new Error(`niceeval ledger export: expected window header, got ${JSON.stringify(header)}`);\n const rest = header.slice(\"window \".length);\n const space = rest.indexOf(\" \");\n const label = space === -1 ? \"\" : rest.slice(space + 1);\n const entries = parseDiffTree(readSection(\"difftree\"), label);\n const binaryPaths = parseBinaryPaths(readSection(\"numstat\"), label);\n const sizeBySha = parseSizes(readSection(\"sizes\"), label);\n const contentBySha = parseBlobBatch(readSection(\"blobs\"), label);\n const changes: globalThis.Record<string, WindowChange> = {};\n for (const entry of entries) {\n const change: WindowChange = { status: entry.status };\n // 沙箱侧决定「哪些文本 blob 进 --batch」的两条判据在宿主侧同样成立(binary 段 + sizes 段\n // 都在导出文件里),所以这里独立重算,不需要沙箱再输出一份省略清单。\n const beforeBytes = entry.status === \"added\" ? undefined : requireSize(sizeBySha, entry.beforeSha, label, entry.path);\n const afterBytes = entry.status === \"deleted\" ? undefined : requireSize(sizeBySha, entry.afterSha, label, entry.path);\n const binary = binaryPaths.has(entry.path);\n const oversized = (beforeBytes ?? 0) > MAX_FILE_TEXT_BYTES || (afterBytes ?? 0) > MAX_FILE_TEXT_BYTES;\n if (binary || oversized) {\n change.elided = { reason: binary ? \"binary\" : \"oversized-text\" };\n if (beforeBytes !== undefined)\n change.elided.beforeBytes = beforeBytes;\n if (afterBytes !== undefined)\n change.elided.afterBytes = afterBytes;\n }\n else {\n if (entry.status !== \"added\")\n change.before = requireContent(contentBySha, entry.beforeSha, label, entry.path);\n if (entry.status !== \"deleted\")\n change.after = requireContent(contentBySha, entry.afterSha, label, entry.path);\n }\n changes[entry.path] = change;\n }\n windows.push({ window: label, changes });\n }\n return windows;\n}\ninterface DiffTreeEntry {\n path: string;\n status: WindowChange[\"status\"];\n beforeSha: string;\n afterSha: string;\n}\n/** `git diff-tree -r --no-renames -z` 原始输出:`:mode mode sha sha status NUL path NUL` 重复。 */\nfunction parseDiffTree(section: Buffer, label: string): DiffTreeEntry[] {\n const parts = section.toString(\"utf8\").split(\"\\0\");\n const entries: DiffTreeEntry[] = [];\n for (let i = 0; i < parts.length;) {\n const meta = parts[i++];\n if (!meta)\n continue;\n const path = parts[i++];\n const fields = meta.split(\" \");\n if (path === undefined || fields.length !== 5 || !fields[0]!.startsWith(\":\")) {\n throw new Error(`export window ${label}: malformed git diff-tree output`);\n }\n const code = fields[4]!;\n const status = code.startsWith(\"A\") ? \"added\" : code.startsWith(\"D\") ? \"deleted\" : \"modified\";\n entries.push({ path, status, beforeSha: fields[2]!, afterSha: fields[3]! });\n }\n return entries;\n}\n/** `git diff-tree --numstat -z`:二进制条目的 added/removed 计数是 `-`。 */\nfunction parseBinaryPaths(section: Buffer, label: string): Set<string> {\n const paths = new Set<string>();\n for (const record of section.toString(\"utf8\").split(\"\\0\")) {\n if (!record)\n continue;\n const firstTab = record.indexOf(\"\\t\");\n const secondTab = record.indexOf(\"\\t\", firstTab + 1);\n if (firstTab === -1 || secondTab === -1)\n throw new Error(`export window ${label}: malformed git --numstat output`);\n if (record.slice(0, firstTab) === \"-\" && record.slice(firstTab + 1, secondTab) === \"-\") {\n paths.add(record.slice(secondTab + 1));\n }\n }\n return paths;\n}\n/** `git cat-file --batch-check`:每行 `sha type size`(输入是逐出现次数的 sha,重复无害)。 */\nfunction parseSizes(section: Buffer, label: string): Map<string, number> {\n const sizes = new Map<string, number>();\n for (const line of section.toString(\"utf8\").split(\"\\n\")) {\n if (!line)\n continue;\n const fields = line.split(\" \");\n const size = Number(fields[fields.length - 1]);\n if (fields.length < 3 || !isNonNegativeInteger(size)) {\n throw new Error(`export window ${label}: malformed git cat-file --batch-check output`);\n }\n sizes.set(fields[0]!, size);\n }\n return sizes;\n}\n/** `git cat-file --batch`:自带长度帧——`sha type size\\n` + size 字节内容 + `\\n`。 */\nfunction parseBlobBatch(section: Buffer, label: string): Map<string, string> {\n const contents = new Map<string, string>();\n let offset = 0;\n while (offset < section.length) {\n const newline = section.indexOf(0x0a, offset);\n if (newline === -1)\n throw new Error(`export window ${label}: malformed git cat-file --batch header`);\n const fields = section.subarray(offset, newline).toString(\"utf8\").split(\" \");\n const size = Number(fields[fields.length - 1]);\n if (fields.length < 3 || !isNonNegativeInteger(size)) {\n throw new Error(`export window ${label}: malformed git cat-file --batch header`);\n }\n const contentStart = newline + 1;\n const contentEnd = contentStart + size;\n if (contentEnd >= section.length || section[contentEnd] !== 0x0a) {\n throw new Error(`export window ${label}: truncated git cat-file --batch content`);\n }\n contents.set(fields[0]!, section.subarray(contentStart, contentEnd).toString(\"utf8\"));\n offset = contentEnd + 1;\n }\n return contents;\n}\nfunction requireSize(sizes: Map<string, number>, sha: string, label: string, path: string): number {\n const size = sizes.get(sha);\n if (size === undefined || ZERO_SHA.test(sha))\n throw new Error(`export window ${label}: missing blob size for ${JSON.stringify(path)}`);\n return size;\n}\nfunction requireContent(contents: Map<string, string>, sha: string, label: string, path: string): string {\n const content = contents.get(sha);\n if (content === undefined || ZERO_SHA.test(sha))\n throw new Error(`export window ${label}: missing blob content for ${JSON.stringify(path)}`);\n return content;\n}\nfunction isNonNegativeInteger(value: unknown): value is number {\n return typeof value === \"number\" && Number.isSafeInteger(value) && value >= 0;\n}\n"]}
|
|
@@ -12,6 +12,7 @@ const eval_selection_ts_1 = require("./eval-selection.cjs");
|
|
|
12
12
|
const execution_identity_ts_1 = require("./execution-identity.cjs");
|
|
13
13
|
const fingerprint_ts_1 = require("./fingerprint.cjs");
|
|
14
14
|
const timeout_ts_1 = require("./timeout.cjs");
|
|
15
|
+
const aggregate_ts_1 = require("../shared/aggregate.cjs");
|
|
15
16
|
/** Project-current config loading is the only Promise boundary in this module. */
|
|
16
17
|
class ProjectCurrentLoadError extends effect_1.Data.TaggedError("ProjectCurrentLoadError") {
|
|
17
18
|
}
|
|
@@ -39,18 +40,24 @@ function loadProjectCurrent(cwd, options = {}) {
|
|
|
39
40
|
const selectors = options.experiments === undefined
|
|
40
41
|
? []
|
|
41
42
|
: Array.isArray(options.experiments) ? options.experiments : [options.experiments];
|
|
42
|
-
const
|
|
43
|
+
const availableExperimentIds = experiments.map((entry) => entry.id);
|
|
44
|
+
const availableIds = new Set(availableExperimentIds);
|
|
45
|
+
const selectedIds = new Set();
|
|
43
46
|
for (const selector of selectors) {
|
|
44
|
-
|
|
47
|
+
const matches = (0, aggregate_ts_1.matchExperimentSelector)(availableExperimentIds, selector);
|
|
48
|
+
if (matches.length === 0) {
|
|
45
49
|
return yield* effect_1.Effect.fail(new ProjectCurrentLoadError({
|
|
46
50
|
stage: "selection",
|
|
47
51
|
message: `Unknown current project Experiment ${JSON.stringify(selector)}.`,
|
|
48
52
|
}));
|
|
49
53
|
}
|
|
54
|
+
for (const match of matches)
|
|
55
|
+
selectedIds.add(match);
|
|
56
|
+
}
|
|
57
|
+
if (selectors.length === 0) {
|
|
58
|
+
for (const id of availableIds)
|
|
59
|
+
selectedIds.add(id);
|
|
50
60
|
}
|
|
51
|
-
const selectedIds = selectors.length === 0
|
|
52
|
-
? availableIds
|
|
53
|
-
: new Set(selectors);
|
|
54
61
|
if (selectedIds.size === 0) {
|
|
55
62
|
return yield* effect_1.Effect.fail(new ProjectCurrentLoadError({
|
|
56
63
|
stage: "selection",
|
|
@@ -78,6 +85,7 @@ function loadProjectCurrent(cwd, options = {}) {
|
|
|
78
85
|
earlyExit: experiment.earlyExit ?? false,
|
|
79
86
|
sandbox: experiment.sandbox,
|
|
80
87
|
sandboxReuse: experiment.sandboxReuse,
|
|
88
|
+
...(experiment.sharedState === undefined ? {} : { sharedState: experiment.sharedState }),
|
|
81
89
|
judge: experiment.judge,
|
|
82
90
|
...(0, timeout_ts_1.resolveRunTimeout)(undefined, experiment.timeoutMs),
|
|
83
91
|
budget: experiment.budget,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"project-current.js","sourceRoot":"","sources":["project-current.ts"],"names":[],"mappings":"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","sourcesContent":["// 项目 current 的宿主编排:发现定义 → 应用 selector → 无派发 identity planning。\n// Record、carry、rerun 与历史结果都不进入这里;show/view/out 共用这一条入口。\nimport { Data, Effect, Either, Schema } from \"effect\";\nimport type { AnalysisCurrentSlotIdentity } from \"../analysis/contracts.ts\";\nimport { EvalIdSchema, ExecutionIdentityDigestSchema, ExperimentIdSchema, } from \"../record/codec/identifiers.ts\";\nimport { loadConfigFile } from \"../load-config.ts\";\nimport { discoverEvals, discoverExperiments, type DiscoveryError } from \"./discover.ts\";\nimport { resolveExperimentEvals } from \"./eval-selection.ts\";\nimport { slotExecutionIdentityDigestHex } from \"./execution-identity.ts\";\nimport { planProjectTarget, type FingerprintPlanningFailure, type ProjectTargetPlan, } from \"./fingerprint.ts\";\nimport type { ProjectCurrentTarget } from \"./project-target.ts\";\nimport type { SandboxRunPlanningError } from \"./sandbox-selection.ts\";\nimport { resolveAttemptTimeout, resolveRunTimeout } from \"./timeout.ts\";\nimport type { AgentRun, Config } from \"./types.ts\";\nexport interface LoadProjectCurrentOptions {\n experiments?: string | readonly string[];\n evals?: readonly string[];\n freshImport?: boolean;\n}\nexport interface LoadedProjectCurrent {\n target: ProjectCurrentTarget;\n watchInputs: readonly string[];\n currentSlots: readonly AnalysisCurrentSlotIdentity[];\n}\n/** Project-current config loading is the only Promise boundary in this module. */\nexport class ProjectCurrentLoadError extends Data.TaggedError(\"ProjectCurrentLoadError\")<{\n readonly stage: \"config\" | \"selection\";\n readonly message: string;\n}> {\n}\nfunction loadProjectConfig(cwd: string, options: {\n freshImport?: boolean;\n}): Effect.Effect<Config, ProjectCurrentLoadError> {\n return Effect.tryPromise({\n try: () => loadConfigFile(cwd, options),\n catch: (cause) => new ProjectCurrentLoadError({\n stage: \"config\",\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n });\n}\n/**\n * Discovers and plans the current project without closing the Effect runtime.\n * CLI and view are the Promise-facing application hosts for this operation.\n */\nexport function loadProjectCurrent(cwd: string, options: LoadProjectCurrentOptions = {}): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure> {\n const discoveryOptions = { freshImport: options.freshImport };\n return Effect.gen(function* () {\n // namespaced fresh import 是进程级 loader 边界,按顺序装载,避免三棵图并发注册互相卡住。\n const config = yield* loadProjectConfig(cwd, discoveryOptions);\n const evals = yield* discoverEvals(cwd, discoveryOptions);\n const experiments = yield* discoverExperiments(cwd, discoveryOptions);\n const selectors = options.experiments === undefined\n ? []\n : Array.isArray(options.experiments) ? options.experiments : [options.experiments];\n const availableIds = new Set(experiments.map((entry) => entry.id));\n for (const selector of selectors) {\n if (!availableIds.has(selector)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Unknown current project Experiment ${JSON.stringify(selector)}.`,\n }));\n }\n }\n const selectedIds = selectors.length === 0\n ? availableIds\n : new Set(selectors);\n if (selectedIds.size === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project has no Experiments to show.\",\n }));\n }\n const runs = yield* Effect.sync((): AgentRun[] => {\n const selectedRuns: AgentRun[] = [];\n for (const experiment of experiments) {\n if (!selectedIds.has(experiment.id))\n continue;\n const { selectedEvalIds } = resolveExperimentEvals({\n experimentId: experiment.id,\n selector: experiment.evals,\n cliPatterns: [...(options.evals ?? [])],\n evals,\n });\n selectedRuns.push({\n agent: experiment.agent,\n model: experiment.model,\n reasoningEffort: experiment.reasoningEffort,\n flags: experiment.flags ?? {},\n plugins: experiment.plugins,\n attempts: experiment.attempts ?? 1,\n earlyExit: experiment.earlyExit ?? false,\n sandbox: experiment.sandbox,\n sandboxReuse: experiment.sandboxReuse,\n judge: experiment.judge,\n ...resolveRunTimeout(undefined, experiment.timeoutMs),\n budget: experiment.budget,\n selectedEvalIds,\n experimentId: experiment.id,\n experimentBaseDir: experiment.baseDir,\n experimentSourcePath: experiment.sourcePath,\n description: experiment.description,\n labels: experiment.labels,\n maxConcurrency: experiment.maxConcurrency,\n setup: experiment.setup,\n teardown: experiment.teardown,\n classifyFailure: experiment.classifyFailure,\n });\n }\n return selectedRuns;\n });\n if (runs.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project target contains no runnable Experiments.\",\n }));\n }\n const plan: ProjectTargetPlan = yield* planProjectTarget(evals, runs, config.timeoutMs, { configJudge: config.judge });\n if (plan.target.experiments.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project target contains no Eval results to show.\",\n }));\n }\n const currentSlots = yield* currentSlotIdentities(runs, plan, config);\n return {\n target: plan.target,\n currentSlots,\n watchInputs: Object.freeze([\n ...new Set([`${cwd}/niceeval.config.ts`, ...plan.watchInputs]),\n ].sort()),\n };\n });\n}\nfunction currentSlotIdentities(runs: readonly AgentRun[], plan: ProjectTargetPlan, config: Config): Effect.Effect<readonly AnalysisCurrentSlotIdentity[], ProjectCurrentLoadError> {\n return Effect.gen(function* () {\n const slots: AnalysisCurrentSlotIdentity[] = [];\n const seen = new Set<string>();\n for (const run of runs) {\n for (const pair of plan.preparedPairsByKey.values()) {\n if (pair.run.experimentId !== run.experimentId)\n continue;\n const fingerprint = plan.plannedFingerprints.get(pair.key);\n const configHash = plan.plannedConfigHashes.get(pair.key);\n if (fingerprint === undefined || configHash === undefined) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current identity planning omitted Eval ${JSON.stringify(pair.evalDef.id)}.`,\n }));\n }\n const timeout = resolveAttemptTimeout(run, pair.evalDef, config);\n const experimentId = Schema.decodeUnknownEither(ExperimentIdSchema)(run.experimentId);\n const evalId = Schema.decodeUnknownEither(EvalIdSchema)(pair.evalDef.id);\n if (Either.isLeft(experimentId) || Either.isLeft(evalId)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current target produced an invalid Experiment or Eval identity.`,\n }));\n }\n for (let attempt = 0; attempt < run.attempts; attempt += 1) {\n const digestValue = slotExecutionIdentityDigestHex({\n experimentId: run.experimentId,\n evalId: pair.evalDef.id,\n attempt,\n input: { domain: \"niceeval.input/fingerprint-v1\", value: fingerprint },\n config: { domain: \"niceeval.config/identity-v1\", value: configHash },\n timeout: timeout === undefined\n ? null\n : { domain: \"niceeval.execution-duration/v1\", milliseconds: timeout.timeoutMs },\n });\n const digest = Schema.decodeUnknownEither(ExecutionIdentityDigestSchema)(digestValue);\n if (Either.isLeft(digest)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current target produced an invalid execution identity digest.`,\n }));\n }\n const key = `${experimentId.right}\\0${evalId.right}\\0${String(attempt)}\\0${digest.right}`;\n if (seen.has(key))\n continue;\n seen.add(key);\n slots.push(Object.freeze({\n experimentId: experimentId.right,\n evalId: evalId.right,\n attemptOrdinal: attempt,\n executionIdentityDigest: digest.right,\n }));\n }\n }\n }\n return Object.freeze(slots);\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"project-current.js","sourceRoot":"","sources":["project-current.ts"],"names":[],"mappings":";;;AA8CA,gDA+FC;AA7ID,+DAA+D;AAC/D,wDAAwD;AACxD,mCAAsD;AAEtD,mEAAkH;AAClH,sDAAmD;AACnD,+CAAwF;AACxF,2DAA6D;AAC7D,mEAAyE;AACzE,qDAA+G;AAG/G,6CAAwE;AAExE,yDAAiE;AAWjE,kFAAkF;AAClF,MAAa,uBAAwB,SAAQ,aAAI,CAAC,WAAW,CAAC,yBAAyB,CAGrF;CACD;AAJD,0DAIC;AACD,SAAS,iBAAiB,CAAC,GAAW,EAAE,OAEvC;IACG,OAAO,eAAM,CAAC,UAAU,CAAC;QACrB,GAAG,EAAE,GAAG,EAAE,CAAC,IAAA,+BAAc,EAAC,GAAG,EAAE,OAAO,CAAC;QACvC,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,uBAAuB,CAAC;YAC1C,KAAK,EAAE,QAAQ;YACf,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC;SAClE,CAAC;KACL,CAAC,CAAC;AACP,CAAC;AACD;;;GAGG;AACH,SAAgB,kBAAkB,CAAC,GAAW,EAAE,UAAqC,EAAE;IACnF,MAAM,gBAAgB,GAAG,EAAE,WAAW,EAAE,OAAO,CAAC,WAAW,EAAE,CAAC;IAC9D,OAAO,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvB,8DAA8D;QAC9D,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,iBAAiB,CAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC/D,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,IAAA,2BAAa,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QAC1D,MAAM,WAAW,GAAG,KAAK,CAAC,CAAC,IAAA,iCAAmB,EAAC,GAAG,EAAE,gBAAgB,CAAC,CAAC;QACtE,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,KAAK,SAAS;YAC/C,CAAC,CAAC,EAAE;YACJ,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;QACvF,MAAM,sBAAsB,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACpE,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;QACtC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,IAAA,sCAAuB,EAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;YAC1E,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;oBAClD,KAAK,EAAE,WAAW;oBAClB,OAAO,EAAE,sCAAsC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG;iBAC7E,CAAC,CAAC,CAAC;YACR,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,OAAO;gBACvB,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QAC/B,CAAC;QACD,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,EAAE,IAAI,YAAY;gBACzB,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC5B,CAAC;QACD,IAAI,WAAW,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACzB,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;gBAClD,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,iDAAiD;aAC7D,CAAC,CAAC,CAAC;QACR,CAAC;QACD,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,GAAe,EAAE;YAC7C,MAAM,YAAY,GAAe,EAAE,CAAC;YACpC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;gBACnC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;oBAC/B,SAAS;gBACb,MAAM,EAAE,eAAe,EAAE,GAAG,IAAA,0CAAsB,EAAC;oBAC/C,YAAY,EAAE,UAAU,CAAC,EAAE;oBAC3B,QAAQ,EAAE,UAAU,CAAC,KAAK;oBAC1B,WAAW,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;oBACvC,KAAK;iBACR,CAAC,CAAC;gBACH,YAAY,CAAC,IAAI,CAAC;oBACd,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,eAAe,EAAE,UAAU,CAAC,eAAe;oBAC3C,KAAK,EAAE,UAAU,CAAC,KAAK,IAAI,EAAE;oBAC7B,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,QAAQ,EAAE,UAAU,CAAC,QAAQ,IAAI,CAAC;oBAClC,SAAS,EAAE,UAAU,CAAC,SAAS,IAAI,KAAK;oBACxC,OAAO,EAAE,UAAU,CAAC,OAAO;oBAC3B,YAAY,EAAE,UAAU,CAAC,YAAY;oBACrC,GAAG,CAAC,UAAU,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,UAAU,CAAC,WAAW,EAAE,CAAC;oBACxF,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,GAAG,IAAA,8BAAiB,EAAC,SAAS,EAAE,UAAU,CAAC,SAAS,CAAC;oBACrD,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,eAAe;oBACf,YAAY,EAAE,UAAU,CAAC,EAAE;oBAC3B,iBAAiB,EAAE,UAAU,CAAC,OAAO;oBACrC,oBAAoB,EAAE,UAAU,CAAC,UAAU;oBAC3C,WAAW,EAAE,UAAU,CAAC,WAAW;oBACnC,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,cAAc,EAAE,UAAU,CAAC,cAAc;oBACzC,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,QAAQ,EAAE,UAAU,CAAC,QAAQ;oBAC7B,eAAe,EAAE,UAAU,CAAC,eAAe;iBAC9C,CAAC,CAAC;YACP,CAAC;YACD,OAAO,YAAY,CAAC;QACxB,CAAC,CAAC,CAAC;QACH,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACpB,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;gBAClD,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,8DAA8D;aAC1E,CAAC,CAAC,CAAC;QACR,CAAC;QACD,MAAM,IAAI,GAAsB,KAAK,CAAC,CAAC,IAAA,kCAAiB,EAAC,KAAK,EAAE,IAAI,EAAE,MAAM,CAAC,SAAS,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC;QACvH,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvC,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;gBAClD,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,8DAA8D;aAC1E,CAAC,CAAC,CAAC;QACR,CAAC;QACD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,qBAAqB,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QACtE,OAAO;YACH,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,YAAY;YACZ,WAAW,EAAE,MAAM,CAAC,MAAM,CAAC;gBACvB,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,GAAG,qBAAqB,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC;aACjE,CAAC,IAAI,EAAE,CAAC;SACZ,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,qBAAqB,CAAC,IAAyB,EAAE,IAAuB,EAAE,MAAc;IAC7F,OAAO,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACvB,MAAM,KAAK,GAAkC,EAAE,CAAC;QAChD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACrB,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,EAAE,EAAE,CAAC;gBAClD,IAAI,IAAI,CAAC,GAAG,CAAC,YAAY,KAAK,GAAG,CAAC,YAAY;oBAC1C,SAAS;gBACb,MAAM,WAAW,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC3D,MAAM,UAAU,GAAG,IAAI,CAAC,mBAAmB,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBAC1D,IAAI,WAAW,KAAK,SAAS,IAAI,UAAU,KAAK,SAAS,EAAE,CAAC;oBACxD,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;wBAClD,KAAK,EAAE,WAAW;wBAClB,OAAO,EAAE,0CAA0C,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG;qBACxF,CAAC,CAAC,CAAC;gBACR,CAAC;gBACD,MAAM,OAAO,GAAG,IAAA,kCAAqB,EAAC,GAAG,EAAE,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;gBACjE,MAAM,YAAY,GAAG,eAAM,CAAC,mBAAmB,CAAC,mCAAkB,CAAC,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;gBACtF,MAAM,MAAM,GAAG,eAAM,CAAC,mBAAmB,CAAC,6BAAY,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACzE,IAAI,eAAM,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,eAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;oBACvD,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;wBAClD,KAAK,EAAE,WAAW;wBAClB,OAAO,EAAE,iEAAiE;qBAC7E,CAAC,CAAC,CAAC;gBACR,CAAC;gBACD,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,GAAG,CAAC,QAAQ,EAAE,OAAO,IAAI,CAAC,EAAE,CAAC;oBACzD,MAAM,WAAW,GAAG,IAAA,sDAA8B,EAAC;wBAC/C,YAAY,EAAE,GAAG,CAAC,YAAY;wBAC9B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE;wBACvB,OAAO;wBACP,KAAK,EAAE,EAAE,MAAM,EAAE,+BAA+B,EAAE,KAAK,EAAE,WAAW,EAAE;wBACtE,MAAM,EAAE,EAAE,MAAM,EAAE,6BAA6B,EAAE,KAAK,EAAE,UAAU,EAAE;wBACpE,OAAO,EAAE,OAAO,KAAK,SAAS;4BAC1B,CAAC,CAAC,IAAI;4BACN,CAAC,CAAC,EAAE,MAAM,EAAE,gCAAgC,EAAE,YAAY,EAAE,OAAO,CAAC,SAAS,EAAE;qBACtF,CAAC,CAAC;oBACH,MAAM,MAAM,GAAG,eAAM,CAAC,mBAAmB,CAAC,8CAA6B,CAAC,CAAC,WAAW,CAAC,CAAC;oBACtF,IAAI,eAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;wBACxB,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,uBAAuB,CAAC;4BAClD,KAAK,EAAE,WAAW;4BAClB,OAAO,EAAE,+DAA+D;yBAC3E,CAAC,CAAC,CAAC;oBACR,CAAC;oBACD,MAAM,GAAG,GAAG,GAAG,YAAY,CAAC,KAAK,KAAK,MAAM,CAAC,KAAK,KAAK,MAAM,CAAC,OAAO,CAAC,KAAK,MAAM,CAAC,KAAK,EAAE,CAAC;oBAC1F,IAAI,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;wBACb,SAAS;oBACb,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;oBACd,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC;wBACrB,YAAY,EAAE,YAAY,CAAC,KAAK;wBAChC,MAAM,EAAE,MAAM,CAAC,KAAK;wBACpB,cAAc,EAAE,OAAO;wBACvB,uBAAuB,EAAE,MAAM,CAAC,KAAK;qBACxC,CAAC,CAAC,CAAC;gBACR,CAAC;YACL,CAAC;QACL,CAAC;QACD,OAAO,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAChC,CAAC,CAAC,CAAC;AACP,CAAC","sourcesContent":["// 项目 current 的宿主编排:发现定义 → 应用 selector → 无派发 identity planning。\n// Record、carry、rerun 与历史结果都不进入这里;show/view/out 共用这一条入口。\nimport { Data, Effect, Either, Schema } from \"effect\";\nimport type { AnalysisCurrentSlotIdentity } from \"../analysis/contracts.ts\";\nimport { EvalIdSchema, ExecutionIdentityDigestSchema, ExperimentIdSchema, } from \"../record/codec/identifiers.ts\";\nimport { loadConfigFile } from \"../load-config.ts\";\nimport { discoverEvals, discoverExperiments, type DiscoveryError } from \"./discover.ts\";\nimport { resolveExperimentEvals } from \"./eval-selection.ts\";\nimport { slotExecutionIdentityDigestHex } from \"./execution-identity.ts\";\nimport { planProjectTarget, type FingerprintPlanningFailure, type ProjectTargetPlan, } from \"./fingerprint.ts\";\nimport type { ProjectCurrentTarget } from \"./project-target.ts\";\nimport type { SandboxRunPlanningError } from \"./sandbox-selection.ts\";\nimport { resolveAttemptTimeout, resolveRunTimeout } from \"./timeout.ts\";\nimport type { AgentRun, Config } from \"./types.ts\";\nimport { matchExperimentSelector } from \"../shared/aggregate.ts\";\nexport interface LoadProjectCurrentOptions {\n experiments?: string | readonly string[];\n evals?: readonly string[];\n freshImport?: boolean;\n}\nexport interface LoadedProjectCurrent {\n target: ProjectCurrentTarget;\n watchInputs: readonly string[];\n currentSlots: readonly AnalysisCurrentSlotIdentity[];\n}\n/** Project-current config loading is the only Promise boundary in this module. */\nexport class ProjectCurrentLoadError extends Data.TaggedError(\"ProjectCurrentLoadError\")<{\n readonly stage: \"config\" | \"selection\";\n readonly message: string;\n}> {\n}\nfunction loadProjectConfig(cwd: string, options: {\n freshImport?: boolean;\n}): Effect.Effect<Config, ProjectCurrentLoadError> {\n return Effect.tryPromise({\n try: () => loadConfigFile(cwd, options),\n catch: (cause) => new ProjectCurrentLoadError({\n stage: \"config\",\n message: cause instanceof Error ? cause.message : String(cause),\n }),\n });\n}\n/**\n * Discovers and plans the current project without closing the Effect runtime.\n * CLI and view are the Promise-facing application hosts for this operation.\n */\nexport function loadProjectCurrent(cwd: string, options: LoadProjectCurrentOptions = {}): Effect.Effect<LoadedProjectCurrent, ProjectCurrentLoadError | DiscoveryError | SandboxRunPlanningError | FingerprintPlanningFailure> {\n const discoveryOptions = { freshImport: options.freshImport };\n return Effect.gen(function* () {\n // namespaced fresh import 是进程级 loader 边界,按顺序装载,避免三棵图并发注册互相卡住。\n const config = yield* loadProjectConfig(cwd, discoveryOptions);\n const evals = yield* discoverEvals(cwd, discoveryOptions);\n const experiments = yield* discoverExperiments(cwd, discoveryOptions);\n const selectors = options.experiments === undefined\n ? []\n : Array.isArray(options.experiments) ? options.experiments : [options.experiments];\n const availableExperimentIds = experiments.map((entry) => entry.id);\n const availableIds = new Set(availableExperimentIds);\n const selectedIds = new Set<string>();\n for (const selector of selectors) {\n const matches = matchExperimentSelector(availableExperimentIds, selector);\n if (matches.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Unknown current project Experiment ${JSON.stringify(selector)}.`,\n }));\n }\n for (const match of matches)\n selectedIds.add(match);\n }\n if (selectors.length === 0) {\n for (const id of availableIds)\n selectedIds.add(id);\n }\n if (selectedIds.size === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project has no Experiments to show.\",\n }));\n }\n const runs = yield* Effect.sync((): AgentRun[] => {\n const selectedRuns: AgentRun[] = [];\n for (const experiment of experiments) {\n if (!selectedIds.has(experiment.id))\n continue;\n const { selectedEvalIds } = resolveExperimentEvals({\n experimentId: experiment.id,\n selector: experiment.evals,\n cliPatterns: [...(options.evals ?? [])],\n evals,\n });\n selectedRuns.push({\n agent: experiment.agent,\n model: experiment.model,\n reasoningEffort: experiment.reasoningEffort,\n flags: experiment.flags ?? {},\n plugins: experiment.plugins,\n attempts: experiment.attempts ?? 1,\n earlyExit: experiment.earlyExit ?? false,\n sandbox: experiment.sandbox,\n sandboxReuse: experiment.sandboxReuse,\n ...(experiment.sharedState === undefined ? {} : { sharedState: experiment.sharedState }),\n judge: experiment.judge,\n ...resolveRunTimeout(undefined, experiment.timeoutMs),\n budget: experiment.budget,\n selectedEvalIds,\n experimentId: experiment.id,\n experimentBaseDir: experiment.baseDir,\n experimentSourcePath: experiment.sourcePath,\n description: experiment.description,\n labels: experiment.labels,\n maxConcurrency: experiment.maxConcurrency,\n setup: experiment.setup,\n teardown: experiment.teardown,\n classifyFailure: experiment.classifyFailure,\n });\n }\n return selectedRuns;\n });\n if (runs.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project target contains no runnable Experiments.\",\n }));\n }\n const plan: ProjectTargetPlan = yield* planProjectTarget(evals, runs, config.timeoutMs, { configJudge: config.judge });\n if (plan.target.experiments.length === 0) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: \"The current project target contains no Eval results to show.\",\n }));\n }\n const currentSlots = yield* currentSlotIdentities(runs, plan, config);\n return {\n target: plan.target,\n currentSlots,\n watchInputs: Object.freeze([\n ...new Set([`${cwd}/niceeval.config.ts`, ...plan.watchInputs]),\n ].sort()),\n };\n });\n}\nfunction currentSlotIdentities(runs: readonly AgentRun[], plan: ProjectTargetPlan, config: Config): Effect.Effect<readonly AnalysisCurrentSlotIdentity[], ProjectCurrentLoadError> {\n return Effect.gen(function* () {\n const slots: AnalysisCurrentSlotIdentity[] = [];\n const seen = new Set<string>();\n for (const run of runs) {\n for (const pair of plan.preparedPairsByKey.values()) {\n if (pair.run.experimentId !== run.experimentId)\n continue;\n const fingerprint = plan.plannedFingerprints.get(pair.key);\n const configHash = plan.plannedConfigHashes.get(pair.key);\n if (fingerprint === undefined || configHash === undefined) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current identity planning omitted Eval ${JSON.stringify(pair.evalDef.id)}.`,\n }));\n }\n const timeout = resolveAttemptTimeout(run, pair.evalDef, config);\n const experimentId = Schema.decodeUnknownEither(ExperimentIdSchema)(run.experimentId);\n const evalId = Schema.decodeUnknownEither(EvalIdSchema)(pair.evalDef.id);\n if (Either.isLeft(experimentId) || Either.isLeft(evalId)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current target produced an invalid Experiment or Eval identity.`,\n }));\n }\n for (let attempt = 0; attempt < run.attempts; attempt += 1) {\n const digestValue = slotExecutionIdentityDigestHex({\n experimentId: run.experimentId,\n evalId: pair.evalDef.id,\n attempt,\n input: { domain: \"niceeval.input/fingerprint-v1\", value: fingerprint },\n config: { domain: \"niceeval.config/identity-v1\", value: configHash },\n timeout: timeout === undefined\n ? null\n : { domain: \"niceeval.execution-duration/v1\", milliseconds: timeout.timeoutMs },\n });\n const digest = Schema.decodeUnknownEither(ExecutionIdentityDigestSchema)(digestValue);\n if (Either.isLeft(digest)) {\n return yield* Effect.fail(new ProjectCurrentLoadError({\n stage: \"selection\",\n message: `Current target produced an invalid execution identity digest.`,\n }));\n }\n const key = `${experimentId.right}\\0${evalId.right}\\0${String(attempt)}\\0${digest.right}`;\n if (seen.has(key))\n continue;\n seen.add(key);\n slots.push(Object.freeze({\n experimentId: experimentId.right,\n evalId: evalId.right,\n attemptOrdinal: attempt,\n executionIdentityDigest: digest.right,\n }));\n }\n }\n }\n return Object.freeze(slots);\n });\n}\n"]}
|