@outerlayer/cli 0.19.0 → 0.20.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 (63) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/README.md +11 -2
  3. package/dist/{agent-setup-TPR4BBFV.js → agent-setup-AM42SA2D.js} +6 -6
  4. package/dist/build-info.json +1 -1
  5. package/dist/{check-UWQAL2MN.js → check-BR5D27CX.js} +17 -17
  6. package/dist/{chunk-7KSSBQTS.js → chunk-3ZR7Y23Y.js} +2 -2
  7. package/dist/{chunk-ZHAUSEEN.js → chunk-5VML45HH.js} +2 -2
  8. package/dist/{chunk-5MYFOW5V.js → chunk-AD3EYI7P.js} +110 -19
  9. package/dist/{chunk-6U3MV7TZ.js → chunk-B6SCN5NY.js} +6 -6
  10. package/dist/{chunk-DJ3ZUSC3.js → chunk-CGGPS7SI.js} +3 -3
  11. package/dist/{chunk-452TM7J4.js → chunk-EAEELQVQ.js} +2 -2
  12. package/dist/{chunk-HPJNLETG.js → chunk-FBTGMSQF.js} +1 -1
  13. package/dist/{chunk-DADWEUH3.js → chunk-GEMQLBMW.js} +3 -3
  14. package/dist/{chunk-5TN7GLYX.js → chunk-HOKXGFDR.js} +4 -4
  15. package/dist/{chunk-5GHGAF6P.js → chunk-JHGEBPLE.js} +2 -2
  16. package/dist/{chunk-UVG35MWF.js → chunk-LW7G5TJB.js} +1 -1
  17. package/dist/{chunk-6D7GT22T.js → chunk-PIZRPNKR.js} +2 -2
  18. package/dist/{chunk-NFIR3GEE.js → chunk-PSN33ERW.js} +2 -2
  19. package/dist/{chunk-7SJPQWBM.js → chunk-R22NZSGA.js} +2 -2
  20. package/dist/{chunk-XSZD4AZ6.js → chunk-XZ4H4X5F.js} +2 -2
  21. package/dist/{chunk-VRRGENS4.js → chunk-Z7K3L4FC.js} +31 -1
  22. package/dist/{chunk-BWSUPRDK.js → chunk-ZX4I2MEK.js} +1 -1
  23. package/dist/{claude-launcher-FPPHZPMR.js → claude-launcher-J5M44PFS.js} +1 -1
  24. package/dist/{cli-HROW5T7X.js → cli-MKF7TU7X.js} +86 -56
  25. package/dist/{command-OEAV7BVX.js → command-ZQNEPDS6.js} +8 -8
  26. package/dist/connect-cmd-UNYKGDAL.js +1 -1
  27. package/dist/{context-cleanup-HSVYDGMI.js → context-cleanup-CHEWNYU6.js} +3 -1
  28. package/dist/{control-plane-launch-NYVDJESK.js → control-plane-launch-34LNRJWR.js} +5 -5
  29. package/dist/{doctor-23BBJWBX.js → doctor-DHUM5DBB.js} +10 -10
  30. package/dist/{emit-artifact-cmd-O6SCM7TV.js → emit-artifact-cmd-XBHM647X.js} +3 -3
  31. package/dist/{emit-cmd-7SP3I6UZ.js → emit-cmd-W55AEBCA.js} +3 -3
  32. package/dist/{emit-criteria-cmd-LQNERZRV.js → emit-criteria-cmd-UNMWHOUY.js} +40 -5
  33. package/dist/{emit-result-cmd-RUICOKWQ.js → emit-result-cmd-5NZMLCJK.js} +3 -3
  34. package/dist/emit-step-cmd-347XNGPQ.js +1 -1
  35. package/dist/{governing-source-V5EEGPTA.js → governing-source-HAA4OW57.js} +6 -6
  36. package/dist/{hook-fast-YAZG5MDX.js → hook-fast-RL5E5OXE.js} +1 -1
  37. package/dist/index.js +4 -4
  38. package/dist/{init-LWHDMZQG.js → init-V6FOMD2V.js} +9 -9
  39. package/dist/{init-MOINY2DD.js → init-XG47KCI4.js} +9 -9
  40. package/dist/{init-cmd-HSMRID6A.js → init-cmd-Z4O4PPLZ.js} +16 -14
  41. package/dist/{init-update-LWX5MPPR.js → init-update-7DVAKWW3.js} +6 -6
  42. package/dist/{loop-SYYPVFYW.js → loop-EAZQMAE2.js} +17 -17
  43. package/dist/{machine-6X63G2KH.js → machine-TRHBT5NE.js} +8 -8
  44. package/dist/{runner-key-276SJU5R.js → runner-key-5FOWCW7J.js} +9 -9
  45. package/dist/{session-sender-GGIY5OAX.js → session-sender-U2BBUWNO.js} +4 -4
  46. package/dist/{spec-cmd-SIZBRN7D.js → spec-cmd-FVLJOFGC.js} +2 -2
  47. package/dist/starter-pack-6LQVLBIA.js +1 -1
  48. package/dist/{status-NAK6DYSF.js → status-BINH7MBG.js} +11 -11
  49. package/dist/{sync-cmd-G7GF4UTW.js → sync-cmd-VXOUFS4I.js} +3 -3
  50. package/dist/{watch-EVM5GSMP.js → watch-OH645CV2.js} +3 -3
  51. package/dist/{work-claim-cmd-3J3QW56U.js → work-claim-cmd-DRQCHCOK.js} +5 -5
  52. package/dist/{work-cmd-5EPPD33Y.js → work-cmd-5I3J2XQQ.js} +2 -2
  53. package/dist/{work-comment-cmd-2ACOZQAE.js → work-comment-cmd-UCCPWUSR.js} +2 -2
  54. package/dist/{work-logs-cmd-QDD2NMJL.js → work-logs-cmd-7352CJPG.js} +2 -2
  55. package/dist/{work-open-pr-cmd-XNCEI4ZM.js → work-open-pr-cmd-LSH4VHJM.js} +2 -2
  56. package/dist/work-pr-cmd-H4OQR26N.js +1 -1
  57. package/dist/work-stop-cmd-CRDHXQVW.js +52 -0
  58. package/package.json +1 -1
  59. package/dist/{artifact-link-cmd-W7XF5BFB.js → artifact-link-cmd-OWRI5AJX.js} +1 -1
  60. package/dist/{chunk-IXYZUUYQ.js → chunk-7UWVLZXD.js} +1 -1
  61. package/dist/{emit-finding-cmd-AJPKHIOV.js → emit-finding-cmd-7JHVRYOP.js} +1 -1
  62. package/dist/{import-capture-cmd-KKFFOGWP.js → import-capture-cmd-TK4XY7RD.js} +1 -1
  63. package/dist/{import-ruler-cmd-5P6JOXQN.js → import-ruler-cmd-T6LLO6Q7.js} +1 -1
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @outerlayer/cli
2
2
 
