niceeval 0.13.2 → 0.13.3
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/dist/agents/bub.cjs +4 -4
- package/dist/agents/bub.cjs.map +1 -1
- package/dist/agents/bub.d.cts +2 -2
- package/dist/agents/bub.d.mts +2 -2
- package/dist/agents/bub.d.ts +2 -2
- package/dist/agents/claude-code-native.cjs +213 -0
- package/dist/agents/claude-code-native.cjs.map +1 -0
- package/dist/agents/claude-code-native.d.cts +5 -0
- package/dist/agents/claude-code-native.d.mts +5 -0
- package/dist/agents/claude-code-native.d.ts +5 -0
- package/dist/agents/claude-code-native.js +6 -0
- package/dist/agents/claude-code-native.js.map +1 -0
- package/dist/agents/claude-code.cjs +26 -80
- package/dist/agents/claude-code.cjs.map +1 -1
- package/dist/agents/codex-app-server.cjs +314 -0
- package/dist/agents/codex-app-server.cjs.map +1 -0
- package/dist/agents/codex-app-server.d.cts +9 -0
- package/dist/agents/codex-app-server.d.mts +9 -0
- package/dist/agents/codex-app-server.d.ts +9 -0
- package/dist/agents/codex-app-server.js +6 -0
- package/dist/agents/codex-app-server.js.map +1 -0
- package/dist/agents/codex.cjs +19 -68
- package/dist/agents/codex.cjs.map +1 -1
- package/dist/agents/codex.d.cts +3 -3
- package/dist/agents/codex.d.mts +3 -3
- package/dist/agents/codex.d.ts +3 -3
- package/dist/agents/index.cjs +3 -1
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/index.d.cts +1 -0
- package/dist/agents/index.d.mts +1 -0
- package/dist/agents/index.d.ts +1 -0
- package/dist/agents/index.js +84 -82
- package/dist/agents/index.mjs +84 -82
- package/dist/agents/managed-jsonl.cjs +207 -0
- package/dist/agents/managed-jsonl.cjs.map +1 -0
- package/dist/agents/managed-jsonl.d.cts +39 -0
- package/dist/agents/managed-jsonl.d.mts +39 -0
- package/dist/agents/managed-jsonl.d.ts +39 -0
- package/dist/agents/managed-jsonl.js +6 -0
- package/dist/agents/managed-jsonl.js.map +1 -0
- package/dist/agents/managed-process.cjs +31 -0
- package/dist/agents/managed-process.cjs.map +1 -0
- package/dist/agents/managed-process.d.cts +3 -0
- package/dist/agents/managed-process.d.mts +3 -0
- package/dist/agents/managed-process.d.ts +3 -0
- package/dist/agents/managed-process.js +6 -0
- package/dist/agents/managed-process.js.map +1 -0
- package/dist/agents/omp.cjs +18 -1
- package/dist/agents/omp.cjs.map +1 -1
- package/dist/agents/sdk-streams.cjs +11 -4
- package/dist/agents/sdk-streams.cjs.map +1 -1
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +8 -0
- package/dist/agents/types.d.mts +8 -0
- package/dist/agents/types.d.ts +8 -0
- package/dist/analysis/bindings.cjs +74 -19
- package/dist/analysis/bindings.cjs.map +1 -1
- package/dist/analysis/bindings.d.cts +534 -156
- package/dist/analysis/bindings.d.mts +534 -156
- package/dist/analysis/bindings.d.ts +534 -156
- package/dist/analysis/domain-view.cjs.map +1 -1
- package/dist/analysis/domain-view.d.cts +137 -8
- package/dist/analysis/domain-view.d.mts +137 -8
- package/dist/analysis/domain-view.d.ts +137 -8
- package/dist/analysis/index.cjs.map +1 -1
- package/dist/analysis/index.d.cts +1 -1
- package/dist/analysis/index.d.mts +1 -1
- package/dist/analysis/index.d.ts +1 -1
- package/dist/assertions/api.cjs.map +1 -1
- package/dist/assertions/api.d.cts +62 -0
- package/dist/assertions/api.d.mts +62 -0
- package/dist/assertions/api.d.ts +62 -0
- package/dist/assertions/judge.cjs +56 -5
- package/dist/assertions/judge.cjs.map +1 -1
- package/dist/assertions/match.cjs +66 -42
- package/dist/assertions/match.cjs.map +1 -1
- package/dist/assertions/match.d.cts +13 -0
- package/dist/assertions/match.d.mts +13 -0
- package/dist/assertions/match.d.ts +13 -0
- package/dist/assertions/record/attachment.cjs +104 -33
- package/dist/assertions/record/attachment.cjs.map +1 -1
- package/dist/assertions/record/attachment.d.cts +294 -57
- package/dist/assertions/record/attachment.d.mts +294 -57
- package/dist/assertions/record/attachment.d.ts +294 -57
- package/dist/assertions/record/codec.cjs +91 -17
- package/dist/assertions/record/codec.cjs.map +1 -1
- package/dist/assertions/record/codec.d.cts +280 -52
- package/dist/assertions/record/codec.d.mts +280 -52
- package/dist/assertions/record/codec.d.ts +280 -52
- package/dist/assertions/record/index.js +2 -0
- package/dist/assertions/record/model.cjs +16 -0
- package/dist/assertions/record/model.cjs.map +1 -1
- package/dist/assertions/record/model.d.cts +120 -13
- package/dist/assertions/record/model.d.mts +120 -13
- package/dist/assertions/record/model.d.ts +120 -13
- package/dist/assertions/record/model.js +2 -0
- package/dist/assertions/record/producer.cjs +70 -50
- package/dist/assertions/record/producer.cjs.map +1 -1
- package/dist/assertions/record/producer.d.cts +8 -7
- package/dist/assertions/record/producer.d.mts +8 -7
- package/dist/assertions/record/producer.d.ts +8 -7
- package/dist/assertions/runtime.cjs +49 -7
- package/dist/assertions/runtime.cjs.map +1 -1
- package/dist/cli/application.cjs +40 -0
- package/dist/cli/application.cjs.map +1 -0
- package/dist/cli/application.d.cts +129 -0
- package/dist/cli/application.d.mts +129 -0
- package/dist/cli/application.d.ts +129 -0
- package/dist/cli/application.js +24 -0
- package/dist/cli/application.js.map +1 -0
- package/dist/cli/bootstrap.cjs +10 -4
- package/dist/cli/bootstrap.cjs.map +1 -1
- package/dist/cli/node-application.cjs +123 -0
- package/dist/cli/node-application.cjs.map +1 -0
- package/dist/cli/node-application.d.cts +14 -0
- package/dist/cli/node-application.d.mts +14 -0
- package/dist/cli/node-application.d.ts +14 -0
- package/dist/cli/node-application.js +26 -0
- package/dist/cli/node-application.js.map +1 -0
- package/dist/cli/program.cjs +2807 -0
- package/dist/cli/program.cjs.map +1 -0
- package/dist/cli/program.d.cts +352 -0
- package/dist/cli/program.d.mts +352 -0
- package/dist/cli/program.d.ts +352 -0
- package/dist/cli/program.js +36 -0
- package/dist/cli/program.js.map +1 -0
- package/dist/cli/project-configuration.cjs +134 -0
- package/dist/cli/project-configuration.cjs.map +1 -0
- package/dist/cli/project-configuration.d.cts +64 -0
- package/dist/cli/project-configuration.d.mts +64 -0
- package/dist/cli/project-configuration.d.ts +64 -0
- package/dist/cli/project-configuration.js +22 -0
- package/dist/cli/project-configuration.js.map +1 -0
- package/dist/cli/record.cjs +20 -4
- package/dist/cli/record.cjs.map +1 -1
- package/dist/cli/record.d.cts +3 -3
- package/dist/cli/record.d.mts +3 -3
- package/dist/cli/record.d.ts +3 -3
- package/dist/cli.cjs +19 -3130
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.cts +2 -148
- package/dist/cli.d.mts +2 -148
- package/dist/cli.d.ts +2 -148
- package/dist/cli.js +22 -30
- package/dist/context/assert-first.cjs +21 -15
- package/dist/context/assert-first.cjs.map +1 -1
- package/dist/context/assert-first.d.cts +1 -0
- package/dist/context/assert-first.d.mts +1 -0
- package/dist/context/assert-first.d.ts +1 -0
- package/dist/context/attempt-resources.cjs +13 -0
- package/dist/context/attempt-resources.cjs.map +1 -0
- package/dist/context/attempt-resources.d.cts +3 -0
- package/dist/context/attempt-resources.d.mts +3 -0
- package/dist/context/attempt-resources.d.ts +3 -0
- package/dist/context/attempt-resources.js +8 -0
- package/dist/context/attempt-resources.js.map +1 -0
- package/dist/context/session.cjs +4 -3
- package/dist/context/session.cjs.map +1 -1
- package/dist/context/session.d.cts +1 -0
- package/dist/context/session.d.mts +1 -0
- package/dist/context/session.d.ts +1 -0
- package/dist/eval/record/verdict.cjs +3 -2
- package/dist/eval/record/verdict.cjs.map +1 -1
- package/dist/experiment/host/index.cjs +1 -6
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/experiment/host/index.d.cts +1 -0
- package/dist/experiment/host/index.d.mts +1 -0
- package/dist/experiment/host/index.d.ts +1 -0
- package/dist/load-config.cjs +13 -4
- package/dist/load-config.cjs.map +1 -1
- package/dist/load-config.d.cts +4 -3
- package/dist/load-config.d.mts +4 -3
- package/dist/load-config.d.ts +4 -3
- package/dist/load-config.js +4 -2
- package/dist/o11y/parsers/codex.cjs +29 -7
- package/dist/o11y/parsers/codex.cjs.map +1 -1
- package/dist/record/codec/core.d.cts +0 -2
- package/dist/record/codec/core.d.mts +0 -2
- package/dist/record/codec/core.d.ts +0 -2
- package/dist/record/codec/identifiers.cjs +2 -3
- package/dist/record/codec/identifiers.cjs.map +1 -1
- package/dist/record/codec/identifiers.d.cts +1 -2
- package/dist/record/codec/identifiers.d.mts +1 -2
- package/dist/record/codec/identifiers.d.ts +1 -2
- package/dist/record/codec/identifiers.js +10 -12
- package/dist/record/codec/index.js +42 -44
- package/dist/record/definition/attachment.cjs +1 -0
- package/dist/record/definition/attachment.cjs.map +1 -1
- package/dist/record/definition/attachment.d.cts +14 -0
- package/dist/record/definition/attachment.d.mts +14 -0
- package/dist/record/definition/attachment.d.ts +14 -0
- package/dist/record/family/assertions-v1.cjs +104 -0
- package/dist/record/family/assertions-v1.cjs.map +1 -0
- package/dist/record/family/assertions-v1.d.cts +2 -0
- package/dist/record/family/assertions-v1.d.mts +2 -0
- package/dist/record/family/assertions-v1.d.ts +2 -0
- package/dist/record/family/assertions-v1.js +6 -0
- package/dist/record/family/assertions-v1.js.map +1 -0
- package/dist/record/family/assertions.cjs +16 -5
- package/dist/record/family/assertions.cjs.map +1 -1
- package/dist/record/family/assertions.d.cts +510 -56
- package/dist/record/family/assertions.d.mts +510 -56
- package/dist/record/family/assertions.d.ts +510 -56
- package/dist/record/family/assertions.js +14 -10
- package/dist/record/family/catalog.cjs +17 -1
- package/dist/record/family/catalog.cjs.map +1 -1
- package/dist/record/family/catalog.d.cts +1292 -104
- package/dist/record/family/catalog.d.mts +1292 -104
- package/dist/record/family/catalog.d.ts +1292 -104
- package/dist/record/family/catalog.js +22 -20
- package/dist/record/family/index.js +144 -138
- package/dist/record/family/observability-v1.cjs +5 -0
- package/dist/record/family/observability-v1.cjs.map +1 -1
- package/dist/record/family/observability.cjs +1 -1
- package/dist/record/family/observability.cjs.map +1 -1
- package/dist/record/host/runtime.cjs +323 -173
- package/dist/record/host/runtime.cjs.map +1 -1
- package/dist/record/host/types.cjs.map +1 -1
- package/dist/record/host/types.d.cts +9 -7
- package/dist/record/host/types.d.mts +9 -7
- package/dist/record/host/types.d.ts +9 -7
- package/dist/record/model/core.cjs.map +1 -1
- package/dist/record/model/core.d.cts +1 -2
- package/dist/record/model/core.d.mts +1 -2
- package/dist/record/model/core.d.ts +1 -2
- package/dist/record/model/definition.cjs +1 -2
- package/dist/record/model/definition.cjs.map +1 -1
- package/dist/record/model/definition.d.cts +1 -7
- package/dist/record/model/definition.d.mts +1 -7
- package/dist/record/model/definition.d.ts +1 -7
- package/dist/record/model/identifiers.cjs +2 -3
- package/dist/record/model/identifiers.cjs.map +1 -1
- package/dist/record/model/identifiers.d.cts +1 -3
- package/dist/record/model/identifiers.d.mts +1 -3
- package/dist/record/model/identifiers.d.ts +1 -3
- package/dist/record/model/identifiers.js +36 -38
- package/dist/record/model/index.js +60 -62
- package/dist/record/platform/node.cjs +17 -7
- package/dist/record/platform/node.cjs.map +1 -1
- package/dist/record/platform/services.cjs.map +1 -1
- package/dist/record/platform/services.d.cts +8 -3
- package/dist/record/platform/services.d.mts +8 -3
- package/dist/record/platform/services.d.ts +8 -3
- package/dist/record/reader/format.cjs +16 -65
- package/dist/record/reader/format.cjs.map +1 -1
- package/dist/record/reader/format.d.cts +5 -9
- package/dist/record/reader/format.d.mts +5 -9
- package/dist/record/reader/format.d.ts +5 -9
- package/dist/record/reader/index.js +10 -8
- package/dist/record/reader/runtime.cjs +63 -32
- package/dist/record/reader/runtime.cjs.map +1 -1
- package/dist/record/reader/runtime.d.cts +40 -4
- package/dist/record/reader/runtime.d.mts +40 -4
- package/dist/record/reader/runtime.d.ts +40 -4
- package/dist/record/reader/runtime.js +6 -4
- package/dist/report/assets/enhance.js +5 -5
- package/dist/report/assets/styles.css +190 -24
- package/dist/report/built-in/result-components.cjs +8 -5
- package/dist/report/built-in/result-components.cjs.map +1 -1
- package/dist/report/built-in/standard.cjs +3 -0
- package/dist/report/built-in/standard.cjs.map +1 -1
- package/dist/report/built-in/standard.d.cts +2 -0
- package/dist/report/built-in/standard.d.mts +2 -0
- package/dist/report/built-in/standard.d.ts +2 -0
- package/dist/report/client-dist/app.js +53 -0
- package/dist/report/components/attempt-detail/compute.cjs +108 -231
- package/dist/report/components/attempt-detail/compute.cjs.map +1 -1
- package/dist/report/components/attempt-detail/compute.d.cts +11 -45
- package/dist/report/components/attempt-detail/compute.d.mts +11 -45
- package/dist/report/components/attempt-detail/compute.d.ts +11 -45
- package/dist/report/components/attempt-detail/compute.js +2 -4
- package/dist/report/components/attempt-detail/content.cjs +4 -4
- package/dist/report/components/attempt-detail/content.cjs.map +1 -1
- package/dist/report/components/attempt-detail/validate.cjs +47 -4
- package/dist/report/components/attempt-detail/validate.cjs.map +1 -1
- package/dist/report/components/entity-lists/compute.cjs +9 -15
- package/dist/report/components/entity-lists/compute.cjs.map +1 -1
- package/dist/report/components/entity-lists/content.cjs +53 -40
- package/dist/report/components/entity-lists/content.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.cjs +1 -3
- package/dist/report/components/entity-lists/index.cjs.map +1 -1
- package/dist/report/components/experiment-detail/compute.cjs +4 -6
- package/dist/report/components/experiment-detail/compute.cjs.map +1 -1
- package/dist/report/components/summaries/index.cjs +5 -1
- package/dist/report/components/summaries/index.cjs.map +1 -1
- package/dist/report/definition/cell.cjs +14 -7
- package/dist/report/definition/cell.cjs.map +1 -1
- package/dist/report/definition/cell.d.cts +4 -0
- package/dist/report/definition/cell.d.mts +4 -0
- package/dist/report/definition/cell.d.ts +4 -0
- package/dist/report/definition/primitives/assertion-evidence.cjs +96 -0
- package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -0
- package/dist/report/definition/primitives/assertion-evidence.d.cts +11 -0
- package/dist/report/definition/primitives/assertion-evidence.d.mts +11 -0
- package/dist/report/definition/primitives/assertion-evidence.d.ts +11 -0
- package/dist/report/definition/primitives/assertion-evidence.js +6 -0
- package/dist/report/definition/primitives/assertion-evidence.js.map +1 -0
- package/dist/report/definition/primitives/conversation.cjs +7 -0
- package/dist/report/definition/primitives/conversation.cjs.map +1 -1
- package/dist/report/definition/primitives/conversation.d.cts +2 -0
- package/dist/report/definition/primitives/conversation.d.mts +2 -0
- package/dist/report/definition/primitives/conversation.d.ts +2 -0
- package/dist/report/definition/primitives/turn-trace.cjs +53 -3
- package/dist/report/definition/primitives/turn-trace.cjs.map +1 -1
- package/dist/report/definition/primitives.cjs +14 -1
- package/dist/report/definition/primitives.cjs.map +1 -1
- package/dist/report/definition/report.cjs +16 -8
- package/dist/report/definition/report.cjs.map +1 -1
- package/dist/report/definition/report.d.cts +6 -0
- package/dist/report/definition/report.d.mts +6 -0
- package/dist/report/definition/report.d.ts +6 -0
- package/dist/report/definition/table-text.cjs +12 -3
- package/dist/report/definition/table-text.cjs.map +1 -1
- package/dist/report/definition/table-text.d.cts +6 -1
- package/dist/report/definition/table-text.d.mts +6 -1
- package/dist/report/definition/table-text.d.ts +6 -1
- package/dist/report/execution/model.cjs +6 -14
- package/dist/report/execution/model.cjs.map +1 -1
- package/dist/report/execution/model.d.cts +5 -10
- package/dist/report/execution/model.d.mts +5 -10
- package/dist/report/execution/model.d.ts +5 -10
- package/dist/report/execution/model.js +6 -6
- package/dist/report/execution/paths.cjs +0 -11
- package/dist/report/execution/paths.cjs.map +1 -1
- package/dist/report/execution/paths.d.cts +0 -1
- package/dist/report/execution/paths.d.mts +0 -1
- package/dist/report/execution/paths.d.ts +0 -1
- package/dist/report/execution/paths.js +6 -8
- package/dist/report/host/execute.cjs +13 -22
- package/dist/report/host/execute.cjs.map +1 -1
- package/dist/report/host/execute.d.cts +1 -4
- package/dist/report/host/execute.d.mts +1 -4
- package/dist/report/host/execute.d.ts +1 -4
- package/dist/report/host/from-record.cjs +3 -0
- package/dist/report/host/from-record.cjs.map +1 -1
- package/dist/report/host/from-record.d.cts +4 -1
- package/dist/report/host/from-record.d.mts +4 -1
- package/dist/report/host/from-record.d.ts +4 -1
- package/dist/report/host/site-assets.cjs +1 -2
- package/dist/report/host/site-assets.cjs.map +1 -1
- package/dist/report/host/site-assets.d.cts +0 -1
- package/dist/report/host/site-assets.d.mts +0 -1
- package/dist/report/host/site-assets.d.ts +0 -1
- package/dist/report/host/site-assets.js +2 -4
- package/dist/report/host/static.cjs +71 -346
- package/dist/report/host/static.cjs.map +1 -1
- package/dist/report/host/static.d.cts +1 -3
- package/dist/report/host/static.d.mts +1 -3
- package/dist/report/host/static.d.ts +1 -3
- package/dist/report/host/static.js +2 -2
- package/dist/report/host/view-session.cjs.map +1 -1
- package/dist/report/host/view-session.d.cts +1 -1
- package/dist/report/host/view-session.d.mts +1 -1
- package/dist/report/host/view-session.d.ts +1 -1
- package/dist/report/model/locale.cjs +1 -1
- package/dist/report/model/locale.cjs.map +1 -1
- package/dist/report/model/locale.d.cts +1 -1
- package/dist/report/model/locale.d.mts +1 -1
- package/dist/report/model/locale.d.ts +1 -1
- package/dist/report/model/pricing.cjs +2 -2
- package/dist/report/model/pricing.cjs.map +1 -1
- package/dist/report/react/enhance.js +5 -5
- package/dist/report/react/styles.css +190 -24
- package/dist/runner/adoption.cjs +4 -7
- package/dist/runner/adoption.cjs.map +1 -1
- package/dist/runner/attempt-resources.cjs +60 -0
- package/dist/runner/attempt-resources.cjs.map +1 -0
- package/dist/runner/attempt-resources.d.cts +13 -0
- package/dist/runner/attempt-resources.d.mts +13 -0
- package/dist/runner/attempt-resources.d.ts +13 -0
- package/dist/runner/attempt-resources.js +6 -0
- package/dist/runner/attempt-resources.js.map +1 -0
- package/dist/runner/attempt.cjs +37 -3
- package/dist/runner/attempt.cjs.map +1 -1
- package/dist/runner/feedback/failure.cjs +77 -2
- package/dist/runner/feedback/failure.cjs.map +1 -1
- package/dist/runner/feedback/failure.d.cts +2 -1
- package/dist/runner/feedback/failure.d.mts +2 -1
- package/dist/runner/feedback/failure.d.ts +2 -1
- package/dist/runner/project-current.cjs +2 -13
- package/dist/runner/project-current.cjs.map +1 -1
- package/dist/runner/project-current.d.cts +4 -2
- package/dist/runner/project-current.d.mts +4 -2
- package/dist/runner/project-current.d.ts +4 -2
- package/dist/runner/reporters/braintrust.cjs +7 -7
- package/dist/runner/reporters/braintrust.cjs.map +1 -1
- package/dist/runner/reuse-readback.cjs +3 -4
- package/dist/runner/reuse-readback.cjs.map +1 -1
- package/dist/runner/run.cjs +5 -2
- package/dist/runner/run.cjs.map +1 -1
- package/dist/sandbox/backend.cjs +32 -2
- package/dist/sandbox/backend.cjs.map +1 -1
- package/dist/sandbox/backend.d.cts +12 -1
- package/dist/sandbox/backend.d.mts +12 -1
- package/dist/sandbox/backend.d.ts +12 -1
- package/dist/sandbox/backend.js +28 -22
- package/dist/sandbox/docker.cjs +140 -0
- package/dist/sandbox/docker.cjs.map +1 -1
- package/dist/sandbox/docker.d.cts +3 -1
- package/dist/sandbox/docker.d.mts +3 -1
- package/dist/sandbox/docker.d.ts +3 -1
- package/dist/sandbox/e2b.cjs +42 -0
- package/dist/sandbox/e2b.cjs.map +1 -1
- package/dist/sandbox/e2b.d.cts +2 -0
- package/dist/sandbox/e2b.d.mts +2 -0
- package/dist/sandbox/e2b.d.ts +2 -0
- package/dist/sandbox/local.cjs +64 -0
- package/dist/sandbox/local.cjs.map +1 -1
- package/dist/sandbox/local.d.cts +3 -1
- package/dist/sandbox/local.d.mts +3 -1
- package/dist/sandbox/local.d.ts +3 -1
- package/dist/sandbox/managed-process.cjs +49 -0
- package/dist/sandbox/managed-process.cjs.map +1 -0
- package/dist/sandbox/managed-process.d.cts +11 -0
- package/dist/sandbox/managed-process.d.mts +11 -0
- package/dist/sandbox/managed-process.d.ts +11 -0
- package/dist/sandbox/managed-process.js +6 -0
- package/dist/sandbox/managed-process.js.map +1 -0
- package/dist/sandbox/types.cjs.map +1 -1
- package/dist/sandbox/types.d.cts +24 -0
- package/dist/sandbox/types.d.mts +24 -0
- package/dist/sandbox/types.d.ts +24 -0
- package/dist/sandbox/vercel.cjs +1 -0
- package/dist/sandbox/vercel.cjs.map +1 -1
- package/dist/sandbox/vercel.d.cts +1 -0
- package/dist/sandbox/vercel.d.mts +1 -0
- package/dist/sandbox/vercel.d.ts +1 -0
- package/dist/view/server.cjs +2 -37
- package/dist/view/server.cjs.map +1 -1
- package/dist/view/server.d.cts +0 -3
- package/dist/view/server.d.mts +0 -3
- package/dist/view/server.d.ts +0 -3
- package/docs-site/zh/reference/builtin-agents.mdx +7 -7
- package/docs-site/zh/reference/official-adapters.mdx +4 -4
- package/docs-site/zh/reference/report-components.mdx +2 -2
- package/docs-site/zh/tutorials/configuration.mdx +2 -2
- package/docs-site/zh/tutorials/deploy-report-site.mdx +24 -2
- package/docs-site/zh/tutorials/publish-report.mdx +4 -4
- package/docs-site/zh/tutorials/sandbox-agent.mdx +5 -5
- package/docs-site/zh/tutorials/theming.mdx +2 -2
- package/package.json +4 -6
- package/dist/record/migration/index.cjs +0 -5
- package/dist/record/migration/index.cjs.map +0 -1
- package/dist/record/migration/index.d.cts +0 -11
- package/dist/record/migration/index.d.mts +0 -11
- package/dist/record/migration/index.d.ts +0 -11
- package/dist/record/migration/index.js +0 -6
- package/dist/record/migration/index.js.map +0 -1
- package/dist/report/host/site-runtime.cjs +0 -92
- package/dist/report/host/site-runtime.cjs.map +0 -1
- package/dist/report/host/site-runtime.d.cts +0 -9
- package/dist/report/host/site-runtime.d.mts +0 -9
- package/dist/report/host/site-runtime.d.ts +0 -9
- package/dist/report/host/site-runtime.js +0 -10
- package/dist/report/host/site-runtime.js.map +0 -1
- package/dist/view/client-dist/app.css +0 -2
- package/dist/view/client-dist/app.js +0 -49
- package/dist/view/data.cjs +0 -3
- package/dist/view/data.cjs.map +0 -1
- package/dist/view/data.d.cts +0 -9
- package/dist/view/data.d.mts +0 -9
- package/dist/view/data.d.ts +0 -9
- package/dist/view/data.js +0 -4
- package/dist/view/data.js.map +0 -1
- package/dist/view/index.cjs +0 -24
- package/dist/view/index.cjs.map +0 -1
- package/dist/view/index.d.cts +0 -9
- package/dist/view/index.d.mts +0 -9
- package/dist/view/index.d.ts +0 -9
- package/dist/view/index.js +0 -28
- package/dist/view/index.js.map +0 -1
- package/dist/view/report-view-cache.cjs +0 -200
- package/dist/view/report-view-cache.cjs.map +0 -1
- package/dist/view/report-view-cache.d.cts +0 -67
- package/dist/view/report-view-cache.d.mts +0 -67
- package/dist/view/report-view-cache.d.ts +0 -67
- package/dist/view/report-view-cache.js +0 -8
- package/dist/view/report-view-cache.js.map +0 -1
- package/dist/view/shared/types.cjs +0 -3
- package/dist/view/shared/types.cjs.map +0 -1
- package/dist/view/shared/types.d.cts +0 -51
- package/dist/view/shared/types.d.mts +0 -51
- package/dist/view/shared/types.d.ts +0 -51
- package/dist/view/shared/types.js +0 -4
- package/dist/view/shared/types.js.map +0 -1
- package/dist/view/site.cjs +0 -32
- package/dist/view/site.cjs.map +0 -1
- package/dist/view/site.d.cts +0 -24
- package/dist/view/site.d.mts +0 -24
- package/dist/view/site.d.ts +0 -24
- package/dist/view/site.js +0 -8
- package/dist/view/site.js.map +0 -1
- package/dist/view/styles.css +0 -170
- package/dist/view/template.html +0 -17
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["claude-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { Effect } from \"effect\";\nimport { defineSandboxAgent } from \"../define.ts\";\nimport { requireEnv, getEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { cloneRepo, installSkills } from \"./skills.ts\";\nimport { verifyMarketplaceName } from \"./marketplace.ts\";\nimport { assertJsonNativeConfig, loadNativeConfigFileEffect, uploadNativeConfigFileEffect, type LoadedNativeConfig, } from \"./native-config.ts\";\nimport { mapClaudeCodeSpans } from \"../o11y/otlp/mappers/claude-code.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { t } from \"../i18n/index.ts\";\nimport { DEFAULT_CLAUDE_CODE_CLI_VERSION, AGENT_BASELINE_RECIPE_REVISION } from \"./coding-cli-versions.ts\";\nimport { assertMcpServers, isHttpMcp, mcpManifestEntries } from \"./mcp.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport { createNpmCliInstaller, resolveAgentBinEffect } from \"./npm-staged.ts\";\nimport type { Agent, AgentSetupManifest, McpServer, Sandbox, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// Claude Code 的 agent adapter(沙箱型)。\n//\n// 连接方式:在沙箱里 spawn `claude` CLI,跑完读回 transcript JSONL → 标准事件流。\n// 扩展(skill / plugin / MCP)全部是构造参数,setup 里翻译成 Claude Code 的原生形态,\n// 装完写一份 manifest(见 docs/feature/adapters/architecture/coding-agent-extensions.md)。\n// ───────────────────────────────────────────────────────────────────────────\n/** Claude Code 的 skill 目录(project 级):CLI 原生扫描它,不需要额外的发现指引。 */\nconst SKILL_DIR = \".claude/skills\";\n/** 沙箱里用户级 settings 的落点:`settingsFile` 的原始字节原样替换这份原本为空的用户层。 */\nconst SETTINGS_PATH = \"~/.claude/settings.json\";\n/**\n * `settingsFile` 的保留键:`model` 归 experiment(经 `--model` flag),`env` 归 Adapter\n * (鉴权与 OTel 导出经进程环境变量注入)。清单定稿见 docs/feature/adapters/sdk/claude-code/README.md。\n */\nconst RESERVED_SETTINGS_KEYS = [\"model\", \"env\"] as const;\n/**\n * Claude Code 的原生 Plugin —— **只属于 Claude Code**,不能传给 Codex(Codex 有自己的\n * {@link import(\"./codex.ts\").CodexPluginSpec})。每一项同时声明 Marketplace 连接和其中的 Plugin 名:\n * 连上 Marketplace 不等于启用它的全部 Plugin。\n */\nexport interface ClaudeCodePluginSpec {\n marketplace: {\n /** 目标仓库 manifest 声明的真实 name;CLI 不支持由调用方另取连接别名。 */\n name: string;\n /** Marketplace 来源:GitHub `owner/repo`、Git URL 或路径。 */\n source: string;\n /** 固定 Marketplace 的 Tag、Commit 或 Branch;给了就先按 ref clone 下来再以本地路径连接。 */\n ref?: string;\n };\n /** Marketplace 中的 Plugin 名。 */\n name: string;\n}\nexport interface ClaudeCodeConfig {\n /** Anthropic API key。省略时读 ANTHROPIC_API_KEY env。 */\n apiKey?: string;\n /**\n * 自定义 API base URL(代理 / 内网端点)。省略时读 ANTHROPIC_BASE_URL env;\n * 两者都没有则用 Anthropic 官方端点(claude CLI 默认行为)。\n */\n baseUrl?: string;\n /**\n * Claude Code 进程的额外环境变量。值只保留在运行时,不进入结果沿用身份。\n * 会改变行为的非敏感值应同时写入 Experiment flags 或所属 Plugin 的身份。\n */\n env?: Readonly<globalThis.Record<string, string>>;\n /**\n * 最多跑几个 tool-use 轮次(→ `--max-turns`)。\n * 控制评估用例成本上限;省略时用 CLI 原生默认(无限制)。\n */\n maxTurns?: number;\n /**\n * 额外 MCP server(每个 Sandbox setup 时写进用户级 ~/.claude.json)。\n * stdio 形态写 command(可带 args / env);Streamable HTTP 形态写 url(可带 headers,\n * 逐字进请求头),落成 { \"type\": \"http\", \"url\": …, \"headers\": … } 条目。\n */\n mcpServers?: readonly McpServer[];\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 project 级 `.claude/skills/<name>/`,claude CLI 原生发现。\n */\n skills?: readonly SkillSpec[];\n /** Claude Code 原生 Plugin(先连 Marketplace,再从中装指定 Plugin)。 */\n plugins?: readonly ClaudeCodePluginSpec[];\n /**\n * 一份完整的 Claude Code `settings.json`(官方格式)在本地项目里的路径 —— 相对运行\n * niceeval 的项目根(含 `niceeval.config.ts` 的目录)解析,不是 Sandbox 内路径;只接受\n * 项目根内的相对路径,包含 `..` 的路径、绝对路径、`~` 路径和解析后逃出项目根的符号链接\n * 都在 setup 阶段报错。原始字节原样上传为 Sandbox 里原本为空的用户级 `~/.claude/settings.json`\n * (不继承宿主机配置、不拼接、不重新序列化);保留键 `model` 与 `env` 出现在文件里\n * setup 报错。manifest 只记项目相对路径与字节 SHA-256,不落正文。\n */\n settingsFile?: string;\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在写 settings、挂 MCP、\n * 装 Skills / Plugin、写 manifest 全部完成后执行,适合跑插件自带的 setup 脚本这类\n * 「安装产物就位后才能跑」的过程动作。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: readonly SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: readonly SandboxCommand[];\n}\nexport function claudeCodeAgent(config?: ClaudeCodeConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"ANTHROPIC_API_KEY\");\n const getBaseUrl = () => config?.baseUrl ?? getEnv(\"ANTHROPIC_BASE_URL\");\n const agentEnv = Object.freeze({ ...(config?.env ?? {}) });\n const agentEnvSensitiveValues = Object.freeze(Object.values(agentEnv));\n const { ensure, installer } = createNpmCliInstaller({\n identity: {\n agent: \"claude-code\",\n version: DEFAULT_CLAUDE_CODE_CLI_VERSION,\n revision: String(AGENT_BASELINE_RECIPE_REVISION[\"claude-code\"]),\n },\n packageName: \"@anthropic-ai/claude-code\",\n bin: \"claude\",\n });\n return registerAgentLifecycleHookCommands(defineSandboxAgent({\n name: \"claude-code\",\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapClaudeCodeSpans,\n ensure,\n installers: [installer],\n // claude CLI 原生 OTLP trace spans(beta):interaction / llm_request / tool 层级,\n // 需要 CLAUDE_CODE_ENHANCED_TELEMETRY_BETA 开关。\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n CLAUDE_CODE_ENABLE_TELEMETRY: \"1\",\n CLAUDE_CODE_ENHANCED_TELEMETRY_BETA: \"1\",\n OTEL_TRACES_EXPORTER: \"otlp\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n // CLI 是短命进程:压短导出间隔,别让 span 死在退出前的批处理队列里。\n OTEL_TRACES_EXPORT_INTERVAL: \"1000\",\n }),\n },\n setup: (sb, ctx) => Effect.runPromise(Effect.scoped(Effect.gen(function* () {\n // 原生配置文件最先落(安装顺序契约的第 1 步):本地读原始字节 → 验 JSON 语法与保留键\n // → 原样替换沙箱里原本为空的用户级 settings.json。字节 SHA-256 进 manifest 与安装\n // checkpoint key(见 native-config.ts 的 nativeConfigCheckpointItem)。\n let settings: LoadedNativeConfig | undefined;\n if (config?.settingsFile !== undefined) {\n settings = yield* loadNativeConfigFileEffect({\n agent: \"claude-code\",\n field: \"settingsFile\",\n path: config.settingsFile,\n });\n yield* Effect.try({\n try: () => assertJsonNativeConfig(settings!, {\n agent: \"claude-code\",\n field: \"settingsFile\",\n reservedKeys: RESERVED_SETTINGS_KEYS,\n }),\n catch: (cause) => cause,\n });\n yield* uploadNativeConfigFileEffect(sb, settings, SETTINGS_PATH);\n }\n yield* Effect.tryPromise({\n try: async () => {\n if (config?.mcpServers?.length) {\n assertMcpServers(config.mcpServers);\n const servers: globalThis.Record<string, object> = {};\n const sensitiveValues: string[] = [];\n for (const s of config.mcpServers) {\n if (isHttpMcp(s)) {\n const headers = s.headers;\n if (headers)\n sensitiveValues.push(...Object.values(headers));\n servers[s.name] = {\n type: \"http\",\n url: s.url,\n ...(headers && Object.keys(headers).length && { headers }),\n };\n }\n else {\n const env = s.env;\n if (env)\n sensitiveValues.push(...Object.values(env));\n servers[s.name] = {\n command: s.command,\n ...(s.args?.length && { args: s.args }),\n ...(env && { env }),\n };\n }\n }\n // 用户级 MCP 配置在 ~/.claude.json(顶层 mcpServers 字段),不是 ~/.claude/claude.json\n // ——后者 claude CLI 根本不读,MCP 静默挂不上(本机 `claude mcp list` 可核对)。\n await shared.writeFile(sb, \"~/.claude.json\", JSON.stringify({ mcpServers: servers }, null, 2), { sensitiveValues });\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n }\n if (config?.plugins?.length) {\n manifest.nativePlugins = await installPlugins(sb, config.plugins);\n }\n if (config?.mcpServers?.length) {\n // manifest 里只记「挂了哪个 server、怎么连」;env / headers 里可能有 token,不落盘。\n manifest.mcpServers = mcpManifestEntries(config.mcpServers);\n }\n if (settings) {\n // 只记来源路径与字节哈希,不落正文(任意官方配置都可能带敏感字符串)。\n manifest.nativeConfigFile = { agent: \"claude-code\", path: settings.path, sha256: settings.sha256 };\n }\n // 什么都没装就不写 manifest:空 artifact 不落文件(同 results 的落盘规则)。\n if (manifest.skills.length ||\n manifest.nativePlugins?.length ||\n manifest.mcpServers?.length ||\n manifest.nativeConfigFile) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"claude-code\", config?.postSetup);\n },\n catch: (cause) => cause,\n });\n })), { signal: ctx.signal }),\n async teardown(sb, ctx) {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // claude-code 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"claude-code\", config?.preTeardown);\n },\n send: (input, ctx) => Effect.runPromise(Effect.scoped(Effect.gen(function* () {\n const sb = ctx.sandbox;\n const claudeBin = yield* resolveAgentBinEffect(sb, \"claude\");\n return yield* Effect.tryPromise({\n try: async (signal) => {\n const args = [\"--print\", \"--dangerously-skip-permissions\"];\n if (ctx.model)\n args.push(\"--model\", ctx.model);\n if (config?.maxTurns != null)\n args.push(\"--max-turns\", String(config.maxTurns));\n if (ctx.flags.webResearch)\n args.push(\"--allowedTools\", \"WebSearch,WebFetch\");\n if (ctx.session.id)\n args.push(\"--resume\", ctx.session.id);\n // --allowedTools is variadic in Claude Code. Terminate option parsing so the\n // positional prompt cannot be consumed as one more allowed tool name.\n args.push(\"--\", input.text);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n ...agentEnv,\n ANTHROPIC_API_KEY: apiKey,\n // Eval runs must not silently change CLI version after the sandbox artifact was built.\n DISABLE_AUTOUPDATER: \"1\",\n ...ctx.telemetry?.env,\n };\n const baseUrl = getBaseUrl();\n if (baseUrl)\n env[\"ANTHROPIC_BASE_URL\"] = baseUrl;\n const res = await sb.runCommand(claudeBin, args, {\n env,\n sensitiveValues: [apiKey, ...agentEnvSensitiveValues],\n stream: true,\n signal,\n });\n // 「最新 jsonl」而非按 session id 精确定位:--resume 会 fork 新 session id 的新文件,\n // 精确匹配旧 id 会读到过期 transcript。send 串行,最新的一定是刚跑完的这次。\n const raw = await shared.captureLatestJsonl(sb, \"~/.claude/projects\");\n ctx.session.capture(shared.sessionIdFromClaudeTranscript(raw));\n const parsed = shared.parseClaudeCode(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Claude Code transcript was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Claude Code transcript lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\" as const,\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n catch: (cause) => cause,\n });\n })), { signal: ctx.signal }),\n }), config?.postSetup, config?.preTeardown);\n}\n/**\n * 先按 `marketplace.name` 建立 Marketplace 连接(同名只连一次,add 后回读注册列表校验\n * 名字真的注册上了),再从该连接装指定 Plugin。\n * `claude plugin marketplace add` 没有钉 ref 的入口,所以要钉 ref 时先自己按 ref clone 下来,\n * 再以本地路径连接(CLI 支持 path 形态的 marketplace 源)—— 「来源必须可复现」不因 CLI 少个\n * flag 就打折。\n *\n * 注册类命令是追加式的,而 Sandbox 复用下沙箱带着上一条 attempt 的 `$HOME` 进场,所以每一步\n * 先读沙箱真实状态、把它收敛到声明,再执行 add / install(契约见 docs/feature/adapters/\n * architecture/coding-agent-extensions.md「安装收敛:不假设沙箱空白」)。空白沙箱读回为空,\n * 走的是同一条代码路径。\n */\nexport async function installPlugins(sb: Sandbox, plugins: readonly ClaudeCodePluginSpec[]): Promise<NonNullable<AgentSetupManifest[\"nativePlugins\"]>> {\n const connected = new Set<string>();\n const out: NonNullable<AgentSetupManifest[\"nativePlugins\"]> = [];\n // 摘除顺序固定「先卸完全部同名插件、后摘 marketplace」:插件按 `<plugin>@<marketplace>` 定位,\n // 注册先没了就定位不到残留的那份安装。整体先于安装循环执行,多个插件共用一个 marketplace\n // 时第二个插件的残留才摘得到。\n for (const plugin of plugins) {\n await uninstallPlugins(sb, plugin.name);\n }\n for (const plugin of plugins) {\n const { marketplace } = plugin;\n if (!connected.has(marketplace.name)) {\n await dropRegisteredMarketplace(sb, marketplace.name);\n const source = marketplace.ref\n ? await cloneRepo(sb, marketplace.source, marketplace.ref)\n : marketplace.source;\n const addCommand = `${shared.agentBin(\"claude\")} plugin marketplace add ${shared.shellQuote(source)}`;\n let add = await sb.runShell(addCommand);\n // The native CLI fetches remote marketplace metadata during add. A\n // transient connection failure must not discard an otherwise reusable\n // Sandbox, but every retry starts from the same declared empty state.\n for (let attempt = 1; add.exitCode !== 0 && attempt < 3; attempt += 1) {\n await dropRegisteredMarketplace(sb, marketplace.name);\n add = await sb.runShell(addCommand);\n }\n if (add.exitCode !== 0) {\n throw new Error(t(\"plugin.marketplaceFailed\", {\n agent: \"claude-code\",\n name: marketplace.name,\n source: marketplace.source,\n ref: marketplace.ref ?? \"(default)\",\n tail: outputTail(add),\n }));\n }\n // add 静默按目标仓库 manifest 的 name 注册,错名会拖到 plugin install 才炸;\n // 回读注册列表立刻校验(契约与真机复现见 marketplace.ts 顶部说明)。\n await verifyMarketplaceName(sb, {\n agent: \"claude-code\",\n listCommand: \"claude plugin marketplace list --json\",\n marketplace,\n knownNames: connected,\n });\n connected.add(marketplace.name);\n }\n const id = `${plugin.name}@${marketplace.name}`;\n const install = await sb.runShell(`${shared.agentBin(\"claude\")} plugin install ${shared.shellQuote(id)}`);\n if (install.exitCode !== 0) {\n throw new Error(t(\"plugin.installFailed\", {\n agent: \"claude-code\",\n name: plugin.name,\n marketplace: marketplace.name,\n tail: outputTail(install),\n }));\n }\n const resolvedVersion = await installedVersion(sb, id);\n out.push({\n agent: \"claude-code\",\n marketplace: {\n name: marketplace.name,\n source: marketplace.source,\n ...(marketplace.ref !== undefined ? { ref: marketplace.ref } : {}),\n },\n name: plugin.name,\n ...(resolvedVersion !== undefined ? { resolvedVersion } : {}),\n });\n }\n return out;\n}\n/**\n * `claude plugin list --json` 的已安装条目:`[{ id: \"<plugin>@<marketplace>\", version, scope, … }]`\n * (真机核对 claude 2.1.220)。同一个 plugin 可以在 user / project / local 多个 scope 各有一条,\n * 卸载要带上条目自己的 scope。抠不出(非 JSON / 未知形状)返回 undefined,由调用方决定放行还是抛错。\n */\ninterface ClaudeInstalledPlugin {\n id?: string;\n version?: string;\n scope?: string;\n}\nfunction claudeInstalledPlugins(stdout: string): ClaudeInstalledPlugin[] | undefined {\n let raw: unknown;\n try {\n raw = JSON.parse(stdout);\n }\n catch {\n return undefined;\n }\n if (!Array.isArray(raw))\n return undefined;\n return raw.filter((item): item is ClaudeInstalledPlugin => !!item && typeof item === \"object\");\n}\n/**\n * 与声明同名的 Plugin 已安装就先卸载(不论它出自哪个 marketplace),让本条 attempt 的安装与\n * manifest 里的解析版本同源。claude 对已装的 plugin 重装是空操作(`Plugin \"…\" is already\n * installed`,真机 2.1.220),不先卸就等于把上一条 attempt 装出的内容记成本条的安装事实。\n */\nasync function uninstallPlugins(sb: Sandbox, name: string): Promise<void> {\n const listCommand = \"claude plugin list --json\";\n const res = await sb.runShell(`${shared.agentBin(\"claude\")} plugin list --json`);\n const list = res.exitCode === 0 ? claudeInstalledPlugins(res.stdout) : undefined;\n if (list === undefined) {\n throw new Error(t(\"plugin.listFailed\", { agent: \"claude-code\", command: listCommand, tail: outputTail(res) }));\n }\n const targets = new Map<string, {\n id: string;\n scope?: string;\n }>();\n for (const entry of list) {\n const id = entry.id;\n if (!id || id.split(\"@\")[0] !== name)\n continue;\n targets.set(`${id} ${entry.scope ?? \"\"}`, { id, ...(entry.scope ? { scope: entry.scope } : {}) });\n }\n for (const target of targets.values()) {\n const scopeFlag = target.scope ? ` --scope ${shared.shellQuote(target.scope)}` : \"\";\n const remove = await sb.runShell(`${shared.agentBin(\"claude\")} plugin uninstall ${shared.shellQuote(target.id)}${scopeFlag}`);\n if (remove.exitCode !== 0) {\n throw new Error(t(\"plugin.removeFailed\", { agent: \"claude-code\", name: target.id, tail: outputTail(remove) }));\n }\n }\n}\n/**\n * 按声明名字无条件摘除同名 marketplace 注册,再由调用方按声明的 source(必要时是按 ref clone\n * 出的本地路径)重新 add。不比对来源等价性、也不以注册在回读列表里可见为前提(与 codex 侧\n * 同一条收敛规则,机制见 codex.ts 的 dropRegisteredMarketplace 注释):claude 对已注册的名字\n * 直接复用磁盘上那份(`Marketplace '…' already on disk`,真机 2.1.220),声明的来源根本不生效,\n * 不先摘干净就是静默陈旧。「本就没有可摘的」(`not found`,exit 1)按已收敛处理;\n * 摘除不带 `--scope`,按 CLI 默认摘掉所有 scope 里的声明。\n */\nasync function dropRegisteredMarketplace(sb: Sandbox, name: string): Promise<void> {\n await sb.runShell(`${shared.agentBin(\"claude\")} plugin marketplace remove ${shared.shellQuote(name)}`);\n}\n/** 装完回读版本;取不到不阻断安装(manifest 里 resolvedVersion 省略)。 */\nasync function installedVersion(sb: Sandbox, id: string): Promise<string | undefined> {\n const res = await sb.runShell(`${shared.agentBin(\"claude\")} plugin list --json`);\n if (res.exitCode !== 0)\n return undefined;\n return claudeInstalledPlugins(res.stdout)?.find((p) => p.id === id)?.version;\n}\nfunction outputTail(res: {\n stdout: string;\n stderr: string;\n}, n = 12): string {\n return (res.stdout + res.stderr).trim().split(\"\\n\").slice(-n).join(\"\\n\");\n}\nexport default claudeCodeAgent();\n"]}
|
|
1
|
+
{"version":3,"file":"claude-code.js","sourceRoot":"","sources":["claude-code.ts"],"names":[],"mappings":"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","sourcesContent":["import { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { Effect } from \"effect\";\nimport { defineSandboxAgent } from \"../define.ts\";\nimport { requireEnv, getEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { cloneRepo, installSkills } from \"./skills.ts\";\nimport { verifyMarketplaceName } from \"./marketplace.ts\";\nimport { assertJsonNativeConfig, loadNativeConfigFileEffect, uploadNativeConfigFileEffect, type LoadedNativeConfig, } from \"./native-config.ts\";\nimport { mapClaudeCodeSpans } from \"../o11y/otlp/mappers/claude-code.ts\";\nimport { t } from \"../i18n/index.ts\";\nimport { DEFAULT_CLAUDE_CODE_CLI_VERSION, AGENT_BASELINE_RECIPE_REVISION } from \"./coding-cli-versions.ts\";\nimport { assertMcpServers, isHttpMcp, mcpManifestEntries } from \"./mcp.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport { createNpmCliInstaller, resolveAgentBinEffect } from \"./npm-staged.ts\";\nimport type { Agent, AgentSetupManifest, McpServer, Sandbox, SkillSpec } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { requireManagedProcessCapability } from \"../sandbox/backend.ts\";\nimport { attemptResources } from \"../context/attempt-resources.ts\";\nimport { sendClaudeCodeNative } from \"./claude-code-native.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// Claude Code 的 agent adapter(沙箱型)。\n//\n// 连接方式:在沙箱里 spawn `claude` CLI,跑完读回 transcript JSONL → 标准事件流。\n// 扩展(skill / plugin / MCP)全部是构造参数,setup 里翻译成 Claude Code 的原生形态,\n// 装完写一份 manifest(见 docs/feature/adapters/architecture/coding-agent-extensions.md)。\n// ───────────────────────────────────────────────────────────────────────────\n/** Claude Code 的 skill 目录(project 级):CLI 原生扫描它,不需要额外的发现指引。 */\nconst SKILL_DIR = \".claude/skills\";\n/** 沙箱里用户级 settings 的落点:`settingsFile` 的原始字节原样替换这份原本为空的用户层。 */\nconst SETTINGS_PATH = \"~/.claude/settings.json\";\n/**\n * `settingsFile` 的保留键:`model` 归 experiment(经 `--model` flag),`env` 归 Adapter\n * (鉴权与 OTel 导出经进程环境变量注入)。清单定稿见 docs/feature/adapters/sdk/claude-code/README.md。\n */\nconst RESERVED_SETTINGS_KEYS = [\"model\", \"env\"] as const;\n/**\n * Claude Code 的原生 Plugin —— **只属于 Claude Code**,不能传给 Codex(Codex 有自己的\n * {@link import(\"./codex.ts\").CodexPluginSpec})。每一项同时声明 Marketplace 连接和其中的 Plugin 名:\n * 连上 Marketplace 不等于启用它的全部 Plugin。\n */\nexport interface ClaudeCodePluginSpec {\n marketplace: {\n /** 目标仓库 manifest 声明的真实 name;CLI 不支持由调用方另取连接别名。 */\n name: string;\n /** Marketplace 来源:GitHub `owner/repo`、Git URL 或路径。 */\n source: string;\n /** 固定 Marketplace 的 Tag、Commit 或 Branch;给了就先按 ref clone 下来再以本地路径连接。 */\n ref?: string;\n };\n /** Marketplace 中的 Plugin 名。 */\n name: string;\n}\nexport interface ClaudeCodeConfig {\n /** Anthropic API key。省略时读 ANTHROPIC_API_KEY env。 */\n apiKey?: string;\n /**\n * 自定义 API base URL(代理 / 内网端点)。省略时读 ANTHROPIC_BASE_URL env;\n * 两者都没有则用 Anthropic 官方端点(claude CLI 默认行为)。\n */\n baseUrl?: string;\n /**\n * Claude Code 进程的额外环境变量。值只保留在运行时,不进入结果沿用身份。\n * 会改变行为的非敏感值应同时写入 Experiment flags 或所属 Plugin 的身份。\n */\n env?: Readonly<globalThis.Record<string, string>>;\n /**\n * 最多跑几个 tool-use 轮次(→ `--max-turns`)。\n * 控制评估用例成本上限;省略时用 CLI 原生默认(无限制)。\n */\n maxTurns?: number;\n /**\n * 额外 MCP server(每个 Sandbox setup 时写进用户级 ~/.claude.json)。\n * stdio 形态写 command(可带 args / env);Streamable HTTP 形态写 url(可带 headers,\n * 逐字进请求头),落成 { \"type\": \"http\", \"url\": …, \"headers\": … } 条目。\n */\n mcpServers?: readonly McpServer[];\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 project 级 `.claude/skills/<name>/`,claude CLI 原生发现。\n */\n skills?: readonly SkillSpec[];\n /** Claude Code 原生 Plugin(先连 Marketplace,再从中装指定 Plugin)。 */\n plugins?: readonly ClaudeCodePluginSpec[];\n /**\n * 一份完整的 Claude Code `settings.json`(官方格式)在本地项目里的路径 —— 相对运行\n * niceeval 的项目根(含 `niceeval.config.ts` 的目录)解析,不是 Sandbox 内路径;只接受\n * 项目根内的相对路径,包含 `..` 的路径、绝对路径、`~` 路径和解析后逃出项目根的符号链接\n * 都在 setup 阶段报错。原始字节原样上传为 Sandbox 里原本为空的用户级 `~/.claude/settings.json`\n * (不继承宿主机配置、不拼接、不重新序列化);保留键 `model` 与 `env` 出现在文件里\n * setup 报错。manifest 只记项目相对路径与字节 SHA-256,不落正文。\n */\n settingsFile?: string;\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在写 settings、挂 MCP、\n * 装 Skills / Plugin、写 manifest 全部完成后执行,适合跑插件自带的 setup 脚本这类\n * 「安装产物就位后才能跑」的过程动作。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: readonly SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: readonly SandboxCommand[];\n}\nexport function claudeCodeAgent(config?: ClaudeCodeConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"ANTHROPIC_API_KEY\");\n const getBaseUrl = () => config?.baseUrl ?? getEnv(\"ANTHROPIC_BASE_URL\");\n const agentEnv = Object.freeze({ ...(config?.env ?? {}) });\n const agentEnvSensitiveValues = Object.freeze(Object.values(agentEnv));\n const { ensure, installer } = createNpmCliInstaller({\n identity: {\n agent: \"claude-code\",\n version: DEFAULT_CLAUDE_CODE_CLI_VERSION,\n revision: String(AGENT_BASELINE_RECIPE_REVISION[\"claude-code\"]),\n },\n packageName: \"@anthropic-ai/claude-code\",\n bin: \"claude\",\n });\n return registerAgentLifecycleHookCommands(defineSandboxAgent({\n name: \"claude-code\",\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapClaudeCodeSpans,\n ensure,\n installers: [installer],\n // claude CLI 原生 OTLP trace spans(beta):interaction / llm_request / tool 层级,\n // 需要 CLAUDE_CODE_ENHANCED_TELEMETRY_BETA 开关。\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n CLAUDE_CODE_ENABLE_TELEMETRY: \"1\",\n CLAUDE_CODE_ENHANCED_TELEMETRY_BETA: \"1\",\n OTEL_TRACES_EXPORTER: \"otlp\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n // CLI 是短命进程:压短导出间隔,别让 span 死在退出前的批处理队列里。\n OTEL_TRACES_EXPORT_INTERVAL: \"1000\",\n }),\n },\n setup: (sb, ctx) => Effect.runPromise(Effect.scoped(Effect.gen(function* () {\n yield* Effect.try({ try: () => requireManagedProcessCapability(sb, \"claude-code\"), catch: (cause) => cause });\n // 原生配置文件最先落(安装顺序契约的第 1 步):本地读原始字节 → 验 JSON 语法与保留键\n // → 原样替换沙箱里原本为空的用户级 settings.json。字节 SHA-256 进 manifest 与安装\n // checkpoint key(见 native-config.ts 的 nativeConfigCheckpointItem)。\n let settings: LoadedNativeConfig | undefined;\n if (config?.settingsFile !== undefined) {\n settings = yield* loadNativeConfigFileEffect({\n agent: \"claude-code\",\n field: \"settingsFile\",\n path: config.settingsFile,\n });\n yield* Effect.try({\n try: () => assertJsonNativeConfig(settings!, {\n agent: \"claude-code\",\n field: \"settingsFile\",\n reservedKeys: RESERVED_SETTINGS_KEYS,\n }),\n catch: (cause) => cause,\n });\n yield* uploadNativeConfigFileEffect(sb, settings, SETTINGS_PATH);\n }\n yield* Effect.tryPromise({\n try: async () => {\n if (config?.mcpServers?.length) {\n assertMcpServers(config.mcpServers);\n const servers: globalThis.Record<string, object> = {};\n const sensitiveValues: string[] = [];\n for (const s of config.mcpServers) {\n if (isHttpMcp(s)) {\n const headers = s.headers;\n if (headers)\n sensitiveValues.push(...Object.values(headers));\n servers[s.name] = {\n type: \"http\",\n url: s.url,\n ...(headers && Object.keys(headers).length && { headers }),\n };\n }\n else {\n const env = s.env;\n if (env)\n sensitiveValues.push(...Object.values(env));\n servers[s.name] = {\n command: s.command,\n ...(s.args?.length && { args: s.args }),\n ...(env && { env }),\n };\n }\n }\n // 用户级 MCP 配置在 ~/.claude.json(顶层 mcpServers 字段),不是 ~/.claude/claude.json\n // ——后者 claude CLI 根本不读,MCP 静默挂不上(本机 `claude mcp list` 可核对)。\n await shared.writeFile(sb, \"~/.claude.json\", JSON.stringify({ mcpServers: servers }, null, 2), { sensitiveValues });\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n }\n if (config?.plugins?.length) {\n manifest.nativePlugins = await installPlugins(sb, config.plugins);\n }\n if (config?.mcpServers?.length) {\n // manifest 里只记「挂了哪个 server、怎么连」;env / headers 里可能有 token,不落盘。\n manifest.mcpServers = mcpManifestEntries(config.mcpServers);\n }\n if (settings) {\n // 只记来源路径与字节哈希,不落正文(任意官方配置都可能带敏感字符串)。\n manifest.nativeConfigFile = { agent: \"claude-code\", path: settings.path, sha256: settings.sha256 };\n }\n // 什么都没装就不写 manifest:空 artifact 不落文件(同 results 的落盘规则)。\n if (manifest.skills.length ||\n manifest.nativePlugins?.length ||\n manifest.mcpServers?.length ||\n manifest.nativeConfigFile) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"claude-code\", config?.postSetup);\n },\n catch: (cause) => cause,\n });\n })), { signal: ctx.signal }),\n async teardown(sb, ctx) {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // claude-code 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"claude-code\", config?.preTeardown);\n await attemptResources(ctx)?.shutdownAll(ctx.signal);\n },\n async send(input, ctx) {\n const args: string[] = [];\n if (ctx.model)\n args.push(\"--model\", ctx.model);\n if (config?.maxTurns != null)\n args.push(\"--max-turns\", String(config.maxTurns));\n if (ctx.flags.webResearch)\n args.push(\"--allowedTools\", \"WebSearch,WebFetch\");\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n ...agentEnv,\n ANTHROPIC_API_KEY: apiKey,\n // Eval runs must not silently change CLI version after the sandbox artifact was built.\n DISABLE_AUTOUPDATER: \"1\",\n ...ctx.telemetry?.env,\n };\n const baseUrl = getBaseUrl();\n if (baseUrl)\n env[\"ANTHROPIC_BASE_URL\"] = baseUrl;\n return sendClaudeCodeNative(input, ctx, args, env);\n },\n }), config?.postSetup, config?.preTeardown);\n}\n/**\n * 先按 `marketplace.name` 建立 Marketplace 连接(同名只连一次,add 后回读注册列表校验\n * 名字真的注册上了),再从该连接装指定 Plugin。\n * `claude plugin marketplace add` 没有钉 ref 的入口,所以要钉 ref 时先自己按 ref clone 下来,\n * 再以本地路径连接(CLI 支持 path 形态的 marketplace 源)—— 「来源必须可复现」不因 CLI 少个\n * flag 就打折。\n *\n * 注册类命令是追加式的,而 Sandbox 复用下沙箱带着上一条 attempt 的 `$HOME` 进场,所以每一步\n * 先读沙箱真实状态、把它收敛到声明,再执行 add / install(契约见 docs/feature/adapters/\n * architecture/coding-agent-extensions.md「安装收敛:不假设沙箱空白」)。空白沙箱读回为空,\n * 走的是同一条代码路径。\n */\nexport async function installPlugins(sb: Sandbox, plugins: readonly ClaudeCodePluginSpec[]): Promise<NonNullable<AgentSetupManifest[\"nativePlugins\"]>> {\n const connected = new Set<string>();\n const out: NonNullable<AgentSetupManifest[\"nativePlugins\"]> = [];\n // 摘除顺序固定「先卸完全部同名插件、后摘 marketplace」:插件按 `<plugin>@<marketplace>` 定位,\n // 注册先没了就定位不到残留的那份安装。整体先于安装循环执行,多个插件共用一个 marketplace\n // 时第二个插件的残留才摘得到。\n for (const plugin of plugins) {\n await uninstallPlugins(sb, plugin.name);\n }\n for (const plugin of plugins) {\n const { marketplace } = plugin;\n if (!connected.has(marketplace.name)) {\n await dropRegisteredMarketplace(sb, marketplace.name);\n const source = marketplace.ref\n ? await cloneRepo(sb, marketplace.source, marketplace.ref)\n : marketplace.source;\n const addCommand = `${shared.agentBin(\"claude\")} plugin marketplace add ${shared.shellQuote(source)}`;\n let add = await sb.runShell(addCommand);\n // The native CLI fetches remote marketplace metadata during add. A\n // transient connection failure must not discard an otherwise reusable\n // Sandbox, but every retry starts from the same declared empty state.\n for (let attempt = 1; add.exitCode !== 0 && attempt < 3; attempt += 1) {\n await dropRegisteredMarketplace(sb, marketplace.name);\n add = await sb.runShell(addCommand);\n }\n if (add.exitCode !== 0) {\n throw new Error(t(\"plugin.marketplaceFailed\", {\n agent: \"claude-code\",\n name: marketplace.name,\n source: marketplace.source,\n ref: marketplace.ref ?? \"(default)\",\n tail: outputTail(add),\n }));\n }\n // add 静默按目标仓库 manifest 的 name 注册,错名会拖到 plugin install 才炸;\n // 回读注册列表立刻校验(契约与真机复现见 marketplace.ts 顶部说明)。\n await verifyMarketplaceName(sb, {\n agent: \"claude-code\",\n listCommand: \"claude plugin marketplace list --json\",\n marketplace,\n knownNames: connected,\n });\n connected.add(marketplace.name);\n }\n const id = `${plugin.name}@${marketplace.name}`;\n const install = await sb.runShell(`${shared.agentBin(\"claude\")} plugin install ${shared.shellQuote(id)}`);\n if (install.exitCode !== 0) {\n throw new Error(t(\"plugin.installFailed\", {\n agent: \"claude-code\",\n name: plugin.name,\n marketplace: marketplace.name,\n tail: outputTail(install),\n }));\n }\n const resolvedVersion = await installedVersion(sb, id);\n out.push({\n agent: \"claude-code\",\n marketplace: {\n name: marketplace.name,\n source: marketplace.source,\n ...(marketplace.ref !== undefined ? { ref: marketplace.ref } : {}),\n },\n name: plugin.name,\n ...(resolvedVersion !== undefined ? { resolvedVersion } : {}),\n });\n }\n return out;\n}\n/**\n * `claude plugin list --json` 的已安装条目:`[{ id: \"<plugin>@<marketplace>\", version, scope, … }]`\n * (真机核对 claude 2.1.220)。同一个 plugin 可以在 user / project / local 多个 scope 各有一条,\n * 卸载要带上条目自己的 scope。抠不出(非 JSON / 未知形状)返回 undefined,由调用方决定放行还是抛错。\n */\ninterface ClaudeInstalledPlugin {\n id?: string;\n version?: string;\n scope?: string;\n}\nfunction claudeInstalledPlugins(stdout: string): ClaudeInstalledPlugin[] | undefined {\n let raw: unknown;\n try {\n raw = JSON.parse(stdout);\n }\n catch {\n return undefined;\n }\n if (!Array.isArray(raw))\n return undefined;\n return raw.filter((item): item is ClaudeInstalledPlugin => !!item && typeof item === \"object\");\n}\n/**\n * 与声明同名的 Plugin 已安装就先卸载(不论它出自哪个 marketplace),让本条 attempt 的安装与\n * manifest 里的解析版本同源。claude 对已装的 plugin 重装是空操作(`Plugin \"…\" is already\n * installed`,真机 2.1.220),不先卸就等于把上一条 attempt 装出的内容记成本条的安装事实。\n */\nasync function uninstallPlugins(sb: Sandbox, name: string): Promise<void> {\n const listCommand = \"claude plugin list --json\";\n const res = await sb.runShell(`${shared.agentBin(\"claude\")} plugin list --json`);\n const list = res.exitCode === 0 ? claudeInstalledPlugins(res.stdout) : undefined;\n if (list === undefined) {\n throw new Error(t(\"plugin.listFailed\", { agent: \"claude-code\", command: listCommand, tail: outputTail(res) }));\n }\n const targets = new Map<string, {\n id: string;\n scope?: string;\n }>();\n for (const entry of list) {\n const id = entry.id;\n if (!id || id.split(\"@\")[0] !== name)\n continue;\n targets.set(`${id} ${entry.scope ?? \"\"}`, { id, ...(entry.scope ? { scope: entry.scope } : {}) });\n }\n for (const target of targets.values()) {\n const scopeFlag = target.scope ? ` --scope ${shared.shellQuote(target.scope)}` : \"\";\n const remove = await sb.runShell(`${shared.agentBin(\"claude\")} plugin uninstall ${shared.shellQuote(target.id)}${scopeFlag}`);\n if (remove.exitCode !== 0) {\n throw new Error(t(\"plugin.removeFailed\", { agent: \"claude-code\", name: target.id, tail: outputTail(remove) }));\n }\n }\n}\n/**\n * 按声明名字无条件摘除同名 marketplace 注册,再由调用方按声明的 source(必要时是按 ref clone\n * 出的本地路径)重新 add。不比对来源等价性、也不以注册在回读列表里可见为前提(与 codex 侧\n * 同一条收敛规则,机制见 codex.ts 的 dropRegisteredMarketplace 注释):claude 对已注册的名字\n * 直接复用磁盘上那份(`Marketplace '…' already on disk`,真机 2.1.220),声明的来源根本不生效,\n * 不先摘干净就是静默陈旧。「本就没有可摘的」(`not found`,exit 1)按已收敛处理;\n * 摘除不带 `--scope`,按 CLI 默认摘掉所有 scope 里的声明。\n */\nasync function dropRegisteredMarketplace(sb: Sandbox, name: string): Promise<void> {\n await sb.runShell(`${shared.agentBin(\"claude\")} plugin marketplace remove ${shared.shellQuote(name)}`);\n}\n/** 装完回读版本;取不到不阻断安装(manifest 里 resolvedVersion 省略)。 */\nasync function installedVersion(sb: Sandbox, id: string): Promise<string | undefined> {\n const res = await sb.runShell(`${shared.agentBin(\"claude\")} plugin list --json`);\n if (res.exitCode !== 0)\n return undefined;\n return claudeInstalledPlugins(res.stdout)?.find((p) => p.id === id)?.version;\n}\nfunction outputTail(res: {\n stdout: string;\n stderr: string;\n}, n = 12): string {\n return (res.stdout + res.stderr).trim().split(\"\\n\").slice(-n).join(\"\\n\");\n}\nexport default claudeCodeAgent();\n"]}
|
|
@@ -0,0 +1,314 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendCodexAppServer = sendCodexAppServer;
|
|
4
|
+
const session_slot_ts_1 = require("./session-slot.cjs");
|
|
5
|
+
const managed_jsonl_ts_1 = require("./managed-jsonl.cjs");
|
|
6
|
+
const shared_ts_1 = require("./shared.cjs");
|
|
7
|
+
const command_projection_ts_1 = require("../o11y/command-projection.cjs");
|
|
8
|
+
const send_failures_ts_1 = require("../context/send-failures.cjs");
|
|
9
|
+
const external_cause_ts_1 = require("../shared/external-cause.cjs");
|
|
10
|
+
const attempt_resources_ts_1 = require("../context/attempt-resources.cjs");
|
|
11
|
+
const stateSlot = (0, session_slot_ts_1.createSessionSlot)("codex/app-server-native");
|
|
12
|
+
function record(value) {
|
|
13
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
14
|
+
}
|
|
15
|
+
function eventKey(event) {
|
|
16
|
+
if (event.type === "operation.started" || event.type === "operation.finished")
|
|
17
|
+
return `${event.type}:${event.operationId}`;
|
|
18
|
+
if (event.type === "skill.loaded" && event.operationId)
|
|
19
|
+
return `${event.type}:${event.operationId}`;
|
|
20
|
+
return undefined;
|
|
21
|
+
}
|
|
22
|
+
function normalizeItem(value) {
|
|
23
|
+
const item = record(value);
|
|
24
|
+
if (!item || typeof item.type !== "string")
|
|
25
|
+
return value;
|
|
26
|
+
const type = {
|
|
27
|
+
agentMessage: "agent_message",
|
|
28
|
+
commandExecution: "command_execution",
|
|
29
|
+
mcpToolCall: "mcp_tool_call",
|
|
30
|
+
fileChange: "file_change",
|
|
31
|
+
webSearch: "web_search",
|
|
32
|
+
}[item.type] ?? item.type;
|
|
33
|
+
return { ...item, type };
|
|
34
|
+
}
|
|
35
|
+
function appServerUsage(frames) {
|
|
36
|
+
for (let index = frames.length - 1; index >= 0; index -= 1) {
|
|
37
|
+
const frame = record(frames[index]);
|
|
38
|
+
if (frame?.method !== "thread/tokenUsage/updated")
|
|
39
|
+
continue;
|
|
40
|
+
const last = record(record(record(frame.params)?.tokenUsage)?.last);
|
|
41
|
+
if (!last)
|
|
42
|
+
continue;
|
|
43
|
+
const number = (value) => typeof value === "number" && Number.isFinite(value) && value >= 0 ? value : 0;
|
|
44
|
+
const rawInput = number(last.inputTokens);
|
|
45
|
+
const cacheReadTokens = number(last.cachedInputTokens);
|
|
46
|
+
const reasoningTokens = number(last.reasoningOutputTokens);
|
|
47
|
+
return {
|
|
48
|
+
inputTokens: Math.max(0, rawInput - cacheReadTokens),
|
|
49
|
+
outputTokens: number(last.outputTokens),
|
|
50
|
+
...(cacheReadTokens > 0 ? { cacheReadTokens } : {}),
|
|
51
|
+
...(reasoningTokens > 0 ? { reasoningTokens } : {}),
|
|
52
|
+
requests: 1,
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
return undefined;
|
|
56
|
+
}
|
|
57
|
+
function protocolEvents(frames, reported) {
|
|
58
|
+
const normalized = frames.flatMap((value) => {
|
|
59
|
+
const frame = record(value);
|
|
60
|
+
if (!frame || typeof frame.method !== "string")
|
|
61
|
+
return [];
|
|
62
|
+
const params = record(frame.params) ?? {};
|
|
63
|
+
const type = frame.method.replaceAll("/", ".");
|
|
64
|
+
return [{ type, ...params, ...(params.item === undefined ? {} : { item: normalizeItem(params.item) }) }];
|
|
65
|
+
});
|
|
66
|
+
const parsed = shared_ts_1.shared.parseCodex(normalized.map((frame) => JSON.stringify(frame)).join("\n"));
|
|
67
|
+
// app-server v2 streams per-turn usage separately from `turn/completed`.
|
|
68
|
+
// `last` is already the current turn's total, so take the latest notification
|
|
69
|
+
// in this send window instead of summing intermediate cumulative updates.
|
|
70
|
+
const usage = appServerUsage(frames) ?? (Object.keys(parsed.usage).length === 0 ? undefined : parsed.usage);
|
|
71
|
+
const events = parsed.events.filter((event) => {
|
|
72
|
+
const key = eventKey(event);
|
|
73
|
+
if (key === undefined)
|
|
74
|
+
return true;
|
|
75
|
+
if (reported.has(key))
|
|
76
|
+
return false;
|
|
77
|
+
reported.add(key);
|
|
78
|
+
return true;
|
|
79
|
+
});
|
|
80
|
+
return { events, ...(usage === undefined ? {} : { usage }) };
|
|
81
|
+
}
|
|
82
|
+
function evidence(frames, parseSuccess, events) {
|
|
83
|
+
if (frames.length === 0) {
|
|
84
|
+
const reason = "Codex app-server protocol output was unavailable; tool trajectory was not observed.";
|
|
85
|
+
return { events: { status: "unavailable", reason }, actions: { status: "unavailable", reason }, usage: { status: "unavailable", reason } };
|
|
86
|
+
}
|
|
87
|
+
if (!parseSuccess) {
|
|
88
|
+
const reason = "Some Codex app-server protocol frames could not be parsed.";
|
|
89
|
+
return { events: { status: "partial", reason }, actions: { status: "partial", reason } };
|
|
90
|
+
}
|
|
91
|
+
return (0, command_projection_ts_1.unclassifiedToolActionsCoverage)(events) ?? {};
|
|
92
|
+
}
|
|
93
|
+
async function resolveBin(sandbox) {
|
|
94
|
+
const result = await sandbox.runShell('if [ -x "$HOME/.local/bin/codex" ]; then printf %s "$HOME/.local/bin/codex"; else command -v codex; fi');
|
|
95
|
+
const value = result.stdout.trim();
|
|
96
|
+
if (result.exitCode !== 0 || !value)
|
|
97
|
+
throw new Error(`Codex CLI path resolution failed: ${result.stderr}`);
|
|
98
|
+
return value;
|
|
99
|
+
}
|
|
100
|
+
async function rpc(driver, cursor, id, method, params, signal) {
|
|
101
|
+
await driver.write({ id, method, params });
|
|
102
|
+
const receipt = await driver.waitFor(cursor, (value) => record(value)?.id === id, signal);
|
|
103
|
+
const frame = record(receipt.frame);
|
|
104
|
+
if (frame.error !== undefined)
|
|
105
|
+
throw new Error(`Codex app-server ${method} failed: ${JSON.stringify(frame.error)}`);
|
|
106
|
+
return { result: record(frame.result) ?? {}, cursor: receipt.cursor };
|
|
107
|
+
}
|
|
108
|
+
async function createState(ctx, env) {
|
|
109
|
+
const resources = (0, attempt_resources_ts_1.attemptResources)(ctx);
|
|
110
|
+
if (!resources)
|
|
111
|
+
throw new Error("Codex app-server requires an Attempt resource registry");
|
|
112
|
+
const driver = await managed_jsonl_ts_1.ManagedJsonlDriver.start(ctx.sandbox, "codex", resources, {
|
|
113
|
+
argv: [
|
|
114
|
+
await resolveBin(ctx.sandbox),
|
|
115
|
+
"app-server",
|
|
116
|
+
"--stdio",
|
|
117
|
+
"--enable", "default_mode_request_user_input",
|
|
118
|
+
"-c", 'sandbox_mode="danger-full-access"',
|
|
119
|
+
"-c", 'approval_policy="never"',
|
|
120
|
+
],
|
|
121
|
+
cwd: ctx.sandbox.workdir,
|
|
122
|
+
env,
|
|
123
|
+
}, () => ({ id: 9999999, method: "shutdown", params: {} }), (value) => {
|
|
124
|
+
const frame = record(value);
|
|
125
|
+
if (frame?.method !== "item/started")
|
|
126
|
+
return;
|
|
127
|
+
const item = record(record(frame.params)?.item);
|
|
128
|
+
const detail = typeof item?.type === "string" ? item.type : "Codex operation";
|
|
129
|
+
ctx.progress({ message: detail });
|
|
130
|
+
});
|
|
131
|
+
let cursor = 0;
|
|
132
|
+
const initialized = await rpc(driver, cursor, 1, "initialize", {
|
|
133
|
+
clientInfo: { name: "niceeval", title: "NiceEval", version: "1" },
|
|
134
|
+
}, ctx.signal);
|
|
135
|
+
cursor = initialized.cursor;
|
|
136
|
+
await driver.write({ method: "initialized" });
|
|
137
|
+
const started = await rpc(driver, cursor, 2, "thread/start", {
|
|
138
|
+
cwd: ctx.sandbox.workdir,
|
|
139
|
+
...(ctx.model === undefined ? {} : { model: ctx.model }),
|
|
140
|
+
approvalPolicy: "never",
|
|
141
|
+
sandbox: "danger-full-access",
|
|
142
|
+
// app-server 没有 `codex exec --dangerously-bypass-hook-trust` 的顶层 flag,
|
|
143
|
+
// 但 thread/start.config 会把这个 runtime-only override 交给同一 ConfigBuilder。
|
|
144
|
+
// Eval Sandbox 中的 hook 出处由 agent 配置显式声明,因此非交互运行统一 bypass。
|
|
145
|
+
config: { bypass_hook_trust: true },
|
|
146
|
+
}, ctx.signal);
|
|
147
|
+
cursor = started.cursor;
|
|
148
|
+
const threadId = record(started.result.thread)?.id;
|
|
149
|
+
if (typeof threadId !== "string" || !threadId)
|
|
150
|
+
throw new Error("Codex app-server thread/start returned no native thread id");
|
|
151
|
+
ctx.session.capture(threadId);
|
|
152
|
+
return { driver, cursor, threadId, reported: new Set() };
|
|
153
|
+
}
|
|
154
|
+
function validateResponses(pending, responses) {
|
|
155
|
+
if (!responses)
|
|
156
|
+
throw new Error("Codex app-server is waiting for structured input responses");
|
|
157
|
+
const byId = new Map(responses.map((response) => [response.requestId, response]));
|
|
158
|
+
if (byId.size !== responses.length)
|
|
159
|
+
throw new Error("Codex input responses contain duplicate request ids");
|
|
160
|
+
const expected = new Set(pending.questions.map((question) => question.requestId));
|
|
161
|
+
for (const id of byId.keys())
|
|
162
|
+
if (!expected.has(id))
|
|
163
|
+
throw new Error(`Unknown Codex input request ${id}`);
|
|
164
|
+
if (byId.size !== expected.size)
|
|
165
|
+
throw new Error("Codex input responses must answer the complete native question batch");
|
|
166
|
+
const answers = {};
|
|
167
|
+
for (const question of pending.questions) {
|
|
168
|
+
const response = byId.get(question.requestId);
|
|
169
|
+
const answer = "optionId" in response ? response.optionId : response.text;
|
|
170
|
+
if (answer === undefined)
|
|
171
|
+
throw new Error(`Codex input request ${question.requestId} has no answer`);
|
|
172
|
+
if ("optionId" in response && response.optionId !== undefined && !question.options.includes(response.optionId)) {
|
|
173
|
+
throw new Error(`Option ${response.optionId} is not available for Codex input request ${question.requestId}`);
|
|
174
|
+
}
|
|
175
|
+
answers[question.nativeQuestionId] = { answers: [answer] };
|
|
176
|
+
}
|
|
177
|
+
return answers;
|
|
178
|
+
}
|
|
179
|
+
function waitingTurn(state, frame, from, cursor, ctx) {
|
|
180
|
+
const params = record(frame.params) ?? {};
|
|
181
|
+
const questionsRaw = Array.isArray(params.questions) ? params.questions : [];
|
|
182
|
+
const itemId = typeof params.itemId === "string" ? params.itemId : "unknown-item";
|
|
183
|
+
const turnId = typeof params.turnId === "string" ? params.turnId : "unknown-turn";
|
|
184
|
+
const questions = questionsRaw.map((value) => {
|
|
185
|
+
const question = record(value) ?? {};
|
|
186
|
+
const nativeQuestionId = String(question.id ?? "unknown-question");
|
|
187
|
+
const options = Array.isArray(question.options)
|
|
188
|
+
? question.options.map((option) => String(record(option)?.label ?? "")).filter(Boolean)
|
|
189
|
+
: [];
|
|
190
|
+
return {
|
|
191
|
+
requestId: `${state.threadId}:${turnId}:${itemId}:${nativeQuestionId}`,
|
|
192
|
+
nativeQuestionId,
|
|
193
|
+
prompt: String(question.question ?? ""),
|
|
194
|
+
options,
|
|
195
|
+
};
|
|
196
|
+
});
|
|
197
|
+
if (questions.length === 0)
|
|
198
|
+
throw new Error("Codex app-server request_user_input contained no questions");
|
|
199
|
+
const rpcId = frame.id;
|
|
200
|
+
if (typeof rpcId !== "string" && typeof rpcId !== "number")
|
|
201
|
+
throw new Error("Codex app-server request_user_input had no JSON-RPC id");
|
|
202
|
+
state.pending = { rpcId, questions };
|
|
203
|
+
const parsed = protocolEvents(state.driver.framesSince(from).slice(0, cursor - from), state.reported);
|
|
204
|
+
for (const event of parsed.events)
|
|
205
|
+
if (event.type === "operation.started")
|
|
206
|
+
ctx.progress({ message: event.operation.name });
|
|
207
|
+
return {
|
|
208
|
+
status: "waiting",
|
|
209
|
+
events: [
|
|
210
|
+
...parsed.events,
|
|
211
|
+
...questions.map((question) => ({
|
|
212
|
+
type: "input.requested",
|
|
213
|
+
request: {
|
|
214
|
+
id: question.requestId,
|
|
215
|
+
action: "request_user_input",
|
|
216
|
+
prompt: question.prompt,
|
|
217
|
+
options: question.options.map((id) => ({ id })),
|
|
218
|
+
},
|
|
219
|
+
})),
|
|
220
|
+
],
|
|
221
|
+
...(parsed.usage === undefined ? {} : { usage: parsed.usage }),
|
|
222
|
+
evidenceCoverage: evidence(state.driver.framesSince(from).slice(0, cursor - from), true, parsed.events),
|
|
223
|
+
};
|
|
224
|
+
}
|
|
225
|
+
async function drive(state, ctx, from) {
|
|
226
|
+
const receipt = await state.driver.waitFor(state.cursor, (value) => {
|
|
227
|
+
const frame = record(value);
|
|
228
|
+
return frame?.method === "item/tool/requestUserInput" || frame?.method === "turn/completed" || frame?.method === "error";
|
|
229
|
+
}, ctx.signal);
|
|
230
|
+
state.cursor = receipt.cursor;
|
|
231
|
+
const frame = record(receipt.frame);
|
|
232
|
+
if (frame.method === "item/tool/requestUserInput")
|
|
233
|
+
return waitingTurn(state, frame, from, receipt.cursor, ctx);
|
|
234
|
+
const parsed = protocolEvents(state.driver.framesSince(from).slice(0, receipt.cursor - from), state.reported);
|
|
235
|
+
const turn = record(record(frame.params)?.turn);
|
|
236
|
+
const status = turn?.status;
|
|
237
|
+
if (frame.method === "error") {
|
|
238
|
+
throw (0, send_failures_ts_1.makeSendFailure)({
|
|
239
|
+
acceptance: (0, send_failures_ts_1.sendAcceptanceFromEvents)(parsed.events),
|
|
240
|
+
message: `Codex app-server turn failed: ${JSON.stringify(frame.params)}`,
|
|
241
|
+
cause: (0, external_cause_ts_1.normalizeExternalCause)(frame.params),
|
|
242
|
+
events: parsed.events,
|
|
243
|
+
...(parsed.usage === undefined ? {} : { usage: parsed.usage }),
|
|
244
|
+
process: state.driver.processReceipt(),
|
|
245
|
+
});
|
|
246
|
+
}
|
|
247
|
+
for (const event of parsed.events)
|
|
248
|
+
if (event.type === "operation.started")
|
|
249
|
+
ctx.progress({ message: event.operation.name });
|
|
250
|
+
return {
|
|
251
|
+
status: status === "failed" ? "failed" : "completed", events: parsed.events,
|
|
252
|
+
...(parsed.usage === undefined ? {} : { usage: parsed.usage }),
|
|
253
|
+
evidenceCoverage: evidence(state.driver.framesSince(from).slice(0, receipt.cursor - from), true, parsed.events),
|
|
254
|
+
};
|
|
255
|
+
}
|
|
256
|
+
async function sendCodexAppServer(input, ctx, env, failureFacts) {
|
|
257
|
+
let state = ctx.session.get(stateSlot);
|
|
258
|
+
if (!state) {
|
|
259
|
+
state = await createState(ctx, env);
|
|
260
|
+
ctx.session.set(stateSlot, state);
|
|
261
|
+
}
|
|
262
|
+
const from = state.cursor;
|
|
263
|
+
if (state.pending) {
|
|
264
|
+
const pending = state.pending;
|
|
265
|
+
const answers = validateResponses(pending, input.responses);
|
|
266
|
+
if (state.driver.framesSince(state.cursor).length !== 0) {
|
|
267
|
+
throw new Error("Codex app-server produced activity after entering waiting state; refusing an ambiguous answer");
|
|
268
|
+
}
|
|
269
|
+
try {
|
|
270
|
+
await state.driver.write({ id: pending.rpcId, result: { answers } });
|
|
271
|
+
}
|
|
272
|
+
catch (cause) {
|
|
273
|
+
throw (0, send_failures_ts_1.makeSendFailure)({
|
|
274
|
+
acceptance: "started",
|
|
275
|
+
message: `Codex app-server answer transport failed: ${cause instanceof Error ? cause.message : String(cause)}`,
|
|
276
|
+
cause: (0, external_cause_ts_1.normalizeExternalCause)(cause),
|
|
277
|
+
process: state.driver.processReceipt(),
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
// JSON-RPC response ids are native idempotency identities. Keep pending through
|
|
281
|
+
// validation and transport failure; commit only after the write receipt succeeds.
|
|
282
|
+
state.pending = undefined;
|
|
283
|
+
}
|
|
284
|
+
else {
|
|
285
|
+
if (input.responses?.length)
|
|
286
|
+
throw new Error("Codex app-server received responses while no input request was pending");
|
|
287
|
+
const started = await rpc(state.driver, state.cursor, 10000 + state.cursor, "turn/start", {
|
|
288
|
+
threadId: state.threadId,
|
|
289
|
+
input: [{ type: "text", text: input.text }],
|
|
290
|
+
approvalPolicy: "never",
|
|
291
|
+
sandboxPolicy: { type: "dangerFullAccess" },
|
|
292
|
+
...(ctx.model === undefined ? {} : { model: ctx.model }),
|
|
293
|
+
...(ctx.reasoningEffort === undefined ? {} : { effort: ctx.reasoningEffort }),
|
|
294
|
+
}, ctx.signal);
|
|
295
|
+
state.cursor = started.cursor;
|
|
296
|
+
}
|
|
297
|
+
try {
|
|
298
|
+
return await drive(state, ctx, from);
|
|
299
|
+
}
|
|
300
|
+
catch (cause) {
|
|
301
|
+
if (typeof cause === "object" && cause !== null && cause.type === "agent-send-failed")
|
|
302
|
+
throw cause;
|
|
303
|
+
const raw = state.driver.framesSince(from).map((value) => JSON.stringify(value)).join("\n");
|
|
304
|
+
const message = cause instanceof Error ? cause.message : String(cause);
|
|
305
|
+
const facts = failureFacts?.(raw, protocolEvents(state.driver.framesSince(from), new Set()).events, message);
|
|
306
|
+
throw (0, send_failures_ts_1.makeSendFailure)({
|
|
307
|
+
acceptance: facts?.acceptance ?? (state.pending === undefined ? "unknown" : "started"),
|
|
308
|
+
message: `Codex app-server transport failed: ${message} (frames=${state.driver.frameKinds() || "none"})`,
|
|
309
|
+
cause: facts?.cause ?? (0, external_cause_ts_1.normalizeExternalCause)(cause),
|
|
310
|
+
process: state.driver.processReceipt(),
|
|
311
|
+
});
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
//# sourceMappingURL=codex-app-server.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-server.js","sourceRoot":"","sources":["codex-app-server.ts"],"names":[],"mappings":";;AAyRA,gDAiEC;AAzVD,uDAAsD;AACtD,yDAAwD;AACxD,2CAAqC;AACrC,yEAAgF;AAChF,kEAAwF;AACxF,mEAAyF;AACzF,0EAAmE;AAmBnE,MAAM,SAAS,GAAG,IAAA,mCAAiB,EAAa,yBAAyB,CAAC,CAAC;AAC3E,SAAS,MAAM,CAAC,KAAc;IAC1B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAoB,CAAC,CAAC,CAAC,SAAS,CAAC;AACnH,CAAC;AACD,SAAS,QAAQ,CAAC,KAAkB;IAChC,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB,IAAI,KAAK,CAAC,IAAI,KAAK,oBAAoB;QACzE,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;IAChD,IAAI,KAAK,CAAC,IAAI,KAAK,cAAc,IAAI,KAAK,CAAC,WAAW;QAClD,OAAO,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;IAChD,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,SAAS,aAAa,CAAC,KAAc;IACjC,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;IAC3B,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ;QACtC,OAAO,KAAK,CAAC;IACjB,MAAM,IAAI,GAAI;QACV,YAAY,EAAE,eAAe;QAC7B,gBAAgB,EAAE,mBAAmB;QACrC,WAAW,EAAE,eAAe;QAC5B,UAAU,EAAE,aAAa;QACzB,SAAS,EAAE,YAAY;KACC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC;IACrD,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;AAC7B,CAAC;AACD,SAAS,cAAc,CAAC,MAA0B;IAC9C,KAAK,IAAI,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,KAAK,IAAI,CAAC,EAAE,CAAC;QACzD,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACpC,IAAI,KAAK,EAAE,MAAM,KAAK,2BAA2B;YAC7C,SAAS;QACb,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,IAAI,CAAC,CAAC;QACpE,IAAI,CAAC,IAAI;YACL,SAAS;QACb,MAAM,MAAM,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACzH,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAC1C,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACvD,MAAM,eAAe,GAAG,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAC3D,OAAO;YACH,WAAW,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,eAAe,CAAC;YACpD,YAAY,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC;YACvC,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,GAAG,CAAC,eAAe,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,eAAe,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,QAAQ,EAAE,CAAC;SACd,CAAC;IACN,CAAC;IACD,OAAO,SAAS,CAAC;AACrB,CAAC;AACD,SAAS,cAAc,CAAC,MAA0B,EAAE,QAAqB;IAIrE,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACxC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,CAAC,MAAM,KAAK,QAAQ;YAC1C,OAAO,EAAE,CAAC;QACd,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;QAC1C,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QAC/C,OAAO,CAAC,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;IAC7G,CAAC,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,kBAAM,CAAC,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9F,yEAAyE;IACzE,8EAA8E;IAC9E,0EAA0E;IAC1E,MAAM,KAAK,GAAG,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC5G,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;QAC1C,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,GAAG,KAAK,SAAS;YACjB,OAAO,IAAI,CAAC;QAChB,IAAI,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC;YACjB,OAAO,KAAK,CAAC;QACjB,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAClB,OAAO,IAAI,CAAC;IAChB,CAAC,CAAC,CAAC;IACH,OAAO,EAAE,MAAM,EAAE,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;AACjE,CAAC;AACD,SAAS,QAAQ,CAAC,MAA0B,EAAE,YAAqB,EAAE,MAA8B;IAC/F,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,MAAM,MAAM,GAAG,qFAAqF,CAAC;QACrG,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,EAAE,EAAE,CAAC;IAC/I,CAAC;IACD,IAAI,CAAC,YAAY,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,4DAA4D,CAAC;QAC5E,OAAO,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,CAAC;IAC7F,CAAC;IACD,OAAO,IAAA,uDAA+B,EAAC,MAAM,CAAC,IAAI,EAAE,CAAC;AACzD,CAAC;AACD,KAAK,UAAU,UAAU,CAAC,OAAuC;IAC7D,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,wGAAwG,CAAC,CAAC;IAChJ,MAAM,KAAK,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IACnC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,CAAC,KAAK;QAC/B,MAAM,IAAI,KAAK,CAAC,qCAAqC,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1E,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,KAAK,UAAU,GAAG,CAAC,MAA0B,EAAE,MAAc,EAAE,EAAU,EAAE,MAAc,EAAE,MAAe,EAAE,MAAmB;IAI3H,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;IAC3C,MAAM,OAAO,GAAG,MAAM,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,MAAM,CAAC,CAAC;IAC1F,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC;IACrC,IAAI,KAAK,CAAC,KAAK,KAAK,SAAS;QACzB,MAAM,IAAI,KAAK,CAAC,oBAAoB,MAAM,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACzF,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC;AAC1E,CAAC;AACD,KAAK,UAAU,WAAW,CAAC,GAAwB,EAAE,GAAqC;IACtF,MAAM,SAAS,GAAG,IAAA,uCAAgB,EAAC,GAAG,CAAC,CAAC;IACxC,IAAI,CAAC,SAAS;QACV,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC9E,MAAM,MAAM,GAAG,MAAM,qCAAkB,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;QAC3E,IAAI,EAAE;YACF,MAAM,UAAU,CAAC,GAAG,CAAC,OAAO,CAAC;YAC7B,YAAY;YACZ,SAAS;YACT,UAAU,EAAE,iCAAiC;YAC7C,IAAI,EAAE,mCAAmC;YACzC,IAAI,EAAE,yBAAyB;SAClC;QACD,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;QACxB,GAAG;KACN,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,KAAK,EAAE,EAAE;QAClE,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,IAAI,KAAK,EAAE,MAAM,KAAK,cAAc;YAChC,OAAO;QACX,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;QAChD,MAAM,MAAM,GAAG,OAAO,IAAI,EAAE,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,iBAAiB,CAAC;QAC9E,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;IACH,IAAI,MAAM,GAAG,CAAC,CAAC;IACf,MAAM,WAAW,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,YAAY,EAAE;QAC3D,UAAU,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,GAAG,EAAE;KACpE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,GAAG,WAAW,CAAC,MAAM,CAAC;IAC5B,MAAM,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;IAC9C,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAAE,cAAc,EAAE;QACzD,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;QACxB,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;QACxD,cAAc,EAAE,OAAO;QACvB,OAAO,EAAE,oBAAoB;QAC7B,uEAAuE;QACvE,uEAAuE;QACvE,0DAA0D;QAC1D,MAAM,EAAE,EAAE,iBAAiB,EAAE,IAAI,EAAE;KACtC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACf,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IACxB,MAAM,QAAQ,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;IACnD,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,CAAC,QAAQ;QACzC,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAClF,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC9B,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC;AAC7D,CAAC;AACD,SAAS,iBAAiB,CAAC,OAAqB,EAAE,SAA+C;IAG7F,IAAI,CAAC,SAAS;QACV,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IAClF,IAAI,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC,MAAM;QAC9B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;IAC3E,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC;IAClF,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,IAAI,EAAE;QACxB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,+BAA+B,EAAE,EAAE,CAAC,CAAC;IAC7D,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,IAAI;QAC3B,MAAM,IAAI,KAAK,CAAC,sEAAsE,CAAC,CAAC;IAC5F,MAAM,OAAO,GAER,EAAE,CAAC;IACR,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,QAAQ,CAAC,SAAS,CAAE,CAAC;QAC/C,MAAM,MAAM,GAAG,UAAU,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;QAC1E,IAAI,MAAM,KAAK,SAAS;YACpB,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,SAAS,gBAAgB,CAAC,CAAC;QAC/E,IAAI,UAAU,IAAI,QAAQ,IAAI,QAAQ,CAAC,QAAQ,KAAK,SAAS,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC7G,MAAM,IAAI,KAAK,CAAC,UAAU,QAAQ,CAAC,QAAQ,6CAA6C,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;QAClH,CAAC;QACD,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAAC,GAAG,EAAE,OAAO,EAAE,CAAC,MAAM,CAAC,EAAE,CAAC;IAC/D,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AACD,SAAS,WAAW,CAAC,KAAiB,EAAE,KAAkB,EAAE,IAAY,EAAE,MAAc,EAAE,GAAwB;IAC9G,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7E,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IAClF,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,cAAc,CAAC;IAClF,MAAM,SAAS,GAAsB,YAAY,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;QAC5D,MAAM,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;QACrC,MAAM,gBAAgB,GAAG,MAAM,CAAC,QAAQ,CAAC,EAAE,IAAI,kBAAkB,CAAC,CAAC;QACnE,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;YAC3C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;YACvF,CAAC,CAAC,EAAE,CAAC;QACT,OAAO;YACH,SAAS,EAAE,GAAG,KAAK,CAAC,QAAQ,IAAI,MAAM,IAAI,MAAM,IAAI,gBAAgB,EAAE;YACtE,gBAAgB;YAChB,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,QAAQ,IAAI,EAAE,CAAC;YACvC,OAAO;SACV,CAAC;IACN,CAAC,CAAC,CAAC;IACH,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QACtB,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;IAClF,MAAM,KAAK,GAAG,KAAK,CAAC,EAAE,CAAC;IACvB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,OAAO,KAAK,KAAK,QAAQ;QACtD,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;IAC9E,KAAK,CAAC,OAAO,GAAG,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC;IACrC,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IACtG,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB;YAClC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO;QACH,MAAM,EAAE,SAAS;QACjB,MAAM,EAAE;YACJ,GAAG,MAAM,CAAC,MAAM;YAChB,GAAG,SAAS,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAe,EAAE,CAAC,CAAC;gBACzC,IAAI,EAAE,iBAAiB;gBACvB,OAAO,EAAE;oBACL,EAAE,EAAE,QAAQ,CAAC,SAAS;oBACtB,MAAM,EAAE,oBAAoB;oBAC5B,MAAM,EAAE,QAAQ,CAAC,MAAM;oBACvB,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;iBAClD;aACJ,CAAC,CAAC;SACN;QACD,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;KAC1G,CAAC;AACN,CAAC;AACD,KAAK,UAAU,KAAK,CAAC,KAAiB,EAAE,GAAwB,EAAE,IAAY;IAC1E,MAAM,OAAO,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,EAAE;QAC/D,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC;QAC5B,OAAO,KAAK,EAAE,MAAM,KAAK,4BAA4B,IAAI,KAAK,EAAE,MAAM,KAAK,gBAAgB,IAAI,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;IAC7H,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACf,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAC9B,MAAM,KAAK,GAAG,MAAM,CAAC,OAAO,CAAC,KAAK,CAAE,CAAC;IACrC,IAAI,KAAK,CAAC,MAAM,KAAK,4BAA4B;QAC7C,OAAO,WAAW,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChE,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC9G,MAAM,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,IAAI,EAAE,MAAM,CAAC;IAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,OAAO,EAAE,CAAC;QAC3B,MAAM,IAAA,kCAAe,EAAC;YAClB,UAAU,EAAE,IAAA,2CAAwB,EAAC,MAAM,CAAC,MAAM,CAAC;YACnD,OAAO,EAAE,iCAAiC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,EAAE;YACxE,KAAK,EAAE,IAAA,0CAAsB,EAAC,KAAK,CAAC,MAAM,CAAC;YAC3C,MAAM,EAAE,MAAM,CAAC,MAAM;YACrB,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;YAC9D,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE;SACzC,CAAC,CAAC;IACP,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,MAAM;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,mBAAmB;YAClC,GAAG,CAAC,QAAQ,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC,CAAC;IACxD,OAAO;QACH,MAAM,EAAE,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM;QAC3E,GAAG,CAAC,MAAM,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC;QAC9D,gBAAgB,EAAE,QAAQ,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC;KAClH,CAAC;AACN,CAAC;AACM,KAAK,UAAU,kBAAkB,CAAC,KAGxC,EAAE,GAAwB,EAAE,GAAqC,EAAE,YAGnE;IACG,IAAI,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IACvC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,KAAK,GAAG,MAAM,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACpC,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IACtC,CAAC;IACD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;IAC1B,IAAI,KAAK,CAAC,OAAO,EAAE,CAAC;QAChB,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;QAC9B,MAAM,OAAO,GAAG,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5D,IAAI,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,MAAM,IAAI,KAAK,CAAC,+FAA+F,CAAC,CAAC;QACrH,CAAC;QACD,IAAI,CAAC;YACD,MAAM,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,OAAO,KAAK,EAAE,CAAC;YACX,MAAM,IAAA,kCAAe,EAAC;gBAClB,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,6CAA6C,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC9G,KAAK,EAAE,IAAA,0CAAsB,EAAC,KAAK,CAAC;gBACpC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE;aACzC,CAAC,CAAC;QACP,CAAC;QACD,gFAAgF;QAChF,kFAAkF;QAClF,KAAK,CAAC,OAAO,GAAG,SAAS,CAAC;IAC9B,CAAC;SACI,CAAC;QACF,IAAI,KAAK,CAAC,SAAS,EAAE,MAAM;YACvB,MAAM,IAAI,KAAK,CAAC,wEAAwE,CAAC,CAAC;QAC9F,MAAM,OAAO,GAAG,MAAM,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,YAAY,EAAE;YACtF,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC;YAC3C,cAAc,EAAE,OAAO;YACvB,aAAa,EAAE,EAAE,IAAI,EAAE,kBAAkB,EAAE;YAC3C,GAAG,CAAC,GAAG,CAAC,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,GAAG,CAAC,KAAK,EAAE,CAAC;YACxD,GAAG,CAAC,GAAG,CAAC,eAAe,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,GAAG,CAAC,eAAe,EAAE,CAAC;SAChF,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACf,KAAK,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAClC,CAAC;IACD,IAAI,CAAC;QACD,OAAO,MAAM,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,KAAK,EAAE,CAAC;QACX,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAK,KAElD,CAAC,IAAI,KAAK,mBAAmB;YAC3B,MAAM,KAAK,CAAC;QAChB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC5F,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACvE,MAAM,KAAK,GAAG,YAAY,EAAE,CAAC,GAAG,EAAE,cAAc,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAC7G,MAAM,IAAA,kCAAe,EAAC;YAClB,UAAU,EAAE,KAAK,EAAE,UAAU,IAAI,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC;YACtF,OAAO,EAAE,sCAAsC,OAAO,YAAY,KAAK,CAAC,MAAM,CAAC,UAAU,EAAE,IAAI,MAAM,GAAG;YACxG,KAAK,EAAE,KAAK,EAAE,KAAK,IAAI,IAAA,0CAAsB,EAAC,KAAK,CAAC;YACpD,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC,cAAc,EAAE;SACzC,CAAC,CAAC;IACP,CAAC;AACL,CAAC","sourcesContent":["import type { InputResponse, SandboxAgentContext, StreamEvent, Turn, TurnEvidenceCoverage, Usage } from \"../types.ts\";\nimport { createSessionSlot } from \"./session-slot.ts\";\nimport { ManagedJsonlDriver } from \"./managed-jsonl.ts\";\nimport { shared } from \"./shared.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { normalizeExternalCause, type ExternalCause } from \"../shared/external-cause.ts\";\nimport { attemptResources } from \"../context/attempt-resources.ts\";\ntype RecordValue = globalThis.Record<string, unknown>;\ntype PendingQuestion = {\n readonly requestId: string;\n readonly nativeQuestionId: string;\n readonly prompt: string;\n readonly options: readonly string[];\n};\ntype PendingBatch = {\n readonly rpcId: string | number;\n readonly questions: readonly PendingQuestion[];\n};\ntype CodexState = {\n readonly driver: ManagedJsonlDriver;\n cursor: number;\n readonly threadId: string;\n pending?: PendingBatch;\n readonly reported: Set<string>;\n};\nconst stateSlot = createSessionSlot<CodexState>(\"codex/app-server-native\");\nfunction record(value: unknown): RecordValue | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value) ? value as RecordValue : undefined;\n}\nfunction eventKey(event: StreamEvent): string | undefined {\n if (event.type === \"operation.started\" || event.type === \"operation.finished\")\n return `${event.type}:${event.operationId}`;\n if (event.type === \"skill.loaded\" && event.operationId)\n return `${event.type}:${event.operationId}`;\n return undefined;\n}\nfunction normalizeItem(value: unknown): unknown {\n const item = record(value);\n if (!item || typeof item.type !== \"string\")\n return value;\n const type = ({\n agentMessage: \"agent_message\",\n commandExecution: \"command_execution\",\n mcpToolCall: \"mcp_tool_call\",\n fileChange: \"file_change\",\n webSearch: \"web_search\",\n } as Record<string, string>)[item.type] ?? item.type;\n return { ...item, type };\n}\nfunction appServerUsage(frames: readonly unknown[]): Usage | undefined {\n for (let index = frames.length - 1; index >= 0; index -= 1) {\n const frame = record(frames[index]);\n if (frame?.method !== \"thread/tokenUsage/updated\")\n continue;\n const last = record(record(record(frame.params)?.tokenUsage)?.last);\n if (!last)\n continue;\n const number = (value: unknown): number => typeof value === \"number\" && Number.isFinite(value) && value >= 0 ? value : 0;\n const rawInput = number(last.inputTokens);\n const cacheReadTokens = number(last.cachedInputTokens);\n const reasoningTokens = number(last.reasoningOutputTokens);\n return {\n inputTokens: Math.max(0, rawInput - cacheReadTokens),\n outputTokens: number(last.outputTokens),\n ...(cacheReadTokens > 0 ? { cacheReadTokens } : {}),\n ...(reasoningTokens > 0 ? { reasoningTokens } : {}),\n requests: 1,\n };\n }\n return undefined;\n}\nfunction protocolEvents(frames: readonly unknown[], reported: Set<string>): {\n events: StreamEvent[];\n usage?: Usage;\n} {\n const normalized = frames.flatMap((value) => {\n const frame = record(value);\n if (!frame || typeof frame.method !== \"string\")\n return [];\n const params = record(frame.params) ?? {};\n const type = frame.method.replaceAll(\"/\", \".\");\n return [{ type, ...params, ...(params.item === undefined ? {} : { item: normalizeItem(params.item) }) }];\n });\n const parsed = shared.parseCodex(normalized.map((frame) => JSON.stringify(frame)).join(\"\\n\"));\n // app-server v2 streams per-turn usage separately from `turn/completed`.\n // `last` is already the current turn's total, so take the latest notification\n // in this send window instead of summing intermediate cumulative updates.\n const usage = appServerUsage(frames) ?? (Object.keys(parsed.usage).length === 0 ? undefined : parsed.usage);\n const events = parsed.events.filter((event) => {\n const key = eventKey(event);\n if (key === undefined)\n return true;\n if (reported.has(key))\n return false;\n reported.add(key);\n return true;\n });\n return { events, ...(usage === undefined ? {} : { usage }) };\n}\nfunction evidence(frames: readonly unknown[], parseSuccess: boolean, events: readonly StreamEvent[]): TurnEvidenceCoverage {\n if (frames.length === 0) {\n const reason = \"Codex app-server protocol output was unavailable; tool trajectory was not observed.\";\n return { events: { status: \"unavailable\", reason }, actions: { status: \"unavailable\", reason }, usage: { status: \"unavailable\", reason } };\n }\n if (!parseSuccess) {\n const reason = \"Some Codex app-server protocol frames could not be parsed.\";\n return { events: { status: \"partial\", reason }, actions: { status: \"partial\", reason } };\n }\n return unclassifiedToolActionsCoverage(events) ?? {};\n}\nasync function resolveBin(sandbox: SandboxAgentContext[\"sandbox\"]): Promise<string> {\n const result = await sandbox.runShell('if [ -x \"$HOME/.local/bin/codex\" ]; then printf %s \"$HOME/.local/bin/codex\"; else command -v codex; fi');\n const value = result.stdout.trim();\n if (result.exitCode !== 0 || !value)\n throw new Error(`Codex CLI path resolution failed: ${result.stderr}`);\n return value;\n}\nasync function rpc(driver: ManagedJsonlDriver, cursor: number, id: number, method: string, params: unknown, signal: AbortSignal): Promise<{\n result: RecordValue;\n cursor: number;\n}> {\n await driver.write({ id, method, params });\n const receipt = await driver.waitFor(cursor, (value) => record(value)?.id === id, signal);\n const frame = record(receipt.frame)!;\n if (frame.error !== undefined)\n throw new Error(`Codex app-server ${method} failed: ${JSON.stringify(frame.error)}`);\n return { result: record(frame.result) ?? {}, cursor: receipt.cursor };\n}\nasync function createState(ctx: SandboxAgentContext, env: Readonly<Record<string, string>>): Promise<CodexState> {\n const resources = attemptResources(ctx);\n if (!resources)\n throw new Error(\"Codex app-server requires an Attempt resource registry\");\n const driver = await ManagedJsonlDriver.start(ctx.sandbox, \"codex\", resources, {\n argv: [\n await resolveBin(ctx.sandbox),\n \"app-server\",\n \"--stdio\",\n \"--enable\", \"default_mode_request_user_input\",\n \"-c\", 'sandbox_mode=\"danger-full-access\"',\n \"-c\", 'approval_policy=\"never\"',\n ],\n cwd: ctx.sandbox.workdir,\n env,\n }, () => ({ id: 9999999, method: \"shutdown\", params: {} }), (value) => {\n const frame = record(value);\n if (frame?.method !== \"item/started\")\n return;\n const item = record(record(frame.params)?.item);\n const detail = typeof item?.type === \"string\" ? item.type : \"Codex operation\";\n ctx.progress({ message: detail });\n });\n let cursor = 0;\n const initialized = await rpc(driver, cursor, 1, \"initialize\", {\n clientInfo: { name: \"niceeval\", title: \"NiceEval\", version: \"1\" },\n }, ctx.signal);\n cursor = initialized.cursor;\n await driver.write({ method: \"initialized\" });\n const started = await rpc(driver, cursor, 2, \"thread/start\", {\n cwd: ctx.sandbox.workdir,\n ...(ctx.model === undefined ? {} : { model: ctx.model }),\n approvalPolicy: \"never\",\n sandbox: \"danger-full-access\",\n // app-server 没有 `codex exec --dangerously-bypass-hook-trust` 的顶层 flag,\n // 但 thread/start.config 会把这个 runtime-only override 交给同一 ConfigBuilder。\n // Eval Sandbox 中的 hook 出处由 agent 配置显式声明,因此非交互运行统一 bypass。\n config: { bypass_hook_trust: true },\n }, ctx.signal);\n cursor = started.cursor;\n const threadId = record(started.result.thread)?.id;\n if (typeof threadId !== \"string\" || !threadId)\n throw new Error(\"Codex app-server thread/start returned no native thread id\");\n ctx.session.capture(threadId);\n return { driver, cursor, threadId, reported: new Set() };\n}\nfunction validateResponses(pending: PendingBatch, responses: readonly InputResponse[] | undefined): Record<string, {\n answers: string[];\n}> {\n if (!responses)\n throw new Error(\"Codex app-server is waiting for structured input responses\");\n const byId = new Map(responses.map((response) => [response.requestId, response]));\n if (byId.size !== responses.length)\n throw new Error(\"Codex input responses contain duplicate request ids\");\n const expected = new Set(pending.questions.map((question) => question.requestId));\n for (const id of byId.keys())\n if (!expected.has(id))\n throw new Error(`Unknown Codex input request ${id}`);\n if (byId.size !== expected.size)\n throw new Error(\"Codex input responses must answer the complete native question batch\");\n const answers: Record<string, {\n answers: string[];\n }> = {};\n for (const question of pending.questions) {\n const response = byId.get(question.requestId)!;\n const answer = \"optionId\" in response ? response.optionId : response.text;\n if (answer === undefined)\n throw new Error(`Codex input request ${question.requestId} has no answer`);\n if (\"optionId\" in response && response.optionId !== undefined && !question.options.includes(response.optionId)) {\n throw new Error(`Option ${response.optionId} is not available for Codex input request ${question.requestId}`);\n }\n answers[question.nativeQuestionId] = { answers: [answer] };\n }\n return answers;\n}\nfunction waitingTurn(state: CodexState, frame: RecordValue, from: number, cursor: number, ctx: SandboxAgentContext): Turn {\n const params = record(frame.params) ?? {};\n const questionsRaw = Array.isArray(params.questions) ? params.questions : [];\n const itemId = typeof params.itemId === \"string\" ? params.itemId : \"unknown-item\";\n const turnId = typeof params.turnId === \"string\" ? params.turnId : \"unknown-turn\";\n const questions: PendingQuestion[] = questionsRaw.map((value) => {\n const question = record(value) ?? {};\n const nativeQuestionId = String(question.id ?? \"unknown-question\");\n const options = Array.isArray(question.options)\n ? question.options.map((option) => String(record(option)?.label ?? \"\")).filter(Boolean)\n : [];\n return {\n requestId: `${state.threadId}:${turnId}:${itemId}:${nativeQuestionId}`,\n nativeQuestionId,\n prompt: String(question.question ?? \"\"),\n options,\n };\n });\n if (questions.length === 0)\n throw new Error(\"Codex app-server request_user_input contained no questions\");\n const rpcId = frame.id;\n if (typeof rpcId !== \"string\" && typeof rpcId !== \"number\")\n throw new Error(\"Codex app-server request_user_input had no JSON-RPC id\");\n state.pending = { rpcId, questions };\n const parsed = protocolEvents(state.driver.framesSince(from).slice(0, cursor - from), state.reported);\n for (const event of parsed.events)\n if (event.type === \"operation.started\")\n ctx.progress({ message: event.operation.name });\n return {\n status: \"waiting\",\n events: [\n ...parsed.events,\n ...questions.map((question): StreamEvent => ({\n type: \"input.requested\",\n request: {\n id: question.requestId,\n action: \"request_user_input\",\n prompt: question.prompt,\n options: question.options.map((id) => ({ id })),\n },\n })),\n ],\n ...(parsed.usage === undefined ? {} : { usage: parsed.usage }),\n evidenceCoverage: evidence(state.driver.framesSince(from).slice(0, cursor - from), true, parsed.events),\n };\n}\nasync function drive(state: CodexState, ctx: SandboxAgentContext, from: number): Promise<Turn> {\n const receipt = await state.driver.waitFor(state.cursor, (value) => {\n const frame = record(value);\n return frame?.method === \"item/tool/requestUserInput\" || frame?.method === \"turn/completed\" || frame?.method === \"error\";\n }, ctx.signal);\n state.cursor = receipt.cursor;\n const frame = record(receipt.frame)!;\n if (frame.method === \"item/tool/requestUserInput\")\n return waitingTurn(state, frame, from, receipt.cursor, ctx);\n const parsed = protocolEvents(state.driver.framesSince(from).slice(0, receipt.cursor - from), state.reported);\n const turn = record(record(frame.params)?.turn);\n const status = turn?.status;\n if (frame.method === \"error\") {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(parsed.events),\n message: `Codex app-server turn failed: ${JSON.stringify(frame.params)}`,\n cause: normalizeExternalCause(frame.params),\n events: parsed.events,\n ...(parsed.usage === undefined ? {} : { usage: parsed.usage }),\n process: state.driver.processReceipt(),\n });\n }\n for (const event of parsed.events)\n if (event.type === \"operation.started\")\n ctx.progress({ message: event.operation.name });\n return {\n status: status === \"failed\" ? \"failed\" : \"completed\", events: parsed.events,\n ...(parsed.usage === undefined ? {} : { usage: parsed.usage }),\n evidenceCoverage: evidence(state.driver.framesSince(from).slice(0, receipt.cursor - from), true, parsed.events),\n };\n}\nexport async function sendCodexAppServer(input: {\n readonly text: string;\n readonly responses?: readonly InputResponse[];\n}, ctx: SandboxAgentContext, env: Readonly<Record<string, string>>, failureFacts?: (raw: string, events: readonly StreamEvent[], nativeText: string) => {\n readonly acceptance: \"rejected\" | \"started\" | \"unknown\";\n readonly cause?: ExternalCause;\n}): Promise<Turn> {\n let state = ctx.session.get(stateSlot);\n if (!state) {\n state = await createState(ctx, env);\n ctx.session.set(stateSlot, state);\n }\n const from = state.cursor;\n if (state.pending) {\n const pending = state.pending;\n const answers = validateResponses(pending, input.responses);\n if (state.driver.framesSince(state.cursor).length !== 0) {\n throw new Error(\"Codex app-server produced activity after entering waiting state; refusing an ambiguous answer\");\n }\n try {\n await state.driver.write({ id: pending.rpcId, result: { answers } });\n }\n catch (cause) {\n throw makeSendFailure({\n acceptance: \"started\",\n message: `Codex app-server answer transport failed: ${cause instanceof Error ? cause.message : String(cause)}`,\n cause: normalizeExternalCause(cause),\n process: state.driver.processReceipt(),\n });\n }\n // JSON-RPC response ids are native idempotency identities. Keep pending through\n // validation and transport failure; commit only after the write receipt succeeds.\n state.pending = undefined;\n }\n else {\n if (input.responses?.length)\n throw new Error(\"Codex app-server received responses while no input request was pending\");\n const started = await rpc(state.driver, state.cursor, 10000 + state.cursor, \"turn/start\", {\n threadId: state.threadId,\n input: [{ type: \"text\", text: input.text }],\n approvalPolicy: \"never\",\n sandboxPolicy: { type: \"dangerFullAccess\" },\n ...(ctx.model === undefined ? {} : { model: ctx.model }),\n ...(ctx.reasoningEffort === undefined ? {} : { effort: ctx.reasoningEffort }),\n }, ctx.signal);\n state.cursor = started.cursor;\n }\n try {\n return await drive(state, ctx, from);\n }\n catch (cause) {\n if (typeof cause === \"object\" && cause !== null && (cause as {\n type?: unknown;\n }).type === \"agent-send-failed\")\n throw cause;\n const raw = state.driver.framesSince(from).map((value) => JSON.stringify(value)).join(\"\\n\");\n const message = cause instanceof Error ? cause.message : String(cause);\n const facts = failureFacts?.(raw, protocolEvents(state.driver.framesSince(from), new Set()).events, message);\n throw makeSendFailure({\n acceptance: facts?.acceptance ?? (state.pending === undefined ? \"unknown\" : \"started\"),\n message: `Codex app-server transport failed: ${message} (frames=${state.driver.frameKinds() || \"none\"})`,\n cause: facts?.cause ?? normalizeExternalCause(cause),\n process: state.driver.processReceipt(),\n });\n }\n}\n"]}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, StreamEvent, Turn } from "../types.cjs";
|
|
2
|
+
import { type ExternalCause } from "../shared/external-cause.cjs";
|
|
3
|
+
export declare function sendCodexAppServer(input: {
|
|
4
|
+
readonly text: string;
|
|
5
|
+
readonly responses?: readonly InputResponse[];
|
|
6
|
+
}, ctx: SandboxAgentContext, env: Readonly<Record<string, string>>, failureFacts?: (raw: string, events: readonly StreamEvent[], nativeText: string) => {
|
|
7
|
+
readonly acceptance: "rejected" | "started" | "unknown";
|
|
8
|
+
readonly cause?: ExternalCause;
|
|
9
|
+
}): Promise<Turn>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, StreamEvent, Turn } from "../types.mjs";
|
|
2
|
+
import { type ExternalCause } from "../shared/external-cause.mjs";
|
|
3
|
+
export declare function sendCodexAppServer(input: {
|
|
4
|
+
readonly text: string;
|
|
5
|
+
readonly responses?: readonly InputResponse[];
|
|
6
|
+
}, ctx: SandboxAgentContext, env: Readonly<Record<string, string>>, failureFacts?: (raw: string, events: readonly StreamEvent[], nativeText: string) => {
|
|
7
|
+
readonly acceptance: "rejected" | "started" | "unknown";
|
|
8
|
+
readonly cause?: ExternalCause;
|
|
9
|
+
}): Promise<Turn>;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, StreamEvent, Turn } from "../types.js";
|
|
2
|
+
import { type ExternalCause } from "../shared/external-cause.js";
|
|
3
|
+
export declare function sendCodexAppServer(input: {
|
|
4
|
+
readonly text: string;
|
|
5
|
+
readonly responses?: readonly InputResponse[];
|
|
6
|
+
}, ctx: SandboxAgentContext, env: Readonly<Record<string, string>>, failureFacts?: (raw: string, events: readonly StreamEvent[], nativeText: string) => {
|
|
7
|
+
readonly acceptance: "rejected" | "started" | "unknown";
|
|
8
|
+
readonly cause?: ExternalCause;
|
|
9
|
+
}): Promise<Turn>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createRequire as __niceevalCreateRequire } from "node:module";
|
|
2
|
+
const __niceevalRequire = __niceevalCreateRequire(import.meta.url);
|
|
3
|
+
const __niceevalCanonical = __niceevalRequire("./codex-app-server.cjs");
|
|
4
|
+
const __niceevalExport0 = __niceevalCanonical["sendCodexAppServer"];
|
|
5
|
+
export { __niceevalExport0 as sendCodexAppServer };
|
|
6
|
+
//# sourceMappingURL=codex-app-server.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex-app-server.js","sources":[],"names":[],"mappings":""}
|