@outerlayer/cli 0.24.0 → 0.25.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +9 -0
  3. package/dist/{agent-setup-QQYRBPK2.js → agent-setup-PDIIGMKE.js} +7 -7
  4. package/dist/{bridge-4ZARDVGS.js → bridge-5KZ36YDG.js} +3 -3
  5. package/dist/build-YYVAJ75G.js +12 -0
  6. package/dist/build-info.json +1 -1
  7. package/dist/{builder-MECDEKXX.js → builder-MNUJS4RG.js} +7 -7
  8. package/dist/{check-YYKNYFNI.js → check-C6HEFW6R.js} +39 -38
  9. package/dist/{chunk-BUBCPP3F.js → chunk-23SPSYXZ.js} +3 -3
  10. package/dist/{chunk-5ECUMU53.js → chunk-24LQ34XL.js} +6 -6
  11. package/dist/{chunk-BN3CSI7S.js → chunk-2K3TCQHW.js} +1 -1
  12. package/dist/{chunk-A62QFN2M.js → chunk-2N72GPS2.js} +3 -3
  13. package/dist/{chunk-TQ6Y7YV6.js → chunk-3FNPTQRH.js} +5 -5
  14. package/dist/{chunk-F2W2IYNP.js → chunk-3WZ5ECSM.js} +3 -3
  15. package/dist/{chunk-WH2QV3UL.js → chunk-4S4VBDSO.js} +1 -1
  16. package/dist/{chunk-IDSHLKQA.js → chunk-5222PA6S.js} +1 -1
  17. package/dist/{chunk-6GSA2SKT.js → chunk-A6ORKBVJ.js} +213 -59
  18. package/dist/{chunk-3W333NFO.js → chunk-APBTVIM4.js} +15 -4
  19. package/dist/{chunk-HHXBOTRO.js → chunk-ATGHVEU4.js} +1 -1
  20. package/dist/{chunk-D7K446H6.js → chunk-C36EOUUU.js} +5 -5
  21. package/dist/{chunk-RVYOOYOA.js → chunk-CQRIZNE6.js} +19 -10
  22. package/dist/{chunk-FWEWFW3F.js → chunk-DEBOL6ON.js} +1 -1
  23. package/dist/{chunk-GU4PKXN7.js → chunk-ENFBARQP.js} +185 -38
  24. package/dist/{chunk-H6IUKXXI.js → chunk-F57CLUH7.js} +207 -35
  25. package/dist/{chunk-E4OUL7ZP.js → chunk-FXUVXSY2.js} +2 -2
  26. package/dist/{chunk-F7Y2USIM.js → chunk-H6ZFLIX3.js} +3 -3
  27. package/dist/{chunk-LY2L3O2O.js → chunk-HPOEVC2V.js} +3 -2
  28. package/dist/{chunk-ZFLOFAUG.js → chunk-I25F6YVP.js} +8 -8
  29. package/dist/{chunk-DG2ULWM6.js → chunk-IGRRD7PX.js} +11 -7
  30. package/dist/{chunk-GISNHSYL.js → chunk-JGD5TWQ2.js} +4 -2
  31. package/dist/{chunk-D7X5ITVT.js → chunk-JWRX5ZTT.js} +6 -2
  32. package/dist/{chunk-755WXDBI.js → chunk-K5WVK7IC.js} +1 -1
  33. package/dist/{chunk-FKXGQOF5.js → chunk-M4B6QKNZ.js} +1 -1
  34. package/dist/{chunk-5XCAPBE2.js → chunk-N3VSI5ZI.js} +6 -6
  35. package/dist/{chunk-NTQTDCYR.js → chunk-O2WYUIK7.js} +1 -1
  36. package/dist/{chunk-BOQY756V.js → chunk-OEU4JSDE.js} +8 -7
  37. package/dist/{chunk-TTLVQZSH.js → chunk-Q435LWVN.js} +5 -5
  38. package/dist/{chunk-D4AMAEZ7.js → chunk-QE3UQAHK.js} +322 -17
  39. package/dist/{chunk-VV7ZD5LR.js → chunk-QMQC6JCO.js} +1 -1
  40. package/dist/{chunk-FQPN5S4Q.js → chunk-QXNJWSTM.js} +4 -4
  41. package/dist/{chunk-VBEXKEBV.js → chunk-S6AWZKJN.js} +19 -6
  42. package/dist/{chunk-V5Q3S4NM.js → chunk-SNQR2EYI.js} +2 -2
  43. package/dist/{chunk-CZUH2SLQ.js → chunk-UNF7MWEL.js} +1 -1
  44. package/dist/{chunk-W7O4LA4E.js → chunk-VAMUWK55.js} +3 -3
  45. package/dist/{chunk-PDIM5T65.js → chunk-XGJUNNXL.js} +1 -1
  46. package/dist/{chunk-NGZID7UI.js → chunk-XRYUJTAT.js} +8 -1
  47. package/dist/{chunk-LBCZXXOX.js → chunk-ZGMQQWCV.js} +2 -2
  48. package/dist/{chunk-KF37SUDM.js → chunk-ZI2ZVWKT.js} +1 -1
  49. package/dist/{chunk-PVRBE7S4.js → chunk-ZODVSFI4.js} +1 -1
  50. package/dist/chunk-ZVB57WI6.js +19 -0
  51. package/dist/{claude-launcher-JCPSHDZQ.js → claude-launcher-WGOCLTG6.js} +1 -1
  52. package/dist/{cli-ZTBH3FBG.js → cli-YMTNHR4W.js} +107 -102
  53. package/dist/command-DKYZC7PH.js +533 -0
  54. package/dist/{config-7Z5DHSGY.js → config-JJ3EO7SB.js} +3 -3
  55. package/dist/{connect-cmd-NY5LIKVC.js → connect-cmd-F7T4LNKX.js} +7 -7
  56. package/dist/{container-start-OHBUZEJJ.js → container-start-AX7QXJMR.js} +45 -36
  57. package/dist/{control-plane-launch-GKGI6HJA.js → control-plane-launch-ZFT6SI4N.js} +6 -6
  58. package/dist/{dist-2APO44JG.js → dist-QPHZE47F.js} +1 -1
  59. package/dist/{docker-RKGBJESN.js → docker-5EC5TE3Y.js} +7 -7
  60. package/dist/{doctor-DOAFZV4O.js → doctor-S6YCZGUU.js} +79 -33
  61. package/dist/{emit-artifact-cmd-VZHIDPXQ.js → emit-artifact-cmd-DJO475VZ.js} +11 -11
  62. package/dist/{emit-criteria-cmd-SYLBCWHW.js → emit-criteria-cmd-EULQ2MLI.js} +8 -8
  63. package/dist/{emit-finding-cmd-52M43NPC.js → emit-finding-cmd-QIIKMITO.js} +8 -8
  64. package/dist/{emit-result-cmd-BTMTGDAV.js → emit-result-cmd-NMCLTA47.js} +11 -11
  65. package/dist/{emit-step-cmd-6XTJITZT.js → emit-step-cmd-72OX5P6M.js} +9 -9
  66. package/dist/{exec-client-CKPK62K2.js → exec-client-KH33DICR.js} +4 -4
  67. package/dist/{governing-source-GWN7GVEN.js → governing-source-JNQ6PX2A.js} +11 -11
  68. package/dist/{guest-init-ZBL5CN7Y.js → guest-init-TOSKPGPF.js} +5 -5
  69. package/dist/{hook-fast-3JL4PXLG.js → hook-fast-NEELST6G.js} +1 -1
  70. package/dist/host-key-ICJEQBWH.js +9 -0
  71. package/dist/{image-tag-AO4RBAKW.js → image-tag-6KJOGBQK.js} +4 -4
  72. package/dist/index.js +4 -4
  73. package/dist/{init-TSQ3EOQW.js → init-624F4JIP.js} +25 -23
  74. package/dist/{init-EQTR7AEF.js → init-G7XC5WWL.js} +25 -23
  75. package/dist/{init-cmd-AF2MH36A.js → init-cmd-UUYA57VO.js} +11 -11
  76. package/dist/{init-update-SHISHMXV.js → init-update-MMV33PLM.js} +9 -9
  77. package/dist/{install-ORQC26ZE.js → install-MPEJJ7X6.js} +5 -5
  78. package/dist/{install-cmd-4LA3UJZ4.js → install-cmd-SE6NCTJK.js} +6 -6
  79. package/dist/job-state-format-WJQGQB6F.js +6 -0
  80. package/dist/{logs-5EPHIPZB.js → logs-T4ERSOQ4.js} +3 -3
  81. package/dist/loop-K5B2A3VW.js +78 -0
  82. package/dist/{machine-6UNLIPLE.js → machine-J4IFVIKU.js} +21 -19
  83. package/dist/{mcp-serve-cmd-KMWEKM7C.js → mcp-serve-cmd-7M4VLNI4.js} +5 -5
  84. package/dist/{paths-XY5ADO32.js → paths-2KGM2LZV.js} +3 -3
  85. package/dist/pending-BGLMTB5Q.js +9 -0
  86. package/dist/{pidfile-OJ7RP4Q2.js → pidfile-VYBH3IMN.js} +4 -4
  87. package/dist/{record-BEJB4J7N.js → record-GNOHDJ2O.js} +4 -4
  88. package/dist/{relay-PSZ4LGMW.js → relay-GFPPD6GF.js} +1 -1
  89. package/dist/relay-protocol-HELO5SNH.js +6 -0
  90. package/dist/{runner-env-ZJWJOJKQ.js → runner-env-GUFV544G.js} +6 -6
  91. package/dist/{runner-identity-2OOUJSFJ.js → runner-identity-HZ6CBM2R.js} +7 -7
  92. package/dist/{runner-key-WDFBSJRX.js → runner-key-FFVZUEHE.js} +25 -23
  93. package/dist/{session-sender-X3BBQZMF.js → session-sender-3SUWNNVP.js} +12 -12
  94. package/dist/{spec-cmd-QRF5YXKK.js → spec-cmd-VZDE6FFH.js} +9 -9
  95. package/dist/{status-ZCAAF6MD.js → status-GXTD44DX.js} +35 -29
  96. package/dist/{sync-cmd-UQK3RYAC.js → sync-cmd-VFB3NEJ6.js} +11 -11
  97. package/dist/{watch-MOQ3GQTE.js → watch-LWMTDD3L.js} +11 -11
  98. package/dist/{work-claim-cmd-RT343CLA.js → work-claim-cmd-FOBTDQVR.js} +12 -12
  99. package/dist/{work-cmd-APXSER2D.js → work-cmd-6HARIBMW.js} +9 -9
  100. package/dist/{work-comment-cmd-AT5NUYUU.js → work-comment-cmd-BITPALHR.js} +9 -9
  101. package/dist/{work-logs-cmd-Z5DMNEJP.js → work-logs-cmd-VGB3O2LZ.js} +9 -9
  102. package/dist/{work-open-pr-cmd-ZTS6MJHL.js → work-open-pr-cmd-SVZCNOIM.js} +10 -10
  103. package/dist/{work-pr-cmd-IWZCC3WH.js → work-pr-cmd-SJT46GN4.js} +9 -9
  104. package/dist/{work-stop-cmd-DCAWFDZC.js → work-stop-cmd-WXKVVA4S.js} +9 -9
  105. package/package.json +2 -2
  106. package/skill-pack/maintained/outerlayer-build/SKILL.md +1 -1
  107. package/skill-pack/maintained/outerlayer-build/references/agent-briefs.md +3 -2
  108. package/skill-pack/maintained/outerlayer-build/references/review-briefs.md +3 -1
  109. package/dist/build-OVZIT2G2.js +0 -12
  110. package/dist/command-DO4TERRT.js +0 -208
  111. package/dist/host-key-W2DLZGZ7.js +0 -9
  112. package/dist/loop-4WUCS5JP.js +0 -77
  113. package/dist/pending-35J3ZPLR.js +0 -9
  114. package/dist/relay-protocol-K7KP2SPI.js +0 -6
