@outerlayer/cli 0.34.0-next.20261026214534 → 0.34.0-next.20261026230708

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.
Files changed (54) hide show
  1. package/README.md +12 -4
  2. package/dist/{build-BBWAD5LR.js → build-M4UYZAFH.js} +3 -2
  3. package/dist/{build-disk-TGLM5XK7.js → build-disk-ZDVSSHO2.js} +3 -2
  4. package/dist/build-info.json +1 -1
  5. package/dist/{builder-FD53GTWL.js → builder-IORYS76D.js} +2 -1
  6. package/dist/{check-FOWN6M3C.js → check-V66LZDNK.js} +15 -14
  7. package/dist/{chunk-T2HH7IHT.js → chunk-63A6NUEZ.js} +1 -1
  8. package/dist/{chunk-3HJMY3H5.js → chunk-6NXBXWOP.js} +1 -1
  9. package/dist/{chunk-3PUOHONX.js → chunk-DFBY6LX3.js} +6 -5
  10. package/dist/{chunk-RNMCFAYH.js → chunk-F5H3LVHR.js} +2 -2
  11. package/dist/chunk-HDLON3RJ.js +274 -0
  12. package/dist/{chunk-FVF2LMVG.js → chunk-IZVDQXTC.js} +9 -9
  13. package/dist/{chunk-LY62UHRR.js → chunk-JZLMFYFM.js} +1 -1
  14. package/dist/{chunk-XYLHSCLR.js → chunk-KOZ6IBEI.js} +8 -279
  15. package/dist/{chunk-K3ACC2CV.js → chunk-MIRCFK4X.js} +2 -33
  16. package/dist/{chunk-5ZBVKRDK.js → chunk-PN7RMFPP.js} +2 -2
  17. package/dist/{chunk-BQQPDBSF.js → chunk-Q3L5AC75.js} +2 -2
  18. package/dist/{chunk-2GDKM2O4.js → chunk-T6HSNQAT.js} +4 -4
  19. package/dist/{chunk-KR2TIRNQ.js → chunk-T7HUNNJ2.js} +30 -16
  20. package/dist/{chunk-JKLSQOYO.js → chunk-TGBST2QL.js} +11 -7
  21. package/dist/{chunk-3NCWHEGM.js → chunk-TLIZ7FY4.js} +2 -2
  22. package/dist/{chunk-XHZBLIB2.js → chunk-XDJ376OP.js} +7 -1
  23. package/dist/{chunk-ZADRW2V2.js → chunk-XLJXO4QC.js} +4 -4
  24. package/dist/{cli-3RDQSLYI.js → cli-HQWQEHXJ.js} +79 -44
  25. package/dist/{command-C5YKBTK4.js → command-TONUMZ2A.js} +8 -7
  26. package/dist/{config-EBT5VYPX.js → config-4K6OG2SZ.js} +4 -3
  27. package/dist/{container-start-RLX2PL3C.js → container-start-R74IO7CI.js} +12 -11
  28. package/dist/demo-record-cmd-7HJ5C7KM.js +208 -0
  29. package/dist/{demo-voice-cmd-DF6C7EST.js → demo-voice-cmd-MBK3BGHZ.js} +1 -2
  30. package/dist/{docker-CP656XNO.js → docker-XWQM4F7B.js} +2 -1
  31. package/dist/{doctor-EQIAHHZD.js → doctor-SF4GAWAO.js} +9 -8
  32. package/dist/{emit-demo-cmd-YKTL6XWP.js → emit-demo-cmd-6VTA5BSJ.js} +1 -2
  33. package/dist/{find-unit-O6WL6UIW.js → find-unit-I4GWKY4T.js} +6 -5
  34. package/dist/{host-checks-V25YUP4Q.js → host-checks-FKLQST3J.js} +10 -9
  35. package/dist/index.js +1 -1
  36. package/dist/{init-KO3FT2XP.js → init-3MO5WCU3.js} +8 -7
  37. package/dist/{init-YYZ7B4ZD.js → init-TDLUTI6F.js} +8 -7
  38. package/dist/{init-cmd-D3BDS7KY.js → init-cmd-MQ5R35O2.js} +1 -1
  39. package/dist/{loop-UVONXWXB.js → loop-NNNDBFAS.js} +14 -13
  40. package/dist/{machine-2BI76JZO.js → machine-GCW2GGI2.js} +8 -7
  41. package/dist/recorder.cjs +916 -0
  42. package/dist/{runner-env-QN4BLTVZ.js → runner-env-LVVLUHY2.js} +6 -5
  43. package/dist/{runner-identity-53I4UTVY.js → runner-identity-73F2IWBT.js} +2 -1
  44. package/dist/{runner-key-JKXJWGGY.js → runner-key-ASPZ7TQH.js} +8 -7
  45. package/dist/{status-YCQHAY45.js → status-35Z3TW42.js} +10 -9
  46. package/dist/{update-steps-MC3IUHW7.js → update-steps-ZTNIK7LA.js} +11 -10
  47. package/dist/{work-claim-cmd-O54L5DSL.js → work-claim-cmd-QPYCZUMI.js} +4 -3
  48. package/dist/{work-proofs-cmd-LIXV252G.js → work-proofs-cmd-56EY7O45.js} +1 -1
  49. package/dist/{work-proofs-record-MCSA56F5.js → work-proofs-record-SPGI47OS.js} +2 -3
  50. package/package.json +5 -4
  51. package/skill-pack/maintained/outerlayer-amend/SKILL.md +2 -2
  52. package/skill-pack/maintained/outerlayer-build/references/evidence.md +12 -11
  53. package/skill-pack/maintained/outerlayer-evidence/SKILL.md +6 -6
  54. package/skill-pack/maintained/outerlayer-evidence/references/demo.md +12 -11
