@outerlayer/cli 0.5.1 → 0.7.0

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 (92) hide show
  1. package/CHANGELOG.md +29 -0
  2. package/README.md +19 -0
  3. package/dist/{agent-setup-IFH3FB5X.js → agent-setup-TXLDY5RV.js} +7 -6
  4. package/dist/{build-PAEKVYVK.js → build-JF5UOWKJ.js} +2 -1
  5. package/dist/build-info.json +1 -1
  6. package/dist/{check-4Q33B5ZE.js → check-ASZL5BEO.js} +39 -23
  7. package/dist/chunk-2VO25HHO.js +75 -0
  8. package/dist/{chunk-XDDW4FRS.js → chunk-5FWNEQNZ.js} +3 -3
  9. package/dist/{chunk-CHLVJNTE.js → chunk-6IYLDODX.js} +18 -6
  10. package/dist/{chunk-W7UTFZDH.js → chunk-6QWV3YDJ.js} +2 -2
  11. package/dist/{chunk-EGABNHZG.js → chunk-6ZZHWY2Z.js} +149 -18
  12. package/dist/{lima-XN65D7GN.js → chunk-77MM5RYD.js} +0 -1
  13. package/dist/chunk-7FTNIAHS.js +211 -0
  14. package/dist/{chunk-EMY4I27X.js → chunk-7ZR5UPMB.js} +555 -5
  15. package/dist/{chunk-F4NU4H3V.js → chunk-AII7CKTH.js} +133 -35
  16. package/dist/{chunk-ZXBITXTS.js → chunk-AIW6GLET.js} +1 -1
  17. package/dist/{chunk-UWH5DSUP.js → chunk-AJKEHABI.js} +507 -90
  18. package/dist/{chunk-RTXKYLCA.js → chunk-AQ54MKSQ.js} +2 -2
  19. package/dist/{chunk-Z62HNKEJ.js → chunk-CEBIA5FD.js} +31 -5
  20. package/dist/{chunk-EX6M5JPR.js → chunk-D6FXM5OW.js} +6302 -28611
  21. package/dist/{chunk-RMAZ2NWA.js → chunk-DGAIVMMN.js} +23 -2
  22. package/dist/{chunk-3DD6AOWC.js → chunk-DTXOJDEH.js} +26 -2
  23. package/dist/{chunk-T52PKE2Y.js → chunk-E4PIFIC3.js} +244 -17
  24. package/dist/{chunk-H5NCNVDA.js → chunk-EV3M3EH7.js} +2 -2
  25. package/dist/chunk-FBTE2A2X.js +38 -0
  26. package/dist/{chunk-DVDEBNQJ.js → chunk-GQD22KKN.js} +17 -6
  27. package/dist/{chunk-BCJNHMZT.js → chunk-HHJDN6AU.js} +18 -3
  28. package/dist/chunk-HKMPVPO7.js +55 -0
  29. package/dist/{chunk-UFFXNXLQ.js → chunk-JPR2WHHF.js} +31 -29
  30. package/dist/{chunk-ZMYPLFG3.js → chunk-M3SQ4YGD.js} +1 -1
  31. package/dist/{chunk-H4CK2YK4.js → chunk-MQPRB5K7.js} +18 -10
  32. package/dist/{chunk-AUFG23AA.js → chunk-OD2VTIHN.js} +19 -47
  33. package/dist/chunk-OUUINEYB.js +27 -0
  34. package/dist/chunk-PUN7LMNS.js +39 -0
  35. package/dist/{install-cmd-7WXOIFDO.js → chunk-Q5G2ODUZ.js} +1 -2
  36. package/dist/{chunk-B2G7JHHB.js → chunk-R7STSBLC.js} +1 -1
  37. package/dist/{chunk-OR6AEEDO.js → chunk-SSU747O6.js} +85 -25
  38. package/dist/chunk-T6OIJQRT.js +31 -0
  39. package/dist/{chunk-YYYXRJUW.js → chunk-TI7B7UEO.js} +1 -1
  40. package/dist/{chunk-WO2BXCTQ.js → chunk-VXLJORHL.js} +1 -1
  41. package/dist/{chunk-CBPPJSAR.js → chunk-WVGSB3Z2.js} +2 -2
  42. package/dist/{chunk-JLDZTG3A.js → chunk-X2FSFU4C.js} +4 -1
  43. package/dist/chunk-YNJEOGDL.js +22434 -0
  44. package/dist/{chunk-W4SQCOZU.js → chunk-ZOAEPWGL.js} +1 -1
  45. package/dist/{chunk-WOBNRVQT.js → chunk-ZYHKJKSU.js} +1 -1
  46. package/dist/{chunk-WIOZAJ2W.js → chunk-ZZXLM64C.js} +1 -1
  47. package/dist/{cli-LHSUYYMI.js → cli-LEVCGAQV.js} +154 -79
  48. package/dist/command-FLSYCGIB.js +187 -0
  49. package/dist/config-I3TVFYLH.js +10 -0
  50. package/dist/{connect-cmd-OJBFHZWP.js → connect-cmd-MJMUONDY.js} +4 -4
  51. package/dist/{context-adopt-UMA4O5NY.js → context-adopt-CE4KDXS3.js} +5 -4
  52. package/dist/{context-materialize-G2FUFC72.js → context-materialize-QL33HDJN.js} +5 -4
  53. package/dist/{dist-WDV7U7UJ.js → dist-PXBSA7QX.js} +2 -1
  54. package/dist/{doctor-MOA3RIEP.js → doctor-FVDT3KJZ.js} +46 -19
  55. package/dist/{emit-artifact-cmd-FDWYKURA.js → emit-artifact-cmd-7RPMRSVP.js} +13 -7
  56. package/dist/{emit-cmd-DCERAU27.js → emit-cmd-2QRMYPYO.js} +4 -3
  57. package/dist/{emit-criteria-cmd-OCXHLK34.js → emit-criteria-cmd-MKI7WETO.js} +12 -3
  58. package/dist/{emit-finding-cmd-POW7PKIA.js → emit-finding-cmd-RMLGZASB.js} +14 -3
  59. package/dist/{emit-result-cmd-ID35SH53.js → emit-result-cmd-MTXAZ2GV.js} +15 -9
  60. package/dist/{exec-client-4XGXV3XN.js → exec-client-NPYNUAF3.js} +4 -3
  61. package/dist/{guest-init-GENRHNP7.js → guest-init-JWNNAH2H.js} +4 -3
  62. package/dist/{hook-fast-EYENPK6F.js → hook-fast-XBOZ3N6L.js} +1 -1
  63. package/dist/{import-capture-cmd-AVZ4VIVJ.js → import-capture-cmd-T4556ELW.js} +3 -2
  64. package/dist/{import-ruler-cmd-GUHL6IY5.js → import-ruler-cmd-SG3UVGI7.js} +2 -1
  65. package/dist/index.js +3 -2
  66. package/dist/{init-FYDJAKTM.js → init-BACXESVV.js} +21 -14
  67. package/dist/{init-2IPOIXJV.js → init-VLW7H6RW.js} +40 -62
  68. package/dist/{init-cmd-KLIDRVXQ.js → init-cmd-VJFB5L7X.js} +10 -9
  69. package/dist/inspect-XAUSB7L3.js +63 -0
  70. package/dist/install-NMAPLLBQ.js +14 -0
  71. package/dist/install-cmd-B5SEU3G7.js +8 -0
  72. package/dist/lima-7NPCNGWT.js +6 -0
  73. package/dist/{logs-7RYUH5A6.js → logs-H55NWW4H.js} +1 -0
  74. package/dist/loop-D3243JKT.js +64 -0
  75. package/dist/{machine-ECU3QCZD.js → machine-EB3GEVI4.js} +20 -13
  76. package/dist/session-sender-LMACEJJS.js +29 -0
  77. package/dist/{starter-pack-LIZYMKYQ.js → starter-pack-MUXMAU4S.js} +4 -3
  78. package/dist/{status-CLATHCTQ.js → status-F4THTJJK.js} +36 -16
  79. package/dist/{sync-cmd-SWQ5KLPL.js → sync-cmd-M6JA3OEE.js} +7 -7
  80. package/dist/{watch-3YW6Z3DQ.js → watch-NB5TGPEZ.js} +7 -7
  81. package/dist/{work-claim-cmd-3OPWA77E.js → work-claim-cmd-UHMWOS3G.js} +14 -7
  82. package/dist/{work-cmd-NUR4CAG6.js → work-cmd-6UMCFTAW.js} +9 -3
  83. package/dist/{work-comment-cmd-6TTTYGHM.js → work-comment-cmd-E4LEUIXZ.js} +9 -3
  84. package/dist/{work-launch-YI4CJDAP.js → work-launch-R5HTAP6X.js} +1 -1
  85. package/dist/{work-open-pr-cmd-KZ7QQFLD.js → work-open-pr-cmd-OPZWGSEQ.js} +10 -4
  86. package/dist/{work-pr-cmd-QNUBE6IQ.js → work-pr-cmd-IDIAFFRU.js} +9 -2
  87. package/package.json +2 -1
  88. package/skill-pack/template/build/scripts/record-criteria.mjs +2 -1
  89. package/dist/chunk-D2KWEAN6.js +0 -55
  90. package/dist/chunk-ZOC7JSYC.js +0 -83
  91. package/dist/config-HL2AIR3K.js +0 -9
  92. package/dist/loop-NEBUGD2Q.js +0 -45
