niceeval 0.15.1-canary.76 → 0.16.1
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 +45 -40
- package/dist/adapter-execution-trace.cjs.map +1 -1
- package/dist/adapter-execution-trace.d.cts +26 -0
- package/dist/adapter-execution-trace.d.mts +26 -0
- package/dist/adapter-execution-trace.d.ts +26 -0
- package/dist/adapter-usage.cjs.map +1 -1
- package/dist/adapter-usage.d.cts +9 -0
- package/dist/adapter-usage.d.mts +9 -0
- package/dist/adapter-usage.d.ts +9 -0
- package/dist/adapter.cjs +19 -4
- package/dist/adapter.cjs.map +1 -1
- package/dist/adapter.d.cts +37 -12
- package/dist/adapter.d.mts +37 -12
- package/dist/adapter.d.ts +37 -12
- package/dist/agents/ai-sdk.cjs +3 -0
- package/dist/agents/ai-sdk.cjs.map +1 -1
- package/dist/agents/bub.cjs +3 -0
- package/dist/agents/bub.cjs.map +1 -1
- package/dist/agents/claude-code-native.cjs +28 -2
- package/dist/agents/claude-code-native.cjs.map +1 -1
- package/dist/agents/claude-code.cjs +3 -0
- package/dist/agents/claude-code.cjs.map +1 -1
- package/dist/agents/codex.cjs +3 -0
- package/dist/agents/codex.cjs.map +1 -1
- package/dist/agents/coding-cli-versions.cjs +9 -10
- package/dist/agents/coding-cli-versions.cjs.map +1 -1
- package/dist/agents/coding-cli-versions.d.cts +1 -1
- package/dist/agents/coding-cli-versions.d.mts +1 -1
- package/dist/agents/coding-cli-versions.d.ts +1 -1
- package/dist/agents/deepseek-harness.cjs +3 -0
- package/dist/agents/deepseek-harness.cjs.map +1 -1
- package/dist/agents/hermes.cjs +3 -0
- package/dist/agents/hermes.cjs.map +1 -1
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +3 -2
- package/dist/agents/index.d.mts +3 -2
- package/dist/agents/index.d.ts +3 -2
- package/dist/agents/omp.cjs +3 -0
- package/dist/agents/omp.cjs.map +1 -1
- package/dist/agents/openai-compat.cjs +6 -0
- package/dist/agents/openai-compat.cjs.map +1 -1
- package/dist/agents/openclaw.cjs +3 -0
- package/dist/agents/openclaw.cjs.map +1 -1
- package/dist/agents/opencode.cjs +3 -0
- package/dist/agents/opencode.cjs.map +1 -1
- package/dist/agents/sdk-streams.cjs +9 -0
- package/dist/agents/sdk-streams.cjs.map +1 -1
- package/dist/agents/ui-message-stream.cjs +3 -0
- package/dist/agents/ui-message-stream.cjs.map +1 -1
- package/dist/assertions/api.cjs.map +1 -1
- package/dist/assertions/api.d.cts +27 -5
- package/dist/assertions/api.d.mts +27 -5
- package/dist/assertions/api.d.ts +27 -5
- package/dist/assertions/collection.cjs +6 -0
- package/dist/assertions/collection.cjs.map +1 -1
- package/dist/assertions/collection.d.cts +4 -2
- package/dist/assertions/collection.d.mts +4 -2
- package/dist/assertions/collection.d.ts +4 -2
- package/dist/assertions/collection.js +12 -8
- package/dist/assertions/context-match.cjs +70 -0
- package/dist/assertions/context-match.cjs.map +1 -0
- package/dist/assertions/context-match.d.cts +107 -0
- package/dist/assertions/context-match.d.mts +107 -0
- package/dist/assertions/context-match.d.ts +107 -0
- package/dist/assertions/context-match.js +12 -0
- package/dist/assertions/context-match.js.map +1 -0
- package/dist/assertions/full-content.cjs +109 -0
- package/dist/assertions/full-content.cjs.map +1 -0
- package/dist/assertions/full-content.d.cts +6 -0
- package/dist/assertions/full-content.d.mts +6 -0
- package/dist/assertions/full-content.d.ts +6 -0
- package/dist/assertions/full-content.js +12 -0
- package/dist/assertions/full-content.js.map +1 -0
- package/dist/assertions/judge-presets.cjs +2 -34
- package/dist/assertions/judge-presets.cjs.map +1 -1
- package/dist/assertions/judge-presets.d.cts +6 -9
- package/dist/assertions/judge-presets.d.mts +6 -9
- package/dist/assertions/judge-presets.d.ts +6 -9
- package/dist/assertions/judge-presets.js +8 -8
- package/dist/assertions/judge.cjs +107 -29
- package/dist/assertions/judge.cjs.map +1 -1
- package/dist/assertions/judge.d.cts +2 -0
- package/dist/assertions/judge.d.mts +2 -0
- package/dist/assertions/judge.d.ts +2 -0
- package/dist/assertions/match.cjs +244 -5
- package/dist/assertions/match.cjs.map +1 -1
- package/dist/assertions/match.d.cts +43 -3
- package/dist/assertions/match.d.mts +43 -3
- package/dist/assertions/match.d.ts +43 -3
- package/dist/assertions/match.js +88 -78
- package/dist/assertions/material.cjs +520 -0
- package/dist/assertions/material.cjs.map +1 -0
- package/dist/assertions/material.d.cts +56 -0
- package/dist/assertions/material.d.mts +56 -0
- package/dist/assertions/material.d.ts +56 -0
- package/dist/assertions/material.js +20 -0
- package/dist/assertions/material.js.map +1 -0
- package/dist/assertions/record/attachment.cjs +5 -2
- package/dist/assertions/record/attachment.cjs.map +1 -1
- package/dist/assertions/record/codec.cjs +2 -1
- package/dist/assertions/record/codec.cjs.map +1 -1
- package/dist/assertions/record/model.cjs.map +1 -1
- package/dist/assertions/record/model.d.cts +6 -1
- package/dist/assertions/record/model.d.mts +6 -1
- package/dist/assertions/record/model.d.ts +6 -1
- package/dist/assertions/runtime.cjs +207 -14
- package/dist/assertions/runtime.cjs.map +1 -1
- package/dist/assertions/runtime.d.cts +9 -0
- package/dist/assertions/runtime.d.mts +9 -0
- package/dist/assertions/runtime.d.ts +9 -0
- package/dist/assertions/runtime.js +14 -8
- package/dist/assertions/score-match-audit.cjs +18 -8
- package/dist/assertions/score-match-audit.cjs.map +1 -1
- package/dist/assertions/score-match-gateway.cjs +83 -25
- package/dist/assertions/score-match-gateway.cjs.map +1 -1
- package/dist/assertions/score-match-gateway.d.cts +2 -0
- package/dist/assertions/score-match-gateway.d.mts +2 -0
- package/dist/assertions/score-match-gateway.d.ts +2 -0
- package/dist/assertions/value-composition.test-d.cjs +77 -0
- package/dist/assertions/value-composition.test-d.cjs.map +1 -0
- package/dist/assertions/value-composition.test-d.d.cts +1 -0
- package/dist/assertions/value-composition.test-d.d.mts +1 -0
- package/dist/assertions/value-composition.test-d.d.ts +1 -0
- package/dist/assertions/value-composition.test-d.js +4 -0
- package/dist/assertions/value-composition.test-d.js.map +1 -0
- package/dist/context/assert-first.cjs +207 -213
- package/dist/context/assert-first.cjs.map +1 -1
- package/dist/context/assert-first.d.cts +49 -23
- package/dist/context/assert-first.d.mts +49 -23
- package/dist/context/assert-first.d.ts +49 -23
- package/dist/context/session.cjs +111 -9
- package/dist/context/session.cjs.map +1 -1
- package/dist/context/session.d.cts +18 -0
- package/dist/context/session.d.mts +18 -0
- package/dist/context/session.d.ts +18 -0
- package/dist/define.cjs +17 -1
- package/dist/define.cjs.map +1 -1
- package/dist/eval/cli/contribution.cjs +2 -0
- package/dist/eval/cli/contribution.cjs.map +1 -1
- package/dist/eval/host/index.cjs +2 -0
- package/dist/eval/host/index.cjs.map +1 -1
- package/dist/eval/record/evaluation.cjs +3 -0
- package/dist/eval/record/evaluation.cjs.map +1 -1
- package/dist/eval/record/membership-provenance.d.cts +15 -15
- package/dist/eval/record/membership-provenance.d.mts +15 -15
- package/dist/eval/record/membership-provenance.d.ts +15 -15
- package/dist/eval/record/score.cjs +7 -0
- package/dist/eval/record/score.cjs.map +1 -1
- package/dist/eval/record/sealed-assertion.cjs +3 -0
- package/dist/eval/record/sealed-assertion.cjs.map +1 -1
- package/dist/eval/record/verdict.cjs +7 -0
- package/dist/eval/record/verdict.cjs.map +1 -1
- package/dist/expect/index.cjs +8 -2
- package/dist/expect/index.cjs.map +1 -1
- package/dist/expect/index.d.cts +9 -4
- package/dist/expect/index.d.mts +9 -4
- package/dist/expect/index.d.ts +9 -4
- package/dist/expect/index.js +72 -62
- package/dist/expect/index.mjs +72 -62
- package/dist/experiment/host/cli/contribution.cjs +37 -23
- package/dist/experiment/host/cli/contribution.cjs.map +1 -1
- package/dist/experiment/host/cli/contribution.d.cts +9 -1
- package/dist/experiment/host/cli/contribution.d.mts +9 -1
- package/dist/experiment/host/cli/contribution.d.ts +9 -1
- package/dist/experiment/host/current.cjs +74 -0
- package/dist/experiment/host/current.cjs.map +1 -0
- package/dist/experiment/host/current.d.cts +33 -0
- package/dist/experiment/host/current.d.mts +33 -0
- package/dist/experiment/host/current.d.ts +33 -0
- package/dist/experiment/host/current.js +10 -0
- package/dist/experiment/host/current.js.map +1 -0
- package/dist/experiment/host/index.cjs +17 -174
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/experiment/host/index.d.cts +8 -54
- package/dist/experiment/host/index.d.mts +8 -54
- package/dist/experiment/host/index.d.ts +8 -54
- package/dist/experiment/host/operations.cjs +33 -10
- package/dist/experiment/host/operations.cjs.map +1 -1
- package/dist/experiment/host/operations.d.cts +29 -1
- package/dist/experiment/host/operations.d.mts +29 -1
- package/dist/experiment/host/operations.d.ts +29 -1
- package/dist/experiment/host/operations.js +6 -4
- package/dist/experiment/host/requirements.cjs +3 -0
- package/dist/experiment/host/requirements.cjs.map +1 -0
- package/dist/experiment/host/requirements.d.cts +3 -0
- package/dist/experiment/host/requirements.d.mts +3 -0
- package/dist/experiment/host/requirements.d.ts +3 -0
- package/dist/experiment/host/requirements.js +4 -0
- package/dist/experiment/host/requirements.js.map +1 -0
- package/dist/experiment/host/runtime.cjs +179 -0
- package/dist/experiment/host/runtime.cjs.map +1 -0
- package/dist/experiment/host/runtime.d.cts +79 -0
- package/dist/experiment/host/runtime.d.mts +79 -0
- package/dist/experiment/host/runtime.d.ts +79 -0
- package/dist/experiment/host/runtime.js +6 -0
- package/dist/experiment/host/runtime.js.map +1 -0
- package/dist/experiment/host/types.cjs.map +1 -1
- package/dist/experiment/host/types.d.cts +17 -16
- package/dist/experiment/host/types.d.mts +17 -16
- package/dist/experiment/host/types.d.ts +17 -16
- package/dist/fresh-import.cjs +2 -1
- package/dist/fresh-import.cjs.map +1 -1
- package/dist/index.cjs +4 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +12 -6
- package/dist/index.d.mts +12 -6
- package/dist/index.d.ts +12 -6
- package/dist/index.js +32 -30
- package/dist/index.mjs +32 -30
- package/dist/inspection/artifacts.cjs +83 -54
- package/dist/inspection/artifacts.cjs.map +1 -1
- package/dist/inspection/artifacts.d.cts +8 -0
- package/dist/inspection/artifacts.d.mts +8 -0
- package/dist/inspection/artifacts.d.ts +8 -0
- package/dist/inspection/artifacts.js +2 -0
- package/dist/inspection/assertions.cjs +4 -1
- package/dist/inspection/assertions.cjs.map +1 -1
- package/dist/inspection/cli/contribution.cjs +27 -4
- package/dist/inspection/cli/contribution.cjs.map +1 -1
- package/dist/inspection/cli/contribution.d.cts +2 -1
- package/dist/inspection/cli/contribution.d.mts +2 -1
- package/dist/inspection/cli/contribution.d.ts +2 -1
- package/dist/inspection/execution-traces.cjs +114 -8
- package/dist/inspection/execution-traces.cjs.map +1 -1
- package/dist/inspection/execution-traces.d.cts +38 -0
- package/dist/inspection/execution-traces.d.mts +38 -0
- package/dist/inspection/execution-traces.d.ts +38 -0
- package/dist/inspection/facts.cjs +12 -0
- package/dist/inspection/facts.cjs.map +1 -1
- package/dist/inspection/limits.cjs +5 -1
- package/dist/inspection/limits.cjs.map +1 -1
- package/dist/inspection/limits.d.cts +4 -0
- package/dist/inspection/limits.d.mts +4 -0
- package/dist/inspection/limits.d.ts +4 -0
- package/dist/inspection/limits.js +6 -2
- package/dist/inspection/overview.cjs +74 -33
- package/dist/inspection/overview.cjs.map +1 -1
- package/dist/inspection/overview.d.cts +19 -1
- package/dist/inspection/overview.d.mts +19 -1
- package/dist/inspection/overview.d.ts +19 -1
- package/dist/inspection/overview.js +4 -2
- package/dist/inspection/project-input.cjs +9 -0
- package/dist/inspection/project-input.cjs.map +1 -0
- package/dist/inspection/project-input.d.cts +20 -0
- package/dist/inspection/project-input.d.mts +20 -0
- package/dist/inspection/project-input.d.ts +20 -0
- package/dist/inspection/project-input.js +8 -0
- package/dist/inspection/project-input.js.map +1 -0
- package/dist/inspection/project-result.cjs +60 -0
- package/dist/inspection/project-result.cjs.map +1 -0
- package/dist/inspection/project-result.d.cts +1264 -0
- package/dist/inspection/project-result.d.mts +1264 -0
- package/dist/inspection/project-result.d.ts +1264 -0
- package/dist/inspection/project-result.js +10 -0
- package/dist/inspection/project-result.js.map +1 -0
- package/dist/inspection/project-source.cjs +109 -0
- package/dist/inspection/project-source.cjs.map +1 -0
- package/dist/inspection/project-source.d.cts +10 -0
- package/dist/inspection/project-source.d.mts +10 -0
- package/dist/inspection/project-source.d.ts +10 -0
- package/dist/inspection/project-source.js +6 -0
- package/dist/inspection/project-source.js.map +1 -0
- package/dist/inspection/project.cjs +100 -0
- package/dist/inspection/project.cjs.map +1 -0
- package/dist/inspection/project.d.cts +3 -0
- package/dist/inspection/project.d.mts +3 -0
- package/dist/inspection/project.d.ts +3 -0
- package/dist/inspection/project.js +6 -0
- package/dist/inspection/project.js.map +1 -0
- package/dist/inspection/protocol.cjs +19 -9
- package/dist/inspection/protocol.cjs.map +1 -1
- package/dist/inspection/protocol.d.cts +5506 -38189
- package/dist/inspection/protocol.d.mts +5506 -38189
- package/dist/inspection/protocol.d.ts +5506 -38189
- package/dist/inspection/public.mjs +896 -84
- package/dist/inspection/query.cjs +2 -0
- package/dist/inspection/query.cjs.map +1 -1
- package/dist/inspection/results.cjs +234 -29
- package/dist/inspection/results.cjs.map +1 -1
- package/dist/inspection/results.d.cts +870 -13
- package/dist/inspection/results.d.mts +870 -13
- package/dist/inspection/results.d.ts +870 -13
- package/dist/inspection/results.js +36 -34
- package/dist/inspection/select.cjs +126 -14
- package/dist/inspection/select.cjs.map +1 -1
- package/dist/inspection/select.d.cts +1 -1
- package/dist/inspection/select.d.mts +1 -1
- package/dist/inspection/select.d.ts +1 -1
- package/dist/inspection/source.cjs +4 -0
- package/dist/inspection/source.cjs.map +1 -1
- package/dist/inspection/sources.cjs +5 -0
- package/dist/inspection/sources.cjs.map +1 -1
- package/dist/inspection/trace.cjs +82 -84
- package/dist/inspection/trace.cjs.map +1 -1
- package/dist/inspection/trace.d.cts +7 -2
- package/dist/inspection/trace.d.mts +7 -2
- package/dist/inspection/trace.d.ts +7 -2
- package/dist/model-slots.cjs +35 -0
- package/dist/model-slots.cjs.map +1 -0
- package/dist/model-slots.d.cts +19 -0
- package/dist/model-slots.d.mts +19 -0
- package/dist/model-slots.d.ts +19 -0
- package/dist/model-slots.js +8 -0
- package/dist/model-slots.js.map +1 -0
- package/dist/o11y/adapter-call-price.cjs +4 -0
- package/dist/o11y/adapter-call-price.cjs.map +1 -1
- package/dist/o11y/adapter-call-price.d.cts +24 -0
- package/dist/o11y/adapter-call-price.d.mts +24 -0
- package/dist/o11y/adapter-call-price.d.ts +24 -0
- package/dist/o11y/adapter-call-price.js +6 -2
- package/dist/o11y/adapter-usage-projection.cjs +158 -0
- package/dist/o11y/adapter-usage-projection.cjs.map +1 -0
- package/dist/o11y/adapter-usage-projection.d.cts +141 -0
- package/dist/o11y/adapter-usage-projection.d.mts +141 -0
- package/dist/o11y/adapter-usage-projection.d.ts +141 -0
- package/dist/o11y/adapter-usage-projection.js +20 -0
- package/dist/o11y/adapter-usage-projection.js.map +1 -0
- package/dist/o11y/eval-usage.cjs +149 -0
- package/dist/o11y/eval-usage.cjs.map +1 -0
- package/dist/o11y/eval-usage.d.cts +46 -0
- package/dist/o11y/eval-usage.d.mts +46 -0
- package/dist/o11y/eval-usage.d.ts +46 -0
- package/dist/o11y/eval-usage.js +8 -0
- package/dist/o11y/eval-usage.js.map +1 -0
- package/dist/o11y/judge-call-price.cjs +62 -0
- package/dist/o11y/judge-call-price.cjs.map +1 -0
- package/dist/o11y/judge-call-price.d.cts +3 -0
- package/dist/o11y/judge-call-price.d.mts +3 -0
- package/dist/o11y/judge-call-price.d.ts +3 -0
- package/dist/o11y/judge-call-price.js +6 -0
- package/dist/o11y/judge-call-price.js.map +1 -0
- package/dist/o11y/judge-usage-projection.cjs +134 -0
- package/dist/o11y/judge-usage-projection.cjs.map +1 -0
- package/dist/o11y/judge-usage-projection.d.cts +18 -0
- package/dist/o11y/judge-usage-projection.d.mts +18 -0
- package/dist/o11y/judge-usage-projection.d.ts +18 -0
- package/dist/o11y/judge-usage-projection.js +20 -0
- package/dist/o11y/judge-usage-projection.js.map +1 -0
- package/dist/o11y/judge-usage-receipt.cjs +135 -0
- package/dist/o11y/judge-usage-receipt.cjs.map +1 -0
- package/dist/o11y/judge-usage-receipt.d.cts +5 -0
- package/dist/o11y/judge-usage-receipt.d.mts +5 -0
- package/dist/o11y/judge-usage-receipt.d.ts +5 -0
- package/dist/o11y/judge-usage-receipt.js +6 -0
- package/dist/o11y/judge-usage-receipt.js.map +1 -0
- package/dist/o11y/judge-usage.cjs +171 -0
- package/dist/o11y/judge-usage.cjs.map +1 -0
- package/dist/o11y/judge-usage.d.cts +35 -0
- package/dist/o11y/judge-usage.d.mts +35 -0
- package/dist/o11y/judge-usage.d.ts +35 -0
- package/dist/o11y/judge-usage.js +6 -0
- package/dist/o11y/judge-usage.js.map +1 -0
- package/dist/plugin/contracts.cjs +2 -0
- package/dist/plugin/contracts.cjs.map +1 -1
- package/dist/plugin/link.cjs +7 -0
- package/dist/plugin/link.cjs.map +1 -1
- package/dist/record/attachment/protocol.cjs +8 -6
- package/dist/record/attachment/protocol.cjs.map +1 -1
- package/dist/record/attachment/protocol.d.cts +10 -0
- package/dist/record/attachment/protocol.d.mts +10 -0
- package/dist/record/attachment/protocol.d.ts +10 -0
- package/dist/record/attachment/protocol.js +38 -36
- package/dist/record/codec/seal-manifest.d.cts +3 -3
- package/dist/record/codec/seal-manifest.d.mts +3 -3
- package/dist/record/codec/seal-manifest.d.ts +3 -3
- package/dist/record/family/adapter-usage/definition.d.cts +1 -0
- package/dist/record/family/adapter-usage/definition.d.mts +1 -0
- package/dist/record/family/adapter-usage/definition.d.ts +1 -0
- package/dist/record/family/adapter-usage/persistence.cjs +1 -1
- package/dist/record/family/adapter-usage/persistence.cjs.map +1 -1
- package/dist/record/family/adapter-usage/persistence.d.cts +2 -1
- package/dist/record/family/adapter-usage/persistence.d.mts +2 -1
- package/dist/record/family/adapter-usage/persistence.d.ts +2 -1
- package/dist/record/family/adapter-usage/schema.cjs +21 -2
- package/dist/record/family/adapter-usage/schema.cjs.map +1 -1
- package/dist/record/family/adapter-usage/schema.d.cts +85 -0
- package/dist/record/family/adapter-usage/schema.d.mts +85 -0
- package/dist/record/family/adapter-usage/schema.d.ts +85 -0
- package/dist/record/family/adapter-usage/schema.js +18 -12
- package/dist/record/family/catalog.cjs +31 -27
- package/dist/record/family/catalog.cjs.map +1 -1
- package/dist/record/family/catalog.d.cts +94 -3
- package/dist/record/family/catalog.d.mts +94 -3
- package/dist/record/family/catalog.d.ts +94 -3
- package/dist/record/family/current.cjs +45 -42
- package/dist/record/family/current.cjs.map +1 -1
- package/dist/record/family/current.d.cts +240 -1
- package/dist/record/family/current.d.mts +240 -1
- package/dist/record/family/current.d.ts +240 -1
- package/dist/record/family/execution-traces/definition.d.cts +26 -0
- package/dist/record/family/execution-traces/definition.d.mts +26 -0
- package/dist/record/family/execution-traces/definition.d.ts +26 -0
- package/dist/record/family/execution-traces/definition.js +20 -14
- package/dist/record/family/execution-traces/schema.cjs +57 -1
- package/dist/record/family/execution-traces/schema.cjs.map +1 -1
- package/dist/record/family/execution-traces/schema.d.cts +114 -0
- package/dist/record/family/execution-traces/schema.d.mts +114 -0
- package/dist/record/family/execution-traces/schema.d.ts +114 -0
- package/dist/record/family/execution-traces/schema.js +18 -12
- package/dist/record/family/judge-usage/definition.cjs +12 -0
- package/dist/record/family/judge-usage/definition.cjs.map +1 -0
- package/dist/record/family/judge-usage/definition.d.cts +91 -0
- package/dist/record/family/judge-usage/definition.d.mts +91 -0
- package/dist/record/family/judge-usage/definition.d.ts +91 -0
- package/dist/record/family/judge-usage/definition.js +6 -0
- package/dist/record/family/judge-usage/definition.js.map +1 -0
- package/dist/record/family/judge-usage/persistence.cjs +10 -0
- package/dist/record/family/judge-usage/persistence.cjs.map +1 -0
- package/dist/record/family/judge-usage/persistence.d.cts +91 -0
- package/dist/record/family/judge-usage/persistence.d.mts +91 -0
- package/dist/record/family/judge-usage/persistence.d.ts +91 -0
- package/dist/record/family/judge-usage/persistence.js +6 -0
- package/dist/record/family/judge-usage/persistence.js.map +1 -0
- package/dist/record/family/judge-usage/schema.cjs +307 -0
- package/dist/record/family/judge-usage/schema.cjs.map +1 -0
- package/dist/record/family/judge-usage/schema.d.cts +351 -0
- package/dist/record/family/judge-usage/schema.d.mts +351 -0
- package/dist/record/family/judge-usage/schema.d.ts +351 -0
- package/dist/record/family/judge-usage/schema.js +18 -0
- package/dist/record/family/judge-usage/schema.js.map +1 -0
- package/dist/record/host/sqlite-host.cjs +55 -9
- package/dist/record/host/sqlite-host.cjs.map +1 -1
- package/dist/record/host/types.cjs.map +1 -1
- package/dist/record/host/types.d.cts +7 -0
- package/dist/record/host/types.d.mts +7 -0
- package/dist/record/host/types.d.ts +7 -0
- package/dist/record/model/run-context.cjs +7 -1
- package/dist/record/model/run-context.cjs.map +1 -1
- package/dist/record/model/run-context.d.cts +4 -0
- package/dist/record/model/run-context.d.mts +4 -0
- package/dist/record/model/run-context.d.ts +4 -0
- package/dist/record/model/seal-manifest.d.cts +1 -1
- package/dist/record/model/seal-manifest.d.mts +1 -1
- package/dist/record/model/seal-manifest.d.ts +1 -1
- package/dist/record/sqlite/client.cjs +18 -5
- package/dist/record/sqlite/client.cjs.map +1 -1
- package/dist/record/sqlite/client.d.cts +1 -1
- package/dist/record/sqlite/client.d.mts +1 -1
- package/dist/record/sqlite/client.d.ts +1 -1
- package/dist/record/sqlite/project-state-database.cjs +29 -8
- package/dist/record/sqlite/project-state-database.cjs.map +1 -1
- package/dist/run/host/runtime.cjs +4 -0
- package/dist/run/host/runtime.cjs.map +1 -1
- package/dist/run/storage/sqlite.cjs +20 -0
- package/dist/run/storage/sqlite.cjs.map +1 -1
- package/dist/runner/adapter-execution-trace.cjs +125 -2
- package/dist/runner/adapter-execution-trace.cjs.map +1 -1
- package/dist/runner/adapter-execution-trace.d.cts +1 -1
- package/dist/runner/adapter-execution-trace.d.mts +1 -1
- package/dist/runner/adapter-execution-trace.d.ts +1 -1
- package/dist/runner/adapter-usage.cjs +55 -7
- package/dist/runner/adapter-usage.cjs.map +1 -1
- package/dist/runner/adapter-usage.d.cts +9 -2
- package/dist/runner/adapter-usage.d.mts +9 -2
- package/dist/runner/adapter-usage.d.ts +9 -2
- package/dist/runner/adoption.cjs +9 -0
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/attempt-cancellation.cjs +12 -0
- package/dist/runner/attempt-cancellation.cjs.map +1 -0
- package/dist/runner/attempt-cancellation.d.cts +6 -0
- package/dist/runner/attempt-cancellation.d.mts +6 -0
- package/dist/runner/attempt-cancellation.d.ts +6 -0
- package/dist/runner/attempt-cancellation.js +6 -0
- package/dist/runner/attempt-cancellation.js.map +1 -0
- package/dist/runner/attempt-resources.cjs +10 -4
- package/dist/runner/attempt-resources.cjs.map +1 -1
- package/dist/runner/attempt-resources.d.cts +2 -1
- package/dist/runner/attempt-resources.d.mts +2 -1
- package/dist/runner/attempt-resources.d.ts +2 -1
- package/dist/runner/attempt.cjs +1177 -1139
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/runner/config-identity.cjs +20 -1
- package/dist/runner/config-identity.cjs.map +1 -1
- package/dist/runner/config-identity.d.cts +5 -0
- package/dist/runner/config-identity.d.mts +5 -0
- package/dist/runner/config-identity.d.ts +5 -0
- package/dist/runner/discover.cjs +14 -0
- package/dist/runner/discover.cjs.map +1 -1
- package/dist/runner/discover.d.cts +3 -0
- package/dist/runner/discover.d.mts +3 -0
- package/dist/runner/discover.d.ts +3 -0
- package/dist/runner/feedback/human.cjs +9 -4
- package/dist/runner/feedback/human.cjs.map +1 -1
- package/dist/runner/fingerprint.cjs +1 -0
- package/dist/runner/fingerprint.cjs.map +1 -1
- package/dist/runner/judge-usage.cjs +18 -0
- package/dist/runner/judge-usage.cjs.map +1 -0
- package/dist/runner/judge-usage.d.cts +5 -0
- package/dist/runner/judge-usage.d.mts +5 -0
- package/dist/runner/judge-usage.d.ts +5 -0
- package/dist/runner/judge-usage.js +8 -0
- package/dist/runner/judge-usage.js.map +1 -0
- package/dist/runner/project-target.cjs.map +1 -1
- package/dist/runner/project-target.d.cts +2 -0
- package/dist/runner/project-target.d.mts +2 -0
- package/dist/runner/project-target.d.ts +2 -0
- package/dist/runner/record/planning.cjs +1 -0
- package/dist/runner/record/planning.cjs.map +1 -1
- package/dist/runner/record.cjs +4 -0
- package/dist/runner/record.cjs.map +1 -1
- package/dist/runner/reporters/braintrust.cjs +2 -0
- package/dist/runner/reporters/braintrust.cjs.map +1 -1
- package/dist/runner/reuse-diagnostics.cjs +9 -10
- package/dist/runner/reuse-diagnostics.cjs.map +1 -1
- package/dist/runner/reuse-diagnostics.d.cts +5 -6
- package/dist/runner/reuse-diagnostics.d.mts +5 -6
- package/dist/runner/reuse-diagnostics.d.ts +5 -6
- package/dist/runner/reuse-diagnostics.js +4 -4
- package/dist/runner/reuse-plan.cjs +100 -48
- package/dist/runner/reuse-plan.cjs.map +1 -1
- package/dist/runner/reuse-plan.d.cts +60 -3
- package/dist/runner/reuse-plan.d.mts +60 -3
- package/dist/runner/reuse-plan.d.ts +60 -3
- package/dist/runner/reuse-plan.js +14 -10
- package/dist/runner/run.cjs +8 -6
- package/dist/runner/run.cjs.map +1 -1
- package/dist/runner/session.cjs +1 -1
- package/dist/runner/session.cjs.map +1 -1
- package/dist/runner/session.d.cts +1 -1
- package/dist/runner/session.d.mts +1 -1
- package/dist/runner/session.d.ts +1 -1
- package/dist/runner/source-producer.cjs +3 -1
- package/dist/runner/source-producer.cjs.map +1 -1
- package/dist/runner/types.cjs.map +1 -1
- package/dist/runner/types.d.cts +26 -5
- package/dist/runner/types.d.mts +26 -5
- package/dist/runner/types.d.ts +26 -5
- package/dist/sandbox/action.cjs +3 -0
- package/dist/sandbox/action.cjs.map +1 -1
- package/dist/sandbox/commands.cjs +3 -0
- package/dist/sandbox/commands.cjs.map +1 -1
- package/dist/sandbox/compose.cjs +6 -0
- package/dist/sandbox/compose.cjs.map +1 -1
- package/dist/sandbox/docker-profile/registry.cjs +7 -0
- package/dist/sandbox/docker-profile/registry.cjs.map +1 -1
- package/dist/sandbox/docker-profile/runtime.cjs +3 -0
- package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.cjs +7 -0
- package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
- package/dist/sandbox/incus.cjs +7 -0
- package/dist/sandbox/incus.cjs.map +1 -1
- package/dist/sandbox/layer.cjs +12 -0
- package/dist/sandbox/layer.cjs.map +1 -1
- package/dist/shared/adapter-cleanup.cjs +18 -0
- package/dist/shared/adapter-cleanup.cjs.map +1 -0
- package/dist/shared/adapter-cleanup.d.cts +4 -0
- package/dist/shared/adapter-cleanup.d.mts +4 -0
- package/dist/shared/adapter-cleanup.d.ts +4 -0
- package/dist/shared/adapter-cleanup.js +10 -0
- package/dist/shared/adapter-cleanup.js.map +1 -0
- package/dist/shared/attempt-lifecycle.cjs +3 -0
- package/dist/shared/attempt-lifecycle.cjs.map +1 -0
- package/dist/shared/attempt-lifecycle.d.cts +13 -0
- package/dist/shared/attempt-lifecycle.d.mts +13 -0
- package/dist/shared/attempt-lifecycle.d.ts +13 -0
- package/dist/shared/attempt-lifecycle.js +4 -0
- package/dist/shared/attempt-lifecycle.js.map +1 -0
- package/dist/show/contribution.cjs +52 -14
- package/dist/show/contribution.cjs.map +1 -1
- package/dist/show/contribution.d.cts +23 -1
- package/dist/show/contribution.d.mts +23 -1
- package/dist/show/contribution.d.ts +23 -1
- package/dist/show/model.cjs +8 -1
- package/dist/show/model.cjs.map +1 -1
- package/dist/show/model.d.cts +10 -1
- package/dist/show/model.d.mts +10 -1
- package/dist/show/model.d.ts +10 -1
- package/dist/show/render.cjs +287 -49
- package/dist/show/render.cjs.map +1 -1
- package/dist/show/render.d.cts +3 -0
- package/dist/show/render.d.mts +3 -0
- package/dist/show/render.d.ts +3 -0
- package/dist/sources/projector.cjs +3 -0
- package/dist/sources/projector.cjs.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +1 -1
- package/dist/types.d.mts +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/view/app-dist/.vite/manifest.json +2 -2
- package/dist/view/app-dist/assets/index-CmVoXbwG.js +63 -0
- package/dist/view/app-dist/assets/{quality-cost-scatter-CFB3wnkN.js → quality-cost-scatter-BuLISaH4.js} +1 -1
- package/dist/view/app-dist/index.html +1 -1
- package/dist/view/cli/contribution.cjs +54 -21
- package/dist/view/cli/contribution.cjs.map +1 -1
- package/dist/view/cli/contribution.d.cts +2 -1
- package/dist/view/cli/contribution.d.mts +2 -1
- package/dist/view/cli/contribution.d.ts +2 -1
- package/dist/view/function-runtime.mjs +13231 -11647
- package/dist/view/http-protocol.cjs +3 -0
- package/dist/view/http-protocol.cjs.map +1 -1
- package/dist/view/http-protocol.d.cts +8 -0
- package/dist/view/http-protocol.d.mts +8 -0
- package/dist/view/http-protocol.d.ts +8 -0
- package/dist/view/inspection-host.cjs +17 -1
- package/dist/view/inspection-host.cjs.map +1 -1
- package/dist/view/render.cjs +1 -0
- package/dist/view/render.cjs.map +1 -1
- package/dist/view/render.d.cts +2 -1
- package/dist/view/render.d.mts +2 -1
- package/dist/view/render.d.ts +2 -1
- package/dist/view/revision.cjs.map +1 -1
- package/dist/view/revision.d.cts +12 -0
- package/dist/view/revision.d.mts +12 -0
- package/dist/view/revision.d.ts +12 -0
- package/dist/view/server.cjs +10 -9
- package/dist/view/server.cjs.map +1 -1
- package/docs-site/zh/examples/ai-agent-application.mdx +1 -1
- package/docs-site/zh/explanation/adapter.mdx +2 -2
- package/docs-site/zh/explanation/assert.mdx +60 -24
- package/docs-site/zh/explanation/drive.mdx +1 -1
- package/docs-site/zh/explanation/evals.mdx +31 -29
- package/docs-site/zh/explanation/experiment.mdx +15 -15
- package/docs-site/zh/explanation/judge.mdx +23 -15
- package/docs-site/zh/explanation/overview.mdx +44 -21
- package/docs-site/zh/explanation/record.mdx +28 -13
- package/docs-site/zh/explanation/results-flow.mdx +37 -0
- package/docs-site/zh/explanation/runner.mdx +27 -6
- package/docs-site/zh/index.mdx +22 -115
- package/docs-site/zh/introduction.mdx +89 -61
- package/docs-site/zh/reference/cli.mdx +50 -26
- package/docs-site/zh/reference/define-agent.mdx +37 -5
- package/docs-site/zh/reference/define-eval.mdx +130 -29
- package/docs-site/zh/reference/define-experiment.mdx +251 -0
- package/docs-site/zh/reference/events.mdx +34 -30
- package/docs-site/zh/reference/expect.mdx +77 -2
- package/docs-site/zh/reference/official-adapters.mdx +2 -2
- package/docs-site/zh/troubleshooting/debug-sandbox.mdx +43 -24
- package/docs-site/zh/troubleshooting/debugging.mdx +65 -42
- package/docs-site/zh/troubleshooting/recover-after-kill.mdx +35 -28
- package/docs-site/zh/tutorials/accept-results.mdx +34 -24
- package/docs-site/zh/tutorials/agent-feedback-loop.mdx +74 -43
- package/docs-site/zh/tutorials/agent-onboarding.mdx +27 -20
- package/docs-site/zh/tutorials/authoring.mdx +138 -121
- package/docs-site/zh/tutorials/ci-integration.mdx +46 -22
- package/docs-site/zh/tutorials/compare-runs.mdx +40 -13
- package/docs-site/zh/tutorials/concurrency.mdx +66 -62
- package/docs-site/zh/tutorials/configuration.mdx +17 -17
- package/docs-site/zh/tutorials/connect-otel.mdx +48 -37
- package/docs-site/zh/tutorials/connect-your-agent.mdx +80 -173
- package/docs-site/zh/tutorials/control-run-cost.mdx +63 -12
- package/docs-site/zh/tutorials/criteria-files.mdx +28 -21
- package/docs-site/zh/tutorials/custom-application.mdx +75 -55
- package/docs-site/zh/tutorials/dataset-fanout.mdx +32 -22
- package/docs-site/zh/tutorials/debug-lifecycle-plan.mdx +38 -31
- package/docs-site/zh/tutorials/docker-in-docker.mdx +83 -89
- package/docs-site/zh/tutorials/eval-groups.mdx +70 -89
- package/docs-site/zh/tutorials/evaluation-kinds.mdx +12 -5
- package/docs-site/zh/tutorials/experiment-services.mdx +243 -0
- package/docs-site/zh/tutorials/fixtures.mdx +42 -26
- package/docs-site/zh/tutorials/handle-execution-failures.mdx +41 -19
- package/docs-site/zh/tutorials/install-custom-sandbox-agent.mdx +21 -16
- package/docs-site/zh/tutorials/niceeval-taste-application.mdx +394 -0
- package/docs-site/zh/tutorials/niceeval-taste.mdx +190 -0
- package/docs-site/zh/tutorials/nixos-managed-dind.mdx +51 -39
- package/docs-site/zh/tutorials/plugins.mdx +55 -31
- package/docs-site/zh/tutorials/prebuilt-sandbox.mdx +204 -0
- package/docs-site/zh/tutorials/quickstart.mdx +91 -47
- package/docs-site/zh/tutorials/reporters.mdx +45 -30
- package/docs-site/zh/tutorials/rerun-and-cache.mdx +39 -40
- package/docs-site/zh/tutorials/sandbox-agent.mdx +65 -40
- package/docs-site/zh/tutorials/sandbox-providers.mdx +104 -282
- package/docs-site/zh/tutorials/sandbox-reuse.mdx +65 -97
- package/docs-site/zh/tutorials/select-and-preview.mdx +25 -20
- package/docs-site/zh/tutorials/verify-judge.mdx +49 -26
- package/docs-site/zh/tutorials/viewing-results.mdx +130 -80
- package/docs-site/zh/tutorials/write-experiment.mdx +116 -298
- package/docs-site/zh/tutorials/write-send.mdx +53 -52
- package/node_modules/undici/docs/docs/api/Agent.md +8 -8
- package/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +9 -6
- package/node_modules/undici/docs/docs/api/Errors.md +25 -0
- package/node_modules/undici/docs/docs/api/Interceptors.md +4 -3
- package/node_modules/undici/docs/docs/api/Pool.md +5 -6
- package/node_modules/undici/lib/api/readable.js +1 -2
- package/node_modules/undici/lib/core/request.js +23 -2
- package/node_modules/undici/lib/core/util.js +0 -39
- package/node_modules/undici/lib/dispatcher/client-h1.js +11 -4
- package/node_modules/undici/lib/dispatcher/client-h2.js +52 -8
- package/node_modules/undici/lib/dispatcher/client.js +1 -1
- package/node_modules/undici/lib/dispatcher/dispatcher1-wrapper.js +3 -2
- package/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +21 -6
- package/node_modules/undici/lib/dispatcher/pool-base.js +63 -2
- package/node_modules/undici/lib/dispatcher/pool.js +90 -7
- package/node_modules/undici/lib/dispatcher/proxy-agent.js +16 -3
- package/node_modules/undici/lib/handler/deduplication-handler.js +24 -11
- package/node_modules/undici/lib/handler/redirect-handler.js +5 -0
- package/node_modules/undici/lib/handler/retry-handler.js +72 -13
- package/node_modules/undici/lib/interceptor/cache.js +4 -1
- package/node_modules/undici/lib/interceptor/decompress.js +236 -69
- package/node_modules/undici/lib/web/cache/cache.js +17 -8
- package/node_modules/undici/lib/web/cache/cachestorage.js +11 -5
- package/node_modules/undici/lib/web/cookies/index.js +19 -7
- package/node_modules/undici/lib/web/cookies/util.js +3 -1
- package/node_modules/undici/lib/web/eventsource/eventsource.js +25 -1
- package/node_modules/undici/lib/web/fetch/body.js +22 -15
- package/node_modules/undici/lib/web/fetch/data-url.js +6 -6
- package/node_modules/undici/lib/web/fetch/formdata.js +30 -36
- package/node_modules/undici/lib/web/fetch/headers.js +34 -31
- package/node_modules/undici/lib/web/fetch/index.js +38 -14
- package/node_modules/undici/lib/web/fetch/request.js +74 -79
- package/node_modules/undici/lib/web/fetch/response.js +43 -44
- package/node_modules/undici/lib/web/fetch/util.js +7 -7
- package/node_modules/undici/lib/web/infra/index.js +16 -1
- package/node_modules/undici/lib/web/webidl/index.js +2 -14
- package/node_modules/undici/lib/web/websocket/events.js +43 -26
- package/node_modules/undici/lib/web/websocket/receiver.js +5 -0
- package/node_modules/undici/lib/web/websocket/stream/websocketerror.js +13 -10
- package/node_modules/undici/lib/web/websocket/websocket.js +44 -41
- package/node_modules/undici/package.json +1 -1
- package/node_modules/undici/types/diagnostics-channel.d.ts +2 -1
- package/node_modules/undici/types/interceptors.d.ts +1 -1
- package/node_modules/undici/types/webidl.d.ts +13 -7
- package/package.json +4 -4
- package/dist/view/app-dist/assets/index-DFzw1L97.js +0 -63
- package/docs-site/zh/tutorials/experiments.mdx +0 -101
package/dist/adapter.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
import type { ResolvedModelSlots } from "./model-slots.js";
|
|
2
|
+
import type { AttemptSignal } from "./shared/attempt-lifecycle.js";
|
|
3
|
+
export type { AttemptCancellation, AttemptSignal } from "./shared/attempt-lifecycle.js";
|
|
4
|
+
import type { MatchContext } from "./assertions/context-match.js";
|
|
5
|
+
import type { EvalUsage } from "./o11y/eval-usage.js";
|
|
1
6
|
import type { ExperimentFlags } from "./shared/types.js";
|
|
2
7
|
import { type AdapterFlagsParser, type AdapterFlagsOutput, type AdapterFlagsParserValidation, type AdapterFlagsParserValidationArgs } from "./adapter-flags.js";
|
|
3
8
|
import type { AssertionCheck, AssertionSubject, AssertionsRuntime, BooleanAssertionHandle, MeasurementAssertionHandle, PolymorphicBooleanAssertionHandle, PolymorphicMeasurementAssertionHandle } from "./assertions/api.js";
|
|
@@ -23,8 +28,8 @@ export type AdapterAssertionsFactory<Context extends object, Assertions extends
|
|
|
23
28
|
* assembly, and `check` may only be called by a returned Assertion method.
|
|
24
29
|
*/
|
|
25
30
|
export interface AdapterAssertionsFactoryContext<Context extends object> {
|
|
26
|
-
readonly app:
|
|
27
|
-
readonly check: AssertionCheck<"polymorphic">;
|
|
31
|
+
readonly app: MatchContext<Context>;
|
|
32
|
+
readonly check: AssertionCheck<"polymorphic", Context>;
|
|
28
33
|
}
|
|
29
34
|
type BoundAdapterAssertionResult<Kind extends EvaluationKind, Result> = Result extends PolymorphicBooleanAssertionHandle<infer Refined, infer HasGate> ? BooleanAssertionHandle<Kind, Refined, HasGate> : Result extends PolymorphicMeasurementAssertionHandle<infer HasCondition> ? MeasurementAssertionHandle<Kind, HasCondition> : never;
|
|
30
35
|
type BoundAdapterAssertionMethod<Kind extends EvaluationKind, Method> = Method extends (...args: infer Args) => infer Result ? ((...args: Args) => Result) extends Method ? (...args: Args) => BoundAdapterAssertionResult<Kind, Result> : never : never;
|
|
@@ -32,7 +37,7 @@ type AdapterAssertionsFor<Assertions extends object | undefined, Kind extends Ev
|
|
|
32
37
|
readonly [Key in keyof Assertions]: BoundAdapterAssertionMethod<Kind, Assertions[Key]>;
|
|
33
38
|
} : {};
|
|
34
39
|
/** Keys owned by the neutral Eval runtime or unsafe on a merged object root. */
|
|
35
|
-
declare const RESERVED_ADAPTER_CONTEXT_KEYS: readonly ["evaluationKind", "check", "judge", "factuality", "faithfulness", "instructionFollowing", "pairwisePreference", "closeQA", "score", "group", "skip", "signal", "model", "reasoningEffort", "flags", "progress", "diagnostic", "log", "then", "Object", "constructor", "__defineGetter__", "__defineSetter__", "hasOwnProperty", "__lookupGetter__", "__lookupSetter__", "isPrototypeOf", "propertyIsEnumerable", "toString", "valueOf", "__proto__", "toLocaleString"];
|
|
40
|
+
declare const RESERVED_ADAPTER_CONTEXT_KEYS: readonly ["evaluationKind", "check", "judge", "factuality", "faithfulness", "instructionFollowing", "pairwisePreference", "closeQA", "usage", "elapsedMs", "maxTokens", "maxCost", "score", "group", "skip", "signal", "model", "reasoningEffort", "flags", "progress", "diagnostic", "log", "then", "Object", "constructor", "__defineGetter__", "__defineSetter__", "hasOwnProperty", "__lookupGetter__", "__lookupSetter__", "isPrototypeOf", "propertyIsEnumerable", "toString", "valueOf", "__proto__", "toLocaleString"];
|
|
36
41
|
export type ReservedAdapterContextKey = typeof RESERVED_ADAPTER_CONTEXT_KEYS[number];
|
|
37
42
|
type InvalidContextBranch<Context> = Context extends unknown ? Context extends object ? Context extends readonly unknown[] ? Context : Context extends (...args: readonly never[]) => unknown ? Context : string extends keyof Context ? Context : Extract<keyof Context, ReservedAdapterContextKey> extends never ? never : Context : Context : never;
|
|
38
43
|
type AdapterContextValidation<Context> = unknown extends Context ? unknown : [InvalidContextBranch<Context>] extends [never] ? unknown : {
|
|
@@ -50,11 +55,19 @@ type AdapterAssertionsValidationArgs<Context extends object, Assertions extends
|
|
|
50
55
|
}];
|
|
51
56
|
type AdapterFactory<Context extends object, Flags extends AdapterFlagsParser = undefined> = (context: AdapterCreateContext<AdapterFlagsOutput<Flags>>) => (Context & ThisType<Context>) | Promise<Context & ThisType<Context>>;
|
|
52
57
|
export interface AdapterCleanupContext {
|
|
53
|
-
/**
|
|
58
|
+
/** 整个清理窗口的固定毫秒预算,不为每个回调续期。 */
|
|
59
|
+
readonly timeoutMs: number;
|
|
60
|
+
/** 清理窗口实际开始时确定的 Unix 毫秒截止时间。 */
|
|
61
|
+
readonly deadlineAt: number;
|
|
62
|
+
/** 独立于执行信号;整个 Adapter 清理窗口截止时中止。 */
|
|
54
63
|
readonly signal: AbortSignal;
|
|
55
64
|
}
|
|
56
65
|
export interface AdapterCreateContext<Flags = ExperimentFlags> {
|
|
66
|
+
/** Frozen application model selections for this Attempt. */
|
|
67
|
+
readonly models: ResolvedModelSlots;
|
|
57
68
|
recordUsage(input: import("./adapter-usage.js").AdapterUsageInput): void;
|
|
69
|
+
/** Close application usage admission and declare whether the recorded collection is complete. */
|
|
70
|
+
sealUsage(input: import("./adapter-usage.js").AdapterUsageSeal): void;
|
|
58
71
|
attach(input: import("./adapter-attachments.js").AdapterAttachmentInput): Promise<import("./adapter-attachments.js").AdapterAttachmentReceipt>;
|
|
59
72
|
recordTrace<Event extends import("./adapter-execution-trace.js").ExecutionTraceEvent>(input: import("./adapter-execution-trace.js").ExecutionTraceInput<Event>): Promise<import("./adapter-execution-trace.js").ExecutionTraceReceipt>;
|
|
60
73
|
/** 当前 Eval 的公开 ID。 */
|
|
@@ -63,8 +76,8 @@ export interface AdapterCreateContext<Flags = ExperimentFlags> {
|
|
|
63
76
|
readonly experimentId: string;
|
|
64
77
|
/** 当前 Attempt 的零起始序号。 */
|
|
65
78
|
readonly attempt: number;
|
|
66
|
-
/** Attempt
|
|
67
|
-
readonly signal:
|
|
79
|
+
/** Attempt 执行信号;reason 区分 timeout 与 cancelled,不用于 cleanup 窗口。 */
|
|
80
|
+
readonly signal: AttemptSignal;
|
|
68
81
|
/** Experiment 选择的模型。 */
|
|
69
82
|
readonly model?: string;
|
|
70
83
|
/** Experiment 选择的推理强度。 */
|
|
@@ -83,7 +96,11 @@ export interface AdapterCreateContext<Flags = ExperimentFlags> {
|
|
|
83
96
|
*/
|
|
84
97
|
onCleanup(cleanup: (context: AdapterCleanupContext) => void | Promise<void>): void;
|
|
85
98
|
}
|
|
86
|
-
type EvalContextBase<Kind extends EvaluationKind, Flags> = JudgePresetMethods<Kind> & {
|
|
99
|
+
type EvalContextBase<Kind extends EvaluationKind, Flags, Context> = JudgePresetMethods<Kind, Context> & {
|
|
100
|
+
readonly usage: EvalUsage;
|
|
101
|
+
readonly elapsedMs: import("./assertions/match.js").NumericMaterial;
|
|
102
|
+
maxTokens(max: number): BooleanAssertionHandle<Kind, number>;
|
|
103
|
+
maxCost(usd: number | string): BooleanAssertionHandle<Kind, string>;
|
|
87
104
|
readonly evaluationKind: Kind;
|
|
88
105
|
readonly signal: AbortSignal;
|
|
89
106
|
readonly model?: string;
|
|
@@ -94,11 +111,11 @@ type EvalContextBase<Kind extends EvaluationKind, Flags> = JudgePresetMethods<Ki
|
|
|
94
111
|
log(message: string): void;
|
|
95
112
|
skip(reason: string): never;
|
|
96
113
|
group<Value>(title: string, body: () => Value | PromiseLike<Value>): Promise<Awaited<Value>>;
|
|
97
|
-
readonly check:
|
|
114
|
+
readonly check: AssertionCheck<Kind, Context>;
|
|
98
115
|
readonly judge: <Value>(value: AssertionSubject<Value>, definition: ScoreMatch<NoInfer<Value>>) => MeasurementAssertionHandle<Kind>;
|
|
99
116
|
};
|
|
100
117
|
/** Agent-neutral author context shared by every Adapter Eval. */
|
|
101
|
-
export type EvalContext<Kind extends EvaluationKind = "pass", Flags = ExperimentFlags> = EvalContextBase<Kind, Flags> & (Kind extends "score" ? {
|
|
118
|
+
export type EvalContext<Kind extends EvaluationKind = "pass", Flags = ExperimentFlags, Context = unknown> = EvalContextBase<Kind, Flags, Context> & (Kind extends "score" ? {
|
|
102
119
|
readonly score: AssertionsRuntime<"score">["t"]["score"];
|
|
103
120
|
} : {});
|
|
104
121
|
type AdapterEvalFields = Omit<EvalInput<undefined>, "test" | "sandbox" | "diff"> & {
|
|
@@ -110,10 +127,10 @@ type AdapterScoreEvalFields = Omit<ScoreEvalInput<undefined>, "test" | "sandbox"
|
|
|
110
127
|
readonly diff?: never;
|
|
111
128
|
};
|
|
112
129
|
export type AdapterEvalInput<Context extends object, Assertions extends object | undefined = undefined, Flags extends AdapterFlagsParser = undefined> = AdapterEvalFields & {
|
|
113
|
-
test(t: EvalContext<"pass", AdapterFlagsOutput<Flags
|
|
130
|
+
test(t: EvalContext<"pass", AdapterFlagsOutput<Flags>, Context> & Readonly<Context> & AdapterAssertionsFor<Assertions, "pass">): void | Promise<void>;
|
|
114
131
|
};
|
|
115
132
|
export type AdapterScoreEvalInput<Context extends object, Assertions extends object | undefined = undefined, Flags extends AdapterFlagsParser = undefined> = AdapterScoreEvalFields & {
|
|
116
|
-
test(t: EvalContext<"score", AdapterFlagsOutput<Flags
|
|
133
|
+
test(t: EvalContext<"score", AdapterFlagsOutput<Flags>, Context> & Readonly<Context> & AdapterAssertionsFor<Assertions, "score">): void | Promise<void>;
|
|
117
134
|
};
|
|
118
135
|
interface AdapterContractToken<Context extends object, Assertions extends object | undefined, Flags extends AdapterFlagsParser = undefined> {
|
|
119
136
|
readonly name: string;
|
|
@@ -124,7 +141,7 @@ interface AdapterContractToken<Context extends object, Assertions extends object
|
|
|
124
141
|
/** Keeps the context parameter invariant without exposing a constructible brand. */
|
|
125
142
|
readonly context: (value: Context) => Context;
|
|
126
143
|
}
|
|
127
|
-
export interface AdapterEvalDefinition<Kind extends EvaluationKind, Context extends object, Assertions extends object | undefined = undefined, Flags extends AdapterFlagsParser = undefined> extends EvalDefinition<Kind, EvalContext<Kind, AdapterFlagsOutput<Flags
|
|
144
|
+
export interface AdapterEvalDefinition<Kind extends EvaluationKind, Context extends object, Assertions extends object | undefined = undefined, Flags extends AdapterFlagsParser = undefined> extends EvalDefinition<Kind, EvalContext<Kind, AdapterFlagsOutput<Flags>, Context> & Readonly<Context> & AdapterAssertionsFor<Assertions, Kind>, undefined> {
|
|
128
145
|
readonly [EVAL_ADAPTER_CONTRACT_TOKEN]: AdapterContractToken<Context, Assertions, Flags>;
|
|
129
146
|
}
|
|
130
147
|
/** @internal Existential discovery view; concrete bound factories retain their exact Context. */
|
|
@@ -145,6 +162,7 @@ export interface AdapterRuntimeDefinition {
|
|
|
145
162
|
readonly name: string;
|
|
146
163
|
readonly contract: string;
|
|
147
164
|
readonly behaviorRevision: string | null;
|
|
165
|
+
readonly cleanupTimeoutMs: number;
|
|
148
166
|
readonly [ADAPTER_CONTRACT_TOKEN]: object;
|
|
149
167
|
readonly defineEval: (...args: never[]) => unknown;
|
|
150
168
|
readonly defineScoreEval: (...args: never[]) => unknown;
|
|
@@ -154,12 +172,15 @@ export interface AdapterImplementation<Context extends object, Assertions extend
|
|
|
154
172
|
readonly kind: "custom";
|
|
155
173
|
readonly contract: string;
|
|
156
174
|
readonly behaviorRevision: string | null;
|
|
175
|
+
readonly cleanupTimeoutMs: number;
|
|
157
176
|
readonly [ADAPTER_CONTRACT_TOKEN]: AdapterContractToken<Context, Assertions, Flags>;
|
|
158
177
|
create(context: AdapterCreateContext<AdapterFlagsOutput<Flags>>): Context | Promise<Context>;
|
|
159
178
|
}
|
|
160
179
|
export type AdapterImplementationInput<Context extends object, ImplementationContext extends Context = Context, Flags extends AdapterFlagsParser = undefined> = {
|
|
161
180
|
readonly name: string;
|
|
162
181
|
readonly behaviorRevision?: string;
|
|
182
|
+
/** Adapter 总清理预算,默认 30000 ms;允许整数 1–300000。 */
|
|
183
|
+
readonly cleanupTimeoutMs?: number;
|
|
163
184
|
readonly create: AdapterFactory<ImplementationContext, Flags>;
|
|
164
185
|
} & AdapterContextValidation<NoInfer<ImplementationContext>>;
|
|
165
186
|
export interface AdapterContract<Context extends object, Assertions extends object | undefined = undefined, Flags extends AdapterFlagsParser = undefined> extends AdapterDefinition<Context, Assertions, Flags> {
|
|
@@ -177,6 +198,8 @@ export type Adapter = import("./agents/types.js").Agent | AdapterRuntimeDefiniti
|
|
|
177
198
|
export declare function defineAdapter<Context extends object, Flags extends AdapterFlagsParser = undefined>(input: {
|
|
178
199
|
readonly name: string;
|
|
179
200
|
readonly behaviorRevision?: string;
|
|
201
|
+
/** Adapter 总清理预算,默认 30000 ms;允许整数 1–300000。 */
|
|
202
|
+
readonly cleanupTimeoutMs?: number;
|
|
180
203
|
readonly create: AdapterFactory<Context, Flags>;
|
|
181
204
|
readonly parseFlags?: Flags;
|
|
182
205
|
readonly assertions?: undefined;
|
|
@@ -184,6 +207,8 @@ export declare function defineAdapter<Context extends object, Flags extends Adap
|
|
|
184
207
|
export declare function defineAdapter<Context extends object, Assertions extends object, Flags extends AdapterFlagsParser = undefined>(input: {
|
|
185
208
|
readonly name: string;
|
|
186
209
|
readonly behaviorRevision?: string;
|
|
210
|
+
/** Adapter 总清理预算,默认 30000 ms;允许整数 1–300000。 */
|
|
211
|
+
readonly cleanupTimeoutMs?: number;
|
|
187
212
|
readonly create: AdapterFactory<Context, Flags>;
|
|
188
213
|
readonly parseFlags?: Flags;
|
|
189
214
|
/** Attempt-local Assertion sugar, assembled once after create() succeeds. */
|
package/dist/agents/ai-sdk.cjs
CHANGED
|
@@ -291,6 +291,9 @@ function num(value) {
|
|
|
291
291
|
* });
|
|
292
292
|
* ```
|
|
293
293
|
*/
|
|
294
|
+
// @concord-code ne-adapter-ai-sdk-agent
|
|
295
|
+
// @concord-implements docs/feature/adapters/README.md
|
|
296
|
+
// @concord-implements docs/feature/adapters/sdk/ai-sdk/README.md
|
|
294
297
|
function aiSdkAgent(options) {
|
|
295
298
|
const sessions = new Map();
|
|
296
299
|
return (0, define_ts_1.makeDirectAgent)({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["ai-sdk.ts"],"names":[],"mappings":";;AA6IA,sCA0BC;AAiTD,gCA4EC;AAniBD,uDAAuD;AACvD,EAAE;AACF,qEAAqE;AACrE,yEAAyE;AACzE,mEAAmE;AACnE,uEAAuE;AACvE,UAAU;AACV,EAAE;AACF,gDAAgD;AAChD,oFAAoF;AACpF,yEAAyE;AACzE,kEAAkE;AAClE,2EAA2E;AAC3E,8FAA8F;AAC9F,2DAAqE;AACrE,6CAAyC;AACzC,mCAAgC;AAChC,4CAA+C;AAC/C,kEAA8D;AAC9D,mEAAqE;AACrE,2DAA6D;AAC7D,yDAA6E;AAC7E,yEAAgF;AAmGhF,yDAAyD;AACzD;;;;;;;;;;;;;;;;;GAiBG;AACH,SAAgB,aAAa,CAAC,MAAuB;IACjD,MAAM,UAAU,GAAkB,EAAE,CAAC;IACrC,MAAM,KAAK,GAA6B,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC;QAC3E,CAAC,CAAC,MAAM,CAAC,KAAK;QACd,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,EAAE,MAAM,CAAC,WAAW,EAAE,CAAC,CAAC;IAC5F,MAAM,IAAI,GAAG,EAAE,MAAM,EAAE,IAAI,GAAG,EAAU,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAU,EAAE,CAAC;IACxE,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzD,gBAAgB,CAAC,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACrD,CAAC;aACI,CAAC;YACF,cAAc,CAAC,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;IACL,CAAC;IACD,yEAAyE;IACzE,yCAAyC;IACzC,MAAM,WAAW,GAAG,oBAAoB,CAAC,MAAM,CAAC,gBAAgB,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC;IACjF,MAAM,MAAM,GAAG,CAAC,GAAG,WAAW,EAAE,GAAG,UAAU,CAAC,CAAC;IAC/C,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,iBAAiB,CAAC,CAAC;IACjE,MAAM,gBAAgB,GAAG,IAAA,uDAA+B,EAAC,MAAM,CAAC,CAAC;IACjE,OAAO;QACH,MAAM;QACN,KAAK,EAAE,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;QACtC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,WAAW;QACzC,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;KAClE,CAAC;AACN,CAAC;AAKD,wCAAwC;AACxC,SAAS,gBAAgB,CAAC,MAAqB,EAAE,KAAsC,EAAE,IAAiB;IACtG,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACV,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,IAAI;oBACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC9D,MAAM;YACV,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAC5B,IAAI,IAAI;oBACJ,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,MAAM;YACV,CAAC;YACD,KAAK,WAAW,CAAC,CAAC,CAAC;gBACf,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE;oBACrB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,SAAS;oBAC7C,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS;oBACzC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;iBACjC,CAAC,CAAC;gBACH,MAAM;YACV,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACjB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;gBACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,oBAAoB;oBAC1B,WAAW,EAAE,MAAM;oBACnB,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC;oBAC1C,MAAM,EAAE,WAAW;iBACtB,CAAC,CAAC;gBACH,MAAM;YACV,CAAC;YACD,KAAK,YAAY,CAAC,CAAC,CAAC;gBAChB,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,SAAS,CAAC;gBACjD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBAC1B,MAAM,CAAC,IAAI,CAAC;oBACR,IAAI,EAAE,oBAAoB;oBAC1B,WAAW,EAAE,MAAM;oBACnB,IAAI,EAAE,MAAM;oBACZ,MAAM,EAAE,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE;oBACxF,MAAM,EAAE,QAAQ;iBACnB,CAAC,CAAC;gBACH,MAAM;YACV,CAAC;YACD,KAAK,uBAAuB,CAAC,CAAC,CAAC;gBAC3B,yDAAyD;gBACzD,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC3B,IAAI,IAAI,EAAE,CAAC;oBACP,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE;wBACrB,UAAU,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,SAAS;wBAC7C,QAAQ,EAAE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,SAAS;wBACzC,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI;qBACjC,CAAC,CAAC;gBACP,CAAC;gBACD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;oBACzB,MAAM,CAAC,gBAAgB;gBAC3B,MAAM,OAAO,GAAiB;oBAC1B,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;oBACxB,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS;oBAC7C,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;oBACzD,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;iBAC/C,CAAC;gBACF,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,OAAO,EAAE,CAAC,CAAC;gBAClD,MAAM;YACV,CAAC;YACD;gBACI,MAAM,CAAC,qCAAqC;QACpD,CAAC;IACL,CAAC;AACL,CAAC;AACD,mFAAmF;AACnF,SAAS,cAAc,CAAC,MAAqB,EAAE,IAAmB,EAAE,IAAiB;IACjF,IAAI,IAAI,CAAC,aAAa;QAClB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,CAAC,aAAa,EAAE,CAAC,CAAC;IAChE,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,SAAS,IAAI,EAAE,EAAE,CAAC;QACtC,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;IACvH,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,WAAW,IAAI,EAAE,EAAE,CAAC;QACvC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC;YACR,IAAI,EAAE,oBAAoB;YAC1B,WAAW,EAAE,GAAG,CAAC,UAAU;YAC3B,IAAI,EAAE,MAAM;YACZ,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC;YACxC,MAAM,EAAE,WAAW;SACtB,CAAC,CAAC;IACP,CAAC;IACD,IAAI,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE;QACjB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AAC7E,CAAC;AACD,sFAAsF;AACtF,SAAS,UAAU,CAAC,MAAqB,EAAE,IAAiB,EAAE,IAI7D;IACG,IAAI,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;QAChC,OAAO;IACX,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACjC,MAAM,CAAC,IAAI,CAAC;QACR,IAAI,EAAE,mBAAmB;QACzB,WAAW,EAAE,IAAI,CAAC,UAAU;QAC5B,SAAS,EAAE;YACP,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,QAAQ;YACnB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC;YACzB,IAAI,EAAE,iBAAiB,CAAC,IAAI,CAAC,QAAQ,CAAC;SACzC;KACJ,CAAC,CAAC;AACP,CAAC;AACD;;;;GAIG;AACH,SAAS,oBAAoB,CAAC,QAAyD,EAAE,QAA6B;IAClH,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,KAAK,MAAM,GAAG,IAAI,QAAQ,IAAI,EAAE,EAAE,CAAC;QAC/B,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;YAClD,SAAS;QACb,KAAK,MAAM,IAAI,IAAI,GAAG,CAAC,OAAiC,EAAE,CAAC;YACvD,IAAI,IAAI,CAAC,IAAI,KAAK,aAAa;gBAC3B,SAAS;YACb,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YACpC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC;gBAC/B,SAAS;YACb,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;QACrH,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC;AAClB,CAAC;AACD,SAAS,gBAAgB,CAAC,MAAe;IAIrC,IAAI,MAAM,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QACjE,MAAM,OAAO,GAAG,MAIf,CAAC;QACF,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACnB,KAAK,MAAM,CAAC;YACZ,KAAK,MAAM,CAAC;YACZ,KAAK,SAAS;gBACV,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;YAClE,KAAK,kBAAkB;gBACnB,OAAO;oBACH,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAE,EAAE,CAAC,CAAC,CAAC,SAAS;oBAC1E,MAAM,EAAE,UAAU;iBACrB,CAAC;YACN,KAAK,YAAY,CAAC;YAClB,KAAK,YAAY;gBACb,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;YAC1E;gBACI,MAAM;QACd,CAAC;IACL,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC;AAC3D,CAAC;AACD,2EAA2E;AAC3E,SAAS,SAAS,CAAC,MAAuB,EAAE,SAAiB;IACzD,MAAM,CAAC,GAAG,MAAM,CAAC,UAAU,IAAI,MAAM,CAAC,KAAK,CAAC;IAC5C,IAAI,CAAC,CAAC;QACF,OAAO,SAAS,CAAC;IACrB,MAAM,QAAQ,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACzE,IAAI,QAAQ,KAAK,CAAC,IAAI,YAAY,KAAK,CAAC;QACpC,OAAO,SAAS,CAAC;IACrB,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC7F,MAAM,aAAa,GAAG,GAAG,CAAC,CAAC,CAAC,iBAAiB,EAAE,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACtE,gDAAgD;IAChD,6CAA6C;IAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,SAAS,GAAG,aAAa,CAAC,CAAC;IACtE,MAAM,KAAK,GAAU,EAAE,WAAW,EAAE,YAAY,EAAE,QAAQ,EAAE,IAAI,CAAC,GAAG,CAAC,SAAS,EAAE,CAAC,CAAC,EAAE,CAAC;IACrF,IAAI,SAAS;QACT,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;IACtC,IAAI,aAAa;QACb,KAAK,CAAC,mBAAmB,GAAG,aAAa,CAAC;IAC9C,MAAM,SAAS,GAAG,GAAG,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACzC,IAAI,SAAS;QACT,KAAK,CAAC,eAAe,GAAG,SAAS,CAAC;IACtC,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,4EAA4E;AAC5E,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAA,iCAAe,EAAC,IAAI,CAAC,CAAC;AACjC,CAAC;AACD,sDAAsD;AACtD,SAAS,MAAM,CAAC,KAAc;IAC1B,OAAO,IAAA,kCAAkB,EAAC,KAAK,CAAC,CAAC;AACrC,CAAC;AACD,SAAS,GAAG,CAAC,KAAc;IACvB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AAClE,CAAC;AACD,SAAS,GAAG,CAAC,KAAc;IACvB,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC;AACnF,CAAC;AAsED;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,SAAgB,UAAU,CAAqD,OAA0C;IAMrH,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAwB,CAAC;IACjD,OAAO,IAAA,2BAAe,EAAC;QACnB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,QAAQ;QAC9B,4EAA4E;QAC5E,gBAAgB,EAAE,sCAAwB;QAC1C,2DAA2D;QAC3D,uDAAuD;QACvD,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS;QACzC,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,eAAM,CAAC,UAAU,CAAC;YACpC,GAAG,EAAE,KAAK,IAAI,EAAE;gBACZ,2DAA2D;gBAC3D,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,IAAI,UAAU,IAAA,wBAAU,GAAE,EAAE,CAAC;gBACtD,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;gBACxB,IAAI,KAAK,GAAG,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACT,KAAK,GAAG,EAAE,QAAQ,EAAE,EAAE,EAAE,gBAAgB,EAAE,EAAE,EAAE,CAAC;oBAC/C,QAAQ,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;gBAC5B,CAAC;gBACD,IAAI,KAAK,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACpC,0DAA0D;oBAC1D,iDAAiD;oBACjD,MAAM,OAAO,GAAG,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;wBACxD,IAAI,EAAE,wBAAiC;wBACvC,UAAU;wBACV,QAAQ,EAAE,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC;qBAC1D,CAAC,CAAC,CAAC;oBACJ,KAAK,CAAC,gBAAgB,GAAG,EAAE,CAAC;oBAC5B,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAO,CAAC,CAAC;gBACxD,CAAC;qBACI,CAAC;oBACF,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,KAAK,CAAM,CAAC,CAAC;gBACnE,CAAC;gBACD,+DAA+D;gBAC/D,kCAAkC;gBAClC,MAAM,IAAI,GAAG,GAAG,CAAC,SAAS,IAAI,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,oBAAoB,CAAC,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBACzH,IAAI,MAAuB,CAAC;gBAC5B,IAAI,CAAC;oBACD,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC;wBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;wBACxB,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,eAAe,EAAE,GAAG,CAAC,eAAe;wBACpC,MAAM,EAAE,GAAG,CAAC,MAAM;wBAClB,KAAK,EAAE,GAAG,CAAC,KAAK;wBAChB,SAAS,EAAE,IAAI,EAAE,QAAQ;qBAC5B,CAAC,CAAC;gBACP,CAAC;gBACD,OAAO,KAAK,EAAE,CAAC;oBACX,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;oBACvE,MAAM,IAAA,kCAAe,EAAC,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,IAAA,0CAAsB,EAAC,KAAK,CAAC,EAAE,CAAC,CAAC;gBACpG,CAAC;wBACO,CAAC;oBACL,iDAAiD;oBACjD,MAAM,IAAI,EAAE,KAAK,EAAE,CAAC;gBACxB,CAAC;gBACD,gDAAgD;gBAChD,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAI,CAAC,MAAM,CAAC,gBAAgB,IAAI,EAAE,CAAS,CAAC,CAAC;gBACjE,KAAK,CAAC,gBAAgB,GAAG,uBAAuB,CAAC,MAAM,CAAC,CAAC;gBACzD,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,CAAC,CAAC;gBACnC,uCAAuC;gBACvC,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;oBAC3B,MAAM,IAAA,kCAAe,EAAC;wBAClB,UAAU,EAAE,SAAS;wBACrB,OAAO,EAAE,0DAA0D;qBACtE,CAAC,CAAC;gBACP,CAAC;gBACD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,EAAE,CAAC;YAC3D,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC;KACL,CAAC,CAAC;AACP,CAAC;AACD,sEAAsE;AACtE,SAAS,UAAU,CAAC,IAAY;IAC5B,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC9C,CAAC;AACD,qFAAqF;AACrF,SAAS,gBAAgB,CAAC,SAA+C,EAAE,SAAiB;IACxF,MAAM,OAAO,GAAG,SAAS,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC;IAClE,IAAI,CAAC,OAAO,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,qCAAqC,SAAS,kDAAkD,CAAC,CAAC;IACtH,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC;IAC1C,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;AAClD,CAAC;AACD,qEAAqE;AACrE,SAAS,uBAAuB,CAAC,MAAuB;IACpD,MAAM,KAAK,GAA2B,EAAE,CAAC;IACzC,IAAI,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,CAAC;QACvB,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK;YAC3B,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC3B,KAAK,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,CAAC;IACxC,CAAC;SACI,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC;QACrC,KAAK,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC;IAClC,CAAC;IACD,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,IAAI,IAAI,CAAC,IAAI,KAAK,uBAAuB,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI;YAClE,SAAS;QACb,MAAM,UAAU,GAAG,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,UAAU;YACV,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,GAAG,CAAC;AACf,CAAC;AACD;;;GAGG;AACH,SAAS,WAAW,CAAC,IAAY,EAAE,KAGpB;IACX,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAC5B,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3C,OAAO;QACH,IAAI,EAAE,MAAM;QACZ,OAAO,EAAE;YACL,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,IAAI,UAAU,EAAE;YAC1C,GAAG,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;SACrF;KACJ,CAAC;AACN,CAAC","sourcesContent":["import type { ExperimentFlags } from \"../shared/types.ts\";\n// AI SDK(Vercel `ai` 包)结果 → 标准事件流的共享转换器(采集通道 0:进程内直构)。\n//\n// 结构化 typing,不依赖 `ai` 包:niceeval 只认识 generateText / streamText 完整结果的\n// 【形状子集】。字段名跨 AI SDK 大版本漂移(v4 args/result/promptTokens、v5+ input/output/\n// inputTokens、v7 inputTokenDetails)在这里统一兜住,adapter 作者不必各自写防御代码,也不必\n// 像手工 recorder 那样包住每个工具的 execute —— AI SDK 的 steps 里本来就有带 toolCallId 的\n// 完整调用记录。\n//\n// v7 的 tool approval(工具带 `needsApproval`)也在这里兜:\n// · `tool-approval-request` part → `input.requested` 事件 + 整轮 `status: \"waiting\"`,\n// 直接满足 HITL 契约的「waiting + input.requested」两条义务(resume 仍归 adapter 管);\n// · 批准 / 拒绝后的 resume 结果里,执行结果只出现在 `responseMessages` 的 tool 消息中\n// (不在 steps 里),这里挖出来补成 `operation.finished` —— 拒绝(execution-denied)映射成\n// `status: \"rejected\"`,喂 `calledTool(..., { status: \"rejected\" })` 与 `noFailedActions()`。\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { Effect } from \"effect\";\nimport { makeDirectAgent } from \"../define.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport { normalizeJsonValue } from \"../shared/json-value.ts\";\nimport { normalizeToolName as normalizeShared } from \"../o11y/tool-names.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport type { Agent, InputRequest, InputResponse, JsonValue, StreamEvent, ToolName, Usage } from \"../types.ts\";\n// ───────────────────────── AI SDK 结果的形状子集 ─────────────────────────\n/** 一次工具调用(v5+ 用 `input`,v4 用 `args`;两者都认)。 */\nexport interface AiSdkToolCallLike {\n toolCallId: string;\n toolName: string;\n input?: unknown;\n args?: unknown;\n}\n/** 一次工具结果(v5+ 用 `output`,v4 用 `result`)。 */\nexport interface AiSdkToolResultLike {\n toolCallId: string;\n toolName?: string;\n output?: unknown;\n result?: unknown;\n}\n/**\n * step.content 的一个 part(v5+)。带类型序:同一 step 里 reasoning / text / tool-call /\n * tool-result / tool-error / tool-approval-request 按真实发生顺序排 —— 有它就优先用它,时序保真。\n */\nexport interface AiSdkContentPartLike {\n type: string;\n text?: unknown;\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n output?: unknown;\n result?: unknown;\n error?: unknown;\n /** v7 tool approval:`tool-approval-request` part 的请求 id 与被拦下的调用。 */\n approvalId?: unknown;\n isAutomatic?: unknown;\n toolCall?: {\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n };\n}\n/** 一个 step = 一次模型调用(工具循环里的一圈)。 */\nexport interface AiSdkStepLike {\n content?: readonly AiSdkContentPartLike[];\n text?: string;\n reasoningText?: string;\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n}\nexport interface AiSdkUsageLike {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n cachedInputTokens?: number;\n /** LanguageModelUsage(v5+)对推理模型(o-series 等)带回的思考 token,已计入 outputTokens。 */\n reasoningTokens?: number;\n /** v7:cache 细分挪进了 inputTokenDetails。 */\n inputTokenDetails?: {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n}\n/** result.responseMessages 的一条(只认 tool 消息里的 tool-result part,其余略过)。 */\nexport interface AiSdkResponseMessageLike {\n role?: unknown;\n content?: unknown;\n}\n/** generateText / streamText 完整结果的形状子集。没有 steps 的老结果退回顶层字段。 */\nexport interface AiSdkResultLike {\n text?: string;\n steps?: readonly AiSdkStepLike[];\n /** v7:跨全部 step 聚合的 content parts(approval 请求也在里面)。 */\n content?: readonly AiSdkContentPartLike[];\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n /** v5/v6 聚合全部 step 的用量;优先于 usage(v6 的 usage 只是最后一个 step,v7 起也是聚合)。 */\n totalUsage?: AiSdkUsageLike;\n usage?: AiSdkUsageLike;\n /**\n * 本次调用新产生的消息(v7)。tool approval 批准 / 拒绝后,被拦工具的执行结果只出现在\n * 这里的 tool 消息里(不进 steps),turnFromAiSdk 从中补齐 `operation.finished`。\n */\n responseMessages?: readonly AiSdkResponseMessageLike[];\n}\n/** turnFromAiSdk 的返回:铺进 `Turn` 即可(data 仍归调用方 —— 结构化输出是应用自己的语义)。 */\nexport interface AiSdkTurn {\n events: StreamEvent[];\n usage?: Usage;\n /** 有待人批准的工具调用(非 automatic 的 tool-approval-request)→ \"waiting\",否则 \"completed\"。 */\n status: \"completed\" | \"waiting\";\n /** 通用 AI SDK tool call 没有原生 command 分类时,随有工具调用的 Turn 降级 actions。 */\n evidenceCoverage?: {\n readonly actions: {\n readonly status: \"partial\";\n readonly reason: string;\n };\n };\n}\n// ───────────────────────── 转换 ─────────────────────────\n/**\n * AI SDK 结果 → `{ events, usage, status }`,直接铺进 `Turn` 返回:\n *\n * ```typescript\n * const result = await generateText({ model, tools, prompt: input.text });\n * return { ...turnFromAiSdk(result), data: result.text };\n * ```\n *\n * `callId` 用 AI SDK 原生的 `toolCallId`(显式配对,不合成);工具名保留原名进 `name`,\n * canonical 名进 `tool`(认不出的域内工具落 \"unknown\",`calledTool(\"get_weather\")`\n * 仍按原名匹配)。工具执行失败(v5+ 的 `tool-error` part)映射成 `status: \"failed\"` 的\n * `operation.finished`,喂 `noFailedActions()`。\n *\n * v7 tool approval:`needsApproval` 工具被拦下时返回 `status: \"waiting\"` + 每个待批准\n * 调用一条 `input.requested`(`id` = approvalId、`action` = 工具原名、`options` =\n * approve / deny)。resume(把 `tool-approval-response` 塞回 messages 再跑一次)后的结果\n * 再交给 turnFromAiSdk,会从 `responseMessages` 里补出执行 / 拒绝的 `operation.finished`。\n */\nexport function turnFromAiSdk(result: AiSdkResultLike): AiSdkTurn {\n const stepEvents: StreamEvent[] = [];\n const steps: readonly AiSdkStepLike[] = result.steps && result.steps.length > 0\n ? result.steps\n : [{ text: result.text, toolCalls: result.toolCalls, toolResults: result.toolResults }];\n const seen = { called: new Set<string>(), resolved: new Set<string>() };\n for (const step of steps) {\n if (Array.isArray(step.content) && step.content.length > 0) {\n pushContentParts(stepEvents, step.content, seen);\n }\n else {\n pushStepFields(stepEvents, step, seen);\n }\n }\n // approval resume 时被拦工具的执行结果只在 responseMessages 里;补出的 operation.finished\n // 排在本轮 step 事件之前 —— 时间上它确实先于模型看到结果后的新输出。\n const minedEvents = mineResponseMessages(result.responseMessages, seen.resolved);\n const events = [...minedEvents, ...stepEvents];\n const waiting = events.some((e) => e.type === \"input.requested\");\n const evidenceCoverage = unclassifiedToolActionsCoverage(events);\n return {\n events,\n usage: readUsage(result, steps.length),\n status: waiting ? \"waiting\" : \"completed\",\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n}\ninterface SeenCallIds {\n called: Set<string>;\n resolved: Set<string>;\n}\n/** v5+ 路径:content parts 自带真实顺序,逐个翻译。 */\nfunction pushContentParts(events: StreamEvent[], parts: readonly AiSdkContentPartLike[], seen: SeenCallIds): void {\n for (const part of parts) {\n switch (part.type) {\n case \"text\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n break;\n }\n case \"reasoning\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"thinking\", text });\n break;\n }\n case \"tool-call\": {\n pushCalled(events, seen, {\n toolCallId: str(part.toolCallId) ?? \"unknown\",\n toolName: str(part.toolName) ?? \"unknown\",\n input: part.input ?? part.args,\n });\n break;\n }\n case \"tool-result\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: asJson(part.output ?? part.result),\n status: \"completed\",\n });\n break;\n }\n case \"tool-error\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: { error: part.error instanceof Error ? part.error.message : String(part.error) },\n status: \"failed\",\n });\n break;\n }\n case \"tool-approval-request\": {\n // 同一 step 里通常已有配对的 tool-call part(去重);没有时从 toolCall 字段补。\n const call = part.toolCall;\n if (call) {\n pushCalled(events, seen, {\n toolCallId: str(call.toolCallId) ?? \"unknown\",\n toolName: str(call.toolName) ?? \"unknown\",\n input: call.input ?? call.args,\n });\n }\n if (part.isAutomatic === true)\n break; // SDK 自动裁决,不用等人\n const request: InputRequest = {\n id: str(part.approvalId),\n action: call ? str(call.toolName) : undefined,\n input: call ? asJson(call.input ?? call.args) : undefined,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n };\n events.push({ type: \"input.requested\", request });\n break;\n }\n default:\n break; // source / file 等其余 part 类型对断言无意义,丢弃\n }\n }\n}\n/** 退路(v4 / 无 content parts):toolCalls + toolResults + text,顺序按「调用 → 结果 → 文本」近似。 */\nfunction pushStepFields(events: StreamEvent[], step: AiSdkStepLike, seen: SeenCallIds): void {\n if (step.reasoningText)\n events.push({ type: \"thinking\", text: step.reasoningText });\n for (const call of step.toolCalls ?? []) {\n pushCalled(events, seen, { toolCallId: call.toolCallId, toolName: call.toolName, input: call.input ?? call.args });\n }\n for (const res of step.toolResults ?? []) {\n seen.resolved.add(res.toolCallId);\n events.push({\n type: \"operation.finished\",\n operationId: res.toolCallId,\n kind: \"tool\",\n output: asJson(res.output ?? res.result),\n status: \"completed\",\n });\n }\n if (step.text?.trim())\n events.push({ type: \"message\", role: \"assistant\", text: step.text });\n}\n/** 同一原生 tool call ID 只发一条 operation.started(tool-call part 与 approval-request 会重)。 */\nfunction pushCalled(events: StreamEvent[], seen: SeenCallIds, call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n}): void {\n if (seen.called.has(call.toolCallId))\n return;\n seen.called.add(call.toolCallId);\n events.push({\n type: \"operation.started\",\n operationId: call.toolCallId,\n operation: {\n kind: \"tool\",\n name: call.toolName,\n input: asJson(call.input),\n tool: normalizeToolName(call.toolName),\n },\n });\n}\n/**\n * 从 responseMessages 的 tool 消息里挖 steps 没有的 tool-result(v7 approval resume 的\n * 执行结果只在这里)。output 是 ToolResultOutput 包装({ type: \"json\" | \"text\" |\n * \"execution-denied\" | \"error-text\" | … }),按类型解包;`execution-denied` → \"rejected\"。\n */\nfunction mineResponseMessages(messages: readonly AiSdkResponseMessageLike[] | undefined, resolved: ReadonlySet<string>): StreamEvent[] {\n const events: StreamEvent[] = [];\n for (const msg of messages ?? []) {\n if (msg.role !== \"tool\" || !Array.isArray(msg.content))\n continue;\n for (const part of msg.content as AiSdkContentPartLike[]) {\n if (part.type !== \"tool-result\")\n continue;\n const callId = str(part.toolCallId);\n if (!callId || resolved.has(callId))\n continue;\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", ...unwrapToolOutput(part.output) });\n }\n }\n return events;\n}\nfunction unwrapToolOutput(output: unknown): {\n output?: JsonValue;\n status: \"completed\" | \"failed\" | \"rejected\";\n} {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const wrapped = output as {\n type?: unknown;\n value?: unknown;\n reason?: unknown;\n };\n switch (wrapped.type) {\n case \"json\":\n case \"text\":\n case \"content\":\n return { output: asJson(wrapped.value), status: \"completed\" };\n case \"execution-denied\":\n return {\n output: str(wrapped.reason) ? { reason: str(wrapped.reason)! } : undefined,\n status: \"rejected\",\n };\n case \"error-text\":\n case \"error-json\":\n return { output: { error: asJson(wrapped.value) }, status: \"failed\" };\n default:\n break;\n }\n }\n return { output: asJson(output), status: \"completed\" };\n}\n/** totalUsage(v5/v6 的全 steps 聚合)优先;v7 的 usage 本身就是聚合;requests = step 数。 */\nfunction readUsage(result: AiSdkResultLike, stepCount: number): Usage | undefined {\n const u = result.totalUsage ?? result.usage;\n if (!u)\n return undefined;\n const rawInput = num(u.inputTokens) ?? num(u.promptTokens) ?? 0;\n const outputTokens = num(u.outputTokens) ?? num(u.completionTokens) ?? 0;\n if (rawInput === 0 && outputTokens === 0)\n return undefined;\n const cacheRead = num(u.cachedInputTokens) ?? num(u.inputTokenDetails?.cacheReadTokens) ?? 0;\n const cacheCreation = num(u.inputTokenDetails?.cacheWriteTokens) ?? 0;\n // AI SDK 的 inputTokens 是含缓存明细的输入总量,落互斥桶前扣掉在场的明细\n // (docs/feature/adapters/sdk/ai-sdk/cost.md)\n const inputTokens = Math.max(0, rawInput - cacheRead - cacheCreation);\n const usage: Usage = { inputTokens, outputTokens, requests: Math.max(stepCount, 1) };\n if (cacheRead)\n usage.cacheReadTokens = cacheRead;\n if (cacheCreation)\n usage.cacheCreationTokens = cacheCreation;\n const reasoning = num(u.reasoningTokens);\n if (reasoning)\n usage.reasoningTokens = reasoning;\n return usage;\n}\n/** AI SDK 应用的工具多为域内自定义名(get_weather…),canonical 落 \"unknown\" 即可;仅认通用别名基表。 */\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name);\n}\n/** 工具入参 / 出参来自可替换的 AI SDK 版本;在边界立即清洗成领域 JsonValue。 */\nfunction asJson(value: unknown): JsonValue {\n return normalizeJsonValue(value);\n}\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\nfunction num(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n// ───────────────────────── 内建 agent 工厂 ─────────────────────────\n/**\n * `generate` 收到的上下文。`messages` 是本会话的完整 ModelMessage 历史(含本轮的用户消息 /\n * approval 裁决),直接透传给 generateText / streamText 即可;泛型 `M` 由调用方钉成自己\n * AI SDK 版本的 `ModelMessage`,niceeval 不引 `ai` 包。\n */\nexport interface AiSdkGenerateContext<M = JsonValue, Integration extends object = object> {\n readonly messages: M[];\n /** 实验钉的 model(ctx.model);省略 → 用应用自己的默认。 */\n readonly model?: string;\n /** 实验钉的推理努力程度(ctx.reasoningEffort);省略 → 用应用自己的默认。应用自己决定怎么塞进 providerOptions(如 OpenAI 的 reasoningEffort)。 */\n readonly reasoningEffort?: string;\n readonly signal: AbortSignal;\n readonly flags: ExperimentFlags;\n /**\n * 配了 `tracing`(如 `aiSdkOtel()`)才有:直接放进 generateText / streamText 的\n * `telemetry` 选项。OTel provider、per-attempt 端点绑定和轮末 flush 都由工厂做,\n * 应用侧原样透传即可。\n */\n readonly telemetry?: AiSdkTelemetrySettings<Integration>;\n}\n/**\n * generateText / streamText 的 `telemetry` 选项的形状子集。integrations 的元素是\n * `@ai-sdk/otel` 的集成实例。`Integration` 由 tracing 实现携带,niceeval 不引\n * 用户版本的 `ai` 包,也不在中间层抹成 `any`。\n */\nexport interface AiSdkTelemetrySettings<Integration extends object = object> {\n readonly integrations: readonly Integration[];\n}\n/** tracing 管线为某一轮建好的遥测件(`AiSdkTracing.telemetryForEndpoint` 的返回值)。 */\nexport interface AiSdkTurnTelemetry<Integration extends object = object> {\n /** 直接放进 generateText / streamText 的 `telemetry` 选项。 */\n settings: AiSdkTelemetrySettings<Integration>;\n /** 每轮结束后由工厂调用:轮次归属靠时间窗口,span 必须立刻送到,不能等 batch。 */\n flush(): Promise<void>;\n}\n/**\n * `aiSdkAgent` 的 tracing 管线契约。内置实现是 `niceeval/adapter/otel` 的 `aiSdkOtel()`——\n * 独立子路径导出,OTel 三件套是可选 peer 依赖,只有 import 那个入口的项目才需要安装;\n * 这里只放形状,`niceeval/adapter` 本身零 OTel 依赖。\n */\nexport interface AiSdkTracing<Integration extends object = object> {\n /** 为本轮的 OTLP 接收端点建(或复用)一条导出管线。每个 attempt 端点不同,按端点缓存。 */\n telemetryForEndpoint(endpoint: string): AiSdkTurnTelemetry<Integration>;\n}\nexport interface AiSdkAgentOptions<M = JsonValue, Integration extends object = object> {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ai-sdk\"。 */\n name?: string;\n /**\n * 开 OTel 管线(拿 `niceeval view` 的瀑布图):传 `niceeval/adapter/otel` 的\n * `aiSdkOtel()`。设了运行器就为这个 agent 开 per-attempt OTLP 接收器,工厂每轮用\n * 管线建好绑定接收端点的集成,经 `generate` 的 ctx.telemetry 交给应用,原样透传给\n * generateText / streamText 的 `telemetry` 选项即可。省略则整个 OTel 管线不开,\n * `generate` 拿到的 `telemetry` 恒为 undefined,应用侧零开销。\n *\n * ```typescript\n * import { aiSdkOtel } from \"niceeval/adapter/otel\";\n * aiSdkAgent({ tracing: aiSdkOtel(), generate });\n * ```\n */\n tracing?: AiSdkTracing<Integration>;\n /**\n * 每轮一召:拿会话历史跑一次 generateText / streamText(await 完整结果)并原样返回。\n * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。\n */\n generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;\n /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */\n data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;\n}\n/**\n * 内建的 AI SDK 进程内 agent 工厂:把「一个 generateText 调用」变成完整的 niceeval agent。\n * 应用只写 `generate`(怎么召模型),协议侧的活全部由工厂承担:\n *\n * · 多轮会话:ctx.session.id 未记录时开新会话线并 capture 回写,同一 id 续接同一份\n * messages 历史;\n * · 事件流:结果经 {@link turnFromAiSdk} 直构(toolCallId 配对、时序保真、usage);\n * · HITL:`needsApproval` 工具停轮 → `waiting` + `input.requested`;下一轮输入按行翻译成\n * tool-approval-response(以 approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝)塞回\n * messages 再召 `generate`,SDK 才会执行(或跳过)被拦的工具;\n * · 失败兜底:`generate` 抛错或结果完全为空 → `status: \"failed\"` + error 事件;\n * · tracing:传 `tracing: aiSdkOtel()`(来自 `niceeval/adapter/otel`)后,工厂替应用\n * 做完 OTel 管线——为每轮建好绑定 niceeval 接收端点的 `@ai-sdk/otel` 集成(经\n * ctx.telemetry 交给 generate,原样透传给 generateText 的 `telemetry` 即可)并在轮末\n * flush;`aiSdkOtel({ backendUrl })` 可选双发到你自己的观测后端。应用侧零埋点代码。\n *\n * ```typescript\n * import { aiSdkAgent } from \"niceeval/adapter\";\n * import { generateText, isStepCount, type ModelMessage } from \"ai\";\n *\n * export const assistant = aiSdkAgent<ModelMessage>({\n * name: \"my-assistant\",\n * generate: ({ messages, model, signal }) =>\n * generateText({ model: resolveModel(model), system: SYSTEM_PROMPT,\n * tools, stopWhen: isStepCount(5), messages, abortSignal: signal }),\n * data: (result) => ({ reply: result.text }),\n * });\n * ```\n */\nexport function aiSdkAgent<M = JsonValue, Integration extends object = object>(options: AiSdkAgentOptions<M, Integration>): Agent {\n interface SessionState {\n messages: M[];\n /** 上一轮停下的 tool approval:下一轮输入按行翻译成裁决。 */\n pendingApprovals: string[];\n }\n const sessions = new Map<string, SessionState>();\n return makeDirectAgent({\n name: options.name ?? \"ai-sdk\",\n // 官方 SDK 完整 steps/output:全通道 complete(见 adapters/architecture/evidence.md)。\n evidenceCoverage: completeEvidenceCoverage,\n // tracing 开了才让运行器为这个 agent 起 OTLP 接收器(ctx.telemetry 才会出现);\n // AgentTracing 的其余字段(env/configure/scope)这里都用不上,空对象即可。\n tracing: options.tracing ? {} : undefined,\n send: (input, ctx) => Effect.tryPromise({\n try: async () => {\n // 会话续接:ctx.session.id 未记录时开新会话并 capture 回写;否则按 id 续接同一份历史。\n const id = ctx.session.id ?? `ai-sdk-${randomUUID()}`;\n ctx.session.capture(id);\n let state = sessions.get(id);\n if (!state) {\n state = { messages: [], pendingApprovals: [] };\n sessions.set(id, state);\n }\n if (state.pendingApprovals.length > 0) {\n // HITL:t.respond 的回答到 adapter 就是一次普通的带 responses 的 send,按\n // requestId(= approvalId)对位取裁决;没答到的请求直接报错,不从文本猜。\n const content = state.pendingApprovals.map((approvalId) => ({\n type: \"tool-approval-response\" as const,\n approvalId,\n approved: approvalDecision(input.responses, approvalId),\n }));\n state.pendingApprovals = [];\n state.messages.push({ role: \"tool\", content } as M);\n }\n else {\n state.messages.push(userMessage(input.text, input.files) as M);\n }\n // tracing 管线由调用方显式传入(niceeval/adapter/otel 的 aiSdkOtel()),工厂只管\n // 每轮把 per-attempt 端点交给它、轮末 flush。\n const otel = ctx.telemetry && options.tracing ? options.tracing.telemetryForEndpoint(ctx.telemetry.endpoint) : undefined;\n let result: AiSdkResultLike;\n try {\n result = await options.generate({\n messages: state.messages,\n model: ctx.model,\n reasoningEffort: ctx.reasoningEffort,\n signal: ctx.signal,\n flags: ctx.flags,\n telemetry: otel?.settings,\n });\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw makeSendFailure({ acceptance: \"unknown\", message, cause: normalizeExternalCause(error) });\n }\n finally {\n // 轮次归属靠时间窗口:本轮 span 必须在 send 返回前送到接收器,不能等 batch。\n await otel?.flush();\n }\n // resume 的另一半义务:本次调用新产生的消息(含 approval 执行结果)进历史。\n state.messages.push(...((result.responseMessages ?? []) as M[]));\n state.pendingApprovals = collectPendingApprovals(result);\n const turn = turnFromAiSdk(result);\n // 上游偶尔退化返回完全空的结果;当正常回复会把故障伪装成通过,按失败处理。\n if (turn.events.length === 0) {\n throw makeSendFailure({\n acceptance: \"unknown\",\n message: \"AI SDK returned an empty result (no text, no tool calls)\",\n });\n }\n return { ...turn, data: options.data?.(result, turn) };\n },\n catch: (cause) => cause,\n }),\n });\n}\n/** 裁决词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝。 */\nfunction isApproved(line: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(line);\n}\n/** 按 requestId(= approvalId)从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text?.trim() ?? \"\");\n}\n/** 待人批准的 approval 请求 id(非 automatic)。steps 优先,退回 v7 顶层聚合 content。 */\nfunction collectPendingApprovals(result: AiSdkResultLike): string[] {\n const parts: AiSdkContentPartLike[] = [];\n if (result.steps?.length) {\n for (const step of result.steps)\n if (Array.isArray(step.content))\n parts.push(...step.content);\n }\n else if (Array.isArray(result.content)) {\n parts.push(...result.content);\n }\n const ids: string[] = [];\n for (const part of parts) {\n if (part.type !== \"tool-approval-request\" || part.isAutomatic === true)\n continue;\n const approvalId = str(part.approvalId);\n if (approvalId)\n ids.push(approvalId);\n }\n return ids;\n}\n/**\n * t.sendFile 带来的文件(base64)转成 AI SDK 的多模态用户消息;纯文本就是纯文本。\n * 用 `file` part(v7 推荐;`image` part 已废弃),mediaType 原样透传,图片之外的附件也能走。\n */\nfunction userMessage(text: string, files: readonly {\n mimeType: string;\n dataBase64: string;\n}[] | undefined): unknown {\n if (!files || files.length === 0)\n return { role: \"user\", content: text };\n return {\n role: \"user\",\n content: [\n { type: \"text\", text: text || \"请描述这个附件。\" },\n ...files.map((f) => ({ type: \"file\", mediaType: f.mimeType, data: f.dataBase64 })),\n ],\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ai-sdk.js","sourceRoot":"","sources":["ai-sdk.ts"],"names":[],"mappings":"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","sourcesContent":["import type { ExperimentFlags } from \"../shared/types.ts\";\n// AI SDK(Vercel `ai` 包)结果 → 标准事件流的共享转换器(采集通道 0:进程内直构)。\n//\n// 结构化 typing,不依赖 `ai` 包:niceeval 只认识 generateText / streamText 完整结果的\n// 【形状子集】。字段名跨 AI SDK 大版本漂移(v4 args/result/promptTokens、v5+ input/output/\n// inputTokens、v7 inputTokenDetails)在这里统一兜住,adapter 作者不必各自写防御代码,也不必\n// 像手工 recorder 那样包住每个工具的 execute —— AI SDK 的 steps 里本来就有带 toolCallId 的\n// 完整调用记录。\n//\n// v7 的 tool approval(工具带 `needsApproval`)也在这里兜:\n// · `tool-approval-request` part → `input.requested` 事件 + 整轮 `status: \"waiting\"`,\n// 直接满足 HITL 契约的「waiting + input.requested」两条义务(resume 仍归 adapter 管);\n// · 批准 / 拒绝后的 resume 结果里,执行结果只出现在 `responseMessages` 的 tool 消息中\n// (不在 steps 里),这里挖出来补成 `operation.finished` —— 拒绝(execution-denied)映射成\n// `status: \"rejected\"`,喂 `calledTool(..., { status: \"rejected\" })` 与 `noFailedActions()`。\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { randomUUID } from \"node:crypto\";\nimport { Effect } from \"effect\";\nimport { makeDirectAgent } from \"../define.ts\";\nimport { makeSendFailure } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause } from \"../shared/external-cause.ts\";\nimport { normalizeJsonValue } from \"../shared/json-value.ts\";\nimport { normalizeToolName as normalizeShared } from \"../o11y/tool-names.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport type { Agent, InputRequest, InputResponse, JsonValue, StreamEvent, ToolName, Usage } from \"../types.ts\";\n// ───────────────────────── AI SDK 结果的形状子集 ─────────────────────────\n/** 一次工具调用(v5+ 用 `input`,v4 用 `args`;两者都认)。 */\nexport interface AiSdkToolCallLike {\n toolCallId: string;\n toolName: string;\n input?: unknown;\n args?: unknown;\n}\n/** 一次工具结果(v5+ 用 `output`,v4 用 `result`)。 */\nexport interface AiSdkToolResultLike {\n toolCallId: string;\n toolName?: string;\n output?: unknown;\n result?: unknown;\n}\n/**\n * step.content 的一个 part(v5+)。带类型序:同一 step 里 reasoning / text / tool-call /\n * tool-result / tool-error / tool-approval-request 按真实发生顺序排 —— 有它就优先用它,时序保真。\n */\nexport interface AiSdkContentPartLike {\n type: string;\n text?: unknown;\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n output?: unknown;\n result?: unknown;\n error?: unknown;\n /** v7 tool approval:`tool-approval-request` part 的请求 id 与被拦下的调用。 */\n approvalId?: unknown;\n isAutomatic?: unknown;\n toolCall?: {\n toolCallId?: unknown;\n toolName?: unknown;\n input?: unknown;\n args?: unknown;\n };\n}\n/** 一个 step = 一次模型调用(工具循环里的一圈)。 */\nexport interface AiSdkStepLike {\n content?: readonly AiSdkContentPartLike[];\n text?: string;\n reasoningText?: string;\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n}\nexport interface AiSdkUsageLike {\n inputTokens?: number;\n outputTokens?: number;\n promptTokens?: number;\n completionTokens?: number;\n cachedInputTokens?: number;\n /** LanguageModelUsage(v5+)对推理模型(o-series 等)带回的思考 token,已计入 outputTokens。 */\n reasoningTokens?: number;\n /** v7:cache 细分挪进了 inputTokenDetails。 */\n inputTokenDetails?: {\n cacheReadTokens?: number;\n cacheWriteTokens?: number;\n };\n}\n/** result.responseMessages 的一条(只认 tool 消息里的 tool-result part,其余略过)。 */\nexport interface AiSdkResponseMessageLike {\n role?: unknown;\n content?: unknown;\n}\n/** generateText / streamText 完整结果的形状子集。没有 steps 的老结果退回顶层字段。 */\nexport interface AiSdkResultLike {\n text?: string;\n steps?: readonly AiSdkStepLike[];\n /** v7:跨全部 step 聚合的 content parts(approval 请求也在里面)。 */\n content?: readonly AiSdkContentPartLike[];\n toolCalls?: readonly AiSdkToolCallLike[];\n toolResults?: readonly AiSdkToolResultLike[];\n /** v5/v6 聚合全部 step 的用量;优先于 usage(v6 的 usage 只是最后一个 step,v7 起也是聚合)。 */\n totalUsage?: AiSdkUsageLike;\n usage?: AiSdkUsageLike;\n /**\n * 本次调用新产生的消息(v7)。tool approval 批准 / 拒绝后,被拦工具的执行结果只出现在\n * 这里的 tool 消息里(不进 steps),turnFromAiSdk 从中补齐 `operation.finished`。\n */\n responseMessages?: readonly AiSdkResponseMessageLike[];\n}\n/** turnFromAiSdk 的返回:铺进 `Turn` 即可(data 仍归调用方 —— 结构化输出是应用自己的语义)。 */\nexport interface AiSdkTurn {\n events: StreamEvent[];\n usage?: Usage;\n /** 有待人批准的工具调用(非 automatic 的 tool-approval-request)→ \"waiting\",否则 \"completed\"。 */\n status: \"completed\" | \"waiting\";\n /** 通用 AI SDK tool call 没有原生 command 分类时,随有工具调用的 Turn 降级 actions。 */\n evidenceCoverage?: {\n readonly actions: {\n readonly status: \"partial\";\n readonly reason: string;\n };\n };\n}\n// ───────────────────────── 转换 ─────────────────────────\n/**\n * AI SDK 结果 → `{ events, usage, status }`,直接铺进 `Turn` 返回:\n *\n * ```typescript\n * const result = await generateText({ model, tools, prompt: input.text });\n * return { ...turnFromAiSdk(result), data: result.text };\n * ```\n *\n * `callId` 用 AI SDK 原生的 `toolCallId`(显式配对,不合成);工具名保留原名进 `name`,\n * canonical 名进 `tool`(认不出的域内工具落 \"unknown\",`calledTool(\"get_weather\")`\n * 仍按原名匹配)。工具执行失败(v5+ 的 `tool-error` part)映射成 `status: \"failed\"` 的\n * `operation.finished`,喂 `noFailedActions()`。\n *\n * v7 tool approval:`needsApproval` 工具被拦下时返回 `status: \"waiting\"` + 每个待批准\n * 调用一条 `input.requested`(`id` = approvalId、`action` = 工具原名、`options` =\n * approve / deny)。resume(把 `tool-approval-response` 塞回 messages 再跑一次)后的结果\n * 再交给 turnFromAiSdk,会从 `responseMessages` 里补出执行 / 拒绝的 `operation.finished`。\n */\nexport function turnFromAiSdk(result: AiSdkResultLike): AiSdkTurn {\n const stepEvents: StreamEvent[] = [];\n const steps: readonly AiSdkStepLike[] = result.steps && result.steps.length > 0\n ? result.steps\n : [{ text: result.text, toolCalls: result.toolCalls, toolResults: result.toolResults }];\n const seen = { called: new Set<string>(), resolved: new Set<string>() };\n for (const step of steps) {\n if (Array.isArray(step.content) && step.content.length > 0) {\n pushContentParts(stepEvents, step.content, seen);\n }\n else {\n pushStepFields(stepEvents, step, seen);\n }\n }\n // approval resume 时被拦工具的执行结果只在 responseMessages 里;补出的 operation.finished\n // 排在本轮 step 事件之前 —— 时间上它确实先于模型看到结果后的新输出。\n const minedEvents = mineResponseMessages(result.responseMessages, seen.resolved);\n const events = [...minedEvents, ...stepEvents];\n const waiting = events.some((e) => e.type === \"input.requested\");\n const evidenceCoverage = unclassifiedToolActionsCoverage(events);\n return {\n events,\n usage: readUsage(result, steps.length),\n status: waiting ? \"waiting\" : \"completed\",\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n}\ninterface SeenCallIds {\n called: Set<string>;\n resolved: Set<string>;\n}\n/** v5+ 路径:content parts 自带真实顺序,逐个翻译。 */\nfunction pushContentParts(events: StreamEvent[], parts: readonly AiSdkContentPartLike[], seen: SeenCallIds): void {\n for (const part of parts) {\n switch (part.type) {\n case \"text\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n break;\n }\n case \"reasoning\": {\n const text = str(part.text);\n if (text)\n events.push({ type: \"thinking\", text });\n break;\n }\n case \"tool-call\": {\n pushCalled(events, seen, {\n toolCallId: str(part.toolCallId) ?? \"unknown\",\n toolName: str(part.toolName) ?? \"unknown\",\n input: part.input ?? part.args,\n });\n break;\n }\n case \"tool-result\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: asJson(part.output ?? part.result),\n status: \"completed\",\n });\n break;\n }\n case \"tool-error\": {\n const callId = str(part.toolCallId) ?? \"unknown\";\n seen.resolved.add(callId);\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: { error: part.error instanceof Error ? part.error.message : String(part.error) },\n status: \"failed\",\n });\n break;\n }\n case \"tool-approval-request\": {\n // 同一 step 里通常已有配对的 tool-call part(去重);没有时从 toolCall 字段补。\n const call = part.toolCall;\n if (call) {\n pushCalled(events, seen, {\n toolCallId: str(call.toolCallId) ?? \"unknown\",\n toolName: str(call.toolName) ?? \"unknown\",\n input: call.input ?? call.args,\n });\n }\n if (part.isAutomatic === true)\n break; // SDK 自动裁决,不用等人\n const request: InputRequest = {\n id: str(part.approvalId),\n action: call ? str(call.toolName) : undefined,\n input: call ? asJson(call.input ?? call.args) : undefined,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n };\n events.push({ type: \"input.requested\", request });\n break;\n }\n default:\n break; // source / file 等其余 part 类型对断言无意义,丢弃\n }\n }\n}\n/** 退路(v4 / 无 content parts):toolCalls + toolResults + text,顺序按「调用 → 结果 → 文本」近似。 */\nfunction pushStepFields(events: StreamEvent[], step: AiSdkStepLike, seen: SeenCallIds): void {\n if (step.reasoningText)\n events.push({ type: \"thinking\", text: step.reasoningText });\n for (const call of step.toolCalls ?? []) {\n pushCalled(events, seen, { toolCallId: call.toolCallId, toolName: call.toolName, input: call.input ?? call.args });\n }\n for (const res of step.toolResults ?? []) {\n seen.resolved.add(res.toolCallId);\n events.push({\n type: \"operation.finished\",\n operationId: res.toolCallId,\n kind: \"tool\",\n output: asJson(res.output ?? res.result),\n status: \"completed\",\n });\n }\n if (step.text?.trim())\n events.push({ type: \"message\", role: \"assistant\", text: step.text });\n}\n/** 同一原生 tool call ID 只发一条 operation.started(tool-call part 与 approval-request 会重)。 */\nfunction pushCalled(events: StreamEvent[], seen: SeenCallIds, call: {\n toolCallId: string;\n toolName: string;\n input: unknown;\n}): void {\n if (seen.called.has(call.toolCallId))\n return;\n seen.called.add(call.toolCallId);\n events.push({\n type: \"operation.started\",\n operationId: call.toolCallId,\n operation: {\n kind: \"tool\",\n name: call.toolName,\n input: asJson(call.input),\n tool: normalizeToolName(call.toolName),\n },\n });\n}\n/**\n * 从 responseMessages 的 tool 消息里挖 steps 没有的 tool-result(v7 approval resume 的\n * 执行结果只在这里)。output 是 ToolResultOutput 包装({ type: \"json\" | \"text\" |\n * \"execution-denied\" | \"error-text\" | … }),按类型解包;`execution-denied` → \"rejected\"。\n */\nfunction mineResponseMessages(messages: readonly AiSdkResponseMessageLike[] | undefined, resolved: ReadonlySet<string>): StreamEvent[] {\n const events: StreamEvent[] = [];\n for (const msg of messages ?? []) {\n if (msg.role !== \"tool\" || !Array.isArray(msg.content))\n continue;\n for (const part of msg.content as AiSdkContentPartLike[]) {\n if (part.type !== \"tool-result\")\n continue;\n const callId = str(part.toolCallId);\n if (!callId || resolved.has(callId))\n continue;\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", ...unwrapToolOutput(part.output) });\n }\n }\n return events;\n}\nfunction unwrapToolOutput(output: unknown): {\n output?: JsonValue;\n status: \"completed\" | \"failed\" | \"rejected\";\n} {\n if (output && typeof output === \"object\" && !Array.isArray(output)) {\n const wrapped = output as {\n type?: unknown;\n value?: unknown;\n reason?: unknown;\n };\n switch (wrapped.type) {\n case \"json\":\n case \"text\":\n case \"content\":\n return { output: asJson(wrapped.value), status: \"completed\" };\n case \"execution-denied\":\n return {\n output: str(wrapped.reason) ? { reason: str(wrapped.reason)! } : undefined,\n status: \"rejected\",\n };\n case \"error-text\":\n case \"error-json\":\n return { output: { error: asJson(wrapped.value) }, status: \"failed\" };\n default:\n break;\n }\n }\n return { output: asJson(output), status: \"completed\" };\n}\n/** totalUsage(v5/v6 的全 steps 聚合)优先;v7 的 usage 本身就是聚合;requests = step 数。 */\nfunction readUsage(result: AiSdkResultLike, stepCount: number): Usage | undefined {\n const u = result.totalUsage ?? result.usage;\n if (!u)\n return undefined;\n const rawInput = num(u.inputTokens) ?? num(u.promptTokens) ?? 0;\n const outputTokens = num(u.outputTokens) ?? num(u.completionTokens) ?? 0;\n if (rawInput === 0 && outputTokens === 0)\n return undefined;\n const cacheRead = num(u.cachedInputTokens) ?? num(u.inputTokenDetails?.cacheReadTokens) ?? 0;\n const cacheCreation = num(u.inputTokenDetails?.cacheWriteTokens) ?? 0;\n // AI SDK 的 inputTokens 是含缓存明细的输入总量,落互斥桶前扣掉在场的明细\n // (docs/feature/adapters/sdk/ai-sdk/cost.md)\n const inputTokens = Math.max(0, rawInput - cacheRead - cacheCreation);\n const usage: Usage = { inputTokens, outputTokens, requests: Math.max(stepCount, 1) };\n if (cacheRead)\n usage.cacheReadTokens = cacheRead;\n if (cacheCreation)\n usage.cacheCreationTokens = cacheCreation;\n const reasoning = num(u.reasoningTokens);\n if (reasoning)\n usage.reasoningTokens = reasoning;\n return usage;\n}\n/** AI SDK 应用的工具多为域内自定义名(get_weather…),canonical 落 \"unknown\" 即可;仅认通用别名基表。 */\nfunction normalizeToolName(name: string): ToolName {\n return normalizeShared(name);\n}\n/** 工具入参 / 出参来自可替换的 AI SDK 版本;在边界立即清洗成领域 JsonValue。 */\nfunction asJson(value: unknown): JsonValue {\n return normalizeJsonValue(value);\n}\nfunction str(value: unknown): string | undefined {\n return typeof value === \"string\" && value ? value : undefined;\n}\nfunction num(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n// ───────────────────────── 内建 agent 工厂 ─────────────────────────\n/**\n * `generate` 收到的上下文。`messages` 是本会话的完整 ModelMessage 历史(含本轮的用户消息 /\n * approval 裁决),直接透传给 generateText / streamText 即可;泛型 `M` 由调用方钉成自己\n * AI SDK 版本的 `ModelMessage`,niceeval 不引 `ai` 包。\n */\nexport interface AiSdkGenerateContext<M = JsonValue, Integration extends object = object> {\n readonly messages: M[];\n /** 实验钉的 model(ctx.model);省略 → 用应用自己的默认。 */\n readonly model?: string;\n /** 实验钉的推理努力程度(ctx.reasoningEffort);省略 → 用应用自己的默认。应用自己决定怎么塞进 providerOptions(如 OpenAI 的 reasoningEffort)。 */\n readonly reasoningEffort?: string;\n readonly signal: AbortSignal;\n readonly flags: ExperimentFlags;\n /**\n * 配了 `tracing`(如 `aiSdkOtel()`)才有:直接放进 generateText / streamText 的\n * `telemetry` 选项。OTel provider、per-attempt 端点绑定和轮末 flush 都由工厂做,\n * 应用侧原样透传即可。\n */\n readonly telemetry?: AiSdkTelemetrySettings<Integration>;\n}\n/**\n * generateText / streamText 的 `telemetry` 选项的形状子集。integrations 的元素是\n * `@ai-sdk/otel` 的集成实例。`Integration` 由 tracing 实现携带,niceeval 不引\n * 用户版本的 `ai` 包,也不在中间层抹成 `any`。\n */\nexport interface AiSdkTelemetrySettings<Integration extends object = object> {\n readonly integrations: readonly Integration[];\n}\n/** tracing 管线为某一轮建好的遥测件(`AiSdkTracing.telemetryForEndpoint` 的返回值)。 */\nexport interface AiSdkTurnTelemetry<Integration extends object = object> {\n /** 直接放进 generateText / streamText 的 `telemetry` 选项。 */\n settings: AiSdkTelemetrySettings<Integration>;\n /** 每轮结束后由工厂调用:轮次归属靠时间窗口,span 必须立刻送到,不能等 batch。 */\n flush(): Promise<void>;\n}\n/**\n * `aiSdkAgent` 的 tracing 管线契约。内置实现是 `niceeval/adapter/otel` 的 `aiSdkOtel()`——\n * 独立子路径导出,OTel 三件套是可选 peer 依赖,只有 import 那个入口的项目才需要安装;\n * 这里只放形状,`niceeval/adapter` 本身零 OTel 依赖。\n */\nexport interface AiSdkTracing<Integration extends object = object> {\n /** 为本轮的 OTLP 接收端点建(或复用)一条导出管线。每个 attempt 端点不同,按端点缓存。 */\n telemetryForEndpoint(endpoint: string): AiSdkTurnTelemetry<Integration>;\n}\nexport interface AiSdkAgentOptions<M = JsonValue, Integration extends object = object> {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ai-sdk\"。 */\n name?: string;\n /**\n * 开 OTel 管线(拿 `niceeval view` 的瀑布图):传 `niceeval/adapter/otel` 的\n * `aiSdkOtel()`。设了运行器就为这个 agent 开 per-attempt OTLP 接收器,工厂每轮用\n * 管线建好绑定接收端点的集成,经 `generate` 的 ctx.telemetry 交给应用,原样透传给\n * generateText / streamText 的 `telemetry` 选项即可。省略则整个 OTel 管线不开,\n * `generate` 拿到的 `telemetry` 恒为 undefined,应用侧零开销。\n *\n * ```typescript\n * import { aiSdkOtel } from \"niceeval/adapter/otel\";\n * aiSdkAgent({ tracing: aiSdkOtel(), generate });\n * ```\n */\n tracing?: AiSdkTracing<Integration>;\n /**\n * 每轮一召:拿会话历史跑一次 generateText / streamText(await 完整结果)并原样返回。\n * model / tools / system prompt / stopWhen 都在这里配 —— 那是应用的事,工厂不掺和。\n */\n generate(ctx: AiSdkGenerateContext<M, Integration>): Promise<AiSdkResultLike>;\n /** 本轮的结构化输出(Turn.data,供 `t.check(turn.data, match)` 使用)。省略则 data 为 undefined。 */\n data?(result: AiSdkResultLike, turn: AiSdkTurn): JsonValue;\n}\n/**\n * 内建的 AI SDK 进程内 agent 工厂:把「一个 generateText 调用」变成完整的 niceeval agent。\n * 应用只写 `generate`(怎么召模型),协议侧的活全部由工厂承担:\n *\n * · 多轮会话:ctx.session.id 未记录时开新会话线并 capture 回写,同一 id 续接同一份\n * messages 历史;\n * · 事件流:结果经 {@link turnFromAiSdk} 直构(toolCallId 配对、时序保真、usage);\n * · HITL:`needsApproval` 工具停轮 → `waiting` + `input.requested`;下一轮输入按行翻译成\n * tool-approval-response(以 approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝)塞回\n * messages 再召 `generate`,SDK 才会执行(或跳过)被拦的工具;\n * · 失败兜底:`generate` 抛错或结果完全为空 → `status: \"failed\"` + error 事件;\n * · tracing:传 `tracing: aiSdkOtel()`(来自 `niceeval/adapter/otel`)后,工厂替应用\n * 做完 OTel 管线——为每轮建好绑定 niceeval 接收端点的 `@ai-sdk/otel` 集成(经\n * ctx.telemetry 交给 generate,原样透传给 generateText 的 `telemetry` 即可)并在轮末\n * flush;`aiSdkOtel({ backendUrl })` 可选双发到你自己的观测后端。应用侧零埋点代码。\n *\n * ```typescript\n * import { aiSdkAgent } from \"niceeval/adapter\";\n * import { generateText, isStepCount, type ModelMessage } from \"ai\";\n *\n * export const assistant = aiSdkAgent<ModelMessage>({\n * name: \"my-assistant\",\n * generate: ({ messages, model, signal }) =>\n * generateText({ model: resolveModel(model), system: SYSTEM_PROMPT,\n * tools, stopWhen: isStepCount(5), messages, abortSignal: signal }),\n * data: (result) => ({ reply: result.text }),\n * });\n * ```\n */\n// @concord-code ne-adapter-ai-sdk-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/ai-sdk/README.md\nexport function aiSdkAgent<M = JsonValue, Integration extends object = object>(options: AiSdkAgentOptions<M, Integration>): Agent {\n interface SessionState {\n messages: M[];\n /** 上一轮停下的 tool approval:下一轮输入按行翻译成裁决。 */\n pendingApprovals: string[];\n }\n const sessions = new Map<string, SessionState>();\n return makeDirectAgent({\n name: options.name ?? \"ai-sdk\",\n // 官方 SDK 完整 steps/output:全通道 complete(见 adapters/architecture/evidence.md)。\n evidenceCoverage: completeEvidenceCoverage,\n // tracing 开了才让运行器为这个 agent 起 OTLP 接收器(ctx.telemetry 才会出现);\n // AgentTracing 的其余字段(env/configure/scope)这里都用不上,空对象即可。\n tracing: options.tracing ? {} : undefined,\n send: (input, ctx) => Effect.tryPromise({\n try: async () => {\n // 会话续接:ctx.session.id 未记录时开新会话并 capture 回写;否则按 id 续接同一份历史。\n const id = ctx.session.id ?? `ai-sdk-${randomUUID()}`;\n ctx.session.capture(id);\n let state = sessions.get(id);\n if (!state) {\n state = { messages: [], pendingApprovals: [] };\n sessions.set(id, state);\n }\n if (state.pendingApprovals.length > 0) {\n // HITL:t.respond 的回答到 adapter 就是一次普通的带 responses 的 send,按\n // requestId(= approvalId)对位取裁决;没答到的请求直接报错,不从文本猜。\n const content = state.pendingApprovals.map((approvalId) => ({\n type: \"tool-approval-response\" as const,\n approvalId,\n approved: approvalDecision(input.responses, approvalId),\n }));\n state.pendingApprovals = [];\n state.messages.push({ role: \"tool\", content } as M);\n }\n else {\n state.messages.push(userMessage(input.text, input.files) as M);\n }\n // tracing 管线由调用方显式传入(niceeval/adapter/otel 的 aiSdkOtel()),工厂只管\n // 每轮把 per-attempt 端点交给它、轮末 flush。\n const otel = ctx.telemetry && options.tracing ? options.tracing.telemetryForEndpoint(ctx.telemetry.endpoint) : undefined;\n let result: AiSdkResultLike;\n try {\n result = await options.generate({\n messages: state.messages,\n model: ctx.model,\n reasoningEffort: ctx.reasoningEffort,\n signal: ctx.signal,\n flags: ctx.flags,\n telemetry: otel?.settings,\n });\n }\n catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n throw makeSendFailure({ acceptance: \"unknown\", message, cause: normalizeExternalCause(error) });\n }\n finally {\n // 轮次归属靠时间窗口:本轮 span 必须在 send 返回前送到接收器,不能等 batch。\n await otel?.flush();\n }\n // resume 的另一半义务:本次调用新产生的消息(含 approval 执行结果)进历史。\n state.messages.push(...((result.responseMessages ?? []) as M[]));\n state.pendingApprovals = collectPendingApprovals(result);\n const turn = turnFromAiSdk(result);\n // 上游偶尔退化返回完全空的结果;当正常回复会把故障伪装成通过,按失败处理。\n if (turn.events.length === 0) {\n throw makeSendFailure({\n acceptance: \"unknown\",\n message: \"AI SDK returned an empty result (no text, no tool calls)\",\n });\n }\n return { ...turn, data: options.data?.(result, turn) };\n },\n catch: (cause) => cause,\n }),\n });\n}\n/** 裁决词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准,其余一律拒绝。 */\nfunction isApproved(line: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(line);\n}\n/** 按 requestId(= approvalId)从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text?.trim() ?? \"\");\n}\n/** 待人批准的 approval 请求 id(非 automatic)。steps 优先,退回 v7 顶层聚合 content。 */\nfunction collectPendingApprovals(result: AiSdkResultLike): string[] {\n const parts: AiSdkContentPartLike[] = [];\n if (result.steps?.length) {\n for (const step of result.steps)\n if (Array.isArray(step.content))\n parts.push(...step.content);\n }\n else if (Array.isArray(result.content)) {\n parts.push(...result.content);\n }\n const ids: string[] = [];\n for (const part of parts) {\n if (part.type !== \"tool-approval-request\" || part.isAutomatic === true)\n continue;\n const approvalId = str(part.approvalId);\n if (approvalId)\n ids.push(approvalId);\n }\n return ids;\n}\n/**\n * t.sendFile 带来的文件(base64)转成 AI SDK 的多模态用户消息;纯文本就是纯文本。\n * 用 `file` part(v7 推荐;`image` part 已废弃),mediaType 原样透传,图片之外的附件也能走。\n */\nfunction userMessage(text: string, files: readonly {\n mimeType: string;\n dataBase64: string;\n}[] | undefined): unknown {\n if (!files || files.length === 0)\n return { role: \"user\", content: text };\n return {\n role: \"user\",\n content: [\n { type: \"text\", text: text || \"请描述这个附件。\" },\n ...files.map((f) => ({ type: \"file\", mediaType: f.mimeType, data: f.dataBase64 })),\n ],\n };\n}\n"]}
|
package/dist/agents/bub.cjs
CHANGED
|
@@ -50,6 +50,9 @@ function tapePath(workspace, sessionId, bubHome) {
|
|
|
50
50
|
const s = (0, node_crypto_1.createHash)("md5").update(sessionId).digest("hex").slice(0, 16);
|
|
51
51
|
return `${bubHome}/tapes/${w}__${s}.jsonl`;
|
|
52
52
|
}
|
|
53
|
+
// @concord-code ne-adapter-bub-agent
|
|
54
|
+
// @concord-implements docs/feature/adapters/README.md
|
|
55
|
+
// @concord-implements docs/feature/adapters/sdk/bub/README.md
|
|
53
56
|
function bubAgent(config) {
|
|
54
57
|
const getApiKey = () => config?.apiKey ?? (0, util_ts_1.requireEnv)("BUB_API_KEY");
|
|
55
58
|
const getApiBase = () => config?.apiBase ?? (0, util_ts_1.requireEnv)("BUB_API_BASE");
|
package/dist/agents/bub.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { requireEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapBubSpans } from \"../o11y/otlp/mappers/bub.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport type { Agent, AgentSetupManifest, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { BUB_INSTALL_MARKER, DEFAULT_BUB_DEPENDENCY_OVERRIDES, DEFAULT_BUB_OTEL_PLUGIN, DEFAULT_BUB_REQUIREMENT, bubInstallHash, bubRequirement, normalizeBubPackages, } from \"./bub-install-spec.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// bub 的 agent adapter(沙箱型)。\n//\n// ⚠️ 现实校正:bub 是 PyPI 上的 `bub`(alpha,Python 3.12),不是 npm 包。\n// · 安装:uv tool install bub(uv 自带 python 3.12,免 root)。\n// · 调用:bub run \"<prompt>\" --session-id <id> --workspace <path>\n// · 模型 + 代理:BUB_MODEL=openai:<model>、BUB_API_BASE、BUB_API_KEY。\n// · 记忆:tape(总是开),落盘在 ~/.bub/tapes/<md5(ws)[:16]>__<md5(sess)[:16]>.jsonl。\n// ───────────────────────────────────────────────────────────────────────────\n/**\n * Bub 的扩展单元 —— **只属于 Bub**:Bub 的插件是运行环境里的 Python Package,\n * 与 Claude Code / Codex 的 native plugin 没有共同的安装协议,不共用类型。\n */\nexport interface PythonPluginSpec {\n /** PyPI Package、Version Specifier 或 Git URL(如 `bub-plugin-memory==1.3.0`、`git+https://…@8f3c1a2`)。 */\n package: string;\n}\nexport interface BubConfig {\n /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */\n apiBase?: string;\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md(bub 没有原生 Skill 加载机制)。\n */\n skills?: SkillSpec[];\n /**\n * 装哪一版 Bub(PyPI 版本号,如 `\"0.4.0\"`)。省略时用 NiceEval 钉的默认版本;\n * 永远是确定版本,不装 latest —— 被测对象的版本要能从实验配置读出来。\n */\n version?: string;\n /**\n * OTel tape store 插件的 git 依赖(时间轨的来源)。省略时用 NiceEval 钉的默认 pin。\n *\n * 插件与 Bub 的 tape 协议同代:默认 pin 从 `bub.tape` 取类型,要求 Bub ≥ 0.3.10;更早的\n * 插件 commit 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,而是 span 全被拒、\n * 时间轨静默为空 —— 所以往回钉 `version` 时必须同批钉配套的插件 commit。\n */\n otelPlugin?: string;\n /**\n * 额外装进 bub tool 环境的 Python Package,每个 Sandbox setup 时进 `uv tool install … --with <pkg>`。\n * 规范化后的 package 列表进安装 checkpoint key:plugin 集合不同的两个 agent 变体不会复用同一个\n * 安装 checkpoint(否则第二个变体会静默拿到第一个变体的环境)。\n */\n pythonPlugins?: PythonPluginSpec[];\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在装 bub、装 Skills /\n * Python package、写 manifest 全部完成后执行。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: SandboxCommand[];\n}\nconst UV = \"$HOME/.local/bin/uv\";\n/** bub 的 skill 目录(`skills` 生态的「通用」目录);bub 不原生扫描它,靠 AGENTS.md 的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n// bub 与 OTel 插件的 pin 都从 config 来(缺省用源码里的默认 pin)——不设环境变量后门:\n// 装哪个包是配置,配置的家是代码(边界见 docs/architecture.md「配置从代码来,凭据从环境来」)。\n//\n// override 文件不是历史包袱:插件所在 workspace 把 `bub` 声明成 git 依赖,不覆盖的话每次\n// 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。\nconst BUB_OVERRIDE_FILE = \"/tmp/bub-override.txt\";\n/** 一个 agent 变体装的那套 bub:requirement + OTel 插件,两者都进安装指纹。 */\ninterface BubInstallPin {\n requirement: string;\n otelPlugin: string;\n dependencyOverrides: readonly string[];\n}\nfunction resolvePin(config?: BubConfig): BubInstallPin {\n const version = config?.version ?? DEFAULT_BUB_VERSION;\n return {\n requirement: config?.version ? bubRequirement(config.version) : DEFAULT_BUB_REQUIREMENT,\n otelPlugin: config?.otelPlugin ?? DEFAULT_BUB_OTEL_PLUGIN,\n // NiceEval can reproduce the default release's upstream lock exactly. A caller-selected\n // historical Bub version owns a different closure, so do not silently apply 0.4.0's pins.\n dependencyOverrides: version === DEFAULT_BUB_VERSION ? DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],\n };\n}\n// NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上\n// 另一个未知版本的 bub 抢先命中。\nconst BUB = \"$HOME/.local/bin/bub\";\n/** 规范化 python plugin:去空白、丢空串、去重 —— 安装命令与 checkpoint key 用同一份列表。 */\nfunction normalizePackages(plugins?: readonly PythonPluginSpec[]): string[] {\n return normalizeBubPackages((plugins ?? []).map((plugin) => plugin.package));\n}\nfunction installHashOf(packages: readonly string[], pin: BubInstallPin): string {\n return bubInstallHash(packages, pin.requirement, pin.otelPlugin, pin.dependencyOverrides);\n}\nfunction tapePath(workspace: string, sessionId: string, bubHome: string): string {\n const w = createHash(\"md5\").update(workspace).digest(\"hex\").slice(0, 16);\n const s = createHash(\"md5\").update(sessionId).digest(\"hex\").slice(0, 16);\n return `${bubHome}/tapes/${w}__${s}.jsonl`;\n}\nexport function bubAgent(config?: BubConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"BUB_API_KEY\");\n const getApiBase = () => config?.apiBase ?? requireEnv(\"BUB_API_BASE\");\n const packages = normalizePackages(config?.pythonPlugins);\n const pin = resolvePin(config);\n const identity = {\n agent: \"bub\",\n version: config?.version ?? DEFAULT_BUB_VERSION,\n revision: installHashOf(packages, pin),\n } as const;\n const marker = `$HOME/${BUB_INSTALL_MARKER}`;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.bub\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${BUB} && test \"$(cat ${marker} 2>/dev/null)\" = ${shellQuote(identity.revision)}`);\n });\n // sandboxId → { home, workspace }; persists values detected in setup() so send() can use them.\n const sessionInfo = new Map<string, {\n home: string;\n workspace: string;\n }>();\n return registerAgentLifecycleHookCommands(makeSandboxAgent({\n name: \"bub\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.writeText(BUB_OVERRIDE_FILE, `${[pin.requirement, ...pin.dependencyOverrides].join(\"\\n\")}\\n`);\n const withPlugins = packages.map((pkg) => `--with ${shellQuote(pkg)}`).join(\" \");\n let last = \"\";\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const result = await sandbox.runShell(`${UV} tool install --reinstall --python 3.12 --prerelease allow 'bub' --overrides ${BUB_OVERRIDE_FILE} --with ${shellQuote(pin.otelPlugin)}${withPlugins ? ` ${withPlugins}` : \"\"}`);\n if (result.exitCode === 0) {\n await sandbox.runShellOrThrow(`mkdir -p \"$(dirname ${marker})\" && printf '%s' ${shellQuote(identity.revision)} > ${marker}`);\n return;\n }\n last = (result.stdout + result.stderr).split(\"\\n\").slice(-15).join(\"\\n\");\n }\n throw new Error(`bub install failed after ${3} attempts:\n${last}`);\n },\n }],\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapBubSpans,\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n BUB_TAPESTORE_OTEL_ENABLED: \"true\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n // home 必须来自运行时探测:各 sandbox provider 不同(/home/node、/home/vercel-sandbox…),\n // 兜一个 provider 专属常量会静默走错路径(tape 读不到 → 空事件流 → 负断言假通过)。\n const home = (await sb.runShell(\"printf '%s' $HOME\")).stdout.trim();\n if (!home)\n throw new Error(`Failed to detect sandbox $HOME (empty output from \\`printf $HOME\\`). Refusing to fall back to a provider-specific path; check the sandbox provider.`);\n const workspace = sb.workdir;\n sessionInfo.set(sb.sandboxId, { home, workspace });\n // Agent CLI 已由 runner 的 agent.ensure 循环完成安装与复检。\n // adapter setup 只写本 Attempt 的 runtime config。\n if (!(await sb.pathExists(`${workspace}/AGENTS.md`))) {\n await shared.writeFile(sb, `${workspace}/AGENTS.md`, [\n `You are a coding agent working in a Next.js project at ${workspace}.`,\n ``,\n `Implement the requested feature by writing files directly to disk with the available tools:`,\n `- fs_write(path, content): create or overwrite a file`,\n `- fs_edit(path, old, new): edit an existing file`,\n `- bash(cmd): run shell commands`,\n ``,\n `Do NOT respond with only a text explanation — write the actual code files.`,\n `After writing, verify with bash(\"cd ${workspace} && npm run build\").`,\n ].join(\"\\n\"));\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // bub 没有原生 Skill 加载机制:装进目录不等于会被读到,发现指引跟着一起写。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (packages.length)\n manifest.pythonPlugins = packages.map((pkg) => ({ package: pkg }));\n if (manifest.skills.length || manifest.pythonPlugins?.length) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"bub\", config?.postSetup);\n },\n catch: (cause) => cause,\n }),\n teardown: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // bub 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"bub\", config?.preTeardown);\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.tryPromise({\n try: async () => {\n const sb = ctx.sandbox;\n const info = sessionInfo.get(sb.sandboxId);\n if (!info)\n throw new Error(`bub adapter setup() has not run in this sandbox (missing home/workspace info). The runner must call setup before send.`);\n const { home, workspace } = info;\n const bubHome = `${home}/.bub`;\n // 会话契约:ctx.session.id 未记录时开新 tape(新 sessionId),否则 resume 传入的 id。\n // tape 路径由 md5(workspace)+md5(sessionId) 决定,同沙箱多会话靠 sessionId 区分。\n const sessionId = ctx.session.id ?? `fe-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n BUB_API_KEY: apiKey,\n BUB_API_BASE: getApiBase(),\n BUB_HOME: bubHome,\n ...ctx.telemetry?.env,\n };\n // model 归属:实验决定(ctx.model),省略时交给 bub 原生默认 / 用户环境,不硬编码。\n if (ctx.model)\n env.BUB_MODEL = `openai:${ctx.model}`;\n const res = await sb.runShell(`${BUB} --workspace ${workspace} run ${shared.shellQuote(input.text)} --session-id ${sessionId}`, { env, sensitiveValues: [apiKey], stream: true });\n const raw = await sb.readText(tapePath(workspace, sessionId, bubHome)).catch(() => undefined);\n const parsed = shared.parseBub(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Bub tape was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Bub tape lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n }),\n }), config?.postSetup, config?.preTeardown);\n}\nexport default bubAgent();\n"]}
|
|
1
|
+
{"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["import { Effect } from \"effect\";\nimport { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { makeSandboxAgent } from \"../define.ts\";\nimport { requireEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapBubSpans } from \"../o11y/otlp/mappers/bub.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport type { Agent, AgentSetupManifest, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { BUB_INSTALL_MARKER, DEFAULT_BUB_DEPENDENCY_OVERRIDES, DEFAULT_BUB_OTEL_PLUGIN, DEFAULT_BUB_REQUIREMENT, bubInstallHash, bubRequirement, normalizeBubPackages, } from \"./bub-install-spec.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// bub 的 agent adapter(沙箱型)。\n//\n// ⚠️ 现实校正:bub 是 PyPI 上的 `bub`(alpha,Python 3.12),不是 npm 包。\n// · 安装:uv tool install bub(uv 自带 python 3.12,免 root)。\n// · 调用:bub run \"<prompt>\" --session-id <id> --workspace <path>\n// · 模型 + 代理:BUB_MODEL=openai:<model>、BUB_API_BASE、BUB_API_KEY。\n// · 记忆:tape(总是开),落盘在 ~/.bub/tapes/<md5(ws)[:16]>__<md5(sess)[:16]>.jsonl。\n// ───────────────────────────────────────────────────────────────────────────\n/**\n * Bub 的扩展单元 —— **只属于 Bub**:Bub 的插件是运行环境里的 Python Package,\n * 与 Claude Code / Codex 的 native plugin 没有共同的安装协议,不共用类型。\n */\nexport interface PythonPluginSpec {\n /** PyPI Package、Version Specifier 或 Git URL(如 `bub-plugin-memory==1.3.0`、`git+https://…@8f3c1a2`)。 */\n package: string;\n}\nexport interface BubConfig {\n /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */\n apiBase?: string;\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md(bub 没有原生 Skill 加载机制)。\n */\n skills?: SkillSpec[];\n /**\n * 装哪一版 Bub(PyPI 版本号,如 `\"0.4.0\"`)。省略时用 NiceEval 钉的默认版本;\n * 永远是确定版本,不装 latest —— 被测对象的版本要能从实验配置读出来。\n */\n version?: string;\n /**\n * OTel tape store 插件的 git 依赖(时间轨的来源)。省略时用 NiceEval 钉的默认 pin。\n *\n * 插件与 Bub 的 tape 协议同代:默认 pin 从 `bub.tape` 取类型,要求 Bub ≥ 0.3.10;更早的\n * 插件 commit 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,而是 span 全被拒、\n * 时间轨静默为空 —— 所以往回钉 `version` 时必须同批钉配套的插件 commit。\n */\n otelPlugin?: string;\n /**\n * 额外装进 bub tool 环境的 Python Package,每个 Sandbox setup 时进 `uv tool install … --with <pkg>`。\n * 规范化后的 package 列表进安装 checkpoint key:plugin 集合不同的两个 agent 变体不会复用同一个\n * 安装 checkpoint(否则第二个变体会静默拿到第一个变体的环境)。\n */\n pythonPlugins?: PythonPluginSpec[];\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在装 bub、装 Skills /\n * Python package、写 manifest 全部完成后执行。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: SandboxCommand[];\n}\nconst UV = \"$HOME/.local/bin/uv\";\n/** bub 的 skill 目录(`skills` 生态的「通用」目录);bub 不原生扫描它,靠 AGENTS.md 的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n// bub 与 OTel 插件的 pin 都从 config 来(缺省用源码里的默认 pin)——不设环境变量后门:\n// 装哪个包是配置,配置的家是代码(边界见 docs/architecture.md「配置从代码来,凭据从环境来」)。\n//\n// override 文件不是历史包袱:插件所在 workspace 把 `bub` 声明成 git 依赖,不覆盖的话每次\n// 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。\nconst BUB_OVERRIDE_FILE = \"/tmp/bub-override.txt\";\n/** 一个 agent 变体装的那套 bub:requirement + OTel 插件,两者都进安装指纹。 */\ninterface BubInstallPin {\n requirement: string;\n otelPlugin: string;\n dependencyOverrides: readonly string[];\n}\nfunction resolvePin(config?: BubConfig): BubInstallPin {\n const version = config?.version ?? DEFAULT_BUB_VERSION;\n return {\n requirement: config?.version ? bubRequirement(config.version) : DEFAULT_BUB_REQUIREMENT,\n otelPlugin: config?.otelPlugin ?? DEFAULT_BUB_OTEL_PLUGIN,\n // NiceEval can reproduce the default release's upstream lock exactly. A caller-selected\n // historical Bub version owns a different closure, so do not silently apply 0.4.0's pins.\n dependencyOverrides: version === DEFAULT_BUB_VERSION ? DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],\n };\n}\n// NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上\n// 另一个未知版本的 bub 抢先命中。\nconst BUB = \"$HOME/.local/bin/bub\";\n/** 规范化 python plugin:去空白、丢空串、去重 —— 安装命令与 checkpoint key 用同一份列表。 */\nfunction normalizePackages(plugins?: readonly PythonPluginSpec[]): string[] {\n return normalizeBubPackages((plugins ?? []).map((plugin) => plugin.package));\n}\nfunction installHashOf(packages: readonly string[], pin: BubInstallPin): string {\n return bubInstallHash(packages, pin.requirement, pin.otelPlugin, pin.dependencyOverrides);\n}\nfunction tapePath(workspace: string, sessionId: string, bubHome: string): string {\n const w = createHash(\"md5\").update(workspace).digest(\"hex\").slice(0, 16);\n const s = createHash(\"md5\").update(sessionId).digest(\"hex\").slice(0, 16);\n return `${bubHome}/tapes/${w}__${s}.jsonl`;\n}\n// @concord-code ne-adapter-bub-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/bub/README.md\nexport function bubAgent(config?: BubConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"BUB_API_KEY\");\n const getApiBase = () => config?.apiBase ?? requireEnv(\"BUB_API_BASE\");\n const packages = normalizePackages(config?.pythonPlugins);\n const pin = resolvePin(config);\n const identity = {\n agent: \"bub\",\n version: config?.version ?? DEFAULT_BUB_VERSION,\n revision: installHashOf(packages, pin),\n } as const;\n const marker = `$HOME/${BUB_INSTALL_MARKER}`;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.bub\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${BUB} && test \"$(cat ${marker} 2>/dev/null)\" = ${shellQuote(identity.revision)}`);\n });\n // sandboxId → { home, workspace }; persists values detected in setup() so send() can use them.\n const sessionInfo = new Map<string, {\n home: string;\n workspace: string;\n }>();\n return registerAgentLifecycleHookCommands(makeSandboxAgent({\n name: \"bub\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.writeText(BUB_OVERRIDE_FILE, `${[pin.requirement, ...pin.dependencyOverrides].join(\"\\n\")}\\n`);\n const withPlugins = packages.map((pkg) => `--with ${shellQuote(pkg)}`).join(\" \");\n let last = \"\";\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const result = await sandbox.runShell(`${UV} tool install --reinstall --python 3.12 --prerelease allow 'bub' --overrides ${BUB_OVERRIDE_FILE} --with ${shellQuote(pin.otelPlugin)}${withPlugins ? ` ${withPlugins}` : \"\"}`);\n if (result.exitCode === 0) {\n await sandbox.runShellOrThrow(`mkdir -p \"$(dirname ${marker})\" && printf '%s' ${shellQuote(identity.revision)} > ${marker}`);\n return;\n }\n last = (result.stdout + result.stderr).split(\"\\n\").slice(-15).join(\"\\n\");\n }\n throw new Error(`bub install failed after ${3} attempts:\n${last}`);\n },\n }],\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapBubSpans,\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n BUB_TAPESTORE_OTEL_ENABLED: \"true\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n setup: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n // home 必须来自运行时探测:各 sandbox provider 不同(/home/node、/home/vercel-sandbox…),\n // 兜一个 provider 专属常量会静默走错路径(tape 读不到 → 空事件流 → 负断言假通过)。\n const home = (await sb.runShell(\"printf '%s' $HOME\")).stdout.trim();\n if (!home)\n throw new Error(`Failed to detect sandbox $HOME (empty output from \\`printf $HOME\\`). Refusing to fall back to a provider-specific path; check the sandbox provider.`);\n const workspace = sb.workdir;\n sessionInfo.set(sb.sandboxId, { home, workspace });\n // Agent CLI 已由 runner 的 agent.ensure 循环完成安装与复检。\n // adapter setup 只写本 Attempt 的 runtime config。\n if (!(await sb.pathExists(`${workspace}/AGENTS.md`))) {\n await shared.writeFile(sb, `${workspace}/AGENTS.md`, [\n `You are a coding agent working in a Next.js project at ${workspace}.`,\n ``,\n `Implement the requested feature by writing files directly to disk with the available tools:`,\n `- fs_write(path, content): create or overwrite a file`,\n `- fs_edit(path, old, new): edit an existing file`,\n `- bash(cmd): run shell commands`,\n ``,\n `Do NOT respond with only a text explanation — write the actual code files.`,\n `After writing, verify with bash(\"cd ${workspace} && npm run build\").`,\n ].join(\"\\n\"));\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // bub 没有原生 Skill 加载机制:装进目录不等于会被读到,发现指引跟着一起写。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (packages.length)\n manifest.pythonPlugins = packages.map((pkg) => ({ package: pkg }));\n if (manifest.skills.length || manifest.pythonPlugins?.length) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"bub\", config?.postSetup);\n },\n catch: (cause) => cause,\n }),\n teardown: (sb, ctx) => Effect.tryPromise({\n try: async () => {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // bub 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"bub\", config?.preTeardown);\n },\n catch: (cause) => cause,\n }),\n send: (input, ctx) => Effect.tryPromise({\n try: async () => {\n const sb = ctx.sandbox;\n const info = sessionInfo.get(sb.sandboxId);\n if (!info)\n throw new Error(`bub adapter setup() has not run in this sandbox (missing home/workspace info). The runner must call setup before send.`);\n const { home, workspace } = info;\n const bubHome = `${home}/.bub`;\n // 会话契约:ctx.session.id 未记录时开新 tape(新 sessionId),否则 resume 传入的 id。\n // tape 路径由 md5(workspace)+md5(sessionId) 决定,同沙箱多会话靠 sessionId 区分。\n const sessionId = ctx.session.id ?? `fe-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n BUB_API_KEY: apiKey,\n BUB_API_BASE: getApiBase(),\n BUB_HOME: bubHome,\n ...ctx.telemetry?.env,\n };\n // model 归属:实验决定(ctx.model),省略时交给 bub 原生默认 / 用户环境,不硬编码。\n if (ctx.model)\n env.BUB_MODEL = `openai:${ctx.model}`;\n const res = await sb.runShell(`${BUB} --workspace ${workspace} run ${shared.shellQuote(input.text)} --session-id ${sessionId}`, { env, sensitiveValues: [apiKey], stream: true });\n const raw = await sb.readText(tapePath(workspace, sessionId, bubHome)).catch(() => undefined);\n const parsed = shared.parseBub(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Bub tape was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Bub tape lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n }),\n }), config?.postSetup, config?.preTeardown);\n}\nexport default bubAgent();\n"]}
|
|
@@ -26,8 +26,24 @@ function eventKey(event) {
|
|
|
26
26
|
}
|
|
27
27
|
function parseFrames(frames, reported) {
|
|
28
28
|
const parsed = shared_ts_1.shared.parseClaudeCode(frames.map((frame) => JSON.stringify(frame)).join("\n"));
|
|
29
|
+
// The terminal result owns aggregate usage for this send. Some native
|
|
30
|
+
// versions omit usage from assistant messages; adding both would double count.
|
|
31
|
+
const terminal = frames.map(record).findLast((frame) => frame?.type === "result");
|
|
32
|
+
const resultUsage = record(terminal?.usage);
|
|
33
|
+
const token = (name) => {
|
|
34
|
+
const value = resultUsage?.[name];
|
|
35
|
+
return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : undefined;
|
|
36
|
+
};
|
|
37
|
+
const usage = resultUsage === undefined ? parsed.usage : {
|
|
38
|
+
inputTokens: token("input_tokens"),
|
|
39
|
+
outputTokens: token("output_tokens"),
|
|
40
|
+
cacheReadTokens: token("cache_read_input_tokens"),
|
|
41
|
+
cacheCreationTokens: token("cache_creation_input_tokens"),
|
|
42
|
+
requests: typeof terminal?.num_turns === "number" && Number.isSafeInteger(terminal.num_turns) && terminal.num_turns >= 0
|
|
43
|
+
? terminal.num_turns : parsed.usage.requests,
|
|
44
|
+
};
|
|
29
45
|
return {
|
|
30
|
-
usage
|
|
46
|
+
usage,
|
|
31
47
|
parseSuccess: parsed.parseSuccess,
|
|
32
48
|
events: parsed.events.filter((event) => {
|
|
33
49
|
const key = eventKey(event);
|
|
@@ -130,7 +146,17 @@ async function createState(ctx, args, env) {
|
|
|
130
146
|
cwd: ctx.sandbox.workdir,
|
|
131
147
|
env: { ...env, CLAUDE_CODE_ENTRYPOINT: "sdk-ts", CLAUDE_AGENT_SDK_VERSION: "0.3.226" },
|
|
132
148
|
});
|
|
133
|
-
|
|
149
|
+
const requestId = "niceeval-initialize";
|
|
150
|
+
await driver.write({ type: "control_request", request_id: requestId, request: { subtype: "initialize" } });
|
|
151
|
+
const initialized = await driver.waitFor(0, (value) => {
|
|
152
|
+
const frame = record(value);
|
|
153
|
+
return frame?.type === "control_response" && record(frame.response)?.request_id === requestId;
|
|
154
|
+
}, ctx.signal);
|
|
155
|
+
const response = record(record(initialized.frame)?.response);
|
|
156
|
+
if (response?.subtype !== "success") {
|
|
157
|
+
throw new Error(`Claude Code initialization failed: ${String(response?.error ?? "invalid control response")}`);
|
|
158
|
+
}
|
|
159
|
+
return { driver, cursor: initialized.cursor, reported: new Set(), reportedToolProgress: new Set() };
|
|
134
160
|
}
|
|
135
161
|
function pendingFrom(frame, sessionId) {
|
|
136
162
|
if (frame.type !== "control_request" || typeof frame.request_id !== "string")
|