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
@@ -0,0 +1,20 @@
1
+ import type { Item } from '@looply/core';
2
+ /** `path:line` for the first piece of evidence, which is where a round starts. */
3
+ export declare function whereOf(item: Pick<Item, 'evidence'>): string | null;
4
+ /**
5
+ * Why this item is where it is, in a few words.
6
+ *
7
+ * An item sitting in a non-pickable state without a reason beside it is the
8
+ * thing that makes a queue feel arbitrary — and the reason is always recorded,
9
+ * so there is no excuse for not printing it.
10
+ */
11
+ export declare function reasonOf(item: Item): string | null;
12
+ export interface QueueViewOptions {
13
+ /** Show every state, not just the ones worth acting on. */
14
+ all?: boolean;
15
+ width?: number;
16
+ }
17
+ export declare function renderQueue(items: readonly Item[], opts?: QueueViewOptions): string[];
18
+ /** The one-line answer `looply stop` gives, which depends on what is running. */
19
+ export declare function stopMessage(runLive: boolean, kind: 'pause' | 'stop' | 'resume'): string;
20
+ //# sourceMappingURL=queue-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-view.d.ts","sourceRoot":"","sources":["../src/queue-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAa,MAAM,cAAc,CAAC;AAqDpD,kFAAkF;AAClF,wBAAgB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,GAAG,MAAM,GAAG,IAAI,CAInE;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,GAAG,IAAI,CAKlD;AAED,MAAM,WAAW,gBAAgB;IAC/B,2DAA2D;IAC3D,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,SAAS,IAAI,EAAE,EAAE,IAAI,GAAE,gBAAqB,GAAG,MAAM,EAAE,CAkDzF;AAED,iFAAiF;AACjF,wBAAgB,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,GAAG,MAAM,GAAG,QAAQ,GAAG,MAAM,CAgCvF"}
@@ -0,0 +1,163 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.whereOf = whereOf;
4
+ exports.reasonOf = reasonOf;
5
+ exports.renderQueue = renderQueue;
6
+ exports.stopMessage = stopMessage;
7
+ const ui_1 = require("./ui");
8
+ /**
9
+ * `looply queue` — everything waiting, and why.
10
+ *
11
+ * Rendering is pure and takes items, so what the terminal shows is testable
12
+ * without a filesystem. The point of the screen is the *why*: a queue of
13
+ * fifteen items where twelve are stale, blocked or duplicates is a queue with
14
+ * three items, and a count alone hides that.
15
+ */
16
+ /** Triage order: what you can work on, then what needs you, then what is done. */
17
+ const ORDER = [
18
+ 'ready',
19
+ 'in_progress',
20
+ 'verifying',
21
+ 'draft',
22
+ 'blocked',
23
+ 'split',
24
+ 'duplicate',
25
+ 'stale',
26
+ 'done',
27
+ 'closed',
28
+ ];
29
+ const HEADINGS = {
30
+ ready: 'ready to pick',
31
+ // Only true while a runner is alive. After a crash the item sits here with
32
+ // nothing working on it, which is precisely when the old wording misled.
33
+ in_progress: 'picked up by a run — recovered automatically if that run died',
34
+ verifying: 'being checked',
35
+ draft: 'not checked yet — a run confirms these before picking',
36
+ blocked: 'blocked — needs you',
37
+ split: 'too big — needs breaking up',
38
+ duplicate: 'merged into another item',
39
+ stale: 'already fixed, so nothing to do',
40
+ done: 'kept',
41
+ closed: 'closed without landing',
42
+ };
43
+ function tone(state) {
44
+ if (state === 'ready' || state === 'done')
45
+ return ui_1.volt;
46
+ if (state === 'in_progress' || state === 'verifying')
47
+ return ui_1.white;
48
+ if (state === 'blocked' || state === 'split')
49
+ return ui_1.amber;
50
+ if (state === 'closed')
51
+ return ui_1.red;
52
+ return ui_1.grey;
53
+ }
54
+ function clip(s, n) {
55
+ return s.length <= n ? s : `${s.slice(0, n - 1)}…`;
56
+ }
57
+ /** `path:line` for the first piece of evidence, which is where a round starts. */
58
+ function whereOf(item) {
59
+ const first = item.evidence[0];
60
+ if (!first)
61
+ return null;
62
+ return first.line ? `${first.path}:${first.line}` : first.path;
63
+ }
64
+ /**
65
+ * Why this item is where it is, in a few words.
66
+ *
67
+ * An item sitting in a non-pickable state without a reason beside it is the
68
+ * thing that makes a queue feel arbitrary — and the reason is always recorded,
69
+ * so there is no excuse for not printing it.
70
+ */
71
+ function reasonOf(item) {
72
+ if (item.state === 'blocked' && item.blockedReason)
73
+ return item.blockedReason;
74
+ if (item.state === 'duplicate' && item.duplicateOf)
75
+ return `duplicate of ${item.duplicateOf}`;
76
+ if (item.lastFailure)
77
+ return `last attempt: ${item.lastFailure}`;
78
+ return null;
79
+ }
80
+ function renderQueue(items, opts = {}) {
81
+ const width = opts.width ?? 78;
82
+ const out = [];
83
+ if (items.length === 0) {
84
+ return ['', ` ${(0, ui_1.grey)('the queue is empty.')}`, '', ` ${(0, ui_1.dim)('looply scan')} ${(0, ui_1.grey)('reads the code and fills it')}`, ''];
85
+ }
86
+ // Everything past `done` is history: shown on request, never by default, or
87
+ // a queue that has been worked for a night buries its own live items.
88
+ const shown = opts.all ? ORDER : ORDER.filter((s) => s !== 'done' && s !== 'closed' && s !== 'stale' && s !== 'duplicate');
89
+ out.push('');
90
+ let printed = 0;
91
+ for (const state of shown) {
92
+ const group = items.filter((i) => i.state === state);
93
+ if (!group.length)
94
+ continue;
95
+ const paint = tone(state);
96
+ out.push(` ${paint(String(group.length).padStart(2))} ${paint(HEADINGS[state])}`);
97
+ for (const item of group) {
98
+ printed += 1;
99
+ out.push(` ${(0, ui_1.grey)(item.id.slice(0, 12))} ${clip(item.title, width - 20)}`);
100
+ const where = whereOf(item);
101
+ const reason = reasonOf(item);
102
+ const meta = [];
103
+ if (where)
104
+ meta.push(where);
105
+ if (item.attempts > 0)
106
+ meta.push(`${item.attempts} attempt${item.attempts === 1 ? '' : 's'}`);
107
+ if (meta.length)
108
+ out.push(` ${(0, ui_1.dim)(' '.repeat(12))} ${(0, ui_1.dim)(meta.join(' · '))}`);
109
+ if (reason)
110
+ out.push(` ${(0, ui_1.dim)(' '.repeat(12))} ${paint(clip(reason, width - 20))}`);
111
+ }
112
+ out.push('');
113
+ }
114
+ const hidden = items.length - printed;
115
+ if (hidden > 0 && !opts.all) {
116
+ out.push(` ${(0, ui_1.grey)(`${hidden} more already dealt with`)} ${(0, ui_1.dim)('— looply queue --all')}`);
117
+ out.push('');
118
+ }
119
+ const ready = items.filter((i) => i.state === 'ready').length;
120
+ const drafts = items.filter((i) => i.state === 'draft').length;
121
+ if (ready === 0 && drafts > 0) {
122
+ out.push(` ${(0, ui_1.grey)('nothing is pickable yet.')} ${(0, ui_1.dim)('looply verify')} ${(0, ui_1.grey)('checks the drafts against the code.')}`);
123
+ out.push('');
124
+ }
125
+ return out;
126
+ }
127
+ /** The one-line answer `looply stop` gives, which depends on what is running. */
128
+ function stopMessage(runLive, kind) {
129
+ if (!runLive) {
130
+ /**
131
+ * 🔴 "NOTHING TO RESUME" WAS FALSE, AND IT WAS THE FALSE HALF OF A
132
+ * DEADLOCK.
133
+ *
134
+ * The old comment here said nothing is written because "a run clears any
135
+ * pending request as it starts". That is true of a RUN and says nothing
136
+ * about the DAEMON, which reads the same project `control.json` to decide
137
+ * whether a person has asked the machine to hold — and holds. So a pause
138
+ * that outlived its run held the machine, and the command named after
139
+ * releasing it printed this line and wrote nothing.
140
+ *
141
+ * `stop` keeps the old answer, because it addresses a run and there is no
142
+ * run. The other two address a standing hold, which exists whether or not
143
+ * anything is running.
144
+ */
145
+ if (kind === 'stop')
146
+ return `${(0, ui_1.bad)('no run is going')} — nothing to stop.`;
147
+ return kind === 'pause'
148
+ ? `${(0, ui_1.volt)('holding')} — no run is going, and the machine will not start one until you resume.`
149
+ : `${(0, ui_1.volt)('hold cleared')} — no run is going; the machine may start one again.`;
150
+ }
151
+ /**
152
+ * ⚠️ `resume` SAYS SOMETHING DIFFERENT, because it is the only one of the
153
+ * three that does not make the run wait. Reusing the pause wording would tell
154
+ * a person the round in flight finishes first, which is true and completely
155
+ * beside the point of what they just asked for.
156
+ */
157
+ if (kind === 'resume')
158
+ return `${(0, ui_1.volt)('resuming')} — the run carries on from its next round.`;
159
+ return kind === 'stop'
160
+ ? `${(0, ui_1.volt)('stopping')} — the round in flight finishes first, then the run ends.`
161
+ : `${(0, ui_1.volt)('pausing')} — the round in flight finishes first, then the run holds.`;
162
+ }
163
+ //# sourceMappingURL=queue-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-view.js","sourceRoot":"","sources":["../src/queue-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,106 @@
1
+ import { type LeaseState } from './run-lease';
2
+ /**
3
+ * WRITING `queue.json` WHILE A RUN IS GOING CORRUPTS IT, AND BOTH COMMANDS DID.
4
+ *
5
+ * 🔴 THE MECHANISM, WHICH IS NOT A NARROW RACE.
6
+ *
7
+ * `QueueStore` reads disk exactly once, in `open()`, and answers every later
8
+ * question from an in-memory map. `persist()` is `writeList(this.list())` — the
9
+ * WHOLE map, temp-then-renamed over the file. A run opens the queue at its
10
+ * first second and holds that map for hours.
11
+ *
12
+ * So `looply scan` inserting five items during a run is not a torn write that a
13
+ * lock would fix. The scan's five items land on disk, and then the run's very
14
+ * next `persist()` writes its own hours-old snapshot over them. The items are
15
+ * gone, nothing errors, and the scan reported success.
16
+ *
17
+ * ─────────────────────────────────────────────────────────────────────────────
18
+ * 🔴 THE FIRST VERSION OF THIS FILE TOOK THE RUN LEASE, AND THAT WAS WRONG IN
19
+ * THREE MEASURED WAYS. THE FIX IS TO OBSERVE IT AND NEVER TAKE IT.
20
+ *
21
+ * It called `RunLeaseStore.acquire` with a minted runId and
22
+ * `branch: '(a scan)'`. That lease is read by five other things, and it lied to
23
+ * all of them:
24
+ *
25
+ * 1. `classifyRecovery` blocks whenever the checkout's branch differs from
26
+ * the lease's — and a real branch can never equal `(a scan)`. So a
27
+ * Ctrl-C'd verify (no signal handler runs the `finally`; a pass can last
28
+ * half an hour) wedged EVERY later `looply run` in that checkout behind
29
+ * "a previous run was working on (a verify pass)", and drove a daemon to
30
+ * spawn a doomed run every poll for the full one-hour redelivery window.
31
+ * 2. `refuseStart` compares what the lease says it is working on against
32
+ * what the Start asks for. A scan lease says nothing, so a bound Start
33
+ * from a phone was acked TERMINALLY refused, with a sentence naming a
34
+ * run that does not exist — advice neither `looply stop` nor `looply
35
+ * runs` can act on.
36
+ * 3. `acquire` TAKES OVER a dead lease. A crashed run's lease is the only
37
+ * durable record that the run needs closing, and a scan silently consumed
38
+ * it, after which nothing ever emits `run.ended` and the server's Run row
39
+ * stays open for ever — the exact harm `daemon-recovery.ts` exists to
40
+ * prevent.
41
+ *
42
+ * None of that was necessary. What these commands actually need is two things,
43
+ * and neither is the run lease:
44
+ *
45
+ * - REFUSE WHILE A RUN IS LIVE. That is a READ of the run lease. Reading it
46
+ * tells nothing a lie and destroys nothing.
47
+ * - DO NOT COLLIDE WITH ANOTHER SCAN. That is a lock of their own, in their
48
+ * own file, that no run-lease consumer has ever heard of.
49
+ */
50
+ export declare class QueueBusy extends Error {
51
+ readonly what: string;
52
+ readonly because: string;
53
+ constructor(what: string, because: string);
54
+ }
55
+ /**
56
+ * One sentence a person can act on.
57
+ *
58
+ * ⚠️ COMPOSED HERE RATHER THAN IN `describeLease`, which four other call sites
59
+ * consume verbatim — widening it to name `acquiredAt` would change all of their
60
+ * messages too. And `ambiguous` may carry NO lease at all (an unreadable file,
61
+ * a foreign host), which is exactly the case a person most needs a clear
62
+ * sentence for and the one an `err.state.lease` reference prints `undefined` in.
63
+ */
64
+ export declare function refusalFor(what: string, state: LeaseState, stateDir?: string): string;
65
+ export interface QueueLease {
66
+ /** Give it back. Safe to call twice. */
67
+ release(): Promise<void>;
68
+ }
69
+ /**
70
+ * Take the right to write `queue.json` in this checkout.
71
+ *
72
+ * ⚠️ CALLED AT THE WRITE, NOT AT THE TOP OF THE COMMAND. `looply scan --dry-run`
73
+ * "answers a question and changes nothing" by its own contract, and a lock taken
74
+ * on entry would make it refusable while a run is going — turning a read-only
75
+ * question into one that needs the machine to be idle.
76
+ *
77
+ * ⚠️ THE EXECUTION DIRECTORY, NEVER THE PROJECT'S. A lock at the project state
78
+ * directory would be one lock for N worktrees, which is the opposite of the
79
+ * Phase 1 model: two people scanning two different workspaces must not block
80
+ * each other.
81
+ */
82
+ /**
83
+ * Is a queue write in progress in this checkout?
84
+ *
85
+ * 🔴 THE LOCK WAS ONE-SIDED, AND A MEASUREMENT SHOWED WHAT THAT COSTS.
86
+ *
87
+ * Scan and verify took it; nothing else had heard of it. So a run started
88
+ * DURING a verify pass — by the daemon's poll, by a phone Start, by a second
89
+ * terminal, all of which consult only the run lease, which is free — acquired
90
+ * the lease, re-opened the queue, and wrote its hours-old snapshot back over
91
+ * every verdict the pass produced from that moment on. Measured: two items
92
+ * confirmed by the pass, one silently reverted to `draft` by the run, no error
93
+ * on either side, and the agent time that produced the verdict gone.
94
+ *
95
+ * `verify` is the worse half, because it holds the lock for the WHOLE pass —
96
+ * uncapped without `--max`, at up to five minutes a draft — which is precisely
97
+ * why it takes the lock early.
98
+ */
99
+ export declare function queueWriteInProgress(cwd: string): {
100
+ readonly busy: false;
101
+ } | {
102
+ readonly busy: true;
103
+ readonly because: string;
104
+ };
105
+ export declare function takeQueueWriteLease(cwd: string, what: string): Promise<QueueLease>;
106
+ //# sourceMappingURL=queue-write-lease.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-write-lease.d.ts","sourceRoot":"","sources":["../src/queue-write-lease.ts"],"names":[],"mappings":"AAIA,OAAO,EAAyC,KAAK,UAAU,EAAE,MAAM,aAAa,CAAC;AAErF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,qBAAa,SAAU,SAAQ,KAAK;IAEhC,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM;gBADf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM;CAK3B;AAED;;;;;;;;GAQG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,CAyBrF;AAED,MAAM,WAAW,UAAU;IACzB,wCAAwC;IACxC,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAoBD;;;;;;;;;;;;GAYG;AACH;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,oBAAoB,CAClC,GAAG,EAAE,MAAM,GACV;IAAE,QAAQ,CAAC,IAAI,EAAE,KAAK,CAAA;CAAE,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAmB9E;AAED,wBAAsB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,CAoHxF"}
@@ -0,0 +1,282 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.QueueBusy = void 0;
4
+ exports.refusalFor = refusalFor;
5
+ exports.queueWriteInProgress = queueWriteInProgress;
6
+ exports.takeQueueWriteLease = takeQueueWriteLease;
7
+ const node_fs_1 = require("node:fs");
8
+ const node_os_1 = require("node:os");
9
+ const node_path_1 = require("node:path");
10
+ const git_driver_1 = require("./git-driver");
11
+ const run_lease_1 = require("./run-lease");
12
+ /**
13
+ * WRITING `queue.json` WHILE A RUN IS GOING CORRUPTS IT, AND BOTH COMMANDS DID.
14
+ *
15
+ * 🔴 THE MECHANISM, WHICH IS NOT A NARROW RACE.
16
+ *
17
+ * `QueueStore` reads disk exactly once, in `open()`, and answers every later
18
+ * question from an in-memory map. `persist()` is `writeList(this.list())` — the
19
+ * WHOLE map, temp-then-renamed over the file. A run opens the queue at its
20
+ * first second and holds that map for hours.
21
+ *
22
+ * So `looply scan` inserting five items during a run is not a torn write that a
23
+ * lock would fix. The scan's five items land on disk, and then the run's very
24
+ * next `persist()` writes its own hours-old snapshot over them. The items are
25
+ * gone, nothing errors, and the scan reported success.
26
+ *
27
+ * ─────────────────────────────────────────────────────────────────────────────
28
+ * 🔴 THE FIRST VERSION OF THIS FILE TOOK THE RUN LEASE, AND THAT WAS WRONG IN
29
+ * THREE MEASURED WAYS. THE FIX IS TO OBSERVE IT AND NEVER TAKE IT.
30
+ *
31
+ * It called `RunLeaseStore.acquire` with a minted runId and
32
+ * `branch: '(a scan)'`. That lease is read by five other things, and it lied to
33
+ * all of them:
34
+ *
35
+ * 1. `classifyRecovery` blocks whenever the checkout's branch differs from
36
+ * the lease's — and a real branch can never equal `(a scan)`. So a
37
+ * Ctrl-C'd verify (no signal handler runs the `finally`; a pass can last
38
+ * half an hour) wedged EVERY later `looply run` in that checkout behind
39
+ * "a previous run was working on (a verify pass)", and drove a daemon to
40
+ * spawn a doomed run every poll for the full one-hour redelivery window.
41
+ * 2. `refuseStart` compares what the lease says it is working on against
42
+ * what the Start asks for. A scan lease says nothing, so a bound Start
43
+ * from a phone was acked TERMINALLY refused, with a sentence naming a
44
+ * run that does not exist — advice neither `looply stop` nor `looply
45
+ * runs` can act on.
46
+ * 3. `acquire` TAKES OVER a dead lease. A crashed run's lease is the only
47
+ * durable record that the run needs closing, and a scan silently consumed
48
+ * it, after which nothing ever emits `run.ended` and the server's Run row
49
+ * stays open for ever — the exact harm `daemon-recovery.ts` exists to
50
+ * prevent.
51
+ *
52
+ * None of that was necessary. What these commands actually need is two things,
53
+ * and neither is the run lease:
54
+ *
55
+ * - REFUSE WHILE A RUN IS LIVE. That is a READ of the run lease. Reading it
56
+ * tells nothing a lie and destroys nothing.
57
+ * - DO NOT COLLIDE WITH ANOTHER SCAN. That is a lock of their own, in their
58
+ * own file, that no run-lease consumer has ever heard of.
59
+ */
60
+ class QueueBusy extends Error {
61
+ what;
62
+ because;
63
+ constructor(what, because) {
64
+ super(because);
65
+ this.what = what;
66
+ this.because = because;
67
+ this.name = 'QueueBusy';
68
+ }
69
+ }
70
+ exports.QueueBusy = QueueBusy;
71
+ /**
72
+ * One sentence a person can act on.
73
+ *
74
+ * ⚠️ COMPOSED HERE RATHER THAN IN `describeLease`, which four other call sites
75
+ * consume verbatim — widening it to name `acquiredAt` would change all of their
76
+ * messages too. And `ambiguous` may carry NO lease at all (an unreadable file,
77
+ * a foreign host), which is exactly the case a person most needs a clear
78
+ * sentence for and the one an `err.state.lease` reference prints `undefined` in.
79
+ */
80
+ function refusalFor(what, state, stateDir) {
81
+ if (state.kind === 'active') {
82
+ return (`a run is working in this checkout — ${state.lease.runId} (pid ${state.lease.pid}, ` +
83
+ `branch ${state.lease.branch}) since ${state.lease.acquiredAt}. ${what} would write ` +
84
+ 'queue.json, and that run holds the whole queue in memory, so its next round would ' +
85
+ 'write its own copy back over yours. Wait for it, or `looply stop` it, then try again.');
86
+ }
87
+ if (state.kind === 'ambiguous') {
88
+ return (`cannot tell whether a run is working in this checkout: ${state.reason}. ` +
89
+ `${what} would write queue.json, and guessing wrong loses somebody's work — so this ` +
90
+ 'refuses rather than guesses. ' +
91
+ /**
92
+ * ⚠️ IT NAMES THE FILE. The first version sent the person to `looply runs`,
93
+ * which reads the registry and the workspaces root and never looks at the
94
+ * current checkout's lease — so in Simple Mode it answered "nothing
95
+ * running, and nothing left behind" about the very file that was refusing
96
+ * them, and there was no next step.
97
+ */
98
+ `The file is ${stateDir === undefined ? 'run.lease.json' : (0, node_path_1.join)(stateDir, 'run.lease.json')}.`);
99
+ }
100
+ return `${what} could not take this checkout's write lease`;
101
+ }
102
+ function readClaim(path) {
103
+ try {
104
+ const parsed = JSON.parse((0, node_fs_1.readFileSync)(path, 'utf8'));
105
+ if (typeof parsed.pid !== 'number' || typeof parsed.host !== 'string')
106
+ return null;
107
+ return parsed;
108
+ }
109
+ catch {
110
+ return null;
111
+ }
112
+ }
113
+ /**
114
+ * Take the right to write `queue.json` in this checkout.
115
+ *
116
+ * ⚠️ CALLED AT THE WRITE, NOT AT THE TOP OF THE COMMAND. `looply scan --dry-run`
117
+ * "answers a question and changes nothing" by its own contract, and a lock taken
118
+ * on entry would make it refusable while a run is going — turning a read-only
119
+ * question into one that needs the machine to be idle.
120
+ *
121
+ * ⚠️ THE EXECUTION DIRECTORY, NEVER THE PROJECT'S. A lock at the project state
122
+ * directory would be one lock for N worktrees, which is the opposite of the
123
+ * Phase 1 model: two people scanning two different workspaces must not block
124
+ * each other.
125
+ */
126
+ /**
127
+ * Is a queue write in progress in this checkout?
128
+ *
129
+ * 🔴 THE LOCK WAS ONE-SIDED, AND A MEASUREMENT SHOWED WHAT THAT COSTS.
130
+ *
131
+ * Scan and verify took it; nothing else had heard of it. So a run started
132
+ * DURING a verify pass — by the daemon's poll, by a phone Start, by a second
133
+ * terminal, all of which consult only the run lease, which is free — acquired
134
+ * the lease, re-opened the queue, and wrote its hours-old snapshot back over
135
+ * every verdict the pass produced from that moment on. Measured: two items
136
+ * confirmed by the pass, one silently reverted to `draft` by the run, no error
137
+ * on either side, and the agent time that produced the verdict gone.
138
+ *
139
+ * `verify` is the worse half, because it holds the lock for the WHOLE pass —
140
+ * uncapped without `--max`, at up to five minutes a draft — which is precisely
141
+ * why it takes the lock early.
142
+ */
143
+ function queueWriteInProgress(cwd) {
144
+ const lock = (0, node_path_1.join)((0, git_driver_1.executionStateDir)(cwd), 'queue.write.lock');
145
+ if (!(0, node_fs_1.existsSync)(lock))
146
+ return { busy: false };
147
+ const held = readClaim(lock);
148
+ if (held === null) {
149
+ return { busy: true, because: `a queue write is in progress and its claim cannot be read (${lock})` };
150
+ }
151
+ /**
152
+ * ⚠️ ONLY A LIVE, SAME-HOST HOLDER BLOCKS. A dead one is left for the next
153
+ * scan or verify to break — a run has no business breaking a lock it does
154
+ * not take, and refusing on a stale one would wedge the central command.
155
+ */
156
+ if (held.host !== (0, node_os_1.hostname)() || (0, run_lease_1.nodeProbe)(held.pid) !== 'alive')
157
+ return { busy: false };
158
+ return {
159
+ busy: true,
160
+ because: `${held.what} is writing this checkout's queue (pid ${held.pid}, since ${held.at}). ` +
161
+ 'A run holds the whole queue in memory and would write its own copy back over that work',
162
+ };
163
+ }
164
+ async function takeQueueWriteLease(cwd, what) {
165
+ const stateDir = (0, git_driver_1.executionStateDir)(cwd);
166
+ const lock = (0, node_path_1.join)(stateDir, 'queue.write.lock');
167
+ /**
168
+ * 🔴 THE RUN LEASE IS READ AND NEVER TAKEN. See the header. `inspect()` has no
169
+ * side effect: it does not claim, it does not reap a dead lease, and it leaves
170
+ * a crashed run's evidence exactly where recovery needs to find it.
171
+ */
172
+ const runLease = new run_lease_1.RunLeaseStore(stateDir, run_lease_1.nodeLeaseFs);
173
+ const before = await runLease.inspect();
174
+ if (before.kind === 'active' || before.kind === 'ambiguous') {
175
+ throw new QueueBusy(what, refusalFor(what, before, stateDir));
176
+ }
177
+ (0, node_fs_1.mkdirSync)(stateDir, { recursive: true });
178
+ const mine = { pid: process.pid, host: (0, node_os_1.hostname)(), what, at: new Date().toISOString() };
179
+ const body = `${JSON.stringify(mine, null, 2)}\n`;
180
+ const claim = () => {
181
+ try {
182
+ (0, node_fs_1.writeFileSync)(lock, body, { encoding: 'utf8', flag: 'wx' });
183
+ return true;
184
+ }
185
+ catch (e) {
186
+ const code = e.code;
187
+ // Windows answers EPERM rather than EEXIST against a pending-delete file.
188
+ if (code === 'EEXIST' || code === 'EPERM')
189
+ return false;
190
+ throw e;
191
+ }
192
+ };
193
+ if (!claim()) {
194
+ /**
195
+ * ⚠️ A LOCK WHOSE OWNER IS GONE IS BROKEN, NOT OBEYED — and broken by
196
+ * CONTENT MATCH, which is the discipline Phase 1 settled on after measuring
197
+ * what removing a token by path does: a process that had already lost its
198
+ * claim deleted the winner's, and four processes then held one lock.
199
+ *
200
+ * A lock from ANOTHER HOST is never broken. This file lives in a checkout
201
+ * that could be on a network share, and a pid means nothing across machines.
202
+ */
203
+ const held = readClaim(lock);
204
+ /**
205
+ * ⚠️ GUARDED. An ENOENT between the `existsSync` and the read — which is
206
+ * exactly what a competing process doing this same dead-lock break causes —
207
+ * used to throw a raw filesystem error out of here, past `bin.ts`'s
208
+ * QueueBusy handling, printing an internal path and exiting 1 instead of 2.
209
+ */
210
+ let raw;
211
+ try {
212
+ raw = (0, node_fs_1.readFileSync)(lock, 'utf8');
213
+ }
214
+ catch {
215
+ raw = null;
216
+ }
217
+ const dead = held !== null && held.host === (0, node_os_1.hostname)() && (0, run_lease_1.nodeProbe)(held.pid) === 'dead';
218
+ if (!dead || raw === null) {
219
+ /**
220
+ * ⚠️ IT NAMES THE FILE. A lock left by a crashed command whose pid has
221
+ * since been recycled — or belongs to another user, so the probe answers
222
+ * `unknown` — refuses every later scan and verify in that checkout for
223
+ * ever, in the present tense, about a month-old file. Since those two are
224
+ * the only ways items enter and get confirmed, that checkout can never
225
+ * take on new work again; and `looply runs`, `--reap`, `doctor` and
226
+ * `status` all say there is nothing left behind. The remedy is deleting
227
+ * one file, so the sentence says which.
228
+ */
229
+ throw new QueueBusy(what, (held === null
230
+ ? `another command is writing this checkout's queue, and this cannot read its claim`
231
+ : `${held.what} is writing this checkout's queue (pid ${held.pid} on ${held.host}, since ${held.at})`) +
232
+ `. If nothing is, delete ${lock}`);
233
+ }
234
+ try {
235
+ if ((0, node_fs_1.readFileSync)(lock, 'utf8') === raw)
236
+ (0, node_fs_1.unlinkSync)(lock);
237
+ }
238
+ catch {
239
+ /* somebody else got there; the claim below will say so */
240
+ }
241
+ if (!claim()) {
242
+ throw new QueueBusy(what, `another command took this checkout's queue write lock first (${lock})`);
243
+ }
244
+ }
245
+ /**
246
+ * 🔴 RE-READ THE RUN LEASE AFTER CLAIMING. Between the first read and the
247
+ * claim a run can have started: it takes the run lease, sees no reason to
248
+ * care about this lock, and opens the queue. Checking once would let the scan
249
+ * write into exactly the window it exists to avoid.
250
+ *
251
+ * ⚠️ AND IT GIVES THE LOCK BACK BEFORE REFUSING, or a refusal would leave the
252
+ * checkout locked by a command that did nothing.
253
+ */
254
+ const after = await runLease.inspect();
255
+ if (after.kind === 'active' || after.kind === 'ambiguous') {
256
+ try {
257
+ if ((0, node_fs_1.readFileSync)(lock, 'utf8') === body)
258
+ (0, node_fs_1.unlinkSync)(lock);
259
+ }
260
+ catch {
261
+ /* already gone */
262
+ }
263
+ throw new QueueBusy(what, refusalFor(what, after, stateDir));
264
+ }
265
+ let given = false;
266
+ return {
267
+ release: async () => {
268
+ if (given)
269
+ return;
270
+ given = true;
271
+ try {
272
+ // Only ours: the same compare-before-remove rule as above.
273
+ if ((0, node_fs_1.readFileSync)(lock, 'utf8') === body)
274
+ (0, node_fs_1.unlinkSync)(lock);
275
+ }
276
+ catch {
277
+ /* already gone, or somebody broke it because we looked dead */
278
+ }
279
+ },
280
+ };
281
+ }
282
+ //# sourceMappingURL=queue-write-lease.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-write-lease.js","sourceRoot":"","sources":["../src/queue-write-lease.ts"],"names":[],"mappings":"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"}