package/dist/index.js CHANGED
@@ -6,7 +6,7 @@ createRequire(import.meta.url);
6
6
  // src/index.ts
7
7
  var argv = process.argv.slice(2);
8
8
  if (argv[0] === "hook") {
9
- const { runHookFast } = await import('./hook-fast-EYENPK6F.js');
9
+ const { runHookFast } = await import('./hook-fast-XBOZ3N6L.js');
10
10
  await runHookFast(argv[1]);
11
11
  process.exit(0);
12
12
  }
@@ -21,5 +21,6 @@ if (argv[0] === "statusline") {
21
21
  await runStatuslineFast(argv.slice(1));
22
22
  process.exit(0);
23
23
  }
24
- var { runCli } = await import('./cli-LHSUYYMI.js');
24
+ (await import('./hook-fast-XBOZ3N6L.js')).recordLinkExitFailure(argv);
25
+ var { runCli } = await import('./cli-LEVCGAQV.js');
25
26
  await runCli(process.argv);
@@ -1,29 +1,36 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { PLACEHOLDER_MARKER, RunnerInitError, isPlaceholderCommand, readConfigObject, runRunnerInit } from './chunk-W7UTFZDH.js';
4
- import './chunk-RTXKYLCA.js';
5
- import './chunk-T52PKE2Y.js';
6
- import './chunk-Z62HNKEJ.js';
3
+ export { PLACEHOLDER_MARKER, RunnerInitError, isPlaceholderCommand, readConfigObject, runRunnerInit } from './chunk-6QWV3YDJ.js';
4
+ import './chunk-AQ54MKSQ.js';
5
+ import './chunk-E4PIFIC3.js';
6
+ import './chunk-CEBIA5FD.js';
7
7
  import './chunk-N5FOE5PS.js';
8
8
  import './chunk-OGFGZQA3.js';
9
9
  import './chunk-774HEQL6.js';
10
10
  import './chunk-QOZKPLVJ.js';
