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,138 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.APPROVAL_PAGE = void 0;
4
+ exports.readApprovalGate = readApprovalGate;
5
+ const core_1 = require("@looply/core");
6
+ /**
7
+ * How many rows to ask for.
8
+ *
9
+ * A pursuit at one version accumulates approvals slowly — a run raises at most
10
+ * one and then stops — so this is generous rather than tuned. It exists at all
11
+ * because the route's own default is 50 and silently taking the newest 50 of a
12
+ * larger set would be a gate that stops seeing the oldest outstanding question.
13
+ */
14
+ exports.APPROVAL_PAGE = 200;
15
+ /**
16
+ * A row is only usable if every field the decision reads is the right shape.
17
+ *
18
+ * `request()` casts the parsed body without looking at it, so a captive portal
19
+ * or a proxy interstitial is a perfectly successful response carrying something
20
+ * else entirely. The goal mirror guards this by hand for the same reason, and a
21
+ * question about human authority is a worse place to find out.
22
+ */
23
+ function projectionOf(raw) {
24
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw))
25
+ return null;
26
+ const o = raw;
27
+ if (typeof o['id'] !== 'string' || o['id'].length === 0)
28
+ return null;
29
+ if (typeof o['state'] !== 'string' || o['state'].length === 0)
30
+ return null;
31
+ if (typeof o['expiresAt'] !== 'string' || o['expiresAt'].length === 0)
32
+ return null;
33
+ if (Number.isNaN(Date.parse(o['expiresAt'])))
34
+ return null;
35
+ const goalId = o['goalId'];
36
+ const goalVersion = o['goalVersion'];
37
+ if (goalId !== null && typeof goalId !== 'string')
38
+ return null;
39
+ if (goalVersion !== null && typeof goalVersion !== 'number')
40
+ return null;
41
+ const execution = executionOf(o['execution']);
42
+ // `undefined` is the one answer that is not a shape: it means the row came
43
+ // back malformed, which is not the same as an approval with no attempt.
44
+ if (execution === undefined)
45
+ return null;
46
+ return {
47
+ id: o['id'],
48
+ state: o['state'],
49
+ goalId: goalId ?? null,
50
+ goalVersion: goalVersion ?? null,
51
+ expiresAt: o['expiresAt'],
52
+ execution,
53
+ };
54
+ }
55
+ /**
56
+ * The attempt made under this approval, or its absence, or a refusal.
57
+ *
58
+ * THREE ANSWERS AND NOT TWO, because absent and malformed must not lead to the
59
+ * same place. An approval nobody has claimed genuinely has no attempt; a row
60
+ * whose attempt this build cannot read is a row that may mean an effect
61
+ * happened, and reading it as "none" would let a pursuit carry on past one.
62
+ *
63
+ * `state` is left as a plain string on purpose. `deriveApprovalGate` refuses a
64
+ * word this build does not know rather than a parser here silently widening the
65
+ * set — the same division of labour the approval's own state already has.
66
+ */
67
+ function executionOf(raw) {
68
+ if (raw === undefined || raw === null)
69
+ return null;
70
+ if (typeof raw !== 'object' || Array.isArray(raw))
71
+ return undefined;
72
+ const e = raw;
73
+ if (typeof e['state'] !== 'string' || e['state'].length === 0)
74
+ return undefined;
75
+ const assigned = e['resultAssignedRunId'];
76
+ if (assigned !== null && assigned !== undefined && typeof assigned !== 'string')
77
+ return undefined;
78
+ const acknowledged = e['acknowledged'];
79
+ if (acknowledged !== undefined && typeof acknowledged !== 'boolean')
80
+ return undefined;
81
+ const resolved = e['resolved'];
82
+ if (resolved !== undefined && typeof resolved !== 'boolean')
83
+ return undefined;
84
+ return {
85
+ state: e['state'],
86
+ resultAssignedRunId: assigned ?? null,
87
+ acknowledged: acknowledged === true,
88
+ /**
89
+ * ABSENT MEANS NOT RESOLVED, and that is the safe direction here rather
90
+ * than merely the convenient one. An older server does not send this field
91
+ * at all; reading its silence as `true` would free a pursuit nobody has
92
+ * dealt with, which is the exact failure the two dead ends exist to
93
+ * prevent. Reading it as `false` only holds, and holding is recoverable.
94
+ */
95
+ resolved: resolved === true,
96
+ };
97
+ }
98
+ async function readApprovalGate(server, input) {
99
+ let rows;
100
+ try {
101
+ rows = await server.projectApprovals(input.projectId, { goalId: input.goalId, goalVersion: input.goalVersion }, exports.APPROVAL_PAGE);
102
+ }
103
+ catch (e) {
104
+ return { kind: 'unknown', because: `the approvals could not be read (${e.message})` };
105
+ }
106
+ if (!Array.isArray(rows)) {
107
+ // A 200 is not an answer.
108
+ return { kind: 'unknown', because: 'the server answered with something that is not a list' };
109
+ }
110
+ const read = [];
111
+ for (const raw of rows) {
112
+ const p = projectionOf(raw);
113
+ if (p === null) {
114
+ // ONE BAD ROW POISONS THE ANSWER, and deliberately so. Skipping it would
115
+ // mean deciding a pursuit may proceed while holding a row nobody could
116
+ // read — which is the fail-open this whole file exists to prevent.
117
+ return { kind: 'unknown', because: 'the server returned an approval this build cannot read' };
118
+ }
119
+ read.push(p);
120
+ }
121
+ // ASKED AFTER THE ROWS ARE IN HAND, because until then there is nothing to
122
+ // ask about. A machine cannot know which answers to look for until it knows
123
+ // which exist.
124
+ let given = new Set();
125
+ if (input.consumed !== undefined) {
126
+ const claims = await input.consumed(read.map((a) => a.id));
127
+ if (!claims.ok)
128
+ return { kind: 'unknown', because: claims.because };
129
+ given = claims.consumed;
130
+ }
131
+ return (0, core_1.deriveApprovalGate)({
132
+ goalId: input.goalId,
133
+ goalVersion: input.goalVersion,
134
+ approvals: read.map((a) => (given.has(a.id) ? { ...a, consumed: true } : a)),
135
+ now: input.now,
136
+ });
137
+ }
138
+ //# sourceMappingURL=approval-gate-read.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-gate-read.js","sourceRoot":"","sources":["../src/approval-gate-read.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,87 @@
1
+ import { type ResolvedOutcome } from '@looply/core';
2
+ import type { ServerApprovalRow } from './server-client';
3
+ /**
4
+ * WHAT A PERSON SAID NO TO, TOLD TO THE RUN THAT ASKED.
5
+ *
6
+ * A pursuit stopped because it wanted something only a person may authorise.
7
+ * The person answered — denied it, took it back, or let the window close — and
8
+ * somebody has now started the pursuit again. This is what that new run is
9
+ * told, and the shape of it is the whole point.
10
+ *
11
+ * ─────────────────────────────────────────────────────────────────────────────
12
+ * IT IS READ FROM THE SERVER, NOT CARRIED
13
+ *
14
+ * The daemon puts ONE thing on the command line: an id. Everything the model
15
+ * ends up being told is fetched here, from the row the person's decision was
16
+ * written to. The alternative — serialising the outcome and the wording into
17
+ * argv — makes a second copy of a decision, on a channel that is publicly
18
+ * visible and length-capped, and a second copy is a thing that can disagree
19
+ * with the first.
20
+ *
21
+ * THE HUMAN LINE COMES FROM THE SERVER'S OWN FORMATTER. `display` is rendered
22
+ * by 7B1's `displayAction`, which is the single description authority — the
23
+ * same function that produced the sentence the person was actually shown.
24
+ * Assembling one here out of the action type and its fields would be a second
25
+ * wording, free to drift from what somebody read before they tapped Deny.
26
+ *
27
+ * AND IT IS CHECKED AGAINST THIS RUN. A resolution names a project, a pursuit
28
+ * and a version; if any of them is not this run's, it is somebody else's answer
29
+ * and this run is told nothing. That check is why the id alone is safe to
30
+ * carry: forging it buys nothing, because the row it names must still belong
31
+ * to the pursuit the run is bound to.
32
+ */
33
+ export interface ApprovalResolutionContext {
34
+ readonly approvalId: string;
35
+ readonly actionType: string;
36
+ readonly actionFingerprint: string;
37
+ readonly outcome: ResolvedOutcome;
38
+ /** The one line the person was shown, from the server's own formatter. */
39
+ readonly display: string;
40
+ /**
41
+ * The owner's own words about their decision, when they left any.
42
+ *
43
+ * NOT AUTHORITY, and the same kind of thing as an action's `note`: it may
44
+ * help a model plan around a refusal — "not on a Friday" is worth knowing —
45
+ * and it decides nothing. Nothing branches on it.
46
+ */
47
+ readonly note?: string;
48
+ }
49
+ export type ResolutionRead = {
50
+ readonly ok: true;
51
+ readonly resolution: ApprovalResolutionContext;
52
+ }
53
+ /**
54
+ * The answer could not be established.
55
+ *
56
+ * NOT a licence to carry on. A run resumed on a refusal it could not read is
57
+ * a run that will plan as though nothing was refused — and the likeliest
58
+ * thing it plans is asking for the same action again.
59
+ */
60
+ | {
61
+ readonly ok: false;
62
+ readonly because: string;
63
+ };
64
+ /** Just enough of the client to fetch one. Injected so a test can fail it. */
65
+ export interface ResolutionReader {
66
+ projectApproval(projectId: string, approvalId: string): Promise<ServerApprovalRow>;
67
+ }
68
+ export interface ResolutionFor {
69
+ readonly projectId: string;
70
+ readonly goalId: string;
71
+ readonly goalVersion: number;
72
+ readonly now: number;
73
+ }
74
+ export declare function readApprovalResolution(server: ResolutionReader, approvalId: string, run: ResolutionFor): Promise<ResolutionRead>;
75
+ /**
76
+ * The block a resumed run's model is given, as plain lines.
77
+ *
78
+ * PROSE, AND DELIBERATELY NOT JSON. The implementer's transcript is scanned for
79
+ * a structured declaration, and the scan takes the FIRST one it finds so that a
80
+ * turn cannot ask for two consequential actions. A prompt that illustrated the
81
+ * shape of a request would be a decoy an echoing model files for real.
82
+ *
83
+ * The structured half is the context object above, which the run holds; this is
84
+ * only how it reads.
85
+ */
86
+ export declare function describeResolution(r: ApprovalResolutionContext): string;
87
+ //# sourceMappingURL=approval-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-resolution.d.ts","sourceRoot":"","sources":["../src/approval-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAA0D,KAAK,eAAe,EAAE,MAAM,cAAc,CAAC;AAC5G,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,yBAAyB;IACxC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IAClC,0EAA0E;IAC1E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB;;;;;;OAMG;IACH,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,MAAM,cAAc,GACtB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,yBAAyB,CAAA;CAAE;AACvE;;;;;;GAMG;GACD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD,8EAA8E;AAC9E,MAAM,WAAW,gBAAgB;IAC/B,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACpF;AAED,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACtB;AAED,wBAAsB,sBAAsB,CAC1C,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE,aAAa,GACjB,OAAO,CAAC,cAAc,CAAC,CAgDzB;AAiBD;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CAAC,CAAC,EAAE,yBAAyB,GAAG,MAAM,CAmBvE"}
@@ -0,0 +1,100 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.readApprovalResolution = readApprovalResolution;
4
+ exports.describeResolution = describeResolution;
5
+ const core_1 = require("@looply/core");
6
+ async function readApprovalResolution(server, approvalId, run) {
7
+ let row;
8
+ try {
9
+ row = await server.projectApproval(run.projectId, approvalId);
10
+ }
11
+ catch (e) {
12
+ return { ok: false, because: `the decision could not be read (${e.message})` };
13
+ }
14
+ if (row === null || typeof row !== 'object' || typeof row.id !== 'string') {
15
+ return { ok: false, because: 'the server answered with something that is not an approval' };
16
+ }
17
+ if (row.id !== approvalId) {
18
+ return { ok: false, because: `the server returned approval ${row.id}, not ${approvalId}` };
19
+ }
20
+ if (row.projectId !== run.projectId) {
21
+ return { ok: false, because: 'that decision belongs to another project' };
22
+ }
23
+ // SOMEBODY ELSE'S ANSWER. A resolution is about one pursuit at one version,
24
+ // and telling a run about a decision made for a different one would be
25
+ // telling it something untrue about its own work.
26
+ if (row.goalId !== run.goalId || row.goalVersion !== run.goalVersion) {
27
+ return { ok: false, because: 'that decision was made for a different pursuit' };
28
+ }
29
+ if (typeof row.display !== 'string' || typeof row.actionType !== 'string') {
30
+ return { ok: false, because: 'the server returned an approval this build cannot read' };
31
+ }
32
+ const outcome = outcomeOf(row, run.now);
33
+ if (outcome === null) {
34
+ // Still live, or already taken. Either way there is nothing to plan around
35
+ // — and a run resumed on one of those should never have been started, which
36
+ // is the gate's job and is asserted separately.
37
+ return { ok: false, because: `that approval is ${row.state}, which is not something to plan around` };
38
+ }
39
+ return {
40
+ ok: true,
41
+ resolution: {
42
+ approvalId: row.id,
43
+ actionType: row.actionType,
44
+ actionFingerprint: row.actionFingerprint,
45
+ outcome,
46
+ display: row.display,
47
+ ...(typeof row.decisionNote === 'string' && row.decisionNote.length > 0
48
+ ? { note: row.decisionNote }
49
+ : {}),
50
+ },
51
+ };
52
+ }
53
+ /**
54
+ * Which answer this is, with the clock applied.
55
+ *
56
+ * The single-approval route settles expiry as it reads, so `state` here is
57
+ * usually already right — but the check costs nothing and keeps this file
58
+ * honest on its own, rather than correct only because of what another service
59
+ * happened to do first.
60
+ */
61
+ function outcomeOf(row, now) {
62
+ if (!(0, core_1.isApprovalState)(row.state))
63
+ return null;
64
+ if (core_1.RESOLVED_APPROVAL_STATES.includes(row.state))
65
+ return row.state;
66
+ if (row.state === 'claimed')
67
+ return null;
68
+ return (0, core_1.isExpiredAt)(new Date(now), new Date(row.expiresAt)) ? 'expired' : null;
69
+ }
70
+ /**
71
+ * The block a resumed run's model is given, as plain lines.
72
+ *
73
+ * PROSE, AND DELIBERATELY NOT JSON. The implementer's transcript is scanned for
74
+ * a structured declaration, and the scan takes the FIRST one it finds so that a
75
+ * turn cannot ask for two consequential actions. A prompt that illustrated the
76
+ * shape of a request would be a decoy an echoing model files for real.
77
+ *
78
+ * The structured half is the context object above, which the run holds; this is
79
+ * only how it reads.
80
+ */
81
+ function describeResolution(r) {
82
+ const said = r.outcome === 'denied'
83
+ ? 'was refused'
84
+ : r.outcome === 'revoked'
85
+ ? 'was approved and then taken back'
86
+ : 'was never answered, and the window closed';
87
+ return [
88
+ 'A PREVIOUS RUN ASKED FOR SOMETHING THAT NEEDS A PERSON, AND IT ' + said.toUpperCase() + '.',
89
+ '',
90
+ ` what was asked for : ${r.display}`,
91
+ ` the answer : ${r.outcome}`,
92
+ ...(r.note === undefined ? [] : [` what they said : ${r.note}`]),
93
+ '',
94
+ 'Plan around it. Do not ask for the same thing again — the answer will be the',
95
+ 'same, and asking would stop this run for nothing. Either find a way to the',
96
+ 'goal that does not need it, or finish the work that does not depend on it and',
97
+ 'say plainly what is left.',
98
+ ].join('\n');
99
+ }
100
+ //# sourceMappingURL=approval-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-resolution.js","sourceRoot":"","sources":["../src/approval-resolution.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,102 @@
1
+ import type { AttemptFs } from './start-attempts';
2
+ /**
3
+ * A PERSON'S ANSWER REACHES EXACTLY ONE RUN.
4
+ *
5
+ * When an owner denies, revokes or lets an approval lapse, the pursuit may
6
+ * carry on — but only once somebody says so, and only once. The next explicit
7
+ * Start picks the answer up, tells its model precisely what was refused, and
8
+ * plans around it. Every Start after that is an ordinary Start.
9
+ *
10
+ * WHY IT NEEDS ITS OWN RECORD. The approval row looks identical before and
11
+ * after: `denied` at nine o'clock is `denied` at midnight, and nothing on the
12
+ * server says whether anybody has acted on it. Without a durable local mark, a
13
+ * denial would be handed to every run for the rest of the goal's life — the
14
+ * model told again and again about a decision it has already planned around,
15
+ * and a pursuit that can never leave the state of having just been refused.
16
+ *
17
+ * ─────────────────────────────────────────────────────────────────────────────
18
+ * EXCLUSIVE CREATE, AND NOTHING ELSE
19
+ *
20
+ * The same argument `StartAttempts` makes. No read, no "does it exist", no
21
+ * compare-and-swap of our own: the operating system hands the file to exactly
22
+ * one caller and the loser finds out from the filesystem rather than from a
23
+ * stale read it took a moment earlier. Two Starts racing for one answer is
24
+ * exactly the shape that goes wrong, and an in-process guard would not survive
25
+ * two daemons — or one daemon and a person at a terminal.
26
+ *
27
+ * THERE IS NO RELEASE, AND NO TAKEOVER. A claim is a historical fact: this
28
+ * answer was given to that run. If the run then died before doing anything with
29
+ * it, the pursuit is no worse off than a run that died for any other reason —
30
+ * the next Start is an ordinary Start, and the goal still knows what it knows.
31
+ * A takeover path would mean an answer could be handed out twice, which is the
32
+ * one thing this file exists to prevent.
33
+ */
34
+ export declare const APPROVAL_RESUMES_SCHEMA = 1;
35
+ export interface ApprovalResume {
36
+ /** The approval whose answer this run was given. */
37
+ approvalId: string;
38
+ /** The Start that claimed it. Present before a run exists; see below. */
39
+ requestId: string;
40
+ /** ISO, from the claiming process's own clock. */
41
+ claimedAt: string;
42
+ }
43
+ export type ResumeClaim = {
44
+ readonly ok: true;
45
+ readonly resume: ApprovalResume;
46
+ }
47
+ /** Somebody already has it. Not an error — an answer. */
48
+ | {
49
+ readonly ok: false;
50
+ readonly because: string;
51
+ };
52
+ /**
53
+ * WHAT THE CLAIM IS KEYED BY, AND WHY IT IS THE START AND NOT THE RUN.
54
+ *
55
+ * Claimed at the Start boundary, before a run exists, because that is where the
56
+ * race is: two Starts arrive, and only one may carry the answer. Keying on the
57
+ * run would mean claiming after the thing the claim is supposed to gate.
58
+ *
59
+ * The cost is that a Start which claims and then fails to produce a run has
60
+ * spent the answer. That is the safe direction — an answer delivered zero times
61
+ * leaves a goal exactly as informed as it was, while an answer delivered twice
62
+ * puts a machine in a loop being told the same no.
63
+ */
64
+ export declare class ApprovalResumes {
65
+ private readonly stateDir;
66
+ private readonly fs;
67
+ private readonly deps;
68
+ constructor(stateDir: string, fs: AttemptFs, deps?: {
69
+ now?: () => number;
70
+ });
71
+ private get dir();
72
+ private path;
73
+ /**
74
+ * Take this answer, if nobody has.
75
+ *
76
+ * The whole mechanism is `createExclusive`. Everything else here is bookkeeping
77
+ * about what to write in the file that proves it.
78
+ */
79
+ claim(approvalId: string, requestId: string): Promise<ResumeClaim>;
80
+ /** What was claimed for this approval, or null. Unreadable is NOT null — it throws. */
81
+ claimOf(approvalId: string): Promise<ApprovalResume | null>;
82
+ /**
83
+ * Which of these answers have already been given out.
84
+ *
85
+ * Takes the ids to ask about rather than listing the directory, because the
86
+ * gate already knows which approvals exist for the pursuit and a directory
87
+ * read would be a second, slower answer to a question it has.
88
+ *
89
+ * AN UNREADABLE CLAIM IS NOT AN ABSENT ONE. A file held for a moment by
90
+ * something else — which on Windows is ordinary — would otherwise read as
91
+ * "not consumed", and the answer would be handed out a second time. So this
92
+ * reports the trouble and lets the caller hold.
93
+ */
94
+ consumed(approvalIds: readonly string[]): Promise<{
95
+ ok: true;
96
+ consumed: Set<string>;
97
+ } | {
98
+ ok: false;
99
+ because: string;
100
+ }>;
101
+ }
102
+ //# sourceMappingURL=approval-resumes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-resumes.d.ts","sourceRoot":"","sources":["../src/approval-resumes.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAElD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AAEH,eAAO,MAAM,uBAAuB,IAAI,CAAC;AAEzC,MAAM,WAAW,cAAc;IAC7B,oDAAoD;IACpD,UAAU,EAAE,MAAM,CAAC;IACnB,yEAAyE;IACzE,SAAS,EAAE,MAAM,CAAC;IAClB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;CACnB;AAOD,MAAM,MAAM,WAAW,GACnB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;CAAE;AACxD,yDAAyD;GACvD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD;;;;;;;;;;;GAWG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAFJ,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,SAAS,EACb,IAAI,GAAE;QAAE,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;KAAO;IAGpD,OAAO,KAAK,GAAG,GAEd;IAED,OAAO,CAAC,IAAI;IAIZ;;;;;OAKG;IACG,KAAK,CAAC,UAAU,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;IAyBxE,uFAAuF;IACjF,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC;IAMjE;;;;;;;;;;;OAWG;IACG,QAAQ,CACZ,WAAW,EAAE,SAAS,MAAM,EAAE,GAC7B,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CAoBjF"}
@@ -0,0 +1,167 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ApprovalResumes = exports.APPROVAL_RESUMES_SCHEMA = void 0;
4
+ /**
5
+ * A PERSON'S ANSWER REACHES EXACTLY ONE RUN.
6
+ *
7
+ * When an owner denies, revokes or lets an approval lapse, the pursuit may
8
+ * carry on — but only once somebody says so, and only once. The next explicit
9
+ * Start picks the answer up, tells its model precisely what was refused, and
10
+ * plans around it. Every Start after that is an ordinary Start.
11
+ *
12
+ * WHY IT NEEDS ITS OWN RECORD. The approval row looks identical before and
13
+ * after: `denied` at nine o'clock is `denied` at midnight, and nothing on the
14
+ * server says whether anybody has acted on it. Without a durable local mark, a
15
+ * denial would be handed to every run for the rest of the goal's life — the
16
+ * model told again and again about a decision it has already planned around,
17
+ * and a pursuit that can never leave the state of having just been refused.
18
+ *
19
+ * ─────────────────────────────────────────────────────────────────────────────
20
+ * EXCLUSIVE CREATE, AND NOTHING ELSE
21
+ *
22
+ * The same argument `StartAttempts` makes. No read, no "does it exist", no
23
+ * compare-and-swap of our own: the operating system hands the file to exactly
24
+ * one caller and the loser finds out from the filesystem rather than from a
25
+ * stale read it took a moment earlier. Two Starts racing for one answer is
26
+ * exactly the shape that goes wrong, and an in-process guard would not survive
27
+ * two daemons — or one daemon and a person at a terminal.
28
+ *
29
+ * THERE IS NO RELEASE, AND NO TAKEOVER. A claim is a historical fact: this
30
+ * answer was given to that run. If the run then died before doing anything with
31
+ * it, the pursuit is no worse off than a run that died for any other reason —
32
+ * the next Start is an ordinary Start, and the goal still knows what it knows.
33
+ * A takeover path would mean an answer could be handed out twice, which is the
34
+ * one thing this file exists to prevent.
35
+ */
36
+ exports.APPROVAL_RESUMES_SCHEMA = 1;
37
+ /**
38
+ * WHAT THE CLAIM IS KEYED BY, AND WHY IT IS THE START AND NOT THE RUN.
39
+ *
40
+ * Claimed at the Start boundary, before a run exists, because that is where the
41
+ * race is: two Starts arrive, and only one may carry the answer. Keying on the
42
+ * run would mean claiming after the thing the claim is supposed to gate.
43
+ *
44
+ * The cost is that a Start which claims and then fails to produce a run has
45
+ * spent the answer. That is the safe direction — an answer delivered zero times
46
+ * leaves a goal exactly as informed as it was, while an answer delivered twice
47
+ * puts a machine in a loop being told the same no.
48
+ */
49
+ class ApprovalResumes {
50
+ stateDir;
51
+ fs;
52
+ deps;
53
+ constructor(stateDir, fs, deps = {}) {
54
+ this.stateDir = stateDir;
55
+ this.fs = fs;
56
+ this.deps = deps;
57
+ }
58
+ get dir() {
59
+ return `${this.stateDir}/approval-resumes`;
60
+ }
61
+ path(approvalId) {
62
+ return `${this.dir}/${approvalId}.json`;
63
+ }
64
+ /**
65
+ * Take this answer, if nobody has.
66
+ *
67
+ * The whole mechanism is `createExclusive`. Everything else here is bookkeeping
68
+ * about what to write in the file that proves it.
69
+ */
70
+ async claim(approvalId, requestId) {
71
+ if (approvalId.length === 0)
72
+ return { ok: false, because: 'no approval was named' };
73
+ // Path safety, not validation theatre: the id becomes a filename, and an id
74
+ // carrying a separator would write outside the directory this owns.
75
+ if (/[^A-Za-z0-9_-]/.test(approvalId)) {
76
+ return { ok: false, because: `${approvalId} is not a usable approval id` };
77
+ }
78
+ const resume = {
79
+ approvalId,
80
+ requestId,
81
+ claimedAt: new Date(this.deps.now?.() ?? Date.now()).toISOString(),
82
+ };
83
+ const body = { schema: exports.APPROVAL_RESUMES_SCHEMA, resume };
84
+ await this.fs.mkdir(this.dir);
85
+ try {
86
+ await this.fs.createExclusive(this.path(approvalId), JSON.stringify(body, null, 2) + '\n');
87
+ }
88
+ catch (e) {
89
+ if (e.code === 'EEXIST') {
90
+ return { ok: false, because: `this answer has already been given to a run` };
91
+ }
92
+ throw e;
93
+ }
94
+ return { ok: true, resume };
95
+ }
96
+ /** What was claimed for this approval, or null. Unreadable is NOT null — it throws. */
97
+ async claimOf(approvalId) {
98
+ const text = await this.fs.readFile(this.path(approvalId));
99
+ if (text === null)
100
+ return null;
101
+ return readResume(text);
102
+ }
103
+ /**
104
+ * Which of these answers have already been given out.
105
+ *
106
+ * Takes the ids to ask about rather than listing the directory, because the
107
+ * gate already knows which approvals exist for the pursuit and a directory
108
+ * read would be a second, slower answer to a question it has.
109
+ *
110
+ * AN UNREADABLE CLAIM IS NOT AN ABSENT ONE. A file held for a moment by
111
+ * something else — which on Windows is ordinary — would otherwise read as
112
+ * "not consumed", and the answer would be handed out a second time. So this
113
+ * reports the trouble and lets the caller hold.
114
+ */
115
+ async consumed(approvalIds) {
116
+ const consumed = new Set();
117
+ for (const id of approvalIds) {
118
+ let text;
119
+ try {
120
+ text = await this.fs.readFile(this.path(id));
121
+ }
122
+ catch (e) {
123
+ return { ok: false, because: `a resume claim could not be read (${e.message})` };
124
+ }
125
+ if (text === null)
126
+ continue;
127
+ if (readResume(text) === null) {
128
+ // Present and unreadable. Counted as consumed, which is the safe
129
+ // direction: the alternative hands the same answer out again.
130
+ consumed.add(id);
131
+ continue;
132
+ }
133
+ consumed.add(id);
134
+ }
135
+ return { ok: true, consumed };
136
+ }
137
+ }
138
+ exports.ApprovalResumes = ApprovalResumes;
139
+ function readResume(text) {
140
+ let parsed;
141
+ try {
142
+ parsed = JSON.parse(text);
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ const file = parsed;
148
+ if (typeof file !== 'object' || file === null)
149
+ return null;
150
+ if (file.schema !== exports.APPROVAL_RESUMES_SCHEMA)
151
+ return null;
152
+ const r = file.resume;
153
+ if (typeof r !== 'object' || r === null)
154
+ return null;
155
+ if (typeof r['approvalId'] !== 'string' || r['approvalId'] === '')
156
+ return null;
157
+ if (typeof r['requestId'] !== 'string')
158
+ return null;
159
+ if (typeof r['claimedAt'] !== 'string')
160
+ return null;
161
+ return {
162
+ approvalId: r['approvalId'],
163
+ requestId: r['requestId'],
164
+ claimedAt: r['claimedAt'],
165
+ };
166
+ }
167
+ //# sourceMappingURL=approval-resumes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-resumes.js","sourceRoot":"","sources":["../src/approval-resumes.ts"],"names":[],"mappings":"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"}