@outerlayer/cli 0.26.1 → 0.26.3

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 (63) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/README.md +3 -1
  3. package/dist/{build-JK2DLT6X.js → build-EBQYXL7Y.js} +2 -2
  4. package/dist/build-info.json +1 -1
  5. package/dist/{builder-TMA25KRR.js → builder-WEGLC2F2.js} +2 -2
  6. package/dist/{check-3CBJVXZD.js → check-WJJ325EQ.js} +19 -19
  7. package/dist/{chunk-PNHNKMA3.js → chunk-2AKDF6C2.js} +2 -2
  8. package/dist/{chunk-DYEFPYME.js → chunk-2O5KA67H.js} +1 -1
  9. package/dist/{chunk-7NKVMAP6.js → chunk-364XDGOK.js} +2 -2
  10. package/dist/{chunk-AINUN2TT.js → chunk-7LVF4E5V.js} +1 -1
  11. package/dist/{chunk-QIIMZC7W.js → chunk-FO7F6QSV.js} +40 -3
  12. package/dist/{chunk-DXDF43YG.js → chunk-I7RZHMXW.js} +1 -1
  13. package/dist/{chunk-D7V33CAH.js → chunk-J7BXZLSO.js} +1 -1
  14. package/dist/{chunk-GQOT37HL.js → chunk-K7FCZCLQ.js} +5 -5
  15. package/dist/{chunk-2N72GPS2.js → chunk-MWPBF2XG.js} +1 -1
  16. package/dist/{chunk-HPOEVC2V.js → chunk-MXTN35XN.js} +3 -3
  17. package/dist/{chunk-GAWZ7ATV.js → chunk-SKZG7SAN.js} +61 -16
  18. package/dist/{chunk-4R24DSL2.js → chunk-TSW4DGV2.js} +5 -5
  19. package/dist/{chunk-XPKI5OMT.js → chunk-UKCNOAO6.js} +1 -1
  20. package/dist/{chunk-GNPTU4BM.js → chunk-URIZRCRY.js} +2 -1
  21. package/dist/{chunk-ILL2CWOU.js → chunk-VHVFU6QU.js} +16 -12
  22. package/dist/{chunk-JUTN2HUP.js → chunk-W7LGHNXT.js} +2 -2
  23. package/dist/{chunk-IIFMFX6J.js → chunk-XDHYZWEK.js} +2 -2
  24. package/dist/{chunk-TBJ7KO2A.js → chunk-XF77SNB4.js} +15 -10
  25. package/dist/{chunk-XGJUNNXL.js → chunk-XLC7KEUV.js} +3 -1
  26. package/dist/{chunk-7I6GZSN3.js → chunk-ZLEXMZFW.js} +1 -1
  27. package/dist/{chunk-BMWIUSTZ.js → chunk-ZPXI7LMG.js} +3 -3
  28. package/dist/{cli-7HVTFJZO.js → cli-2UUJM3AE.js} +63 -61
  29. package/dist/{command-2Q5UDZUO.js → command-GQBHC53U.js} +9 -9
  30. package/dist/{container-start-SCCR2PRD.js → container-start-AUJHF2BC.js} +10 -10
  31. package/dist/{docker-4X2A5HDY.js → docker-NYAIIX2F.js} +2 -2
  32. package/dist/{doctor-3QA5Y5HG.js → doctor-NV2PUERZ.js} +11 -11
  33. package/dist/{emit-artifact-cmd-SFUSDWZM.js → emit-artifact-cmd-XXTCHP6V.js} +4 -4
  34. package/dist/{emit-result-cmd-NEICBIDU.js → emit-result-cmd-HRTXGZLK.js} +4 -4
  35. package/dist/{exec-client-KH33DICR.js → exec-client-J6L5FDRR.js} +2 -2
  36. package/dist/{governing-source-J5DF65X5.js → governing-source-PTJ6EAA3.js} +2 -2
  37. package/dist/{guest-init-TOSKPGPF.js → guest-init-CXIHA5VI.js} +2 -2
  38. package/dist/hook-fast-SDFXJEAW.js +12 -0
  39. package/dist/{hook-wrap-fast-NOOGDNSW.js → hook-wrap-fast-7VYYAAH4.js} +2 -2
  40. package/dist/index.js +5 -5
  41. package/dist/{init-UMON3HZK.js → init-KIGYMLDM.js} +10 -10
  42. package/dist/{init-NEUTUGEQ.js → init-UZWRJMPZ.js} +10 -10
  43. package/dist/{init-cmd-54DMRBNO.js → init-cmd-SQKWPACS.js} +5 -5
  44. package/dist/{loop-6JKW5QR5.js → loop-OE32U2IZ.js} +19 -19
  45. package/dist/{machine-XF55O56X.js → machine-L7INJ4JN.js} +9 -9
  46. package/dist/{runner-identity-NH6RLVMI.js → runner-identity-YYENYKDH.js} +2 -2
  47. package/dist/{runner-key-FUNSJ564.js → runner-key-AZVXBQIB.js} +10 -10
  48. package/dist/{session-sender-P5GVOIUY.js → session-sender-VH2EKAT5.js} +5 -5
  49. package/dist/settings-3DBYKYQD.js +7 -0
  50. package/dist/{spec-cmd-HMFW552G.js → spec-cmd-BOUPLX7X.js} +1 -1
  51. package/dist/{status-ULZVKQ7G.js → status-3WC2IGVI.js} +15 -15
  52. package/dist/{statusline-fast-GVRSBHAF.js → statusline-fast-YVHG6ZLX.js} +2 -2
  53. package/dist/{sync-cmd-VCLCOME6.js → sync-cmd-GT2WTQRA.js} +4 -4
  54. package/dist/{watch-SVGL24OX.js → watch-JED7SYAA.js} +4 -4
  55. package/dist/{work-claim-cmd-WQF5RTCT.js → work-claim-cmd-MY4N74HA.js} +3 -3
  56. package/dist/{work-cmd-TGSNYPSG.js → work-cmd-UQ45HDM4.js} +1 -1
  57. package/dist/{work-comment-cmd-O3FVX6M4.js → work-comment-cmd-I7NNSNDP.js} +1 -1
  58. package/dist/{work-logs-cmd-2RMJFVNZ.js → work-logs-cmd-YIQJVENH.js} +1 -1
  59. package/dist/{work-open-pr-cmd-5EP7BKRE.js → work-open-pr-cmd-VP5NNTCW.js} +1 -1
  60. package/dist/{work-stop-cmd-TNJYBLMN.js → work-stop-cmd-GN2WX73C.js} +1 -1
  61. package/package.json +1 -1
  62. package/dist/hook-fast-REXH5P6R.js +0 -12
  63. package/dist/settings-AKYEOCC2.js +0 -7
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { LiveUploader } from './chunk-PNHNKMA3.js';
4
- import { spoolDir } from './chunk-QIIMZC7W.js';
3
+ import { LiveUploader } from './chunk-2AKDF6C2.js';
4
+ import { spoolDir } from './chunk-FO7F6QSV.js';
5
5
  import { CaptureDaemon } from './chunk-QE3UQAHK.js';