11
- import './chunk-W4SQCOZU.js';
12
- import './chunk-B2G7JHHB.js';
13
- import './chunk-RMAZ2NWA.js';
11
+ import './chunk-ZOAEPWGL.js';
12
+ import './chunk-R7STSBLC.js';
13
+ import './chunk-DGAIVMMN.js';
14
+ import './chunk-PUN7LMNS.js';
14
15
  import './chunk-BFESLKPP.js';
15
- import './chunk-WOBNRVQT.js';
16
- import './chunk-EX6M5JPR.js';
16
+ import './chunk-SSU747O6.js';
17
+ import './chunk-ZYHKJKSU.js';
18
+ import './chunk-D6FXM5OW.js';
19
+ import './chunk-USO2DKBD.js';
20
+ import './chunk-N6LURUEF.js';
21
+ import './chunk-YRYMNBGQ.js';
17
22
  import './chunk-F6GFZXZ3.js';
18
- import './chunk-AUFG23AA.js';
23
+ import './chunk-OD2VTIHN.js';
24
+ import './chunk-HKMPVPO7.js';
19
25
  import './chunk-WZBHBH3J.js';
20
- import './chunk-XDDW4FRS.js';
21
- import './chunk-WIOZAJ2W.js';
22
- import './chunk-WO2BXCTQ.js';
23
- import './chunk-EMY4I27X.js';
26
+ import './chunk-5FWNEQNZ.js';
24
27
  import './chunk-ZJSNLVCE.js';
28
+ import './chunk-ZZXLM64C.js';
29
+ import './chunk-VXLJORHL.js';
30
+ import './chunk-7ZR5UPMB.js';
25
31
  import './chunk-BCLJSQCV.js';
26
32
  import './chunk-BOLTI6LR.js';
33
+ import './chunk-YNJEOGDL.js';
27
34
  import './chunk-EABW6AJQ.js';
28
35
  import './chunk-RA3O54FC.js';
29
36
  import './chunk-M5POMKKW.js';
@@ -1,32 +1,40 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { execStartCommand } from './chunk-YYYXRJUW.js';
3
+ import { readConfigObject, RunnerInitError } from './chunk-6QWV3YDJ.js';
4
+ import { VM_SERVICE_NAME } from './chunk-FBTE2A2X.js';
5
+ import { checkFit, RUNNER_RESERVE_BYTES } from './chunk-OUUINEYB.js';
4
6
  import { writeLaunchAgent } from './chunk-LF6MLJCY.js';
5
- import { readConfigObject, RunnerInitError, isPlaceholderCommand } from './chunk-W7UTFZDH.js';
6
- import './chunk-RTXKYLCA.js';
7
- import './chunk-T52PKE2Y.js';
8
- import './chunk-Z62HNKEJ.js';
7
+ import './chunk-AQ54MKSQ.js';
8
+ import './chunk-E4PIFIC3.js';
9
+ import './chunk-CEBIA5FD.js';
9
10
  import './chunk-N5FOE5PS.js';
10
11
  import './chunk-OGFGZQA3.js';
11
12
  import './chunk-774HEQL6.js';
12
13
  import './chunk-QOZKPLVJ.js';
13
- import './chunk-W4SQCOZU.js';
14
- import './chunk-B2G7JHHB.js';
15
- import './chunk-RMAZ2NWA.js';
14
+ import './chunk-ZOAEPWGL.js';
15
+ import './chunk-R7STSBLC.js';
16
+ import './chunk-DGAIVMMN.js';
17
+ import './chunk-PUN7LMNS.js';
16
18
  import './chunk-BFESLKPP.js';
17
- import './chunk-WOBNRVQT.js';
18
- import './chunk-EX6M5JPR.js';
19
- import { resolveBuild } from './chunk-3DD6AOWC.js';
19
+ import './chunk-SSU747O6.js';
20
+ import './chunk-ZYHKJKSU.js';
21
+ import './chunk-D6FXM5OW.js';
22
+ import './chunk-USO2DKBD.js';
23
+ import './chunk-N6LURUEF.js';
24
+ import './chunk-YRYMNBGQ.js';
25
+ import { resolveBuild } from './chunk-DTXOJDEH.js';
20
26
  import { parseSize } from './chunk-F6GFZXZ3.js';
21
- import './chunk-AUFG23AA.js';
27
+ import './chunk-OD2VTIHN.js';
28
+ import './chunk-HKMPVPO7.js';
22
29
  import './chunk-WZBHBH3J.js';
23
- import './chunk-XDDW4FRS.js';
24
- import './chunk-WIOZAJ2W.js';
25
- import './chunk-WO2BXCTQ.js';
26
- import './chunk-EMY4I27X.js';
30
+ import './chunk-5FWNEQNZ.js';
27
31
  import './chunk-ZJSNLVCE.js';
32
+ import './chunk-ZZXLM64C.js';
33
+ import './chunk-VXLJORHL.js';
34
+ import './chunk-7ZR5UPMB.js';
28
35
  import './chunk-BCLJSQCV.js';
29
36
  import './chunk-BOLTI6LR.js';
37
+ import './chunk-YNJEOGDL.js';
30
38
  import './chunk-EABW6AJQ.js';
31
39
  import './chunk-RA3O54FC.js';
32
40
  import './chunk-M5POMKKW.js';
@@ -39,43 +47,22 @@ import { readFileSync, writeFileSync, existsSync, rmSync } from 'fs';
39
47
 
40
48
  createRequire(import.meta.url);
41
49
 