package/README.md CHANGED
@@ -233,7 +233,8 @@ content:
233
233
  login`. The tools layer also downloads the pinned `gh` and `tini` releases
234
234
  from GitHub, a pinned static `ffmpeg` build from GitHub, and the narration
235
235
  voice pack from Hugging Face and the npm registry, checking each against a
236
- digest. The image build runs outside
236
+ digest. It also installs the CLI's pinned Playwright release from the npm
237
+ registry, with no browser. The image build runs outside
237
238
  any work item and sends nothing to your factory. `outerlayer runner start`
238
239
  builds each build's image the same way, before the build starts. That image
239
240
  build uses the host's network: the build's tunnel does not carry it, and
@@ -404,8 +405,8 @@ content:
404
405
  - **`outerlayer emit demo <manifest>`** first reads the item's recorded
405
406
  criteria (`GET /v1/work-items/{number}`) to check the chapters' criterion
406
407
  ids. With `--replaces <record id>`, it also reads the item's newest demo record
407
- (`GET /v1/work-items/{number}/demo`) before it uploads anything. It cuts a recorded video once, from the first chapter's start to the
408
- last chapter's end, and emits it as one video artifact. It then emits a video
408
+ (`GET /v1/work-items/{number}/demo`) before it uploads anything. It edits a
409
+ recorded video once, keeping only the beats, and emits it as one video artifact. It then emits a video
409
410
  artifact for each chapter with the same bytes and a time range in that video,
410
411
  followed by the manifest as the demo record. A chapter's screenshot frame is
411
412
  emitted as a screenshot artifact after its clip. A recording over 8 MiB falls
@@ -415,6 +416,12 @@ content:
415
416
  400 MB, from huggingface.co and registry.npmjs.org into
416
417
  `~/.outerlayer/voice/`. It checks each file against a pinned sha256 and sends
417
418
  nothing to either host. `--no-narration` downloads nothing.
419
+ - **`outerlayer demo record <file>`** sends nothing itself. It runs your demo
420
+ script in a local Chromium, through the Playwright release the CLI depends
421
+ on, and the browser opens only the pages the script opens. With the voice
422
+ on, it speaks each line on your machine, and the first time it may download
423
+ the voice pack as `outerlayer emit demo` does. `--no-voice` downloads
424
+ nothing.
418
425
  - **`outerlayer emit <name>`** sends one check's outcome for a work item.
419
426
  Run from inside a session, it sends only when that session carries a
420
427
  launch record — the session's own content may not leave by a second
@@ -512,7 +519,8 @@ before it gives up.
512
519
  | `outerlayer context emit [--check]` | Compile `.outerlayer/` into each configured target tool's native files (targets come from `.outerlayer/config.json`). `--check` computes outputs and diffs against disk without writing (CI mode). Bare `outerlayer emit` with no name still compiles, with a deprecation warning. |
513
520
  | `outerlayer hooks wrap` / `outerlayer hooks unwrap` | Auto-wrap (or undo wrapping) `PreToolUse`/`PostToolUse` hooks for execution evidence — one spawn per firing. |
514
521
  | `outerlayer emit artifact <file> --caption <text> [--for <criterion-id>] [--pr <n>]` | Upload a proof artifact — screenshot, recording, report, or log — with its caption. Inside a recorded session it spools locally and ships on the next `sync`; otherwise it uploads immediately, anchored to a pull request or the current checkout. `--replaces` retires artifacts an earlier run uploaded. A JUnit XML file bound with `--for` proves a criterion that declares `test` proof; `--test <name[=path:line]>` binds only the named tests. |
515
- | `outerlayer emit demo <manifest> [--compare <manifest>] [--no-narration] [--item <n>] [--pr <n>] [--replaces <record id>]` | Turn a recorded video and its manifest (written by `@outerlayer/playwright`) into a narrated demo: one WebM clip for each chapter, emitted as a video artifact. A chapter whose checks all passed is bound to its criterion. A chapter of a version 4 manifest may hold a screenshot frame, which its test marked with `demo.screenshot()`. The frame is stored as a screenshot of the chapter's criterion only when that criterion declares `screenshot` and every check passed; otherwise the command says why it stored none. The manifest is emitted as the demo record, with the test file a version 3 or 4 manifest names. With `--replaces <record id>`, the new demo retires the item's old demo. With `--compare`, a second run's stills are compared with the first run's, and each chapter reads `yes`, `no` or `not checked`. Needs `ffmpeg` and `ffprobe`, and `espeak-ng` unless `--no-narration`. Exit 1 means a chapter had a failed check. |
522
+ | `outerlayer demo record <file> [--config <file> --project <name>] [--base-url <url>] [--output-dir <dir>] [--no-voice]` | Record a demo script with the recorder and the Playwright release the CLI carries; the repository installs nothing. The script imports `test` and `expect` from `@outerlayer/playwright`. Prints the manifest's path. Exit 1 means the demo's test failed; its manifest is written all the same. |
523
+ | `outerlayer emit demo <manifest> [--compare <manifest>] [--no-narration] [--item <n>] [--pr <n>] [--replaces <record id>]` | Turn a recorded video and its manifest (written by the recorder that `outerlayer demo record` runs) into a narrated demo: one WebM clip for each chapter, emitted as a video artifact. A chapter whose checks all passed is bound to its criterion. A chapter of a version 4 manifest may hold a screenshot frame, which its test marked with `demo.screenshot()`. The frame is stored as a screenshot of the chapter's criterion only when that criterion declares `screenshot` and every check passed; otherwise the command says why it stored none. The manifest is emitted as the demo record, with the test file a version 3 or 4 manifest names. With `--replaces <record id>`, the new demo retires the item's old demo. With `--compare`, a second run's stills are compared with the first run's, and each chapter reads `yes`, `no` or `not checked`. Needs `ffmpeg` and `ffprobe`, and `espeak-ng` unless `--no-narration`. Exit 1 means a chapter had a failed check. |
516
524
  | `outerlayer emit <name> --result <pass\|fail> [--link <url>] [--body <text>\|--body-file <path>] --item <number>` | Record one named check's outcome on a work item. A check that ran carries the run URL as its proof (`--link`); a judgment you are making yourself carries one sentence (`--body`, or `--body-file` to read it from a file — `-` reads standard input). A `fail` needs at least one of the two; a `pass` needs neither. `--item` names the work item by the number printed when the item was created — always required, in or out of a recorded session; a session records checks on its own item like any other, stored as the session's, but cannot clear a person's fail. Prints the recorded check's id. Who recorded it comes from your API key, never from what you send. |
517
525
  | `outerlayer work comment --item <n> [--criterion <id>] --body <text> [--artifact <id>] [--pass\|--fail\|--attach\|--ready]` | Post one comment on a work item's general thread, or on one acceptance criterion's own thread with `--criterion`. `--pass`/`--fail` need a person's own credential and apply to the whole item, so they work on the general thread only and the gateway refuses them with `--criterion`; `--attach` makes the named artifact that criterion's current proof; `--ready` hands a thread back to a person. The detected session id rides along automatically, only ever narrowing what the comment may do. |
518
526
  | `outerlayer work stop --item <n> [--note <text>]` | Ask the host that holds the item's build to end it. The host reads the request at its next heartbeat and ends the build with outcome `stopped`, so the build may run a little longer. The item is not built again until a new build request. Needs `work.update`. Exits 1 when no host build is running for the item. |
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { KEY_PREFIX, TAG_HOST, buildRepositoryImage, metadataFromLabels, prepareImageBuild, writeRecord } from './chunk-XHZBLIB2.js';
4
- export { RecipeError } from './chunk-XYLHSCLR.js';
3
+ export { KEY_PREFIX, TAG_HOST, buildRepositoryImage, metadataFromLabels, prepareImageBuild, writeRecord } from './chunk-XDJ376OP.js';
4
+ import './chunk-KOZ6IBEI.js';
5
5
  import './chunk-4UPET3R7.js';
6
+ export { RecipeError } from './chunk-HDLON3RJ.js';
6
7
  import './chunk-LQHCNXPK.js';
7
8
  import './chunk-JBJTC3UU.js';
8
9
  import './chunk-L5VHGRQE.js';
@@ -1,8 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { DEFAULT_BUILD_DISK, DEFAULT_CACHE_DISK, DOCKER_CACHE_MS, allocatedBytes, checkDiskFit, realBuildDiskProbe, runDocker, volumeBytes } from './chunk-3HJMY3H5.js';
4
- import './chunk-XYLHSCLR.js';
3
+ export { DEFAULT_BUILD_DISK, DEFAULT_CACHE_DISK, DOCKER_CACHE_MS, allocatedBytes, checkDiskFit, realBuildDiskProbe, runDocker, volumeBytes } from './chunk-6NXBXWOP.js';
4
+ import './chunk-KOZ6IBEI.js';
5
5
  import './chunk-4UPET3R7.js';
6
+ import './chunk-HDLON3RJ.js';
6
7
  import './chunk-L5VHGRQE.js';
7
8
  import './chunk-OOD5NDQA.js';
8
9
  import './chunk-DINRXUQA.js';
@@ -1 +1 @@
1
- {"id":"2026-10-26T21:57:47.670Z+29e8182","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-26T23:08:41.174Z+58e3fae","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,7 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-XYLHSCLR.js';
3
+ export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-KOZ6IBEI.js';
4
4
  import './chunk-4UPET3R7.js';
5
+ import './chunk-HDLON3RJ.js';
5
6
  import './chunk-L5VHGRQE.js';
6
7
  import './chunk-OOD5NDQA.js';
7
8
  import './chunk-DINRXUQA.js';
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-FVF2LMVG.js';
3
+ import { probeCredentials } from './chunk-IZVDQXTC.js';
4
4
  import './chunk-3JVYMD4G.js';
5
- import './chunk-RNMCFAYH.js';
5
+ import './chunk-F5H3LVHR.js';
6
6
  import './chunk-E7R2GIAW.js';
7
7
  import './chunk-MH6QLXUO.js';
8
8
  import './chunk-HOUFCUMH.js';
9
- import './chunk-5ZBVKRDK.js';
9
+ import './chunk-PN7RMFPP.js';
10
10
  import './chunk-TS3EFB7S.js';
11
- import './chunk-JKLSQOYO.js';
12
- import './chunk-ZVB57WI6.js';
11
+ import './chunk-TGBST2QL.js';
13
12
  import './chunk-6CK2OC4Q.js';
13
+ import './chunk-ZVB57WI6.js';
14
14
  import './chunk-P3NPTFLF.js';
15
15
  import './chunk-I3LTIAOR.js';
16
16
  import './chunk-WBTPI5MP.js';
@@ -18,26 +18,27 @@ import './chunk-QRJIBTNQ.js';
18
18
  import './chunk-7DK2FOZ4.js';
19
19
  import './chunk-ESVW4MJY.js';
20
20
  import './chunk-CFFVCI2I.js';
21
- import { managedProblems, managedFactsOf } from './chunk-ZADRW2V2.js';
21
+ import { managedProblems, managedFactsOf } from './chunk-XLJXO4QC.js';
22
22
  import './chunk-YL3RWW7X.js';
23
23
  import './chunk-TBT347UY.js';
24
- import { findServiceUnit } from './chunk-LY62UHRR.js';
24
+ import { findServiceUnit } from './chunk-JZLMFYFM.js';
25
25
  import './chunk-TZMDRHWB.js';
26
- import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, HELPER_ENV, helperSocketPath, probeHelper, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-3PUOHONX.js';
26
+ import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, HELPER_ENV, helperSocketPath, probeHelper, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-DFBY6LX3.js';
27
27
  import './chunk-2PGI6RDE.js';
28
- import './chunk-XHZBLIB2.js';
28
+ import './chunk-XDJ376OP.js';
29
29
  import './chunk-OGFGZQA3.js';
30
30
  import './chunk-3VZTNXK5.js';
31
31
  import './chunk-6KFJIU73.js';
32
32
  import './chunk-77VBS2RT.js';
33
33
  import './chunk-SDELQEG4.js';
34
34
  import './chunk-TQMI335S.js';
35
- import './chunk-T2HH7IHT.js';
36
- import './chunk-3NCWHEGM.js';
37
- import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-BQQPDBSF.js';
38
- import './chunk-3HJMY3H5.js';
39
- import './chunk-XYLHSCLR.js';
35
+ import './chunk-63A6NUEZ.js';
36
+ import './chunk-TLIZ7FY4.js';
37
+ import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-Q3L5AC75.js';
38
+ import './chunk-6NXBXWOP.js';
39
+ import './chunk-KOZ6IBEI.js';
40
40
  import './chunk-4UPET3R7.js';
41
+ import './chunk-HDLON3RJ.js';
41
42
  import './chunk-LQHCNXPK.js';
42
43
  import './chunk-JBJTC3UU.js';
43
44
  import './chunk-KT4CN6OU.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { DEFAULT_UNIT_NAME } from './chunk-3NCWHEGM.js';
3
+ import { DEFAULT_UNIT_NAME } from './chunk-TLIZ7FY4.js';
4
4
  import { RUNNER_FILE_MODE } from './chunk-GJ4KBHBD.js';
5
5
  import { claudeEnvPath, withoutCredentialLines, parseRunnerEnv } from './chunk-SDAEXUIX.js';
6
6
  import { existsSync, readFileSync, writeFileSync, renameSync, rmSync } from 'fs';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { parseSize, BUILD_LABEL, RUNNER_LABEL, runnerLabelValue } from './chunk-XYLHSCLR.js';
3
+ import { parseSize, BUILD_LABEL, RUNNER_LABEL, runnerLabelValue } from './chunk-KOZ6IBEI.js';
4
4
  import { buildsDir, rootfsDir, runnerDir, imagesDir, builderCacheDiskPath } from './chunk-GJ4KBHBD.js';
5
5
  import { spawnSync } from 'child_process';
6
6
  import { statfsSync, statSync, existsSync, readdirSync } from 'fs';
@@ -1,17 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { sha256OfFile, downloadPinned, VoiceDownloadError } from './chunk-2PGI6RDE.js';
4
- import { readDefaultBranchHead, cloneRepository, buildRepositoryImage, prepareImageBuild, KEY_PREFIX, FETCHED_DIR, toolsDockerfile, TAG_HOST, metadataFromLabels, writeRecord, FETCHED_FFMPEG, FETCHED_GH, FETCHED_TINI, FETCHED_VOICE_DIR } from './chunk-XHZBLIB2.js';
4
+ import { readDefaultBranchHead, cloneRepository, buildRepositoryImage, prepareImageBuild, KEY_PREFIX, FETCHED_DIR, toolsDockerfile, TAG_HOST, metadataFromLabels, writeRecord, FETCHED_FFMPEG, FETCHED_GH, FETCHED_TINI, FETCHED_VOICE_DIR } from './chunk-XDJ376OP.js';
5
5
  import { currentCliBuild } from './chunk-OGFGZQA3.js';
6
6
  import { runExec, execCapture, waitForAgent } from './chunk-3VZTNXK5.js';
7
7
  import { GUEST_CID, linkVsockSockets } from './chunk-6KFJIU73.js';
8
8
  import { retrySend, describeCallFailure, keepStagedContext, controlPlaneTokenFailure, refusalCode, resolveGoverningSource, prefetchGovernedContext, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, shimScript, WORKFLOW_PERMISSION_REASON } from './chunk-77VBS2RT.js';
9
9
  import { runnerImageVersion } from './chunk-SDELQEG4.js';
10
- import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-T2HH7IHT.js';
11
- import { runnerCredentialProblem, builtinKind, allowHostProblem, hostAllowed } from './chunk-BQQPDBSF.js';
12
- import { formatBytes, allocatedBytes } from './chunk-3HJMY3H5.js';
13
- import { createDockerHost, builderSpec, RecipeError, DOCKER_FEATURE, runnerLabelValue, RUNNER_LABEL, BUILD_LABEL, prepareRunArgs, containerRunArgs, HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, containerExecArgs, childEnvironment, readDu, JUDGE_DIR, MAX_ITEMS_BYTES, JUDGE_ITEMS, MAX_REPORT_BYTES, JUDGE_REPORT, spawnRun, writeSanitizedRecipe, classifyProperties } from './chunk-XYLHSCLR.js';
10
+ import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-63A6NUEZ.js';
11
+ import { runnerCredentialProblem, builtinKind, allowHostProblem, hostAllowed } from './chunk-Q3L5AC75.js';
12
+ import { formatBytes, allocatedBytes } from './chunk-6NXBXWOP.js';
13
+ import { createDockerHost, builderSpec, runnerLabelValue, RUNNER_LABEL, BUILD_LABEL, prepareRunArgs, containerRunArgs, HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, containerExecArgs, childEnvironment, readDu, JUDGE_DIR, MAX_ITEMS_BYTES, JUDGE_ITEMS, MAX_REPORT_BYTES, JUDGE_REPORT, spawnRun } from './chunk-KOZ6IBEI.js';
14
14
  import { firecrackerArch, MICROVM_ARCHES, FIRECRACKER_VERSION, hostHelperPinned, CLAUDE_CODE_VERSION, builderDiskPinned, guestAssetsPinned, GUEST_HELPER_SHA256, GUEST_ASSETS_BASE_URL, GUEST_KERNEL_SHA256, JAILER_BINARY_SHA256, FIRECRACKER_BINARY_SHA256, FIRECRACKER_SHA256, GUEST_ASSETS_VERSION, BUILDER_DISK_VERSION, FFMPEG_STATIC, FFMPEG_BUILD_TAG, GH_SHA256, GH_VERSION, TINI_SHA256, TINI_VERSION, VOICE_PACK_FILES, BUILDER_DISK_SHA256, BUILDER_DISK_BASE_URL, DEFAULT_BASE_IMAGE } from './chunk-4UPET3R7.js';
15
+ import { RecipeError, DOCKER_FEATURE, writeSanitizedRecipe, classifyProperties } from './chunk-HDLON3RJ.js';
15
16
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
16
17
  import { postJson, WorkCommandError, getJson } from './chunk-QABXXQ67.js';
17
18
  import { sanitizeTerminal } from './chunk-IXPH4EXK.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { scrubReason, stripTerminalControls } from './chunk-JKLSQOYO.js';
4
- import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-3NCWHEGM.js';
3
+ import { scrubReason, stripTerminalControls } from './chunk-TGBST2QL.js';
4
+ import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-TLIZ7FY4.js';
5
5
  import { RunnerAlreadyRunningError, readPidFile } from './chunk-LQHCNXPK.js';
6
6
  import { isSameProcess } from './chunk-JBJTC3UU.js';
7
7
  import { isSignatureRefusal, postJson } from './chunk-QABXXQ67.js';
@@ -0,0 +1,274 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { existsSync, readdirSync, readFileSync, lstatSync, realpathSync, writeFileSync } from 'fs';
4
+ import { join, resolve, relative, dirname, sep, basename } from 'path';
5
+ import { createRequire as createRequire$1 } from 'module';
6
+ import { fileURLToPath } from 'url';
7
+
8
+ createRequire(import.meta.url);
9
+
10
+ // src/runner/image/properties.ts
11
+ var LIFECYCLE = ["onCreateCommand", "updateContentCommand", "postCreateCommand", "postStartCommand"];
12
+ var HONOURED = ["image", "build", "features", "containerEnv", "remoteUser", ...LIFECYCLE];
13
+ var IGNORED_BUILD_KEYS = ["options"];
14
+ var HOST_REFERENCE = /\$\{(?:localEnv|env)[:}]/;
15
+ var DROP = /* @__PURE__ */ Symbol("drop");
16
+ function isHonoured(property) {
17
+ return HONOURED.includes(property);
18
+ }
19
+ function isObject(value) {
20
+ return typeof value === "object" && value !== null && !Array.isArray(value);
21
+ }
22
+ function featureName(id) {
23
+ const slash = id.lastIndexOf("/");
24
+ const cut = id.slice(slash + 1).search(/[:@]/);
25
+ return cut === -1 ? id : id.slice(0, slash + 1 + cut);
26
+ }
27
+ var DOCKER_FEATURE = "ghcr.io/devcontainers/features/docker-in-docker";
28
+ function asksForDocker(recipe, metadata) {
29
+ const isDocker = (id) => featureName(id) === DOCKER_FEATURE;
30
+ if (isObject(recipe.features) && Object.keys(recipe.features).some(isDocker)) return true;
31
+ return metadata.some((entry) => typeof entry.id === "string" && isDocker(entry.id));
32
+ }
33
+ function sameValue(a, b) {
34
+ return JSON.stringify(a) === JSON.stringify(b);
35
+ }
36
+ function isFilesOwnEntry(entry, recipe) {
37
+ if (typeof entry.id === "string") return false;
38
+ const keys = Object.keys(entry);
39
+ return keys.length > 0 && keys.every((key) => key in recipe && sameValue(entry[key], recipe[key]));
40
+ }
41
+ function withoutHostReferences(value, path, dropped) {
42
+ if (typeof value === "string") {
43
+ if (!HOST_REFERENCE.test(value)) return value;
44
+ dropped.push(path);
45
+ return DROP;
46
+ }
47
+ if (Array.isArray(value)) {
48
+ if (!HOST_REFERENCE.test(JSON.stringify(value))) return value;
49
+ dropped.push(path);
50
+ return DROP;
51
+ }
52
+ if (isObject(value)) {
53
+ const kept = {};
54
+ for (const [key, item] of Object.entries(value)) {
55
+ if (HOST_REFERENCE.test(key)) {
56
+ dropped.push(`${path}.${key}`);
57
+ continue;
58
+ }
59
+ const clean = withoutHostReferences(item, `${path}.${key}`, dropped);
60
+ if (clean !== DROP) kept[key] = clean;
61
+ }
62
+ return kept;
63
+ }
64
+ return value;
65
+ }
66
+ function honouredWithoutHostReferences(entry) {
67
+ const kept = {};
68
+ const dropped = [];
69
+ for (const property of HONOURED) {
70
+ if (!(property in entry)) continue;
71
+ const value = entry[property];
72
+ const clean = withoutHostReferences(
73
+ property === "build" && isObject(value) ? withoutIgnoredBuildKeys(value) : value,
74
+ property,
75
+ dropped
76
+ );
77
+ if (clean !== DROP) kept[property] = clean;
78
+ }
79
+ return { kept, dropped };
80
+ }
81
+ function withoutIgnoredBuildKeys(build) {
82
+ return Object.fromEntries(Object.entries(build).filter(([key]) => !IGNORED_BUILD_KEYS.includes(key)));
83
+ }
84
+ function ignoredIn(entry, source) {
85
+ const found = [];
86
+ for (const property of Object.keys(entry)) {
87
+ if (property === "id" || property.startsWith("$") || isHonoured(property)) continue;
88
+ found.push({ property, source });
89
+ }
90
+ if (isObject(entry.build)) {
91
+ for (const key of IGNORED_BUILD_KEYS) {
92
+ if (key in entry.build) found.push({ property: `build.${key}`, source });
93
+ }
94
+ }
95
+ for (const property of honouredWithoutHostReferences(entry).dropped) found.push({ property, source });
96
+ return found;
97
+ }
98
+ function emptyApply() {
99
+ return { containerEnv: {}, lifecycle: { onCreateCommand: [], updateContentCommand: [], postCreateCommand: [], postStartCommand: [] } };
100
+ }
101
+ function applyEntry(apply, raw, source) {
102
+ const entry = honouredWithoutHostReferences(raw).kept;
103
+ if (typeof entry.remoteUser === "string") apply.remoteUser = entry.remoteUser;
104
+ if (isObject(entry.containerEnv)) {
105
+ for (const [key, value] of Object.entries(entry.containerEnv)) {
106
+ if (typeof value === "string") apply.containerEnv[key] = value;
107
+ }
108
+ }
109
+ for (const name of LIFECYCLE) {
110
+ if (entry[name] !== void 0) apply.lifecycle[name].push({ source, command: entry[name] });
111
+ }
112
+ }
113
+ function classifyProperties(recipe, metadata) {
114
+ const ignored = ignoredIn(recipe, "file");
115
+ const apply = emptyApply();
116
+ let fileApplied = false;
117
+ const sanitized = sanitizeRecipe(recipe);
118
+ for (const entry of metadata) {
119
+ if (isFilesOwnEntry(entry, sanitized)) {
120
+ applyEntry(apply, entry, "file");
121
+ fileApplied = true;
122
+ continue;
123
+ }
124
+ const source = typeof entry.id === "string" ? `feature ${featureName(entry.id)}` : "image label";
125
+ ignored.push(...ignoredIn(entry, source));
126
+ applyEntry(apply, entry, source);
127
+ }
128
+ if (!fileApplied) applyEntry(apply, recipe, "file");
129
+ return { docker: asksForDocker(recipe, metadata), honoured: HONOURED.filter((property) => property in recipe), ignored, apply };
130
+ }
131
+ function sanitizeRecipe(recipe) {
132
+ return honouredWithoutHostReferences(recipe).kept;
133
+ }
134
+ var RecipeError = class extends Error {
135
+ constructor(code, message, logPath) {
136
+ super(message);
137
+ this.code = code;
138
+ this.logPath = logPath;
139
+ }
140
+ };
141
+ var DIR_RECIPE = ".devcontainer/devcontainer.json";
142
+ var ROOT_RECIPE = ".devcontainer.json";
143
+ function locateRecipe(checkoutDir) {
144
+ if (existsSync(join(checkoutDir, DIR_RECIPE))) return { kind: "file", path: DIR_RECIPE };
145
+ if (existsSync(join(checkoutDir, ROOT_RECIPE))) return { kind: "file", path: ROOT_RECIPE };
146
+ const named = namedConfigurations(checkoutDir);
147
+ if (named.length > 0) {
148
+ throw new RecipeError(
149
+ "recipe_ambiguous",
150
+ `the repository has only named devcontainer configurations (${named.join(", ")}); add ${DIR_RECIPE} so the runner knows which to build`
151
+ );
152
+ }
153
+ return { kind: "default" };
154
+ }
155
+ function namedConfigurations(checkoutDir) {
156
+ const dir = join(checkoutDir, ".devcontainer");
157
+ if (!existsSync(dir)) return [];
158
+ return readdirSync(dir).sort().map((entry) => `.devcontainer/${entry}/devcontainer.json`).filter((path) => existsSync(join(checkoutDir, path)));
159
+ }
160
+ var COMMENTS = /("(?:[^"\\]|\\.)*")|\/\/[^\n]*|\/\*[\s\S]*?(?:\*\/|$)/g;
161
+ var TRAILING_COMMAS = /("(?:[^"\\]|\\.)*")|,(\s*[}\]])/g;
162
+ function parseJsonc(text) {
163
+ const withoutComments = text.replace(COMMENTS, (_match, str) => str ?? "");
164
+ return JSON.parse(withoutComments.replace(TRAILING_COMMAS, (_match, str, close) => str ?? close ?? ""));
165
+ }
166
+ function readRecipe(checkoutDir, location) {
167
+ if (location.kind === "default") return {};
168
+ const parsed = parseJsonc(readFileSync(join(checkoutDir, location.path), "utf8"));
169
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
170
+ throw new Error(`${location.path} is not a JSON object`);
171
+ }
172
+ return parsed;
173
+ }
174
+ function within(dir, path) {
175
+ const rel = relative(dir, path);
176
+ return rel !== ".." && !rel.startsWith(`..${sep}`);
177
+ }
178
+ function realish(path) {
179
+ let existing = path;
180
+ let rest = "";
181
+ while (!existsSync(existing)) {
182
+ rest = join(basename(existing), rest);
183
+ existing = dirname(existing);
184
+ }
185
+ return join(realpathSync(existing), rest);
186
+ }
187
+ function assertBuildable(checkoutDir, location, recipe) {
188
+ if (location.kind === "default") return;
189
+ const devcontainerDir = join(checkoutDir, ".devcontainer");
190
+ if (existsSync(devcontainerDir) && lstatSync(devcontainerDir).isSymbolicLink()) {
191
+ throw new RecipeError(
192
+ "recipe_context_outside",
193
+ ".devcontainer is a symbolic link, so the build could read files outside the repository; commit a real directory"
194
+ );
195
+ }
196
+ if (recipe.dockerComposeFile !== void 0) {
197
+ throw new RecipeError(
198
+ "recipe_needs_docker",
199
+ "the recipe uses dockerComposeFile; its services need Docker, which a container build does not have"
200
+ );
201
+ }
202
+ const build = recipe.build;
203
+ if (typeof build !== "object" || build === null) return;
204
+ const { dockerfile, context } = build;
205
+ const base = resolve(checkoutDir, location.path, "..");
206
+ const allowed = join(realpathSync(checkoutDir), ".devcontainer");
207
+ const contextPath = resolve(base, typeof context === "string" ? context : ".");
208
+ const paths = [contextPath];
209
+ if (typeof dockerfile === "string") paths.push(resolve(base, dockerfile));
210
+ for (const path of paths) {
211
+ if (!within(devcontainerDir, path) || !within(allowed, realish(path))) {
212
+ throw new RecipeError(
213
+ "recipe_context_outside",
214
+ `the recipe's build reads ${relative(checkoutDir, path) || "."}, outside .devcontainer/; move the build files into .devcontainer/`
215
+ );
216
+ }
217
+ }
218
+ }
219
+ function writeSanitizedRecipe(checkoutDir, location, recipe) {
220
+ if (location.kind === "default") throw new Error("the default image has no recipe to sanitize");
221
+ const path = location.path === ROOT_RECIPE ? join(checkoutDir, ".outerlayer-recipe.json") : join(checkoutDir, ".devcontainer", SANITIZED_NAME);
222
+ writeFileSync(path, `${JSON.stringify(sanitizeRecipe(recipe), null, 2)}
223
+ `);
224
+ return path;
225
+ }
226
+ var SANITIZED_NAME = "outerlayer-recipe.json";
227
+ var PACKAGE = "@devcontainers/cli";
228
+ function buildRootFromDist(moduleDir = dirname(fileURLToPath(import.meta.url))) {
229
+ try {
230
+ const info = JSON.parse(readFileSync(join(moduleDir, "build-info.json"), "utf8"));
231
+ return typeof info.root === "string" ? info.root : void 0;
232
+ } catch {
233
+ return void 0;
234
+ }
235
+ }
236
+ function resolveDevcontainerCli(opts = {}) {
237
+ const resolve2 = opts.resolve ?? createRequire$1(import.meta.url).resolve;
238
+ try {
239
+ const bin = join(dirname(resolve2(`${PACKAGE}/package.json`)), "devcontainer.js");
240
+ if (existsSync(bin)) return { command: process.execPath, args: [bin] };
241
+ } catch {
242
+ }
243
+ const buildRoot = opts.buildRoot ?? buildRootFromDist();
244
+ const fallback = buildRoot === void 0 ? void 0 : join(buildRoot, "node_modules", PACKAGE);
245
+ if (fallback !== void 0 && existsSync(join(fallback, "devcontainer.js"))) {
246
+ return { command: process.execPath, args: [join(fallback, "devcontainer.js")] };
247
+ }
248
+ throw new RecipeError(
249
+ "devcontainer_cli_missing",
250
+ `the devcontainer CLI is not installed: looked beside this package and in ${fallback ?? "the checkout this build came from (unknown)"}. Run yarn install in that checkout.`
251
+ );
252
+ }
253
+ function devcontainerBuildInvocation(cli, req) {
254
+ return {
255
+ command: cli.command,
256
+ args: [
257
+ ...cli.args,
258
+ "build",
259
+ "--workspace-folder",
260
+ req.workspace,
261
+ "--config",
262
+ req.config,
263
+ "--image-name",
264
+ req.imageName,
265
+ ...Object.entries(req.labels).flatMap(([key, value]) => ["--label", `${key}=${value}`]),
266
+ "--log-format",
267
+ "text",
268
+ // Written as an OCI layout instead of loaded into Docker: the runner's builder cannot read Docker's image store, so the next layer starts FROM the layout.
269
+ ...req.layoutOut === void 0 ? [] : ["--output", `type=oci,dest=${req.layoutOut},tar=false`]
270
+ ]
271
+ };
272
+ }
273
+
274
+ export { DOCKER_FEATURE, RecipeError, SANITIZED_NAME, assertBuildable, buildRootFromDist, classifyProperties, devcontainerBuildInvocation, locateRecipe, readRecipe, resolveDevcontainerCli, writeSanitizedRecipe };
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
4
- import { reportFailedStart, fitImageBuildMemory } from './chunk-RNMCFAYH.js';
4
+ import { reportFailedStart, fitImageBuildMemory } from './chunk-F5H3LVHR.js';
5
5
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-E7R2GIAW.js';
6
6
  import { RUNNER_PROTOCOL } from './chunk-MH6QLXUO.js';
