@outerlayer/cli 0.33.0-next.20261023002325 → 0.33.0-next.20261023030517

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 (114) hide show
  1. package/README.md +9 -3
  2. package/dist/{agent-setup-55ZDEXCS.js → agent-setup-APFM4MZ4.js} +10 -10
  3. package/dist/{artifact-link-cmd-6FF2Y6QI.js → artifact-link-cmd-IHHMU4EA.js} +2 -2
  4. package/dist/{build-G4GUF6LT.js → build-SEAQVLD5.js} +2 -2
  5. package/dist/build-disk-55M4ZMDX.js +16 -0
  6. package/dist/build-info.json +1 -1
  7. package/dist/{builder-3CUKTVSY.js → builder-DQZCPB7J.js} +4 -5
  8. package/dist/{check-64FD5G3X.js → check-AEMFDR55.js} +30 -32
  9. package/dist/{chunk-EUVE2EAE.js → chunk-2WZ66FXA.js} +3 -3
  10. package/dist/{chunk-BJQ25STI.js → chunk-35DSTT37.js} +4 -4
  11. package/dist/{chunk-Q2CMEQV7.js → chunk-4NKHOCTF.js} +3 -3
  12. package/dist/{chunk-VT4TTJPG.js → chunk-5FSVA3CO.js} +5 -5
  13. package/dist/{chunk-CANYZTD5.js → chunk-67KCGRKA.js} +44 -17
  14. package/dist/{chunk-HXA5GIHK.js → chunk-6ANIBEQ6.js} +6 -6
  15. package/dist/{chunk-AVTI3FL5.js → chunk-6ZLI652Y.js} +1 -1
  16. package/dist/{chunk-LYE3KB6L.js → chunk-7HZH5D7H.js} +2 -2
  17. package/dist/{chunk-6Z4SZHV2.js → chunk-A5FFANL7.js} +5 -5
  18. package/dist/{chunk-DGI66PGY.js → chunk-AXIK6F52.js} +39 -279
  19. package/dist/{chunk-QFQC5K4J.js → chunk-B6WW6AKO.js} +33 -21
  20. package/dist/{chunk-ULBNTSAD.js → chunk-C66Q2CLW.js} +2 -2
  21. package/dist/{chunk-UIUGTW5C.js → chunk-C7WGCI77.js} +2 -2
  22. package/dist/{chunk-B2JURP6A.js → chunk-CCOU4NXE.js} +2 -2
  23. package/dist/{chunk-SVDOA4W2.js → chunk-DHUHQPRQ.js} +7 -7
  24. package/dist/{chunk-EWVYQLD3.js → chunk-E4F7YE7P.js} +1 -1
  25. package/dist/chunk-ER6KQCVJ.js +18 -0
  26. package/dist/{chunk-JRZCRIEO.js → chunk-GFTWZSOW.js} +2887 -2567
  27. package/dist/{chunk-AU346ENF.js → chunk-HUBRTT2C.js} +4 -4
  28. package/dist/{chunk-QPWFVE3X.js → chunk-JB4R5IFJ.js} +2 -2
  29. package/dist/chunk-LHKWWEQZ.js +179 -0
  30. package/dist/{chunk-G63KT5I5.js → chunk-M24H6JQW.js} +1 -1
  31. package/dist/{chunk-XL2XWWU7.js → chunk-M3RYZRMH.js} +3 -3
  32. package/dist/{chunk-TGHBOXKJ.js → chunk-NE63JADS.js} +2 -2
  33. package/dist/{chunk-3DCB3GOV.js → chunk-ONUACB5C.js} +6 -4
  34. package/dist/{chunk-JHTJPQSL.js → chunk-PILHDNHX.js} +4 -4
  35. package/dist/{chunk-HJYBWJAS.js → chunk-PJI5D2XT.js} +2 -2
  36. package/dist/{chunk-LJG6EMLJ.js → chunk-PNIFQX73.js} +1 -1
  37. package/dist/{chunk-GFVDC5S3.js → chunk-QKEOAQ2W.js} +35 -4
  38. package/dist/{chunk-5DNCFOXA.js → chunk-QQXNS4G2.js} +1 -1
  39. package/dist/{chunk-OOCAF3ID.js → chunk-RLAKWXDK.js} +1 -1
  40. package/dist/{chunk-2N67C6IV.js → chunk-T4S2DVOA.js} +5 -5
  41. package/dist/{chunk-GFYEMCPP.js → chunk-T4TT76GG.js} +1 -1
  42. package/dist/{chunk-BKADJZ7F.js → chunk-UAJYWZ2F.js} +3 -3
  43. package/dist/{chunk-YERR22SY.js → chunk-UHFU3CBN.js} +1 -1
  44. package/dist/{chunk-E6CO3MJE.js → chunk-V7Q5OKN7.js} +12 -1
  45. package/dist/{chunk-2WMZPJVE.js → chunk-VJGQEASF.js} +4 -4
  46. package/dist/{chunk-NSPRS7WK.js → chunk-X37GC7DM.js} +1 -1
  47. package/dist/{chunk-LJUIG5K4.js → chunk-X62C7V4B.js} +13 -13
  48. package/dist/{chunk-DY7Y7UT4.js → chunk-XMPE5TT4.js} +2 -2
  49. package/dist/{chunk-JPG43G6Y.js → chunk-YXHKCHWG.js} +1 -1
  50. package/dist/{chunk-T5REPMNL.js → chunk-Z4GLZTDF.js} +2 -2
  51. package/dist/{claude-launcher-NTYHJUJM.js → claude-launcher-B55NWRH5.js} +5 -5
  52. package/dist/{cli-WKRURGHC.js → cli-5YT5EL2R.js} +147 -104
  53. package/dist/{command-WG54AUHK.js → command-DYLRDCGC.js} +21 -22
  54. package/dist/{config-LZSFW2O3.js → config-RRY7DIJG.js} +9 -2
  55. package/dist/{connect-cmd-P5GASVAF.js → connect-cmd-7C6W2SEP.js} +8 -8
  56. package/dist/{container-start-DQKFQ3CL.js → container-start-F7PBMTAL.js} +22 -23
  57. package/dist/{context-cleanup-BX5Y3AFL.js → context-cleanup-EKTPKJJT.js} +3 -3
  58. package/dist/{context-show-cmd-3EPJ7CJC.js → context-show-cmd-I5JC7EFH.js} +9 -9
  59. package/dist/{control-plane-launch-A3YCHQNQ.js → control-plane-launch-NOKM6CBH.js} +6 -6
  60. package/dist/{dist-ACTRIBVW.js → dist-LLYL5UCV.js} +2 -2
  61. package/dist/{docker-4ERXWTRW.js → docker-W7WWFZ3Q.js} +4 -5
  62. package/dist/{doctor-GRCEYJXA.js → doctor-LYOFFCQS.js} +29 -34
  63. package/dist/{emit-artifact-cmd-FDPJKGOO.js → emit-artifact-cmd-RO34UG7A.js} +13 -13
  64. package/dist/{emit-cmd-OX6LYS6I.js → emit-cmd-GY7Z26DY.js} +6 -6
  65. package/dist/{emit-criteria-cmd-3SVGCMJN.js → emit-criteria-cmd-Y36QCPAM.js} +10 -10
  66. package/dist/{emit-demo-cmd-JSVI56WY.js → emit-demo-cmd-YMWVF5U4.js} +105 -35
  67. package/dist/{emit-finding-cmd-TLJWBGQE.js → emit-finding-cmd-MH3ZWUNV.js} +10 -10
  68. package/dist/{emit-result-cmd-CJNVDV5V.js → emit-result-cmd-ZARZZZ3Y.js} +12 -12
  69. package/dist/{emit-step-cmd-347CZO7Y.js → emit-step-cmd-A6HQJDBY.js} +10 -10
  70. package/dist/{findings-cmd-LHTYEHYB.js → findings-cmd-OLLBWJXJ.js} +10 -10
  71. package/dist/{fleet-readiness-KGR5AC2J.js → fleet-readiness-VB5QSFSY.js} +8 -8
  72. package/dist/{governing-source-JZQZUTMA.js → governing-source-ZX7VXTOA.js} +13 -13
  73. package/dist/{hook-fast-6WDMNZG5.js → hook-fast-4RYMBFPO.js} +1 -1
  74. package/dist/index.js +4 -4
  75. package/dist/{init-OKJAI77M.js → init-BQCGL7UD.js} +21 -22
  76. package/dist/{init-WNO4NAO7.js → init-NCCMB2UE.js} +21 -22
  77. package/dist/{init-cmd-PFW4XTG7.js → init-cmd-OW2L5HTI.js} +18 -18
  78. package/dist/{init-update-X7YLZL6H.js → init-update-7LUMOECE.js} +17 -17
  79. package/dist/{install-GQUCHIGE.js → install-5BQ3TFBT.js} +9 -3
  80. package/dist/{layout-JGF7MJHG.js → layout-RGVPCX7Y.js} +4 -4
  81. package/dist/{login-browser-3RIZQJY2.js → login-browser-BC2Z5QKG.js} +2 -2
  82. package/dist/{loop-2SITCQ6H.js → loop-BU634Y6A.js} +30 -32
  83. package/dist/{machine-YHBCNRUO.js → machine-RI4KHRYP.js} +21 -22
  84. package/dist/{machine-skills-AGERT2HN.js → machine-skills-CS5HAQHF.js} +4 -4
  85. package/dist/{runner-env-QYE7KZFP.js → runner-env-QSLLOFNF.js} +10 -4
  86. package/dist/{runner-identity-FIHOECSH.js → runner-identity-DQAXW4DL.js} +4 -5
  87. package/dist/{runner-key-YUKU2MWK.js → runner-key-UWL475RU.js} +21 -22
  88. package/dist/{session-sender-7B3ZDWMC.js → session-sender-OGDUJ2KK.js} +13 -13
  89. package/dist/{spec-cmd-Q26NE22H.js → spec-cmd-WB4UOFPG.js} +11 -11
  90. package/dist/{starter-pack-UBEC5LTE.js → starter-pack-XHATFTO3.js} +5 -5
  91. package/dist/{status-VBQJMFEX.js → status-GFZFND6L.js} +26 -27
  92. package/dist/{sync-cmd-SSUYTMLJ.js → sync-cmd-GPZD2C45.js} +12 -12
  93. package/dist/{watch-L5NCO46E.js → watch-5I3GURXY.js} +12 -12
  94. package/dist/{work-claim-cmd-MFND6Z4S.js → work-claim-cmd-J52UVCAF.js} +17 -14
  95. package/dist/{work-cmd-W7WEHMQJ.js → work-cmd-PQZ5RYDB.js} +10 -10
  96. package/dist/{work-comment-cmd-SSUOGVDD.js → work-comment-cmd-WI6B3IOS.js} +10 -10
  97. package/dist/work-demo-cmd-3NDGSQKJ.js +62 -0
  98. package/dist/{work-logs-cmd-WPMWMDX6.js → work-logs-cmd-QCYZ5X5A.js} +10 -10
  99. package/dist/{work-open-pr-cmd-NO5YLOXD.js → work-open-pr-cmd-BRDF3ZKL.js} +11 -11
  100. package/dist/{work-pr-cmd-37B5KECR.js → work-pr-cmd-WY2TBAKW.js} +10 -10
  101. package/dist/work-proofs-cmd-R25HT6WP.js +111 -0
  102. package/dist/{work-stop-cmd-3BJLXUJ3.js → work-stop-cmd-C52JPZ4E.js} +10 -10
  103. package/package.json +1 -1
  104. package/skill-pack/maintained/outerlayer-amend/SKILL.md +36 -34
  105. package/skill-pack/maintained/outerlayer-amend/scripts/rerecord-demo.mjs +187 -0
  106. package/skill-pack/maintained/outerlayer-build/SKILL.md +7 -2
  107. package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +11 -2
  108. package/skill-pack/maintained/outerlayer-build/references/evidence.md +8 -0
  109. package/skill-pack/maintained/outerlayer-build/references/release.md +3 -2
  110. package/skill-pack/maintained/outerlayer-evidence/SKILL.md +6 -4
  111. package/dist/build-disk-3GL3KKEB.js +0 -18
  112. package/dist/chunk-XWFSAOC7.js +0 -111
  113. package/dist/chunk-YJLHUKYS.js +0 -38
  114. package/dist/chunk-YYYRBYWG.js +0 -32
