@outerlayer/cli 0.27.1 → 0.28.1

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 (128) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +6 -0
  3. package/dist/{agent-setup-UW36TAQM.js → agent-setup-YVR5RO56.js} +17 -14
  4. package/dist/{bridge-B5VJVECY.js → bridge-WW2V7DTB.js} +3 -2
  5. package/dist/build-5FRC3RKM.js +13 -0
  6. package/dist/build-info.json +1 -1
  7. package/dist/{builder-6Y6ZWGNH.js → builder-4F2XNSFC.js} +7 -6
  8. package/dist/{check-YTXFVWK7.js → check-NDDOASVO.js} +70 -61
  9. package/dist/{chunk-VS27BP3E.js → chunk-2YSCKEL2.js} +7 -7
  10. package/dist/{chunk-BPKO76QR.js → chunk-4XN5FRRJ.js} +4 -4
  11. package/dist/{chunk-EPPIISRD.js → chunk-55XLX5PA.js} +1 -1
  12. package/dist/{chunk-LOKSLO25.js → chunk-5B7BEQPR.js} +1 -1
  13. package/dist/chunk-5BHIBJDA.js +93 -0
  14. package/dist/{chunk-RHAGBUL5.js → chunk-5K3KB4YR.js} +1 -1
  15. package/dist/{chunk-ABXQBEYK.js → chunk-66T6XJAB.js} +1 -1
  16. package/dist/{chunk-LPFOWUHG.js → chunk-6BWJQGTV.js} +20 -13
  17. package/dist/{chunk-BWH36FOC.js → chunk-7CK2TJFB.js} +20 -4
  18. package/dist/{chunk-5VMDGJGH.js → chunk-7UGFIWIW.js} +37 -23
  19. package/dist/{chunk-QKIQ2R7F.js → chunk-ATJOFXTE.js} +3 -3
  20. package/dist/chunk-CDDED64E.js +13 -0
  21. package/dist/{chunk-QHH4OSD4.js → chunk-CTYSTE5C.js} +1 -1
  22. package/dist/{chunk-DJHNEGNM.js → chunk-DKWQMPSL.js} +18 -2
  23. package/dist/{chunk-IMOB4IOI.js → chunk-DQYMQ47E.js} +3 -2
  24. package/dist/{chunk-YETTWTAY.js → chunk-E7R2GIAW.js} +4 -4
  25. package/dist/{chunk-GFUE5TKO.js → chunk-F4FA3ZUT.js} +24 -14
  26. package/dist/{chunk-6TRNCUM4.js → chunk-FGF52V4V.js} +1 -1
  27. package/dist/{chunk-MATUHHN4.js → chunk-GUXWQIEY.js} +1 -1
  28. package/dist/{chunk-2I3LIRZP.js → chunk-HXAEQPZR.js} +101 -10
  29. package/dist/{chunk-R7SGBXUD.js → chunk-IKXY47R5.js} +107 -56
  30. package/dist/{chunk-P33PZIWS.js → chunk-ITAIEJ2T.js} +7 -142
  31. package/dist/{chunk-RHGF73IU.js → chunk-IVX3U7KV.js} +1 -1
  32. package/dist/{chunk-7OUOLGUV.js → chunk-JGML2VUN.js} +3 -7
  33. package/dist/{chunk-6VFH52MP.js → chunk-KVDVNOUK.js} +24 -22
  34. package/dist/{chunk-2F762IXY.js → chunk-LNIFYSNK.js} +3 -3
  35. package/dist/{chunk-XBPUTQ7E.js → chunk-MHAR6S7B.js} +1 -1
  36. package/dist/{chunk-7AQ5AM7U.js → chunk-MQHTM4YJ.js} +177 -21
  37. package/dist/{chunk-6KKM7VGZ.js → chunk-N7WAEEIU.js} +3 -3
  38. package/dist/{chunk-D7ECMB7B.js → chunk-NUHZV3A4.js} +1 -1
  39. package/dist/{chunk-MHX7YX7Y.js → chunk-P2RWZCV7.js} +1 -1
  40. package/dist/chunk-QBQHQEUG.js +300 -0
  41. package/dist/{chunk-FP23SVDD.js → chunk-QJFDAKRF.js} +5 -5
  42. package/dist/{chunk-WUL2OP5A.js → chunk-QKXF7CLR.js} +3 -3
  43. package/dist/{chunk-Y7ZCHBYB.js → chunk-QWAYRAUX.js} +3 -3
  44. package/dist/{chunk-64GMBWAK.js → chunk-R7SS5RLJ.js} +6 -6
  45. package/dist/{chunk-XZ6Q6ZNR.js → chunk-SATUCMAJ.js} +3 -2
  46. package/dist/{chunk-2BTFKNTR.js → chunk-SJZL5F3F.js} +2 -2
  47. package/dist/{chunk-HWDYLXHH.js → chunk-T2QSWFSU.js} +4 -4
  48. package/dist/{chunk-B7DJVG25.js → chunk-T57XUI6N.js} +3 -3
  49. package/dist/{chunk-E5IJ5533.js → chunk-TF7G2PR6.js} +3 -3
  50. package/dist/{chunk-O2IJTY7L.js → chunk-TVZAC2NP.js} +3 -3
  51. package/dist/{chunk-QE3UQAHK.js → chunk-UHU7H57K.js} +26 -7
  52. package/dist/{chunk-WSYXLLA5.js → chunk-USJZ2LDK.js} +6 -6
  53. package/dist/{chunk-EX5MQYEF.js → chunk-VC5J7QPV.js} +5 -5
  54. package/dist/{chunk-N4D5TMVU.js → chunk-VU7ZJPIR.js} +5 -5
  55. package/dist/{chunk-ZFBJUOYT.js → chunk-W3FSGH2M.js} +10 -10
  56. package/dist/{chunk-GLUKDQS4.js → chunk-WWQVKFN6.js} +1 -1
  57. package/dist/{chunk-55GNQPO6.js → chunk-X52PMPOM.js} +7 -7
  58. package/dist/{chunk-YB3CSYXX.js → chunk-XD4ZCMA4.js} +81 -2
  59. package/dist/{chunk-Y4OKEFAX.js → chunk-YL2VDSNF.js} +1 -1
  60. package/dist/{chunk-M3MHHIUW.js → chunk-Z3ASAXVU.js} +1 -1
  61. package/dist/{chunk-XS3FDWSZ.js → chunk-ZTY7HHYB.js} +1 -1
  62. package/dist/{claude-launcher-NQSZBTQ5.js → claude-launcher-7RGVOYCD.js} +6 -5
  63. package/dist/{cli-GHEOBXC7.js → cli-QC6ZKHPK.js} +149 -128
  64. package/dist/cli-update-notice-4DLZ3655.js +9 -0
  65. package/dist/{command-V7B7GTPZ.js → command-3F6GY4CK.js} +53 -37
  66. package/dist/{config-TWS5VZEN.js → config-5QYIKYUP.js} +3 -2
  67. package/dist/{connect-cmd-HGS7YPA2.js → connect-cmd-5TYAOK5M.js} +14 -11
  68. package/dist/{container-start-FHB2VDC4.js → container-start-P7O5XGOB.js} +37 -36
  69. package/dist/{control-plane-launch-DBQA3KLJ.js → control-plane-launch-FZMD4MXX.js} +13 -10
  70. package/dist/{dist-QPHZE47F.js → dist-JFVKLUHL.js} +1 -1
  71. package/dist/{docker-YT6Z3LXI.js → docker-ZTC4EIU4.js} +7 -6
  72. package/dist/{doctor-Y4NCNSJM.js → doctor-QPQDF7FB.js} +159 -41
  73. package/dist/{emit-artifact-cmd-ALDK55Y2.js → emit-artifact-cmd-O3IBUMUY.js} +19 -16
  74. package/dist/{emit-cmd-VAQHRWJR.js → emit-cmd-QUABLVO6.js} +6 -5
  75. package/dist/{emit-criteria-cmd-Q7SM6VP2.js → emit-criteria-cmd-JDO2VUG5.js} +15 -12
  76. package/dist/{emit-finding-cmd-2NBAPDSV.js → emit-finding-cmd-VCQPCLI2.js} +16 -13
  77. package/dist/{emit-result-cmd-KUSL56RI.js → emit-result-cmd-BNS57DD3.js} +19 -16
  78. package/dist/{emit-step-cmd-KD4AKEAT.js → emit-step-cmd-XN44BXYU.js} +16 -13
  79. package/dist/{exec-client-6WVS7DRZ.js → exec-client-VKT2XNB3.js} +4 -3
  80. package/dist/fleet-readiness-G5X3MKP2.js +29 -0
  81. package/dist/{governing-source-VVUA5TKB.js → governing-source-B3M2U4BC.js} +21 -18
  82. package/dist/{guest-init-H5K2RW3P.js → guest-init-QW2DPX7H.js} +5 -4
  83. package/dist/{hook-fast-3SUJM765.js → hook-fast-EFC44SXV.js} +4 -1
  84. package/dist/{host-key-XNKZCWTS.js → host-key-AC6LTZDS.js} +4 -3
  85. package/dist/{image-tag-R34J4O3F.js → image-tag-SS7YKJHN.js} +4 -3
  86. package/dist/index.js +4 -4
  87. package/dist/{init-3DAGX7UY.js → init-36XMFFRQ.js} +38 -37
  88. package/dist/init-HHEAJDPN.js +56 -0
  89. package/dist/{init-cmd-RIDBVSE4.js → init-cmd-K2IKTSXJ.js} +25 -21
  90. package/dist/{init-update-ECWNG47R.js → init-update-RWTQSTPE.js} +51 -35
  91. package/dist/{inspect-IPFA7AAT.js → inspect-L7JIBK3Y.js} +1 -1
  92. package/dist/{install-6OIY3KHZ.js → install-35SAMY75.js} +5 -5
  93. package/dist/{install-cmd-JMT67P35.js → install-cmd-GFY4QF72.js} +6 -5
  94. package/dist/{layout-XNFDTOET.js → layout-BBTQPS6V.js} +4 -3
  95. package/dist/{login-browser-EWXSGHM7.js → login-browser-WSOSQH2T.js} +2 -2
  96. package/dist/{logs-XHAS6LMZ.js → logs-X2IRDP5T.js} +3 -2
  97. package/dist/loop-F5ASKFRJ.js +80 -0
  98. package/dist/{machine-OOQ2NXC3.js → machine-6STGIRJJ.js} +32 -30
  99. package/dist/{machine-skills-FLIRJYP7.js → machine-skills-O7W6NMWB.js} +4 -3
  100. package/dist/{mcp-serve-cmd-LY5A3CE7.js → mcp-serve-cmd-IITCPAAR.js} +9 -6
  101. package/dist/{paths-LHSPNORF.js → paths-32DWGK35.js} +3 -2
  102. package/dist/pending-CSIY4Y2I.js +10 -0
  103. package/dist/{pidfile-DKMYYXLH.js → pidfile-CYCTH6NQ.js} +4 -3
  104. package/dist/{real-deps-KNNBQC75.js → real-deps-QX5YH7FG.js} +1 -1
  105. package/dist/{record-3LPTY3G5.js → record-N4WPZCGK.js} +4 -3
  106. package/dist/{runner-env-YRRNRKF4.js → runner-env-EIB6WFPG.js} +6 -7
  107. package/dist/{runner-identity-YS2BZXZV.js → runner-identity-S3V6I4I3.js} +7 -6
  108. package/dist/{runner-key-EFNTZWNX.js → runner-key-Y76QXVNV.js} +36 -35
  109. package/dist/{session-sender-SC5PSU2G.js → session-sender-LFYMN6TT.js} +20 -17
  110. package/dist/{spec-cmd-JGYHHJ4P.js → spec-cmd-Z6MGATWC.js} +16 -13
  111. package/dist/{starter-pack-GPU4X6B7.js → starter-pack-5SOT5V4I.js} +4 -3
  112. package/dist/{status-7WM7S7JX.js → status-OANG2EM3.js} +39 -37
  113. package/dist/{sync-cmd-ATXJVS7S.js → sync-cmd-TNOOUPY2.js} +19 -16
  114. package/dist/{watch-M7NR3DOW.js → watch-HBNNYATF.js} +19 -16
  115. package/dist/{work-claim-cmd-DNUDZKJA.js → work-claim-cmd-CXALMILD.js} +21 -18
  116. package/dist/{work-cmd-VECTYST6.js → work-cmd-COESFSHE.js} +16 -13
  117. package/dist/{work-comment-cmd-F3NRWKPZ.js → work-comment-cmd-A4ZUVCSA.js} +16 -13
  118. package/dist/{work-logs-cmd-QF6P32FE.js → work-logs-cmd-CTF43MBE.js} +16 -13
  119. package/dist/{work-open-pr-cmd-XE23JA3R.js → work-open-pr-cmd-EMGYJXVD.js} +17 -14
  120. package/dist/{work-pr-cmd-BH56GUKN.js → work-pr-cmd-FEXMS6RH.js} +16 -13
  121. package/dist/{work-stop-cmd-C3F5HNUO.js → work-stop-cmd-NIHAN45R.js} +16 -13
  122. package/package.json +1 -1
  123. package/dist/build-HRLACBOZ.js +0 -12
  124. package/dist/chunk-STSLH5EJ.js +0 -71
  125. package/dist/init-SWKYV6CL.js +0 -55
  126. package/dist/loop-AIJZVUNA.js +0 -79
  127. package/dist/pending-3YZCSKON.js +0 -9
  128. package/dist/{chunk-6BLXUD56.js → chunk-HOU33DW5.js} +1 -1
