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

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 (42) hide show
  1. package/dist/{build-G4GUF6LT.js → build-SEAQVLD5.js} +2 -2
  2. package/dist/{build-disk-3GL3KKEB.js → build-disk-JHTMPRAA.js} +3 -5
  3. package/dist/build-info.json +1 -1
  4. package/dist/{builder-3CUKTVSY.js → builder-Y4P7QARW.js} +2 -3
  5. package/dist/{check-64FD5G3X.js → check-MRYFTLOO.js} +12 -14
  6. package/dist/{chunk-JRZCRIEO.js → chunk-2EGCI2VW.js} +2881 -2561
  7. package/dist/{chunk-LJUIG5K4.js → chunk-3RIFVLPO.js} +5 -5
  8. package/dist/{chunk-QFQC5K4J.js → chunk-7HHNGZS5.js} +33 -21
  9. package/dist/{chunk-YERR22SY.js → chunk-DISTLL2Q.js} +1 -1
  10. package/dist/{chunk-GFVDC5S3.js → chunk-FR7HWWCF.js} +34 -3
  11. package/dist/{chunk-LYE3KB6L.js → chunk-HE4FBF4T.js} +2 -2
  12. package/dist/{chunk-TGHBOXKJ.js → chunk-NE63JADS.js} +2 -2
  13. package/dist/{chunk-DGI66PGY.js → chunk-PWH3BEZF.js} +30 -270
  14. package/dist/{chunk-3DCB3GOV.js → chunk-RQJMN5TJ.js} +6 -4
  15. package/dist/{chunk-CANYZTD5.js → chunk-SDU2IE22.js} +40 -13
  16. package/dist/chunk-W2AEL4BJ.js +179 -0
  17. package/dist/{chunk-OOCAF3ID.js → chunk-XHHTMFCX.js} +1 -1
  18. package/dist/{chunk-JPG43G6Y.js → chunk-YXHKCHWG.js} +1 -1
  19. package/dist/{cli-WKRURGHC.js → cli-K6XGL4EZ.js} +39 -39
  20. package/dist/{command-WG54AUHK.js → command-7FAIIQGF.js} +8 -9
  21. package/dist/{config-LZSFW2O3.js → config-QXMUWJAQ.js} +9 -2
  22. package/dist/{container-start-DQKFQ3CL.js → container-start-CVP3NTDG.js} +9 -10
  23. package/dist/{docker-4ERXWTRW.js → docker-ANW76BNW.js} +2 -3
  24. package/dist/{doctor-GRCEYJXA.js → doctor-GJAHI3KU.js} +16 -21
  25. package/dist/{emit-demo-cmd-JSVI56WY.js → emit-demo-cmd-6DF2QIAS.js} +1 -1
  26. package/dist/index.js +1 -1
  27. package/dist/{init-WNO4NAO7.js → init-XDOKWBL2.js} +8 -9
  28. package/dist/{init-OKJAI77M.js → init-ZQ5B3TJZ.js} +8 -9
  29. package/dist/{init-cmd-PFW4XTG7.js → init-cmd-YMGW2WXJ.js} +1 -1
  30. package/dist/install-QPA7DQHO.js +19 -0
  31. package/dist/{loop-2SITCQ6H.js → loop-UJL2UCUM.js} +12 -14
  32. package/dist/{machine-YHBCNRUO.js → machine-2YPAFFCH.js} +8 -9
  33. package/dist/{runner-env-QYE7KZFP.js → runner-env-HOUXKWIJ.js} +10 -4
  34. package/dist/{runner-identity-FIHOECSH.js → runner-identity-KPUVTRLS.js} +2 -3
  35. package/dist/{runner-key-YUKU2MWK.js → runner-key-FUJD66R6.js} +8 -9
  36. package/dist/{status-VBQJMFEX.js → status-2KNTILGQ.js} +9 -10
  37. package/dist/{work-claim-cmd-MFND6Z4S.js → work-claim-cmd-NJNOQFQE.js} +5 -2
  38. package/package.json +1 -1
  39. package/dist/chunk-XWFSAOC7.js +0 -111
  40. package/dist/chunk-YJLHUKYS.js +0 -38
  41. package/dist/chunk-YYYRBYWG.js +0 -32
  42. package/dist/install-GQUCHIGE.js +0 -13
@@ -1,26 +1,25 @@
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-PWH3BEZF.js';
4
4
  import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
