@outerlayer/cli 0.30.2-next.20261020115557 → 0.31.0-next.20261020133458

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 (103) hide show
  1. package/dist/{agent-setup-ZNYAXAWI.js → agent-setup-E7CMDUR5.js} +6 -6
  2. package/dist/{bridge-FI7OF2H3.js → bridge-3EG6Q34K.js} +2 -2
  3. package/dist/{build-PXRDWSN4.js → build-7QD3VJ6U.js} +4 -4
  4. package/dist/build-info.json +1 -1
  5. package/dist/{builder-UNVHUZL7.js → builder-REQJGZJP.js} +5 -5
  6. package/dist/{check-N3XNBPDH.js → check-UUWPPYC3.js} +47 -34
  7. package/dist/{chunk-7YSR636F.js → chunk-2JPVI45I.js} +4 -4
  8. package/dist/{chunk-SJ4DX2AD.js → chunk-4EU4X2ML.js} +3 -3
  9. package/dist/{chunk-MBZTX4V2.js → chunk-4XPAQXJF.js} +1 -1
  10. package/dist/{chunk-TGUWHA27.js → chunk-5FHNQST3.js} +3 -3
  11. package/dist/{chunk-YVY3IVYV.js → chunk-77F7NGAZ.js} +3 -3
  12. package/dist/{chunk-3YLHIXLR.js → chunk-7UD5ONVI.js} +2 -2
  13. package/dist/{chunk-IRF2FKB5.js → chunk-APSYTJ6I.js} +1 -1
  14. package/dist/{chunk-HMAYAMOQ.js → chunk-D7O7LA2O.js} +11 -11
  15. package/dist/{chunk-AM3GMWQK.js → chunk-F3EF56LQ.js} +1 -1
  16. package/dist/{chunk-4OKXGZM3.js → chunk-GPRIHEGQ.js} +6 -6
  17. package/dist/chunk-GYCKMZQJ.js +211 -0
  18. package/dist/{chunk-WHCDULC4.js → chunk-HDSDUTX4.js} +17 -1
  19. package/dist/{chunk-TKJISBV6.js → chunk-HIGJTX5U.js} +1 -1
  20. package/dist/{chunk-DBELICD6.js → chunk-IBG2ESJX.js} +5 -5
  21. package/dist/{chunk-PS3AHE6C.js → chunk-JCCUTTRI.js} +3 -3
  22. package/dist/{chunk-SOWXLIDN.js → chunk-KP6R7CV3.js} +1 -1
  23. package/dist/{chunk-EEZO2T24.js → chunk-KQLUUTLC.js} +28 -70
  24. package/dist/{chunk-DLY22KHX.js → chunk-NIS2PIS4.js} +2 -2
  25. package/dist/{chunk-5HZDPOJI.js → chunk-NJS7JJYN.js} +3 -3
  26. package/dist/{chunk-2ZMJFGOZ.js → chunk-P7BEZAEU.js} +7 -2
  27. package/dist/{chunk-MBVSVQVH.js → chunk-QQGZ5THT.js} +1 -1
  28. package/dist/{chunk-6CNNRO53.js → chunk-RJYKTWUP.js} +3 -3
  29. package/dist/{chunk-3F7RC3UA.js → chunk-RQGHHEM7.js} +3 -3
  30. package/dist/{chunk-3XUZPSBV.js → chunk-S4IJPYDV.js} +2 -2
  31. package/dist/{chunk-B7NT4YZ3.js → chunk-SNLMMLDD.js} +23 -19
  32. package/dist/{chunk-IRTZYDZO.js → chunk-T5TBGOT6.js} +1 -1
  33. package/dist/{chunk-QWJBTFAF.js → chunk-TZQIEUDE.js} +1 -1
  34. package/dist/{chunk-FTGJ3DPV.js → chunk-V36AOTBP.js} +72 -30
  35. package/dist/{chunk-ZNMVBHGJ.js → chunk-W4ICX5WW.js} +3 -3
  36. package/dist/{chunk-RJDJFRRY.js → chunk-WRW6QCI6.js} +1 -1
  37. package/dist/{chunk-4SE6GXQA.js → chunk-WWHWF3KZ.js} +5 -5
  38. package/dist/{chunk-44CGGHJF.js → chunk-X7UUIHGH.js} +1 -1
  39. package/dist/{chunk-I3WLYIIW.js → chunk-XAV6XCI2.js} +1 -1
  40. package/dist/{chunk-TN2XMMD7.js → chunk-XTNMIV77.js} +1 -1
  41. package/dist/{chunk-5VWKCY2E.js → chunk-XU5O5JCZ.js} +11 -11
  42. package/dist/{chunk-B5CQJBZ2.js → chunk-YQTQQTYK.js} +3 -3
  43. package/dist/{chunk-D3LS7E7U.js → chunk-YV7WULXQ.js} +1 -1
  44. package/dist/{chunk-U5DC57AF.js → chunk-Z7HAIZ6X.js} +3 -3
  45. package/dist/{chunk-VL3CF4DZ.js → chunk-ZBN4JGTJ.js} +1 -1
  46. package/dist/{chunk-IUV6MUQB.js → chunk-ZD7J35IX.js} +5 -5
  47. package/dist/{chunk-LJIFCG4G.js → chunk-ZZSQYOY5.js} +1 -1
  48. package/dist/{claude-launcher-ZDZQXW76.js → claude-launcher-IG7GKYIT.js} +1 -1
  49. package/dist/{cli-4464W6E6.js → cli-SOR7FKHH.js} +101 -101
  50. package/dist/{command-2MHSC5AE.js → command-BSKFMJEH.js} +23 -23
  51. package/dist/{config-VM6GKCCE.js → config-3JRFDYZL.js} +2 -2
  52. package/dist/{connect-cmd-U2DY4OZU.js → connect-cmd-SCAZ2RIS.js} +6 -6
  53. package/dist/{container-start-XMY3VOZB.js → container-start-6AZJQJCH.js} +22 -22
  54. package/dist/{control-plane-launch-2AC4BTWL.js → control-plane-launch-JCUNTTC3.js} +5 -5
  55. package/dist/{dist-IDP7Q53A.js → dist-BE3LYGNH.js} +1 -1
  56. package/dist/{docker-K442NGCS.js → docker-CVRCHNYC.js} +5 -5
  57. package/dist/{doctor-5K4UTAT3.js → doctor-XZ47GD4V.js} +47 -25
  58. package/dist/{emit-artifact-cmd-IK7GAS7V.js → emit-artifact-cmd-ADBJJDTU.js} +10 -10
  59. package/dist/{emit-criteria-cmd-TGBRMX3P.js → emit-criteria-cmd-ZGTK2YAR.js} +7 -7
  60. package/dist/{emit-finding-cmd-KXCNLJLK.js → emit-finding-cmd-VLUMTZV7.js} +8 -8
  61. package/dist/{emit-result-cmd-WJBLCVDL.js → emit-result-cmd-ZUH5P6OY.js} +10 -10
  62. package/dist/{emit-step-cmd-OYX5X65A.js → emit-step-cmd-J5APMMJ3.js} +8 -8
  63. package/dist/{exec-client-RMGGSTGR.js → exec-client-JLCFGCZT.js} +3 -3
  64. package/dist/{findings-cmd-HFDOB6AC.js → findings-cmd-A3N3MW2C.js} +8 -8
  65. package/dist/{fleet-readiness-5S2GCWZE.js → fleet-readiness-JEQ5ITV6.js} +5 -5
  66. package/dist/{governing-source-WM3WQ6J2.js → governing-source-QGWOWLCT.js} +10 -10
  67. package/dist/{guest-init-O7INUZWE.js → guest-init-BI7267TB.js} +4 -4
  68. package/dist/{hook-fast-A2N3PSXI.js → hook-fast-UFHR6EKZ.js} +1 -1
  69. package/dist/{host-key-HJ66C6MD.js → host-key-KAYMYRO3.js} +3 -3
  70. package/dist/{image-tag-LLXOFXKP.js → image-tag-OYT7UG7Y.js} +3 -3
  71. package/dist/index.js +4 -4
  72. package/dist/{init-IADOHXZR.js → init-G2GIATYO.js} +22 -22
  73. package/dist/{init-WEFM7P2Y.js → init-WAX2O5EW.js} +22 -22
  74. package/dist/{init-cmd-6UPRZDCC.js → init-cmd-RJCTCNUA.js} +11 -11
  75. package/dist/{init-update-RN2PZ3MT.js → init-update-N6UBQH2K.js} +9 -9
  76. package/dist/{install-GZ27NW6U.js → install-OIRIEOS7.js} +4 -4
  77. package/dist/{install-cmd-26OY23ZZ.js → install-cmd-IYWVR6WX.js} +5 -5
  78. package/dist/{logs-7O3ELY35.js → logs-C3RJ3ZTC.js} +2 -2
  79. package/dist/{loop-W2D5FHES.js → loop-PJBYILSU.js} +34 -34
  80. package/dist/{machine-NESBHOCL.js → machine-2P3V7SVW.js} +18 -18
  81. package/dist/{mcp-serve-cmd-AT7G6J5V.js → mcp-serve-cmd-PB4UOTGL.js} +4 -4
  82. package/dist/{paths-32THAYBB.js → paths-OK2EZS7W.js} +2 -2
  83. package/dist/{pending-6CMYQHFL.js → pending-RKVRYOTF.js} +3 -3
  84. package/dist/{pidfile-3BH6WPOA.js → pidfile-BMFAUQAI.js} +3 -3
  85. package/dist/{record-WHPJCC6Y.js → record-26AH6WDB.js} +3 -3
  86. package/dist/{runner-env-6Q45P3IE.js → runner-env-66RAFIDJ.js} +5 -5
  87. package/dist/{runner-identity-KH7HADNF.js → runner-identity-D3XUB36T.js} +5 -5
  88. package/dist/{runner-key-C4ZWPXYD.js → runner-key-JYVNUWAY.js} +22 -22
  89. package/dist/{session-sender-N4DOGRTN.js → session-sender-KD2MDPZ7.js} +11 -11
  90. package/dist/{spec-cmd-2ISEEZVA.js → spec-cmd-COQYDQES.js} +8 -8
  91. package/dist/{status-GDI44URF.js → status-C6IM56UC.js} +25 -25
  92. package/dist/{sync-cmd-E5VRZ5DK.js → sync-cmd-RXUKCJDG.js} +10 -10
  93. package/dist/{watch-P6XAYDM2.js → watch-F6ZWVYJ5.js} +10 -10
  94. package/dist/{work-claim-cmd-MFPUOWXL.js → work-claim-cmd-NNLX6KLD.js} +11 -11
  95. package/dist/{work-cmd-LXDWHKMQ.js → work-cmd-I37TTGHI.js} +8 -8
  96. package/dist/{work-comment-cmd-2HSY4JA7.js → work-comment-cmd-C7JGN64M.js} +8 -8
  97. package/dist/{work-logs-cmd-2MQR4JHN.js → work-logs-cmd-LL6BSU5H.js} +8 -8
  98. package/dist/{work-open-pr-cmd-QUJVL4TF.js → work-open-pr-cmd-K6KESE3Q.js} +9 -9
  99. package/dist/{work-pr-cmd-HOS5ZHJI.js → work-pr-cmd-TLIB4AJK.js} +8 -8
  100. package/dist/{work-stop-cmd-4J2NJ7KL.js → work-stop-cmd-CVFSGSZK.js} +8 -8
  101. package/package.json +1 -1
  102. package/skill-pack/maintained/outerlayer-build/SKILL.md +7 -4
  103. package/dist/chunk-ERXY3FXG.js +0 -116