@@ -0,0 +1,9 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ export { PLAIN_VERSION, isCommandInTerminal, newerRecordedVersion, recordCliVersion, removeRecordedVersion, staleMachineCopiesContext, updateNoticeContext, updateNoticeLine, updateNoticeSkipped, updateNoticeSuppressed } from './chunk-5BHIBJDA.js';
4
+ import './chunk-CDDED64E.js';
5
+ import './chunk-CRB3POP4.js';
6
+ import './chunk-VNVZDWO3.js';
7
+ import './chunk-Z5GEFMRW.js';
8
+
9
+ createRequire(import.meta.url);
@@ -1,56 +1,58 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { runRunnerInstall, launcherSummary, restartNote } from './chunk-QKIQ2R7F.js';
4
- import './chunk-QHH4OSD4.js';
5
- import { currentLink, execStartCommand } from './chunk-MATUHHN4.js';
6
- import { detectMachine } from './chunk-B7DJVG25.js';
7
- import { helperSocketPath, ensureFirecrackerAndJailer } from './chunk-R7SGBXUD.js';
8
- import './chunk-WSYXLLA5.js';
9
- import './chunk-M3MHHIUW.js';
3
+ import { runRunnerInstall, launcherSummary, restartNote } from './chunk-ATJOFXTE.js';
4
+ import './chunk-CTYSTE5C.js';
5
+ import { currentLink, execStartCommand } from './chunk-GUXWQIEY.js';
6
+ import { detectMachine } from './chunk-T57XUI6N.js';
7
+ import { helperSocketPath, ensureFirecrackerAndJailer } from './chunk-IKXY47R5.js';
8
+ import './chunk-MHAR6S7B.js';
9
+ import './chunk-WWQVKFN6.js';
10
+ import './chunk-USJZ2LDK.js';
11
+ import './chunk-Z3ASAXVU.js';
10
12
  import './chunk-TQMI335S.js';