5
5
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-57L2YAJA.js';
6
6
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
7
7
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-E7R2GIAW.js';
8
- import { fitImageBuildMemory } from './chunk-OOCAF3ID.js';
8
+ import { fitImageBuildMemory } from './chunk-XHHTMFCX.js';
9
9
  import { RUNNER_PROTOCOL } from './chunk-MZYOUIY5.js';
10
10
  import { writePendingUpdate } from './chunk-GH246BGV.js';
11
- import { realBlockedProbes, checkBlocked } from './chunk-QFQC5K4J.js';
11
+ import { realBlockedProbes, checkBlockedWithSlots, keepsHostBuilder } from './chunk-7HHNGZS5.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-2EGCI2VW.js';
15
15
  import { claimPidFile, writePidFile, readPidFile, releasePidFile } from './chunk-F5UL23I2.js';
16
16
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
17
17
  import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, resolveGoverningSource, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-T5REPMNL.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';
20
+ import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-RQJMN5TJ.js';
21
+ import { freeBytes, formatBytes, volumeBytes } from './chunk-W2AEL4BJ.js';
22
+ import { writeJobFile, ensureRunnerIdentity, readJobFile, exceedsDisk, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-FR7HWWCF.js';
24
23
  import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-VT4TTJPG.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';
@@ -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) {
@@ -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-MRYFTLOO.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
3058
3085
  },
3059
3086
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
3060
3087
  log