6
6
  import { parseWorkItemEnv } from './chunk-T2Q7ISPE.js';
7
7
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -1,25 +1,25 @@
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, microVmCommandLine, runCommand, commandLogOffset, execCommandLine, startSender, startHostServices, finishJob, isContainerTracked, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, ALREADY_RELEASED, inTeardown } from './chunk-GAWZ7ATV.js';
3
+ import { releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, commandLogOffset, execCommandLine, startSender, startHostServices, finishJob, isContainerTracked, probeCommand, appendCommandLog, judgeProbe, EXIT_CODE_FILE, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listUnreadableJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, listTrackedJobs, restartSender, ALREADY_RELEASED, inTeardown } from './chunk-SKZG7SAN.js';
4
4
  import { writePendingUpdate } from './chunk-TKL74NLB.js';
5
5
  import { JOB_STATE_FORMAT, readsJobState, jobStateFormatOf } from './chunk-ZVB57WI6.js';
6
6
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-6FAP657M.js';
7
7
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
8
8
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-YETTWTAY.js';
9
9
  import { RUNNER_PROTOCOL } from './chunk-TPKYTORP.js';
10
- import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-BMWIUSTZ.js';
10
+ import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-ZPXI7LMG.js';
11
11
  import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, isInLayout, cleanVersions, stagingDir } from './chunk-4IFKLYMM.js';
12
12
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
13
13
  import { RepoFilter } from './chunk-TBT347UY.js';
14
- import { LEASE_SECONDS, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandExec, measureDisk, setUpRunnerCgroup, createContainerRuntime, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied } from './chunk-ILL2CWOU.js';
14
+ import { leaseTimeLeftMs, LEASE_SECONDS, provisionContainer, leaseExpiresAtMs, deliverContainerHooks, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandExec, measureDisk, setUpRunnerCgroup, createContainerRuntime, parseCpuList, ensureTunnel, keepGhConfigCurrent, filesAreCopied } from './chunk-VHVFU6QU.js';
15
15
  import { tagToPull, pullInstruction, imageTag, writeUpdateStatus } from './chunk-665QWBNW.js';
16
16
  import { isVersion, compareVersions, satisfiesRange } from './chunk-TQMI335S.js';
17
17
  import { checkFit } from './chunk-MLD2NA7N.js';
18
18
  import { claimPidFile, readPidFile, releasePidFile } from './chunk-PYSKSROG.js';
