@outerlayer/cli 0.18.0 → 0.19.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 (102) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +21 -2
  3. package/dist/{agent-setup-RBTEACYU.js → agent-setup-TPR4BBFV.js} +15 -16
  4. package/dist/{artifact-link-cmd-AVM2EKTV.js → artifact-link-cmd-W7XF5BFB.js} +2 -2
  5. package/dist/build-info.json +1 -1
  6. package/dist/{builder-DUI2ZH2H.js → builder-C4QNTYMS.js} +3 -3
  7. package/dist/{check-5C4YDZYV.js → check-UWQAL2MN.js} +44 -43
  8. package/dist/{chunk-S26M3YBJ.js → chunk-3UZTIRLF.js} +1 -1
  9. package/dist/{chunk-W5VPCONO.js → chunk-452TM7J4.js} +33 -227
  10. package/dist/{chunk-UYOYTKE2.js → chunk-5GHGAF6P.js} +3 -3
  11. package/dist/{chunk-QQM2UJ6T.js → chunk-5MYFOW5V.js} +182 -28
  12. package/dist/{chunk-Y5GE76XC.js → chunk-5TN7GLYX.js} +33 -81
  13. package/dist/{chunk-GOBOJMOJ.js → chunk-6D7GT22T.js} +4 -4
  14. package/dist/{chunk-3OFZM4X6.js → chunk-6U3MV7TZ.js} +151 -20
  15. package/dist/{chunk-F4XSVQJ4.js → chunk-6X4SQ5MY.js} +2 -2
  16. package/dist/{chunk-Y5MXET4M.js → chunk-7KSSBQTS.js} +11 -10
  17. package/dist/{chunk-JF42URPU.js → chunk-7SJPQWBM.js} +33 -9
  18. package/dist/{chunk-N3CUDFCW.js → chunk-7VUK5RFS.js} +15 -2
  19. package/dist/{chunk-SWCTGCSC.js → chunk-7YP7T6GV.js} +1 -1
  20. package/dist/{chunk-KDVIU23F.js → chunk-BWSUPRDK.js} +1 -1
  21. package/dist/{chunk-S76AYB4M.js → chunk-CG36IONK.js} +5 -5
  22. package/dist/chunk-CJJDJ7AT.js +56 -0
  23. package/dist/{chunk-FUB7LRUE.js → chunk-DADWEUH3.js} +5 -5
  24. package/dist/{chunk-RAZTWYZN.js → chunk-DJ3ZUSC3.js} +7 -8
  25. package/dist/{chunk-MQJSXHV7.js → chunk-G3IJ3N6F.js} +5 -3
  26. package/dist/{chunk-KK4VBOH6.js → chunk-HPJNLETG.js} +10 -11
  27. package/dist/{chunk-IP7BIBXJ.js → chunk-IF2OSI5T.js} +35 -1
  28. package/dist/{chunk-T4Y6SCG3.js → chunk-IXYZUUYQ.js} +2 -2
  29. package/dist/chunk-KYS3TQAG.js +296 -0
  30. package/dist/chunk-LLM3I5YU.js +89 -0
  31. package/dist/{chunk-B3UKB46N.js → chunk-LRG3ZMZD.js} +4 -5
  32. package/dist/{chunk-ULSIJGLS.js → chunk-NFIR3GEE.js} +56 -14
  33. package/dist/{chunk-MNTSH4CL.js → chunk-NNLA7LLQ.js} +1 -1
  34. package/dist/{chunk-WGAUY5LE.js → chunk-QEFKA2QD.js} +1 -1
  35. package/dist/{chunk-BMYGAGBJ.js → chunk-QNLX477Q.js} +155 -23
  36. package/dist/chunk-TUSYOL2O.js +113 -0
  37. package/dist/{chunk-ESC6UR76.js → chunk-TWF3RICI.js} +6 -6
  38. package/dist/{chunk-NL4XPC7W.js → chunk-UVG35MWF.js} +1 -1
  39. package/dist/{chunk-L2USZT6T.js → chunk-VMJPFQNE.js} +1 -1
  40. package/dist/chunk-VRRGENS4.js +144 -0
  41. package/dist/{chunk-X5N6KC6V.js → chunk-WFSUUUAN.js} +2 -3
  42. package/dist/{chunk-6CHIYEZZ.js → chunk-XSZD4AZ6.js} +9 -83
  43. package/dist/{chunk-LXAY4A2G.js → chunk-YQR6E6OV.js} +34 -49
  44. package/dist/{chunk-47TTLEDX.js → chunk-ZHAUSEEN.js} +35 -13
  45. package/dist/{claude-launcher-YVXI76NX.js → claude-launcher-FPPHZPMR.js} +20 -7
  46. package/dist/{cli-C77H54BV.js → cli-HROW5T7X.js} +203 -228
  47. package/dist/{command-H5CILO4S.js → command-OEAV7BVX.js} +29 -30
  48. package/dist/{config-FXDG4NPJ.js → config-CLSGABD5.js} +2 -2
  49. package/dist/{connect-cmd-ZW5FV3ZW.js → connect-cmd-UNYKGDAL.js} +7 -7
  50. package/dist/context-cleanup-HSVYDGMI.js +9 -0
  51. package/dist/control-plane-launch-NYVDJESK.js +216 -0
  52. package/dist/{dist-QTX4RSCL.js → dist-WO7NOJNG.js} +2 -2
  53. package/dist/{docker-RC3PRX3Q.js → docker-BFU3AQGY.js} +4 -4
  54. package/dist/{doctor-2NQQML6P.js → doctor-23BBJWBX.js} +32 -33
  55. package/dist/{emit-artifact-cmd-7MP63KXU.js → emit-artifact-cmd-O6SCM7TV.js} +17 -17
  56. package/dist/{emit-cmd-PPN4QQF2.js → emit-cmd-7SP3I6UZ.js} +6 -6
  57. package/dist/{emit-criteria-cmd-3RXPDLNK.js → emit-criteria-cmd-LQNERZRV.js} +11 -12
  58. package/dist/{emit-finding-cmd-OL7JB6H3.js → emit-finding-cmd-AJPKHIOV.js} +12 -13
  59. package/dist/{emit-result-cmd-UZVMOCF4.js → emit-result-cmd-RUICOKWQ.js} +17 -17
  60. package/dist/emit-step-cmd-347XNGPQ.js +26 -0
  61. package/dist/{governing-source-BUU4IABS.js → governing-source-V5EEGPTA.js} +21 -22
  62. package/dist/{hook-fast-W5MKHMJT.js → hook-fast-YAZG5MDX.js} +3 -3
  63. package/dist/{import-capture-cmd-ZO6KGHI2.js → import-capture-cmd-KKFFOGWP.js} +4 -4
  64. package/dist/{import-ruler-cmd-KJMWL5V6.js → import-ruler-cmd-5P6JOXQN.js} +2 -2
  65. package/dist/index.js +4 -4
  66. package/dist/{init-WNXXYMO7.js → init-LWHDMZQG.js} +30 -31
  67. package/dist/{init-VWXIZEAN.js → init-MOINY2DD.js} +30 -31
  68. package/dist/{init-cmd-WS6TIRYT.js → init-cmd-HSMRID6A.js} +67 -26
  69. package/dist/{init-update-E3J6TVIN.js → init-update-LWX5MPPR.js} +21 -22
  70. package/dist/{install-CBWIEF3R.js → install-4SEFIIW2.js} +3 -3
  71. package/dist/{login-browser-O63QZN7D.js → login-browser-DX35MARZ.js} +2 -2
  72. package/dist/{loop-UGI2BJOT.js → loop-SYYPVFYW.js} +44 -43
  73. package/dist/{machine-JOW4RNZ7.js → machine-6X63G2KH.js} +26 -27
  74. package/dist/{mcp-serve-cmd-DOTY5FKY.js → mcp-serve-cmd-N3UTY6EE.js} +5 -5
  75. package/dist/{runner-env-4NB2GA7O.js → runner-env-FRZFFHDF.js} +4 -4
  76. package/dist/{runner-key-TC3NFWFV.js → runner-key-276SJU5R.js} +30 -31
  77. package/dist/{session-sender-NNVPSPY7.js → session-sender-GGIY5OAX.js} +19 -15
  78. package/dist/shell-function-NRD4KVUK.js +6 -0
  79. package/dist/{spec-cmd-OWVTBB4J.js → spec-cmd-SIZBRN7D.js} +12 -13
  80. package/dist/{starter-pack-OPWUDOWX.js → starter-pack-6LQVLBIA.js} +5 -5
  81. package/dist/{status-TKCLLKFG.js → status-NAK6DYSF.js} +33 -32
  82. package/dist/{sync-cmd-Q6VYNPWG.js → sync-cmd-G7GF4UTW.js} +18 -14
  83. package/dist/{watch-ARAGADTF.js → watch-EVM5GSMP.js} +18 -14
  84. package/dist/{work-claim-cmd-34FERLYX.js → work-claim-cmd-3J3QW56U.js} +16 -17
  85. package/dist/{work-cmd-7S5B2H2P.js → work-cmd-5EPPD33Y.js} +12 -13
  86. package/dist/{work-comment-cmd-SZJSPM5S.js → work-comment-cmd-2ACOZQAE.js} +12 -13
  87. package/dist/work-logs-cmd-QDD2NMJL.js +60 -0
  88. package/dist/{work-open-pr-cmd-RPXKCBWS.js → work-open-pr-cmd-XNCEI4ZM.js} +13 -14
  89. package/dist/{work-pr-cmd-5LGANL32.js → work-pr-cmd-H4OQR26N.js} +12 -13
  90. package/package.json +2 -2
  91. package/skill-pack/maintained/outerlayer-cli/SKILL.md +9 -2
  92. package/skill-pack/maintained/outerlayer-cli/references/find-out-why-a-build-ended.md +76 -0
  93. package/skill-pack/shipped.json +1 -0
  94. package/skill-pack/template/build/references/release.md +3 -1
  95. package/dist/chunk-WBT5X3NH.js +0 -40
  96. package/dist/chunk-XCCLFVXM.js +0 -401
  97. package/dist/context-adopt-O5OFXMKI.js +0 -109
  98. package/dist/context-materialize-Y5IJ4MQT.js +0 -23
  99. package/dist/{chunk-NACDBXUG.js → chunk-BM63HB2M.js} +1 -1
  100. package/dist/{chunk-ZRL6HKBY.js → chunk-FVMYKL6L.js} +1 -1
  101. package/dist/{chunk-52NC2FIU.js → chunk-NTRCK4NH.js} +1 -1
  102. package/dist/{chunk-XGP3VYOG.js → chunk-P53VEAOF.js} +1 -1