@@ -0,0 +1,179 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { parseSize, BUILD_LABEL, RUNNER_LABEL, runnerLabelValue } from './chunk-FR7HWWCF.js';
4
+ import { buildsDir, rootfsDir, runnerDir, imagesDir, builderCacheDiskPath } from './chunk-PA6CK6WQ.js';
5
+ import { spawnSync } from 'child_process';
6
+ import { statfsSync, statSync, existsSync, readdirSync } from 'fs';
7
+ import { dirname, join } from 'path';
8
+
9
+ createRequire(import.meta.url);
10
+ function freeBytes(path, statfs = statfsSync) {
11
+ let at = path;
12
+ for (; ; ) {
13
+ try {
14
+ const stats = statfs(at);
15
+ return Number(stats.bavail) * Number(stats.bsize);
16
+ } catch (err) {
17
+ if (err.code !== "ENOENT") return void 0;
18
+ const parent = dirname(at);
19
+ if (parent === at) return void 0;
20
+ at = parent;
21
+ }
22
+ }
23
+ }
24
+ var UNITS = ["B", "KB", "MB", "GB", "TB"];
25
+ function formatBytes(bytes) {
26
+ let value = Math.max(0, bytes);
27
+ let unit = 0;
28
+ while (value >= 1024 && unit < UNITS.length - 1) {
29
+ value /= 1024;
30
+ unit++;
31
+ }
32
+ return unit === 0 ? `${Math.round(value)} B` : `${value.toFixed(1)} ${UNITS[unit]}`;
33
+ }
34
+
35
+ // src/runner/build-disk.ts
36
+ var DEFAULT_CACHE_DISK = "40g";
37
+ function checkDiskFit(input) {
38
+ const limit = parseSize(input.buildDisk);
39
+ if (limit === void 0) return { slots: input.concurrency, fits: true, oneBuildBytes: 0, neededBytes: 0, availableBytes: 0, reservedBytes: 0, message: "" };
40
+ const cacheLimit = parseSize(input.cacheDisk ?? DEFAULT_CACHE_DISK) ?? parseSize(DEFAULT_CACHE_DISK);
41
+ const { freeBytes: free, heldBytes: held, rootDiskBytes: root } = input.facts;
42
+ const reservedBytes = (input.facts.cacheBytes ?? []).reduce((sum, bytes) => sum + Math.max(0, cacheLimit - bytes), 0);
43
+ const oneBuildBytes = limit + root;
44
+ const neededBytes = input.concurrency * oneBuildBytes;
45
+ const availableBytes = Math.max(0, free + held - reservedBytes);
46
+ const slots = Math.min(input.concurrency, Math.floor(availableBytes / oneBuildBytes));
47
+ const oneBuild = root > 0 ? `runner.build.disk ${input.buildDisk} plus a root disk of ${formatBytes(root)}` : `runner.build.disk ${input.buildDisk}`;
48
+ const caches = reservedBytes > 0 ? `, less ${formatBytes(reservedBytes)} that the image-build caches can still grow to (runner.build.cacheDisk ${input.cacheDisk ?? DEFAULT_CACHE_DISK})` : "";
49
+ return {
50
+ slots,
51
+ fits: slots >= input.concurrency,
52
+ oneBuildBytes,
53
+ neededBytes,
54
+ availableBytes,
55
+ reservedBytes,
56
+ message: `${slots} of ${input.concurrency} ${input.concurrency === 1 ? "build" : "builds"} fit: one build can hold ${formatBytes(oneBuildBytes)} (${oneBuild}), runner.concurrency ${input.concurrency} needs ${formatBytes(neededBytes)}, and ${formatBytes(availableBytes)} is counted (${formatBytes(free)} free plus ${formatBytes(held)} held by running builds${caches})`
57
+ };
58
+ }
59
+ function allocatedBytes(path) {
60
+ try {
61
+ return statSync(path).blocks * 512;
62
+ } catch {
63
+ return 0;
64
+ }
65
+ }
66
+ function listDir(path) {
67
+ try {
68
+ return readdirSync(path);
69
+ } catch {
70
+ return void 0;
71
+ }
72
+ }
73
+ function logUnreadable(path) {
74
+ process.stderr.write(`outerlayer: cannot list ${path}, so the disk check does not count the image-build cache disks in it
75
+ `);
76
+ }
77
+ function isBuilderDir(dir) {
78
+ return existsSync(join(dir, "image-builder.json"));
79
+ }
80
+ function cacheDiskBytes(configPath, builds, buildEntries) {
81
+ const cache = [];
82
+ const images = imagesDir(configPath);
83
+ if (existsSync(images)) {
84
+ const owners = listDir(images);
85
+ if (owners === void 0) {
86
+ logUnreadable(images);
87
+ return void 0;
88
+ }
89
+ for (const owner of owners) {
90
+ const names = listDir(join(images, owner));
91
+ if (names === void 0) logUnreadable(join(images, owner));
92
+ for (const name of names ?? []) {
93
+ const path = builderCacheDiskPath(configPath, owner, name);
94
+ if (existsSync(path)) cache.push(allocatedBytes(path));
95
+ }
96
+ }
97
+ }
98
+ for (const entry of buildEntries) {
99
+ if (isBuilderDir(join(builds, entry))) cache.push(allocatedBytes(join(builds, entry, "build.ext4")));
100
+ }
101
+ return cache;
102
+ }
103
+ function microVmFacts(configPath) {
104
+ const builds = buildsDir(configPath);
105
+ const free = freeBytes(builds);
106
+ if (free === void 0) return void 0;
107
+ let held = 0;
108
+ let entries = [];
109
+ if (existsSync(builds)) {
110
+ const listed = listDir(builds);
111
+ if (listed === void 0) return void 0;
112
+ entries = listed;
113
+ for (const entry of entries) {
114
+ if (!isBuilderDir(join(builds, entry))) held += allocatedBytes(join(builds, entry, "build.ext4"));
115
+ }
116
+ }
117
+ const cacheBytes = cacheDiskBytes(configPath, builds, entries);
118
+ if (cacheBytes === void 0) return void 0;
119
+ let root = 0;
120
+ const roots = rootfsDir(runnerDir(configPath));
121
+ if (existsSync(roots)) {
122
+ const rootEntries = listDir(roots);
123
+ if (rootEntries === void 0) return void 0;
124
+ for (const entry of rootEntries) {
125
+ if (!entry.endsWith(".ext4")) continue;
126
+ try {
127
+ root = Math.max(root, statSync(join(roots, entry)).size);
128
+ } catch {
129
+ }
130
+ }
131
+ }
132
+ return { freeBytes: free, heldBytes: held, rootDiskBytes: root, cacheBytes };
133
+ }
134
+ var DOCKER_TIMEOUT_MS = 1e4;
135
+ var DEFAULT_BUILD_DISK = "40g";
136
+ var DOCKER_CACHE_MS = 6e4;
137
+ var DEFAULT_VOLUMES_DIR = "/var/lib/docker/volumes";
138
+ function runDocker(args, spawn = spawnSync) {
139
+ const result = spawn("docker", args, { encoding: "utf8", timeout: DOCKER_TIMEOUT_MS });
140
+ return result.status === 0 ? result.stdout : void 0;
141
+ }
142
+ var SIZE_UNITS = { b: 1, kb: 1e3, mb: 1e6, gb: 1e9, tb: 1e12 };
143
+ function volumeBytes(dfOutput, names) {
144
+ let total = 0;
145
+ for (const line of dfOutput.split("\n")) {
146
+ const [name, , size] = line.trim().split(/\s+/);
147
+ if (name === void 0 || size === void 0 || !names.has(name)) continue;
148
+ const match = /^([\d.]+)([A-Za-z]+)$/.exec(size);
149
+ const unit = match === null ? void 0 : SIZE_UNITS[match[2].toLowerCase()];
150
+ if (match !== null && unit !== void 0) total += Number(match[1]) * unit;
151
+ }
152
+ return total;
153
+ }
154
+ function containerFacts(cache, configPath, docker, now) {
155
+ if (cache.reading === void 0 || cache.reading.configPath !== configPath || now - cache.reading.at > DOCKER_CACHE_MS) {
156
+ const root = docker(["info", "--format", "{{.DockerRootDir}}"])?.trim();
157
+ const listed = docker(["volume", "ls", "--quiet", "--filter", `label=${BUILD_LABEL}`, "--filter", `label=${RUNNER_LABEL}=${runnerLabelValue(configPath)}`]);
158
+ const names = new Set((listed ?? "").split("\n").map((n) => n.trim()).filter((n) => n !== ""));
159
+ const df = listed === void 0 || names.size === 0 ? void 0 : docker(["system", "df", "-v"]);
160
+ const held = listed === void 0 ? void 0 : names.size === 0 ? 0 : df === void 0 ? void 0 : volumeBytes(df, names);
161
+ cache.reading = {
162
+ at: now,
163
+ configPath,
164
+ held,
165
+ volumes: root === void 0 || root === "" ? DEFAULT_VOLUMES_DIR : join(root, "volumes")
166
+ };
167
+ }
168
+ if (cache.reading.held === void 0) return void 0;
169
+ const free = freeBytes(cache.reading.volumes);
170
+ return free === void 0 ? void 0 : { freeBytes: free, heldBytes: cache.reading.held, rootDiskBytes: 0 };
171
+ }
172
+ function realBuildDiskProbe(deps = {}) {
173
+ const cache = {};
174
+ const docker = deps.docker ?? ((args) => runDocker(args));
175
+ const now = deps.now ?? Date.now;
176
+ return (kind, configPath) => kind === "vm" ? microVmFacts(configPath) : containerFacts(cache, configPath, docker, now());
177
+ }
178
+
179
+ export { DEFAULT_BUILD_DISK, DEFAULT_CACHE_DISK, DOCKER_CACHE_MS, allocatedBytes, checkDiskFit, formatBytes, freeBytes, realBuildDiskProbe, runDocker, volumeBytes };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-LYE3KB6L.js';
3
+ import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-HE4FBF4T.js';
4
4
  import { readFileSync } from 'fs';
