looply-cli 0.0.0-stage → 0.3.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 (793) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -3
  3. package/dist/.src-hash +1 -0
  4. package/dist/acceptance-observe.d.ts +108 -0
  5. package/dist/acceptance-observe.d.ts.map +1 -0
  6. package/dist/acceptance-observe.js +152 -0
  7. package/dist/acceptance-observe.js.map +1 -0
  8. package/dist/agent-cmd.d.ts +131 -0
  9. package/dist/agent-cmd.d.ts.map +1 -0
  10. package/dist/agent-cmd.js +154 -0
  11. package/dist/agent-cmd.js.map +1 -0
  12. package/dist/agent-contained.d.ts +114 -0
  13. package/dist/agent-contained.d.ts.map +1 -0
  14. package/dist/agent-contained.js +292 -0
  15. package/dist/agent-contained.js.map +1 -0
  16. package/dist/agent-driver.d.ts +130 -0
  17. package/dist/agent-driver.d.ts.map +1 -0
  18. package/dist/agent-driver.js +170 -0
  19. package/dist/agent-driver.js.map +1 -0
  20. package/dist/agent-envelope.d.ts +94 -0
  21. package/dist/agent-envelope.d.ts.map +1 -0
  22. package/dist/agent-envelope.js +214 -0
  23. package/dist/agent-envelope.js.map +1 -0
  24. package/dist/agent-exec.d.ts +182 -0
  25. package/dist/agent-exec.d.ts.map +1 -0
  26. package/dist/agent-exec.js +125 -0
  27. package/dist/agent-exec.js.map +1 -0
  28. package/dist/agent-runtime.d.ts +23 -0
  29. package/dist/agent-runtime.d.ts.map +1 -0
  30. package/dist/agent-runtime.js +143 -0
  31. package/dist/agent-runtime.js.map +1 -0
  32. package/dist/approval-gate-read.d.ts +66 -0
  33. package/dist/approval-gate-read.d.ts.map +1 -0
  34. package/dist/approval-gate-read.js +138 -0
  35. package/dist/approval-gate-read.js.map +1 -0
  36. package/dist/approval-resolution.d.ts +87 -0
  37. package/dist/approval-resolution.d.ts.map +1 -0
  38. package/dist/approval-resolution.js +100 -0
  39. package/dist/approval-resolution.js.map +1 -0
  40. package/dist/approval-resumes.d.ts +102 -0
  41. package/dist/approval-resumes.d.ts.map +1 -0
  42. package/dist/approval-resumes.js +167 -0
  43. package/dist/approval-resumes.js.map +1 -0
  44. package/dist/ask-brain.d.ts +167 -0
  45. package/dist/ask-brain.d.ts.map +1 -0
  46. package/dist/ask-brain.js +355 -0
  47. package/dist/ask-brain.js.map +1 -0
  48. package/dist/autonomy-authority.d.ts +80 -0
  49. package/dist/autonomy-authority.d.ts.map +1 -0
  50. package/dist/autonomy-authority.js +82 -0
  51. package/dist/autonomy-authority.js.map +1 -0
  52. package/dist/autonomy-controller.d.ts +321 -0
  53. package/dist/autonomy-controller.d.ts.map +1 -0
  54. package/dist/autonomy-controller.js +517 -0
  55. package/dist/autonomy-controller.js.map +1 -0
  56. package/dist/autonomy-store.d.ts +327 -0
  57. package/dist/autonomy-store.d.ts.map +1 -0
  58. package/dist/autonomy-store.js +581 -0
  59. package/dist/autonomy-store.js.map +1 -0
  60. package/dist/autonomy-tick.d.ts +257 -0
  61. package/dist/autonomy-tick.d.ts.map +1 -0
  62. package/dist/autonomy-tick.js +616 -0
  63. package/dist/autonomy-tick.js.map +1 -0
  64. package/dist/bin.d.ts +3 -0
  65. package/dist/bin.d.ts.map +1 -0
  66. package/dist/bin.js +2727 -0
  67. package/dist/bin.js.map +1 -0
  68. package/dist/brain-advice.d.ts +21 -0
  69. package/dist/brain-advice.d.ts.map +1 -0
  70. package/dist/brain-advice.js +51 -0
  71. package/dist/brain-advice.js.map +1 -0
  72. package/dist/candidate-replay-runtime.d.ts +125 -0
  73. package/dist/candidate-replay-runtime.d.ts.map +1 -0
  74. package/dist/candidate-replay-runtime.js +188 -0
  75. package/dist/candidate-replay-runtime.js.map +1 -0
  76. package/dist/checkout-carry.d.ts +76 -0
  77. package/dist/checkout-carry.d.ts.map +1 -0
  78. package/dist/checkout-carry.js +125 -0
  79. package/dist/checkout-carry.js.map +1 -0
  80. package/dist/citation-readers.d.ts +26 -0
  81. package/dist/citation-readers.d.ts.map +1 -0
  82. package/dist/citation-readers.js +102 -0
  83. package/dist/citation-readers.js.map +1 -0
  84. package/dist/command-receipts.d.ts +79 -0
  85. package/dist/command-receipts.d.ts.map +1 -0
  86. package/dist/command-receipts.js +143 -0
  87. package/dist/command-receipts.js.map +1 -0
  88. package/dist/command-runner.d.ts +32 -0
  89. package/dist/command-runner.d.ts.map +1 -0
  90. package/dist/command-runner.js +108 -0
  91. package/dist/command-runner.js.map +1 -0
  92. package/dist/compatible-sets.d.ts +67 -0
  93. package/dist/compatible-sets.d.ts.map +1 -0
  94. package/dist/compatible-sets.js +81 -0
  95. package/dist/compatible-sets.js.map +1 -0
  96. package/dist/compile-check.d.ts +31 -0
  97. package/dist/compile-check.d.ts.map +1 -0
  98. package/dist/compile-check.js +34 -0
  99. package/dist/compile-check.js.map +1 -0
  100. package/dist/compile-store.d.ts +16 -0
  101. package/dist/compile-store.d.ts.map +1 -0
  102. package/dist/compile-store.js +21 -0
  103. package/dist/compile-store.js.map +1 -0
  104. package/dist/completion.d.ts +106 -0
  105. package/dist/completion.d.ts.map +1 -0
  106. package/dist/completion.js +131 -0
  107. package/dist/completion.js.map +1 -0
  108. package/dist/config.d.ts +549 -0
  109. package/dist/config.d.ts.map +1 -0
  110. package/dist/config.js +763 -0
  111. package/dist/config.js.map +1 -0
  112. package/dist/control-file.d.ts +142 -0
  113. package/dist/control-file.d.ts.map +1 -0
  114. package/dist/control-file.js +144 -0
  115. package/dist/control-file.js.map +1 -0
  116. package/dist/coordinator-state.d.ts +131 -0
  117. package/dist/coordinator-state.d.ts.map +1 -0
  118. package/dist/coordinator-state.js +380 -0
  119. package/dist/coordinator-state.js.map +1 -0
  120. package/dist/coordinator.d.ts +95 -0
  121. package/dist/coordinator.d.ts.map +1 -0
  122. package/dist/coordinator.js +97 -0
  123. package/dist/coordinator.js.map +1 -0
  124. package/dist/cursor-store.d.ts +53 -0
  125. package/dist/cursor-store.d.ts.map +1 -0
  126. package/dist/cursor-store.js +98 -0
  127. package/dist/cursor-store.js.map +1 -0
  128. package/dist/daemon-cmd.d.ts +239 -0
  129. package/dist/daemon-cmd.d.ts.map +1 -0
  130. package/dist/daemon-cmd.js +1751 -0
  131. package/dist/daemon-cmd.js.map +1 -0
  132. package/dist/daemon-lock.d.ts +140 -0
  133. package/dist/daemon-lock.d.ts.map +1 -0
  134. package/dist/daemon-lock.js +352 -0
  135. package/dist/daemon-lock.js.map +1 -0
  136. package/dist/daemon-recovery.d.ts +78 -0
  137. package/dist/daemon-recovery.d.ts.map +1 -0
  138. package/dist/daemon-recovery.js +161 -0
  139. package/dist/daemon-recovery.js.map +1 -0
  140. package/dist/daemon.d.ts +368 -0
  141. package/dist/daemon.d.ts.map +1 -0
  142. package/dist/daemon.js +601 -0
  143. package/dist/daemon.js.map +1 -0
  144. package/dist/declared-response-shape.d.ts +93 -0
  145. package/dist/declared-response-shape.d.ts.map +1 -0
  146. package/dist/declared-response-shape.js +200 -0
  147. package/dist/declared-response-shape.js.map +1 -0
  148. package/dist/declared-surfaces.d.ts +16 -0
  149. package/dist/declared-surfaces.d.ts.map +1 -0
  150. package/dist/declared-surfaces.js +19 -0
  151. package/dist/declared-surfaces.js.map +1 -0
  152. package/dist/depends-review.d.ts +113 -0
  153. package/dist/depends-review.d.ts.map +1 -0
  154. package/dist/depends-review.js +110 -0
  155. package/dist/depends-review.js.map +1 -0
  156. package/dist/doctor.d.ts +91 -0
  157. package/dist/doctor.d.ts.map +1 -0
  158. package/dist/doctor.js +71 -0
  159. package/dist/doctor.js.map +1 -0
  160. package/dist/edge-approval.d.ts +105 -0
  161. package/dist/edge-approval.d.ts.map +1 -0
  162. package/dist/edge-approval.js +100 -0
  163. package/dist/edge-approval.js.map +1 -0
  164. package/dist/evidence-cache.d.ts +45 -0
  165. package/dist/evidence-cache.d.ts.map +1 -0
  166. package/dist/evidence-cache.js +90 -0
  167. package/dist/evidence-cache.js.map +1 -0
  168. package/dist/evidence-cmd.d.ts +133 -0
  169. package/dist/evidence-cmd.d.ts.map +1 -0
  170. package/dist/evidence-cmd.js +347 -0
  171. package/dist/evidence-cmd.js.map +1 -0
  172. package/dist/evidence-facts.d.ts +40 -0
  173. package/dist/evidence-facts.d.ts.map +1 -0
  174. package/dist/evidence-facts.js +114 -0
  175. package/dist/evidence-facts.js.map +1 -0
  176. package/dist/exclusive-lock.d.ts +52 -0
  177. package/dist/exclusive-lock.d.ts.map +1 -0
  178. package/dist/exclusive-lock.js +150 -0
  179. package/dist/exclusive-lock.js.map +1 -0
  180. package/dist/exec-domains.d.ts +140 -0
  181. package/dist/exec-domains.d.ts.map +1 -0
  182. package/dist/exec-domains.js +287 -0
  183. package/dist/exec-domains.js.map +1 -0
  184. package/dist/exemption-store.d.ts +197 -0
  185. package/dist/exemption-store.d.ts.map +1 -0
  186. package/dist/exemption-store.js +266 -0
  187. package/dist/exemption-store.js.map +1 -0
  188. package/dist/explicit-start-gate.d.ts +96 -0
  189. package/dist/explicit-start-gate.d.ts.map +1 -0
  190. package/dist/explicit-start-gate.js +103 -0
  191. package/dist/explicit-start-gate.js.map +1 -0
  192. package/dist/fs-trouble.d.ts +70 -0
  193. package/dist/fs-trouble.d.ts.map +1 -0
  194. package/dist/fs-trouble.js +98 -0
  195. package/dist/fs-trouble.js.map +1 -0
  196. package/dist/gate.d.ts +278 -0
  197. package/dist/gate.d.ts.map +1 -0
  198. package/dist/gate.js +278 -0
  199. package/dist/gate.js.map +1 -0
  200. package/dist/git-driver.d.ts +519 -0
  201. package/dist/git-driver.d.ts.map +1 -0
  202. package/dist/git-driver.js +900 -0
  203. package/dist/git-driver.js.map +1 -0
  204. package/dist/git-push-executor.d.ts +41 -0
  205. package/dist/git-push-executor.d.ts.map +1 -0
  206. package/dist/git-push-executor.js +142 -0
  207. package/dist/git-push-executor.js.map +1 -0
  208. package/dist/glob.d.ts +26 -0
  209. package/dist/glob.d.ts.map +1 -0
  210. package/dist/glob.js +93 -0
  211. package/dist/glob.js.map +1 -0
  212. package/dist/goal-adaptive.d.ts +295 -0
  213. package/dist/goal-adaptive.d.ts.map +1 -0
  214. package/dist/goal-adaptive.js +393 -0
  215. package/dist/goal-adaptive.js.map +1 -0
  216. package/dist/goal-compile.d.ts +342 -0
  217. package/dist/goal-compile.d.ts.map +1 -0
  218. package/dist/goal-compile.js +444 -0
  219. package/dist/goal-compile.js.map +1 -0
  220. package/dist/goal-depends-executor.d.ts +55 -0
  221. package/dist/goal-depends-executor.d.ts.map +1 -0
  222. package/dist/goal-depends-executor.js +202 -0
  223. package/dist/goal-depends-executor.js.map +1 -0
  224. package/dist/goal-execution-evidence.d.ts +135 -0
  225. package/dist/goal-execution-evidence.d.ts.map +1 -0
  226. package/dist/goal-execution-evidence.js +159 -0
  227. package/dist/goal-execution-evidence.js.map +1 -0
  228. package/dist/goal-gap.d.ts +140 -0
  229. package/dist/goal-gap.d.ts.map +1 -0
  230. package/dist/goal-gap.js +197 -0
  231. package/dist/goal-gap.js.map +1 -0
  232. package/dist/goal-met-target.d.ts +98 -0
  233. package/dist/goal-met-target.d.ts.map +1 -0
  234. package/dist/goal-met-target.js +92 -0
  235. package/dist/goal-met-target.js.map +1 -0
  236. package/dist/goal-ownership.d.ts +416 -0
  237. package/dist/goal-ownership.d.ts.map +1 -0
  238. package/dist/goal-ownership.js +576 -0
  239. package/dist/goal-ownership.js.map +1 -0
  240. package/dist/goal-runs.d.ts +82 -0
  241. package/dist/goal-runs.d.ts.map +1 -0
  242. package/dist/goal-runs.js +120 -0
  243. package/dist/goal-runs.js.map +1 -0
  244. package/dist/goal-store.d.ts +146 -0
  245. package/dist/goal-store.d.ts.map +1 -0
  246. package/dist/goal-store.js +294 -0
  247. package/dist/goal-store.js.map +1 -0
  248. package/dist/goal-view.d.ts +156 -0
  249. package/dist/goal-view.d.ts.map +1 -0
  250. package/dist/goal-view.js +499 -0
  251. package/dist/goal-view.js.map +1 -0
  252. package/dist/governed-approvals.d.ts +152 -0
  253. package/dist/governed-approvals.d.ts.map +1 -0
  254. package/dist/governed-approvals.js +246 -0
  255. package/dist/governed-approvals.js.map +1 -0
  256. package/dist/governed-broker.d.ts +169 -0
  257. package/dist/governed-broker.d.ts.map +1 -0
  258. package/dist/governed-broker.js +196 -0
  259. package/dist/governed-broker.js.map +1 -0
  260. package/dist/governed-run.d.ts +220 -0
  261. package/dist/governed-run.d.ts.map +1 -0
  262. package/dist/governed-run.js +406 -0
  263. package/dist/governed-run.js.map +1 -0
  264. package/dist/grant-reconcile.d.ts +63 -0
  265. package/dist/grant-reconcile.d.ts.map +1 -0
  266. package/dist/grant-reconcile.js +121 -0
  267. package/dist/grant-reconcile.js.map +1 -0
  268. package/dist/index-for-head.d.ts +56 -0
  269. package/dist/index-for-head.d.ts.map +1 -0
  270. package/dist/index-for-head.js +103 -0
  271. package/dist/index-for-head.js.map +1 -0
  272. package/dist/index.d.ts +39 -0
  273. package/dist/index.d.ts.map +1 -0
  274. package/dist/index.js +55 -0
  275. package/dist/index.js.map +1 -0
  276. package/dist/init-detect.d.ts +39 -0
  277. package/dist/init-detect.d.ts.map +1 -0
  278. package/dist/init-detect.js +188 -0
  279. package/dist/init-detect.js.map +1 -0
  280. package/dist/integration-deps.d.ts +62 -0
  281. package/dist/integration-deps.d.ts.map +1 -0
  282. package/dist/integration-deps.js +251 -0
  283. package/dist/integration-deps.js.map +1 -0
  284. package/dist/integration-runtime.d.ts +458 -0
  285. package/dist/integration-runtime.d.ts.map +1 -0
  286. package/dist/integration-runtime.js +681 -0
  287. package/dist/integration-runtime.js.map +1 -0
  288. package/dist/integration.d.ts +45 -0
  289. package/dist/integration.d.ts.map +1 -0
  290. package/dist/integration.js +87 -0
  291. package/dist/integration.js.map +1 -0
  292. package/dist/integrator.d.ts +84 -0
  293. package/dist/integrator.d.ts.map +1 -0
  294. package/dist/integrator.js +193 -0
  295. package/dist/integrator.js.map +1 -0
  296. package/dist/lane-claims.d.ts +174 -0
  297. package/dist/lane-claims.d.ts.map +1 -0
  298. package/dist/lane-claims.js +218 -0
  299. package/dist/lane-claims.js.map +1 -0
  300. package/dist/lane-coverage.d.ts +87 -0
  301. package/dist/lane-coverage.d.ts.map +1 -0
  302. package/dist/lane-coverage.js +129 -0
  303. package/dist/lane-coverage.js.map +1 -0
  304. package/dist/ledger-replay.d.ts +115 -0
  305. package/dist/ledger-replay.d.ts.map +1 -0
  306. package/dist/ledger-replay.js +155 -0
  307. package/dist/ledger-replay.js.map +1 -0
  308. package/dist/ledger-store.d.ts +68 -0
  309. package/dist/ledger-store.d.ts.map +1 -0
  310. package/dist/ledger-store.js +111 -0
  311. package/dist/ledger-store.js.map +1 -0
  312. package/dist/loop-safety-observer.d.ts +132 -0
  313. package/dist/loop-safety-observer.d.ts.map +1 -0
  314. package/dist/loop-safety-observer.js +76 -0
  315. package/dist/loop-safety-observer.js.map +1 -0
  316. package/dist/loop-safety-store.d.ts +339 -0
  317. package/dist/loop-safety-store.d.ts.map +1 -0
  318. package/dist/loop-safety-store.js +800 -0
  319. package/dist/loop-safety-store.js.map +1 -0
  320. package/dist/machine-store.d.ts +54 -0
  321. package/dist/machine-store.d.ts.map +1 -0
  322. package/dist/machine-store.js +149 -0
  323. package/dist/machine-store.js.map +1 -0
  324. package/dist/mcp-main.d.ts +2 -0
  325. package/dist/mcp-main.d.ts.map +1 -0
  326. package/dist/mcp-main.js +116 -0
  327. package/dist/mcp-main.js.map +1 -0
  328. package/dist/mcp-server.d.ts +72 -0
  329. package/dist/mcp-server.d.ts.map +1 -0
  330. package/dist/mcp-server.js +259 -0
  331. package/dist/mcp-server.js.map +1 -0
  332. package/dist/model-routing.d.ts +75 -0
  333. package/dist/model-routing.d.ts.map +1 -0
  334. package/dist/model-routing.js +108 -0
  335. package/dist/model-routing.js.map +1 -0
  336. package/dist/model-transport.d.ts +188 -0
  337. package/dist/model-transport.d.ts.map +1 -0
  338. package/dist/model-transport.js +625 -0
  339. package/dist/model-transport.js.map +1 -0
  340. package/dist/notify-cadence.d.ts +55 -0
  341. package/dist/notify-cadence.d.ts.map +1 -0
  342. package/dist/notify-cadence.js +68 -0
  343. package/dist/notify-cadence.js.map +1 -0
  344. package/dist/notify-channel.d.ts +69 -0
  345. package/dist/notify-channel.d.ts.map +1 -0
  346. package/dist/notify-channel.js +151 -0
  347. package/dist/notify-channel.js.map +1 -0
  348. package/dist/notify.d.ts +71 -0
  349. package/dist/notify.d.ts.map +1 -0
  350. package/dist/notify.js +125 -0
  351. package/dist/notify.js.map +1 -0
  352. package/dist/observation-inventory.d.ts +65 -0
  353. package/dist/observation-inventory.d.ts.map +1 -0
  354. package/dist/observation-inventory.js +139 -0
  355. package/dist/observation-inventory.js.map +1 -0
  356. package/dist/owned-children.d.ts +45 -0
  357. package/dist/owned-children.d.ts.map +1 -0
  358. package/dist/owned-children.js +64 -0
  359. package/dist/owned-children.js.map +1 -0
  360. package/dist/packet-for-goal.d.ts +19 -0
  361. package/dist/packet-for-goal.d.ts.map +1 -0
  362. package/dist/packet-for-goal.js +32 -0
  363. package/dist/packet-for-goal.js.map +1 -0
  364. package/dist/pair-cmd.d.ts +85 -0
  365. package/dist/pair-cmd.d.ts.map +1 -0
  366. package/dist/pair-cmd.js +205 -0
  367. package/dist/pair-cmd.js.map +1 -0
  368. package/dist/partial-asker.d.ts +96 -0
  369. package/dist/partial-asker.d.ts.map +1 -0
  370. package/dist/partial-asker.js +117 -0
  371. package/dist/partial-asker.js.map +1 -0
  372. package/dist/pdf-text-lines.d.ts +17 -0
  373. package/dist/pdf-text-lines.d.ts.map +1 -0
  374. package/dist/pdf-text-lines.js +70 -0
  375. package/dist/pdf-text-lines.js.map +1 -0
  376. package/dist/pdf-text-worker.d.ts +2 -0
  377. package/dist/pdf-text-worker.d.ts.map +1 -0
  378. package/dist/pdf-text-worker.js +81 -0
  379. package/dist/pdf-text-worker.js.map +1 -0
  380. package/dist/pdf-text.d.ts +56 -0
  381. package/dist/pdf-text.d.ts.map +1 -0
  382. package/dist/pdf-text.js +64 -0
  383. package/dist/pdf-text.js.map +1 -0
  384. package/dist/pending-action.d.ts +154 -0
  385. package/dist/pending-action.d.ts.map +1 -0
  386. package/dist/pending-action.js +148 -0
  387. package/dist/pending-action.js.map +1 -0
  388. package/dist/preemptor.d.ts +40 -0
  389. package/dist/preemptor.d.ts.map +1 -0
  390. package/dist/preemptor.js +49 -0
  391. package/dist/preemptor.js.map +1 -0
  392. package/dist/programme-mode.d.ts +29 -0
  393. package/dist/programme-mode.d.ts.map +1 -0
  394. package/dist/programme-mode.js +50 -0
  395. package/dist/programme-mode.js.map +1 -0
  396. package/dist/progress-view.d.ts +14 -0
  397. package/dist/progress-view.d.ts.map +1 -0
  398. package/dist/progress-view.js +114 -0
  399. package/dist/progress-view.js.map +1 -0
  400. package/dist/project-graph-builder.d.ts +81 -0
  401. package/dist/project-graph-builder.d.ts.map +1 -0
  402. package/dist/project-graph-builder.js +246 -0
  403. package/dist/project-graph-builder.js.map +1 -0
  404. package/dist/project-graph-runtime.d.ts +86 -0
  405. package/dist/project-graph-runtime.d.ts.map +1 -0
  406. package/dist/project-graph-runtime.js +112 -0
  407. package/dist/project-graph-runtime.js.map +1 -0
  408. package/dist/project-index-builder.d.ts +96 -0
  409. package/dist/project-index-builder.d.ts.map +1 -0
  410. package/dist/project-index-builder.js +298 -0
  411. package/dist/project-index-builder.js.map +1 -0
  412. package/dist/project-index-facts.d.ts +51 -0
  413. package/dist/project-index-facts.d.ts.map +1 -0
  414. package/dist/project-index-facts.js +117 -0
  415. package/dist/project-index-facts.js.map +1 -0
  416. package/dist/project-index-store.d.ts +97 -0
  417. package/dist/project-index-store.d.ts.map +1 -0
  418. package/dist/project-index-store.js +140 -0
  419. package/dist/project-index-store.js.map +1 -0
  420. package/dist/project-memory-store.d.ts +127 -0
  421. package/dist/project-memory-store.d.ts.map +1 -0
  422. package/dist/project-memory-store.js +302 -0
  423. package/dist/project-memory-store.js.map +1 -0
  424. package/dist/proposal-store.d.ts +14 -0
  425. package/dist/proposal-store.d.ts.map +1 -0
  426. package/dist/proposal-store.js +19 -0
  427. package/dist/proposal-store.js.map +1 -0
  428. package/dist/prover.d.ts +80 -0
  429. package/dist/prover.d.ts.map +1 -0
  430. package/dist/prover.js +137 -0
  431. package/dist/prover.js.map +1 -0
  432. package/dist/provider-identity-store.d.ts +34 -0
  433. package/dist/provider-identity-store.d.ts.map +1 -0
  434. package/dist/provider-identity-store.js +72 -0
  435. package/dist/provider-identity-store.js.map +1 -0
  436. package/dist/provider-identity.d.ts +104 -0
  437. package/dist/provider-identity.d.ts.map +1 -0
  438. package/dist/provider-identity.js +167 -0
  439. package/dist/provider-identity.js.map +1 -0
  440. package/dist/provider-limit.d.ts +79 -0
  441. package/dist/provider-limit.d.ts.map +1 -0
  442. package/dist/provider-limit.js +148 -0
  443. package/dist/provider-limit.js.map +1 -0
  444. package/dist/provider-preflight.d.ts +171 -0
  445. package/dist/provider-preflight.d.ts.map +1 -0
  446. package/dist/provider-preflight.js +395 -0
  447. package/dist/provider-preflight.js.map +1 -0
  448. package/dist/provider-state.d.ts +120 -0
  449. package/dist/provider-state.d.ts.map +1 -0
  450. package/dist/provider-state.js +182 -0
  451. package/dist/provider-state.js.map +1 -0
  452. package/dist/providers.d.ts +132 -0
  453. package/dist/providers.d.ts.map +1 -0
  454. package/dist/providers.js +161 -0
  455. package/dist/providers.js.map +1 -0
  456. package/dist/publication-recorder.d.ts +117 -0
  457. package/dist/publication-recorder.d.ts.map +1 -0
  458. package/dist/publication-recorder.js +124 -0
  459. package/dist/publication-recorder.js.map +1 -0
  460. package/dist/pursuit-delivery.d.ts +24 -0
  461. package/dist/pursuit-delivery.d.ts.map +1 -0
  462. package/dist/pursuit-delivery.js +38 -0
  463. package/dist/pursuit-delivery.js.map +1 -0
  464. package/dist/queue-store.d.ts +132 -0
  465. package/dist/queue-store.d.ts.map +1 -0
  466. package/dist/queue-store.js +185 -0
  467. package/dist/queue-store.js.map +1 -0
  468. package/dist/queue-summary.d.ts +14 -0
  469. package/dist/queue-summary.d.ts.map +1 -0
  470. package/dist/queue-summary.js +82 -0
  471. package/dist/queue-summary.js.map +1 -0
  472. package/dist/queue-view.d.ts +20 -0
  473. package/dist/queue-view.d.ts.map +1 -0
  474. package/dist/queue-view.js +163 -0
  475. package/dist/queue-view.js.map +1 -0
  476. package/dist/queue-write-lease.d.ts +106 -0
  477. package/dist/queue-write-lease.d.ts.map +1 -0
  478. package/dist/queue-write-lease.js +282 -0
  479. package/dist/queue-write-lease.js.map +1 -0
  480. package/dist/rails-home.d.ts +162 -0
  481. package/dist/rails-home.d.ts.map +1 -0
  482. package/dist/rails-home.js +452 -0
  483. package/dist/rails-home.js.map +1 -0
  484. package/dist/rails-migrations.d.ts +75 -0
  485. package/dist/rails-migrations.d.ts.map +1 -0
  486. package/dist/rails-migrations.js +199 -0
  487. package/dist/rails-migrations.js.map +1 -0
  488. package/dist/rails-stores.d.ts +49 -0
  489. package/dist/rails-stores.d.ts.map +1 -0
  490. package/dist/rails-stores.js +100 -0
  491. package/dist/rails-stores.js.map +1 -0
  492. package/dist/reaper.d.ts +69 -0
  493. package/dist/reaper.d.ts.map +1 -0
  494. package/dist/reaper.js +152 -0
  495. package/dist/reaper.js.map +1 -0
  496. package/dist/record-store.d.ts +36 -0
  497. package/dist/record-store.d.ts.map +1 -0
  498. package/dist/record-store.js +78 -0
  499. package/dist/record-store.js.map +1 -0
  500. package/dist/recovery-io.d.ts +50 -0
  501. package/dist/recovery-io.d.ts.map +1 -0
  502. package/dist/recovery-io.js +122 -0
  503. package/dist/recovery-io.js.map +1 -0
  504. package/dist/recovery.d.ts +146 -0
  505. package/dist/recovery.d.ts.map +1 -0
  506. package/dist/recovery.js +110 -0
  507. package/dist/recovery.js.map +1 -0
  508. package/dist/redraw.d.ts +34 -0
  509. package/dist/redraw.d.ts.map +1 -0
  510. package/dist/redraw.js +62 -0
  511. package/dist/redraw.js.map +1 -0
  512. package/dist/rejected-evidence.d.ts +255 -0
  513. package/dist/rejected-evidence.d.ts.map +1 -0
  514. package/dist/rejected-evidence.js +324 -0
  515. package/dist/rejected-evidence.js.map +1 -0
  516. package/dist/report-cmd.d.ts +32 -0
  517. package/dist/report-cmd.d.ts.map +1 -0
  518. package/dist/report-cmd.js +201 -0
  519. package/dist/report-cmd.js.map +1 -0
  520. package/dist/repos-cmd.d.ts +80 -0
  521. package/dist/repos-cmd.d.ts.map +1 -0
  522. package/dist/repos-cmd.js +240 -0
  523. package/dist/repos-cmd.js.map +1 -0
  524. package/dist/request-body-shape.d.ts +93 -0
  525. package/dist/request-body-shape.d.ts.map +1 -0
  526. package/dist/request-body-shape.js +407 -0
  527. package/dist/request-body-shape.js.map +1 -0
  528. package/dist/requirement-claims.d.ts +89 -0
  529. package/dist/requirement-claims.d.ts.map +1 -0
  530. package/dist/requirement-claims.js +92 -0
  531. package/dist/requirement-claims.js.map +1 -0
  532. package/dist/retention-apply-runtime.d.ts +105 -0
  533. package/dist/retention-apply-runtime.d.ts.map +1 -0
  534. package/dist/retention-apply-runtime.js +269 -0
  535. package/dist/retention-apply-runtime.js.map +1 -0
  536. package/dist/reverify.d.ts +41 -0
  537. package/dist/reverify.d.ts.map +1 -0
  538. package/dist/reverify.js +69 -0
  539. package/dist/reverify.js.map +1 -0
  540. package/dist/round-records.d.ts +65 -0
  541. package/dist/round-records.d.ts.map +1 -0
  542. package/dist/round-records.js +61 -0
  543. package/dist/round-records.js.map +1 -0
  544. package/dist/round-runner.d.ts +924 -0
  545. package/dist/round-runner.d.ts.map +1 -0
  546. package/dist/round-runner.js +1693 -0
  547. package/dist/round-runner.js.map +1 -0
  548. package/dist/run-approval.d.ts +180 -0
  549. package/dist/run-approval.d.ts.map +1 -0
  550. package/dist/run-approval.js +199 -0
  551. package/dist/run-approval.js.map +1 -0
  552. package/dist/run-cmd.d.ts +359 -0
  553. package/dist/run-cmd.d.ts.map +1 -0
  554. package/dist/run-cmd.js +4418 -0
  555. package/dist/run-cmd.js.map +1 -0
  556. package/dist/run-delivery.d.ts +71 -0
  557. package/dist/run-delivery.d.ts.map +1 -0
  558. package/dist/run-delivery.js +104 -0
  559. package/dist/run-delivery.js.map +1 -0
  560. package/dist/run-ended.d.ts +75 -0
  561. package/dist/run-ended.d.ts.map +1 -0
  562. package/dist/run-ended.js +27 -0
  563. package/dist/run-ended.js.map +1 -0
  564. package/dist/run-ending-locator.d.ts +125 -0
  565. package/dist/run-ending-locator.d.ts.map +1 -0
  566. package/dist/run-ending-locator.js +133 -0
  567. package/dist/run-ending-locator.js.map +1 -0
  568. package/dist/run-launcher.d.ts +459 -0
  569. package/dist/run-launcher.d.ts.map +1 -0
  570. package/dist/run-launcher.js +652 -0
  571. package/dist/run-launcher.js.map +1 -0
  572. package/dist/run-lease.d.ts +208 -0
  573. package/dist/run-lease.d.ts.map +1 -0
  574. package/dist/run-lease.js +301 -0
  575. package/dist/run-lease.js.map +1 -0
  576. package/dist/run-refusal-marks.d.ts +189 -0
  577. package/dist/run-refusal-marks.d.ts.map +1 -0
  578. package/dist/run-refusal-marks.js +249 -0
  579. package/dist/run-refusal-marks.js.map +1 -0
  580. package/dist/run-start-marks.d.ts +153 -0
  581. package/dist/run-start-marks.d.ts.map +1 -0
  582. package/dist/run-start-marks.js +269 -0
  583. package/dist/run-start-marks.js.map +1 -0
  584. package/dist/scan-cmd.d.ts +14 -0
  585. package/dist/scan-cmd.d.ts.map +1 -0
  586. package/dist/scan-cmd.js +270 -0
  587. package/dist/scan-cmd.js.map +1 -0
  588. package/dist/scan-events.d.ts +50 -0
  589. package/dist/scan-events.d.ts.map +1 -0
  590. package/dist/scan-events.js +91 -0
  591. package/dist/scan-events.js.map +1 -0
  592. package/dist/scan.d.ts +191 -0
  593. package/dist/scan.d.ts.map +1 -0
  594. package/dist/scan.js +417 -0
  595. package/dist/scan.js.map +1 -0
  596. package/dist/scope-rule.d.ts +148 -0
  597. package/dist/scope-rule.d.ts.map +1 -0
  598. package/dist/scope-rule.js +121 -0
  599. package/dist/scope-rule.js.map +1 -0
  600. package/dist/self-repo-id.d.ts +18 -0
  601. package/dist/self-repo-id.d.ts.map +1 -0
  602. package/dist/self-repo-id.js +70 -0
  603. package/dist/self-repo-id.js.map +1 -0
  604. package/dist/serve-cmd.d.ts +115 -0
  605. package/dist/serve-cmd.d.ts.map +1 -0
  606. package/dist/serve-cmd.js +505 -0
  607. package/dist/serve-cmd.js.map +1 -0
  608. package/dist/serve.d.ts +167 -0
  609. package/dist/serve.d.ts.map +1 -0
  610. package/dist/serve.js +336 -0
  611. package/dist/serve.js.map +1 -0
  612. package/dist/server-client.d.ts +766 -0
  613. package/dist/server-client.d.ts.map +1 -0
  614. package/dist/server-client.js +475 -0
  615. package/dist/server-client.js.map +1 -0
  616. package/dist/session-adapter-runtime.d.ts +195 -0
  617. package/dist/session-adapter-runtime.d.ts.map +1 -0
  618. package/dist/session-adapter-runtime.js +373 -0
  619. package/dist/session-adapter-runtime.js.map +1 -0
  620. package/dist/session-checkpoint-runtime.d.ts +62 -0
  621. package/dist/session-checkpoint-runtime.d.ts.map +1 -0
  622. package/dist/session-checkpoint-runtime.js +268 -0
  623. package/dist/session-checkpoint-runtime.js.map +1 -0
  624. package/dist/session-control-transport.d.ts +106 -0
  625. package/dist/session-control-transport.d.ts.map +1 -0
  626. package/dist/session-control-transport.js +232 -0
  627. package/dist/session-control-transport.js.map +1 -0
  628. package/dist/session-observation-store.d.ts +98 -0
  629. package/dist/session-observation-store.d.ts.map +1 -0
  630. package/dist/session-observation-store.js +155 -0
  631. package/dist/session-observation-store.js.map +1 -0
  632. package/dist/session-observe-runtime.d.ts +123 -0
  633. package/dist/session-observe-runtime.d.ts.map +1 -0
  634. package/dist/session-observe-runtime.js +317 -0
  635. package/dist/session-observe-runtime.js.map +1 -0
  636. package/dist/session-store.d.ts +98 -0
  637. package/dist/session-store.d.ts.map +1 -0
  638. package/dist/session-store.js +116 -0
  639. package/dist/session-store.js.map +1 -0
  640. package/dist/sessions-cmd.d.ts +202 -0
  641. package/dist/sessions-cmd.d.ts.map +1 -0
  642. package/dist/sessions-cmd.js +609 -0
  643. package/dist/sessions-cmd.js.map +1 -0
  644. package/dist/settings-overlay.d.ts +53 -0
  645. package/dist/settings-overlay.d.ts.map +1 -0
  646. package/dist/settings-overlay.js +175 -0
  647. package/dist/settings-overlay.js.map +1 -0
  648. package/dist/setup-prompt.d.ts +34 -0
  649. package/dist/setup-prompt.d.ts.map +1 -0
  650. package/dist/setup-prompt.js +92 -0
  651. package/dist/setup-prompt.js.map +1 -0
  652. package/dist/setup.d.ts +103 -0
  653. package/dist/setup.d.ts.map +1 -0
  654. package/dist/setup.js +283 -0
  655. package/dist/setup.js.map +1 -0
  656. package/dist/shared-grants.d.ts +164 -0
  657. package/dist/shared-grants.d.ts.map +1 -0
  658. package/dist/shared-grants.js +242 -0
  659. package/dist/shared-grants.js.map +1 -0
  660. package/dist/signals.d.ts +55 -0
  661. package/dist/signals.d.ts.map +1 -0
  662. package/dist/signals.js +85 -0
  663. package/dist/signals.js.map +1 -0
  664. package/dist/source-cmd.d.ts +201 -0
  665. package/dist/source-cmd.d.ts.map +1 -0
  666. package/dist/source-cmd.js +684 -0
  667. package/dist/source-cmd.js.map +1 -0
  668. package/dist/source-verdict.d.ts +99 -0
  669. package/dist/source-verdict.d.ts.map +1 -0
  670. package/dist/source-verdict.js +182 -0
  671. package/dist/source-verdict.js.map +1 -0
  672. package/dist/spend-ledger.d.ts +350 -0
  673. package/dist/spend-ledger.d.ts.map +1 -0
  674. package/dist/spend-ledger.js +546 -0
  675. package/dist/spend-ledger.js.map +1 -0
  676. package/dist/stale-run-sweep.d.ts +79 -0
  677. package/dist/stale-run-sweep.d.ts.map +1 -0
  678. package/dist/stale-run-sweep.js +116 -0
  679. package/dist/stale-run-sweep.js.map +1 -0
  680. package/dist/start-attempts.d.ts +385 -0
  681. package/dist/start-attempts.d.ts.map +1 -0
  682. package/dist/start-attempts.js +613 -0
  683. package/dist/start-attempts.js.map +1 -0
  684. package/dist/status-cmd.d.ts +28 -0
  685. package/dist/status-cmd.d.ts.map +1 -0
  686. package/dist/status-cmd.js +116 -0
  687. package/dist/status-cmd.js.map +1 -0
  688. package/dist/stop-follow-up.d.ts +107 -0
  689. package/dist/stop-follow-up.d.ts.map +1 -0
  690. package/dist/stop-follow-up.js +172 -0
  691. package/dist/stop-follow-up.js.map +1 -0
  692. package/dist/surface-lease.d.ts +118 -0
  693. package/dist/surface-lease.d.ts.map +1 -0
  694. package/dist/surface-lease.js +485 -0
  695. package/dist/surface-lease.js.map +1 -0
  696. package/dist/sync.d.ts +54 -0
  697. package/dist/sync.d.ts.map +1 -0
  698. package/dist/sync.js +93 -0
  699. package/dist/sync.js.map +1 -0
  700. package/dist/syncing-ledger.d.ts +45 -0
  701. package/dist/syncing-ledger.d.ts.map +1 -0
  702. package/dist/syncing-ledger.js +53 -0
  703. package/dist/syncing-ledger.js.map +1 -0
  704. package/dist/temp-fixtures.d.ts +68 -0
  705. package/dist/temp-fixtures.d.ts.map +1 -0
  706. package/dist/temp-fixtures.js +38 -0
  707. package/dist/temp-fixtures.js.map +1 -0
  708. package/dist/token-window.d.ts +84 -0
  709. package/dist/token-window.d.ts.map +1 -0
  710. package/dist/token-window.js +143 -0
  711. package/dist/token-window.js.map +1 -0
  712. package/dist/tool-bridge.d.ts +177 -0
  713. package/dist/tool-bridge.d.ts.map +1 -0
  714. package/dist/tool-bridge.js +329 -0
  715. package/dist/tool-bridge.js.map +1 -0
  716. package/dist/tool-call-record.d.ts +197 -0
  717. package/dist/tool-call-record.d.ts.map +1 -0
  718. package/dist/tool-call-record.js +276 -0
  719. package/dist/tool-call-record.js.map +1 -0
  720. package/dist/tool-protocol.d.ts +135 -0
  721. package/dist/tool-protocol.d.ts.map +1 -0
  722. package/dist/tool-protocol.js +104 -0
  723. package/dist/tool-protocol.js.map +1 -0
  724. package/dist/tool-worker.d.ts +3 -0
  725. package/dist/tool-worker.d.ts.map +1 -0
  726. package/dist/tool-worker.js +478 -0
  727. package/dist/tool-worker.js.map +1 -0
  728. package/dist/toolchain-mirror.d.ts +86 -0
  729. package/dist/toolchain-mirror.d.ts.map +1 -0
  730. package/dist/toolchain-mirror.js +307 -0
  731. package/dist/toolchain-mirror.js.map +1 -0
  732. package/dist/trusted-git.d.ts +243 -0
  733. package/dist/trusted-git.d.ts.map +1 -0
  734. package/dist/trusted-git.js +920 -0
  735. package/dist/trusted-git.js.map +1 -0
  736. package/dist/ui.d.ts +76 -0
  737. package/dist/ui.d.ts.map +1 -0
  738. package/dist/ui.js +118 -0
  739. package/dist/ui.js.map +1 -0
  740. package/dist/untrusted-exec.d.ts +275 -0
  741. package/dist/untrusted-exec.d.ts.map +1 -0
  742. package/dist/untrusted-exec.js +479 -0
  743. package/dist/untrusted-exec.js.map +1 -0
  744. package/dist/untrusted-gate.d.ts +73 -0
  745. package/dist/untrusted-gate.d.ts.map +1 -0
  746. package/dist/untrusted-gate.js +226 -0
  747. package/dist/untrusted-gate.js.map +1 -0
  748. package/dist/uploader.d.ts +153 -0
  749. package/dist/uploader.d.ts.map +1 -0
  750. package/dist/uploader.js +204 -0
  751. package/dist/uploader.js.map +1 -0
  752. package/dist/verifier.d.ts +66 -0
  753. package/dist/verifier.d.ts.map +1 -0
  754. package/dist/verifier.js +170 -0
  755. package/dist/verifier.js.map +1 -0
  756. package/dist/verify-apply.d.ts +26 -0
  757. package/dist/verify-apply.d.ts.map +1 -0
  758. package/dist/verify-apply.js +36 -0
  759. package/dist/verify-apply.js.map +1 -0
  760. package/dist/verify-cmd.d.ts +44 -0
  761. package/dist/verify-cmd.d.ts.map +1 -0
  762. package/dist/verify-cmd.js +125 -0
  763. package/dist/verify-cmd.js.map +1 -0
  764. package/dist/verify-pass.d.ts +73 -0
  765. package/dist/verify-pass.d.ts.map +1 -0
  766. package/dist/verify-pass.js +103 -0
  767. package/dist/verify-pass.js.map +1 -0
  768. package/dist/welcome.d.ts +43 -0
  769. package/dist/welcome.d.ts.map +1 -0
  770. package/dist/welcome.js +116 -0
  771. package/dist/welcome.js.map +1 -0
  772. package/dist/workspace-provisioner.d.ts +65 -0
  773. package/dist/workspace-provisioner.d.ts.map +1 -0
  774. package/dist/workspace-provisioner.js +66 -0
  775. package/dist/workspace-provisioner.js.map +1 -0
  776. package/dist/workspace-quarantine.d.ts +64 -0
  777. package/dist/workspace-quarantine.d.ts.map +1 -0
  778. package/dist/workspace-quarantine.js +156 -0
  779. package/dist/workspace-quarantine.js.map +1 -0
  780. package/dist/workspace-residue-sweep.d.ts +113 -0
  781. package/dist/workspace-residue-sweep.d.ts.map +1 -0
  782. package/dist/workspace-residue-sweep.js +158 -0
  783. package/dist/workspace-residue-sweep.js.map +1 -0
  784. package/dist/workspace.d.ts +639 -0
  785. package/dist/workspace.d.ts.map +1 -0
  786. package/dist/workspace.js +2026 -0
  787. package/dist/workspace.js.map +1 -0
  788. package/package.json +52 -4
  789. package/win/CredProbe.cs +64 -0
  790. package/win/FakeClaude.cs +56 -0
  791. package/win/HandleProbe.cs +116 -0
  792. package/win/TokenProbe.cs +53 -0
  793. package/win/appcontainer.ps1 +500 -0
