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
|
@@ -49,6 +49,9 @@ function commandProjectionForClaudeSdkTool(name) {
|
|
|
49
49
|
* (逐 token 渲染)整个忽略。HITL 的停轮判定(哪个工具被门控)是应用侧的知识,不在这里——
|
|
50
50
|
* 扫描 add() 返回的 operation.started 自行决定。
|
|
51
51
|
*/
|
|
52
|
+
// @concord-code ne-adapter-claude-sdk-stream
|
|
53
|
+
// @concord-implements docs/feature/adapters/library/streaming.md
|
|
54
|
+
// @concord-implements docs/feature/adapters/sdk/claude-agent-sdk/README.md
|
|
52
55
|
function createClaudeSdkEventStream() {
|
|
53
56
|
let sessionId;
|
|
54
57
|
let usage;
|
|
@@ -171,6 +174,9 @@ function createClaudeSdkEventStream() {
|
|
|
171
174
|
* stopReason "error" / "aborted" 收尾时记失败(`failed`)并发一条 error 事件。
|
|
172
175
|
* tool_execution_start/end → operation.started / operation.finished。
|
|
173
176
|
*/
|
|
177
|
+
// @concord-code ne-adapter-pi-event-stream
|
|
178
|
+
// @concord-implements docs/feature/adapters/library/streaming.md
|
|
179
|
+
// @concord-implements docs/feature/adapters/sdk/pi-agent-core/README.md
|
|
174
180
|
function createPiAgentEventStream() {
|
|
175
181
|
let usage;
|
|
176
182
|
let failed = false;
|
|
@@ -276,6 +282,9 @@ function createPiAgentEventStream() {
|
|
|
276
282
|
};
|
|
277
283
|
}
|
|
278
284
|
/** Codex SDK 线程事件流(`thread.started` / `item.*` / `turn.completed` / `turn.failed`)→ 标准事件。 */
|
|
285
|
+
// @concord-code ne-adapter-codex-thread-stream
|
|
286
|
+
// @concord-implements docs/feature/adapters/library/streaming.md
|
|
287
|
+
// @concord-implements docs/feature/adapters/sdk/codex-sdk/README.md
|
|
279
288
|
function createCodexThreadEventStream() {
|
|
280
289
|
let threadId;
|
|
281
290
|
let usage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sdk-streams.js","sourceRoot":"","sources":["sdk-streams.ts"],"names":[],"mappings":"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","sourcesContent":["// SDK 原生事件流 → 标准 StreamEvent 的官方转换器(+ 通用 SSE 读帧器)。\n//\n// 定位:各 agent SDK 的流式协议(Claude Agent SDK 的 `SDKMessage`、pi-agent-core 的\n// `AgentEvent`、Codex SDK 的 `ThreadEvent`)是 SDK 定义的通用协议,不是某个应用的私有格式——\n// 这层映射知识属于 niceeval 官方包,adapter 里只该剩传输粘合(应用把流放在哪个端点、\n// 审批走什么端点)。类型全部用结构化的 *Like 声明(同 turnFromAiSdk 的先例),不依赖任何 SDK 包。\n//\n// 用法(以 Claude Agent SDK 为例):\n//\n// ```typescript\n// import { sseJsonFrames, createClaudeSdkEventStream } from \"niceeval/adapter\";\n//\n// const frames = sseJsonFrames<SDKMessage>(res.body);\n// const stream = createClaudeSdkEventStream();\n// for (;;) {\n// const frame = await frames.next();\n// if (frame === null) break;\n// events.push(...stream.add(frame)); // 逐帧翻译;认不出的帧返回 []\n// }\n// return { status: stream.failed ? \"failed\" : \"completed\", events, usage: stream.usage };\n// ```\nimport type { CommandProjection, JsonValue, StreamEvent, ToolName, Usage } from \"../types.ts\";\nimport { normalizeToolName } from \"../o11y/tool-names.ts\";\nimport { CODEX_TOOL_ALIASES } from \"../o11y/parsers/codex.ts\";\nimport { CLAUDE_TOOL_ALIASES } from \"../o11y/parsers/claude-code.ts\";\nimport { notCommandProjection, opaqueCommandProjection } from \"../o11y/command-projection.ts\";\n// ───────────────────────── 通用 SSE 读帧器 ─────────────────────────\nexport interface SseFrameCursor<T> {\n /** 下一个 `data:` JSON 帧;流结束返回 null。`data: [DONE]` 哨兵帧自动跳过。 */\n next(): Promise<T | null>;\n}\n/** 标准 SSE(`data: {...}\\n\\n`)→ 逐帧 JSON。各 adapter 不用再手写 buffer 状态机。 */\nexport function sseJsonFrames<T>(body: ReadableStream<Uint8Array>): SseFrameCursor<T> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n async function next(): Promise<T | null> {\n for (;;) {\n const sepIndex = buffer.indexOf(\"\\n\\n\");\n if (sepIndex !== -1) {\n const rawEvent = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const line = rawEvent.split(\"\\n\").find((l) => l.startsWith(\"data: \"));\n if (!line)\n continue;\n const payload = line.slice(\"data: \".length);\n if (payload === \"[DONE]\")\n continue;\n return JSON.parse(payload) as T;\n }\n const { value, done } = await reader.read();\n if (done)\n return null;\n buffer += decoder.decode(value, { stream: true });\n }\n }\n return { next };\n}\nfunction isRecord(v: unknown): v is globalThis.Record<string, unknown> {\n return typeof v === \"object\" && v !== null;\n}\n/** Claude Agent SDK 的原生 Bash tool 只交付 shell source,不交付 argv。 */\nfunction commandProjectionForClaudeSdkTool(name: string): CommandProjection | undefined {\n return name === \"Bash\" ? opaqueCommandProjection(\"unsupported-protocol\") : undefined;\n}\n// ───────────────────────── Claude Agent SDK:SDKMessage ─────────────────────────\n/** 只声明转换器要读的字段;真实的 SDKMessage 直接喂进来即可。 */\nexport interface ClaudeSdkMessageLike {\n type: string;\n subtype?: string;\n session_id?: string;\n tool_use_id?: string;\n is_error?: boolean;\n num_turns?: number;\n total_cost_usd?: number;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n };\n message?: {\n content?: unknown;\n };\n [key: string]: unknown;\n}\nexport interface ClaudeSdkStream {\n /** 逐帧喂 `SDKMessage`,返回这一帧派生的标准事件;认不出的帧(stream_event 等)返回 []。 */\n add(message: ClaudeSdkMessageLike): StreamEvent[];\n /** `system`/`init` 帧带回的 session_id(首帧之后可读),回写 `ctx.session.id` 用。 */\n readonly sessionId: string | undefined;\n /** `result` 帧的聚合用量。 */\n readonly usage: Usage | undefined;\n /** `result` 帧报了 is_error。 */\n readonly failed: boolean;\n /**\n * 拒绝审批后续读前登记:该 tool_use 的 `tool_result` / `permission_denied` 落成\n * `status: \"rejected\"`(而不是 failed),且两种帧只产一条 operation.finished。\n */\n markRejected(toolUseId: string): void;\n}\n/**\n * Claude Agent SDK 消息流(`system` / `assistant` / `user` / `result`)→ 标准事件。\n * `assistant` 的 text/thinking/tool_use 块 → message / thinking / operation.started;`user` 的\n * tool_result 块 → operation.finished;`system`/`permission_denied` → rejected;`stream_event`\n * (逐 token 渲染)整个忽略。HITL 的停轮判定(哪个工具被门控)是应用侧的知识,不在这里——\n * 扫描 add() 返回的 operation.started 自行决定。\n */\nexport function createClaudeSdkEventStream(): ClaudeSdkStream {\n let sessionId: string | undefined;\n let usage: Usage | undefined;\n let failed = false;\n const resolvedCallIds = new Set<string>();\n const rejected = new Set<string>();\n const toolResultText = (content: unknown): string | undefined => {\n if (typeof content === \"string\")\n return content;\n if (Array.isArray(content)) {\n return content\n .filter((b): b is {\n type: \"text\";\n text: string;\n } => isRecord(b) && b.type === \"text\" && typeof b.text === \"string\")\n .map((b) => b.text)\n .join(\"\");\n }\n return undefined;\n };\n return {\n get sessionId() {\n return sessionId;\n },\n get usage() {\n return usage;\n },\n get failed() {\n return failed;\n },\n markRejected(toolUseId) {\n rejected.add(toolUseId);\n },\n add(frame) {\n const events: StreamEvent[] = [];\n switch (frame.type) {\n case \"system\": {\n if (frame.subtype === \"init\" && typeof frame.session_id === \"string\") {\n sessionId ??= frame.session_id;\n }\n else if (frame.subtype === \"permission_denied\" && typeof frame.tool_use_id === \"string\") {\n if (!resolvedCallIds.has(frame.tool_use_id)) {\n resolvedCallIds.add(frame.tool_use_id);\n events.push({ type: \"operation.finished\", operationId: frame.tool_use_id, kind: \"tool\", status: \"rejected\" });\n }\n }\n break;\n }\n case \"assistant\": {\n const content: unknown[] = Array.isArray(frame.message?.content) ? frame.message.content : [];\n for (const block of content) {\n if (!isRecord(block))\n continue;\n if (block.type === \"text\" && typeof block.text === \"string\" && block.text) {\n events.push({ type: \"message\", role: \"assistant\", text: block.text });\n }\n else if (block.type === \"thinking\" && typeof block.thinking === \"string\" && block.thinking) {\n events.push({ type: \"thinking\", text: block.thinking });\n }\n else if (block.type === \"tool_use\" && typeof block.id === \"string\" && typeof block.name === \"string\") {\n const command = commandProjectionForClaudeSdkTool(block.name);\n events.push({\n type: \"operation.started\",\n operationId: block.id,\n operation: {\n kind: \"tool\",\n name: block.name,\n input: block.input as JsonValue,\n tool: normalizeToolName(block.name, CLAUDE_TOOL_ALIASES),\n ...(command === undefined ? {} : { command }),\n },\n });\n }\n }\n break;\n }\n case \"user\": {\n const content: unknown[] = Array.isArray(frame.message?.content) ? frame.message.content : [];\n for (const block of content) {\n if (!isRecord(block) || block.type !== \"tool_result\" || typeof block.tool_use_id !== \"string\")\n continue;\n if (resolvedCallIds.has(block.tool_use_id))\n continue;\n resolvedCallIds.add(block.tool_use_id);\n events.push({\n type: \"operation.finished\",\n operationId: block.tool_use_id,\n kind: \"tool\",\n output: toolResultText(block.content) as JsonValue,\n status: rejected.has(block.tool_use_id) ? \"rejected\" : block.is_error ? \"failed\" : \"completed\",\n });\n }\n break;\n }\n case \"result\": {\n failed = frame.is_error === true;\n if (frame.usage) {\n usage = {\n inputTokens: frame.usage.input_tokens,\n outputTokens: frame.usage.output_tokens,\n cacheReadTokens: frame.usage.cache_read_input_tokens ?? undefined,\n cacheCreationTokens: frame.usage.cache_creation_input_tokens ?? undefined,\n requests: frame.num_turns,\n costUSD: frame.total_cost_usd,\n };\n }\n break;\n }\n // stream_event(逐 token 渲染)与其它系统/生命周期消息:无对应 StreamEvent。\n default:\n break;\n }\n return events;\n },\n };\n}\n// ───────────────────────── pi-agent-core:AgentEvent ─────────────────────────\nexport interface PiAgentEventLike {\n type: string;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n /** content 在 user 消息上是 string、assistant 消息上是 parts 数组——按 unknown 收,防御式解析。 */\n message?: {\n role?: string;\n content?: unknown;\n /** assistant 消息的收尾原因;\"error\" / \"aborted\" 表示这条消息以失败告终。 */\n stopReason?: string;\n /** stopReason 为 \"error\" 时的错误说明。 */\n errorMessage?: string;\n usage?: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: {\n total: number;\n };\n };\n };\n /** `message_update` 帧携带的增量事件(text_delta / thinking_delta 等)——只读 type/delta,防御式解析。 */\n assistantMessageEvent?: {\n type?: string;\n delta?: unknown;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\nexport interface PiAgentStream {\n /** 逐帧喂 `AgentEvent`,返回这一帧派生的标准事件;生命周期帧(turn_start 等)返回 []。 */\n add(event: PiAgentEventLike): StreamEvent[];\n /** assistant `message_end` 逐条累加的用量。 */\n readonly usage: Usage | undefined;\n /** assistant 消息以 stopReason \"error\" / \"aborted\" 收尾过。 */\n readonly failed: boolean;\n /** 拒绝审批后续读前登记:该调用 `tool_execution_end` 的 isError 判成 \"rejected\" 而非 \"failed\"。 */\n markRejected(toolCallId: string): void;\n}\n/**\n * pi-agent-core 事件流(`message_start` / `message_update` / `message_end` /\n * `tool_execution_start` / `tool_execution_end`)→ 标准事件。消息三段式聚合成一条:\n * message_start 清空增量缓冲、message_update 的 text_delta / thinking_delta 逐段累加、\n * message_end 落地成 message / thinking(优先取 end 帧的完整 content,缺了用累加的增量兜底);\n * 只有 start/delta 的截断流不产出半条消息。message_end 同时累加 usage;assistant 消息以\n * stopReason \"error\" / \"aborted\" 收尾时记失败(`failed`)并发一条 error 事件。\n * tool_execution_start/end → operation.started / operation.finished。\n */\nexport function createPiAgentEventStream(): PiAgentStream {\n let usage: Usage | undefined;\n let failed = false;\n // message_start/update 累加的增量缓冲;message_end 落地后清空,截断流(无 end)不落地。\n let deltaText = \"\";\n let deltaThinking = \"\";\n const rejected = new Set<string>();\n const partText = (event: PiAgentEventLike, type: \"text\" | \"thinking\"): string => {\n if (event.message?.role !== \"assistant\" || !Array.isArray(event.message.content))\n return \"\";\n return event.message.content\n .filter((part): part is globalThis.Record<string, unknown> => isRecord(part) && part.type === type)\n .map((part) => {\n const v = type === \"text\" ? part.text : part.thinking;\n return typeof v === \"string\" ? v : \"\";\n })\n .join(\"\");\n };\n return {\n get usage() {\n return usage;\n },\n get failed() {\n return failed;\n },\n markRejected(toolCallId) {\n rejected.add(toolCallId);\n },\n add(event) {\n const events: StreamEvent[] = [];\n switch (event.type) {\n case \"message_start\": {\n // 新消息开始:上一条没等到 message_end 的增量作废(不落地半条消息)。\n deltaText = \"\";\n deltaThinking = \"\";\n break;\n }\n case \"message_update\": {\n const e = event.assistantMessageEvent;\n if (isRecord(e) && typeof e.delta === \"string\") {\n if (e.type === \"text_delta\")\n deltaText += e.delta;\n else if (e.type === \"thinking_delta\")\n deltaThinking += e.delta;\n }\n break;\n }\n case \"message_end\": {\n // 优先取 end 帧的完整 content;缺了(部分传输只带增量)用累加的 delta 兜底。\n const text = partText(event, \"text\") || (event.message?.role === \"assistant\" ? deltaText : \"\");\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n const thinking = partText(event, \"thinking\") || (event.message?.role === \"assistant\" ? deltaThinking : \"\");\n if (thinking)\n events.push({ type: \"thinking\", text: thinking });\n deltaText = \"\";\n deltaThinking = \"\";\n if (event.message?.role === \"assistant\") {\n const stopReason = event.message.stopReason;\n if (stopReason === \"error\" || stopReason === \"aborted\") {\n failed = true;\n events.push({ type: \"error\", message: event.message.errorMessage ?? `pi agent stopReason=${stopReason}` });\n }\n }\n const u = event.message?.role === \"assistant\" ? event.message.usage : undefined;\n if (u) {\n // pi computes u.cost from its own model price table. That estimate\n // is not provider-observed billing and must not enter Usage.costUSD.\n usage = {\n inputTokens: (usage?.inputTokens ?? 0) + u.input,\n outputTokens: (usage?.outputTokens ?? 0) + u.output,\n cacheReadTokens: (usage?.cacheReadTokens ?? 0) + u.cacheRead,\n cacheCreationTokens: (usage?.cacheCreationTokens ?? 0) + u.cacheWrite,\n requests: (usage?.requests ?? 0) + 1,\n };\n }\n break;\n }\n case \"tool_execution_start\": {\n if (typeof event.toolCallId === \"string\" && typeof event.toolName === \"string\") {\n events.push({\n type: \"operation.started\",\n operationId: event.toolCallId,\n operation: { kind: \"tool\", name: event.toolName, input: event.args as JsonValue },\n });\n }\n break;\n }\n case \"tool_execution_end\": {\n if (typeof event.toolCallId === \"string\") {\n const status = event.isError ? (rejected.has(event.toolCallId) ? \"rejected\" : \"failed\") : \"completed\";\n events.push({ type: \"operation.finished\", operationId: event.toolCallId, kind: \"tool\", output: event.result as JsonValue, status });\n }\n break;\n }\n // agent_start / turn_start / turn_end / tool_execution_update / agent_end:\n // 无对应 StreamEvent(消息文本统一在 message_end 落地)。\n default:\n break;\n }\n return events;\n },\n };\n}\n// ───────────────────────── Codex SDK:ThreadEvent ─────────────────────────\nexport interface CodexThreadEventLike {\n type: string;\n message?: string;\n thread_id?: string;\n item?: {\n type?: string;\n text?: string;\n message?: string;\n [key: string]: unknown;\n };\n error?: {\n message: string;\n };\n [key: string]: unknown;\n}\nexport interface CodexThreadStream {\n /**\n * 逐帧喂 `ThreadEvent`,返回标准事件:消息类(agent_message → message、reasoning → thinking、\n * error item / turn.failed / 顶层 error → error)+ 工具项(command_execution / mcp_tool_call / web_search /\n * file_change → operation.started + operation.finished,附规范工具名 `tool`,如 command_execution →\n * `\"shell\"`,供 `calledTool(\"shell\")` 这类跨 agent 断言命中)。usage 从 `turn.completed` 聚合,经 `usage` 读。\n * 断言依据全部来自这条流;codex CLI 的原生 OTLP span 只用于瀑布图(spanMapper: mapCodexSpans)。\n */\n add(event: CodexThreadEventLike): StreamEvent[];\n /** `thread.started` 带回的 thread_id,回写 `ctx.session.id` 用。 */\n readonly threadId: string | undefined;\n /** `turn.completed` 聚合的用量(input/cached/output tokens)。 */\n readonly usage: Usage | undefined;\n /** turn.failed 或顶层不可恢复 error 出现过;非致命 error item 只保留诊断。 */\n readonly failed: boolean;\n}\n/** Codex SDK 线程事件流(`thread.started` / `item.*` / `turn.completed` / `turn.failed`)→ 标准事件。 */\nexport function createCodexThreadEventStream(): CodexThreadStream {\n let threadId: string | undefined;\n let usage: Usage | undefined;\n let failed = false;\n // item.started 已发 operation.started 的 id;item.completed 时不重发,只补 result。\n const startedCallIds = new Set<string>();\n let synth = 0;\n const callIdOf = (item: globalThis.Record<string, unknown>, prefix: string): string => {\n const id = item.id;\n return typeof id === \"string\" || typeof id === \"number\" ? String(id) : `${prefix}_${++synth}`;\n };\n // 工具项 → operation.started(+completed 时的 operation.finished)。与 o11y/parsers/codex.ts 的\n // transcript 映射保持同一套语义(字段名以 codex exec --json 的 ThreadItem 为准),\n // 包括规范工具名 tool:少了它 derive 只能落 name=\"unknown\",calledTool(\"shell\") 这类\n // 跨 agent 规范名断言在 SDK 流路径上会静默失配(2026-07-09 CI 实红)。\n const handleToolItem = (item: globalThis.Record<string, unknown>, isCompleted: boolean): StreamEvent[] => {\n const events: StreamEvent[] = [];\n const emitCall = (callId: string, name: string, input: JsonValue, tool: ToolName, command: CommandProjection): void => {\n if (startedCallIds.has(callId))\n return;\n startedCallIds.add(callId);\n events.push({ type: \"operation.started\", operationId: callId, operation: { kind: \"tool\", name, input, tool, command } });\n };\n switch (item.type) {\n case \"command_execution\": {\n const callId = callIdOf(item, \"cmd\");\n emitCall(callId, \"command_execution\", { command: item.command ?? null } as JsonValue, \"shell\", opaqueCommandProjection(\"unsupported-protocol\"));\n if (isCompleted) {\n const exit = item.exit_code ?? item.exitCode;\n const output = item.aggregated_output ?? item.aggregatedOutput ?? item.output;\n const status = item.status === \"declined\" || item.status === \"rejected\"\n ? \"rejected\" as const\n : exit === 0 || (exit == null && item.status !== \"failed\" && item.status !== \"error\")\n ? \"completed\" as const\n : \"failed\" as const;\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n ...(output === undefined && exit === undefined\n ? {}\n : { output: { output: (output ?? null) as JsonValue, exit_code: (exit ?? null) as JsonValue } }),\n status,\n });\n }\n return events;\n }\n case \"mcp_tool_call\": {\n const callId = callIdOf(item, \"mcp\");\n const tool = String(item.tool ?? \"unknown\");\n const name = typeof item.server === \"string\" ? `${item.server}.${tool}` : tool;\n emitCall(callId, name, (item.arguments ?? null) as JsonValue, normalizeToolName(tool, CODEX_TOOL_ALIASES), notCommandProjection());\n if (isCompleted) {\n const success = !item.error && item.status !== \"failed\";\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: (item.result ?? null) as JsonValue,\n status: success ? \"completed\" : \"failed\",\n });\n }\n return events;\n }\n case \"web_search\": {\n const callId = callIdOf(item, \"web\");\n emitCall(callId, \"web_search\", { query: item.query ?? null } as JsonValue, \"web_search\", notCommandProjection());\n if (isCompleted) {\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: null, status: \"completed\" });\n }\n return events;\n }\n case \"file_change\": {\n // 补丁类只在 completed 落一次:changes 里每个文件一对 called/result。\n if (!isCompleted)\n return events;\n const baseId = callIdOf(item, \"patch\");\n const changes = Array.isArray(item.changes) ? item.changes : [];\n changes.forEach((ch, i) => {\n const callId = `${baseId}#${i}`;\n const change = isRecord(ch) ? { path: ch.path ?? null, kind: ch.kind ?? null } : {};\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name: \"file_change\",\n input: change as JsonValue,\n tool: \"file_edit\",\n command: notCommandProjection(),\n },\n });\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: change as JsonValue, status: \"completed\" });\n });\n return events;\n }\n default:\n return events;\n }\n };\n return {\n get threadId() {\n return threadId;\n },\n get usage() {\n return usage;\n },\n get failed() {\n return failed;\n },\n add(event) {\n const events: StreamEvent[] = [];\n switch (event.type) {\n case \"thread.started\": {\n if (typeof event.thread_id === \"string\")\n threadId ??= event.thread_id;\n break;\n }\n case \"item.started\": {\n if (event.item)\n events.push(...handleToolItem(event.item, false));\n break;\n }\n case \"item.completed\": {\n const item = event.item;\n if (!item)\n break;\n if (item.type === \"agent_message\" && typeof item.text === \"string\" && item.text) {\n events.push({ type: \"message\", role: \"assistant\", text: item.text });\n }\n else if (item.type === \"reasoning\" && typeof item.text === \"string\" && item.text) {\n events.push({ type: \"thinking\", text: item.text });\n }\n else if (item.type === \"error\" && typeof item.message === \"string\") {\n events.push({ type: \"error\", message: item.message });\n }\n else {\n events.push(...handleToolItem(item, true));\n }\n break;\n }\n case \"turn.completed\": {\n const u = event.usage;\n if (isRecord(u)) {\n const num = (v: unknown): number => (typeof v === \"number\" ? v : 0);\n usage = {\n // codex-rs TokenUsage 的 cached_input_tokens 是 input_tokens 的子集,\n // 落互斥桶前扣掉(docs/feature/adapters/sdk/codex-sdk/cost.md)\n inputTokens: (usage?.inputTokens ?? 0) + Math.max(0, num(u.input_tokens) - num(u.cached_input_tokens)),\n outputTokens: (usage?.outputTokens ?? 0) + num(u.output_tokens),\n cacheReadTokens: (usage?.cacheReadTokens ?? 0) + num(u.cached_input_tokens),\n // codex-rs TokenUsage 结构体同一份字段(与 o11y/parsers/codex.ts 的\n // transcript 解析同源),只在这次 turn 真的带回时累加。\n ...(typeof u.reasoning_output_tokens === \"number\" || usage?.reasoningTokens !== undefined\n ? { reasoningTokens: (usage?.reasoningTokens ?? 0) + num(u.reasoning_output_tokens) }\n : {}),\n requests: (usage?.requests ?? 0) + 1,\n };\n }\n break;\n }\n case \"error\": {\n failed = true;\n if (typeof event.message === \"string\")\n events.push({ type: \"error\", message: event.message });\n break;\n }\n case \"turn.failed\": {\n failed = true;\n if (event.error?.message)\n events.push({ type: \"error\", message: event.error.message });\n break;\n }\n // item.updated(中间态)/ turn.started:忽略,等 completed。\n default:\n break;\n }\n return events;\n },\n };\n}\n"]}
|
|
1
|
+
{"version":3,"file":"sdk-streams.js","sourceRoot":"","sources":["sdk-streams.ts"],"names":[],"mappings":"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","sourcesContent":["// SDK 原生事件流 → 标准 StreamEvent 的官方转换器(+ 通用 SSE 读帧器)。\n//\n// 定位:各 agent SDK 的流式协议(Claude Agent SDK 的 `SDKMessage`、pi-agent-core 的\n// `AgentEvent`、Codex SDK 的 `ThreadEvent`)是 SDK 定义的通用协议,不是某个应用的私有格式——\n// 这层映射知识属于 niceeval 官方包,adapter 里只该剩传输粘合(应用把流放在哪个端点、\n// 审批走什么端点)。类型全部用结构化的 *Like 声明(同 turnFromAiSdk 的先例),不依赖任何 SDK 包。\n//\n// 用法(以 Claude Agent SDK 为例):\n//\n// ```typescript\n// import { sseJsonFrames, createClaudeSdkEventStream } from \"niceeval/adapter\";\n//\n// const frames = sseJsonFrames<SDKMessage>(res.body);\n// const stream = createClaudeSdkEventStream();\n// for (;;) {\n// const frame = await frames.next();\n// if (frame === null) break;\n// events.push(...stream.add(frame)); // 逐帧翻译;认不出的帧返回 []\n// }\n// return { status: stream.failed ? \"failed\" : \"completed\", events, usage: stream.usage };\n// ```\nimport type { CommandProjection, JsonValue, StreamEvent, ToolName, Usage } from \"../types.ts\";\nimport { normalizeToolName } from \"../o11y/tool-names.ts\";\nimport { CODEX_TOOL_ALIASES } from \"../o11y/parsers/codex.ts\";\nimport { CLAUDE_TOOL_ALIASES } from \"../o11y/parsers/claude-code.ts\";\nimport { notCommandProjection, opaqueCommandProjection } from \"../o11y/command-projection.ts\";\n// ───────────────────────── 通用 SSE 读帧器 ─────────────────────────\nexport interface SseFrameCursor<T> {\n /** 下一个 `data:` JSON 帧;流结束返回 null。`data: [DONE]` 哨兵帧自动跳过。 */\n next(): Promise<T | null>;\n}\n/** 标准 SSE(`data: {...}\\n\\n`)→ 逐帧 JSON。各 adapter 不用再手写 buffer 状态机。 */\nexport function sseJsonFrames<T>(body: ReadableStream<Uint8Array>): SseFrameCursor<T> {\n const reader = body.getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n async function next(): Promise<T | null> {\n for (;;) {\n const sepIndex = buffer.indexOf(\"\\n\\n\");\n if (sepIndex !== -1) {\n const rawEvent = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const line = rawEvent.split(\"\\n\").find((l) => l.startsWith(\"data: \"));\n if (!line)\n continue;\n const payload = line.slice(\"data: \".length);\n if (payload === \"[DONE]\")\n continue;\n return JSON.parse(payload) as T;\n }\n const { value, done } = await reader.read();\n if (done)\n return null;\n buffer += decoder.decode(value, { stream: true });\n }\n }\n return { next };\n}\nfunction isRecord(v: unknown): v is globalThis.Record<string, unknown> {\n return typeof v === \"object\" && v !== null;\n}\n/** Claude Agent SDK 的原生 Bash tool 只交付 shell source,不交付 argv。 */\nfunction commandProjectionForClaudeSdkTool(name: string): CommandProjection | undefined {\n return name === \"Bash\" ? opaqueCommandProjection(\"unsupported-protocol\") : undefined;\n}\n// ───────────────────────── Claude Agent SDK:SDKMessage ─────────────────────────\n/** 只声明转换器要读的字段;真实的 SDKMessage 直接喂进来即可。 */\nexport interface ClaudeSdkMessageLike {\n type: string;\n subtype?: string;\n session_id?: string;\n tool_use_id?: string;\n is_error?: boolean;\n num_turns?: number;\n total_cost_usd?: number;\n usage?: {\n input_tokens: number;\n output_tokens: number;\n cache_read_input_tokens?: number | null;\n cache_creation_input_tokens?: number | null;\n };\n message?: {\n content?: unknown;\n };\n [key: string]: unknown;\n}\nexport interface ClaudeSdkStream {\n /** 逐帧喂 `SDKMessage`,返回这一帧派生的标准事件;认不出的帧(stream_event 等)返回 []。 */\n add(message: ClaudeSdkMessageLike): StreamEvent[];\n /** `system`/`init` 帧带回的 session_id(首帧之后可读),回写 `ctx.session.id` 用。 */\n readonly sessionId: string | undefined;\n /** `result` 帧的聚合用量。 */\n readonly usage: Usage | undefined;\n /** `result` 帧报了 is_error。 */\n readonly failed: boolean;\n /**\n * 拒绝审批后续读前登记:该 tool_use 的 `tool_result` / `permission_denied` 落成\n * `status: \"rejected\"`(而不是 failed),且两种帧只产一条 operation.finished。\n */\n markRejected(toolUseId: string): void;\n}\n/**\n * Claude Agent SDK 消息流(`system` / `assistant` / `user` / `result`)→ 标准事件。\n * `assistant` 的 text/thinking/tool_use 块 → message / thinking / operation.started;`user` 的\n * tool_result 块 → operation.finished;`system`/`permission_denied` → rejected;`stream_event`\n * (逐 token 渲染)整个忽略。HITL 的停轮判定(哪个工具被门控)是应用侧的知识,不在这里——\n * 扫描 add() 返回的 operation.started 自行决定。\n */\n// @concord-code ne-adapter-claude-sdk-stream\n// @concord-implements docs/feature/adapters/library/streaming.md\n// @concord-implements docs/feature/adapters/sdk/claude-agent-sdk/README.md\nexport function createClaudeSdkEventStream(): ClaudeSdkStream {\n let sessionId: string | undefined;\n let usage: Usage | undefined;\n let failed = false;\n const resolvedCallIds = new Set<string>();\n const rejected = new Set<string>();\n const toolResultText = (content: unknown): string | undefined => {\n if (typeof content === \"string\")\n return content;\n if (Array.isArray(content)) {\n return content\n .filter((b): b is {\n type: \"text\";\n text: string;\n } => isRecord(b) && b.type === \"text\" && typeof b.text === \"string\")\n .map((b) => b.text)\n .join(\"\");\n }\n return undefined;\n };\n return {\n get sessionId() {\n return sessionId;\n },\n get usage() {\n return usage;\n },\n get failed() {\n return failed;\n },\n markRejected(toolUseId) {\n rejected.add(toolUseId);\n },\n add(frame) {\n const events: StreamEvent[] = [];\n switch (frame.type) {\n case \"system\": {\n if (frame.subtype === \"init\" && typeof frame.session_id === \"string\") {\n sessionId ??= frame.session_id;\n }\n else if (frame.subtype === \"permission_denied\" && typeof frame.tool_use_id === \"string\") {\n if (!resolvedCallIds.has(frame.tool_use_id)) {\n resolvedCallIds.add(frame.tool_use_id);\n events.push({ type: \"operation.finished\", operationId: frame.tool_use_id, kind: \"tool\", status: \"rejected\" });\n }\n }\n break;\n }\n case \"assistant\": {\n const content: unknown[] = Array.isArray(frame.message?.content) ? frame.message.content : [];\n for (const block of content) {\n if (!isRecord(block))\n continue;\n if (block.type === \"text\" && typeof block.text === \"string\" && block.text) {\n events.push({ type: \"message\", role: \"assistant\", text: block.text });\n }\n else if (block.type === \"thinking\" && typeof block.thinking === \"string\" && block.thinking) {\n events.push({ type: \"thinking\", text: block.thinking });\n }\n else if (block.type === \"tool_use\" && typeof block.id === \"string\" && typeof block.name === \"string\") {\n const command = commandProjectionForClaudeSdkTool(block.name);\n events.push({\n type: \"operation.started\",\n operationId: block.id,\n operation: {\n kind: \"tool\",\n name: block.name,\n input: block.input as JsonValue,\n tool: normalizeToolName(block.name, CLAUDE_TOOL_ALIASES),\n ...(command === undefined ? {} : { command }),\n },\n });\n }\n }\n break;\n }\n case \"user\": {\n const content: unknown[] = Array.isArray(frame.message?.content) ? frame.message.content : [];\n for (const block of content) {\n if (!isRecord(block) || block.type !== \"tool_result\" || typeof block.tool_use_id !== \"string\")\n continue;\n if (resolvedCallIds.has(block.tool_use_id))\n continue;\n resolvedCallIds.add(block.tool_use_id);\n events.push({\n type: \"operation.finished\",\n operationId: block.tool_use_id,\n kind: \"tool\",\n output: toolResultText(block.content) as JsonValue,\n status: rejected.has(block.tool_use_id) ? \"rejected\" : block.is_error ? \"failed\" : \"completed\",\n });\n }\n break;\n }\n case \"result\": {\n failed = frame.is_error === true;\n if (frame.usage) {\n usage = {\n inputTokens: frame.usage.input_tokens,\n outputTokens: frame.usage.output_tokens,\n cacheReadTokens: frame.usage.cache_read_input_tokens ?? undefined,\n cacheCreationTokens: frame.usage.cache_creation_input_tokens ?? undefined,\n requests: frame.num_turns,\n costUSD: frame.total_cost_usd,\n };\n }\n break;\n }\n // stream_event(逐 token 渲染)与其它系统/生命周期消息:无对应 StreamEvent。\n default:\n break;\n }\n return events;\n },\n };\n}\n// ───────────────────────── pi-agent-core:AgentEvent ─────────────────────────\nexport interface PiAgentEventLike {\n type: string;\n toolCallId?: string;\n toolName?: string;\n args?: unknown;\n result?: unknown;\n isError?: boolean;\n /** content 在 user 消息上是 string、assistant 消息上是 parts 数组——按 unknown 收,防御式解析。 */\n message?: {\n role?: string;\n content?: unknown;\n /** assistant 消息的收尾原因;\"error\" / \"aborted\" 表示这条消息以失败告终。 */\n stopReason?: string;\n /** stopReason 为 \"error\" 时的错误说明。 */\n errorMessage?: string;\n usage?: {\n input: number;\n output: number;\n cacheRead: number;\n cacheWrite: number;\n cost: {\n total: number;\n };\n };\n };\n /** `message_update` 帧携带的增量事件(text_delta / thinking_delta 等)——只读 type/delta,防御式解析。 */\n assistantMessageEvent?: {\n type?: string;\n delta?: unknown;\n [key: string]: unknown;\n };\n [key: string]: unknown;\n}\nexport interface PiAgentStream {\n /** 逐帧喂 `AgentEvent`,返回这一帧派生的标准事件;生命周期帧(turn_start 等)返回 []。 */\n add(event: PiAgentEventLike): StreamEvent[];\n /** assistant `message_end` 逐条累加的用量。 */\n readonly usage: Usage | undefined;\n /** assistant 消息以 stopReason \"error\" / \"aborted\" 收尾过。 */\n readonly failed: boolean;\n /** 拒绝审批后续读前登记:该调用 `tool_execution_end` 的 isError 判成 \"rejected\" 而非 \"failed\"。 */\n markRejected(toolCallId: string): void;\n}\n/**\n * pi-agent-core 事件流(`message_start` / `message_update` / `message_end` /\n * `tool_execution_start` / `tool_execution_end`)→ 标准事件。消息三段式聚合成一条:\n * message_start 清空增量缓冲、message_update 的 text_delta / thinking_delta 逐段累加、\n * message_end 落地成 message / thinking(优先取 end 帧的完整 content,缺了用累加的增量兜底);\n * 只有 start/delta 的截断流不产出半条消息。message_end 同时累加 usage;assistant 消息以\n * stopReason \"error\" / \"aborted\" 收尾时记失败(`failed`)并发一条 error 事件。\n * tool_execution_start/end → operation.started / operation.finished。\n */\n// @concord-code ne-adapter-pi-event-stream\n// @concord-implements docs/feature/adapters/library/streaming.md\n// @concord-implements docs/feature/adapters/sdk/pi-agent-core/README.md\nexport function createPiAgentEventStream(): PiAgentStream {\n let usage: Usage | undefined;\n let failed = false;\n // message_start/update 累加的增量缓冲;message_end 落地后清空,截断流(无 end)不落地。\n let deltaText = \"\";\n let deltaThinking = \"\";\n const rejected = new Set<string>();\n const partText = (event: PiAgentEventLike, type: \"text\" | \"thinking\"): string => {\n if (event.message?.role !== \"assistant\" || !Array.isArray(event.message.content))\n return \"\";\n return event.message.content\n .filter((part): part is globalThis.Record<string, unknown> => isRecord(part) && part.type === type)\n .map((part) => {\n const v = type === \"text\" ? part.text : part.thinking;\n return typeof v === \"string\" ? v : \"\";\n })\n .join(\"\");\n };\n return {\n get usage() {\n return usage;\n },\n get failed() {\n return failed;\n },\n markRejected(toolCallId) {\n rejected.add(toolCallId);\n },\n add(event) {\n const events: StreamEvent[] = [];\n switch (event.type) {\n case \"message_start\": {\n // 新消息开始:上一条没等到 message_end 的增量作废(不落地半条消息)。\n deltaText = \"\";\n deltaThinking = \"\";\n break;\n }\n case \"message_update\": {\n const e = event.assistantMessageEvent;\n if (isRecord(e) && typeof e.delta === \"string\") {\n if (e.type === \"text_delta\")\n deltaText += e.delta;\n else if (e.type === \"thinking_delta\")\n deltaThinking += e.delta;\n }\n break;\n }\n case \"message_end\": {\n // 优先取 end 帧的完整 content;缺了(部分传输只带增量)用累加的 delta 兜底。\n const text = partText(event, \"text\") || (event.message?.role === \"assistant\" ? deltaText : \"\");\n if (text)\n events.push({ type: \"message\", role: \"assistant\", text });\n const thinking = partText(event, \"thinking\") || (event.message?.role === \"assistant\" ? deltaThinking : \"\");\n if (thinking)\n events.push({ type: \"thinking\", text: thinking });\n deltaText = \"\";\n deltaThinking = \"\";\n if (event.message?.role === \"assistant\") {\n const stopReason = event.message.stopReason;\n if (stopReason === \"error\" || stopReason === \"aborted\") {\n failed = true;\n events.push({ type: \"error\", message: event.message.errorMessage ?? `pi agent stopReason=${stopReason}` });\n }\n }\n const u = event.message?.role === \"assistant\" ? event.message.usage : undefined;\n if (u) {\n // pi computes u.cost from its own model price table. That estimate\n // is not provider-observed billing and must not enter Usage.costUSD.\n usage = {\n inputTokens: (usage?.inputTokens ?? 0) + u.input,\n outputTokens: (usage?.outputTokens ?? 0) + u.output,\n cacheReadTokens: (usage?.cacheReadTokens ?? 0) + u.cacheRead,\n cacheCreationTokens: (usage?.cacheCreationTokens ?? 0) + u.cacheWrite,\n requests: (usage?.requests ?? 0) + 1,\n };\n }\n break;\n }\n case \"tool_execution_start\": {\n if (typeof event.toolCallId === \"string\" && typeof event.toolName === \"string\") {\n events.push({\n type: \"operation.started\",\n operationId: event.toolCallId,\n operation: { kind: \"tool\", name: event.toolName, input: event.args as JsonValue },\n });\n }\n break;\n }\n case \"tool_execution_end\": {\n if (typeof event.toolCallId === \"string\") {\n const status = event.isError ? (rejected.has(event.toolCallId) ? \"rejected\" : \"failed\") : \"completed\";\n events.push({ type: \"operation.finished\", operationId: event.toolCallId, kind: \"tool\", output: event.result as JsonValue, status });\n }\n break;\n }\n // agent_start / turn_start / turn_end / tool_execution_update / agent_end:\n // 无对应 StreamEvent(消息文本统一在 message_end 落地)。\n default:\n break;\n }\n return events;\n },\n };\n}\n// ───────────────────────── Codex SDK:ThreadEvent ─────────────────────────\nexport interface CodexThreadEventLike {\n type: string;\n message?: string;\n thread_id?: string;\n item?: {\n type?: string;\n text?: string;\n message?: string;\n [key: string]: unknown;\n };\n error?: {\n message: string;\n };\n [key: string]: unknown;\n}\nexport interface CodexThreadStream {\n /**\n * 逐帧喂 `ThreadEvent`,返回标准事件:消息类(agent_message → message、reasoning → thinking、\n * error item / turn.failed / 顶层 error → error)+ 工具项(command_execution / mcp_tool_call / web_search /\n * file_change → operation.started + operation.finished,附规范工具名 `tool`,如 command_execution →\n * `\"shell\"`,供 `calledTool(\"shell\")` 这类跨 agent 断言命中)。usage 从 `turn.completed` 聚合,经 `usage` 读。\n * 断言依据全部来自这条流;codex CLI 的原生 OTLP span 只用于瀑布图(spanMapper: mapCodexSpans)。\n */\n add(event: CodexThreadEventLike): StreamEvent[];\n /** `thread.started` 带回的 thread_id,回写 `ctx.session.id` 用。 */\n readonly threadId: string | undefined;\n /** `turn.completed` 聚合的用量(input/cached/output tokens)。 */\n readonly usage: Usage | undefined;\n /** turn.failed 或顶层不可恢复 error 出现过;非致命 error item 只保留诊断。 */\n readonly failed: boolean;\n}\n/** Codex SDK 线程事件流(`thread.started` / `item.*` / `turn.completed` / `turn.failed`)→ 标准事件。 */\n// @concord-code ne-adapter-codex-thread-stream\n// @concord-implements docs/feature/adapters/library/streaming.md\n// @concord-implements docs/feature/adapters/sdk/codex-sdk/README.md\nexport function createCodexThreadEventStream(): CodexThreadStream {\n let threadId: string | undefined;\n let usage: Usage | undefined;\n let failed = false;\n // item.started 已发 operation.started 的 id;item.completed 时不重发,只补 result。\n const startedCallIds = new Set<string>();\n let synth = 0;\n const callIdOf = (item: globalThis.Record<string, unknown>, prefix: string): string => {\n const id = item.id;\n return typeof id === \"string\" || typeof id === \"number\" ? String(id) : `${prefix}_${++synth}`;\n };\n // 工具项 → operation.started(+completed 时的 operation.finished)。与 o11y/parsers/codex.ts 的\n // transcript 映射保持同一套语义(字段名以 codex exec --json 的 ThreadItem 为准),\n // 包括规范工具名 tool:少了它 derive 只能落 name=\"unknown\",calledTool(\"shell\") 这类\n // 跨 agent 规范名断言在 SDK 流路径上会静默失配(2026-07-09 CI 实红)。\n const handleToolItem = (item: globalThis.Record<string, unknown>, isCompleted: boolean): StreamEvent[] => {\n const events: StreamEvent[] = [];\n const emitCall = (callId: string, name: string, input: JsonValue, tool: ToolName, command: CommandProjection): void => {\n if (startedCallIds.has(callId))\n return;\n startedCallIds.add(callId);\n events.push({ type: \"operation.started\", operationId: callId, operation: { kind: \"tool\", name, input, tool, command } });\n };\n switch (item.type) {\n case \"command_execution\": {\n const callId = callIdOf(item, \"cmd\");\n emitCall(callId, \"command_execution\", { command: item.command ?? null } as JsonValue, \"shell\", opaqueCommandProjection(\"unsupported-protocol\"));\n if (isCompleted) {\n const exit = item.exit_code ?? item.exitCode;\n const output = item.aggregated_output ?? item.aggregatedOutput ?? item.output;\n const status = item.status === \"declined\" || item.status === \"rejected\"\n ? \"rejected\" as const\n : exit === 0 || (exit == null && item.status !== \"failed\" && item.status !== \"error\")\n ? \"completed\" as const\n : \"failed\" as const;\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n ...(output === undefined && exit === undefined\n ? {}\n : { output: { output: (output ?? null) as JsonValue, exit_code: (exit ?? null) as JsonValue } }),\n status,\n });\n }\n return events;\n }\n case \"mcp_tool_call\": {\n const callId = callIdOf(item, \"mcp\");\n const tool = String(item.tool ?? \"unknown\");\n const name = typeof item.server === \"string\" ? `${item.server}.${tool}` : tool;\n emitCall(callId, name, (item.arguments ?? null) as JsonValue, normalizeToolName(tool, CODEX_TOOL_ALIASES), notCommandProjection());\n if (isCompleted) {\n const success = !item.error && item.status !== \"failed\";\n events.push({\n type: \"operation.finished\",\n operationId: callId,\n kind: \"tool\",\n output: (item.result ?? null) as JsonValue,\n status: success ? \"completed\" : \"failed\",\n });\n }\n return events;\n }\n case \"web_search\": {\n const callId = callIdOf(item, \"web\");\n emitCall(callId, \"web_search\", { query: item.query ?? null } as JsonValue, \"web_search\", notCommandProjection());\n if (isCompleted) {\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: null, status: \"completed\" });\n }\n return events;\n }\n case \"file_change\": {\n // 补丁类只在 completed 落一次:changes 里每个文件一对 called/result。\n if (!isCompleted)\n return events;\n const baseId = callIdOf(item, \"patch\");\n const changes = Array.isArray(item.changes) ? item.changes : [];\n changes.forEach((ch, i) => {\n const callId = `${baseId}#${i}`;\n const change = isRecord(ch) ? { path: ch.path ?? null, kind: ch.kind ?? null } : {};\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name: \"file_change\",\n input: change as JsonValue,\n tool: \"file_edit\",\n command: notCommandProjection(),\n },\n });\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: change as JsonValue, status: \"completed\" });\n });\n return events;\n }\n default:\n return events;\n }\n };\n return {\n get threadId() {\n return threadId;\n },\n get usage() {\n return usage;\n },\n get failed() {\n return failed;\n },\n add(event) {\n const events: StreamEvent[] = [];\n switch (event.type) {\n case \"thread.started\": {\n if (typeof event.thread_id === \"string\")\n threadId ??= event.thread_id;\n break;\n }\n case \"item.started\": {\n if (event.item)\n events.push(...handleToolItem(event.item, false));\n break;\n }\n case \"item.completed\": {\n const item = event.item;\n if (!item)\n break;\n if (item.type === \"agent_message\" && typeof item.text === \"string\" && item.text) {\n events.push({ type: \"message\", role: \"assistant\", text: item.text });\n }\n else if (item.type === \"reasoning\" && typeof item.text === \"string\" && item.text) {\n events.push({ type: \"thinking\", text: item.text });\n }\n else if (item.type === \"error\" && typeof item.message === \"string\") {\n events.push({ type: \"error\", message: item.message });\n }\n else {\n events.push(...handleToolItem(item, true));\n }\n break;\n }\n case \"turn.completed\": {\n const u = event.usage;\n if (isRecord(u)) {\n const num = (v: unknown): number => (typeof v === \"number\" ? v : 0);\n usage = {\n // codex-rs TokenUsage 的 cached_input_tokens 是 input_tokens 的子集,\n // 落互斥桶前扣掉(docs/feature/adapters/sdk/codex-sdk/cost.md)\n inputTokens: (usage?.inputTokens ?? 0) + Math.max(0, num(u.input_tokens) - num(u.cached_input_tokens)),\n outputTokens: (usage?.outputTokens ?? 0) + num(u.output_tokens),\n cacheReadTokens: (usage?.cacheReadTokens ?? 0) + num(u.cached_input_tokens),\n // codex-rs TokenUsage 结构体同一份字段(与 o11y/parsers/codex.ts 的\n // transcript 解析同源),只在这次 turn 真的带回时累加。\n ...(typeof u.reasoning_output_tokens === \"number\" || usage?.reasoningTokens !== undefined\n ? { reasoningTokens: (usage?.reasoningTokens ?? 0) + num(u.reasoning_output_tokens) }\n : {}),\n requests: (usage?.requests ?? 0) + 1,\n };\n }\n break;\n }\n case \"error\": {\n failed = true;\n if (typeof event.message === \"string\")\n events.push({ type: \"error\", message: event.message });\n break;\n }\n case \"turn.failed\": {\n failed = true;\n if (event.error?.message)\n events.push({ type: \"error\", message: event.error.message });\n break;\n }\n // item.updated(中间态)/ turn.started:忽略,等 completed。\n default:\n break;\n }\n return events;\n },\n };\n}\n"]}
|
|
@@ -467,6 +467,9 @@ function uiMessageStreamSendEffect(options, input, ctx) {
|
|
|
467
467
|
* });
|
|
468
468
|
* ```
|
|
469
469
|
*/
|
|
470
|
+
// @concord-code ne-adapter-ui-message-stream-agent
|
|
471
|
+
// @concord-implements docs/feature/adapters/README.md
|
|
472
|
+
// @concord-implements docs/feature/adapters/sdk/ai-sdk/README.md
|
|
470
473
|
function uiMessageStreamAgent(options) {
|
|
471
474
|
return (0, define_ts_1.makeDirectAgent)({
|
|
472
475
|
name: options.name ?? "ui-message-stream",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ui-message-stream.js","sourceRoot":"","sources":["ui-message-stream.ts"],"names":[],"mappings":";;AA0iBA,oDAQC;AAljBD,iFAAiF;AACjF,EAAE;AACF,8EAA8E;AAC9E,qEAAqE;AACrE,+DAA+D;AAC/D,EAAE;AACF,kDAAkD;AAClD,qEAAqE;AACrE,iEAAiE;AACjE,oFAAoF;AACpF,6BAA6B;AAC7B,kDAAkD;AAClD,gFAAgF;AAChF,0EAA0E;AAC1E,mEAAmE;AACnE,yEAAyE;AACzE,wDAAwD;AACxD,gEAAgE;AAChE,wEAAwE;AACxE,4DAA4D;AAC5D,oBAAoB;AACpB,EAAE;AACF,+DAA+D;AAC/D,eAAe;AACf,6CAAyC;AACzC,mCAAgC;AAChC,4CAA+C;AAC/C,kEAA8D;AAC9D,mEAAqE;AACrE,2DAAqE;AAErE,uDAAsD;AACtD,yEAAgF;AAChF,wFAAwF;AACxF,iFAAiF;AACjF,mFAAmF;AACnF,0DAA0D;AAC1D,MAAM,QAAQ,GAAqB,MAAM,CAAC,MAAM,CAAC;IAC7C,GAAG,sCAAwB;IAC3B,KAAK,EAAE,EAAE,MAAM,EAAE,aAAsB,EAAE,MAAM,EAAE,+CAA+C,EAAE;CACrG,CAAC,CAAC;AAkCH,MAAM,WAAW,GAAG,IAAA,mCAAiB,EAAkB,2BAA2B,CAAC,CAAC;AACpF,MAAM,gBAAgB,GAAG,IAAA,mCAAiB,EAAwB,yBAAyB,CAAC,CAAC;AAK7F,2CAA2C;AAC3C,kDAAkD;AAClD,IAAI,QAEU,CAAC;AACf,SAAS,eAAe;IACpB,OAAO,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;AACvI,CAAC;AACD,kFAAkF;AAClF,SAAS,YAAY;IAGjB,MAAM,OAAO,GAAG,QAAQ,CAAC;IACzB,OAAO,eAAM,CAAC,UAAU,CAAC;QACrB,GAAG,EAAE,GAAG,EAAE;YACN,IAAI,OAAO,KAAK,SAAS;gBACrB,OAAO,OAAO,CAAC;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC;YACvB,MAAM,OAAO,GAAG,uBAAuB,CAAC,SAAS,CAE/C,CAAC;YACH,QAAQ,GAAG,OAAO,CAAC;YACnB,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE;KACjC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QAC3C,QAAQ,GAAG,SAAS,CAAC;IACzB,CAAC,CAAC,CAAC,CAAC,CAAC;AACT,CAAC;AACD,6DAA6D;AAC7D,SAAS,cAAc,CAAC,MAAc,EAAE,UAAgE,EAAE,OAA4C,EAAE,MAAkB;IACtK,SAAS,CAAC;QACN,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,CAAC,CAAC;YACf,OAAO,MAAM,CAAC;QAClB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI;YACL,SAAS;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC;YACT,wEAAwE;YACxE,yEAAyE;YACzE,wEAAwE;YACxE,UAAU,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACL,CAAC;AACD;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAgC,EAAE,OAAwC,EAAE,MAAkB;IACjH,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,eAAe,CAAiC;QACxE,SAAS,CAAC,KAAK,EAAE,UAAU;YACvB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,UAAU;YACZ,iFAAiF;YACjF,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;KACJ,CAAC,CAAC,CAAC;AACR,CAAC;AACD,iEAAiE;AACjE,SAAS,UAAU,CAAC,IAAuB;IACvC,OAAO,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACzE,CAAC;AACD,SAAS,UAAU,CAAC,IAAuB;IACvC,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;QAC5B,OAAO,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AACD,SAAS,mBAAmB,CAAC,IAAuB;IAChD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,oBAAoB,CAAC;AACnE,CAAC;AACD,4EAA4E;AAC5E,SAAS,UAAU,CAAC,IAAY;IAC5B,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AACD,gFAAgF;AAChF,SAAS,gBAAgB,CAAC,SAA+C,EAAE,SAA6B;IACpG,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,IAAI,SAAS,kDAAkD,CAAC,CAAC;IACnI,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC;IAC1C,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAQD,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IACvC,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,cAAc;IACd,eAAe;CAClB,CAAC,CAAC;AACH,gFAAgF;AAChF,SAAS,sBAAsB,CAAC,OAAsB,EAAE,QAAuB,EAAE,GAAiB;IAC9F,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACjB,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE;YAC7D,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;YACpD,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/C,SAAS;QACb,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,EAAE;YACX,SAAS;QACb,IAAI,KAAyB,CAAC;QAC9B,IAAI,CAAC;YACD,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,CAAC;YACH,SAAS;QACb,CAAC;QACD,IAAI,KAAK,KAAK,SAAS;YACnB,SAAS;QACb,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;AACL,CAAC;AACD;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAsB,EAAE,QAAuB,EAAE,kBAAqE;IAC5I,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACvB,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,SAAS;QACb,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACjB,SAAS;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7C,SAAS;QACb,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAc,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,EAAE;YACf,IAAI,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;gBACjC,OAAO;YACX,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EAAE,MAAM;gBACnB,SAAS,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI;oBACJ,KAAK;oBACL,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;iBAChD;aACJ,CAAC,CAAC;YACH,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,kBAAkB,EAAE,CAAC;YACpC,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAmB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACtI,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aACI,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;YACrC,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzH,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aACI,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe;YACnC,CAAC,IAAI,CAAC,KAAK,KAAK,oBAAoB,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,KAAK,KAAK,CAAC,EAAE,CAAC;YAC7E,2CAA2C;YAC3C,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACnG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aACI,IAAI,IAAI,CAAC,KAAK,KAAK,oBAAoB,EAAE,CAAC;YAC3C,KAAK,EAAE,CAAC;QACZ,CAAC;QACD,oDAAoD;IACxD,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,IAAI,EAAE;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACvE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;IACnC,OAAO,MAAM,CAAC;AAClB,CAAC;AA+BD,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AAM1D,iDAAiD;AACjD,SAAS,aAAa,CAAQ,GAAgD;IAC1E,OAAO,eAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AACD,SAAS,gBAAgB,CAAC,OAAoC,EAAE,GAAiB;IAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,OAAO,OAAO,GAAG,KAAK,UAAU;QAC5B,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,eAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AACD,SAAS,oBAAoB,CAAC,OAAoC,EAAE,GAAiB;IACjF,OAAO,eAAM,CAAC,GAAG,CAAC;QACd,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACjG,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;KAC1B,CAAC,CAAC;AACP,CAAC;AACD,SAAS,mBAAmB;IACxB,OAAO,eAAM,CAAC,cAAc,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAClI,CAAC;AACD,SAAS,0BAA0B,CAAQ,MAA6B;IACpE,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,EAAE,eAAM,CAAC,MAAM,CAAC,CAAC;AACrG,CAAC;AACD,SAAS,eAAe,CAAC,OAAoC,EAAE,KAAgB,EAAE,GAAiB;IAC9F,4CAA4C;IAC5C,4CAA4C;IAC5C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC5D,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,EAAE,GAAG,QAAQ,IAAA,wBAAU,GAAE,EAAE,CAAC;QAC5B,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC;QACxB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB;IACrD,CAAC;IACD,MAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,WAAW,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChH,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC7B,6DAA6D;QAC7D,qDAAqD;QACrD,0DAA0D;QAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC;QACrE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,WAAW,CAAC,QAAQ,EAAE,EAAE;YAC5H,CAAC,CAAC;gBACE,GAAG,IAAI;gBACP,KAAK,EAAE,oBAAoB;gBAC3B,QAAQ,EAAE;oBACN,EAAE,EAAE,WAAW,CAAC,QAAS,CAAC,EAAE;oBAC5B,QAAQ;oBACR,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB,EAAE,CAAC;iBAC7E;aACJ;YACD,CAAC,CAAC,IAAI,CAAC,CAAC;QACZ,MAAM,UAAU,GAAG,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC3D,OAAO;YACH,WAAW;YACX,UAAU;YACV,cAAc,EAAE,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;SAC9D,CAAC;IACN,CAAC;IACD,MAAM,KAAK,GAAwB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,OAAO;QACH,WAAW;QACX,UAAU,EAAE,SAAS;QACrB,cAAc,EAAE,CAAC,GAAG,aAAa,EAAE,EAAE,EAAE,EAAE,IAAA,wBAAU,GAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;KAChF,CAAC;AACN,CAAC;AACD,6FAA6F;AAC7F,SAAS,2BAA2B,CAAC,mBAAwC,EAAE,UAAqC,EAAE,MAA0C,EAAE,SAA0B,EAAE,SAA2C;IACrO,OAAO,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,OAAO;YACd,OAAO,EAAE,CAAC;QACd,IAAI,CAAC;YACD,IAAI,YAAuC,CAAC;YAC5C,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC/E,YAAY,GAAG,OAAO,CAAC;gBACvB,SAAS,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,YAAY,CAAC;QACxB,CAAC;gBACO,CAAC;YACL,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,yBAAyB,CAAC,OAAoC,EAAE,KAAgB,EAAE,GAAiB;IACxG,OAAO,eAAM,CAAC,MAAM,CAAC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACrC,MAAM,EAAE,mBAAmB,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC;YAC/C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,mBAAmB,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;YACjC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBACxB,MAAM,EAAE,MAAM;gBACd,sDAAsD;gBACtD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,YAAY,EAAE,GAAG,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE;gBAC3F,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;gBACnF,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;aAClE,CAAC;YACF,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBACX,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;oBAClB,OAAO,GAAG,CAAC;gBACf,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK;oBAC9B,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;oBAChE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO,IAAA,kCAAe,EAAC;oBACnB,UAAU,EAAE,SAAS;oBACrB,OAAO,EAAE,wBAAwB,GAAG,KAAK,KAAK,4GAA4G;oBAC1J,KAAK,EAAE,IAAA,0CAAsB,EAAC,GAAG,CAAC;iBACrC,CAAC,CAAC;YACP,CAAC;SACJ,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzG,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAA,kCAAe,EAAC;gBACtC,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,QAAQ,GAAG,YAAY,GAAG,CAAC,MAAM,IAAI,YAAY,oHAAoH;gBAC9K,KAAK,EAAE,IAAA,0CAAsB,EAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;aACxD,CAAC,CAAC,CAAC;QACR,CAAC;QACD,MAAM,WAAW,GAGb;YACA,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,SAAS;SACtB,CAAC;QACF,MAAM,WAAW,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE;YACtD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtB,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;QAC/C,CAAC,EAAE,GAAG,EAAE;YACJ,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,CAAC,eAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACrI,MAAM,QAAQ,GAAkB,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ;YAChF,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ;YAC/B,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,GAAG,EAAE,EAAE,iBAAiB,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACtG,QAAQ,CAAC,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,2BAA2B,CAAC,mBAAmB,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;QACvL,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAA,kCAAe,EAAC;gBACtC,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,QAAQ,GAAG,uJAAuJ;aAC9K,CAAC,CAAC,CAAC;QACR,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAA,kCAAe,EAAC;gBACtC,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;oBAC7E,CAAC,CAAC,WAAW,CAAC,QAAQ;oBACtB,CAAC,CAAC,QAAQ,GAAG,qHAAqH;aACzI,CAAC,CAAC,CAAC;QACR,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;YAC9B,GAAG,EAAE,GAAG,EAAE;gBACN,8CAA8C;gBAC9C,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU;oBAC5C,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC;oBACzD,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;gBAClD,OAAO;oBACH,MAAM,EAAE,gBAAgB,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC;oBAC5E,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;iBACxD,CAAC;YACN,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;gBACrB,GAAG,EAAE,GAAG,EAAE;oBACN,MAAM,aAAa,GAAG;wBAClB,GAAG,OAAO,CAAC,MAAM;wBACjB;4BACI,IAAI,EAAE,iBAA0B;4BAChC,OAAO,EAAE;gCACL,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,OAAO,CAAC,UAAU;gCAC9C,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC;gCAC3B,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAc;gCAC3C,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;6BAC/C;yBACJ;qBACJ,CAAC;oBACF,MAAM,gBAAgB,GAAG,IAAA,uDAA+B,EAAC,aAAa,CAAC,CAAC;oBACxE,OAAO;wBACH,MAAM,EAAE,SAAkB;wBAC1B,MAAM,EAAE,aAAa;wBACrB,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;qBAClE,CAAC;gBACN,CAAC;gBACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;aAC1B,CAAC,CAAC;QACP,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ;YAChB,KAAK,CAAC,CAAC,eAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;YACrB,GAAG,EAAE,GAAG,EAAE;gBACN,MAAM,WAAW,GAAG;oBAChB,GAAG,OAAO,CAAC,MAAM;oBACjB,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/F,CAAC;gBACF,MAAM,gBAAgB,GAAG,IAAA,uDAA+B,EAAC,WAAW,CAAC,CAAC;gBACtE,OAAO;oBACH,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,WAAqB;oBAC3E,MAAM,EAAE,WAAW;oBACnB,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;iBAClE,CAAC;YACN,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC,CAAC;IACP,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AACD;;;;;;;;;;;;;GAaG;AACH,SAAgB,oBAAoB,CAAC,OAAoC;IACrE,OAAO,IAAA,2BAAe,EAAC;QACnB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,mBAAmB;QACzC,gBAAgB,EAAE,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,yBAAyB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC;KACvE,CAAC,CAAC;AACP,CAAC","sourcesContent":["// uiMessageStreamAgent():AI SDK UI Message Stream Protocol 的无侵入 HTTP adapter 工厂。\n//\n// 协议:https://ai-sdk.dev/docs/ai-sdk-ui/stream-protocol —— `useChat` 后端的标准 SSE\n// (`data: {UIMessageChunk}\\n\\n`,以 `data: [DONE]\\n\\n` 收尾)。这是「对着一个已部署的\n// AI SDK 应用的 HTTP 接口无侵入接入」:adapter 只 fetch,不 import 被测应用的任何代码。\n//\n// · 会话:协议是服务端零状态、「客户端带全量历史」——工厂用 typed slot 存整份\n// UIMessage[],每轮原样重放;ctx.session.id 未记录时开新 chat id 并 capture 回写。\n// · 事件流:从归约后的 assistant 消息 parts 直构(text → message,tool part 的\n// approval-requested → operation.started,output-available / output-error / 审批拒绝\n// → operation.finished),\n// 不要求应用接 OTel;跨 resume 轮次按 callId / 已报文本长度去重。\n// · HITL:v7 tool approval(`needsApproval` 工具)——part 停在 `approval-requested` 时\n// 整轮 `waiting` + `input.requested`;下一轮输入(approve / yes / 同意 / 批准 开头 =\n// 批准,其余拒绝)翻译成 `approval-responded` 原地改写该 part、原样重发 messages 触发\n// 服务端续跑 —— 和真实前端 `addToolApprovalResponse()` + `sendMessage()` 的协议行为\n// 完全一致,没有单独的 approve 端点。拒绝的调用协议里不会有任何 tool-output 帧\n// (从没真正执行),由工厂合成 `status: \"rejected\"` 的 operation.finished。\n// · chunk 归约用 `ai` 包官方导出的框架无关 reducer `readUIMessageStream`(`useChat`\n// 内部同款),保证重放回服务端的 UIMessage 形状协议正确 —— `ai` 是可选 peer 依赖,\n// 只在用到本工厂时需要安装。\n//\n// tracing / spanMapper 原样透传:应用有 OTel 时接上拿瀑布图(span 只进瀑布图,不喂断言),\n// 事件流始终从协议帧直构。\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 { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport type { Agent, AgentContext, AgentTracing, CommandProjection, EvidenceCoverage, InputResponse, JsonValue, SpanMapper, StreamEvent, TurnInput } from \"../types.ts\";\nimport { createSessionSlot } from \"./session-slot.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\n// UI Message Stream 帧里没有 usage(协议本身不带 token 计数,见 docs/engineering/testing/e2e/README.md\n// 第 2 节);events/actions/messages/status 都直接来自完整归约的协议帧,和 turnFromAiSdk/aiSdkAgent\n// 同等完整——官方 SDK 适配器应声明全通道 complete(docs/feature/adapters/architecture/evidence.md),\n// 这里唯一的例外是协议本身没有的 usage 通道,如实标 unavailable 而不是留成 unknown。\nconst COVERAGE: EvidenceCoverage = Object.freeze({\n ...completeEvidenceCoverage,\n usage: { status: \"unavailable\" as const, reason: \"UI Message Stream frames carry no token usage\" },\n});\n// ───────────────────────── 协议的结构化类型(structural,不依赖 ai 包的类型) ─────────────────────────\n/** UIMessage 的最小结构面:只声明工厂真正要读的字段,其余原样透传。 */\nexport interface UIMessageLike {\n id: string;\n role: string;\n parts: UIMessagePartLike[];\n [key: string]: JsonValue | UIMessagePartLike[] | undefined;\n}\nexport interface UIMessagePartLike {\n type: string;\n state?: string;\n text?: string;\n toolCallId?: string;\n toolName?: string;\n input?: JsonValue;\n output?: JsonValue;\n errorText?: string;\n approval?: {\n id: string;\n approved?: boolean;\n reason?: string;\n };\n [key: string]: JsonValue | undefined;\n}\ninterface UIMessageChunkLike {\n type: string;\n errorText?: string;\n [key: string]: JsonValue | undefined;\n}\ninterface UiMessageSessionState {\n chatId?: string;\n reported?: ReportedState;\n}\nconst historySlot = createSessionSlot<UIMessageLike[]>(\"ui-message-stream/history\");\nconst sessionStateSlot = createSessionSlot<UiMessageSessionState>(\"ui-message-stream/state\");\ntype ReadUIMessageStream = (options: {\n message?: UIMessageLike;\n stream: ReadableStream<UIMessageChunkLike>;\n}) => AsyncIterable<UIMessageLike>;\n// ai 是可选 peer 依赖:动态 import,缺了就把「装什么」直接说清楚。\n// 说明符经变量传入,避免 TS 对字面量模块名做安装检查(niceeval 自身不依赖 ai)。\nlet aiModule: Promise<{\n readUIMessageStream: ReadUIMessageStream;\n}> | undefined;\nfunction missingAiModule(): Error {\n return new Error(\"uiMessageStreamAgent 需要 `ai` 包(AI SDK v5+,协议 reducer readUIMessageStream 来自它)。在你的 eval 项目里安装:npm install -D ai\");\n}\n/** Dynamic import is an SDK Promise boundary; a rejected load is never cached. */\nfunction loadAiEffect(): Effect.Effect<{\n readUIMessageStream: ReadUIMessageStream;\n}, Error> {\n const pending = aiModule;\n return Effect.tryPromise({\n try: () => {\n if (pending !== undefined)\n return pending;\n const specifier = \"ai\";\n const loading = __niceevalDynamicImport(specifier) as Promise<{\n readUIMessageStream: ReadUIMessageStream;\n }>;\n aiModule = loading;\n return loading;\n },\n catch: () => missingAiModule(),\n }).pipe(Effect.tapError(() => Effect.sync(() => {\n aiModule = undefined;\n })));\n}\n// ───────────────────────── SSE 解析 ─────────────────────────\nfunction drainSseEvents(buffer: string, controller: TransformStreamDefaultController<UIMessageChunkLike>, onChunk: (chunk: UIMessageChunkLike) => void, onDone: () => void): string {\n for (;;) {\n const sepIndex = buffer.indexOf(\"\\n\\n\");\n if (sepIndex === -1)\n return buffer;\n const rawEvent = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const line = rawEvent.split(\"\\n\").find((candidate) => candidate.startsWith(\"data: \"));\n if (!line)\n continue;\n const payload = line.slice(\"data: \".length);\n if (payload === \"[DONE]\") {\n onDone();\n // `[DONE]` is the protocol terminal, not an advisory event. Closing the\n // reducer input here prevents frames later in the same network chunk (or\n // later chunks) from manufacturing a successful Turn after termination.\n controller.terminate();\n return \"\";\n }\n const chunk = JSON.parse(payload) as UIMessageChunkLike;\n onChunk(chunk);\n controller.enqueue(chunk);\n }\n}\n/**\n * Build the AI SDK reducer input with native stream composition rather than a hand-owned reader.\n * Scope finalization below aborts/cancels this pipeline, so an interrupted reducer cannot retain a\n * body reader or live HTTP transport.\n */\nfunction toChunkStream(body: ReadableStream<Uint8Array>, onChunk: (c: UIMessageChunkLike) => void, onDone: () => void): ReadableStream<UIMessageChunkLike> {\n const decoder = new TextDecoder();\n let buffer = \"\";\n return body.pipeThrough(new TransformStream<Uint8Array, UIMessageChunkLike>({\n transform(value, controller) {\n buffer += decoder.decode(value, { stream: true });\n buffer = drainSseEvents(buffer, controller, onChunk, onDone);\n },\n flush(controller) {\n // Keep the original protocol rule: only a completed `\\n\\n` record is observable.\n buffer = drainSseEvents(buffer, controller, onChunk, onDone);\n },\n }));\n}\n// ───────────────────────── parts → 事件 ─────────────────────────\nfunction isToolPart(part: UIMessagePartLike): boolean {\n return part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\");\n}\nfunction toolNameOf(part: UIMessagePartLike): string {\n if (part.type === \"dynamic-tool\")\n return part.toolName ?? \"dynamic-tool\";\n return part.type.slice(\"tool-\".length);\n}\nfunction isApprovalRequested(part: UIMessagePartLike): boolean {\n return isToolPart(part) && part.state === \"approval-requested\";\n}\n/** 和 aiSdkAgent 同一词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准。 */\nfunction isApproved(text: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(text.trim());\n}\n/** 按 requestId 从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved,没答到直接报错。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string | undefined): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId ?? \"unknown\"}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text ?? \"\");\n}\n/** 已报告的进度:resume 续跑的是同一条 assistant 消息,跨轮去重靠它。 */\ninterface ReportedState {\n startedCalls: Set<string>;\n finishedCalls: Set<string>;\n liveProgressCalls: Set<string>;\n textLen: number;\n}\nconst COMPLETE_TOOL_INPUT_STATES = new Set([\n \"input-available\",\n \"approval-requested\",\n \"approval-responded\",\n \"output-available\",\n \"output-error\",\n \"output-denied\",\n]);\n/** Project only reducer-owned messages whose tool input is already complete. */\nfunction reportLiveToolProgress(message: UIMessageLike, reported: ReportedState, ctx: AgentContext): void {\n for (const part of message.parts) {\n if (!isToolPart(part) ||\n !COMPLETE_TOOL_INPUT_STATES.has(part.state ?? \"\") ||\n typeof part.toolCallId !== \"string\" || part.toolCallId === \"\" ||\n !Object.prototype.hasOwnProperty.call(part, \"input\") ||\n reported.liveProgressCalls.has(part.toolCallId))\n continue;\n const name = toolNameOf(part);\n if (name === \"\")\n continue;\n let input: string | undefined;\n try {\n input = JSON.stringify(part.input);\n }\n catch {\n continue;\n }\n if (input === undefined)\n continue;\n reported.liveProgressCalls.add(part.toolCallId);\n ctx.progress({ message: `tool: ${name} ${input}` });\n }\n}\n/**\n * 从归约后的最终消息派生本轮事件。工具事件按 part 顺序;文本合并成一条 message 事件\n * (resume 轮只报新增的后缀)。停在 approval-requested 的调用先报 started,\n * 因此它在审批轮是 pending;裁决后的续跑轮只补 finished,落成 completed 或 rejected。\n */\nfunction deriveTurnEvents(message: UIMessageLike, reported: ReportedState, projectToolCommand: UiMessageStreamAgentOptions[\"projectToolCommand\"]): StreamEvent[] {\n const events: StreamEvent[] = [];\n let fullText = \"\";\n for (const part of message.parts) {\n if (part.type === \"text\") {\n fullText += part.text ?? \"\";\n continue;\n }\n if (!isToolPart(part))\n continue;\n const callId = part.toolCallId ?? \"\";\n if (!callId || reported.finishedCalls.has(callId))\n continue;\n const name = toolNameOf(part);\n const input = (part.input ?? null) as JsonValue;\n const start = () => {\n if (reported.startedCalls.has(callId))\n return;\n const command = projectToolCommand?.({ name, input });\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name,\n input,\n ...(command === undefined ? {} : { command }),\n },\n });\n reported.startedCalls.add(callId);\n };\n if (part.state === \"output-available\") {\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: part.output as JsonValue, status: \"completed\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"output-error\") {\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: part.errorText, status: \"failed\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"output-denied\" ||\n (part.state === \"approval-responded\" && part.approval?.approved === false)) {\n // 拒绝的调用从没真正执行,协议里不会再有它的任何帧 —— 在裁决落地的这一轮合成。\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", status: \"rejected\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"approval-requested\") {\n start();\n }\n // input-* 中间态还没有可信的完整入参,等 approval-requested 或终态再报。\n }\n const newText = fullText.slice(reported.textLen);\n if (newText.trim())\n events.push({ type: \"message\", role: \"assistant\", text: newText });\n reported.textLen = fullText.length;\n return events;\n}\n// ───────────────────────── 工厂 ─────────────────────────\nexport interface UiMessageStreamAgentOptions {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ui-message-stream\"。 */\n name?: string;\n /** 被测应用的 chat 端点(完整 URL,应用在哪部署就指哪);函数形式每轮解析。 */\n url: string | ((ctx: AgentContext) => string | Promise<string>);\n /** 附加请求头(鉴权等);`ctx.telemetry.headers`(traceparent)总会自动并入。 */\n headers?: globalThis.Record<string, string> | ((ctx: AgentContext) => globalThis.Record<string, string>);\n /** 除 `messages` 外并入请求体的字段,如 `(ctx) => ({ model: ctx.model })`(undefined 字段序列化时自动丢弃)。 */\n body?: (ctx: AgentContext) => globalThis.Record<string, JsonValue | undefined>;\n /**\n * 由 endpoint owner 逐笔把逻辑工具调用分类为 command 或 not-command。\n * 未知调用返回 undefined 并保持 actions coverage partial;NiceEval 不按名称或 input 猜测。\n */\n projectToolCommand?: (tool: Readonly<{\n name: string;\n input: JsonValue;\n }>) => CommandProjection | undefined;\n /**\n * 拒绝审批时随 `approval-responded` 带出的理由。应用/SDK 会把它作为模型看到的工具结果\n * 文本 —— 写清楚「不要重试」能明显降低模型原样重发同一调用的概率(实测)。\n */\n denyReason?: string;\n /** 流结束后再等这么久才返回(毫秒),给应用侧的观测导出(如 BatchSpanProcessor)留时间。 */\n settleMs?: number;\n /** 应用有 OTel 时的端点投递方式(拿瀑布图);事件流不依赖它。 */\n tracing?: AgentTracing;\n /** 应用有 OTel 时的 span 归一函数(拿瀑布图);事件流不依赖它。 */\n spanMapper?: SpanMapper;\n}\nconst DEFAULT_DENY_REASON = \"用户拒绝了这次调用,不要重试,直接告知用户操作未执行。\";\ninterface PreparedUiMessageStreamSend {\n readonly bookkeeping: UiMessageSessionState;\n readonly messagesToSend: UIMessageLike[];\n readonly resumeFrom: UIMessageLike | undefined;\n}\n/** External SDK / transport Promise boundary. */\nfunction promiseEffect<Value>(run: (signal: AbortSignal) => PromiseLike<Value>): Effect.Effect<Value, unknown> {\n return Effect.tryPromise({ try: run, catch: (cause) => cause });\n}\nfunction resolveUrlEffect(options: UiMessageStreamAgentOptions, ctx: AgentContext): Effect.Effect<string, unknown> {\n const url = options.url;\n return typeof url === \"function\"\n ? promiseEffect(() => Promise.resolve(url(ctx)))\n : Effect.succeed(url);\n}\nfunction resolveHeadersEffect(options: UiMessageStreamAgentOptions, ctx: AgentContext): Effect.Effect<globalThis.Record<string, string>, unknown> {\n return Effect.try({\n try: () => typeof options.headers === \"function\" ? options.headers(ctx) : (options.headers ?? {}),\n catch: (cause) => cause,\n });\n}\nfunction transportController() {\n return Effect.acquireRelease(Effect.sync(() => new AbortController()), (controller) => Effect.sync(() => controller.abort()));\n}\nfunction cancelReadableStreamEffect<Value>(stream: ReadableStream<Value>): Effect.Effect<void> {\n return promiseEffect(() => stream.cancel()).pipe(Effect.catch(() => Effect.void), Effect.asVoid);\n}\nfunction prepareMessages(options: UiMessageStreamAgentOptions, input: TurnInput, ctx: AgentContext): PreparedUiMessageStreamSend {\n // 会话续接是「客户端带全量历史」模式:历史与协议簿记各用一个 typed slot,\n // 新线自然两者都为空;相同名字不会让其它 Adapter 的 slot 与它们碰撞。\n const priorMessages = ctx.session.get(historySlot) ?? [];\n const bookkeeping = ctx.session.get(sessionStateSlot) ?? {};\n ctx.session.set(sessionStateSlot, bookkeeping);\n let id = bookkeeping.chatId;\n if (!id) {\n id = `uims-${randomUUID()}`;\n bookkeeping.chatId = id;\n ctx.session.capture(id); // 镜像:t.sessionId / 报告可见\n }\n const lastMessage = priorMessages.at(-1);\n const pendingPart = lastMessage?.role === \"assistant\" ? lastMessage.parts.find(isApprovalRequested) : undefined;\n if (pendingPart && lastMessage) {\n // HITL 续跑:不追加新 user 消息 —— 把停在 approval-requested 的 part 原地改成\n // approval-responded,原样重发,服务端续跑同一条被打断的 assistant 消息。\n // 裁决按 requestId 从 input.responses 对位读取(t.respond 的结构化回答)。\n const requestId = pendingPart.approval?.id ?? pendingPart.toolCallId;\n const approved = approvalDecision(input.responses, requestId);\n const mutatedParts = lastMessage.parts.map((part) => isApprovalRequested(part) && part.approval?.id === pendingPart.approval?.id\n ? {\n ...part,\n state: \"approval-responded\",\n approval: {\n id: pendingPart.approval!.id,\n approved,\n ...(approved ? {} : { reason: options.denyReason ?? DEFAULT_DENY_REASON }),\n },\n }\n : part);\n const resumeFrom = { ...lastMessage, parts: mutatedParts };\n return {\n bookkeeping,\n resumeFrom,\n messagesToSend: [...priorMessages.slice(0, -1), resumeFrom],\n };\n }\n const parts: UIMessagePartLike[] = [{ type: \"text\", text: input.text }];\n for (const file of input.files ?? []) {\n parts.push({ type: \"file\", mediaType: file.mimeType, url: `data:${file.mimeType};base64,${file.dataBase64}` });\n }\n return {\n bookkeeping,\n resumeFrom: undefined,\n messagesToSend: [...priorMessages, { id: randomUUID(), role: \"user\", parts }],\n };\n}\n/** Consume the SDK's native async iterator only inside its named Effect Promise boundary. */\nfunction reduceUiMessageStreamEffect(readUIMessageStream: ReadUIMessageStream, resumeFrom: UIMessageLike | undefined, stream: ReadableStream<UIMessageChunkLike>, transport: AbortController, onMessage: (message: UIMessageLike) => void): Effect.Effect<UIMessageLike | undefined, unknown> {\n return promiseEffect(async (signal) => {\n const onAbort = () => transport.abort(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted)\n onAbort();\n try {\n let finalMessage: UIMessageLike | undefined;\n for await (const message of readUIMessageStream({ message: resumeFrom, stream })) {\n finalMessage = message;\n onMessage(message);\n }\n return finalMessage;\n }\n finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n });\n}\nfunction uiMessageStreamSendEffect(options: UiMessageStreamAgentOptions, input: TurnInput, ctx: AgentContext): Effect.Effect<import(\"../types.ts\").Turn, unknown> {\n return Effect.scoped(Effect.gen(function* () {\n const { readUIMessageStream } = yield* loadAiEffect();\n const prepared = yield* Effect.try({\n try: () => prepareMessages(options, input, ctx),\n catch: (cause) => cause,\n });\n const url = yield* resolveUrlEffect(options, ctx);\n const extraHeaders = yield* resolveHeadersEffect(options, ctx);\n const transport = yield* transportController();\n const res = yield* Effect.tryPromise({\n try: (signal) => fetch(url, {\n method: \"POST\",\n // traceparent 随请求带过去:应用埋点支持 context 传播时,span 归属精确到本轮。\n headers: { \"content-type\": \"application/json\", ...extraHeaders, ...ctx.telemetry?.headers },\n body: JSON.stringify({ ...options.body?.(ctx), messages: prepared.messagesToSend }),\n signal: AbortSignal.any([ctx.signal, signal, transport.signal]),\n }),\n catch: (err) => {\n if (ctx.signal.aborted)\n return err;\n const cause = err instanceof Error\n ? (err.cause instanceof Error ? err.cause.message : err.message)\n : String(err);\n return makeSendFailure({\n acceptance: \"unknown\",\n message: `Could not connect to ${url} (${cause}). Is the app under test running? Start it yourself first, or point url at a deployed instance via config.`,\n cause: normalizeExternalCause(err),\n });\n },\n });\n const responseBody = res.body;\n if (!res.ok || !responseBody) {\n const responseText = yield* promiseEffect(() => res.text()).pipe(Effect.catch(() => Effect.succeed(\"\")));\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: `POST ${url} failed: ${res.status} ${responseText}. Confirm the app is running and the endpoint speaks the UI Message Stream protocol (the backend useChat expects).`,\n cause: normalizeExternalCause({ status: res.status }),\n }));\n }\n const streamState: {\n sawDone: boolean;\n sawError: string | undefined;\n } = {\n sawDone: false,\n sawError: undefined,\n };\n const chunkStream = toChunkStream(responseBody, (chunk) => {\n if (chunk.type === \"error\")\n streamState.sawError = chunk.errorText;\n }, () => {\n streamState.sawDone = true;\n });\n yield* Effect.addFinalizer(() => Effect.sync(() => transport.abort()).pipe(Effect.andThen(cancelReadableStreamEffect(chunkStream))));\n const reported: ReportedState = prepared.resumeFrom && prepared.bookkeeping.reported\n ? prepared.bookkeeping.reported\n : { startedCalls: new Set(), finishedCalls: new Set(), liveProgressCalls: new Set(), textLen: 0 };\n prepared.bookkeeping.reported = reported;\n const finalMessage = yield* reduceUiMessageStreamEffect(readUIMessageStream, prepared.resumeFrom, chunkStream, transport, (message) => reportLiveToolProgress(message, reported, ctx));\n if (!streamState.sawDone) {\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: `POST ${url} ended before the UI Message Stream [DONE] marker. The response was truncated or the endpoint does not speak the complete UI Message Stream protocol.`,\n }));\n }\n if (!finalMessage) {\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: streamState.sawError !== undefined && streamState.sawError.trim() !== \"\"\n ? streamState.sawError\n : `POST ${url} ended without producing an assistant message. Confirm the endpoint speaks the complete UI Message Stream protocol.`,\n }));\n }\n const derived = yield* Effect.try({\n try: () => {\n // 续跑轮:finalMessage 是同一条消息的完整版,替换末尾半成品;全新轮:追加。\n ctx.session.set(historySlot, prepared.resumeFrom\n ? [...prepared.messagesToSend.slice(0, -1), finalMessage]\n : [...prepared.messagesToSend, finalMessage]);\n return {\n events: deriveTurnEvents(finalMessage, reported, options.projectToolCommand),\n request: finalMessage.parts.find(isApprovalRequested),\n };\n },\n catch: (cause) => cause,\n });\n const request = derived.request;\n if (request) {\n return yield* Effect.try({\n try: () => {\n const waitingEvents = [\n ...derived.events,\n {\n type: \"input.requested\" as const,\n request: {\n id: request.approval?.id ?? request.toolCallId,\n action: toolNameOf(request),\n input: (request.input ?? null) as JsonValue,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n },\n },\n ];\n const evidenceCoverage = unclassifiedToolActionsCoverage(waitingEvents);\n return {\n status: \"waiting\" as const,\n events: waitingEvents,\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n }\n if (options.settleMs)\n yield* Effect.sleep(options.settleMs);\n return yield* Effect.try({\n try: () => {\n const finalEvents = [\n ...derived.events,\n ...(streamState.sawError ? [{ type: \"error\" as const, message: streamState.sawError }] : []),\n ];\n const evidenceCoverage = unclassifiedToolActionsCoverage(finalEvents);\n return {\n status: streamState.sawError ? (\"failed\" as const) : (\"completed\" as const),\n events: finalEvents,\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n }));\n}\n/**\n * UI Message Stream Protocol(AI SDK `useChat` 后端的标准 SSE 协议)的内置无侵入 adapter。\n * 对着已部署应用的 HTTP 端点收发,不 import 应用代码:\n *\n * ```typescript\n * import { uiMessageStreamAgent } from \"niceeval/adapter\";\n *\n * export default uiMessageStreamAgent({\n * name: \"my-assistant\",\n * url: \"https://my-app.example.com/api/chat\",\n * body: (ctx) => ({ model: ctx.model }), // 应用支持请求级选模型时,模型对比零改动\n * });\n * ```\n */\nexport function uiMessageStreamAgent(options: UiMessageStreamAgentOptions): Agent {\n return makeDirectAgent({\n name: options.name ?? \"ui-message-stream\",\n evidenceCoverage: COVERAGE,\n tracing: options.tracing,\n spanMapper: options.spanMapper,\n send: (input, ctx) => uiMessageStreamSendEffect(options, input, ctx),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"ui-message-stream.js","sourceRoot":"","sources":["ui-message-stream.ts"],"names":[],"mappings":";;AA6iBA,oDAQC;AArjBD,iFAAiF;AACjF,EAAE;AACF,8EAA8E;AAC9E,qEAAqE;AACrE,+DAA+D;AAC/D,EAAE;AACF,kDAAkD;AAClD,qEAAqE;AACrE,iEAAiE;AACjE,oFAAoF;AACpF,6BAA6B;AAC7B,kDAAkD;AAClD,gFAAgF;AAChF,0EAA0E;AAC1E,mEAAmE;AACnE,yEAAyE;AACzE,wDAAwD;AACxD,gEAAgE;AAChE,wEAAwE;AACxE,4DAA4D;AAC5D,oBAAoB;AACpB,EAAE;AACF,+DAA+D;AAC/D,eAAe;AACf,6CAAyC;AACzC,mCAAgC;AAChC,4CAA+C;AAC/C,kEAA8D;AAC9D,mEAAqE;AACrE,2DAAqE;AAErE,uDAAsD;AACtD,yEAAgF;AAChF,wFAAwF;AACxF,iFAAiF;AACjF,mFAAmF;AACnF,0DAA0D;AAC1D,MAAM,QAAQ,GAAqB,MAAM,CAAC,MAAM,CAAC;IAC7C,GAAG,sCAAwB;IAC3B,KAAK,EAAE,EAAE,MAAM,EAAE,aAAsB,EAAE,MAAM,EAAE,+CAA+C,EAAE;CACrG,CAAC,CAAC;AAkCH,MAAM,WAAW,GAAG,IAAA,mCAAiB,EAAkB,2BAA2B,CAAC,CAAC;AACpF,MAAM,gBAAgB,GAAG,IAAA,mCAAiB,EAAwB,yBAAyB,CAAC,CAAC;AAK7F,2CAA2C;AAC3C,kDAAkD;AAClD,IAAI,QAEU,CAAC;AACf,SAAS,eAAe;IACpB,OAAO,IAAI,KAAK,CAAC,gHAAgH,CAAC,CAAC;AACvI,CAAC;AACD,kFAAkF;AAClF,SAAS,YAAY;IAGjB,MAAM,OAAO,GAAG,QAAQ,CAAC;IACzB,OAAO,eAAM,CAAC,UAAU,CAAC;QACrB,GAAG,EAAE,GAAG,EAAE;YACN,IAAI,OAAO,KAAK,SAAS;gBACrB,OAAO,OAAO,CAAC;YACnB,MAAM,SAAS,GAAG,IAAI,CAAC;YACvB,MAAM,OAAO,GAAG,uBAAuB,CAAC,SAAS,CAE/C,CAAC;YACH,QAAQ,GAAG,OAAO,CAAC;YACnB,OAAO,OAAO,CAAC;QACnB,CAAC;QACD,KAAK,EAAE,GAAG,EAAE,CAAC,eAAe,EAAE;KACjC,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE;QAC3C,QAAQ,GAAG,SAAS,CAAC;IACzB,CAAC,CAAC,CAAC,CAAC,CAAC;AACT,CAAC;AACD,6DAA6D;AAC7D,SAAS,cAAc,CAAC,MAAc,EAAE,UAAgE,EAAE,OAA4C,EAAE,MAAkB;IACtK,SAAS,CAAC;QACN,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,QAAQ,KAAK,CAAC,CAAC;YACf,OAAO,MAAM,CAAC;QAClB,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;QAC3C,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;QACpC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,CAAC;QACtF,IAAI,CAAC,IAAI;YACL,SAAS;QACb,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC5C,IAAI,OAAO,KAAK,QAAQ,EAAE,CAAC;YACvB,MAAM,EAAE,CAAC;YACT,wEAAwE;YACxE,yEAAyE;YACzE,wEAAwE;YACxE,UAAU,CAAC,SAAS,EAAE,CAAC;YACvB,OAAO,EAAE,CAAC;QACd,CAAC;QACD,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAuB,CAAC;QACxD,OAAO,CAAC,KAAK,CAAC,CAAC;QACf,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;AACL,CAAC;AACD;;;;GAIG;AACH,SAAS,aAAa,CAAC,IAAgC,EAAE,OAAwC,EAAE,MAAkB;IACjH,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC;IAClC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,OAAO,IAAI,CAAC,WAAW,CAAC,IAAI,eAAe,CAAiC;QACxE,SAAS,CAAC,KAAK,EAAE,UAAU;YACvB,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;YAClD,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;QACD,KAAK,CAAC,UAAU;YACZ,iFAAiF;YACjF,MAAM,GAAG,cAAc,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;QACjE,CAAC;KACJ,CAAC,CAAC,CAAC;AACR,CAAC;AACD,iEAAiE;AACjE,SAAS,UAAU,CAAC,IAAuB;IACvC,OAAO,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;AACzE,CAAC;AACD,SAAS,UAAU,CAAC,IAAuB;IACvC,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc;QAC5B,OAAO,IAAI,CAAC,QAAQ,IAAI,cAAc,CAAC;IAC3C,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AAC3C,CAAC;AACD,SAAS,mBAAmB,CAAC,IAAuB;IAChD,OAAO,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,KAAK,oBAAoB,CAAC;AACnE,CAAC;AACD,4EAA4E;AAC5E,SAAS,UAAU,CAAC,IAAY;IAC5B,OAAO,uBAAuB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;AACrD,CAAC;AACD,gFAAgF;AAChF,SAAS,gBAAgB,CAAC,SAA+C,EAAE,SAA6B;IACpG,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,IAAI,SAAS,kDAAkD,CAAC,CAAC;IACnI,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS;QAC9B,OAAO,OAAO,CAAC,QAAQ,KAAK,SAAS,CAAC;IAC1C,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;AAC1C,CAAC;AAQD,MAAM,0BAA0B,GAAG,IAAI,GAAG,CAAC;IACvC,iBAAiB;IACjB,oBAAoB;IACpB,oBAAoB;IACpB,kBAAkB;IAClB,cAAc;IACd,eAAe;CAClB,CAAC,CAAC;AACH,gFAAgF;AAChF,SAAS,sBAAsB,CAAC,OAAsB,EAAE,QAAuB,EAAE,GAAiB;IAC9F,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACjB,CAAC,0BAA0B,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC;YACjD,OAAO,IAAI,CAAC,UAAU,KAAK,QAAQ,IAAI,IAAI,CAAC,UAAU,KAAK,EAAE;YAC7D,CAAC,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC;YACpD,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC;YAC/C,SAAS;QACb,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,IAAI,IAAI,KAAK,EAAE;YACX,SAAS;QACb,IAAI,KAAyB,CAAC;QAC9B,IAAI,CAAC;YACD,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvC,CAAC;QACD,MAAM,CAAC;YACH,SAAS;QACb,CAAC;QACD,IAAI,KAAK,KAAK,SAAS;YACnB,SAAS;QACb,QAAQ,CAAC,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAChD,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,IAAI,IAAI,KAAK,EAAE,EAAE,CAAC,CAAC;IACxD,CAAC;AACL,CAAC;AACD;;;;GAIG;AACH,SAAS,gBAAgB,CAAC,OAAsB,EAAE,QAAuB,EAAE,kBAAqE;IAC5I,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,QAAQ,GAAG,EAAE,CAAC;IAClB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;QAC/B,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;YACvB,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;YAC5B,SAAS;QACb,CAAC;QACD,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YACjB,SAAS;QACb,MAAM,MAAM,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;QACrC,IAAI,CAAC,MAAM,IAAI,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC;YAC7C,SAAS;QACb,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAc,CAAC;QAChD,MAAM,KAAK,GAAG,GAAG,EAAE;YACf,IAAI,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC;gBACjC,OAAO;YACX,MAAM,OAAO,GAAG,kBAAkB,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;YACtD,MAAM,CAAC,IAAI,CAAC;gBACR,IAAI,EAAE,mBAAmB;gBACzB,WAAW,EAAE,MAAM;gBACnB,SAAS,EAAE;oBACP,IAAI,EAAE,MAAM;oBACZ,IAAI;oBACJ,KAAK;oBACL,GAAG,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC;iBAChD;aACJ,CAAC,CAAC;YACH,QAAQ,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACtC,CAAC,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,KAAK,kBAAkB,EAAE,CAAC;YACpC,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,MAAmB,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YACtI,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aACI,IAAI,IAAI,CAAC,KAAK,KAAK,cAAc,EAAE,CAAC;YACrC,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACzH,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aACI,IAAI,IAAI,CAAC,KAAK,KAAK,eAAe;YACnC,CAAC,IAAI,CAAC,KAAK,KAAK,oBAAoB,IAAI,IAAI,CAAC,QAAQ,EAAE,QAAQ,KAAK,KAAK,CAAC,EAAE,CAAC;YAC7E,2CAA2C;YAC3C,KAAK,EAAE,CAAC;YACR,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC,CAAC;YACnG,QAAQ,CAAC,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;aACI,IAAI,IAAI,CAAC,KAAK,KAAK,oBAAoB,EAAE,CAAC;YAC3C,KAAK,EAAE,CAAC;QACZ,CAAC;QACD,oDAAoD;IACxD,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IACjD,IAAI,OAAO,CAAC,IAAI,EAAE;QACd,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;IACvE,QAAQ,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAAC;IACnC,OAAO,MAAM,CAAC;AAClB,CAAC;AA+BD,MAAM,mBAAmB,GAAG,6BAA6B,CAAC;AAM1D,iDAAiD;AACjD,SAAS,aAAa,CAAQ,GAAgD;IAC1E,OAAO,eAAM,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC;AACpE,CAAC;AACD,SAAS,gBAAgB,CAAC,OAAoC,EAAE,GAAiB;IAC7E,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,OAAO,OAAO,GAAG,KAAK,UAAU;QAC5B,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;QAChD,CAAC,CAAC,eAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;AAC9B,CAAC;AACD,SAAS,oBAAoB,CAAC,OAAoC,EAAE,GAAiB;IACjF,OAAO,eAAM,CAAC,GAAG,CAAC;QACd,GAAG,EAAE,GAAG,EAAE,CAAC,OAAO,OAAO,CAAC,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC;QACjG,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;KAC1B,CAAC,CAAC;AACP,CAAC;AACD,SAAS,mBAAmB;IACxB,OAAO,eAAM,CAAC,cAAc,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,eAAe,EAAE,CAAC,EAAE,CAAC,UAAU,EAAE,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAClI,CAAC;AACD,SAAS,0BAA0B,CAAQ,MAA6B;IACpE,OAAO,aAAa,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,EAAE,eAAM,CAAC,MAAM,CAAC,CAAC;AACrG,CAAC;AACD,SAAS,eAAe,CAAC,OAAoC,EAAE,KAAgB,EAAE,GAAiB;IAC9F,4CAA4C;IAC5C,4CAA4C;IAC5C,MAAM,aAAa,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC;IACzD,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC;IAC5D,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,gBAAgB,EAAE,WAAW,CAAC,CAAC;IAC/C,IAAI,EAAE,GAAG,WAAW,CAAC,MAAM,CAAC;IAC5B,IAAI,CAAC,EAAE,EAAE,CAAC;QACN,EAAE,GAAG,QAAQ,IAAA,wBAAU,GAAE,EAAE,CAAC;QAC5B,WAAW,CAAC,MAAM,GAAG,EAAE,CAAC;QACxB,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,wBAAwB;IACrD,CAAC;IACD,MAAM,WAAW,GAAG,aAAa,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACzC,MAAM,WAAW,GAAG,WAAW,EAAE,IAAI,KAAK,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChH,IAAI,WAAW,IAAI,WAAW,EAAE,CAAC;QAC7B,6DAA6D;QAC7D,qDAAqD;QACrD,0DAA0D;QAC1D,MAAM,SAAS,GAAG,WAAW,CAAC,QAAQ,EAAE,EAAE,IAAI,WAAW,CAAC,UAAU,CAAC;QACrE,MAAM,QAAQ,GAAG,gBAAgB,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;QAC9D,MAAM,YAAY,GAAG,WAAW,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,WAAW,CAAC,QAAQ,EAAE,EAAE;YAC5H,CAAC,CAAC;gBACE,GAAG,IAAI;gBACP,KAAK,EAAE,oBAAoB;gBAC3B,QAAQ,EAAE;oBACN,EAAE,EAAE,WAAW,CAAC,QAAS,CAAC,EAAE;oBAC5B,QAAQ;oBACR,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,UAAU,IAAI,mBAAmB,EAAE,CAAC;iBAC7E;aACJ;YACD,CAAC,CAAC,IAAI,CAAC,CAAC;QACZ,MAAM,UAAU,GAAG,EAAE,GAAG,WAAW,EAAE,KAAK,EAAE,YAAY,EAAE,CAAC;QAC3D,OAAO;YACH,WAAW;YACX,UAAU;YACV,cAAc,EAAE,CAAC,GAAG,aAAa,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,UAAU,CAAC;SAC9D,CAAC;IACN,CAAC;IACD,MAAM,KAAK,GAAwB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IACxE,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,KAAK,IAAI,EAAE,EAAE,CAAC;QACnC,KAAK,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,QAAQ,EAAE,GAAG,EAAE,QAAQ,IAAI,CAAC,QAAQ,WAAW,IAAI,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACnH,CAAC;IACD,OAAO;QACH,WAAW;QACX,UAAU,EAAE,SAAS;QACrB,cAAc,EAAE,CAAC,GAAG,aAAa,EAAE,EAAE,EAAE,EAAE,IAAA,wBAAU,GAAE,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;KAChF,CAAC;AACN,CAAC;AACD,6FAA6F;AAC7F,SAAS,2BAA2B,CAAC,mBAAwC,EAAE,UAAqC,EAAE,MAA0C,EAAE,SAA0B,EAAE,SAA2C;IACrO,OAAO,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QAClC,MAAM,OAAO,GAAG,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACrD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,IAAI,MAAM,CAAC,OAAO;YACd,OAAO,EAAE,CAAC;QACd,IAAI,CAAC;YACD,IAAI,YAAuC,CAAC;YAC5C,IAAI,KAAK,EAAE,MAAM,OAAO,IAAI,mBAAmB,CAAC,EAAE,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;gBAC/E,YAAY,GAAG,OAAO,CAAC;gBACvB,SAAS,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YACD,OAAO,YAAY,CAAC;QACxB,CAAC;gBACO,CAAC;YACL,MAAM,CAAC,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACjD,CAAC;IACL,CAAC,CAAC,CAAC;AACP,CAAC;AACD,SAAS,yBAAyB,CAAC,OAAoC,EAAE,KAAgB,EAAE,GAAiB;IACxG,OAAO,eAAM,CAAC,MAAM,CAAC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;QACrC,MAAM,EAAE,mBAAmB,EAAE,GAAG,KAAK,CAAC,CAAC,YAAY,EAAE,CAAC;QACtD,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;YAC/B,GAAG,EAAE,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC;YAC/C,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,gBAAgB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAClD,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,oBAAoB,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAC/D,MAAM,SAAS,GAAG,KAAK,CAAC,CAAC,mBAAmB,EAAE,CAAC;QAC/C,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,UAAU,CAAC;YACjC,GAAG,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE;gBACxB,MAAM,EAAE,MAAM;gBACd,sDAAsD;gBACtD,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,GAAG,YAAY,EAAE,GAAG,GAAG,CAAC,SAAS,EAAE,OAAO,EAAE;gBAC3F,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,cAAc,EAAE,CAAC;gBACnF,MAAM,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;aAClE,CAAC;YACF,KAAK,EAAE,CAAC,GAAG,EAAE,EAAE;gBACX,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO;oBAClB,OAAO,GAAG,CAAC;gBACf,MAAM,KAAK,GAAG,GAAG,YAAY,KAAK;oBAC9B,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;oBAChE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;gBAClB,OAAO,IAAA,kCAAe,EAAC;oBACnB,UAAU,EAAE,SAAS;oBACrB,OAAO,EAAE,wBAAwB,GAAG,KAAK,KAAK,4GAA4G;oBAC1J,KAAK,EAAE,IAAA,0CAAsB,EAAC,GAAG,CAAC;iBACrC,CAAC,CAAC;YACP,CAAC;SACJ,CAAC,CAAC;QACH,MAAM,YAAY,GAAG,GAAG,CAAC,IAAI,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,YAAY,EAAE,CAAC;YAC3B,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,aAAa,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YACzG,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAA,kCAAe,EAAC;gBACtC,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,QAAQ,GAAG,YAAY,GAAG,CAAC,MAAM,IAAI,YAAY,oHAAoH;gBAC9K,KAAK,EAAE,IAAA,0CAAsB,EAAC,EAAE,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,CAAC;aACxD,CAAC,CAAC,CAAC;QACR,CAAC;QACD,MAAM,WAAW,GAGb;YACA,OAAO,EAAE,KAAK;YACd,QAAQ,EAAE,SAAS;SACtB,CAAC;QACF,MAAM,WAAW,GAAG,aAAa,CAAC,YAAY,EAAE,CAAC,KAAK,EAAE,EAAE;YACtD,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;gBACtB,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC,SAAS,CAAC;QAC/C,CAAC,EAAE,GAAG,EAAE;YACJ,WAAW,CAAC,OAAO,GAAG,IAAI,CAAC;QAC/B,CAAC,CAAC,CAAC;QACH,KAAK,CAAC,CAAC,eAAM,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,eAAM,CAAC,OAAO,CAAC,0BAA0B,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC;QACrI,MAAM,QAAQ,GAAkB,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,WAAW,CAAC,QAAQ;YAChF,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,QAAQ;YAC/B,CAAC,CAAC,EAAE,YAAY,EAAE,IAAI,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,GAAG,EAAE,EAAE,iBAAiB,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC;QACtG,QAAQ,CAAC,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzC,MAAM,YAAY,GAAG,KAAK,CAAC,CAAC,2BAA2B,CAAC,mBAAmB,EAAE,QAAQ,CAAC,UAAU,EAAE,WAAW,EAAE,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,OAAO,EAAE,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC;QACvL,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAA,kCAAe,EAAC;gBACtC,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,QAAQ,GAAG,uJAAuJ;aAC9K,CAAC,CAAC,CAAC;QACR,CAAC;QACD,IAAI,CAAC,YAAY,EAAE,CAAC;YAChB,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,IAAA,kCAAe,EAAC;gBACtC,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,WAAW,CAAC,QAAQ,KAAK,SAAS,IAAI,WAAW,CAAC,QAAQ,CAAC,IAAI,EAAE,KAAK,EAAE;oBAC7E,CAAC,CAAC,WAAW,CAAC,QAAQ;oBACtB,CAAC,CAAC,QAAQ,GAAG,qHAAqH;aACzI,CAAC,CAAC,CAAC;QACR,CAAC;QACD,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;YAC9B,GAAG,EAAE,GAAG,EAAE;gBACN,8CAA8C;gBAC9C,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,UAAU;oBAC5C,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,YAAY,CAAC;oBACzD,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,cAAc,EAAE,YAAY,CAAC,CAAC,CAAC;gBAClD,OAAO;oBACH,MAAM,EAAE,gBAAgB,CAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,CAAC,kBAAkB,CAAC;oBAC5E,OAAO,EAAE,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC;iBACxD,CAAC;YACN,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;QAChC,IAAI,OAAO,EAAE,CAAC;YACV,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;gBACrB,GAAG,EAAE,GAAG,EAAE;oBACN,MAAM,aAAa,GAAG;wBAClB,GAAG,OAAO,CAAC,MAAM;wBACjB;4BACI,IAAI,EAAE,iBAA0B;4BAChC,OAAO,EAAE;gCACL,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,EAAE,IAAI,OAAO,CAAC,UAAU;gCAC9C,MAAM,EAAE,UAAU,CAAC,OAAO,CAAC;gCAC3B,KAAK,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,IAAI,CAAc;gCAC3C,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC;6BAC/C;yBACJ;qBACJ,CAAC;oBACF,MAAM,gBAAgB,GAAG,IAAA,uDAA+B,EAAC,aAAa,CAAC,CAAC;oBACxE,OAAO;wBACH,MAAM,EAAE,SAAkB;wBAC1B,MAAM,EAAE,aAAa;wBACrB,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;qBAClE,CAAC;gBACN,CAAC;gBACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;aAC1B,CAAC,CAAC;QACP,CAAC;QACD,IAAI,OAAO,CAAC,QAAQ;YAChB,KAAK,CAAC,CAAC,eAAM,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC1C,OAAO,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC;YACrB,GAAG,EAAE,GAAG,EAAE;gBACN,MAAM,WAAW,GAAG;oBAChB,GAAG,OAAO,CAAC,MAAM;oBACjB,GAAG,CAAC,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,OAAgB,EAAE,OAAO,EAAE,WAAW,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;iBAC/F,CAAC;gBACF,MAAM,gBAAgB,GAAG,IAAA,uDAA+B,EAAC,WAAW,CAAC,CAAC;gBACtE,OAAO;oBACH,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAE,QAAkB,CAAC,CAAC,CAAE,WAAqB;oBAC3E,MAAM,EAAE,WAAW;oBACnB,GAAG,CAAC,gBAAgB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,gBAAgB,EAAE,CAAC;iBAClE,CAAC;YACN,CAAC;YACD,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK;SAC1B,CAAC,CAAC;IACP,CAAC,CAAC,CAAC,CAAC;AACR,CAAC;AACD;;;;;;;;;;;;;GAaG;AACH,mDAAmD;AACnD,sDAAsD;AACtD,iEAAiE;AACjE,SAAgB,oBAAoB,CAAC,OAAoC;IACrE,OAAO,IAAA,2BAAe,EAAC;QACnB,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,mBAAmB;QACzC,gBAAgB,EAAE,QAAQ;QAC1B,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,OAAO,CAAC,UAAU;QAC9B,IAAI,EAAE,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,CAAC,yBAAyB,CAAC,OAAO,EAAE,KAAK,EAAE,GAAG,CAAC;KACvE,CAAC,CAAC;AACP,CAAC","sourcesContent":["// uiMessageStreamAgent():AI SDK UI Message Stream Protocol 的无侵入 HTTP adapter 工厂。\n//\n// 协议:https://ai-sdk.dev/docs/ai-sdk-ui/stream-protocol —— `useChat` 后端的标准 SSE\n// (`data: {UIMessageChunk}\\n\\n`,以 `data: [DONE]\\n\\n` 收尾)。这是「对着一个已部署的\n// AI SDK 应用的 HTTP 接口无侵入接入」:adapter 只 fetch,不 import 被测应用的任何代码。\n//\n// · 会话:协议是服务端零状态、「客户端带全量历史」——工厂用 typed slot 存整份\n// UIMessage[],每轮原样重放;ctx.session.id 未记录时开新 chat id 并 capture 回写。\n// · 事件流:从归约后的 assistant 消息 parts 直构(text → message,tool part 的\n// approval-requested → operation.started,output-available / output-error / 审批拒绝\n// → operation.finished),\n// 不要求应用接 OTel;跨 resume 轮次按 callId / 已报文本长度去重。\n// · HITL:v7 tool approval(`needsApproval` 工具)——part 停在 `approval-requested` 时\n// 整轮 `waiting` + `input.requested`;下一轮输入(approve / yes / 同意 / 批准 开头 =\n// 批准,其余拒绝)翻译成 `approval-responded` 原地改写该 part、原样重发 messages 触发\n// 服务端续跑 —— 和真实前端 `addToolApprovalResponse()` + `sendMessage()` 的协议行为\n// 完全一致,没有单独的 approve 端点。拒绝的调用协议里不会有任何 tool-output 帧\n// (从没真正执行),由工厂合成 `status: \"rejected\"` 的 operation.finished。\n// · chunk 归约用 `ai` 包官方导出的框架无关 reducer `readUIMessageStream`(`useChat`\n// 内部同款),保证重放回服务端的 UIMessage 形状协议正确 —— `ai` 是可选 peer 依赖,\n// 只在用到本工厂时需要安装。\n//\n// tracing / spanMapper 原样透传:应用有 OTel 时接上拿瀑布图(span 只进瀑布图,不喂断言),\n// 事件流始终从协议帧直构。\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 { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport type { Agent, AgentContext, AgentTracing, CommandProjection, EvidenceCoverage, InputResponse, JsonValue, SpanMapper, StreamEvent, TurnInput } from \"../types.ts\";\nimport { createSessionSlot } from \"./session-slot.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\n// UI Message Stream 帧里没有 usage(协议本身不带 token 计数,见 docs/engineering/testing/e2e/README.md\n// 第 2 节);events/actions/messages/status 都直接来自完整归约的协议帧,和 turnFromAiSdk/aiSdkAgent\n// 同等完整——官方 SDK 适配器应声明全通道 complete(docs/feature/adapters/architecture/evidence.md),\n// 这里唯一的例外是协议本身没有的 usage 通道,如实标 unavailable 而不是留成 unknown。\nconst COVERAGE: EvidenceCoverage = Object.freeze({\n ...completeEvidenceCoverage,\n usage: { status: \"unavailable\" as const, reason: \"UI Message Stream frames carry no token usage\" },\n});\n// ───────────────────────── 协议的结构化类型(structural,不依赖 ai 包的类型) ─────────────────────────\n/** UIMessage 的最小结构面:只声明工厂真正要读的字段,其余原样透传。 */\nexport interface UIMessageLike {\n id: string;\n role: string;\n parts: UIMessagePartLike[];\n [key: string]: JsonValue | UIMessagePartLike[] | undefined;\n}\nexport interface UIMessagePartLike {\n type: string;\n state?: string;\n text?: string;\n toolCallId?: string;\n toolName?: string;\n input?: JsonValue;\n output?: JsonValue;\n errorText?: string;\n approval?: {\n id: string;\n approved?: boolean;\n reason?: string;\n };\n [key: string]: JsonValue | undefined;\n}\ninterface UIMessageChunkLike {\n type: string;\n errorText?: string;\n [key: string]: JsonValue | undefined;\n}\ninterface UiMessageSessionState {\n chatId?: string;\n reported?: ReportedState;\n}\nconst historySlot = createSessionSlot<UIMessageLike[]>(\"ui-message-stream/history\");\nconst sessionStateSlot = createSessionSlot<UiMessageSessionState>(\"ui-message-stream/state\");\ntype ReadUIMessageStream = (options: {\n message?: UIMessageLike;\n stream: ReadableStream<UIMessageChunkLike>;\n}) => AsyncIterable<UIMessageLike>;\n// ai 是可选 peer 依赖:动态 import,缺了就把「装什么」直接说清楚。\n// 说明符经变量传入,避免 TS 对字面量模块名做安装检查(niceeval 自身不依赖 ai)。\nlet aiModule: Promise<{\n readUIMessageStream: ReadUIMessageStream;\n}> | undefined;\nfunction missingAiModule(): Error {\n return new Error(\"uiMessageStreamAgent 需要 `ai` 包(AI SDK v5+,协议 reducer readUIMessageStream 来自它)。在你的 eval 项目里安装:npm install -D ai\");\n}\n/** Dynamic import is an SDK Promise boundary; a rejected load is never cached. */\nfunction loadAiEffect(): Effect.Effect<{\n readUIMessageStream: ReadUIMessageStream;\n}, Error> {\n const pending = aiModule;\n return Effect.tryPromise({\n try: () => {\n if (pending !== undefined)\n return pending;\n const specifier = \"ai\";\n const loading = __niceevalDynamicImport(specifier) as Promise<{\n readUIMessageStream: ReadUIMessageStream;\n }>;\n aiModule = loading;\n return loading;\n },\n catch: () => missingAiModule(),\n }).pipe(Effect.tapError(() => Effect.sync(() => {\n aiModule = undefined;\n })));\n}\n// ───────────────────────── SSE 解析 ─────────────────────────\nfunction drainSseEvents(buffer: string, controller: TransformStreamDefaultController<UIMessageChunkLike>, onChunk: (chunk: UIMessageChunkLike) => void, onDone: () => void): string {\n for (;;) {\n const sepIndex = buffer.indexOf(\"\\n\\n\");\n if (sepIndex === -1)\n return buffer;\n const rawEvent = buffer.slice(0, sepIndex);\n buffer = buffer.slice(sepIndex + 2);\n const line = rawEvent.split(\"\\n\").find((candidate) => candidate.startsWith(\"data: \"));\n if (!line)\n continue;\n const payload = line.slice(\"data: \".length);\n if (payload === \"[DONE]\") {\n onDone();\n // `[DONE]` is the protocol terminal, not an advisory event. Closing the\n // reducer input here prevents frames later in the same network chunk (or\n // later chunks) from manufacturing a successful Turn after termination.\n controller.terminate();\n return \"\";\n }\n const chunk = JSON.parse(payload) as UIMessageChunkLike;\n onChunk(chunk);\n controller.enqueue(chunk);\n }\n}\n/**\n * Build the AI SDK reducer input with native stream composition rather than a hand-owned reader.\n * Scope finalization below aborts/cancels this pipeline, so an interrupted reducer cannot retain a\n * body reader or live HTTP transport.\n */\nfunction toChunkStream(body: ReadableStream<Uint8Array>, onChunk: (c: UIMessageChunkLike) => void, onDone: () => void): ReadableStream<UIMessageChunkLike> {\n const decoder = new TextDecoder();\n let buffer = \"\";\n return body.pipeThrough(new TransformStream<Uint8Array, UIMessageChunkLike>({\n transform(value, controller) {\n buffer += decoder.decode(value, { stream: true });\n buffer = drainSseEvents(buffer, controller, onChunk, onDone);\n },\n flush(controller) {\n // Keep the original protocol rule: only a completed `\\n\\n` record is observable.\n buffer = drainSseEvents(buffer, controller, onChunk, onDone);\n },\n }));\n}\n// ───────────────────────── parts → 事件 ─────────────────────────\nfunction isToolPart(part: UIMessagePartLike): boolean {\n return part.type === \"dynamic-tool\" || part.type.startsWith(\"tool-\");\n}\nfunction toolNameOf(part: UIMessagePartLike): string {\n if (part.type === \"dynamic-tool\")\n return part.toolName ?? \"dynamic-tool\";\n return part.type.slice(\"tool-\".length);\n}\nfunction isApprovalRequested(part: UIMessagePartLike): boolean {\n return isToolPart(part) && part.state === \"approval-requested\";\n}\n/** 和 aiSdkAgent 同一词法(t.respond 的自由文本回答):approve / yes / 同意 / 批准 开头 = 批准。 */\nfunction isApproved(text: string): boolean {\n return /^(approve|yes|同意|批准)/i.test(text.trim());\n}\n/** 按 requestId 从 input.responses 对位取裁决;optionId 优先,自由文本走 isApproved,没答到直接报错。 */\nfunction approvalDecision(responses: readonly InputResponse[] | undefined, requestId: string | undefined): boolean {\n const matched = responses?.find((r) => r.requestId === requestId);\n if (!matched) {\n throw new Error(`No response for pending approval \"${requestId ?? \"unknown\"}\". Answer approval requests with t.respond(...).`);\n }\n if (matched.optionId !== undefined)\n return matched.optionId === \"approve\";\n return isApproved(matched.text ?? \"\");\n}\n/** 已报告的进度:resume 续跑的是同一条 assistant 消息,跨轮去重靠它。 */\ninterface ReportedState {\n startedCalls: Set<string>;\n finishedCalls: Set<string>;\n liveProgressCalls: Set<string>;\n textLen: number;\n}\nconst COMPLETE_TOOL_INPUT_STATES = new Set([\n \"input-available\",\n \"approval-requested\",\n \"approval-responded\",\n \"output-available\",\n \"output-error\",\n \"output-denied\",\n]);\n/** Project only reducer-owned messages whose tool input is already complete. */\nfunction reportLiveToolProgress(message: UIMessageLike, reported: ReportedState, ctx: AgentContext): void {\n for (const part of message.parts) {\n if (!isToolPart(part) ||\n !COMPLETE_TOOL_INPUT_STATES.has(part.state ?? \"\") ||\n typeof part.toolCallId !== \"string\" || part.toolCallId === \"\" ||\n !Object.prototype.hasOwnProperty.call(part, \"input\") ||\n reported.liveProgressCalls.has(part.toolCallId))\n continue;\n const name = toolNameOf(part);\n if (name === \"\")\n continue;\n let input: string | undefined;\n try {\n input = JSON.stringify(part.input);\n }\n catch {\n continue;\n }\n if (input === undefined)\n continue;\n reported.liveProgressCalls.add(part.toolCallId);\n ctx.progress({ message: `tool: ${name} ${input}` });\n }\n}\n/**\n * 从归约后的最终消息派生本轮事件。工具事件按 part 顺序;文本合并成一条 message 事件\n * (resume 轮只报新增的后缀)。停在 approval-requested 的调用先报 started,\n * 因此它在审批轮是 pending;裁决后的续跑轮只补 finished,落成 completed 或 rejected。\n */\nfunction deriveTurnEvents(message: UIMessageLike, reported: ReportedState, projectToolCommand: UiMessageStreamAgentOptions[\"projectToolCommand\"]): StreamEvent[] {\n const events: StreamEvent[] = [];\n let fullText = \"\";\n for (const part of message.parts) {\n if (part.type === \"text\") {\n fullText += part.text ?? \"\";\n continue;\n }\n if (!isToolPart(part))\n continue;\n const callId = part.toolCallId ?? \"\";\n if (!callId || reported.finishedCalls.has(callId))\n continue;\n const name = toolNameOf(part);\n const input = (part.input ?? null) as JsonValue;\n const start = () => {\n if (reported.startedCalls.has(callId))\n return;\n const command = projectToolCommand?.({ name, input });\n events.push({\n type: \"operation.started\",\n operationId: callId,\n operation: {\n kind: \"tool\",\n name,\n input,\n ...(command === undefined ? {} : { command }),\n },\n });\n reported.startedCalls.add(callId);\n };\n if (part.state === \"output-available\") {\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: part.output as JsonValue, status: \"completed\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"output-error\") {\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", output: part.errorText, status: \"failed\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"output-denied\" ||\n (part.state === \"approval-responded\" && part.approval?.approved === false)) {\n // 拒绝的调用从没真正执行,协议里不会再有它的任何帧 —— 在裁决落地的这一轮合成。\n start();\n events.push({ type: \"operation.finished\", operationId: callId, kind: \"tool\", status: \"rejected\" });\n reported.finishedCalls.add(callId);\n }\n else if (part.state === \"approval-requested\") {\n start();\n }\n // input-* 中间态还没有可信的完整入参,等 approval-requested 或终态再报。\n }\n const newText = fullText.slice(reported.textLen);\n if (newText.trim())\n events.push({ type: \"message\", role: \"assistant\", text: newText });\n reported.textLen = fullText.length;\n return events;\n}\n// ───────────────────────── 工厂 ─────────────────────────\nexport interface UiMessageStreamAgentOptions {\n /** agent 名(报告 / 结果聚合的身份)。默认 \"ui-message-stream\"。 */\n name?: string;\n /** 被测应用的 chat 端点(完整 URL,应用在哪部署就指哪);函数形式每轮解析。 */\n url: string | ((ctx: AgentContext) => string | Promise<string>);\n /** 附加请求头(鉴权等);`ctx.telemetry.headers`(traceparent)总会自动并入。 */\n headers?: globalThis.Record<string, string> | ((ctx: AgentContext) => globalThis.Record<string, string>);\n /** 除 `messages` 外并入请求体的字段,如 `(ctx) => ({ model: ctx.model })`(undefined 字段序列化时自动丢弃)。 */\n body?: (ctx: AgentContext) => globalThis.Record<string, JsonValue | undefined>;\n /**\n * 由 endpoint owner 逐笔把逻辑工具调用分类为 command 或 not-command。\n * 未知调用返回 undefined 并保持 actions coverage partial;NiceEval 不按名称或 input 猜测。\n */\n projectToolCommand?: (tool: Readonly<{\n name: string;\n input: JsonValue;\n }>) => CommandProjection | undefined;\n /**\n * 拒绝审批时随 `approval-responded` 带出的理由。应用/SDK 会把它作为模型看到的工具结果\n * 文本 —— 写清楚「不要重试」能明显降低模型原样重发同一调用的概率(实测)。\n */\n denyReason?: string;\n /** 流结束后再等这么久才返回(毫秒),给应用侧的观测导出(如 BatchSpanProcessor)留时间。 */\n settleMs?: number;\n /** 应用有 OTel 时的端点投递方式(拿瀑布图);事件流不依赖它。 */\n tracing?: AgentTracing;\n /** 应用有 OTel 时的 span 归一函数(拿瀑布图);事件流不依赖它。 */\n spanMapper?: SpanMapper;\n}\nconst DEFAULT_DENY_REASON = \"用户拒绝了这次调用,不要重试,直接告知用户操作未执行。\";\ninterface PreparedUiMessageStreamSend {\n readonly bookkeeping: UiMessageSessionState;\n readonly messagesToSend: UIMessageLike[];\n readonly resumeFrom: UIMessageLike | undefined;\n}\n/** External SDK / transport Promise boundary. */\nfunction promiseEffect<Value>(run: (signal: AbortSignal) => PromiseLike<Value>): Effect.Effect<Value, unknown> {\n return Effect.tryPromise({ try: run, catch: (cause) => cause });\n}\nfunction resolveUrlEffect(options: UiMessageStreamAgentOptions, ctx: AgentContext): Effect.Effect<string, unknown> {\n const url = options.url;\n return typeof url === \"function\"\n ? promiseEffect(() => Promise.resolve(url(ctx)))\n : Effect.succeed(url);\n}\nfunction resolveHeadersEffect(options: UiMessageStreamAgentOptions, ctx: AgentContext): Effect.Effect<globalThis.Record<string, string>, unknown> {\n return Effect.try({\n try: () => typeof options.headers === \"function\" ? options.headers(ctx) : (options.headers ?? {}),\n catch: (cause) => cause,\n });\n}\nfunction transportController() {\n return Effect.acquireRelease(Effect.sync(() => new AbortController()), (controller) => Effect.sync(() => controller.abort()));\n}\nfunction cancelReadableStreamEffect<Value>(stream: ReadableStream<Value>): Effect.Effect<void> {\n return promiseEffect(() => stream.cancel()).pipe(Effect.catch(() => Effect.void), Effect.asVoid);\n}\nfunction prepareMessages(options: UiMessageStreamAgentOptions, input: TurnInput, ctx: AgentContext): PreparedUiMessageStreamSend {\n // 会话续接是「客户端带全量历史」模式:历史与协议簿记各用一个 typed slot,\n // 新线自然两者都为空;相同名字不会让其它 Adapter 的 slot 与它们碰撞。\n const priorMessages = ctx.session.get(historySlot) ?? [];\n const bookkeeping = ctx.session.get(sessionStateSlot) ?? {};\n ctx.session.set(sessionStateSlot, bookkeeping);\n let id = bookkeeping.chatId;\n if (!id) {\n id = `uims-${randomUUID()}`;\n bookkeeping.chatId = id;\n ctx.session.capture(id); // 镜像:t.sessionId / 报告可见\n }\n const lastMessage = priorMessages.at(-1);\n const pendingPart = lastMessage?.role === \"assistant\" ? lastMessage.parts.find(isApprovalRequested) : undefined;\n if (pendingPart && lastMessage) {\n // HITL 续跑:不追加新 user 消息 —— 把停在 approval-requested 的 part 原地改成\n // approval-responded,原样重发,服务端续跑同一条被打断的 assistant 消息。\n // 裁决按 requestId 从 input.responses 对位读取(t.respond 的结构化回答)。\n const requestId = pendingPart.approval?.id ?? pendingPart.toolCallId;\n const approved = approvalDecision(input.responses, requestId);\n const mutatedParts = lastMessage.parts.map((part) => isApprovalRequested(part) && part.approval?.id === pendingPart.approval?.id\n ? {\n ...part,\n state: \"approval-responded\",\n approval: {\n id: pendingPart.approval!.id,\n approved,\n ...(approved ? {} : { reason: options.denyReason ?? DEFAULT_DENY_REASON }),\n },\n }\n : part);\n const resumeFrom = { ...lastMessage, parts: mutatedParts };\n return {\n bookkeeping,\n resumeFrom,\n messagesToSend: [...priorMessages.slice(0, -1), resumeFrom],\n };\n }\n const parts: UIMessagePartLike[] = [{ type: \"text\", text: input.text }];\n for (const file of input.files ?? []) {\n parts.push({ type: \"file\", mediaType: file.mimeType, url: `data:${file.mimeType};base64,${file.dataBase64}` });\n }\n return {\n bookkeeping,\n resumeFrom: undefined,\n messagesToSend: [...priorMessages, { id: randomUUID(), role: \"user\", parts }],\n };\n}\n/** Consume the SDK's native async iterator only inside its named Effect Promise boundary. */\nfunction reduceUiMessageStreamEffect(readUIMessageStream: ReadUIMessageStream, resumeFrom: UIMessageLike | undefined, stream: ReadableStream<UIMessageChunkLike>, transport: AbortController, onMessage: (message: UIMessageLike) => void): Effect.Effect<UIMessageLike | undefined, unknown> {\n return promiseEffect(async (signal) => {\n const onAbort = () => transport.abort(signal.reason);\n signal.addEventListener(\"abort\", onAbort, { once: true });\n if (signal.aborted)\n onAbort();\n try {\n let finalMessage: UIMessageLike | undefined;\n for await (const message of readUIMessageStream({ message: resumeFrom, stream })) {\n finalMessage = message;\n onMessage(message);\n }\n return finalMessage;\n }\n finally {\n signal.removeEventListener(\"abort\", onAbort);\n }\n });\n}\nfunction uiMessageStreamSendEffect(options: UiMessageStreamAgentOptions, input: TurnInput, ctx: AgentContext): Effect.Effect<import(\"../types.ts\").Turn, unknown> {\n return Effect.scoped(Effect.gen(function* () {\n const { readUIMessageStream } = yield* loadAiEffect();\n const prepared = yield* Effect.try({\n try: () => prepareMessages(options, input, ctx),\n catch: (cause) => cause,\n });\n const url = yield* resolveUrlEffect(options, ctx);\n const extraHeaders = yield* resolveHeadersEffect(options, ctx);\n const transport = yield* transportController();\n const res = yield* Effect.tryPromise({\n try: (signal) => fetch(url, {\n method: \"POST\",\n // traceparent 随请求带过去:应用埋点支持 context 传播时,span 归属精确到本轮。\n headers: { \"content-type\": \"application/json\", ...extraHeaders, ...ctx.telemetry?.headers },\n body: JSON.stringify({ ...options.body?.(ctx), messages: prepared.messagesToSend }),\n signal: AbortSignal.any([ctx.signal, signal, transport.signal]),\n }),\n catch: (err) => {\n if (ctx.signal.aborted)\n return err;\n const cause = err instanceof Error\n ? (err.cause instanceof Error ? err.cause.message : err.message)\n : String(err);\n return makeSendFailure({\n acceptance: \"unknown\",\n message: `Could not connect to ${url} (${cause}). Is the app under test running? Start it yourself first, or point url at a deployed instance via config.`,\n cause: normalizeExternalCause(err),\n });\n },\n });\n const responseBody = res.body;\n if (!res.ok || !responseBody) {\n const responseText = yield* promiseEffect(() => res.text()).pipe(Effect.catch(() => Effect.succeed(\"\")));\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: `POST ${url} failed: ${res.status} ${responseText}. Confirm the app is running and the endpoint speaks the UI Message Stream protocol (the backend useChat expects).`,\n cause: normalizeExternalCause({ status: res.status }),\n }));\n }\n const streamState: {\n sawDone: boolean;\n sawError: string | undefined;\n } = {\n sawDone: false,\n sawError: undefined,\n };\n const chunkStream = toChunkStream(responseBody, (chunk) => {\n if (chunk.type === \"error\")\n streamState.sawError = chunk.errorText;\n }, () => {\n streamState.sawDone = true;\n });\n yield* Effect.addFinalizer(() => Effect.sync(() => transport.abort()).pipe(Effect.andThen(cancelReadableStreamEffect(chunkStream))));\n const reported: ReportedState = prepared.resumeFrom && prepared.bookkeeping.reported\n ? prepared.bookkeeping.reported\n : { startedCalls: new Set(), finishedCalls: new Set(), liveProgressCalls: new Set(), textLen: 0 };\n prepared.bookkeeping.reported = reported;\n const finalMessage = yield* reduceUiMessageStreamEffect(readUIMessageStream, prepared.resumeFrom, chunkStream, transport, (message) => reportLiveToolProgress(message, reported, ctx));\n if (!streamState.sawDone) {\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: `POST ${url} ended before the UI Message Stream [DONE] marker. The response was truncated or the endpoint does not speak the complete UI Message Stream protocol.`,\n }));\n }\n if (!finalMessage) {\n return yield* Effect.fail(makeSendFailure({\n acceptance: \"unknown\",\n message: streamState.sawError !== undefined && streamState.sawError.trim() !== \"\"\n ? streamState.sawError\n : `POST ${url} ended without producing an assistant message. Confirm the endpoint speaks the complete UI Message Stream protocol.`,\n }));\n }\n const derived = yield* Effect.try({\n try: () => {\n // 续跑轮:finalMessage 是同一条消息的完整版,替换末尾半成品;全新轮:追加。\n ctx.session.set(historySlot, prepared.resumeFrom\n ? [...prepared.messagesToSend.slice(0, -1), finalMessage]\n : [...prepared.messagesToSend, finalMessage]);\n return {\n events: deriveTurnEvents(finalMessage, reported, options.projectToolCommand),\n request: finalMessage.parts.find(isApprovalRequested),\n };\n },\n catch: (cause) => cause,\n });\n const request = derived.request;\n if (request) {\n return yield* Effect.try({\n try: () => {\n const waitingEvents = [\n ...derived.events,\n {\n type: \"input.requested\" as const,\n request: {\n id: request.approval?.id ?? request.toolCallId,\n action: toolNameOf(request),\n input: (request.input ?? null) as JsonValue,\n options: [{ id: \"approve\" }, { id: \"deny\" }],\n },\n },\n ];\n const evidenceCoverage = unclassifiedToolActionsCoverage(waitingEvents);\n return {\n status: \"waiting\" as const,\n events: waitingEvents,\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n }\n if (options.settleMs)\n yield* Effect.sleep(options.settleMs);\n return yield* Effect.try({\n try: () => {\n const finalEvents = [\n ...derived.events,\n ...(streamState.sawError ? [{ type: \"error\" as const, message: streamState.sawError }] : []),\n ];\n const evidenceCoverage = unclassifiedToolActionsCoverage(finalEvents);\n return {\n status: streamState.sawError ? (\"failed\" as const) : (\"completed\" as const),\n events: finalEvents,\n ...(evidenceCoverage === undefined ? {} : { evidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n }));\n}\n/**\n * UI Message Stream Protocol(AI SDK `useChat` 后端的标准 SSE 协议)的内置无侵入 adapter。\n * 对着已部署应用的 HTTP 端点收发,不 import 应用代码:\n *\n * ```typescript\n * import { uiMessageStreamAgent } from \"niceeval/adapter\";\n *\n * export default uiMessageStreamAgent({\n * name: \"my-assistant\",\n * url: \"https://my-app.example.com/api/chat\",\n * body: (ctx) => ({ model: ctx.model }), // 应用支持请求级选模型时,模型对比零改动\n * });\n * ```\n */\n// @concord-code ne-adapter-ui-message-stream-agent\n// @concord-implements docs/feature/adapters/README.md\n// @concord-implements docs/feature/adapters/sdk/ai-sdk/README.md\nexport function uiMessageStreamAgent(options: UiMessageStreamAgentOptions): Agent {\n return makeDirectAgent({\n name: options.name ?? \"ui-message-stream\",\n evidenceCoverage: COVERAGE,\n tracing: options.tracing,\n spanMapper: options.spanMapper,\n send: (input, ctx) => uiMessageStreamSendEffect(options, input, ctx),\n });\n}\n"]}
|