@outerlayer/cli 0.28.3 → 0.28.4

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/CHANGELOG.md CHANGED
@@ -1,5 +1,12 @@
1
1
  # @outerlayer/cli
2
2
 
3
+ ## 0.28.4
4
+
5
+ ### Patch Changes
6
+
7
+ - eabcfe6: `outerlayer doctor` passes on a runner that uses a Runner key. It leaves out the Claude Code version and last-sync checks for builds in containers or microVMs. The runner no longer logs a failed relay join while the build's relay is still starting.
8
+ - 1cde310: A container build's finished connections free their place at once, so a large package install no longer runs out of connections and fails partway through.
9
+
3
10
  ## 0.28.3
4
11
 
5
12
  ### Patch Changes
@@ -1 +1 @@
1
- {"id":"2026-10-17T16:34:27.736Z+686145e","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-17T18:42:55.566Z+c3e29e0","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-LRFU6RPD.js';
4
- import './chunk-ILU6664L.js';
3
+ import { probeCredentials } from './chunk-NVUO52YW.js';
4
+ import './chunk-6P2Z5AUY.js';
5
5
  import './chunk-3JVYMD4G.js';
6
6
  import './chunk-E7R2GIAW.js';
7
7
  import './chunk-TPKYTORP.js';
@@ -14,13 +14,13 @@ import './chunk-2BZTGJII.js';
14
14
  import './chunk-VM6BX2WJ.js';
15
15
  import './chunk-ESVW4MJY.js';
16
16
  import './chunk-RXFKXZJS.js';
17
- import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-SVODOMYC.js';
17
+ import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-ERVZGWUR.js';
18
18
  import './chunk-YYYRBYWG.js';
19
19
  import './chunk-6NFXOQKZ.js';
20
20
  import './chunk-TBT347UY.js';
21
- import './chunk-T7LJ6AIC.js';
22
- import './chunk-EPGMCEVP.js';
23
- import './chunk-4SJ57DH7.js';
21
+ import './chunk-KBB3CQTW.js';
22
+ import './chunk-W3K6GBXY.js';
23
+ import './chunk-5Q4NDYQP.js';
24
24
  import './chunk-WL3QF3QF.js';
25
25
  import './chunk-DIQN5SEL.js';
26
26
  import './chunk-JZJLKTZT.js';
@@ -20,7 +20,7 @@ import { versionAtLeast, MINIMUM_CLAUDE_VERSION } from './chunk-HCVLP7XA.js';
20
20
  import { orderSessions, extractFacts, sessionsToTimeline } from './chunk-RKOTJQVG.js';
21
21
  import { downconvertSession } from './chunk-QZBXLLTV.js';
22
22
  import { realFdStorePort } from './chunk-XD4ZCMA4.js';
23
- import { RELAY_USER, RELAY_ID, UNKNOWN_TRANSPORT_REASON, DOCKER_DESKTOP_REASON, MAX_MALFORMED_SESSIONS, MALFORMED_REASON, MAX_OPEN_STREAMS, STREAM_RESET_RATE, STREAM_RESET_BURST, STREAM_WINDOW, SESSION_WINDOW, targetOfPath } from './chunk-MESOOLF4.js';
23
+ import { RELAY_USER, RELAY_ID, UNKNOWN_TRANSPORT_REASON, DOCKER_DESKTOP_REASON, MAX_MALFORMED_SESSIONS, MALFORMED_REASON, JOIN_WAIT_MS, MAX_OPEN_STREAMS, STREAM_RESET_RATE, STREAM_RESET_BURST, STREAM_WINDOW, SESSION_WINDOW, targetOfPath } from './chunk-MESOOLF4.js';
24
24
  import { readFileSync, mkdirSync, existsSync, mkdtempSync, rmSync, chmodSync, truncateSync, writeFileSync, readdirSync, lstatSync, copyFileSync, accessSync, constants, statSync, rmdirSync, renameSync, unlinkSync, openSync, closeSync, createWriteStream, createReadStream, writeSync } from 'fs';
25
25
  import { join, dirname, resolve, basename } from 'path';
26
26
  import { isIP, createConnection, connect, createServer as createServer$1 } from 'net';
@@ -1488,6 +1488,7 @@ var FIRST_BACKOFF_MS = 200;
1488
1488
  var LONGEST_BACKOFF_MS = 5e3;
1489
1489
  var JOINED_AFTER_MS = 2e3;
1490
1490
  var EXIT_WAIT_MS = 5e3;
1491
+ var SOCKET_NOT_READY = /\b(ENOENT|ECONNREFUSED)\b/;
1491
1492
  function exitedWithin(stream, ms) {
1492
1493
  let timer;
1493
1494
  const late = new Promise((resolve2) => {
@@ -1499,6 +1500,8 @@ function exitedWithin(stream, ms) {
1499
1500
  function superviseRelay(input) {
1500
1501
  const sleep = input.sleep ?? ((ms) => new Promise((resolve2) => setTimeout(resolve2, ms)));
1501
1502
  const exitWaitMs = input.exitWaitMs ?? EXIT_WAIT_MS;
1503
+ const now = input.now ?? Date.now;
1504
+ const startedAt = now();
1502
1505
  let closed = false;
1503
1506
  let fatal;
1504
1507
  let running;
@@ -1542,9 +1545,12 @@ function superviseRelay(input) {
1542
1545
  return;
1543
1546
  }
1544
1547
  } else if (!joined && !failing) {
1545
- failing = true;
1546
1548
  const reason = stream.stderrTail?.().trim() ?? "";
1547
- input.log?.(`could not join the relay in ${input.container}${status === 0 || status === void 0 ? "" : ` (exec exited ${status})`}${reason === "" ? "" : `: ${reason}`} \xB7 trying again`);
1549
+ const starting = SOCKET_NOT_READY.test(reason) && now() - startedAt < JOIN_WAIT_MS;
1550
+ if (!starting) {
1551
+ failing = true;
1552
+ input.log?.(`could not join the relay in ${input.container}${status === 0 || status === void 0 ? "" : ` (exec exited ${status})`}${reason === "" ? "" : `: ${reason}`} \xB7 trying again`);
1553
+ }
1548
1554
  }
1549
1555
  if (closed) return;
1550
1556
  await Promise.race([sleep(backoff), new Promise((resolve2) => wake = resolve2)]);
@@ -2525,6 +2531,7 @@ ${body}`);
2525
2531
  upstream.on("error", (err) => client.destroy(err));
2526
2532
  upstream.on("close", () => {
2527
2533
  if (!upstream.readableEnded && !client.writableEnded) client.destroy(abortedError("the tunnel closed the connection to the server before it ended"));
2534
+ else client.resume();
2528
2535
  });
2529
2536
  client.once("end", () => {
2530
2537
  upstream.destroy();
@@ -5,7 +5,7 @@ import { DOCKERD_LOG, HELPER_PATH, HELPER_RECORD } from './chunk-OO6OADZN.js';
5
5
  import { senderPidfile } from './chunk-YTR435DO.js';
6
6
  import { installScrubContext } from './chunk-2BZTGJII.js';
7
7
  import { writeDockerClientConfig } from './chunk-RXFKXZJS.js';
8
- import { ADDED_USER, shellQuote, GH_CONFIG_YML, ghHostsYml, AssetError, obtainImage, ensureRootfs, gitRemoteFor, startServicesFor, createLeaseChannel, createBuildDisk, machineConfig, resolveAgentUser, AgentUserError, runBuildSteps, LEASE_SECONDS, createContainerRuntime, stopContainer, cleanupContainer, outOfMemoryReason, containerSenderCommand, signalInContainer, syncInContainer, copyTranscriptsFromContainer, senderAliveScript, helperFirecrackerNote, HelperRefusal, isLiteralAddress, deleteBuildDisk, startCheckContainer, lifecycleSteps, lifecycleFailureReason, writeEvalInput, DeliveryFailure, EVAL_INPUT_NAME, copyTranscripts, senderSignalScript, containerJudgeEnvironment, copyJudgeTree } from './chunk-4SJ57DH7.js';
8
+ import { ADDED_USER, shellQuote, GH_CONFIG_YML, ghHostsYml, AssetError, obtainImage, ensureRootfs, gitRemoteFor, startServicesFor, createLeaseChannel, createBuildDisk, machineConfig, resolveAgentUser, AgentUserError, runBuildSteps, LEASE_SECONDS, createContainerRuntime, stopContainer, cleanupContainer, outOfMemoryReason, containerSenderCommand, signalInContainer, syncInContainer, copyTranscriptsFromContainer, senderAliveScript, helperFirecrackerNote, HelperRefusal, isLiteralAddress, deleteBuildDisk, startCheckContainer, lifecycleSteps, lifecycleFailureReason, writeEvalInput, DeliveryFailure, EVAL_INPUT_NAME, copyTranscripts, senderSignalScript, containerJudgeEnvironment, copyJudgeTree } from './chunk-5Q4NDYQP.js';
9
9
  import { waitForAgent, vmExecArgs } from './chunk-WL3QF3QF.js';
10
10
  import { socketPathProblem, vsockLinks, LEASE_LINK, linkVsockSockets } from './chunk-DIQN5SEL.js';
11
11
  import { describeCallFailure, resolveGoverningSource, refusalCode, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, logStamp, createRunnerLog, removeKeptContext, formatDuration, retrySend, formatClock, keptContextTree } from './chunk-JZJLKTZT.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { isPlaceholderCommand } from './chunk-T7LJ6AIC.js';
3
+ import { isPlaceholderCommand } from './chunk-KBB3CQTW.js';
4
4
  import { describeCallFailure } from './chunk-JZJLKTZT.js';
5
5
  import { builtinKind } from './chunk-YYGXCRIW.js';
6
6
  import { WorkCommandError, getJson } from './chunk-X7SFJZIG.js';
@@ -176,17 +176,18 @@ function runDoctor(env = {}) {
176
176
  const home = env.home ?? homeFromEnv();
177
177
  const now = env.now ?? Date.now;
178
178
  const laptop = env.runnerHost !== true;
179
+ const buildsInOwnImages = env.runnerHost === true && (env.runnerHooks === "builtin:container" || env.runnerHooks === "builtin:vm");
179
180
  const transcripts = laptop ? scanTranscripts(home) : void 0;
180
181
  const starter = laptop ? checkStarterFiles(env.cwd) : void 0;
181
182
  return [
182
183
  ...laptop ? [checkClaudeDir(home), checkTranscripts(transcripts, now), ...checkHooks(home, env.cwd, transcripts, now)] : [LAPTOP_CHECKS_NOT_APPLICABLE],
183
184
  ...checkDeadHooksState(env.cwd),
184
185
  ...laptop ? [checkSpoolWritable(home)] : [],
185
- checkLastSync(home, now),
186
+ ...buildsInOwnImages ? [] : [checkLastSync(home, now)],
186
187
  ...laptop ? [checkDaemon(home)] : [],
187
188
  checkCleanupPeriod(home),
188
189
  checkDiskHeadroom(home),
189
- checkClaudeVersion(env),
190
+ ...buildsInOwnImages ? [] : [checkClaudeVersion(env)],
190
191
  checkSettingsValid(home, env.cwd),
191
192
  ...laptop ? checkStatusline(home, now, env.cwd) : [],
192
193
  ...checkInstalls(env),
@@ -920,6 +921,7 @@ var CREDENTIAL_CHECK_TIMEOUT_MS = 15e3;
920
921
  var LOGIN_FIX = `Run \`${cliInvocation()} login\` to sign in again.`;
921
922
  var CONNECT_FIX = `Run \`${cliInvocation()} connect\` to choose a factory for this repository.`;
922
923
  var SETUP_PANEL_FIX = "Link the repository on the factory's setup panel in the dashboard.";
924
+ var RUNNER_KEY_PATH = "/v1/runner/host-key";
923
925
  var MINT_KEY_FIX = "Mint a key for a factory that exists: dashboard \u2192 Settings \u2192 API keys.";
924
926
  async function askGateway(fetchImpl, url, path, credential, appId) {
925
927
  const headers = { authorization: `Bearer ${credential}` };
@@ -1019,7 +1021,7 @@ async function loginChecks(fetchImpl, url, token, appId, local, inRepository) {
1019
1021
  const fix = elsewhere === void 0 ? SETUP_PANEL_FIX : `Run \`${cliInvocation()} connect --factory ${factorySlug(elsewhere)}\` to use the factory this repository is linked to.`;
1020
1022
  return [login, factoryCheck, { name: "Repository", status: "warn", detail: `${shown} is not linked to ${factorySlug(factory)}`, fix }];
1021
1023
  }
1022
- async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1024
+ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local, runnerHost) {
1023
1025
  const name = "Factory key";
1024
1026
  if (appId === void 0) {
1025
1027
  return withSkippedRest(
@@ -1028,7 +1030,7 @@ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1028
1030
  );
1029
1031
  }
1030
1032
  const factoryPath = `/v1/apps/${encodeURIComponent(appId)}`;
1031
- const reply = await askGateway(fetchImpl, url, factoryPath, key, appId);
1033
+ const reply = await askGateway(fetchImpl, url, runnerHost ? RUNNER_KEY_PATH : factoryPath, key, appId);
1032
1034
  const unanswered = unansweredDetail(reply);
1033
1035
  if (unanswered !== void 0) {
1034
1036
  return withSkippedRest({ name, status: "warn", detail: unanswered, fix: NETWORK_FIX }, "the factory key check did not finish");
@@ -1051,10 +1053,11 @@ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1051
1053
  const accepted = { name, status: "pass", detail: `the gateway accepts the key from ${source}` };
1052
1054
  const shownAppId = sanitizeTerminal(appId);
1053
1055
  if (status === 403 && /missing required permission/i.test(message)) {
1054
- const permission = /'([^']+)'/.exec(message)?.[1] ?? "factory.read";
1056
+ const permission = /'([^']+)'/.exec(message)?.[1] ?? (runnerHost ? "work.claim" : "factory.read");
1057
+ const cannot = runnerHost ? `the key lacks a permission that a runner needs for the factory ${shownAppId}` : `the key cannot read the factory ${shownAppId}`;
1055
1058
  return [
1056
1059
  accepted,
1057
- { name: "Factory", status: "fail", detail: `the key cannot read the factory ${shownAppId}: ${message}`, fix: `Use a key that holds ${permission}.` },
1060
+ { name: "Factory", status: "fail", detail: `${cannot}: ${message}`, fix: `Use a key that holds ${permission}.` },
1058
1061
  skippedCheck("Repository", "the factory check failed")
1059
1062
  ];
1060
1063
  }
@@ -1082,6 +1085,10 @@ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1082
1085
  "the factory key check did not finish"
1083
1086
  );
1084
1087
  }
1088
+ if (runnerHost) {
1089
+ const factory2 = { name: "Factory", status: "pass", detail: `the factory ${shownAppId} accepts this runner key` };
1090
+ return withRepository(fetchImpl, url, key, appId, factoryPath, local, accepted, factory2);
1091
+ }
1085
1092
  const row = body?.data;
1086
1093
  if (typeof row?.id !== "string") {
1087
1094
  return withSkippedRest(
@@ -1091,6 +1098,9 @@ async function factoryKeyChecks(fetchImpl, url, key, appId, source, local) {
1091
1098
  }
1092
1099
  const label = [row.display_name, row.name].find((v) => typeof v === "string") ?? appId;
1093
1100
  const factory = { name: "Factory", status: "pass", detail: `${sanitizeTerminal(label)} (${shownAppId}) is readable with this key` };
1101
+ return withRepository(fetchImpl, url, key, appId, factoryPath, local, accepted, factory);
1102
+ }
1103
+ async function withRepository(fetchImpl, url, key, appId, factoryPath, local, accepted, factory) {
1094
1104
  if (local === void 0) return [accepted, factory, skippedCheck("Repository", "not inside a git repository with a remote")];
1095
1105
  const links = await askGateway(fetchImpl, url, `${factoryPath}/git/links`, key, appId);
1096
1106
  const shown = sanitizeTerminal(local);
@@ -1122,7 +1132,7 @@ async function credentialChecks(options = {}) {
1122
1132
  return loginChecks(fetchImpl, resolved.url, resolved.credential, resolved.appId, local, findGitDirs(cwd) !== void 0);
1123
1133
  }
1124
1134
  const source = env.OUTERLAYER_API_KEY ? "OUTERLAYER_API_KEY" : "~/.outerlayer/config.json";
1125
- return factoryKeyChecks(fetchImpl, resolved.url, resolved.credential, resolved.appId, source, local);
1135
+ return factoryKeyChecks(fetchImpl, resolved.url, resolved.credential, resolved.appId, source, local, options.runnerHost === true);
1126
1136
  }
1127
1137
  function governedDetail(source) {
1128
1138
  return `governed by ${sanitizeTerminal(source.repository)} (ref ${sanitizeTerminal(source.ref)}, stored commit ${sanitizeTerminal(source.sha.slice(0, 7))})`;
@@ -1182,8 +1192,16 @@ function doctorExitCode(checks) {
1182
1192
  async function gatherDoctorChecks() {
1183
1193
  const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-TNV5HHLO.js');
1184
1194
  const configPath = defaultRunnerConfigPath();
1185
- const checks = runDoctor({ runnerHost: hasRunnerBlock(configPath) });
1186
- const credential = await credentialChecks();
1195
+ const runnerHost = hasRunnerBlock(configPath);
1196
+ const hooks = (() => {
1197
+ try {
1198
+ return runnerHost ? loadRunnerConfig(configPath).hooks : void 0;
1199
+ } catch {
1200
+ return void 0;
1201
+ }
1202
+ })();
1203
+ const checks = runDoctor({ runnerHost, ...hooks === void 0 ? {} : { runnerHooks: hooks.provision } });
1204
+ const credential = await credentialChecks({ runnerHost });
1187
1205
  checks.push(...credential);
1188
1206
  if (credential[0]?.status === "pass") checks.push(...await githubAppChecks(), ...await governanceChecks());
1189
1207
  if (credential[0]?.status === "pass") checks.push(...await fleetCheck());
@@ -1193,14 +1211,7 @@ async function gatherDoctorChecks() {
1193
1211
  const { runnerVmCheck } = await import('./doctor-53F2PYY7.js');
1194
1212
  checks.push(runnerVmCheck(configPath, { lima: realLima(), home: homeFromEnv(), instance: runnerVm.instance }));
1195
1213
  } else if (hasRunnerBlock(configPath)) {
1196
- const { runnerHostChecks } = await import('./doctor-3SRHLRF5.js');
1197
- const hooks = (() => {
1198
- try {
1199
- return loadRunnerConfig(configPath).hooks;
1200
- } catch {
1201
- return void 0;
1202
- }
1203
- })();
1214
+ const { runnerHostChecks } = await import('./doctor-PKMAUDTU.js');
1204
1215
  const gateway = (() => {
1205
1216
  try {
1206
1217
  const { url, apiKey, appId } = loadRunnerConfig(configPath);
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-EPGMCEVP.js';
4
- import { MIN_ENGINE_MAJOR } from './chunk-4SJ57DH7.js';
3
+ import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-W3K6GBXY.js';
4
+ import { MIN_ENGINE_MAJOR } from './chunk-5Q4NDYQP.js';
5
5
  import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-AV5MJY45.js';
6
6
  import { runnerCredentialProblem } from './chunk-YYGXCRIW.js';
7
7
  import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-DWVAG73B.js';
@@ -1,17 +1,17 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-ILU6664L.js';
3
+ import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, MICROVM_COMMAND_DIR, commandLogOffset, startMicroVmCommand, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isContainerTracked, isMicroVmTracked, probeMicroVmCommand, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isTracked, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, microVmOomKills, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, serveLease, vmAlive, writeGuestGhConfig, ALREADY_RELEASED, inTeardown } from './chunk-6P2Z5AUY.js';
4
4
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
5
5
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-E7R2GIAW.js';
6
6
  import { RUNNER_PROTOCOL } from './chunk-TPKYTORP.js';
7
7
  import { writePendingUpdate } from './chunk-HWOU2HDH.js';
8
8
  import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
9
9
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-QBF462QH.js';
10
- import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-SVODOMYC.js';
10
+ import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-ERVZGWUR.js';
11
11
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
12
12
  import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, isInLayout, cleanVersions, stagingDir } from './chunk-6NFXOQKZ.js';
13
13
  import { RepoFilter } from './chunk-TBT347UY.js';
14
- import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandExec, setUpRunnerCgroup, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-4SJ57DH7.js';
14
+ import { leaseTimeLeftMs, createContainerRuntime, withTunnelLog, LEASE_SECONDS, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandExec, setUpRunnerCgroup, measureDisk, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied, gitRemoteFor, startServicesFor, createLeaseChannel } from './chunk-5Q4NDYQP.js';
15
15
  import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-JZJLKTZT.js';
16
16
  import { tagToPull, pullInstruction, imageTag, writeUpdateStatus } from './chunk-O47BTZSN.js';
17
17
  import { isVersion, compareVersions, satisfiesRange } from './chunk-TQMI335S.js';
@@ -2955,7 +2955,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2955
2955
  check: update.check ? () => update.check(configPath) : async () => {
2956
2956
  const held = heldClaudeCredential();
2957
2957
  const env = held === void 0 ? process.env : { ...process.env, [held.variable]: held.value };
2958
- return (await import('./check-F2TJCQ7S.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
2958
+ return (await import('./check-WJ4X2Q44.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl, env });
2959
2959
  },
2960
2960
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
2961
2961
  log
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { MIN_ENGINE_MAJOR } from './chunk-4SJ57DH7.js';
3
+ import { MIN_ENGINE_MAJOR } from './chunk-5Q4NDYQP.js';
4
4
  import { runnerImageVersion } from './chunk-O47BTZSN.js';
5
5
  import { firecrackerArch, MICROVM_ARCHES, guestAssetsPinned } from './chunk-SJZL5F3F.js';
6
6
  import { spawnSync } from 'child_process';
@@ -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-W7BH5YN6.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-FTNCNEWE.js';
4
4
  import './chunk-ITAIEJ2T.js';
5
5
  import './chunk-TOHKSZKI.js';
6
6
  import './chunk-KT4CN6OU.js';
@@ -3926,13 +3926,13 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3926
3926
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3927
3927
  `);
3928
3928
  }
3929
- const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-XSOVMNNE.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3929
+ const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-GJR37XGU.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3930
3930
  if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3931
3931
  else process.stdout.write(outcome.text + skillsLine + (shell?.text ?? ""));
3932
3932
  return;
3933
3933
  }
3934
3934
  await installMachineSkillsForSetup();
3935
- const { runInitCommand } = await import('./init-cmd-XSOVMNNE.js');
3935
+ const { runInitCommand } = await import('./init-cmd-GJR37XGU.js');
3936
3936
  const code = await runInitCommand(
3937
3937
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3938
3938
  {
@@ -4910,7 +4910,7 @@ function registerRunnerCommands(program2) {
4910
4910
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4911
4911
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4912
4912
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-TNV5HHLO.js');
4913
- const { start, RunnerStartError } = await import('./loop-QQBLJ7GN.js');
4913
+ const { start, RunnerStartError } = await import('./loop-DO46LFUH.js');
4914
4914
  const { RunnerAlreadyRunningError } = await import('./pidfile-3FT5OLUE.js');
4915
4915
  const configPath = opts.config ?? defaultRunnerConfigPath();
4916
4916
  try {
@@ -4929,8 +4929,8 @@ function registerRunnerCommands(program2) {
4929
4929
  "\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_RUNNER_NAME and one Claude credential\n(CLAUDE_CODE_OAUTH_TOKEN, ANTHROPIC_API_KEY or ANTHROPIC_AUTH_TOKEN) 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"
4930
4930
  ).action(async () => {
4931
4931
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-TNV5HHLO.js');
4932
- const { containerStart } = await import('./container-start-YG45GLFE.js');
4933
- const { start, RunnerStartError } = await import('./loop-QQBLJ7GN.js');
4932
+ const { containerStart } = await import('./container-start-3MXIUNE2.js');
4933
+ const { start, RunnerStartError } = await import('./loop-DO46LFUH.js');
4934
4934
  const { RunnerAlreadyRunningError } = await import('./pidfile-3FT5OLUE.js');
4935
4935
  try {
4936
4936
  const result = await containerStart({
@@ -4950,7 +4950,7 @@ function registerRunnerCommands(program2) {
4950
4950
  });
4951
4951
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4952
4952
  const { defaultRunnerConfigPath } = await import('./config-TNV5HHLO.js');
4953
- const { runRunnerCheck } = await import('./check-F2TJCQ7S.js');
4953
+ const { runRunnerCheck } = await import('./check-WJ4X2Q44.js');
4954
4954
  const configPath = opts.config ?? defaultRunnerConfigPath();
4955
4955
  const result = await runRunnerCheck(configPath);
4956
4956
  if (!result.ok) {
@@ -4984,7 +4984,7 @@ function registerRunnerCommands(program2) {
4984
4984
  }
4985
4985
  try {
4986
4986
  if (opts.service === true) {
4987
- const { installServiceCommand } = await import('./command-YXOMIXOJ.js');
4987
+ const { installServiceCommand } = await import('./command-NLWZT7KR.js');
4988
4988
  const result2 = await installServiceCommand({
4989
4989
  configPath,
4990
4990
  print: opts.print,
@@ -5040,7 +5040,7 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
5040
5040
  return;
5041
5041
  }
5042
5042
  const { defaultRunnerConfigPath } = await import('./config-TNV5HHLO.js');
5043
- const { uninstallServiceCommand } = await import('./command-YXOMIXOJ.js');
5043
+ const { uninstallServiceCommand } = await import('./command-NLWZT7KR.js');
5044
5044
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
5045
5045
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
5046
5046
  `);
@@ -5068,10 +5068,10 @@ already in claude.env is used.
5068
5068
  `
5069
5069
  ).action(async (opts) => {
5070
5070
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-TNV5HHLO.js');
5071
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-HQW3LHIF.js');
5072
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-SICUOQY5.js');
5073
- const { detectMachine } = await import('./machine-ATDPHWL5.js');
5074
- const { chooseVm, runVmInit, VmInitError } = await import('./init-XP55Q4ZT.js');
5071
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-Q6JV7IGF.js');
5072
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-UP5YBUHR.js');
5073
+ const { detectMachine } = await import('./machine-HZGUBOUH.js');
5074
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-HENNITCI.js');
5075
5075
  const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-2Z2DVSUJ.js');
5076
5076
  const configPath = opts.config ?? defaultRunnerConfigPath();
5077
5077
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
@@ -5222,7 +5222,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5222
5222
  let serviceUp = false;
5223
5223
  let restart;
5224
5224
  if (installedLayout) {
5225
- const { installServiceCommand } = await import('./command-YXOMIXOJ.js');
5225
+ const { installServiceCommand } = await import('./command-NLWZT7KR.js');
5226
5226
  const service = await installServiceCommand({
5227
5227
  configPath,
5228
5228
  entryPath: process.argv[1] ?? "",
@@ -5350,7 +5350,7 @@ Next:
5350
5350
  });
5351
5351
  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) => {
5352
5352
  const { defaultRunnerConfigPath } = await import('./config-TNV5HHLO.js');
5353
- const { requestStop } = await import('./loop-QQBLJ7GN.js');
5353
+ const { requestStop } = await import('./loop-DO46LFUH.js');
5354
5354
  const configPath = opts.config ?? defaultRunnerConfigPath();
5355
5355
  const { runnerImageVersion } = await import('./image-tag-TEOKZVD5.js');
5356
5356
  await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
@@ -5358,8 +5358,8 @@ Next:
5358
5358
  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) => {
5359
5359
  const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-TNV5HHLO.js');
5360
5360
  const { jobsDir, runnerDir } = await import('./paths-2VSGK6E2.js');
5361
- const { listJobFiles, runnerProcessState } = await import('./loop-QQBLJ7GN.js');
5362
- const { renderStatus } = await import('./status-AI22UPKC.js');
5361
+ const { listJobFiles, runnerProcessState } = await import('./loop-DO46LFUH.js');
5362
+ const { renderStatus } = await import('./status-2ICTDC2R.js');
5363
5363
  const { readHousekeepingRecord } = await import('./record-7SSRLSI2.js');
5364
5364
  const path2 = await import('path');
5365
5365
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5419,7 +5419,7 @@ Next:
5419
5419
  });
5420
5420
  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) => {
5421
5421
  const { defaultRunnerConfigPath } = await import('./config-TNV5HHLO.js');
5422
- const { listJobFiles } = await import('./loop-QQBLJ7GN.js');
5422
+ const { listJobFiles } = await import('./loop-DO46LFUH.js');
5423
5423
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-Z4L4I3OR.js');
5424
5424
  const configPath = opts.config ?? defaultRunnerConfigPath();
5425
5425
  const item = parseTrackerNumber(itemArg);
@@ -3,8 +3,8 @@ import { createRequire } from 'node:module';
3
3
  import { runRunnerInstall, launcherSummary, restartNote } from './chunk-EZ3DZXUH.js';
4
4
  import './chunk-DSKOHPXN.js';
5
5
  import { currentLink, execStartCommand } from './chunk-6NFXOQKZ.js';
6
- import { detectMachine } from './chunk-EPGMCEVP.js';
7
- import { helperSocketPath, ensureFirecrackerAndJailer } from './chunk-4SJ57DH7.js';
6
+ import { detectMachine } from './chunk-W3K6GBXY.js';
7
+ import { helperSocketPath, ensureFirecrackerAndJailer } from './chunk-5Q4NDYQP.js';
8
8
  import './chunk-WL3QF3QF.js';
9
9
  import './chunk-DIQN5SEL.js';
10
10
  import './chunk-JZJLKTZT.js';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { RunnerInitError, prepareRunnerInit, writeRunnerInit } from './chunk-T7LJ6AIC.js';
4
- import { detectMachine, supportsContainerBuilds, describeMachineDocker } from './chunk-EPGMCEVP.js';
5
- import { MIN_ENGINE_MAJOR } from './chunk-4SJ57DH7.js';
3
+ import { RunnerInitError, prepareRunnerInit, writeRunnerInit } from './chunk-KBB3CQTW.js';
4
+ import { detectMachine, supportsContainerBuilds, describeMachineDocker } from './chunk-W3K6GBXY.js';
5
+ import { MIN_ENGINE_MAJOR } from './chunk-5Q4NDYQP.js';
6
6
  import './chunk-WL3QF3QF.js';
7
7
  import './chunk-DIQN5SEL.js';
8
8
  import './chunk-JZJLKTZT.js';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { launcherCheck } from './chunk-DSKOHPXN.js';
4
- import { needsClaudeCredential, claudeCredentialCheck, missingPermissionOf, missingPermissionFix } from './chunk-SVODOMYC.js';
4
+ import { needsClaudeCredential, claudeCredentialCheck, missingPermissionOf, missingPermissionFix } from './chunk-ERVZGWUR.js';
5
5
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
6
6
  import './chunk-6NFXOQKZ.js';
7
7
  import { RepoFilter } from './chunk-TBT347UY.js';
8
- import './chunk-T7LJ6AIC.js';
9
- import { detectMachine, supportsContainerBuilds, describeMachineDocker, reachDockerStep, supportsMicroVmBuilds, microVmArchSupported, microVmAssetsPinned } from './chunk-EPGMCEVP.js';
10
- import { MIN_ENGINE_MAJOR, helperFirecrackerNote, probeHelper, helperSocketPath } from './chunk-4SJ57DH7.js';
8
+ import './chunk-KBB3CQTW.js';
9
+ import { detectMachine, supportsContainerBuilds, describeMachineDocker, reachDockerStep, supportsMicroVmBuilds, microVmArchSupported, microVmAssetsPinned } from './chunk-W3K6GBXY.js';
10
+ import { MIN_ENGINE_MAJOR, helperFirecrackerNote, probeHelper, helperSocketPath } from './chunk-5Q4NDYQP.js';
11
11
  import './chunk-WL3QF3QF.js';
12
12
  import './chunk-DIQN5SEL.js';
13
13
  import './chunk-JZJLKTZT.js';
package/dist/index.js CHANGED
@@ -26,5 +26,5 @@ if (argv[0] === "claude") {
26
26
  process.exit(await runClaudeLauncher(argv.slice(1)));
27
27
  }
28
28
  (await import('./hook-fast-UJPAWDAO.js')).recordLinkExitFailure(argv);
29
- var { runCli } = await import('./cli-5LLFR2SX.js');
29
+ var { runCli } = await import('./cli-X3JGBH2D.js');
30
30
  await runCli(process.argv);
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { npmSupportsProvenance } from './chunk-E7R2GIAW.js';
4
- import { RunnerInitError, readConfigObject } from './chunk-T7LJ6AIC.js';
5
- import './chunk-EPGMCEVP.js';
6
- import './chunk-4SJ57DH7.js';
4
+ import { RunnerInitError, readConfigObject } from './chunk-KBB3CQTW.js';
5
+ import './chunk-W3K6GBXY.js';
6
+ import './chunk-5Q4NDYQP.js';
7
7
  import './chunk-WL3QF3QF.js';
8
8
  import './chunk-DIQN5SEL.js';
9
9
  import './chunk-JZJLKTZT.js';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { PLACEHOLDER_MARKER, RunnerInitError, isPlaceholderCommand, prepareRunnerInit, readConfigObject, runRunnerInit, writeRunnerInit } from './chunk-T7LJ6AIC.js';
4
- import './chunk-EPGMCEVP.js';
5
- import './chunk-4SJ57DH7.js';
3
+ export { PLACEHOLDER_MARKER, RunnerInitError, isPlaceholderCommand, prepareRunnerInit, readConfigObject, runRunnerInit, writeRunnerInit } from './chunk-KBB3CQTW.js';
4
+ import './chunk-W3K6GBXY.js';
5
+ import './chunk-5Q4NDYQP.js';
6
6
  import './chunk-WL3QF3QF.js';
7
7
  import './chunk-DIQN5SEL.js';
8
8
  import './chunk-JZJLKTZT.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { summarizeChecks, summaryText, renderDoctorText } from './chunk-W7BH5YN6.js';
3
+ import { summarizeChecks, summaryText, renderDoctorText } from './chunk-FTNCNEWE.js';
4
4
  import './chunk-ITAIEJ2T.js';
5
5
  import { shellFunctionInstalled, removeShellFunction, installShellFunction, SHELL_FUNCTION_LINE } from './chunk-CJJDJ7AT.js';
6
6
  import './chunk-TOHKSZKI.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { RunnerStartError, leaseTimeLeftFor, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, runtimeOf, start, tick, watchTick } from './chunk-LRFU6RPD.js';
4
- import './chunk-ILU6664L.js';
3
+ export { RunnerStartError, leaseTimeLeftFor, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, runtimeOf, start, tick, watchTick } from './chunk-NVUO52YW.js';
4
+ import './chunk-6P2Z5AUY.js';
5
5
  import './chunk-3JVYMD4G.js';
6
6
  import './chunk-E7R2GIAW.js';
7
7
  import './chunk-TPKYTORP.js';
@@ -14,13 +14,13 @@ import './chunk-2BZTGJII.js';
14
14
  import './chunk-VM6BX2WJ.js';
15
15
  import './chunk-ESVW4MJY.js';
16
16
  import './chunk-RXFKXZJS.js';
17
- import './chunk-SVODOMYC.js';
17
+ import './chunk-ERVZGWUR.js';
18
18
  import './chunk-YYYRBYWG.js';
19
19
  import './chunk-6NFXOQKZ.js';
20
20
  import './chunk-TBT347UY.js';
21
- import './chunk-T7LJ6AIC.js';
22
- import './chunk-EPGMCEVP.js';
23
- import './chunk-4SJ57DH7.js';
21
+ import './chunk-KBB3CQTW.js';
22
+ import './chunk-W3K6GBXY.js';
23
+ import './chunk-5Q4NDYQP.js';
24
24
  import './chunk-WL3QF3QF.js';
25
25
  import './chunk-DIQN5SEL.js';
26
26
  import './chunk-JZJLKTZT.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { describeMachineDocker, detectMachine, microVmArchSupported, microVmAssetsPinned, reachDockerStep, supportsContainerBuilds, supportsMicroVmBuilds } from './chunk-EPGMCEVP.js';
4
- import './chunk-4SJ57DH7.js';
3
+ export { describeMachineDocker, detectMachine, microVmArchSupported, microVmAssetsPinned, reachDockerStep, supportsContainerBuilds, supportsMicroVmBuilds } from './chunk-W3K6GBXY.js';
4
+ import './chunk-5Q4NDYQP.js';
5
5
  import './chunk-WL3QF3QF.js';
6
6
  import './chunk-DIQN5SEL.js';
7
7
  import './chunk-JZJLKTZT.js';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { readConfigObject, RunnerInitError } from './chunk-T7LJ6AIC.js';
4
- import './chunk-EPGMCEVP.js';
5
- import './chunk-4SJ57DH7.js';
3
+ import { readConfigObject, RunnerInitError } from './chunk-KBB3CQTW.js';
4
+ import './chunk-W3K6GBXY.js';
5
+ import './chunk-5Q4NDYQP.js';
6
6
  import './chunk-WL3QF3QF.js';
7
7
  import './chunk-DIQN5SEL.js';
8
8
  import './chunk-JZJLKTZT.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { isReadable, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-ILU6664L.js';
3
+ import { isReadable, ALREADY_RELEASED, RENEW_INTERVAL_SECONDS } from './chunk-6P2Z5AUY.js';
4
4
  import { jobStateFormatOf } from './chunk-ZVB57WI6.js';
5
5
  import './chunk-OO6OADZN.js';
6
6
  import './chunk-YTR435DO.js';
@@ -10,7 +10,7 @@ import './chunk-ESVW4MJY.js';
10
10
  import './chunk-RXFKXZJS.js';
11
11
  import { formatBytes } from './chunk-YYYRBYWG.js';
12
12
  import './chunk-TBT347UY.js';
13
- import { LEASE_SECONDS } from './chunk-4SJ57DH7.js';
13
+ import { LEASE_SECONDS } from './chunk-5Q4NDYQP.js';
14
14
  import './chunk-WL3QF3QF.js';
15
15
  import './chunk-DIQN5SEL.js';
16
16
  import { formatDuration, formatClock, relativeToRunner } from './chunk-JZJLKTZT.js';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@outerlayer/cli",
3
- "version": "0.28.3",
3
+ "version": "0.28.4",
4
4
  "description": "OuterLayer CLI — commands: init, claude, connect, doctor, login, logout, sync, daemon (alias: watch), emit, work, spec, runner, hooks, mcp, context. Capture and sync coding-agent sessions, and record proof of factory work.",
5
5
  "license": "Apache-2.0",
6
6
  "author": "Magu Studios, Inc.",