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,162 @@
1
+ /**
2
+ * WHERE THE RAILS LEDGERS LIVE, AND WHY IT IS NOT IN THE REPOSITORY.
3
+ *
4
+ * Two files decide whether a rail is shut: the exemption spend ledger (has this
5
+ * single-use grant been used?) and the loop-safety history (is this goal held?).
6
+ * Phase 1 moved both from the per-checkout state directory to the PROJECT state
7
+ * directory, which is what stopped N workspaces giving one grant N spends. That
8
+ * was the urgent half.
9
+ *
10
+ * 🔴 THE REMAINING HALF: THE PROJECT STATE DIRECTORY IS INSIDE THE REPOSITORY.
11
+ *
12
+ * For an ordinary checkout `projectStateDir` is `<repo>/.looply/state`. So the
13
+ * record of every single-use grant this machine has already spent sits in a
14
+ * directory that:
15
+ *
16
+ * - `discard()` deliberately preserves (`-e .looply`) but a person's own
17
+ * `git clean -xfd` does not,
18
+ * - a re-clone does not carry, because `.looply/state` is not tracked,
19
+ * - and `rm -rf` on a finished checkout takes with it.
20
+ *
21
+ * Every one of those turns a spent single-use exemption back into an unspent
22
+ * one. Not by an attack — by ordinary housekeeping. A rail whose "already used"
23
+ * record a person can delete without knowing they did is not a rail.
24
+ *
25
+ * ⚠️ THE PRECEDENT IS ALREADY IN THIS CODEBASE. `projectStateDir` itself falls
26
+ * back to `~/.looply/projects/<key>/state` for a repository with no main
27
+ * worktree, with the note that "`~/.looply` is where this codebase already puts
28
+ * state that must survive the repository". That is the argument, and it applies
29
+ * to the rails ledgers of EVERY repository, not only the bare ones.
30
+ *
31
+ * ⚠️ AND IT IS KEYED THE SAME WAY EVERYTHING ELSE IS. `repoIdentityPath` is what
32
+ * `workspacesRoot` hashes and what the registry agrees on: the main worktree
33
+ * root, or the common dir for a bare repository, or the directory itself.
34
+ * Ordinary checkouts and linked worktrees of one repository therefore share one
35
+ * key, which is the entire point.
36
+ */
37
+ export declare function railsDir(cwd: string, home?: string): string;
38
+ /** What a migration reads and writes. Narrow on purpose: no delete of anything old. */
39
+ export interface MigrationFs {
40
+ /** Resolves to null when the file does not exist; THROWS when it exists and cannot be read. */
41
+ readFile(path: string): Promise<string | null>;
42
+ writeFile(path: string, data: string): Promise<void>;
43
+ rename(from: string, to: string): Promise<void>;
44
+ /** Recursive; succeeds when the directory already exists. */
45
+ mkdir(path: string): Promise<void>;
46
+ /** Fails with EEXIST when the path is already there. The whole arbitration. */
47
+ createExclusive(path: string, data: string): Promise<void>;
48
+ /** Entry names, or null when the directory does not exist. */
49
+ readDir(path: string): Promise<string[] | null>;
50
+ /** Removes ONE file. Only ever called on a migration token this process wrote. */
51
+ unlink(path: string): Promise<void>;
52
+ }
53
+ /** One source's content, handed to a merge. `path` is included so a merge can order by origin. */
54
+ export interface MigrationPart {
55
+ readonly path: string;
56
+ readonly text: string;
57
+ }
58
+ export interface MigrationFile {
59
+ /** The file's name inside the machine-level directory. */
60
+ readonly name: string;
61
+ /** Old locations, in any order. Missing ones are skipped; unreadable ones REFUSE. */
62
+ readonly sources: readonly string[];
63
+ /** Combine the target's current content (first, when present) with every source. */
64
+ readonly merge: (parts: readonly MigrationPart[]) => string;
65
+ }
66
+ /**
67
+ * A directory whose entries move across whole, never merged.
68
+ *
69
+ * 🔴 THE OVERRIDE MARKERS, AND THEY ARE NOT OPTIONAL.
70
+ *
71
+ * `foldInSpentRetries` re-derives "has this incident's one retry been spent"
72
+ * from `loop-safety-overrides/<id>.json` on EVERY open. Move the incidents to
73
+ * the machine-level home and leave the markers behind, and a person who already
74
+ * spent their one retry finds the hold active again — the retry was consumed
75
+ * and did nothing. Move the markers and leave the incidents, and the reverse:
76
+ * a marker for an incident nothing can see.
77
+ *
78
+ * ⚠️ ENTRIES ARE NEVER OVERWRITTEN. A marker is an exclusive-create claim whose
79
+ * whole meaning is "this was taken first"; a copy that replaced one would be
80
+ * handing the same retry out twice.
81
+ */
82
+ export interface MigrationDir {
83
+ /** The directory's name inside the machine-level directory. */
84
+ readonly name: string;
85
+ /** Old locations, in any order. Missing ones are skipped. */
86
+ readonly sources: readonly string[];
87
+ }
88
+ export type MigrationResult = {
89
+ readonly ok: true;
90
+ readonly migrated: boolean;
91
+ readonly read: readonly string[];
92
+ } | {
93
+ readonly ok: false;
94
+ readonly because: string;
95
+ };
96
+ /**
97
+ * MOVE A LEDGER FORWARD ONCE, MERGED, UNDER AN EXCLUSIVE CREATE.
98
+ *
99
+ * 🔴 "READ THE OLD PATH WHEN THE NEW ONE IS ABSENT" IS NOT A MIGRATION. IT IS
100
+ * THE BYPASS.
101
+ *
102
+ * That was the first design and it is worth stating why it fails, because it
103
+ * reads as the conservative option. The old file records that grant `g` was
104
+ * spent. The first UNRELATED spend after the move creates the new file. From
105
+ * that moment the new file is present, the fallback stops firing, the old
106
+ * file's record of `g` is invisible — and `g`, a single-use grant over a railed
107
+ * path, is spendable a second time. The relocation would re-open exactly the
108
+ * rail it was done to protect.
109
+ *
110
+ * The loop-safety history has the same shape with a milder consequence: the
111
+ * first new observation hides every prior one, so an active hold loses its
112
+ * basis and the detectors restart from zero.
113
+ *
114
+ * So: ONE-TIME COPY-FORWARD, MERGED, and never a fallback.
115
+ *
116
+ * ⚠️ THE TARGET IS ITS OWN FIRST SOURCE, which is what makes a re-run safe.
117
+ * The marker is written LAST, so a crash between the rename and the marker
118
+ * leaves the migration to be redone — and if a spend was appended in between, a
119
+ * merge that ignored the target would erase it. Reading the target first makes
120
+ * the whole operation idempotent under any number of crashes.
121
+ *
122
+ * ⚠️ AN UNREADABLE SOURCE REFUSES, and the caller fails closed. `ExemptionStore`
123
+ * already answers "spent" for everything when its own file will not parse,
124
+ * because treating a corrupt ledger as "nothing spent" re-opens every door the
125
+ * machine has used. That rule has to survive the move rather than be suspended
126
+ * for it — a migration that silently skipped a file it could not read would be
127
+ * the same bypass with a different spelling.
128
+ *
129
+ * ⚠️ NOTHING OLD IS EVER DELETED. Route B's premise: a directory nobody can
130
+ * prove is stale is not a directory looply removes. The old files are left
131
+ * exactly where they are and never read again.
132
+ */
133
+ export declare function copyForwardOnce(opts: {
134
+ dir: string;
135
+ files: readonly MigrationFile[];
136
+ dirs?: readonly MigrationDir[];
137
+ fs: MigrationFs;
138
+ /** Identifies this process in the token, so a stale token names its owner. */
139
+ who: string;
140
+ /** How long to wait for another process's migration. Default 5s. */
141
+ waitMs?: number;
142
+ now?: () => number;
143
+ sleep?: (ms: number) => Promise<void>;
144
+ /** Judges whether a token's owner is still running. Injected so a test can decide. */
145
+ probe?: (pid: number) => 'alive' | 'dead' | 'unknown';
146
+ }): Promise<MigrationResult>;
147
+ /**
148
+ * Every per-checkout state directory this repository has, oldest homes first.
149
+ *
150
+ * The project's own, plus one per workspace under the workspaces root. A
151
+ * migration must find them all: Phase 1 wrote to per-workspace state directories
152
+ * before it hoisted to the project's, so a machine that ran a Phase-1 build has
153
+ * spends in places nothing looks at any more.
154
+ */
155
+ export declare function legacyStateDirs(opts: {
156
+ projectState: string;
157
+ workspacesRoot: string;
158
+ fs: Pick<MigrationFs, 'readDir'>;
159
+ }): Promise<string[]>;
160
+ /** The node-backed filesystem for a migration. */
161
+ export declare const nodeMigrationFs: MigrationFs;
162
+ //# sourceMappingURL=rails-home.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-home.d.ts","sourceRoot":"","sources":["../src/rails-home.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,452 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ Object.defineProperty(exports, "__esModule", { value: true });
36
+ exports.nodeMigrationFs = void 0;
37
+ exports.railsDir = railsDir;
38
+ exports.copyForwardOnce = copyForwardOnce;
39
+ exports.legacyStateDirs = legacyStateDirs;
40
+ const node_crypto_1 = require("node:crypto");
41
+ const node_os_1 = require("node:os");
42
+ const node_path_1 = require("node:path");
43
+ const trusted_git_1 = require("./trusted-git");
44
+ /**
45
+ * WHERE THE RAILS LEDGERS LIVE, AND WHY IT IS NOT IN THE REPOSITORY.
46
+ *
47
+ * Two files decide whether a rail is shut: the exemption spend ledger (has this
48
+ * single-use grant been used?) and the loop-safety history (is this goal held?).
49
+ * Phase 1 moved both from the per-checkout state directory to the PROJECT state
50
+ * directory, which is what stopped N workspaces giving one grant N spends. That
51
+ * was the urgent half.
52
+ *
53
+ * 🔴 THE REMAINING HALF: THE PROJECT STATE DIRECTORY IS INSIDE THE REPOSITORY.
54
+ *
55
+ * For an ordinary checkout `projectStateDir` is `<repo>/.looply/state`. So the
56
+ * record of every single-use grant this machine has already spent sits in a
57
+ * directory that:
58
+ *
59
+ * - `discard()` deliberately preserves (`-e .looply`) but a person's own
60
+ * `git clean -xfd` does not,
61
+ * - a re-clone does not carry, because `.looply/state` is not tracked,
62
+ * - and `rm -rf` on a finished checkout takes with it.
63
+ *
64
+ * Every one of those turns a spent single-use exemption back into an unspent
65
+ * one. Not by an attack — by ordinary housekeeping. A rail whose "already used"
66
+ * record a person can delete without knowing they did is not a rail.
67
+ *
68
+ * ⚠️ THE PRECEDENT IS ALREADY IN THIS CODEBASE. `projectStateDir` itself falls
69
+ * back to `~/.looply/projects/<key>/state` for a repository with no main
70
+ * worktree, with the note that "`~/.looply` is where this codebase already puts
71
+ * state that must survive the repository". That is the argument, and it applies
72
+ * to the rails ledgers of EVERY repository, not only the bare ones.
73
+ *
74
+ * ⚠️ AND IT IS KEYED THE SAME WAY EVERYTHING ELSE IS. `repoIdentityPath` is what
75
+ * `workspacesRoot` hashes and what the registry agrees on: the main worktree
76
+ * root, or the common dir for a bare repository, or the directory itself.
77
+ * Ordinary checkouts and linked worktrees of one repository therefore share one
78
+ * key, which is the entire point.
79
+ */
80
+ function railsDir(cwd, home = (0, node_os_1.homedir)()) {
81
+ const root = (0, trusted_git_1.repoIdentityPath)(cwd);
82
+ const key = (0, node_crypto_1.createHash)('sha256').update(root.toLowerCase(), 'utf8').digest('hex').slice(0, 16);
83
+ return (0, node_path_1.join)(home, '.looply', 'projects', key, 'rails');
84
+ }
85
+ /**
86
+ * MOVE A LEDGER FORWARD ONCE, MERGED, UNDER AN EXCLUSIVE CREATE.
87
+ *
88
+ * 🔴 "READ THE OLD PATH WHEN THE NEW ONE IS ABSENT" IS NOT A MIGRATION. IT IS
89
+ * THE BYPASS.
90
+ *
91
+ * That was the first design and it is worth stating why it fails, because it
92
+ * reads as the conservative option. The old file records that grant `g` was
93
+ * spent. The first UNRELATED spend after the move creates the new file. From
94
+ * that moment the new file is present, the fallback stops firing, the old
95
+ * file's record of `g` is invisible — and `g`, a single-use grant over a railed
96
+ * path, is spendable a second time. The relocation would re-open exactly the
97
+ * rail it was done to protect.
98
+ *
99
+ * The loop-safety history has the same shape with a milder consequence: the
100
+ * first new observation hides every prior one, so an active hold loses its
101
+ * basis and the detectors restart from zero.
102
+ *
103
+ * So: ONE-TIME COPY-FORWARD, MERGED, and never a fallback.
104
+ *
105
+ * ⚠️ THE TARGET IS ITS OWN FIRST SOURCE, which is what makes a re-run safe.
106
+ * The marker is written LAST, so a crash between the rename and the marker
107
+ * leaves the migration to be redone — and if a spend was appended in between, a
108
+ * merge that ignored the target would erase it. Reading the target first makes
109
+ * the whole operation idempotent under any number of crashes.
110
+ *
111
+ * ⚠️ AN UNREADABLE SOURCE REFUSES, and the caller fails closed. `ExemptionStore`
112
+ * already answers "spent" for everything when its own file will not parse,
113
+ * because treating a corrupt ledger as "nothing spent" re-opens every door the
114
+ * machine has used. That rule has to survive the move rather than be suspended
115
+ * for it — a migration that silently skipped a file it could not read would be
116
+ * the same bypass with a different spelling.
117
+ *
118
+ * ⚠️ NOTHING OLD IS EVER DELETED. Route B's premise: a directory nobody can
119
+ * prove is stale is not a directory looply removes. The old files are left
120
+ * exactly where they are and never read again.
121
+ */
122
+ async function copyForwardOnce(opts) {
123
+ const { dir, files, fs } = opts;
124
+ const now = opts.now ?? (() => Date.now());
125
+ const sleep = opts.sleep ?? ((ms) => new Promise((r) => setTimeout(r, ms)));
126
+ const waitMs = opts.waitMs ?? 5_000;
127
+ /**
128
+ * 🔴 ONE MARKER PER LEDGER, AND A SHARED ONE WAS A TOTAL BYPASS.
129
+ *
130
+ * This was `migrated.json`, and `move()` computes the same `dir` for both the
131
+ * exemption ledger and the safety history. Whichever migrated FIRST wrote the
132
+ * marker; the second then saw `done()` and returned `{ok: true, migrated:
133
+ * false}` having copied nothing at all.
134
+ *
135
+ * MEASURED, and the order is deterministic rather than a race: `runLoop`
136
+ * opens the safety store near its top and the exemption store two thousand
137
+ * lines later, so on every machine it was the EXEMPTION ledger that was
138
+ * skipped. `ExemptionStore.open()` then read an empty directory, reported
139
+ * `ok`, and answered `isSpent` FALSE for every grant the machine had ever
140
+ * spent — a single-use grant over a railed path, spendable again, on every
141
+ * repository on that machine. The precise bypass this file's header says the
142
+ * copy-forward exists to prevent, reintroduced by a filename.
143
+ *
144
+ * ⚠️ AND IT FAILED THE OTHER WAY TOO. A safety migration that REFUSED wrote
145
+ * no marker, correctly — and the exemption migration that ran later in the
146
+ * same command wrote one, marking the refused migration permanently done. A
147
+ * live hold was then discharged for ever, silently, with its incidents left
148
+ * in a file nothing would read again.
149
+ */
150
+ const marker = (0, node_path_1.join)(dir, `migrated.${opts.who}.json`);
151
+ const token = (0, node_path_1.join)(dir, `.migrating.${opts.who}`);
152
+ const done = async () => (await fs.readFile(marker)) !== null;
153
+ if (await done())
154
+ return { ok: true, migrated: false, read: [] };
155
+ await fs.mkdir(dir);
156
+ const mine = JSON.stringify({ pid: process.pid, at: new Date(now()).toISOString(), who: opts.who });
157
+ try {
158
+ await fs.createExclusive(token, `${mine}\n`);
159
+ }
160
+ catch (e) {
161
+ if (e.code !== 'EEXIST')
162
+ throw e;
163
+ /**
164
+ * 🔴 THE LOSER WAITS AND RE-READS. It does NOT migrate in parallel.
165
+ *
166
+ * Two processes merging the same sources into the same target is not merely
167
+ * wasteful: the second rename lands on a file the first may have appended
168
+ * to since, so a spend written between the two is lost. Waiting costs a
169
+ * second on one machine, once, ever.
170
+ */
171
+ const until = now() + waitMs;
172
+ while (now() < until) {
173
+ await sleep(50);
174
+ if (await done())
175
+ return { ok: true, migrated: false, read: [] };
176
+ }
177
+ /**
178
+ * 🔴 A TOKEN WHOSE OWNER IS GONE IS BROKEN, NOT OBEYED — AND WITHOUT THIS
179
+ * EVERY RUN ON THIS MACHINE WAS BRICKED FOR EVER BY ONE Ctrl-C.
180
+ *
181
+ * MEASURED: with a token left behind and no marker, three consecutive opens
182
+ * each stalled the full 5s and each answered `unreadable`. Nothing aged the
183
+ * token out, nothing probed the pid it names, and no `looply` command could
184
+ * clear it — so `looply daemon` said "autonomy will hold" for ever, every
185
+ * hand-typed run paid ten seconds of dead wall clock and then skipped the
186
+ * hold fence entirely, and no granted exemption could be used again. The
187
+ * remedy was deleting a dot-file under `~/.looply` that nothing tells a
188
+ * person about, and the refusal it printed — "try again in a moment" — was
189
+ * false in a way that guaranteed nobody would look.
190
+ *
191
+ * ⚠️ SAME DISCIPLINE PHASE 1 SETTLED ON FOR ITS OWN TOKENS: probe the pid,
192
+ * and break the token only by CONTENT MATCH. Re-reading before removing is
193
+ * what stops this deleting a token a live process took in the moment we
194
+ * were deciding — the failure Phase 1 measured when it removed one by path.
195
+ */
196
+ /**
197
+ * ⚠️ GUARDED, LIKE ITS SIBLING FOUR LINES BELOW. An unreadable token used to
198
+ * throw straight out of `open()` — which both stores document as something
199
+ * that cannot happen.
200
+ */
201
+ const holder = await fs.readFile(token).catch(() => null);
202
+ const owner = ownerOf(holder);
203
+ /**
204
+ * 🔴 A TOKEN THAT NAMES NOBODY IS BREAKABLE, AND THE FIRST VERSION OF THIS
205
+ * REPAIR ONLY BROKE ONES THAT PARSED.
206
+ *
207
+ * MEASURED: a ZERO-BYTE token — exactly what a Ctrl-C or a power cut leaves
208
+ * between `open(path,'wx')` and the write, which is the very interrupt this
209
+ * was written for — made `ownerOf` answer null, `liveness` answer
210
+ * `'unknown'`, and the token be obeyed for ever. Three consecutive opens,
211
+ * five seconds of dead wall clock each, `unreadable` each, token intact
212
+ * each. Every test the repair added planted a well-formed token; none
213
+ * planted a malformed one.
214
+ *
215
+ * ⚠️ AND BREAKING IT IS SAFE PRECISELY BECAUSE IT NAMES NOBODY. A token
216
+ * whose owner cannot be identified protects nobody: no process can be
217
+ * pointed at, so no process can be harmed. What is NOT broken is a token
218
+ * naming a pid this cannot judge — that one may well be alive.
219
+ */
220
+ const liveness = owner === null ? (holder === null ? 'dead' : 'ownerless') : (opts.probe ?? nodeMigrationProbe)(owner);
221
+ if (liveness === 'dead' || liveness === 'ownerless') {
222
+ const still = await fs.readFile(token).catch(() => null);
223
+ if (still === holder) {
224
+ await fs.unlink(token).catch(() => undefined);
225
+ return {
226
+ ok: false,
227
+ because: `the last attempt to move this ledger was interrupted (${owner === null ? 'its claim named no process' : `pid ${owner} is gone`}). ` +
228
+ 'Its claim has been cleared — run the same command again and it will finish.',
229
+ };
230
+ }
231
+ }
232
+ return {
233
+ ok: false,
234
+ because: 'another process is moving this ledger to its machine-level home and has not finished. ' +
235
+ `Nothing is lost; try again in a moment. If this persists, delete ${token}.`,
236
+ };
237
+ }
238
+ try {
239
+ const read = [];
240
+ const outputs = [];
241
+ for (const file of files) {
242
+ const target = (0, node_path_1.join)(dir, file.name);
243
+ const parts = [];
244
+ // The target FIRST, so a re-run after a crash keeps anything appended since.
245
+ const current = await fs.readFile(target).catch((e) => {
246
+ throw e;
247
+ });
248
+ if (current !== null)
249
+ parts.push({ path: target, text: current });
250
+ for (const source of file.sources) {
251
+ let text;
252
+ try {
253
+ text = await fs.readFile(source);
254
+ }
255
+ catch (e) {
256
+ return {
257
+ ok: false,
258
+ because: `${source} exists and could not be read (${e.message}), so this machine ` +
259
+ 'cannot prove what it has already spent. Refusing to migrate rather than ' +
260
+ 'moving forward without it.',
261
+ };
262
+ }
263
+ if (text === null)
264
+ continue;
265
+ read.push(source);
266
+ parts.push({ path: source, text });
267
+ }
268
+ /**
269
+ * ⚠️ A MERGE MAY REFUSE, AND A REFUSAL IS NOT AN ERROR TO SWALLOW.
270
+ *
271
+ * "Exists and cannot be read" covers an I/O failure. It does not cover a
272
+ * file that reads perfectly and does not PARSE — and that is the shape
273
+ * `ExemptionStore` already fails closed on, because a corrupt ledger
274
+ * treated as "nothing spent" re-opens every door the machine has used. A
275
+ * merge that quietly skipped an unparseable source would be that bypass
276
+ * with a different spelling, so a merge throws and this refuses.
277
+ */
278
+ try {
279
+ outputs.push({ name: file.name, text: file.merge(parts) });
280
+ }
281
+ catch (e) {
282
+ return {
283
+ ok: false,
284
+ because: `${file.name} could not be built from what is already on disk ` +
285
+ `(${e.message}). Refusing to migrate rather than moving forward without it.`,
286
+ };
287
+ }
288
+ }
289
+ for (const out of outputs) {
290
+ const staging = (0, node_path_1.join)(dir, `${out.name}.migrating`);
291
+ await fs.writeFile(staging, out.text);
292
+ await fs.rename(staging, (0, node_path_1.join)(dir, out.name));
293
+ }
294
+ /**
295
+ * ⚠️ DIRECTORIES AFTER FILES, AND EACH ENTRY BY EXCLUSIVE CREATE.
296
+ *
297
+ * These carry claims — "this retry was taken" — so an entry already at the
298
+ * target is the truth and a copy must lose to it, not replace it. EEXIST is
299
+ * therefore the ordinary outcome on a re-run, not an error.
300
+ */
301
+ for (const d of opts.dirs ?? []) {
302
+ const target = (0, node_path_1.join)(dir, d.name);
303
+ let made = false;
304
+ for (const source of d.sources) {
305
+ const names = await fs.readDir(source);
306
+ if (names === null)
307
+ continue;
308
+ for (const name of names) {
309
+ let text;
310
+ try {
311
+ text = await fs.readFile((0, node_path_1.join)(source, name));
312
+ }
313
+ catch (e) {
314
+ return {
315
+ ok: false,
316
+ because: `${(0, node_path_1.join)(source, name)} exists and could not be read (${e.message}), so this ` +
317
+ 'machine cannot prove which retries have already been spent. Refusing to migrate.',
318
+ };
319
+ }
320
+ if (text === null)
321
+ continue;
322
+ if (!made) {
323
+ await fs.mkdir(target);
324
+ made = true;
325
+ }
326
+ read.push((0, node_path_1.join)(source, name));
327
+ try {
328
+ await fs.createExclusive((0, node_path_1.join)(target, name), text);
329
+ }
330
+ catch (e) {
331
+ if (e.code !== 'EEXIST')
332
+ throw e;
333
+ }
334
+ }
335
+ }
336
+ }
337
+ // LAST. Before this line the migration is repeatable; after it, it is done.
338
+ await fs.writeFile(marker, `${JSON.stringify({ at: new Date(now()).toISOString(), read, files: files.map((f) => f.name) }, null, 2)}\n`);
339
+ return { ok: true, migrated: true, read };
340
+ }
341
+ finally {
342
+ /**
343
+ * ⚠️ ONLY IF IT IS STILL OURS. Phase 1 measured what happens when a token is
344
+ * removed by path rather than by identity: a process that had already lost
345
+ * its claim deleted the winner's, and four processes then held one lock.
346
+ */
347
+ try {
348
+ const held = await fs.readFile(token);
349
+ if (held !== null && held.trim() === mine)
350
+ await fs.unlink(token);
351
+ }
352
+ catch {
353
+ /* someone else's, or already gone */
354
+ }
355
+ }
356
+ }
357
+ /**
358
+ * Every per-checkout state directory this repository has, oldest homes first.
359
+ *
360
+ * The project's own, plus one per workspace under the workspaces root. A
361
+ * migration must find them all: Phase 1 wrote to per-workspace state directories
362
+ * before it hoisted to the project's, so a machine that ran a Phase-1 build has
363
+ * spends in places nothing looks at any more.
364
+ */
365
+ async function legacyStateDirs(opts) {
366
+ const out = [opts.projectState];
367
+ for (const name of (await opts.fs.readDir(opts.workspacesRoot)) ?? []) {
368
+ const dir = (0, node_path_1.join)(opts.workspacesRoot, name, '.looply', 'state');
369
+ if (dir !== opts.projectState)
370
+ out.push(dir);
371
+ }
372
+ return out;
373
+ }
374
+ /** The pid a migration token names, or null when it names none this can read. */
375
+ function ownerOf(token) {
376
+ if (token === null)
377
+ return null;
378
+ try {
379
+ const pid = JSON.parse(token).pid;
380
+ return typeof pid === 'number' && Number.isInteger(pid) && pid > 0 ? pid : null;
381
+ }
382
+ catch {
383
+ return null;
384
+ }
385
+ }
386
+ /**
387
+ * Is that process still running?
388
+ *
389
+ * ⚠️ THREE-VALUED, AND `unknown` IS NOT `dead`. `kill(pid, 0)` answers ESRCH for
390
+ * a pid nobody owns and EPERM for one this user may not signal — and EPERM means
391
+ * the process EXISTS. Reading it as dead would break a live token.
392
+ */
393
+ function nodeMigrationProbe(pid) {
394
+ try {
395
+ process.kill(pid, 0);
396
+ return 'alive';
397
+ }
398
+ catch (e) {
399
+ const code = e.code;
400
+ if (code === 'ESRCH')
401
+ return 'dead';
402
+ if (code === 'EPERM')
403
+ return 'alive';
404
+ return 'unknown';
405
+ }
406
+ }
407
+ /** The node-backed filesystem for a migration. */
408
+ exports.nodeMigrationFs = {
409
+ readFile: async (path) => {
410
+ const { readFile } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
411
+ try {
412
+ return await readFile(path, 'utf8');
413
+ }
414
+ catch (e) {
415
+ if (e.code === 'ENOENT')
416
+ return null;
417
+ throw e;
418
+ }
419
+ },
420
+ writeFile: async (path, data) => {
421
+ const { writeFile } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
422
+ await writeFile(path, data, 'utf8');
423
+ },
424
+ rename: async (from, to) => {
425
+ const { rename } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
426
+ await rename(from, to);
427
+ },
428
+ mkdir: async (path) => {
429
+ const { mkdir } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
430
+ await mkdir(path, { recursive: true });
431
+ },
432
+ createExclusive: async (path, data) => {
433
+ const { writeFile } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
434
+ await writeFile(path, data, { encoding: 'utf8', flag: 'wx' });
435
+ },
436
+ readDir: async (path) => {
437
+ const { readdir } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
438
+ try {
439
+ return await readdir(path);
440
+ }
441
+ catch (e) {
442
+ if (e.code === 'ENOENT')
443
+ return null;
444
+ throw e;
445
+ }
446
+ },
447
+ unlink: async (path) => {
448
+ const { unlink } = await Promise.resolve().then(() => __importStar(require('node:fs/promises')));
449
+ await unlink(path);
450
+ },
451
+ };
452
+ //# sourceMappingURL=rails-home.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rails-home.js","sourceRoot":"","sources":["../src/rails-home.ts"],"names":[],"mappings":"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"}