@@ -1,23 +1,23 @@
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-ZFLOFAUG.js';
3
+ import { gatherDoctorChecks, doctorExitCode, summarizeChecks, renderDoctorText, recordWrapped, recordUnwrapped, recordRemoval, readManifest, recordInstall, recordStatusline } from './chunk-I25F6YVP.js';
4
4
  import './chunk-XFGL53GU.js';
5
5
  import './chunk-VJBFQP3H.js';
6
- import { verifiedTrackerNames, TRACKERS } from './chunk-RVYOOYOA.js';
7
- import './chunk-F2W2IYNP.js';
8
- import './chunk-V5Q3S4NM.js';
6
+ import { verifiedTrackerNames, TRACKERS } from './chunk-CQRIZNE6.js';
7
+ import './chunk-3WZ5ECSM.js';
8
+ import './chunk-SNQR2EYI.js';
9
9
  import './chunk-BUP5N3X6.js';
10
10
  import './chunk-XSPA5ODY.js';
11
11
  import './chunk-GOSFARMS.js';
12
12
  import './chunk-MQ743JX3.js';
13
- import './chunk-FKXGQOF5.js';
14
- import { hookFiredMarkerPath, installedCliDistDir } from './chunk-755WXDBI.js';
13
+ import './chunk-M4B6QKNZ.js';
14
+ import { hookFiredMarkerPath, installedCliDistDir } from './chunk-K5WVK7IC.js';
15
15
  import './chunk-ZJSNLVCE.js';
