@outerlayer/cli 0.7.0 → 0.8.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 (74) hide show
  1. package/CHANGELOG.md +30 -0
  2. package/README.md +5 -5
  3. package/dist/{agent-setup-TXLDY5RV.js → agent-setup-K6RD2Z4P.js} +4 -4
  4. package/dist/{build-JF5UOWKJ.js → build-MS34XEGN.js} +2 -1
  5. package/dist/build-info.json +1 -1
  6. package/dist/builder-IG6FNA54.js +13 -0
  7. package/dist/{check-ASZL5BEO.js → check-GX5ND6RO.js} +26 -22
  8. package/dist/chunk-2BRSMBBB.js +264 -0
  9. package/dist/{chunk-PUN7LMNS.js → chunk-4ACZCY4I.js} +2 -2
  10. package/dist/{chunk-2VO25HHO.js → chunk-4FPWKV7L.js} +3 -3
  11. package/dist/{chunk-AII7CKTH.js → chunk-5ODHQP6O.js} +68 -145
  12. package/dist/chunk-7RQ73DLO.js +23 -0
  13. package/dist/{chunk-7FTNIAHS.js → chunk-AX23QKHS.js} +7 -3
  14. package/dist/{chunk-6ZZHWY2Z.js → chunk-BF4KKEFY.js} +4 -4
  15. package/dist/{chunk-5FWNEQNZ.js → chunk-BQFNZOMQ.js} +1 -1
  16. package/dist/chunk-CX22S5BA.js +45 -0
  17. package/dist/{chunk-D6FXM5OW.js → chunk-GAYWY4GI.js} +8 -8
  18. package/dist/{chunk-MQPRB5K7.js → chunk-HSN5QNS5.js} +8 -8
  19. package/dist/chunk-I2UOAV7X.js +133 -0
  20. package/dist/chunk-I7CJIRMM.js +93 -0
  21. package/dist/{chunk-SSU747O6.js → chunk-ILEA3YHM.js} +1 -1
  22. package/dist/{chunk-OUUINEYB.js → chunk-JKIWMRFH.js} +1 -1
  23. package/dist/{chunk-JPR2WHHF.js → chunk-KSLNQOOS.js} +1 -1
  24. package/dist/{chunk-DGAIVMMN.js → chunk-KV47VQJZ.js} +5 -5
  25. package/dist/{chunk-E4PIFIC3.js → chunk-M4ERCYDB.js} +133 -159
  26. package/dist/chunk-PTW6W5NR.js +127 -0
  27. package/dist/{chunk-DTXOJDEH.js → chunk-PWBILI5P.js} +3 -2
  28. package/dist/{chunk-X2FSFU4C.js → chunk-PXFEYBDE.js} +3 -3
  29. package/dist/{chunk-6IYLDODX.js → chunk-Q4432IZT.js} +5 -5
  30. package/dist/{chunk-AJKEHABI.js → chunk-QB5JQH5V.js} +255 -54
  31. package/dist/{chunk-AQ54MKSQ.js → chunk-QNRSFEGY.js} +2 -2
  32. package/dist/{chunk-774HEQL6.js → chunk-TEKZRTM3.js} +91 -8
  33. package/dist/{chunk-CEBIA5FD.js → chunk-TTNFGMHO.js} +42 -50
  34. package/dist/{chunk-F6GFZXZ3.js → chunk-UXYLWVTQ.js} +1 -18
  35. package/dist/{chunk-M5POMKKW.js → chunk-V7NIVOFD.js} +5 -5
  36. package/dist/{chunk-BCLJSQCV.js → chunk-YO4PSLVB.js} +1 -1
  37. package/dist/{chunk-6QWV3YDJ.js → chunk-Z2THOHPP.js} +2 -2
  38. package/dist/{cli-LEVCGAQV.js → cli-X5ONGYNY.js} +128 -78
  39. package/dist/{command-FLSYCGIB.js → command-7NFU3IPO.js} +38 -20
  40. package/dist/{config-I3TVFYLH.js → config-Z3USDBLU.js} +3 -2
  41. package/dist/{connect-cmd-MJMUONDY.js → connect-cmd-PNZ6IJLJ.js} +2 -2
  42. package/dist/{context-adopt-CE4KDXS3.js → context-adopt-D2Z7F7PB.js} +3 -3
  43. package/dist/{context-materialize-QL33HDJN.js → context-materialize-4PMTDS6K.js} +3 -3
  44. package/dist/{dist-PXBSA7QX.js → dist-3ZTZF2TP.js} +1 -1
  45. package/dist/docker-PRHRSJM5.js +15 -0
  46. package/dist/{doctor-FVDT3KJZ.js → doctor-KALLPCRB.js} +39 -16
  47. package/dist/{emit-artifact-cmd-7RPMRSVP.js → emit-artifact-cmd-D5GMVWNC.js} +7 -7
  48. package/dist/{emit-criteria-cmd-MKI7WETO.js → emit-criteria-cmd-IE7VIM64.js} +5 -5
  49. package/dist/{emit-finding-cmd-RMLGZASB.js → emit-finding-cmd-46PTPN3A.js} +5 -5
  50. package/dist/{emit-result-cmd-MTXAZ2GV.js → emit-result-cmd-KXHHP6HX.js} +7 -7
  51. package/dist/{hook-fast-XBOZ3N6L.js → hook-fast-5H5QBJKT.js} +1 -1
  52. package/dist/{host-key-KDYZ5ECC.js → host-key-YMLXY6QB.js} +1 -1
  53. package/dist/index.js +3 -3
  54. package/dist/{init-VLW7H6RW.js → init-B4CECVOX.js} +25 -18
  55. package/dist/{init-BACXESVV.js → init-S4DH6PWW.js} +16 -13
  56. package/dist/{init-cmd-VJFB5L7X.js → init-cmd-P4MVCBCZ.js} +8 -8
  57. package/dist/{install-NMAPLLBQ.js → install-FHTVJZS6.js} +5 -4
  58. package/dist/{install-cmd-B5SEU3G7.js → install-cmd-BEC7XTNG.js} +3 -1
  59. package/dist/{loop-D3243JKT.js → loop-ODMRE3CW.js} +26 -22
  60. package/dist/{machine-EB3GEVI4.js → machine-J4SAB3Z2.js} +15 -12
  61. package/dist/{mcp-serve-cmd-N6UD2KBX.js → mcp-serve-cmd-CT47P4YQ.js} +2 -2
  62. package/dist/{session-sender-LMACEJJS.js → session-sender-V46VPWQ5.js} +6 -6
  63. package/dist/{status-F4THTJJK.js → status-QBKSH3QE.js} +19 -16
  64. package/dist/{sync-cmd-M6JA3OEE.js → sync-cmd-RJR77V4O.js} +5 -5
  65. package/dist/{watch-NB5TGPEZ.js → watch-YNZTFLEY.js} +5 -5
  66. package/dist/{work-claim-cmd-UHMWOS3G.js → work-claim-cmd-KAD3ZAH7.js} +10 -9
  67. package/dist/{work-cmd-6UMCFTAW.js → work-cmd-CNWPTH7W.js} +6 -6
  68. package/dist/{work-comment-cmd-E4LEUIXZ.js → work-comment-cmd-HH45S6UE.js} +6 -6
  69. package/dist/{work-open-pr-cmd-OPZWGSEQ.js → work-open-pr-cmd-5KR3KFCN.js} +7 -7
  70. package/dist/{work-pr-cmd-IDIAFFRU.js → work-pr-cmd-TTEGCP76.js} +6 -6
  71. package/package.json +2 -2
  72. package/skill-pack/maintained/amend/SKILL.md +22 -6
  73. package/dist/chunk-Q5G2ODUZ.js +0 -54
  74. package/dist/docker-NEGDLU6D.js +0 -7