7
7
  import { writePendingUpdate } from './chunk-HOUFCUMH.js';
8
- import { renderUpdateSteps } from './chunk-5ZBVKRDK.js';
8
+ import { renderUpdateSteps } from './chunk-PN7RMFPP.js';
9
9
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-TS3EFB7S.js';
10
- import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, readProvisionOut, workdirProblem, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, startSender, finishJob, sampleGuest, foldSample, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, GUEST_USAGE_INTERVAL_MS, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-JKLSQOYO.js';
10
+ import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, readProvisionOut, workdirProblem, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, startSender, finishJob, sampleGuest, foldSample, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, GUEST_USAGE_INTERVAL_MS, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-TGBST2QL.js';
11
11
  import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
12
- import { realBlockedProbes, checkBlockedWithSlots, largeBuildMemoryBytes, LARGE_BUILD_DISK_BYTES, checkManagedRoom, sliceMemoryOf } from './chunk-ZADRW2V2.js';
12
+ import { realBlockedProbes, checkBlockedWithSlots, largeBuildMemoryBytes, LARGE_BUILD_DISK_BYTES, checkManagedRoom, sliceMemoryOf } from './chunk-XLJXO4QC.js';
13
13
  import { writeMarker, readMarker, currentVersion, removeMarker, isInLayout, startedThroughCurrent, entryIn, versionDir, switchCurrent, cleanVersions, stagingDir } from './chunk-YL3RWW7X.js';
