@outerlayer/cli 0.33.0-next.20261021171323 → 0.33.0-next.20261021194303

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 (101) hide show
  1. package/README.md +5 -1
  2. package/dist/{agent-setup-NSUX64RU.js → agent-setup-P5PWEGZM.js} +5 -5
  3. package/dist/{build-HU24C46Z.js → build-SK5BYBER.js} +4 -4
  4. package/dist/build-info.json +1 -1
  5. package/dist/{builder-VFREWHZA.js → builder-X4PIGYS6.js} +5 -5
  6. package/dist/{check-3TQJDGKM.js → check-DPVNDAQQ.js} +32 -32
  7. package/dist/chunk-2PGI6RDE.js +90 -0
  8. package/dist/{chunk-ZZSQYOY5.js → chunk-3VGDZ23W.js} +1 -1
  9. package/dist/{chunk-7LP3F2QH.js → chunk-4OKOLFPH.js} +3 -3
  10. package/dist/{chunk-NJS7JJYN.js → chunk-52C3SSNF.js} +2 -2
  11. package/dist/{chunk-IWYS4ERC.js → chunk-533QGXGZ.js} +1 -1
  12. package/dist/{chunk-54GBOMDW.js → chunk-543ZX5TM.js} +3 -3
  13. package/dist/{chunk-OX7CHZTJ.js → chunk-5ZUT3IK3.js} +1 -1
  14. package/dist/{chunk-ZBN4JGTJ.js → chunk-A3H27SYX.js} +1 -1
  15. package/dist/{chunk-P7BEZAEU.js → chunk-ALSE7YKX.js} +11 -3
  16. package/dist/{chunk-G7QBSH3X.js → chunk-BBK62GXM.js} +1256 -589
  17. package/dist/{chunk-NYKZC6HU.js → chunk-C4N5QRQJ.js} +3 -3
  18. package/dist/{chunk-CI6PRMWZ.js → chunk-CG5TWQ23.js} +5 -5
  19. package/dist/{chunk-TZQIEUDE.js → chunk-CNRMP6EN.js} +1 -1
  20. package/dist/{chunk-LAS3DOTW.js → chunk-ENV3AIWQ.js} +42 -18
  21. package/dist/{chunk-KP6R7CV3.js → chunk-ESP5VZBD.js} +4 -1
  22. package/dist/{chunk-RQGHHEM7.js → chunk-HBBCQ5NE.js} +2 -2
  23. package/dist/{chunk-T5TBGOT6.js → chunk-IPJ6HR7E.js} +1 -1
  24. package/dist/{chunk-APSYTJ6I.js → chunk-JT3YO5MH.js} +1 -1
  25. package/dist/{chunk-ZZWWKBLL.js → chunk-KUOY5UIR.js} +4 -4
  26. package/dist/{chunk-X7UUIHGH.js → chunk-LH3KULPL.js} +1 -1
  27. package/dist/{chunk-LK2S5XZH.js → chunk-LHYO4RDP.js} +9 -1
  28. package/dist/{chunk-LSMF3EET.js → chunk-LPIUIRHA.js} +10 -10
  29. package/dist/{chunk-BXA6JLHQ.js → chunk-LTZVMKQS.js} +5 -5
  30. package/dist/{chunk-WHSYPR3U.js → chunk-M5ZXOQYS.js} +1 -1
  31. package/dist/{chunk-VXYPD33W.js → chunk-NNNUME4Y.js} +5 -5
  32. package/dist/{chunk-KQON2T4A.js → chunk-OVSUSOHL.js} +23 -7
  33. package/dist/{chunk-NHXJU7CM.js → chunk-OXSFOLWE.js} +1 -1
  34. package/dist/{chunk-77F7NGAZ.js → chunk-TA6TFYAN.js} +3 -3
  35. package/dist/{chunk-EKMMX5A5.js → chunk-TAZJDD2U.js} +4 -4
  36. package/dist/{chunk-TI5Y242B.js → chunk-TGXYNEI7.js} +57 -89
  37. package/dist/{chunk-BSHUTMXV.js → chunk-TPGHCH2H.js} +45 -19
  38. package/dist/{chunk-AR6UB2BP.js → chunk-UVZ43SW3.js} +3 -3
  39. package/dist/{chunk-HPOW2VCB.js → chunk-VFW6I4GG.js} +2 -2
  40. package/dist/{chunk-F3EF56LQ.js → chunk-VQ2JGZSC.js} +1 -1
  41. package/dist/{chunk-D73OLAYE.js → chunk-WRX2MCDV.js} +1 -1
  42. package/dist/{chunk-LQFDTQC2.js → chunk-XQTT3222.js} +3 -3
  43. package/dist/{chunk-SOTJ2V3A.js → chunk-XRZGT54P.js} +6 -6
  44. package/dist/{chunk-GKNF4D62.js → chunk-XT5SOJRC.js} +48 -25
  45. package/dist/{chunk-H6Y5D6J7.js → chunk-YZIC5JXC.js} +1 -1
  46. package/dist/{chunk-JKXTG3BV.js → chunk-ZPW6PUNK.js} +3 -3
  47. package/dist/{claude-launcher-RNMUZZ3Y.js → claude-launcher-Q7YAPLY2.js} +1 -1
  48. package/dist/{cli-YQ64SSV3.js → cli-OGX6JNIN.js} +98 -98
  49. package/dist/{command-RFVCDSJV.js → command-UIAQUHHU.js} +22 -21
  50. package/dist/{config-3JRFDYZL.js → config-CUJ3Q4L2.js} +1 -1
  51. package/dist/{connect-cmd-HVHPNVAJ.js → connect-cmd-OLESV5O3.js} +5 -5
  52. package/dist/{container-start-DP3N72CK.js → container-start-MGY5VFHW.js} +22 -21
  53. package/dist/{control-plane-launch-DHMD5WBU.js → control-plane-launch-7PXJSMVM.js} +4 -4
  54. package/dist/{dist-MKY2BSYN.js → dist-DY2ZNEBS.js} +1 -1
  55. package/dist/{docker-6G6IF4YO.js → docker-XRUAUQIG.js} +5 -5
  56. package/dist/{doctor-ZE4LA7EZ.js → doctor-ZMKO3F7I.js} +31 -28
  57. package/dist/{emit-artifact-cmd-YRRXCZAI.js → emit-artifact-cmd-RI7HA37S.js} +10 -10
  58. package/dist/{emit-criteria-cmd-PSQORVHS.js → emit-criteria-cmd-T5HZZ7XJ.js} +6 -6
  59. package/dist/{emit-demo-cmd-RJPSISCC.js → emit-demo-cmd-MWRFZHSX.js} +13 -93
  60. package/dist/{emit-finding-cmd-6FVW3GGK.js → emit-finding-cmd-RN7LSGJ7.js} +7 -7
  61. package/dist/{emit-result-cmd-PFQ6HSVN.js → emit-result-cmd-72STGWMP.js} +9 -9
  62. package/dist/{emit-step-cmd-U32Y4PZJ.js → emit-step-cmd-POFAEM7G.js} +7 -7
  63. package/dist/{findings-cmd-AMYNXO3S.js → findings-cmd-TMURLT3A.js} +7 -7
  64. package/dist/{fleet-readiness-7ROJ54ZF.js → fleet-readiness-N6Y3F7R6.js} +4 -4
  65. package/dist/{governing-source-DYJQCHKU.js → governing-source-2R7IS7LZ.js} +9 -9
  66. package/dist/{hook-fast-WQQYEXO5.js → hook-fast-GO7UTNN5.js} +1 -1
  67. package/dist/{host-key-KAYMYRO3.js → host-key-UEWE4PXB.js} +2 -2
  68. package/dist/{image-tag-NM2YT2J2.js → image-tag-V2LXTKK7.js} +2 -2
  69. package/dist/index.js +4 -4
  70. package/dist/{init-QDUIHSTK.js → init-E3VWTJFQ.js} +21 -20
  71. package/dist/{init-CHWFDK23.js → init-YMU4QFRV.js} +21 -20
  72. package/dist/{init-cmd-STCU6RGY.js → init-cmd-WBPE3X7T.js} +10 -10
  73. package/dist/{init-update-OIFOUIAN.js → init-update-MONZSG7L.js} +8 -8
  74. package/dist/{install-OIRIEOS7.js → install-3DBYJITP.js} +3 -3
  75. package/dist/{install-cmd-IYWVR6WX.js → install-cmd-EELSKBSZ.js} +4 -4
  76. package/dist/{logs-C3RJ3ZTC.js → logs-ET75ZUCN.js} +1 -1
  77. package/dist/{loop-NUW7SSZY.js → loop-N3IUN4F3.js} +32 -32
  78. package/dist/{machine-BJ7TT3B7.js → machine-J7QFINBX.js} +17 -16
  79. package/dist/{mcp-serve-cmd-PB4UOTGL.js → mcp-serve-cmd-WYUP263T.js} +3 -3
  80. package/dist/paths-BN7X2YPM.js +9 -0
  81. package/dist/{pending-RKVRYOTF.js → pending-ROAIK5WO.js} +2 -2
  82. package/dist/{pidfile-BMFAUQAI.js → pidfile-52TGLGQH.js} +2 -2
  83. package/dist/{record-26AH6WDB.js → record-BSY4BKJ5.js} +2 -2
  84. package/dist/{runner-env-66RAFIDJ.js → runner-env-H6XLACTG.js} +4 -4
  85. package/dist/{runner-identity-FL67WQIA.js → runner-identity-MSMI2PD4.js} +5 -5
  86. package/dist/{runner-key-YHAJFEGN.js → runner-key-QTNYQ2I7.js} +21 -20
  87. package/dist/{session-sender-PHQ6PJVD.js → session-sender-USH6NOZL.js} +10 -10
  88. package/dist/{spec-cmd-SAMHN5FU.js → spec-cmd-ABGR2ZDH.js} +7 -7
  89. package/dist/{status-QWLX2CCV.js → status-FHEVPRWN.js} +22 -22
  90. package/dist/{sync-cmd-O6UIF4QJ.js → sync-cmd-GC2TBSUO.js} +9 -9
  91. package/dist/{watch-5HMOSQ4Z.js → watch-F3LCBTNO.js} +9 -9
  92. package/dist/{work-claim-cmd-6W7BW4O6.js → work-claim-cmd-X7KNYGU7.js} +10 -10
  93. package/dist/{work-cmd-3G26E3NL.js → work-cmd-AI3ZPCP7.js} +7 -7
  94. package/dist/{work-comment-cmd-S6EGHGHL.js → work-comment-cmd-6UXS342S.js} +7 -7
  95. package/dist/{work-logs-cmd-RQILRNHS.js → work-logs-cmd-TVKWMDOW.js} +7 -7
  96. package/dist/{work-open-pr-cmd-5CDP6KOF.js → work-open-pr-cmd-WZ7W2HZ7.js} +8 -8
  97. package/dist/{work-pr-cmd-D3PJJQOX.js → work-pr-cmd-KTNNR46X.js} +7 -7
  98. package/dist/{work-stop-cmd-AGZWXGRP.js → work-stop-cmd-2BUDSXUU.js} +7 -7
  99. package/package.json +1 -1
  100. package/dist/chunk-YYYRBYWG.js +0 -32
  101. package/dist/paths-OK2EZS7W.js +0 -9