@@ -1,25 +1,27 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-ABIWDUMS.js';
4
- import { readMarker, currentVersion, removeMarker, writeMarker, entryIn, versionDir, switchCurrent, cleanVersions, isInLayout, startedThroughCurrent, stagingDir } from './chunk-TI7B7UEO.js';
5
- import { LEASE_SECONDS, releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, ALREADY_RELEASED } from './chunk-AJKEHABI.js';
4
+ import { compareVersions, satisfiesRange } from './chunk-I2UOAV7X.js';
5
+ import { LEASE_SECONDS, releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, ALREADY_RELEASED } from './chunk-QB5JQH5V.js';
6
6
  import { writeJobFile, readJobFile, readJobFileChecked } from './chunk-T6OIJQRT.js';
7
7
  import { RUNNER_PROTOCOL } from './chunk-AIW6GLET.js';
8
8
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-UGP76IZ5.js';
9
- import { placeholderQueues, placeholderProblem } from './chunk-6IYLDODX.js';
9
+ import { placeholderQueues, placeholderProblem } from './chunk-Q4432IZT.js';
10
+ import { readMarker, currentVersion, removeMarker, writeMarker, entryIn, versionDir, switchCurrent, cleanVersions, isInLayout, startedThroughCurrent, stagingDir } from './chunk-TI7B7UEO.js';
10
11
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
11
12
  import { RepoFilter } from './chunk-TBT347UY.js';
12
- import { checkFit } from './chunk-OUUINEYB.js';
13
- import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, provisionContainer, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandLine, BuildTokens, classifyRefusal, refusalCode, measureDisk, createRunnerLog, setUpRunnerCgroup, ensureTunnel, keepGhConfigCurrent, createContainerRuntime, formatClock, runnerLabelValue, BUILD_LABEL, RUNNER_LABEL } from './chunk-E4PIFIC3.js';
13
+ import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, provisionContainer, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandLine, BuildTokens, classifyRefusal, refusalCode, measureDisk, createRunnerLog, setUpRunnerCgroup, parseCpuList, ensureTunnel, keepGhConfigCurrent, createContainerRuntime, formatClock } from './chunk-M4ERCYDB.js';
14
+ import { checkFit } from './chunk-JKIWMRFH.js';
14
15
  import { startTimeOf, claimPidFile, readPidFile, isSameProcess, releasePidFile } from './chunk-N5FOE5PS.js';
15
- import { spawnRun } from './chunk-774HEQL6.js';
16
- import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-DGAIVMMN.js';
17
- import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind } from './chunk-DTXOJDEH.js';
18
- import { exceedsDisk } from './chunk-F6GFZXZ3.js';
16
+ import { spawnRun } from './chunk-TEKZRTM3.js';
17
+ import { builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, BUILD_LABEL, RUNNER_LABEL } from './chunk-2BRSMBBB.js';
18
+ import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-KV47VQJZ.js';
19
+ import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind } from './chunk-PWBILI5P.js';
20
+ import { exceedsDisk } from './chunk-7RQ73DLO.js';
19
21
  import { sharedUserEnvironment, JOB_MOUNT, claudeCredential } from './chunk-OD2VTIHN.js';