3
+ ## 0.20.0
4
+
5
+ ### Minor Changes
6
+
7
+ - 89270e0: `outerlayer emit criteria` reads an acceptance file ending in `.md`, so a person can record or replace an item's criteria from the file a build committed.
8
+ - bf0bf30: `outerlayer work stop --item <n>` asks the host building an item to stop. The runner reports what it is doing, so an item can say why nothing is building it.
9
+
10
+ ## 0.19.1
11
+
12
+ ### Patch Changes
13
+
14
+ - 331130f: A session start that removes an earlier CLI's copies also puts back `.outerlayer-pin.json` when that CLI rewrote it, so `git status` is clean afterwards. A staged change to the pin is left alone.
15
+
16
+ `outerlayer init --local --shell-function` adds the `claude` shell function, and `--local --no-shell-function` removes it. `--local` used to skip both flags without a word.
17
+
3
18
  ## 0.19.0
4
19
 
5
20
  ### Minor Changes
package/README.md CHANGED
@@ -91,8 +91,10 @@ content:
91
91
  work item's general thread or a criterion thread — the detected session id
92
92
  rides along the same way it does for `emit`, only ever narrowing what the
93
93
  comment may do; `outerlayer work threads` reads them back. `outerlayer work logs`
94
- reads the runner's log for a host attempt. A runner key
95
- needs `git.read` and `work.read` to
94
+ reads the runner's log for a host attempt. `outerlayer work stop` sends
95
+ `POST /v1/work-items/<n>/claim/stop` with the optional note, and the
96
+ gateway records the request against the item's live host build. A runner
97
+ key needs `git.read` and `work.read` to
96
98
  list and read items, and `work.claim` to claim, renew or release — `work.claim`
97
99
  is not granted to a dashboard role by default, since a claim is a host's
98
100
  lease, not a person's.
@@ -118,6 +120,12 @@ content:
118
120
  off for want of disk it adds the free and needed bytes. While a check of
119
121
  its own stops it claiming, it adds one sentence saying why, which can
120
122
  include the host's usable memory and Docker's own error text, unscrubbed.
123
+ Every heartbeat also says what the runner is doing about new work (taking
124
+ work, draining, restarting, holding for an update, blocked or low on
125
+ disk), the queues and repository patterns it takes, and, while draining,
126
+ the numbers of the items it waits on. The reply can name a build that
127
+ someone stopped with `outerlayer work stop`; the runner then ends that
128
+ build and releases it as stopped, with the name of whoever stopped it.
121
129
  When a build's command exits 0, it reads that work item once more, for its
122
130
  evidence verdict, before releasing it: it sends nothing but the request.
123
131
  Just before that read, the runner runs the repository's host checks. A host
@@ -408,6 +416,7 @@ before it gives up.
408
416
  | `outerlayer emit artifact <file> --caption <text> [--for <criterion-id>] [--pr <n>]` | Upload a proof artifact — screenshot, recording, report, or log — with its caption. Inside a recorded session it spools locally and ships on the next `sync`; otherwise it uploads immediately, anchored to a pull request or the current checkout. `--replaces` retires artifacts an earlier run uploaded. A JUnit XML file bound with `--for` proves a criterion that declares `test` proof; `--test <name[=path:line]>` binds only the named tests. |
409
417
  | `outerlayer emit <name> --result <pass\|fail> [--link <url>] [--body <text>\|--body-file <path>] --item <number>` | Record one named check's outcome on a work item. A check that ran carries the run URL as its proof (`--link`); a judgment you are making yourself carries one sentence (`--body`, or `--body-file` to read it from a file — `-` reads standard input). A `fail` needs at least one of the two; a `pass` needs neither. `--item` names the work item by the number printed when the item was created — always required, in or out of a recorded session; a session records checks on its own item like any other, stored as the session's, but cannot clear a person's fail. Prints the recorded check's id. Who recorded it comes from your API key, never from what you send. |
410
418
  | `outerlayer work comment --item <n> [--criterion <id>] --body <text> [--artifact <id>] [--pass\|--fail\|--attach\|--ready]` | Post one comment on a work item's general thread, or on one acceptance criterion's own thread with `--criterion`. `--pass`/`--fail` need a person's own credential and apply to the whole item, so they work on the general thread only and the gateway refuses them with `--criterion`; `--attach` makes the named artifact that criterion's current proof; `--ready` hands a thread back to a person. The detected session id rides along automatically, only ever narrowing what the comment may do. |
419
+ | `outerlayer work stop --item <n> [--note <text>]` | Ask the host that holds the item's build to end it. The host reads the request at its next heartbeat and ends the build with outcome `stopped`, so the build may run a little longer. The item is not built again until a new build request. Needs `work.update`. Exits 1 when no host build is running for the item. |
411
420
  | `outerlayer work logs --item <n> [--attempt <claim id>]` | Print the runner's log for a host attempt on a work item: the newest attempt a runner made, or the one `--attempt` names (an `id` from `claims` in `work status --json`). The log is what the runner did around the agent, with secrets removed on the host. Exits 1 for an attempt that is still running or that an older runner released without a log. |
412
421
  | `outerlayer work threads --item <n>` | Read a work item's threads back — the general thread first, then one per criterion with proof or a comment, each with its `waitingOn`. |
