@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.
- package/dist/{build-G4GUF6LT.js → build-SEAQVLD5.js} +2 -2
- package/dist/{build-disk-3GL3KKEB.js → build-disk-JHTMPRAA.js} +3 -5
- package/dist/build-info.json +1 -1
- package/dist/{builder-3CUKTVSY.js → builder-Y4P7QARW.js} +2 -3
- package/dist/{check-64FD5G3X.js → check-MRYFTLOO.js} +12 -14
- package/dist/{chunk-JRZCRIEO.js → chunk-2EGCI2VW.js} +2881 -2561
- package/dist/{chunk-LJUIG5K4.js → chunk-3RIFVLPO.js} +5 -5
- package/dist/{chunk-QFQC5K4J.js → chunk-7HHNGZS5.js} +33 -21
- package/dist/{chunk-YERR22SY.js → chunk-DISTLL2Q.js} +1 -1
- package/dist/{chunk-GFVDC5S3.js → chunk-FR7HWWCF.js} +34 -3
- package/dist/{chunk-LYE3KB6L.js → chunk-HE4FBF4T.js} +2 -2
- package/dist/{chunk-TGHBOXKJ.js → chunk-NE63JADS.js} +2 -2
- package/dist/{chunk-DGI66PGY.js → chunk-PWH3BEZF.js} +30 -270
- package/dist/{chunk-3DCB3GOV.js → chunk-RQJMN5TJ.js} +6 -4
- package/dist/{chunk-CANYZTD5.js → chunk-SDU2IE22.js} +40 -13
- package/dist/chunk-W2AEL4BJ.js +179 -0
- package/dist/{chunk-OOCAF3ID.js → chunk-XHHTMFCX.js} +1 -1
- package/dist/{chunk-JPG43G6Y.js → chunk-YXHKCHWG.js} +1 -1
- package/dist/{cli-WKRURGHC.js → cli-K6XGL4EZ.js} +39 -39
- package/dist/{command-WG54AUHK.js → command-7FAIIQGF.js} +8 -9
- package/dist/{config-LZSFW2O3.js → config-QXMUWJAQ.js} +9 -2
- package/dist/{container-start-DQKFQ3CL.js → container-start-CVP3NTDG.js} +9 -10
- package/dist/{docker-4ERXWTRW.js → docker-ANW76BNW.js} +2 -3
- package/dist/{doctor-GRCEYJXA.js → doctor-GJAHI3KU.js} +16 -21
- package/dist/{emit-demo-cmd-JSVI56WY.js → emit-demo-cmd-6DF2QIAS.js} +1 -1
- package/dist/index.js +1 -1
- package/dist/{init-WNO4NAO7.js → init-XDOKWBL2.js} +8 -9
- package/dist/{init-OKJAI77M.js → init-ZQ5B3TJZ.js} +8 -9
- package/dist/{init-cmd-PFW4XTG7.js → init-cmd-YMGW2WXJ.js} +1 -1
- package/dist/install-QPA7DQHO.js +19 -0
- package/dist/{loop-2SITCQ6H.js → loop-UJL2UCUM.js} +12 -14
- package/dist/{machine-YHBCNRUO.js → machine-2YPAFFCH.js} +8 -9
- package/dist/{runner-env-QYE7KZFP.js → runner-env-HOUXKWIJ.js} +10 -4
- package/dist/{runner-identity-FIHOECSH.js → runner-identity-KPUVTRLS.js} +2 -3
- package/dist/{runner-key-YUKU2MWK.js → runner-key-FUJD66R6.js} +8 -9
- package/dist/{status-VBQJMFEX.js → status-2KNTILGQ.js} +9 -10
- package/dist/{work-claim-cmd-MFND6Z4S.js → work-claim-cmd-NJNOQFQE.js} +5 -2
- package/package.json +1 -1
- package/dist/chunk-XWFSAOC7.js +0 -111
- package/dist/chunk-YJLHUKYS.js +0 -38
- package/dist/chunk-YYYRBYWG.js +0 -32
- 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,
|
|
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-
|
|
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,
|
|
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-
|
|
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 {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
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.
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
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-
|
|
5042
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
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-
|
|
5061
|
-
const { containerStart } = await import('./container-start-
|
|
5062
|
-
const { start, RunnerStartError } = await import('./loop-
|
|
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-
|
|
5082
|
-
const { runRunnerCheck } = await import('./check-
|
|
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-
|
|
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-
|
|
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-
|
|
5172
|
-
const { uninstallServiceCommand } = await import('./command-
|
|
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-
|
|
5200
|
-
const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-
|
|
5201
|
-
const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-
|
|
5202
|
-
const { detectMachine } = await import('./machine-
|
|
5203
|
-
const { chooseVm, runVmInit, VmInitError } = await import('./init-
|
|
5204
|
-
const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-
|
|
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-
|
|
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-
|
|
5399
|
-
const { buildRepositoryImage, RecipeError } = await import('./build-
|
|
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-
|
|
5402
|
-
const { builderSpec } = await import('./builder-
|
|
5403
|
-
const { loadRunnerConfig } = await import('./config-
|
|
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-
|
|
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-
|
|
5482
|
-
const { requestStop } = await import('./loop-
|
|
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-
|
|
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-
|
|
5491
|
-
const { renderStatus } = await import('./status-
|
|
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-
|
|
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-
|
|
5551
|
-
const { listJobFiles } = await import('./loop-
|
|
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-
|
|
6
|
+
import { detectMachine, helperSocketPath, ensureFirecrackerAndJailer } from './chunk-2EGCI2VW.js';
|
|
7
7
|
import './chunk-2PGI6RDE.js';
|
|
8
|
-
import './chunk-
|
|
9
|
-
import './chunk-
|
|
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-
|
|
19
|
-
import './chunk-
|
|
20
|
-
import
|
|
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-
|
|
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-
|
|
4
|
-
import './chunk-
|
|
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';
|