@@ -1,18 +1,18 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { keepHandWritten, runAgentSetup } from './chunk-I3WLYIIW.js';
3
+ export { keepHandWritten, runAgentSetup } from './chunk-XAV6XCI2.js';
4
4
  import './chunk-XB7TRWI2.js';
5
5
  import './chunk-KT4CN6OU.js';
6
6
  import './chunk-XTKH5VAC.js';
7
7
  import './chunk-QDDPVBIS.js';
8
8
  import './chunk-ANPNT6PM.js';
9
- import './chunk-DLY22KHX.js';
9
+ import './chunk-NIS2PIS4.js';
10
10
  import './chunk-V6IYYQU3.js';
11
- import './chunk-AM3GMWQK.js';
11
+ import './chunk-F3EF56LQ.js';
12
12
  import './chunk-PJDQPF5N.js';
13
- import './chunk-IRF2FKB5.js';
14
- import './chunk-SOWXLIDN.js';
15
- import './chunk-WHCDULC4.js';
13
+ import './chunk-APSYTJ6I.js';
14
+ import './chunk-KP6R7CV3.js';
15
+ import './chunk-HDSDUTX4.js';
16
16
  import './chunk-ZJSNLVCE.js';
17
17
  import './chunk-BJ3KTMDH.js';
18
18
  import './chunk-AKKVPUGK.js';
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { BRIDGE_ADDRESS, BRIDGE_CIDR, CONTAINER_NO_PROXY, CONTAINER_PROXY, TUNNEL_PORT, dockerClientConfig, startBridgeForward, writeDockerClientConfig } from './chunk-TN2XMMD7.js';
4
- import './chunk-WHCDULC4.js';
3
+ export { BRIDGE_ADDRESS, BRIDGE_CIDR, CONTAINER_NO_PROXY, CONTAINER_PROXY, TUNNEL_PORT, dockerClientConfig, startBridgeForward, writeDockerClientConfig } from './chunk-XTNMIV77.js';
4
+ import './chunk-HDSDUTX4.js';
5
5
  import './chunk-XD4ZCMA4.js';