413
422
  | `outerlayer emit finding --id <id> --category <context\|flaky-test\|tooling\|environment\|defect\|other> --title <text> --file <path> --where <label> [--line <n>] [--item <number>] [--cause <text>] [--detail <text>] [--suggestion <text>] [--command <text>] [--error <text>] [--test <name>] [--symbol <name>] [--started-at <event> --ended-at <event>] [--problem <id> … --link-reason <text> \| --new] …` | Record one problem you hit in the factory. `--category` is one of `context` (an instruction that is wrong, broken or missing), `flaky-test`, `tooling`, `environment`, `defect` (a bug outside your own change) or `other`. A `context` finding also needs `--rule-path` and `--rule-relation` (`wrong`, `broken` or `missing`), and `--rule-quote` unless the relation is `missing`. `--cause`, `--detail`, `--suggestion`, `--command`, `--error` (the first error line), `--test` and `--symbol` carry what a fix needs. Every finding joins a factory-level problem: when a key of the finding matches a known problem it joins that problem; otherwise nothing is stored, the closest problems are printed, and the command exits with code 3. Run it again with `--problem <id> --link-reason <text>` (repeat `--problem` for each problem the finding reports) or with `--new`. Without `--started-at`, it prints the session's recent events with ids and times; name the event where you hit the problem and the one where you got past it with `--started-at` and `--ended-at`. Findings are informational; nothing reads one to pass or fail the work. `--item` names the work item; without it, inside a recorded session, the item that session was launched for is used automatically. Re-emitting the same `--id` on the item replaces that finding and keeps its problems. |
@@ -1,22 +1,22 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- export { keepHandWritten, runAgentSetup } from './chunk-DJ3ZUSC3.js';
4
- import './chunk-ZHAUSEEN.js';
3
+ export { keepHandWritten, runAgentSetup } from './chunk-CGGPS7SI.js';
4
+ import './chunk-5VML45HH.js';
5
5
  import './chunk-YVZJ6GKF.js';
6
6
  import './chunk-6X4SQ5MY.js';
7
7
  import './chunk-ANPNT6PM.js';
8
- import './chunk-452TM7J4.js';
9
- import './chunk-IXYZUUYQ.js';
8
+ import './chunk-EAEELQVQ.js';
9
+ import './chunk-7UWVLZXD.js';
10
10
  import './chunk-FVMYKL6L.js';
11
11
  import './chunk-NTRCK4NH.js';
12
12
  import './chunk-ZJSNLVCE.js';
13
13
  import './chunk-BJ3KTMDH.js';
14
14
  import './chunk-NNLA7LLQ.js';
15
- import './chunk-WFSUUUAN.js';
16
- import './chunk-7VUK5RFS.js';
17
15
  import './chunk-EABW6AJQ.js';
18
16
  import './chunk-CRB3POP4.js';
19
17
  import './chunk-YQR6E6OV.js';
18
+ import './chunk-WFSUUUAN.js';
19
+ import './chunk-7VUK5RFS.js';
20
20
  import './chunk-VNVZDWO3.js';
21
21
  import './chunk-RA3O54FC.js';
22
22
  import './chunk-M2ZWWTWZ.js';