@@ -1,24 +1,24 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
+ import { LEASE_SECONDS, releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, AttemptLogBook, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, ALREADY_RELEASED } from './chunk-6U3MV7TZ.js';
4
+ import { writePendingUpdate } from './chunk-MTP2QEVO.js';
5
+ import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-S5PCA3SN.js';
3
6
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
4
- import { compareVersions, satisfiesRange } from './chunk-I2UOAV7X.js';
5
7
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-YETTWTAY.js';
6
- import { LEASE_SECONDS, releaseLease, isUnfinished, setStage, jobEnv, runHook, describeHookEnd, provisionMicroVm, deliverCommitHooks, provisionProcess, provisionEnvironment, readProvisionOut, resolveHostBuild, workdirProblem, listenOnBroker, hostEnvironment, hostCommandEnvironment, execArgv, microVmCommandLine, runCommand, execCommandLine, startSender, startHostServices, finishJob, isGroupAlive, outcomeFromExitCode, isTimedOut, readCpuUsec, isIdle, stopOrphanedMicroVms, unfinishedJobs, listAdoptableJobs, retryFailedReleases, recoverLostJobs, hookLimitsFor, needsRenew, renewLease, RENEW_INTERVAL_SECONDS, ALREADY_RELEASED } from './chunk-3OFZM4X6.js';
7
8
  import { writeJobFile, readJobFile, readJobFileChecked } from './chunk-SADUQSO4.js';