16
16
  import './chunk-DXDF43YG.js';
17
17
  import './chunk-BKO6JEZI.js';
18
18
  import './chunk-HCVLP7XA.js';
19
19
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
20
- import './chunk-D4AMAEZ7.js';
20
+ import './chunk-QE3UQAHK.js';
21
21
  import './chunk-YVZJ6GKF.js';
22
22
  import { C, warnDeprecated, API_KEY_FLAG_DEPRECATION, NO_COLOR_FLAG, stripNoColor } from './chunk-ANPNT6PM.js';
23
23
  import './chunk-EABW6AJQ.js';
@@ -33,10 +33,10 @@ import './chunk-RKOTJQVG.js';
33
33
  import './chunk-QZBXLLTV.js';
34
34
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
35
35
  import { resolveVersion } from './chunk-RA3O54FC.js';
36
- import './chunk-PVRBE7S4.js';
37
- import './chunk-KF37SUDM.js';
38
- import './chunk-BN3CSI7S.js';
39
- import './chunk-GISNHSYL.js';
36
+ import './chunk-ZODVSFI4.js';
37
+ import './chunk-ZI2ZVWKT.js';
38
+ import './chunk-2K3TCQHW.js';
39
+ import './chunk-JGD5TWQ2.js';
40
40
  import './chunk-Z5GEFMRW.js';
41
41
  import { EventEmitter } from 'events';
42
42
  import childProcess, { execFileSync } from 'child_process';
@@ -3784,8 +3784,8 @@ ${starter.output}`),
3784
3784
  }
3785
3785
  }
3786
3786
  async function realConnectDepsForCwd() {
3787
- const { realConnectDeps } = await import('./connect-cmd-NY5LIKVC.js');
3788
- const { resolveRepoIdentity } = await import('./dist-2APO44JG.js');
3787
+ const { realConnectDeps } = await import('./connect-cmd-F7T4LNKX.js');
3788
+ const { resolveRepoIdentity } = await import('./dist-QPHZE47F.js');
3789
3789
  return {
3790
3790
  ...realConnectDeps(),
3791
3791
  home: homeFromEnv(),
@@ -3851,7 +3851,7 @@ edited file, and writes nothing. --control-plane makes no link and says
3851
3851
  what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocation() + " doctor` reports the same\nstates under Starter files.\n"