14
14
  import { RepoFilter } from './chunk-TBT347UY.js';
15
- import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, attemptNote, fetchManagedClaudeKey, holdManagedClaudeKey, fetchManagedBuildSettings, holdManagedBuildSettings, needsBuildSkill, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, provisionEnvironment, resolveHostBuild, listenOnBroker, hostEnvironment, deliverExecMaven, runWithSpawn, hostCommandEnvironment, lifecycleSteps, execArgv, lifecycleFailureReason, decideHostBuildSkill, prepareBranch, currentSkillCommand, formerSkillProblem, containerCommandExec, execCommandLine, startHostServices, setUpRunnerCgroup, sweepImageBuilders, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, managedBuildSettingsFor, ADOPTED_FETCH_RETRY_WINDOW_MS, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-3PUOHONX.js';
15
+ import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, attemptNote, fetchManagedClaudeKey, holdManagedClaudeKey, fetchManagedBuildSettings, holdManagedBuildSettings, needsBuildSkill, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, provisionEnvironment, resolveHostBuild, listenOnBroker, hostEnvironment, deliverExecMaven, runWithSpawn, hostCommandEnvironment, lifecycleSteps, execArgv, lifecycleFailureReason, decideHostBuildSkill, prepareBranch, currentSkillCommand, formerSkillProblem, containerCommandExec, execCommandLine, startHostServices, setUpRunnerCgroup, sweepImageBuilders, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, managedBuildSettingsFor, ADOPTED_FETCH_RETRY_WINDOW_MS, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-DFBY6LX3.js';
16
16
  import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, resolveGoverningSource, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-77VBS2RT.js';