package/README.md CHANGED
@@ -228,7 +228,11 @@ content:
228
228
  downloads a guest kernel and a guest helper from the releases of the public
229
229
  repository `outerlayerai/guest-assets` on github.com. The runner checks each
230
230
  file against a sha256 pinned in the CLI, and the requests send nothing about
231
- the host. The microVM reaches the network only
231
+ the host. An image build in a builder microVM also needs the files of the
232
+ runner's tools layer, which the runner downloads on the host. It gets `gh`,
233
+ `tini` and FFmpeg from github.com. It gets the narration voice pack from
234
+ huggingface.co and registry.npmjs.org. Each file is checked against a sha256
235
+ pinned in the CLI. The microVM reaches the network only
232
236
  through the same tunnel a container build uses, which the runner serves on
233
237
  Unix sockets and the guest reaches over vsock. In a build with Docker, the
234
238
  guest forwards the proxy connections of containers and `docker build` steps
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { keepHandWritten, runAgentSetup } from './chunk-OX7CHZTJ.js';
3
+ export { keepHandWritten, runAgentSetup } from './chunk-5ZUT3IK3.js';
4
4
  import './chunk-GI6LOIHS.js';
5
5
  import './chunk-KT4CN6OU.js';
6
6
  import './chunk-QCDVKCHA.js';