package/README.md CHANGED
@@ -91,7 +91,10 @@ content:
91
91
  work item's general thread or a criterion thread — the detected session id
92
92
  rides along the same way it does for `emit`, only ever narrowing what the
93
93
  comment may do; `outerlayer work threads` reads them back. `outerlayer work logs`
94
- reads the runner's log for a host attempt. `outerlayer work stop` sends
94
+ reads the runner's log for a host attempt. `outerlayer work demo` reads an
95
+ item's newest demo record with `GET /v1/work-items/<n>/demo`.
96
+ `outerlayer work proofs` reads the item with `GET /v1/work-items/<n>` and
97
+ compares each proof with the head commit. `outerlayer work stop` sends
95
98
  `POST /v1/work-items/<n>/claim/stop` with the optional note, and the
96
99
  gateway records the request against the item's live host build. A runner
97
100
  key needs `git.read` and `work.read` to
@@ -375,7 +378,8 @@ content:
375
378
  or to the git checkout.
376
379
  - **`outerlayer emit demo <manifest>`** first reads the item's recorded
377
380
  criteria (`GET /v1/work-items/{number}`) to check the chapters' criterion
378
- ids. It cuts a recorded video once, from the first chapter's start to the
381
+ ids. With `--replaces <record id>`, it also reads the item's newest demo record
382
+ (`GET /v1/work-items/{number}/demo`) before it uploads anything. It cuts a recorded video once, from the first chapter's start to the
379
383
  last chapter's end, and emits it as one video artifact. It then emits a video