8
- import { RUNNER_PROTOCOL } from './chunk-KDVIU23F.js';
9
- import { writePendingUpdate } from './chunk-MTP2QEVO.js';
10
- import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-S5PCA3SN.js';
11
- import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-FUB7LRUE.js';
12
- import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, cleanVersions, isInLayout, stagingDir } from './chunk-AMFWYESY.js';
9
+ import { compareVersions, satisfiesRange } from './chunk-I2UOAV7X.js';
10
+ import { RUNNER_PROTOCOL } from './chunk-BWSUPRDK.js';
11
+ import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-DADWEUH3.js';
13
12
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
13
+ import { writeMarker, readMarker, currentVersion, removeMarker, entryIn, versionDir, startedThroughCurrent, switchCurrent, cleanVersions, isInLayout, stagingDir } from './chunk-AMFWYESY.js';
14
14
  import { RepoFilter } from './chunk-TBT347UY.js';
15
- import { provisionContainer, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandLine, measureDisk, setUpRunnerCgroup, parseCpuList, ensureTunnel, keepGhConfigCurrent, createContainerRuntime } from './chunk-Y5MXET4M.js';
16
- import { spawnRun } from './chunk-L2USZT6T.js';
17
- import { builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, BUILD_LABEL, RUNNER_LABEL } from './chunk-S26M3YBJ.js';
18
- import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-6CHIYEZZ.js';
19
- import { checkFit } from './chunk-WGAUY5LE.js';
20
- import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-KK4VBOH6.js';
21
- import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-XGP3VYOG.js';
15
+ import { provisionContainer, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandLine, measureDisk, setUpRunnerCgroup, parseCpuList, ensureTunnel, keepGhConfigCurrent, createContainerRuntime } from './chunk-7KSSBQTS.js';
16
+ import { spawnRun } from './chunk-VMJPFQNE.js';
17
+ import { builderName, runnerLabelValue, ensureFailureCount, builderSpec, ensureBuilder, BUILD_LABEL, RUNNER_LABEL } from './chunk-3UZTIRLF.js';
18
+ import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-XSZD4AZ6.js';
19
+ import { checkFit } from './chunk-QEFKA2QD.js';
20
+ import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-HPJNLETG.js';
21
+ import { isBuiltinContainer, isBuiltinVm, isBuiltinProcess, loadRunnerConfig, checkHooks, builtinKind, DEFAULT_UPDATE_MAX_WAIT_HOURS } from './chunk-P53VEAOF.js';
22
22
  import { exceedsDisk } from './chunk-7RQ73DLO.js';
23
23
  import { claimPidFile, readPidFile, releasePidFile } from './chunk-ECODQ7II.js';
24
24
  import { startTimeOf, isSameProcess } from './chunk-JBJTC3UU.js';
@@ -26,11 +26,10 @@ import { resolveVersion } from './chunk-RA3O54FC.js';
26
26
  import { loadHostKey, ensureHostKey, signerFor } from './chunk-M2ZWWTWZ.js';
27
27
  import { RUNNER_DIR_MODE, runnerDir, buildDir, attemptStamp, jobDir, jobsDir, pidFilePath, spoolDir, RUNNER_FILE_MODE, rootfsDir } from './chunk-N2PXGQRL.js';
28
28
  import { parseClaimIdentity, parseClaimedRepositories, repositoriesOf, primaryOf, sharedUserEnvironment, JOB_MOUNT, claudeCredential } from './chunk-BQXFBI7T.js';
29
- import { HOOKS_DIR_NAME, writeCommitHooks } from './chunk-XCCLFVXM.js';
30
29
  import { randomBytes } from 'crypto';
31
- import { mkdirSync, existsSync, chmodSync, statSync, readdirSync, readFileSync, rmSync, renameSync, writeFileSync, closeSync, openSync, constants, lstatSync } from 'fs';
30
+ import { mkdirSync, existsSync, chmodSync, statSync, readdirSync, writeFileSync, readFileSync, rmSync, renameSync, closeSync, openSync, constants, lstatSync } from 'fs';
32
31
  import { join, dirname } from 'path';
33
- import { totalmem } from 'os';
32
+ import { totalmem, constants as constants$1 } from 'os';
34
33
 
35
34
  createRequire(import.meta.url);
36
35
  function openKvm() {
@@ -786,6 +785,145 @@ async function removeStaleRootDisks(root, unfinished, options) {
786
785
  }
787
786
  return freed;
788
787
  }