20
22
  import { parseClaimIdentity } from './chunk-HKMPVPO7.js';
21
23
  import { resolveVersion } from './chunk-RA3O54FC.js';
22
- import { loadHostKey, ensureHostKey, signerFor } from './chunk-M5POMKKW.js';
24
+ import { loadHostKey, ensureHostKey, signerFor } from './chunk-V7NIVOFD.js';
23
25
  import { RUNNER_DIR_MODE, runnerDir, buildDir, attemptStamp, jobDir, jobsDir, pidFilePath, spoolDir, RUNNER_FILE_MODE, rootfsDir } from './chunk-ZM2IMMYN.js';
24
26
  import { HOOKS_DIR_NAME, writeCommitHooks } from './chunk-XCCLFVXM.js';
25
27
  import { randomBytes } from 'crypto';
@@ -37,7 +39,7 @@ function openKvm() {
37
39
  }
38
40
  }
39
41
  function realBlockedProbes() {
40
- return { env: process.env, kvm: openKvm, totalMemoryBytes: totalmem };
42
+ return { env: process.env, kvm: openKvm, totalMemoryBytes: totalmem, imageBuilder: "unknown" };
41
43
  }
42
44
  var DEFAULT_BUILD_MEMORY = "8g";
43
45
  function checkBlocked(config, probes) {
@@ -61,6 +63,13 @@ function checkBlocked(config, probes) {
61
63
  reason: "the runner cannot open /dev/kvm, so builtin:vm cannot start a microVM. Add the runner's account to the kvm group, then restart the service, because a service reads its groups only when it starts"
62
64
  };
63
65
  }