380
384
  artifact for each chapter with the same bytes and a time range in that video,
381
385
  followed by the manifest as the demo record. A recording over 8 MiB falls
@@ -482,10 +486,12 @@ before it gives up.
482
486
  | `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. |
483
487
  | `outerlayer hooks wrap` / `outerlayer hooks unwrap` | Auto-wrap (or undo wrapping) `PreToolUse`/`PostToolUse` hooks for execution evidence — one spawn per firing. |
484
488
  | `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. |
485
- | `outerlayer emit demo <manifest> [--compare <manifest>] [--no-narration] [--item <n>] [--pr <n>]` | 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. The manifest is emitted as the demo record. 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. |
489
+ | `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. The manifest is emitted as the demo record, with the test file a version 3 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. |
486
490
  | `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. |
487
491
  | `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. |
488
492
  | `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. |
493
+ | `outerlayer work proofs [--item <n>] [--json]` | Lists each criterion that declares a proof other than `test` as current, out of date or missing at the checkout's HEAD, or at the head of a linked pull request that is open or merged. Exits 0 when every proof is current, 1 when any is not, and 2 when it cannot tell. |
494
+ | `outerlayer work demo --item <n> [--json]` | Print the item's newest demo record: its artifact id, the commit it was recorded at and the test that recorded it. `--json` prints `{ "demo": null }` for an item with no demo. |
489
495
  | `outerlayer work logs --item <n> [--attempt <claim id>]` | Print the runner's log for a host attempt on a work item: the newest attempt a runner made, or the one `--attempt` names (an `id` from `claims` in `work status --json`). The log is what the runner did around the agent, with secrets removed on the host. Exits 1 for an attempt that is still running or that an older runner released without a log. |
490
496
  | `outerlayer work threads --item <n>` | Read a work item's threads back — the general thread first, then one per criterion with proof or a comment, each with its `waitingOn`. |
491
497
  | `outerlayer emit finding --id <id> --category <context\|flaky-test\|tooling\|environment\|defect\|other> --title <text> --file <path> --where <label> [--line <n>] [--item <number>] [--cause <text>] [--detail <text>] [--suggestion <text>] [--command <text>] [--error <text>] [--test <name>] [--symbol <name>] [--started-at <event> --ended-at <event>] [--problem <id> … --link-reason <text> \| --new] …` | Record one problem you hit in the factory. `--category` is one of `context` (an instruction that is wrong, broken or missing), `flaky-test`, `tooling`, `environment`, `defect` (a bug outside your own change) or `other`. A `context` finding also needs `--rule-path` and `--rule-relation` (`wrong`, `broken` or `missing`), and `--rule-quote` unless the relation is `missing`. `--cause`, `--detail`, `--suggestion`, `--command`, `--error` (the first error line), `--test` and `--symbol` carry what a fix needs. Every finding joins a factory-level problem: when a key of the finding matches a known problem it joins that problem; otherwise nothing is stored, the closest problems are printed, and the command exits with code 3. Run it again with `--problem <id> --link-reason <text>` (repeat `--problem` for each problem the finding reports) or with `--new`. Without `--started-at`, it prints the session's recent events with ids and times; name the event where you hit the problem and the one where you got past it with `--started-at` and `--ended-at`. Findings are informational; nothing reads one to pass or fail the work. `--item` names the work item; without it, inside a recorded session, the item that session was launched for is used automatically. Re-emitting the same `--id` on the item replaces that finding and keeps its problems. |
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { keepHandWritten, runAgentSetup } from './chunk-SVDOA4W2.js';
4
- import './chunk-JHTJPQSL.js';
3
+ export { keepHandWritten, runAgentSetup } from './chunk-DHUHQPRQ.js';
4
+ import './chunk-PILHDNHX.js';
5
5
  import './chunk-KT4CN6OU.js';
6
- import './chunk-DY7Y7UT4.js';
7
- import './chunk-HJYBWJAS.js';
6
+ import './chunk-XMPE5TT4.js';
7
+ import './chunk-PJI5D2XT.js';
8
8
  import './chunk-ANPNT6PM.js';
9
- import './chunk-EUVE2EAE.js';
10
- import './chunk-UIUGTW5C.js';
9
+ import './chunk-2WZ66FXA.js';
10
+ import './chunk-C7WGCI77.js';
11
11
  import './chunk-6RKD7YZ6.js';
12
12
  import './chunk-PJDQPF5N.js';
13
13
  import './chunk-SOI6K5DY.js';
@@ -15,16 +15,16 @@ import './chunk-PA6CK6WQ.js';
15
15
  import './chunk-BALIE3BA.js';
16
16
  import './chunk-ZJSNLVCE.js';
17
17
  import './chunk-BJ3KTMDH.js';
18
- import './chunk-G63KT5I5.js';
18
+ import './chunk-M24H6JQW.js';
19
19
  import './chunk-5BHIBJDA.js';
20
20
  import './chunk-CDDED64E.js';
21
21
  import './chunk-RA3O54FC.js';
22
22
  import './chunk-CRB3POP4.js';
23
- import './chunk-AVTI3FL5.js';
23
+ import './chunk-6ZLI652Y.js';
24
24
  import './chunk-YQR6E6OV.js';