5
5
 
6
6
  createRequire(import.meta.url);
@@ -3,7 +3,7 @@ import { createRequire } from 'node:module';
3
3
  import { claimPidFile, RunnerAlreadyRunningError, releasePidFile } from './chunk-F5UL23I2.js';
4
4
  import { startTimeOf } from './chunk-JBJTC3UU.js';
5
5
  import { RecipeError, locateRecipe, readRecipe, assertBuildable, writeSanitizedRecipe, classifyProperties, SANITIZED_NAME } from './chunk-3Z3MPR55.js';
6
- import { GH_VERSION, VOICE_PACK_FILES, VOICE_PACK_VERSION, FFMPEG_STATIC, FFMPEG_BUILD_TAG, GH_SHA256, TINI_SHA256, TINI_VERSION, CLAUDE_CODE_VERSION, NODE_IMAGE, DEFAULT_BASE_IMAGE, MEDIA_PINS, PLAYWRIGHT_VERSION } from './chunk-TGHBOXKJ.js';
6
+ import { GH_VERSION, VOICE_PACK_FILES, VOICE_PACK_VERSION, FFMPEG_STATIC, FFMPEG_BUILD_TAG, GH_SHA256, TINI_SHA256, TINI_VERSION, CLAUDE_CODE_VERSION, NODE_IMAGE, DEFAULT_BASE_IMAGE, MEDIA_PINS, PLAYWRIGHT_VERSION } from './chunk-NE63JADS.js';
7
7
  import { RUNNER_DIR_MODE, RUNNER_FILE_MODE, repoCacheDir, imagesDir, imageBuildLogsDir, attemptStamp, runnerDir, rootfsPathFor } from './chunk-PA6CK6WQ.js';
8
8
  import { PROXY_WARNING_FLAG, withGitConfig, tokenHeader } from './chunk-BALIE3BA.js';
9
9
  import { RELAY_ID, RELAY_USER } from './chunk-MESOOLF4.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-LJUIG5K4.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-3RIFVLPO.js';
4
4
  import './chunk-BJQ25STI.js';
5
5
  import './chunk-HXA5GIHK.js';