11
- import { DEFAULT_UNIT_NAME, installService, uninstallService, realTaskScheduler, UNIT_MARKER } from './chunk-7AQ5AM7U.js';
12
- import './chunk-YB3CSYXX.js';
13
+ import { DEFAULT_UNIT_NAME, installService, uninstallService, realTaskScheduler, UNIT_MARKER } from './chunk-MQHTM4YJ.js';
14
+ import { runnerVmOf, loadRunnerConfig, builtinKind } from './chunk-55XLX5PA.js';
15
+ import './chunk-UXYLWVTQ.js';
16
+ import { realLima } from './chunk-77MM5RYD.js';
13
17
  import { writeLaunchAgent, launchAgentPath } from './chunk-LF6MLJCY.js';
14
- import './chunk-HWDYLXHH.js';
15
- import './chunk-D7ECMB7B.js';
18
+ import './chunk-T2QSWFSU.js';
19
+ import './chunk-NUHZV3A4.js';
16
20
  import './chunk-JBJTC3UU.js';
17
21
  import './chunk-OGFGZQA3.js';
18
- import { readJobFile } from './chunk-EX5MQYEF.js';
19
- import { firecrackerArch, MICROVM_ARCHES, FIRECRACKER_VERSION, FIRECRACKER_BINARY_SHA256, JAILER_BINARY_SHA256, HOST_HELPER_SHA256, HOST_HELPER_BASE_URL, HOST_HELPER_ASSETS_VERSION, hostHelperPinned } from './chunk-2BTFKNTR.js';
20
- import './chunk-XBPUTQ7E.js';
21
- import './chunk-GLUKDQS4.js';
22
- import './chunk-55GNQPO6.js';
23
- import './chunk-2F762IXY.js';
24
- import './chunk-N4D5TMVU.js';
22
+ import { readJobFile } from './chunk-VC5J7QPV.js';
23
+ import './chunk-YJLHUKYS.js';
24
+ import { firecrackerArch, MICROVM_ARCHES, FIRECRACKER_VERSION, FIRECRACKER_BINARY_SHA256, JAILER_BINARY_SHA256, HOST_HELPER_SHA256, HOST_HELPER_BASE_URL, HOST_HELPER_ASSETS_VERSION, hostHelperPinned } from './chunk-SJZL5F3F.js';
25
+ import './chunk-X52PMPOM.js';
26
+ import './chunk-LNIFYSNK.js';
27
+ import './chunk-VU7ZJPIR.js';
25
28
  import './chunk-BUP5N3X6.js';
26
- import './chunk-LOKSLO25.js';
27
- import './chunk-6BLXUD56.js';
29
+ import './chunk-UHU7H57K.js';
30
+ import './chunk-5B7BEQPR.js';
31
+ import './chunk-HOU33DW5.js';
28
32
  import './chunk-G2JWZDFA.js';
29
- import { runnerVmOf, loadRunnerConfig, builtinKind } from './chunk-EPPIISRD.js';
30
- import './chunk-UXYLWVTQ.js';
31
- import './chunk-YJLHUKYS.js';
32
- import { realLima } from './chunk-77MM5RYD.js';
33
- import './chunk-BPKO76QR.js';
34
- import './chunk-MHX7YX7Y.js';
35
- import './chunk-BWH36FOC.js';
33
+ import './chunk-ANPNT6PM.js';
34
+ import './chunk-4XN5FRRJ.js';
35
+ import './chunk-P2RWZCV7.js';
36
+ import './chunk-7CK2TJFB.js';
37
+ import './chunk-PJDQPF5N.js';
38
+ import './chunk-YL2VDSNF.js';
39
+ import { runnerDir } from './chunk-5K3KB4YR.js';
40
+ import './chunk-HXAEQPZR.js';
36
41
  import './chunk-ZJSNLVCE.js';
37
- import './chunk-6TRNCUM4.js';
42
+ import './chunk-FGF52V4V.js';
38
43
  import './chunk-HCVLP7XA.js';
39
44
  import './chunk-BJ3KTMDH.js';
40
- import './chunk-7OUOLGUV.js';
41
- import './chunk-QE3UQAHK.js';
42
- import './chunk-ANPNT6PM.js';
43
- import './chunk-PJDQPF5N.js';
45
+ import './chunk-JGML2VUN.js';
46
+ import './chunk-5BHIBJDA.js';
47
+ import './chunk-CDDED64E.js';
48
+ import './chunk-RA3O54FC.js';
44
49
  import './chunk-WZBHBH3J.js';
45
50
  import './chunk-CRB3POP4.js';
46
51
  import './chunk-YQR6E6OV.js';
47
52
  import './chunk-RKOTJQVG.js';
48
53
  import './chunk-QZBXLLTV.js';
49
54
  import './chunk-VNVZDWO3.js';
50
- import './chunk-RA3O54FC.js';
51
- import './chunk-Y4OKEFAX.js';
52
- import { runnerDir } from './chunk-RHAGBUL5.js';
53
- import './chunk-2I3LIRZP.js';
55
+ import './chunk-XD4ZCMA4.js';
54
56
  import './chunk-JGD5TWQ2.js';
55
57
  import './chunk-Z5GEFMRW.js';
56
58
  import { userInfo, totalmem, tmpdir } from 'os';