19
19
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
20
- import { writeJobFile, ensureRunnerIdentity, readJobFile, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-7I6GZSN3.js';
21
- import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-D7V33CAH.js';
22
- import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-XPKI5OMT.js';
20
+ import { writeJobFile, ensureRunnerIdentity, readJobFile, builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, spawnRun, BUILD_LABEL, RUNNER_LABEL, readJobFileChecked } from './chunk-ZLEXMZFW.js';
21
+ import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-J7BXZLSO.js';
22
+ import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-UKCNOAO6.js';
23
23
  import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-JWRX5ZTT.js';
24
24
  import { exceedsDisk } from './chunk-7RQ73DLO.js';
25
25
  import { resolveVersion } from './chunk-RA3O54FC.js';
@@ -1057,6 +1057,9 @@ function attemptLogsOf(state) {
1057
1057
  function nowOf(state) {
1058
1058
  return (state.deps.now ?? (() => /* @__PURE__ */ new Date()))();
1059
1059
  }
1060
+ function leaseTimeLeftFor(state, active) {
1061
+ return () => (state.deps.leaseTimeLeftMs ?? leaseTimeLeftMs)(active.job, nowOf(state).getTime());
1062
+ }
1060
1063
  function runtimeOf(state) {
1061
1064
  state.containerRuntime ??= createContainerRuntime(state.deps.container);
1062
1065
  return state.containerRuntime;
@@ -1746,7 +1749,7 @@ var CLAIM_REFUSAL_CODES = new Set(
1746
1749
  "pull_request_from_fork pull_request_on_default_branch pull_request_ambiguous pull_request_repository_not_connected repository_not_reachable branch_claimed_elsewhere".split(" ")
1747
1750
  );
1748
1751
  async function tryClaimAndStart(state, item, queue) {
1749
- const { postJson: postJson2 } = await import('./work-cmd-TGSNYPSG.js');
1752
+ const { postJson: postJson2 } = await import('./work-cmd-UQ45HDM4.js');
1750
1753
  const log = logOf(state);
1751
1754
  const hostKey = await loadHostKey(state.config.configPath);
1752
1755
  const claim = await retrySend(
@@ -2030,7 +2033,8 @@ async function startJob(state, item, queue, claimId, itemKey, branch, identity,
2030
2033
  aborted: () => active.ending,
2031
2034
  deadlineMs: startedAt.getTime() + state.config.timeLimitMinutes * 6e4,
2032
2035
  fetchImpl: state.deps.fetchImpl,
2033
- now: state.deps.now
2036
+ now: state.deps.now,
2037
+ leaseTimeLeftMs: leaseTimeLeftFor(state, active)
2034
2038
  }).catch((err) => ({ ok: false, reason: `provision failed: ${describeCallFailure(err)}`, aborted: false }));
2035
2039
  const provisionTook = formatDuration(nowOf(state).getTime() - provisionStartedMs);
2036
2040
  if (active.ending) return;
@@ -2430,6 +2434,7 @@ async function renewLeaseIfDue(state, active, nowMs) {
2430
2434
  writeJobFile(join(active.dirPath, "job.json"), active.job);
2431
2435
  log.line(`${tag} lease renewed \xB7 expires ${formatClock(new Date(nowMs + LEASE_SECONDS * 1e3), new Date(nowMs))}`);
2432
2436
  if (active.job.container !== void 0) state.containerRuntime?.leases.get(active.job.container.buildId)?.publish();
2437
+ if (active.job.microvm !== void 0) state.containerRuntime?.leases.get(active.job.microvm.buildId)?.publish();
2433
2438
  } else {
2434
2439
  log.error(`${tag} renew did not land \xB7 retrying in ${RENEW_INTERVAL_SECONDS / 60}m`);
2435
2440
  }
@@ -2730,7 +2735,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2730
2735
  const outcome = await onStartUnderMarker({
2731
2736
  configPath,
2732
2737
  own: ownVersionOf(deps),
2733
- check: update.check ? () => update.check(configPath) : async () => (await import('./check-3CBJVXZD.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
2738
+ check: update.check ? () => update.check(configPath) : async () => (await import('./check-WJJ325EQ.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
2734
2739
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
2735
2740
  log
2736
2741
  });
@@ -3015,4 +3020,4 @@ function runnerProcessState(configPath) {
3015
3020
  return isSameProcess(entry.pid, entry.start) ? { state: "running", pid: entry.pid } : { state: "stale", pid: entry.pid };
3016
3021
  }
3017
3022
 
3018
- export { RunnerStartError, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick };
3023
+ export { RunnerStartError, leaseTimeLeftFor, listJobFiles, logUnusableHelper, probeBuild, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick };
@@ -6,8 +6,10 @@ import { join } from 'path';
6
6
 
7
7
  createRequire(import.meta.url);
8
8
  var EXEC_PORT = 1024;
9
+ var LEASE_PORT = 3125;
9
10
  var GUEST_CID = 3;
10
11
  var MAX_SOCKET_PATH = 107;
12
+ var LEASE_LINK = { port: LEASE_PORT, socket: "lease.sock" };
11
13
  function vsockLinks(input) {
12
14
  return [
13
15
  { port: RELAY_PORT, socket: "tunnel.sock" },
@@ -39,4 +41,4 @@ function socketPathProblem(buildDir) {
39
41
  return `the build directory ${buildDir} is too deep for the microVM's sockets: a socket path holds at most ${MAX_SOCKET_PATH} bytes and the longest here is ${longest}; move the runner's config file closer to the root`;
40
42
  }
41
43
 
42
- export { EXEC_PORT, GUEST_CID, linkVsockSockets, socketPathProblem, vsockLinks };
44
+ export { EXEC_PORT, GUEST_CID, LEASE_LINK, linkVsockSockets, socketPathProblem, vsockLinks };
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { RecipeError, BUILDKIT_IMAGE } from './chunk-4R24DSL2.js';
3
+ import { RecipeError, BUILDKIT_IMAGE } from './chunk-TSW4DGV2.js';
4
4
  import { parseSize } from './chunk-7RQ73DLO.js';
5
5
  import { compareVersions } from './chunk-QE3UQAHK.js';
6
6
  import { ensureHostKey } from './chunk-F6DIHHBS.js';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { isPlaceholderCommand } from './chunk-JUTN2HUP.js';
4
- import { describeCallFailure } from './chunk-D7V33CAH.js';
5
- import { WorkCommandError, getJson } from './chunk-XPKI5OMT.js';
3
+ import { isPlaceholderCommand } from './chunk-W7LGHNXT.js';
4
+ import { describeCallFailure } from './chunk-J7BXZLSO.js';
5
+ import { WorkCommandError, getJson } from './chunk-UKCNOAO6.js';
6
6
  import { sanitizeTerminal } from './chunk-BUP5N3X6.js';
7
7
  import { builtinKind } from './chunk-JWRX5ZTT.js';
8
8
  import { signerFor } from './chunk-F6DIHHBS.js';
@@ -1,9 +1,9 @@
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-GQOT37HL.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-K7FCZCLQ.js';
4
4
  import './chunk-XFGL53GU.js';
5
5
  import './chunk-VJBFQP3H.js';
6
- import { verifiedTrackerNames, TRACKERS } from './chunk-XPKI5OMT.js';
6
+ import { verifiedTrackerNames, TRACKERS } from './chunk-UKCNOAO6.js';
7
7
  import './chunk-HXFRJKMU.js';
8
8
  import './chunk-TEVO3RUV.js';
9
9
  import './chunk-BUP5N3X6.js';
@@ -11,9 +11,9 @@ import './chunk-XSPA5ODY.js';
11
11
  import './chunk-GOSFARMS.js';
12
12
  import './chunk-MQ743JX3.js';
13
13
  import './chunk-QRZLUUNN.js';
14
- import { hookFiredMarkerPath, installedCliDistDir } from './chunk-QIIMZC7W.js';
14
+ import { hookFiredMarkerPath, installedCliDistDir } from './chunk-FO7F6QSV.js';
15
15
  import './chunk-ZJSNLVCE.js';
16
- import './chunk-DXDF43YG.js';
16
+ import './chunk-I7RZHMXW.js';
17
17
  import './chunk-BKO6JEZI.js';
18
18
  import './chunk-HCVLP7XA.js';
19
19
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
@@ -25,7 +25,7 @@ import { FIRST_VERSION_READING_AGENTS_SKILLS } from './chunk-JKNYTNYD.js';
25
25
  import './chunk-HBISTTG3.js';
26
26
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
27
27
  import { cliInvocation, packageRunnerOf } from './chunk-CRB3POP4.js';
28
- import { settingsPath, readSettings, SettingsParseError, listHookCandidates, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, cliCommand, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-GNPTU4BM.js';
28
+ import { settingsPath, readSettings, SettingsParseError, listHookCandidates, PORTABLE_BIN, wrapHooks, writeSettings, unwrapHooks, REGISTERED_EVENTS, removeHooks, removeStatusline, cliBinResolvable, mergeHooks, repointWrappedHooks, AUTO_WRAP_EVENTS, mergeStatusline } from './chunk-URIZRCRY.js';
29
29
  import './chunk-VWFOKRYS.js';
30
30
  import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
31
31
  import { removeJournalHooks, removePreCommitGuardHook } from './chunk-TUSYOL2O.js';
@@ -3597,10 +3597,10 @@ function ensureGitignore(cwd) {
3597
3597
  `);
3598
3598
  return true;
3599
3599
  }
3600
- function orgRolloutSnippet(cliBin) {
3600
+ function orgRolloutSnippet() {
3601
3601
  const hooks = {};
3602
3602
  for (const event of REGISTERED_EVENTS) {
3603
- hooks[event] = [{ hooks: [{ type: "command", command: `${cliCommand(cliBin)} hook ${event}` }] }];
3603
+ hooks[event] = [{ hooks: [{ type: "command", command: `${PORTABLE_BIN} hook ${event}` }] }];
3604
3604
  }
3605
3605
  const managed = JSON.stringify({ hooks }, null, 2);
3606
3606
  return [
@@ -3612,11 +3612,13 @@ function orgRolloutSnippet(cliBin) {
3612
3612
  " macOS (MDM): /Library/Application Support/ClaudeCode/managed-settings.json",
3613
3613
  " (domain com.anthropic.claudecode)",
3614
3614
  " Linux: /etc/claude-code/managed-settings.json",
3615
- " Windows (GPO): HKLM\\SOFTWARE\\Policies\\ClaudeCode",
3615
+ " Windows (GPO): HKLM\\SOFTWARE\\Policies\\ClaudeCode, as a REG_SZ value named Settings",
3616
3616
  "",
3617
3617
  "managed-settings.json:",
3618
3618
  managed,
3619
3619
  "",
3620
+ "The hooks run `outerlayer` from the PATH, so install the CLI on every machine first:",
3621
+ " npm install -g @outerlayer/cli",
3620
3622
  `Each developer still runs \`${cliInvocation()} login\` once to attribute sessions.`
3621
3623
  ].join("\n");
3622
3624
  }
@@ -3750,7 +3752,7 @@ async function installHooks(opts, resolvedBin, connected, starterTemplate, withN
3750
3752
  const scope = opts.project ? "project" : "user";
3751
3753
  let cliBin;
3752
3754
  try {
3753
- cliBin = initHookBin({ home: homeFromEnv(), runningBin: resolvedBin, remove: opts.remove === true });
3755
+ cliBin = scope === "project" ? PORTABLE_BIN : initHookBin({ home: homeFromEnv(), runningBin: resolvedBin, remove: opts.remove === true });
3754
3756
  } catch (err) {
3755
3757
  const text = `could not copy the CLI to ~/.outerlayer/cli: ${err instanceof Error ? err.message : String(err)}
3756
3758
  Hooks were not changed. Fix the permissions on ~/.outerlayer, then re-run ${C.yellow}${cliInvocation()} init${C.reset}.`;
@@ -3883,7 +3885,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3883
3885
  }
3884
3886
  const cliBin = resolveCliBin();
3885
3887
  if (opts.org) {
3886
- process.stdout.write(orgRolloutSnippet(cliBin) + "\n");
3888
+ process.stdout.write(orgRolloutSnippet() + "\n");
3887
3889
  return;
3888
3890
  }
3889
3891
  if (opts.remove || opts.local) {
@@ -3898,12 +3900,12 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3898
3900
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3899
3901
  `);
3900
3902
  }
3901
- const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-54DMRBNO.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3903
+ const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-SQKWPACS.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3902
3904
  if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3903
3905
  else process.stdout.write(outcome.text + (shell?.text ?? ""));
3904
3906
  return;
3905
3907
  }
3906
- const { runInitCommand } = await import('./init-cmd-54DMRBNO.js');
3908
+ const { runInitCommand } = await import('./init-cmd-SQKWPACS.js');
3907
3909
  const code = await runInitCommand(
3908
3910
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3909
3911
  {
@@ -4041,7 +4043,7 @@ code is 1: revoke the token on /profile/security.
4041
4043
  else fail(found.reason);
4042
4044
  return;
4043
4045
  }
4044
- const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-VCLCOME6.js');
4046
+ const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-GT2WTQRA.js');
4045
4047
  try {
4046
4048
  const result = await runSync({
4047
4049
  url: opts.url,
@@ -4072,7 +4074,7 @@ code is 1: revoke the token on /profile/security.
4072
4074
  if (invokedCommandToken(argv) === "watch") {
4073
4075
  warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
4074
4076
  }
4075
- const { runWatch } = await import('./watch-SVGL24OX.js');
4077
+ const { runWatch } = await import('./watch-JED7SYAA.js');
4076
4078
  await runWatch({ once: opts.once });
4077
4079
  });
4078
4080
  program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
@@ -4133,7 +4135,7 @@ code is 1: revoke the token on /profile/security.
4133
4135
  }
4134
4136
  });
4135
4137
  program2.command("vm-exec", { hidden: true }).description("run a command in a microVM build's guest through its exec agent").requiredOption("--socket <path>", "the Unix socket Firecracker serves the build's vsock device on").option("--user <user>", "the user to run as", "").option("--cwd <dir>", "the working directory", "/").option("--env <NAME=value>", "an environment value the command line carries; repeatable", (value, previous) => [...previous, value], []).option("--pass <NAME>", "an environment variable whose value is read from this process; repeatable", (value, previous) => [...previous, value], []).argument("<argv...>", "the command and its arguments").action(async (argv2, opts) => {
4136
- const { runVmExec } = await import('./exec-client-KH33DICR.js');
4138
+ const { runVmExec } = await import('./exec-client-J6L5FDRR.js');
4137
4139
  const env = {};
4138
4140
  for (const entry of opts.env) {
4139
4141
  const eq = entry.indexOf("=");
@@ -4162,7 +4164,7 @@ code is 1: revoke the token on /profile/security.
4162
4164
  process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
4163
4165
  });
4164
4166
  program2.command("session-sender", { hidden: true }).description("stream a runner build's sessions to its work item while the build runs").action(async () => {
4165
- const { runSessionSender } = await import('./session-sender-P5GVOIUY.js');
4167
+ const { runSessionSender } = await import('./session-sender-VH2EKAT5.js');
4166
4168
  try {
4167
4169
  await runSessionSender();
4168
4170
  } catch (err) {
@@ -4170,7 +4172,7 @@ code is 1: revoke the token on /profile/security.
4170
4172
  }
4171
4173
  });
4172
4174
  program2.command("vm-init", { hidden: true }).description("lay out a microVM build's guest; the guest helper runs it").action(async () => {
4173
- const { realGuestHost, runGuestInit } = await import('./guest-init-TOSKPGPF.js');
4175
+ const { realGuestHost, runGuestInit } = await import('./guest-init-CXIHA5VI.js');
4174
4176
  const { readFileSync: readFileSync3 } = await import('fs');
4175
4177
  try {
4176
4178
  runGuestInit(realGuestHost(), readFileSync3("/proc/cmdline", "utf8"));
@@ -4252,7 +4254,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
4252
4254
  await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
4253
4255
  return;
4254
4256
  }
4255
- const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-NEICBIDU.js');
4257
+ const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-HRTXGZLK.js');
4256
4258
  try {
4257
4259
  const result = await runEmitResult({
4258
4260
  name,
@@ -4302,7 +4304,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
4302
4304
  locally so it never uploads. One correction can retire several duplicates.
4303
4305
  `
4304
4306
  ).action(async (file, opts) => {
4305
- const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-SFUSDWZM.js');
4307
+ const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-XXTCHP6V.js');
4306
4308
  let pr;
4307
4309
  if (opts.pr !== void 0) {
4308
4310
  pr = parseTrackerNumber(opts.pr);
@@ -4530,9 +4532,9 @@ function registerSpecCommands(program2) {
4530
4532
  const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
4531
4533
  const credentialOptions = (command) => command.option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)");
4532
4534
  const run = async (action) => {
4533
- const { WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4535
+ const { WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4534
4536
  try {
4535
- await action(await import('./spec-cmd-HMFW552G.js'));
4537
+ await action(await import('./spec-cmd-BOUPLX7X.js'));
4536
4538
  } catch (err) {
4537
4539
  if (err instanceof WorkCommandError) {
4538
4540
  fail(err.message);
@@ -4574,7 +4576,7 @@ takes it, and prints the line that starts your session on it. That
4574
4576
  session links itself and holds the item's lease while it works.
4575
4577
  `
4576
4578
  ).action(async (opts) => {
4577
- const { runWorkBuild, WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4579
+ const { runWorkBuild, WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4578
4580
  try {
4579
4581
  await runWorkBuild(opts);
4580
4582
  } catch (err) {
@@ -4597,7 +4599,7 @@ renews that session's own 20-minute lease, unless --no-lease or
4597
4599
  --ended is given, or another worker already holds a live one.
4598
4600
  `
4599
4601
  ).action(async (number, opts) => {
4600
- const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4602
+ const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4601
4603
  try {
4602
4604
  await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
4603
4605
  } catch (err) {
@@ -4621,8 +4623,8 @@ criterion's new proof; --ready hands the thread back to a person. At
4621
4623
  most one action flag may be given.
4622
4624
  `
4623
4625
  ).action(async (opts) => {
4624
- const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-O3FVX6M4.js');
4625
- const { WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4626
+ const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-I7NNSNDP.js');
4627
+ const { WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4626
4628
  try {
4627
4629
  await runWorkComment(opts);
4628
4630
  } catch (err) {
@@ -4643,8 +4645,8 @@ criterion that carries proof or a comment, each with who is waiting
4643
4645
  on whom next.
4644
4646
  `
4645
4647
  ).action(async (opts) => {
4646
- const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-O3FVX6M4.js');
4647
- const { WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4648
+ const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-I7NNSNDP.js');
4649
+ const { WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4648
4650
  try {
4649
4651
  await runWorkThreads(opts);
4650
4652
  } catch (err) {
@@ -4668,8 +4670,8 @@ still running, or that an older runner released, has no log and the
4668
4670
  command exits 1.
4669
4671
  `
4670
4672
  ).action(async (opts) => {
4671
- const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-2RMJFVNZ.js');
4672
- const { WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4673
+ const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-YIQJVENH.js');
4674
+ const { WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4673
4675
  try {
4674
4676
  await runWorkLogs(opts);
4675
4677
  } catch (err) {
@@ -4692,8 +4694,8 @@ item is not built again until a new build request. Exits 1 when no host
4692
4694
  build is running for the item.
4693
4695
  `
4694
4696
  ).action(async (opts) => {
4695
- const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-TNJYBLMN.js');
4696
- const { WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4697
+ const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-GN2WX73C.js');
4698
+ const { WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4697
4699
  try {
4698
4700
  await runWorkStop(opts);
4699
4701
  } catch (err) {
@@ -4714,7 +4716,7 @@ deletes anything \u2014 the item is removed from Work only once no
4714
4716
  live addition remains on it.
4715
4717
  `
4716
4718
  ).action(async (opts) => {
4717
- const { runWorkRemove, WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4719
+ const { runWorkRemove, WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4718
4720
  try {
4719
4721
  await runWorkRemove(opts);
4720
4722
  } catch (err) {
@@ -4726,7 +4728,7 @@ live addition remains on it.
4726
4728
  }
4727
4729
  });
4728
4730
  workCmd.command("status").description("Show one item's stage, gate ledger, and additions").option("--item <number>", "the item's number inside this factory").option("--issue <number>", "issue number, or a Linear/Jira key like ENG-123").option(TRACKER_OPTION_FLAG, "tracker for a keyed --issue, when both hold the key").option("--repo <owner/name>", "repository for an issue number (default: the checkout's remote)").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
4729
- const { runWorkStatus, WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4731
+ const { runWorkStatus, WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4730
4732
  try {
4731
4733
  await runWorkStatus(opts);
4732
4734
  } catch (err) {
@@ -4738,7 +4740,7 @@ live addition remains on it.
4738
4740
  }
4739
4741
  });
4740
4742
  workCmd.command("list").description("List live work items for this factory").option("--stage <spec|build|review>", "filter by stage").option("--section <attention|waiting|flowing>", "filter by Queue section").option("--repo <owner/name>", "repository (default: the current checkout's remote)").option("--unclaimed", "only items with no live lease").option("--claimed", "only items with a live lease, held by a host or a local session").option("--startable", "only items a host can start: a build request, no open PR, no live lease").option("--needs <amend>", "only items with a thread waiting on an agent").option("--json", "machine-readable JSON output").option("--url <url>", "cloud base URL (or OUTERLAYER_URL / config)").addOption(apiKeyOption()).option("--app-id <id>", "factory id the key is bound to (or OUTERLAYER_APP_ID / config)").action(async (opts) => {
4741
- const { runWorkList, WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4743
+ const { runWorkList, WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4742
4744
  try {
4743
4745
  await runWorkList(opts);
4744
4746
  } catch (err) {
@@ -4759,7 +4761,7 @@ by a different key is refused; claiming again with the same key extends
4759
4761
  it. --host is a label only.
4760
4762
  `
4761
4763
  ).action(async (opts) => {
4762
- const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-WQF5RTCT.js');
4764
+ const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-MY4N74HA.js');
4763
4765
  try {
4764
4766
  await runWorkClaim(opts);
4765
4767
  } catch (err) {
@@ -4779,7 +4781,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
4779
4781
  lease has expired, or a 403 if a different key holds it.
4780
4782
  `
4781
4783
  ).action(async (opts) => {
4782
- const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-WQF5RTCT.js');
4784
+ const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-MY4N74HA.js');
4783
4785
  try {
4784
4786
  await runWorkRenew(opts);
4785
4787
  } catch (err) {
@@ -4811,7 +4813,7 @@ applies to a host's lease only. A later tool call in the session
4811
4813
  takes the lease again.
4812
4814
  `
4813
4815
  ).action(async (opts) => {
4814
- const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-WQF5RTCT.js');
4816
+ const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-MY4N74HA.js');
4815
4817
  try {
4816
4818
  await runWorkRelease(opts);
4817
4819
  } catch (err) {
@@ -4863,8 +4865,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
4863
4865
  Run it again after a change to the title or description.
4864
4866
  `
4865
4867
  ).action(async (opts) => {
4866
- const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-5EP7BKRE.js');
4867
- const { WorkCommandError } = await import('./work-cmd-TGSNYPSG.js');
4868
+ const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-VP5NNTCW.js');
4869
+ const { WorkCommandError } = await import('./work-cmd-UQ45HDM4.js');
4868
4870
  try {
4869
4871
  await runWorkOpenPr(opts);
4870
4872
  } catch (err) {
@@ -4881,7 +4883,7 @@ function registerRunnerCommands(program2) {
4881
4883
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4882
4884
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4883
4885
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
4884
- const { start, RunnerStartError } = await import('./loop-6JKW5QR5.js');
4886
+ const { start, RunnerStartError } = await import('./loop-OE32U2IZ.js');
4885
4887
  const { RunnerAlreadyRunningError } = await import('./pidfile-BY5Z6YH7.js');
4886
4888
  const configPath = opts.config ?? defaultRunnerConfigPath();
4887
4889
  try {
@@ -4900,8 +4902,8 @@ function registerRunnerCommands(program2) {
4900
4902
  "\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"
4901
4903
  ).action(async () => {
4902
4904
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
4903
- const { containerStart } = await import('./container-start-SCCR2PRD.js');
4904
- const { start, RunnerStartError } = await import('./loop-6JKW5QR5.js');
4905
+ const { containerStart } = await import('./container-start-AUJHF2BC.js');
4906
+ const { start, RunnerStartError } = await import('./loop-OE32U2IZ.js');
4905
4907
  const { RunnerAlreadyRunningError } = await import('./pidfile-BY5Z6YH7.js');
4906
4908
  try {
4907
4909
  const result = await containerStart({
@@ -4921,7 +4923,7 @@ function registerRunnerCommands(program2) {
4921
4923
  });
4922
4924
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4923
4925
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
4924
- const { runRunnerCheck } = await import('./check-3CBJVXZD.js');
4926
+ const { runRunnerCheck } = await import('./check-WJJ325EQ.js');
4925
4927
  const configPath = opts.config ?? defaultRunnerConfigPath();
4926
4928
  const result = await runRunnerCheck(configPath);
4927
4929
  if (!result.ok) {
@@ -4955,7 +4957,7 @@ function registerRunnerCommands(program2) {
4955
4957
  }
4956
4958
  try {
4957
4959
  if (opts.service === true) {
4958
- const { installServiceCommand } = await import('./command-2Q5UDZUO.js');
4960
+ const { installServiceCommand } = await import('./command-GQBHC53U.js');
4959
4961
  const result2 = await installServiceCommand({
4960
4962
  configPath,
4961
4963
  print: opts.print,
@@ -5011,7 +5013,7 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
5011
5013
  return;
5012
5014
  }
5013
5015
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5014
- const { uninstallServiceCommand } = await import('./command-2Q5UDZUO.js');
5016
+ const { uninstallServiceCommand } = await import('./command-GQBHC53U.js');
5015
5017
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
5016
5018
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
5017
5019
  `);
@@ -5039,10 +5041,10 @@ already in runner.env is used.
5039
5041
  `
5040
5042
  ).action(async (opts) => {
5041
5043
  const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
5042
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-UMON3HZK.js');
5043
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-FUNSJ564.js');
5044
- const { detectMachine } = await import('./machine-XF55O56X.js');
5045
- const { chooseVm, runVmInit, VmInitError } = await import('./init-NEUTUGEQ.js');
5044
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-KIGYMLDM.js');
5045
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-AZVXBQIB.js');
5046
+ const { detectMachine } = await import('./machine-L7INJ4JN.js');
5047
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-UZWRJMPZ.js');
5046
5048
  const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-2D7MPOIJ.js');
5047
5049
  const configPath = opts.config ?? defaultRunnerConfigPath();
5048
5050
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
@@ -5193,7 +5195,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5193
5195
  let serviceUp = false;
5194
5196
  let restart;
5195
5197
  if (installedLayout) {
5196
- const { installServiceCommand } = await import('./command-2Q5UDZUO.js');
5198
+ const { installServiceCommand } = await import('./command-GQBHC53U.js');
5197
5199
  const service = await installServiceCommand({
5198
5200
  configPath,
5199
5201
  entryPath: process.argv[1] ?? "",
@@ -5238,10 +5240,10 @@ Next:
5238
5240
  "\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"
5239
5241
  ).action(async (opts) => {
5240
5242
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5241
- const { buildRepositoryImage, RecipeError } = await import('./build-JK2DLT6X.js');
5243
+ const { buildRepositoryImage, RecipeError } = await import('./build-EBQYXL7Y.js');
5242
5244
  const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
5243
- const { createDockerHost } = await import('./docker-4X2A5HDY.js');
5244
- const { builderSpec } = await import('./builder-TMA25KRR.js');
5245
+ const { createDockerHost } = await import('./docker-NYAIIX2F.js');
5246
+ const { builderSpec } = await import('./builder-WEGLC2F2.js');
5245
5247
  const { loadRunnerConfig } = await import('./config-JJ3EO7SB.js');
5246
5248
  const configPath = opts.config ?? defaultRunnerConfigPath();
5247
5249
  const loaded = (() => {
@@ -5253,11 +5255,11 @@ Next:
5253
5255
  })();
5254
5256
  const memory = loaded?.build?.memory ?? "8g";
5255
5257
  try {
5256
- const { ensureRunnerIdentity } = await import('./runner-identity-NH6RLVMI.js');
5258
+ const { ensureRunnerIdentity } = await import('./runner-identity-YYENYKDH.js');
5257
5259
  await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
5258
5260
  console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
5259
5261
  });
5260
- const { imageTargetFor } = await import('./governing-source-J5DF65X5.js');
5262
+ const { imageTargetFor } = await import('./governing-source-PTJ6EAA3.js');
5261
5263
  const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
5262
5264
  if (!target.ok) {
5263
5265
  if (opts.json) {
@@ -5321,7 +5323,7 @@ Next:
5321
5323
  });
5322
5324
  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) => {
5323
5325
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5324
- const { requestStop } = await import('./loop-6JKW5QR5.js');
5326
+ const { requestStop } = await import('./loop-OE32U2IZ.js');
5325
5327
  const configPath = opts.config ?? defaultRunnerConfigPath();
5326
5328
  const { runnerImageVersion } = await import('./image-tag-5SJ6ZKT7.js');
5327
5329
  await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
@@ -5329,8 +5331,8 @@ Next:
5329
5331
  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) => {
5330
5332
  const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-JJ3EO7SB.js');
5331
5333
  const { jobsDir, runnerDir } = await import('./paths-ZC6BMWMT.js');
5332
- const { listJobFiles, runnerProcessState } = await import('./loop-6JKW5QR5.js');
5333
- const { renderStatus } = await import('./status-ULZVKQ7G.js');
5334
+ const { listJobFiles, runnerProcessState } = await import('./loop-OE32U2IZ.js');
5335
+ const { renderStatus } = await import('./status-3WC2IGVI.js');
5334
5336
  const { readHousekeepingRecord } = await import('./record-K23IN6QN.js');
5335
5337
  const path2 = await import('path');
5336
5338
  const configPath = opts.config ?? defaultRunnerConfigPath();
@@ -5390,7 +5392,7 @@ Next:
5390
5392
  });
5391
5393
  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) => {
5392
5394
  const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5393
- const { listJobFiles } = await import('./loop-6JKW5QR5.js');
5395
+ const { listJobFiles } = await import('./loop-OE32U2IZ.js');
5394
5396
  const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-VN2HKDSH.js');
5395
5397
  const configPath = opts.config ?? defaultRunnerConfigPath();
5396
5398
  const item = parseTrackerNumber(itemArg);
@@ -5483,14 +5485,14 @@ ${C.dim}${file.path}${C.reset}
5483
5485
  fail("--no-input forbids prompting; pass --all to wrap every candidate without being asked.");
5484
5486
  return;
5485
5487
  }
5488
+ const scope = opts.project ? "project" : "user";
5486
5489
  let cliBin;
5487
5490
  try {
5488
- cliBin = initHookBin({ home: homeFromEnv(), runningBin: resolveCliBin(), remove: false });
5491
+ cliBin = scope === "project" ? PORTABLE_BIN : initHookBin({ home: homeFromEnv(), runningBin: resolveCliBin(), remove: false });
5489
5492
  } catch (err) {
5490
5493
  fail(`could not copy the CLI to ~/.outerlayer/cli: ${err instanceof Error ? err.message : String(err)}`);
5491
5494
  return;
5492
5495
  }
5493
- const scope = opts.project ? "project" : "user";
5494
5496
  const path2 = settingsPath(scope);
5495
5497
  let settings;
5496
5498
  try {
@@ -3,21 +3,21 @@ import { createRequire } from 'node:module';
3
3
  import { runRunnerInstall, launcherSummary, restartNote } from './chunk-JF572PM5.js';
4
4
  import './chunk-KDDFI5MR.js';
5
5
  import { currentLink, execStartCommand } from './chunk-4IFKLYMM.js';
6
- import { detectMachine } from './chunk-7NKVMAP6.js';
7
- import { helperSocketPath, ensureFirecrackerAndJailer } from './chunk-ILL2CWOU.js';
6
+ import { detectMachine } from './chunk-364XDGOK.js';
7
+ import { helperSocketPath, ensureFirecrackerAndJailer } from './chunk-VHVFU6QU.js';
8
8
  import './chunk-665QWBNW.js';
9
9
  import './chunk-TQMI335S.js';
10
10
  import { DEFAULT_UNIT_NAME, installService, uninstallService, realTaskScheduler, UNIT_MARKER } from './chunk-MLD2NA7N.js';
11
- import './chunk-AINUN2TT.js';
11
+ import './chunk-7LVF4E5V.js';
12
12
  import './chunk-PYSKSROG.js';
13
13
  import './chunk-JBJTC3UU.js';
14
14
  import './chunk-OGFGZQA3.js';
15
- import { readJobFile } from './chunk-7I6GZSN3.js';
16
- 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-4R24DSL2.js';
17
- import './chunk-HPOEVC2V.js';
18
- import './chunk-XGJUNNXL.js';
19
- import './chunk-D7V33CAH.js';
20
- import './chunk-XPKI5OMT.js';
15
+ import { readJobFile } from './chunk-ZLEXMZFW.js';
16
+ 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-TSW4DGV2.js';
17
+ import './chunk-MXTN35XN.js';
18
+ import './chunk-XLC7KEUV.js';
19
+ import './chunk-J7BXZLSO.js';
20
+ import './chunk-UKCNOAO6.js';
21
21
  import './chunk-HXFRJKMU.js';
22
22
  import './chunk-TEVO3RUV.js';
23
23
  import './chunk-BUP5N3X6.js';