7
7
  import './chunk-ZAJKEHIE.js';
8
8
  import './chunk-ANPNT6PM.js';
9
- import './chunk-D73OLAYE.js';
9
+ import './chunk-WRX2MCDV.js';
10
10
  import './chunk-FE3RTGJN.js';
11
- import './chunk-F3EF56LQ.js';
11
+ import './chunk-VQ2JGZSC.js';
12
12
  import './chunk-PJDQPF5N.js';
13
- import './chunk-APSYTJ6I.js';
14
- import './chunk-KP6R7CV3.js';
13
+ import './chunk-JT3YO5MH.js';
14
+ import './chunk-ESP5VZBD.js';
15
15
  import './chunk-HDSDUTX4.js';
16
16
  import './chunk-ZJSNLVCE.js';
17
17
  import './chunk-BJ3KTMDH.js';
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { buildRepositoryImage } from './chunk-BSHUTMXV.js';
4
- import './chunk-T5TBGOT6.js';
3
+ export { KEY_PREFIX, TAG_HOST, buildRepositoryImage, metadataFromLabels, prepareImageBuild, writeRecord } from './chunk-TPGHCH2H.js';
4
+ import './chunk-IPJ6HR7E.js';
5
5
  import './chunk-JBJTC3UU.js';
6
6
  export { RecipeError } from './chunk-3Z3MPR55.js';