@@ -304,6 +306,12 @@ function sudoWrite(path, text) {
304
306
  function realSystemd() {
305
307
  return {
306
308
  running: () => existsSync("/run/systemd/system"),
309
+ version: () => {
310
+ const result = spawnSync("systemctl", ["--version"], { encoding: "utf8" });
311
+ if (result.status !== 0) return void 0;
312
+ const major = /^systemd (\d+)/.exec((result.stdout ?? "").split("\n")[0] ?? "")?.[1];
313
+ return major === void 0 ? void 0 : Number(major);
314
+ },
307
315
  read: readText,
308
316
  write: sudoWrite,
309
317
  remove: (path) => {
@@ -315,8 +323,16 @@ function realSystemd() {
315
323
  }
316
324
  };
317
325
  }
326
+ function readWslConf() {
327
+ try {
328
+ return { kind: "text", text: readFileSync(WSL_CONF, "utf8") };
329
+ } catch (err) {
330
+ if (err.code === "ENOENT") return { kind: "missing" };
331
+ return { kind: "unreadable", message: err instanceof Error ? err.message : String(err) };
332
+ }
333
+ }
318
334
  function realWslConf() {
319
- return { read: () => readText(WSL_CONF), write: (text) => sudoWrite(WSL_CONF, text) };
335
+ return { read: readWslConf, write: (text) => sudoWrite(WSL_CONF, text) };
320
336
  }
321
337
  function buildsRunningIn(runnerDirPath) {
322
338
  const jobs = join(runnerDirPath, "jobs");
@@ -1,10 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { DEFAULT_CHECK_TIME_LIMIT_MINUTES, DEFAULT_UPDATE_MAX_WAIT_HOURS, RunnerConfigError, builtinKind, checkHooks, defaultRunnerConfigPath, hasRunnerBlock, isBuiltinContainer, isBuiltinProcess, isBuiltinVm, loadRunnerConfig, resolveBuild, resolveHousekeeping, runnerCredentialProblem, runnerVmOf } from './chunk-EPPIISRD.js';
3
+ export { DEFAULT_CHECK_TIME_LIMIT_MINUTES, DEFAULT_UPDATE_MAX_WAIT_HOURS, RunnerConfigError, builtinKind, checkHooks, defaultRunnerConfigPath, hasRunnerBlock, isBuiltinContainer, isBuiltinProcess, isBuiltinVm, loadRunnerConfig, resolveBuild, resolveHousekeeping, runnerCredentialProblem, runnerVmOf } from './chunk-55XLX5PA.js';
4
4
  import './chunk-UXYLWVTQ.js';
5
5
  import './chunk-YJLHUKYS.js';
6
+ import './chunk-HXAEQPZR.js';
6
7
  import './chunk-VNVZDWO3.js';
7
- import './chunk-2I3LIRZP.js';
8
+ import './chunk-XD4ZCMA4.js';
8
9
  import './chunk-JGD5TWQ2.js';
9
10
  import './chunk-Z5GEFMRW.js';
10
11
 
@@ -1,24 +1,27 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { AGENTS_LAYOUT_COMMIT_LINE, COMMIT_LINE, autoConnectedLine, commitLineFor, listText as factoryListText, slug as factorySlug, fetchFactories, hasUncommittedPolicy, promptOnTerminal, realConnectDeps, runConnect, runConnectCommand, saveFactoryConnection, selectFactory } from './chunk-N4D5TMVU.js';
3
+ export { AGENTS_LAYOUT_COMMIT_LINE, COMMIT_LINE, autoConnectedLine, commitLineFor, listText as factoryListText, slug as factorySlug, fetchFactories, hasUncommittedPolicy, promptOnTerminal, realConnectDeps, runConnect, runConnectCommand, saveFactoryConnection, selectFactory } from './chunk-VU7ZJPIR.js';
4
4
  import './chunk-BUP5N3X6.js';
5
- import './chunk-LOKSLO25.js';
6
- import './chunk-6BLXUD56.js';
5
+ import './chunk-UHU7H57K.js';
6
+ import './chunk-5B7BEQPR.js';
7
+ import './chunk-HOU33DW5.js';
7
8
  import './chunk-G2JWZDFA.js';
8
- import './chunk-BWH36FOC.js';
9
- import './chunk-BJ3KTMDH.js';
10
- import './chunk-7OUOLGUV.js';
11
- import './chunk-QE3UQAHK.js';
12
9
  import './chunk-ANPNT6PM.js';
10
+ import './chunk-7CK2TJFB.js';
13
11
  import './chunk-PJDQPF5N.js';
12
+ import './chunk-YL2VDSNF.js';
13
+ import './chunk-5K3KB4YR.js';
14
+ import './chunk-HXAEQPZR.js';
15
+ import './chunk-BJ3KTMDH.js';
16
+ import './chunk-JGML2VUN.js';
17
+ import './chunk-5BHIBJDA.js';
18
+ import './chunk-CDDED64E.js';
19
+ import './chunk-RA3O54FC.js';
14
20
  import './chunk-CRB3POP4.js';
15
21
  import './chunk-RKOTJQVG.js';
16
22
  import './chunk-QZBXLLTV.js';
17
23
  import './chunk-VNVZDWO3.js';
18
- import './chunk-RA3O54FC.js';
19
- import './chunk-Y4OKEFAX.js';
20
- import './chunk-RHAGBUL5.js';
21
- import './chunk-2I3LIRZP.js';
24
+ import './chunk-XD4ZCMA4.js';
22
25
  import './chunk-JGD5TWQ2.js';
23
26
  import './chunk-Z5GEFMRW.js';
24
27
 
@@ -1,54 +1,55 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { RunnerInitError, prepareRunnerInit, writeRunnerInit } from './chunk-64GMBWAK.js';
4
- import { detectMachine, supportsContainerBuilds, describeMachineDocker } from './chunk-B7DJVG25.js';
5
- import { MIN_ENGINE_MAJOR } from './chunk-R7SGBXUD.js';
6
- import './chunk-WSYXLLA5.js';
7
- import { runnerImageVersion, IMAGE_VERSION_VARIABLE } from './chunk-M3MHHIUW.js';
3
+ import { RunnerInitError, prepareRunnerInit, writeRunnerInit } from './chunk-R7SS5RLJ.js';
4
+ import { detectMachine, supportsContainerBuilds, describeMachineDocker } from './chunk-T57XUI6N.js';
5
+ import { MIN_ENGINE_MAJOR } from './chunk-IKXY47R5.js';
6
+ import './chunk-MHAR6S7B.js';
7
+ import './chunk-WWQVKFN6.js';
8
+ import './chunk-USJZ2LDK.js';
9
+ import { runnerImageVersion, IMAGE_VERSION_VARIABLE } from './chunk-Z3ASAXVU.js';
8
10
  import './chunk-TQMI335S.js';
9
- import { isAgentName, AGENT_COMMANDS } from './chunk-GFUE5TKO.js';
10
- import './chunk-7AQ5AM7U.js';
11
- import './chunk-YB3CSYXX.js';
12
- import './chunk-STSLH5EJ.js';
13
- import './chunk-HWDYLXHH.js';
14
- import './chunk-D7ECMB7B.js';
11
+ import { isAgentName, AGENT_COMMANDS } from './chunk-F4FA3ZUT.js';
12
+ import './chunk-MQHTM4YJ.js';
13
+ import './chunk-55XLX5PA.js';
14
+ import './chunk-UXYLWVTQ.js';
15
+ import './chunk-T2QSWFSU.js';
16
+ import './chunk-NUHZV3A4.js';
15
17
  import './chunk-JBJTC3UU.js';
16
18
  import './chunk-OGFGZQA3.js';
17
- import './chunk-EX5MQYEF.js';
18
- import './chunk-2BTFKNTR.js';
19
- import './chunk-XBPUTQ7E.js';
20
- import './chunk-GLUKDQS4.js';
21
- import './chunk-55GNQPO6.js';
22
- import './chunk-2F762IXY.js';
23
- import './chunk-N4D5TMVU.js';
19
+ import './chunk-VC5J7QPV.js';
20
+ import './chunk-YJLHUKYS.js';
21
+ import './chunk-SJZL5F3F.js';
22
+ import './chunk-X52PMPOM.js';
23
+ import './chunk-LNIFYSNK.js';
24
+ import './chunk-VU7ZJPIR.js';
24
25
  import './chunk-BUP5N3X6.js';
25
- import './chunk-LOKSLO25.js';
26
- import './chunk-6BLXUD56.js';
26
+ import './chunk-UHU7H57K.js';
27
+ import './chunk-5B7BEQPR.js';
28
+ import './chunk-HOU33DW5.js';
27
29
  import './chunk-G2JWZDFA.js';
28
- import './chunk-EPPIISRD.js';
29
- import './chunk-UXYLWVTQ.js';
30
- import './chunk-YJLHUKYS.js';
31
- import './chunk-BPKO76QR.js';
32
- import './chunk-MHX7YX7Y.js';
33
- import './chunk-BWH36FOC.js';
30
+ import './chunk-ANPNT6PM.js';
31
+ import './chunk-4XN5FRRJ.js';
32
+ import './chunk-P2RWZCV7.js';
33
+ import './chunk-7CK2TJFB.js';
34
+ import './chunk-PJDQPF5N.js';
35
+ import './chunk-YL2VDSNF.js';
36
+ import './chunk-5K3KB4YR.js';
37
+ import { CLAUDE_CREDENTIAL_VARIABLES, readClaudeCredential } from './chunk-HXAEQPZR.js';
34
38
  import './chunk-ZJSNLVCE.js';
35
- import './chunk-6TRNCUM4.js';
39
+ import './chunk-FGF52V4V.js';
36
40
  import './chunk-HCVLP7XA.js';
37
41
  import './chunk-BJ3KTMDH.js';
38
- import './chunk-7OUOLGUV.js';
39
- import './chunk-QE3UQAHK.js';
40
- import './chunk-ANPNT6PM.js';
41
- import './chunk-PJDQPF5N.js';
42
+ import './chunk-JGML2VUN.js';
43
+ import './chunk-5BHIBJDA.js';
44
+ import './chunk-CDDED64E.js';
45
+ import './chunk-RA3O54FC.js';
42
46
  import './chunk-WZBHBH3J.js';
43
47
  import './chunk-CRB3POP4.js';
44
48
  import './chunk-YQR6E6OV.js';
45
49
  import './chunk-RKOTJQVG.js';
46
50
  import './chunk-QZBXLLTV.js';
47
51
  import './chunk-VNVZDWO3.js';
48
- import './chunk-RA3O54FC.js';
49
- import './chunk-Y4OKEFAX.js';
50
- import './chunk-RHAGBUL5.js';
51
- import { CLAUDE_CREDENTIAL_VARIABLES } from './chunk-2I3LIRZP.js';
52
+ import './chunk-XD4ZCMA4.js';
52
53
  import './chunk-JGD5TWQ2.js';
53
54
  import './chunk-Z5GEFMRW.js';
54
55
  import { existsSync, readFileSync } from 'fs';
@@ -122,7 +123,7 @@ async function containerStart(deps) {
122
123
  if (!isAgentName(agent)) {
123
124
  return refuse(`OUTERLAYER_AGENT is ${agent}, and the image writes commands for ${Object.keys(AGENT_COMMANDS).join(", ")} only. Leave it unset to use claude.`);
124
125
  }
125
- if (!CLAUDE_CREDENTIAL_VARIABLES.some((name) => set(env, name) !== void 0)) {
126
+ if (!CLAUDE_CREDENTIAL_VARIABLES.some((name) => set(env, name) !== void 0) && readClaudeCredential(env) === void 0) {
126
127
  missing.push(`one Claude credential: ${CLAUDE_CREDENTIAL_VARIABLES.join(", ")}`);
127
128
  }
128
129
  if (missing.length > 0) {
@@ -1,14 +1,20 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { parseOwnerRepo, lookupGoverningSource, defaultGitRunner, materializeContext } from './chunk-BPKO76QR.js';
4
- import './chunk-MHX7YX7Y.js';
5
- import { resolveGatewayCredentials, defaultFetch } from './chunk-BWH36FOC.js';
3
+ import { parseOwnerRepo, lookupGoverningSource, defaultGitRunner, materializeContext } from './chunk-4XN5FRRJ.js';
4
+ import './chunk-P2RWZCV7.js';
5
+ import { resolveGatewayCredentials, defaultFetch } from './chunk-7CK2TJFB.js';
6
+ import './chunk-PJDQPF5N.js';
7
+ import './chunk-YL2VDSNF.js';
8
+ import './chunk-5K3KB4YR.js';
9
+ import './chunk-HXAEQPZR.js';
6
10
  import './chunk-ZJSNLVCE.js';
7
- import { layoutRefusalMessage, unsupportedLayout, sharedSkillNames, skillConflictMessage, composeDelivery } from './chunk-6TRNCUM4.js';
11
+ import { layoutRefusalMessage, unsupportedLayout, sharedSkillNames, skillConflictMessage, composeDelivery } from './chunk-FGF52V4V.js';
8
12
  import './chunk-HCVLP7XA.js';
9
13
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
10
- import './chunk-7OUOLGUV.js';
11
- import './chunk-PJDQPF5N.js';
14
+ import './chunk-JGML2VUN.js';
15
+ import './chunk-5BHIBJDA.js';
16
+ import './chunk-CDDED64E.js';
17
+ import './chunk-RA3O54FC.js';
12
18
  import './chunk-CRB3POP4.js';
13
19
  import { cleanupEarlierCopies } from './chunk-VWFOKRYS.js';
14
20
  import { readSourceCache, readDeliveryRecord, isSourceCacheFresh, writeDeliveryRecord, writeSourceCache, SOURCE_CACHE_TTL_SUCCESS_MS, clearDegraded, removeLauncherDeliveryRecord } from './chunk-YQR6E6OV.js';
@@ -16,10 +22,7 @@ import './chunk-TUSYOL2O.js';
16
22
  import './chunk-RKOTJQVG.js';
17
23
  import './chunk-QZBXLLTV.js';
18
24
  import './chunk-VNVZDWO3.js';
19
- import './chunk-RA3O54FC.js';
20
- import './chunk-Y4OKEFAX.js';
21
- import './chunk-RHAGBUL5.js';
22
- import './chunk-2I3LIRZP.js';
25
+ import './chunk-XD4ZCMA4.js';
23
26
  import './chunk-JGD5TWQ2.js';
24
27
  import './chunk-Z5GEFMRW.js';
25
28
  import { execFileSync } from 'child_process';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { CaptureDaemon, PRICE_TABLE_SOURCE, SECRET_PATTERNS, SOURCE_ADAPTERS, SUPPORTED_VERSIONS, StatuslineAggregator, WARNING_CODES, claudeCodeAdapter, codexAdapter, codexSessionIdFromPath, compareVersions, completePrefix, computeStatuslineState, costOfUsage, cursorAdapter, cursorChatIdFromPath, defaultCodexSessionsDir, defaultCursorChatsDir, defaultCursorProjectsDir, defaultProjectsDir, defaultRawDir, enrichSessionRepo, findCodexRollouts, findCursorChats, findTranscripts, isNewerThanSupported, isPriceKnown, normalizeErrorSignature, normalizeRemote, parseCodexRollout, parseCursorChat, parseTranscript, readStatuslineState, readSyncWatermarkMs, remoteLookupFailed, resolvePrice, resolveRepoIdentity, rootChildIds, scanAll, scrubDeep, scrubText, sessionIdFromPath, setCustomScrubbers, setLocalIdentity, setRepoRoot, statuslineStatePath, tailTranscript, workspacesByHash, writeStatuslineState } from './chunk-QE3UQAHK.js';
3
+ export { CaptureDaemon, PRICE_TABLE_SOURCE, SECRET_PATTERNS, SOURCE_ADAPTERS, SUPPORTED_VERSIONS, StatuslineAggregator, WARNING_CODES, claudeCodeAdapter, codexAdapter, codexSessionIdFromPath, compareVersions, completePrefix, computeStatuslineState, costOfUsage, cursorAdapter, cursorChatIdFromPath, defaultCodexSessionsDir, defaultCursorChatsDir, defaultCursorProjectsDir, defaultProjectsDir, defaultRawDir, enrichSessionRepo, findCodexRollouts, findCursorChats, findTranscripts, isNewerThanSupported, isPriceKnown, normalizeErrorSignature, normalizeRemote, parseCodexRollout, parseCursorChat, parseTranscript, readStatuslineState, readSyncWatermarkMs, remoteLookupFailed, resolvePrice, resolveRepoIdentity, rootChildIds, scanAll, scrubDeep, scrubText, sessionIdFromPath, setCustomScrubbers, setLocalIdentity, setRepoRoot, statuslineStatePath, tailTranscript, workspacesByHash, writeStatuslineState } from './chunk-UHU7H57K.js';
4
4
  import './chunk-QZBXLLTV.js';
5
5
  import './chunk-Z5GEFMRW.js';
6
6
 
@@ -1,13 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { childEnvironment, createDockerHost, spawnRun } from './chunk-EX5MQYEF.js';
4
- import './chunk-2BTFKNTR.js';
3
+ export { childEnvironment, createDockerHost, spawnRun } from './chunk-VC5J7QPV.js';
5
4
  import './chunk-YJLHUKYS.js';
6
- import './chunk-QE3UQAHK.js';
5
+ import './chunk-SJZL5F3F.js';
6
+ import './chunk-UHU7H57K.js';
7
+ import './chunk-YL2VDSNF.js';
8
+ import './chunk-5K3KB4YR.js';
9
+ import './chunk-HXAEQPZR.js';
7
10
  import './chunk-QZBXLLTV.js';
8
- import './chunk-Y4OKEFAX.js';
9
- import './chunk-RHAGBUL5.js';
10
- import './chunk-2I3LIRZP.js';
11
+ import './chunk-XD4ZCMA4.js';
11
12
  import './chunk-JGD5TWQ2.js';
12
13
  import './chunk-Z5GEFMRW.js';
13
14
 
@@ -1,65 +1,66 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { launcherCheck } from './chunk-QHH4OSD4.js';
4
- import { needsClaudeCredential, claudeCredentialCheck, missingPermissionOf, missingPermissionFix } from './chunk-ZFBJUOYT.js';
5
- import './chunk-MATUHHN4.js';
3
+ import { launcherCheck } from './chunk-CTYSTE5C.js';
4
+ import { needsClaudeCredential, claudeCredentialCheck, missingPermissionOf, missingPermissionFix } from './chunk-W3FSGH2M.js';
6
5
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
6
+ import './chunk-GUXWQIEY.js';
7
7
  import { RepoFilter } from './chunk-TBT347UY.js';
8
- import './chunk-64GMBWAK.js';
9
- import { detectMachine, supportsContainerBuilds, describeMachineDocker, reachDockerStep, supportsMicroVmBuilds, microVmArchSupported, microVmAssetsPinned } from './chunk-B7DJVG25.js';
10
- import { MIN_ENGINE_MAJOR, helperFirecrackerNote, probeHelper, helperSocketPath } from './chunk-R7SGBXUD.js';
11
- import './chunk-WSYXLLA5.js';
12
- import { runnerImageVersion, imageAdvice, readUpdateStatus, imageTag, pullInstruction } from './chunk-M3MHHIUW.js';
8
+ import './chunk-R7SS5RLJ.js';
9
+ import { detectMachine, supportsContainerBuilds, describeMachineDocker, reachDockerStep, supportsMicroVmBuilds, microVmArchSupported, microVmAssetsPinned } from './chunk-T57XUI6N.js';
10
+ import { MIN_ENGINE_MAJOR, helperFirecrackerNote, probeHelper, helperSocketPath } from './chunk-IKXY47R5.js';
11
+ import './chunk-MHAR6S7B.js';
12
+ import './chunk-WWQVKFN6.js';
13
+ import './chunk-USJZ2LDK.js';
14
+ import { runnerImageVersion, imageAdvice, readUpdateStatus, imageTag, pullInstruction } from './chunk-Z3ASAXVU.js';
13
15
  import './chunk-TQMI335S.js';
14
- import './chunk-GFUE5TKO.js';
15
- import './chunk-7AQ5AM7U.js';
16
- import './chunk-YB3CSYXX.js';
17
- import './chunk-STSLH5EJ.js';
18
- import './chunk-HWDYLXHH.js';
19
- import './chunk-D7ECMB7B.js';
16
+ import './chunk-F4FA3ZUT.js';
17
+ import './chunk-MQHTM4YJ.js';
18
+ import { builtinKind } from './chunk-55XLX5PA.js';
19
+ import { allowHostProblem, MAX_ALLOW_HOSTS } from './chunk-UXYLWVTQ.js';
20
+ import './chunk-T2QSWFSU.js';
21
+ import './chunk-NUHZV3A4.js';
20
22
  import './chunk-JBJTC3UU.js';
21
23
  import './chunk-OGFGZQA3.js';
22
- import { resolveDevcontainerCli, buildxState, spawnRun } from './chunk-EX5MQYEF.js';
23
- import { locateRecipe, assertBuildable, readRecipe, RecipeError, FIRECRACKER_VERSION, CLAUDE_CODE_VERSION } from './chunk-2BTFKNTR.js';
24
- import './chunk-XBPUTQ7E.js';
25
- import './chunk-GLUKDQS4.js';
26
- import { getJson, WorkCommandError, signatureRefusalMessage } from './chunk-55GNQPO6.js';
27
- import './chunk-2F762IXY.js';
28
- import './chunk-N4D5TMVU.js';
24
+ import { resolveDevcontainerCli, buildxState, spawnRun } from './chunk-VC5J7QPV.js';
25
+ import { parseSize } from './chunk-YJLHUKYS.js';
26
+ import { locateRecipe, assertBuildable, readRecipe, RecipeError, FIRECRACKER_VERSION, CLAUDE_CODE_VERSION } from './chunk-SJZL5F3F.js';
27
+ import { getJson, WorkCommandError, signatureRefusalMessage } from './chunk-X52PMPOM.js';
28
+ import './chunk-LNIFYSNK.js';
29
+ import './chunk-VU7ZJPIR.js';
29
30
  import './chunk-BUP5N3X6.js';
30
- import './chunk-LOKSLO25.js';
31
- import './chunk-6BLXUD56.js';
31
+ import { compareVersions } from './chunk-UHU7H57K.js';
32
+ import './chunk-5B7BEQPR.js';
33
+ import './chunk-HOU33DW5.js';
32
34
  import './chunk-G2JWZDFA.js';
33
- import { builtinKind } from './chunk-EPPIISRD.js';
34
- import { allowHostProblem, MAX_ALLOW_HOSTS } from './chunk-UXYLWVTQ.js';
35
- import { parseSize } from './chunk-YJLHUKYS.js';
36
- import { defaultGitRunner } from './chunk-BPKO76QR.js';
37
- import './chunk-MHX7YX7Y.js';
38
- import { defaultFetch } from './chunk-BWH36FOC.js';
35
+ import './chunk-ANPNT6PM.js';
36
+ import { defaultGitRunner } from './chunk-4XN5FRRJ.js';
37
+ import './chunk-P2RWZCV7.js';
38
+ import { defaultFetch } from './chunk-7CK2TJFB.js';
39
+ import './chunk-PJDQPF5N.js';
40
+ import { loadHostKey } from './chunk-YL2VDSNF.js';
41
+ import { runnerDir, buildsDir, hostKeyPath, jobsDir } from './chunk-5K3KB4YR.js';
42
+ import './chunk-HXAEQPZR.js';
39
43
  import './chunk-ZJSNLVCE.js';
40
- import './chunk-6TRNCUM4.js';
44
+ import './chunk-FGF52V4V.js';
41
45
  import './chunk-HCVLP7XA.js';
42
46
  import './chunk-BJ3KTMDH.js';
43
- import './chunk-7OUOLGUV.js';
44
- import { compareVersions } from './chunk-QE3UQAHK.js';
45
- import './chunk-ANPNT6PM.js';
46
- import './chunk-PJDQPF5N.js';
47
+ import './chunk-JGML2VUN.js';
48
+ import './chunk-5BHIBJDA.js';
49
+ import './chunk-CDDED64E.js';
50
+ import './chunk-RA3O54FC.js';
47
51
  import './chunk-WZBHBH3J.js';
48
52
  import './chunk-CRB3POP4.js';
49
53
  import './chunk-YQR6E6OV.js';
50
54
  import './chunk-RKOTJQVG.js';
51
55
  import './chunk-QZBXLLTV.js';
52
56
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
53
- import './chunk-RA3O54FC.js';
54
- import { loadHostKey } from './chunk-Y4OKEFAX.js';
55
- import { runnerDir, buildsDir, hostKeyPath, jobsDir } from './chunk-RHAGBUL5.js';
56
- import './chunk-2I3LIRZP.js';
57
+ import { MIN_SYSTEMD } from './chunk-XD4ZCMA4.js';
57
58
  import './chunk-JGD5TWQ2.js';
58
59
  import './chunk-Z5GEFMRW.js';
59
60
  import { spawnSync } from 'child_process';
60
- import { existsSync, readdirSync, statSync, readFileSync } from 'fs';
61
+ import { existsSync, readdirSync, statSync, readFileSync, realpathSync } from 'fs';
61
62
  import { totalmem, tmpdir } from 'os';
62
- import { join } from 'path';
63
+ import { join, dirname, basename } from 'path';
63
64
 
64
65
  createRequire(import.meta.url);
65
66
  var NESTED_FILES = [
@@ -108,6 +109,104 @@ function nestedVirtualizationCheck(probes = {}) {
108
109
  const first = found[0];
109
110
  return { name, status: "pass", detail: `${first.module} does not allow nested virtualization (${first.path} is ${first.value}), so no microVM build sees ${first.feature}` };
110
111
  }
112
+ function deviceNumber(dev) {
113
+ const [b8, b12, b32, m12, mff] = [BigInt(8), BigInt(12), BigInt(32), BigInt(4095), BigInt(255)];
114
+ const [highMajor, highMinor] = [BigInt(4294963200), BigInt(4294967040)];
115
+ const major = dev >> b8 & m12 | dev >> b32 & highMajor;
116
+ const minor = dev & mff | dev >> b12 & highMinor;
117
+ return `${major}:${minor}`;
118
+ }
119
+ function hostDeviceOf(path, stat = (p) => statSync(p, { bigint: true })) {
120
+ let dir = path;
121
+ for (; ; ) {
122
+ try {
123
+ return deviceNumber(stat(dir).dev);
124
+ } catch {
125
+ const parent = dirname(dir);
126
+ if (parent === dir) return void 0;
127
+ dir = parent;
128
+ }
129
+ }
130
+ }
131
+ function diskSharingCheck(probes = {}) {
132
+ const name = "Disk I/O sharing";
133
+ const read = probes.readHostFile ?? readText;
134
+ const list = probes.listHostDir ?? ((path) => readdirSync(path));
135
+ const real = probes.realHostPath ?? ((path) => realpathSync(path));
136
+ const cannotTell = (why) => ({
137
+ name,
138
+ status: "warn",
139
+ detail: `${why}, so doctor cannot tell whether microVM builds share the disk`,
140
+ fix: "read the scheduler of the disk under the runner's directory by hand: `cat /sys/block/<disk>/queue/scheduler`"
141
+ });
142
+ const device = (probes.deviceOf ?? hostDeviceOf)(probes.buildsDir ?? ".");
143
+ if (device === void 0) return cannotTell("doctor found no device for the directory of the build disks");
144
+ const disks = /* @__PURE__ */ new Map();
145
+ const visit = (entry, depth) => {
146
+ if (depth > 8) throw new Error(`${entry} nests too deep`);
147
+ let path = real(entry);
148
+ let isPartition = true;
149
+ try {
150
+ read(`${entry}/partition`);
151
+ } catch (err) {
152
+ if (err.code !== "ENOENT") throw err;
153
+ isPartition = false;
154
+ }
155
+ if (isPartition) path = dirname(path);
156
+ const disk = basename(path);
157
+ let slaves = [];
158
+ if (!isPartition) {
159
+ try {
160
+ slaves = list(`${entry}/slaves`);
161
+ } catch (err) {
162
+ if (err.code !== "ENOENT") throw err;
163
+ }
164
+ }
165
+ if (slaves.length > 0) {
166
+ for (const slave of slaves) visit(`/sys/class/block/${slave}`, depth + 1);
167
+ return;
168
+ }
169
+ disks.set(disk, read(`/sys/block/${disk}/dev`).trim());
170
+ };
171
+ try {
172
+ visit(`/sys/dev/block/${device}`, 0);
173
+ } catch (err) {
174
+ return cannotTell(`doctor could not find the disk under device ${device}: ${err.code === "ENOENT" ? "no block device entry for it" : reasonOf(err)}`);
175
+ }
176
+ let costLines;
177
+ try {
178
+ costLines = read("/sys/fs/cgroup/io.cost.qos").split("\n");
179
+ } catch (err) {
180
+ if (err.code !== "ENOENT") return cannotTell(`doctor could not read /sys/fs/cgroup/io.cost.qos: ${reasonOf(err)}`);
181
+ costLines = [];
182
+ }
183
+ const facts = [];
184
+ for (const [disk, number] of disks) {
185
+ let scheduler;
186
+ try {
187
+ scheduler = /\[([^\]]+)\]/.exec(read(`/sys/block/${disk}/queue/scheduler`))?.[1];
188
+ } catch {
189
+ scheduler = void 0;
190
+ }
191
+ const iocost = costLines.some((l) => l.startsWith(`${number} `) && /\benable=1\b/.test(l));
192
+ facts.push({ name: disk, number, scheduler, iocost });
193
+ }
194
+ const ignoring = facts.filter((f) => f.scheduler !== "bfq" && !f.iocost);
195
+ if (ignoring.length === 0) {
196
+ const names = facts.map((f) => f.name).join(", ");
197
+ return { name, status: "pass", detail: `${names} acts on I/O weights (BFQ or iocost), so microVM builds share the disk equally` };
198
+ }
199
+ const unread = ignoring.find((f) => f.scheduler === void 0);
200
+ if (unread !== void 0) return cannotTell(`doctor could not read the scheduler of ${unread.name}`);
201
+ const first = ignoring[0];
202
+ const summary = ignoring.map((f) => `${f.name} uses the ${f.scheduler} scheduler and has iocost off`).join("; ");
203
+ return {
204
+ name,
205
+ status: "warn",
206
+ detail: `${summary}. So the kernel ignores each microVM build's I/O weight, and one build can take most of the disk's time`,
207
+ fix: `turn on iocost for the disk: \`echo '${first.number} enable=1' | sudo tee /sys/fs/cgroup/io.cost.qos\`. Do this again at each boot, for example from a systemd unit. Or use the bfq scheduler for the disk`
208
+ };
209
+ }
111
210
  function vmscapeCheck(probes = {}) {
112
211
  const name = "VMScape";
113
212
  let value;
@@ -271,6 +370,14 @@ function helperCheck(facts) {
271
370
  if (facts.present && facts.firecracker !== FIRECRACKER_VERSION) {
272
371
  return { name, status: "warn", detail: helperFirecrackerNote(facts.firecracker), fix: REINSTALL };
273
372
  }
373
+ if (facts.present && facts.systemdVersion !== void 0 && facts.systemdVersion < MIN_SYSTEMD) {
374
+ return {
375
+ name,
376
+ status: "warn",
377
+ detail: `microVM builds will not survive a restart of the runner: this host runs systemd ${facts.systemdVersion}, and the runner keeps a build's sockets in the descriptor store only on systemd ${MIN_SYSTEMD} or later, so every build ends with its runner and an update waits for every build`,
378
+ fix: `upgrade the host's systemd to ${MIN_SYSTEMD} or later, for example with a newer release of the distribution`
379
+ };
380
+ }
274
381
  if (facts.present && facts.fdStoreMax === 0) {
275
382
  return {
276
383
  name,
@@ -279,6 +386,14 @@ function helperCheck(facts) {
279
386
  fix: "run `outerlayer runner install --service --replace` to write the unit this CLI generates, which keeps those sockets in the service manager's descriptor store"
280
387
  };
281
388
  }
389
+ if (facts.present && facts.restartUnit !== void 0) {
390
+ return {
391
+ name,
392
+ status: "warn",
393
+ detail: `microVM builds will not survive a restart of the runner: the running runner started without its unit's descriptor store (its environment lacks NOTIFY_SOCKET or OUTERLAYER_FD_STORE, as a runner started before its unit was replaced does), so it cannot keep a build's sockets in the descriptor store, every build it starts ends with it, and an update waits for every build`,
394
+ fix: `restart the service while no build runs, so it starts under its current unit: sudo systemctl restart ${facts.restartUnit}`
395
+ };
396
+ }
282
397
  if (facts.present) {
283
398
  return {
284
399
  name,
@@ -710,7 +825,9 @@ async function helperFactsOf(env) {
710
825
  present: true,
711
826
  firecracker: probe.firecracker,
712
827
  ...stat !== void 0 && (stat.mode & 18) !== 0 ? { writableBuildsDir: builds } : {},
713
- ...env.service?.fdStoreMax === void 0 ? {} : { fdStoreMax: env.service.fdStoreMax }
828
+ ...env.service?.fdStoreMax === void 0 ? {} : { fdStoreMax: env.service.fdStoreMax },
829
+ ...env.service?.startedWithStore === false ? { restartUnit: env.service.unit } : {},
830
+ ...env.service?.systemdVersion === void 0 ? {} : { systemdVersion: env.service.systemdVersion }
714
831
  };
715
832
  }
716
833
  async function runnerHostChecks(env) {
@@ -740,6 +857,7 @@ async function runnerHostChecks(env) {
740
857
  helperCheck(await helperFactsOf(env)),
741
858
  nestedVirtualizationCheck(env),
742
859
  vmscapeCheck(env),
860
+ diskSharingCheck({ ...env, buildsDir: buildsDir(env.configPath) }),
743
861
  ...env.runner === void 0 ? [] : [memoryCheck({ concurrency: env.runner.concurrency, buildMemory: env.runner.buildMemory, hostMemory: env.hostMemory ?? totalmem() })]
744
862
  ] : [],
745
863
  ...env.hooks !== void 0 && builtinKind(env.hooks.provision) === "container" ? [runcCheck(env)] : [],