17
17
  import { imageTag, writeUpdateStatus, pullInstruction, tagToPull } from './chunk-SDELQEG4.js';
18
18
  import { isVersion, compareVersions, satisfiesRange } from './chunk-TQMI335S.js';
19
- import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, keepsHostBuilder, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-BQQPDBSF.js';
20
- import { freeBytes, formatBytes, allocatedBytes, volumeBytes } from './chunk-3HJMY3H5.js';
21
- import { writeJobFile, ensureRunnerIdentity, identityDockerFor, readJobFile, exceedsDisk, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, RUNNER_LABEL, BUILD_LABEL, readJobFileChecked } from './chunk-XYLHSCLR.js';
19
+ import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, keepsHostBuilder, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-Q3L5AC75.js';
20
+ import { freeBytes, formatBytes, allocatedBytes, volumeBytes } from './chunk-6NXBXWOP.js';
21
+ import { writeJobFile, ensureRunnerIdentity, identityDockerFor, readJobFile, exceedsDisk, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, RUNNER_LABEL, BUILD_LABEL, readJobFileChecked } from './chunk-KOZ6IBEI.js';
22
22
  import { claimPidFile, writePidFile, readPidFile, releasePidFile } from './chunk-LQHCNXPK.js';
23
23
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
24
24
  import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-QABXXQ67.js';
@@ -3279,7 +3279,7 @@ async function startRunner(configPath, deps, startup) {
3279
3279
  check: update.check ? () => update.check(configPath) : async () => {
3280
3280
  const held = heldClaudeCredential();
3281
3281
  const env = held === void 0 ? process.env : { ...process.env, [held.variable]: held.value };
3282
- return (await import('./check-FOWN6M3C.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
3282
+ return (await import('./check-V66LZDNK.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
3283
3283
  },
3284
3284
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
3285
3285
  log
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { escapeUnitPath, UNIT_MARKER, DEFAULT_UNIT_NAME } from './chunk-3NCWHEGM.js';
3
+ import { escapeUnitPath, UNIT_MARKER, DEFAULT_UNIT_NAME } from './chunk-TLIZ7FY4.js';
4
4
  import { inspectService, realInspectProbes } from './chunk-SDAEXUIX.js';
5
5
  import { realpathSync, readFileSync, readdirSync } from 'fs';
6
6
  import { resolve, dirname, join } from 'path';