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
package/dist/agents/bub.cjs
CHANGED
|
@@ -51,8 +51,8 @@ function tapePath(workspace, sessionId, bubHome) {
|
|
|
51
51
|
return `${bubHome}/tapes/${w}__${s}.jsonl`;
|
|
52
52
|
}
|
|
53
53
|
function bubAgent(config) {
|
|
54
|
-
const getApiKey = () => config?.apiKey ?? (0, util_ts_1.requireEnv)("
|
|
55
|
-
const getApiBase = () => config?.apiBase ?? (0, util_ts_1.requireEnv)("
|
|
54
|
+
const getApiKey = () => config?.apiKey ?? (0, util_ts_1.requireEnv)("BUB_API_KEY");
|
|
55
|
+
const getApiBase = () => config?.apiBase ?? (0, util_ts_1.requireEnv)("BUB_API_BASE");
|
|
56
56
|
const packages = normalizePackages(config?.pythonPlugins);
|
|
57
57
|
const pin = resolvePin(config);
|
|
58
58
|
const identity = {
|
|
@@ -155,8 +155,8 @@ function bubAgent(config) {
|
|
|
155
155
|
ctx.session.capture(sessionId);
|
|
156
156
|
const apiKey = getApiKey();
|
|
157
157
|
const env = {
|
|
158
|
-
|
|
159
|
-
|
|
158
|
+
BUB_API_KEY: apiKey,
|
|
159
|
+
BUB_API_BASE: getApiBase(),
|
|
160
160
|
BUB_HOME: bubHome,
|
|
161
161
|
...ctx.telemetry?.env,
|
|
162
162
|
};
|
package/dist/agents/bub.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["import { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { defineSandboxAgent } from \"../define.ts\";\nimport { requireEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapBubSpans } from \"../o11y/otlp/mappers/bub.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport type { Agent, AgentSetupManifest, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { t } from \"../i18n/index.ts\";\nimport { BUB_INSTALL_MARKER, DEFAULT_BUB_DEPENDENCY_OVERRIDES, DEFAULT_BUB_OTEL_PLUGIN, DEFAULT_BUB_REQUIREMENT, bubInstallHash, bubRequirement, normalizeBubPackages, } from \"./bub-install-spec.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// bub 的 agent adapter(沙箱型)。\n//\n// ⚠️ 现实校正:bub 是 PyPI 上的 `bub`(alpha,Python 3.12),不是 npm 包。\n// · 安装:uv tool install bub(uv 自带 python 3.12,免 root)。\n// · 调用:bub run \"<prompt>\" --session-id <id> --workspace <path>\n// · 模型 + 代理:BUB_MODEL=openai:<model>、OPENAI_BASE_URL、OPENAI_API_KEY。\n// · 记忆:tape(总是开),落盘在 ~/.bub/tapes/<md5(ws)[:16]>__<md5(sess)[:16]>.jsonl。\n// ───────────────────────────────────────────────────────────────────────────\n/**\n * Bub 的扩展单元 —— **只属于 Bub**:Bub 的插件是运行环境里的 Python Package,\n * 与 Claude Code / Codex 的 native plugin 没有共同的安装协议,不共用类型。\n */\nexport interface PythonPluginSpec {\n /** PyPI Package、Version Specifier 或 Git URL(如 `bub-plugin-memory==1.3.0`、`git+https://…@8f3c1a2`)。 */\n package: string;\n}\nexport interface BubConfig {\n /** OpenAI 兼容代理的 API key。省略时读 OPENAI_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理的 base URL。省略时读 OPENAI_BASE_URL env。 */\n apiBase?: string;\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md(bub 没有原生 Skill 加载机制)。\n */\n skills?: SkillSpec[];\n /**\n * 装哪一版 Bub(PyPI 版本号,如 `\"0.4.0\"`)。省略时用 NiceEval 钉的默认版本;\n * 永远是确定版本,不装 latest —— 被测对象的版本要能从实验配置读出来。\n */\n version?: string;\n /**\n * OTel tape store 插件的 git 依赖(时间轨的来源)。省略时用 NiceEval 钉的默认 pin。\n *\n * 插件与 Bub 的 tape 协议同代:默认 pin 从 `bub.tape` 取类型,要求 Bub ≥ 0.3.10;更早的\n * 插件 commit 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,而是 span 全被拒、\n * 时间轨静默为空 —— 所以往回钉 `version` 时必须同批钉配套的插件 commit。\n */\n otelPlugin?: string;\n /**\n * 额外装进 bub tool 环境的 Python Package,每个 Sandbox setup 时进 `uv tool install … --with <pkg>`。\n * 规范化后的 package 列表进安装 checkpoint key:plugin 集合不同的两个 agent 变体不会复用同一个\n * 安装 checkpoint(否则第二个变体会静默拿到第一个变体的环境)。\n */\n pythonPlugins?: PythonPluginSpec[];\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在装 bub、装 Skills /\n * Python package、写 manifest 全部完成后执行。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: SandboxCommand[];\n}\nconst UV = \"$HOME/.local/bin/uv\";\n/** bub 的 skill 目录(`skills` 生态的「通用」目录);bub 不原生扫描它,靠 AGENTS.md 的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n// bub 与 OTel 插件的 pin 都从 config 来(缺省用源码里的默认 pin)——不设环境变量后门:\n// 装哪个包是配置,配置的家是代码(边界见 docs/architecture.md「配置从代码来,凭据从环境来」)。\n//\n// override 文件不是历史包袱:插件所在 workspace 把 `bub` 声明成 git 依赖,不覆盖的话每次\n// 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。\nconst BUB_OVERRIDE_FILE = \"/tmp/bub-override.txt\";\n/** 一个 agent 变体装的那套 bub:requirement + OTel 插件,两者都进安装指纹。 */\ninterface BubInstallPin {\n requirement: string;\n otelPlugin: string;\n dependencyOverrides: readonly string[];\n}\nfunction resolvePin(config?: BubConfig): BubInstallPin {\n const version = config?.version ?? DEFAULT_BUB_VERSION;\n return {\n requirement: config?.version ? bubRequirement(config.version) : DEFAULT_BUB_REQUIREMENT,\n otelPlugin: config?.otelPlugin ?? DEFAULT_BUB_OTEL_PLUGIN,\n // NiceEval can reproduce the default release's upstream lock exactly. A caller-selected\n // historical Bub version owns a different closure, so do not silently apply 0.4.0's pins.\n dependencyOverrides: version === DEFAULT_BUB_VERSION ? DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],\n };\n}\n// NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上\n// 另一个未知版本的 bub 抢先命中。\nconst BUB = \"$HOME/.local/bin/bub\";\n/** 规范化 python plugin:去空白、丢空串、去重 —— 安装命令与 checkpoint key 用同一份列表。 */\nfunction normalizePackages(plugins?: readonly PythonPluginSpec[]): string[] {\n return normalizeBubPackages((plugins ?? []).map((plugin) => plugin.package));\n}\nfunction installHashOf(packages: readonly string[], pin: BubInstallPin): string {\n return bubInstallHash(packages, pin.requirement, pin.otelPlugin, pin.dependencyOverrides);\n}\nfunction tapePath(workspace: string, sessionId: string, bubHome: string): string {\n const w = createHash(\"md5\").update(workspace).digest(\"hex\").slice(0, 16);\n const s = createHash(\"md5\").update(sessionId).digest(\"hex\").slice(0, 16);\n return `${bubHome}/tapes/${w}__${s}.jsonl`;\n}\nexport function bubAgent(config?: BubConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"OPENAI_API_KEY\");\n const getApiBase = () => config?.apiBase ?? requireEnv(\"OPENAI_BASE_URL\");\n const packages = normalizePackages(config?.pythonPlugins);\n const pin = resolvePin(config);\n const identity = {\n agent: \"bub\",\n version: config?.version ?? DEFAULT_BUB_VERSION,\n revision: installHashOf(packages, pin),\n } as const;\n const marker = `$HOME/${BUB_INSTALL_MARKER}`;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.bub\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${BUB} && test \"$(cat ${marker} 2>/dev/null)\" = ${shellQuote(identity.revision)}`);\n });\n // sandboxId → { home, workspace }; persists values detected in setup() so send() can use them.\n const sessionInfo = new Map<string, {\n home: string;\n workspace: string;\n }>();\n return registerAgentLifecycleHookCommands(defineSandboxAgent({\n name: \"bub\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.writeText(BUB_OVERRIDE_FILE, `${[pin.requirement, ...pin.dependencyOverrides].join(\"\\n\")}\\n`);\n const withPlugins = packages.map((pkg) => `--with ${shellQuote(pkg)}`).join(\" \");\n let last = \"\";\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const result = await sandbox.runShell(`${UV} tool install --reinstall --python 3.12 --prerelease allow 'bub' --overrides ${BUB_OVERRIDE_FILE} --with ${shellQuote(pin.otelPlugin)}${withPlugins ? ` ${withPlugins}` : \"\"}`);\n if (result.exitCode === 0) {\n await sandbox.runShellOrThrow(`mkdir -p \"$(dirname ${marker})\" && printf '%s' ${shellQuote(identity.revision)} > ${marker}`);\n return;\n }\n last = (result.stdout + result.stderr).split(\"\\n\").slice(-15).join(\"\\n\");\n }\n throw new Error(t(\"bub.installFailed\", { attempts: 3, tail: last }));\n },\n }],\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapBubSpans,\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n BUB_TAPESTORE_OTEL_ENABLED: \"true\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n async setup(sb, ctx) {\n // home 必须来自运行时探测:各 sandbox provider 不同(/home/node、/home/vercel-sandbox…),\n // 兜一个 provider 专属常量会静默走错路径(tape 读不到 → 空事件流 → 负断言假通过)。\n const home = (await sb.runShell(\"printf '%s' $HOME\")).stdout.trim();\n if (!home)\n throw new Error(t(\"bub.homeDetectFailed\"));\n const workspace = sb.workdir;\n sessionInfo.set(sb.sandboxId, { home, workspace });\n // Agent CLI 已由 runner 的 agent.ensure 循环完成安装与复检。\n // adapter setup 只写本 Attempt 的 runtime config。\n if (!(await sb.pathExists(`${workspace}/AGENTS.md`))) {\n await shared.writeFile(sb, `${workspace}/AGENTS.md`, [\n `You are a coding agent working in a Next.js project at ${workspace}.`,\n ``,\n `Implement the requested feature by writing files directly to disk with the available tools:`,\n `- fs_write(path, content): create or overwrite a file`,\n `- fs_edit(path, old, new): edit an existing file`,\n `- bash(cmd): run shell commands`,\n ``,\n `Do NOT respond with only a text explanation — write the actual code files.`,\n `After writing, verify with bash(\"cd ${workspace} && npm run build\").`,\n ].join(\"\\n\"));\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // bub 没有原生 Skill 加载机制:装进目录不等于会被读到,发现指引跟着一起写。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (packages.length)\n manifest.pythonPlugins = packages.map((pkg) => ({ package: pkg }));\n if (manifest.skills.length || manifest.pythonPlugins?.length) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"bub\", config?.postSetup);\n },\n async teardown(sb, ctx) {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // bub 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"bub\", config?.preTeardown);\n },\n async send(input, ctx) {\n const sb = ctx.sandbox;\n const info = sessionInfo.get(sb.sandboxId);\n if (!info)\n throw new Error(t(\"bub.setupNotRun\"));\n const { home, workspace } = info;\n const bubHome = `${home}/.bub`;\n // 会话契约:ctx.session.id 未记录时开新 tape(新 sessionId),否则 resume 传入的 id。\n // tape 路径由 md5(workspace)+md5(sessionId) 决定,同沙箱多会话靠 sessionId 区分。\n const sessionId = ctx.session.id ?? `fe-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n OPENAI_API_KEY: apiKey,\n OPENAI_BASE_URL: getApiBase(),\n BUB_HOME: bubHome,\n ...ctx.telemetry?.env,\n };\n // model 归属:实验决定(ctx.model),省略时交给 bub 原生默认 / 用户环境,不硬编码。\n if (ctx.model)\n env.BUB_MODEL = `openai:${ctx.model}`;\n const res = await sb.runShell(`${BUB} --workspace ${workspace} run ${shared.shellQuote(input.text)} --session-id ${sessionId}`, { env, sensitiveValues: [apiKey], stream: true });\n const raw = await sb.readText(tapePath(workspace, sessionId, bubHome)).catch(() => undefined);\n const parsed = shared.parseBub(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Bub tape was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Bub tape lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n }), config?.postSetup, config?.preTeardown);\n}\nexport default bubAgent();\n"]}
|
|
1
|
+
{"version":3,"file":"bub.js","sourceRoot":"","sources":["bub.ts"],"names":[],"mappings":"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","sourcesContent":["import { completeEvidenceCoverage } from \"../assertions/coverage.ts\";\nimport { defineSandboxAgent } from \"../define.ts\";\nimport { requireEnv } from \"../util.ts\";\nimport { shared } from \"./shared.ts\";\nimport { appendProjectInstruction, installSkills, installedSkillNames, skillDiscoveryInstruction, } from \"./skills.ts\";\nimport { mapBubSpans } from \"../o11y/otlp/mappers/bub.ts\";\nimport { unclassifiedToolActionsCoverage } from \"../o11y/command-projection.ts\";\nimport { registerAgentLifecycleHookCommands, runPostSetupHooks, runPreTeardownHooks, } from \"./post-setup.ts\";\nimport type { Agent, AgentSetupManifest, SkillSpec, TurnEvidenceCoverage } from \"../types.ts\";\nimport type { SandboxCommand } from \"../sandbox/commands.ts\";\nimport { createHash, randomUUID } from \"node:crypto\";\nimport { t } from \"../i18n/index.ts\";\nimport { BUB_INSTALL_MARKER, DEFAULT_BUB_DEPENDENCY_OVERRIDES, DEFAULT_BUB_OTEL_PLUGIN, DEFAULT_BUB_REQUIREMENT, bubInstallHash, bubRequirement, normalizeBubPackages, } from \"./bub-install-spec.ts\";\nimport { makeSendFailure, sendAcceptanceFromEvents } from \"../context/send-failures.ts\";\nimport { defineSandboxCommand } from \"../sandbox/commands.ts\";\nimport { shellQuote } from \"../sandbox/shell.ts\";\nimport { DEFAULT_BUB_VERSION } from \"./coding-cli-versions.ts\";\n// ───────────────────────────────────────────────────────────────────────────\n// bub 的 agent adapter(沙箱型)。\n//\n// ⚠️ 现实校正:bub 是 PyPI 上的 `bub`(alpha,Python 3.12),不是 npm 包。\n// · 安装:uv tool install bub(uv 自带 python 3.12,免 root)。\n// · 调用:bub run \"<prompt>\" --session-id <id> --workspace <path>\n// · 模型 + 代理:BUB_MODEL=openai:<model>、BUB_API_BASE、BUB_API_KEY。\n// · 记忆:tape(总是开),落盘在 ~/.bub/tapes/<md5(ws)[:16]>__<md5(sess)[:16]>.jsonl。\n// ───────────────────────────────────────────────────────────────────────────\n/**\n * Bub 的扩展单元 —— **只属于 Bub**:Bub 的插件是运行环境里的 Python Package,\n * 与 Claude Code / Codex 的 native plugin 没有共同的安装协议,不共用类型。\n */\nexport interface PythonPluginSpec {\n /** PyPI Package、Version Specifier 或 Git URL(如 `bub-plugin-memory==1.3.0`、`git+https://…@8f3c1a2`)。 */\n package: string;\n}\nexport interface BubConfig {\n /** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */\n apiKey?: string;\n /** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */\n apiBase?: string;\n /**\n * 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。\n * 落在 `.agents/skills/<name>/`,并写一段发现指引进 AGENTS.md(bub 没有原生 Skill 加载机制)。\n */\n skills?: SkillSpec[];\n /**\n * 装哪一版 Bub(PyPI 版本号,如 `\"0.4.0\"`)。省略时用 NiceEval 钉的默认版本;\n * 永远是确定版本,不装 latest —— 被测对象的版本要能从实验配置读出来。\n */\n version?: string;\n /**\n * OTel tape store 插件的 git 依赖(时间轨的来源)。省略时用 NiceEval 钉的默认 pin。\n *\n * 插件与 Bub 的 tape 协议同代:默认 pin 从 `bub.tape` 取类型,要求 Bub ≥ 0.3.10;更早的\n * 插件 commit 按 republic 的类型校验,配 Bub ≤ 0.3.9。配错代不会安装失败,而是 span 全被拒、\n * 时间轨静默为空 —— 所以往回钉 `version` 时必须同批钉配套的插件 commit。\n */\n otelPlugin?: string;\n /**\n * 额外装进 bub tool 环境的 Python Package,每个 Sandbox setup 时进 `uv tool install … --with <pkg>`。\n * 规范化后的 package 列表进安装 checkpoint key:plugin 集合不同的两个 agent 变体不会复用同一个\n * 安装 checkpoint(否则第二个变体会静默拿到第一个变体的环境)。\n */\n pythonPlugins?: PythonPluginSpec[];\n /**\n * 安装后按数组顺序运行的用户 Hook(复用 SandboxCommand 的窄上下文):在装 bub、装 Skills /\n * Python package、写 manifest 全部完成后执行。抛错按基础设施错误计(attempt errored)。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n postSetup?: SandboxCommand[];\n /**\n * 与 `postSetup` 成对的收尾 Hook:按 `postSetup` 的逆序语义,在 agent 自己的 teardown 步骤\n * 之前执行(LIFO 镜像 —— `postSetup` 跑在 agent 安装之后,`preTeardown` 就跑在 agent 收尾\n * 之前),当且仅当 `postSetup` 的时点走到过才触发。抛错按基础设施错误计,由 teardown 段\n * 按 teardown-failed 诊断收束。\n * 见 docs/feature/adapters/library/coding-agent-extensions.md「安装后运行脚本」。\n */\n preTeardown?: SandboxCommand[];\n}\nconst UV = \"$HOME/.local/bin/uv\";\n/** bub 的 skill 目录(`skills` 生态的「通用」目录);bub 不原生扫描它,靠 AGENTS.md 的发现指引。 */\nconst SKILL_DIR = \".agents/skills\";\n// bub 与 OTel 插件的 pin 都从 config 来(缺省用源码里的默认 pin)——不设环境变量后门:\n// 装哪个包是配置,配置的家是代码(边界见 docs/architecture.md「配置从代码来,凭据从环境来」)。\n//\n// override 文件不是历史包袱:插件所在 workspace 把 `bub` 声明成 git 依赖,不覆盖的话每次\n// 安装都会去拉 Bub 主干,版本失控。所以安装前总是先把 `bub==<version>` 写进这个文件。\nconst BUB_OVERRIDE_FILE = \"/tmp/bub-override.txt\";\n/** 一个 agent 变体装的那套 bub:requirement + OTel 插件,两者都进安装指纹。 */\ninterface BubInstallPin {\n requirement: string;\n otelPlugin: string;\n dependencyOverrides: readonly string[];\n}\nfunction resolvePin(config?: BubConfig): BubInstallPin {\n const version = config?.version ?? DEFAULT_BUB_VERSION;\n return {\n requirement: config?.version ? bubRequirement(config.version) : DEFAULT_BUB_REQUIREMENT,\n otelPlugin: config?.otelPlugin ?? DEFAULT_BUB_OTEL_PLUGIN,\n // NiceEval can reproduce the default release's upstream lock exactly. A caller-selected\n // historical Bub version owns a different closure, so do not silently apply 0.4.0's pins.\n dependencyOverrides: version === DEFAULT_BUB_VERSION ? DEFAULT_BUB_DEPENDENCY_OVERRIDES : [],\n };\n}\n// NiceEval 的预制配方与运行时安装都写到 $HOME/.local;显式使用该路径,避免 PATH 上\n// 另一个未知版本的 bub 抢先命中。\nconst BUB = \"$HOME/.local/bin/bub\";\n/** 规范化 python plugin:去空白、丢空串、去重 —— 安装命令与 checkpoint key 用同一份列表。 */\nfunction normalizePackages(plugins?: readonly PythonPluginSpec[]): string[] {\n return normalizeBubPackages((plugins ?? []).map((plugin) => plugin.package));\n}\nfunction installHashOf(packages: readonly string[], pin: BubInstallPin): string {\n return bubInstallHash(packages, pin.requirement, pin.otelPlugin, pin.dependencyOverrides);\n}\nfunction tapePath(workspace: string, sessionId: string, bubHome: string): string {\n const w = createHash(\"md5\").update(workspace).digest(\"hex\").slice(0, 16);\n const s = createHash(\"md5\").update(sessionId).digest(\"hex\").slice(0, 16);\n return `${bubHome}/tapes/${w}__${s}.jsonl`;\n}\nexport function bubAgent(config?: BubConfig): Agent {\n const getApiKey = () => config?.apiKey ?? requireEnv(\"BUB_API_KEY\");\n const getApiBase = () => config?.apiBase ?? requireEnv(\"BUB_API_BASE\");\n const packages = normalizePackages(config?.pythonPlugins);\n const pin = resolvePin(config);\n const identity = {\n agent: \"bub\",\n version: config?.version ?? DEFAULT_BUB_VERSION,\n revision: installHashOf(packages, pin),\n } as const;\n const marker = `$HOME/${BUB_INSTALL_MARKER}`;\n const probe = defineSandboxCommand({ id: \"niceeval.agent.probe.bub\", revision: identity.revision, inputs: identity }, async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${BUB} && test \"$(cat ${marker} 2>/dev/null)\" = ${shellQuote(identity.revision)}`);\n });\n // sandboxId → { home, workspace }; persists values detected in setup() so send() can use them.\n const sessionInfo = new Map<string, {\n home: string;\n workspace: string;\n }>();\n return registerAgentLifecycleHookCommands(defineSandboxAgent({\n name: \"bub\",\n ensure: { identity, probe },\n installers: [{\n identity,\n installMode: \"sandbox-network\",\n install: async (sandbox) => {\n await sandbox.runShellOrThrow(`test -x ${UV} || (curl -LsSf https://astral.sh/uv/install.sh | sh)`);\n await sandbox.writeText(BUB_OVERRIDE_FILE, `${[pin.requirement, ...pin.dependencyOverrides].join(\"\\n\")}\\n`);\n const withPlugins = packages.map((pkg) => `--with ${shellQuote(pkg)}`).join(\" \");\n let last = \"\";\n for (let attempt = 1; attempt <= 3; attempt += 1) {\n const result = await sandbox.runShell(`${UV} tool install --reinstall --python 3.12 --prerelease allow 'bub' --overrides ${BUB_OVERRIDE_FILE} --with ${shellQuote(pin.otelPlugin)}${withPlugins ? ` ${withPlugins}` : \"\"}`);\n if (result.exitCode === 0) {\n await sandbox.runShellOrThrow(`mkdir -p \"$(dirname ${marker})\" && printf '%s' ${shellQuote(identity.revision)} > ${marker}`);\n return;\n }\n last = (result.stdout + result.stderr).split(\"\\n\").slice(-15).join(\"\\n\");\n }\n throw new Error(t(\"bub.installFailed\", { attempts: 3, tail: last }));\n },\n }],\n // 官方 adapter:transcript 经生命周期 fixture 验证,全通道 complete。\n evidenceCoverage: completeEvidenceCoverage,\n spanMapper: mapBubSpans,\n tracing: {\n protocol: \"http/protobuf\",\n env: (endpoint) => ({\n BUB_TAPESTORE_OTEL_ENABLED: \"true\",\n OTEL_EXPORTER_OTLP_TRACES_ENDPOINT: endpoint,\n OTEL_EXPORTER_OTLP_TRACES_PROTOCOL: \"http/protobuf\",\n }),\n },\n async setup(sb, ctx) {\n // home 必须来自运行时探测:各 sandbox provider 不同(/home/node、/home/vercel-sandbox…),\n // 兜一个 provider 专属常量会静默走错路径(tape 读不到 → 空事件流 → 负断言假通过)。\n const home = (await sb.runShell(\"printf '%s' $HOME\")).stdout.trim();\n if (!home)\n throw new Error(t(\"bub.homeDetectFailed\"));\n const workspace = sb.workdir;\n sessionInfo.set(sb.sandboxId, { home, workspace });\n // Agent CLI 已由 runner 的 agent.ensure 循环完成安装与复检。\n // adapter setup 只写本 Attempt 的 runtime config。\n if (!(await sb.pathExists(`${workspace}/AGENTS.md`))) {\n await shared.writeFile(sb, `${workspace}/AGENTS.md`, [\n `You are a coding agent working in a Next.js project at ${workspace}.`,\n ``,\n `Implement the requested feature by writing files directly to disk with the available tools:`,\n `- fs_write(path, content): create or overwrite a file`,\n `- fs_edit(path, old, new): edit an existing file`,\n `- bash(cmd): run shell commands`,\n ``,\n `Do NOT respond with only a text explanation — write the actual code files.`,\n `After writing, verify with bash(\"cd ${workspace} && npm run build\").`,\n ].join(\"\\n\"));\n }\n const manifest: AgentSetupManifest = { skills: [] };\n if (config?.skills?.length) {\n manifest.skills = await installSkills(sb, config.skills, { dir: SKILL_DIR });\n // bub 没有原生 Skill 加载机制:装进目录不等于会被读到,发现指引跟着一起写。\n await appendProjectInstruction(sb, skillDiscoveryInstruction(SKILL_DIR, installedSkillNames(manifest.skills)));\n }\n if (packages.length)\n manifest.pythonPlugins = packages.map((pkg) => ({ package: pkg }));\n if (manifest.skills.length || manifest.pythonPlugins?.length) {\n ctx.reportSetup(manifest);\n }\n // 安装后钩子(postSetup):排在 manifest 之后——manifest 审计 Adapter 自身的安装事实,\n // 钩子失败不该丢掉这份证据。\n await runPostSetupHooks(sb, ctx, \"bub\", config?.postSetup);\n },\n async teardown(sb, ctx) {\n // preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。\n // bub 目前没有其它收尾步骤,这段就是整个 teardown。\n await runPreTeardownHooks(sb, ctx, \"bub\", config?.preTeardown);\n },\n async send(input, ctx) {\n const sb = ctx.sandbox;\n const info = sessionInfo.get(sb.sandboxId);\n if (!info)\n throw new Error(t(\"bub.setupNotRun\"));\n const { home, workspace } = info;\n const bubHome = `${home}/.bub`;\n // 会话契约:ctx.session.id 未记录时开新 tape(新 sessionId),否则 resume 传入的 id。\n // tape 路径由 md5(workspace)+md5(sessionId) 决定,同沙箱多会话靠 sessionId 区分。\n const sessionId = ctx.session.id ?? `fe-${sb.sandboxId}-${randomUUID().slice(0, 8)}`;\n ctx.session.capture(sessionId);\n const apiKey = getApiKey();\n const env: globalThis.Record<string, string> = {\n BUB_API_KEY: apiKey,\n BUB_API_BASE: getApiBase(),\n BUB_HOME: bubHome,\n ...ctx.telemetry?.env,\n };\n // model 归属:实验决定(ctx.model),省略时交给 bub 原生默认 / 用户环境,不硬编码。\n if (ctx.model)\n env.BUB_MODEL = `openai:${ctx.model}`;\n const res = await sb.runShell(`${BUB} --workspace ${workspace} run ${shared.shellQuote(input.text)} --session-id ${sessionId}`, { env, sensitiveValues: [apiKey], stream: true });\n const raw = await sb.readText(tapePath(workspace, sessionId, bubHome)).catch(() => undefined);\n const parsed = shared.parseBub(raw);\n const events = [...parsed.events];\n let turnEvidenceCoverage: TurnEvidenceCoverage | undefined;\n if (!raw?.trim()) {\n const reason = \"Bub tape was unavailable; tool trajectory was not observed.\";\n turnEvidenceCoverage = {\n events: { status: \"unavailable\", reason },\n actions: { status: \"unavailable\", reason },\n usage: { status: \"unavailable\", reason },\n };\n }\n else if (!parsed.parseSuccess) {\n const reason = \"Some Bub tape lines could not be parsed.\";\n turnEvidenceCoverage = {\n events: { status: \"partial\", reason },\n actions: { status: \"partial\", reason },\n };\n }\n else {\n turnEvidenceCoverage = unclassifiedToolActionsCoverage(events);\n }\n if (res.exitCode !== 0) {\n throw makeSendFailure({\n acceptance: sendAcceptanceFromEvents(events),\n message: shared.diagnoseFailure(res, parsed.events, raw),\n events,\n usage: parsed.usage,\n process: res,\n });\n }\n return {\n events,\n usage: parsed.usage,\n status: \"completed\",\n ...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),\n };\n },\n }), config?.postSetup, config?.preTeardown);\n}\nexport default bubAgent();\n"]}
|
package/dist/agents/bub.d.cts
CHANGED
|
@@ -9,9 +9,9 @@ export interface PythonPluginSpec {
|
|
|
9
9
|
package: string;
|
|
10
10
|
}
|
|
11
11
|
export interface BubConfig {
|
|
12
|
-
/** OpenAI 兼容代理的 API key。省略时读
|
|
12
|
+
/** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */
|
|
13
13
|
apiKey?: string;
|
|
14
|
-
/** OpenAI 兼容代理的 base URL。省略时读
|
|
14
|
+
/** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */
|
|
15
15
|
apiBase?: string;
|
|
16
16
|
/**
|
|
17
17
|
* 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。
|
package/dist/agents/bub.d.mts
CHANGED
|
@@ -9,9 +9,9 @@ export interface PythonPluginSpec {
|
|
|
9
9
|
package: string;
|
|
10
10
|
}
|
|
11
11
|
export interface BubConfig {
|
|
12
|
-
/** OpenAI 兼容代理的 API key。省略时读
|
|
12
|
+
/** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */
|
|
13
13
|
apiKey?: string;
|
|
14
|
-
/** OpenAI 兼容代理的 base URL。省略时读
|
|
14
|
+
/** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */
|
|
15
15
|
apiBase?: string;
|
|
16
16
|
/**
|
|
17
17
|
* 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。
|
package/dist/agents/bub.d.ts
CHANGED
|
@@ -9,9 +9,9 @@ export interface PythonPluginSpec {
|
|
|
9
9
|
package: string;
|
|
10
10
|
}
|
|
11
11
|
export interface BubConfig {
|
|
12
|
-
/** OpenAI 兼容代理的 API key。省略时读
|
|
12
|
+
/** OpenAI 兼容代理的 API key。省略时读 BUB_API_KEY env。 */
|
|
13
13
|
apiKey?: string;
|
|
14
|
-
/** OpenAI 兼容代理的 base URL。省略时读
|
|
14
|
+
/** OpenAI 兼容代理的 base URL。省略时读 BUB_API_BASE env。 */
|
|
15
15
|
apiBase?: string;
|
|
16
16
|
/**
|
|
17
17
|
* 装进 Sandbox 的 Skill(本地目录/文件,或 repo + 可钉 ref + 可选启用集)。
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.sendClaudeCodeNative = sendClaudeCodeNative;
|
|
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 slot = (0, session_slot_ts_1.createSessionSlot)("claude-code/stream-json-native");
|
|
12
|
+
function record(value) {
|
|
13
|
+
return value !== null && typeof value === "object" && !Array.isArray(value) ? value : undefined;
|
|
14
|
+
}
|
|
15
|
+
async function resolveBin(ctx) {
|
|
16
|
+
const result = await ctx.sandbox.runShell('if [ -x "$HOME/.local/bin/claude" ]; then printf %s "$HOME/.local/bin/claude"; else command -v claude; fi');
|
|
17
|
+
const value = result.stdout.trim();
|
|
18
|
+
if (result.exitCode !== 0 || !value)
|
|
19
|
+
throw new Error(`Claude Code CLI path resolution failed: ${result.stderr}`);
|
|
20
|
+
return value;
|
|
21
|
+
}
|
|
22
|
+
function eventKey(event) {
|
|
23
|
+
return event.type === "operation.started" || event.type === "operation.finished"
|
|
24
|
+
? `${event.type}:${event.operationId}`
|
|
25
|
+
: undefined;
|
|
26
|
+
}
|
|
27
|
+
function parseFrames(frames, reported) {
|
|
28
|
+
const parsed = shared_ts_1.shared.parseClaudeCode(frames.map((frame) => JSON.stringify(frame)).join("\n"));
|
|
29
|
+
return {
|
|
30
|
+
usage: parsed.usage,
|
|
31
|
+
parseSuccess: parsed.parseSuccess,
|
|
32
|
+
events: parsed.events.filter((event) => {
|
|
33
|
+
const key = eventKey(event);
|
|
34
|
+
if (key === undefined)
|
|
35
|
+
return true;
|
|
36
|
+
if (reported.has(key))
|
|
37
|
+
return false;
|
|
38
|
+
reported.add(key);
|
|
39
|
+
return true;
|
|
40
|
+
}),
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
function coverage(frames, parsed) {
|
|
44
|
+
if (frames.length === 0) {
|
|
45
|
+
const reason = "Claude Code stream-json output was unavailable; tool trajectory was not observed.";
|
|
46
|
+
return { events: { status: "unavailable", reason }, actions: { status: "unavailable", reason }, usage: { status: "unavailable", reason } };
|
|
47
|
+
}
|
|
48
|
+
if (!parsed.parseSuccess) {
|
|
49
|
+
const reason = "Some Claude Code stream-json frames could not be parsed.";
|
|
50
|
+
return { events: { status: "partial", reason }, actions: { status: "partial", reason } };
|
|
51
|
+
}
|
|
52
|
+
return (0, command_projection_ts_1.unclassifiedToolActionsCoverage)(parsed.events) ?? {};
|
|
53
|
+
}
|
|
54
|
+
function captureSession(state, frame, ctx) {
|
|
55
|
+
const id = frame.session_id;
|
|
56
|
+
if (typeof id !== "string" || id === "")
|
|
57
|
+
return;
|
|
58
|
+
if (state.sessionId !== undefined && state.sessionId !== id) {
|
|
59
|
+
throw new Error(`Claude Code changed native session identity from ${state.sessionId} to ${id}`);
|
|
60
|
+
}
|
|
61
|
+
state.sessionId = id;
|
|
62
|
+
ctx.session.capture(id);
|
|
63
|
+
}
|
|
64
|
+
function validate(pending, responses) {
|
|
65
|
+
if (responses === undefined)
|
|
66
|
+
throw new Error("Claude Code is waiting for a structured input response");
|
|
67
|
+
const byId = new Map(responses.map((response) => [response.requestId, response]));
|
|
68
|
+
if (byId.size !== responses.length)
|
|
69
|
+
throw new Error("Claude Code input responses contain duplicate request ids");
|
|
70
|
+
const expected = new Set(pending.questions.map((question) => question.requestId));
|
|
71
|
+
for (const requestId of byId.keys())
|
|
72
|
+
if (!expected.has(requestId))
|
|
73
|
+
throw new Error(`Unknown Claude Code input request ${requestId}`);
|
|
74
|
+
if (byId.size !== expected.size)
|
|
75
|
+
throw new Error("Claude Code input responses must answer the complete native question batch");
|
|
76
|
+
const answers = {};
|
|
77
|
+
for (const question of pending.questions) {
|
|
78
|
+
const response = byId.get(question.requestId);
|
|
79
|
+
const answer = "optionId" in response ? response.optionId : response.text;
|
|
80
|
+
if (answer === undefined)
|
|
81
|
+
throw new Error(`Claude Code input request ${question.requestId} has no answer`);
|
|
82
|
+
if ("optionId" in response && response.optionId !== undefined && !question.options.includes(response.optionId)) {
|
|
83
|
+
throw new Error(`Option ${response.optionId} is not available for Claude Code input request ${question.requestId}`);
|
|
84
|
+
}
|
|
85
|
+
answers[question.question] = answer;
|
|
86
|
+
}
|
|
87
|
+
return answers;
|
|
88
|
+
}
|
|
89
|
+
async function createState(ctx, args, env) {
|
|
90
|
+
const resources = (0, attempt_resources_ts_1.attemptResources)(ctx);
|
|
91
|
+
if (!resources)
|
|
92
|
+
throw new Error("Claude Code structured transport requires an Attempt resource registry");
|
|
93
|
+
const driver = await managed_jsonl_ts_1.ManagedJsonlDriver.start(ctx.sandbox, "claude-code", resources, {
|
|
94
|
+
argv: [await resolveBin(ctx), "--output-format", "stream-json", "--verbose", "--input-format", "stream-json", "--permission-prompt-tool", "stdio", "--permission-mode", "default", ...args],
|
|
95
|
+
cwd: ctx.sandbox.workdir,
|
|
96
|
+
env: { ...env, CLAUDE_CODE_ENTRYPOINT: "sdk-ts", CLAUDE_AGENT_SDK_VERSION: "0.3.226" },
|
|
97
|
+
});
|
|
98
|
+
return { driver, cursor: 0, reported: new Set() };
|
|
99
|
+
}
|
|
100
|
+
function pendingFrom(frame, sessionId) {
|
|
101
|
+
if (frame.type !== "control_request" || typeof frame.request_id !== "string")
|
|
102
|
+
return undefined;
|
|
103
|
+
const request = record(frame.request);
|
|
104
|
+
if (request?.subtype !== "can_use_tool" || request.tool_name !== "AskUserQuestion")
|
|
105
|
+
return undefined;
|
|
106
|
+
if (typeof request.tool_use_id !== "string")
|
|
107
|
+
throw new Error("Claude Code AskUserQuestion request has no native tool_use_id");
|
|
108
|
+
const input = record(request.input) ?? {};
|
|
109
|
+
const questions = Array.isArray(input.questions) ? input.questions : [];
|
|
110
|
+
if (questions.length === 0)
|
|
111
|
+
throw new Error("Claude Code AskUserQuestion request contained no questions");
|
|
112
|
+
return {
|
|
113
|
+
controlRequestId: frame.request_id,
|
|
114
|
+
toolUseId: request.tool_use_id,
|
|
115
|
+
input,
|
|
116
|
+
questions: questions.map((value, index) => {
|
|
117
|
+
const question = record(value) ?? {};
|
|
118
|
+
const options = Array.isArray(question.options)
|
|
119
|
+
? question.options.map((option) => String(record(option)?.label ?? "")).filter(Boolean)
|
|
120
|
+
: [];
|
|
121
|
+
return {
|
|
122
|
+
requestId: `${sessionId}:${request.tool_use_id}:${index}`,
|
|
123
|
+
index,
|
|
124
|
+
question: String(question.question ?? ""),
|
|
125
|
+
options,
|
|
126
|
+
};
|
|
127
|
+
}),
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
async function drive(state, from, ctx) {
|
|
131
|
+
for (;;) {
|
|
132
|
+
const scanFrom = state.cursor;
|
|
133
|
+
const receipt = await state.driver.waitFor(state.cursor, (value) => {
|
|
134
|
+
const frame = record(value);
|
|
135
|
+
return frame?.type === "control_request" || frame?.type === "result";
|
|
136
|
+
}, ctx.signal);
|
|
137
|
+
state.cursor = receipt.cursor;
|
|
138
|
+
const frame = record(receipt.frame);
|
|
139
|
+
for (const value of state.driver.framesSince(scanFrom).slice(0, receipt.cursor - scanFrom)) {
|
|
140
|
+
const candidate = record(value);
|
|
141
|
+
if (candidate)
|
|
142
|
+
captureSession(state, candidate, ctx);
|
|
143
|
+
}
|
|
144
|
+
if (frame.type === "control_request") {
|
|
145
|
+
const request = record(frame.request);
|
|
146
|
+
if (state.sessionId === undefined)
|
|
147
|
+
throw new Error("Claude Code control request arrived before native session identity");
|
|
148
|
+
const pending = pendingFrom(frame, state.sessionId);
|
|
149
|
+
if (pending) {
|
|
150
|
+
state.pending = pending;
|
|
151
|
+
const frames = state.driver.framesSince(from).slice(0, receipt.cursor - from);
|
|
152
|
+
const parsed = parseFrames(frames, state.reported);
|
|
153
|
+
for (const event of parsed.events)
|
|
154
|
+
if (event.type === "operation.started")
|
|
155
|
+
ctx.progress({ message: event.operation.name });
|
|
156
|
+
return {
|
|
157
|
+
status: "waiting",
|
|
158
|
+
events: [...parsed.events, ...pending.questions.map((question) => ({ type: "input.requested", request: { id: question.requestId, action: "AskUserQuestion", prompt: question.question, options: question.options.map((id) => ({ id })) } }))],
|
|
159
|
+
usage: parsed.usage,
|
|
160
|
+
evidenceCoverage: coverage(frames, parsed),
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
if (request?.subtype === "can_use_tool" && typeof frame.request_id === "string") {
|
|
164
|
+
await state.driver.write({ type: "control_response", response: { subtype: "success", request_id: frame.request_id, response: { behavior: "allow", updatedInput: record(request.input) ?? {} } } });
|
|
165
|
+
}
|
|
166
|
+
continue;
|
|
167
|
+
}
|
|
168
|
+
const frames = state.driver.framesSince(from).slice(0, receipt.cursor - from);
|
|
169
|
+
const parsed = parseFrames(frames, state.reported);
|
|
170
|
+
for (const value of frames) {
|
|
171
|
+
const candidate = record(value);
|
|
172
|
+
if (candidate)
|
|
173
|
+
captureSession(state, candidate, ctx);
|
|
174
|
+
}
|
|
175
|
+
if (frame.is_error === true) {
|
|
176
|
+
throw (0, send_failures_ts_1.makeSendFailure)({ acceptance: (0, send_failures_ts_1.sendAcceptanceFromEvents)(parsed.events), message: String(frame.result ?? frame.subtype ?? "Claude Code turn failed"), cause: (0, external_cause_ts_1.normalizeExternalCause)(frame), events: parsed.events, usage: parsed.usage, process: state.driver.processReceipt() });
|
|
177
|
+
}
|
|
178
|
+
return { status: "completed", events: parsed.events, usage: parsed.usage, evidenceCoverage: coverage(frames, parsed) };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
async function sendClaudeCodeNative(input, ctx, args, env) {
|
|
182
|
+
let state = ctx.session.get(slot);
|
|
183
|
+
if (!state) {
|
|
184
|
+
state = await createState(ctx, args, env);
|
|
185
|
+
ctx.session.set(slot, state);
|
|
186
|
+
}
|
|
187
|
+
const from = state.cursor;
|
|
188
|
+
try {
|
|
189
|
+
if (state.pending) {
|
|
190
|
+
const pending = state.pending;
|
|
191
|
+
const answers = validate(pending, input.responses);
|
|
192
|
+
if (state.driver.framesSince(state.cursor).length !== 0)
|
|
193
|
+
throw new Error("Claude Code produced activity after entering waiting state; refusing an ambiguous answer");
|
|
194
|
+
await state.driver.write({
|
|
195
|
+
type: "control_response",
|
|
196
|
+
response: { subtype: "success", request_id: pending.controlRequestId, response: { behavior: "allow", updatedInput: { ...pending.input, answers } } },
|
|
197
|
+
});
|
|
198
|
+
state.pending = undefined;
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
if (input.responses?.length)
|
|
202
|
+
throw new Error("Claude Code received responses while no native request was pending");
|
|
203
|
+
await state.driver.write({ type: "user", session_id: state.sessionId ?? "", message: { role: "user", content: [{ type: "text", text: input.text }] }, parent_tool_use_id: null });
|
|
204
|
+
}
|
|
205
|
+
return await drive(state, from, ctx);
|
|
206
|
+
}
|
|
207
|
+
catch (cause) {
|
|
208
|
+
if (typeof cause === "object" && cause !== null && cause.type === "agent-send-failed")
|
|
209
|
+
throw cause;
|
|
210
|
+
throw (0, send_failures_ts_1.makeSendFailure)({ acceptance: state.pending ? "started" : "unknown", message: `Claude Code structured transport failed: ${cause instanceof Error ? cause.message : String(cause)} (frames=${state.driver.frameKinds() || "none"})`, cause: (0, external_cause_ts_1.normalizeExternalCause)(cause), process: state.driver.processReceipt() });
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
//# sourceMappingURL=claude-code-native.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-native.js","sourceRoot":"","sources":["claude-code-native.ts"],"names":[],"mappings":"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","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 } 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 index: number;\n readonly question: string;\n readonly options: readonly string[];\n};\ntype Pending = {\n readonly controlRequestId: string;\n readonly toolUseId: string;\n readonly input: RecordValue;\n readonly questions: readonly PendingQuestion[];\n};\ntype ClaudeState = {\n readonly driver: ManagedJsonlDriver;\n cursor: number;\n pending?: Pending;\n sessionId?: string;\n readonly reported: Set<string>;\n};\nconst slot = createSessionSlot<ClaudeState>(\"claude-code/stream-json-native\");\nfunction record(value: unknown): RecordValue | undefined {\n return value !== null && typeof value === \"object\" && !Array.isArray(value) ? value as RecordValue : undefined;\n}\nasync function resolveBin(ctx: SandboxAgentContext): Promise<string> {\n const result = await ctx.sandbox.runShell('if [ -x \"$HOME/.local/bin/claude\" ]; then printf %s \"$HOME/.local/bin/claude\"; else command -v claude; fi');\n const value = result.stdout.trim();\n if (result.exitCode !== 0 || !value)\n throw new Error(`Claude Code CLI path resolution failed: ${result.stderr}`);\n return value;\n}\nfunction eventKey(event: StreamEvent): string | undefined {\n return event.type === \"operation.started\" || event.type === \"operation.finished\"\n ? `${event.type}:${event.operationId}`\n : undefined;\n}\nfunction parseFrames(frames: readonly unknown[], reported: Set<string>): {\n events: StreamEvent[];\n usage: Usage;\n parseSuccess: boolean;\n} {\n const parsed = shared.parseClaudeCode(frames.map((frame) => JSON.stringify(frame)).join(\"\\n\"));\n return {\n usage: parsed.usage,\n parseSuccess: parsed.parseSuccess,\n 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 };\n}\nfunction coverage(frames: readonly unknown[], parsed: ReturnType<typeof parseFrames>): TurnEvidenceCoverage {\n if (frames.length === 0) {\n const reason = \"Claude Code stream-json 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 (!parsed.parseSuccess) {\n const reason = \"Some Claude Code stream-json frames could not be parsed.\";\n return { events: { status: \"partial\", reason }, actions: { status: \"partial\", reason } };\n }\n return unclassifiedToolActionsCoverage(parsed.events) ?? {};\n}\nfunction captureSession(state: ClaudeState, frame: RecordValue, ctx: SandboxAgentContext): void {\n const id = frame.session_id;\n if (typeof id !== \"string\" || id === \"\")\n return;\n if (state.sessionId !== undefined && state.sessionId !== id) {\n throw new Error(`Claude Code changed native session identity from ${state.sessionId} to ${id}`);\n }\n state.sessionId = id;\n ctx.session.capture(id);\n}\nfunction validate(pending: Pending, responses: readonly InputResponse[] | undefined): Record<string, string> {\n if (responses === undefined)\n throw new Error(\"Claude Code is waiting for a structured input response\");\n const byId = new Map(responses.map((response) => [response.requestId, response]));\n if (byId.size !== responses.length)\n throw new Error(\"Claude Code input responses contain duplicate request ids\");\n const expected = new Set(pending.questions.map((question) => question.requestId));\n for (const requestId of byId.keys())\n if (!expected.has(requestId))\n throw new Error(`Unknown Claude Code input request ${requestId}`);\n if (byId.size !== expected.size)\n throw new Error(\"Claude Code input responses must answer the complete native question batch\");\n const answers: Record<string, string> = {};\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(`Claude Code 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 Claude Code input request ${question.requestId}`);\n }\n answers[question.question] = answer;\n }\n return answers;\n}\nasync function createState(ctx: SandboxAgentContext, args: readonly string[], env: Readonly<Record<string, string>>): Promise<ClaudeState> {\n const resources = attemptResources(ctx);\n if (!resources)\n throw new Error(\"Claude Code structured transport requires an Attempt resource registry\");\n const driver = await ManagedJsonlDriver.start(ctx.sandbox, \"claude-code\", resources, {\n argv: [await resolveBin(ctx), \"--output-format\", \"stream-json\", \"--verbose\", \"--input-format\", \"stream-json\", \"--permission-prompt-tool\", \"stdio\", \"--permission-mode\", \"default\", ...args],\n cwd: ctx.sandbox.workdir,\n env: { ...env, CLAUDE_CODE_ENTRYPOINT: \"sdk-ts\", CLAUDE_AGENT_SDK_VERSION: \"0.3.226\" },\n });\n return { driver, cursor: 0, reported: new Set() };\n}\nfunction pendingFrom(frame: RecordValue, sessionId: string): Pending | undefined {\n if (frame.type !== \"control_request\" || typeof frame.request_id !== \"string\")\n return undefined;\n const request = record(frame.request);\n if (request?.subtype !== \"can_use_tool\" || request.tool_name !== \"AskUserQuestion\")\n return undefined;\n if (typeof request.tool_use_id !== \"string\")\n throw new Error(\"Claude Code AskUserQuestion request has no native tool_use_id\");\n const input = record(request.input) ?? {};\n const questions = Array.isArray(input.questions) ? input.questions : [];\n if (questions.length === 0)\n throw new Error(\"Claude Code AskUserQuestion request contained no questions\");\n return {\n controlRequestId: frame.request_id,\n toolUseId: request.tool_use_id,\n input,\n questions: questions.map((value, index) => {\n const question = record(value) ?? {};\n const options = Array.isArray(question.options)\n ? question.options.map((option) => String(record(option)?.label ?? \"\")).filter(Boolean)\n : [];\n return {\n requestId: `${sessionId}:${request.tool_use_id}:${index}`,\n index,\n question: String(question.question ?? \"\"),\n options,\n };\n }),\n };\n}\nasync function drive(state: ClaudeState, from: number, ctx: SandboxAgentContext): Promise<Turn> {\n for (;;) {\n const scanFrom = state.cursor;\n const receipt = await state.driver.waitFor(state.cursor, (value) => {\n const frame = record(value);\n return frame?.type === \"control_request\" || frame?.type === \"result\";\n }, ctx.signal);\n state.cursor = receipt.cursor;\n const frame = record(receipt.frame)!;\n for (const value of state.driver.framesSince(scanFrom).slice(0, receipt.cursor - scanFrom)) {\n const candidate = record(value);\n if (candidate)\n captureSession(state, candidate, ctx);\n }\n if (frame.type === \"control_request\") {\n const request = record(frame.request);\n if (state.sessionId === undefined)\n throw new Error(\"Claude Code control request arrived before native session identity\");\n const pending = pendingFrom(frame, state.sessionId);\n if (pending) {\n state.pending = pending;\n const frames = state.driver.framesSince(from).slice(0, receipt.cursor - from);\n const parsed = parseFrames(frames, 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: [...parsed.events, ...pending.questions.map((question): StreamEvent => ({ type: \"input.requested\", request: { id: question.requestId, action: \"AskUserQuestion\", prompt: question.question, options: question.options.map((id) => ({ id })) } }))],\n usage: parsed.usage,\n evidenceCoverage: coverage(frames, parsed),\n };\n }\n if (request?.subtype === \"can_use_tool\" && typeof frame.request_id === \"string\") {\n await state.driver.write({ type: \"control_response\", response: { subtype: \"success\", request_id: frame.request_id, response: { behavior: \"allow\", updatedInput: record(request.input) ?? {} } } });\n }\n continue;\n }\n const frames = state.driver.framesSince(from).slice(0, receipt.cursor - from);\n const parsed = parseFrames(frames, state.reported);\n for (const value of frames) {\n const candidate = record(value);\n if (candidate)\n captureSession(state, candidate, ctx);\n }\n if (frame.is_error === true) {\n throw makeSendFailure({ acceptance: sendAcceptanceFromEvents(parsed.events), message: String(frame.result ?? frame.subtype ?? \"Claude Code turn failed\"), cause: normalizeExternalCause(frame), events: parsed.events, usage: parsed.usage, process: state.driver.processReceipt() });\n }\n return { status: \"completed\", events: parsed.events, usage: parsed.usage, evidenceCoverage: coverage(frames, parsed) };\n }\n}\nexport async function sendClaudeCodeNative(input: {\n readonly text: string;\n readonly responses?: readonly InputResponse[];\n}, ctx: SandboxAgentContext, args: readonly string[], env: Readonly<Record<string, string>>): Promise<Turn> {\n let state = ctx.session.get(slot);\n if (!state) {\n state = await createState(ctx, args, env);\n ctx.session.set(slot, state);\n }\n const from = state.cursor;\n try {\n if (state.pending) {\n const pending = state.pending;\n const answers = validate(pending, input.responses);\n if (state.driver.framesSince(state.cursor).length !== 0)\n throw new Error(\"Claude Code produced activity after entering waiting state; refusing an ambiguous answer\");\n await state.driver.write({\n type: \"control_response\",\n response: { subtype: \"success\", request_id: pending.controlRequestId, response: { behavior: \"allow\", updatedInput: { ...pending.input, answers } } },\n });\n state.pending = undefined;\n }\n else {\n if (input.responses?.length)\n throw new Error(\"Claude Code received responses while no native request was pending\");\n await state.driver.write({ type: \"user\", session_id: state.sessionId ?? \"\", message: { role: \"user\", content: [{ type: \"text\", text: input.text }] }, parent_tool_use_id: null });\n }\n return await drive(state, from, ctx);\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 throw makeSendFailure({ acceptance: state.pending ? \"started\" : \"unknown\", message: `Claude Code structured transport failed: ${cause instanceof Error ? cause.message : String(cause)} (frames=${state.driver.frameKinds() || \"none\"})`, cause: normalizeExternalCause(cause), process: state.driver.processReceipt() });\n }\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, Turn } from "../types.cjs";
|
|
2
|
+
export declare function sendClaudeCodeNative(input: {
|
|
3
|
+
readonly text: string;
|
|
4
|
+
readonly responses?: readonly InputResponse[];
|
|
5
|
+
}, ctx: SandboxAgentContext, args: readonly string[], env: Readonly<Record<string, string>>): Promise<Turn>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, Turn } from "../types.mjs";
|
|
2
|
+
export declare function sendClaudeCodeNative(input: {
|
|
3
|
+
readonly text: string;
|
|
4
|
+
readonly responses?: readonly InputResponse[];
|
|
5
|
+
}, ctx: SandboxAgentContext, args: readonly string[], env: Readonly<Record<string, string>>): Promise<Turn>;
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { InputResponse, SandboxAgentContext, Turn } from "../types.js";
|
|
2
|
+
export declare function sendClaudeCodeNative(input: {
|
|
3
|
+
readonly text: string;
|
|
4
|
+
readonly responses?: readonly InputResponse[];
|
|
5
|
+
}, ctx: SandboxAgentContext, args: readonly string[], env: Readonly<Record<string, string>>): 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("./claude-code-native.cjs");
|
|
4
|
+
const __niceevalExport0 = __niceevalCanonical["sendClaudeCodeNative"];
|
|
5
|
+
export { __niceevalExport0 as sendClaudeCodeNative };
|
|
6
|
+
//# sourceMappingURL=claude-code-native.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude-code-native.js","sources":[],"names":[],"mappings":""}
|
|
@@ -11,13 +11,14 @@ const skills_ts_1 = require("./skills.cjs");
|
|
|
11
11
|
const marketplace_ts_1 = require("./marketplace.cjs");
|
|
12
12
|
const native_config_ts_1 = require("./native-config.cjs");
|
|
13
13
|
const claude_code_ts_1 = require("../o11y/otlp/mappers/claude-code.cjs");
|
|
14
|
-
const command_projection_ts_1 = require("../o11y/command-projection.cjs");
|
|
15
14
|
const index_ts_1 = require("../i18n/index.cjs");
|
|
16
15
|
const coding_cli_versions_ts_1 = require("./coding-cli-versions.cjs");
|
|
17
16
|
const mcp_ts_1 = require("./mcp.cjs");
|
|
18
17
|
const post_setup_ts_1 = require("./post-setup.cjs");
|
|
19
18
|
const npm_staged_ts_1 = require("./npm-staged.cjs");
|
|
20
|
-
const
|
|
19
|
+
const backend_ts_1 = require("../sandbox/backend.cjs");
|
|
20
|
+
const attempt_resources_ts_1 = require("../context/attempt-resources.cjs");
|
|
21
|
+
const claude_code_native_ts_1 = require("./claude-code-native.cjs");
|
|
21
22
|
// ───────────────────────────────────────────────────────────────────────────
|
|
22
23
|
// Claude Code 的 agent adapter(沙箱型)。
|
|
23
24
|
//
|
|
@@ -70,6 +71,7 @@ function claudeCodeAgent(config) {
|
|
|
70
71
|
}),
|
|
71
72
|
},
|
|
72
73
|
setup: (sb, ctx) => effect_1.Effect.runPromise(effect_1.Effect.scoped(effect_1.Effect.gen(function* () {
|
|
74
|
+
yield* effect_1.Effect.try({ try: () => (0, backend_ts_1.requireManagedProcessCapability)(sb, "claude-code"), catch: (cause) => cause });
|
|
73
75
|
// 原生配置文件最先落(安装顺序契约的第 1 步):本地读原始字节 → 验 JSON 语法与保留键
|
|
74
76
|
// → 原样替换沙箱里原本为空的用户级 settings.json。字节 SHA-256 进 manifest 与安装
|
|
75
77
|
// checkpoint key(见 native-config.ts 的 nativeConfigCheckpointItem)。
|
|
@@ -155,85 +157,29 @@ function claudeCodeAgent(config) {
|
|
|
155
157
|
// preTeardown 与 postSetup 成对:LIFO 镜像,先于 agent 自己的收尾步骤执行。
|
|
156
158
|
// claude-code 目前没有其它收尾步骤,这段就是整个 teardown。
|
|
157
159
|
await (0, post_setup_ts_1.runPreTeardownHooks)(sb, ctx, "claude-code", config?.preTeardown);
|
|
160
|
+
await (0, attempt_resources_ts_1.attemptResources)(ctx)?.shutdownAll(ctx.signal);
|
|
161
|
+
},
|
|
162
|
+
async send(input, ctx) {
|
|
163
|
+
const args = [];
|
|
164
|
+
if (ctx.model)
|
|
165
|
+
args.push("--model", ctx.model);
|
|
166
|
+
if (config?.maxTurns != null)
|
|
167
|
+
args.push("--max-turns", String(config.maxTurns));
|
|
168
|
+
if (ctx.flags.webResearch)
|
|
169
|
+
args.push("--allowedTools", "WebSearch,WebFetch");
|
|
170
|
+
const apiKey = getApiKey();
|
|
171
|
+
const env = {
|
|
172
|
+
...agentEnv,
|
|
173
|
+
ANTHROPIC_API_KEY: apiKey,
|
|
174
|
+
// Eval runs must not silently change CLI version after the sandbox artifact was built.
|
|
175
|
+
DISABLE_AUTOUPDATER: "1",
|
|
176
|
+
...ctx.telemetry?.env,
|
|
177
|
+
};
|
|
178
|
+
const baseUrl = getBaseUrl();
|
|
179
|
+
if (baseUrl)
|
|
180
|
+
env["ANTHROPIC_BASE_URL"] = baseUrl;
|
|
181
|
+
return (0, claude_code_native_ts_1.sendClaudeCodeNative)(input, ctx, args, env);
|
|
158
182
|
},
|
|
159
|
-
send: (input, ctx) => effect_1.Effect.runPromise(effect_1.Effect.scoped(effect_1.Effect.gen(function* () {
|
|
160
|
-
const sb = ctx.sandbox;
|
|
161
|
-
const claudeBin = yield* (0, npm_staged_ts_1.resolveAgentBinEffect)(sb, "claude");
|
|
162
|
-
return yield* effect_1.Effect.tryPromise({
|
|
163
|
-
try: async (signal) => {
|
|
164
|
-
const args = ["--print", "--dangerously-skip-permissions"];
|
|
165
|
-
if (ctx.model)
|
|
166
|
-
args.push("--model", ctx.model);
|
|
167
|
-
if (config?.maxTurns != null)
|
|
168
|
-
args.push("--max-turns", String(config.maxTurns));
|
|
169
|
-
if (ctx.flags.webResearch)
|
|
170
|
-
args.push("--allowedTools", "WebSearch,WebFetch");
|
|
171
|
-
if (ctx.session.id)
|
|
172
|
-
args.push("--resume", ctx.session.id);
|
|
173
|
-
// --allowedTools is variadic in Claude Code. Terminate option parsing so the
|
|
174
|
-
// positional prompt cannot be consumed as one more allowed tool name.
|
|
175
|
-
args.push("--", input.text);
|
|
176
|
-
const apiKey = getApiKey();
|
|
177
|
-
const env = {
|
|
178
|
-
...agentEnv,
|
|
179
|
-
ANTHROPIC_API_KEY: apiKey,
|
|
180
|
-
// Eval runs must not silently change CLI version after the sandbox artifact was built.
|
|
181
|
-
DISABLE_AUTOUPDATER: "1",
|
|
182
|
-
...ctx.telemetry?.env,
|
|
183
|
-
};
|
|
184
|
-
const baseUrl = getBaseUrl();
|
|
185
|
-
if (baseUrl)
|
|
186
|
-
env["ANTHROPIC_BASE_URL"] = baseUrl;
|
|
187
|
-
const res = await sb.runCommand(claudeBin, args, {
|
|
188
|
-
env,
|
|
189
|
-
sensitiveValues: [apiKey, ...agentEnvSensitiveValues],
|
|
190
|
-
stream: true,
|
|
191
|
-
signal,
|
|
192
|
-
});
|
|
193
|
-
// 「最新 jsonl」而非按 session id 精确定位:--resume 会 fork 新 session id 的新文件,
|
|
194
|
-
// 精确匹配旧 id 会读到过期 transcript。send 串行,最新的一定是刚跑完的这次。
|
|
195
|
-
const raw = await shared_ts_1.shared.captureLatestJsonl(sb, "~/.claude/projects");
|
|
196
|
-
ctx.session.capture(shared_ts_1.shared.sessionIdFromClaudeTranscript(raw));
|
|
197
|
-
const parsed = shared_ts_1.shared.parseClaudeCode(raw);
|
|
198
|
-
const events = [...parsed.events];
|
|
199
|
-
let turnEvidenceCoverage;
|
|
200
|
-
if (!raw?.trim()) {
|
|
201
|
-
const reason = "Claude Code transcript was unavailable; tool trajectory was not observed.";
|
|
202
|
-
turnEvidenceCoverage = {
|
|
203
|
-
events: { status: "unavailable", reason },
|
|
204
|
-
actions: { status: "unavailable", reason },
|
|
205
|
-
usage: { status: "unavailable", reason },
|
|
206
|
-
};
|
|
207
|
-
}
|
|
208
|
-
else if (!parsed.parseSuccess) {
|
|
209
|
-
const reason = "Some Claude Code transcript lines could not be parsed.";
|
|
210
|
-
turnEvidenceCoverage = {
|
|
211
|
-
events: { status: "partial", reason },
|
|
212
|
-
actions: { status: "partial", reason },
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
else {
|
|
216
|
-
turnEvidenceCoverage = (0, command_projection_ts_1.unclassifiedToolActionsCoverage)(events);
|
|
217
|
-
}
|
|
218
|
-
if (res.exitCode !== 0) {
|
|
219
|
-
throw (0, send_failures_ts_1.makeSendFailure)({
|
|
220
|
-
acceptance: (0, send_failures_ts_1.sendAcceptanceFromEvents)(events),
|
|
221
|
-
message: shared_ts_1.shared.diagnoseFailure(res, parsed.events, raw),
|
|
222
|
-
events,
|
|
223
|
-
usage: parsed.usage,
|
|
224
|
-
process: res,
|
|
225
|
-
});
|
|
226
|
-
}
|
|
227
|
-
return {
|
|
228
|
-
events,
|
|
229
|
-
usage: parsed.usage,
|
|
230
|
-
status: "completed",
|
|
231
|
-
...(turnEvidenceCoverage === undefined ? {} : { evidenceCoverage: turnEvidenceCoverage }),
|
|
232
|
-
};
|
|
233
|
-
},
|
|
234
|
-
catch: (cause) => cause,
|
|
235
|
-
});
|
|
236
|
-
})), { signal: ctx.signal }),
|
|
237
183
|
}), config?.postSetup, config?.preTeardown);
|
|
238
184
|
}
|
|
239
185
|
/**
|