looply-cli 0.0.0-stage → 0.2.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 (785) 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 +2719 -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/server-client.d.ts +766 -0
  605. package/dist/server-client.d.ts.map +1 -0
  606. package/dist/server-client.js +475 -0
  607. package/dist/server-client.js.map +1 -0
  608. package/dist/session-adapter-runtime.d.ts +195 -0
  609. package/dist/session-adapter-runtime.d.ts.map +1 -0
  610. package/dist/session-adapter-runtime.js +373 -0
  611. package/dist/session-adapter-runtime.js.map +1 -0
  612. package/dist/session-checkpoint-runtime.d.ts +62 -0
  613. package/dist/session-checkpoint-runtime.d.ts.map +1 -0
  614. package/dist/session-checkpoint-runtime.js +268 -0
  615. package/dist/session-checkpoint-runtime.js.map +1 -0
  616. package/dist/session-control-transport.d.ts +106 -0
  617. package/dist/session-control-transport.d.ts.map +1 -0
  618. package/dist/session-control-transport.js +232 -0
  619. package/dist/session-control-transport.js.map +1 -0
  620. package/dist/session-observation-store.d.ts +98 -0
  621. package/dist/session-observation-store.d.ts.map +1 -0
  622. package/dist/session-observation-store.js +155 -0
  623. package/dist/session-observation-store.js.map +1 -0
  624. package/dist/session-observe-runtime.d.ts +123 -0
  625. package/dist/session-observe-runtime.d.ts.map +1 -0
  626. package/dist/session-observe-runtime.js +317 -0
  627. package/dist/session-observe-runtime.js.map +1 -0
  628. package/dist/session-store.d.ts +98 -0
  629. package/dist/session-store.d.ts.map +1 -0
  630. package/dist/session-store.js +116 -0
  631. package/dist/session-store.js.map +1 -0
  632. package/dist/sessions-cmd.d.ts +202 -0
  633. package/dist/sessions-cmd.d.ts.map +1 -0
  634. package/dist/sessions-cmd.js +609 -0
  635. package/dist/sessions-cmd.js.map +1 -0
  636. package/dist/settings-overlay.d.ts +53 -0
  637. package/dist/settings-overlay.d.ts.map +1 -0
  638. package/dist/settings-overlay.js +175 -0
  639. package/dist/settings-overlay.js.map +1 -0
  640. package/dist/setup-prompt.d.ts +34 -0
  641. package/dist/setup-prompt.d.ts.map +1 -0
  642. package/dist/setup-prompt.js +92 -0
  643. package/dist/setup-prompt.js.map +1 -0
  644. package/dist/setup.d.ts +103 -0
  645. package/dist/setup.d.ts.map +1 -0
  646. package/dist/setup.js +283 -0
  647. package/dist/setup.js.map +1 -0
  648. package/dist/shared-grants.d.ts +164 -0
  649. package/dist/shared-grants.d.ts.map +1 -0
  650. package/dist/shared-grants.js +242 -0
  651. package/dist/shared-grants.js.map +1 -0
  652. package/dist/signals.d.ts +55 -0
  653. package/dist/signals.d.ts.map +1 -0
  654. package/dist/signals.js +85 -0
  655. package/dist/signals.js.map +1 -0
  656. package/dist/source-cmd.d.ts +201 -0
  657. package/dist/source-cmd.d.ts.map +1 -0
  658. package/dist/source-cmd.js +684 -0
  659. package/dist/source-cmd.js.map +1 -0
  660. package/dist/source-verdict.d.ts +99 -0
  661. package/dist/source-verdict.d.ts.map +1 -0
  662. package/dist/source-verdict.js +182 -0
  663. package/dist/source-verdict.js.map +1 -0
  664. package/dist/spend-ledger.d.ts +350 -0
  665. package/dist/spend-ledger.d.ts.map +1 -0
  666. package/dist/spend-ledger.js +546 -0
  667. package/dist/spend-ledger.js.map +1 -0
  668. package/dist/stale-run-sweep.d.ts +79 -0
  669. package/dist/stale-run-sweep.d.ts.map +1 -0
  670. package/dist/stale-run-sweep.js +116 -0
  671. package/dist/stale-run-sweep.js.map +1 -0
  672. package/dist/start-attempts.d.ts +385 -0
  673. package/dist/start-attempts.d.ts.map +1 -0
  674. package/dist/start-attempts.js +613 -0
  675. package/dist/start-attempts.js.map +1 -0
  676. package/dist/status-cmd.d.ts +28 -0
  677. package/dist/status-cmd.d.ts.map +1 -0
  678. package/dist/status-cmd.js +116 -0
  679. package/dist/status-cmd.js.map +1 -0
  680. package/dist/stop-follow-up.d.ts +107 -0
  681. package/dist/stop-follow-up.d.ts.map +1 -0
  682. package/dist/stop-follow-up.js +172 -0
  683. package/dist/stop-follow-up.js.map +1 -0
  684. package/dist/surface-lease.d.ts +118 -0
  685. package/dist/surface-lease.d.ts.map +1 -0
  686. package/dist/surface-lease.js +485 -0
  687. package/dist/surface-lease.js.map +1 -0
  688. package/dist/sync.d.ts +54 -0
  689. package/dist/sync.d.ts.map +1 -0
  690. package/dist/sync.js +93 -0
  691. package/dist/sync.js.map +1 -0
  692. package/dist/syncing-ledger.d.ts +45 -0
  693. package/dist/syncing-ledger.d.ts.map +1 -0
  694. package/dist/syncing-ledger.js +53 -0
  695. package/dist/syncing-ledger.js.map +1 -0
  696. package/dist/temp-fixtures.d.ts +68 -0
  697. package/dist/temp-fixtures.d.ts.map +1 -0
  698. package/dist/temp-fixtures.js +38 -0
  699. package/dist/temp-fixtures.js.map +1 -0
  700. package/dist/token-window.d.ts +84 -0
  701. package/dist/token-window.d.ts.map +1 -0
  702. package/dist/token-window.js +143 -0
  703. package/dist/token-window.js.map +1 -0
  704. package/dist/tool-bridge.d.ts +177 -0
  705. package/dist/tool-bridge.d.ts.map +1 -0
  706. package/dist/tool-bridge.js +329 -0
  707. package/dist/tool-bridge.js.map +1 -0
  708. package/dist/tool-call-record.d.ts +197 -0
  709. package/dist/tool-call-record.d.ts.map +1 -0
  710. package/dist/tool-call-record.js +276 -0
  711. package/dist/tool-call-record.js.map +1 -0
  712. package/dist/tool-protocol.d.ts +135 -0
  713. package/dist/tool-protocol.d.ts.map +1 -0
  714. package/dist/tool-protocol.js +104 -0
  715. package/dist/tool-protocol.js.map +1 -0
  716. package/dist/tool-worker.d.ts +3 -0
  717. package/dist/tool-worker.d.ts.map +1 -0
  718. package/dist/tool-worker.js +478 -0
  719. package/dist/tool-worker.js.map +1 -0
  720. package/dist/toolchain-mirror.d.ts +86 -0
  721. package/dist/toolchain-mirror.d.ts.map +1 -0
  722. package/dist/toolchain-mirror.js +307 -0
  723. package/dist/toolchain-mirror.js.map +1 -0
  724. package/dist/trusted-git.d.ts +243 -0
  725. package/dist/trusted-git.d.ts.map +1 -0
  726. package/dist/trusted-git.js +920 -0
  727. package/dist/trusted-git.js.map +1 -0
  728. package/dist/ui.d.ts +76 -0
  729. package/dist/ui.d.ts.map +1 -0
  730. package/dist/ui.js +118 -0
  731. package/dist/ui.js.map +1 -0
  732. package/dist/untrusted-exec.d.ts +275 -0
  733. package/dist/untrusted-exec.d.ts.map +1 -0
  734. package/dist/untrusted-exec.js +479 -0
  735. package/dist/untrusted-exec.js.map +1 -0
  736. package/dist/untrusted-gate.d.ts +73 -0
  737. package/dist/untrusted-gate.d.ts.map +1 -0
  738. package/dist/untrusted-gate.js +226 -0
  739. package/dist/untrusted-gate.js.map +1 -0
  740. package/dist/uploader.d.ts +153 -0
  741. package/dist/uploader.d.ts.map +1 -0
  742. package/dist/uploader.js +204 -0
  743. package/dist/uploader.js.map +1 -0
  744. package/dist/verifier.d.ts +66 -0
  745. package/dist/verifier.d.ts.map +1 -0
  746. package/dist/verifier.js +170 -0
  747. package/dist/verifier.js.map +1 -0
  748. package/dist/verify-apply.d.ts +26 -0
  749. package/dist/verify-apply.d.ts.map +1 -0
  750. package/dist/verify-apply.js +36 -0
  751. package/dist/verify-apply.js.map +1 -0
  752. package/dist/verify-cmd.d.ts +44 -0
  753. package/dist/verify-cmd.d.ts.map +1 -0
  754. package/dist/verify-cmd.js +125 -0
  755. package/dist/verify-cmd.js.map +1 -0
  756. package/dist/verify-pass.d.ts +73 -0
  757. package/dist/verify-pass.d.ts.map +1 -0
  758. package/dist/verify-pass.js +103 -0
  759. package/dist/verify-pass.js.map +1 -0
  760. package/dist/welcome.d.ts +43 -0
  761. package/dist/welcome.d.ts.map +1 -0
  762. package/dist/welcome.js +116 -0
  763. package/dist/welcome.js.map +1 -0
  764. package/dist/workspace-provisioner.d.ts +65 -0
  765. package/dist/workspace-provisioner.d.ts.map +1 -0
  766. package/dist/workspace-provisioner.js +66 -0
  767. package/dist/workspace-provisioner.js.map +1 -0
  768. package/dist/workspace-quarantine.d.ts +64 -0
  769. package/dist/workspace-quarantine.d.ts.map +1 -0
  770. package/dist/workspace-quarantine.js +156 -0
  771. package/dist/workspace-quarantine.js.map +1 -0
  772. package/dist/workspace-residue-sweep.d.ts +113 -0
  773. package/dist/workspace-residue-sweep.d.ts.map +1 -0
  774. package/dist/workspace-residue-sweep.js +158 -0
  775. package/dist/workspace-residue-sweep.js.map +1 -0
  776. package/dist/workspace.d.ts +639 -0
  777. package/dist/workspace.d.ts.map +1 -0
  778. package/dist/workspace.js +2026 -0
  779. package/dist/workspace.js.map +1 -0
  780. package/package.json +54 -6
  781. package/win/CredProbe.cs +64 -0
  782. package/win/FakeClaude.cs +56 -0
  783. package/win/HandleProbe.cs +116 -0
  784. package/win/TokenProbe.cs +53 -0
  785. package/win/appcontainer.ps1 +500 -0