7
- import './chunk-LK2S5XZH.js';
8
- import './chunk-KP6R7CV3.js';
7
+ import './chunk-LHYO4RDP.js';
8
+ import './chunk-ESP5VZBD.js';
9
9
  import './chunk-HDSDUTX4.js';
10
10
  import './chunk-XD4ZCMA4.js';
11
11
  import './chunk-MESOOLF4.js';
@@ -1 +1 @@
1
- {"id":"2026-10-21T17:15:21.001Z+04c1646","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-21T19:45:38.796Z+9eb87e9","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,12 +1,12 @@
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-ZZWWKBLL.js';
3
+ export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-KUOY5UIR.js';
4
4
  import './chunk-YJLHUKYS.js';
5
5
  import './chunk-3Z3MPR55.js';
6
- import './chunk-LK2S5XZH.js';
7
- import './chunk-GKNF4D62.js';
8
- import './chunk-APSYTJ6I.js';
9
- import './chunk-KP6R7CV3.js';
6
+ import './chunk-LHYO4RDP.js';
7
+ import './chunk-XT5SOJRC.js';
8
+ import './chunk-JT3YO5MH.js';
9
+ import './chunk-ESP5VZBD.js';
10
10
  import './chunk-HDSDUTX4.js';
11
11
  import './chunk-3WW2TL7V.js';
12
12
  import './chunk-XD4ZCMA4.js';
@@ -1,62 +1,62 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-LAS3DOTW.js';
4
- import './chunk-TI5Y242B.js';
5
- import './chunk-X7UUIHGH.js';
3
+ import { probeCredentials } from './chunk-ENV3AIWQ.js';
4
+ import './chunk-TGXYNEI7.js';
5
+ import './chunk-LH3KULPL.js';
6
6
  import './chunk-3JVYMD4G.js';
7
7
  import './chunk-E7R2GIAW.js';
8
- import './chunk-WHSYPR3U.js';
8
+ import './chunk-M5ZXOQYS.js';
9
9
  import './chunk-YKYCE4HY.js';
10
- import './chunk-TZQIEUDE.js';
10
+ import './chunk-CNRMP6EN.js';
11
11
  import './chunk-ZVB57WI6.js';
12
12
  import './chunk-RJYKTWUP.js';
13
13
  import './chunk-I3LTIAOR.js';
14
- import './chunk-AR6UB2BP.js';
15
- import './chunk-VXYPD33W.js';
16
- import './chunk-7LP3F2QH.js';
14
+ import './chunk-UVZ43SW3.js';
15
+ import './chunk-NNNUME4Y.js';
16
+ import './chunk-4OKOLFPH.js';
17
17
  import './chunk-ESVW4MJY.js';
18
18
  import './chunk-XTNMIV77.js';
19
- import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, managedProblems, managedFactsOf, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-KQON2T4A.js';
20
- import './chunk-YYYRBYWG.js';
21
- import './chunk-ZZSQYOY5.js';
19
+ import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, managedProblems, managedFactsOf, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-OVSUSOHL.js';
20
+ import './chunk-3VGDZ23W.js';
22
21
  import './chunk-TBT347UY.js';
23
- import './chunk-CI6PRMWZ.js';
24
- import './chunk-LQFDTQC2.js';
25
- import { probeHelper, HELPER_ENV, helperSocketPath } from './chunk-G7QBSH3X.js';
22
+ import './chunk-CG5TWQ23.js';
23
+ import './chunk-XQTT3222.js';
24
+ import { probeHelper, HELPER_ENV, helperSocketPath } from './chunk-BBK62GXM.js';
25
+ import './chunk-2PGI6RDE.js';
26
26
  import './chunk-QQGZ5THT.js';
27
27
  import './chunk-HIGJTX5U.js';
28
- import './chunk-BXA6JLHQ.js';
29
- import './chunk-IWYS4ERC.js';
28
+ import './chunk-LTZVMKQS.js';
29
+ import './chunk-533QGXGZ.js';
30
30
  import './chunk-TQMI335S.js';
31
- import './chunk-NJS7JJYN.js';
32
- import { DEFAULT_UNIT_NAME } from './chunk-RQGHHEM7.js';
33
- import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-P7BEZAEU.js';
31
+ import './chunk-52C3SSNF.js';
32
+ import { DEFAULT_UNIT_NAME } from './chunk-HBBCQ5NE.js';
33
+ import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-ALSE7YKX.js';
34
34
  import './chunk-UXYLWVTQ.js';
35
- import './chunk-BSHUTMXV.js';
36
- import './chunk-T5TBGOT6.js';
35
+ import './chunk-TPGHCH2H.js';
36
+ import './chunk-IPJ6HR7E.js';
37
37
  import './chunk-JBJTC3UU.js';
38
38
  import './chunk-OGFGZQA3.js';
39
- import './chunk-ZZWWKBLL.js';
39
+ import './chunk-KUOY5UIR.js';
40
40
  import './chunk-YJLHUKYS.js';
41
41
  import './chunk-3Z3MPR55.js';
42
- import './chunk-LK2S5XZH.js';
43
- import './chunk-SOTJ2V3A.js';
44
- import './chunk-JKXTG3BV.js';
45
- import './chunk-HPOW2VCB.js';
42
+ import './chunk-LHYO4RDP.js';
43
+ import './chunk-XRZGT54P.js';
44
+ import './chunk-ZPW6PUNK.js';
45
+ import './chunk-VFW6I4GG.js';
46
46
  import './chunk-3H7NZPYG.js';
47
- import './chunk-GKNF4D62.js';
47
+ import './chunk-XT5SOJRC.js';
48
48
  import './chunk-ZAJKEHIE.js';
49
49
  import './chunk-6C3ZVE62.js';
50
50
  import './chunk-G2JWZDFA.js';
51
51
  import './chunk-ANPNT6PM.js';
52
- import './chunk-D73OLAYE.js';
52
+ import './chunk-WRX2MCDV.js';
53
53
  import './chunk-FE3RTGJN.js';
54
- import './chunk-F3EF56LQ.js';
54
+ import './chunk-VQ2JGZSC.js';
55
55
  import './chunk-PJDQPF5N.js';
56
- import './chunk-APSYTJ6I.js';
57
- import './chunk-KP6R7CV3.js';
56
+ import './chunk-JT3YO5MH.js';
57
+ import './chunk-ESP5VZBD.js';
58
58
  import { claudeEnvPath } from './chunk-HDSDUTX4.js';
59
- import './chunk-NHXJU7CM.js';
59
+ import './chunk-OXSFOLWE.js';
60
60
  import './chunk-ZJSNLVCE.js';
61
61
  import './chunk-2O5KA67H.js';
62
62
  import './chunk-BKO6JEZI.js';
@@ -0,0 +1,90 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { createHash } from 'crypto';
4
+ import { createReadStream, mkdirSync, rmSync, renameSync, existsSync, statSync, createWriteStream } from 'fs';
5
+ import { dirname } from 'path';
6
+ import { once } from 'events';
7
+
8
+ createRequire(import.meta.url);
9
+ var VoiceDownloadError = class extends Error {
10
+ constructor(message, retryable = false) {
11
+ super(message);
12
+ this.retryable = retryable;
13
+ }
14
+ };
15
+ async function sha256OfFile(path) {
16
+ const hash = createHash("sha256");
17
+ for await (const chunk of createReadStream(path)) hash.update(chunk);
18
+ return hash.digest("hex");
19
+ }
20
+ function withoutCredentials(url) {
21
+ try {
22
+ const parsed = new URL(url);
23
+ parsed.username = "";
24
+ parsed.password = "";
25
+ return parsed.toString();
26
+ } catch {
27
+ return "(an invalid URL)";
28
+ }
29
+ }
30
+ var ATTEMPTS = 3;
31
+ async function requestRest(params) {
32
+ const { url, part, name, fetchImpl, progress } = params;
33
+ const offset = existsSync(part) ? statSync(part).size : 0;
34
+ const response = await fetchImpl(url, offset > 0 ? { headers: { range: `bytes=${offset}-` } } : {});
35
+ if (response.status === 416 && offset > 0) {
36
+ await response.body?.cancel();
37
+ return;
38
+ }
39
+ if (!response.ok || response.body === null) {
40
+ await response.body?.cancel();
41
+ throw new VoiceDownloadError(`cannot download ${name} from ${withoutCredentials(url)}: the server answered ${response.status}`, response.status >= 500);
42
+ }
43
+ const resumed = response.status === 206;
44
+ const start = resumed ? offset : 0;
45
+ const total = Number(response.headers.get("content-length") ?? 0) + start;
46
+ const out = createWriteStream(part, { flags: resumed ? "a" : "w" });
47
+ let written = start;
48
+ let lastReport = 0;
49
+ try {
50
+ for await (const chunk of response.body) {
51
+ if (!out.write(chunk)) await once(out, "drain");
52
+ written += chunk.length;
53
+ const now = Date.now();
54
+ if (progress !== void 0 && now - lastReport >= 1e3) {
55
+ lastReport = now;
56
+ progress(` downloading ${name}: ${(written / 1048576).toFixed(0)}${total > start ? ` of ${(total / 1048576).toFixed(0)}` : ""} MiB`);
57
+ }
58
+ }
59
+ } finally {
60
+ out.end();
61
+ await once(out, "close");
62
+ }
63
+ }
64
+ async function downloadPinned(params) {
65
+ const { url, dest, sha256, name } = params;
66
+ mkdirSync(dirname(dest), { recursive: true });
67
+ const part = `${dest}.part`;
68
+ for (let attempt = 1; ; attempt += 1) {
69
+ try {
70
+ await requestRest({ ...params, part });
71
+ break;
72
+ } catch (err) {
73
+ const refused = err instanceof VoiceDownloadError && !err.retryable;
74
+ if (refused || attempt === ATTEMPTS) {
75
+ throw err instanceof VoiceDownloadError ? err : new VoiceDownloadError(`cannot download ${name} from ${withoutCredentials(url)}: ${String(err)}`);
76
+ }
77
+ await new Promise((resolve) => setTimeout(resolve, params.retryDelayMs ?? 500));
78
+ }
79
+ }
80
+ const digest = await sha256OfFile(part);
81
+ if (digest !== sha256) {
82
+ rmSync(part, { force: true });
83
+ throw new VoiceDownloadError(
84
+ `the downloaded ${name} has sha256 ${digest}, not the pinned ${sha256} \u2014 it was discarded and ${params.stopped ?? "nothing was spoken"}`
85
+ );
86
+ }
87
+ renameSync(part, dest);
88
+ }
89
+
90
+ export { VoiceDownloadError, downloadPinned, sha256OfFile };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-KP6R7CV3.js';
3
+ import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-ESP5VZBD.js';
4
4
  import { readlinkSync, realpathSync, mkdirSync, unlinkSync, symlinkSync, renameSync, readFileSync, writeFileSync, rmSync, existsSync, readdirSync } from 'fs';
5
5
  import { join, basename, sep, resolve } from 'path';
6
6
 
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { launchRefusalForSession } from './chunk-ESVW4MJY.js';
4
- import { autoConnect, detectActiveSession } from './chunk-JKXTG3BV.js';
4
+ import { autoConnect, detectActiveSession } from './chunk-ZPW6PUNK.js';
5
5
  import { acquireSpoolLockAt } from './chunk-3H7NZPYG.js';
6
- import { resolveRepoIdentity } from './chunk-GKNF4D62.js';
6
+ import { resolveRepoIdentity } from './chunk-XT5SOJRC.js';
7
7
  import { C } from './chunk-ANPNT6PM.js';
8
- import { resolveGatewayCredentials, defaultFetch, unauthorizedMessage } from './chunk-F3EF56LQ.js';
8
+ import { resolveGatewayCredentials, defaultFetch, unauthorizedMessage } from './chunk-VQ2JGZSC.js';
9
9
  import { launchedItemForSession } from './chunk-T2Q7ISPE.js';
10
10
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
11
11
  import { StepNameSchema, StepBodySchema } from './chunk-3WW2TL7V.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { DEFAULT_UNIT_NAME } from './chunk-RQGHHEM7.js';
4
- import { RUNNER_FILE_MODE } from './chunk-KP6R7CV3.js';
3
+ import { DEFAULT_UNIT_NAME } from './chunk-HBBCQ5NE.js';
4
+ import { RUNNER_FILE_MODE } from './chunk-ESP5VZBD.js';
5
5
  import { claudeEnvPath, withoutCredentialLines } from './chunk-HDSDUTX4.js';
6
6
  import { parseRunnerEnv } from './chunk-XD4ZCMA4.js';
7
7
  import { existsSync, readFileSync, writeFileSync, renameSync, rmSync } from 'fs';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { isVersion, compareVersions } from './chunk-TQMI335S.js';
4
- import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-KP6R7CV3.js';
4
+ import { RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-ESP5VZBD.js';
5
5
  import { readFileSync, mkdirSync, writeFileSync, renameSync } from 'fs';
6
6
  import { join } from 'path';
7
7
 
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { autoConnect, detectActiveSession } from './chunk-JKXTG3BV.js';
4
- import { resolveRepoIdentity } from './chunk-GKNF4D62.js';
3
+ import { autoConnect, detectActiveSession } from './chunk-ZPW6PUNK.js';
4
+ import { resolveRepoIdentity } from './chunk-XT5SOJRC.js';
5
5
  import { C } from './chunk-ANPNT6PM.js';
6
- import { defaultFetch, unauthorizedMessage, resolveGatewayCredentials } from './chunk-F3EF56LQ.js';
6
+ import { defaultFetch, unauthorizedMessage, resolveGatewayCredentials } from './chunk-VQ2JGZSC.js';
7
7
  import { parseWorkItemEnv } from './chunk-T2Q7ISPE.js';
8
8
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
9
9
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -5,7 +5,7 @@ import { addStdioMcpEntryIfAbsent, addDocsMcpEntryIfAbsent, DOCS_MCP_SERVER_NAME
5
5
  import { installStarterPack } from './chunk-QCDVKCHA.js';
6
6
  import { AGENTS_MD_LAYOUT, declareAgentsMdLayout, linkClaudeSkills, SKILLS_LINK_PATH, describeSkillsLink, isAgentsMdLayout, holdsTodaysLayoutSources, discoverOuterlayerPaths } from './chunk-ZAJKEHIE.js';
7
7
  import { C } from './chunk-ANPNT6PM.js';
8
- import { resolveGitCommonDir, defaultGitRunner } from './chunk-D73OLAYE.js';
8
+ import { resolveGitCommonDir, defaultGitRunner } from './chunk-WRX2MCDV.js';
9
9
  import { loadTemplateFiles, loadMaintainedFiles, skillDir, AGENTS_SKILLS_BASE } from './chunk-YW4PEGLN.js';
10
10
  import { cliInvocation } from './chunk-CRB3POP4.js';
11
11
  import { linkedAgentsPath } from './chunk-WXEPMPHK.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { currentLink } from './chunk-ZZSQYOY5.js';
3
+ import { currentLink } from './chunk-3VGDZ23W.js';
4
4
  import { readFileSync, statSync, chmodSync, mkdirSync, writeFileSync, renameSync, rmSync, existsSync, lstatSync, accessSync, constants, realpathSync } from 'fs';
5
5
  import { randomBytes } from 'crypto';
6
6
  import { join, dirname, delimiter, resolve } from 'path';
@@ -35,7 +35,11 @@ var DEFAULT_CHECK_TIME_LIMIT_MINUTES = 10;
35
35
  var CHECKS_KEYS = ["timeLimitMinutes"];
36
36
  var MAX_CHECK_TIME_LIMIT_MINUTES = 240;
37
37
  var DEFAULT_BUILD = { memory: "8g", cpus: 4, pids: 4096, disk: "40g", variables: [] };
38
- var BUILD_KEYS = ["memory", "cpus", "pids", "disk", "variables", "destinations", "allowHosts"];
38
+ function imageBuildOf(config) {
39
+ if (builtinKind(config.hooks.provision) !== "vm") return "host";
40
+ return config.build?.imageBuild ?? "vm";
41
+ }
42
+ var BUILD_KEYS = ["memory", "cpus", "pids", "disk", "variables", "destinations", "allowHosts", "imageBuild"];
39
43
  var HOUSEKEEPING_KEYS = ["jobsKeepDays", "buildCacheMax", "minFreeDisk"];
40
44
  var DEFAULT_JOBS_KEEP_DAYS = 30;
41
45
  var DEFAULT_BUILD_CACHE_MAX = "20g";
@@ -396,6 +400,9 @@ function resolveBuild(configPath, block) {
396
400
  if (!allowHosts.includes(host)) allowHosts.push(host);
397
401
  }
398
402
  }
403
+ if (given.imageBuild !== void 0 && given.imageBuild !== "vm" && given.imageBuild !== "host") {
404
+ fail(configPath, "runner.build.imageBuild", "must be vm or host");
405
+ }
399
406
  return {
400
407
  memory: given.memory ?? DEFAULT_BUILD.memory,
401
408
  cpus: given.cpus ?? DEFAULT_BUILD.cpus,
@@ -403,8 +410,9 @@ function resolveBuild(configPath, block) {
403
410
  disk: given.disk ?? DEFAULT_BUILD.disk,
404
411
  variables,
405
412
  ...destinations.length === 0 ? {} : { destinations },
406
- ...allowHosts === void 0 ? {} : { allowHosts }
413
+ ...allowHosts === void 0 ? {} : { allowHosts },
414
+ ...given.imageBuild === void 0 ? {} : { imageBuild: given.imageBuild }
407
415
  };
408
416
  }
409
417
 
410
- export { DEFAULT_CHECK_TIME_LIMIT_MINUTES, DEFAULT_UPDATE_MAX_WAIT_HOURS, RunnerConfigError, builtinKind, checkHooks, defaultRunnerConfigPath, hasRunnerBlock, isBuiltinContainer, isBuiltinProcess, isBuiltinVm, loadRunnerConfig, resolveBuild, resolveHousekeeping, runnerCredentialProblem, runnerVmOf };
418
+ export { DEFAULT_CHECK_TIME_LIMIT_MINUTES, DEFAULT_UPDATE_MAX_WAIT_HOURS, RunnerConfigError, builtinKind, checkHooks, defaultRunnerConfigPath, hasRunnerBlock, imageBuildOf, isBuiltinContainer, isBuiltinProcess, isBuiltinVm, loadRunnerConfig, resolveBuild, resolveHousekeeping, runnerCredentialProblem, runnerVmOf };