@@ -1 +1 @@
1
- {"id":"2026-10-13T19:11:37.037Z+109c2bd","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
1
+ {"id":"2026-10-14T00:32:09.011Z+25b1e13","root":"/home/runner/_work/outerlayer/outerlayer","pkg":"outerlayer"}
@@ -1,36 +1,36 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { probeCredentials } from './chunk-5MYFOW5V.js';
4
- import './chunk-6U3MV7TZ.js';
3
+ import { probeCredentials } from './chunk-AD3EYI7P.js';
4
+ import './chunk-B6SCN5NY.js';
5
+ import './chunk-SADUQSO4.js';
5
6
  import './chunk-MTP2QEVO.js';
6
7
  import './chunk-S5PCA3SN.js';
7
8
  import './chunk-3JVYMD4G.js';
8
9
  import './chunk-YETTWTAY.js';
9
- import './chunk-SADUQSO4.js';
10
10
  import './chunk-I2UOAV7X.js';
11
- import './chunk-BWSUPRDK.js';
12
- import './chunk-5GHGAF6P.js';
11
+ import './chunk-ZX4I2MEK.js';
12
+ import './chunk-JHGEBPLE.js';
13
13
  import './chunk-XNGMQ27R.js';
14
- import './chunk-7SJPQWBM.js';
14
+ import './chunk-R22NZSGA.js';
15
15
  import './chunk-KYS3TQAG.js';
16
16
  import './chunk-ESVW4MJY.js';
17
- import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-DADWEUH3.js';
17
+ import { placeholderQueues, placeholderProblem, permissionModeProblems, permissionModeProblem, needsClaudeCredential, claudeCredentialCheck, claimPermissionProblem, formerSkillQueues, formerSkillProblem } from './chunk-GEMQLBMW.js';
18
18
  import './chunk-YYYRBYWG.js';
19
19
  import './chunk-AMFWYESY.js';
20
20
  import './chunk-TBT347UY.js';
21
- import './chunk-6D7GT22T.js';
21
+ import './chunk-PIZRPNKR.js';
22
22
  import './chunk-7YP7T6GV.js';
23
- import './chunk-UVG35MWF.js';
24
- import './chunk-7KSSBQTS.js';
23
+ import './chunk-LW7G5TJB.js';
24
+ import './chunk-3ZR7Y23Y.js';
25
25
  import './chunk-OGFGZQA3.js';
26
26
  import './chunk-VMJPFQNE.js';
27
27
  import './chunk-3UZTIRLF.js';
28
28
  import './chunk-GGOMT6KF.js';
29
29
  import './chunk-X5H2WYMB.js';
30
- import './chunk-XSZD4AZ6.js';
30
+ import './chunk-XZ4H4X5F.js';
31
31
  import './chunk-QEFKA2QD.js';
32
32
  import { parseRunnerEnv } from './chunk-6MZSX4M7.js';
33
- import './chunk-HPJNLETG.js';
33
+ import './chunk-FBTGMSQF.js';
34
34
  import './chunk-IF2OSI5T.js';
35
35
  import './chunk-CG36IONK.js';
36
36
  import './chunk-G3IJ3N6F.js';
@@ -43,7 +43,7 @@ import './chunk-QOZKPLVJ.js';
43
43
  import './chunk-CX22S5BA.js';
44
44
  import './chunk-ECODQ7II.js';
45
45
  import './chunk-JBJTC3UU.js';
46
- import './chunk-NFIR3GEE.js';
46
+ import './chunk-PSN33ERW.js';
47
47
  import './chunk-F7CU5ABH.js';
48
48
  import './chunk-BKO6JEZI.js';
49
49
  import './chunk-QNLX477Q.js';
@@ -53,20 +53,20 @@ import './chunk-T2Q7ISPE.js';
53
53
  import './chunk-WZBHBH3J.js';
54
54
  import './chunk-5QRP3MVS.js';
55
55
  import './chunk-LLM3I5YU.js';
56
- import './chunk-452TM7J4.js';
57
- import './chunk-IXYZUUYQ.js';
56
+ import './chunk-EAEELQVQ.js';
57
+ import './chunk-7UWVLZXD.js';
58
58
  import './chunk-FVMYKL6L.js';
59
59
  import './chunk-NTRCK4NH.js';
60
60
  import './chunk-ZJSNLVCE.js';
61
61
  import './chunk-BJ3KTMDH.js';
62
62
  import './chunk-G2YNJIGF.js';
63
63
  import './chunk-NNLA7LLQ.js';
64
- import './chunk-WFSUUUAN.js';
65
- import './chunk-7VUK5RFS.js';
66
64
  import './chunk-EABW6AJQ.js';
67
65
  import './chunk-CRB3POP4.js';
68
66
  import './chunk-YQR6E6OV.js';
69
67
  import './chunk-TUSYOL2O.js';
68
+ import './chunk-WFSUUUAN.js';
69
+ import './chunk-7VUK5RFS.js';
70
70
  import './chunk-VNVZDWO3.js';
71
71
  import './chunk-RA3O54FC.js';
72
72
  import './chunk-M2ZWWTWZ.js';
@@ -5,8 +5,8 @@ import { createDockerHost, childEnvironment, spawnRun } from './chunk-VMJPFQNE.j
5
5
  import { builderSpec, runnerLabelValue, RUNNER_LABEL, BUILD_LABEL, prepareRunArgs, containerRunArgs, HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, containerExecArgs, JUDGE_DIR, MAX_REPORT_BYTES } from './chunk-3UZTIRLF.js';
6
6
  import { execCapture } from './chunk-GGOMT6KF.js';
7
7
  import { GUEST_CID } from './chunk-X5H2WYMB.js';
8
- import { describeCallFailure, controlPlaneTokenFailure, refusalCode, resolveGoverningSource, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, shimScript } from './chunk-XSZD4AZ6.js';
9
- import { WorkCommandError } from './chunk-HPJNLETG.js';
8
+ import { describeCallFailure, controlPlaneTokenFailure, refusalCode, resolveGoverningSource, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, shimScript } from './chunk-XZ4H4X5F.js';
9
+ import { WorkCommandError } from './chunk-FBTGMSQF.js';
10
10
  import { hostAllowed } from './chunk-UXYLWVTQ.js';
11
11
  import { parseDuKilobytes } from './chunk-7RQ73DLO.js';
12
12
  import { readDefaultBranchHead, cloneRepository, buildRepositoryImage } from './chunk-3CWUOFV6.js';
@@ -1,10 +1,10 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { C } from './chunk-ANPNT6PM.js';
4
- import { retiredSkillPaths, removeRetiredSkills } from './chunk-IXYZUUYQ.js';
4
+ import { retiredSkillPaths, removeRetiredSkills } from './chunk-7UWVLZXD.js';
5
5
  import { maintainedFilesForExistingSkills, loadMaintainedFiles, writeMaintainedFiles } from './chunk-NNLA7LLQ.js';
6
- import { emitTree, parseOuterlayerConfig, classifyTree, generatedHeaderSource, CONTEXT_PIN_FILENAME, normalizePath } from './chunk-WFSUUUAN.js';
7
6
  import { cliInvocation } from './chunk-CRB3POP4.js';
7
+ import { emitTree, parseOuterlayerConfig, classifyTree, generatedHeaderSource, CONTEXT_PIN_FILENAME, normalizePath } from './chunk-WFSUUUAN.js';
8
8
  import { existsSync, readFileSync, mkdirSync, writeFileSync, copyFileSync, unlinkSync, rmdirSync, readdirSync } from 'fs';
9
9
  import { join, dirname, relative, sep } from 'path';
10
10
 
@@ -1,23 +1,23 @@
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';
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-B6SCN5NY.js';
4
+ import { writeJobFile, readJobFile, readJobFileChecked } from './chunk-SADUQSO4.js';
4
5
  import { writePendingUpdate } from './chunk-MTP2QEVO.js';
5
6
  import { readHousekeepingRecord, writeHousekeepingRecord } from './chunk-S5PCA3SN.js';
6
7
  import { decideInstalledSwitch } from './chunk-3JVYMD4G.js';
7
8
  import { fetchVersionMeta, npmVersion, npmSupportsProvenance, fetchTarballDigest, fetchProvenance, installVersion, auditSignatures } from './chunk-YETTWTAY.js';
8
- import { writeJobFile, readJobFile, readJobFileChecked } from './chunk-SADUQSO4.js';
9
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';
10
+ import { RUNNER_PROTOCOL } from './chunk-ZX4I2MEK.js';
11
+ import { currentSkillCommand, formerSkillProblem, placeholderQueues, placeholderProblem } from './chunk-GEMQLBMW.js';
12
12
  import { freeBytes, formatBytes } from './chunk-YYYRBYWG.js';
13
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-7KSSBQTS.js';
15
+ import { provisionContainer, lifecycleSteps, lifecycleFailureReason, prepareBranch, containerCommandLine, measureDisk, setUpRunnerCgroup, parseCpuList, ensureTunnel, keepGhConfigCurrent, createContainerRuntime } from './chunk-3ZR7Y23Y.js';
16
16
  import { spawnRun } from './chunk-VMJPFQNE.js';
17
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';
18
+ import { describeCallFailure, retrySend, shortClaim, relativeToRunner, formatDuration, BuildTokens, classifyRefusal, refusalCode, createRunnerLog, formatClock } from './chunk-XZ4H4X5F.js';
19
19
  import { checkFit } from './chunk-QEFKA2QD.js';
20
- import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-HPJNLETG.js';
20
+ import { isSignatureRefusal, WorkCommandError, getJson, postJson } from './chunk-FBTGMSQF.js';
21
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';
@@ -85,6 +85,9 @@ var HEARTBEAT_TIMEOUT_MS = 1e4;
85
85
  var ERROR_CODE_MAX = 100;
86
86
  var ERROR_MESSAGE_MAX = 500;
87
87
  var BLOCKED_REASON_MAX = 500;
88
+ var TAKES_PATTERNS_MAX = 50;
89
+ var TAKES_PATTERN_CHARS_MAX = 200;
90
+ var WAITING_ITEMS_MAX = 200;
88
91
  var UNREACHABLE_MESSAGE = "the request did not reach the platform";
89
92
  function noPlatformMessage(status) {
90
93
  return `the request got HTTP ${status} with no error message from the platform`;
@@ -112,6 +115,35 @@ function workRequestFromFailure(err) {
112
115
  function workRequestFromRetryFailure(outcome) {
113
116
  return shapeWorkRequestFailure(outcome.code, outcome.status, outcome.message);
114
117
  }
118
+ function stopsOf(data) {
119
+ const raw = data?.stops;
120
+ if (!Array.isArray(raw)) return [];
121
+ const stops = [];
122
+ for (const entry of raw) {
123
+ const stop = entry;
124
+ if (stop === null || typeof stop !== "object" || typeof stop.claimId !== "string") continue;
125
+ stops.push({
126
+ claimId: stop.claimId,
127
+ requestedByName: typeof stop.requestedByName === "string" ? stop.requestedByName : "",
128
+ note: typeof stop.note === "string" && stop.note !== "" ? stop.note : null
129
+ });
130
+ }
131
+ return stops;
132
+ }
133
+ function takesBody(takes) {
134
+ let truncated = false;
135
+ const list = (patterns) => {
136
+ const all = (patterns ?? []).filter((pattern) => typeof pattern === "string");
137
+ if (all.length > TAKES_PATTERNS_MAX) truncated = true;
138
+ return all.slice(0, TAKES_PATTERNS_MAX).map((pattern) => {
139
+ if (pattern.length > TAKES_PATTERN_CHARS_MAX) truncated = true;
140
+ return cutForGateway(pattern, TAKES_PATTERN_CHARS_MAX);
141
+ }).filter((pattern) => pattern !== "");
142
+ };
143
+ const include = list(takes.repos.include);
144
+ const exclude = list(takes.repos.exclude);
145
+ return { queues: takes.queues, repos: { include, exclude }, truncated };
146
+ }
115
147
  async function sendHeartbeat(args, fetchImpl) {
116
148
  const body = {
117
149
  host: args.host,
@@ -132,7 +164,10 @@ async function sendHeartbeat(args, fetchImpl) {
132
164
  // Free disk on the runner's file system, in bytes. Sent only while held, so a host with room sends nothing about its disk.
133
165
  lowDisk: args.lowDisk === void 0 ? void 0 : { free: args.lowDisk.free, needed: args.lowDisk.needed },
134
166
  // Why the runner claims nothing. Sent only while it holds, so a runner that takes work says nothing about it.
135
- blocked: args.blocked === void 0 ? void 0 : { reason: cutForGateway(args.blocked.reason, BLOCKED_REASON_MAX) }
167
+ blocked: args.blocked === void 0 ? void 0 : { reason: cutForGateway(args.blocked.reason, BLOCKED_REASON_MAX) },
168
+ state: args.state,
169
+ waitingItems: args.waitingItems === void 0 ? void 0 : args.waitingItems.slice(0, WAITING_ITEMS_MAX),
170
+ takes: args.takes === void 0 ? void 0 : takesBody(args.takes)
136
171
  };
137
172
  try {
138
173
  const response = await postJson(
@@ -146,11 +181,22 @@ async function sendHeartbeat(args, fetchImpl) {
146
181
  await signerFor(args.configPath)
147
182
  );
148
183
  const runnerVersion = response.data?.runnerVersion;
149
- return typeof runnerVersion === "string" ? { ok: true, runnerVersion } : { ok: true };
184
+ const stops = stopsOf(response.data);
185
+ return typeof runnerVersion === "string" ? { ok: true, runnerVersion, stops } : { ok: true, stops };
150
186
  } catch (err) {
151
187
  return { ok: false, reason: describeCallFailure(err) };
152
188
  }
153
189
  }
190
+
191
+ // src/runner/host-state.ts
192
+ function hostState(flags) {
193
+ if (flags.draining) return "draining";
194
+ if (flags.restarting) return "restarting";
195
+ if (flags.holdingForUpdate) return "holding-for-update";
196
+ if (flags.blocked) return "blocked";
197
+ if (flags.lowDisk) return "low-disk";
198
+ return "taking-work";
199
+ }
154
200
  var OUTCOMES = ["updated", "rolled_back", "verification_failed", "not_published", "retrying"];
155
201
  function lastUpdatePath(configPath) {
156
202
  return join(runnerDir(configPath), "last-update.json");
@@ -1042,6 +1088,7 @@ async function sendTickHeartbeat(state, workRequest) {
1042
1088
  let next = workRequest;
1043
1089
  for (; ; ) {
1044
1090
  reportRepeating(state, "the heartbeat's previous call", void 0, "line");
1091
+ const waitingItems = state.draining === true ? runningItems(state) : [];
1045
1092
  const result = await sendHeartbeat(
1046
1093
  {
1047
1094
  configPath: state.config.configPath,
@@ -1056,12 +1103,25 @@ async function sendTickHeartbeat(state, workRequest) {
1056
1103
  workRequest: next,
1057
1104
  lastUpdate: readLastUpdate(state.config.configPath),
1058
1105
  lowDisk: state.lowDisk,
1059
- blocked: state.blocked
1106
+ blocked: state.blocked,
1107
+ state: hostState({
1108
+ draining: state.draining === true,
1109
+ restarting: state.restarting === true,
1110
+ holdingForUpdate: state.holdingForUpdate === true,
1111
+ blocked: state.blocked !== void 0,
1112
+ lowDisk: state.lowDisk !== void 0
1113
+ }),
1114
+ // Left out unless a draining runner has builds to wait on, so the gateway stores null.
1115
+ waitingItems: waitingItems.length > 0 ? waitingItems : void 0,
1116
+ takes: { queues: state.config.queues, repos: { include: state.config.repos?.include, exclude: state.config.repos?.exclude } }
1060
1117
  },
1061
1118
  state.deps.fetchImpl
1062
1119
  );
1063
1120
  reportRepeating(state, "the heartbeat", result.ok ? void 0 : `heartbeat failed: ${result.reason}`);
1064
- if (result.ok) considerNamedVersion(state, result.runnerVersion);
1121
+ if (result.ok) {
1122
+ considerNamedVersion(state, result.runnerVersion);
1123
+ applyStops(state, result.stops);
1124
+ }
1065
1125
  next = state.queuedWorkRequest;
1066
1126
  state.queuedWorkRequest = void 0;
1067
1127
  if (next === void 0) break;
@@ -1070,6 +1130,27 @@ async function sendTickHeartbeat(state, workRequest) {
1070
1130
  state.heartbeating = false;
1071
1131
  }
1072
1132
  }
1133
+ function applyStops(state, stops) {
1134
+ for (const stop of stops) {
1135
+ const held = [...state.jobs.values()].find((entry) => entry.job.claimId === stop.claimId);
1136
+ const active = held !== void 0 && !held.ending ? held : void 0;
1137
+ if (active === void 0) {
1138
+ reportRepeating(
1139
+ state,
1140
+ `stop of claim ${stop.claimId}`,
1141
+ held === void 0 ? `ignoring a stop for claim ${stop.claimId}: this runner holds no build under that claim` : `#${held.job.item} a stop was asked for; the build is already ending`,
1142
+ "line"
1143
+ );
1144
+ continue;
1145
+ }
1146
+ const who = `stopped by ${stop.requestedByName === "" ? "someone" : stop.requestedByName} through OuterLayer`;
1147
+ const reason = stop.note === null ? who : `${who}: ${stop.note}`;
1148
+ logOf(state).line(`#${active.job.item} ${reason} \xB7 ending the build`);
1149
+ void endJob(state, active, "stopped", { reason }).catch((err) => {
1150
+ logOf(state).error(`#${active.job.item} could not be stopped: ${describeCallFailure(err)}`);
1151
+ });
1152
+ }
1153
+ }
1073
1154
  function ownVersionOf(deps) {
1074
1155
  return (deps.cliVersion ?? resolveVersion()).split(" ")[0] ?? "";
1075
1156
  }
@@ -1405,9 +1486,17 @@ async function housekeepingPass(state) {
1405
1486
  }
1406
1487
  }
1407
1488
  async function runTick(state) {
1489
+ state.restarting = false;
1490
+ state.holdingForUpdate = false;
1408
1491
  reloadConfig(state);
1409
- if (restartOntoInstalled(state)) return;
1410
- if (await updateWhenIdle(state)) return;
1492
+ if (restartOntoInstalled(state)) {
1493
+ state.restarting = true;
1494
+ return;
1495
+ }
1496
+ if (await updateWhenIdle(state)) {
1497
+ state.holdingForUpdate = true;
1498
+ return;
1499
+ }
1411
1500
  if (holdWhenBlocked(state)) return;
1412
1501
  if (holdOffForDisk(state)) return;
1413
1502
  const log = logOf(state);
@@ -1463,7 +1552,7 @@ var CLAIM_REFUSAL_CODES = new Set(
1463
1552
  "pull_request_from_fork pull_request_on_default_branch pull_request_ambiguous pull_request_repository_not_connected branch_claimed_elsewhere".split(" ")
1464
1553
  );
1465
1554
  async function tryClaimAndStart(state, item, queue) {
1466
- const { postJson: postJson2 } = await import('./work-cmd-5EPPD33Y.js');
1555
+ const { postJson: postJson2 } = await import('./work-cmd-5I3J2XQQ.js');
1467
1556
  const log = logOf(state);
1468
1557
  const hostKey = await loadHostKey(state.config.configPath);
1469
1558
  const claim = await retrySend(
@@ -2226,7 +2315,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2226
2315
  const outcome = await onStartUnderMarker({
2227
2316
  configPath,
2228
2317
  own: ownVersionOf(deps),
2229
- check: update.check ? () => update.check(configPath) : async () => (await import('./check-UWQAL2MN.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
2318
+ check: update.check ? () => update.check(configPath) : async () => (await import('./check-BR5D27CX.js')).runRunnerCheck(configPath, { fetchImpl: deps.fetchImpl }),
2230
2319
  now: () => (deps.now ?? (() => /* @__PURE__ */ new Date()))().getTime(),
2231
2320
  log
2232
2321
  });
@@ -2312,12 +2401,11 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2312
2401
  }
2313
2402
  let intakeClosed = false;
2314
2403
  let closed = false;
2315
- let draining = false;
2316
2404
  let stopping = false;
2317
2405
  let exited = false;
2318
2406
  let interrupts = 0;
2319
2407
  state.pollTimerSeconds = state.config.pollSeconds;
2320
- const pollTimer = setInterval(() => void tick(state), state.pollTimerSeconds * 1e3);
2408
+ let pollTimer = setInterval(() => void tick(state), state.pollTimerSeconds * 1e3);
2321
2409
  const hooksKind = builtinKind(config.hooks.provision);
2322
2410
  const housekeepingTimer = hooksKind === "container" || hooksKind === "vm" ? (() => {
2323
2411
  const everyMs = deps.housekeeping?.intervalMs ?? HOUSEKEEPING_INTERVAL_MS;
@@ -2357,6 +2445,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2357
2445
  if (intakeClosed) return;
2358
2446
  intakeClosed = true;
2359
2447
  clearInterval(pollTimer);
2448
+ pollTimer = setInterval(() => void sendTickHeartbeat(state, void 0), (state.pollTimerSeconds ?? state.config.pollSeconds) * 1e3);
2360
2449
  clearInterval(housekeepingTimer);
2361
2450
  };
2362
2451
  const close = () => {
@@ -2364,6 +2453,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2364
2453
  detachSignals();
2365
2454
  if (closed) return;
2366
2455
  closed = true;
2456
+ clearInterval(pollTimer);
2367
2457
  clearInterval(watchTimer);
2368
2458
  };
2369
2459
  const finish2 = () => {
@@ -2374,8 +2464,8 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2374
2464
  log.line("runner exited");
2375
2465
  };
2376
2466
  const drain = async (onWaiting) => {
2377
- if (draining) return;
2378
- draining = true;
2467
+ if (state.draining === true) return;
2468
+ state.draining = true;
2379
2469
  stopIntake();
2380
2470
  let passes = 0;
2381
2471
  while (state.jobs.size > 0 && !exited) {
@@ -2397,6 +2487,7 @@ async function start(configPath, deps = { fetchImpl: fetch }) {
2397
2487
  if (stopping) return;
2398
2488
  stopping = true;
2399
2489
  stopIntake();
2490
+ clearInterval(pollTimer);
2400
2491
  clearInterval(watchTimer);
2401
2492
  log.line(`stopping: ending ${state.jobs.size} running job(s) now`);
2402
2493
  await Promise.all([...state.jobs.values()].map((active) => endJob(state, active, "stopped")));
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { writeJobFile, readJobFile } from './chunk-SADUQSO4.js';
4
- import { senderPidfile } from './chunk-5GHGAF6P.js';
4
+ import { senderPidfile } from './chunk-JHGEBPLE.js';
5
5
  import { DOCKERD_LOG, HELPER_PATH, HELPER_RECORD } from './chunk-XNGMQ27R.js';
6
- import { installScrubContext } from './chunk-7SJPQWBM.js';
7
- import { AssetError, obtainImage, ensureRootfs, gitRemoteFor, startServicesFor, createBuildDisk, machineConfig, resolveAgentUser, AgentUserError, runBuildSteps, shellQuote, createContainerRuntime, stopContainer, cleanupContainer, outOfMemoryReason, containerSenderCommand, syncInContainer, copyTranscriptsFromContainer, GH_CONFIG_YML, ghHostsYml, ADDED_USER, isLiteralAddress, signalInContainer, deleteBuildDisk, startCheckContainer, lifecycleSteps, lifecycleFailureReason, writeEvalInput, EVAL_INPUT_NAME, copyTranscripts, senderSignalScript, containerJudgeEnvironment, copyJudgeTree } from './chunk-7KSSBQTS.js';
6
+ import { installScrubContext } from './chunk-R22NZSGA.js';
7
+ import { AssetError, obtainImage, ensureRootfs, gitRemoteFor, startServicesFor, createBuildDisk, machineConfig, resolveAgentUser, AgentUserError, runBuildSteps, shellQuote, createContainerRuntime, stopContainer, cleanupContainer, outOfMemoryReason, containerSenderCommand, syncInContainer, copyTranscriptsFromContainer, GH_CONFIG_YML, ghHostsYml, ADDED_USER, isLiteralAddress, signalInContainer, deleteBuildDisk, startCheckContainer, lifecycleSteps, lifecycleFailureReason, writeEvalInput, EVAL_INPUT_NAME, copyTranscripts, senderSignalScript, containerJudgeEnvironment, copyJudgeTree } from './chunk-3ZR7Y23Y.js';
8
8
  import { childEnvironment } from './chunk-VMJPFQNE.js';
9
9
  import { HASH_ARGV, parseProgramHash, JUDGE_PROGRAM, judgeCommand, MAX_REPORT_BYTES, JUDGE_MAX_TURNS, JUDGE_DIR } from './chunk-3UZTIRLF.js';
10
10
  import { waitForAgent, vmExecArgs } from './chunk-GGOMT6KF.js';
11
11
  import { socketPathProblem, vsockLinks, linkVsockSockets } from './chunk-X5H2WYMB.js';
12
- import { describeCallFailure, resolveGoverningSource, refusalCode, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, logStamp, createRunnerLog, formatDuration, retrySend, formatClock } from './chunk-XSZD4AZ6.js';
13
- import { WorkCommandError, postJson, isSignatureRefusal, getJson } from './chunk-HPJNLETG.js';
12
+ import { describeCallFailure, resolveGoverningSource, refusalCode, removeStagedContext, stageGovernedContext, pinnedSourceOf, commandWithShim, logStamp, createRunnerLog, formatDuration, retrySend, formatClock } from './chunk-XZ4H4X5F.js';
13
+ import { WorkCommandError, postJson, isSignatureRefusal, getJson } from './chunk-FBTGMSQF.js';
14
14
  import { planArtifactUpload } from './chunk-G3IJ3N6F.js';
15
15
  import { isBuiltinContainer, isBuiltinProcess, isBuiltinVm, DEFAULT_CHECK_TIME_LIMIT_MINUTES } from './chunk-P53VEAOF.js';
16
16
  import { parseSize } from './chunk-7RQ73DLO.js';
@@ -19,8 +19,8 @@ import { CLAUDE_CODE_VERSION } from './chunk-CX22S5BA.js';
19
19
  import { isSameProcess, startTimeOf } from './chunk-JBJTC3UU.js';
20
20
  import { scrubText } from './chunk-QNLX477Q.js';
21
21
  import { resolvePackRoot } from './chunk-NNLA7LLQ.js';
22
- import { parsePolicy } from './chunk-WFSUUUAN.js';
23
22
  import { readCloudConfig } from './chunk-EABW6AJQ.js';
23
+ import { parsePolicy } from './chunk-WFSUUUAN.js';
24
24
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
25
25
  import { resolveVersion } from './chunk-RA3O54FC.js';
26
26
  import { signerFor } from './chunk-M2ZWWTWZ.js';
@@ -1,14 +1,14 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { runEmit } from './chunk-ZHAUSEEN.js';
3
+ import { runEmit } from './chunk-5VML45HH.js';
4
4
  import { addStdioMcpEntryIfAbsent, addDocsMcpEntryIfAbsent, DOCS_MCP_SERVER_NAME } from './chunk-YVZJ6GKF.js';
5
5
  import { installStarterPack } from './chunk-6X4SQ5MY.js';
6
6
  import { C } from './chunk-ANPNT6PM.js';
7
- import { resolveGitCommonDir, defaultGitRunner } from './chunk-452TM7J4.js';
7
+ import { resolveGitCommonDir, defaultGitRunner } from './chunk-EAEELQVQ.js';
8
8
  import { loadTemplateFiles, loadMaintainedFiles, skillDir } from './chunk-NNLA7LLQ.js';
9
- import { generatedHeaderSource } from './chunk-WFSUUUAN.js';
10
9
  import { cliInvocation } from './chunk-CRB3POP4.js';
11
10
  import { cloneIsGoverned } from './chunk-YQR6E6OV.js';
11
+ import { generatedHeaderSource } from './chunk-WFSUUUAN.js';
12
12
  import { execFileSync } from 'child_process';
13
13
  import { existsSync, mkdirSync, writeFileSync } from 'fs';
14
14
  import { join, dirname } from 'path';
@@ -1,13 +1,13 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { removeRetiredSkills } from './chunk-IXYZUUYQ.js';
3
+ import { removeRetiredSkills } from './chunk-7UWVLZXD.js';
4
4
  import { defaultFetch } from './chunk-FVMYKL6L.js';
5
5
  import { resolveGatewayCredentials } from './chunk-NTRCK4NH.js';
6
6
  import { appendContextProvenance } from './chunk-ZJSNLVCE.js';
7
7
  import { loadMaintainedFiles, writeMaintainedFiles } from './chunk-NNLA7LLQ.js';
8
- import { normalizeRepoName, parseOuterlayerConfig, classifyTree, emitTree } from './chunk-WFSUUUAN.js';
9
8
  import { cliInvocation } from './chunk-CRB3POP4.js';
10
9
  import { writeDegraded, writeSourceCache, SOURCE_CACHE_TTL_RETRY_MS, writeContextManifest, SOURCE_CACHE_TTL_SUCCESS_MS, readSourceCache, isSourceCacheFresh, clearDegraded } from './chunk-YQR6E6OV.js';
10
+ import { normalizeRepoName, parseOuterlayerConfig, classifyTree, emitTree } from './chunk-WFSUUUAN.js';
11
11
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
12
12
  import { withTokenHeader } from './chunk-BQXFBI7T.js';
13
13
  import { execFileSync } from 'child_process';
@@ -421,7 +421,7 @@ async function runWorkLinkSession(opts) {
421
421
  return await linkSession(opts);
422
422
  } catch (err) {
423
423
  if (opts.logFailures) {
424
- const { logHookError } = await import('./hook-fast-YAZG5MDX.js');
424
+ const { logHookError } = await import('./hook-fast-RL5E5OXE.js');
425
425
  const reason = err instanceof Error ? err.message : String(err);
426
426
  logHookError(opts.home ?? homeFromEnv(opts.env ?? process.env), new Error(`work link-session #${opts.number} failed: ${reason}`));
427
427
  }
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { isPlaceholderCommand } from './chunk-6D7GT22T.js';
4
- import { describeCallFailure } from './chunk-XSZD4AZ6.js';
5
- import { WorkCommandError, getJson } from './chunk-HPJNLETG.js';
3
+ import { isPlaceholderCommand } from './chunk-PIZRPNKR.js';
4
+ import { describeCallFailure } from './chunk-XZ4H4X5F.js';
5
+ import { WorkCommandError, getJson } from './chunk-FBTGMSQF.js';
6
6
  import { sanitizeTerminal } from './chunk-G3IJ3N6F.js';
7
7
  import { builtinKind } from './chunk-P53VEAOF.js';
8
8
  import { signerFor } from './chunk-M2ZWWTWZ.js';
@@ -1,15 +1,15 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
3
  import { checkStarterFiles, contextIsGoverned } from './chunk-TWF3RICI.js';
4
- import { resolveCredentials, getJson, WorkCommandError } from './chunk-HPJNLETG.js';
4
+ import { resolveCredentials, getJson, WorkCommandError } from './chunk-FBTGMSQF.js';
5
5
  import { isLinkedRepository } from './chunk-CG36IONK.js';
6
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
+ import { sanitizeForContext, spoolDir, assessSyncHealth, readSyncStatus, SYNC_STALE_AFTER_MS, formatAgo, checkInstalledCliStaleness, workspaceRootOf, hookFiredMarkerPath, refreshCommand } from './chunk-PSN33ERW.js';
8
8
  import { readStatuslineState, STATE_FRESH_MS } from './chunk-DSF2FWAZ.js';
9
9
  import { resolveRepoIdentity, compareVersions, SUPPORTED_VERSIONS } from './chunk-QNLX477Q.js';
10
10
  import { C } from './chunk-ANPNT6PM.js';
11
11
  import { readSettings, settingsPath, isOurStatuslineSlot, statuslineWrappedOriginal, REGISTERED_EVENTS, isOurHookCommand, ourCommandBins, cliBinResolvable, ourDirectScriptBins, wrappedOriginalCommand } from './chunk-5QRP3MVS.js';
12
- import { checkFormerSkillNames } from './chunk-IXYZUUYQ.js';
12
+ import { checkFormerSkillNames } from './chunk-7UWVLZXD.js';
13
13
  import { defaultFetch } from './chunk-FVMYKL6L.js';
14
14
  import { resolveGatewayCredentials } from './chunk-NTRCK4NH.js';
15
15
  import { findGitDirs } from './chunk-BJ3KTMDH.js';
@@ -1181,7 +1181,7 @@ async function gatherDoctorChecks() {
1181
1181
  const { runnerVmCheck } = await import('./doctor-53F2PYY7.js');
1182
1182
  checks.push(runnerVmCheck(configPath, { lima: realLima(), home: homeFromEnv(), instance: runnerVm.instance }));
1183
1183
  } else if (hasRunnerBlock(configPath)) {
1184
- const { runnerHostChecks } = await import('./doctor-23BBJWBX.js');
1184
+ const { runnerHostChecks } = await import('./doctor-DHUM5DBB.js');
1185
1185
  const hooks = (() => {
1186
1186
  try {
1187
1187
  return loadRunnerConfig(configPath).hooks;
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { LiveUploader } from './chunk-7SJPQWBM.js';
4
- import { spoolDir } from './chunk-NFIR3GEE.js';
3
+ import { LiveUploader } from './chunk-R22NZSGA.js';
4
+ import { spoolDir } from './chunk-PSN33ERW.js';
5
5
  import { CaptureDaemon } from './chunk-QNLX477Q.js';
6
6
  import { parseWorkItemEnv } from './chunk-T2Q7ISPE.js';
7
7
  import { homeFromEnv } from './chunk-VNVZDWO3.js';
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
- import { MIN_ENGINE_MAJOR } from './chunk-7KSSBQTS.js';
3
+ import { MIN_ENGINE_MAJOR } from './chunk-3ZR7Y23Y.js';
4
4
  import { firecrackerArch, MICROVM_ARCHES, guestAssetsPinned } from './chunk-CX22S5BA.js';
5
5
  import { spawnSync } from 'child_process';
6
6
  import { existsSync, accessSync, constants, statSync, readFileSync } from 'fs';
@@ -1,8 +1,8 @@
1
1
  #!/usr/bin/env node
2
2
  import { createRequire } from 'node:module';
3
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';
4
+ import { detectMachine, supportsContainerBuilds, reachDockerStep, describeMachineDocker, supportsMicroVmBuilds } from './chunk-LW7G5TJB.js';
5
+ import { MIN_ENGINE_MAJOR } from './chunk-3ZR7Y23Y.js';
6
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';