788
+ var HOOKS_DIR_NAME = "git-hooks";
789
+ var CO_AUTHOR_FILE = "co-author";
790
+ var HOOKS = [
791
+ "applypatch-msg",
792
+ "pre-applypatch",
793
+ "post-applypatch",
794
+ "pre-commit",
795
+ "pre-merge-commit",
796
+ "prepare-commit-msg",
797
+ "commit-msg",
798
+ "post-commit",
799
+ "pre-rebase",
800
+ "post-checkout",
801
+ "post-merge",
802
+ "pre-push",
803
+ "pre-receive",
804
+ "update",
805
+ "post-receive",
806
+ "post-update",
807
+ "reference-transaction",
808
+ "pre-auto-gc",
809
+ "post-rewrite",
810
+ "sendemail-validate",
811
+ "post-index-change"
812
+ ];
813
+ var READS_STDIN = /* @__PURE__ */ new Set(["pre-push", "pre-receive", "post-receive", "reference-transaction", "post-rewrite"]);
814
+ var ADD_TRAILER = `
815
+ # Every commit of the build names the requester once: a trailer already there is left alone.
816
+ file=\${1-}
817
+ if [ -n "$file" ] && [ -f "$file" ]; then
818
+ git interpret-trailers --in-place --if-exists addIfDifferent --trailer "Co-authored-by: $(cat "$here/${CO_AUTHOR_FILE}")" "$file" ||
819
+ echo "outerlayer: could not add the co-author line to the commit message" >&2
820
+ fi
821
+ `;
822
+ var HOOK_WRAPPER_MARKER = "# Written by the OuterLayer runner.";
823
+ function script(name) {
824
+ const adds = name === "prepare-commit-msg";
825
+ return `#!/bin/sh
826
+ ${HOOK_WRAPPER_MARKER} Runs the repository's own ${name} hook, then
827
+ # ${adds ? "adds the co-author line to the commit message" : "hands its status on"}.
828
+ here=$(dirname "$0")
829
+
830
+ # The hooks path git would use without this directory: cut the list of configuration
831
+ # entries the runner passes just before its own core.hooksPath entry, then ask git.
832
+ n=\${GIT_CONFIG_COUNT-0}
833
+ case $n in '' | *[!0-9]*) n=0 ;; esac
834
+ cut=$n
835
+ i=$n
836
+ while [ "$i" -gt 0 ]; do
837
+ i=$((i - 1))
838
+ eval "key=\\\${GIT_CONFIG_KEY_$i-}"
839
+ eval "value=\\\${GIT_CONFIG_VALUE_$i-}"
840
+ if [ "$key" = core.hooksPath ] && { [ "$value" = "$here" ] || [ "$value" -ef "$here" ]; }; then
841
+ cut=$i
842
+ break
843
+ fi
844
+ done
845
+ path=$(GIT_CONFIG_COUNT=$cut git config --type=path core.hooksPath 2>/dev/null) || path=
846
+ if [ -z "$path" ]; then
847
+ path=$(git rev-parse --git-common-dir 2>/dev/null)/hooks
848
+ fi
849
+
850
+ hook=$path/${name}
851
+ status=0
852
+ if [ "$path" -ef "$here" ] || [ ! -f "$hook" ] || [ ! -x "$hook" ]; then
853
+ ${READS_STDIN.has(name) ? " cat >/dev/null\n" : ""} :
854
+ else
855
+ ${adds ? ` "$hook" "$@" || status=$?` : ` exec "$hook" "$@"`}
856
+ fi
857
+ ${adds ? `[ "$status" -eq 0 ] || exit "$status"
858
+ ${ADD_TRAILER}` : ""}exit 0
859
+ `;
860
+ }
861
+ function writeCommitHooks(buildDir2, coAuthor) {
862
+ const dir = join(buildDir2, HOOKS_DIR_NAME);
863
+ mkdirSync(dir, { recursive: true });
864
+ chmodSync(dir, 493);
865
+ for (const name of HOOKS) {
866
+ const path = join(dir, name);
867
+ writeFileSync(path, script(name));
868
+ chmodSync(path, 493);
869
+ }
870
+ const data = join(dir, CO_AUTHOR_FILE);
871
+ writeFileSync(data, `${coAuthor.name} <${coAuthor.email}>
872
+ `);
873
+ chmodSync(data, 420);
874
+ return dir;
875
+ }
876
+ function linuxSignalName(number) {
877
+ const names = {
878
+ 1: "SIGHUP",
879
+ 2: "SIGINT",
880
+ 3: "SIGQUIT",
881
+ 4: "SIGILL",
882
+ 5: "SIGTRAP",
883
+ 6: "SIGABRT",
884
+ 7: "SIGBUS",
885
+ 8: "SIGFPE",
886
+ 9: "SIGKILL",
887
+ 10: "SIGUSR1",
888
+ 11: "SIGSEGV",
889
+ 12: "SIGUSR2",
890
+ 13: "SIGPIPE",
891
+ 14: "SIGALRM",
892
+ 15: "SIGTERM",
893
+ 16: "SIGSTKFLT",
894
+ 17: "SIGCHLD",
895
+ 18: "SIGCONT",
896
+ 19: "SIGSTOP",
897
+ 20: "SIGTSTP",
898
+ 21: "SIGTTIN",
899
+ 22: "SIGTTOU",
900
+ 23: "SIGURG",
901
+ 24: "SIGXCPU",
902
+ 25: "SIGXFSZ",
903
+ 26: "SIGVTALRM",
904
+ 27: "SIGPROF",
905
+ 28: "SIGWINCH",
906
+ 29: "SIGIO",
907
+ 30: "SIGPWR",
908
+ 31: "SIGSYS"
909
+ };
910
+ return names[number];
911
+ }
912
+ function hostSignalName(number) {
913
+ return Object.entries(constants$1.signals).find(([, value]) => value === number)?.[0];
914
+ }
915
+ function notEndedByRunnerReason(exit, isolated) {
916
+ if (exit.signal !== null) {
917
+ return `the command was killed by ${exit.signal} on the host; the runner did not end it`;
918
+ }
919
+ const number = exit.code - 128;
920
+ const name = isolated ? linuxSignalName(number) : hostSignalName(number);
921
+ if (name === void 0) return void 0;
922
+ return `the command exited ${exit.code}, the status of a process killed by ${name}; the runner did not end it`;
923
+ }
924
+ function jobNotEndedByRunnerReason(exit, job) {
925
+ return notEndedByRunnerReason(exit, job.container !== void 0 || job.microvm !== void 0);
926
+ }
789
927
 
790
928
  // src/runner/loop.ts
