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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"compute.js","sourceRoot":"","sources":["compute.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Closed-data assembly for the report summary components.\n *\n * These helpers deliberately keep all statistical meaning in the published\n * Analysis facade. They may inspect the fixed Sample snapshot for identity\n * and coverage facts, but never open a Record, construct a MetricValue, or\n * implement a second reducer.\n */\nimport { narrowSample, type CostMetricValue, type MetricValue, type PricingProfile, type Sample, } from \"../../../analysis/index.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport { aggregate, agent, evalId, experiment, label, model, type ReportGroup, } from \"../../model/aggregate.ts\";\nimport { toAttemptEvidence } from \"../../model/conversions.ts\";\nimport { costUSD, evidenceRow, hasMetricValue, passRate, totalCostUSD, type EvidenceRow, } from \"../../model/metrics.ts\";\nimport { dimensionField, metricField, } from \"../../model/dataset.ts\";\nimport type { VerdictCounts } from \"../../definition/cell.tsx\";\nimport type { Dataset } from \"../../model/types.ts\";\nexport interface SampleSummaryData {\n readonly earliestStartedAt: string | null;\n readonly latestStartedAt: string | null;\n readonly experiments: number;\n readonly evals: number;\n readonly attempts: number;\n readonly verdicts: VerdictCounts;\n readonly passRate: MetricValue<number> | null;\n /** 成本投影读数;Report 未声明 PricingProfile 时为 null(不请求 measure)。 */\n readonly totalCostUSD: CostMetricValue | null;\n}\nexport type SummarySeries = \"agent\" | \"model\" | \"experiment\" | ReportGroup;\nexport interface ExperimentScatterData {\n readonly connect: boolean;\n readonly points: readonly ExperimentScatterPoint[];\n}\nexport interface ExperimentScatterPoint extends EvidenceRow {\n readonly key: string;\n readonly experiment: string;\n readonly series: string;\n /** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */\n readonly costUSD: CostMetricValue;\n readonly passRate: MetricValue<number>;\n}\nexport interface StabilityPoint extends EvidenceRow {\n readonly key: string;\n readonly evalId: string;\n readonly condition: string;\n /** Analysis-owned denominator for this exact condition × eval metric. */\n readonly executions: number;\n readonly passRate: MetricValue<number>;\n}\nexport interface StabilityOverviewData {\n readonly executions: number;\n readonly neverPassed: number;\n readonly flaky: number;\n readonly points: readonly StabilityPoint[];\n readonly dataset: Dataset;\n}\n/**\n * Produces the familiar range/KPI summary from one fixed Sample. The counts\n * are closed Sample identity facts; the numeric readings are emitted by\n * Analysis unchanged. The cost projection is requested only when the Report\n * declares a PricingProfile; without one nothing is measured or captured.\n */\nexport async function sampleSummaryData(sample: Sample, votes: \"eval\" | \"attempt\", pricing: PricingProfile | null): Promise<SampleSummaryData> {\n const [summary, evidence] = pricing === null\n ? await Promise.all([\n aggregate(sample, { by: {}, values: { passRate } }),\n toAttemptEvidence(sample),\n ])\n : await Promise.all([\n aggregate(sample, {\n by: {},\n values: { passRate, totalCostUSD: totalCostUSD(pricing) },\n }),\n toAttemptEvidence(sample),\n ]);\n const currentSlots = sample.snapshot.slots.filter((slot) => slot.state !== \"excluded\");\n const first = summary[0];\n const range = runRange(sample);\n return Object.freeze({\n ...range,\n experiments: new Set(currentSlots.map((slot) => String(slot.experimentId))).size,\n evals: new Set(currentSlots.map((slot) => String(slot.evalId))).size,\n attempts: currentSlots.filter((slot) => slot.state === \"included\").length,\n verdicts: tallyVerdicts(sample, evidence.entries, votes),\n passRate: first?.passRate ?? null,\n totalCostUSD: first === undefined || pricing === null\n ? null\n : (first as unknown as {\n readonly totalCostUSD: CostMetricValue;\n }).totalCostUSD,\n });\n}\n/**\n * Uses Analysis rows for every plotted value. Only display-safe dimensions\n * are normalized into strings; MetricValue, issues, and evidence stay intact.\n * The x axis always stays cost × passRate; duration never replaces cost.\n */\nexport async function experimentScatterData(sample: Sample, options: {\n readonly series?: SummarySeries;\n readonly connect?: boolean;\n}, pricing: PricingProfile): Promise<ExperimentScatterData> {\n const line = label(\"line\");\n const hasLine = sample.snapshot.runs.some((run) => run.context?.labels.line !== undefined);\n const group = groupFor(options.series, hasLine ? line : agent);\n const connect = options.connect ?? (group === line);\n const rows = await aggregate(sample, {\n by: { experiment, series: group },\n values: { costUSD: costUSD(pricing), passRate },\n });\n const points = Object.freeze(rows.map((row): ExperimentScatterPoint => evidenceRow({\n key: row.key,\n experiment: String(row.experiment),\n series: dimensionText(row.series),\n costUSD: (row as unknown as {\n readonly costUSD: CostMetricValue;\n }).costUSD,\n passRate: row.passRate,\n })));\n return Object.freeze({ connect, points });\n}\n/**\n * Builds stability display data from per-eval Analysis pass-rate rows. The\n * `executions` coordinate is the existing metric denominator, not a Report\n * metric. This retains partial/missing states instead of manufacturing zero\n * values or a second verdict reducer.\n */\nexport async function stabilityOverviewData(sample: Sample, options: {\n readonly columns?: SummarySeries;\n readonly evals?: string | readonly string[];\n}): Promise<StabilityOverviewData> {\n const scoped = sampleForEvals(sample, options.evals);\n const group = groupFor(options.columns, experiment);\n const rows = await aggregate(scoped, {\n by: { evalId, condition: group },\n values: { passRate },\n });\n const points = Object.freeze(rows.map((row): StabilityPoint => evidenceRow({\n key: row.key,\n evalId: String(row.evalId),\n condition: dimensionText(row.condition),\n executions: row.passRate.total,\n passRate: row.passRate,\n })));\n const stability = stabilityCounts(points);\n return Object.freeze({\n ...stability,\n points,\n dataset: Object.freeze({\n fields: Object.freeze([\n dimensionField(\"evalId\", \"string\"),\n dimensionField(\"condition\", \"string\"),\n dimensionField(\"executions\", \"number\"),\n metricField(\"passRate\", passRate),\n ]),\n rows: Object.freeze(points.map((point) => Object.freeze({\n key: point.key,\n values: Object.freeze({\n evalId: point.evalId,\n condition: point.condition,\n executions: point.executions,\n passRate: point.passRate,\n }),\n }))),\n }),\n });\n}\nfunction groupFor(value: SummarySeries | undefined, fallback: ReportGroup): ReportGroup {\n if (value === undefined)\n return fallback;\n if (typeof value !== \"string\")\n return value;\n switch (value) {\n case \"agent\":\n return agent;\n case \"model\":\n return model;\n case \"experiment\":\n return experiment;\n default:\n throw new TypeError(`Summary series ${JSON.stringify(value)} must be \"agent\", \"model\", \"experiment\", or an Analysis Dimension / GroupFunction.`);\n }\n}\nfunction dimensionText(value: string | number | boolean | null): string {\n return value === null ? \"(missing)\" : String(value);\n}\nfunction runRange(sample: Sample): {\n readonly earliestStartedAt: string | null;\n readonly latestStartedAt: string | null;\n} {\n let earliest: number | null = null;\n let latest: number | null = null;\n for (const run of sample.snapshot.runs) {\n const startedAt = Number(run.startedAt);\n if (!Number.isFinite(startedAt))\n continue;\n earliest = earliest === null || startedAt < earliest ? startedAt : earliest;\n latest = latest === null || startedAt > latest ? startedAt : latest;\n }\n return Object.freeze({\n earliestStartedAt: earliest === null ? null : new Date(earliest).toISOString(),\n latestStartedAt: latest === null ? null : new Date(latest).toISOString(),\n });\n}\nfunction tallyVerdicts(sample: Sample, entries: Awaited<ReturnType<typeof toAttemptEvidence>>[\"entries\"], votes: \"eval\" | \"attempt\"): VerdictCounts {\n const byLocator = new Map(sample.snapshot.slots\n .filter((slot): slot is Extract<typeof slot, {\n readonly state: \"included\";\n }> => slot.state === \"included\")\n .map((slot) => [slot.attempt.locator, slot] as const));\n const choices = new Map<string, {\n readonly ordinal: number;\n readonly locator: string;\n readonly verdict: Verdict;\n }>();\n for (const entry of entries) {\n if (entry.state !== \"available\")\n continue;\n const slot = byLocator.get(entry.attempt.locator);\n if (slot === undefined)\n continue;\n const key = votes === \"attempt\"\n ? entry.attempt.locator\n : `${slot.experimentId}\\u0000${slot.evalId}`;\n const existing = choices.get(key);\n if (existing === undefined ||\n slot.attemptOrdinal > existing.ordinal ||\n (slot.attemptOrdinal === existing.ordinal && entry.attempt.locator > existing.locator)) {\n choices.set(key, {\n ordinal: slot.attemptOrdinal,\n locator: entry.attempt.locator,\n verdict: entry.detail.verdict,\n });\n }\n }\n const counts: {\n passed: number;\n failed: number;\n errored: number;\n skipped: number;\n } = {\n passed: 0,\n failed: 0,\n errored: 0,\n skipped: 0,\n };\n for (const choice of choices.values())\n counts[choice.verdict] += 1;\n return Object.freeze(counts);\n}\nfunction sampleForEvals(sample: Sample, evals: string | readonly string[] | undefined): Sample {\n if (evals === undefined)\n return sample;\n const selected = typeof evals === \"string\" ? [evals] : evals;\n if (!selected.every((value) => typeof value === \"string\")) {\n throw new TypeError(\"StabilityOverview.evals must be a string or an array of strings\");\n }\n const wanted = new Set(selected);\n return narrowSample(sample, {\n slotIds: sample.snapshot.slots\n .filter((slot) => slot.state !== \"excluded\" && wanted.has(String(slot.evalId)))\n .map((slot) => slot.slotId),\n });\n}\nfunction stabilityCounts(points: readonly StabilityPoint[]): {\n readonly executions: number;\n readonly neverPassed: number;\n readonly flaky: number;\n} {\n const byEval = new Map<string, {\n measured: boolean;\n passed: boolean;\n flaky: boolean;\n }>();\n let executions = 0;\n for (const point of points) {\n executions += point.executions;\n let facts = byEval.get(point.evalId);\n if (facts === undefined) {\n facts = { measured: false, passed: false, flaky: false };\n byEval.set(point.evalId, facts);\n }\n if (!hasMetricValue(point.passRate))\n continue;\n facts.measured = true;\n facts.passed ||= point.passRate.value > 0;\n facts.flaky ||= point.passRate.value > 0 && point.passRate.value < 1;\n }\n return Object.freeze({\n executions,\n neverPassed: [...byEval.values()].filter((facts) => facts.measured && !facts.passed).length,\n flaky: [...byEval.values()].filter((facts) => facts.flaky).length,\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"compute.js","sourceRoot":"","sources":["compute.ts"],"names":[],"mappings":"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","sourcesContent":["/**\n * Closed-data assembly for the report summary components.\n *\n * These helpers deliberately keep all statistical meaning in the published\n * Analysis facade. They may inspect the fixed Sample snapshot for identity\n * and coverage facts, but never open a Record, construct a MetricValue, or\n * implement a second reducer.\n */\nimport { narrowSample, type CostMetricValue, type MetricValue, type PricingProfile, type Sample, } from \"../../../analysis/index.ts\";\nimport type { Verdict } from \"../../../shared/types.ts\";\nimport { aggregate, agent, evalId, experiment, label, model, type ReportGroup, } from \"../../model/aggregate.ts\";\nimport { toAttemptEvidence } from \"../../model/conversions.ts\";\nimport { costUSD, evidenceRow, hasMetricValue, passRate, totalCostUSD, type EvidenceRow, } from \"../../model/metrics.ts\";\nimport { dimensionField, metricField, } from \"../../model/dataset.ts\";\nimport type { VerdictCounts } from \"../../definition/cell.tsx\";\nimport type { Dataset } from \"../../model/types.ts\";\nimport type { ExperimentListItem } from \"../entity-lists/compute.ts\";\nexport interface SampleSummaryData {\n readonly earliestStartedAt: string | null;\n readonly latestStartedAt: string | null;\n readonly experiments: number;\n readonly evals: number;\n readonly attempts: number;\n readonly verdicts: VerdictCounts;\n readonly passRate: MetricValue<number> | null;\n /** 成本投影读数;Report 未声明 PricingProfile 时为 null(不请求 measure)。 */\n readonly totalCostUSD: CostMetricValue | null;\n}\nexport type SummarySeries = \"agent\" | \"model\" | \"experiment\" | ReportGroup;\nexport interface ExperimentScatterData {\n readonly connect: boolean;\n readonly points: readonly ExperimentScatterPoint[];\n}\nexport interface ExperimentScatterPoint extends EvidenceRow {\n readonly key: string;\n readonly experiment: string;\n readonly series: string;\n /** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */\n readonly costUSD: CostMetricValue;\n readonly passRate: MetricValue<number>;\n /** The Experiment's primary reading kind, shared with ExperimentTable. */\n readonly evaluationKind: \"pass\" | \"points\" | \"mixed\";\n /** Closed earned score; absent when score evidence is incomplete or not applicable. */\n readonly totalScore?: number;\n}\nexport interface StabilityPoint extends EvidenceRow {\n readonly key: string;\n readonly evalId: string;\n readonly condition: string;\n /** Analysis-owned denominator for this exact condition × eval metric. */\n readonly executions: number;\n readonly passRate: MetricValue<number>;\n}\nexport interface StabilityOverviewData {\n readonly executions: number;\n readonly neverPassed: number;\n readonly flaky: number;\n readonly points: readonly StabilityPoint[];\n readonly dataset: Dataset;\n}\n/**\n * Produces the familiar range/KPI summary from one fixed Sample. The counts\n * are closed Sample identity facts; the numeric readings are emitted by\n * Analysis unchanged. The cost projection is requested only when the Report\n * declares a PricingProfile; without one nothing is measured or captured.\n */\nexport async function sampleSummaryData(sample: Sample, votes: \"eval\" | \"attempt\", pricing: PricingProfile | null): Promise<SampleSummaryData> {\n const [summary, evidence] = pricing === null\n ? await Promise.all([\n aggregate(sample, { by: {}, values: { passRate } }),\n toAttemptEvidence(sample),\n ])\n : await Promise.all([\n aggregate(sample, {\n by: {},\n values: { passRate, totalCostUSD: totalCostUSD(pricing) },\n }),\n toAttemptEvidence(sample),\n ]);\n const currentSlots = sample.snapshot.slots.filter((slot) => slot.state !== \"excluded\");\n const first = summary[0];\n const range = runRange(sample);\n return Object.freeze({\n ...range,\n experiments: new Set(currentSlots.map((slot) => String(slot.experimentId))).size,\n evals: new Set(currentSlots.map((slot) => String(slot.evalId))).size,\n attempts: currentSlots.filter((slot) => slot.state === \"included\").length,\n verdicts: tallyVerdicts(sample, evidence.entries, votes),\n passRate: first?.passRate ?? null,\n totalCostUSD: first === undefined || pricing === null\n ? null\n : (first as unknown as {\n readonly totalCostUSD: CostMetricValue;\n }).totalCostUSD,\n });\n}\n/**\n * Uses Analysis rows for every plotted value. Only display-safe dimensions\n * are normalized into strings; MetricValue, issues, and evidence stay intact.\n * Cost and pass rate remain Analysis MetricValues. Score classification and\n * earned score reuse the closed Experiment list facts used by ExperimentTable,\n * so the chart and table agree on every Experiment's primary reading.\n */\nexport async function experimentScatterData(sample: Sample, options: {\n readonly series?: SummarySeries;\n readonly connect?: boolean;\n readonly experiments?: readonly ExperimentListItem[];\n}, pricing: PricingProfile): Promise<ExperimentScatterData> {\n const line = label(\"line\");\n const hasLine = sample.snapshot.runs.some((run) => run.context?.labels.line !== undefined);\n const group = groupFor(options.series, hasLine ? line : agent);\n const connect = options.connect ?? (group === line);\n const rows = await aggregate(sample, {\n by: { experiment, series: group },\n values: { costUSD: costUSD(pricing), passRate },\n });\n const experimentFacts = new Map((options.experiments ?? []).map((item) => [String(item.experimentId), item]));\n const points = Object.freeze(rows.map((row): ExperimentScatterPoint => evidenceRow({\n key: row.key,\n experiment: String(row.experiment),\n series: dimensionText(row.series),\n costUSD: (row as unknown as {\n readonly costUSD: CostMetricValue;\n }).costUSD,\n passRate: row.passRate,\n evaluationKind: experimentFacts.get(String(row.experiment))?.evaluationKind ?? \"pass\",\n ...(experimentFacts.get(String(row.experiment))?.totalScore === undefined\n ? {}\n : { totalScore: experimentFacts.get(String(row.experiment))!.totalScore }),\n })));\n return Object.freeze({ connect, points });\n}\n/**\n * Builds stability display data from per-eval Analysis pass-rate rows. The\n * `executions` coordinate is the existing metric denominator, not a Report\n * metric. This retains partial/missing states instead of manufacturing zero\n * values or a second verdict reducer.\n */\nexport async function stabilityOverviewData(sample: Sample, options: {\n readonly columns?: SummarySeries;\n readonly evals?: string | readonly string[];\n}): Promise<StabilityOverviewData> {\n const scoped = sampleForEvals(sample, options.evals);\n const group = groupFor(options.columns, experiment);\n const rows = await aggregate(scoped, {\n by: { evalId, condition: group },\n values: { passRate },\n });\n const points = Object.freeze(rows.map((row): StabilityPoint => evidenceRow({\n key: row.key,\n evalId: String(row.evalId),\n condition: dimensionText(row.condition),\n executions: row.passRate.total,\n passRate: row.passRate,\n })));\n const stability = stabilityCounts(points);\n return Object.freeze({\n ...stability,\n points,\n dataset: Object.freeze({\n fields: Object.freeze([\n dimensionField(\"evalId\", \"string\"),\n dimensionField(\"condition\", \"string\"),\n dimensionField(\"executions\", \"number\"),\n metricField(\"passRate\", passRate),\n ]),\n rows: Object.freeze(points.map((point) => Object.freeze({\n key: point.key,\n values: Object.freeze({\n evalId: point.evalId,\n condition: point.condition,\n executions: point.executions,\n passRate: point.passRate,\n }),\n }))),\n }),\n });\n}\nfunction groupFor(value: SummarySeries | undefined, fallback: ReportGroup): ReportGroup {\n if (value === undefined)\n return fallback;\n if (typeof value !== \"string\")\n return value;\n switch (value) {\n case \"agent\":\n return agent;\n case \"model\":\n return model;\n case \"experiment\":\n return experiment;\n default:\n throw new TypeError(`Summary series ${JSON.stringify(value)} must be \"agent\", \"model\", \"experiment\", or an Analysis Dimension / GroupFunction.`);\n }\n}\nfunction dimensionText(value: string | number | boolean | null): string {\n return value === null ? \"(missing)\" : String(value);\n}\nfunction runRange(sample: Sample): {\n readonly earliestStartedAt: string | null;\n readonly latestStartedAt: string | null;\n} {\n let earliest: number | null = null;\n let latest: number | null = null;\n for (const run of sample.snapshot.runs) {\n const startedAt = Number(run.startedAt);\n if (!Number.isFinite(startedAt))\n continue;\n earliest = earliest === null || startedAt < earliest ? startedAt : earliest;\n latest = latest === null || startedAt > latest ? startedAt : latest;\n }\n return Object.freeze({\n earliestStartedAt: earliest === null ? null : new Date(earliest).toISOString(),\n latestStartedAt: latest === null ? null : new Date(latest).toISOString(),\n });\n}\nfunction tallyVerdicts(sample: Sample, entries: Awaited<ReturnType<typeof toAttemptEvidence>>[\"entries\"], votes: \"eval\" | \"attempt\"): VerdictCounts {\n const byLocator = new Map(sample.snapshot.slots\n .filter((slot): slot is Extract<typeof slot, {\n readonly state: \"included\";\n }> => slot.state === \"included\")\n .map((slot) => [slot.attempt.locator, slot] as const));\n const choices = new Map<string, {\n readonly ordinal: number;\n readonly locator: string;\n readonly verdict: Verdict;\n }>();\n for (const entry of entries) {\n if (entry.state !== \"available\")\n continue;\n const slot = byLocator.get(entry.attempt.locator);\n if (slot === undefined)\n continue;\n const key = votes === \"attempt\"\n ? entry.attempt.locator\n : `${slot.experimentId}\\u0000${slot.evalId}`;\n const existing = choices.get(key);\n if (existing === undefined ||\n slot.attemptOrdinal > existing.ordinal ||\n (slot.attemptOrdinal === existing.ordinal && entry.attempt.locator > existing.locator)) {\n choices.set(key, {\n ordinal: slot.attemptOrdinal,\n locator: entry.attempt.locator,\n verdict: entry.detail.verdict,\n });\n }\n }\n const counts: {\n passed: number;\n failed: number;\n errored: number;\n skipped: number;\n } = {\n passed: 0,\n failed: 0,\n errored: 0,\n skipped: 0,\n };\n for (const choice of choices.values())\n counts[choice.verdict] += 1;\n return Object.freeze(counts);\n}\nfunction sampleForEvals(sample: Sample, evals: string | readonly string[] | undefined): Sample {\n if (evals === undefined)\n return sample;\n const selected = typeof evals === \"string\" ? [evals] : evals;\n if (!selected.every((value) => typeof value === \"string\")) {\n throw new TypeError(\"StabilityOverview.evals must be a string or an array of strings\");\n }\n const wanted = new Set(selected);\n return narrowSample(sample, {\n slotIds: sample.snapshot.slots\n .filter((slot) => slot.state !== \"excluded\" && wanted.has(String(slot.evalId)))\n .map((slot) => slot.slotId),\n });\n}\nfunction stabilityCounts(points: readonly StabilityPoint[]): {\n readonly executions: number;\n readonly neverPassed: number;\n readonly flaky: number;\n} {\n const byEval = new Map<string, {\n measured: boolean;\n passed: boolean;\n flaky: boolean;\n }>();\n let executions = 0;\n for (const point of points) {\n executions += point.executions;\n let facts = byEval.get(point.evalId);\n if (facts === undefined) {\n facts = { measured: false, passed: false, flaky: false };\n byEval.set(point.evalId, facts);\n }\n if (!hasMetricValue(point.passRate))\n continue;\n facts.measured = true;\n facts.passed ||= point.passRate.value > 0;\n facts.flaky ||= point.passRate.value > 0 && point.passRate.value < 1;\n }\n return Object.freeze({\n executions,\n neverPassed: [...byEval.values()].filter((facts) => facts.measured && !facts.passed).length,\n flaky: [...byEval.values()].filter((facts) => facts.flaky).length,\n });\n}\n"]}
|
|
@@ -11,6 +11,7 @@ import { type ReportGroup } from "../../model/aggregate.cjs";
|
|
|
11
11
|
import { type EvidenceRow } from "../../model/metrics.cjs";
|
|
12
12
|
import type { VerdictCounts } from "../../definition/cell.cjs";
|
|
13
13
|
import type { Dataset } from "../../model/types.cjs";
|
|
14
|
+
import type { ExperimentListItem } from "../entity-lists/compute.cjs";
|
|
14
15
|
export interface SampleSummaryData {
|
|
15
16
|
readonly earliestStartedAt: string | null;
|
|
16
17
|
readonly latestStartedAt: string | null;
|
|
@@ -34,6 +35,10 @@ export interface ExperimentScatterPoint extends EvidenceRow {
|
|
|
34
35
|
/** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */
|
|
35
36
|
readonly costUSD: CostMetricValue;
|
|
36
37
|
readonly passRate: MetricValue<number>;
|
|
38
|
+
/** The Experiment's primary reading kind, shared with ExperimentTable. */
|
|
39
|
+
readonly evaluationKind: "pass" | "points" | "mixed";
|
|
40
|
+
/** Closed earned score; absent when score evidence is incomplete or not applicable. */
|
|
41
|
+
readonly totalScore?: number;
|
|
37
42
|
}
|
|
38
43
|
export interface StabilityPoint extends EvidenceRow {
|
|
39
44
|
readonly key: string;
|
|
@@ -60,11 +65,14 @@ export declare function sampleSummaryData(sample: Sample, votes: "eval" | "attem
|
|
|
60
65
|
/**
|
|
61
66
|
* Uses Analysis rows for every plotted value. Only display-safe dimensions
|
|
62
67
|
* are normalized into strings; MetricValue, issues, and evidence stay intact.
|
|
63
|
-
*
|
|
68
|
+
* Cost and pass rate remain Analysis MetricValues. Score classification and
|
|
69
|
+
* earned score reuse the closed Experiment list facts used by ExperimentTable,
|
|
70
|
+
* so the chart and table agree on every Experiment's primary reading.
|
|
64
71
|
*/
|
|
65
72
|
export declare function experimentScatterData(sample: Sample, options: {
|
|
66
73
|
readonly series?: SummarySeries;
|
|
67
74
|
readonly connect?: boolean;
|
|
75
|
+
readonly experiments?: readonly ExperimentListItem[];
|
|
68
76
|
}, pricing: PricingProfile): Promise<ExperimentScatterData>;
|
|
69
77
|
/**
|
|
70
78
|
* Builds stability display data from per-eval Analysis pass-rate rows. The
|
|
@@ -11,6 +11,7 @@ import { type ReportGroup } from "../../model/aggregate.mjs";
|
|
|
11
11
|
import { type EvidenceRow } from "../../model/metrics.mjs";
|
|
12
12
|
import type { VerdictCounts } from "../../definition/cell.mjs";
|
|
13
13
|
import type { Dataset } from "../../model/types.mjs";
|
|
14
|
+
import type { ExperimentListItem } from "../entity-lists/compute.mjs";
|
|
14
15
|
export interface SampleSummaryData {
|
|
15
16
|
readonly earliestStartedAt: string | null;
|
|
16
17
|
readonly latestStartedAt: string | null;
|
|
@@ -34,6 +35,10 @@ export interface ExperimentScatterPoint extends EvidenceRow {
|
|
|
34
35
|
/** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */
|
|
35
36
|
readonly costUSD: CostMetricValue;
|
|
36
37
|
readonly passRate: MetricValue<number>;
|
|
38
|
+
/** The Experiment's primary reading kind, shared with ExperimentTable. */
|
|
39
|
+
readonly evaluationKind: "pass" | "points" | "mixed";
|
|
40
|
+
/** Closed earned score; absent when score evidence is incomplete or not applicable. */
|
|
41
|
+
readonly totalScore?: number;
|
|
37
42
|
}
|
|
38
43
|
export interface StabilityPoint extends EvidenceRow {
|
|
39
44
|
readonly key: string;
|
|
@@ -60,11 +65,14 @@ export declare function sampleSummaryData(sample: Sample, votes: "eval" | "attem
|
|
|
60
65
|
/**
|
|
61
66
|
* Uses Analysis rows for every plotted value. Only display-safe dimensions
|
|
62
67
|
* are normalized into strings; MetricValue, issues, and evidence stay intact.
|
|
63
|
-
*
|
|
68
|
+
* Cost and pass rate remain Analysis MetricValues. Score classification and
|
|
69
|
+
* earned score reuse the closed Experiment list facts used by ExperimentTable,
|
|
70
|
+
* so the chart and table agree on every Experiment's primary reading.
|
|
64
71
|
*/
|
|
65
72
|
export declare function experimentScatterData(sample: Sample, options: {
|
|
66
73
|
readonly series?: SummarySeries;
|
|
67
74
|
readonly connect?: boolean;
|
|
75
|
+
readonly experiments?: readonly ExperimentListItem[];
|
|
68
76
|
}, pricing: PricingProfile): Promise<ExperimentScatterData>;
|
|
69
77
|
/**
|
|
70
78
|
* Builds stability display data from per-eval Analysis pass-rate rows. The
|
|
@@ -11,6 +11,7 @@ import { type ReportGroup } from "../../model/aggregate.js";
|
|
|
11
11
|
import { type EvidenceRow } from "../../model/metrics.js";
|
|
12
12
|
import type { VerdictCounts } from "../../definition/cell.js";
|
|
13
13
|
import type { Dataset } from "../../model/types.js";
|
|
14
|
+
import type { ExperimentListItem } from "../entity-lists/compute.js";
|
|
14
15
|
export interface SampleSummaryData {
|
|
15
16
|
readonly earliestStartedAt: string | null;
|
|
16
17
|
readonly latestStartedAt: string | null;
|
|
@@ -34,6 +35,10 @@ export interface ExperimentScatterPoint extends EvidenceRow {
|
|
|
34
35
|
/** 成本投影读数;调用方已确认 Report 声明了 PricingProfile。 */
|
|
35
36
|
readonly costUSD: CostMetricValue;
|
|
36
37
|
readonly passRate: MetricValue<number>;
|
|
38
|
+
/** The Experiment's primary reading kind, shared with ExperimentTable. */
|
|
39
|
+
readonly evaluationKind: "pass" | "points" | "mixed";
|
|
40
|
+
/** Closed earned score; absent when score evidence is incomplete or not applicable. */
|
|
41
|
+
readonly totalScore?: number;
|
|
37
42
|
}
|
|
38
43
|
export interface StabilityPoint extends EvidenceRow {
|
|
39
44
|
readonly key: string;
|
|
@@ -60,11 +65,14 @@ export declare function sampleSummaryData(sample: Sample, votes: "eval" | "attem
|
|
|
60
65
|
/**
|
|
61
66
|
* Uses Analysis rows for every plotted value. Only display-safe dimensions
|
|
62
67
|
* are normalized into strings; MetricValue, issues, and evidence stay intact.
|
|
63
|
-
*
|
|
68
|
+
* Cost and pass rate remain Analysis MetricValues. Score classification and
|
|
69
|
+
* earned score reuse the closed Experiment list facts used by ExperimentTable,
|
|
70
|
+
* so the chart and table agree on every Experiment's primary reading.
|
|
64
71
|
*/
|
|
65
72
|
export declare function experimentScatterData(sample: Sample, options: {
|
|
66
73
|
readonly series?: SummarySeries;
|
|
67
74
|
readonly connect?: boolean;
|
|
75
|
+
readonly experiments?: readonly ExperimentListItem[];
|
|
68
76
|
}, pricing: PricingProfile): Promise<ExperimentScatterData>;
|
|
69
77
|
/**
|
|
70
78
|
* Builds stability display data from per-eval Analysis pass-rate rows. The
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SampleOverview = exports.ExperimentScatter = exports.SampleSummary = exports.StabilityOverview = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const experiment_groups_ts_1 = require("../../../analysis/experiment-groups.cjs");
|
|
5
6
|
const tree_ts_1 = require("../../definition/tree.cjs");
|
|
6
7
|
const primitives_tsx_1 = require("../../definition/primitives.cjs");
|
|
7
8
|
const details_ts_1 = require("../../library/details.cjs");
|
|
@@ -27,22 +28,35 @@ exports.SampleSummary = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
|
|
|
27
28
|
return ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-sample-summary", props.className), children: [(0, jsx_runtime_1.jsxs)(primitives_tsx_1.Grid, { children: [(0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.passRate"), value: metricCell(data.passRate) }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.experiments"), value: data.experiments }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.evals"), value: data.evals }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.attempts"), value: data.attempts }), (0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, votes === "attempt" ? "scopeSummary.votesAttempt" : "scopeSummary.votesEval"), value: { kind: "verdict", counts: data.verdicts } }), pricing === null ? ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.totalCost"), value: (0, locale_ts_1.resolveLocalizedText)(pricing_ts_1.COST_SUMMARY_NO_PROFILE_TEXT, locale) })) : ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Stat, { label: (0, locale_ts_1.localeText)(locale, "scopeSummary.totalCost"), value: data.totalCostUSD === null ? (0, locale_ts_1.localeText)(locale, "cell.missing") : metricCell(data.totalCostUSD) }))] }), range === null ? null : (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-sample-summary-range", children: range })] }));
|
|
28
29
|
});
|
|
29
30
|
exports.SampleSummary.displayName = "SampleSummary";
|
|
30
|
-
/**
|
|
31
|
+
/**
|
|
32
|
+
* An Experiment comparison whose primary y axis follows the evaluation kind.
|
|
33
|
+
* Pass-only Experiments use pass rate; Score and mixed Experiments use total
|
|
34
|
+
* earned score. A mixed Sample renders the two incomparable units separately.
|
|
35
|
+
*/
|
|
31
36
|
exports.ExperimentScatter = (0, tree_ts_1.defineComponent)(async (props, ctx) => {
|
|
32
37
|
const locale = props.locale ?? locale_ts_1.DEFAULT_REPORT_LOCALE;
|
|
33
38
|
const pricing = ctx.report.pricing;
|
|
34
39
|
if (pricing === null) {
|
|
35
40
|
return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-experiment-scatter", props.className), children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-experiment-scatter-note", children: (0, locale_ts_1.resolveLocalizedText)(pricing_ts_1.COST_SCATTER_NO_PROFILE_TEXT, locale) }) }));
|
|
36
41
|
}
|
|
37
|
-
|
|
42
|
+
if (props.comparison.comparison.state === "non-comparable") {
|
|
43
|
+
return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-experiment-scatter", props.className), children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-experiment-scatter-note", children: props.comparison.comparison.issues.map((issue) => issue.reason).join(", ") }) }));
|
|
44
|
+
}
|
|
45
|
+
const data = await (0, compute_ts_1.experimentScatterData)((0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison), {
|
|
38
46
|
series: props.series,
|
|
39
47
|
connect: props.connect,
|
|
40
48
|
}, pricing);
|
|
41
|
-
|
|
49
|
+
if (data.points.length > 0 && data.points.every((point) => point.costUSD.state === "migration-required")) {
|
|
50
|
+
return ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Col, { className: joinClassNames("niceeval-experiment-scatter", props.className), children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Text, { className: "niceeval-experiment-scatter-note", children: (0, locale_ts_1.localeText)(locale, "costProjection.migrationRequired") }) }));
|
|
51
|
+
}
|
|
52
|
+
const passPoints = data.points.filter((point) => point.evaluationKind === "pass");
|
|
53
|
+
const scorePoints = data.points.filter((point) => point.evaluationKind !== "pass");
|
|
54
|
+
const pointTarget = props.pointTarget ?? defaultExperimentPointTarget;
|
|
55
|
+
return ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { className: props.className, children: [passPoints.length === 0 ? null : ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Scatter, { points: passPoints, x: "costUSD", y: "passRate", point: "experiment", series: "series", connect: data.connect, pointTarget: pointTarget, locale: props.locale, legend: true })), scorePoints.length === 0 ? null : ((0, jsx_runtime_1.jsx)(primitives_tsx_1.Chart, { data: scoreScatterDataset(scorePoints), x: "costUSD", y: "totalScore", pointTarget: pointTarget, locale: props.locale, legend: true, children: (0, jsx_runtime_1.jsx)(primitives_tsx_1.Series, { id: "score", mark: "scatter", points: "experiment", by: "series", connect: data.connect }) }))] }));
|
|
42
56
|
});
|
|
43
57
|
exports.ExperimentScatter.displayName = "ExperimentScatter";
|
|
44
58
|
/** The conventional summary + comparison composition. */
|
|
45
|
-
exports.SampleOverview = (0, tree_ts_1.defineComponent)((props) => ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { className: props.className, children: [(0, jsx_runtime_1.jsx)(exports.SampleSummary, { input: props.
|
|
59
|
+
exports.SampleOverview = (0, tree_ts_1.defineComponent)((props) => ((0, jsx_runtime_1.jsxs)(primitives_tsx_1.Col, { className: props.className, children: [(0, jsx_runtime_1.jsx)(exports.SampleSummary, { input: (0, experiment_groups_ts_1.sampleForExperimentComparisonScope)(props.comparison), locale: props.locale }), (0, jsx_runtime_1.jsx)(exports.ExperimentScatter, { comparison: props.comparison, series: props.series, connect: props.connect, pointTarget: props.pointTarget, locale: props.locale })] })));
|
|
46
60
|
exports.SampleOverview.displayName = "SampleOverview";
|
|
47
61
|
function metricCell(metric) {
|
|
48
62
|
return metric === null ? null : { kind: "metric", metric };
|
|
@@ -53,6 +67,36 @@ function defaultExperimentPointTarget(point) {
|
|
|
53
67
|
params: (0, details_ts_1.experimentDetailTarget)(point.key),
|
|
54
68
|
};
|
|
55
69
|
}
|
|
70
|
+
function scoreScatterDataset(points) {
|
|
71
|
+
const cost = points[0]?.costUSD;
|
|
72
|
+
const costField = Object.freeze({
|
|
73
|
+
name: "costUSD",
|
|
74
|
+
kind: "metric",
|
|
75
|
+
valueType: "number",
|
|
76
|
+
...(cost?.unit === undefined ? {} : { unit: cost.unit }),
|
|
77
|
+
...(cost?.format === undefined ? {} : { format: cost.format }),
|
|
78
|
+
...(cost?.better === undefined ? {} : { better: cost.better }),
|
|
79
|
+
...(cost?.bounds === undefined ? {} : { bounds: cost.bounds }),
|
|
80
|
+
});
|
|
81
|
+
return Object.freeze({
|
|
82
|
+
fields: Object.freeze([
|
|
83
|
+
{ name: "experiment", kind: "dimension", valueType: "string" },
|
|
84
|
+
{ name: "series", kind: "dimension", valueType: "string" },
|
|
85
|
+
costField,
|
|
86
|
+
{ name: "totalScore", kind: "metric", valueType: "number", better: "higher", bounds: { min: 0 } },
|
|
87
|
+
]),
|
|
88
|
+
rows: Object.freeze(points.map((point) => Object.freeze({
|
|
89
|
+
// Match Scatter's point="experiment" route identity on the pass branch.
|
|
90
|
+
key: point.experiment,
|
|
91
|
+
values: Object.freeze({
|
|
92
|
+
experiment: point.experiment,
|
|
93
|
+
series: point.series,
|
|
94
|
+
costUSD: point.costUSD,
|
|
95
|
+
totalScore: point.totalScore ?? null,
|
|
96
|
+
}),
|
|
97
|
+
}))),
|
|
98
|
+
});
|
|
99
|
+
}
|
|
56
100
|
function rangeText(earliest, latest, locale) {
|
|
57
101
|
if (latest === null)
|
|
58
102
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** Official summary components over a fixed Sample and closed Analysis rows. */\nimport type { ExperimentId, MetricValue, Sample } from \"../../../analysis/index.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { Col, Grid, Scatter, Stat, Text, } from \"../../definition/primitives.tsx\";\nimport type { Cell } from \"../../definition/cell.tsx\";\nimport type { ChartTargetPoint } from \"../../definition/primitives/chart.tsx\";\nimport type { ReportTarget } from \"../../definition/report.ts\";\nimport { experimentDetailTarget } from \"../../library/details.ts\";\nimport { formatInstant, formatReportDateTimeRange, } from \"../../model/format.ts\";\nimport { DEFAULT_REPORT_LOCALE, localeText, resolveLocalizedText, type ReportLocale, } from \"../../model/locale.ts\";\nimport { COST_SCATTER_NO_PROFILE_TEXT, COST_SUMMARY_NO_PROFILE_TEXT, } from \"../../model/pricing.ts\";\nimport { experimentScatterData, sampleSummaryData, type SummarySeries, } from \"./compute.ts\";\nexport { StabilityOverview } from \"./stability-overview.tsx\";\nexport type { StabilityOverviewProps } from \"./stability-overview.tsx\";\nexport interface SampleSummaryProps {\n /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */\n readonly input?: Sample;\n /** Which closed evidence identity gets one verdict count. */\n readonly votes?: \"eval\" | \"attempt\";\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/**\n * The zero-config scope summary. Its values are either Sample identity facts\n * or untouched Analysis MetricValues; Grid/Stat supply both text and web\n * presentation from the single resolved tree. The cost KPI shows the full\n * projection (state/basis/profile/coverage/reasons), or the adjudicated\n * bilingual text when the Report declares no PricingProfile.\n */\nexport const SampleSummary = defineComponent<SampleSummaryProps>(async (props, ctx) => {\n const locale = props.locale ?? DEFAULT_REPORT_LOCALE;\n const votes = props.votes ?? \"eval\";\n const pricing = ctx.report.pricing;\n const data = await sampleSummaryData(props.input ?? ctx.scope, votes, pricing);\n const range = rangeText(data.earliestStartedAt, data.latestStartedAt, locale);\n return (<Col className={joinClassNames(\"niceeval-sample-summary\", props.className)}>\n <Grid>\n <Stat label={localeText(locale, \"scopeSummary.passRate\")} value={metricCell(data.passRate)}/>\n <Stat label={localeText(locale, \"scopeSummary.experiments\")} value={data.experiments}/>\n <Stat label={localeText(locale, \"scopeSummary.evals\")} value={data.evals}/>\n <Stat label={localeText(locale, \"scopeSummary.attempts\")} value={data.attempts}/>\n <Stat label={localeText(locale, votes === \"attempt\" ? \"scopeSummary.votesAttempt\" : \"scopeSummary.votesEval\")} value={{ kind: \"verdict\", counts: data.verdicts }}/>\n {pricing === null ? (<Stat label={localeText(locale, \"scopeSummary.totalCost\")} value={resolveLocalizedText(COST_SUMMARY_NO_PROFILE_TEXT, locale)}/>) : (<Stat label={localeText(locale, \"scopeSummary.totalCost\")} value={data.totalCostUSD === null ? localeText(locale, \"cell.missing\") : metricCell(data.totalCostUSD)}/>)}\n </Grid>\n {range === null ? null : <Text className=\"niceeval-sample-summary-range\">{range}</Text>}\n </Col>);\n});\nSampleSummary.displayName = \"SampleSummary\";\nexport interface ExperimentScatterProps {\n /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */\n readonly input?: Sample;\n /** The closed Run-context dimension used to split experiment points. */\n readonly series?: SummarySeries;\n /** Connect points from the same series; defaults on for the conventional `line` label. */\n readonly connect?: boolean;\n /** Overrides the library's default Experiment detail target for each point. */\n readonly pointTarget?: (point: ChartTargetPoint) => ReportTarget | undefined;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/** An Analysis-backed experiment cost × pass-rate comparison. */\nexport const ExperimentScatter = defineComponent<ExperimentScatterProps>(async (props, ctx) => {\n const locale = props.locale ?? DEFAULT_REPORT_LOCALE;\n const pricing = ctx.report.pricing;\n if (pricing === null) {\n return (<Col className={joinClassNames(\"niceeval-experiment-scatter\", props.className)}>\n <Text className=\"niceeval-experiment-scatter-note\">\n {resolveLocalizedText(COST_SCATTER_NO_PROFILE_TEXT, locale)}\n </Text>\n </Col>);\n }\n const data = await experimentScatterData(props.input ?? ctx.scope, {\n series: props.series,\n connect: props.connect,\n }, pricing);\n return (<Col className={props.className}>\n <Scatter points={data.points} x=\"costUSD\" y=\"passRate\" point=\"experiment\" series=\"series\" connect={data.connect} pointTarget={props.pointTarget ?? defaultExperimentPointTarget} locale={props.locale} legend/>\n </Col>);\n});\nExperimentScatter.displayName = \"ExperimentScatter\";\nexport interface SampleOverviewProps extends ExperimentScatterProps {\n}\n/** The conventional summary + comparison composition. */\nexport const SampleOverview = defineComponent<SampleOverviewProps>((props) => (<Col className={props.className}>\n <SampleSummary input={props.input} locale={props.locale}/>\n <ExperimentScatter input={props.input} series={props.series} connect={props.connect} pointTarget={props.pointTarget} locale={props.locale}/>\n </Col>));\nSampleOverview.displayName = \"SampleOverview\";\nfunction metricCell(metric: MetricValue<number> | null): Cell | null {\n return metric === null ? null : { kind: \"metric\", metric };\n}\nfunction defaultExperimentPointTarget(point: ChartTargetPoint): ReportTarget {\n return {\n page: \"experiment\",\n params: experimentDetailTarget(point.key as ExperimentId),\n };\n}\nfunction rangeText(earliest: string | null, latest: string | null, locale: ReportLocale): string | null {\n if (latest === null)\n return null;\n if (earliest === null || earliest === latest) {\n return localeText(locale, \"scopeSummary.lastRun\", { time: formatInstant(latest, locale) });\n }\n const range = formatReportDateTimeRange(earliest, latest, locale);\n return localeText(locale, \"scopeSummary.runRange\", range);\n}\nfunction joinClassNames(...parts: readonly (string | undefined)[]): string {\n return parts.filter((part): part is string => part !== undefined && part.length > 0).join(\" \");\n}\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["index.tsx"],"names":[],"mappings":"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","sourcesContent":["/** Official summary components over a fixed Sample and closed Analysis rows. */\nimport type { ExperimentComparisonScope, ExperimentId, MetricValue, Sample } from \"../../../analysis/index.ts\";\nimport { sampleForExperimentComparisonScope } from \"../../../analysis/experiment-groups.ts\";\nimport { defineComponent } from \"../../definition/tree.ts\";\nimport { Chart, Col, Grid, Scatter, Series, Stat, Text, } from \"../../definition/primitives.tsx\";\nimport type { Cell } from \"../../definition/cell.tsx\";\nimport type { ChartTargetPoint } from \"../../definition/primitives/chart.tsx\";\nimport type { ReportTarget } from \"../../definition/report.ts\";\nimport { experimentDetailTarget } from \"../../library/details.ts\";\nimport { formatInstant, formatReportDateTimeRange, } from \"../../model/format.ts\";\nimport { DEFAULT_REPORT_LOCALE, localeText, resolveLocalizedText, type ReportLocale, } from \"../../model/locale.ts\";\nimport { COST_SCATTER_NO_PROFILE_TEXT, COST_SUMMARY_NO_PROFILE_TEXT, } from \"../../model/pricing.ts\";\nimport { experimentScatterData, sampleSummaryData, type ExperimentScatterPoint, type SummarySeries, } from \"./compute.ts\";\nimport type { Dataset, DatasetField } from \"../../model/types.ts\";\nexport { StabilityOverview } from \"./stability-overview.tsx\";\nexport type { StabilityOverviewProps } from \"./stability-overview.tsx\";\nexport interface SampleSummaryProps {\n /** Explicit fixed Sample; omitted means the resolving component's `ctx.scope`. */\n readonly input?: Sample;\n /** Which closed evidence identity gets one verdict count. */\n readonly votes?: \"eval\" | \"attempt\";\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/**\n * The zero-config scope summary. Its values are either Sample identity facts\n * or untouched Analysis MetricValues; Grid/Stat supply both text and web\n * presentation from the single resolved tree. The cost KPI shows the full\n * projection (state/basis/profile/coverage/reasons), or the adjudicated\n * bilingual text when the Report declares no PricingProfile.\n */\nexport const SampleSummary = defineComponent<SampleSummaryProps>(async (props, ctx) => {\n const locale = props.locale ?? DEFAULT_REPORT_LOCALE;\n const votes = props.votes ?? \"eval\";\n const pricing = ctx.report.pricing;\n const data = await sampleSummaryData(props.input ?? ctx.scope, votes, pricing);\n const range = rangeText(data.earliestStartedAt, data.latestStartedAt, locale);\n return (<Col className={joinClassNames(\"niceeval-sample-summary\", props.className)}>\n <Grid>\n <Stat label={localeText(locale, \"scopeSummary.passRate\")} value={metricCell(data.passRate)}/>\n <Stat label={localeText(locale, \"scopeSummary.experiments\")} value={data.experiments}/>\n <Stat label={localeText(locale, \"scopeSummary.evals\")} value={data.evals}/>\n <Stat label={localeText(locale, \"scopeSummary.attempts\")} value={data.attempts}/>\n <Stat label={localeText(locale, votes === \"attempt\" ? \"scopeSummary.votesAttempt\" : \"scopeSummary.votesEval\")} value={{ kind: \"verdict\", counts: data.verdicts }}/>\n {pricing === null ? (<Stat label={localeText(locale, \"scopeSummary.totalCost\")} value={resolveLocalizedText(COST_SUMMARY_NO_PROFILE_TEXT, locale)}/>) : (<Stat label={localeText(locale, \"scopeSummary.totalCost\")} value={data.totalCostUSD === null ? localeText(locale, \"cell.missing\") : metricCell(data.totalCostUSD)}/>)}\n </Grid>\n {range === null ? null : <Text className=\"niceeval-sample-summary-range\">{range}</Text>}\n </Col>);\n});\nSampleSummary.displayName = \"SampleSummary\";\nexport interface ExperimentScatterProps {\n readonly comparison: ExperimentComparisonScope;\n /** The closed Run-context dimension used to split experiment points. */\n readonly series?: SummarySeries;\n /** Connect points from the same series; defaults on for the conventional `line` label. */\n readonly connect?: boolean;\n /** Overrides the library's default Experiment detail target for each point. */\n readonly pointTarget?: (point: ChartTargetPoint) => ReportTarget | undefined;\n readonly locale?: ReportLocale;\n readonly className?: string;\n}\n/**\n * An Experiment comparison whose primary y axis follows the evaluation kind.\n * Pass-only Experiments use pass rate; Score and mixed Experiments use total\n * earned score. A mixed Sample renders the two incomparable units separately.\n */\nexport const ExperimentScatter = defineComponent<ExperimentScatterProps>(async (props, ctx) => {\n const locale = props.locale ?? DEFAULT_REPORT_LOCALE;\n const pricing = ctx.report.pricing;\n if (pricing === null) {\n return (<Col className={joinClassNames(\"niceeval-experiment-scatter\", props.className)}>\n <Text className=\"niceeval-experiment-scatter-note\">\n {resolveLocalizedText(COST_SCATTER_NO_PROFILE_TEXT, locale)}\n </Text>\n </Col>);\n }\n if (props.comparison.comparison.state === \"non-comparable\") {\n return (<Col className={joinClassNames(\"niceeval-experiment-scatter\", props.className)}>\n <Text className=\"niceeval-experiment-scatter-note\">\n {props.comparison.comparison.issues.map((issue) => issue.reason).join(\", \")}\n </Text>\n </Col>);\n }\n const data = await experimentScatterData(sampleForExperimentComparisonScope(props.comparison), {\n series: props.series,\n connect: props.connect,\n }, pricing);\n if (data.points.length > 0 && data.points.every((point) => point.costUSD.state === \"migration-required\")) {\n return (<Col className={joinClassNames(\"niceeval-experiment-scatter\", props.className)}>\n <Text className=\"niceeval-experiment-scatter-note\">\n {localeText(locale, \"costProjection.migrationRequired\")}\n </Text>\n </Col>);\n }\n const passPoints = data.points.filter((point) => point.evaluationKind === \"pass\");\n const scorePoints = data.points.filter((point) => point.evaluationKind !== \"pass\");\n const pointTarget = props.pointTarget ?? defaultExperimentPointTarget;\n return (<Col className={props.className}>\n {passPoints.length === 0 ? null : (<Scatter points={passPoints} x=\"costUSD\" y=\"passRate\" point=\"experiment\" series=\"series\" connect={data.connect} pointTarget={pointTarget} locale={props.locale} legend/>)}\n {scorePoints.length === 0 ? null : (<Chart data={scoreScatterDataset(scorePoints)} x=\"costUSD\" y=\"totalScore\" pointTarget={pointTarget} locale={props.locale} legend>\n <Series id=\"score\" mark=\"scatter\" points=\"experiment\" by=\"series\" connect={data.connect}/>\n </Chart>)}\n </Col>);\n});\nExperimentScatter.displayName = \"ExperimentScatter\";\nexport interface SampleOverviewProps extends ExperimentScatterProps {\n}\n/** The conventional summary + comparison composition. */\nexport const SampleOverview = defineComponent<SampleOverviewProps>((props) => (<Col className={props.className}>\n <SampleSummary input={sampleForExperimentComparisonScope(props.comparison)} locale={props.locale}/>\n <ExperimentScatter comparison={props.comparison} series={props.series} connect={props.connect} pointTarget={props.pointTarget} locale={props.locale}/>\n </Col>));\nSampleOverview.displayName = \"SampleOverview\";\nfunction metricCell(metric: MetricValue<number> | null): Cell | null {\n return metric === null ? null : { kind: \"metric\", metric };\n}\nfunction defaultExperimentPointTarget(point: ChartTargetPoint): ReportTarget {\n return {\n page: \"experiment\",\n params: experimentDetailTarget(point.key as ExperimentId),\n };\n}\nfunction scoreScatterDataset(points: readonly ExperimentScatterPoint[]): Dataset {\n const cost = points[0]?.costUSD;\n const costField: DatasetField = Object.freeze({\n name: \"costUSD\",\n kind: \"metric\",\n valueType: \"number\",\n ...(cost?.unit === undefined ? {} : { unit: cost.unit }),\n ...(cost?.format === undefined ? {} : { format: cost.format }),\n ...(cost?.better === undefined ? {} : { better: cost.better }),\n ...(cost?.bounds === undefined ? {} : { bounds: cost.bounds }),\n });\n return Object.freeze({\n fields: Object.freeze([\n { name: \"experiment\", kind: \"dimension\", valueType: \"string\" },\n { name: \"series\", kind: \"dimension\", valueType: \"string\" },\n costField,\n { name: \"totalScore\", kind: \"metric\", valueType: \"number\", better: \"higher\", bounds: { min: 0 } },\n ] satisfies readonly DatasetField[]),\n rows: Object.freeze(points.map((point) => Object.freeze({\n // Match Scatter's point=\"experiment\" route identity on the pass branch.\n key: point.experiment,\n values: Object.freeze({\n experiment: point.experiment,\n series: point.series,\n costUSD: point.costUSD,\n totalScore: point.totalScore ?? null,\n }),\n }))),\n });\n}\nfunction rangeText(earliest: string | null, latest: string | null, locale: ReportLocale): string | null {\n if (latest === null)\n return null;\n if (earliest === null || earliest === latest) {\n return localeText(locale, \"scopeSummary.lastRun\", { time: formatInstant(latest, locale) });\n }\n const range = formatReportDateTimeRange(earliest, latest, locale);\n return localeText(locale, \"scopeSummary.runRange\", range);\n}\nfunction joinClassNames(...parts: readonly (string | undefined)[]): string {\n return parts.filter((part): part is string => part !== undefined && part.length > 0).join(\" \");\n}\n"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Official summary components over a fixed Sample and closed Analysis rows. */
|
|
2
|
-
import type { Sample } from "../../../analysis/index.cjs";
|
|
2
|
+
import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.cjs";
|
|
3
3
|
import type { ChartTargetPoint } from "../../definition/primitives/chart.cjs";
|
|
4
4
|
import type { ReportTarget } from "../../definition/report.cjs";
|
|
5
5
|
import { type ReportLocale } from "../../model/locale.cjs";
|
|
@@ -23,8 +23,7 @@ export interface SampleSummaryProps {
|
|
|
23
23
|
*/
|
|
24
24
|
export declare const SampleSummary: import("../../definition/tree.cjs").ReportComponent<SampleSummaryProps>;
|
|
25
25
|
export interface ExperimentScatterProps {
|
|
26
|
-
|
|
27
|
-
readonly input?: Sample;
|
|
26
|
+
readonly comparison: ExperimentComparisonScope;
|
|
28
27
|
/** The closed Run-context dimension used to split experiment points. */
|
|
29
28
|
readonly series?: SummarySeries;
|
|
30
29
|
/** Connect points from the same series; defaults on for the conventional `line` label. */
|
|
@@ -34,7 +33,11 @@ export interface ExperimentScatterProps {
|
|
|
34
33
|
readonly locale?: ReportLocale;
|
|
35
34
|
readonly className?: string;
|
|
36
35
|
}
|
|
37
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* An Experiment comparison whose primary y axis follows the evaluation kind.
|
|
38
|
+
* Pass-only Experiments use pass rate; Score and mixed Experiments use total
|
|
39
|
+
* earned score. A mixed Sample renders the two incomparable units separately.
|
|
40
|
+
*/
|
|
38
41
|
export declare const ExperimentScatter: import("../../definition/tree.cjs").ReportComponent<ExperimentScatterProps>;
|
|
39
42
|
export interface SampleOverviewProps extends ExperimentScatterProps {
|
|
40
43
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Official summary components over a fixed Sample and closed Analysis rows. */
|
|
2
|
-
import type { Sample } from "../../../analysis/index.mjs";
|
|
2
|
+
import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.mjs";
|
|
3
3
|
import type { ChartTargetPoint } from "../../definition/primitives/chart.mjs";
|
|
4
4
|
import type { ReportTarget } from "../../definition/report.mjs";
|
|
5
5
|
import { type ReportLocale } from "../../model/locale.mjs";
|
|
@@ -23,8 +23,7 @@ export interface SampleSummaryProps {
|
|
|
23
23
|
*/
|
|
24
24
|
export declare const SampleSummary: import("../../definition/tree.mjs").ReportComponent<SampleSummaryProps>;
|
|
25
25
|
export interface ExperimentScatterProps {
|
|
26
|
-
|
|
27
|
-
readonly input?: Sample;
|
|
26
|
+
readonly comparison: ExperimentComparisonScope;
|
|
28
27
|
/** The closed Run-context dimension used to split experiment points. */
|
|
29
28
|
readonly series?: SummarySeries;
|
|
30
29
|
/** Connect points from the same series; defaults on for the conventional `line` label. */
|
|
@@ -34,7 +33,11 @@ export interface ExperimentScatterProps {
|
|
|
34
33
|
readonly locale?: ReportLocale;
|
|
35
34
|
readonly className?: string;
|
|
36
35
|
}
|
|
37
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* An Experiment comparison whose primary y axis follows the evaluation kind.
|
|
38
|
+
* Pass-only Experiments use pass rate; Score and mixed Experiments use total
|
|
39
|
+
* earned score. A mixed Sample renders the two incomparable units separately.
|
|
40
|
+
*/
|
|
38
41
|
export declare const ExperimentScatter: import("../../definition/tree.mjs").ReportComponent<ExperimentScatterProps>;
|
|
39
42
|
export interface SampleOverviewProps extends ExperimentScatterProps {
|
|
40
43
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/** Official summary components over a fixed Sample and closed Analysis rows. */
|
|
2
|
-
import type { Sample } from "../../../analysis/index.js";
|
|
2
|
+
import type { ExperimentComparisonScope, Sample } from "../../../analysis/index.js";
|
|
3
3
|
import type { ChartTargetPoint } from "../../definition/primitives/chart.js";
|
|
4
4
|
import type { ReportTarget } from "../../definition/report.js";
|
|
5
5
|
import { type ReportLocale } from "../../model/locale.js";
|
|
@@ -23,8 +23,7 @@ export interface SampleSummaryProps {
|
|
|
23
23
|
*/
|
|
24
24
|
export declare const SampleSummary: import("../../definition/tree.js").ReportComponent<SampleSummaryProps>;
|
|
25
25
|
export interface ExperimentScatterProps {
|
|
26
|
-
|
|
27
|
-
readonly input?: Sample;
|
|
26
|
+
readonly comparison: ExperimentComparisonScope;
|
|
28
27
|
/** The closed Run-context dimension used to split experiment points. */
|
|
29
28
|
readonly series?: SummarySeries;
|
|
30
29
|
/** Connect points from the same series; defaults on for the conventional `line` label. */
|
|
@@ -34,7 +33,11 @@ export interface ExperimentScatterProps {
|
|
|
34
33
|
readonly locale?: ReportLocale;
|
|
35
34
|
readonly className?: string;
|
|
36
35
|
}
|
|
37
|
-
/**
|
|
36
|
+
/**
|
|
37
|
+
* An Experiment comparison whose primary y axis follows the evaluation kind.
|
|
38
|
+
* Pass-only Experiments use pass rate; Score and mixed Experiments use total
|
|
39
|
+
* earned score. A mixed Sample renders the two incomparable units separately.
|
|
40
|
+
*/
|
|
38
41
|
export declare const ExperimentScatter: import("../../definition/tree.js").ReportComponent<ExperimentScatterProps>;
|
|
39
42
|
export interface SampleOverviewProps extends ExperimentScatterProps {
|
|
40
43
|
}
|
|
@@ -52,6 +52,9 @@ function formatCellText(cell, locale) {
|
|
|
52
52
|
const closed = (0, pricing_ts_1.formatCostProjectionCellText)(cell.metric, locale ?? locale_ts_1.DEFAULT_REPORT_LOCALE);
|
|
53
53
|
return closed.detail ? `${closed.text}\n ${closed.detail}` : closed.text;
|
|
54
54
|
}
|
|
55
|
+
if (cell.showCoverage === false) {
|
|
56
|
+
return (0, format_ts_1.formatMetricScalar)(cell.metric.value, cell.metric.unit, cell.metric.format, locale ?? locale_ts_1.DEFAULT_REPORT_LOCALE);
|
|
57
|
+
}
|
|
55
58
|
return (0, format_ts_1.formatMetricValue)(cell.metric, locale ?? locale_ts_1.DEFAULT_REPORT_LOCALE);
|
|
56
59
|
}
|
|
57
60
|
default: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cell.js","sourceRoot":"","sources":["cell.tsx"],"names":[],"mappings":"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","sourcesContent":["// 官方表格数据协议的单元格类型(docs/feature/reports/library.md「单元格类型」)。\n// Table / Grid / Stat 共用这份判别联合;自定义 Source 要交给这些原语必须适配成这个形状。\nimport type { AttemptLocator } from \"../../attempt-locator.ts\";\nimport type { LocalizedText } from \"../../shared/types.ts\";\nimport type { Verdict } from \"../../shared/types.ts\";\nimport type { MetricValue } from \"../../analysis/index.ts\";\nimport { formatMetricValue, missingText, verdictMark } from \"../model/format.ts\";\nimport { formatCostProjectionCellText, isCostMetricValue } from \"../model/pricing.ts\";\nimport { DEFAULT_REPORT_LOCALE, localeText, resolveLocalizedText, type ReportLocale, } from \"../model/locale.ts\";\n/** 判定计票:passed / failed / errored / skipped。 */\nexport interface VerdictCounts {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n}\n/**\n * 官方表格一格。三条不变量:\n * - metric 格永远带证据(不得压成 text);\n * - notApplicable 与 missing 不合并;\n * - summary 的文本已在上游折好。\n */\nexport type Cell = {\n readonly kind: \"metric\";\n readonly metric: MetricValue;\n} | {\n readonly kind: \"verdict\";\n readonly verdict?: Verdict | \"skipped\";\n readonly counts?: VerdictCounts;\n /** 计票覆盖的 attempt 引用(有证据可下钻的计票格才携带,如稳定性矩阵)。 */\n readonly refs?: readonly AttemptLocator[];\n // 两种形态:counts = 判定构成计票(experiment / Eval 行);verdict = 单判定(attempt 行)。\n // 格子只带值,计票怎么来的(折叠、分桶)在实体投影侧,渲染面不算数。\n /** 单判定形态省略判定词、只留判定符(如对照矩阵逐格只放得下一个符号的场景)。 */\n readonly bare?: boolean;\n} | {\n readonly kind: \"score\";\n readonly earned: number;\n readonly possible?: number;\n} | {\n readonly kind: \"summary\";\n readonly text: string;\n readonly more?: number;\n} | {\n readonly kind: \"locator\";\n readonly locator: AttemptLocator;\n /** 有判定的 attempt 行:判定长在 locator 上(判定符 + 语义色),没有判定就省略。 */\n readonly verdict?: Verdict | \"skipped\";\n} | {\n readonly kind: \"text\";\n readonly text: string;\n readonly detail?: string;\n} | {\n readonly kind: \"notApplicable\";\n} | {\n readonly kind: \"missing\";\n readonly code: string;\n /** 补上这一格的命令,可直接复制(如 `niceeval exp <experimentId>`)。 */\n readonly detail?: string;\n};\nexport interface ColumnSpec {\n readonly key: string;\n readonly unit?: string;\n readonly better?: \"higher\" | \"lower\";\n /**\n * 列表头。text / web 两面按当前 locale 解析同一份;省略时按 key 原样显示\n * (维度值列——条件名、实验 id 这类列名即数据的列——用这一支)。\n * Table 原语自己不携带列名词表,表头只来自这里\n * (docs/feature/reports/library.md「Content 协议」)。\n */\n readonly header?: LocalizedText;\n}\n/**\n * 表行 Content。与布局原语 `Row` 组件不同名。\n * placeholder 行照常渲染,但不进任何列的聚合读数。\n * group 行的读数由自己的 subRows 聚合而来,不是一条独立事实。\n */\nexport interface TableContentRow {\n readonly key: string;\n readonly cells: Readonly<Record<string, Cell>>;\n readonly subRows?: readonly TableContentRow[];\n /** group 行的读数由自己的 subRows 聚合而来,不是一条独立事实。 */\n readonly variant?: \"normal\" | \"placeholder\" | \"group\";\n}\nexport interface TableContent {\n readonly columns: readonly ColumnSpec[];\n readonly rows: readonly TableContentRow[];\n}\n/** 把 Cell 折成 text 面可见字符串(缺数据 / 不适用统一不补成 0)。 */\nexport function formatCellText(cell: Cell | null | undefined, locale?: ReportLocale): string {\n if (cell == null)\n return \"—\";\n switch (cell.kind) {\n case \"notApplicable\":\n return \"—\";\n case \"missing\": {\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n const reason = missingText(cell.code, loc);\n return cell.detail ? `${reason} · ${cell.detail}` : reason;\n }\n case \"text\":\n return cell.detail ? `${cell.text}\\n ${cell.detail}` : cell.text;\n case \"locator\": {\n const mark = cell.verdict !== undefined ? `${verdictMark(cell.verdict === \"skipped\" ? \"skipped\" : cell.verdict)} ` : \"\";\n return `${mark}${cell.locator}`;\n }\n case \"summary\": {\n const more = cell.more && cell.more > 0 ? ` +${cell.more} more` : \"\";\n return `${cell.text}${more}`;\n }\n case \"score\":\n return cell.possible !== undefined ? `${cell.earned} / ${cell.possible}` : String(cell.earned);\n case \"verdict\": {\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n if (cell.counts) {\n const parts = ([\"passed\", \"failed\", \"errored\", \"skipped\"] as const)\n .filter((k) => cell.counts![k] > 0)\n .map((k) => `${cell.counts![k]} ${localeText(loc, `verdict.${k === \"skipped\" ? \"skipped\" : k}`)}`);\n return parts.join(\" · \") || \"—\";\n }\n if (cell.verdict !== undefined) {\n const v = cell.verdict === \"skipped\" ? \"skipped\" : cell.verdict;\n // 判定符与判定词同场,与 locator 格、web 面同一条纪律:单色打印下照样读得出。\n // bare 省略判定词,只留判定符,供逐格空间紧张的场景(如对照矩阵)使用。\n if (cell.bare)\n return verdictMark(v);\n return `${verdictMark(v)} ${localeText(loc, `verdict.${v}`)}`;\n }\n return \"—\";\n }\n case \"metric\": {\n if (isCostMetricValue(cell.metric)) {\n const closed = formatCostProjectionCellText(cell.metric, locale ?? DEFAULT_REPORT_LOCALE);\n return closed.detail ? `${closed.text}\\n ${closed.detail}` : closed.text;\n }\n return formatMetricValue(cell.metric, locale ?? DEFAULT_REPORT_LOCALE);\n }\n default: {\n const _exhaustive: never = cell;\n return _exhaustive;\n }\n }\n}\n/** 把 TableContent 展平为 text 排版器用的预格式化行(含 subRows 缩进前缀)。 */\nexport function flattenTableContentForText(content: TableContent, locale?: string): {\n columns: Array<{\n key: string;\n header: string;\n align?: \"left\" | \"right\";\n }>;\n /** depth 是行树里的层数(顶层 0);text 面按它画组边界横线,不认识具体实体。 */\n rows: Array<{\n key: string;\n cells: Record<string, string | null>;\n variant?: string;\n depth: number;\n }>;\n} {\n // 表头与 web 面同源:走列声明的 header,缺省才回落 key。\n const columns = content.columns.map((c) => ({\n key: c.key,\n header: c.header !== undefined ? resolveLocalizedText(c.header, locale ?? DEFAULT_REPORT_LOCALE) : c.key,\n align: (c.better ? \"right\" : \"left\") as \"left\" | \"right\",\n }));\n const rows: Array<{\n key: string;\n cells: Record<string, string | null>;\n variant?: string;\n depth: number;\n }> = [];\n const walk = (row: TableContentRow, depth: number): void => {\n const cells: Record<string, string | null> = {};\n for (const col of content.columns) {\n const cell = row.cells[col.key];\n let text = formatCellText(cell, locale);\n if (depth > 0 && col === content.columns[0] && text !== \"—\") {\n text = `${\" \".repeat(depth)}${text}`;\n }\n cells[col.key] = text;\n }\n rows.push({ key: row.key, cells, variant: row.variant, depth });\n for (const child of row.subRows ?? [])\n walk(child, depth + 1);\n };\n for (const row of content.rows)\n walk(row, 0);\n return { columns, rows };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cell.js","sourceRoot":"","sources":["cell.tsx"],"names":[],"mappings":"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","sourcesContent":["// 官方表格数据协议的单元格类型(docs/feature/reports/library.md「单元格类型」)。\n// Table / Grid / Stat 共用这份判别联合;自定义 Source 要交给这些原语必须适配成这个形状。\nimport type { AttemptLocator } from \"../../attempt-locator.ts\";\nimport type { LocalizedText } from \"../../shared/types.ts\";\nimport type { Verdict } from \"../../shared/types.ts\";\nimport type { MetricValue } from \"../../analysis/index.ts\";\nimport { formatMetricScalar, formatMetricValue, missingText, verdictMark } from \"../model/format.ts\";\nimport { formatCostProjectionCellText, isCostMetricValue } from \"../model/pricing.ts\";\nimport { DEFAULT_REPORT_LOCALE, localeText, resolveLocalizedText, type ReportLocale, } from \"../model/locale.ts\";\n/** 判定计票:passed / failed / errored / skipped。 */\nexport interface VerdictCounts {\n readonly passed: number;\n readonly failed: number;\n readonly errored: number;\n readonly skipped: number;\n}\n/**\n * 官方表格一格。三条不变量:\n * - metric 格永远带证据(不得压成 text);\n * - notApplicable 与 missing 不合并;\n * - summary 的文本已在上游折好。\n */\nexport type Cell = {\n readonly kind: \"metric\";\n readonly metric: MetricValue;\n /** Hide the compact samples/total suffix only when an adjacent region presents coverage. */\n readonly showCoverage?: boolean;\n} | {\n readonly kind: \"verdict\";\n readonly verdict?: Verdict | \"skipped\";\n readonly counts?: VerdictCounts;\n /** 计票覆盖的 attempt 引用(有证据可下钻的计票格才携带,如稳定性矩阵)。 */\n readonly refs?: readonly AttemptLocator[];\n // 两种形态:counts = 判定构成计票(experiment / Eval 行);verdict = 单判定(attempt 行)。\n // 格子只带值,计票怎么来的(折叠、分桶)在实体投影侧,渲染面不算数。\n /** 单判定形态省略判定词、只留判定符(如对照矩阵逐格只放得下一个符号的场景)。 */\n readonly bare?: boolean;\n} | {\n readonly kind: \"score\";\n readonly earned: number;\n readonly possible?: number;\n} | {\n readonly kind: \"summary\";\n readonly text: string;\n readonly more?: number;\n} | {\n readonly kind: \"locator\";\n readonly locator: AttemptLocator;\n /** 有判定的 attempt 行:判定长在 locator 上(判定符 + 语义色),没有判定就省略。 */\n readonly verdict?: Verdict | \"skipped\";\n} | {\n readonly kind: \"text\";\n readonly text: string;\n readonly detail?: string;\n} | {\n readonly kind: \"notApplicable\";\n} | {\n readonly kind: \"missing\";\n readonly code: string;\n /** 补上这一格的命令,可直接复制(如 `niceeval exp <experimentId>`)。 */\n readonly detail?: string;\n};\nexport interface ColumnSpec {\n readonly key: string;\n readonly unit?: string;\n readonly better?: \"higher\" | \"lower\";\n /**\n * 列表头。text / web 两面按当前 locale 解析同一份;省略时按 key 原样显示\n * (维度值列——条件名、实验 id 这类列名即数据的列——用这一支)。\n * Table 原语自己不携带列名词表,表头只来自这里\n * (docs/feature/reports/library.md「Content 协议」)。\n */\n readonly header?: LocalizedText;\n}\n/**\n * 表行 Content。与布局原语 `Row` 组件不同名。\n * placeholder 行照常渲染,但不进任何列的聚合读数。\n * group 行的读数由自己的 subRows 聚合而来,不是一条独立事实。\n */\nexport interface TableContentRow {\n readonly key: string;\n readonly cells: Readonly<Record<string, Cell>>;\n readonly subRows?: readonly TableContentRow[];\n /** group 行的读数由自己的 subRows 聚合而来,不是一条独立事实。 */\n readonly variant?: \"normal\" | \"placeholder\" | \"group\";\n}\nexport interface TableContent {\n readonly columns: readonly ColumnSpec[];\n readonly rows: readonly TableContentRow[];\n}\n/** 把 Cell 折成 text 面可见字符串(缺数据 / 不适用统一不补成 0)。 */\nexport function formatCellText(cell: Cell | null | undefined, locale?: ReportLocale): string {\n if (cell == null)\n return \"—\";\n switch (cell.kind) {\n case \"notApplicable\":\n return \"—\";\n case \"missing\": {\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n const reason = missingText(cell.code, loc);\n return cell.detail ? `${reason} · ${cell.detail}` : reason;\n }\n case \"text\":\n return cell.detail ? `${cell.text}\\n ${cell.detail}` : cell.text;\n case \"locator\": {\n const mark = cell.verdict !== undefined ? `${verdictMark(cell.verdict === \"skipped\" ? \"skipped\" : cell.verdict)} ` : \"\";\n return `${mark}${cell.locator}`;\n }\n case \"summary\": {\n const more = cell.more && cell.more > 0 ? ` +${cell.more} more` : \"\";\n return `${cell.text}${more}`;\n }\n case \"score\":\n return cell.possible !== undefined ? `${cell.earned} / ${cell.possible}` : String(cell.earned);\n case \"verdict\": {\n const loc = locale ?? DEFAULT_REPORT_LOCALE;\n if (cell.counts) {\n const parts = ([\"passed\", \"failed\", \"errored\", \"skipped\"] as const)\n .filter((k) => cell.counts![k] > 0)\n .map((k) => `${cell.counts![k]} ${localeText(loc, `verdict.${k === \"skipped\" ? \"skipped\" : k}`)}`);\n return parts.join(\" · \") || \"—\";\n }\n if (cell.verdict !== undefined) {\n const v = cell.verdict === \"skipped\" ? \"skipped\" : cell.verdict;\n // 判定符与判定词同场,与 locator 格、web 面同一条纪律:单色打印下照样读得出。\n // bare 省略判定词,只留判定符,供逐格空间紧张的场景(如对照矩阵)使用。\n if (cell.bare)\n return verdictMark(v);\n return `${verdictMark(v)} ${localeText(loc, `verdict.${v}`)}`;\n }\n return \"—\";\n }\n case \"metric\": {\n if (isCostMetricValue(cell.metric)) {\n const closed = formatCostProjectionCellText(cell.metric, locale ?? DEFAULT_REPORT_LOCALE);\n return closed.detail ? `${closed.text}\\n ${closed.detail}` : closed.text;\n }\n if (cell.showCoverage === false) {\n return formatMetricScalar(cell.metric.value, cell.metric.unit, cell.metric.format, locale ?? DEFAULT_REPORT_LOCALE);\n }\n return formatMetricValue(cell.metric, locale ?? DEFAULT_REPORT_LOCALE);\n }\n default: {\n const _exhaustive: never = cell;\n return _exhaustive;\n }\n }\n}\n/** 把 TableContent 展平为 text 排版器用的预格式化行(含 subRows 缩进前缀)。 */\nexport function flattenTableContentForText(content: TableContent, locale?: string): {\n columns: Array<{\n key: string;\n header: string;\n align?: \"left\" | \"right\";\n }>;\n /** depth 是行树里的层数(顶层 0);text 面按它画组边界横线,不认识具体实体。 */\n rows: Array<{\n key: string;\n cells: Record<string, string | null>;\n variant?: string;\n depth: number;\n }>;\n} {\n // 表头与 web 面同源:走列声明的 header,缺省才回落 key。\n const columns = content.columns.map((c) => ({\n key: c.key,\n header: c.header !== undefined ? resolveLocalizedText(c.header, locale ?? DEFAULT_REPORT_LOCALE) : c.key,\n align: (c.better ? \"right\" : \"left\") as \"left\" | \"right\",\n }));\n const rows: Array<{\n key: string;\n cells: Record<string, string | null>;\n variant?: string;\n depth: number;\n }> = [];\n const walk = (row: TableContentRow, depth: number): void => {\n const cells: Record<string, string | null> = {};\n for (const col of content.columns) {\n const cell = row.cells[col.key];\n let text = formatCellText(cell, locale);\n if (depth > 0 && col === content.columns[0] && text !== \"—\") {\n text = `${\" \".repeat(depth)}${text}`;\n }\n cells[col.key] = text;\n }\n rows.push({ key: row.key, cells, variant: row.variant, depth });\n for (const child of row.subRows ?? [])\n walk(child, depth + 1);\n };\n for (const row of content.rows)\n walk(row, 0);\n return { columns, rows };\n}\n"]}
|
|
@@ -19,6 +19,8 @@ export interface VerdictCounts {
|
|
|
19
19
|
export type Cell = {
|
|
20
20
|
readonly kind: "metric";
|
|
21
21
|
readonly metric: MetricValue;
|
|
22
|
+
/** Hide the compact samples/total suffix only when an adjacent region presents coverage. */
|
|
23
|
+
readonly showCoverage?: boolean;
|
|
22
24
|
} | {
|
|
23
25
|
readonly kind: "verdict";
|
|
24
26
|
readonly verdict?: Verdict | "skipped";
|
|
@@ -19,6 +19,8 @@ export interface VerdictCounts {
|
|
|
19
19
|
export type Cell = {
|
|
20
20
|
readonly kind: "metric";
|
|
21
21
|
readonly metric: MetricValue;
|
|
22
|
+
/** Hide the compact samples/total suffix only when an adjacent region presents coverage. */
|
|
23
|
+
readonly showCoverage?: boolean;
|
|
22
24
|
} | {
|
|
23
25
|
readonly kind: "verdict";
|
|
24
26
|
readonly verdict?: Verdict | "skipped";
|
|
@@ -19,6 +19,8 @@ export interface VerdictCounts {
|
|
|
19
19
|
export type Cell = {
|
|
20
20
|
readonly kind: "metric";
|
|
21
21
|
readonly metric: MetricValue;
|
|
22
|
+
/** Hide the compact samples/total suffix only when an adjacent region presents coverage. */
|
|
23
|
+
readonly showCoverage?: boolean;
|
|
22
24
|
} | {
|
|
23
25
|
readonly kind: "verdict";
|
|
24
26
|
readonly verdict?: Verdict | "skipped";
|