package/dist/reaper.js ADDED
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROVISIONED_MARKER = void 0;
4
+ exports.writeProvisionedMarker = writeProvisionedMarker;
5
+ exports.provisionedByDaemon = provisionedByDaemon;
6
+ exports.idleMinutesOf = idleMinutesOf;
7
+ exports.reapOneProvisioned = reapOneProvisioned;
8
+ exports.nodeReaper = nodeReaper;
9
+ exports.hasProvisionedMarker = hasProvisionedMarker;
10
+ const node_fs_1 = require("node:fs");
11
+ const node_os_1 = require("node:os");
12
+ const node_path_1 = require("node:path");
13
+ const git_driver_1 = require("./git-driver");
14
+ const workspace_1 = require("./workspace");
15
+ /**
16
+ * THE MACHINE RETIRES WHAT IT MADE — when the project asked (M4-4).
17
+ *
18
+ * ─────────────────────────────────────────────────────────────────────────────
19
+ * Since M4-1 the daemon can make checkouts, and nothing removed them: idle ones
20
+ * accumulated up to `machine.max_workspaces` until a person ran the manual
21
+ * reap. With `machine.reap_provisioned: true` the daemon retires, at most ONE
22
+ * per cadence, after the tick, a checkout that meets ALL of:
23
+ *
24
+ * 1. IT MADE IT — the provisioner leaves `provisioned.json` in the checkout's
25
+ * state dir; a checkout a person cut carries none and is never touched;
26
+ * 2. NOTHING RUNS THERE — `abandonedWorkspaces` lists it (no record claims
27
+ * it, no live lease, no live creation marker), or its only record is of a
28
+ * run that has DIED (an orphan the manual command retires the same way);
29
+ * 3. IT HAS BEEN IDLE for at least `machine.idle_checkout_minutes`, measured
30
+ * from the newest of the marker and anything written to its state dir;
31
+ * 4. THE MANUAL COMMAND'S OWN FUNCTIONS AGREE — `reapAbandoned` /
32
+ * `reapWorkspace`: not busy, not quarantined, no residue (uncommitted or
33
+ * untracked work keeps it, with the reason), records retained, then
34
+ * `git worktree remove` and prune.
35
+ *
36
+ * 🔴 NEVER A CHECKOUT THAT IS ABOUT TO BE USED. The daemon hands over the
37
+ * paths it placed a goal into this cadence and last (a launch is not an
38
+ * arrival: the run has not written its lease yet) and the one it provisioned
39
+ * this cadence; none of those is a candidate. And an orphan's checkout that a
40
+ * LIVE run now occupies is not touched either — the dead record is somebody
41
+ * else's leftover, the checkout is in use.
42
+ *
43
+ * ⚠️ AND IT KNOWS NOTHING ABOUT GOALS. A checkout is a checkout.
44
+ */
45
+ exports.PROVISIONED_MARKER = 'provisioned.json';
46
+ /** Written by the provisioner once the checkout is complete: the fact that the machine made it. */
47
+ function writeProvisionedMarker(stateDir, at, pid) {
48
+ const marker = { by: 'daemon', at, pid };
49
+ const tmp = (0, node_path_1.join)(stateDir, `${exports.PROVISIONED_MARKER}.${pid}.tmp`);
50
+ (0, node_fs_1.writeFileSync)(tmp, `${JSON.stringify(marker, null, 2)}\n`);
51
+ (0, node_fs_1.renameSync)(tmp, (0, node_path_1.join)(stateDir, exports.PROVISIONED_MARKER));
52
+ }
53
+ function provisionedByDaemon(checkout) {
54
+ try {
55
+ const raw = JSON.parse((0, node_fs_1.readFileSync)((0, node_path_1.join)(checkout, git_driver_1.STATE_DIR, 'state', exports.PROVISIONED_MARKER), 'utf8'));
56
+ return raw.by === 'daemon' && typeof raw.at === 'string' && typeof raw.pid === 'number' ? { by: 'daemon', at: raw.at, pid: raw.pid } : null;
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ /** Minutes since anything last happened in the checkout: the marker, or the newest entry of its state dir. */
63
+ function idleMinutesOf(checkout, marker, now) {
64
+ let newest = Date.parse(marker.at) || 0;
65
+ const stateDir = (0, node_path_1.join)(checkout, git_driver_1.STATE_DIR, 'state');
66
+ try {
67
+ for (const name of (0, node_fs_1.readdirSync)(stateDir)) {
68
+ try {
69
+ newest = Math.max(newest, (0, node_fs_1.statSync)((0, node_path_1.join)(stateDir, name)).mtimeMs);
70
+ }
71
+ catch {
72
+ /* a file that vanished between readdir and stat */
73
+ }
74
+ }
75
+ }
76
+ catch {
77
+ /* no state dir: the marker is all there is */
78
+ }
79
+ return Math.max(0, (now - newest) / 60_000);
80
+ }
81
+ const same = (p) => (0, node_path_1.resolve)(p).toLowerCase();
82
+ /** One cadence's reaping: the first eligible checkout in path order, and only one. */
83
+ async function reapOneProvisioned(deps) {
84
+ const probe = deps.probe ?? workspace_1.nodeProbe;
85
+ const home = deps.home ?? (0, node_os_1.homedir)();
86
+ const { abandoned } = (0, workspace_1.abandonedWorkspaces)(deps.cwd, deps.registry, probe, home);
87
+ const orphans = deps.registry
88
+ .list()
89
+ .flatMap((e) => (e.kind === 'orphaned' ? [e.record] : []));
90
+ const candidates = [
91
+ ...abandoned.map((path) => ({ path, kind: 'abandoned' })),
92
+ ...orphans.map((record) => ({ path: record.workspace, kind: 'orphaned', record })),
93
+ ].sort((a, b) => (a.path < b.path ? -1 : a.path > b.path ? 1 : 0));
94
+ const excluded = new Set((deps.exclude ?? []).map(same));
95
+ for (const c of candidates) {
96
+ if (excluded.has(same(c.path)))
97
+ continue;
98
+ // A dead record's checkout may be somebody's now: a live lease there is a run, whatever the record says.
99
+ if (c.kind === 'orphaned' && (0, workspace_1.checkoutBusy)((0, node_path_1.join)(c.path, git_driver_1.STATE_DIR, 'state'), probe))
100
+ continue;
101
+ const marker = provisionedByDaemon(c.path);
102
+ if (marker === null)
103
+ continue;
104
+ const idle = idleMinutesOf(c.path, marker, deps.now());
105
+ if (idle < deps.idleMinutes)
106
+ continue;
107
+ if (c.kind === 'abandoned') {
108
+ const out = await (0, workspace_1.reapAbandoned)(deps.git, deps.cwd, c.path, probe, undefined, home);
109
+ if (out.reaped) {
110
+ deps.log(`daemon : retired the checkout it made at ${c.path} — idle ${Math.floor(idle)} min, nothing referenced it, no residue`);
111
+ return 'retired';
112
+ }
113
+ deps.log(`daemon : kept the checkout it made at ${c.path} — ${out.because ?? 'unknown'}`);
114
+ return 'kept';
115
+ }
116
+ const out = await (0, workspace_1.reapWorkspace)(deps.git, deps.registry, c.record, deps.cwd, probe, undefined, home);
117
+ if (out.reaped) {
118
+ deps.log(`daemon : retired the checkout it made at ${c.path} — idle ${Math.floor(idle)} min, its run ${c.record.runId} had died` +
119
+ (out.evidenceAt === undefined ? '' : `; its records kept at ${out.evidenceAt}`));
120
+ return 'retired';
121
+ }
122
+ deps.log(`daemon : kept the checkout it made at ${c.path} — ${out.because ?? 'unknown'}`);
123
+ return 'kept';
124
+ }
125
+ return 'none';
126
+ }
127
+ /** The daemon's reaper: built only behind `machine.reap_provisioned`; a failure is a log line, never a stopped daemon. */
128
+ function nodeReaper(cwd, projectState, opts) {
129
+ return async (exclude = []) => {
130
+ try {
131
+ return await reapOneProvisioned({
132
+ cwd,
133
+ registry: new workspace_1.RunRegistry(projectState),
134
+ git: new git_driver_1.GitDriver((0, git_driver_1.nodeGitExec)(cwd)),
135
+ now: opts.now ?? (() => Date.now()),
136
+ idleMinutes: opts.idleMinutes,
137
+ log: opts.log,
138
+ exclude,
139
+ ...(opts.home === undefined ? {} : { home: opts.home }),
140
+ });
141
+ }
142
+ catch (e) {
143
+ opts.log(`daemon : could not retire a checkout it made — ${e.message}`);
144
+ return 'failed';
145
+ }
146
+ };
147
+ }
148
+ /** For `looply runs` and tests: is there a marker at all? */
149
+ function hasProvisionedMarker(checkout) {
150
+ return (0, node_fs_1.existsSync)((0, node_path_1.join)(checkout, git_driver_1.STATE_DIR, 'state', exports.PROVISIONED_MARKER));
151
+ }
152
+ //# sourceMappingURL=reaper.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reaper.js","sourceRoot":"","sources":["../src/reaper.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,36 @@
1
+ import type { LedgerFs } from './ledger-store';
2
+ /**
3
+ * AN APPEND-ONLY RECORD FILE ON THE MACHINE — `.looply/state/<file>.jsonl`.
4
+ *
5
+ * One record per line, written once and never edited, the ledger's own shape:
6
+ * the file is a history a fresh process reads back in full. Keyed by the
7
+ * record's id, so a caller can ask "is this already on record" before doing
8
+ * the thing the record describes.
9
+ *
10
+ * ⚠️ A LINE THAT CANNOT BE READ IS SKIPPED AND COUNTED, never a throw: a torn
11
+ * write at the tail must not take the whole history with it, and a count is
12
+ * how a person finds out it happened.
13
+ */
14
+ export declare class AppendOnlyStore<T extends {
15
+ readonly id: string;
16
+ }> {
17
+ private readonly stateDir;
18
+ private readonly file;
19
+ private readonly accept;
20
+ private readonly fs;
21
+ private readonly byId;
22
+ private opened;
23
+ private unreadable;
24
+ constructor(stateDir: string, file: string, accept: (v: unknown) => v is T, fs: LedgerFs);
25
+ private get path();
26
+ isOpen(): boolean;
27
+ open(): Promise<{
28
+ records: number;
29
+ unreadable: number;
30
+ }>;
31
+ find(id: string): T | null;
32
+ all(): T[];
33
+ /** Written once. Appending an id already on record is a programming error, not a second answer. */
34
+ append(record: T): Promise<void>;
35
+ }
36
+ //# sourceMappingURL=record-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-store.d.ts","sourceRoot":"","sources":["../src/record-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe,CAAC,CAAC,SAAS;IAAE,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAA;CAAE;IAM1D,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,MAAM;IACvB,OAAO,CAAC,QAAQ,CAAC,EAAE;IARrB,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAwB;IAC7C,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAK;gBAGJ,QAAQ,EAAE,MAAM,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,IAAI,CAAC,EAC9B,EAAE,EAAE,QAAQ;IAG/B,OAAO,KAAK,IAAI,GAEf;IAED,MAAM,IAAI,OAAO;IAIX,IAAI,IAAI,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;IAwB9D,IAAI,CAAC,EAAE,EAAE,MAAM,GAAG,CAAC,GAAG,IAAI;IAI1B,GAAG,IAAI,CAAC,EAAE;IAIV,mGAAmG;IAC7F,MAAM,CAAC,MAAM,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;CAMvC"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AppendOnlyStore = void 0;
4
+ /**
5
+ * AN APPEND-ONLY RECORD FILE ON THE MACHINE — `.looply/state/<file>.jsonl`.
6
+ *
7
+ * One record per line, written once and never edited, the ledger's own shape:
8
+ * the file is a history a fresh process reads back in full. Keyed by the
9
+ * record's id, so a caller can ask "is this already on record" before doing
10
+ * the thing the record describes.
11
+ *
12
+ * ⚠️ A LINE THAT CANNOT BE READ IS SKIPPED AND COUNTED, never a throw: a torn
13
+ * write at the tail must not take the whole history with it, and a count is
14
+ * how a person finds out it happened.
15
+ */
16
+ class AppendOnlyStore {
17
+ stateDir;
18
+ file;
19
+ accept;
20
+ fs;
21
+ byId = new Map();
22
+ opened = false;
23
+ unreadable = 0;
24
+ constructor(stateDir, file, accept, fs) {
25
+ this.stateDir = stateDir;
26
+ this.file = file;
27
+ this.accept = accept;
28
+ this.fs = fs;
29
+ }
30
+ get path() {
31
+ return `${this.stateDir}/${this.file}`;
32
+ }
33
+ isOpen() {
34
+ return this.opened;
35
+ }
36
+ async open() {
37
+ await this.fs.mkdir(this.stateDir);
38
+ const text = await this.fs.readFile(this.path);
39
+ this.byId.clear();
40
+ this.unreadable = 0;
41
+ for (const line of (text ?? '').split('\n')) {
42
+ if (line.trim() === '')
43
+ continue;
44
+ let parsed;
45
+ try {
46
+ parsed = JSON.parse(line);
47
+ }
48
+ catch {
49
+ this.unreadable += 1;
50
+ continue;
51
+ }
52
+ if (!this.accept(parsed)) {
53
+ this.unreadable += 1;
54
+ continue;
55
+ }
56
+ this.byId.set(parsed.id, parsed);
57
+ }
58
+ this.opened = true;
59
+ return { records: this.byId.size, unreadable: this.unreadable };
60
+ }
61
+ find(id) {
62
+ return this.byId.get(id) ?? null;
63
+ }
64
+ all() {
65
+ return [...this.byId.values()];
66
+ }
67
+ /** Written once. Appending an id already on record is a programming error, not a second answer. */
68
+ async append(record) {
69
+ if (!this.opened)
70
+ throw new Error(`${this.file}: append before open()`);
71
+ if (this.byId.has(record.id))
72
+ throw new Error(`${this.file}: ${record.id} is already on record`);
73
+ await this.fs.appendFile(this.path, `${JSON.stringify(record)}\n`);
74
+ this.byId.set(record.id, record);
75
+ }
76
+ }
77
+ exports.AppendOnlyStore = AppendOnlyStore;
78
+ //# sourceMappingURL=record-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"record-store.js","sourceRoot":"","sources":["../src/record-store.ts"],"names":[],"mappings":";;;AAEA;;;;;;;;;;;GAWG;AACH,MAAa,eAAe;IAMP;IACA;IACA;IACA;IARF,IAAI,GAAG,IAAI,GAAG,EAAa,CAAC;IACrC,MAAM,GAAG,KAAK,CAAC;IACf,UAAU,GAAG,CAAC,CAAC;IAEvB,YACmB,QAAgB,EAChB,IAAY,EACZ,MAA8B,EAC9B,EAAY;QAHZ,aAAQ,GAAR,QAAQ,CAAQ;QAChB,SAAI,GAAJ,IAAI,CAAQ;QACZ,WAAM,GAAN,MAAM,CAAwB;QAC9B,OAAE,GAAF,EAAE,CAAU;IAC5B,CAAC;IAEJ,IAAY,IAAI;QACd,OAAO,GAAG,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,MAAM;QACJ,OAAO,IAAI,CAAC,MAAM,CAAC;IACrB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnC,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC/C,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC;QAClB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,KAAK,MAAM,IAAI,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YAC5C,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE;gBAAE,SAAS;YACjC,IAAI,MAAe,CAAC;YACpB,IAAI,CAAC;gBACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;YAC5B,CAAC;YAAC,MAAM,CAAC;gBACP,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC;gBACzB,IAAI,CAAC,UAAU,IAAI,CAAC,CAAC;gBACrB,SAAS;YACX,CAAC;YACD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;QACnC,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,UAAU,EAAE,CAAC;IAClE,CAAC;IAED,IAAI,CAAC,EAAU;QACb,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC;IACnC,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IACjC,CAAC;IAED,mGAAmG;IACnG,KAAK,CAAC,MAAM,CAAC,MAAS;QACpB,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,wBAAwB,CAAC,CAAC;QACxE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,GAAG,IAAI,CAAC,IAAI,KAAK,MAAM,CAAC,EAAE,uBAAuB,CAAC,CAAC;QACjG,MAAM,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACnE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;IACnC,CAAC;CACF;AA3DD,0CA2DC"}
@@ -0,0 +1,50 @@
1
+ import { type Recovery } from './recovery';
2
+ import type { RunnerQueue } from './round-runner';
3
+ import type { AnyEventInput } from './ledger-store';
4
+ /**
5
+ * Carrying out what the classifier decided.
6
+ *
7
+ * Deliberately separate from the decision, so the policy is a pure function
8
+ * over evidence and this is the only place with effects. Nothing here decides
9
+ * anything; if it is reached, the tree was already proven clean.
10
+ *
11
+ * Event-first. The machine does not reach across and patch the server's Run,
12
+ * Round and Item rows — it says what happened on the ledger it already owns and
13
+ * every projection converges from that. One execution history, many mirrors,
14
+ * and a repair that is visible in the same place as the work it repairs.
15
+ */
16
+ export interface RecoveryIo {
17
+ /**
18
+ * Omitted by a caller that holds no lease — the daemon at startup.
19
+ *
20
+ * Item repairs are then *refused* rather than skipped. A silent skip is how a
21
+ * repair somebody expected becomes one nobody notices did not happen, and the
22
+ * two callers here differ on purpose: the run holds the lease and repairs the
23
+ * queue, the daemon does not and only closes the run.
24
+ */
25
+ queue?: RunnerQueue;
26
+ ledger: {
27
+ append(input: AnyEventInput): Promise<unknown>;
28
+ };
29
+ /**
30
+ * M5-5: whether the ledger about to be written ALREADY holds an ending for
31
+ * this run — read at WRITE time, not only when the recovery was decided.
32
+ *
33
+ * Measured before this existed (evidence/M5-4/11-endings-measurement.txt):
34
+ * the daemon's sweep closed a dead run, and one second later `looply run`
35
+ * starting in the same checkout found the same dead lease and closed it
36
+ * again — the run's own recovery never looked at the ledger. Two endings for
37
+ * one run is exactly the shape a report cannot read.
38
+ *
39
+ * `null` means the ledger could not be read: then NOTHING is written. A second
40
+ * ending is the failure this exists to prevent, and an unreadable ledger is
41
+ * not permission to write one. Optional so that a caller with no reader
42
+ * behaves exactly as before.
43
+ */
44
+ alreadyEnded?(runId: string): Promise<boolean | null>;
45
+ projectId: string;
46
+ now(): number;
47
+ log(line: string): void;
48
+ }
49
+ export declare function applyRecovery(recovery: Recovery, io: RecoveryIo): Promise<void>;
50
+ //# sourceMappingURL=recovery-io.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-io.d.ts","sourceRoot":"","sources":["../src/recovery-io.ts"],"names":[],"mappings":"AACA,OAAO,EAAoB,KAAK,QAAQ,EAAE,MAAM,YAAY,CAAC;AAC7D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,UAAU;IACzB;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,EAAE;QAAE,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,OAAO,CAAC,CAAA;KAAE,CAAC;IAC3D;;;;;;;;;;;;;;OAcG;IACH,YAAY,CAAC,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,IAAI,CAAC,CAAC;IACtD,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,IAAI,MAAM,CAAC;IACd,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,wBAAsB,aAAa,CAAC,QAAQ,EAAE,QAAQ,EAAE,EAAE,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAmIrF"}
@@ -0,0 +1,122 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.applyRecovery = applyRecovery;
4
+ const core_1 = require("@looply/core");
5
+ const recovery_1 = require("./recovery");
6
+ async function applyRecovery(recovery, io) {
7
+ if (recovery.kind !== 'repairable')
8
+ return;
9
+ // Loud rather than quiet. A caller with no queue that was nonetheless handed
10
+ // item repairs has made a mistake about which half of the repair it owns, and
11
+ // quietly dropping them would leave items `in_progress` for ever while every
12
+ // log line said the run was recovered.
13
+ if (recovery.items.length > 0 && !io.queue) {
14
+ throw new Error('recovery: item repairs were handed to an applier with no queue — ' +
15
+ 'strip them with runClosureOnly() or supply the queue');
16
+ }
17
+ const emit = async (kind, data, runId) => {
18
+ await io.ledger.append({
19
+ ts: new Date(io.now()).toISOString(),
20
+ runId,
21
+ projectId: io.projectId,
22
+ lane: 'feature',
23
+ kind,
24
+ actor: 'system',
25
+ data,
26
+ });
27
+ };
28
+ // Bound once, so the loop reads a queue the compiler knows is there. The
29
+ // guard above already refused the one combination this could hide — repairs
30
+ // with nowhere to put them — so an absent queue here means an empty list.
31
+ const queue = io.queue;
32
+ if (queue) {
33
+ for (const repair of recovery.items) {
34
+ const item = queue.get(repair.itemId);
35
+ if (!item)
36
+ continue;
37
+ // Only what is STILL mid-round. Recovery can be applied twice — a crash
38
+ // inside recovery itself, a repair list retried — and without this the
39
+ // second pass spends another attempt on an item the first pass already
40
+ // handed back. That is recovery inventing failures rather than repairing
41
+ // them, and it would let a crash loop eat an item's whole budget.
42
+ /**
43
+ * ⚠️ EACH ACTION CHECKS THE STATE IT CLAIMS TO REPAIR, so applying a
44
+ * repair list twice is a no-op rather than a second spent attempt.
45
+ */
46
+ if (repair.action === 'requeue' && item.state !== 'in_progress')
47
+ continue;
48
+ if (repair.action === 'unverify' && item.state !== 'verifying')
49
+ continue;
50
+ if (repair.action === 'done') {
51
+ await queue.update(item.id, item.version, { state: 'done' });
52
+ }
53
+ else if (repair.action === 'unverify') {
54
+ // Back to where the check found it, with NO attempt spent: the verify
55
+ // pass had not finished and no round had begun. The next run's own
56
+ // pass picks it up again, which is what `draft` means.
57
+ await queue.update(item.id, item.version, {
58
+ state: 'draft',
59
+ lastFailure: `a previous run stopped while this item was being checked (${repair.reason})`,
60
+ });
61
+ }
62
+ else {
63
+ // Put back with the attempt counted and the reason carried, exactly as a
64
+ // discarded round does — the next attempt starts knowing what happened,
65
+ // rather than repeating a round nobody can explain.
66
+ // The attempt IS spent: the round began, the item went `in_progress`,
67
+ // and the process died inside it. Counting it is what stops a crash
68
+ // loop handing the same item a fresh budget for ever — and
69
+ // `afterSpentAttempt` is what stops the last one coming back as
70
+ // pickable.
71
+ const spent = item.attempts + 1;
72
+ await queue.update(item.id, item.version, {
73
+ state: (0, core_1.afterSpentAttempt)(spent),
74
+ attempts: spent,
75
+ lastFailure: `a previous run stopped before this round finished (${repair.reason})`,
76
+ });
77
+ }
78
+ }
79
+ }
80
+ // The run that never said it stopped. Closing it through the ledger is what
81
+ // makes `status.json` stop reading `live`, and — once the event reaches the
82
+ // server — what closes the Run row that would otherwise keep the project
83
+ // looking busy for ever and refusing to be deleted.
84
+ //
85
+ // `crashed`, not any ordinary reason: this run did not end its own loop, and
86
+ // the totals are the last the ledger knew rather than a claim about what
87
+ // finally happened. That is exactly what separates it from `aborted`, which
88
+ // a still-living process writes for itself with exact numbers.
89
+ let closeRun = recovery.closeRun;
90
+ if (closeRun !== null && io.alreadyEnded !== undefined) {
91
+ const ended = await io.alreadyEnded(closeRun);
92
+ if (ended !== false) {
93
+ io.log(ended === true
94
+ ? `recover : ${closeRun} already ended — not ending it again`
95
+ : `recover : could not tell whether ${closeRun} already ended — not ending it`);
96
+ closeRun = null;
97
+ }
98
+ }
99
+ if (closeRun !== null) {
100
+ await emit('run.ended', {
101
+ runId: closeRun,
102
+ elapsedMs: 0,
103
+ stopReason: 'crashed',
104
+ totals: { rounds: 0, committed: 0, discarded: 0, abandoned: 0 },
105
+ }, closeRun);
106
+ }
107
+ // What was DONE, not what was decided: a closing the guard above withheld is
108
+ // not on the ledger, so the alert must not claim it. Nothing done, no alert.
109
+ const done = { ...recovery, closeRun };
110
+ if ((0, recovery_1.describeRecovery)(done) === 'nothing to recover')
111
+ return;
112
+ // Said on the ledger so the phone can tell "looply crashed and recovered"
113
+ // from "looply is running", and so a person debugging an overnight run can
114
+ // answer "what happened" without reverse-engineering file timestamps.
115
+ await emit('alert', {
116
+ code: core_1.ALERT_CODES.runRecovered,
117
+ severity: 'warn',
118
+ text: (0, recovery_1.describeRecovery)(done),
119
+ }, closeRun ?? 'recovery');
120
+ io.log(`recover : ${(0, recovery_1.describeRecovery)(done)}`);
121
+ }
122
+ //# sourceMappingURL=recovery-io.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery-io.js","sourceRoot":"","sources":["../src/recovery-io.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,146 @@
1
+ import type { Item } from '@looply/core';
2
+ import type { RunLease } from './run-lease';
3
+ /**
4
+ * What a previous run left behind, and what may safely be done about it.
5
+ *
6
+ * A crashed runner leaves a specific mess: an item stuck `in_progress` that
7
+ * nothing anywhere resets — `round-runner` is its only writer — a `status.json`
8
+ * that still says `live`, and possibly a half-edited tree. The item is
9
+ * unpickable for ever, so the queue quietly shrinks by one every time a run
10
+ * dies, and `looply queue` says the item is "being worked on now".
11
+ *
12
+ * This is one deterministic policy rather than repair conditionals scattered
13
+ * across the daemon, the launcher and the runner. It is a pure function on
14
+ * gathered evidence so every branch is testable without a repository.
15
+ *
16
+ * The rule it exists to enforce, and the one that decides every hard case:
17
+ *
18
+ * recovery may not destroy work to make looply's state look clean.
19
+ *
20
+ * A working tree carries no authorship. Nothing in git says whether an edit was
21
+ * made by a crashed agent or by the person who owns the machine, and looply's
22
+ * own scope globs describe where it is *allowed* to write, not what it *did*.
23
+ * So a dirty tree is never assumed to be ours: it blocks, with a message, and
24
+ * a human decides. That is deliberately more conservative than the per-round
25
+ * discard path, which resets and cleans — that path runs inside a round whose
26
+ * changes looply just caused and is still watching, which is a claim recovery
27
+ * cannot make about a tree it found lying there.
28
+ */
29
+ /**
30
+ * The three read-only questions recovery asks git, and nothing else.
31
+ *
32
+ * `GitDriver` satisfies this structurally, so nothing has to change at the call
33
+ * sites — but handing recovery the whole driver puts `discard()`, which is
34
+ * `reset --hard` plus `clean -fd`, and `diff()`, which runs `git add -N` and
35
+ * mutates the index, one autocomplete away from a process that must never write
36
+ * to this repository. Narrowing it here makes "recovery performs no git
37
+ * mutation" something the compiler enforces rather than a convention every
38
+ * reviewer has to re-derive by reading the whole driver.
39
+ */
40
+ export interface RecoveryGit {
41
+ changedPaths(): Promise<string[]>;
42
+ currentBranch(): Promise<string>;
43
+ messageOf(ref: string): Promise<string | null>;
44
+ /** F33: where HEAD is, for a goal-met Start that moved it. Optional: an older double reads nothing. */
45
+ headSha?(): Promise<string>;
46
+ }
47
+ /**
48
+ * The half of a repair a process holding no lease may carry out.
49
+ *
50
+ * Closing a run is a statement about history: the run stopped, and the ledger is
51
+ * where that is said. Requeuing an item is a statement about future work, and
52
+ * the queue belongs to whoever holds the lease — `QueueStore.persist` rewrites
53
+ * the whole file from its in-memory map, so a second writer does not race an
54
+ * item, it reverts the entire queue to its own snapshot. The daemon therefore
55
+ * says what happened and leaves the scheduling to the next run, which does its
56
+ * own recovery on the way in regardless.
57
+ */
58
+ export declare function runClosureOnly(r: Recovery): Recovery;
59
+ export interface RecoveryEvidence {
60
+ /** The lease left behind, when there is one and its process is gone. */
61
+ lease: RunLease | null;
62
+ /** Items the queue still shows as being worked on. */
63
+ stranded: Item[];
64
+ /** Working-tree paths that differ from HEAD, `.looply/state` already filtered. */
65
+ changedPaths: readonly string[];
66
+ /** The branch HEAD is on now. */
67
+ currentBranch: string;
68
+ /** The subject line of the commit at HEAD, or null when it could not be read. */
69
+ headSubject: string | null;
70
+ /**
71
+ * F33: what a goal-met Start said before it moved HEAD (`judging.json`), and where HEAD is. A
72
+ * detached HEAD at exactly the commit the dead run said it would judge is where THAT run left it.
73
+ */
74
+ judging?: {
75
+ readonly runId: string;
76
+ readonly sha: string;
77
+ } | null;
78
+ headSha?: string;
79
+ }
80
+ export type ItemRepair =
81
+ /** Nothing was committed for it; make it pickable again with the attempt counted. */
82
+ {
83
+ itemId: string;
84
+ action: 'requeue';
85
+ reason: string;
86
+ }
87
+ /** Its commit is at HEAD; the round finished and only the bookkeeping was lost. */
88
+ | {
89
+ itemId: string;
90
+ action: 'done';
91
+ reason: string;
92
+ }
93
+ /**
94
+ * It was being CHECKED, not worked. Put it back to `draft`, spending nothing.
95
+ *
96
+ * 🔴 `verifying` IS A SECOND IN-FLIGHT STATE, AND RECOVERY KNEW ONLY THE
97
+ * FIRST — SO A RUN KILLED MID-CHECK KILLED ITS CHECKOUT WITH IT.
98
+ *
99
+ * `round-runner` sets `verifying` before it sets `in_progress`. A run that
100
+ * died in between left an item no state machine could move: the verify pass
101
+ * had not finished with it, no round had started it, and recovery's stranded
102
+ * set was `state === 'in_progress'` alone. MEASURED end to end: every
103
+ * subsequent run in that checkout answered
104
+ *
105
+ * nothing to do — no ready items: the queue holds 1 verifying
106
+ *
107
+ * and the workspace was dead for that goal for ever after — which is exactly
108
+ * the coordinator proof's intermittent failure, since whether the kill lands
109
+ * inside the check is a matter of timing.
110
+ *
111
+ * ⚠️ AND IT SPENDS NO ATTEMPT, unlike `requeue`. An attempt is a ROUND that
112
+ * was tried; verification is what happens before one. Counting it here would
113
+ * be recovery inventing a failure, which the note in `recovery-io` forbids in
114
+ * as many words.
115
+ */
116
+ | {
117
+ itemId: string;
118
+ action: 'unverify';
119
+ reason: string;
120
+ };
121
+ export type Recovery =
122
+ /** Nothing to do. */
123
+ {
124
+ kind: 'none';
125
+ }
126
+ /** Safe, and exactly what will be done. */
127
+ | {
128
+ kind: 'repairable';
129
+ lease: RunLease | null;
130
+ items: ItemRepair[];
131
+ closeRun: string | null;
132
+ }
133
+ /**
134
+ * Something is here that cannot be proven safe to touch. Nothing is changed —
135
+ * not the queue, not the tree, not one git ref — and the reason is reported
136
+ * so a person can settle it.
137
+ */
138
+ | {
139
+ kind: 'blocked';
140
+ reason: string;
141
+ lease: RunLease | null;
142
+ };
143
+ export declare function classifyRecovery(ev: RecoveryEvidence): Recovery;
144
+ /** One line a person can act on, for the log and for the alert. */
145
+ export declare function describeRecovery(r: Recovery): string;
146
+ //# sourceMappingURL=recovery.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recovery.d.ts","sourceRoot":"","sources":["../src/recovery.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,cAAc,CAAC;AACzC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAE5C;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,WAAW;IAC1B,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClC,aAAa,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACjC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC/C,uGAAuG;IACvG,OAAO,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;CAC7B;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,cAAc,CAAC,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAEpD;AAED,MAAM,WAAW,gBAAgB;IAC/B,wEAAwE;IACxE,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IACvB,sDAAsD;IACtD,QAAQ,EAAE,IAAI,EAAE,CAAC;IACjB,kFAAkF;IAClF,YAAY,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC,iCAAiC;IACjC,aAAa,EAAE,MAAM,CAAC;IACtB,iFAAiF;IACjF,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B;;;OAGG;IACH,OAAO,CAAC,EAAE;QAAE,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC;IAClE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,UAAU;AACpB,qFAAqF;AACnF;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACvD,mFAAmF;GACjF;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACpD;;;;;;;;;;;;;;;;;;;;;;GAsBG;GACD;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,UAAU,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,MAAM,MAAM,QAAQ;AAClB,qBAAqB;AACnB;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE;AAClB,2CAA2C;GACzC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;IAAC,KAAK,EAAE,UAAU,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE;AAC9F;;;;GAIG;GACD;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAA;CAAE,CAAC;AAEhE,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,gBAAgB,GAAG,QAAQ,CA0E/D;AAED,mEAAmE;AACnE,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,QAAQ,GAAG,MAAM,CAmBpD"}