66
+ if (kind === "container" || kind === "vm") {
67
+ const builder = probes.imageBuilder;
68
+ if (builder === "unknown") {
69
+ return { reason: "the runner is still preparing its image builder, the container that limits image builds to runner.build.memory, so it claims nothing yet" };
70
+ }
71
+ if (builder !== "usable") return { reason: `${builder.problem}. The runner takes work again once its image builder works` };
72
+ }
64
73
  if (kind !== "own" && claudeCredential(probes.env) === void 0) {
65
74
  return {
66
75
  reason: "there is no Claude credential in the runner's environment. Put CLAUDE_CODE_OAUTH_TOKEN (from `claude setup-token`) or ANTHROPIC_API_KEY in the runner.env beside the config, then restart the service"
@@ -181,133 +190,6 @@ function writeLastUpdate(configPath, update) {
181
190
  `, { mode: RUNNER_FILE_MODE });
182
191
  renameSync(temporary, path);
183
192
  }
184
-
185
- // src/runner/update/version-order.ts
186
- function parse(version) {
187
- const match = /^(\d+)\.(\d+)\.(\d+)(?:-([0-9A-Za-z.-]+))?(?:\+[0-9A-Za-z.-]+)?$/.exec(version);
188
- if (match === null) return void 0;
189
- return { core: [Number(match[1]), Number(match[2]), Number(match[3])], pre: match[4] };
190
- }
191
- function comparePre(a, b) {
192
- const left = a.split(".");
193
- const right = b.split(".");
194
- for (let i = 0; i < Math.max(left.length, right.length); i++) {
195
- const x = left[i];
196
- const y = right[i];
197
- if (x === void 0) return -1;
198
- if (y === void 0) return 1;
199
- const xNum = /^\d+$/.test(x);
200
- const yNum = /^\d+$/.test(y);
201
- if (xNum && yNum) {
202
- const difference = Number(x) - Number(y);
203
- if (difference !== 0) return Math.sign(difference);
204
- } else if (xNum !== yNum) {
205
- return xNum ? -1 : 1;
206
- } else if (x < y) {
207
- return -1;
208
- } else if (x > y) {
209
- return 1;
210
- }
211
- }
212
- return 0;
213
- }
214
- function compareVersions(a, b) {
215
- const left = parse(a);
216
- const right = parse(b);
217
- if (left === void 0 || right === void 0) return void 0;
218
- for (let i = 0; i < 3; i++) {
219
- const difference = left.core[i] - right.core[i];
220
- if (difference !== 0) return Math.sign(difference);
221
- }
222
- if (left.pre === right.pre) return 0;
223
- if (left.pre === void 0) return 1;
224
- if (right.pre === void 0) return -1;
225
- return comparePre(left.pre, right.pre);
226
- }
227
- function compareCores(a, b) {
228
- for (let i = 0; i < 3; i++) {
229
- const difference = a[i] - b[i];
230
- if (difference !== 0) return Math.sign(difference);
231
- }
232
- return 0;
233
- }
234
- function parsePartial(text) {
235
- if (text === "" || text === "*" || text === "x" || text === "X") return [];
236
- const match = /^v?(\d+|[xX*])(?:\.(\d+|[xX*]))?(?:\.(\d+|[xX*]))?$/.exec(text);
237
- if (match === null) return void 0;
238
- const numbers = [];
239
- for (const part of [match[1], match[2], match[3]]) {
240
- if (part === void 0 || !/^\d+$/.test(part)) break;
241
- numbers.push(Number(part));
242
- }
243
- return numbers;
244
- }
245
- function bumpLast(numbers) {
246
- const core = [numbers[0] ?? 0, numbers[1] ?? 0, numbers[2] ?? 0];
247
- const last = numbers.length - 1;
248
- core[last] = core[last] + 1;
249
- for (let i = last + 1; i < 3; i++) core[i] = 0;
250
- return core;
251
- }
252
- function fill(numbers) {
253
- return [numbers[0] ?? 0, numbers[1] ?? 0, numbers[2] ?? 0];
254
- }
255
- function meets(version, comparator) {
256
- const match = /^(>=|<=|>|<|=|\^|~)?(.*)$/.exec(comparator);
257
- const op = match[1] ?? "";
258
- const numbers = parsePartial(match[2]);
259
- if (numbers === void 0) return void 0;
260
- if (numbers.length === 0) return op === "" || op === "=" || op === ">=" || op === "<=" ? true : void 0;
261
- const low = fill(numbers);
262
- const whole = numbers.length === 3;
263
- switch (op) {
264
- case ">=":
265
- return compareCores(version, low) >= 0;
266
- case ">":
267
- return whole ? compareCores(version, low) > 0 : compareCores(version, bumpLast(numbers)) >= 0;
268
- case "<":
269
- return compareCores(version, low) < 0;
270
- case "<=":
271
- return whole ? compareCores(version, low) <= 0 : compareCores(version, bumpLast(numbers)) < 0;
272
- case "~":
273
- return compareCores(version, low) >= 0 && compareCores(version, bumpLast(numbers.slice(0, Math.min(numbers.length, 2)))) < 0;
274
- case "^": {
275
- let pivot = numbers.findIndex((n) => n !== 0);
276
- if (pivot === -1) pivot = numbers.length - 1;
277
- return compareCores(version, low) >= 0 && compareCores(version, bumpLast(numbers.slice(0, pivot + 1))) < 0;
278
- }
279
- default:
280
- return compareCores(version, low) >= 0 && (whole ? compareCores(version, low) <= 0 : compareCores(version, bumpLast(numbers)) < 0);
281
- }
282
- }
283
- function satisfiesRange(version, range) {
284
- const parsed = parse(version.trim().replace(/^v/, ""));
285
- if (parsed === void 0 || parsed.pre !== void 0) return void 0;
286
- let anyUnreadable = false;
287
- for (const alternative of range.split("||")) {
288
- if (/\s-\s/.test(alternative)) {
289
- anyUnreadable = true;
290
- continue;
291
- }
292
- const comparators = alternative.trim().replace(/(>=|<=|>|<|=|\^|~)\s+/g, "$1").split(/\s+/).filter((c) => c !== "");
293
- if (comparators.length === 0) comparators.push("*");
294
- let all = true;
295
- for (const comparator of comparators) {
296
- const met = meets(parsed.core, comparator);
297
- if (met === void 0) {
298
- anyUnreadable = true;
299
- all = false;
300
- break;
301
- }
302
- if (!met) {
303
- all = false;
304
- break;
305
- }
306
- }
307
- if (all) return true;
308
- }
309
- return anyUnreadable ? void 0 : false;
310
- }
311
193
  var RELEASE_REPOSITORY = "https://github.com/outerlayerai/outerlayer";
312
194
  var RELEASE_WORKFLOW_PATH = ".github/workflows/outerlayer-release.yml";
313
195
  var UpdateStepError = class extends Error {
@@ -580,6 +462,7 @@ function settleUpdate(args) {
580
462
 
581
463
  // src/runner/housekeeping/docker.ts
582
464
  var KIND_LABEL = "ai.outerlayer.kind";
465
+ var NO_BUILDER = /no builder .* found/i;
583
466
  function failure(result, what) {
584
467
  return new Error(`${what}: ${result.stderr.trim() || `docker exited ${result.status}`}`);
585
468
  }
@@ -671,8 +554,13 @@ function createHousekeepingDocker(deps) {
671
554
  if (result.status !== 0) throw failure(result, `docker rmi ${id}`);
672
555
  },
673
556
  async builderPrune(keepBytes) {
674
- const result = await run("docker", ["builder", "prune", "--force", "--keep-storage", String(keepBytes)]);
675
- if (result.status !== 0) throw failure(result, "docker builder prune");
557
+ const inspected = await run("docker", ["buildx", "inspect", deps.builder]);
558
+ if (inspected.status !== 0 && NO_BUILDER.test(inspected.stderr)) return void 0;
559
+ const status = inspected.status === 0 ? /^Status:\s*(\S+)/m.exec(inspected.stdout)?.[1] : void 0;
560
+ if (status !== void 0 && status !== "running") return void 0;
561
+ const result = await run("docker", ["buildx", "prune", "--builder", deps.builder, "--force", "--max-used-space", String(keepBytes)]);
562
+ if (result.status !== 0 && (NO_BUILDER.test(result.stderr) || /driver not running/i.test(result.stderr))) return void 0;
563
+ if (result.status !== 0) throw failure(result, "docker buildx prune");
676
564
  return { freedBytes: parsePrunedBytes(result.stdout) };
677
565
  }
678
566
  };
@@ -842,8 +730,12 @@ async function runHousekeeping(options) {
842
730
  if (options.buildCacheMax !== "off") {
843
731
  try {
844
732
  const pruned = await docker.builderPrune(options.buildCacheMax);
845
- freed += pruned.freedBytes;
846
- log.line(`housekeeping: pruned the build cache down to ${formatBytes(options.buildCacheMax)}, freed ${formatBytes(pruned.freedBytes)}`);
733
+ if (pruned === void 0) {
734
+ log.line("housekeeping: the image builder is not running, so its build cache is left for a later pass");
735
+ } else {
736
+ freed += pruned.freedBytes;
737
+ log.line(`housekeeping: pruned the image builder's build cache down to ${formatBytes(options.buildCacheMax)}, freed ${formatBytes(pruned.freedBytes)}`);
738
+ }
847
739
  } catch (err) {
848
740
  log.error(`housekeeping: the build cache could not be pruned: ${describeCallFailure(err)}`);
849
741
  }
@@ -1137,10 +1029,39 @@ async function tick(state) {
1137
1029
  }
1138
1030
  await sendTickHeartbeat(state, state.lastWorkRequest);
1139
1031
  }