42
- // src/runner/vm/service.ts
43
- var VM_SERVICE_NAME = "outerlayer-runner";
44
- var STOP_MARGIN_MINUTES = 10;
45
- function runnerUnit(unit) {
46
- const dir = `${unit.home}/.outerlayer`;
47
- return `[Unit]
48
- Description=OuterLayer runner
49
- After=network-online.target docker.service
50
- Wants=network-online.target
51
- Requires=docker.service
52
-
53
- [Service]
54
- User=${unit.user}
55
- ExecStart=${unit.execStart}
56
- EnvironmentFile=-${dir}/runner.env
57
- Restart=on-failure
58
- RestartForceExitStatus=75
59
- RestartSec=30
60
- KillSignal=SIGTERM
61
- KillMode=mixed
62
- TimeoutStopSec=${unit.timeLimitMinutes + STOP_MARGIN_MINUTES}min
63
-
64
- [Install]
65
- WantedBy=multi-user.target
66
- `;
67
- }
68
-
69
50
  // src/runner/vm/sizing.ts
70
51
  var GIB = 1024 ** 3;
71
52
  var EXTRA_CPUS = 1;
72
- var EXTRA_MEMORY_GIB = 2;
53
+ var GUEST_MEMORY_SHARE = 0.95;
73
54
  var EXTRA_DISK_GIB = 30;
74
55
  var gib = (size) => parseSize(size) / GIB;
56
+ function guestUsableBytes(memoryGiB) {
57
+ return Math.floor(memoryGiB * GIB * GUEST_MEMORY_SHARE);
58
+ }
59
+ function wantedMemoryGiB(build, concurrency) {
60
+ return Math.ceil((gib(build.memory) * concurrency + RUNNER_RESERVE_BYTES / GIB) / GUEST_MEMORY_SHARE);
61
+ }
75
62
  function sizeVm(build, concurrency, host) {
76
63
  return {
77
64
  cpus: Math.max(1, Math.min(Math.ceil(build.cpus * concurrency) + EXTRA_CPUS, host.cpus)),
78
- memoryGiB: Math.max(1, Math.min(Math.ceil(gib(build.memory) * concurrency) + EXTRA_MEMORY_GIB, Math.floor(host.memoryBytes / GIB))),
65
+ memoryGiB: Math.max(1, Math.min(wantedMemoryGiB(build, concurrency), Math.floor(host.memoryBytes / GIB))),
79
66
  diskGiB: Math.ceil(gib(build.disk) * concurrency) + EXTRA_DISK_GIB
80
67
  };
81
68
  }
@@ -85,15 +72,9 @@ var VM_INSTANCE = "outerlayer-runner";
85
72
  var VmInitError = class extends Error {
86
73
  };
87
74
  var MIN_NODE_MAJOR = 22;
88
- var DEFAULT_TIME_LIMIT_MINUTES = 480;
89
75
  var TARBALL_IN_VM = "/tmp/outerlayer-cli.tgz";
90
76
  var NODE_VERSION = /^v(\d+)\./;
91
77
  var quote = (text) => `'${text.replace(/'/g, `'\\''`)}'`;
92
- function commandsAreReal(block) {
93
- const commands = block?.commands ?? {};
94
- const given = [commands.implement, commands.amend].filter((command) => typeof command === "string");
95
- return given.length > 0 && given.every((command) => !isPlaceholderCommand(command));
96
- }
97
78
  async function runVmInit(configPath, deps) {
98
79
  const { lima } = deps;
99
80
  const instance = deps.instance ?? VM_INSTANCE;
@@ -130,8 +111,11 @@ async function runVmInit(configPath, deps) {
130
111
  }
131
112
  const build = resolveBuild(configPath, carried.build);
132
113
  const concurrency = typeof carried.concurrency === "number" ? carried.concurrency : 1;
133
- const timeLimitMinutes = typeof carried.timeLimitMinutes === "number" ? carried.timeLimitMinutes : DEFAULT_TIME_LIMIT_MINUTES;
134
114
  const size = sizeVm(build, concurrency, { cpus: deps.hostCpus, memoryBytes: deps.hostMemoryBytes });
115
+ const fit = checkFit({ concurrency, buildMemory: build.memory, usableBytes: guestUsableBytes(size.memoryGiB) });
116
+ if (!fit.fits) {
117
+ throw new RunnerInitError(`${configPath}: the VM this Mac can give the runner is ${size.memoryGiB} GiB, and ${fit.message}. Lower runner.concurrency or runner.build.memory, then run this again.`);
118
+ }
135
119
  const leftBehind = `The VM ${instance} was left as it is; delete it with \`limactl delete --force ${instance}\` to start over.`;
136
120
  const failed = (what, result) => new VmInitError(`${what} failed: ${result.stderr.trim() || result.stdout.trim() || `exit status ${result.status}`}. ${leftBehind}`);