@@ -0,0 +1,75 @@
1
+ import type { MigrationDir, MigrationFile, MigrationPart } from './rails-home';
2
+ /**
3
+ * THE TWO LEDGERS THAT DECIDE WHETHER A RAIL IS SHUT, MOVED FORWARD ONCE.
4
+ *
5
+ * `rails-home.ts` owns the mechanism — exclusive create, target-as-first-source,
6
+ * marker written last, nothing old deleted. This file owns the only thing that
7
+ * is specific to each ledger: what "merged" means for it.
8
+ *
9
+ * ⚠️ EACH MERGE THROWS RATHER THAN SKIPPING. A source that reads and does not
10
+ * parse is the fail-closed case, not the tolerable one. The single exception is
11
+ * a torn FINAL line of an append-only log, which is what a crash mid-append
12
+ * looks like and which `ExemptionStore.readSpendLog` already skips for the same
13
+ * reason — discarding every spend on the strength of one truncated line would be
14
+ * fail-open by another route.
15
+ */
16
+ /** The legacy whole-map file, and the append-only log that replaced it. */
17
+ export declare const EXEMPTIONS_LEGACY = "exemptions.json";
18
+ export declare const EXEMPTIONS_LOG = "exemptions.spent.jsonl";
19
+ /** The loop-safety history: observations, incidents, and the legacy projection. */
20
+ export declare const SAFETY_LEGACY = "loop-safety.json";
21
+ export declare const SAFETY_EVENTS = "loop-safety-events.jsonl";
22
+ export declare const SAFETY_INCIDENTS = "loop-safety-incidents.jsonl";
23
+ /**
24
+ * The spend ledger: a SET UNION, and spent in ANY source is spent.
25
+ *
26
+ * 🔴 UNION, NOT LAST-WRITER. This is the whole reason the migration is not a
27
+ * fallback. Workspace A's ledger says grant `g` is spent; workspace B's does
28
+ * not, because B never offered it. A merge that preferred either side over the
29
+ * other by position would, half the time, produce a machine that believes `g`
30
+ * is available. Union is the only combination that cannot lose a spend.
31
+ *
32
+ * ⚠️ AND THE FIRST ROUND WINS FOR A KEY SEEN TWICE, matching
33
+ * `ExemptionStore.record`: "the round recorded is the one that actually used the
34
+ * door, and overwriting it would make the trailer and this file disagree about
35
+ * which commit opened it." Sources are therefore passed in the same order
36
+ * `open()` reads them.
37
+ */
38
+ export declare function mergeSpendLog(parts: readonly MigrationPart[]): string;
39
+ /**
40
+ * The safety history: EVERY observation from every source, ordered by `at`.
41
+ *
42
+ * 🔴 ORDERED BY THE FIELD, NOT BY THE FILE. The detectors read a sequence: three
43
+ * identical failure signatures in a row, or an A-B-A-B tree fingerprint. Two
44
+ * workspaces' histories concatenated end to end produce a sequence that never
45
+ * happened — A's three failures then B's three, when in fact they interleaved.
46
+ * The records carry their own `at`, so the true order is recoverable and is used.
47
+ *
48
+ * ⚠️ DUPLICATES ARE DROPPED BY IDENTITY, not by position: the same observation
49
+ * can appear in two sources when a workspace was cut from another's state. Two
50
+ * identical records are one event that was copied, never two events that agreed.
51
+ */
52
+ export declare function mergeJsonlByTime(parts: readonly MigrationPart[]): string;
53
+ /**
54
+ * The legacy whole-document projection is NOT merged forward.
55
+ *
56
+ * `loop-safety.json` was a projection of the observations and incidents that the
57
+ * store rebuilt on every open. Both of its inputs are migrated as append-only
58
+ * logs above, so carrying the projection too would double every record it holds.
59
+ * It is left on disk with everything else and never read again.
60
+ */
61
+ export declare function exemptionMigration(oldStateDirs: readonly string[]): MigrationFile;
62
+ export declare const SAFETY_OVERRIDES = "loop-safety-overrides";
63
+ /**
64
+ * 🔴 THE OVERRIDE MARKERS MOVE WITH THE INCIDENTS, OR A SPENT RETRY IS LOST.
65
+ *
66
+ * `foldInSpentRetries` re-derives "has this incident's one retry been spent"
67
+ * from these files on every open. They are not a cache of the incidents file —
68
+ * they are the only record that exists. Leaving them behind means a person who
69
+ * already spent their retry finds the hold active again, having paid for
70
+ * nothing; moving them without the incidents means a marker for an incident
71
+ * nothing can see.
72
+ */
73
+ export declare function safetyOverridesMigration(oldStateDirs: readonly string[]): MigrationDir;
74
+ export declare function safetyMigrations(oldStateDirs: readonly string[]): MigrationFile[];
75
+ //# sourceMappingURL=rails-migrations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-migrations.d.ts","sourceRoot":"","sources":["../src/rails-migrations.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAE/E;;;;;;;;;;;;;GAaG;AAEH,2EAA2E;AAC3E,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,cAAc,2BAA2B,CAAC;AAEvD,mFAAmF;AACnF,eAAO,MAAM,aAAa,qBAAqB,CAAC;AAChD,eAAO,MAAM,aAAa,6BAA6B,CAAC;AACxD,eAAO,MAAM,gBAAgB,gCAAgC,CAAC;AAO9D;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CA0CrE;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,SAAS,aAAa,EAAE,GAAG,MAAM,CAkCxE;AAED;;;;;;;GAOG;AACH,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,CAUjF;AAED,eAAO,MAAM,gBAAgB,0BAA0B,CAAC;AAExD;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,YAAY,CAKtF;AAED,wBAAgB,gBAAgB,CAAC,YAAY,EAAE,SAAS,MAAM,EAAE,GAAG,aAAa,EAAE,CAajF"}
@@ -0,0 +1,199 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SAFETY_OVERRIDES = exports.SAFETY_INCIDENTS = exports.SAFETY_EVENTS = exports.SAFETY_LEGACY = exports.EXEMPTIONS_LOG = exports.EXEMPTIONS_LEGACY = void 0;
4
+ exports.mergeSpendLog = mergeSpendLog;
5
+ exports.mergeJsonlByTime = mergeJsonlByTime;
6
+ exports.exemptionMigration = exemptionMigration;
7
+ exports.safetyOverridesMigration = safetyOverridesMigration;
8
+ exports.safetyMigrations = safetyMigrations;
9
+ const node_path_1 = require("node:path");
10
+ /**
11
+ * THE TWO LEDGERS THAT DECIDE WHETHER A RAIL IS SHUT, MOVED FORWARD ONCE.
12
+ *
13
+ * `rails-home.ts` owns the mechanism — exclusive create, target-as-first-source,
14
+ * marker written last, nothing old deleted. This file owns the only thing that
15
+ * is specific to each ledger: what "merged" means for it.
16
+ *
17
+ * ⚠️ EACH MERGE THROWS RATHER THAN SKIPPING. A source that reads and does not
18
+ * parse is the fail-closed case, not the tolerable one. The single exception is
19
+ * a torn FINAL line of an append-only log, which is what a crash mid-append
20
+ * looks like and which `ExemptionStore.readSpendLog` already skips for the same
21
+ * reason — discarding every spend on the strength of one truncated line would be
22
+ * fail-open by another route.
23
+ */
24
+ /** The legacy whole-map file, and the append-only log that replaced it. */
25
+ exports.EXEMPTIONS_LEGACY = 'exemptions.json';
26
+ exports.EXEMPTIONS_LOG = 'exemptions.spent.jsonl';
27
+ /** The loop-safety history: observations, incidents, and the legacy projection. */
28
+ exports.SAFETY_LEGACY = 'loop-safety.json';
29
+ exports.SAFETY_EVENTS = 'loop-safety-events.jsonl';
30
+ exports.SAFETY_INCIDENTS = 'loop-safety-incidents.jsonl';
31
+ /** True for the last line of a text that does not end in a newline: a torn append. */
32
+ function isTornTail(text, index, lines) {
33
+ return index === lines.length - 1 && !text.endsWith('\n');
34
+ }
35
+ /**
36
+ * The spend ledger: a SET UNION, and spent in ANY source is spent.
37
+ *
38
+ * 🔴 UNION, NOT LAST-WRITER. This is the whole reason the migration is not a
39
+ * fallback. Workspace A's ledger says grant `g` is spent; workspace B's does
40
+ * not, because B never offered it. A merge that preferred either side over the
41
+ * other by position would, half the time, produce a machine that believes `g`
42
+ * is available. Union is the only combination that cannot lose a spend.
43
+ *
44
+ * ⚠️ AND THE FIRST ROUND WINS FOR A KEY SEEN TWICE, matching
45
+ * `ExemptionStore.record`: "the round recorded is the one that actually used the
46
+ * door, and overwriting it would make the trailer and this file disagree about
47
+ * which commit opened it." Sources are therefore passed in the same order
48
+ * `open()` reads them.
49
+ */
50
+ function mergeSpendLog(parts) {
51
+ const spent = new Map();
52
+ const take = (key, round) => {
53
+ if (typeof key !== 'string' || key === '')
54
+ return;
55
+ if (typeof round !== 'number' || !Number.isInteger(round))
56
+ return;
57
+ if (!spent.has(key))
58
+ spent.set(key, round);
59
+ };
60
+ for (const part of parts) {
61
+ if (part.path.endsWith(exports.EXEMPTIONS_LEGACY)) {
62
+ let parsed;
63
+ try {
64
+ parsed = JSON.parse(part.text);
65
+ }
66
+ catch {
67
+ throw new Error(`${part.path} is not readable JSON, so its spends cannot be counted`);
68
+ }
69
+ const map = parsed?.spent;
70
+ if (typeof map !== 'object' || map === null) {
71
+ throw new Error(`${part.path} is not a spend file, so its spends cannot be counted`);
72
+ }
73
+ for (const [key, round] of Object.entries(map))
74
+ take(key, round);
75
+ continue;
76
+ }
77
+ const lines = part.text.split('\n');
78
+ lines.forEach((line, i) => {
79
+ if (line.trim() === '')
80
+ return;
81
+ try {
82
+ const row = JSON.parse(line);
83
+ take(row.key, row.round);
84
+ }
85
+ catch (e) {
86
+ if (isTornTail(part.text, i, lines))
87
+ return;
88
+ throw new Error(`${part.path} line ${i + 1} is not a spend record`);
89
+ }
90
+ });
91
+ }
92
+ // Sorted by key so the migrated file is deterministic and diffable. Order
93
+ // carries no meaning here: `isSpent` asks whether the key is present.
94
+ return [...spent.entries()]
95
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
96
+ .map(([key, round]) => `${JSON.stringify({ key, round })}\n`)
97
+ .join('');
98
+ }
99
+ /**
100
+ * The safety history: EVERY observation from every source, ordered by `at`.
101
+ *
102
+ * 🔴 ORDERED BY THE FIELD, NOT BY THE FILE. The detectors read a sequence: three
103
+ * identical failure signatures in a row, or an A-B-A-B tree fingerprint. Two
104
+ * workspaces' histories concatenated end to end produce a sequence that never
105
+ * happened — A's three failures then B's three, when in fact they interleaved.
106
+ * The records carry their own `at`, so the true order is recoverable and is used.
107
+ *
108
+ * ⚠️ DUPLICATES ARE DROPPED BY IDENTITY, not by position: the same observation
109
+ * can appear in two sources when a workspace was cut from another's state. Two
110
+ * identical records are one event that was copied, never two events that agreed.
111
+ */
112
+ function mergeJsonlByTime(parts) {
113
+ const rows = [];
114
+ const seen = new Set();
115
+ let n = 0;
116
+ for (const part of parts) {
117
+ const lines = part.text.split('\n');
118
+ lines.forEach((line, i) => {
119
+ const trimmed = line.trim();
120
+ if (trimmed === '')
121
+ return;
122
+ let row;
123
+ try {
124
+ row = JSON.parse(trimmed);
125
+ }
126
+ catch (e) {
127
+ if (isTornTail(part.text, i, lines))
128
+ return;
129
+ throw new Error(`${part.path} line ${i + 1} is not a record`);
130
+ }
131
+ if (seen.has(trimmed))
132
+ return;
133
+ seen.add(trimmed);
134
+ /**
135
+ * ⚠️ A RECORD WITH NO TIME SORTS FIRST, NOT LAST. An observation whose
136
+ * `at` is missing is older than anything that has one — nothing in this
137
+ * codebase has ever written one without — and putting it last would let a
138
+ * malformed row displace the most recent real observation, which is the
139
+ * one every detector looks at.
140
+ */
141
+ const at = typeof row.at === 'string' ? row.at : typeof row.triggeredAt === 'string' ? row.triggeredAt : '';
142
+ rows.push({ at, ordinal: n++, line: trimmed });
143
+ });
144
+ }
145
+ // Stable: equal timestamps keep the order they were read in.
146
+ rows.sort((a, b) => (a.at < b.at ? -1 : a.at > b.at ? 1 : a.ordinal - b.ordinal));
147
+ return rows.map((r) => `${r.line}\n`).join('');
148
+ }
149
+ /**
150
+ * The legacy whole-document projection is NOT merged forward.
151
+ *
152
+ * `loop-safety.json` was a projection of the observations and incidents that the
153
+ * store rebuilt on every open. Both of its inputs are migrated as append-only
154
+ * logs above, so carrying the projection too would double every record it holds.
155
+ * It is left on disk with everything else and never read again.
156
+ */
157
+ function exemptionMigration(oldStateDirs) {
158
+ return {
159
+ name: exports.EXEMPTIONS_LOG,
160
+ // The legacy map first, then the log, matching the order `open()` reads them.
161
+ sources: [
162
+ ...oldStateDirs.map((d) => (0, node_path_1.join)(d, exports.EXEMPTIONS_LEGACY)),
163
+ ...oldStateDirs.map((d) => (0, node_path_1.join)(d, exports.EXEMPTIONS_LOG)),
164
+ ],
165
+ merge: mergeSpendLog,
166
+ };
167
+ }
168
+ exports.SAFETY_OVERRIDES = 'loop-safety-overrides';
169
+ /**
170
+ * 🔴 THE OVERRIDE MARKERS MOVE WITH THE INCIDENTS, OR A SPENT RETRY IS LOST.
171
+ *
172
+ * `foldInSpentRetries` re-derives "has this incident's one retry been spent"
173
+ * from these files on every open. They are not a cache of the incidents file —
174
+ * they are the only record that exists. Leaving them behind means a person who
175
+ * already spent their retry finds the hold active again, having paid for
176
+ * nothing; moving them without the incidents means a marker for an incident
177
+ * nothing can see.
178
+ */
179
+ function safetyOverridesMigration(oldStateDirs) {
180
+ return {
181
+ name: exports.SAFETY_OVERRIDES,
182
+ sources: oldStateDirs.map((d) => (0, node_path_1.join)(d, exports.SAFETY_OVERRIDES)),
183
+ };
184
+ }
185
+ function safetyMigrations(oldStateDirs) {
186
+ return [
187
+ {
188
+ name: exports.SAFETY_EVENTS,
189
+ sources: oldStateDirs.map((d) => (0, node_path_1.join)(d, exports.SAFETY_EVENTS)),
190
+ merge: mergeJsonlByTime,
191
+ },
192
+ {
193
+ name: exports.SAFETY_INCIDENTS,
194
+ sources: oldStateDirs.map((d) => (0, node_path_1.join)(d, exports.SAFETY_INCIDENTS)),
195
+ merge: mergeJsonlByTime,
196
+ },
197
+ ];
198
+ }
199
+ //# sourceMappingURL=rails-migrations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-migrations.js","sourceRoot":"","sources":["../src/rails-migrations.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { ExemptionStore } from './exemption-store';
2
+ import { LoopSafetyStore } from './loop-safety-store';
3
+ import { type LedgerFs } from './ledger-store';
4
+ import { type MigrationFs } from './rails-home';
5
+ /**
6
+ * THE TWO RAILS STORES, POINTED AT THEIR MACHINE-LEVEL HOME.
7
+ *
8
+ * These are the only constructors production code should use. A bare
9
+ * `new ExemptionStore(dir, fs)` is still what every test builds — the store
10
+ * knows nothing about where it lives, which is what keeps it testable — but a
11
+ * production caller that picked its own directory is exactly how the ledger
12
+ * ended up inside the repository in the first place.
13
+ *
14
+ * ⚠️ THE MIGRATION IS PART OF OPENING, NOT A SEPARATE STEP SOMEBODY MUST
15
+ * REMEMBER. It is handed to the store as a closure and runs before the store's
16
+ * first read, so there is no window in which a caller has an open store that has
17
+ * not yet moved its history forward. A migration that refuses leaves the store
18
+ * unreadable, which for both of these means every rail stays shut.
19
+ */
20
+ /** Where the migration reads from and writes to, so a test can supply its own. */
21
+ export interface RailsDeps {
22
+ readonly fs?: LedgerFs;
23
+ readonly migrationFs?: MigrationFs;
24
+ readonly home?: string;
25
+ readonly now?: () => number;
26
+ /** Records why a migration refused. Production prints it; tests collect it. */
27
+ readonly onRefusal?: (because: string) => void;
28
+ }
29
+ /**
30
+ * The exemption spend ledger.
31
+ *
32
+ * 🔴 A SINGLE-USE GRANT IS SINGLE-USE ACROSS THE MACHINE. Phase 1 made it
33
+ * single-use across the WORKSPACES of one checkout by moving this to the project
34
+ * state directory; this moves it out of the repository, where ordinary
35
+ * housekeeping — a re-clone, a `git clean -xfd`, deleting a finished checkout —
36
+ * cannot quietly turn a spent grant back into an unspent one.
37
+ */
38
+ export declare function railsExemptionStore(cwd: string, deps?: RailsDeps): ExemptionStore;
39
+ /**
40
+ * The loop-safety history.
41
+ *
42
+ * 🔴 A HOLD MEANS THE SAME THING ON A BUSY MACHINE AS ON AN IDLE ONE. The
43
+ * detectors count observations, so a history split across N places is N
44
+ * histories, and `repeated_failure` needs three failures in EACH — the exact
45
+ * silent safety-disablement the detectors exist to prevent, recreated by a
46
+ * different route.
47
+ */
48
+ export declare function railsSafetyStore(cwd: string, deps?: RailsDeps): LoopSafetyStore;
49
+ //# sourceMappingURL=rails-stores.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-stores.d.ts","sourceRoot":"","sources":["../src/rails-stores.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAgB,MAAM,qBAAqB,CAAC;AACpE,OAAO,EAAgB,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAG7D,OAAO,EAKL,KAAK,WAAW,EAEjB,MAAM,cAAc,CAAC;AAGtB;;;;;;;;;;;;;;GAcG;AAEH,kFAAkF;AAClF,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,EAAE,CAAC,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,WAAW,CAAC,EAAE,WAAW,CAAC;IACnC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAC5B,+EAA+E;IAC/E,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;CAChD;AAuBD;;;;;;;;GAQG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,cAAc,CAIrF;AAiDD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,GAAE,SAAc,GAAG,eAAe,CAOnF"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.railsExemptionStore = railsExemptionStore;
4
+ exports.railsSafetyStore = railsSafetyStore;
5
+ const node_fs_1 = require("node:fs");
6
+ const node_os_1 = require("node:os");
7
+ const node_path_1 = require("node:path");
8
+ const exemption_store_1 = require("./exemption-store");
9
+ const loop_safety_store_1 = require("./loop-safety-store");
10
+ const ledger_store_1 = require("./ledger-store");
11
+ const git_driver_1 = require("./git-driver");
12
+ const workspace_1 = require("./workspace");
13
+ const rails_home_1 = require("./rails-home");
14
+ const rails_migrations_1 = require("./rails-migrations");
15
+ async function move(cwd, which, deps) {
16
+ const home = deps.home ?? (0, node_os_1.homedir)();
17
+ const fs = deps.migrationFs ?? rails_home_1.nodeMigrationFs;
18
+ const dir = (0, rails_home_1.railsDir)(cwd, home);
19
+ const olds = await (0, rails_home_1.legacyStateDirs)({
20
+ projectState: (0, git_driver_1.projectStateDir)(cwd),
21
+ workspacesRoot: (0, workspace_1.workspacesRoot)(cwd, home),
22
+ fs,
23
+ });
24
+ const files = which === 'exemptions' ? [(0, rails_migrations_1.exemptionMigration)(olds)] : (0, rails_migrations_1.safetyMigrations)(olds);
25
+ // The override markers travel WITH the incidents. See safetyOverridesMigration.
26
+ const dirs = which === 'exemptions' ? [] : [(0, rails_migrations_1.safetyOverridesMigration)(olds)];
27
+ const out = await (0, rails_home_1.copyForwardOnce)({ dir, files, dirs, fs, who: which, now: deps.now });
28
+ if (!out.ok && deps.onRefusal !== undefined)
29
+ deps.onRefusal(out.because);
30
+ return out;
31
+ }
32
+ /**
33
+ * The exemption spend ledger.
34
+ *
35
+ * 🔴 A SINGLE-USE GRANT IS SINGLE-USE ACROSS THE MACHINE. Phase 1 made it
36
+ * single-use across the WORKSPACES of one checkout by moving this to the project
37
+ * state directory; this moves it out of the repository, where ordinary
38
+ * housekeeping — a re-clone, a `git clean -xfd`, deleting a finished checkout —
39
+ * cannot quietly turn a spent grant back into an unspent one.
40
+ */
41
+ function railsExemptionStore(cwd, deps = {}) {
42
+ return new exemption_store_1.ExemptionStore((0, rails_home_1.railsDir)(cwd, deps.home ?? (0, node_os_1.homedir)()), deps.fs ?? ledger_store_1.nodeLedgerFs, () => move(cwd, 'exemptions', withVoice(deps, 'exemptions', cwd, deps.home ?? (0, node_os_1.homedir)())));
43
+ }
44
+ /**
45
+ * 🔴 A REFUSAL THAT NOBODY PRINTS IS A SILENT FAILURE, AND BOTH OF THESE FAIL
46
+ * CLOSED — so the person sees a machine that has stopped doing something, with
47
+ * nothing said about why.
48
+ *
49
+ * `onRefusal` existed and no production caller passed one. An exemption store
50
+ * that refuses answers `isSpent` true for EVERY grant, so a person's granted
51
+ * exemption simply stops working; a safety store that refuses leaves `safety =
52
+ * null`, and the hold fence is skipped entirely. Either is worth a line.
53
+ */
54
+ function withVoice(deps, which, cwd, home) {
55
+ if (deps.onRefusal !== undefined)
56
+ return deps;
57
+ return {
58
+ ...deps,
59
+ onRefusal: (because) => {
60
+ process.stderr.write(`rails : the ${which} ledger could not be moved — ${because}\n`);
61
+ /**
62
+ * 🔴 AND A DURABLE ONE, BECAUSE stderr IS `/dev/null` FOR THE PROCESS
63
+ * THAT MOST NEEDS TO BE HEARD.
64
+ *
65
+ * MEASURED: `run-launcher` spawns every daemon-launched run with
66
+ * `detached: true, stdio: 'ignore'`. The same child, under `pipe`,
67
+ * delivers both refusal lines; under `ignore` it delivers nothing at all
68
+ * while the store state is identically `unreadable`. So an overnight run
69
+ * whose exemption ledger has silently shut every rail says nothing,
70
+ * anywhere, ever.
71
+ *
72
+ * `bin.ts` already knows this hazard and names it for `RunRefused` —
73
+ * "the daemon that spawned this cannot [hear], because it spawns with
74
+ * `stdio: 'ignore'` on a detached child, so the words go nowhere" — and
75
+ * answers it with a durable mark beside the stream. This is that.
76
+ */
77
+ try {
78
+ const dir = (0, rails_home_1.railsDir)(cwd, home);
79
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
80
+ (0, node_fs_1.appendFileSync)((0, node_path_1.join)(dir, 'refusals.jsonl'), `\n${JSON.stringify({ which, because, pid: process.pid, at: new Date().toISOString() })}\n`, 'utf8');
81
+ }
82
+ catch {
83
+ /* a refusal we cannot write down is still a refusal we printed */
84
+ }
85
+ },
86
+ };
87
+ }
88
+ /**
89
+ * The loop-safety history.
90
+ *
91
+ * 🔴 A HOLD MEANS THE SAME THING ON A BUSY MACHINE AS ON AN IDLE ONE. The
92
+ * detectors count observations, so a history split across N places is N
93
+ * histories, and `repeated_failure` needs three failures in EACH — the exact
94
+ * silent safety-disablement the detectors exist to prevent, recreated by a
95
+ * different route.
96
+ */
97
+ function railsSafetyStore(cwd, deps = {}) {
98
+ return new loop_safety_store_1.LoopSafetyStore((0, rails_home_1.railsDir)(cwd, deps.home ?? (0, node_os_1.homedir)()), loop_safety_store_1.nodeSafetyFs, deps.now ?? (() => Date.now()), () => move(cwd, 'safety', withVoice(deps, 'loop-safety', cwd, deps.home ?? (0, node_os_1.homedir)())));
99
+ }
100
+ //# sourceMappingURL=rails-stores.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-stores.js","sourceRoot":"","sources":["../src/rails-stores.ts"],"names":[],"mappings":";;AA0EA,kDAIC;AA0DD,4CAOC;AA/ID,qCAAoD;AACpD,qCAAkC;AAClC,yCAAiC;AACjC,uDAAmD;AACnD,2DAAoE;AACpE,iDAA6D;AAC7D,6CAA+C;AAC/C,2CAA6C;AAC7C,6CAOsB;AACtB,yDAAoG;AA4BpG,KAAK,UAAU,IAAI,CACjB,GAAW,EACX,KAA8B,EAC9B,IAAe;IAEf,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAA,iBAAO,GAAE,CAAC;IACpC,MAAM,EAAE,GAAG,IAAI,CAAC,WAAW,IAAI,4BAAe,CAAC;IAC/C,MAAM,GAAG,GAAG,IAAA,qBAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,MAAM,IAAA,4BAAe,EAAC;QACjC,YAAY,EAAE,IAAA,4BAAe,EAAC,GAAG,CAAC;QAClC,cAAc,EAAE,IAAA,0BAAc,EAAC,GAAG,EAAE,IAAI,CAAC;QACzC,EAAE;KACH,CAAC,CAAC;IACH,MAAM,KAAK,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,CAAC,IAAA,qCAAkB,EAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAA,mCAAgB,EAAC,IAAI,CAAC,CAAC;IAC3F,gFAAgF;IAChF,MAAM,IAAI,GAAG,KAAK,KAAK,YAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,IAAA,2CAAwB,EAAC,IAAI,CAAC,CAAC,CAAC;IAC5E,MAAM,GAAG,GAAG,MAAM,IAAA,4BAAe,EAAC,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IACvF,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACzE,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,mBAAmB,CAAC,GAAW,EAAE,OAAkB,EAAE;IACnE,OAAO,IAAI,gCAAc,CAAC,IAAA,qBAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAA,iBAAO,GAAE,CAAC,EAAE,IAAI,CAAC,EAAE,IAAI,2BAAY,EAAE,GAAG,EAAE,CAC7F,IAAI,CAAC,GAAG,EAAE,YAAY,EAAE,SAAS,CAAC,IAAI,EAAE,YAAY,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAA,iBAAO,GAAE,CAAC,CAAC,CACpF,CAAC;AACJ,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,SAAS,CAAC,IAAe,EAAE,KAAa,EAAE,GAAW,EAAE,IAAY;IAC1E,IAAI,IAAI,CAAC,SAAS,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IAC9C,OAAO;QACL,GAAG,IAAI;QACP,SAAS,EAAE,CAAC,OAAO,EAAE,EAAE;YACrB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,iBAAiB,KAAK,gCAAgC,OAAO,IAAI,CAAC,CAAC;YACxF;;;;;;;;;;;;;;;eAeG;YACH,IAAI,CAAC;gBACH,MAAM,GAAG,GAAG,IAAA,qBAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,CAAC;gBAChC,IAAA,mBAAS,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBACpC,IAAA,wBAAc,EACZ,IAAA,gBAAI,EAAC,GAAG,EAAE,gBAAgB,CAAC,EAC3B,KAAK,IAAI,CAAC,SAAS,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,EAAE,CAAC,IAAI,EAC3F,MAAM,CACP,CAAC;YACJ,CAAC;YAAC,MAAM,CAAC;gBACP,kEAAkE;YACpE,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,SAAgB,gBAAgB,CAAC,GAAW,EAAE,OAAkB,EAAE;IAChE,OAAO,IAAI,mCAAe,CACxB,IAAA,qBAAQ,EAAC,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAA,iBAAO,GAAE,CAAC,EACrC,gCAAY,EACZ,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,EAC9B,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,EAAE,SAAS,CAAC,IAAI,EAAE,aAAa,EAAE,GAAG,EAAE,IAAI,CAAC,IAAI,IAAI,IAAA,iBAAO,GAAE,CAAC,CAAC,CACvF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,69 @@
1
+ import { GitDriver } from './git-driver';
2
+ import { RunRegistry, type ProbeFn } from './workspace';
3
+ /**
4
+ * THE MACHINE RETIRES WHAT IT MADE — when the project asked (M4-4).
5
+ *
6
+ * ─────────────────────────────────────────────────────────────────────────────
7
+ * Since M4-1 the daemon can make checkouts, and nothing removed them: idle ones
8
+ * accumulated up to `machine.max_workspaces` until a person ran the manual
9
+ * reap. With `machine.reap_provisioned: true` the daemon retires, at most ONE
10
+ * per cadence, after the tick, a checkout that meets ALL of:
11
+ *
12
+ * 1. IT MADE IT — the provisioner leaves `provisioned.json` in the checkout's
13
+ * state dir; a checkout a person cut carries none and is never touched;
14
+ * 2. NOTHING RUNS THERE — `abandonedWorkspaces` lists it (no record claims
15
+ * it, no live lease, no live creation marker), or its only record is of a
16
+ * run that has DIED (an orphan the manual command retires the same way);
17
+ * 3. IT HAS BEEN IDLE for at least `machine.idle_checkout_minutes`, measured
18
+ * from the newest of the marker and anything written to its state dir;
19
+ * 4. THE MANUAL COMMAND'S OWN FUNCTIONS AGREE — `reapAbandoned` /
20
+ * `reapWorkspace`: not busy, not quarantined, no residue (uncommitted or
21
+ * untracked work keeps it, with the reason), records retained, then
22
+ * `git worktree remove` and prune.
23
+ *
24
+ * 🔴 NEVER A CHECKOUT THAT IS ABOUT TO BE USED. The daemon hands over the
25
+ * paths it placed a goal into this cadence and last (a launch is not an
26
+ * arrival: the run has not written its lease yet) and the one it provisioned
27
+ * this cadence; none of those is a candidate. And an orphan's checkout that a
28
+ * LIVE run now occupies is not touched either — the dead record is somebody
29
+ * else's leftover, the checkout is in use.
30
+ *
31
+ * ⚠️ AND IT KNOWS NOTHING ABOUT GOALS. A checkout is a checkout.
32
+ */
33
+ export declare const PROVISIONED_MARKER = "provisioned.json";
34
+ export interface ProvisionedMarker {
35
+ readonly by: 'daemon';
36
+ readonly at: string;
37
+ readonly pid: number;
38
+ }
39
+ /** Written by the provisioner once the checkout is complete: the fact that the machine made it. */
40
+ export declare function writeProvisionedMarker(stateDir: string, at: string, pid: number): void;
41
+ export declare function provisionedByDaemon(checkout: string): ProvisionedMarker | null;
42
+ /** Minutes since anything last happened in the checkout: the marker, or the newest entry of its state dir. */
43
+ export declare function idleMinutesOf(checkout: string, marker: ProvisionedMarker, now: number): number;
44
+ export type ReapOutcome = 'retired' | 'kept' | 'none';
45
+ export interface ReapDeps {
46
+ readonly cwd: string;
47
+ readonly registry: RunRegistry;
48
+ readonly git: GitDriver;
49
+ readonly now: () => number;
50
+ readonly idleMinutes: number;
51
+ readonly probe?: ProbeFn;
52
+ readonly log: (line: string) => void;
53
+ /** Checkouts the daemon placed into or made this cadence (or last): never candidates. */
54
+ readonly exclude?: readonly string[];
55
+ /** Whose home the workspaces root lives under; the user's unless a caller says otherwise. */
56
+ readonly home?: string;
57
+ }
58
+ /** One cadence's reaping: the first eligible checkout in path order, and only one. */
59
+ export declare function reapOneProvisioned(deps: ReapDeps): Promise<ReapOutcome>;
60
+ /** The daemon's reaper: built only behind `machine.reap_provisioned`; a failure is a log line, never a stopped daemon. */
61
+ export declare function nodeReaper(cwd: string, projectState: string, opts: {
62
+ readonly idleMinutes: number;
63
+ readonly log: (line: string) => void;
64
+ readonly now?: () => number;
65
+ readonly home?: string;
66
+ }): (exclude?: readonly string[]) => Promise<ReapOutcome | 'failed'>;
67
+ /** For `looply runs` and tests: is there a marker at all? */
68
+ export declare function hasProvisionedMarker(checkout: string): boolean;
69
+ //# sourceMappingURL=reaper.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reaper.d.ts","sourceRoot":"","sources":["../src/reaper.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAA0B,MAAM,cAAc,CAAC;AACjE,OAAO,EAAE,WAAW,EAA8E,KAAK,OAAO,EAAkB,MAAM,aAAa,CAAC;AAEpJ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,eAAO,MAAM,kBAAkB,qBAAqB,CAAC;AAErD,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC;IACtB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,mGAAmG;AACnG,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,IAAI,CAKtF;AAED,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,iBAAiB,GAAG,IAAI,CAO9E;AAED,8GAA8G;AAC9G,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,iBAAiB,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAe9F;AAED,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAEtD,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,QAAQ,EAAE,WAAW,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,SAAS,CAAC;IACxB,QAAQ,CAAC,GAAG,EAAE,MAAM,MAAM,CAAC;IAC3B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACrC,yFAAyF;IACzF,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,6FAA6F;IAC7F,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAMD,sFAAsF;AACtF,wBAAsB,kBAAkB,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,WAAW,CAAC,CAyC7E;AAED,0HAA0H;AAC1H,wBAAgB,UAAU,CACxB,GAAG,EAAE,MAAM,EACX,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE;IAAE,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,GAChI,CAAC,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,KAAK,OAAO,CAAC,WAAW,GAAG,QAAQ,CAAC,CAkBlE;AAED,6DAA6D;AAC7D,wBAAgB,oBAAoB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAE9D"}