1032
+ function imageBuilderState(state) {
1033
+ const kind = builtinKind(state.config.hooks.provision);
1034
+ if (kind !== "container" && kind !== "vm") return "usable";
1035
+ if (state.deps.container?.buildImage !== void 0 || state.deps.container?.imageHost !== void 0) return "usable";
1036
+ const memory = state.config.build?.memory ?? "8g";
1037
+ let probe = state.imageBuilder;
1038
+ if (probe === void 0 || probe.memory !== memory) probe = state.imageBuilder = { memory, at: 0, running: false };
1039
+ if (probe.result?.ok === true && !probe.running && probe.failures !== void 0 && ensureFailureCount() !== probe.failures) probe.result = void 0;
1040
+ const nowMs = nowOf(state).getTime();
1041
+ const recheckMs = 10 * 6e4;
1042
+ const due = !probe.running && (probe.result === void 0 || !probe.result.ok || nowMs - probe.at >= recheckMs);
1043
+ if (due) {
1044
+ const checking = probe;
1045
+ checking.running = true;
1046
+ const spec = builderSpec(state.config.configPath, memory, state.deps.container?.hostEnv ?? process.env);
1047
+ const check = state.deps.builderProbe ?? ((s) => ensureBuilder(spawnRun, s, { bootstrap: true }));
1048
+ void check(spec).catch((err) => ({ ok: false, problem: `the image builder could not be checked: ${describeCallFailure(err)}` })).then((result2) => {
1049
+ checking.result = result2;
1050
+ checking.failures = ensureFailureCount();
1051
+ checking.at = nowOf(state).getTime();
1052
+ checking.running = false;
1053
+ if (result2.ok && state.blocked !== void 0 && state.pollTimerSeconds !== void 0) void tick(state);
1054
+ });
1055
+ }
1056
+ const result = probe.result;
1057
+ if (result === void 0) return "unknown";
1058
+ return result.ok ? "usable" : { problem: result.problem };
1059
+ }
1140
1060
  function holdWhenBlocked(state) {
1141
1061
  const probes = {
1142
1062
  ...realBlockedProbes(),
1143
1063
  ...state.deps.container?.hostEnv === void 0 ? {} : { env: state.deps.container.hostEnv },
1064
+ ...state.deps.blocked?.imageBuilder === void 0 ? { imageBuilder: imageBuilderState(state) } : {},
1144
1065
  ...state.deps.blocked
1145
1066
  };
1146
1067
  const blocked = checkBlocked(state.config, probes);
@@ -1194,7 +1115,7 @@ async function housekeepingPass(state) {
1194
1115
  state.housekeepingRunning = true;
1195
1116
  try {
1196
1117
  state.deps.housekeeping ??= {};
1197
- state.deps.housekeeping.docker ??= createHousekeepingDocker({ runnerId: runnerLabelValue(state.config.configPath) });
1118
+ state.deps.housekeeping.docker ??= createHousekeepingDocker({ runnerId: runnerLabelValue(state.config.configPath), builder: builderName(state.config.configPath) });
1198
1119
  const result = await runHousekeeping({
1199
1120
  configPath: state.config.configPath,
1200
1121
  keepDays: config.jobsKeepDays,
@@ -1268,7 +1189,7 @@ var CLAIM_REFUSAL_CODES = new Set(
1268
1189
  "pull_request_from_fork pull_request_on_default_branch pull_request_ambiguous branch_claimed_elsewhere".split(" ")
1269
1190
  );
1270
1191
  async function tryClaimAndStart(state, item, queue) {
1271
- const { postJson: postJson2 } = await import('./work-cmd-6UMCFTAW.js');
1192
+ const { postJson: postJson2 } = await import('./work-cmd-CNWPTH7W.js');
1272
1193
  const log = logOf(state);
1273
1194
  const hostKey = await loadHostKey(state.config.configPath);
1274
1195
  const claim = await retrySend(
@@ -1992,7 +1913,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
1992
1913
  const outcome = await onStartUnderMarker({
1993
1914
  configPath,
1994
1915
  own: ownVersionOf(deps),
1995
- check: update.check ? () => update.check(configPath) : async () => (await import('./check-ASZL5BEO.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
1916
+ check: update.check ? () => update.check(configPath) : async () => (await import('./check-GX5ND6RO.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
1996
1917
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
1997
1918
  log
1998
1919
  });
@@ -2034,6 +1955,8 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2034
1955
  const adopted = { job, dirPath, lastRenewAtMs: nowMs(), cmd: null, cpuSample: null, ending: false };
2035
1956
  state.jobs.set(dirPath, adopted);
2036
1957
  if (job.container !== void 0) {
1958
+ const cores = job.container.cpuset === void 0 ? void 0 : parseCpuList(job.container.cpuset);
1959
+ if (cores !== void 0) runtimeOf(state).cpus.hold(job.container.buildId, cores);
2037
1960
  const tokens = buildTokensFor(state, adopted, job.item);
2038
1961
  runtimeOf(state).credentials.set(dirPath, tokens);
2039
1962
  await ensureTunnel(runtimeOf(state), job.container, dirPath, config, job.itemKey, job.branch);
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+
4
+ createRequire(import.meta.url);
5
+
6
+ // src/runner/container/disk.ts
7
+ var UNITS = { "": 1, k: 1024, m: 1024 ** 2, g: 1024 ** 3 };
8
+ function parseSize(text) {
9
+ const match = /^(\d+(?:\.\d+)?)([kKmMgG]?)$/.exec(text);
10
+ if (match === null) return void 0;
11
+ const bytes = Number(match[1]) * UNITS[match[2].toLowerCase()];
12
+ return bytes > 0 ? bytes : void 0;
13
+ }
14
+ function parseDuKilobytes(output) {
15
+ const match = /^(\d+)\s/.exec(output);
16
+ return match === null ? void 0 : Number(match[1]);
17
+ }
18
+ function exceedsDisk(usedKilobytes, limit) {
19
+ const bytes = parseSize(limit);
20
+ return usedKilobytes * 1024 > (bytes ?? Number.POSITIVE_INFINITY);
21
+ }
22
+
23
+ export { exceedsDisk, parseDuKilobytes, parseSize };
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { runnerUnit, UNIT_MARKER } from './chunk-FBTE2A2X.js';
4
- import { checkFit } from './chunk-OUUINEYB.js';
5
- import { builtinKind } from './chunk-DTXOJDEH.js';
4
+ import { checkFit } from './chunk-JKIWMRFH.js';
5
+ import { builtinKind } from './chunk-PWBILI5P.js';
6
6
  import { runnerDir } from './chunk-ZM2IMMYN.js';
7
7
  import { dirname } from 'path';
8
8
  import { spawnSync } from 'child_process';
@@ -165,7 +165,11 @@ function installService(request, deps) {
165
165
  function ensureLoginTask(deps, unitName) {
166
166
  const tasks = deps.tasks;
167
167
  const name = taskNameFor(unitName);
168
- const command = taskCommand(deps.distro ?? "Ubuntu");
168
+ if (deps.distro === void 0 || deps.distro === "") {
169
+ const manual2 = `from Windows, run: schtasks /Create /F /TN ${name} /SC ONLOGON /TR "${taskCommand("<distribution>")}", with the name \`wsl -l\` shows`;
170
+ return [`WSL_DISTRO_NAME is not set, as under sudo, so the scheduled task that starts WSL2 at login was not made: ${manual2}`];
171
+ }
172
+ const command = taskCommand(deps.distro);
169
173
  const manual = `from Windows, run: schtasks /Create /F /TN ${name} /SC ONLOGON /TR "${command}"`;
170
174
  if (tasks === void 0 || !tasks.available()) {
171
175
  return [`Windows interop is off, so the scheduled task that starts WSL2 at login was not made: ${manual}`];
@@ -5,16 +5,16 @@ import { RepoFilter } from './chunk-TBT347UY.js';
5
5
  import { hookExecSpoolPath } from './chunk-F7CU5ABH.js';
6
6
  import { applyReportedCost } from './chunk-BKO6JEZI.js';
7
7
  import { migrateLegacyArtifactSidecars, planArtifactUpload, artifactsStatePath, sanitizeTerminal, artifactBlobsDir, resolveArtifactTurnIndex, isArtifactTombstoned, ARTIFACT_RETRY_MAX_AGE_MS, writeArtifactSpoolState, reclaimUnneededArtifactBlobs, neededArtifactShas } from './chunk-ZYHKJKSU.js';
8
- import { setCustomScrubbers, setLocalIdentity, tailTranscript, enrichSessionRepo, scanAll, setRepoRoot, resolveRepoIdentity, sessionIdFromPath, scrubDeep, SOURCE_ADAPTERS } from './chunk-D6FXM5OW.js';
8
+ import { setCustomScrubbers, setLocalIdentity, tailTranscript, enrichSessionRepo, scanAll, setRepoRoot, resolveRepoIdentity, sessionIdFromPath, scrubDeep, SOURCE_ADAPTERS } from './chunk-GAYWY4GI.js';
9
9
  import { C } from './chunk-YRYMNBGQ.js';
10
10
  import { readLaunchSpoolState, launchStatusIsDecisive, launchedItemsBySession, launchesPath } from './chunk-GQD22KKN.js';
11
11
  import { readLatestProvenanceForSession, readContextProvenance } from './chunk-ZJSNLVCE.js';
12
- import { defaultFetch } from './chunk-BCLJSQCV.js';
12
+ import { defaultFetch } from './chunk-YO4PSLVB.js';
13
13
  import { resolveGatewayCredentials, unauthorizedMessage } from './chunk-BOLTI6LR.js';
14
14
  import { CAPTURE_TIERS, inferArtifactKind, bannedPathsForTier, downconvertSession, isHumanUserTurn, turnCountBound, EVENT_TYPES } from './chunk-YNJEOGDL.js';
15
15
  import { readCloudConfig, cloudConfigPath, writeCloudConfig } from './chunk-EABW6AJQ.js';
16
- import { signerFor, signRunnerRequest } from './chunk-M5POMKKW.js';
17
- import { writeSyncStatus, spoolDir } from './chunk-JPR2WHHF.js';
16
+ import { signerFor, signRunnerRequest } from './chunk-V7NIVOFD.js';
17
+ import { writeSyncStatus, spoolDir } from './chunk-KSLNQOOS.js';
18
18
  import { removeJournalHooks } from './chunk-XCCLFVXM.js';
19
19
  import { readRepoConnection, findGitDirs } from './chunk-BJ3KTMDH.js';
20
20
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -4,7 +4,7 @@ import { appendContextProvenance } from './chunk-ZJSNLVCE.js';
4
4
  import { readPin, pinExists, readBuildHold, readContextManifest, manifestFilesPresent, writeDegraded, writeSourceCache, SOURCE_CACHE_TTL_RETRY_MS, SOURCE_CACHE_TTL_SUCCESS_MS, isLastCheckFresh, readDegraded, touchLastCheck, clearDegraded, writeContextManifest, writePinIfChanged, readSourceCache, isSourceCacheFresh } from './chunk-ZZXLM64C.js';
5
5
  import { loadMaintainedFiles, writeMaintainedFiles } from './chunk-VXLJORHL.js';
6
6
  import { parseGoverns, normalizeRepoName, CONTEXT_SOURCE_CONFIG_PATH, parseOuterlayerConfig, classifyTree, emitTree } from './chunk-7ZR5UPMB.js';
7
- import { defaultFetch } from './chunk-BCLJSQCV.js';
7
+ import { defaultFetch } from './chunk-YO4PSLVB.js';
8
8
  import { resolveGatewayCredentials } from './chunk-BOLTI6LR.js';
9
9
  import { ensureContextExcludes, ensurePreCommitGuardHook } from './chunk-XCCLFVXM.js';
10
10
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -0,0 +1,45 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+
4
+ createRequire(import.meta.url);
5
+
6
+ // src/runner/image/pins.ts
7
+ var CLAUDE_CODE_VERSION = "2.1.284";
8
+ var DEFAULT_BASE_IMAGE = "ubuntu:24.04@sha256:008173c23f95b170204355c12626cb5a965d779a7e1283b09e9cffbb1bf33ca3";
9
+ var NODE_IMAGE = "node:22-bookworm-slim@sha256:43ac6c60b8f89723f746e8a92ce91abd5017e627ce1ddfe4238355d3a30b772c";
10
+ var BUILDKIT_IMAGE = "moby/buildkit:v0.33.1@sha256:cec9f139f45e93c5c69c60f8b07cfad9f43f4ef6b6a6cd917527fea5ff2e3dea";
11
+ var GH_VERSION = "2.101.0";
12
+ var GH_SHA256 = {
13
+ amd64: "9bca2d1c16825f109907a23307628a2f0698fbf99662b73a5cf0b020293072b8",
14
+ arm64: "b57e8063f18862647c9d22727c32e9da1b963f8bf9db648fe123a6975695640f"
15
+ };
16
+ var TINI_VERSION = "0.19.0";
17
+ var TINI_SHA256 = {
18
+ amd64: "c5b0666b4cb676901f90dfcb37106783c5fe2077b04590973b885950611b30ee",
19
+ arm64: "eae1d3aa50c48fb23b8cbdf4e369d0910dfc538566bfd09df89a774aa84a48b9"
20
+ };
21
+ var MICROVM_ARCHES = ["x86_64"];
22
+ function firecrackerArch(nodeArch) {
23
+ return nodeArch === "x64" ? "x86_64" : nodeArch === "arm64" ? "aarch64" : nodeArch;
24
+ }
25
+ var FIRECRACKER_VERSION = "1.13.1";
26
+ var FIRECRACKER_SHA256 = {
27
+ x86_64: "59450b9171ff2ebdf2f9a25be3a248a7ba79fb6371aec51a9d6d8eefca7b4faf"
28
+ };
29
+ var FIRECRACKER_BINARY_SHA256 = {
30
+ x86_64: "7d3924e0c8761edafbf85cb2a94c268ffad249644a40fd02d4e15cde4c206f6e"
31
+ };
32
+ var GUEST_ASSETS_VERSION = "1";
33
+ var GUEST_ASSETS_BASE_URL = `https://github.com/outerlayerai/guest-assets/releases/download/guest-${GUEST_ASSETS_VERSION}`;
34
+ var GUEST_KERNEL_SHA256 = {
35
+ x86_64: "5a2d716d301615c69fefc2f9574954e838269f14d5e8b0d1bad88b680cd372ee"
36
+ };
37
+ var GUEST_HELPER_SHA256 = {
38
+ x86_64: "4175e89ae8cb633113b5f69ef8b6e206093954411fe53edf86357bc1b7e822f9"
39
+ };
40
+ function guestAssetsPinned(arch) {
41
+ const zero = "0".repeat(64);
42
+ return GUEST_KERNEL_SHA256[arch] !== zero && GUEST_HELPER_SHA256[arch] !== zero;
43
+ }
44
+
45
+ export { BUILDKIT_IMAGE, CLAUDE_CODE_VERSION, DEFAULT_BASE_IMAGE, FIRECRACKER_BINARY_SHA256, FIRECRACKER_SHA256, FIRECRACKER_VERSION, GH_SHA256, GH_VERSION, GUEST_ASSETS_BASE_URL, GUEST_ASSETS_VERSION, GUEST_HELPER_SHA256, GUEST_KERNEL_SHA256, MICROVM_ARCHES, NODE_IMAGE, TINI_SHA256, TINI_VERSION, firecrackerArch, guestAssetsPinned };
@@ -21970,14 +21970,14 @@ var ModelRegistryImpl = class {
21970
21970
  };
21971
21971
  var models_default = {
21972
21972
  version: "1.0.0",
21973
- generatedAt: "2026-10-04T05:04:28.506Z",
21973
+ generatedAt: "2026-10-05T04:49:52.578Z",
21974
21974
  sources: {
21975
21975
  litellm: {
21976
- fetchedAt: "2026-10-04T05:04:28.506Z",
21976
+ fetchedAt: "2026-10-05T04:49:52.578Z",
21977
21977
  modelCount: 1887
21978
21978
  },
21979
21979
  openrouter: {
21980
- fetchedAt: "2026-10-04T05:04:28.506Z",
21980
+ fetchedAt: "2026-10-05T04:49:52.578Z",
21981
21981
  modelCount: 198
21982
21982
  }
21983
21983
  },
@@ -43490,12 +43490,12 @@ var models_default = {
43490
43490
  "top_p"
43491
43491
  ],
43492
43492
  pricing: {
43493
- inputCostPerToken: 25e-8,
43494
- outputCostPerToken: 1e-6
43493
+ inputCostPerToken: 29e-8,
43494
+ outputCostPerToken: 114e-8
43495
43495
  },
43496
43496
  context: {
43497
43497
  maxInputTokens: 163840,
43498
- maxOutputTokens: 147456
43498
+ maxOutputTokens: 115200
43499
43499
  },
43500
43500
  capabilities: {
43501
43501
  functionCalling: true,
@@ -52756,8 +52756,8 @@ var models_default = {
52756
52756
  "max_tokens"
52757
52757
  ],
52758
52758
  pricing: {
52759
- inputCostPerToken: 4e-6,
52760
- outputCostPerToken: 2e-5
52759
+ inputCostPerToken: 2e-6,
52760
+ outputCostPerToken: 1e-5
52761
52761
  },
52762
52762
  context: {
52763
52763
  maxInputTokens: 105e4,
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { readStatuslineState, STATE_FRESH_MS } from './chunk-F47JBIAW.js';
4
- import { resolveCredentials, getJson, WorkCommandError } from './chunk-DGAIVMMN.js';
5
- import { isLinkedRepository } from './chunk-SSU747O6.js';
4
+ import { resolveCredentials, getJson, WorkCommandError } from './chunk-KV47VQJZ.js';
5
+ import { isLinkedRepository } from './chunk-ILEA3YHM.js';
6
6
  import { sanitizeTerminal } from './chunk-ZYHKJKSU.js';
7
- import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-D6FXM5OW.js';
7
+ import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-GAYWY4GI.js';
8
8
  import { C } from './chunk-YRYMNBGQ.js';
9
9
  import { readSettings, settingsPath, isOurStatuslineSlot, statuslineWrappedOriginal, REGISTERED_EVENTS, isOurHookCommand, ourCommandBins, cliBinResolvable, ourDirectScriptBins, wrappedOriginalCommand } from './chunk-5QRP3MVS.js';
10
10
  import { readPin, readContextManifest, readDegraded, readSourceCache } from './chunk-ZZXLM64C.js';
11
- import { defaultFetch } from './chunk-BCLJSQCV.js';
11
+ import { defaultFetch } from './chunk-YO4PSLVB.js';
12
12
  import { resolveGatewayCredentials } from './chunk-BOLTI6LR.js';
13
13
  import { readCloudConfig } from './chunk-EABW6AJQ.js';
14
- import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-JPR2WHHF.js';
14
+ import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-KSLNQOOS.js';
15
15
  import { deadHooksState, preparePackageManagerCommand, contextExcludesPresent } from './chunk-XCCLFVXM.js';
16
16
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
17
17
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -1004,7 +1004,7 @@ function doctorExitCode(checks) {
1004
1004
 
1005
1005
  // src/doctor-report.ts
1006
1006
  async function gatherDoctorChecks() {
1007
- const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-I3TVFYLH.js');
1007
+ const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-Z3USDBLU.js');
1008
1008
  const configPath = defaultRunnerConfigPath();
1009
1009
  const checks = runDoctor({ runnerHost: hasRunnerBlock(configPath) });
1010
1010
  const credential = await credentialChecks();
@@ -1016,7 +1016,7 @@ async function gatherDoctorChecks() {
1016
1016
  const { runnerVmCheck } = await import('./doctor-53F2PYY7.js');
1017
1017
  checks.push(runnerVmCheck(configPath, { lima: realLima(), home: homeFromEnv(), instance: runnerVm.instance }));
1018
1018
  } else if (hasRunnerBlock(configPath)) {
1019
- const { runnerHostChecks } = await import('./doctor-FVDT3KJZ.js');
1019
+ const { runnerHostChecks } = await import('./doctor-KALLPCRB.js');
1020
1020
  const hooks = (() => {
1021
1021
  try {
1022
1022
  return loadRunnerConfig(configPath).hooks;
@@ -1051,7 +1051,7 @@ async function gatherDoctorChecks() {
1051
1051
  const { existsSync: existsSync2 } = await import('fs');
1052
1052
  if (process.platform !== "linux" || !existsSync2("/run/systemd/system")) return void 0;
1053
1053
  const { inspectService, realInspectProbes } = await import('./inspect-XAUSB7L3.js');
1054
- const { DEFAULT_UNIT_NAME } = await import('./install-NMAPLLBQ.js');
1054
+ const { DEFAULT_UNIT_NAME } = await import('./install-FHTVJZS6.js');
1055
1055
  const { dirname: dirname2 } = await import('path');
1056
1056
  return inspectService(DEFAULT_UNIT_NAME, dirname2(configPath), realInspectProbes());
1057
1057
  })();