niceeval 0.13.3 → 0.13.4-canary.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/INDEX.md +5 -5
- package/dist/agents/index.cjs +2 -2
- package/dist/agents/index.cjs.map +1 -1
- package/dist/agents/project.json +6 -0
- package/dist/agents/streaming.cjs.map +1 -1
- package/dist/agents/types.cjs.map +1 -1
- package/dist/agents/types.d.cts +1 -1
- package/dist/agents/types.d.mts +1 -1
- package/dist/agents/types.d.ts +1 -1
- package/dist/analysis/bindings.d.cts +8 -8
- package/dist/analysis/bindings.d.mts +8 -8
- package/dist/analysis/bindings.d.ts +8 -8
- package/dist/analysis/contracts.cjs.map +1 -1
- package/dist/analysis/contracts.d.cts +8 -19
- package/dist/analysis/contracts.d.mts +8 -19
- package/dist/analysis/contracts.d.ts +8 -19
- package/dist/analysis/experiment-groups.cjs +7 -14
- package/dist/analysis/experiment-groups.cjs.map +1 -1
- 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/cli/application.cjs +4 -13
- package/dist/cli/application.cjs.map +1 -1
- package/dist/cli/application.d.cts +62 -59
- package/dist/cli/application.d.mts +62 -59
- package/dist/cli/application.d.ts +62 -59
- package/dist/cli/application.js +6 -12
- package/dist/cli/bootstrap.cjs +28 -2
- package/dist/cli/bootstrap.cjs.map +1 -1
- package/dist/cli/contribution.cjs +185 -0
- package/dist/cli/contribution.cjs.map +1 -0
- package/dist/cli/contribution.d.cts +55 -0
- package/dist/cli/contribution.d.mts +55 -0
- package/dist/cli/contribution.d.ts +55 -0
- package/dist/cli/contribution.js +20 -0
- package/dist/cli/contribution.js.map +1 -0
- package/dist/cli/node-application.cjs +119 -87
- package/dist/cli/node-application.cjs.map +1 -1
- package/dist/cli/node-application.d.cts +2 -8
- package/dist/cli/node-application.d.mts +2 -8
- package/dist/cli/node-application.d.ts +2 -8
- package/dist/cli/node-application.js +12 -22
- package/dist/cli/program.cjs +87 -2756
- package/dist/cli/program.cjs.map +1 -1
- package/dist/cli/program.d.cts +11 -332
- package/dist/cli/program.d.mts +11 -332
- package/dist/cli/program.d.ts +11 -332
- package/dist/cli/program.js +4 -28
- package/dist/cli.cjs +0 -3
- package/dist/cli.cjs.map +1 -1
- package/dist/cli.d.cts +0 -1
- package/dist/cli.d.mts +0 -1
- package/dist/cli.d.ts +0 -1
- package/dist/cli.js +6 -14
- package/dist/define.cjs +1 -1
- package/dist/define.cjs.map +1 -1
- package/dist/docker/cache-administration.cjs +8 -0
- package/dist/docker/cache-administration.cjs.map +1 -0
- package/dist/docker/cache-administration.d.cts +33 -0
- package/dist/docker/cache-administration.d.mts +33 -0
- package/dist/docker/cache-administration.d.ts +33 -0
- package/dist/docker/cache-administration.js +6 -0
- package/dist/docker/cache-administration.js.map +1 -0
- package/dist/docker/cache-live.cjs +27 -0
- package/dist/docker/cache-live.cjs.map +1 -0
- package/dist/docker/cache-live.d.cts +3 -0
- package/dist/docker/cache-live.d.mts +3 -0
- package/dist/docker/cache-live.d.ts +3 -0
- package/dist/docker/cache-live.js +6 -0
- package/dist/docker/cache-live.js.map +1 -0
- package/dist/docker/cli/contribution.cjs +223 -0
- package/dist/docker/cli/contribution.cjs.map +1 -0
- package/dist/docker/cli/contribution.d.cts +48 -0
- package/dist/docker/cli/contribution.d.mts +48 -0
- package/dist/docker/cli/contribution.d.ts +48 -0
- package/dist/docker/cli/contribution.js +8 -0
- package/dist/docker/cli/contribution.js.map +1 -0
- package/dist/eval/cli/contribution.cjs +62 -0
- package/dist/eval/cli/contribution.cjs.map +1 -0
- package/dist/eval/cli/contribution.d.cts +21 -0
- package/dist/eval/cli/contribution.d.mts +21 -0
- package/dist/eval/cli/contribution.d.ts +21 -0
- package/dist/eval/cli/contribution.js +8 -0
- package/dist/eval/cli/contribution.js.map +1 -0
- package/dist/eval/host/index.cjs +23 -0
- package/dist/eval/host/index.cjs.map +1 -0
- package/dist/eval/host/index.d.cts +27 -0
- package/dist/eval/host/index.d.mts +27 -0
- package/dist/eval/host/index.d.ts +27 -0
- package/dist/eval/host/index.js +8 -0
- package/dist/eval/host/index.js.map +1 -0
- package/dist/eval/host/index.mjs +8 -0
- package/dist/eval/host/index.mjs.map +1 -0
- package/dist/experiment/host/cli/contribution.cjs +835 -0
- package/dist/experiment/host/cli/contribution.cjs.map +1 -0
- package/dist/experiment/host/cli/contribution.d.cts +329 -0
- package/dist/experiment/host/cli/contribution.d.mts +329 -0
- package/dist/experiment/host/cli/contribution.d.ts +329 -0
- package/dist/experiment/host/cli/contribution.js +22 -0
- package/dist/experiment/host/cli/contribution.js.map +1 -0
- package/dist/experiment/host/cli/index.cjs +9 -0
- package/dist/experiment/host/cli/index.cjs.map +1 -0
- package/dist/experiment/host/cli/index.d.cts +2 -0
- package/dist/experiment/host/cli/index.d.mts +2 -0
- package/dist/experiment/host/cli/index.d.ts +2 -0
- package/dist/experiment/host/cli/index.js +10 -0
- package/dist/experiment/host/cli/index.js.map +1 -0
- package/dist/experiment/host/cli/terminal.cjs +15 -0
- package/dist/experiment/host/cli/terminal.cjs.map +1 -0
- package/dist/experiment/host/cli/terminal.d.cts +14 -0
- package/dist/experiment/host/cli/terminal.d.mts +14 -0
- package/dist/experiment/host/cli/terminal.d.ts +14 -0
- package/dist/experiment/host/cli/terminal.js +8 -0
- package/dist/experiment/host/cli/terminal.js.map +1 -0
- package/dist/experiment/host/index.cjs +35 -58
- package/dist/experiment/host/index.cjs.map +1 -1
- package/dist/experiment/host/index.d.cts +5 -79
- package/dist/experiment/host/index.d.mts +5 -79
- package/dist/experiment/host/index.d.ts +5 -79
- package/dist/experiment/host/index.js +4 -2
- package/dist/experiment/host/index.mjs +4 -2
- package/dist/experiment/host/operations.cjs +678 -0
- package/dist/experiment/host/operations.cjs.map +1 -0
- package/dist/experiment/host/operations.d.cts +19 -0
- package/dist/experiment/host/operations.d.mts +19 -0
- package/dist/experiment/host/operations.d.ts +19 -0
- package/dist/experiment/host/operations.js +24 -0
- package/dist/experiment/host/operations.js.map +1 -0
- package/dist/experiment/host/presentation.cjs +81 -0
- package/dist/experiment/host/presentation.cjs.map +1 -0
- package/dist/experiment/host/presentation.d.cts +9 -0
- package/dist/experiment/host/presentation.d.mts +9 -0
- package/dist/experiment/host/presentation.d.ts +9 -0
- package/dist/experiment/host/presentation.js +8 -0
- package/dist/experiment/host/presentation.js.map +1 -0
- package/dist/experiment/host/teardown.cjs +394 -0
- package/dist/experiment/host/teardown.cjs.map +1 -0
- package/dist/experiment/host/teardown.d.cts +5 -0
- package/dist/experiment/host/teardown.d.mts +5 -0
- package/dist/experiment/host/teardown.d.ts +5 -0
- package/dist/experiment/host/teardown.js +8 -0
- package/dist/experiment/host/teardown.js.map +1 -0
- package/dist/experiment/host/types.cjs +9 -0
- package/dist/experiment/host/types.cjs.map +1 -0
- package/dist/experiment/host/types.d.cts +423 -0
- package/dist/experiment/host/types.d.mts +423 -0
- package/dist/experiment/host/types.d.ts +423 -0
- package/dist/experiment/host/types.js +6 -0
- package/dist/experiment/host/types.js.map +1 -0
- package/dist/i18n/en.cjs +8 -50
- package/dist/i18n/en.cjs.map +1 -1
- package/dist/i18n/en.d.cts +2 -6
- package/dist/i18n/en.d.mts +2 -6
- package/dist/i18n/en.d.ts +2 -6
- package/dist/o11y/project.json +6 -0
- package/dist/project/cli/contribution.cjs +66 -0
- package/dist/project/cli/contribution.cjs.map +1 -0
- package/dist/project/cli/contribution.d.cts +17 -0
- package/dist/project/cli/contribution.d.mts +17 -0
- package/dist/project/cli/contribution.d.ts +17 -0
- package/dist/project/cli/contribution.js +8 -0
- package/dist/project/cli/contribution.js.map +1 -0
- package/dist/project/cli/index.cjs +7 -0
- package/dist/project/cli/index.cjs.map +1 -0
- package/dist/project/cli/index.d.cts +1 -0
- package/dist/project/cli/index.d.mts +1 -0
- package/dist/project/cli/index.d.ts +1 -0
- package/dist/project/cli/index.js +8 -0
- package/dist/project/cli/index.js.map +1 -0
- package/dist/project/host/index.cjs +11 -0
- package/dist/project/host/index.cjs.map +1 -0
- package/dist/project/host/index.d.cts +4 -0
- package/dist/project/host/index.d.mts +4 -0
- package/dist/project/host/index.d.ts +4 -0
- package/dist/project/host/index.js +14 -0
- package/dist/project/host/index.js.map +1 -0
- package/dist/project/host/index.mjs +14 -0
- package/dist/project/host/index.mjs.map +1 -0
- package/dist/project/host.cjs +59 -0
- package/dist/project/host.cjs.map +1 -0
- package/dist/project/host.d.cts +17 -0
- package/dist/project/host.d.mts +17 -0
- package/dist/project/host.d.ts +17 -0
- package/dist/project/host.js +6 -0
- package/dist/project/host.js.map +1 -0
- package/dist/project/index.cjs +11 -0
- package/dist/project/index.cjs.map +1 -0
- package/dist/project/index.d.cts +4 -0
- package/dist/project/index.d.mts +4 -0
- package/dist/project/index.d.ts +4 -0
- package/dist/project/index.js +14 -0
- package/dist/project/index.js.map +1 -0
- package/dist/project/node.cjs +91 -0
- package/dist/project/node.cjs.map +1 -0
- package/dist/project/node.d.cts +6 -0
- package/dist/project/node.d.mts +6 -0
- package/dist/project/node.d.ts +6 -0
- package/dist/project/node.js +12 -0
- package/dist/project/node.js.map +1 -0
- package/dist/project/services.cjs +17 -0
- package/dist/project/services.cjs.map +1 -0
- package/dist/project/services.d.cts +47 -0
- package/dist/project/services.d.mts +47 -0
- package/dist/project/services.d.ts +47 -0
- package/dist/project/services.js +12 -0
- package/dist/project/services.js.map +1 -0
- package/dist/project/templates.cjs +28 -0
- package/dist/project/templates.cjs.map +1 -0
- package/dist/project/templates.d.cts +4 -0
- package/dist/project/templates.d.mts +4 -0
- package/dist/project/templates.d.ts +4 -0
- package/dist/project/templates.js +12 -0
- package/dist/project/templates.js.map +1 -0
- package/dist/project.json +6 -0
- package/dist/record/family/catalog.d.cts +10 -10
- package/dist/record/family/catalog.d.mts +10 -10
- package/dist/record/family/catalog.d.ts +10 -10
- package/dist/record/family/file-changes.d.cts +8 -8
- package/dist/record/family/file-changes.d.mts +8 -8
- package/dist/record/family/file-changes.d.ts +8 -8
- package/dist/record/host/cli/contribution.cjs +206 -0
- package/dist/record/host/cli/contribution.cjs.map +1 -0
- package/dist/record/host/cli/contribution.d.cts +32 -0
- package/dist/record/host/cli/contribution.d.mts +32 -0
- package/dist/record/host/cli/contribution.d.ts +32 -0
- package/dist/record/host/cli/contribution.js +10 -0
- package/dist/record/host/cli/contribution.js.map +1 -0
- package/dist/record/host/cli/index.cjs +8 -0
- package/dist/record/host/cli/index.cjs.map +1 -0
- package/dist/record/host/cli/index.d.cts +1 -0
- package/dist/record/host/cli/index.d.mts +1 -0
- package/dist/record/host/cli/index.d.ts +1 -0
- package/dist/record/host/cli/index.js +10 -0
- package/dist/record/host/cli/index.js.map +1 -0
- package/dist/record/host/cli/presentation.cjs +122 -0
- package/dist/record/host/cli/presentation.cjs.map +1 -0
- package/dist/record/host/cli/presentation.d.cts +7 -0
- package/dist/record/host/cli/presentation.d.mts +7 -0
- package/dist/record/host/cli/presentation.d.ts +7 -0
- package/dist/record/host/cli/presentation.js +12 -0
- package/dist/record/host/cli/presentation.js.map +1 -0
- package/dist/record/host/index.cjs.map +1 -1
- package/dist/record/host/index.d.cts +1 -1
- package/dist/record/host/index.d.mts +1 -1
- package/dist/record/host/index.d.ts +1 -1
- package/dist/record/host/runtime.cjs +184 -1
- 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 +120 -0
- package/dist/record/host/types.d.mts +120 -0
- package/dist/record/host/types.d.ts +120 -0
- package/dist/record/project.json +6 -0
- package/dist/report/assets/styles.css +80 -0
- package/dist/report/cli/contribution.cjs +325 -0
- package/dist/report/cli/contribution.cjs.map +1 -0
- package/dist/report/cli/contribution.d.cts +143 -0
- package/dist/report/cli/contribution.d.mts +143 -0
- package/dist/report/cli/contribution.d.ts +143 -0
- package/dist/report/cli/contribution.js +12 -0
- package/dist/report/cli/contribution.js.map +1 -0
- package/dist/report/client-dist/app.js +9 -9
- package/dist/report/components/attempt-detail/content.cjs +1 -1
- package/dist/report/components/attempt-detail/content.cjs.map +1 -1
- package/dist/report/components/entity-lists/compute.cjs +5 -0
- package/dist/report/components/entity-lists/compute.cjs.map +1 -1
- package/dist/report/components/entity-lists/compute.d.cts +2 -0
- package/dist/report/components/entity-lists/compute.d.mts +2 -0
- package/dist/report/components/entity-lists/compute.d.ts +2 -0
- package/dist/report/components/entity-lists/content.cjs +35 -12
- package/dist/report/components/entity-lists/content.cjs.map +1 -1
- package/dist/report/components/entity-lists/index.cjs +0 -3
- package/dist/report/components/entity-lists/index.cjs.map +1 -1
- package/dist/report/components/summaries/index.cjs +2 -4
- package/dist/report/components/summaries/index.cjs.map +1 -1
- package/dist/report/definition/cell.cjs +7 -2
- package/dist/report/definition/cell.cjs.map +1 -1
- package/dist/report/definition/cell.d.cts +2 -0
- package/dist/report/definition/cell.d.mts +2 -0
- package/dist/report/definition/cell.d.ts +2 -0
- package/dist/report/definition/primitives/assertion-evidence.cjs +190 -4
- package/dist/report/definition/primitives/assertion-evidence.cjs.map +1 -1
- package/dist/report/definition/primitives/assertion-evidence.d.cts +4 -0
- package/dist/report/definition/primitives/assertion-evidence.d.mts +4 -0
- package/dist/report/definition/primitives/assertion-evidence.d.ts +4 -0
- package/dist/report/execution/machine.cjs +2 -3
- package/dist/report/execution/machine.cjs.map +1 -1
- package/dist/report/execution/machine.d.cts +11 -8
- package/dist/report/execution/machine.d.mts +11 -8
- package/dist/report/execution/machine.d.ts +11 -8
- package/dist/report/host/from-record.cjs +13 -8
- package/dist/report/host/from-record.cjs.map +1 -1
- package/dist/report/host/index.cjs +5 -1
- package/dist/report/host/index.cjs.map +1 -1
- package/dist/report/host/index.d.cts +1 -0
- package/dist/report/host/index.d.mts +1 -0
- package/dist/report/host/index.d.ts +1 -0
- package/dist/report/host/index.js +8 -2
- package/dist/report/host/index.mjs +8 -2
- package/dist/report/host/machine.cjs +23 -22
- package/dist/report/host/machine.cjs.map +1 -1
- package/dist/report/host/machine.d.cts +1 -1
- package/dist/report/host/machine.d.mts +1 -1
- package/dist/report/host/machine.d.ts +1 -1
- package/dist/report/host/node/loader.cjs +4 -2
- package/dist/report/host/node/loader.cjs.map +1 -1
- package/dist/report/host/node/loader.d.cts +3 -1
- package/dist/report/host/node/loader.d.mts +3 -1
- package/dist/report/host/node/loader.d.ts +3 -1
- package/dist/report/host/node.cjs +44 -9
- package/dist/report/host/node.cjs.map +1 -1
- package/dist/report/host/node.d.cts +13 -3
- package/dist/report/host/node.d.mts +13 -3
- package/dist/report/host/node.d.ts +13 -3
- package/dist/report/host/node.js +44 -32
- package/dist/report/host/operations.cjs +14 -0
- package/dist/report/host/operations.cjs.map +1 -0
- package/dist/report/host/operations.d.cts +39 -0
- package/dist/report/host/operations.d.mts +39 -0
- package/dist/report/host/operations.d.ts +39 -0
- package/dist/report/host/operations.js +10 -0
- package/dist/report/host/operations.js.map +1 -0
- package/dist/report/model/chart/plot.cjs +1 -1
- package/dist/report/model/chart/plot.cjs.map +1 -1
- package/dist/report/model/locale.cjs +4 -0
- package/dist/report/model/locale.cjs.map +1 -1
- package/dist/report/model/locale.d.cts +3 -1
- package/dist/report/model/locale.d.mts +3 -1
- package/dist/report/model/locale.d.ts +3 -1
- package/dist/report/react/styles.css +80 -0
- package/dist/runner/build-preparation.cjs +5 -5
- package/dist/runner/build-preparation.cjs.map +1 -1
- package/dist/runner/build-preparation.d.cts +2 -3
- package/dist/runner/build-preparation.d.mts +2 -3
- package/dist/runner/build-preparation.d.ts +2 -3
- package/dist/runner/feedback/coordinator.cjs +18 -15
- package/dist/runner/feedback/coordinator.cjs.map +1 -1
- package/dist/runner/feedback/coordinator.d.cts +6 -0
- package/dist/runner/feedback/coordinator.d.mts +6 -0
- package/dist/runner/feedback/coordinator.d.ts +6 -0
- package/dist/runner/ledger.cjs +3 -13
- package/dist/runner/ledger.cjs.map +1 -1
- package/dist/runner/ledger.d.cts +1 -3
- package/dist/runner/ledger.d.mts +1 -3
- package/dist/runner/ledger.d.ts +1 -3
- package/dist/runner/run.cjs +63 -18
- package/dist/runner/run.cjs.map +1 -1
- package/dist/runner/session.cjs +10 -0
- package/dist/runner/session.cjs.map +1 -1
- package/dist/runner/session.d.cts +25 -0
- package/dist/runner/session.d.mts +25 -0
- package/dist/runner/session.d.ts +25 -0
- package/dist/runner/types.cjs.map +1 -1
- package/dist/runner/types.d.cts +1 -2
- package/dist/runner/types.d.mts +1 -2
- package/dist/runner/types.d.ts +1 -2
- package/dist/sandbox/build-coordinator.cjs +38 -19
- package/dist/sandbox/build-coordinator.cjs.map +1 -1
- package/dist/sandbox/build-coordinator.d.cts +47 -7
- package/dist/sandbox/build-coordinator.d.mts +47 -7
- package/dist/sandbox/build-coordinator.d.ts +47 -7
- package/dist/sandbox/build-coordinator.js +8 -4
- package/dist/sandbox/cli/contribution.cjs +128 -0
- package/dist/sandbox/cli/contribution.cjs.map +1 -0
- package/dist/sandbox/cli/contribution.d.cts +71 -0
- package/dist/sandbox/cli/contribution.d.mts +71 -0
- package/dist/sandbox/cli/contribution.d.ts +71 -0
- package/dist/sandbox/cli/contribution.js +8 -0
- package/dist/sandbox/cli/contribution.js.map +1 -0
- package/dist/sandbox/cli-commands.cjs +14 -21
- package/dist/sandbox/cli-commands.cjs.map +1 -1
- package/dist/sandbox/cli-commands.d.cts +12 -8
- package/dist/sandbox/cli-commands.d.mts +12 -8
- package/dist/sandbox/cli-commands.d.ts +12 -8
- package/dist/sandbox/compose.cjs +22 -2
- package/dist/sandbox/compose.cjs.map +1 -1
- package/dist/sandbox/compose.d.cts +1 -1
- package/dist/sandbox/compose.d.mts +1 -1
- package/dist/sandbox/compose.d.ts +1 -1
- package/dist/sandbox/docker-profile/cli.cjs +13 -9
- package/dist/sandbox/docker-profile/cli.cjs.map +1 -1
- package/dist/sandbox/docker-profile/cli.d.cts +2 -0
- package/dist/sandbox/docker-profile/cli.d.mts +2 -0
- package/dist/sandbox/docker-profile/cli.d.ts +2 -0
- package/dist/sandbox/docker-profile/runtime.cjs +68 -7
- package/dist/sandbox/docker-profile/runtime.cjs.map +1 -1
- package/dist/sandbox/docker-profile/runtime.d.cts +19 -1
- package/dist/sandbox/docker-profile/runtime.d.mts +19 -1
- package/dist/sandbox/docker-profile/runtime.d.ts +19 -1
- package/dist/sandbox/docker-profile/runtime.js +10 -8
- package/dist/sandbox/docker-profile/schema.cjs +68 -19
- package/dist/sandbox/docker-profile/schema.cjs.map +1 -1
- package/dist/sandbox/docker-profile/schema.d.cts +23 -9
- package/dist/sandbox/docker-profile/schema.d.mts +23 -9
- package/dist/sandbox/docker-profile/schema.d.ts +23 -9
- package/dist/sandbox/docker-task-build-cache.cjs +532 -0
- package/dist/sandbox/docker-task-build-cache.cjs.map +1 -0
- package/dist/sandbox/docker-task-build-cache.d.cts +68 -0
- package/dist/sandbox/docker-task-build-cache.d.mts +68 -0
- package/dist/sandbox/docker-task-build-cache.d.ts +68 -0
- package/dist/sandbox/docker-task-build-cache.js +20 -0
- package/dist/sandbox/docker-task-build-cache.js.map +1 -0
- package/dist/sandbox/docker.cjs +50 -0
- package/dist/sandbox/docker.cjs.map +1 -1
- package/dist/sandbox/docker.d.cts +15 -0
- package/dist/sandbox/docker.d.mts +15 -0
- package/dist/sandbox/docker.d.ts +15 -0
- package/dist/sandbox/dockerfile-build.cjs +55 -5
- package/dist/sandbox/dockerfile-build.cjs.map +1 -1
- package/dist/sandbox/dockerfile-build.d.cts +2 -2
- package/dist/sandbox/dockerfile-build.d.mts +2 -2
- package/dist/sandbox/dockerfile-build.d.ts +2 -2
- package/dist/sandbox/index.cjs +5 -3
- package/dist/sandbox/index.cjs.map +1 -1
- package/dist/sandbox/index.d.cts +4 -3
- package/dist/sandbox/index.d.mts +4 -3
- package/dist/sandbox/index.d.ts +4 -3
- package/dist/sandbox/index.js +16 -14
- package/dist/sandbox/index.mjs +16 -14
- package/dist/sandbox/keep.cjs +1 -3
- package/dist/sandbox/keep.cjs.map +1 -1
- package/dist/sandbox/layer.cjs +70 -79
- package/dist/sandbox/layer.cjs.map +1 -1
- package/dist/sandbox/layer.d.cts +6 -12
- package/dist/sandbox/layer.d.mts +6 -12
- package/dist/sandbox/layer.d.ts +6 -12
- package/dist/sandbox/layer.js +16 -18
- package/dist/sandbox/ledger-paths.cjs +4 -18
- package/dist/sandbox/ledger-paths.cjs.map +1 -1
- package/dist/sandbox/ledger-paths.d.cts +3 -13
- package/dist/sandbox/ledger-paths.d.mts +3 -13
- package/dist/sandbox/ledger-paths.d.ts +3 -13
- package/dist/sandbox/ledger-paths.js +4 -8
- package/dist/sandbox/registry.cjs +1 -1
- package/dist/sandbox/registry.cjs.map +1 -1
- package/dist/sandbox/runtime.cjs +27 -37
- package/dist/sandbox/runtime.cjs.map +1 -1
- package/dist/sandbox/runtime.d.cts +1 -2
- package/dist/sandbox/runtime.d.mts +1 -2
- package/dist/sandbox/runtime.d.ts +1 -2
- package/dist/sandbox/runtime.js +6 -8
- package/dist/sandbox/types.cjs.map +1 -1
- package/dist/sandbox/types.d.cts +3 -3
- package/dist/sandbox/types.d.mts +3 -3
- package/dist/sandbox/types.d.ts +3 -3
- package/dist/sources/project.json +6 -0
- package/dist/vendor/remark/remark-gfm.cjs +72 -72
- package/dist/vendor/remark/remark-gfm.cjs.map +1 -1
- package/dist/vendor/remark/remark-parse.cjs +54 -54
- package/dist/vendor/remark/remark-parse.cjs.map +1 -1
- package/dist/vendor/remark/remark.cjs +125 -125
- package/dist/vendor/remark/remark.cjs.map +2 -2
- package/docs-site/zh/README.md +1 -1
- package/docs-site/zh/explanation/assert.mdx +4 -0
- package/docs-site/zh/explanation/judge.mdx +40 -9
- package/docs-site/zh/reference/cli.mdx +67 -43
- package/docs-site/zh/reference/define-agent.mdx +2 -2
- package/docs-site/zh/reference/report-components.mdx +4 -3
- package/docs-site/zh/troubleshooting/debug-sandbox.mdx +6 -0
- package/docs-site/zh/troubleshooting/debugging.mdx +28 -1
- package/docs-site/zh/tutorials/agent-feedback-loop.mdx +4 -2
- package/docs-site/zh/tutorials/concurrency.mdx +2 -2
- package/docs-site/zh/tutorials/custom-reports.mdx +175 -9
- package/docs-site/zh/tutorials/docker-in-docker.mdx +52 -7
- package/docs-site/zh/tutorials/eval-groups.mdx +1 -2
- package/docs-site/zh/tutorials/evaluation-kinds.mdx +39 -6
- package/docs-site/zh/tutorials/nixos-managed-dind.mdx +14 -5
- package/docs-site/zh/tutorials/sandbox-providers.mdx +1 -28
- package/docs-site/zh/tutorials/sandbox-reuse.mdx +1 -1
- package/docs-site/zh/tutorials/viewing-results.mdx +2 -0
- package/package.json +24 -19
- package/README.md +0 -176
- package/README.zh.md +0 -176
- package/dist/cli/record.cjs +0 -246
- package/dist/cli/record.cjs.map +0 -1
- package/dist/cli/record.d.cts +0 -40
- package/dist/cli/record.d.mts +0 -40
- package/dist/cli/record.d.ts +0 -40
- package/dist/cli/record.js +0 -10
- package/dist/cli/record.js.map +0 -1
- package/dist/sandbox/local.cjs +0 -361
- package/dist/sandbox/local.cjs.map +0 -1
- package/dist/sandbox/local.d.cts +0 -80
- package/dist/sandbox/local.d.mts +0 -80
- package/dist/sandbox/local.d.ts +0 -80
- package/dist/sandbox/local.js +0 -6
- package/dist/sandbox/local.js.map +0 -1
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, type Scope } from "effect";
|
|
2
2
|
import type { JsonValue } from "../shared/types.cjs";
|
|
3
3
|
import { type LeakGateHints } from "../runner/leak-gate.cjs";
|
|
4
|
-
import type
|
|
4
|
+
import { type SandboxBuildExecutionContext, type SandboxBuildProvider, type SandboxBuildWork } from "./build-coordinator.cjs";
|
|
5
5
|
import type { MaterializedSandboxCase, SandboxMaterializeContext } from "./case-types.cjs";
|
|
6
6
|
import { type BuildKey } from "./identity.cjs";
|
|
7
7
|
import { type RunIdentity } from "./run-identity.cjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, type Scope } from "effect";
|
|
2
2
|
import type { JsonValue } from "../shared/types.mjs";
|
|
3
3
|
import { type LeakGateHints } from "../runner/leak-gate.mjs";
|
|
4
|
-
import type
|
|
4
|
+
import { type SandboxBuildExecutionContext, type SandboxBuildProvider, type SandboxBuildWork } from "./build-coordinator.mjs";
|
|
5
5
|
import type { MaterializedSandboxCase, SandboxMaterializeContext } from "./case-types.mjs";
|
|
6
6
|
import { type BuildKey } from "./identity.mjs";
|
|
7
7
|
import { type RunIdentity } from "./run-identity.mjs";
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Effect, type Scope } from "effect";
|
|
2
2
|
import type { JsonValue } from "../shared/types.js";
|
|
3
3
|
import { type LeakGateHints } from "../runner/leak-gate.js";
|
|
4
|
-
import type
|
|
4
|
+
import { type SandboxBuildExecutionContext, type SandboxBuildProvider, type SandboxBuildWork } from "./build-coordinator.js";
|
|
5
5
|
import type { MaterializedSandboxCase, SandboxMaterializeContext } from "./case-types.js";
|
|
6
6
|
import { type BuildKey } from "./identity.js";
|
|
7
7
|
import { type RunIdentity } from "./run-identity.js";
|
|
@@ -88,7 +88,9 @@ async function smokeProfile(alias) {
|
|
|
88
88
|
MemorySwap: 512 * 1024 * 1024,
|
|
89
89
|
PidsLimit: 256,
|
|
90
90
|
ReadonlyRootfs: true,
|
|
91
|
-
|
|
91
|
+
...(binding.profile.policy.level === "managed-rootless/v1"
|
|
92
|
+
? { Dns: [...binding.profile.policy.network.dns.servers] }
|
|
93
|
+
: {}),
|
|
92
94
|
Tmpfs: {
|
|
93
95
|
"/var/lib/docker": "rw,exec,nosuid,nodev,size=256m",
|
|
94
96
|
"/run": "rw,exec,nosuid,nodev,size=64m",
|
|
@@ -139,7 +141,7 @@ async function smokeProfile(alias) {
|
|
|
139
141
|
}
|
|
140
142
|
async function runDockerProfileCommand(positionals, options) {
|
|
141
143
|
if (positionals[0] !== "profile") {
|
|
142
|
-
|
|
144
|
+
options.err("Usage: niceeval docker profile list [--json]\n" +
|
|
143
145
|
" niceeval docker profile doctor <alias> [--smoke] [--json]\n");
|
|
144
146
|
return 1;
|
|
145
147
|
}
|
|
@@ -156,14 +158,14 @@ async function runDockerProfileCommand(positionals, options) {
|
|
|
156
158
|
health: "descriptor-valid",
|
|
157
159
|
}));
|
|
158
160
|
if (options.json)
|
|
159
|
-
|
|
161
|
+
options.out(`${JSON.stringify({ format: "niceeval.docker-profiles", schemaVersion: 1, profiles: rows })}\n`);
|
|
160
162
|
else
|
|
161
163
|
for (const row of rows)
|
|
162
|
-
|
|
164
|
+
options.out(`${row.alias}\t${row.profileId.slice(0, 12)}\t${row.securityLevel}\tpolicy ${row.semanticPolicyRevision.slice(0, 12)}\t${row.health}\n`);
|
|
163
165
|
return 0;
|
|
164
166
|
}
|
|
165
167
|
catch (error) {
|
|
166
|
-
|
|
168
|
+
options.err(`${error instanceof Error ? error.message : String(error)}\n`);
|
|
167
169
|
return 1;
|
|
168
170
|
}
|
|
169
171
|
}
|
|
@@ -172,7 +174,9 @@ async function runDockerProfileCommand(positionals, options) {
|
|
|
172
174
|
const checks = [];
|
|
173
175
|
try {
|
|
174
176
|
const binding = await (0, runtime_ts_1.attestDockerProfile)(alias);
|
|
175
|
-
checks.push({ name: "descriptor and registry", status: "PASS", detail: binding.descriptorDigest }, { name: "Docker/control attestation", status: "PASS", detail: `generation ${binding.daemonGeneration}` }, { name: "
|
|
177
|
+
checks.push({ name: "descriptor and registry", status: "PASS", detail: binding.descriptorDigest }, { name: "Docker/control attestation", status: "PASS", detail: `generation ${binding.daemonGeneration}` }, { name: "cgroup backend", status: "PASS", detail: `${binding.platform} · ${binding.profile.backend.cgroup.aggregatePath}` }, binding.profile.policy.level === "managed-rootless/v1"
|
|
178
|
+
? { name: "network policy", status: "PASS", detail: `v${binding.profile.policy.network.version} · IPv6 disabled · pinned DNS` }
|
|
179
|
+
: { name: "raw storage policy", status: "PASS", detail: "project-quota Docker data allocation; no rootless/network claim" });
|
|
176
180
|
if (options.smoke)
|
|
177
181
|
checks.push(...await smokeProfile(alias));
|
|
178
182
|
}
|
|
@@ -180,13 +184,13 @@ async function runDockerProfileCommand(positionals, options) {
|
|
|
180
184
|
checks.push({ name: "profile", status: "FAIL", detail: error instanceof Error ? error.message : String(error) });
|
|
181
185
|
}
|
|
182
186
|
if (options.json)
|
|
183
|
-
|
|
187
|
+
options.out(`${JSON.stringify({ format: "niceeval.docker-profile-doctor", schemaVersion: 1, alias, checks })}\n`);
|
|
184
188
|
else
|
|
185
189
|
for (const check of checks)
|
|
186
|
-
|
|
190
|
+
options.out(`${check.status} ${check.name} ${check.detail}\n`);
|
|
187
191
|
return checks.some((check) => check.status === "FAIL") ? 1 : 0;
|
|
188
192
|
}
|
|
189
|
-
|
|
193
|
+
options.err("Usage: niceeval docker profile list [--json]\n" +
|
|
190
194
|
" niceeval docker profile doctor <alias> [--smoke] [--json]\n");
|
|
191
195
|
return 1;
|
|
192
196
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type Docker from \"dockerode\";\nimport { acquireDockerProfileReservation, attestDockerProfile, commitDockerProfileReservation, createDockerProfileLease, loadDockerProfileRegistry, releaseDockerProfileReservation, } from \"./runtime.ts\";\nexport interface DockerProfileCliOptions {\n readonly json: boolean;\n readonly smoke: boolean;\n}\ninterface Check {\n readonly name: string;\n readonly status: \"PASS\" | \"FAIL\";\n readonly detail: string;\n}\n/** Keep Docker's official entrypoint, but bypass its automatic TCP/TLS selection. */\nexport const DOCKER_PROFILE_DOCTOR_DIND_CMD = Object.freeze([\n \"dockerd\",\n \"--host=unix:///var/run/docker.sock\",\n \"--shutdown-timeout=2\",\n] as const);\n/** `/proc/net/tcp{,6}` exposes listening sockets without requiring an extra image tool. */\nexport const DOCKER_PROFILE_DOCTOR_UNIX_ONLY_CHECK = Object.freeze([\n \"sh\",\n \"-ec\",\n [\n \"for table in /proc/net/tcp /proc/net/tcp6; do\",\n \" [ -r \\\"$table\\\" ] || continue\",\n \" awk '$4 == \\\"0A\\\" && ($2 ~ /:0947$/ || $2 ~ /:0948$/) { found = 1 } END { exit found ? 1 : 0 }' \\\"$table\\\"\",\n \"done\",\n ].join(\"\\n\"),\n] as const satisfies readonly [\n string,\n ...string[]\n]);\nexport function dockerProfileDoctorDindConfig(): {\n Cmd: string[];\n} {\n return Object.freeze({ Cmd: [...DOCKER_PROFILE_DOCTOR_DIND_CMD] });\n}\nasync function pull(docker: Docker, image: string): Promise<void> {\n try {\n await docker.getImage(image).inspect();\n return;\n }\n catch { }\n const stream = await docker.pull(image);\n await new Promise<void>((resolve, reject) => docker.modem.followProgress(stream, (error) => error ? reject(error) : resolve()));\n}\nasync function exec(container: Docker.Container, command: readonly string[]): Promise<{\n code: number;\n output: string;\n}> {\n const process = await container.exec({ Cmd: [...command], AttachStdout: true, AttachStderr: true });\n const stream = await process.start({});\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n stream.on(\"end\", resolve);\n stream.on(\"error\", reject);\n });\n const inspected = await process.inspect();\n return { code: inspected.ExitCode ?? 1, output: Buffer.concat(chunks).toString().replace(/[\\x00-\\x08]/g, \"\") };\n}\nasync function smokeProfile(alias: string): Promise<Check[]> {\n const binding = await attestDockerProfile(alias);\n const lease = await createDockerProfileLease(binding);\n const reservation = await acquireDockerProfileReservation(lease, \"container\", {\n cpus: 2,\n memoryBytes: 512 * 1024 * 1024,\n pids: 256,\n containers: 1,\n });\n const labels = {\n \"niceeval.profile-id\": binding.profile.profileId,\n \"niceeval.invocation-id\": lease.invocationId,\n \"niceeval.reservation-id\": reservation.reservationId,\n \"niceeval.provision-token\": reservation.provisionToken,\n \"niceeval.attempt-id\": \"doctor-smoke\",\n };\n // doctor 的非 smoke 路径也不应要求安装 optional dockerode peer。\n const { default: DockerClient } = await __niceevalDynamicImport(\"dockerode\");\n const docker = new DockerClient({ socketPath: binding.dockerSocketPath });\n let container: Docker.Container | undefined;\n let network: Docker.Network | undefined;\n try {\n await pull(docker, \"docker:29-dind\");\n network = await docker.createNetwork({\n Name: `niceeval-doctor-${randomUUID()}`,\n Driver: \"bridge\",\n Options: { \"com.docker.network.bridge.enable_icc\": \"false\" },\n Labels: labels,\n });\n container = await docker.createContainer({\n Image: \"docker:29-dind\",\n ...dockerProfileDoctorDindConfig(),\n Labels: labels,\n HostConfig: {\n Privileged: true,\n NetworkMode: network.id,\n NanoCpus: 2000000000,\n Memory: 512 * 1024 * 1024,\n MemorySwap: 512 * 1024 * 1024,\n PidsLimit: 256,\n ReadonlyRootfs: true,\n Dns: [...binding.profile.policy.network.dns.servers],\n Tmpfs: {\n \"/var/lib/docker\": \"rw,exec,nosuid,nodev,size=256m\",\n \"/run\": \"rw,exec,nosuid,nodev,size=64m\",\n \"/tmp\": \"rw,nosuid,nodev,size=64m,mode=1777\",\n },\n },\n });\n await commitDockerProfileReservation(lease, reservation.reservationId, {\n containerId: container.id,\n networkId: network.id,\n attemptId: \"doctor-smoke\",\n });\n await container.start();\n let ready = false;\n for (let attempt = 0; attempt < 120; attempt += 1) {\n const result = await exec(container, [\"docker\", \"info\"]);\n if (result.code === 0) {\n ready = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n if (!ready)\n throw new Error(\"inner dockerd did not become ready within 30 seconds\");\n const unixOnly = await exec(container, [...DOCKER_PROFILE_DOCTOR_UNIX_ONLY_CHECK]);\n if (unixOnly.code !== 0) {\n throw new Error(`inner dockerd unexpectedly listens on TCP 2375 or 2376: ${unixOnly.output}`);\n }\n const limits = await exec(container, [\"sh\", \"-c\", \"cat /sys/fs/cgroup/cpu.max /sys/fs/cgroup/memory.max /sys/fs/cgroup/memory.swap.max /sys/fs/cgroup/pids.max\"]);\n if (limits.code !== 0)\n throw new Error(`cgroup probe failed: ${limits.output}`);\n const nested = await exec(container, [\"docker\", \"run\", \"--rm\", \"alpine:3.20\", \"true\"]);\n if (nested.code !== 0)\n throw new Error(`nested Docker failed: ${nested.output}`);\n return [\n { name: \"Unix-only Docker endpoint\", status: \"PASS\", detail: \"no TCP listener on 2375 or 2376\" },\n { name: \"outer hard limits\", status: \"PASS\", detail: limits.output.trim().replace(/\\n/g, \" · \") },\n { name: \"nested Docker\", status: \"PASS\", detail: \"docker:29-dind ran alpine:3.20\" },\n ];\n }\n finally {\n await releaseDockerProfileReservation(lease, reservation.reservationId).catch(async () => {\n await container?.remove({ force: true }).catch(() => undefined);\n await network?.remove().catch(() => undefined);\n });\n await lease.stopHeartbeat().catch(() => undefined);\n }\n}\nexport async function runDockerProfileCommand(positionals: readonly string[], options: DockerProfileCliOptions): Promise<number> {\n if (positionals[0] !== \"profile\") {\n process.stderr.write(\"Usage: niceeval docker profile list [--json]\\n\" +\n \" niceeval docker profile doctor <alias> [--smoke] [--json]\\n\");\n return 1;\n }\n const subcommand = positionals[1];\n if (subcommand === \"list\" && positionals.length === 2 && !options.smoke) {\n try {\n const registry = await loadDockerProfileRegistry();\n const rows = registry.entries.map((entry) => ({\n alias: entry.alias,\n profileId: entry.profileId,\n securityLevel: entry.profile.securityLevel,\n semanticPolicyRevision: entry.profile.semanticPolicyRevision,\n endpointKind: entry.profile.transport.kind,\n health: \"descriptor-valid\",\n }));\n if (options.json)\n process.stdout.write(`${JSON.stringify({ format: \"niceeval.docker-profiles\", schemaVersion: 1, profiles: rows })}\\n`);\n else\n for (const row of rows)\n process.stdout.write(`${row.alias}\\t${row.profileId.slice(0, 12)}\\t${row.securityLevel}\\tpolicy ${row.semanticPolicyRevision.slice(0, 12)}\\t${row.health}\\n`);\n return 0;\n }\n catch (error) {\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`);\n return 1;\n }\n }\n if (subcommand === \"doctor\" && positionals.length === 3) {\n const alias = positionals[2]!;\n const checks: Check[] = [];\n try {\n const binding = await attestDockerProfile(alias);\n checks.push({ name: \"descriptor and registry\", status: \"PASS\", detail: binding.descriptorDigest }, { name: \"Docker/control attestation\", status: \"PASS\", detail: `generation ${binding.daemonGeneration}` }, { name: \"rootless cgroup backend\", status: \"PASS\", detail: `${binding.platform} · ${binding.profile.backend.cgroup.aggregatePath}` }, { name: \"network policy\", status: \"PASS\", detail: `v${binding.profile.policy.network.version} · IPv6 disabled · pinned DNS` });\n if (options.smoke)\n checks.push(...await smokeProfile(alias));\n }\n catch (error) {\n checks.push({ name: \"profile\", status: \"FAIL\", detail: error instanceof Error ? error.message : String(error) });\n }\n if (options.json)\n process.stdout.write(`${JSON.stringify({ format: \"niceeval.docker-profile-doctor\", schemaVersion: 1, alias, checks })}\\n`);\n else\n for (const check of checks)\n process.stdout.write(`${check.status} ${check.name} ${check.detail}\\n`);\n return checks.some((check) => check.status === \"FAIL\") ? 1 : 0;\n }\n process.stderr.write(\"Usage: niceeval docker profile list [--json]\\n\" +\n \" niceeval docker profile doctor <alias> [--smoke] [--json]\\n\");\n return 1;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["cli.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport type Docker from \"dockerode\";\nimport { acquireDockerProfileReservation, attestDockerProfile, commitDockerProfileReservation, createDockerProfileLease, loadDockerProfileRegistry, releaseDockerProfileReservation, } from \"./runtime.ts\";\nexport interface DockerProfileCliOptions {\n readonly json: boolean;\n readonly smoke: boolean;\n readonly out: (text: string) => void;\n readonly err: (text: string) => void;\n}\ninterface Check {\n readonly name: string;\n readonly status: \"PASS\" | \"FAIL\";\n readonly detail: string;\n}\n/** Keep Docker's official entrypoint, but bypass its automatic TCP/TLS selection. */\nexport const DOCKER_PROFILE_DOCTOR_DIND_CMD = Object.freeze([\n \"dockerd\",\n \"--host=unix:///var/run/docker.sock\",\n \"--shutdown-timeout=2\",\n] as const);\n/** `/proc/net/tcp{,6}` exposes listening sockets without requiring an extra image tool. */\nexport const DOCKER_PROFILE_DOCTOR_UNIX_ONLY_CHECK = Object.freeze([\n \"sh\",\n \"-ec\",\n [\n \"for table in /proc/net/tcp /proc/net/tcp6; do\",\n \" [ -r \\\"$table\\\" ] || continue\",\n \" awk '$4 == \\\"0A\\\" && ($2 ~ /:0947$/ || $2 ~ /:0948$/) { found = 1 } END { exit found ? 1 : 0 }' \\\"$table\\\"\",\n \"done\",\n ].join(\"\\n\"),\n] as const satisfies readonly [\n string,\n ...string[]\n]);\nexport function dockerProfileDoctorDindConfig(): {\n Cmd: string[];\n} {\n return Object.freeze({ Cmd: [...DOCKER_PROFILE_DOCTOR_DIND_CMD] });\n}\nasync function pull(docker: Docker, image: string): Promise<void> {\n try {\n await docker.getImage(image).inspect();\n return;\n }\n catch { }\n const stream = await docker.pull(image);\n await new Promise<void>((resolve, reject) => docker.modem.followProgress(stream, (error) => error ? reject(error) : resolve()));\n}\nasync function exec(container: Docker.Container, command: readonly string[]): Promise<{\n code: number;\n output: string;\n}> {\n const process = await container.exec({ Cmd: [...command], AttachStdout: true, AttachStderr: true });\n const stream = await process.start({});\n const chunks: Buffer[] = [];\n await new Promise<void>((resolve, reject) => {\n stream.on(\"data\", (chunk: Buffer) => chunks.push(chunk));\n stream.on(\"end\", resolve);\n stream.on(\"error\", reject);\n });\n const inspected = await process.inspect();\n return { code: inspected.ExitCode ?? 1, output: Buffer.concat(chunks).toString().replace(/[\\x00-\\x08]/g, \"\") };\n}\nasync function smokeProfile(alias: string): Promise<Check[]> {\n const binding = await attestDockerProfile(alias);\n const lease = await createDockerProfileLease(binding);\n const reservation = await acquireDockerProfileReservation(lease, \"container\", {\n cpus: 2,\n memoryBytes: 512 * 1024 * 1024,\n pids: 256,\n containers: 1,\n });\n const labels = {\n \"niceeval.profile-id\": binding.profile.profileId,\n \"niceeval.invocation-id\": lease.invocationId,\n \"niceeval.reservation-id\": reservation.reservationId,\n \"niceeval.provision-token\": reservation.provisionToken,\n \"niceeval.attempt-id\": \"doctor-smoke\",\n };\n // doctor 的非 smoke 路径也不应要求安装 optional dockerode peer。\n const { default: DockerClient } = await __niceevalDynamicImport(\"dockerode\");\n const docker = new DockerClient({ socketPath: binding.dockerSocketPath });\n let container: Docker.Container | undefined;\n let network: Docker.Network | undefined;\n try {\n await pull(docker, \"docker:29-dind\");\n network = await docker.createNetwork({\n Name: `niceeval-doctor-${randomUUID()}`,\n Driver: \"bridge\",\n Options: { \"com.docker.network.bridge.enable_icc\": \"false\" },\n Labels: labels,\n });\n container = await docker.createContainer({\n Image: \"docker:29-dind\",\n ...dockerProfileDoctorDindConfig(),\n Labels: labels,\n HostConfig: {\n Privileged: true,\n NetworkMode: network.id,\n NanoCpus: 2000000000,\n Memory: 512 * 1024 * 1024,\n MemorySwap: 512 * 1024 * 1024,\n PidsLimit: 256,\n ReadonlyRootfs: true,\n ...(binding.profile.policy.level === \"managed-rootless/v1\"\n ? { Dns: [...binding.profile.policy.network.dns.servers] }\n : {}),\n Tmpfs: {\n \"/var/lib/docker\": \"rw,exec,nosuid,nodev,size=256m\",\n \"/run\": \"rw,exec,nosuid,nodev,size=64m\",\n \"/tmp\": \"rw,nosuid,nodev,size=64m,mode=1777\",\n },\n },\n });\n await commitDockerProfileReservation(lease, reservation.reservationId, {\n containerId: container.id,\n networkId: network.id,\n attemptId: \"doctor-smoke\",\n });\n await container.start();\n let ready = false;\n for (let attempt = 0; attempt < 120; attempt += 1) {\n const result = await exec(container, [\"docker\", \"info\"]);\n if (result.code === 0) {\n ready = true;\n break;\n }\n await new Promise((resolve) => setTimeout(resolve, 250));\n }\n if (!ready)\n throw new Error(\"inner dockerd did not become ready within 30 seconds\");\n const unixOnly = await exec(container, [...DOCKER_PROFILE_DOCTOR_UNIX_ONLY_CHECK]);\n if (unixOnly.code !== 0) {\n throw new Error(`inner dockerd unexpectedly listens on TCP 2375 or 2376: ${unixOnly.output}`);\n }\n const limits = await exec(container, [\"sh\", \"-c\", \"cat /sys/fs/cgroup/cpu.max /sys/fs/cgroup/memory.max /sys/fs/cgroup/memory.swap.max /sys/fs/cgroup/pids.max\"]);\n if (limits.code !== 0)\n throw new Error(`cgroup probe failed: ${limits.output}`);\n const nested = await exec(container, [\"docker\", \"run\", \"--rm\", \"alpine:3.20\", \"true\"]);\n if (nested.code !== 0)\n throw new Error(`nested Docker failed: ${nested.output}`);\n return [\n { name: \"Unix-only Docker endpoint\", status: \"PASS\", detail: \"no TCP listener on 2375 or 2376\" },\n { name: \"outer hard limits\", status: \"PASS\", detail: limits.output.trim().replace(/\\n/g, \" · \") },\n { name: \"nested Docker\", status: \"PASS\", detail: \"docker:29-dind ran alpine:3.20\" },\n ];\n }\n finally {\n await releaseDockerProfileReservation(lease, reservation.reservationId).catch(async () => {\n await container?.remove({ force: true }).catch(() => undefined);\n await network?.remove().catch(() => undefined);\n });\n await lease.stopHeartbeat().catch(() => undefined);\n }\n}\nexport async function runDockerProfileCommand(positionals: readonly string[], options: DockerProfileCliOptions): Promise<number> {\n if (positionals[0] !== \"profile\") {\n options.err(\"Usage: niceeval docker profile list [--json]\\n\" +\n \" niceeval docker profile doctor <alias> [--smoke] [--json]\\n\");\n return 1;\n }\n const subcommand = positionals[1];\n if (subcommand === \"list\" && positionals.length === 2 && !options.smoke) {\n try {\n const registry = await loadDockerProfileRegistry();\n const rows = registry.entries.map((entry) => ({\n alias: entry.alias,\n profileId: entry.profileId,\n securityLevel: entry.profile.securityLevel,\n semanticPolicyRevision: entry.profile.semanticPolicyRevision,\n endpointKind: entry.profile.transport.kind,\n health: \"descriptor-valid\",\n }));\n if (options.json)\n options.out(`${JSON.stringify({ format: \"niceeval.docker-profiles\", schemaVersion: 1, profiles: rows })}\\n`);\n else\n for (const row of rows)\n options.out(`${row.alias}\\t${row.profileId.slice(0, 12)}\\t${row.securityLevel}\\tpolicy ${row.semanticPolicyRevision.slice(0, 12)}\\t${row.health}\\n`);\n return 0;\n }\n catch (error) {\n options.err(`${error instanceof Error ? error.message : String(error)}\\n`);\n return 1;\n }\n }\n if (subcommand === \"doctor\" && positionals.length === 3) {\n const alias = positionals[2]!;\n const checks: Check[] = [];\n try {\n const binding = await attestDockerProfile(alias);\n checks.push({ name: \"descriptor and registry\", status: \"PASS\", detail: binding.descriptorDigest }, { name: \"Docker/control attestation\", status: \"PASS\", detail: `generation ${binding.daemonGeneration}` }, { name: \"cgroup backend\", status: \"PASS\", detail: `${binding.platform} · ${binding.profile.backend.cgroup.aggregatePath}` }, binding.profile.policy.level === \"managed-rootless/v1\"\n ? { name: \"network policy\", status: \"PASS\", detail: `v${binding.profile.policy.network.version} · IPv6 disabled · pinned DNS` }\n : { name: \"raw storage policy\", status: \"PASS\", detail: \"project-quota Docker data allocation; no rootless/network claim\" });\n if (options.smoke)\n checks.push(...await smokeProfile(alias));\n }\n catch (error) {\n checks.push({ name: \"profile\", status: \"FAIL\", detail: error instanceof Error ? error.message : String(error) });\n }\n if (options.json)\n options.out(`${JSON.stringify({ format: \"niceeval.docker-profile-doctor\", schemaVersion: 1, alias, checks })}\\n`);\n else\n for (const check of checks)\n options.out(`${check.status} ${check.name} ${check.detail}\\n`);\n return checks.some((check) => check.status === \"FAIL\") ? 1 : 0;\n }\n options.err(\"Usage: niceeval docker profile list [--json]\\n\" +\n \" niceeval docker profile doctor <alias> [--smoke] [--json]\\n\");\n return 1;\n}\n"]}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export interface DockerProfileCliOptions {
|
|
2
2
|
readonly json: boolean;
|
|
3
3
|
readonly smoke: boolean;
|
|
4
|
+
readonly out: (text: string) => void;
|
|
5
|
+
readonly err: (text: string) => void;
|
|
4
6
|
}
|
|
5
7
|
/** Keep Docker's official entrypoint, but bypass its automatic TCP/TLS selection. */
|
|
6
8
|
export declare const DOCKER_PROFILE_DOCTOR_DIND_CMD: readonly ["dockerd", "--host=unix:///var/run/docker.sock", "--shutdown-timeout=2"];
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export interface DockerProfileCliOptions {
|
|
2
2
|
readonly json: boolean;
|
|
3
3
|
readonly smoke: boolean;
|
|
4
|
+
readonly out: (text: string) => void;
|
|
5
|
+
readonly err: (text: string) => void;
|
|
4
6
|
}
|
|
5
7
|
/** Keep Docker's official entrypoint, but bypass its automatic TCP/TLS selection. */
|
|
6
8
|
export declare const DOCKER_PROFILE_DOCTOR_DIND_CMD: readonly ["dockerd", "--host=unix:///var/run/docker.sock", "--shutdown-timeout=2"];
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
export interface DockerProfileCliOptions {
|
|
2
2
|
readonly json: boolean;
|
|
3
3
|
readonly smoke: boolean;
|
|
4
|
+
readonly out: (text: string) => void;
|
|
5
|
+
readonly err: (text: string) => void;
|
|
4
6
|
}
|
|
5
7
|
/** Keep Docker's official entrypoint, but bypass its automatic TCP/TLS selection. */
|
|
6
8
|
export declare const DOCKER_PROFILE_DOCTOR_DIND_CMD: readonly ["dockerd", "--host=unix:///var/run/docker.sock", "--shutdown-timeout=2"];
|
|
@@ -8,6 +8,7 @@ exports.attestDockerProfile = attestDockerProfile;
|
|
|
8
8
|
exports.createDockerProfileLease = createDockerProfileLease;
|
|
9
9
|
exports.acquireDockerProfileReservation = acquireDockerProfileReservation;
|
|
10
10
|
exports.commitDockerProfileReservation = commitDockerProfileReservation;
|
|
11
|
+
exports.createDockerProfileContainer = createDockerProfileContainer;
|
|
11
12
|
exports.releaseDockerProfileReservation = releaseDockerProfileReservation;
|
|
12
13
|
const node_crypto_1 = require("node:crypto");
|
|
13
14
|
const promises_1 = require("node:fs/promises");
|
|
@@ -108,8 +109,9 @@ async function attestEntry(entry) {
|
|
|
108
109
|
const { default: Docker } = await __niceevalDynamicImport("dockerode");
|
|
109
110
|
const docker = new Docker({ socketPath: profile.transport.dockerSocket.path });
|
|
110
111
|
const info = await docker.info();
|
|
111
|
-
if (!rootlessSecurityOptions(info))
|
|
112
|
+
if (profile.securityLevel !== "raw-dind-storage/v1" && !rootlessSecurityOptions(info)) {
|
|
112
113
|
throw new Error(`Docker profile ${entry.alias} daemon is not rootless`);
|
|
114
|
+
}
|
|
113
115
|
if (info.DockerRootDir !== profile.backend.filesystem.dockerRootDir) {
|
|
114
116
|
throw new Error(`Docker profile ${entry.alias} DockerRootDir does not match descriptor`);
|
|
115
117
|
}
|
|
@@ -169,17 +171,49 @@ async function createDockerProfileLease(binding) {
|
|
|
169
171
|
},
|
|
170
172
|
};
|
|
171
173
|
}
|
|
172
|
-
async function acquireDockerProfileReservation(lease, reservationKind, resources) {
|
|
174
|
+
async function acquireDockerProfileReservation(lease, reservationKind, resources, signal) {
|
|
173
175
|
const reservationId = (0, node_crypto_1.randomUUID)();
|
|
174
176
|
let reservation = await controlRequest(lease.binding.controlSocketPath, {
|
|
175
177
|
kind: "reservation.acquire", invocationId: lease.invocationId, leaseToken: lease.leaseToken,
|
|
176
178
|
reservationId, reservationKind, resources,
|
|
177
179
|
});
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
180
|
+
try {
|
|
181
|
+
while (reservation.state === "queued") {
|
|
182
|
+
if (signal?.aborted)
|
|
183
|
+
throw signal.reason ?? new DOMException("Docker profile reservation aborted", "AbortError");
|
|
184
|
+
await new Promise((resolve, reject) => {
|
|
185
|
+
let abort;
|
|
186
|
+
const timer = setTimeout(() => {
|
|
187
|
+
if (abort !== undefined)
|
|
188
|
+
signal?.removeEventListener("abort", abort);
|
|
189
|
+
resolve();
|
|
190
|
+
}, 100);
|
|
191
|
+
if (signal === undefined)
|
|
192
|
+
return;
|
|
193
|
+
abort = () => {
|
|
194
|
+
clearTimeout(timer);
|
|
195
|
+
signal.removeEventListener("abort", abort);
|
|
196
|
+
reject(signal.reason ?? new DOMException("Docker profile reservation aborted", "AbortError"));
|
|
197
|
+
};
|
|
198
|
+
signal.addEventListener("abort", abort, { once: true });
|
|
199
|
+
});
|
|
200
|
+
reservation = await controlRequest(lease.binding.controlSocketPath, {
|
|
201
|
+
kind: "reservation.get", invocationId: lease.invocationId, leaseToken: lease.leaseToken, reservationId,
|
|
202
|
+
});
|
|
203
|
+
if (signal?.aborted)
|
|
204
|
+
throw signal.reason ?? new DOMException("Docker profile reservation aborted", "AbortError");
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
catch (error) {
|
|
208
|
+
if (signal?.aborted) {
|
|
209
|
+
await controlRequest(lease.binding.controlSocketPath, {
|
|
210
|
+
kind: reservation.state === "queued" ? "reservation.cancel" : "reservation.release",
|
|
211
|
+
invocationId: lease.invocationId,
|
|
212
|
+
leaseToken: lease.leaseToken,
|
|
213
|
+
reservationId,
|
|
214
|
+
}).catch(() => undefined);
|
|
215
|
+
}
|
|
216
|
+
throw error;
|
|
183
217
|
}
|
|
184
218
|
return reservation;
|
|
185
219
|
}
|
|
@@ -189,6 +223,33 @@ async function commitDockerProfileReservation(lease, reservationId, input) {
|
|
|
189
223
|
reservationId, ...input,
|
|
190
224
|
});
|
|
191
225
|
}
|
|
226
|
+
async function createDockerProfileContainer(lease, reservationId, create) {
|
|
227
|
+
try {
|
|
228
|
+
return await controlRequest(lease.binding.controlSocketPath, {
|
|
229
|
+
kind: "container.create",
|
|
230
|
+
invocationId: lease.invocationId,
|
|
231
|
+
leaseToken: lease.leaseToken,
|
|
232
|
+
reservationId,
|
|
233
|
+
create,
|
|
234
|
+
});
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
// A lost reply can leave the journal committed. Recover the control-owned IDs instead of
|
|
238
|
+
// issuing a second create or asking DockerSandbox's legacy reconciler to remove them.
|
|
239
|
+
const reservation = await controlRequest(lease.binding.controlSocketPath, {
|
|
240
|
+
kind: "reservation.get",
|
|
241
|
+
invocationId: lease.invocationId,
|
|
242
|
+
leaseToken: lease.leaseToken,
|
|
243
|
+
reservationId,
|
|
244
|
+
}).catch(() => undefined);
|
|
245
|
+
if (reservation?.state === "committed" &&
|
|
246
|
+
reservation.containerId !== undefined &&
|
|
247
|
+
reservation.networkId !== undefined) {
|
|
248
|
+
return { containerId: reservation.containerId, networkId: reservation.networkId, state: "active" };
|
|
249
|
+
}
|
|
250
|
+
throw error;
|
|
251
|
+
}
|
|
252
|
+
}
|
|
192
253
|
async function releaseDockerProfileReservation(lease, reservationId, terminationEvidence) {
|
|
193
254
|
await controlRequest(lease.binding.controlSocketPath, {
|
|
194
255
|
kind: "reservation.release", invocationId: lease.invocationId, leaseToken: lease.leaseToken,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { lstat, readFile, readdir, stat } from \"node:fs/promises\";\nimport { connect } from \"node:net\";\nimport { dirname, join, parse } from \"node:path\";\nimport { indexDockerProfiles, resolveDockerProfile, type ResolvedDockerProfileEntry } from \"./registry.ts\";\nimport type { DockerExecutionProfileV1 } from \"./schema.ts\";\nexport const DOCKER_PROFILE_REGISTRY_DIR = \"/etc/niceeval/docker-profiles\";\nexport interface DockerProfileRuntimeBinding {\n readonly alias: string;\n readonly profile: DockerExecutionProfileV1;\n readonly descriptorDigest: string;\n readonly daemonGeneration: string;\n readonly daemonId: string;\n readonly dockerSocketPath: string;\n readonly controlSocketPath: string;\n readonly platform: string;\n}\nexport interface DockerProfileLease {\n readonly binding: DockerProfileRuntimeBinding;\n readonly invocationId: string;\n readonly leaseToken: string;\n readonly stopHeartbeat: () => Promise<void>;\n}\nexport interface DockerProfileReservation {\n readonly reservationId: string;\n readonly provisionToken: string;\n readonly state: \"queued\" | \"granted\" | \"committed\" | \"releasing\";\n}\nfunction modeOf(value: number): number {\n return value & 0o7777;\n}\nasync function parentModes(path: string): Promise<number[]> {\n const result: number[] = [];\n const root = parse(path).root;\n let current = dirname(path);\n while (true) {\n result.push(modeOf((await stat(current)).mode));\n if (current === root)\n break;\n current = dirname(current);\n }\n return result;\n}\n/** Production registry location is fixed; tests may exercise descriptor I/O at an explicit directory. */\nexport async function loadDockerProfileRegistryAt(registryDir: string): Promise<ReturnType<typeof indexDockerProfiles>> {\n const names = (await readdir(registryDir)).filter((name) => name.endsWith(\".json\") && !name.endsWith(\".host.json\") && !name.endsWith(\".daemon.json\")).sort();\n const entries = await Promise.all(names.map(async (name) => {\n const source = join(registryDir, name);\n const facts = await lstat(source);\n return {\n alias: name.slice(0, -\".json\".length),\n profile: JSON.parse(await readFile(source, \"utf8\")) as unknown,\n source,\n fileFacts: {\n isSymlink: facts.isSymbolicLink(),\n ownerUid: facts.uid,\n mode: modeOf(facts.mode),\n parentModes: await parentModes(source),\n },\n };\n }));\n return indexDockerProfiles(entries, { expectedOwnerUid: 0 });\n}\nexport async function loadDockerProfileRegistry(): Promise<ReturnType<typeof indexDockerProfiles>> {\n return loadDockerProfileRegistryAt(DOCKER_PROFILE_REGISTRY_DIR);\n}\nfunction controlRequest<T>(path: string, request: Readonly<Record<string, unknown>>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const socket = connect(path);\n let response = \"\";\n socket.setTimeout(10000);\n socket.on(\"connect\", () => socket.end(`${JSON.stringify(request)}\\n`));\n socket.on(\"data\", (chunk: Buffer) => { response += chunk.toString(); });\n socket.on(\"timeout\", () => socket.destroy(new Error(`Docker profile control timeout: ${path}`)));\n socket.on(\"error\", reject);\n socket.on(\"close\", () => {\n try {\n const parsed = JSON.parse(response) as {\n ok?: boolean;\n result?: T;\n error?: {\n code?: string;\n message?: string;\n };\n };\n if (parsed.ok !== true || parsed.result === undefined) {\n reject(new Error(`${parsed.error?.code ?? \"control-error\"}: ${parsed.error?.message ?? \"invalid control reply\"}`));\n }\n else\n resolve(parsed.result);\n }\n catch (error) {\n reject(error);\n }\n });\n });\n}\nasync function socketFact(path: string, expectedUid: number): Promise<void> {\n const value = await lstat(path);\n if (!value.isSocket())\n throw new Error(`Docker profile endpoint is not a Unix socket: ${path}`);\n if (value.uid !== expectedUid)\n throw new Error(`Docker profile endpoint ${path} owner is ${value.uid}, expected ${expectedUid}`);\n if ((modeOf(value.mode) & 0o002) !== 0)\n throw new Error(`Docker profile endpoint is world-writable: ${path}`);\n}\nfunction rootlessSecurityOptions(info: {\n readonly SecurityOptions?: readonly string[];\n}): boolean {\n return (info.SecurityOptions ?? []).some((option: string) => option.toLowerCase().includes(\"rootless\"));\n}\nasync function attestEntry(entry: ResolvedDockerProfileEntry): Promise<DockerProfileRuntimeBinding> {\n const profile = entry.profile;\n await Promise.all([\n socketFact(profile.transport.dockerSocket.path, profile.transport.dockerSocket.peerUid),\n socketFact(profile.transport.controlSocket.path, profile.transport.controlSocket.peerUid),\n ]);\n const nonce = randomUUID();\n const challenge = await controlRequest<{\n readonly protocol: string;\n readonly profileId: string;\n readonly descriptorDigest: string;\n readonly hostMachineIdentity: string;\n readonly backendMachineIdentity: string;\n readonly daemonGeneration: string;\n readonly clientNonce: string;\n readonly admissionOpen: boolean;\n }>(profile.transport.controlSocket.path, { kind: \"challenge\", clientNonce: nonce });\n if (challenge.protocol !== profile.transport.controlSocket.protocol || challenge.profileId !== profile.profileId ||\n challenge.descriptorDigest !== entry.descriptorDigest || challenge.clientNonce !== nonce || challenge.admissionOpen !== true ||\n challenge.hostMachineIdentity !== profile.transport.hostMachineIdentity ||\n challenge.backendMachineIdentity !== profile.backend.machineIdentity) {\n throw new Error(`Docker profile ${entry.alias} control attestation does not match its descriptor`);\n }\n // dockerode 是 optional peer;只有用户实际使用 Docker profile 时才加载。\n // 保持这里为热路径动态 import,避免不使用 Docker 的最小安装仅因 CLI 启动就崩溃。\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const docker = new Docker({ socketPath: profile.transport.dockerSocket.path });\n const info = await docker.info();\n if (!rootlessSecurityOptions(info))\n throw new Error(`Docker profile ${entry.alias} daemon is not rootless`);\n if (info.DockerRootDir !== profile.backend.filesystem.dockerRootDir) {\n throw new Error(`Docker profile ${entry.alias} DockerRootDir does not match descriptor`);\n }\n if (String(info.CgroupVersion) !== \"2\" || info.CgroupDriver !== \"systemd\") {\n throw new Error(`Docker profile ${entry.alias} requires cgroup v2 with the systemd driver`);\n }\n const os = info.OSType || \"linux\";\n const arch = info.Architecture || \"amd64\";\n if (typeof info.ID !== \"string\" || info.ID === \"\")\n throw new Error(`Docker profile ${entry.alias} daemon ID is missing`);\n return Object.freeze({\n alias: entry.alias,\n profile,\n descriptorDigest: entry.descriptorDigest,\n daemonGeneration: challenge.daemonGeneration,\n daemonId: info.ID,\n dockerSocketPath: profile.transport.dockerSocket.path,\n controlSocketPath: profile.transport.controlSocket.path,\n platform: `${os}/${arch}`,\n });\n}\nexport async function attestDockerProfile(alias: string): Promise<DockerProfileRuntimeBinding> {\n return attestEntry(resolveDockerProfile(await loadDockerProfileRegistry(), alias));\n}\nexport async function createDockerProfileLease(binding: DockerProfileRuntimeBinding): Promise<DockerProfileLease> {\n const invocationId = randomUUID();\n const created = await controlRequest<{\n readonly leaseToken: string;\n }>(binding.controlSocketPath, {\n kind: \"lease.create\",\n profileId: binding.profile.profileId,\n daemonGeneration: binding.daemonGeneration,\n invocationId,\n });\n let stopped = false;\n let timer: ReturnType<typeof setInterval> | undefined;\n const heartbeat = async () => {\n if (stopped)\n return;\n await controlRequest(binding.controlSocketPath, {\n kind: \"lease.heartbeat\", invocationId, leaseToken: created.leaseToken,\n });\n };\n timer = setInterval(() => { void heartbeat().catch(() => { }); }, 5000);\n timer.unref();\n return {\n binding,\n invocationId,\n leaseToken: created.leaseToken,\n stopHeartbeat: async () => {\n if (stopped)\n return;\n stopped = true;\n if (timer !== undefined)\n clearInterval(timer);\n await controlRequest(binding.controlSocketPath, {\n kind: \"lease.drain\", invocationId, leaseToken: created.leaseToken,\n });\n },\n };\n}\nexport async function acquireDockerProfileReservation(lease: DockerProfileLease, reservationKind: \"container\" | \"build\", resources: Readonly<Record<string, number>>): Promise<DockerProfileReservation> {\n const reservationId = randomUUID();\n let reservation = await controlRequest<DockerProfileReservation>(lease.binding.controlSocketPath, {\n kind: \"reservation.acquire\", invocationId: lease.invocationId, leaseToken: lease.leaseToken,\n reservationId, reservationKind, resources,\n });\n while (reservation.state === \"queued\") {\n await new Promise((resolve) => setTimeout(resolve, 100));\n reservation = await controlRequest<DockerProfileReservation>(lease.binding.controlSocketPath, {\n kind: \"reservation.get\", invocationId: lease.invocationId, leaseToken: lease.leaseToken, reservationId,\n });\n }\n return reservation;\n}\nexport async function commitDockerProfileReservation(lease: DockerProfileLease, reservationId: string, input: {\n readonly containerId?: string;\n readonly networkId?: string;\n readonly attemptId?: string;\n}): Promise<void> {\n await controlRequest(lease.binding.controlSocketPath, {\n kind: \"reservation.commit\", invocationId: lease.invocationId, leaseToken: lease.leaseToken,\n reservationId, ...input,\n });\n}\nexport async function releaseDockerProfileReservation(lease: DockerProfileLease, reservationId: string, terminationEvidence?: Readonly<Record<string, boolean>>): Promise<void> {\n await controlRequest(lease.binding.controlSocketPath, {\n kind: \"reservation.release\", invocationId: lease.invocationId, leaseToken: lease.leaseToken,\n reservationId, ...(terminationEvidence === undefined ? {} : { terminationEvidence }),\n });\n}\n"]}
|
|
1
|
+
{"version":3,"file":"runtime.js","sourceRoot":"","sources":["runtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { randomUUID } from \"node:crypto\";\nimport { lstat, readFile, readdir, stat } from \"node:fs/promises\";\nimport { connect } from \"node:net\";\nimport { dirname, join, parse } from \"node:path\";\nimport { indexDockerProfiles, resolveDockerProfile, type ResolvedDockerProfileEntry } from \"./registry.ts\";\nimport type { DockerExecutionProfileV1 } from \"./schema.ts\";\nexport const DOCKER_PROFILE_REGISTRY_DIR = \"/etc/niceeval/docker-profiles\";\nexport interface DockerProfileRuntimeBinding {\n readonly alias: string;\n readonly profile: DockerExecutionProfileV1;\n readonly descriptorDigest: string;\n readonly daemonGeneration: string;\n readonly daemonId: string;\n readonly dockerSocketPath: string;\n readonly controlSocketPath: string;\n readonly platform: string;\n}\nexport interface DockerProfileLease {\n readonly binding: DockerProfileRuntimeBinding;\n readonly invocationId: string;\n readonly leaseToken: string;\n readonly stopHeartbeat: () => Promise<void>;\n}\nexport interface DockerProfileReservation {\n readonly reservationId: string;\n readonly provisionToken: string;\n readonly state: \"queued\" | \"granted\" | \"committed\" | \"releasing\";\n readonly containerId?: string;\n readonly networkId?: string;\n}\nexport interface DockerProfileContainerCreateInput {\n readonly image: string;\n readonly attemptId: string;\n readonly command?: readonly string[];\n readonly entrypoint?: string;\n readonly environment?: readonly string[];\n readonly workingDir?: string;\n readonly user?: string;\n readonly tmpfs?: Readonly<Record<string, string>>;\n}\nexport interface DockerProfileContainerCreateResult {\n readonly containerId: string;\n readonly networkId: string;\n readonly state: \"active\";\n}\nfunction modeOf(value: number): number {\n return value & 0o7777;\n}\nasync function parentModes(path: string): Promise<number[]> {\n const result: number[] = [];\n const root = parse(path).root;\n let current = dirname(path);\n while (true) {\n result.push(modeOf((await stat(current)).mode));\n if (current === root)\n break;\n current = dirname(current);\n }\n return result;\n}\n/** Production registry location is fixed; tests may exercise descriptor I/O at an explicit directory. */\nexport async function loadDockerProfileRegistryAt(registryDir: string): Promise<ReturnType<typeof indexDockerProfiles>> {\n const names = (await readdir(registryDir)).filter((name) => name.endsWith(\".json\") && !name.endsWith(\".host.json\") && !name.endsWith(\".daemon.json\")).sort();\n const entries = await Promise.all(names.map(async (name) => {\n const source = join(registryDir, name);\n const facts = await lstat(source);\n return {\n alias: name.slice(0, -\".json\".length),\n profile: JSON.parse(await readFile(source, \"utf8\")) as unknown,\n source,\n fileFacts: {\n isSymlink: facts.isSymbolicLink(),\n ownerUid: facts.uid,\n mode: modeOf(facts.mode),\n parentModes: await parentModes(source),\n },\n };\n }));\n return indexDockerProfiles(entries, { expectedOwnerUid: 0 });\n}\nexport async function loadDockerProfileRegistry(): Promise<ReturnType<typeof indexDockerProfiles>> {\n return loadDockerProfileRegistryAt(DOCKER_PROFILE_REGISTRY_DIR);\n}\nfunction controlRequest<T>(path: string, request: Readonly<Record<string, unknown>>): Promise<T> {\n return new Promise<T>((resolve, reject) => {\n const socket = connect(path);\n let response = \"\";\n socket.setTimeout(10000);\n socket.on(\"connect\", () => socket.end(`${JSON.stringify(request)}\\n`));\n socket.on(\"data\", (chunk: Buffer) => { response += chunk.toString(); });\n socket.on(\"timeout\", () => socket.destroy(new Error(`Docker profile control timeout: ${path}`)));\n socket.on(\"error\", reject);\n socket.on(\"close\", () => {\n try {\n const parsed = JSON.parse(response) as {\n ok?: boolean;\n result?: T;\n error?: {\n code?: string;\n message?: string;\n };\n };\n if (parsed.ok !== true || parsed.result === undefined) {\n reject(new Error(`${parsed.error?.code ?? \"control-error\"}: ${parsed.error?.message ?? \"invalid control reply\"}`));\n }\n else\n resolve(parsed.result);\n }\n catch (error) {\n reject(error);\n }\n });\n });\n}\nasync function socketFact(path: string, expectedUid: number): Promise<void> {\n const value = await lstat(path);\n if (!value.isSocket())\n throw new Error(`Docker profile endpoint is not a Unix socket: ${path}`);\n if (value.uid !== expectedUid)\n throw new Error(`Docker profile endpoint ${path} owner is ${value.uid}, expected ${expectedUid}`);\n if ((modeOf(value.mode) & 0o002) !== 0)\n throw new Error(`Docker profile endpoint is world-writable: ${path}`);\n}\nfunction rootlessSecurityOptions(info: {\n readonly SecurityOptions?: readonly string[];\n}): boolean {\n return (info.SecurityOptions ?? []).some((option: string) => option.toLowerCase().includes(\"rootless\"));\n}\nasync function attestEntry(entry: ResolvedDockerProfileEntry): Promise<DockerProfileRuntimeBinding> {\n const profile = entry.profile;\n await Promise.all([\n socketFact(profile.transport.dockerSocket.path, profile.transport.dockerSocket.peerUid),\n socketFact(profile.transport.controlSocket.path, profile.transport.controlSocket.peerUid),\n ]);\n const nonce = randomUUID();\n const challenge = await controlRequest<{\n readonly protocol: string;\n readonly profileId: string;\n readonly descriptorDigest: string;\n readonly hostMachineIdentity: string;\n readonly backendMachineIdentity: string;\n readonly daemonGeneration: string;\n readonly clientNonce: string;\n readonly admissionOpen: boolean;\n }>(profile.transport.controlSocket.path, { kind: \"challenge\", clientNonce: nonce });\n if (challenge.protocol !== profile.transport.controlSocket.protocol || challenge.profileId !== profile.profileId ||\n challenge.descriptorDigest !== entry.descriptorDigest || challenge.clientNonce !== nonce || challenge.admissionOpen !== true ||\n challenge.hostMachineIdentity !== profile.transport.hostMachineIdentity ||\n challenge.backendMachineIdentity !== profile.backend.machineIdentity) {\n throw new Error(`Docker profile ${entry.alias} control attestation does not match its descriptor`);\n }\n // dockerode 是 optional peer;只有用户实际使用 Docker profile 时才加载。\n // 保持这里为热路径动态 import,避免不使用 Docker 的最小安装仅因 CLI 启动就崩溃。\n const { default: Docker } = await __niceevalDynamicImport(\"dockerode\");\n const docker = new Docker({ socketPath: profile.transport.dockerSocket.path });\n const info = await docker.info();\n if (profile.securityLevel !== \"raw-dind-storage/v1\" && !rootlessSecurityOptions(info)) {\n throw new Error(`Docker profile ${entry.alias} daemon is not rootless`);\n }\n if (info.DockerRootDir !== profile.backend.filesystem.dockerRootDir) {\n throw new Error(`Docker profile ${entry.alias} DockerRootDir does not match descriptor`);\n }\n if (String(info.CgroupVersion) !== \"2\" || info.CgroupDriver !== \"systemd\") {\n throw new Error(`Docker profile ${entry.alias} requires cgroup v2 with the systemd driver`);\n }\n const os = info.OSType || \"linux\";\n const arch = info.Architecture || \"amd64\";\n if (typeof info.ID !== \"string\" || info.ID === \"\")\n throw new Error(`Docker profile ${entry.alias} daemon ID is missing`);\n return Object.freeze({\n alias: entry.alias,\n profile,\n descriptorDigest: entry.descriptorDigest,\n daemonGeneration: challenge.daemonGeneration,\n daemonId: info.ID,\n dockerSocketPath: profile.transport.dockerSocket.path,\n controlSocketPath: profile.transport.controlSocket.path,\n platform: `${os}/${arch}`,\n });\n}\nexport async function attestDockerProfile(alias: string): Promise<DockerProfileRuntimeBinding> {\n return attestEntry(resolveDockerProfile(await loadDockerProfileRegistry(), alias));\n}\nexport async function createDockerProfileLease(binding: DockerProfileRuntimeBinding): Promise<DockerProfileLease> {\n const invocationId = randomUUID();\n const created = await controlRequest<{\n readonly leaseToken: string;\n }>(binding.controlSocketPath, {\n kind: \"lease.create\",\n profileId: binding.profile.profileId,\n daemonGeneration: binding.daemonGeneration,\n invocationId,\n });\n let stopped = false;\n let timer: ReturnType<typeof setInterval> | undefined;\n const heartbeat = async () => {\n if (stopped)\n return;\n await controlRequest(binding.controlSocketPath, {\n kind: \"lease.heartbeat\", invocationId, leaseToken: created.leaseToken,\n });\n };\n timer = setInterval(() => { void heartbeat().catch(() => { }); }, 5000);\n timer.unref();\n return {\n binding,\n invocationId,\n leaseToken: created.leaseToken,\n stopHeartbeat: async () => {\n if (stopped)\n return;\n stopped = true;\n if (timer !== undefined)\n clearInterval(timer);\n await controlRequest(binding.controlSocketPath, {\n kind: \"lease.drain\", invocationId, leaseToken: created.leaseToken,\n });\n },\n };\n}\nexport async function acquireDockerProfileReservation(lease: DockerProfileLease, reservationKind: \"container\" | \"build\", resources: Readonly<Record<string, number>>, signal?: AbortSignal): Promise<DockerProfileReservation> {\n const reservationId = randomUUID();\n let reservation = await controlRequest<DockerProfileReservation>(lease.binding.controlSocketPath, {\n kind: \"reservation.acquire\", invocationId: lease.invocationId, leaseToken: lease.leaseToken,\n reservationId, reservationKind, resources,\n });\n try {\n while (reservation.state === \"queued\") {\n if (signal?.aborted)\n throw signal.reason ?? new DOMException(\"Docker profile reservation aborted\", \"AbortError\");\n await new Promise<void>((resolve, reject) => {\n let abort: (() => void) | undefined;\n const timer = setTimeout(() => {\n if (abort !== undefined)\n signal?.removeEventListener(\"abort\", abort);\n resolve();\n }, 100);\n if (signal === undefined)\n return;\n abort = () => {\n clearTimeout(timer);\n signal.removeEventListener(\"abort\", abort!);\n reject(signal.reason ?? new DOMException(\"Docker profile reservation aborted\", \"AbortError\"));\n };\n signal.addEventListener(\"abort\", abort, { once: true });\n });\n reservation = await controlRequest<DockerProfileReservation>(lease.binding.controlSocketPath, {\n kind: \"reservation.get\", invocationId: lease.invocationId, leaseToken: lease.leaseToken, reservationId,\n });\n if (signal?.aborted)\n throw signal.reason ?? new DOMException(\"Docker profile reservation aborted\", \"AbortError\");\n }\n }\n catch (error) {\n if (signal?.aborted) {\n await controlRequest(lease.binding.controlSocketPath, {\n kind: reservation.state === \"queued\" ? \"reservation.cancel\" : \"reservation.release\",\n invocationId: lease.invocationId,\n leaseToken: lease.leaseToken,\n reservationId,\n }).catch(() => undefined);\n }\n throw error;\n }\n return reservation;\n}\nexport async function commitDockerProfileReservation(lease: DockerProfileLease, reservationId: string, input: {\n readonly containerId?: string;\n readonly networkId?: string;\n readonly attemptId?: string;\n}): Promise<void> {\n await controlRequest(lease.binding.controlSocketPath, {\n kind: \"reservation.commit\", invocationId: lease.invocationId, leaseToken: lease.leaseToken,\n reservationId, ...input,\n });\n}\nexport async function createDockerProfileContainer(lease: DockerProfileLease, reservationId: string, create: DockerProfileContainerCreateInput): Promise<DockerProfileContainerCreateResult> {\n try {\n return await controlRequest<DockerProfileContainerCreateResult>(lease.binding.controlSocketPath, {\n kind: \"container.create\",\n invocationId: lease.invocationId,\n leaseToken: lease.leaseToken,\n reservationId,\n create,\n });\n }\n catch (error) {\n // A lost reply can leave the journal committed. Recover the control-owned IDs instead of\n // issuing a second create or asking DockerSandbox's legacy reconciler to remove them.\n const reservation = await controlRequest<DockerProfileReservation>(lease.binding.controlSocketPath, {\n kind: \"reservation.get\",\n invocationId: lease.invocationId,\n leaseToken: lease.leaseToken,\n reservationId,\n }).catch(() => undefined);\n if (reservation?.state === \"committed\" &&\n reservation.containerId !== undefined &&\n reservation.networkId !== undefined) {\n return { containerId: reservation.containerId, networkId: reservation.networkId, state: \"active\" };\n }\n throw error;\n }\n}\nexport async function releaseDockerProfileReservation(lease: DockerProfileLease, reservationId: string, terminationEvidence?: Readonly<Record<string, boolean>>): Promise<void> {\n await controlRequest(lease.binding.controlSocketPath, {\n kind: \"reservation.release\", invocationId: lease.invocationId, leaseToken: lease.leaseToken,\n reservationId, ...(terminationEvidence === undefined ? {} : { terminationEvidence }),\n });\n}\n"]}
|
|
@@ -21,16 +21,34 @@ export interface DockerProfileReservation {
|
|
|
21
21
|
readonly reservationId: string;
|
|
22
22
|
readonly provisionToken: string;
|
|
23
23
|
readonly state: "queued" | "granted" | "committed" | "releasing";
|
|
24
|
+
readonly containerId?: string;
|
|
25
|
+
readonly networkId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DockerProfileContainerCreateInput {
|
|
28
|
+
readonly image: string;
|
|
29
|
+
readonly attemptId: string;
|
|
30
|
+
readonly command?: readonly string[];
|
|
31
|
+
readonly entrypoint?: string;
|
|
32
|
+
readonly environment?: readonly string[];
|
|
33
|
+
readonly workingDir?: string;
|
|
34
|
+
readonly user?: string;
|
|
35
|
+
readonly tmpfs?: Readonly<Record<string, string>>;
|
|
36
|
+
}
|
|
37
|
+
export interface DockerProfileContainerCreateResult {
|
|
38
|
+
readonly containerId: string;
|
|
39
|
+
readonly networkId: string;
|
|
40
|
+
readonly state: "active";
|
|
24
41
|
}
|
|
25
42
|
/** Production registry location is fixed; tests may exercise descriptor I/O at an explicit directory. */
|
|
26
43
|
export declare function loadDockerProfileRegistryAt(registryDir: string): Promise<ReturnType<typeof indexDockerProfiles>>;
|
|
27
44
|
export declare function loadDockerProfileRegistry(): Promise<ReturnType<typeof indexDockerProfiles>>;
|
|
28
45
|
export declare function attestDockerProfile(alias: string): Promise<DockerProfileRuntimeBinding>;
|
|
29
46
|
export declare function createDockerProfileLease(binding: DockerProfileRuntimeBinding): Promise<DockerProfileLease>;
|
|
30
|
-
export declare function acquireDockerProfileReservation(lease: DockerProfileLease, reservationKind: "container" | "build", resources: Readonly<Record<string, number
|
|
47
|
+
export declare function acquireDockerProfileReservation(lease: DockerProfileLease, reservationKind: "container" | "build", resources: Readonly<Record<string, number>>, signal?: AbortSignal): Promise<DockerProfileReservation>;
|
|
31
48
|
export declare function commitDockerProfileReservation(lease: DockerProfileLease, reservationId: string, input: {
|
|
32
49
|
readonly containerId?: string;
|
|
33
50
|
readonly networkId?: string;
|
|
34
51
|
readonly attemptId?: string;
|
|
35
52
|
}): Promise<void>;
|
|
53
|
+
export declare function createDockerProfileContainer(lease: DockerProfileLease, reservationId: string, create: DockerProfileContainerCreateInput): Promise<DockerProfileContainerCreateResult>;
|
|
36
54
|
export declare function releaseDockerProfileReservation(lease: DockerProfileLease, reservationId: string, terminationEvidence?: Readonly<Record<string, boolean>>): Promise<void>;
|
|
@@ -21,16 +21,34 @@ export interface DockerProfileReservation {
|
|
|
21
21
|
readonly reservationId: string;
|
|
22
22
|
readonly provisionToken: string;
|
|
23
23
|
readonly state: "queued" | "granted" | "committed" | "releasing";
|
|
24
|
+
readonly containerId?: string;
|
|
25
|
+
readonly networkId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DockerProfileContainerCreateInput {
|
|
28
|
+
readonly image: string;
|
|
29
|
+
readonly attemptId: string;
|
|
30
|
+
readonly command?: readonly string[];
|
|
31
|
+
readonly entrypoint?: string;
|
|
32
|
+
readonly environment?: readonly string[];
|
|
33
|
+
readonly workingDir?: string;
|
|
34
|
+
readonly user?: string;
|
|
35
|
+
readonly tmpfs?: Readonly<Record<string, string>>;
|
|
36
|
+
}
|
|
37
|
+
export interface DockerProfileContainerCreateResult {
|
|
38
|
+
readonly containerId: string;
|
|
39
|
+
readonly networkId: string;
|
|
40
|
+
readonly state: "active";
|
|
24
41
|
}
|
|
25
42
|
/** Production registry location is fixed; tests may exercise descriptor I/O at an explicit directory. */
|
|
26
43
|
export declare function loadDockerProfileRegistryAt(registryDir: string): Promise<ReturnType<typeof indexDockerProfiles>>;
|
|
27
44
|
export declare function loadDockerProfileRegistry(): Promise<ReturnType<typeof indexDockerProfiles>>;
|
|
28
45
|
export declare function attestDockerProfile(alias: string): Promise<DockerProfileRuntimeBinding>;
|
|
29
46
|
export declare function createDockerProfileLease(binding: DockerProfileRuntimeBinding): Promise<DockerProfileLease>;
|
|
30
|
-
export declare function acquireDockerProfileReservation(lease: DockerProfileLease, reservationKind: "container" | "build", resources: Readonly<Record<string, number
|
|
47
|
+
export declare function acquireDockerProfileReservation(lease: DockerProfileLease, reservationKind: "container" | "build", resources: Readonly<Record<string, number>>, signal?: AbortSignal): Promise<DockerProfileReservation>;
|
|
31
48
|
export declare function commitDockerProfileReservation(lease: DockerProfileLease, reservationId: string, input: {
|
|
32
49
|
readonly containerId?: string;
|
|
33
50
|
readonly networkId?: string;
|
|
34
51
|
readonly attemptId?: string;
|
|
35
52
|
}): Promise<void>;
|
|
53
|
+
export declare function createDockerProfileContainer(lease: DockerProfileLease, reservationId: string, create: DockerProfileContainerCreateInput): Promise<DockerProfileContainerCreateResult>;
|
|
36
54
|
export declare function releaseDockerProfileReservation(lease: DockerProfileLease, reservationId: string, terminationEvidence?: Readonly<Record<string, boolean>>): Promise<void>;
|
|
@@ -21,16 +21,34 @@ export interface DockerProfileReservation {
|
|
|
21
21
|
readonly reservationId: string;
|
|
22
22
|
readonly provisionToken: string;
|
|
23
23
|
readonly state: "queued" | "granted" | "committed" | "releasing";
|
|
24
|
+
readonly containerId?: string;
|
|
25
|
+
readonly networkId?: string;
|
|
26
|
+
}
|
|
27
|
+
export interface DockerProfileContainerCreateInput {
|
|
28
|
+
readonly image: string;
|
|
29
|
+
readonly attemptId: string;
|
|
30
|
+
readonly command?: readonly string[];
|
|
31
|
+
readonly entrypoint?: string;
|
|
32
|
+
readonly environment?: readonly string[];
|
|
33
|
+
readonly workingDir?: string;
|
|
34
|
+
readonly user?: string;
|
|
35
|
+
readonly tmpfs?: Readonly<Record<string, string>>;
|
|
36
|
+
}
|
|
37
|
+
export interface DockerProfileContainerCreateResult {
|
|
38
|
+
readonly containerId: string;
|
|
39
|
+
readonly networkId: string;
|
|
40
|
+
readonly state: "active";
|
|
24
41
|
}
|
|
25
42
|
/** Production registry location is fixed; tests may exercise descriptor I/O at an explicit directory. */
|
|
26
43
|
export declare function loadDockerProfileRegistryAt(registryDir: string): Promise<ReturnType<typeof indexDockerProfiles>>;
|
|
27
44
|
export declare function loadDockerProfileRegistry(): Promise<ReturnType<typeof indexDockerProfiles>>;
|
|
28
45
|
export declare function attestDockerProfile(alias: string): Promise<DockerProfileRuntimeBinding>;
|
|
29
46
|
export declare function createDockerProfileLease(binding: DockerProfileRuntimeBinding): Promise<DockerProfileLease>;
|
|
30
|
-
export declare function acquireDockerProfileReservation(lease: DockerProfileLease, reservationKind: "container" | "build", resources: Readonly<Record<string, number
|
|
47
|
+
export declare function acquireDockerProfileReservation(lease: DockerProfileLease, reservationKind: "container" | "build", resources: Readonly<Record<string, number>>, signal?: AbortSignal): Promise<DockerProfileReservation>;
|
|
31
48
|
export declare function commitDockerProfileReservation(lease: DockerProfileLease, reservationId: string, input: {
|
|
32
49
|
readonly containerId?: string;
|
|
33
50
|
readonly networkId?: string;
|
|
34
51
|
readonly attemptId?: string;
|
|
35
52
|
}): Promise<void>;
|
|
53
|
+
export declare function createDockerProfileContainer(lease: DockerProfileLease, reservationId: string, create: DockerProfileContainerCreateInput): Promise<DockerProfileContainerCreateResult>;
|
|
36
54
|
export declare function releaseDockerProfileReservation(lease: DockerProfileLease, reservationId: string, terminationEvidence?: Readonly<Record<string, boolean>>): Promise<void>;
|
|
@@ -9,12 +9,14 @@ const __niceevalExport2 = __niceevalCanonical["attestDockerProfile"];
|
|
|
9
9
|
export { __niceevalExport2 as attestDockerProfile };
|
|
10
10
|
const __niceevalExport3 = __niceevalCanonical["commitDockerProfileReservation"];
|
|
11
11
|
export { __niceevalExport3 as commitDockerProfileReservation };
|
|
12
|
-
const __niceevalExport4 = __niceevalCanonical["
|
|
13
|
-
export { __niceevalExport4 as
|
|
14
|
-
const __niceevalExport5 = __niceevalCanonical["
|
|
15
|
-
export { __niceevalExport5 as
|
|
16
|
-
const __niceevalExport6 = __niceevalCanonical["
|
|
17
|
-
export { __niceevalExport6 as
|
|
18
|
-
const __niceevalExport7 = __niceevalCanonical["
|
|
19
|
-
export { __niceevalExport7 as
|
|
12
|
+
const __niceevalExport4 = __niceevalCanonical["createDockerProfileContainer"];
|
|
13
|
+
export { __niceevalExport4 as createDockerProfileContainer };
|
|
14
|
+
const __niceevalExport5 = __niceevalCanonical["createDockerProfileLease"];
|
|
15
|
+
export { __niceevalExport5 as createDockerProfileLease };
|
|
16
|
+
const __niceevalExport6 = __niceevalCanonical["loadDockerProfileRegistry"];
|
|
17
|
+
export { __niceevalExport6 as loadDockerProfileRegistry };
|
|
18
|
+
const __niceevalExport7 = __niceevalCanonical["loadDockerProfileRegistryAt"];
|
|
19
|
+
export { __niceevalExport7 as loadDockerProfileRegistryAt };
|
|
20
|
+
const __niceevalExport8 = __niceevalCanonical["releaseDockerProfileReservation"];
|
|
21
|
+
export { __niceevalExport8 as releaseDockerProfileReservation };
|
|
20
22
|
//# sourceMappingURL=runtime.js.map
|