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,91 @@
1
+ import type { AbortResult, CommandRunner } from './gate';
2
+ import type { LooplyConfig } from './config';
3
+ import type { ContainmentProbe } from './untrusted-exec';
4
+ /**
5
+ * `looply doctor` — the interlocks and one full gate pass with **no agent call**
6
+ * (DESIGN §5.2), so a wrong `tsc` command is found in ninety seconds rather than
7
+ * at round 1 of an overnight run.
8
+ *
9
+ * This is deliberately not `runGate`. The gate skips `when:`-filtered steps
10
+ * against the diff and stops at the first red because later steps are
11
+ * uninformative about *this round*. Doctor answers a different question — does
12
+ * every configured command exist and run? — so every step runs (there is no
13
+ * diff to filter on) and a failure does not stop the pass: one doctor run
14
+ * should name every broken command, not the first one per invocation.
15
+ */
16
+ export interface DoctorStepReport {
17
+ step: string;
18
+ run: string;
19
+ ok: boolean;
20
+ ms: number;
21
+ timedOut?: boolean;
22
+ /**
23
+ * The step NEVER RAN — the environment could not start it (`CommandResult.unavailable`).
24
+ * Not a verdict about the code, and a reader that needs one must not take `ok: false` for one.
25
+ */
26
+ unavailable?: boolean;
27
+ /** Command output, kept only on failure — that is when someone reads it. */
28
+ output?: string;
29
+ }
30
+ export interface DoctorReport {
31
+ /** Non-null when an interlock tripped; no step has run in that case. */
32
+ abort: AbortResult | null;
33
+ steps: DoctorStepReport[];
34
+ ok: boolean;
35
+ /**
36
+ * Whether this machine can contain untrusted execution at all, or null when
37
+ * nothing asked.
38
+ *
39
+ * 🔴 REPORTED, NOT ENFORCED — and it is reported because it was previously
40
+ * knowable and unknown. `AppContainerBackend.probe()` existed, was correct,
41
+ * and had NO CALLER anywhere: the one function that answers "is there a
42
+ * boundary on this machine" was never asked. A person on a platform with no
43
+ * AppContainer learned it from a gate step failing mid-run, if at all.
44
+ *
45
+ * It does not gate the doctor pass. A machine without containment cannot run
46
+ * a gate step at all — `run()` refuses rather than degrading — so the step
47
+ * failures below already say so loudly. What this adds is the REASON, before
48
+ * the failures, in one line.
49
+ */
50
+ containment: ContainmentProbe | null;
51
+ }
52
+ export interface DoctorDeps {
53
+ runner: CommandRunner;
54
+ /**
55
+ * Ask whether untrusted execution can be contained here.
56
+ *
57
+ * Optional so every existing caller and fixture keeps working, and absent
58
+ * means "nobody asked" rather than "no boundary" — two different facts, and
59
+ * only one of them is a finding.
60
+ */
61
+ probeContainment?: () => Promise<ContainmentProbe>;
62
+ /** Contents of an env file, or null when it does not exist (not an error). */
63
+ readEnvFile(path: string): string | null;
64
+ /** The live environment; values are matched against `rails.prod_patterns`. */
65
+ env: Readonly<Record<string, string | undefined>>;
66
+ }
67
+ export declare function runDoctorGate(cfg: LooplyConfig, deps: DoctorDeps): Promise<DoctorReport>;
68
+ /**
69
+ * THE INTEGRATION REF, ASKED BEFORE A START IS SPENT FINDING OUT (M6-12).
70
+ *
71
+ * With `run.integration` on — by hand, or by the umbrella, which turns it on
72
+ * for every project under `machine.programme: { on: true }` — a run checks
73
+ * after each round that its base is still current against
74
+ * `looply/integration`. When that ref does not exist the check cannot answer
75
+ * and the run halts `aborted` after its first round (run-cmd's `baseStale`;
76
+ * `baseFreshness` → `uninitialised`). Correct — and found live in M6-11 by a
77
+ * placed run that spent its round to learn it, with doctor having said "all
78
+ * gate steps pass" moments before. Doctor now says it first.
79
+ *
80
+ * A WARNING, NOT A GATE FAILURE: creating the ref is the owner's act
81
+ * (`looply integrate --init <ref>`), and a project that has not chosen its
82
+ * base yet is not broken — its runs simply cannot converge until it does.
83
+ * `null` when integration is off, when nobody supplied a git to ask (the
84
+ * lane's candidate check has no business asking), or when the ref exists.
85
+ * A git that cannot answer is said out loud rather than read as "exists".
86
+ */
87
+ export interface IntegrationRefGit {
88
+ refExists(ref: string): Promise<boolean>;
89
+ }
90
+ export declare function integrationRefWarning(cfg: LooplyConfig, git: IntegrationRefGit | undefined): Promise<string | null>;
91
+ //# sourceMappingURL=doctor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.d.ts","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAEzD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAC7C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGzD;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,EAAE,EAAE,OAAO,CAAC;IACZ,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,4EAA4E;IAC5E,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,WAAW,YAAY;IAC3B,wEAAwE;IACxE,KAAK,EAAE,WAAW,GAAG,IAAI,CAAC;IAC1B,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC1B,EAAE,EAAE,OAAO,CAAC;IACZ;;;;;;;;;;;;;;OAcG;IACH,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;CACtC;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,aAAa,CAAC;IACtB;;;;;;OAMG;IACH,gBAAgB,CAAC,EAAE,MAAM,OAAO,CAAC,gBAAgB,CAAC,CAAC;IACnD,8EAA8E;IAC9E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IACzC,8EAA8E;IAC9E,GAAG,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC,CAAC;CACnD;AAED,wBAAsB,aAAa,CAAC,GAAG,EAAE,YAAY,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,YAAY,CAAC,CA6C9F;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC;CAC1C;AAED,wBAAsB,qBAAqB,CACzC,GAAG,EAAE,YAAY,EACjB,GAAG,EAAE,iBAAiB,GAAG,SAAS,GACjC,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAiBxB"}
package/dist/doctor.js ADDED
@@ -0,0 +1,71 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.runDoctorGate = runDoctorGate;
4
+ exports.integrationRefWarning = integrationRefWarning;
5
+ const gate_1 = require("./gate");
6
+ const integration_1 = require("./integration");
7
+ async function runDoctorGate(cfg, deps) {
8
+ const envValues = [];
9
+ for (const file of cfg.rails.prodEnvFiles) {
10
+ const text = deps.readEnvFile(file);
11
+ if (text !== null)
12
+ envValues.push(text);
13
+ }
14
+ for (const value of Object.values(deps.env)) {
15
+ if (value)
16
+ envValues.push(value);
17
+ }
18
+ // Same interlock the run uses, with an empty diff: doctor proves the prod
19
+ // check itself, and a reachable production database must stop everything
20
+ // before a single command runs — exactly as it would mid-run.
21
+ /**
22
+ * Asked BEFORE the interlocks, so the answer survives an abort. A machine
23
+ * with no boundary is worth saying so on the way out, not only on the happy
24
+ * path — and a probe that failed would otherwise be reported as nothing.
25
+ */
26
+ const containment = deps.probeContainment
27
+ ? await deps.probeContainment().catch((e) => ({
28
+ available: false,
29
+ backend: 'unknown',
30
+ because: `the probe itself failed: ${e?.message ?? String(e)}`,
31
+ }))
32
+ : null;
33
+ const abort = (0, gate_1.checkInterlocks)({ changedPaths: [], rails: cfg.rails, envValues });
34
+ if (abort)
35
+ return { abort, steps: [], ok: false, containment };
36
+ const steps = [];
37
+ for (const step of cfg.gates) {
38
+ // The step's own timeout, identical to the gate's: a doctor pass that used
39
+ // a different budget would prove a run the real gate never executes.
40
+ const timeoutMs = (step.timeoutS ?? gate_1.DEFAULT_TIMEOUT_S) * 1000;
41
+ const r = await deps.runner(step.run, timeoutMs);
42
+ const report = { step: step.name, run: step.run, ok: r.ok, ms: r.ms };
43
+ if (r.timedOut)
44
+ report.timedOut = true;
45
+ if (r.unavailable === true)
46
+ report.unavailable = true;
47
+ if (!r.ok && r.output)
48
+ report.output = r.output;
49
+ steps.push(report);
50
+ }
51
+ return { abort: null, steps, ok: steps.every((s) => s.ok), containment };
52
+ }
53
+ async function integrationRefWarning(cfg, git) {
54
+ if (cfg.run.integration !== true)
55
+ return null;
56
+ if (git === undefined)
57
+ return null;
58
+ let exists;
59
+ try {
60
+ exists = await git.refExists(integration_1.INTEGRATION_BRANCH);
61
+ }
62
+ catch (e) {
63
+ return (`could not tell whether ${integration_1.INTEGRATION_BRANCH} exists (${e?.message ?? String(e)}) — ` +
64
+ 'with run.integration on, a run that cannot tell will end aborted after its first round');
65
+ }
66
+ if (exists)
67
+ return null;
68
+ return (`run.integration is on and ${integration_1.INTEGRATION_BRANCH} does not exist — every run will end aborted after its ` +
69
+ 'first round until it is created (looply integrate --init <ref>)');
70
+ }
71
+ //# sourceMappingURL=doctor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"doctor.js","sourceRoot":"","sources":["../src/doctor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,105 @@
1
+ import { buildActionRequest, type ActionRequest, type DependsVerdict, type ProposedDependency, type TrustedActionContext } from '@looply/core';
2
+ /**
3
+ * TURNING A JUDGED EDGE INTO A QUESTION FOR A PERSON.
4
+ *
5
+ * ─────────────────────────────────────────────────────────────────────────────
6
+ * 🔴 THE ONLY VERDICT THAT MAY BE FILED IS `accepted`, AND THAT IS THE FENCE'S
7
+ * ENTIRE PURPOSE.
8
+ *
9
+ * A stale edge, a refused one, or one nothing could be established about must
10
+ * never reach somebody's phone. The fence exists so a person is asked about
11
+ * edges that passed every check a machine can make — asking about the others
12
+ * would spend the one resource this system cannot replace, which is somebody's
13
+ * willingness to read the next question carefully.
14
+ *
15
+ * ─────────────────────────────────────────────────────────────────────────────
16
+ * 🔴 THE IDEMPOTENCY KEY IS THE FINGERPRINT, NOT A COUNTER OR A CLOCK.
17
+ *
18
+ * The same edge, at the same goal versions, read from the same source, is the
19
+ * same request — and must become at most one approval however many cadences
20
+ * propose it. A key derived from time would file a new question every tick for
21
+ * as long as the brain kept suggesting it, which is how an approval queue
22
+ * becomes something a person scrolls past.
23
+ *
24
+ * ─────────────────────────────────────────────────────────────────────────────
25
+ * ⚠️ HOW MANY OF THESE CAN ARRIVE IS BOUNDED UPSTREAM, AND IT IS WORTH SAYING
26
+ * WHERE. `MAX_ASKS_PER_TICK` is 1: one NEW question to the brain per cadence,
27
+ * so at most one new edge proposal per cadence can exist to file. Nothing here
28
+ * needs its own throttle, and if that constant ever moves, this is the sentence
29
+ * that should be read again.
30
+ *
31
+ * ─────────────────────────────────────────────────────────────────────────────
32
+ * 🔴 FILING IS NOT APPROVING. Nothing in this module decides anything. It
33
+ * builds a request, hands it to the approvals surface, and stops.
34
+ */
35
+ /** What this needs from the server, and nothing wider. */
36
+ export interface EdgeApprovalCapability {
37
+ createApproval(projectId: string, input: {
38
+ clientRef: string;
39
+ actionRequest: unknown;
40
+ context?: {
41
+ goalId: string;
42
+ goalVersion: number;
43
+ };
44
+ validForMs?: number;
45
+ }): Promise<{
46
+ deduplicated: boolean;
47
+ }>;
48
+ }
49
+ export type FiledEdge =
50
+ /** A question is on record for a person. */
51
+ {
52
+ readonly kind: 'filed';
53
+ readonly clientRef: string;
54
+ readonly display: string;
55
+ readonly deduplicated: boolean;
56
+ }
57
+ /** It was not `accepted`, so it is not something to ask anybody about. */
58
+ | {
59
+ readonly kind: 'not-asked';
60
+ readonly because: string;
61
+ }
62
+ /**
63
+ * 🔴 THE REQUEST COULD NOT EVEN BE BUILT. Distinct from `not-asked`: that one
64
+ * is a judgement about the edge, and this is a shape the action registry
65
+ * refuses. A caller that reported them alike would tell somebody their
66
+ * proposal was stale when the truth is that it was malformed.
67
+ */
68
+ | {
69
+ readonly kind: 'unbuildable';
70
+ readonly because: string;
71
+ }
72
+ /** The surface could not be reached. Nothing was established, and nothing filed. */
73
+ | {
74
+ readonly kind: 'unreachable';
75
+ readonly because: string;
76
+ };
77
+ /**
78
+ * The action an accepted edge becomes.
79
+ *
80
+ * ⚠️ `requestedBy` IS THE CALLER'S, AND A MACHINE IS RECORDED AS A MACHINE.
81
+ * This is the two-key rule's first key: a machine raises the request and a
82
+ * person turns the second. Passing a person's actor here would be a machine
83
+ * signing somebody else's name on the thing they are about to be asked to
84
+ * approve.
85
+ */
86
+ export declare function edgeActionFor(edge: ProposedDependency, ctx: TrustedActionContext): ReturnType<typeof buildActionRequest>;
87
+ /**
88
+ * ⚠️ DERIVED FROM THE FINGERPRINT, WHICH ALREADY CONTAINS EVERY FIELD THAT
89
+ * MATTERS — both goals, both versions, the source and its hash. Re-deriving a
90
+ * key from those fields by hand would be a second definition of "the same
91
+ * request" that could drift from the first.
92
+ */
93
+ export declare function edgeClientRef(request: ActionRequest): string;
94
+ /**
95
+ * File one judged edge, if it is one anybody should be asked about.
96
+ */
97
+ export declare function fileEdge(edge: ProposedDependency, verdict: DependsVerdict, ctx: TrustedActionContext, approvals: EdgeApprovalCapability): Promise<FiledEdge>;
98
+ /**
99
+ * One line for a person.
100
+ *
101
+ * 🔴 A FILED EDGE SAYS IT IS WAITING, NOT THAT IT HAPPENED. The word "approval"
102
+ * on its own reads to a tired person as a thing that was approved.
103
+ */
104
+ export declare function describeFiled(filed: FiledEdge): string;
105
+ //# sourceMappingURL=edge-approval.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-approval.d.ts","sourceRoot":"","sources":["../src/edge-approval.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,EAElB,KAAK,aAAa,EAClB,KAAK,cAAc,EACnB,KAAK,kBAAkB,EACvB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AAEtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAgCG;AAEH,0DAA0D;AAC1D,MAAM,WAAW,sBAAsB;IACrC,cAAc,CACZ,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE;QACL,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,EAAE,OAAO,CAAC;QACvB,OAAO,CAAC,EAAE;YAAE,MAAM,EAAE,MAAM,CAAC;YAAC,WAAW,EAAE,MAAM,CAAA;SAAE,CAAC;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,GACA,OAAO,CAAC;QAAE,YAAY,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC;CACvC;AAED,MAAM,MAAM,SAAS;AACnB,4CAA4C;AAC1C;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAA;CAAE;AAClH,0EAA0E;GACxE;IAAE,QAAQ,CAAC,IAAI,EAAE,WAAW,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC1D;;;;;GAKG;GACD;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC5D,oFAAoF;GAClF;IAAE,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE/D;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,kBAAkB,EAAE,GAAG,EAAE,oBAAoB,GAAG,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAmBxH;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,OAAO,EAAE,aAAa,GAAG,MAAM,CAE5D;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAC5B,IAAI,EAAE,kBAAkB,EACxB,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE,oBAAoB,EACzB,SAAS,EAAE,sBAAsB,GAChC,OAAO,CAAC,SAAS,CAAC,CAmCpB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,SAAS,GAAG,MAAM,CAatD"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.edgeActionFor = edgeActionFor;
4
+ exports.edgeClientRef = edgeClientRef;
5
+ exports.fileEdge = fileEdge;
6
+ exports.describeFiled = describeFiled;
7
+ const core_1 = require("@looply/core");
8
+ /**
9
+ * The action an accepted edge becomes.
10
+ *
11
+ * ⚠️ `requestedBy` IS THE CALLER'S, AND A MACHINE IS RECORDED AS A MACHINE.
12
+ * This is the two-key rule's first key: a machine raises the request and a
13
+ * person turns the second. Passing a person's actor here would be a machine
14
+ * signing somebody else's name on the thing they are about to be asked to
15
+ * approve.
16
+ */
17
+ function edgeActionFor(edge, ctx) {
18
+ return (0, core_1.buildActionRequest)('goal.depends', {
19
+ goalId: edge.goalId,
20
+ dependsOnId: edge.dependsOnId,
21
+ goalVersion: edge.readAt.goalVersion,
22
+ dependsOnVersion: edge.readAt.dependsOnVersion,
23
+ sourceId: edge.readAt.sourceId,
24
+ sourceSha: edge.readAt.sourceSha,
25
+ }, ctx,
26
+ /**
27
+ * ⚠️ THE MODEL'S SENTENCE TRAVELS AS A NOTE, WHICH CARRIES NO WEIGHT. It is
28
+ * outside the fingerprint by the action registry's design: approving means
29
+ * approving the action, not the wording of its excuse.
30
+ */
31
+ edge.because);
32
+ }
33
+ /**
34
+ * ⚠️ DERIVED FROM THE FINGERPRINT, WHICH ALREADY CONTAINS EVERY FIELD THAT
35
+ * MATTERS — both goals, both versions, the source and its hash. Re-deriving a
36
+ * key from those fields by hand would be a second definition of "the same
37
+ * request" that could drift from the first.
38
+ */
39
+ function edgeClientRef(request) {
40
+ return `edge-${request.fingerprint.slice(0, 32)}`;
41
+ }
42
+ /**
43
+ * File one judged edge, if it is one anybody should be asked about.
44
+ */
45
+ async function fileEdge(edge, verdict, ctx, approvals) {
46
+ if (verdict.kind !== 'accepted') {
47
+ return {
48
+ kind: 'not-asked',
49
+ because: verdict.kind === 'unmeasurable'
50
+ ? `nothing was established about it (${verdict.because})`
51
+ : `it is ${verdict.kind}: ${verdict.because}`,
52
+ };
53
+ }
54
+ const built = edgeActionFor(edge, ctx);
55
+ if (!built.ok)
56
+ return { kind: 'unbuildable', because: `${built.code}: ${built.because}` };
57
+ const clientRef = edgeClientRef(built.request);
58
+ try {
59
+ /**
60
+ * 🔴 FILED UNDER THE GOAL THAT WILL WAIT, OR NOTHING CAN EVER CARRY IT OUT.
61
+ * Runs find their approvals by goal@version; an edge filed with no pursuit
62
+ * was approved and then claimed by nobody, for ever. The pursuit is the
63
+ * action's own goal@version — the server accepts it without a run for
64
+ * `goal.depends` only, and only when it is exactly that (F12). It also
65
+ * HOLDS that goal while the question is open: a pursuit with a pending
66
+ * approval is waiting on a person, so it does not start work that the
67
+ * edge might be about to make premature.
68
+ */
69
+ const r = await approvals.createApproval(ctx.projectId, {
70
+ clientRef,
71
+ actionRequest: built.request,
72
+ context: { goalId: edge.goalId, goalVersion: edge.readAt.goalVersion },
73
+ });
74
+ return { kind: 'filed', clientRef, display: (0, core_1.displayAction)(built.request), deduplicated: r.deduplicated };
75
+ }
76
+ catch (e) {
77
+ return { kind: 'unreachable', because: `the approvals surface could not be reached (${e.message})` };
78
+ }
79
+ }
80
+ /**
81
+ * One line for a person.
82
+ *
83
+ * 🔴 A FILED EDGE SAYS IT IS WAITING, NOT THAT IT HAPPENED. The word "approval"
84
+ * on its own reads to a tired person as a thing that was approved.
85
+ */
86
+ function describeFiled(filed) {
87
+ switch (filed.kind) {
88
+ case 'filed':
89
+ return filed.deduplicated
90
+ ? `already waiting for a decision: ${filed.display}`
91
+ : `waiting for your decision: ${filed.display}`;
92
+ case 'not-asked':
93
+ return `not put to anybody: ${filed.because}`;
94
+ case 'unbuildable':
95
+ return `could not be made into a request: ${filed.because}`;
96
+ case 'unreachable':
97
+ return `${filed.because}. Nothing was filed, and nothing was decided.`;
98
+ }
99
+ }
100
+ //# sourceMappingURL=edge-approval.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"edge-approval.js","sourceRoot":"","sources":["../src/edge-approval.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ import type { Evidence } from '@looply/core';
2
+ import type { LedgerFs } from './ledger-store';
3
+ export type EvidenceLookup =
4
+ /** Recorded at exactly this HEAD — safe to put in the implementation prompt. */
5
+ {
6
+ kind: 'hit';
7
+ evidence: Evidence[];
8
+ }
9
+ /** Recorded at another HEAD; the caller owns the reuse-or-reverify decision. */
10
+ | {
11
+ kind: 'moved';
12
+ cachedHead: string;
13
+ evidence: Evidence[];
14
+ } | {
15
+ kind: 'miss';
16
+ };
17
+ export declare class EvidenceCache {
18
+ private readonly stateDir;
19
+ private readonly fs;
20
+ /** Distinguishes two writes from ONE process; the pid distinguishes processes. */
21
+ private static writes;
22
+ private entries;
23
+ private opened;
24
+ constructor(stateDir: string, fs: LedgerFs);
25
+ private get cachePath();
26
+ /**
27
+ * Load whatever is on disk. Missing file → empty cache (first run); corrupt
28
+ * file → loud failure, same rationale as the queue store: the file only ever
29
+ * lands whole, so corrupt means something else touched it, and starting empty
30
+ * would throw away a night of verification the next persist makes permanent.
31
+ */
32
+ open(): Promise<void>;
33
+ /**
34
+ * Record a confirmed item's evidence at the HEAD it was verified against.
35
+ * One entry per item: a re-verify at a new HEAD replaces the old claim —
36
+ * keeping both would let a later lookup "hit" on a tree that no longer exists.
37
+ */
38
+ put(itemId: string, head: string, evidence: readonly Evidence[]): Promise<void>;
39
+ lookup(itemId: string, head: string): EvidenceLookup;
40
+ /** Drop an item's entry. §12 case 19: a discard always invalidates — the round may have mangled the very paths the evidence points at. */
41
+ invalidate(itemId: string): Promise<void>;
42
+ private assertOpened;
43
+ private persist;
44
+ }
45
+ //# sourceMappingURL=evidence-cache.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-cache.d.ts","sourceRoot":"","sources":["../src/evidence-cache.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AA6B/C,MAAM,MAAM,cAAc;AACxB,gFAAgF;AAC9E;IAAE,IAAI,EAAE,KAAK,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE;AACvC,gFAAgF;GAC9E;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,QAAQ,EAAE,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAErB,qBAAa,aAAa;IAQtB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE;IARrB,kFAAkF;IAClF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAK;IAE1B,OAAO,CAAC,OAAO,CAAiC;IAChD,OAAO,CAAC,MAAM,CAAS;gBAGJ,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,QAAQ;IAG/B,OAAO,KAAK,SAAS,GAEpB;IAED;;;;;OAKG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAU3B;;;;OAIG;IACG,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,QAAQ,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAWrF,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,cAAc;IASpD,0IAA0I;IACpI,UAAU,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAO/C,OAAO,CAAC,YAAY;YAMN,OAAO;CAWtB"}
@@ -0,0 +1,90 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EvidenceCache = void 0;
4
+ class EvidenceCache {
5
+ stateDir;
6
+ fs;
7
+ /** Distinguishes two writes from ONE process; the pid distinguishes processes. */
8
+ static writes = 0;
9
+ entries = new Map();
10
+ opened = false;
11
+ constructor(stateDir, fs) {
12
+ this.stateDir = stateDir;
13
+ this.fs = fs;
14
+ }
15
+ get cachePath() {
16
+ return `${this.stateDir}/evidence.json`;
17
+ }
18
+ /**
19
+ * Load whatever is on disk. Missing file → empty cache (first run); corrupt
20
+ * file → loud failure, same rationale as the queue store: the file only ever
21
+ * lands whole, so corrupt means something else touched it, and starting empty
22
+ * would throw away a night of verification the next persist makes permanent.
23
+ */
24
+ async open() {
25
+ await this.fs.mkdir(this.stateDir);
26
+ const text = await this.fs.readFile(this.cachePath);
27
+ if (text !== null) {
28
+ const parsed = JSON.parse(text);
29
+ this.entries = new Map(Object.entries(parsed));
30
+ }
31
+ this.opened = true;
32
+ }
33
+ /**
34
+ * Record a confirmed item's evidence at the HEAD it was verified against.
35
+ * One entry per item: a re-verify at a new HEAD replaces the old claim —
36
+ * keeping both would let a later lookup "hit" on a tree that no longer exists.
37
+ */
38
+ async put(itemId, head, evidence) {
39
+ this.assertOpened();
40
+ if (itemId === '' || head === '') {
41
+ // An empty half of the key would silently collide every caller that
42
+ // forgot to thread it — better to fail at the write than mix items up.
43
+ throw new Error('evidence cache: itemId and head must be non-empty');
44
+ }
45
+ this.entries.set(itemId, { head, evidence: copyEvidence(evidence) });
46
+ await this.persist();
47
+ }
48
+ lookup(itemId, head) {
49
+ const entry = this.entries.get(itemId);
50
+ if (entry === undefined)
51
+ return { kind: 'miss' };
52
+ if (entry.head !== head) {
53
+ return { kind: 'moved', cachedHead: entry.head, evidence: copyEvidence(entry.evidence) };
54
+ }
55
+ return { kind: 'hit', evidence: copyEvidence(entry.evidence) };
56
+ }
57
+ /** Drop an item's entry. §12 case 19: a discard always invalidates — the round may have mangled the very paths the evidence points at. */
58
+ async invalidate(itemId) {
59
+ this.assertOpened();
60
+ if (this.entries.delete(itemId)) {
61
+ await this.persist();
62
+ }
63
+ }
64
+ assertOpened() {
65
+ if (!this.opened) {
66
+ throw new Error('evidence cache: write before open() — would overwrite the cache on disk');
67
+ }
68
+ }
69
+ async persist() {
70
+ // Temp-then-rename, same contract as status.json and queue.json.
71
+ // The temp name is PRIVATE TO THIS WRITER. A shared `evidence.json.tmp` is
72
+ // two processes writing one path: the second truncates and rewrites what
73
+ // the first is midway through, and then both rename it into place. The
74
+ // rename is atomic and the file it renames is a splice of two writes, and
75
+ // nothing downstream can tell.
76
+ const tmp = `${this.cachePath}.${process.pid}.${(EvidenceCache.writes += 1)}.tmp`;
77
+ await this.fs.writeFile(tmp, JSON.stringify(Object.fromEntries(this.entries), null, 2) + '\n');
78
+ await this.fs.rename(tmp, this.cachePath);
79
+ }
80
+ }
81
+ exports.EvidenceCache = EvidenceCache;
82
+ /**
83
+ * Copies on the way in and out: the cache holds a *record* of what verify saw,
84
+ * and a caller mutating the array it handed over (or got back) must not be able
85
+ * to rewrite that record without going through `put`.
86
+ */
87
+ function copyEvidence(evidence) {
88
+ return evidence.map((e) => ({ ...e }));
89
+ }
90
+ //# sourceMappingURL=evidence-cache.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evidence-cache.js","sourceRoot":"","sources":["../src/evidence-cache.ts"],"names":[],"mappings":"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"}