137
121
  const sh = async (argv, stdin) => {
@@ -172,13 +156,7 @@ async function runVmInit(configPath, deps) {
172
156
  ...block === void 0 ? {} : { runner: carried }
173
157
  };
174
158
  const innerOut = await sh(["sg", "docker", "-c", `${quote(outerlayer)} runner init --config-stdin --config ${quote(vmConfig)}`], JSON.stringify(handoff));
175
- await sh(["sh", "-c", `${quote(outerlayer)} runner install --config ${quote(vmConfig)}`]);
176
- const nodePath = (await sh(["sh", "-c", "command -v node"])).trim();
177
- const execStart = execStartCommand(vmConfig, nodePath);
178
- await sh(["sudo", "tee", `/etc/systemd/system/${VM_SERVICE_NAME}.service`], runnerUnit({ user, home, execStart, timeLimitMinutes }));
179
- await sh(["sudo", "systemctl", "daemon-reload"]);
180
- const enabled = commandsAreReal(block);
181
- if (enabled) await sh(["sudo", "systemctl", "enable", "--now", VM_SERVICE_NAME]);
159
+ const installOut = await sh(["sh", "-c", `${quote(outerlayer)} runner install --service --config ${quote(vmConfig)}`]);
182
160
  let agent;
183
161
  let hadHostKey;
184
162
  try {
@@ -193,7 +171,6 @@ async function runVmInit(configPath, deps) {
193
171
  }
194
172
  return {
195
173
  instance,
196
- enabled,
197
174
  lines: [
198
175
  `created the Linux VM ${instance}: ${size.cpus} CPUs, ${size.memoryGiB} GiB memory, ${size.diskGiB} GiB disk`,
199
176
  ...innerOut.split("\n").map((line) => line.trim()).filter((line) => line !== ""),
@@ -201,8 +178,9 @@ async function runVmInit(configPath, deps) {
201
178
  `moved the runner key into the VM: apiKey and runner are gone from ${configPath}`,
202
179
  ...hadHostKey ? ["deleted this Mac's old host key. If the runner key was bound to it, a member uses Clear host key on the API keys page before the VM's first claim"] : [],
203
180
  "run outerlayer login again to use capture on this Mac, with a key that is not the runner key",
204
- `put CLAUDE_CODE_OAUTH_TOKEN in ${home}/.outerlayer/runner.env inside the VM${enabled ? `, then restart the runner so it reads the file: limactl shell ${instance} sudo systemctl restart ${VM_SERVICE_NAME}` : ""}`,
205
- enabled ? `the runner is running in the VM: limactl shell ${instance} outerlayer runner status` : `Edit the command lines in the VM's config, then run: limactl shell ${instance} sudo systemctl enable --now ${VM_SERVICE_NAME}`
181
+ ...installOut.split("\n").map((line) => line.trim()).filter((line) => line !== ""),
182
+ `put CLAUDE_CODE_OAUTH_TOKEN in ${home}/.outerlayer/runner.env inside the VM, then restart the runner so it reads the file: limactl shell ${instance} sudo systemctl restart ${VM_SERVICE_NAME}`,
183
+ `the runner claims nothing while a command in the VM's config is still the placeholder or the credential is missing; its host entry says why. Check it with: limactl shell ${instance} outerlayer runner status`
206
184
  ]
207
185
  };
208
186
  }
@@ -1,27 +1,28 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { summarizeChecks, summaryText, renderDoctorText } from './chunk-H4CK2YK4.js';
4
- import { runConnect } from './chunk-OR6AEEDO.js';
5
- import './chunk-D2KWEAN6.js';
3
+ import { summarizeChecks, summaryText, renderDoctorText } from './chunk-MQPRB5K7.js';
6
4
  import './chunk-F47JBIAW.js';
7
5
  import './chunk-BKO6JEZI.js';
8
- import './chunk-RMAZ2NWA.js';
6
+ import './chunk-DGAIVMMN.js';
7
+ import './chunk-PUN7LMNS.js';
9
8
  import './chunk-BFESLKPP.js';
10
- import './chunk-WOBNRVQT.js';
11
- import './chunk-EX6M5JPR.js';
9
+ import { runConnect } from './chunk-SSU747O6.js';
10
+ import './chunk-ZYHKJKSU.js';
11
+ import './chunk-D6FXM5OW.js';
12
12
  import './chunk-USO2DKBD.js';
13
13
  import './chunk-N6LURUEF.js';
14
14
  import { C } from './chunk-YRYMNBGQ.js';
15
15
  import './chunk-WZBHBH3J.js';
16
16
  import './chunk-5QRP3MVS.js';
17
- import './chunk-WIOZAJ2W.js';
18
- import './chunk-EMY4I27X.js';
17
+ import './chunk-ZZXLM64C.js';
18
+ import './chunk-7ZR5UPMB.js';
19
19
  import './chunk-BCLJSQCV.js';
20
20
  import './chunk-BOLTI6LR.js';
21
+ import './chunk-YNJEOGDL.js';
21
22
  import './chunk-EABW6AJQ.js';
22
23
  import './chunk-M5POMKKW.js';
23
24
  import './chunk-ZM2IMMYN.js';
24
- import './chunk-UFFXNXLQ.js';
25
+ import './chunk-JPR2WHHF.js';
25
26
  import './chunk-XCCLFVXM.js';
26
27
  import './chunk-BJ3KTMDH.js';
27
28
  import './chunk-VNVZDWO3.js';
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import './chunk-Z5GEFMRW.js';
4
+ import { spawnSync } from 'child_process';
5
+ import { statSync, readFileSync } from 'fs';
6
+ import { join } from 'path';
7
+
8
+ createRequire(import.meta.url);
9
+ var CREDENTIAL_VARIABLES = ["CLAUDE_CODE_OAUTH_TOKEN", "ANTHROPIC_API_KEY"];
10
+ function property(shown, name) {
11
+ return new RegExp(`^${name}=(.*)$`, "m").exec(shown)?.[1]?.trim();
12
+ }
13
+ function holdsGroup(status, gid) {
14
+ const primary = /^Gid:\s+(\d+)/m.exec(status)?.[1];
15
+ const supplementary = /^Groups:[ \t]*(.*)$/m.exec(status)?.[1]?.trim().split(/\s+/).filter((g) => g !== "") ?? [];
16
+ return [primary, ...supplementary].some((g) => g !== void 0 && Number(g) === gid);
17
+ }
18
+ function credentialNames(env) {
19
+ const set = new Set(
20
+ (env ?? "").split("\n").map((line) => /^\s*(?:export\s+)?([A-Za-z_][A-Za-z0-9_]*)=(.+)$/.exec(line)).flatMap((m) => m === null || m[2].trim() === "" ? [] : [m[1]])
21
+ );
22
+ return CREDENTIAL_VARIABLES.filter((name) => set.has(name));
23
+ }
24
+ function inspectService(unit, configDir, probes) {
25
+ const shown = probes.show(unit);
26
+ if (shown === void 0 || property(shown, "LoadState") !== "loaded") return void 0;
27
+ const pid = Number(property(shown, "MainPID") ?? "0");
28
+ const mainPid = Number.isInteger(pid) && pid > 0 ? pid : void 0;
29
+ const delegate = property(shown, "Delegate");
30
+ const status = mainPid === void 0 ? void 0 : probes.readFile(`/proc/${mainPid}/status`);
31
+ const kvm = probes.kvmGid();
32
+ return {
33
+ unit,
34
+ mainPid,
35
+ delegate: delegate === void 0 ? void 0 : delegate !== "no",
36
+ hasKvmGroup: status === void 0 || kvm === void 0 ? void 0 : holdsGroup(status, kvm),
37
+ credentialVariables: credentialNames(probes.readFile(join(configDir, "runner.env")))
38
+ };
39
+ }
40
+ function realInspectProbes() {
41
+ return {
42
+ show: (unit) => {
43
+ const result = spawnSync("systemctl", ["show", "--property=LoadState,MainPID,Delegate", unit], { encoding: "utf8", timeout: 1e4 });
44
+ return result.status === 0 ? result.stdout : void 0;
45
+ },
46
+ readFile: (path) => {
47
+ try {
48
+ return readFileSync(path, "utf8");
49
+ } catch {
50
+ return void 0;
51
+ }
52
+ },
53
+ kvmGid: () => {
54
+ try {
55
+ return statSync("/dev/kvm").gid;
56
+ } catch {
57
+ return void 0;
58
+ }
59
+ }
60
+ };
61
+ }
62
+
63
+ export { inspectService, realInspectProbes };
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ export { DEFAULT_UNIT_NAME, installService, uninstallService, unitPathFor } from './chunk-7FTNIAHS.js';
4
+ import './chunk-FBTE2A2X.js';
5
+ import './chunk-OUUINEYB.js';
6
+ import './chunk-DTXOJDEH.js';
7
+ import './chunk-F6GFZXZ3.js';
8
+ import './chunk-OD2VTIHN.js';
9
+ import './chunk-HKMPVPO7.js';
10
+ import './chunk-ZM2IMMYN.js';
11
+ import './chunk-VNVZDWO3.js';
12
+ import './chunk-Z5GEFMRW.js';
13
+
14
+ createRequire(import.meta.url);
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ export { RunnerInstallError, runRunnerInstall } from './chunk-Q5G2ODUZ.js';
4
+ import './chunk-TI7B7UEO.js';
5
+ import './chunk-ZM2IMMYN.js';
6
+ import './chunk-Z5GEFMRW.js';
7
+
8
+ createRequire(import.meta.url);
@@ -0,0 +1,6 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ export { realLima } from './chunk-77MM5RYD.js';
4
+ import './chunk-Z5GEFMRW.js';
5
+
6
+ createRequire(import.meta.url);
@@ -11,6 +11,7 @@ var RunnerLogsError = class extends Error {
11
11
  var STAGE_LOG = {
12
12
  provision: "provision.log",
13
13
  command: "command.log",
14
+ checks: "checks/environment.log",
14
15
  sync: "command.log",
15
16
  cleanup: "cleanup.log",
16
17
  report: "report.log"
@@ -0,0 +1,64 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ export { RunnerStartError, listJobFiles, probeCredentials, requestStop, runnerProcessState, start, tick, watchTick } from './chunk-AII7CKTH.js';
4
+ import './chunk-ABIWDUMS.js';
5
+ import './chunk-TI7B7UEO.js';
6
+ import './chunk-AJKEHABI.js';
7
+ import './chunk-T6OIJQRT.js';
8
+ import './chunk-AIW6GLET.js';
9
+ import './chunk-UGP76IZ5.js';
10
+ import './chunk-2VO25HHO.js';
11
+ import './chunk-WVGSB3Z2.js';
12
+ import './chunk-6ZZHWY2Z.js';
13
+ import './chunk-HHJDN6AU.js';
14
+ import './chunk-6IYLDODX.js';
15
+ import './chunk-YYYRBYWG.js';
16
+ import './chunk-TBT347UY.js';
17
+ import './chunk-6QWV3YDJ.js';
18
+ import './chunk-OUUINEYB.js';
19
+ import './chunk-AQ54MKSQ.js';
20
+ import './chunk-E4PIFIC3.js';
21
+ import './chunk-CEBIA5FD.js';
22
+ import './chunk-N5FOE5PS.js';
23
+ import './chunk-OGFGZQA3.js';
24
+ import './chunk-774HEQL6.js';
25
+ import './chunk-QOZKPLVJ.js';
26
+ import './chunk-ZOAEPWGL.js';
27
+ import './chunk-R7STSBLC.js';
28
+ import './chunk-F7CU5ABH.js';
29
+ import './chunk-BKO6JEZI.js';
30
+ import './chunk-DGAIVMMN.js';
31
+ import './chunk-PUN7LMNS.js';
32
+ import './chunk-BFESLKPP.js';
33
+ import './chunk-SSU747O6.js';
34
+ import './chunk-ZYHKJKSU.js';
35
+ import './chunk-D6FXM5OW.js';
36
+ import './chunk-USO2DKBD.js';
37
+ import './chunk-N6LURUEF.js';
38
+ import './chunk-YRYMNBGQ.js';
39
+ import './chunk-DTXOJDEH.js';
40
+ import './chunk-F6GFZXZ3.js';
41
+ import './chunk-OD2VTIHN.js';
42
+ import './chunk-HKMPVPO7.js';
43
+ import './chunk-GQD22KKN.js';
44
+ import './chunk-WZBHBH3J.js';
45
+ import './chunk-5QRP3MVS.js';
46
+ import './chunk-5FWNEQNZ.js';
47
+ import './chunk-ZJSNLVCE.js';
48
+ import './chunk-ZZXLM64C.js';
49
+ import './chunk-VXLJORHL.js';
50
+ import './chunk-7ZR5UPMB.js';
51
+ import './chunk-BCLJSQCV.js';
52
+ import './chunk-BOLTI6LR.js';
53
+ import './chunk-YNJEOGDL.js';
54
+ import './chunk-EABW6AJQ.js';
55
+ import './chunk-RA3O54FC.js';
56
+ import './chunk-M5POMKKW.js';
57
+ import './chunk-ZM2IMMYN.js';
58
+ import './chunk-JPR2WHHF.js';
59
+ import './chunk-XCCLFVXM.js';
60
+ import './chunk-BJ3KTMDH.js';
61
+ import './chunk-VNVZDWO3.js';
62
+ import './chunk-Z5GEFMRW.js';
63
+
64
+ createRequire(import.meta.url);
@@ -1,28 +1,35 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { describeMachineDocker, detectMachine, microVmArchSupported, microVmAssetsPinned, reachDockerStep, supportsContainerBuilds, supportsMicroVmBuilds } from './chunk-RTXKYLCA.js';
4
- import './chunk-T52PKE2Y.js';
5
- import './chunk-Z62HNKEJ.js';
3
+ export { describeMachineDocker, detectMachine, microVmArchSupported, microVmAssetsPinned, reachDockerStep, supportsContainerBuilds, supportsMicroVmBuilds } from './chunk-AQ54MKSQ.js';
4
+ import './chunk-E4PIFIC3.js';
5
+ import './chunk-CEBIA5FD.js';
6
6
  import './chunk-N5FOE5PS.js';
7
7
  import './chunk-OGFGZQA3.js';
8
8
  import './chunk-774HEQL6.js';
9
9
  import './chunk-QOZKPLVJ.js';
10
- import './chunk-W4SQCOZU.js';
11
- import './chunk-B2G7JHHB.js';
12
- import './chunk-RMAZ2NWA.js';
10
+ import './chunk-ZOAEPWGL.js';
11
+ import './chunk-R7STSBLC.js';
12
+ import './chunk-DGAIVMMN.js';
13
+ import './chunk-PUN7LMNS.js';
13
14
  import './chunk-BFESLKPP.js';
14
- import './chunk-WOBNRVQT.js';
15
- import './chunk-EX6M5JPR.js';
15
+ import './chunk-SSU747O6.js';
16
+ import './chunk-ZYHKJKSU.js';
17
+ import './chunk-D6FXM5OW.js';
18
+ import './chunk-USO2DKBD.js';
19
+ import './chunk-N6LURUEF.js';
20
+ import './chunk-YRYMNBGQ.js';
16
21
  import './chunk-F6GFZXZ3.js';
17
- import './chunk-AUFG23AA.js';
22
+ import './chunk-OD2VTIHN.js';
23
+ import './chunk-HKMPVPO7.js';
18
24
  import './chunk-WZBHBH3J.js';
19
- import './chunk-XDDW4FRS.js';
20
- import './chunk-WIOZAJ2W.js';
21
- import './chunk-WO2BXCTQ.js';
22
- import './chunk-EMY4I27X.js';
25
+ import './chunk-5FWNEQNZ.js';
23
26
  import './chunk-ZJSNLVCE.js';
27
+ import './chunk-ZZXLM64C.js';
28
+ import './chunk-VXLJORHL.js';
29
+ import './chunk-7ZR5UPMB.js';
24
30
  import './chunk-BCLJSQCV.js';
25
31
  import './chunk-BOLTI6LR.js';
32
+ import './chunk-YNJEOGDL.js';
26
33
  import './chunk-EABW6AJQ.js';
27
34
  import './chunk-RA3O54FC.js';
28
35
  import './chunk-M5POMKKW.js';
@@ -0,0 +1,29 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ export { runSessionSender, senderPidfile, startSessionSender } from './chunk-2VO25HHO.js';
4
+ import './chunk-6ZZHWY2Z.js';
5
+ import './chunk-HHJDN6AU.js';
6
+ import './chunk-TBT347UY.js';
7
+ import './chunk-F7CU5ABH.js';
8
+ import './chunk-BKO6JEZI.js';
9
+ import './chunk-BFESLKPP.js';
10
+ import './chunk-ZYHKJKSU.js';
11
+ import './chunk-D6FXM5OW.js';
12
+ import './chunk-YRYMNBGQ.js';
13
+ import './chunk-GQD22KKN.js';
14
+ import './chunk-WZBHBH3J.js';
15
+ import './chunk-5QRP3MVS.js';
16
+ import './chunk-ZJSNLVCE.js';
17
+ import './chunk-BCLJSQCV.js';
18
+ import './chunk-BOLTI6LR.js';
19
+ import './chunk-YNJEOGDL.js';
20
+ import './chunk-EABW6AJQ.js';
21
+ import './chunk-M5POMKKW.js';
22
+ import './chunk-ZM2IMMYN.js';
23
+ import './chunk-JPR2WHHF.js';
24
+ import './chunk-XCCLFVXM.js';
25
+ import './chunk-BJ3KTMDH.js';
26
+ import './chunk-VNVZDWO3.js';
27
+ import './chunk-Z5GEFMRW.js';
28
+
29
+ createRequire(import.meta.url);
@@ -1,9 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { StarterPackError, assertKnownTemplate, formatStarterPackOutput, installStarterPack } from './chunk-ZMYPLFG3.js';
3
+ export { StarterPackError, assertKnownTemplate, formatStarterPackOutput, installStarterPack } from './chunk-M3SQ4YGD.js';
4
4
  import './chunk-YRYMNBGQ.js';
5
- import './chunk-WO2BXCTQ.js';
6
- import './chunk-EMY4I27X.js';
5
+ import './chunk-VXLJORHL.js';
6
+ import './chunk-7ZR5UPMB.js';
7
+ import './chunk-YNJEOGDL.js';
7
8
  import './chunk-RA3O54FC.js';
8
9
  import './chunk-Z5GEFMRW.js';
9
10
 
@@ -1,36 +1,52 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { LEASE_SECONDS, RENEW_INTERVAL_SECONDS } from './chunk-UWH5DSUP.js';
4
- import './chunk-CBPPJSAR.js';
3
+ import { LEASE_SECONDS, RENEW_INTERVAL_SECONDS } from './chunk-AJKEHABI.js';
4
+ import './chunk-T6OIJQRT.js';
5
+ import './chunk-2VO25HHO.js';
6
+ import './chunk-WVGSB3Z2.js';
7
+ import './chunk-6ZZHWY2Z.js';
8
+ import './chunk-HHJDN6AU.js';
5
9
  import { formatBytes } from './chunk-YYYRBYWG.js';
6
- import './chunk-ZOC7JSYC.js';
7
- import { formatDuration, formatClock, relativeToRunner } from './chunk-T52PKE2Y.js';
8
- import './chunk-Z62HNKEJ.js';
10
+ import './chunk-TBT347UY.js';
11
+ import { formatDuration, formatClock, relativeToRunner } from './chunk-E4PIFIC3.js';
12
+ import './chunk-CEBIA5FD.js';
9
13
  import './chunk-N5FOE5PS.js';
10
14
  import './chunk-OGFGZQA3.js';
11
15
  import './chunk-774HEQL6.js';
12
16
  import './chunk-QOZKPLVJ.js';
13
- import './chunk-W4SQCOZU.js';
14
- import './chunk-B2G7JHHB.js';
15
- import './chunk-RMAZ2NWA.js';
17
+ import './chunk-ZOAEPWGL.js';
18
+ import './chunk-R7STSBLC.js';
19
+ import './chunk-F7CU5ABH.js';
20
+ import './chunk-BKO6JEZI.js';
21
+ import './chunk-DGAIVMMN.js';
22
+ import './chunk-PUN7LMNS.js';
16
23
  import './chunk-BFESLKPP.js';
17
- import './chunk-WOBNRVQT.js';
18
- import './chunk-EX6M5JPR.js';
19
- import './chunk-3DD6AOWC.js';
24
+ import './chunk-SSU747O6.js';
25
+ import './chunk-ZYHKJKSU.js';
26
+ import './chunk-D6FXM5OW.js';
27
+ import './chunk-USO2DKBD.js';
28
+ import './chunk-N6LURUEF.js';
29
+ import './chunk-YRYMNBGQ.js';
30
+ import './chunk-DTXOJDEH.js';
20
31
  import './chunk-F6GFZXZ3.js';
21
- import './chunk-AUFG23AA.js';
32
+ import './chunk-OD2VTIHN.js';
33
+ import './chunk-HKMPVPO7.js';
34
+ import './chunk-GQD22KKN.js';
22
35
  import './chunk-WZBHBH3J.js';
23
- import './chunk-XDDW4FRS.js';
24
- import './chunk-WIOZAJ2W.js';
25
- import './chunk-WO2BXCTQ.js';
26
- import './chunk-EMY4I27X.js';
36
+ import './chunk-5QRP3MVS.js';
37
+ import './chunk-5FWNEQNZ.js';
27
38
  import './chunk-ZJSNLVCE.js';
39
+ import './chunk-ZZXLM64C.js';
40
+ import './chunk-VXLJORHL.js';
41
+ import './chunk-7ZR5UPMB.js';
28
42
  import './chunk-BCLJSQCV.js';
29
43
  import './chunk-BOLTI6LR.js';
44
+ import './chunk-YNJEOGDL.js';
30
45
  import './chunk-EABW6AJQ.js';
31
46
  import './chunk-RA3O54FC.js';
32
47
  import './chunk-M5POMKKW.js';
33
48
  import { runnerDir, jobsDir } from './chunk-ZM2IMMYN.js';
49
+ import './chunk-JPR2WHHF.js';
34
50
  import './chunk-XCCLFVXM.js';
35
51
  import './chunk-BJ3KTMDH.js';
36
52
  import './chunk-VNVZDWO3.js';
@@ -77,6 +93,10 @@ function renderStatus(input) {
77
93
  const finished = input.jobs.filter(({ job }) => !isUnfinished(job)).sort((a, b) => (b.job.endedAt ?? "").localeCompare(a.job.endedAt ?? "")).slice(0, 20);
78
94
  const header = input.process.state === "running" ? `runner ${input.host} running, pid ${input.process.pid} \xB7 config ${input.configPath} \xB7 ${running.length} of ${input.concurrency} slots in use` : input.process.state === "stale" ? `runner ${input.host} not running (stale pid file for pid ${input.process.pid}) \xB7 config ${input.configPath}` : `runner ${input.host} not running (pid file absent) \xB7 config ${input.configPath}`;
79
95
  lines.push(header);
96
+ if (input.service !== void 0) {
97
+ const { unit, running: running2, delegated } = input.service;
98
+ lines.push(`service ${unit} ${running2 ? "running" : "stopped"}${delegated === false ? " \xB7 not delegated: microVM builds have no memory limit of their own" : ""}`);
99
+ }
80
100
  lines.push(...housekeepingLines(input));
81
101
  lines.push("");
82
102
  if (running.length === 0) {