3852
3852
  ).action(async (opts) => {
3853
3853
  if (opts.update || opts.dryRun) {
3854
- const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-SHISHMXV.js');
3854
+ const { runInitUpdate, formatInitUpdate, updateFlagProblem } = await import('./init-update-MMV33PLM.js');
3855
3855
  const problem = updateFlagProblem(opts);
3856
3856
  if (problem !== void 0) {
3857
3857
  fail(problem);
@@ -3898,12 +3898,12 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3898
3898
  if (changed.length > 0 && !opts.json) process.stdout.write(`Removed the claude function from ${changed.join(", ")}.
3899
3899
  `);
3900
3900
  }
3901
- const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-AF2MH36A.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3901
+ const shell = !opts.remove && opts.shellFunction !== void 0 ? (await import('./init-cmd-UUYA57VO.js')).applyShellFunctionFlag(opts.shellFunction, { home: homeFromEnv(), shellPath: process.env.SHELL }) : void 0;
3902
3902
  if (opts.json) writeJson(shell === void 0 ? outcome.result : { ...outcome.result, shellFunction: { outcome: shell.outcome, reason: shell.reason } });
3903
3903
  else process.stdout.write(outcome.text + (shell?.text ?? ""));
3904
3904
  return;
3905
3905
  }
3906
- const { runInitCommand } = await import('./init-cmd-AF2MH36A.js');
3906
+ const { runInitCommand } = await import('./init-cmd-UUYA57VO.js');
3907
3907
  const code = await runInitCommand(
3908
3908
  { json: opts.json, factory: opts.factory, shellFunction: opts.shellFunction },
3909
3909
  {
@@ -3915,7 +3915,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3915
3915
  return { ok, text, detail };
3916
3916
  },
3917
3917
  runAgentSetup: async () => {
3918
- const { runAgentSetup } = await import('./agent-setup-QQYRBPK2.js');
3918
+ const { runAgentSetup } = await import('./agent-setup-PDIIGMKE.js');
3919
3919
  return runAgentSetup({ cwd: process.cwd(), skillsLink: opts.skillsLink !== false });
3920
3920
  },
3921
3921
  runDoctorChecks: gatherDoctorChecks,
@@ -3924,7 +3924,7 @@ what CLIs older than ${FIRST_VERSION_READING_AGENTS_SKILLS} do. \`` + cliInvocat
3924
3924
  shellPath: process.env.SHELL,
3925
3925
  interactive: Boolean(process.stdin.isTTY && process.stderr.isTTY) && opts.json !== true,
3926
3926
  ask: async () => {
3927
- const { promptOnTerminal } = await import('./connect-cmd-NY5LIKVC.js');
3927
+ const { promptOnTerminal } = await import('./connect-cmd-F7T4LNKX.js');
3928
3928
  const answer = await promptOnTerminal({
3929
3929
  message: `Should plain claude start Claude Code through ${cliInvocation()} claude? That is how a session in a governed repository gets its control plane. It adds one block to your zsh or bash startup file.`,
3930
3930
  options: [
@@ -3963,7 +3963,7 @@ linked (true, false, or null when it could not be checked) and, when false,
3963
3963
  linkUrl.
3964
3964
  `
3965
3965
  ).action(async (opts) => {
3966
- const { runConnectCommand } = await import('./connect-cmd-NY5LIKVC.js');
3966
+ const { runConnectCommand } = await import('./connect-cmd-F7T4LNKX.js');
3967
3967
  const code = await runConnectCommand({ factory: opts.factory, json: opts.json }, await realConnectDepsForCwd(), {
3968
3968
  stdout: process.stdout,
3969
3969
  stderr: process.stderr
@@ -4041,7 +4041,7 @@ code is 1: revoke the token on /profile/security.
4041
4041
  else fail(found.reason);
4042
4042
  return;
4043
4043
  }
4044
- const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-UQK3RYAC.js');
4044
+ const { runSync, SyncConfigError, SyncTransportError } = await import('./sync-cmd-VFB3NEJ6.js');
4045
4045
  try {
4046
4046
  const result = await runSync({
4047
4047
  url: opts.url,
@@ -4072,7 +4072,7 @@ code is 1: revoke the token on /profile/security.
4072
4072
  if (invokedCommandToken(argv) === "watch") {
4073
4073
  warnDeprecated(`\`${cliInvocation()} watch\` is now \`${cliInvocation()} daemon\`; the old name will be removed in a future release.`);
4074
4074
  }
4075
- const { runWatch } = await import('./watch-MOQ3GQTE.js');
4075
+ const { runWatch } = await import('./watch-LWMTDD3L.js');
4076
4076
  await runWatch({ once: opts.once });
4077
4077
  });
4078
4078
  program2.command("hook <event>", { hidden: true }).description("capture-hook fast path, installed by `init`").action(() => {
@@ -4084,8 +4084,8 @@ code is 1: revoke the token on /profile/security.
4084
4084
  program2.command("claude [args...]").description("start Claude Code with the repository's control plane attached").allowUnknownOption().helpOption(false).action(() => {
4085
4085
  });
4086
4086
  const brokerRelay = program2.command("broker-relay", { hidden: true }).description("relay a build's loopback connections to the runner's tunnel and destinations").enablePositionalOptions().option("--port <port>", "the loopback port to listen on").option("--socket <path>", "the runner's tunnel socket").option("--join <path>", "the socket the runner's joining process connects to").option("--lease-watchdog", "exit when the runner's lease expiry passes; needs --join").option("--forward <port=target>", "also relay a loopback port to a destination; repeatable", (value, previous) => [...previous, value], []).action(async (opts) => {
4087
- const { startRelay, startSessionRelay } = await import('./relay-PSZ4LGMW.js');
4088
- const { TARGET_TUNNEL, targetOfPath } = await import('./relay-protocol-K7KP2SPI.js');
4087
+ const { startRelay, startSessionRelay } = await import('./relay-GFPPD6GF.js');
4088
+ const { TARGET_TUNNEL, targetOfPath } = await import('./relay-protocol-HELO5SNH.js');
4089
4089
  const port = Number(opts.port);
4090
4090
  if (!Number.isInteger(port) || port < 1 || port > 65535) {
4091
4091
  fail(opts.port === void 0 ? "--port is required" : `--port must be a port number, not ${opts.port}`);
@@ -4117,7 +4117,7 @@ code is 1: revoke the token on /profile/security.
4117
4117
  await startRelay({ port, socketPath: opts.socket, forwards: forwards.map((forward) => ({ port: forward.port, socketPath: forward.spec })) });
4118
4118
  });
4119
4119
  brokerRelay.command("join").description("carry the runner's session to the relay over standard input and output").option("--socket <path>", "the relay's joining socket", "/run/outerlayer-relay/join.sock").action(async (opts) => {
4120
- const { joinRelay } = await import('./relay-PSZ4LGMW.js');
4120
+ const { joinRelay } = await import('./relay-GFPPD6GF.js');
4121
4121
  try {
4122
4122
  await joinRelay({ socketPath: opts.socket, input: process.stdin, output: process.stdout });
4123
4123
  } catch (err) {
@@ -4133,7 +4133,7 @@ code is 1: revoke the token on /profile/security.
4133
4133
  }
4134
4134
  });
4135
4135
  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-CKPK62K2.js');
4136
+ const { runVmExec } = await import('./exec-client-KH33DICR.js');
4137
4137
  const env = {};
4138
4138
  for (const entry of opts.env) {
4139
4139
  const eq = entry.indexOf("=");
@@ -4162,7 +4162,7 @@ code is 1: revoke the token on /profile/security.
4162
4162
  process.exitCode = await runBuildCommand({ dir: opts.dir, argv: command });
4163
4163
  });
4164
4164
  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-X3BBQZMF.js');
4165
+ const { runSessionSender } = await import('./session-sender-3SUWNNVP.js');
4166
4166
  try {
4167
4167
  await runSessionSender();
4168
4168
  } catch (err) {
@@ -4170,7 +4170,7 @@ code is 1: revoke the token on /profile/security.
4170
4170
  }
4171
4171
  });
4172
4172
  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-ZBL5CN7Y.js');
4173
+ const { realGuestHost, runGuestInit } = await import('./guest-init-TOSKPGPF.js');
4174
4174
  const { readFileSync: readFileSync3 } = await import('fs');
4175
4175
  try {
4176
4176
  runGuestInit(realGuestHost(), readFileSync3("/proc/cmdline", "utf8"));
@@ -4179,7 +4179,7 @@ code is 1: revoke the token on /profile/security.
4179
4179
  }
4180
4180
  });
4181
4181
  program2.command("vm-forward", { hidden: true }).description("pipe a guest port to another; vm-init runs it").requiredOption("--listen <host:port>", "the address to listen on").requiredOption("--to <host:port>", "the address to pipe each connection to").action(async (opts) => {
4182
- const { startBridgeForward } = await import('./bridge-4ZARDVGS.js');
4182
+ const { startBridgeForward } = await import('./bridge-5KZ36YDG.js');
4183
4183
  try {
4184
4184
  await startBridgeForward(opts);
4185
4185
  } catch (err) {
@@ -4253,7 +4253,7 @@ Compiling .outerlayer/ moved to \`${cliInvocation()} context emit\`.
4253
4253
  await compileContext({ dir: opts.dir, check: opts.check, json: opts.json });
4254
4254
  return;
4255
4255
  }
4256
- const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-BTMTGDAV.js');
4256
+ const { runEmitResult, EmitResultError } = await import('./emit-result-cmd-NMCLTA47.js');
4257
4257
  try {
4258
4258
  const result = await runEmitResult({
4259
4259
  name,
@@ -4303,7 +4303,7 @@ everywhere, bytes and deep link untouched; a still-queued one is cancelled
4303
4303
  locally so it never uploads. One correction can retire several duplicates.
4304
4304
  `
4305
4305
  ).action(async (file, opts) => {
4306
- const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-VZHIDPXQ.js');
4306
+ const { runEmitArtifact, EmitArtifactError } = await import('./emit-artifact-cmd-DJO475VZ.js');
4307
4307
  let pr;
4308
4308
  if (opts.pr !== void 0) {
4309
4309
  pr = parseTrackerNumber(opts.pr);
@@ -4362,7 +4362,7 @@ recent events with their ids. --find <text> searches all of them.
4362
4362
  item that session was launched for is used automatically.
4363
4363
  `
4364
4364
  ).action(async (opts) => {
4365
- const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-52M43NPC.js');
4365
+ const { runEmitFinding, refuseRemovedFindingFlags, EmitFindingError } = await import('./emit-finding-cmd-QIIKMITO.js');
4366
4366
  try {
4367
4367
  refuseRemovedFindingFlags(opts);
4368
4368
  const result = await runEmitFinding({
@@ -4429,7 +4429,7 @@ the whole batch. "untimed": true records one with no time on purpose.
4429
4429
  that session was launched for is used automatically.
4430
4430
  `
4431
4431
  ).action(async (file, opts) => {
4432
- const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-52M43NPC.js');
4432
+ const { runEmitFindings, EmitFindingError } = await import('./emit-finding-cmd-QIIKMITO.js');
4433
4433
  try {
4434
4434
  const result = await runEmitFindings({
4435
4435
  file,
@@ -4464,7 +4464,7 @@ command, the command exits 0, and \`sync\` sends it later. If the gateway refuse
4464
4464
  the step, the command prints why and exits 1.
4465
4465
  `
4466
4466
  ).action(async (name, opts) => {
4467
- const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-6XTJITZT.js');
4467
+ const { runEmitStep, EmitStepError } = await import('./emit-step-cmd-72OX5P6M.js');
4468
4468
  try {
4469
4469
  await runEmitStep({
4470
4470
  name,
@@ -4507,7 +4507,7 @@ of the item, and a (proof: <kind>) annotation names its proof.
4507
4507
  ${cliInvocation()} emit criteria acceptance/412-login.md --item 412
4508
4508
  `
4509
4509
  ).action(async (file, opts) => {
4510
- const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-SYLBCWHW.js');
4510
+ const { runEmitCriteria, EmitCriteriaError } = await import('./emit-criteria-cmd-EULQ2MLI.js');
4511
4511
  try {
4512
4512
  const result = await runEmitCriteria({
4513
4513
  file,
@@ -4531,9 +4531,9 @@ function registerSpecCommands(program2) {
4531
4531
  const specCmd = program2.command("spec").description("Find, file and edit the issue a spec lives in, in your factory's tracker");
4532
4532
  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)");
4533
4533
  const run = async (action) => {
4534
- const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4534
+ const { WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4535
4535
  try {
4536
- await action(await import('./spec-cmd-QRF5YXKK.js'));
4536
+ await action(await import('./spec-cmd-VZDE6FFH.js'));
4537
4537
  } catch (err) {
4538
4538
  if (err instanceof WorkCommandError) {
4539
4539
  fail(err.message);
@@ -4575,7 +4575,7 @@ takes it, and prints the line that starts your session on it. That
4575
4575
  session links itself and holds the item's lease while it works.
4576
4576
  `
4577
4577
  ).action(async (opts) => {
4578
- const { runWorkBuild, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4578
+ const { runWorkBuild, WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4579
4579
  try {
4580
4580
  await runWorkBuild(opts);
4581
4581
  } catch (err) {
@@ -4598,7 +4598,7 @@ renews that session's own 20-minute lease, unless --no-lease or
4598
4598
  --ended is given, or another worker already holds a live one.
4599
4599
  `
4600
4600
  ).action(async (number, opts) => {
4601
- const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4601
+ const { runWorkLinkSession, WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4602
4602
  try {
4603
4603
  await runWorkLinkSession({ ...opts, number, noLease: opts.lease === false, logFailures: opts.logFailures === true });
4604
4604
  } catch (err) {
@@ -4622,8 +4622,8 @@ criterion's new proof; --ready hands the thread back to a person. At
4622
4622
  most one action flag may be given.
4623
4623
  `
4624
4624
  ).action(async (opts) => {
4625
- const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-AT5NUYUU.js');
4626
- const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4625
+ const { runWorkComment, WorkCommentCommandError } = await import('./work-comment-cmd-BITPALHR.js');
4626
+ const { WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4627
4627
  try {
4628
4628
  await runWorkComment(opts);
4629
4629
  } catch (err) {
@@ -4644,8 +4644,8 @@ criterion that carries proof or a comment, each with who is waiting
4644
4644
  on whom next.
4645
4645
  `
4646
4646
  ).action(async (opts) => {
4647
- const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-AT5NUYUU.js');
4648
- const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4647
+ const { runWorkThreads, WorkCommentCommandError } = await import('./work-comment-cmd-BITPALHR.js');
4648
+ const { WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4649
4649
  try {
4650
4650
  await runWorkThreads(opts);
4651
4651
  } catch (err) {
@@ -4669,8 +4669,8 @@ still running, or that an older runner released, has no log and the
4669
4669
  command exits 1.
4670
4670
  `
4671
4671
  ).action(async (opts) => {
4672
- const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-Z5DMNEJP.js');
4673
- const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4672
+ const { runWorkLogs, WorkLogsCommandError } = await import('./work-logs-cmd-VGB3O2LZ.js');
4673
+ const { WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4674
4674
  try {
4675
4675
  await runWorkLogs(opts);
4676
4676
  } catch (err) {
@@ -4693,8 +4693,8 @@ item is not built again until a new build request. Exits 1 when no host
4693
4693
  build is running for the item.
4694
4694
  `
4695
4695
  ).action(async (opts) => {
4696
- const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-DCAWFDZC.js');
4697
- const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4696
+ const { runWorkStop, WorkStopCommandError } = await import('./work-stop-cmd-WXKVVA4S.js');
4697
+ const { WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4698
4698
  try {
4699
4699
  await runWorkStop(opts);
4700
4700
  } catch (err) {
@@ -4715,7 +4715,7 @@ deletes anything \u2014 the item is removed from Work only once no
4715
4715
  live addition remains on it.
4716
4716
  `
4717
4717
  ).action(async (opts) => {
4718
- const { runWorkRemove, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4718
+ const { runWorkRemove, WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4719
4719
  try {
4720
4720
  await runWorkRemove(opts);
4721
4721
  } catch (err) {
@@ -4727,7 +4727,7 @@ live addition remains on it.
4727
4727
  }
4728
4728
  });
4729
4729
  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) => {
4730
- const { runWorkStatus, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4730
+ const { runWorkStatus, WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4731
4731
  try {
4732
4732
  await runWorkStatus(opts);
4733
4733
  } catch (err) {
@@ -4739,7 +4739,7 @@ live addition remains on it.
4739
4739
  }
4740
4740
  });
4741
4741
  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) => {
4742
- const { runWorkList, WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4742
+ const { runWorkList, WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4743
4743
  try {
4744
4744
  await runWorkList(opts);
4745
4745
  } catch (err) {
@@ -4760,7 +4760,7 @@ by a different key is refused; claiming again with the same key extends
4760
4760
  it. --host is a label only.
4761
4761
  `
4762
4762
  ).action(async (opts) => {
4763
- const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-RT343CLA.js');
4763
+ const { runWorkClaim, WorkCommandError } = await import('./work-claim-cmd-FOBTDQVR.js');
4764
4764
  try {
4765
4765
  await runWorkClaim(opts);
4766
4766
  } catch (err) {
@@ -4780,7 +4780,7 @@ Extends the live lease this API key holds. Refused with a 410 if the
4780
4780
  lease has expired, or a 403 if a different key holds it.
4781
4781
  `
4782
4782
  ).action(async (opts) => {
4783
- const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-RT343CLA.js');
4783
+ const { runWorkRenew, WorkCommandError } = await import('./work-claim-cmd-FOBTDQVR.js');
4784
4784
  try {
4785
4785
  await runWorkRenew(opts);
4786
4786
  } catch (err) {
@@ -4812,7 +4812,7 @@ applies to a host's lease only. A later tool call in the session
4812
4812
  takes the lease again.
4813
4813
  `
4814
4814
  ).action(async (opts) => {
4815
- const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-RT343CLA.js');
4815
+ const { runWorkRelease, WorkCommandError } = await import('./work-claim-cmd-FOBTDQVR.js');
4816
4816
  try {
4817
4817
  await runWorkRelease(opts);
4818
4818
  } catch (err) {
@@ -4839,7 +4839,7 @@ Idempotent: declaring the same pull request twice is a no-op.
4839
4839
  needs your own login; an agent session or a factory key is refused.
4840
4840
  `
4841
4841
  ).action(async (number, opts) => {
4842
- const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-IWZCC3WH.js');
4842
+ const { runWorkPr, WorkPrCommandError } = await import('./work-pr-cmd-SJT46GN4.js');
4843
4843
  try {
4844
4844
  await runWorkPr({ ...opts, number });
4845
4845
  } catch (err) {
@@ -4864,8 +4864,8 @@ login, then declares the pull request on the item, as \`work pr\` does.
4864
4864
  Run it again after a change to the title or description.
4865
4865
  `
4866
4866
  ).action(async (opts) => {
4867
- const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-ZTS6MJHL.js');
4868
- const { WorkCommandError } = await import('./work-cmd-APXSER2D.js');
4867
+ const { runWorkOpenPr, WorkOpenPrCommandError } = await import('./work-open-pr-cmd-SVZCNOIM.js');
4868
+ const { WorkCommandError } = await import('./work-cmd-6HARIBMW.js');
4869
4869
  try {
4870
4870
  await runWorkOpenPr(opts);
4871
4871
  } catch (err) {
@@ -4881,9 +4881,9 @@ function registerRunnerCommands(program2) {
4881
4881
  const runnerCmd = program2.command("runner").description("Take work from the implement and amend queues on this machine");
4882
4882
  const configOption = "the cloud config file to run against (default: ~/.outerlayer/config.json)";
4883
4883
  runnerCmd.command("start").description("Run the loop: claim work, run it, report, clean up, repeat").option("--config <path>", configOption).action(async (opts) => {
4884
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-7Z5DHSGY.js');
4885
- const { start, RunnerStartError } = await import('./loop-4WUCS5JP.js');
4886
- const { RunnerAlreadyRunningError } = await import('./pidfile-OJ7RP4Q2.js');
4884
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
4885
+ const { start, RunnerStartError } = await import('./loop-K5B2A3VW.js');
4886
+ const { RunnerAlreadyRunningError } = await import('./pidfile-VYBH3IMN.js');
4887
4887
  const configPath = opts.config ?? defaultRunnerConfigPath();
4888
4888
  try {
4889
4889
  const { realUpdateDeps } = await import('./real-deps-KNNBQC75.js');
@@ -4898,12 +4898,12 @@ function registerRunnerCommands(program2) {
4898
4898
  });
4899
4899
  runnerCmd.command("container-start").description("Container entrypoint: write the config from variables, then run").addHelpText(
4900
4900
  "after",
4901
- "\nReads OUTERLAYER_URL, OUTERLAYER_APP_ID, OUTERLAYER_API_KEY, OUTERLAYER_HOST 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
+ "\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"
4902
4902
  ).action(async () => {
4903
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-7Z5DHSGY.js');
4904
- const { containerStart } = await import('./container-start-OHBUZEJJ.js');
4905
- const { start, RunnerStartError } = await import('./loop-4WUCS5JP.js');
4906
- const { RunnerAlreadyRunningError } = await import('./pidfile-OJ7RP4Q2.js');
4903
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
4904
+ const { containerStart } = await import('./container-start-AX7QXJMR.js');
4905
+ const { start, RunnerStartError } = await import('./loop-K5B2A3VW.js');
4906
+ const { RunnerAlreadyRunningError } = await import('./pidfile-VYBH3IMN.js');
4907
4907
  try {
4908
4908
  const result = await containerStart({
4909
4909
  env: process.env,
@@ -4921,8 +4921,8 @@ function registerRunnerCommands(program2) {
4921
4921
  }
4922
4922
  });
4923
4923
  runnerCmd.command("check").description("Validate the config, the hooks and the key, and print the effective settings").option("--config <path>", configOption).action(async (opts) => {
4924
- const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
4925
- const { runRunnerCheck } = await import('./check-YYKNYFNI.js');
4924
+ const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
4925
+ const { runRunnerCheck } = await import('./check-C6HEFW6R.js');
4926
4926
  const configPath = opts.config ?? defaultRunnerConfigPath();
4927
4927
  const result = await runRunnerCheck(configPath);
4928
4928
  if (!result.ok) {
@@ -4935,11 +4935,16 @@ function registerRunnerCommands(program2) {
4935
4935
  `
4936
4936
  );
4937
4937
  process.stdout.write(`${result.lines.join("\n")}
4938
+ `);
4939
+ });
4940
+ runnerCmd.command("job-state-formats", { hidden: true }).description("Print the job-state formats this version reads and the one it writes, as JSON").action(async () => {
4941
+ const { jobStateFormatsAnswer } = await import('./job-state-format-WJQGQB6F.js');
4942
+ process.stdout.write(`${JSON.stringify(jobStateFormatsAnswer())}
4938
4943
  `);
4939
4944
  });
4940
4945
  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) => {
4941
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-7Z5DHSGY.js');
4942
- const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-4LA3UJZ4.js');
4946
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
4947
+ const { runRunnerInstall, RunnerInstallError, launcherSummary, restartNote } = await import('./install-cmd-SE6NCTJK.js');
4943
4948
  const configPath = opts.config ?? defaultRunnerConfigPath();
4944
4949
  if (opts.service !== true) {
4945
4950
  for (const flag of ["print", "user", "unitName"]) {
@@ -4951,7 +4956,7 @@ function registerRunnerCommands(program2) {
4951
4956
  }
4952
4957
  try {
4953
4958
  if (opts.service === true) {
4954
- const { installServiceCommand } = await import('./command-DO4TERRT.js');
4959
+ const { installServiceCommand } = await import('./command-DKYZC7PH.js');
4955
4960
  const result2 = await installServiceCommand({
4956
4961
  configPath,
4957
4962
  print: opts.print,
@@ -5006,8 +5011,8 @@ To keep it running, run ${C.yellow}${cliInvocation()} runner install --service${
5006
5011
  fail(`pass --service: \`${cliInvocation()} runner uninstall --service\` removes the runner's service.`);
5007
5012
  return;
5008
5013
  }
5009
- const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
5010
- const { uninstallServiceCommand } = await import('./command-DO4TERRT.js');
5014
+ const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5015
+ const { uninstallServiceCommand } = await import('./command-DKYZC7PH.js');
5011
5016
  const result = await uninstallServiceCommand({ configPath: opts.config ?? defaultRunnerConfigPath(), unitName: opts.unitName, home: homeFromEnv() });
5012
5017
  if (result.ok) for (const line of result.lines) process.stdout.write(`${C.green}\u2713${C.reset} ${line}
5013
5018
  `);
@@ -5034,12 +5039,12 @@ already in runner.env is used.
5034
5039
  printf '%s' "$CLAUDE_CODE_OAUTH_TOKEN" | ${cliInvocation()} runner init --agent claude --factory <org>/<factory>
5035
5040
  `
5036
5041
  ).action(async (opts) => {
5037
- const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-7Z5DHSGY.js');
5038
- const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-TSQ3EOQW.js');
5039
- const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-WDFBSJRX.js');
5040
- const { detectMachine } = await import('./machine-6UNLIPLE.js');
5041
- const { chooseVm, runVmInit, VmInitError } = await import('./init-EQTR7AEF.js');
5042
- const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-ZJWJOJKQ.js');
5042
+ const { defaultRunnerConfigPath, RunnerConfigError } = await import('./config-JJ3EO7SB.js');
5043
+ const { prepareRunnerInit, runRunnerInit, RunnerInitError, writeRunnerInit } = await import('./init-624F4JIP.js');
5044
+ const { obtainRunnerKey, runnerKeyLogin } = await import('./runner-key-FFVZUEHE.js');
5045
+ const { detectMachine } = await import('./machine-J4IFVIKU.js');
5046
+ const { chooseVm, runVmInit, VmInitError } = await import('./init-G7XC5WWL.js');
5047
+ const { AGENT_COMMANDS, credentialFromStdin, isAgentName, restartForCredential, RunnerEnvError } = await import('./runner-env-GUFV544G.js');
5043
5048
  const configPath = opts.config ?? defaultRunnerConfigPath();
5044
5049
  if (opts.agent !== void 0 && !isAgentName(opts.agent)) {
5045
5050
  fail(`--agent ${opts.agent}: runner init writes commands for ${Object.keys(AGENT_COMMANDS).join(", ")}. For another agent, leave --agent out and edit runner.commands.`);
@@ -5070,7 +5075,7 @@ already in runner.env is used.
5070
5075
  const chunks = [];
5071
5076
  for await (const chunk of process.stdin) chunks.push(Buffer.from(chunk));
5072
5077
  const result2 = runRunnerInit(configPath, { machine, configFromStdin: Buffer.concat(chunks).toString("utf8"), requireContainer: true });
5073
- const { ensureHostKey: ensureHostKey2 } = await import('./host-key-W2DLZGZ7.js');
5078
+ const { ensureHostKey: ensureHostKey2 } = await import('./host-key-ICJEQBWH.js');
5074
5079
  const hostKey2 = await ensureHostKey2(configPath);
5075
5080
  process.stdout.write(`host key ${hostKey2.fingerprint}
5076
5081
  hooks: ${result2.hooks}
@@ -5129,7 +5134,7 @@ hooks: ${result2.hooks}
5129
5134
  const prepared = prepareRunnerInit(configPath, { machine, allowProcess, agent, credential, keyFromLogin: makeKey !== void 0 });
5130
5135
  const created = makeKey === void 0 ? void 0 : await makeKey();
5131
5136
  const result = writeRunnerInit(prepared, created);
5132
- const { ensureHostKey } = await import('./host-key-W2DLZGZ7.js');
5137
+ const { ensureHostKey } = await import('./host-key-ICJEQBWH.js');
5133
5138
  const hostKey = await ensureHostKey(configPath);
5134
5139
  if (created !== void 0) {
5135
5140
  process.stdout.write(`${C.green}\u2713${C.reset} saved the runner key in ${result.configPath}
@@ -5157,7 +5162,7 @@ ${C.yellow}${result.note}${C.reset}
5157
5162
  To isolate builds in containers instead, run ${C.yellow}${cliInvocation()} runner init --vm${C.reset}.
5158
5163
  `);
5159
5164
  }
5160
- const { runRunnerInstall, RunnerInstallError, RunnerDowngradeError, launcherSummary } = await import('./install-cmd-4LA3UJZ4.js');
5165
+ const { runRunnerInstall, RunnerInstallError, RunnerDowngradeError, launcherSummary } = await import('./install-cmd-SE6NCTJK.js');
5161
5166
  let installedLayout = false;
5162
5167
  let noService = "it starts the runner from the install layout, which needs a CLI installed with npm";
5163
5168
  try {
@@ -5189,7 +5194,7 @@ ${C.yellow}The runner will not update itself: ${installErr.message}${C.reset}
5189
5194
  let serviceUp = false;
5190
5195
  let restart;
5191
5196
  if (installedLayout) {
5192
- const { installServiceCommand } = await import('./command-DO4TERRT.js');
5197
+ const { installServiceCommand } = await import('./command-DKYZC7PH.js');
5193
5198
  const service = await installServiceCommand({
5194
5199
  configPath,
5195
5200
  entryPath: process.argv[1] ?? "",
@@ -5233,12 +5238,12 @@ Next:
5233
5238
  "after",
5234
5239
  "\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"
5235
5240
  ).action(async (opts) => {
5236
- const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
5237
- const { buildRepositoryImage, RecipeError } = await import('./build-OVZIT2G2.js');
5241
+ const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5242
+ const { buildRepositoryImage, RecipeError } = await import('./build-YYVAJ75G.js');
5238
5243
  const { currentCliBuild } = await import('./cli-build-K56DK4DS.js');
5239
- const { createDockerHost } = await import('./docker-RKGBJESN.js');
5240
- const { builderSpec } = await import('./builder-MECDEKXX.js');
5241
- const { loadRunnerConfig } = await import('./config-7Z5DHSGY.js');
5244
+ const { createDockerHost } = await import('./docker-5EC5TE3Y.js');
5245
+ const { builderSpec } = await import('./builder-MNUJS4RG.js');
5246
+ const { loadRunnerConfig } = await import('./config-JJ3EO7SB.js');
5242
5247
  const configPath = opts.config ?? defaultRunnerConfigPath();
5243
5248
  const loaded = (() => {
5244
5249
  try {
@@ -5249,11 +5254,11 @@ Next:
5249
5254
  })();
5250
5255
  const memory = loaded?.build?.memory ?? "8g";
5251
5256
  try {
5252
- const { ensureRunnerIdentity } = await import('./runner-identity-2OOUJSFJ.js');
5257
+ const { ensureRunnerIdentity } = await import('./runner-identity-HZ6CBM2R.js');
5253
5258
  await ensureRunnerIdentity(configPath, { log: (line) => console.error(line) }).catch((err) => {
5254
5259
  console.error(`the runner's Docker identity could not be stored: ${err instanceof Error ? err.message : String(err)}`);
5255
5260
  });
5256
- const { imageTargetFor } = await import('./governing-source-GWN7GVEN.js');
5261
+ const { imageTargetFor } = await import('./governing-source-JNQ6PX2A.js');
5257
5262
  const target = await imageTargetFor({ config: loaded, repository: opts.repository, fetchImpl: fetch });
5258
5263
  if (!target.ok) {
5259
5264
  if (opts.json) {
@@ -5316,25 +5321,25 @@ Next:
5316
5321
  }
5317
5322
  });
5318
5323
  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) => {
5319
- const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
5320
- const { requestStop } = await import('./loop-4WUCS5JP.js');
5324
+ const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5325
+ const { requestStop } = await import('./loop-K5B2A3VW.js');
5321
5326
  const configPath = opts.config ?? defaultRunnerConfigPath();
5322
- const { runnerImageVersion } = await import('./image-tag-AO4RBAKW.js');
5327
+ const { runnerImageVersion } = await import('./image-tag-6KJOGBQK.js');
5323
5328
  await requestStop(configPath, Boolean(opts.now), void 0, { image: runnerImageVersion() !== void 0 });
5324
5329
  });
5325
5330
  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) => {
5326
- const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-7Z5DHSGY.js');
5327
- const { jobsDir, runnerDir } = await import('./paths-XY5ADO32.js');
5328
- const { listJobFiles, runnerProcessState } = await import('./loop-4WUCS5JP.js');
5329
- const { renderStatus } = await import('./status-ZCAAF6MD.js');
5330
- const { readHousekeepingRecord } = await import('./record-BEJB4J7N.js');
5331
+ const { defaultRunnerConfigPath, loadRunnerConfig } = await import('./config-JJ3EO7SB.js');
5332
+ const { jobsDir, runnerDir } = await import('./paths-2KGM2LZV.js');
5333
+ const { listJobFiles, runnerProcessState } = await import('./loop-K5B2A3VW.js');
5334
+ const { renderStatus } = await import('./status-GXTD44DX.js');
5335
+ const { readHousekeepingRecord } = await import('./record-GNOHDJ2O.js');
5331
5336
  const path2 = await import('path');
5332
5337
  const configPath = opts.config ?? defaultRunnerConfigPath();
5333
5338
  const all = listJobFiles(configPath);
5334
5339
  const housekeeping = readHousekeepingRecord(runnerDir(configPath));
5335
- const { readPendingUpdate } = await import('./pending-35J3ZPLR.js');
5340
+ const { readPendingUpdate } = await import('./pending-BGLMTB5Q.js');
5336
5341
  const pendingUpdate = readPendingUpdate(runnerDir(configPath));
5337
- const { readImageStatus } = await import('./image-tag-AO4RBAKW.js');
5342
+ const { readImageStatus } = await import('./image-tag-6KJOGBQK.js');
5338
5343
  const image = readImageStatus(runnerDir(configPath));
5339
5344
  let host = "unknown";
5340
5345
  let concurrency = 1;
@@ -5348,7 +5353,7 @@ Next:
5348
5353
  const service = await (async () => {
5349
5354
  if (process.platform !== "linux" || !existsSync("/run/systemd/system")) return void 0;
5350
5355
  const { inspectService, realInspectProbes } = await import('./inspect-6UYAAXH7.js');
5351
- const { DEFAULT_UNIT_NAME } = await import('./install-ORQC26ZE.js');
5356
+ const { DEFAULT_UNIT_NAME } = await import('./install-MPEJJ7X6.js');
5352
5357
  const facts = inspectService(DEFAULT_UNIT_NAME, path2.dirname(configPath), realInspectProbes());
5353
5358
  return facts === void 0 ? void 0 : { unit: facts.unit, running: facts.mainPid !== void 0, delegated: facts.delegate };
5354
5359
  })();
@@ -5385,9 +5390,9 @@ Next:
5385
5390
  );
5386
5391
  });
5387
5392
  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) => {
5388
- const { defaultRunnerConfigPath } = await import('./config-7Z5DHSGY.js');
5389
- const { listJobFiles } = await import('./loop-4WUCS5JP.js');
5390
- const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-5EPHIPZB.js');
5393
+ const { defaultRunnerConfigPath } = await import('./config-JJ3EO7SB.js');
5394
+ const { listJobFiles } = await import('./loop-K5B2A3VW.js');
5395
+ const { newestAttempt, logPathFor, tail, RunnerLogsError } = await import('./logs-T4ERSOQ4.js');
5391
5396
  const configPath = opts.config ?? defaultRunnerConfigPath();
5392
5397
  const item = parseTrackerNumber(itemArg);
5393
5398
  if (item === void 0) {
@@ -5635,7 +5640,7 @@ caller from the bearer token, the gateway answers 401 without that header.
5635
5640
  "after",
5636
5641
  "\nWhat the stdio .mcp.json entry spawns. Reads newline-delimited JSON-RPC 2.0 on\nstdin and writes responses on stdout. The API key comes from OUTERLAYER_API_KEY\nor ~/.outerlayer/config.json at start-up; with neither the command exits 1 and\nprints why, which the MCP client shows as the connect error.\n"
5637
5642
  ).action(async (opts) => {
5638
- const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-KMWEKM7C.js');
5643
+ const { runMcpServe, handleMcpServeError } = await import('./mcp-serve-cmd-7M4VLNI4.js');
5639
5644
  try {
5640
5645
  await runMcpServe({ url: opts.url, appId: opts.appId });
5641
5646
  } catch (err) {