25
25
  import './chunk-TUSYOL2O.js';
26
- import './chunk-LJG6EMLJ.js';
27
- import './chunk-E6CO3MJE.js';
26
+ import './chunk-PNIFQX73.js';
27
+ import './chunk-V7Q5OKN7.js';
28
28
  import './chunk-VNVZDWO3.js';
29
29
  import './chunk-HACGUL52.js';
30
30
  import './chunk-MESOOLF4.js';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { sanitizeTerminal, readEffectiveArtifactSpoolState } from './chunk-EWVYQLD3.js';
3
+ import { sanitizeTerminal, readEffectiveArtifactSpoolState } from './chunk-E4F7YE7P.js';
4
4
  import { cliInvocation } from './chunk-CRB3POP4.js';
5
- import './chunk-E6CO3MJE.js';
5
+ import './chunk-V7Q5OKN7.js';
6
6
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
7
7
  import './chunk-Z5GEFMRW.js';
8
8
 
@@ -1,10 +1,10 @@
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-JPG43G6Y.js';
3
+ export { KEY_PREFIX, TAG_HOST, buildRepositoryImage, metadataFromLabels, prepareImageBuild, writeRecord } from './chunk-YXHKCHWG.js';
4
4
  import './chunk-F5UL23I2.js';
5
5
  import './chunk-JBJTC3UU.js';
6
6
  export { RecipeError } from './chunk-3Z3MPR55.js';
7
- import './chunk-TGHBOXKJ.js';
7
+ import './chunk-NE63JADS.js';
8
8
  import './chunk-PA6CK6WQ.js';
9
9
  import './chunk-BALIE3BA.js';
10
10
  import './chunk-HACGUL52.js';