791
929
  var QUEUE_ORDER = ["amend", "implement"];
@@ -795,7 +933,12 @@ var TRACKER_REPOSITORY_HOSTS = {
795
933
  var HOUSEKEEPING_INTERVAL_MS = 36e5;
796
934
  function logOf(state) {
797
935
  state.deps.log ??= createRunnerLog(state.deps.now ?? (() => /* @__PURE__ */ new Date()));
798
- return state.deps.log;
936
+ state.attemptLog ??= attemptLogsOf(state).wrap(state.deps.log);
937
+ return state.attemptLog;
938
+ }
939
+ function attemptLogsOf(state) {
940
+ state.attemptLogs ??= new AttemptLogBook(state.deps.now);
941
+ return state.attemptLogs;
799
942
  }
800
943
  function nowOf(state) {
801
944
  return (state.deps.now ?? (() => /* @__PURE__ */ new Date()))();
@@ -811,6 +954,7 @@ function finishDepsOf(state) {
811
954
  now: state.deps.now,
812
955
  sleep: state.deps.sleep,
813
956
  log: logOf(state),
957
+ attemptLogs: attemptLogsOf(state),
814
958
  cliVersion: state.deps.cliVersion,
815
959
  // Any job that has a container needs the runtime to stop and remove it, including one a config change left behind.
816
960
  container: runtimeOf(state)
@@ -1319,7 +1463,7 @@ var CLAIM_REFUSAL_CODES = new Set(
1319
1463
  "pull_request_from_fork pull_request_on_default_branch pull_request_ambiguous pull_request_repository_not_connected branch_claimed_elsewhere".split(" ")
1320
1464
  );
1321
1465
  async function tryClaimAndStart(state, item, queue) {
1322
- const { postJson: postJson2 } = await import('./work-cmd-7S5B2H2P.js');
1466
+ const { postJson: postJson2 } = await import('./work-cmd-5EPPD33Y.js');
1323
1467
  const log = logOf(state);
1324
1468
  const hostKey = await loadHostKey(state.config.configPath);
1325
1469
  const claim = await retrySend(
@@ -1478,9 +1622,10 @@ async function startJob(state, item, queue, claimId, itemKey, branch, identity,
1478
1622
  ending: false
1479
1623
  };
1480
1624
  state.jobs.set(dirPath, active);
1481
- log.line(
1482
- `claimed ${queue} #${item.number} ${item.trackerKey} (claim ${shortClaim(claimId)}) \u2192 ${relativeToRunner(runnerRoot, dirPath)}`
1483
- );
1625
+ attemptLogsOf(state).open(item.number, dirPath);
1626
+ const claimLine = `claimed ${queue} #${item.number} ${item.trackerKey} (claim ${shortClaim(claimId)}) \u2192 ${relativeToRunner(runnerRoot, dirPath)}`;
1627
+ log.line(claimLine);
1628
+ attemptLogsOf(state).note(item.number, claimLine);
1484
1629
  const hookLimits = () => hookLimitsFor(state.config, startedAt.getTime(), state.deps.now);
1485
1630
  const tag = `#${item.number}`;
1486
1631
  const containerMode = isBuiltinContainer(state.config.hooks.provision);
@@ -1841,11 +1986,13 @@ async function startJob(state, item, queue, claimId, itemKey, branch, identity,
1841
1986
  const took = formatDuration(nowOf(state).getTime() - commandStartedMs);
1842
1987
  if (signal !== null) {
1843
1988
  log.error(`${tag} command killed by ${signal} (${took})`);
1989
+ active.job.commandEndReason = jobNotEndedByRunnerReason({ code: null, signal }, active.job);
1844
1990
  void endJob(state, active, "failed");
1845
1991
  return;
1846
1992
  }
1847
1993
  log.line(`${tag} command exited ${code ?? 0} (${took})`);
1848
1994
  if (code !== null) active.job.exitCode = code;
1995
+ active.job.commandEndReason = jobNotEndedByRunnerReason({ code, signal }, active.job);
1849
1996
  void endJob(state, active, code === 0 ? "ok" : "failed");
1850
1997
  });
1851
1998
  }
@@ -2079,7 +2226,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2079
2226
  const outcome = await onStartUnderMarker({
2080
2227
  configPath,
2081
2228
  own: ownVersionOf(deps),
2082
- check: update.check ? () => update.check(configPath) : async () => (await import('./check-5C4YDZYV.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
2229
+ check: update.check ? () => update.check(configPath) : async () => (await import('./check-UWQAL2MN.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
2083
2230
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
2084
2231
  log
2085
2232
  });
@@ -2117,9 +2264,11 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2117
2264
  return [];
2118
2265
  });
2119
2266
  for (const buildId of runningMicroVms) log.line(`stopped microVM build ${buildId}, left running by an earlier runner`);
2267
+ const attemptLogs = attemptLogsOf(state);
2120
2268
  for (const { dirPath, job } of listAdoptableJobs(jobsDir(configPath))) {
2121
2269
  const adopted = { job, dirPath, lastRenewAtMs: nowMs(), cmd: null, cpuSample: null, ending: false };
2122
2270
  state.jobs.set(dirPath, adopted);
2271
+ attemptLogs.open(job.item, dirPath);
2123
2272
  if (job.container !== void 0) {
2124
2273
  const cores = job.container.cpuset === void 0 ? void 0 : parseCpuList(job.container.cpuset);
2125
2274
  if (cores !== void 0) runtimeOf(state).cpus.hold(job.container.buildId, cores);
@@ -2131,18 +2280,20 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2131
2280
  keepGhConfigCurrent(
2132
2281
  tokens,
2133
2282
  job.container.buildDir,
2134
- (err) => log.error(`#${job.item} the read token could not be written for gh: ${describeCallFailure(err)}`)
2283
+ (err) => logOf(state).error(`#${job.item} the read token could not be written for gh: ${describeCallFailure(err)}`)
2135
2284
  );
2136
2285
  } catch (err) {
2137
- log.error(`#${job.item} could not give the adopted build a read token: ${describeCallFailure(err)}`);
2286
+ logOf(state).error(`#${job.item} could not give the adopted build a read token: ${describeCallFailure(err)}`);
2138
2287
  }
2139
2288
  }
2140
2289
  if (job.build !== void 0 && !runtimeOf(state).tunnels.has(job.build.buildId)) {
2141
2290
  await startHostServices({ runtime: runtimeOf(state), config, build: job.build, jobDir: dirPath, itemKey: job.itemKey, process: job.build.workDir !== void 0 }).catch((err) => {
2142
- log.error(`the tunnel of #${job.item} could not start again: ${describeCallFailure(err)}`);
2291
+ logOf(state).error(`the tunnel of #${job.item} could not start again: ${describeCallFailure(err)}`);
2143
2292
  });
2144
2293
  }
2145
- log.line(`adopted job ${job.queue} #${job.item} (claim ${shortClaim(job.claimId)}) \xB7 pid ${job.pid} still running`);
2294
+ const adoptedLine = `adopted job ${job.queue} #${job.item} (claim ${shortClaim(job.claimId)}) \xB7 pid ${job.pid} still running`;
2295
+ log.line(adoptedLine);
2296
+ attemptLogs.note(job.item, adoptedLine);
2146
2297
  }
2147
2298
  for (const { job, released } of await retryFailedReleases(jobsDir(configPath), config, {
2148
2299
  fetchImpl: deps.fetchImpl,
@@ -2182,7 +2333,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2182
2333
  } catch {
2183
2334
  }
2184
2335
  void watchTick(state, active, now, mtime).catch((err) => {
2185
- log.error(`#${active.job.item} health check failed: ${describeCallFailure(err)}`);
2336
+ logOf(state).error(`#${active.job.item} health check failed: ${describeCallFailure(err)}`);
2186
2337
  });
2187
2338
  }
2188
2339
  }, deps.watchIntervalMs ?? 3e4);
@@ -2229,6 +2380,9 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2229
2380
  let passes = 0;
2230
2381
  while (state.jobs.size > 0 && !exited) {
2231
2382
  onWaiting?.([...state.jobs.keys()]);
2383
+ for (const active of state.jobs.values()) {
2384
+ attemptLogs.noteChanged(active.job.item, "drain", `stopping: draining, waiting on #${active.job.item} (${active.job.stage ?? "starting"})`);
2385
+ }
2232
2386
  if (passes % DRAIN_LOG_EVERY_PASSES === 0) {
2233
2387
  log.line(
2234
2388
  `stopping: draining, waiting on ${[...state.jobs.values()].map((a) => describeWaiting(a, nowMs())).join(", ")}`
@@ -1,23 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { checkStarterFiles, contextIsGoverned } from './chunk-ESC6UR76.js';
4
- import { resolveCredentials, getJson, WorkCommandError } from './chunk-KK4VBOH6.js';
5
- import { isLinkedRepository } from './chunk-S76AYB4M.js';
6
- import { sanitizeTerminal } from './chunk-MQJSXHV7.js';
3
+ import { checkStarterFiles, contextIsGoverned } from './chunk-TWF3RICI.js';
4
+ import { resolveCredentials, getJson, WorkCommandError } from './chunk-HPJNLETG.js';
5
+ import { isLinkedRepository } from './chunk-CG36IONK.js';
6
+ import { sanitizeTerminal } from './chunk-G3IJ3N6F.js';
7
+ import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-NFIR3GEE.js';
7
8
  import { readStatuslineState, STATE_FRESH_MS } from './chunk-DSF2FWAZ.js';
8
- import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-BMYGAGBJ.js';
9
+ import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-QNLX477Q.js';
9
10
  import { C } from './chunk-ANPNT6PM.js';
10
11
  import { readSettings, settingsPath, isOurStatuslineSlot, statuslineWrappedOriginal, REGISTERED_EVENTS, isOurHookCommand, ourCommandBins, cliBinResolvable, ourDirectScriptBins, wrappedOriginalCommand } from './chunk-5QRP3MVS.js';
11
- import { readPin, readContextManifest, readDegraded, readSourceCache } from './chunk-LXAY4A2G.js';
12
- import { checkFormerSkillNames } from './chunk-T4Y6SCG3.js';
13
- import { defaultFetch } from './chunk-ZRL6HKBY.js';
14
- import { resolveGatewayCredentials } from './chunk-52NC2FIU.js';
15
- import { readCloudConfig } from './chunk-EABW6AJQ.js';
16
- import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-ULSIJGLS.js';
17
- import { hookCommandEscapesControlPlane, CONTROL_PLANE_DIR_VARIABLE } from './chunk-G2YNJIGF.js';
18
- import { deadHooksState, preparePackageManagerCommand, contextExcludesPresent } from './chunk-XCCLFVXM.js';
12
+ import { checkFormerSkillNames } from './chunk-IXYZUUYQ.js';
13
+ import { defaultFetch } from './chunk-FVMYKL6L.js';
14
+ import { resolveGatewayCredentials } from './chunk-NTRCK4NH.js';
19
15
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
16
+ import { hookCommandEscapesControlPlane, CONTROL_PLANE_DIR_VARIABLE } from './chunk-G2YNJIGF.js';
20
17
  import { cliInvocation } from './chunk-CRB3POP4.js';
18
+ import { readDeliveryRecord, readDegraded, readSourceCache } from './chunk-YQR6E6OV.js';
19
+ import { deadHooksState, preparePackageManagerCommand } from './chunk-TUSYOL2O.js';
21
20
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
22
21
  import { readFileSync, mkdirSync, writeFileSync, renameSync, existsSync, accessSync, constants, statSync, readdirSync, realpathSync } from 'fs';
23
22
  import { join, dirname, resolve, delimiter } from 'path';
@@ -194,7 +193,7 @@ function runDoctor(env = {}) {
194
193
  ...starter?.checks ?? [],
195
194
  ...laptop ? checkRenamedSkills(env.cwd) : [],
196
195
  ...starter !== void 0 && !starter.mcpOutdated ? checkMcpCommand(env.cwd, env.processEnv) : [],
197
- ...checkContextSource(home, env.cwd),
196
+ ...checkContextSource(env.cwd),
198
197
  ...checkGovernsList(env.cwd),
199
198
  ...checkControlPlaneHooks(env.cwd),
200
199
  ...checkInstalledCli(home, env.cwd ?? process.cwd())
@@ -202,7 +201,7 @@ function runDoctor(env = {}) {
202
201
  }
203
202
  function checkRenamedSkills(cwd) {
204
203
  const dirs = findGitDirs(cwd ?? process.cwd());
205
- if (dirs === void 0 || contextIsGoverned(dirs.repoRoot, dirs.gitCommonDir)) return [];
204
+ if (dirs === void 0 || contextIsGoverned(dirs.gitCommonDir)) return [];
206
205
  return checkFormerSkillNames(dirs.repoRoot);
207
206
  }
208
207
  function checkInstalledCli(home, cwd) {
@@ -670,17 +669,17 @@ function defaultClaudeInstalls() {
670
669
  function contextDegradedFix(kind) {
671
670
  switch (kind) {
672
671
  case "unreachable":
673
- return `Check network/VPN access to the control plane, then run \`${cliInvocation()} context materialize\`.`;
672
+ return `Check network/VPN access to the control plane, then start Claude Code with \`${cliInvocation()} claude\`.`;
674
673
  case "no-access":
675
674
  return "Check your git credentials (SSH key or token) and org/SSO access to the control plane, then retry.";
676
675
  case "designation-unverified":
677
- return `Check OuterLayer cloud connectivity/config (~/.outerlayer/config.json), then run \`${cliInvocation()} context materialize\`.`;
676
+ return `Check OuterLayer cloud connectivity/config (~/.outerlayer/config.json), then start Claude Code with \`${cliInvocation()} claude\`.`;
678
677
  case "not-governed":
679
- return "Expected after the control plane was removed, or after this repository stopped being linked to its factory. Otherwise link the repository to the factory and, in the factory's Settings, choose the control plane in the Repositories list with Use as control plane.";
678
+ return "A record from an earlier CLI. It is cleared the next time `outerlayer claude` asks which control plane governs this repository.";
680
679
  case "adoption-conflict":
681
- return `Remove the committed AGENTS.md/.claude/.outerlayer files in a commit, then run \`${cliInvocation()} context materialize\`.`;
680
+ return "A record from an earlier CLI. Committed AGENTS.md or .claude files no longer block the control plane, and the record is cleared the next time `outerlayer claude` asks which control plane governs this repository.";
682
681
  case "conflict":
683
- return `This record is stale: a gateway that stores the control plane never reports two. Run \`${cliInvocation()} context materialize\` again.`;
682
+ return `This record is stale: a gateway that stores the control plane never reports two. Start Claude Code with \`${cliInvocation()} claude\` to clear it.`;
684
683
  }
685
684
  }
686
685
  function checkGovernsList(cwd) {
@@ -756,16 +755,10 @@ function checkControlPlaneHooks(cwd) {
756
755
  }
757
756
  ];
758
757
  }
759
- function checkContextSource(home, cwd) {
758
+ function checkContextSource(cwd) {
760
759
  const dir = cwd ?? process.cwd();
761
- let repoRoot;
762
760
  let gitCommonDir;
763
761
  try {
764
- repoRoot = execFileSync("git", ["-C", dir, "rev-parse", "--show-toplevel"], {
765
- encoding: "utf8",
766
- stdio: ["ignore", "pipe", "ignore"],
767
- timeout: 2e3
768
- }).trim();
769
762
  gitCommonDir = execFileSync("git", ["-C", dir, "rev-parse", "--path-format=absolute", "--git-common-dir"], {
770
763
  encoding: "utf8",
771
764
  stdio: ["ignore", "pipe", "ignore"],
@@ -774,72 +767,31 @@ function checkContextSource(home, cwd) {
774
767
  } catch {
775
768
  return [];
776
769
  }
777
- if (!repoRoot || !gitCommonDir) return [];
778
- const pin = readPin(repoRoot);
779
- const manifest = readContextManifest(gitCommonDir);
770
+ if (!gitCommonDir) return [];
771
+ const delivery = readDeliveryRecord(gitCommonDir);
780
772
  const degraded = readDegraded(gitCommonDir);
781
- const sourceCache = readSourceCache(gitCommonDir);
782
- const looksGoverned = pin !== void 0 || sourceCache?.status === "governed";
783
- if (!pin && !manifest && !degraded && !looksGoverned) return [];
773
+ const governed = readSourceCache(gitCommonDir)?.status === "governed";
774
+ if (!governed && delivery === void 0 && !degraded) return [];
784
775
  const checks = [];
785
776
  const name = "Context source";
786
- if (pin && manifest && pin.sha !== manifest.sha) {
777
+ if (delivery !== void 0 && existsSync(delivery.dir)) {
778
+ checks.push({ name, status: degraded ? "warn" : "pass", detail: `control plane delivered at ${delivery.sha.slice(0, 7)}` });
779
+ } else if (governed) {
787
780
  checks.push({
788
781
  name,
789
782
  status: "warn",
790
- detail: `pin (${pin.sha.slice(0, 7)}) and manifest (${manifest.sha.slice(0, 7)}) disagree`,
791
- fix: `Run \`${cliInvocation()} context materialize\` to reconcile.`
783
+ detail: delivery === void 0 ? "a control plane governs this repository, and no copy of it has been delivered to this machine" : `the delivered control plane is no longer at ${delivery.dir}`,
784
+ fix: `Start Claude Code with \`${cliInvocation()} claude\`.`
792
785
  });
793
- } else if (pin ?? manifest) {
794
- const sha = (pin ?? manifest).sha;
795
- checks.push({ name, status: degraded ? "warn" : "pass", detail: `materialized at ${sha.slice(0, 7)}` });
796
786
  }
797
787
  if (degraded) {
798
788
  checks.push({
799
789
  name: "Context source degradation",
800
- status: degraded.kind === "adoption-conflict" || degraded.kind === "conflict" ? "fail" : "warn",
790
+ status: degraded.kind === "conflict" ? "fail" : "warn",
801
791
  detail: degraded.message,
802
792
  fix: contextDegradedFix(degraded.kind)
803
793
  });
804
794
  }
805
- if ((pin || manifest) && !contextExcludesPresent(gitCommonDir)) {
806
- checks.push({
807
- name: "Context exclude block",
808
- status: "warn",
809
- detail: "materialized paths are not excluded in .git/info/exclude",
810
- fix: `Run \`${cliInvocation()} context materialize\` to repair it.`
811
- });
812
- }
813
- if (pin && !readCloudConfig(home).url) {
814
- checks.push({
815
- name,
816
- status: "warn",
817
- detail: "a pin exists but OuterLayer cloud sync isn't configured \u2014 the designation cannot be confirmed",
818
- fix: `Run \`${cliInvocation()} login\` to connect.`
819
- });
820
- }
821
- if (looksGoverned) {
822
- let tracked = "";
823
- try {
824
- tracked = execFileSync("git", ["-C", repoRoot, "ls-files", "--", "AGENTS.md", ".claude", ".outerlayer"], {
825
- encoding: "utf8",
826
- stdio: ["ignore", "pipe", "ignore"],
827
- timeout: 2e3
828
- }).trim();
829
- } catch {
830
- tracked = "";
831
- }
832
- if (tracked) {
833
- const paths = tracked.split("\n");
834
- const sample = paths.slice(0, 3).join(", ") + (paths.length > 3 ? ", \u2026" : "");
835
- checks.push({
836
- name,
837
- status: "fail",
838
- detail: `committed context files shadow the control plane: ${sample}`,
839
- fix: `Remove the committed AGENTS.md/.claude/.outerlayer files in a commit, then run \`${cliInvocation()} context materialize\`.`
840
- });
841
- }
842
- }
843
795
  return checks;
844
796
  }
845
797
  var PROTECT_DEFAULT_BRANCH_DOCS = "https://docs.outerlayer.ai/github-app-and-build-tokens#protect-the-default-branch";
@@ -1217,7 +1169,7 @@ function doctorExitCode(checks) {
1217
1169
 
1218
1170
  // src/doctor-report.ts
1219
1171
  async function gatherDoctorChecks() {
1220
- const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-FXDG4NPJ.js');
1172
+ const { defaultRunnerConfigPath, hasRunnerBlock, loadRunnerConfig, runnerVmOf } = await import('./config-CLSGABD5.js');
1221
1173
  const configPath = defaultRunnerConfigPath();
1222
1174
  const checks = runDoctor({ runnerHost: hasRunnerBlock(configPath) });
1223
1175
  const credential = await credentialChecks();
@@ -1229,7 +1181,7 @@ async function gatherDoctorChecks() {
1229
1181
  const { runnerVmCheck } = await import('./doctor-53F2PYY7.js');
1230
1182
  checks.push(runnerVmCheck(configPath, { lima: realLima(), home: homeFromEnv(), instance: runnerVm.instance }));
1231
1183
  } else if (hasRunnerBlock(configPath)) {
1232
- const { runnerHostChecks } = await import('./doctor-2NQQML6P.js');
1184
+ const { runnerHostChecks } = await import('./doctor-23BBJWBX.js');
1233
1185
  const hooks = (() => {
1234
1186
  try {
1235
1187
  return loadRunnerConfig(configPath).hooks;
@@ -1264,7 +1216,7 @@ async function gatherDoctorChecks() {
1264
1216
  const { existsSync: existsSync3 } = await import('fs');
1265
1217
  if (process.platform !== "linux" || !existsSync3("/run/systemd/system")) return void 0;
1266
1218
  const { inspectService, realInspectProbes } = await import('./inspect-6UYAAXH7.js');
1267
- const { DEFAULT_UNIT_NAME } = await import('./install-CBWIEF3R.js');
1219
+ const { DEFAULT_UNIT_NAME } = await import('./install-4SEFIIW2.js');
1268
1220
  const { dirname: dirname2 } = await import('path');
1269
1221
  return inspectService(DEFAULT_UNIT_NAME, dirname2(configPath), realInspectProbes());
1270
1222
  })();
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-NL4XPC7W.js';
4
- import { MIN_ENGINE_MAJOR } from './chunk-Y5MXET4M.js';
5
- import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-SWCTGCSC.js';
6
- import { runnerCredentialProblem } from './chunk-XGP3VYOG.js';
3
+ import { hasStoredCredential, AGENT_COMMANDS, storeClaudeCredential, credentialFromStdin, isAgentName } from './chunk-7YP7T6GV.js';
4
+ import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-UVG35MWF.js';
5
+ import { MIN_ENGINE_MAJOR } from './chunk-7KSSBQTS.js';
6
+ import { runnerCredentialProblem } from './chunk-P53VEAOF.js';
7
7
  import { runnerDir, RUNNER_DIR_MODE, RUNNER_FILE_MODE } from './chunk-N2PXGQRL.js';
8
8
  import { existsSync, readFileSync, mkdirSync, writeFileSync } from 'fs';
9
9
  import { dirname } from 'path';