6
6
  import './chunk-MESOOLF4.js';
7
7
  import './chunk-Z5GEFMRW.js';
@@ -1,11 +1,11 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { buildRepositoryImage } from './chunk-U5DC57AF.js';
4
- import './chunk-IRTZYDZO.js';
3
+ export { buildRepositoryImage } from './chunk-Z7HAIZ6X.js';
4
+ import './chunk-T5TBGOT6.js';
5
5
  import './chunk-JBJTC3UU.js';
6
6
  export { RecipeError } from './chunk-SJZL5F3F.js';
7
- import './chunk-SOWXLIDN.js';
8
- import './chunk-WHCDULC4.js';
7
+ import './chunk-KP6R7CV3.js';
8
+ import './chunk-HDSDUTX4.js';
9
9
  import './chunk-XD4ZCMA4.js';
10
10
  import './chunk-MESOOLF4.js';
11
11
  import './chunk-Z5GEFMRW.js';
@@ -1 +1 @@
1
- {"id":"2026-10-20T11:57:23.004Z+c47cb0f","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-20T13:36:31.668Z+91a9738","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-7YSR636F.js';
3
+ export { MIN_BUILDX_VERSION, builderName, builderSpec, buildxState, ensureBuilder, ensureFailureCount, isOutOfMemory, proxyEnvironment, trackImageBuild } from './chunk-2JPVI45I.js';
4
4
  import './chunk-YJLHUKYS.js';
5
5
  import './chunk-SJZL5F3F.js';
6
- import './chunk-FTGJ3DPV.js';
7
- import './chunk-IRF2FKB5.js';
8
- import './chunk-SOWXLIDN.js';
9
- import './chunk-WHCDULC4.js';
6
+ import './chunk-V36AOTBP.js';
7
+ import './chunk-APSYTJ6I.js';
8
+ import './chunk-KP6R7CV3.js';
9
+ import './chunk-HDSDUTX4.js';
10
10
  import './chunk-IWFYKNAO.js';
11
11
  import './chunk-XD4ZCMA4.js';
12
12
  import './chunk-MESOOLF4.js';
@@ -1,60 +1,60 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-EEZO2T24.js';
4
- import './chunk-B7NT4YZ3.js';
3
+ import { probeCredentials } from './chunk-KQLUUTLC.js';
4
+ import './chunk-SNLMMLDD.js';
5
5
  import './chunk-3JVYMD4G.js';
6
6
  import './chunk-E7R2GIAW.js';
7
7
  import './chunk-6C5MZ7UG.js';
8
- import './chunk-QWJBTFAF.js';
8
+ import './chunk-TZQIEUDE.js';
9
9
  import './chunk-ZVB57WI6.js';
10
- import './chunk-44CGGHJF.js';
11
- import './chunk-6CNNRO53.js';
10
+ import './chunk-X7UUIHGH.js';
11
+ import './chunk-RJYKTWUP.js';
12
12
  import './chunk-I3LTIAOR.js';
13
- import './chunk-ZNMVBHGJ.js';
14
- import './chunk-DBELICD6.js';
15
- import './chunk-PS3AHE6C.js';
13
+ import './chunk-W4ICX5WW.js';
14
+ import './chunk-IBG2ESJX.js';
15
+ import './chunk-JCCUTTRI.js';
16
16
  import './chunk-ESVW4MJY.js';
17
- import './chunk-TN2XMMD7.js';
18
- import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-ERXY3FXG.js';
17
+ import './chunk-XTNMIV77.js';
18
+ import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, managedProblems, managedFactsOf, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-GYCKMZQJ.js';
19
19
  import './chunk-YYYRBYWG.js';
20
- import './chunk-LJIFCG4G.js';
20
+ import './chunk-ZZSQYOY5.js';
21
21
  import './chunk-TBT347UY.js';
22
- import './chunk-IUV6MUQB.js';
23
- import './chunk-3XUZPSBV.js';
24
- import './chunk-5VWKCY2E.js';
25
- import './chunk-MBVSVQVH.js';
26
- import './chunk-TKJISBV6.js';
27
- import './chunk-4SE6GXQA.js';
28
- import './chunk-D3LS7E7U.js';
22
+ import './chunk-ZD7J35IX.js';
23
+ import './chunk-S4IJPYDV.js';
24
+ import { probeHelper, HELPER_ENV, helperSocketPath } from './chunk-XU5O5JCZ.js';
25
+ import './chunk-QQGZ5THT.js';
26
+ import './chunk-HIGJTX5U.js';
27
+ import './chunk-WWHWF3KZ.js';
28
+ import './chunk-YV7WULXQ.js';
29
29
  import './chunk-TQMI335S.js';
30
- import './chunk-5HZDPOJI.js';
31
- import './chunk-3F7RC3UA.js';
32
- import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-2ZMJFGOZ.js';
30
+ import './chunk-NJS7JJYN.js';
31
+ import { DEFAULT_UNIT_NAME } from './chunk-RQGHHEM7.js';
32
+ import { loadRunnerConfig, RunnerConfigError, checkHooks } from './chunk-P7BEZAEU.js';
33
33
  import './chunk-UXYLWVTQ.js';
34
- import './chunk-U5DC57AF.js';
35
- import './chunk-IRTZYDZO.js';
34
+ import './chunk-Z7HAIZ6X.js';
35
+ import './chunk-T5TBGOT6.js';
36
36
  import './chunk-JBJTC3UU.js';
37
37
  import './chunk-OGFGZQA3.js';
38
- import './chunk-7YSR636F.js';
38
+ import './chunk-2JPVI45I.js';
39
39
  import './chunk-YJLHUKYS.js';
40
40
  import './chunk-SJZL5F3F.js';
41
- import './chunk-4OKXGZM3.js';
42
- import './chunk-SJ4DX2AD.js';
43
- import './chunk-3YLHIXLR.js';
41
+ import './chunk-GPRIHEGQ.js';
42
+ import './chunk-4EU4X2ML.js';
43
+ import './chunk-7UD5ONVI.js';
44
44
  import './chunk-HSUUTD4E.js';
45
- import './chunk-FTGJ3DPV.js';
45
+ import './chunk-V36AOTBP.js';
46
46
  import './chunk-QDDPVBIS.js';
47
47
  import './chunk-G2RRBBOX.js';
48
48
  import './chunk-G2JWZDFA.js';
49
49
  import './chunk-ANPNT6PM.js';
50
- import './chunk-DLY22KHX.js';
50
+ import './chunk-NIS2PIS4.js';
51
51
  import './chunk-V6IYYQU3.js';
52
- import './chunk-AM3GMWQK.js';
52
+ import './chunk-F3EF56LQ.js';
53
53
  import './chunk-PJDQPF5N.js';
54
- import './chunk-IRF2FKB5.js';
55
- import './chunk-SOWXLIDN.js';
56
- import { claudeEnvPath } from './chunk-WHCDULC4.js';
57
- import './chunk-RJDJFRRY.js';
54
+ import './chunk-APSYTJ6I.js';
55
+ import './chunk-KP6R7CV3.js';
56
+ import { claudeEnvPath } from './chunk-HDSDUTX4.js';
57
+ import './chunk-WRW6QCI6.js';
58
58
  import './chunk-ZJSNLVCE.js';
59
59
  import './chunk-2O5KA67H.js';
60
60
  import './chunk-BKO6JEZI.js';
@@ -106,6 +106,19 @@ async function runRunnerCheck(configPath, deps = {}) {
106
106
  if (modeProblems.length > 0) {
107
107
  return { ok: false, check: "permission mode", message: `${configPath}: ${permissionModeProblem(modeProblems)}` };
108
108
  }
109
+ if (config.managed === true) {
110
+ const files = [join(dirname(configPath), "runner.env"), claudeEnvPath(configPath)];
111
+ const env = {};
112
+ for (const path of files) {
113
+ const fromFile = readRunnerEnv(path);
114
+ if ("error" in fromFile) return { ok: false, check: "managed", message: `${configPath}: ${path} could not be read to look for a Claude credential: ${fromFile.error}` };
115
+ Object.assign(env, fromFile.env);
116
+ }
117
+ Object.assign(env, deps.env ?? process.env);
118
+ const asked = await (deps.helper ?? (() => probeHelper(env[HELPER_ENV] ?? helperSocketPath(DEFAULT_UNIT_NAME))))();
119
+ const unmet = managedProblems(managedFactsOf(config, { env, jailer: asked.ok ? "usable" : { problem: asked.detail } }))[0];
120
+ if (unmet !== void 0) return { ok: false, check: "managed", message: `${configPath}: ${unmet.reason}` };
121
+ }
109
122
  let credentialLine;
110
123
  if (needsClaudeCredential(config.hooks)) {
111
124
  const env = deps.env ?? process.env;
@@ -2,10 +2,10 @@
2
2
  import { createRequire } from 'node:module';
3
3
  import { parseSize } from './chunk-YJLHUKYS.js';
4
4
  import { RecipeError, BUILDKIT_IMAGE } from './chunk-SJZL5F3F.js';
5
- import { compareVersions } from './chunk-FTGJ3DPV.js';
6
- import { ensureHostKey } from './chunk-IRF2FKB5.js';
7
- import { RUNNER_DIR_MODE, RUNNER_FILE_MODE, runnerDir, jobsDir } from './chunk-SOWXLIDN.js';
8
- import { CLAUDE_PORT, JOB_MOUNT, GATEWAY_PORT, GATEWAY_SOCKET, CLAUDE_SOCKET, RELAY_PORT, DESTINATION_BASE_PORT } from './chunk-WHCDULC4.js';
5
+ import { compareVersions } from './chunk-V36AOTBP.js';
6
+ import { ensureHostKey } from './chunk-APSYTJ6I.js';
7
+ import { RUNNER_DIR_MODE, RUNNER_FILE_MODE, runnerDir, jobsDir } from './chunk-KP6R7CV3.js';
8
+ import { CLAUDE_PORT, JOB_MOUNT, GATEWAY_PORT, GATEWAY_SOCKET, CLAUDE_SOCKET, RELAY_PORT, DESTINATION_BASE_PORT } from './chunk-HDSDUTX4.js';
9
9
  import { JOIN_DIR, RELAY_ID, JOIN_SOCKET, TARGET_GATEWAY, TARGET_CLAUDE, destinationTarget, RELAY_USER } from './chunk-MESOOLF4.js';
10
10
  import { StringDecoder } from 'string_decoder';
11
11
  import { spawn } from 'child_process';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { fetchFactories, selectFactory, saveFactoryConnection, autoConnectedLine } from './chunk-3YLHIXLR.js';
4
- import { resolveRepoIdentity } from './chunk-FTGJ3DPV.js';
5
- import { resolveGatewayCredentials } from './chunk-AM3GMWQK.js';
3
+ import { fetchFactories, selectFactory, saveFactoryConnection, autoConnectedLine } from './chunk-7UD5ONVI.js';
4
+ import { resolveRepoIdentity } from './chunk-V36AOTBP.js';
5
+ import { resolveGatewayCredentials } from './chunk-F3EF56LQ.js';
6
6
  import { findGitDirs, readRepoConnection } from './chunk-BJ3KTMDH.js';
7
7
  import { cliInvocation } from './chunk-CRB3POP4.js';
8
8
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -2,7 +2,7 @@
2
2
  import { createRequire } from 'node:module';
3
3
  import { sanitizeTerminal } from './chunk-HSUUTD4E.js';
4
4
  import { isAgentsMdLayout } from './chunk-QDDPVBIS.js';
5
- import { resolveGatewayCredentials, defaultFetch } from './chunk-AM3GMWQK.js';
5
+ import { resolveGatewayCredentials, defaultFetch } from './chunk-F3EF56LQ.js';
6
6
  import { versionAtLeast } from './chunk-HCVLP7XA.js';
7
7
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
8
8
  import { machineSkillsState, staleClaudeSkills } from './chunk-UAFMC3PL.js';
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { autoConnect, detectActiveSession } from './chunk-SJ4DX2AD.js';
4
- import { resolveRepoIdentity } from './chunk-FTGJ3DPV.js';
3
+ import { autoConnect, detectActiveSession } from './chunk-4EU4X2ML.js';
4
+ import { resolveRepoIdentity } from './chunk-V36AOTBP.js';
5
5
  import { C } from './chunk-ANPNT6PM.js';
6
- import { defaultFetch, unauthorizedMessage, resolveGatewayCredentials } from './chunk-AM3GMWQK.js';
6
+ import { defaultFetch, unauthorizedMessage, resolveGatewayCredentials } from './chunk-F3EF56LQ.js';
7
7
  import { parseWorkItemEnv } from './chunk-T2Q7ISPE.js';
8
8
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
9
9
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { launcherPath, writeLauncher, LauncherWriteError, pathNotes } from './chunk-VL3CF4DZ.js';
4
- import { currentVersion, currentLink, isInLayout, packageRootIn, versionDir, switchCurrent, execStartLine } from './chunk-LJIFCG4G.js';
3
+ import { launcherPath, writeLauncher, LauncherWriteError, pathNotes } from './chunk-ZBN4JGTJ.js';
4
+ import { currentVersion, currentLink, isInLayout, packageRootIn, versionDir, switchCurrent, execStartLine } from './chunk-ZZSQYOY5.js';
5
5
  import { compareVersions } from './chunk-TQMI335S.js';
6
- import { RUNNER_DIR_MODE } from './chunk-SOWXLIDN.js';
6
+ import { RUNNER_DIR_MODE } from './chunk-KP6R7CV3.js';
7
7
  import { realpathSync, readFileSync, mkdirSync, rmSync, cpSync, existsSync } from 'fs';
8
8
  import { dirname, sep, join } from 'path';
9
9
 
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { sanitizeTerminal } from './chunk-HSUUTD4E.js';
4
- import { remoteLookupFailed } from './chunk-FTGJ3DPV.js';
4
+ import { remoteLookupFailed } from './chunk-V36AOTBP.js';
5
5
  import { isAgentsMdLayout } from './chunk-QDDPVBIS.js';
6
6
  import { DEFAULT_DASHBOARD } from './chunk-G2RRBBOX.js';
7
- import { cliFetch, resolveGatewayCredentials } from './chunk-AM3GMWQK.js';
7
+ import { cliFetch, resolveGatewayCredentials } from './chunk-F3EF56LQ.js';
8
8
  import { readCloudConfig } from './chunk-PJDQPF5N.js';
9
9
  import { writeRepoConnection, findGitDirs, readRepoConnection } from './chunk-BJ3KTMDH.js';
10
10
  import { cliInvocation } from './chunk-CRB3POP4.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { hostKeyPath, runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-SOWXLIDN.js';
3
+ import { hostKeyPath, runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-KP6R7CV3.js';
4
4
  import { generateKeyPairSync, createPrivateKey, createPublicKey, sign } from 'crypto';
5
5
  import { existsSync, mkdirSync, writeFileSync, readFileSync } from 'fs';
6
6
 
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { checkStarterFiles, contextIsGoverned } from './chunk-BCWVTWS7.js';
4
- import { fleetCheck, checkBuildSkill, checkMachineSkills, checkCommittedMaintainedSkills, checkMaintainedReferences } from './chunk-MBZTX4V2.js';
5
- import { resolveCredentials, getJson, WorkCommandError } from './chunk-4OKXGZM3.js';
6
- import { isLinkedRepository } from './chunk-3YLHIXLR.js';
4
+ import { fleetCheck, checkBuildSkill, checkMachineSkills, checkCommittedMaintainedSkills, checkMaintainedReferences } from './chunk-4XPAQXJF.js';
5
+ import { resolveCredentials, getJson, WorkCommandError } from './chunk-GPRIHEGQ.js';
6
+ import { isLinkedRepository } from './chunk-7UD5ONVI.js';
7
7
  import { sanitizeTerminal } from './chunk-HSUUTD4E.js';
8
- import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-FTGJ3DPV.js';
8
+ import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-V36AOTBP.js';
9
9
  import { C } from './chunk-ANPNT6PM.js';
10
10
  import { checkFormerSkillNames } from './chunk-V6IYYQU3.js';
11
- import { resolveGatewayCredentials, defaultFetch } from './chunk-AM3GMWQK.js';
12
- import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-RJDJFRRY.js';
11
+ import { resolveGatewayCredentials, defaultFetch } from './chunk-F3EF56LQ.js';
12
+ import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-WRW6QCI6.js';
13
13
  import { readStatuslineState, STATE_FRESH_MS } from './chunk-I7RZHMXW.js';
14
14
  import { hookCommandEscapesControlPlane, CONTROL_PLANE_DIR_VARIABLE } from './chunk-HCVLP7XA.js';
15
15
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
@@ -1190,7 +1190,7 @@ function doctorExitCode(checks) {
1190
1190
 
1191
1191
  // src/doctor-report.ts
1192
1192
  async function gatherDoctorChecks() {
1193
- const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-VM6GKCCE.js');
1193
+ const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-3JRFDYZL.js');
1194
1194
  const configPath = defaultRunnerConfigPath();
1195
1195
  const runnerHost = hasRunnerBlock(configPath);
1196
1196
  const hooks = (() => {
@@ -1211,7 +1211,7 @@ async function gatherDoctorChecks() {
1211
1211
  const { runnerVmCheck } = await import('./doctor-53F2PYY7.js');
1212
1212
  checks.push(runnerVmCheck(configPath, { lima: realLima(), home: homeFromEnv(), instance: runnerVm.instance }));
1213
1213
  } else if (hasRunnerBlock(configPath)) {
1214
- const { runnerHostChecks } = await import('./doctor-5K4UTAT3.js');
1214
+ const { runnerHostChecks } = await import('./doctor-XZ47GD4V.js');
1215
1215
  const gateway = (() => {
1216
1216
  try {
1217
1217
  const { url, apiKey, appId } = loadRunnerConfig(configPath);
@@ -1229,8 +1229,8 @@ async function gatherDoctorChecks() {
1229
1229
  })();
1230
1230
  const runner = (() => {
1231
1231
  try {
1232
- const { concurrency, build, housekeeping } = loadRunnerConfig(configPath);
1233
- return { concurrency, buildMemory: build?.memory ?? "8g", minFreeDisk: housekeeping?.minFreeDisk, allowHosts: build?.allowHosts };
1232
+ const { concurrency, build, housekeeping, managed } = loadRunnerConfig(configPath);
1233
+ return { concurrency, buildMemory: build?.memory ?? "8g", minFreeDisk: housekeeping?.minFreeDisk, allowHosts: build?.allowHosts, ...managed === true ? { managed } : {} };
1234
1234
  } catch {
1235
1235
  return void 0;
1236
1236
  }
@@ -1239,7 +1239,7 @@ async function gatherDoctorChecks() {
1239
1239
  const { existsSync: existsSync3 } = await import('fs');
1240
1240
  if (process.platform !== "linux" || !existsSync3("/run/systemd/system")) return void 0;
1241
1241
  const { inspectService, realInspectProbes } = await import('./inspect-L7JIBK3Y.js');
1242
- const { DEFAULT_UNIT_NAME } = await import('./install-GZ27NW6U.js');
1242
+ const { DEFAULT_UNIT_NAME } = await import('./install-OIRIEOS7.js');
1243
1243
  const { dirname: dirname2 } = await import('path');
1244
1244
  return inspectService(DEFAULT_UNIT_NAME, dirname2(configPath), realInspectProbes());
1245
1245
  })();
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { readCloudConfigStrict, readCloudConfig, cloudConfigPath } from './chunk-PJDQPF5N.js';
4
- import { signRunnerRequest, signerFor } from './chunk-IRF2FKB5.js';
4
+ import { signRunnerRequest, signerFor } from './chunk-APSYTJ6I.js';
5
5
  import { readRepoConnection, findGitDirs } from './chunk-BJ3KTMDH.js';
6
6
  import { PLAIN_VERSION, recordCliVersion, removeRecordedVersion } from './chunk-5BHIBJDA.js';
7
7
  import { resolvePackageVersion } from './chunk-RA3O54FC.js';
@@ -1,12 +1,12 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { detectActiveSession, autoConnect } from './chunk-SJ4DX2AD.js';
4
- import { workPageUrl } from './chunk-3YLHIXLR.js';
3
+ import { detectActiveSession, autoConnect } from './chunk-4EU4X2ML.js';
4
+ import { workPageUrl } from './chunk-7UD5ONVI.js';
5
5
  import { sanitizeTerminal } from './chunk-HSUUTD4E.js';
6
- import { resolveRepoIdentity } from './chunk-FTGJ3DPV.js';
6
+ import { resolveRepoIdentity } from './chunk-V36AOTBP.js';
7
7
  import { C } from './chunk-ANPNT6PM.js';
8
- import { resolveGatewayCredentials, unauthorizedMessage, defaultFetch } from './chunk-AM3GMWQK.js';
9
- import { signRunnerRequest } from './chunk-IRF2FKB5.js';
8
+ import { resolveGatewayCredentials, unauthorizedMessage, defaultFetch } from './chunk-F3EF56LQ.js';
9
+ import { signRunnerRequest } from './chunk-APSYTJ6I.js';
10
10
  import { readRepoConnection } from './chunk-BJ3KTMDH.js';
11
11
  import { parseTrackerNumber, trackerNumberError } from './chunk-WZBHBH3J.js';
12
12
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -441,7 +441,7 @@ async function runWorkLinkSession(opts) {
441
441
  return await linkSession(opts);
442
442
  } catch (err) {
443
443
  if (opts.logFailures) {
444
- const { logHookError } = await import('./hook-fast-A2N3PSXI.js');
444
+ const { logHookError } = await import('./hook-fast-UFHR6EKZ.js');
445
445
  const reason = err instanceof Error ? err.message : String(err);
446
446
  logHookError(opts.home ?? homeFromEnv(opts.env ?? process.env), new Error(`work link-session #${opts.number} failed: ${reason}`));
447
447
  }
@@ -0,0 +1,211 @@
1
+ #!/usr/bin/env node
2
+ import { createRequire } from 'node:module';
3
+ import { isPlaceholderCommand } from './chunk-ZD7J35IX.js';
4
+ import { describeCallFailure } from './chunk-WWHWF3KZ.js';
5
+ import { checkFit } from './chunk-RQGHHEM7.js';
6
+ import { builtinKind } from './chunk-P7BEZAEU.js';
7
+ import { WorkCommandError, getJson } from './chunk-GPRIHEGQ.js';
8
+ import { sanitizeTerminal } from './chunk-HSUUTD4E.js';
9
+ import { signerFor } from './chunk-APSYTJ6I.js';
10
+ import { CLAUDE_CREDENTIAL_VARIABLES, claudeCredential, claudeCredentialVariablesSet } from './chunk-HDSDUTX4.js';
11
+ import { closeSync, openSync, constants } from 'fs';
12
+ import { totalmem } from 'os';
13
+
14
+ createRequire(import.meta.url);
15
+
16
+ // src/runner/host-setup.ts
17
+ function placeholderQueues(config) {
18
+ return config.queues.filter((queue) => {
19
+ const command = config.commands[queue];
20
+ return command !== void 0 && isPlaceholderCommand(command);
21
+ });
22
+ }
23
+ function placeholderProblem(queues) {
24
+ const keys = queues.map((queue) => `runner.commands.${queue}`).join(", ");
25
+ return `${keys} ${queues.length === 1 ? "is" : "are"} still the placeholder \`runner init\` wrote, which fails every item. Edit ${queues.length === 1 ? "it" : "them"} to start your agent on item $OUTERLAYER_WORK`;
26
+ }
27
+ var CLAUDE_PERMISSION_MODES = ["acceptEdits", "auto", "bypassPermissions", "default", "dontAsk", "manual", "plan"];
28
+ var CLAUDE_COMMAND = /(?:^|[;&|(])\s*(?:(?:exec|env|nohup|time)\s+)*(?:[A-Za-z_][A-Za-z0-9_]*=\S*\s+)*(?:\S*\/)?claude\s/;
29
+ var PERMISSION_MODE_FLAG = /--permission-mode(?:=|\s+)(?:"([^"]*)"|'([^']*)'|([^\s;&|()]+))/g;
30
+ function permissionModeProblems(config) {
31
+ const problems = [];
32
+ for (const queue of config.queues) {
33
+ const command = config.commands[queue];
34
+ if (command === void 0 || !CLAUDE_COMMAND.test(command)) continue;
35
+ for (const match of command.matchAll(PERMISSION_MODE_FLAG)) {
36
+ const value = match[1] ?? match[2] ?? match[3] ?? "";
37
+ if (value.includes("$") || value.includes("`") || CLAUDE_PERMISSION_MODES.includes(value)) continue;
38
+ problems.push({ queue, command, value });
39
+ }
40
+ }
41
+ return problems;
42
+ }
43
+ function permissionModeProblem(problems) {
44
+ return problems.map(({ queue, command, value }) => `runner.commands.${queue} is \`${command}\`, and \`${value}\` is not a permission mode Claude Code accepts (${CLAUDE_PERMISSION_MODES.join(", ")}). The command would fail only when a build ran it`).join(". ");
45
+ }
46
+ var FORMER_AMEND_COMMAND = /(^|["'\s])\/amend(?=["'\s]|$)/g;
47
+ function currentSkillCommand(command) {
48
+ return command.replace(FORMER_AMEND_COMMAND, "$1/outerlayer-amend");
49
+ }
50
+ function formerSkillQueues(config) {
51
+ return config.queues.filter((queue) => {
52
+ const command = config.commands[queue];
53
+ return command !== void 0 && currentSkillCommand(command) !== command;
54
+ });
55
+ }
56
+ function formerSkillProblem(queues) {
57
+ const keys = queues.map((queue) => `runner.commands.${queue}`).join(", ");
58
+ return `${keys} ${queues.length === 1 ? "starts" : "start"} /amend, which is now /outerlayer-amend. The runner runs /outerlayer-amend in its place; edit the config to say so`;
59
+ }
60
+ function needsClaudeCredential(hooks) {
61
+ return builtinKind(hooks.provision) !== "own";
62
+ }
63
+ var CREDENTIAL_FIX = "Run `claude setup-token`, then pipe the token it prints (or an Anthropic API key) to `outerlayer runner init --agent claude`, which stores it in the claude.env beside the config. Or start the runner with CLAUDE_CODE_OAUTH_TOKEN (or ANTHROPIC_API_KEY) set";
64
+ function claudeCredentialCheck(env, options = {}) {
65
+ const name = "Claude credential";
66
+ if (options.service !== void 0) {
67
+ const { unit, variables } = options.service;
68
+ if (variables.length === 0) {
69
+ return {
70
+ name,
71
+ status: "fail",
72
+ detail: `the service ${unit} has no Claude credential: neither ${CLAUDE_CREDENTIAL_VARIABLES.slice(0, 2).join(" nor ")} is set in its claude.env or runner.env, so every build fails at provision as agent_credential_missing`,
73
+ fix: `${CREDENTIAL_FIX}, then restart the service: sudo systemctl restart ${unit}.`
74
+ };
75
+ }
76
+ return { name, status: "pass", detail: `${variables[0]} is set in the claude.env or runner.env of the service ${unit}` };
77
+ }
78
+ const held = claudeCredential(env, { ignoreHeld: options.ignoreHeld === true });
79
+ if (held === void 0) {
80
+ return {
81
+ name,
82
+ status: "fail",
83
+ detail: `neither ${CLAUDE_CREDENTIAL_VARIABLES.slice(0, 2).join(" nor ")} is set, so every build fails at provision as agent_credential_missing`,
84
+ fix: `${CREDENTIAL_FIX}.`
85
+ };
86
+ }
87
+ const sameVariables = options.shell === true ? "; the runner must be started with the same variable" : "";
88
+ return { name, status: "pass", detail: `${held.variable} is set${sameVariables}` };
89
+ }
90
+ function missingPermissionOf(err) {
91
+ if (!(err instanceof WorkCommandError) || err.status !== 403) return void 0;
92
+ const permission = /missing required permission '([^']+)'/i.exec(err.message)?.[1];
93
+ return permission === void 0 ? void 0 : sanitizeTerminal(permission);
94
+ }
95
+ function missingPermissionFix(permission) {
96
+ return `use a key that holds ${permission}: create one with the Runner preset on the factory's API keys page, then run \`outerlayer login\` with it`;
97
+ }
98
+ async function claimPermissionProblem(config, fetchImpl = fetch) {
99
+ const unverified = (what, err) => ({
100
+ status: "unverified",
101
+ reason: sanitizeTerminal(`${what}: ${err instanceof Error ? describeCallFailure(err) : String(err)}`)
102
+ });
103
+ let signer;
104
+ try {
105
+ signer = await signerFor(config.configPath);
106
+ } catch (err) {
107
+ return unverified("this host's key could not be read, so whether the runner key can claim work was not checked", err);
108
+ }
109
+ try {
110
+ await getJson(config.url, "/v1/runner/host-key", config.apiKey, config.appId, fetchImpl, signer);
111
+ return { status: "ok" };
112
+ } catch (err) {
113
+ const permission = missingPermissionOf(err);
114
+ if (permission === void 0) return unverified("the host-key call did not say whether the runner key can claim work", err);
115
+ return { status: "lacks", problem: `the runner key lacks ${permission}, which a runner needs to claim work: ${missingPermissionFix(permission)}` };
116
+ }
117
+ }
118
+ function openKvm() {
119
+ try {
120
+ closeSync(openSync("/dev/kvm", constants.O_RDWR));
121
+ return "usable";
122
+ } catch (err) {
123
+ return err.code === "ENOENT" ? "absent" : "no-permission";
124
+ }
125
+ }
126
+ function realBlockedProbes() {
127
+ return { env: process.env, kvm: openKvm, totalMemoryBytes: totalmem, imageBuilder: "unknown" };
128
+ }
129
+ var DEFAULT_BUILD_MEMORY = "8g";
130
+ function managedProblems(facts) {
131
+ const problems = [];
132
+ if (builtinKind(facts.provision) !== "vm") {
133
+ problems.push({
134
+ condition: "jailer",
135
+ reason: `a managed runner needs builtin:vm hooks, and runner.hooks.provision is ${facts.provision}. Without them builds would run without the jailer. Set runner.hooks.provision and runner.hooks.cleanup to builtin:vm`
136
+ });
137
+ } else if (facts.jailer === "usable") ; else if (facts.jailer === "unknown") {
138
+ problems.push({ condition: "jailer", reason: "the runner has not yet asked the root helper whether builds run under the jailer, so builds would run without the jailer until it answers" });
139
+ } else {
140
+ const { problem } = facts.jailer;
141
+ const advice = problem.includes("pins no helper") || problem.includes("runner install") ? "" : ". Run `outerlayer runner install --service --replace` to install the root helper, then restart the service";
142
+ problems.push({ condition: "jailer", reason: `builds would run without the jailer, which a managed runner does not allow: ${problem}${advice}` });
143
+ }
144
+ if (facts.credentials.has("CLAUDE_CODE_OAUTH_TOKEN")) {
145
+ problems.push({
146
+ condition: "credential",
147
+ reason: "CLAUDE_CODE_OAUTH_TOKEN is set in the runner's environment or credentials directory, and a managed runner accepts only ANTHROPIC_API_KEY. Remove CLAUDE_CODE_OAUTH_TOKEN from the claude.env and runner.env beside the config, store ANTHROPIC_API_KEY, then restart the service"
148
+ });
149
+ } else if (!facts.credentials.has("ANTHROPIC_API_KEY")) {
150
+ problems.push({
151
+ condition: "credential",
152
+ reason: "there is no Claude credential in the runner's environment, and a managed runner needs ANTHROPIC_API_KEY. Store ANTHROPIC_API_KEY with `outerlayer runner init --agent claude`, which writes the claude.env beside the config, then restart the service"
153
+ });
154
+ }
155
+ if (facts.allowHosts === void 0) {
156
+ problems.push({
157
+ condition: "allowHosts",
158
+ reason: "runner.build.allowHosts is not set, and a managed runner needs it so that a build reaches only the public hosts it lists. List the hosts your builds need; an empty list allows none"
159
+ });
160
+ }
161
+ return problems;
162
+ }
163
+ function managedFactsOf(config, probes) {
164
+ return {
165
+ provision: config.hooks.provision,
166
+ jailer: probes.jailer ?? "unknown",
167
+ credentials: claudeCredentialVariablesSet(probes.env),
168
+ allowHosts: config.build?.allowHosts
169
+ };
170
+ }
171
+ function checkBlocked(config, probes) {
172
+ const placeholders = placeholderQueues(config);
173
+ if (placeholders.length > 0) return { reason: `${placeholderProblem(placeholders)}. The runner takes work again once the config is edited` };
174
+ if (config.managed === true) {
175
+ const unmet = managedProblems(managedFactsOf(config, probes))[0];
176
+ if (unmet !== void 0) return { reason: unmet.reason };
177
+ }
178
+ const kind = builtinKind(config.hooks.provision);
179
+ if (kind === "container" || kind === "vm") {
180
+ const fit = checkFit({
181
+ concurrency: config.concurrency,
182
+ buildMemory: config.build?.memory ?? DEFAULT_BUILD_MEMORY,
183
+ usableBytes: probes.totalMemoryBytes()
184
+ });
185
+ if (!fit.fits) return { reason: `${fit.message}. Lower runner.concurrency or runner.build.memory` };
186
+ }
187
+ const kvm = kind === "vm" ? probes.kvm() : "usable";
188
+ if (kvm === "absent") {
189
+ return { reason: "/dev/kvm does not exist on this machine, so builtin:vm cannot start a microVM. Use a host with KVM enabled, or builtin:container hooks" };
190
+ }
191
+ if (kvm !== "usable") {
192
+ return {
193
+ reason: "the runner cannot open /dev/kvm, so builtin:vm cannot start a microVM. Add the runner's account to the kvm group, then restart the service, because a service reads its groups only when it starts"
194
+ };
195
+ }
196
+ if (kind === "container" || kind === "vm") {
197
+ const builder = probes.imageBuilder;
198
+ if (builder === "unknown") {
199
+ return { reason: "the runner is still preparing its image builder, the container that limits image builds to runner.build.memory, so it claims nothing yet" };
200
+ }
201
+ if (builder !== "usable") return { reason: `${builder.problem}. The runner takes work again once its image builder works` };
202
+ }
203
+ if (kind !== "own" && claudeCredential(probes.env) === void 0) {
204
+ return {
205
+ reason: "there is no Claude credential in the runner's environment. Store CLAUDE_CODE_OAUTH_TOKEN (from `claude setup-token`) or ANTHROPIC_API_KEY with `outerlayer runner init --agent claude`, which writes the claude.env beside the config, then restart the service"
206
+ };
207
+ }
208
+ return void 0;
209
+ }
210
+
211
+ export { checkBlocked, claimPermissionProblem, claudeCredentialCheck, currentSkillCommand, formerSkillProblem, formerSkillQueues, managedFactsOf, managedProblems, missingPermissionFix, missingPermissionOf, needsClaudeCredential, permissionModeProblem, permissionModeProblems, placeholderProblem, placeholderQueues, realBlockedProbes };
@@ -40,6 +40,22 @@ function readClaudeCredential(env) {
40
40
  return void 0;
41
41
  }
42
42
  }
43
+ function claudeCredentialVariablesSet(env, options = {}) {
44
+ const found = /* @__PURE__ */ new Set();
45
+ const add = (values) => {
46
+ for (const variable of FORWARDED) if ((values[variable] ?? "") !== "") found.add(variable);
47
+ };
48
+ add(env);
49
+ const directory = env.CREDENTIALS_DIRECTORY;
50
+ if (directory) {
51
+ try {
52
+ add(parseRunnerEnv(readFileSync(join(directory, CLAUDE_CREDENTIAL_ID), "utf8")));
53
+ } catch {
54
+ }
55
+ }
56
+ if (options.ignoreHeld !== true && held !== void 0) found.add(held.variable);
57
+ return found;
58
+ }
43
59
  var complained = /* @__PURE__ */ new Set();
44
60
  function complain(path, reason) {
45
61
  if (complained.has(path)) return;
@@ -756,4 +772,4 @@ function withTunnelRecord(environment, record, onlyWhenUsed = false) {
756
772
  };
757
773
  }
758
774
 
759
- export { AGENT_CREDENTIAL_MISSING, BUILD_HOME, BUILT_IN_NAMES, CHECKOUT_DIR, CHECK_ITEMS_FILE, CLAUDE_CREDENTIAL_ID, CLAUDE_CREDENTIAL_VARIABLES, CLAUDE_ENV_FILE, CLAUDE_PORT, CLAUDE_SOCKET, DESTINATION_BASE_PORT, EVAL_INPUT_DIR, FORWARDED_CLAUDE_CREDENTIAL_VARIABLES, GATEWAY_PORT, GATEWAY_SOCKET, JOB_MOUNT, PROXY_WARNING_FLAG, RELAY_PORT, authorEnvironment, buildEnvironment, builtInEnvironment, checkEnvironment, checkoutPath, claudeCredential, claudeEnvPath, commitIdentityRecord, containerLocalAddress, credentialLineIn, currentClaudeCredential, destinationEnvironment, headerVariables, heldClaudeCredential, isRefusedInConfig, isReservedVariable, lifecycleWorkdir, parseClaimIdentity, parseClaimedRepositories, parseIsolation, parseUnreachable, primaryOf, proxyEnvironment, readClaudeCredential, removedClaudeCredentialValues, repositoriesOf, repositoryPath, resolveDestinations, sharedUserEnvironment, startBuildServices, takeClaudeCredential, tokenHeader, withGitConfig, withHooksPath, withProxyWarningHidden, withTokenHeader, withTunnelRecord, withoutCredentialLines };
775
+ export { AGENT_CREDENTIAL_MISSING, BUILD_HOME, BUILT_IN_NAMES, CHECKOUT_DIR, CHECK_ITEMS_FILE, CLAUDE_CREDENTIAL_ID, CLAUDE_CREDENTIAL_VARIABLES, CLAUDE_ENV_FILE, CLAUDE_PORT, CLAUDE_SOCKET, DESTINATION_BASE_PORT, EVAL_INPUT_DIR, FORWARDED_CLAUDE_CREDENTIAL_VARIABLES, GATEWAY_PORT, GATEWAY_SOCKET, JOB_MOUNT, PROXY_WARNING_FLAG, RELAY_PORT, authorEnvironment, buildEnvironment, builtInEnvironment, checkEnvironment, checkoutPath, claudeCredential, claudeCredentialVariablesSet, claudeEnvPath, commitIdentityRecord, containerLocalAddress, credentialLineIn, currentClaudeCredential, destinationEnvironment, headerVariables, heldClaudeCredential, isRefusedInConfig, isReservedVariable, lifecycleWorkdir, parseClaimIdentity, parseClaimedRepositories, parseIsolation, parseUnreachable, primaryOf, proxyEnvironment, readClaudeCredential, removedClaudeCredentialValues, repositoriesOf, repositoryPath, resolveDestinations, sharedUserEnvironment, startBuildServices, takeClaudeCredential, tokenHeader, withGitConfig, withHooksPath, withProxyWarningHidden, withTokenHeader, withTunnelRecord, withoutCredentialLines };