@@ -0,0 +1,16 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ export { DEFAULT_BUILD_DISK, DEFAULT_CACHE_DISK, DOCKER_CACHE_MS, allocatedBytes, checkDiskFit, realBuildDiskProbe, runDocker, volumeBytes } from './chunk-LHKWWEQZ.js';
4
+ import './chunk-QKEOAQ2W.js';
5
+ import './chunk-3Z3MPR55.js';
6
+ import './chunk-NE63JADS.js';
7
+ import './chunk-QQXNS4G2.js';
8
+ import './chunk-SOI6K5DY.js';
9
+ import './chunk-PA6CK6WQ.js';
10
+ import './chunk-BALIE3BA.js';
11
+ import './chunk-V7Q5OKN7.js';
12
+ import './chunk-HACGUL52.js';
13
+ import './chunk-MESOOLF4.js';
14
+ import './chunk-Z5GEFMRW.js';
15
+
16
+ createRequire(import.meta.url);
@@ -1 +1 @@
1
- {"id":"2026-10-23T00:24:49.363Z+beeb073","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-23T03:06:35.440Z+4c51ec6","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,14 +1,13 @@
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-GFVDC5S3.js';
3
+ export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-QKEOAQ2W.js';
4
4
  import './chunk-3Z3MPR55.js';
5
- import './chunk-TGHBOXKJ.js';
6
- import './chunk-YJLHUKYS.js';
7
- import './chunk-5DNCFOXA.js';
5
+ import './chunk-NE63JADS.js';
6
+ import './chunk-QQXNS4G2.js';
8
7
  import './chunk-SOI6K5DY.js';
9
8
  import './chunk-PA6CK6WQ.js';
10
9
  import './chunk-BALIE3BA.js';
11
- import './chunk-E6CO3MJE.js';
10
+ import './chunk-V7Q5OKN7.js';
12
11
  import './chunk-HACGUL52.js';
13
12
  import './chunk-MESOOLF4.js';
14
13
  import './chunk-Z5GEFMRW.js';
@@ -1,69 +1,67 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-CANYZTD5.js';
4
- import './chunk-DGI66PGY.js';
3
+ import { probeCredentials } from './chunk-67KCGRKA.js';
4
+ import './chunk-AXIK6F52.js';
5
+ import './chunk-GH246BGV.js';
5
6
  import './chunk-ZVB57WI6.js';
6
7
  import './chunk-57L2YAJA.js';
7
8
  import './chunk-3JVYMD4G.js';
8
9
  import './chunk-E7R2GIAW.js';
9
- import './chunk-OOCAF3ID.js';
10
+ import './chunk-RLAKWXDK.js';
10
11
  import './chunk-MZYOUIY5.js';
11
- import './chunk-GH246BGV.js';
12
12
  import './chunk-HVRQQOMH.js';
13
13
  import './chunk-6LBSAW6I.js';
14
14
  import './chunk-I3LTIAOR.js';
15
- import './chunk-Q2CMEQV7.js';
16
- import './chunk-2N67C6IV.js';
17
- import './chunk-AU346ENF.js';
15
+ import './chunk-4NKHOCTF.js';
16
+ import './chunk-T4S2DVOA.js';
17
+ import './chunk-HUBRTT2C.js';
18
18
  import './chunk-ESVW4MJY.js';
19
- import { managedProblems, managedFactsOf } from './chunk-QFQC5K4J.js';
19
+ import { managedProblems, managedFactsOf } from './chunk-B6WW6AKO.js';
20
20
  import './chunk-NBZ7XBT6.js';
21
21
  import './chunk-TBT347UY.js';
22
- import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, probeHelper, HELPER_ENV, helperSocketPath, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-JRZCRIEO.js';
22
+ import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, probeHelper, HELPER_ENV, helperSocketPath, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-GFTWZSOW.js';
23
23
  import './chunk-2PGI6RDE.js';
24
- import './chunk-YERR22SY.js';
25
- import './chunk-JPG43G6Y.js';
24
+ import './chunk-UHFU3CBN.js';
25
+ import './chunk-YXHKCHWG.js';
26
26
  import './chunk-F5UL23I2.js';
27
27
  import './chunk-JBJTC3UU.js';
28
28
  import './chunk-OGFGZQA3.js';
29
29
  import './chunk-5THSC6BD.js';
30
30
  import './chunk-L26V6ILJ.js';
31
- import './chunk-T5REPMNL.js';
31
+ import './chunk-Z4GLZTDF.js';
32
32
  import './chunk-MZBQTVFG.js';
33
33
  import './chunk-TQMI335S.js';
34
- import { DEFAULT_UNIT_NAME } from './chunk-LYE3KB6L.js';
35
- import './chunk-XWFSAOC7.js';
36
- import './chunk-YYYRBYWG.js';
37
- import './chunk-GFVDC5S3.js';
34
+ import { DEFAULT_UNIT_NAME } from './chunk-7HZH5D7H.js';
35
+ import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-ONUACB5C.js';
36
+ import './chunk-LHKWWEQZ.js';
37
+ import './chunk-QKEOAQ2W.js';
38
38
  import './chunk-3Z3MPR55.js';
39
- import './chunk-TGHBOXKJ.js';
40
- import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-3DCB3GOV.js';
41
- import './chunk-YJLHUKYS.js';
42
- import './chunk-VT4TTJPG.js';
39
+ import './chunk-NE63JADS.js';
40
+ import './chunk-5FSVA3CO.js';
43
41
  import './chunk-IP7BIBXJ.js';
44
- import './chunk-B2JURP6A.js';
45
- import './chunk-2WMZPJVE.js';
46
- import './chunk-EWVYQLD3.js';
47
- import './chunk-5DNCFOXA.js';
48
- import './chunk-HJYBWJAS.js';
49
- import './chunk-NSPRS7WK.js';
42
+ import './chunk-CCOU4NXE.js';
43
+ import './chunk-VJGQEASF.js';
44
+ import './chunk-E4F7YE7P.js';
45
+ import './chunk-QQXNS4G2.js';
46
+ import './chunk-PJI5D2XT.js';
47
+ import './chunk-X37GC7DM.js';
50
48
  import './chunk-G2JWZDFA.js';
51
49
  import './chunk-ANPNT6PM.js';
52
- import './chunk-EUVE2EAE.js';
53
- import './chunk-UIUGTW5C.js';
50
+ import './chunk-2WZ66FXA.js';
51
+ import './chunk-C7WGCI77.js';
54
52
  import './chunk-6RKD7YZ6.js';
55
53
  import './chunk-PJDQPF5N.js';
56
54
  import './chunk-SOI6K5DY.js';
57
55
  import './chunk-PA6CK6WQ.js';
58
56
  import { claudeEnvPath } from './chunk-BALIE3BA.js';
59
- import './chunk-QPWFVE3X.js';
57
+ import './chunk-JB4R5IFJ.js';
60
58
  import './chunk-ZJSNLVCE.js';
61
59
  import './chunk-2O5KA67H.js';
62
60
  import './chunk-BKO6JEZI.js';
63
61
  import './chunk-FGF52V4V.js';
64
62
  import './chunk-HCVLP7XA.js';
65
63
  import './chunk-BJ3KTMDH.js';
66
- import './chunk-G63KT5I5.js';
64
+ import './chunk-M24H6JQW.js';
67
65
  import './chunk-5BHIBJDA.js';
68
66
  import './chunk-CDDED64E.js';
69
67
  import './chunk-RA3O54FC.js';
@@ -73,8 +71,8 @@ import './chunk-CRB3POP4.js';
73
71
  import './chunk-URIZRCRY.js';
74
72
  import './chunk-YQR6E6OV.js';
75
73
  import './chunk-TUSYOL2O.js';
76
- import './chunk-LJG6EMLJ.js';
77
- import './chunk-E6CO3MJE.js';
74
+ import './chunk-PNIFQX73.js';
75
+ import './chunk-V7Q5OKN7.js';
78
76
  import './chunk-VNVZDWO3.js';
79
77
  import { parseRunnerEnv } from './chunk-HACGUL52.js';
80
78
  import './chunk-MESOOLF4.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { removeRetiredSkills } from './chunk-UIUGTW5C.js';
3
+ import { removeRetiredSkills } from './chunk-C7WGCI77.js';
4
4
  import { defaultFetch, resolveGatewayCredentials } from './chunk-6RKD7YZ6.js';
5
5
  import { withTokenHeader } from './chunk-BALIE3BA.js';
6
6
  import { appendContextProvenance } from './chunk-ZJSNLVCE.js';
7
- import { loadMaintainedFiles, writeMaintainedFiles } from './chunk-G63KT5I5.js';
7
+ import { loadMaintainedFiles, writeMaintainedFiles } from './chunk-M24H6JQW.js';
8
8
  import { cliInvocation } from './chunk-CRB3POP4.js';
9
9
  import { writeDegraded, writeSourceCache, SOURCE_CACHE_TTL_RETRY_MS, writeContextManifest, SOURCE_CACHE_TTL_SUCCESS_MS, readSourceCache, isSourceCacheFresh, clearDegraded } from './chunk-YQR6E6OV.js';
10
- import { normalizeRepoName, parseOuterlayerConfig, classifyTree, emitTree } from './chunk-LJG6EMLJ.js';
10
+ import { normalizeRepoName, parseOuterlayerConfig, classifyTree, emitTree } from './chunk-PNIFQX73.js';
11
11
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
12
12
  import { execFileSync } from 'child_process';
13
13
  import { existsSync, mkdirSync, writeFileSync, chmodSync, lstatSync, readFileSync, copyFileSync } from 'fs';
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { mcpTargetPath, INIT_STDIO_ENTRY, INIT_DOCS_ENTRY, DOCS_MCP_SERVER_NAME } from './chunk-KT4CN6OU.js';
4
- import { POLICY_CONTENT, VALIDATOR_FILES, VALIDATORS_DIR, POLICY_PATH } from './chunk-DY7Y7UT4.js';
5
- import { skillsBaseFor } from './chunk-HJYBWJAS.js';
4
+ import { POLICY_CONTENT, VALIDATOR_FILES, VALIDATORS_DIR, POLICY_PATH } from './chunk-XMPE5TT4.js';
5
+ import { skillsBaseFor } from './chunk-PJI5D2XT.js';
6
6
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
7
- import { resolvePackRoot, OUTERLAYER_SKILLS_BASE, skillDir, loadTemplateFiles, rewriteSkillPaths, restoreSkillPaths, TEMPLATE_SKILLS } from './chunk-G63KT5I5.js';
7
+ import { resolvePackRoot, OUTERLAYER_SKILLS_BASE, skillDir, loadTemplateFiles, rewriteSkillPaths, restoreSkillPaths, TEMPLATE_SKILLS } from './chunk-M24H6JQW.js';
8
8
  import { cliInvocation } from './chunk-CRB3POP4.js';
9
- import { hasSymlinkComponent } from './chunk-AVTI3FL5.js';
9
+ import { hasSymlinkComponent } from './chunk-6ZLI652Y.js';
10
10
  import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
11
11
  import { createHash } from 'crypto';
12
12
  import { existsSync, readFileSync } from 'fs';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { LiveUploader } from './chunk-2N67C6IV.js';
4
- import { CaptureDaemon } from './chunk-5DNCFOXA.js';
5
- import { spoolDir } from './chunk-QPWFVE3X.js';
3
+ import { LiveUploader } from './chunk-T4S2DVOA.js';
4
+ import { CaptureDaemon } from './chunk-QQXNS4G2.js';
5
+ import { spoolDir } from './chunk-JB4R5IFJ.js';
6
6
  import { parseWorkItemEnv } from './chunk-T2Q7ISPE.js';
7
7
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
8
8
  import { mkdirSync, writeFileSync, rmSync } from 'fs';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { detectActiveSession } from './chunk-IP7BIBXJ.js';
4
- import { autoConnect } from './chunk-B2JURP6A.js';
5
- import { workPageUrl } from './chunk-2WMZPJVE.js';
6
- import { sanitizeTerminal } from './chunk-EWVYQLD3.js';
7
- import { resolveRepoIdentity } from './chunk-5DNCFOXA.js';
4
+ import { autoConnect } from './chunk-CCOU4NXE.js';
5
+ import { workPageUrl } from './chunk-VJGQEASF.js';
6
+ import { sanitizeTerminal } from './chunk-E4F7YE7P.js';
7
+ import { resolveRepoIdentity } from './chunk-QQXNS4G2.js';
8
8
  import { C } from './chunk-ANPNT6PM.js';
9
9
  import { resolveGatewayCredentials, unauthorizedMessage, defaultFetch } from './chunk-6RKD7YZ6.js';
10
10
  import { signRunnerRequest } from './chunk-SOI6K5DY.js';
@@ -442,7 +442,7 @@ async function runWorkLinkSession(opts) {
442
442
  return await linkSession(opts);
443
443
  } catch (err) {
444
444
  if (opts.logFailures) {
445
- const { logHookError } = await import('./hook-fast-6WDMNZG5.js');
445
+ const { logHookError } = await import('./hook-fast-4RYMBFPO.js');
446
446
  const reason = err instanceof Error ? err.message : String(err);
447
447
  logHookError(opts.home ?? homeFromEnv(opts.env ?? process.env), new Error(`work link-session #${opts.number} failed: ${reason}`));
448
448
  }
@@ -1,27 +1,26 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { releaseLease, isUnfinished, attemptNote, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, deliverExecMaven, runWithSpawn, hostCommandEnvironment, execArgv, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, 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-DGI66PGY.js';
3
+ 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-AXIK6F52.js';
4
+ import { writePendingUpdate } from './chunk-GH246BGV.js';
4
5
  import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
5
6
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-57L2YAJA.js';
6
7
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
7
8
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-E7R2GIAW.js';
8
- import { fitImageBuildMemory } from './chunk-OOCAF3ID.js';
9
+ import { fitImageBuildMemory } from './chunk-RLAKWXDK.js';
9
10
  import { RUNNER_PROTOCOL } from './chunk-MZYOUIY5.js';
10
- import { writePendingUpdate } from './chunk-GH246BGV.js';
11
- import { realBlockedProbes, checkBlocked } from './chunk-QFQC5K4J.js';
11
+ import { realBlockedProbes, checkBlockedWithSlots, keepsHostBuilder } from './chunk-B6WW6AKO.js';
12
12
  import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, isInLayout, cleanVersions, stagingDir } from './chunk-NBZ7XBT6.js';
13
13
  import { RepoFilter } from './chunk-TBT347UY.js';
14
- import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, needsBuildSkill, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, decideHostBuildSkill, prepareBranch, currentSkillCommand, formerSkillProblem, containerCommandExec, setUpRunnerCgroup, sweepImageBuilders, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-JRZCRIEO.js';
14
+ import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, attemptNote, 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, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-GFTWZSOW.js';
15
15
  import { claimPidFile, writePidFile, readPidFile, releasePidFile } from './chunk-F5UL23I2.js';
16
16
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
17
- import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, resolveGoverningSource, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-T5REPMNL.js';
17
+ import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, resolveGoverningSource, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-Z4GLZTDF.js';
18
18
  import { tagToPull, pullInstruction, imageTag, writeUpdateStatus } from './chunk-MZBQTVFG.js';
19
19
  import { isVersion, compareVersions, satisfiesRange } from './chunk-TQMI335S.js';
20
- import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
21
- import { writeJobFile, ensureRunnerIdentity, readJobFile, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-GFVDC5S3.js';
22
- import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-3DCB3GOV.js';
23
- import { exceedsDisk } from './chunk-YJLHUKYS.js';
24
- import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-VT4TTJPG.js';
20
+ import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-ONUACB5C.js';
21
+ import { freeBytes, formatBytes, volumeBytes } from './chunk-LHKWWEQZ.js';
22
+ import { writeJobFile, ensureRunnerIdentity, readJobFile, exceedsDisk, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-QKEOAQ2W.js';
23
+ import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-5FSVA3CO.js';
25
24
  import { loadHostKey, ensureHostKey, signerFor } from './chunk-SOI6K5DY.js';
26
25
  import { RUNNER_DIR_MODE, runnerDir, buildDir, attemptStamp, jobDir, RUNNER_FILE_MODE, jobsDir, pidFilePath, spoolDir, imagesDir, rootfsDir, builderCacheDiskPath } from './chunk-PA6CK6WQ.js';
27
26
  import { parseClaimIdentity, parseClaimedRepositories, parseUnreachable, repositoriesOf, primaryOf, sharedUserEnvironment, JOB_MOUNT, takeClaudeCredential, heldClaudeCredential, currentClaudeCredential } from './chunk-BALIE3BA.js';
@@ -645,6 +644,16 @@ function createHousekeepingDocker(deps) {
645
644
  const result = await run("docker", ["rmi", id]);
646
645
  if (result.status !== 0) throw failure(result, `docker rmi ${id}`);
647
646
  },
647
+ async removeBuilder() {
648
+ const inspected = await run("docker", ["buildx", "inspect", deps.builder]);
649
+ if (inspected.status !== 0 && NO_BUILDER.test(inspected.stderr)) return void 0;
650
+ const df = await run("docker", ["system", "df", "-v"]);
651
+ const freedBytes = df.status === 0 ? volumeBytes(df.stdout, /* @__PURE__ */ new Set([`buildx_buildkit_${deps.builder}0_state`])) : 0;
652
+ const result = await run("docker", ["buildx", "rm", deps.builder]);
653
+ if (result.status !== 0 && NO_BUILDER.test(result.stderr)) return void 0;
654
+ if (result.status !== 0) throw failure(result, "docker buildx rm");
655
+ return { freedBytes };
656
+ },
648
657
  async builderPrune(keepBytes) {
649
658
  const inspected = await run("docker", ["buildx", "inspect", deps.builder]);
650
659
  if (inspected.status !== 0 && NO_BUILDER.test(inspected.stderr)) return void 0;
@@ -869,7 +878,17 @@ async function runHousekeeping(options) {
869
878
  } catch (err) {
870
879
  log.error(`housekeeping: dangling images could not be listed: ${describeCallFailure(err)}`);
871
880
  }
872
- if (options.buildCacheMax !== "off") {
881
+ if (options.removeHostBuilder === true) {
882
+ try {
883
+ const removed = await docker.removeBuilder();
884
+ if (removed !== void 0) {
885
+ freed += removed.freedBytes;
886
+ log.line(`housekeeping: removed the host image builder and its state volume, freed ${formatBytes(removed.freedBytes)}; this runner builds images in the builder microVM`);
887
+ }
888
+ } catch (err) {
889
+ log.error(`housekeeping: the host image builder could not be removed: ${describeCallFailure(err)}`);
890
+ }
891
+ } else if (options.buildCacheMax !== "off") {
873
892
  try {
874
893
  const pruned = await docker.builderPrune(options.buildCacheMax);
875
894
  if (pruned === void 0) {
@@ -1225,6 +1244,10 @@ function fitForImage(deps, config) {
1225
1244
  function describeConfig(config) {
1226
1245
  return `queues ${config.queues.join(",")} \xB7 concurrency ${config.concurrency} \xB7 poll ${config.pollSeconds}s`;
1227
1246
  }
1247
+ function slotsTotalOf(state) {
1248
+ const slots = state.blocked === void 0 ? state.buildSlots ?? state.config.concurrency : state.config.concurrency;
1249
+ return Math.max(slots, state.jobs.size, 1);
1250
+ }
1228
1251
  async function sendTickHeartbeat(state, workRequest) {
1229
1252
  if (state.heartbeating) {
1230
1253
  if (workRequest !== void 0) state.queuedWorkRequest = workRequest;
@@ -1247,7 +1270,7 @@ async function sendTickHeartbeat(state, workRequest) {
1247
1270
  cliVersion: state.deps.cliVersion ?? resolveVersion(),
1248
1271
  pollSeconds: state.pollTimerSeconds ?? state.config.pollSeconds,
1249
1272
  slotsUsed: state.jobs.size,
1250
- slotsTotal: state.config.concurrency,
1273
+ slotsTotal: slotsTotalOf(state),
1251
1274
  workRequest: next,
1252
1275
  lastUpdate: readLastUpdate(state.config.configPath),
1253
1276
  lowDisk: state.lowDisk,
@@ -1660,6 +1683,7 @@ function imageBuilderState(state) {
1660
1683
  const kind = builtinKind(state.config.hooks.provision);
1661
1684
  if (kind !== "container" && kind !== "vm") return "usable";
1662
1685
  if (state.deps.container?.buildImage !== void 0 || state.deps.container?.imageHost !== void 0) return "usable";
1686
+ if (!keepsHostBuilder(state.config, state.deps.blocked?.builderDiskPinned)) return "usable";
1663
1687
  const memory = state.config.build?.memory ?? "8g";
1664
1688
  let probe = state.imageBuilder;
1665
1689
  if (probe === void 0 || probe.memory !== memory) probe = state.imageBuilder = { memory, at: 0, running: false };
@@ -1697,7 +1721,8 @@ function holdWhenBlocked(state, jailer) {
1697
1721
  inImage: state.deps.image !== void 0,
1698
1722
  ...state.deps.blocked
1699
1723
  };
1700
- const blocked = checkBlocked(state.config, probes);
1724
+ const { blocked, slots } = checkBlockedWithSlots(state.config, probes);
1725
+ state.buildSlots = slots;
1701
1726
  const log = logOf(state);
1702
1727
  if (blocked !== void 0) {
1703
1728
  if (state.blocked?.reason !== blocked.reason) log.line(`claiming nothing: ${blocked.reason}`);
@@ -1753,6 +1778,7 @@ async function housekeepingPass(state) {
1753
1778
  configPath: state.config.configPath,
1754
1779
  keepDays: config.jobsKeepDays,
1755
1780
  buildCacheMax: config.buildCacheMax,
1781
+ removeHostBuilder: !keepsHostBuilder(state.config, state.deps.blocked?.builderDiskPinned),
1756
1782
  docker: state.deps.housekeeping.docker,
1757
1783
  now: state.deps.now ?? (() => /* @__PURE__ */ new Date()),
1758
1784
  log: logOf(state)
@@ -1784,7 +1810,8 @@ async function runTick(state) {
1784
1810
  const repoFilter = new RepoFilter(state.config.repos);
1785
1811
  let filtered = 0;
1786
1812
  let attempts = 0;
1787
- while (state.jobs.size < state.config.concurrency && attempts < state.config.concurrency) {
1813
+ const slots = Math.min(state.buildSlots ?? state.config.concurrency, state.config.concurrency);
1814
+ while (state.jobs.size < slots && attempts < state.config.concurrency) {
1788
1815
  attempts++;
1789
1816
  let claimed = false;
1790
1817
  for (const queue of QUEUE_ORDER) {
@@ -1837,7 +1864,7 @@ var CLAIM_REFUSAL_CODES = new Set(
1837
1864
  "pull_request_from_fork pull_request_on_default_branch pull_request_ambiguous pull_request_repository_not_connected repository_not_reachable branch_claimed_elsewhere".split(" ")
1838
1865
  );
1839
1866
  async function tryClaimAndStart(state, item, queue) {
1840
- const { postJson: postJson2 } = await import('./work-cmd-W7WEHMQJ.js');
1867
+ const { postJson: postJson2 } = await import('./work-cmd-PQZ5RYDB.js');
1841
1868
  const log = logOf(state);
1842
1869
  const hostKey = await loadHostKey(state.config.configPath);
1843
1870
  const claim = await retrySend(
@@ -3054,7 +3081,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
3054
3081
  check: update.check ? () => update.check(configPath) : async () => {
3055
3082
  const held = heldClaudeCredential();
3056
3083
  const env = held === void 0 ? process.env : { ...process.env, [held.variable]: held.value };
3057
- return (await import('./check-64FD5G3X.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
3084
+ return (await import('./check-AEMFDR55.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
3058
3085
  },
3059
3086
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
3060
3087
  log
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { sanitizeTerminal } from './chunk-EWVYQLD3.js';
4
- import { isAgentsMdLayout } from './chunk-HJYBWJAS.js';
3
+ import { sanitizeTerminal } from './chunk-E4F7YE7P.js';
4
+ import { isAgentsMdLayout } from './chunk-PJI5D2XT.js';
5
5
  import { resolveGatewayCredentials, defaultFetch } from './chunk-6RKD7YZ6.js';
6
6
  import { versionAtLeast } from './chunk-HCVLP7XA.js';
7
7
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
8
- import { machineSkillsState, staleClaudeSkills } from './chunk-GFYEMCPP.js';
9
- import { AGENTS_SKILLS_BASE, skillDir, namesCore, MACHINE_SKILL_PATH, isMaintainedCopy, loadTemplateFiles } from './chunk-G63KT5I5.js';
8
+ import { machineSkillsState, staleClaudeSkills } from './chunk-T4TT76GG.js';
9
+ import { AGENTS_SKILLS_BASE, skillDir, namesCore, MACHINE_SKILL_PATH, isMaintainedCopy, loadTemplateFiles } from './chunk-M24H6JQW.js';
10
10
  import { MAINTAINED_SKILLS } from './chunk-CDDED64E.js';
11
11
  import { cliInvocation } from './chunk-CRB3POP4.js';
12
- import { hasSymlinkComponent } from './chunk-AVTI3FL5.js';
13
- import { emitTree, ALL_TARGET_IDS, classifyTree, splitRawFile } from './chunk-LJG6EMLJ.js';
12
+ import { hasSymlinkComponent } from './chunk-6ZLI652Y.js';
13
+ import { emitTree, ALL_TARGET_IDS, classifyTree, splitRawFile } from './chunk-PNIFQX73.js';
14
14
  import { execFileSync } from 'child_process';
15
15
  import { existsSync, readFileSync, writeFileSync, realpathSync, readdirSync } from 'fs';
16
16
  import { join, dirname, posix, basename, isAbsolute, relative } from 'path';
@@ -2,7 +2,7 @@
2
2
  import { createRequire } from 'node:module';
3
3
  import { readContextManifest, removeContextManifest } from './chunk-YQR6E6OV.js';
4
4
  import { removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
5
- import { CONTEXT_PIN_FILENAME } from './chunk-LJG6EMLJ.js';
5
+ import { CONTEXT_PIN_FILENAME } from './chunk-PNIFQX73.js';
6
6
  import { execFileSync } from 'child_process';
7
7
  import { lstatSync, existsSync, unlinkSync, readdirSync, rmdirSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
8
8
  import { join, dirname, isAbsolute } from 'path';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { builtinKind } from './chunk-3DCB3GOV.js';
4
- import { parseSize } from './chunk-YJLHUKYS.js';
3
+ import { builtinKind } from './chunk-ONUACB5C.js';
4
+ import { parseSize } from './chunk-QKEOAQ2W.js';
5
5
  import { runnerDir } from './chunk-PA6CK6WQ.js';
6
6
  import { CLAUDE_CREDENTIAL_ID, CLAUDE_ENV_FILE, credentialLineIn, withoutCredentialLines } from './chunk-BALIE3BA.js';
7
7
  import { FD_SLOTS_PER_BUILD, FD_STORE_ENV } from './chunk-HACGUL52.js';
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { staleBuildRefusal, staleBuildWarning, detectCi } from './chunk-2N67C6IV.js';
3
+ import { staleBuildRefusal, staleBuildWarning, detectCi } from './chunk-T4S2DVOA.js';
4
4
  import { launchRefusalForSession } from './chunk-ESVW4MJY.js';
5
5
  import { detectActiveSession } from './chunk-IP7BIBXJ.js';
6
- import { autoConnect } from './chunk-B2JURP6A.js';
7
- import { readEffectiveArtifactSpoolState, localArtifactIds, isArtifactTombstoned, artifactBlobsDir, appendArtifactRecord, artifactsSpoolPath, findPendingArtifactRecord, sanitizeTerminal, appendArtifactTombstone } from './chunk-EWVYQLD3.js';
8
- import { resolveRepoIdentity } from './chunk-5DNCFOXA.js';
6
+ import { autoConnect } from './chunk-CCOU4NXE.js';
7
+ import { readEffectiveArtifactSpoolState, localArtifactIds, isArtifactTombstoned, artifactBlobsDir, appendArtifactRecord, artifactsSpoolPath, findPendingArtifactRecord, sanitizeTerminal, appendArtifactTombstone } from './chunk-E4F7YE7P.js';
8
+ import { resolveRepoIdentity } from './chunk-QQXNS4G2.js';
9
9
  import { C } from './chunk-ANPNT6PM.js';
10
10
  import { resolveGatewayCredentials, defaultFetch, unauthorizedMessage } from './chunk-6RKD7YZ6.js';
11
11
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
12
12
  import { cliInvocation } from './chunk-CRB3POP4.js';
13
- import { ARTIFACT_MAX_CAPTION_LENGTH, ArtifactCriterionIdSchema, ARTIFACT_MAX_BYTES, ARTIFACT_MAX_FILENAME_LENGTH, mediaTypeForArtifactPath, inferArtifactKind, ARTIFACT_MAX_REPLACES_TARGETS, parseTestSelector, parseJunit, bindTests } from './chunk-E6CO3MJE.js';
13
+ import { ARTIFACT_MAX_CAPTION_LENGTH, ArtifactCriterionIdSchema, ARTIFACT_MAX_BYTES, ARTIFACT_MAX_FILENAME_LENGTH, mediaTypeForArtifactPath, inferArtifactKind, ARTIFACT_MAX_REPLACES_TARGETS, parseTestSelector, parseJunit, bindTests } from './chunk-V7Q5OKN7.js';
14
14
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
15
15
  import { createHash, randomUUID } from 'crypto';
16
16
  import { statSync, readFileSync, mkdirSync, existsSync, writeFileSync, renameSync, unlinkSync } from 'fs';