6
6
  import './chunk-KT4CN6OU.js';
@@ -3927,13 +3927,13 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3927
3927
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3928
3928
  `);
3929
3929
  }
3930
- const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-PFW4XTG7.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3930
+ const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-YMGW2WXJ.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3931
3931
  if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3932
3932
  else process.stdout.write(outcome.text + skillsLine + (shell?.text ?? ""));
3933
3933
  return;
3934
3934
  }
3935
3935
  await installMachineSkillsForSetup();
3936
- const { runInitCommand } = await import('./init-cmd-PFW4XTG7.js');
3936
+ const { runInitCommand } = await import('./init-cmd-YMGW2WXJ.js');
3937
3937
  const code = await runInitCommand(
3938
3938
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3939
3939
  {
@@ -4388,7 +4388,7 @@ check. A chapter reads yes when every still matches and no when one differs; the
4388
4388
  the region. One run, or a chapter with no stills, reads not checked. Comparing never changes which clips bind.
4389
4389
  `
4390
4390
  ).action(async (manifest, opts) => {
4391
- const { runEmitDemo, EmitDemoError } = await import('./emit-demo-cmd-JSVI56WY.js');
4391
+ const { runEmitDemo, EmitDemoError } = await import('./emit-demo-cmd-6DF2QIAS.js');
4392
4392
  let item;
4393
4393
  if (opts.item !== void 0) {
4394
4394
  item = parseTrackerNumber(opts.item);
@@ -4917,7 +4917,7 @@ by a different key is refused; claiming again with the same key extends
4917
4917
  it. --host is a label only.
4918
4918
  `
4919
4919
  ).action(async (opts) => {
4920
- const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-MFND6Z4S.js');
4920
+ const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-NJNOQFQE.js');
4921
4921
  try {
4922
4922
  await runWorkClaim(opts);
4923
4923
  } catch (err) {
@@ -4937,7 +4937,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
4937
4937
  lease has expired, or a 403 if a different key holds it.
4938
4938
  `
4939
4939
  ).action(async (opts) => {
4940
- const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-MFND6Z4S.js');
4940
+ const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-NJNOQFQE.js');
4941
4941
  try {
4942
4942
  await runWorkRenew(opts);
4943
4943
  } catch (err) {
@@ -4969,7 +4969,7 @@ applies to a host's lease only. A later tool call in the session
4969
4969
  takes the lease again.
4970
4970
  `
4971
4971
  ).action(async (opts) => {
4972
- const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-MFND6Z4S.js');
4972
+ const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-NJNOQFQE.js');
4973
4973
  try {
4974
4974
  await runWorkRelease(opts);
4975
4975
  } catch (err) {
@@ -5038,8 +5038,8 @@ function registerRunnerCommands(program2) {
5038
5038
  const runnerCmd = program2.command("runner").description("Take work from the implement and amend queues on this machine");
5039
5039
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
5040
5040
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
5041
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-LZSFW2O3.js');
5042
- const { start, RunnerStartError } = await import('./loop-2SITCQ6H.js');
5041
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-QXMUWJAQ.js');
5042
+ const { start, RunnerStartError } = await import('./loop-UJL2UCUM.js');
5043
5043
  const { RunnerAlreadyRunningError } = await import('./pidfile-5UDLYPMC.js');
5044
5044
  const configPath = opts.config ?? defaultRunnerConfigPath();
5045
5045
  try {
@@ -5057,9 +5057,9 @@ function registerRunnerCommands(program2) {
5057
5057
  "after",
5058
5058
  "\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_RUNNER_NAME and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN or ANTHROPIC_API_KEY) from the environment. OUTERLAYER_AGENT\nis optional and defaults to claude. On a later start it refuses variables that disagree with the config in the volume.\nThe image sets OUTERLAYER_RUNNER_IMAGE; outside the image, use `runner start`.\n"
5059
5059
  ).action(async () => {
5060
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-LZSFW2O3.js');
5061
- const { containerStart } = await import('./container-start-DQKFQ3CL.js');
5062
- const { start, RunnerStartError } = await import('./loop-2SITCQ6H.js');
5060
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-QXMUWJAQ.js');
5061
+ const { containerStart } = await import('./container-start-CVP3NTDG.js');
5062
+ const { start, RunnerStartError } = await import('./loop-UJL2UCUM.js');
5063
5063
  const { RunnerAlreadyRunningError } = await import('./pidfile-5UDLYPMC.js');
5064
5064
  try {
5065
5065
  const result = await containerStart({
@@ -5078,8 +5078,8 @@ function registerRunnerCommands(program2) {
5078
5078
  }
5079
5079
  });
5080
5080
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
5081
- const { defaultRunnerConfigPath } = await import('./config-LZSFW2O3.js');
5082
- const { runRunnerCheck } = await import('./check-64FD5G3X.js');
5081
+ const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5082
+ const { runRunnerCheck } = await import('./check-MRYFTLOO.js');
5083
5083
  const configPath = opts.config ?? defaultRunnerConfigPath();
5084
5084
  const result = await runRunnerCheck(configPath);
5085
5085
  if (!result.ok) {
@@ -5100,7 +5100,7 @@ function registerRunnerCommands(program2) {
5100
5100
  `);
5101
5101
  });
5102
5102
  runnerCmd.command("install").description("Put this CLI in the runner's install layout; --service adds its service").option("--config <path>", configOption).option("--service", "set up the service that keeps the runner running").option("--print", "with --service, print the unit and set up nothing").option("--user <account>", "with --service, the account the service runs as").option("--replace", "replace a unit or launcher file this command did not write").option("--allow-downgrade", "install this CLI even when it is older than the version the runner runs").option("--unit-name <name>", "with --service, the unit's name, to run a second runner beside the first").action(async (opts) => {
5103
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-LZSFW2O3.js');
5103
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-QXMUWJAQ.js');
5104
5104
  const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-FV7IZ7XF.js');
5105
5105
  const configPath = opts.config ?? defaultRunnerConfigPath();
5106
5106
  if (opts.service !== true) {
@@ -5113,7 +5113,7 @@ function registerRunnerCommands(program2) {
5113
5113
  }
5114
5114
  try {
5115
5115
  if (opts.service === true) {
5116
- const { installServiceCommand } = await import('./command-WG54AUHK.js');
5116
+ const { installServiceCommand } = await import('./command-7FAIIQGF.js');
5117
5117
  const result2 = await installServiceCommand({
5118
5118
  configPath,
5119
5119
  print: opts.print,
@@ -5168,8 +5168,8 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
5168
5168
  fail(`pass --service: \`${cliInvocation()} runner uninstall --service\` removes the runner's service.`);
5169
5169
  return;
5170
5170
  }
5171
- const { defaultRunnerConfigPath } = await import('./config-LZSFW2O3.js');
5172
- const { uninstallServiceCommand } = await import('./command-WG54AUHK.js');
5171
+ const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5172
+ const { uninstallServiceCommand } = await import('./command-7FAIIQGF.js');
5173
5173
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
5174
5174
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
5175
5175
  `);
@@ -5196,12 +5196,12 @@ already in claude.env is used.
5196
5196
  printf '%s' "$CLAUDE_CODE_OAUTH_TOKEN" | ${cliInvocation()} runner init --agent claude --factory <org>/<factory>
5197
5197
  `
5198
5198
  ).action(async (opts) => {
5199
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-LZSFW2O3.js');
5200
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-WNO4NAO7.js');
5201
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-YUKU2MWK.js');
5202
- const { detectMachine } = await import('./machine-YHBCNRUO.js');
5203
- const { chooseVm, runVmInit, VmInitError } = await import('./init-OKJAI77M.js');
5204
- const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-QYE7KZFP.js');
5199
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-QXMUWJAQ.js');
5200
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-XDOKWBL2.js');
5201
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-FUJD66R6.js');
5202
+ const { detectMachine } = await import('./machine-2YPAFFCH.js');
5203
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-ZQ5B3TJZ.js');
5204
+ const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-HOUXKWIJ.js');
5205
5205
  const configPath = opts.config ?? defaultRunnerConfigPath();
5206
5206
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
5207
5207
  fail(`--agent ${opts.agent}: runner init writes commands for ${Object.keys(AGENT_COMMANDS).join(", ")}. For another agent, leave --agent out and edit runner.commands.`);
@@ -5351,7 +5351,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5351
5351
  let serviceUp = false;
5352
5352
  let restart;
5353
5353
  if (installedLayout) {
5354
- const { installServiceCommand } = await import('./command-WG54AUHK.js');
5354
+ const { installServiceCommand } = await import('./command-7FAIIQGF.js');
5355
5355
  const service = await installServiceCommand({
5356
5356
  configPath,
5357
5357
  entryPath: process.argv[1] ?? "",
@@ -5395,12 +5395,12 @@ Next:
5395
5395
  "after",
5396
5396
  "\nA repository governed by a control plane builds the control plane's image, at the commit\nthe gateway has stored for it. A repository that governs itself fetches the head of its\ndefault branch into the runner's cache. Either way it reads .devcontainer/devcontainer.json\nand builds the image with the devcontainer CLI. Settings\nthat reach the host or widen the container's privileges are ignored and listed. The\nimage holds this CLI and a pinned Claude Code. Nothing runs inside the image.\n"
5397
5397
  ).action(async (opts) => {
5398
- const { defaultRunnerConfigPath } = await import('./config-LZSFW2O3.js');
5399
- const { buildRepositoryImage, RecipeError } = await import('./build-G4GUF6LT.js');
5398
+ const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5399
+ const { buildRepositoryImage, RecipeError } = await import('./build-SEAQVLD5.js');
5400
5400
  const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
5401
- const { createDockerHost } = await import('./docker-4ERXWTRW.js');
5402
- const { builderSpec } = await import('./builder-3CUKTVSY.js');
5403
- const { loadRunnerConfig } = await import('./config-LZSFW2O3.js');
5401
+ const { createDockerHost } = await import('./docker-ANW76BNW.js');
5402
+ const { builderSpec } = await import('./builder-Y4P7QARW.js');
5403
+ const { loadRunnerConfig } = await import('./config-QXMUWJAQ.js');
5404
5404
  const configPath = opts.config ?? defaultRunnerConfigPath();
5405
5405
  const loaded = (() => {
5406
5406
  try {
@@ -5411,7 +5411,7 @@ Next:
5411
5411
  })();
5412
5412
  const memory = loaded?.build?.memory ?? "8g";
5413
5413
  try {
5414
- const { ensureRunnerIdentity } = await import('./runner-identity-FIHOECSH.js');
5414
+ const { ensureRunnerIdentity } = await import('./runner-identity-KPUVTRLS.js');
5415
5415
  await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
5416
5416
  console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
5417
5417
  });
@@ -5478,17 +5478,17 @@ Next:
5478
5478
  }
5479
5479
  });
5480
5480
  runnerCmd.command("stop").description("Take no more work; finish running jobs, then exit").option("--config <path>", "the cloud config file naming the runner to stop").option("--now", "end running jobs immediately, with outcome stopped").action(async (opts) => {
5481
- const { defaultRunnerConfigPath } = await import('./config-LZSFW2O3.js');
5482
- const { requestStop } = await import('./loop-2SITCQ6H.js');
5481
+ const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5482
+ const { requestStop } = await import('./loop-UJL2UCUM.js');
5483
5483
  const configPath = opts.config ?? defaultRunnerConfigPath();
5484
5484
  const { runnerImageVersion } = await import('./image-tag-ADSLWXBA.js');
5485
5485
  await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
5486
5486
  });
5487
5487
  runnerCmd.command("status").description("List running jobs; with --recent, finished ones too").option("--config <path>", "the cloud config file naming the runner to inspect").option("--recent", "also list finished jobs, newest first, capped at 20").option("--json", "machine-readable JSON output").action(async (opts) => {
5488
- const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-LZSFW2O3.js');
5488
+ const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-QXMUWJAQ.js');
5489
5489
  const { jobsDir, runnerDir } = await import('./paths-7HVTDE6J.js');
5490
- const { listJobFiles, runnerProcessState } = await import('./loop-2SITCQ6H.js');
5491
- const { renderStatus } = await import('./status-VBQJMFEX.js');
5490
+ const { listJobFiles, runnerProcessState } = await import('./loop-UJL2UCUM.js');
5491
+ const { renderStatus } = await import('./status-2KNTILGQ.js');
5492
5492
  const { readHousekeepingRecord } = await import('./record-PPZEXAVA.js');
5493
5493
  const path2 = await import('path');
5494
5494
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5510,7 +5510,7 @@ Next:
5510
5510
  const service = await (async () => {
5511
5511
  if (process.platform !== "linux" || !existsSync("/run/systemd/system")) return void 0;
5512
5512
  const { inspectService, realInspectProbes } = await import('./inspect-DNLXTXLA.js');
5513
- const { DEFAULT_UNIT_NAME } = await import('./install-GQUCHIGE.js');
5513
+ const { DEFAULT_UNIT_NAME } = await import('./install-QPA7DQHO.js');
5514
5514
  const facts = inspectService(DEFAULT_UNIT_NAME, path2.dirname(configPath), realInspectProbes());
5515
5515
  return facts === void 0 ? void 0 : { unit: facts.unit, running: facts.mainPid !== void 0, delegated: facts.delegate };
5516
5516
  })();
@@ -5547,8 +5547,8 @@ Next:
5547
5547
  );
5548
5548
  });
5549
5549
  runnerCmd.command("logs").argument("<item>", "the work item's number in the factory").description("Print the newest attempt's log for one item").option("--config <path>", "the cloud config file naming the runner to inspect").option("-f, --follow", "keep printing as the log grows").action(async (itemArg, opts) => {
5550
- const { defaultRunnerConfigPath } = await import('./config-LZSFW2O3.js');
5551
- const { listJobFiles } = await import('./loop-2SITCQ6H.js');
5550
+ const { defaultRunnerConfigPath } = await import('./config-QXMUWJAQ.js');
5551
+ const { listJobFiles } = await import('./loop-UJL2UCUM.js');
5552
5552
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-HI46FO6Z.js');
5553
5553
  const configPath = opts.config ?? defaultRunnerConfigPath();
5554
5554
  const item = parseTrackerNumber(itemArg);
@@ -3,10 +3,10 @@ import { createRequire } from 'node:module';
3
3
  import { runRunnerInstall, launcherSummary, restartNote } from './chunk-DXJTBU7A.js';
4
4
  import './chunk-Z5IW4DHH.js';
5
5
  import { currentLink, execStartCommand } from './chunk-NBZ7XBT6.js';
6
- import { detectMachine, helperSocketPath, ensureFirecrackerAndJailer } from './chunk-JRZCRIEO.js';
6
+ import { detectMachine, helperSocketPath, ensureFirecrackerAndJailer } from './chunk-2EGCI2VW.js';
7
7
  import './chunk-2PGI6RDE.js';
8
- import './chunk-YERR22SY.js';
9
- import './chunk-JPG43G6Y.js';
8
+ import './chunk-DISTLL2Q.js';
9
+ import './chunk-YXHKCHWG.js';
10
10
  import './chunk-F5UL23I2.js';
11
11
  import './chunk-JBJTC3UU.js';
12
12
  import './chunk-OGFGZQA3.js';
@@ -15,13 +15,12 @@ import './chunk-L26V6ILJ.js';
15
15
  import './chunk-T5REPMNL.js';
16
16
  import './chunk-MZBQTVFG.js';
17
17
  import './chunk-TQMI335S.js';
18
- import { DEFAULT_UNIT_NAME, installService, uninstallService, realTaskScheduler, UNIT_MARKER } from './chunk-LYE3KB6L.js';
19
- import './chunk-YYYRBYWG.js';
20
- import { readJobFile } from './chunk-GFVDC5S3.js';
18
+ import { DEFAULT_UNIT_NAME, installService, uninstallService, realTaskScheduler, UNIT_MARKER } from './chunk-HE4FBF4T.js';
19
+ import { runnerVmOf, loadRunnerConfig, builtinKind } from './chunk-RQJMN5TJ.js';
20
+ import './chunk-W2AEL4BJ.js';
21
+ import { readJobFile } from './chunk-FR7HWWCF.js';
21
22
  import './chunk-3Z3MPR55.js';
22
- 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-TGHBOXKJ.js';
23
- import { runnerVmOf, loadRunnerConfig, builtinKind } from './chunk-3DCB3GOV.js';
24
- import './chunk-YJLHUKYS.js';
23
+ 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-NE63JADS.js';
25
24
  import { realLima } from './chunk-77MM5RYD.js';
26
25
  import { writeLaunchAgent, launchAgentPath } from './chunk-LF6MLJCY.js';
27
26
  import './chunk-VT4TTJPG.js';
@@ -1,8 +1,15 @@
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, imageBuildOf, isBuiltinContainer, isBuiltinProcess, isBuiltinVm, loadRunnerConfig, resolveBuild, resolveHousekeeping, runnerCredentialProblem, runnerVmOf } from './chunk-3DCB3GOV.js';
4
- import './chunk-YJLHUKYS.js';
3
+ 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 } from './chunk-RQJMN5TJ.js';
4
+ import './chunk-W2AEL4BJ.js';
5
+ import './chunk-FR7HWWCF.js';
6
+ import './chunk-3Z3MPR55.js';
7
+ import './chunk-NE63JADS.js';
8
+ import './chunk-5DNCFOXA.js';
9
+ import './chunk-SOI6K5DY.js';
10
+ import './chunk-PA6CK6WQ.js';
5
11
  import './chunk-BALIE3BA.js';
12
+ import './chunk-E6CO3MJE.js';
6
13
  import './chunk-VNVZDWO3.js';
7
14
  import './chunk-HACGUL52.js';
8
15
  import './chunk-MESOOLF4.js';