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,242 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SHARED_GRANT_LOCK_WAIT_MS = void 0;
4
+ exports.sharedGrantsPath = sharedGrantsPath;
5
+ exports.readSharedGrants = readSharedGrants;
6
+ exports.liveSharedGrants = liveSharedGrants;
7
+ exports.grantAce = grantAce;
8
+ exports.removeAce = removeAce;
9
+ exports.ensureSharedGrant = ensureSharedGrant;
10
+ exports.ensureSharedAccess = ensureSharedAccess;
11
+ exports.releaseSharedGrants = releaseSharedGrants;
12
+ const node_child_process_1 = require("node:child_process");
13
+ const node_fs_1 = require("node:fs");
14
+ const node_os_1 = require("node:os");
15
+ const node_path_1 = require("node:path");
16
+ const exclusive_lock_1 = require("./exclusive-lock");
17
+ const untrusted_exec_1 = require("./untrusted-exec");
18
+ function sharedGrantsPath(home = (0, node_os_1.homedir)()) {
19
+ return (0, node_path_1.join)(home, '.looply', 'container-grants.jsonl');
20
+ }
21
+ /**
22
+ * F43: HOW LONG ONE GRANT WAITS FOR ANOTHER — longer than an ACL write takes.
23
+ *
24
+ * `icacls /grant (OI)(CI)` rewrites the entry on every file under the toolchain
25
+ * mirror, and the time grows with the list: 8–11 s on 09-15, 26–29 s on 09-26
26
+ * at ~1,230 entries. The shared mutex's default wait (5 s) is sized for
27
+ * check-and-claims that take microseconds, so a second identity arriving during
28
+ * a grant was refused ("could not be serialised") — a gate step or a tool call
29
+ * that did not run, and in the lane an inconclusive check nobody re-offers.
30
+ * A holder that dies is still broken at once (`withExclusiveLock`); this only
31
+ * bounds how long a LIVE holder is waited for.
32
+ */
33
+ exports.SHARED_GRANT_LOCK_WAIT_MS = 300_000;
34
+ function lockPath(home) {
35
+ return (0, node_path_1.join)(home, '.looply', 'container-grants.lock');
36
+ }
37
+ /** Every row, oldest first. A row that will not parse is skipped, never fatal. */
38
+ function readSharedGrants(home = (0, node_os_1.homedir)()) {
39
+ let raw;
40
+ try {
41
+ raw = (0, node_fs_1.readFileSync)(sharedGrantsPath(home), 'utf8');
42
+ }
43
+ catch {
44
+ return [];
45
+ }
46
+ const out = [];
47
+ for (const line of raw.split('\n')) {
48
+ const s = line.trim();
49
+ if (s === '')
50
+ continue;
51
+ try {
52
+ const r = JSON.parse(s);
53
+ if (typeof r.name === 'string' && typeof r.sid === 'string' && typeof r.path === 'string') {
54
+ out.push(r);
55
+ }
56
+ }
57
+ catch {
58
+ /* one unreadable row is one lost row, not a lost ledger */
59
+ }
60
+ }
61
+ return out;
62
+ }
63
+ /**
64
+ * What is still granted: the last state wins, per (sid, path).
65
+ *
66
+ * Folded rather than filtered, because a path can legitimately be granted,
67
+ * released, and granted again when a workspace identity is reused.
68
+ */
69
+ function liveSharedGrants(home = (0, node_os_1.homedir)()) {
70
+ const last = new Map();
71
+ for (const r of readSharedGrants(home))
72
+ last.set(`${r.sid}|${r.path}`, r);
73
+ return [...last.values()].filter((r) => r.state === 'granted');
74
+ }
75
+ function append(home, r) {
76
+ const p = sharedGrantsPath(home);
77
+ (0, node_fs_1.mkdirSync)((0, node_path_1.join)(home, '.looply'), { recursive: true });
78
+ (0, node_fs_1.appendFileSync)(p, `\n${JSON.stringify(r)}`, 'utf8');
79
+ }
80
+ function icacls() {
81
+ return (0, node_path_1.join)((0, untrusted_exec_1.systemRoot)(), 'System32', 'icacls.exe');
82
+ }
83
+ /**
84
+ * Add one inheritable read-and-execute ACE for a container SID.
85
+ *
86
+ * READ AND EXECUTE ONLY, on both shared paths, because both hold Looply's own
87
+ * artefacts: a container that could replace `node.exe` or the tool worker would
88
+ * be choosing what every later execution runs.
89
+ */
90
+ function grantAce(path, sid) {
91
+ try {
92
+ (0, node_child_process_1.execFileSync)(icacls(), [path, '/grant', `*${sid}:(OI)(CI)(RX)`], { stdio: 'ignore' });
93
+ return { ok: true };
94
+ }
95
+ catch (e) {
96
+ return { ok: false, because: e.message };
97
+ }
98
+ }
99
+ /**
100
+ * Remove every granted ACE for one SID from one path, and nothing else.
101
+ *
102
+ * `/remove:g` names a single principal. It cannot touch another SID's entry, an
103
+ * inherited entry, or the owner's own rights — which is what "without changing
104
+ * unrelated user permissions" has to mean in practice.
105
+ */
106
+ function removeAce(path, sid) {
107
+ try {
108
+ (0, node_child_process_1.execFileSync)(icacls(), [path, '/remove:g', `*${sid}`], { stdio: 'ignore' });
109
+ return { ok: true };
110
+ }
111
+ catch (e) {
112
+ return { ok: false, because: e.message };
113
+ }
114
+ }
115
+ /**
116
+ * Make sure this identity may read a shared path, recording that it now may.
117
+ *
118
+ * 🔴 THE SAME LOCK AS THE REMOVAL, WHICH IS THE POINT. `Set-Acl` and `icacls`
119
+ * are both read-modify-write over one DACL, so an addition racing a removal
120
+ * loses whichever entry it did not see. Locking only the cleanup would leave
121
+ * exactly that race open on every launch.
122
+ *
123
+ * ⚠️ THE CRITICAL SECTION IS THE ACL WRITE, AND NOTHING MORE. The lock is taken
124
+ * here and released before the caller launches anything: it is never held
125
+ * across a provider invocation or a gate step.
126
+ *
127
+ * Idempotent: an identity already recorded as holding this path does no ACL work
128
+ * at all, so the cost is paid once per identity rather than once per launch.
129
+ */
130
+ function ensureSharedGrant(name, sid, path, deps = {}) {
131
+ const home = deps.home ?? (0, node_os_1.homedir)();
132
+ const doGrant = deps.grant ?? grantAce;
133
+ const now = deps.now ?? (() => new Date());
134
+ return (0, exclusive_lock_1.withExclusiveLock)(lockPath(home), () => {
135
+ const already = liveSharedGrants(home).some((r) => r.sid === sid && r.path === path);
136
+ if (already)
137
+ return { ok: true };
138
+ // Intent first: a crash after the ACE lands must not leave it unrecorded.
139
+ append(home, { name, sid, path, at: now().toISOString(), state: 'granted' });
140
+ const r = doGrant(path, sid);
141
+ if (!r.ok) {
142
+ // The row stays. A recorded grant whose ACE never landed is cleaned up
143
+ // harmlessly; an ACE with no row is the leak this module removes.
144
+ return r;
145
+ }
146
+ return { ok: true };
147
+ }, (why) => ({ ok: false, because: `the shared-grant ledger could not be serialised: ${why}` }), exports.SHARED_GRANT_LOCK_WAIT_MS);
148
+ }
149
+ /**
150
+ * Ensure one container identity may read the shared paths, before it launches.
151
+ *
152
+ * ⚠️ THE COMMON CASE COSTS NOTHING. An identity whose rows are already in the
153
+ * ledger takes no lock, makes no probe and touches no ACL — so the extra round
154
+ * trip is paid once per identity, not once per launch.
155
+ */
156
+ async function ensureSharedAccess(backend, name, paths, deps = {}) {
157
+ /*
158
+ * ⚠️ NULL MEANS "NOT A WINDOWS DACL BACKEND", NOT "SKIP THE SAFETY".
159
+ *
160
+ * Shared-path grants exist because AppContainer identities accumulate ACEs on
161
+ * a shared directory. A backend that is not the AppContainer one — a test
162
+ * double, or a future non-Windows boundary — grants nothing and therefore has
163
+ * nothing to give back. Asking it for a container SID would fail, and turning
164
+ * that failure into a refused gate step would break every suite that injects a
165
+ * fake backend while proving nothing about the real one.
166
+ */
167
+ if (backend === null)
168
+ return { ok: true };
169
+ const home = deps.home ?? (0, node_os_1.homedir)();
170
+ const wanted = paths.filter((p) => p.length > 0);
171
+ if (wanted.length === 0)
172
+ return { ok: true };
173
+ const live = liveSharedGrants(home).filter((r) => r.name === name);
174
+ const missing = wanted.filter((p) => !live.some((r) => r.path === p));
175
+ if (missing.length === 0)
176
+ return { ok: true };
177
+ // The numeric SID, from the same helper that derives it for a launch. Asked
178
+ // for only when something is actually missing.
179
+ let reply;
180
+ try {
181
+ reply = await backend.call({ action: 'probe', profile: name });
182
+ }
183
+ catch (e) {
184
+ reply = { ok: false, error: e.message };
185
+ }
186
+ const sid = reply.sid;
187
+ if (!reply.ok || typeof sid !== 'string' || sid.length === 0) {
188
+ /*
189
+ * 🔴 NO SID MEANS NO GRANT, WHICH MEANS LESS ACCESS — NOT MORE.
190
+ *
191
+ * This is the one place the direction of failure has to be reasoned about
192
+ * out loud. Refusing the launch here would be safe too, but it would turn
193
+ * every backend that answers `probe` differently into a broken gate. Going
194
+ * on without the grant cannot widen anything: the container simply is not
195
+ * given the shared path, and if it needs it the launch fails at the
196
+ * boundary rather than succeeding with authority nobody recorded.
197
+ */
198
+ return { ok: true, because: `no shared grant: ${reply.error ?? 'the backend returned no sid'}` };
199
+ }
200
+ for (const p of missing) {
201
+ const r = ensureSharedGrant(name, sid, p, deps);
202
+ if (!r.ok)
203
+ return r;
204
+ }
205
+ return { ok: true };
206
+ }
207
+ /**
208
+ * Give back every shared-path grant held by these identities.
209
+ *
210
+ * 🔴 CALLED ONLY FOR AN IDENTITY WHOSE WORKSPACE IS BEING RETIRED, and the
211
+ * caller establishes that. This function does not decide liveness; it does the
212
+ * ACL work for a decision already made, so a caller that skips the check cannot
213
+ * be rescued here.
214
+ *
215
+ * ⚠️ A FAILURE LEAVES THE ROW `granted`, DELIBERATELY. That is the truthful
216
+ * cleanup-pending state: the next retirement sweep finds the row and tries
217
+ * again, and nothing ever reports cleanup it did not do.
218
+ */
219
+ function releaseSharedGrants(names, deps = {}) {
220
+ const home = deps.home ?? (0, node_os_1.homedir)();
221
+ const doRemove = deps.remove ?? removeAce;
222
+ const now = deps.now ?? (() => new Date());
223
+ const wanted = new Set(names);
224
+ return (0, exclusive_lock_1.withExclusiveLock)(lockPath(home), () => {
225
+ const released = [];
226
+ const pending = [];
227
+ for (const r of liveSharedGrants(home)) {
228
+ if (!wanted.has(r.name))
229
+ continue;
230
+ const out = doRemove(r.path, r.sid);
231
+ if (out.ok) {
232
+ append(home, { ...r, at: now().toISOString(), state: 'released' });
233
+ released.push({ path: r.path, sid: r.sid });
234
+ }
235
+ else {
236
+ pending.push({ path: r.path, sid: r.sid, because: out.because ?? 'unknown' });
237
+ }
238
+ }
239
+ return { released, pending };
240
+ }, (why) => ({ released: [], pending: [{ path: '(all)', sid: '(all)', because: why }] }), exports.SHARED_GRANT_LOCK_WAIT_MS);
241
+ }
242
+ //# sourceMappingURL=shared-grants.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-grants.js","sourceRoot":"","sources":["../src/shared-grants.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Signal handling (DESIGN §12 case 11): HUP, INT and TERM must end in
3
+ * `run.ended` with tallies and a notification, never in a silent death.
4
+ *
5
+ * Node's default disposition for all three is immediate exit — the ledger's
6
+ * last line stays `round.phase` forever and the phone hears nothing, which is
7
+ * exactly the quiet failure the notifier exists to prevent. So the watcher
8
+ * takes the signals over, and the runner polls `requested()` between rounds:
9
+ *
10
+ * 1st signal → graceful. The in-flight round finishes (same finish-the-round
11
+ * rule as a budget limit, §12 case 10), the runner stops with stopReason
12
+ * `signal`, emits `run.ended` with totals, and the caller notifies.
13
+ * 2nd signal → force, once. The escape hatch for a round that will not end.
14
+ * `onForce` is the caller's emergency path (best-effort run.ended + notify,
15
+ * then exit); it fires exactly once because that path sends a message, and
16
+ * an impatient thumb on Ctrl-C must not send two.
17
+ *
18
+ * On force the watcher also uninstalls itself, so a THIRD signal falls through
19
+ * to the default disposition and genuinely kills the process. Without this, a
20
+ * caller whose force path hangs leaves a process nothing short of SIGKILL can
21
+ * reach.
22
+ *
23
+ * Exiting is deliberately not done here: it must happen after the async
24
+ * run.ended append and notify, so it belongs to the caller. This module stays
25
+ * synchronous and injectable.
26
+ */
27
+ export declare const STOP_SIGNALS: readonly ["SIGHUP", "SIGINT", "SIGTERM"];
28
+ export type StopSignal = (typeof STOP_SIGNALS)[number];
29
+ /** The slice of `process` the watcher needs, injectable for tests. */
30
+ export interface SignalSource {
31
+ on(signal: StopSignal, handler: () => void): void;
32
+ off(signal: StopSignal, handler: () => void): void;
33
+ }
34
+ export interface SignalWatcherDeps {
35
+ proc: SignalSource;
36
+ /** First signal seen. Log "finishing the round — again to force" here. */
37
+ onGraceful?(signal: StopSignal): void;
38
+ /** Second signal seen. The caller's flush-and-exit path. Called once. */
39
+ onForce?(signal: StopSignal): void;
40
+ }
41
+ export declare class SignalWatcher {
42
+ private readonly deps;
43
+ private readonly handlers;
44
+ private received;
45
+ private forced;
46
+ constructor(deps: SignalWatcherDeps);
47
+ install(): void;
48
+ uninstall(): void;
49
+ /** Polled by the runner between rounds. */
50
+ requested(): boolean;
51
+ get signal(): StopSignal | null;
52
+ private onSignal;
53
+ }
54
+ export declare function nodeSignalSource(proc?: NodeJS.Process): SignalSource;
55
+ //# sourceMappingURL=signals.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.d.ts","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,eAAO,MAAM,YAAY,0CAA2C,CAAC;AACrE,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,sEAAsE;AACtE,MAAM,WAAW,YAAY;IAC3B,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;IAClD,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,IAAI,GAAG,IAAI,CAAC;CACpD;AAED,MAAM,WAAW,iBAAiB;IAChC,IAAI,EAAE,YAAY,CAAC;IACnB,0EAA0E;IAC1E,UAAU,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IACtC,yEAAyE;IACzE,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;CACpC;AAED,qBAAa,aAAa;IAKZ,OAAO,CAAC,QAAQ,CAAC,IAAI;IAJjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAA2B;IAC3C,OAAO,CAAC,MAAM,CAAS;gBAEM,IAAI,EAAE,iBAAiB;IAEpD,OAAO,IAAI,IAAI;IAWf,SAAS,IAAI,IAAI;IAKjB,2CAA2C;IAC3C,SAAS,IAAI,OAAO;IAIpB,IAAI,MAAM,IAAI,UAAU,GAAG,IAAI,CAE9B;IAED,OAAO,CAAC,QAAQ;CAcjB;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAM,CAAC,OAAiB,GAAG,YAAY,CAK7E"}
@@ -0,0 +1,85 @@
1
+ "use strict";
2
+ /**
3
+ * Signal handling (DESIGN §12 case 11): HUP, INT and TERM must end in
4
+ * `run.ended` with tallies and a notification, never in a silent death.
5
+ *
6
+ * Node's default disposition for all three is immediate exit — the ledger's
7
+ * last line stays `round.phase` forever and the phone hears nothing, which is
8
+ * exactly the quiet failure the notifier exists to prevent. So the watcher
9
+ * takes the signals over, and the runner polls `requested()` between rounds:
10
+ *
11
+ * 1st signal → graceful. The in-flight round finishes (same finish-the-round
12
+ * rule as a budget limit, §12 case 10), the runner stops with stopReason
13
+ * `signal`, emits `run.ended` with totals, and the caller notifies.
14
+ * 2nd signal → force, once. The escape hatch for a round that will not end.
15
+ * `onForce` is the caller's emergency path (best-effort run.ended + notify,
16
+ * then exit); it fires exactly once because that path sends a message, and
17
+ * an impatient thumb on Ctrl-C must not send two.
18
+ *
19
+ * On force the watcher also uninstalls itself, so a THIRD signal falls through
20
+ * to the default disposition and genuinely kills the process. Without this, a
21
+ * caller whose force path hangs leaves a process nothing short of SIGKILL can
22
+ * reach.
23
+ *
24
+ * Exiting is deliberately not done here: it must happen after the async
25
+ * run.ended append and notify, so it belongs to the caller. This module stays
26
+ * synchronous and injectable.
27
+ */
28
+ Object.defineProperty(exports, "__esModule", { value: true });
29
+ exports.SignalWatcher = exports.STOP_SIGNALS = void 0;
30
+ exports.nodeSignalSource = nodeSignalSource;
31
+ exports.STOP_SIGNALS = ['SIGHUP', 'SIGINT', 'SIGTERM'];
32
+ class SignalWatcher {
33
+ deps;
34
+ handlers = new Map();
35
+ received = null;
36
+ forced = false;
37
+ constructor(deps) {
38
+ this.deps = deps;
39
+ }
40
+ install() {
41
+ // Idempotent: a double install would register two handlers per signal, and
42
+ // one Ctrl-C would then count as both the graceful and the force press.
43
+ if (this.handlers.size > 0)
44
+ return;
45
+ for (const sig of exports.STOP_SIGNALS) {
46
+ const handler = () => this.onSignal(sig);
47
+ this.handlers.set(sig, handler);
48
+ this.deps.proc.on(sig, handler);
49
+ }
50
+ }
51
+ uninstall() {
52
+ for (const [sig, handler] of this.handlers)
53
+ this.deps.proc.off(sig, handler);
54
+ this.handlers.clear();
55
+ }
56
+ /** Polled by the runner between rounds. */
57
+ requested() {
58
+ return this.received !== null;
59
+ }
60
+ get signal() {
61
+ return this.received;
62
+ }
63
+ onSignal(sig) {
64
+ if (this.received === null) {
65
+ this.received = sig;
66
+ this.deps.onGraceful?.(sig);
67
+ return;
68
+ }
69
+ if (!this.forced) {
70
+ this.forced = true;
71
+ // Re-arm the default disposition BEFORE the force path runs: from here on
72
+ // the next signal must kill, no matter what onForce does or fails to do.
73
+ this.uninstall();
74
+ this.deps.onForce?.(sig);
75
+ }
76
+ }
77
+ }
78
+ exports.SignalWatcher = SignalWatcher;
79
+ function nodeSignalSource(proc = process) {
80
+ return {
81
+ on: (sig, handler) => void proc.on(sig, handler),
82
+ off: (sig, handler) => void proc.removeListener(sig, handler),
83
+ };
84
+ }
85
+ //# sourceMappingURL=signals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"signals.js","sourceRoot":"","sources":["../src/signals.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;;;AAmEH,4CAKC;AAtEY,QAAA,YAAY,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,SAAS,CAAU,CAAC;AAiBrE,MAAa,aAAa;IAKK;IAJZ,QAAQ,GAAG,IAAI,GAAG,EAA0B,CAAC;IACtD,QAAQ,GAAsB,IAAI,CAAC;IACnC,MAAM,GAAG,KAAK,CAAC;IAEvB,YAA6B,IAAuB;QAAvB,SAAI,GAAJ,IAAI,CAAmB;IAAG,CAAC;IAExD,OAAO;QACL,2EAA2E;QAC3E,wEAAwE;QACxE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC;YAAE,OAAO;QACnC,KAAK,MAAM,GAAG,IAAI,oBAAY,EAAE,CAAC;YAC/B,MAAM,OAAO,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;YAC/C,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAClC,CAAC;IACH,CAAC;IAED,SAAS;QACP,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC7E,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,2CAA2C;IAC3C,SAAS;QACP,OAAO,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC;IAChC,CAAC;IAED,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC;IACvB,CAAC;IAEO,QAAQ,CAAC,GAAe;QAC9B,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;YAC3B,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC;YACpB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,CAAC,CAAC;YAC5B,OAAO;QACT,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;YACnB,0EAA0E;YAC1E,yEAAyE;YACzE,IAAI,CAAC,SAAS,EAAE,CAAC;YACjB,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;CACF;AA9CD,sCA8CC;AAED,SAAgB,gBAAgB,CAAC,OAAuB,OAAO;IAC7D,OAAO;QACL,EAAE,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,GAAG,EAAE,OAAO,CAAC;QAChD,GAAG,EAAE,CAAC,GAAG,EAAE,OAAO,EAAE,EAAE,CAAC,KAAK,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC;KAC9D,CAAC;AACJ,CAAC"}
@@ -0,0 +1,201 @@
1
+ import { type Attestation, type Classification, type CoverageKind, type Disposition, type RequirementCoverage, type ProjectIndexSnapshot, type Source, type SourceKind, type SourceStatement } from '@looply/core';
2
+ import { type PdfTextResult } from './pdf-text';
3
+ import { type VerdictDeps } from './source-verdict';
4
+ /**
5
+ * `looply source` — hand a document to the project from the machine that holds it.
6
+ *
7
+ * ─────────────────────────────────────────────────────────────────────────────
8
+ * WHY THIS IS A CLI VERB AND NOT A PHONE SCREEN
9
+ *
10
+ * A plan lives beside the repository, on the developer's disk. Handing it over
11
+ * is a file operation, and the machine that holds the file is the natural
12
+ * caller — the same reason project creation is a machine act. The phone reads
13
+ * what was handed over; it does not type documents.
14
+ *
15
+ * ⚠️ LOCAL REFUSALS COME FIRST. The kind is decided from the extension, the
16
+ * file is read, and the same `whyUnreadable` and size bound the server applies
17
+ * are applied HERE, before pairing is even looked at — so a person gets the
18
+ * real answer ("no text layer", "this file has a NUL byte") without a network
19
+ * round trip, and an unpaired machine is told to pair only when the document
20
+ * itself was fine.
21
+ *
22
+ * A PDF is read HERE, on the machine that holds it (`pdf-text.ts`): its text
23
+ * layer goes to the server page by page, and the file's own sha256 travels
24
+ * beside it as provenance. A scanned PDF — no text layer — is refused with
25
+ * the reason, never sent as an empty document.
26
+ *
27
+ * 🔴 THE CONTENT IS DATA. Nothing in this file interprets the document. The
28
+ * text goes to the server verbatim; the server derives the statements with the
29
+ * same extractor the fixture tests hold to account.
30
+ *
31
+ * `clientRef` is derived from the content's sha256, so running the command
32
+ * twice on the same file is the same request twice — the server answers with
33
+ * the source it already has and this prints "already stored".
34
+ *
35
+ * `looply source reconcile <id>` measures where each requirement stands against
36
+ * THIS repository: the project index of HEAD's tree (the same one a run
37
+ * builds) is read here, `@looply/core`'s reconciler decides — absent, a
38
+ * candidate place to look, conflicting, or blocked — and the result is handed
39
+ * over keyed by the tree. Nothing here, on the machine or on the server, says
40
+ * "implemented": that is a person's attestation with evidence, a later verb.
41
+ */
42
+ export declare const SOURCE_USAGE = "usage:\n looply source add <file> [--name <name>] hand a Markdown (.md), plain-text (.txt) or PDF (.pdf, with a text layer) document to this project\n looply source list what this project has been given\n looply source show <id> one source: its statements, what each one IS, where it came from, and where each requirement stands\n looply source reconcile <id> measure where each requirement stands against this repository (HEAD's tree), and record it\n looply source coverage <id> which requirements no goal serves, which are served, and which a person evidenced\n looply source plan <id> [--dry-run] propose goals from this document\u2019s requirements, grouped by its headings, and set them\n looply source verdict <id> the final verdict on the integrated tree: COMPLETE, or every unmet requirement\n";
43
+ /** Exit codes, in the sysexits tradition the rest of the CLI follows for 64. */
44
+ export declare const EXIT: {
45
+ readonly ok: 0;
46
+ readonly refused: 1;
47
+ readonly usage: 64;
48
+ readonly unreadable: 65;
49
+ readonly noInput: 66;
50
+ readonly unavailable: 69;
51
+ };
52
+ export type Identity = {
53
+ kind: 'unpaired';
54
+ } | {
55
+ kind: 'unregistered';
56
+ } | {
57
+ kind: 'ok';
58
+ serverUrl: string;
59
+ token: string;
60
+ projectId: string;
61
+ };
62
+ export interface SourceClient {
63
+ createSource(projectId: string, input: {
64
+ clientRef: string;
65
+ name: string;
66
+ kind: SourceKind;
67
+ content?: string;
68
+ pages?: {
69
+ page: number;
70
+ text: string;
71
+ }[];
72
+ originSha256?: string;
73
+ }): Promise<{
74
+ source: Source;
75
+ statements: SourceStatement[];
76
+ deduplicated: boolean;
77
+ }>;
78
+ sources(projectId: string): Promise<{
79
+ sources: Omit<Source, 'content'>[];
80
+ }>;
81
+ sourceDetail(projectId: string, sourceId: string): Promise<SourceDetail>;
82
+ reconcileSource(projectId: string, sourceId: string, input: {
83
+ treeSha: string;
84
+ reconcilerVersion: number;
85
+ dispositions: Disposition[];
86
+ }): Promise<{
87
+ dispositions: Disposition[];
88
+ treeSha: string;
89
+ reconcilerVersion: number;
90
+ created: boolean;
91
+ }>;
92
+ coverage(projectId: string, sourceId: string): Promise<SourceCoverage>;
93
+ createGoal(projectId: string, input: {
94
+ clientRef: string;
95
+ text: string;
96
+ dependsOn?: readonly string[];
97
+ surfaces?: readonly string[];
98
+ requirements?: readonly {
99
+ sourceId: string;
100
+ ordinal: number;
101
+ }[];
102
+ }): Promise<{
103
+ goal: {
104
+ id: string;
105
+ };
106
+ deduplicated: boolean;
107
+ }>;
108
+ }
109
+ /** What is covered and by whom, as the server answers it. */
110
+ export interface SourceCoverage {
111
+ sourceId: string;
112
+ name: string;
113
+ reconciledAt: {
114
+ treeSha: string;
115
+ reconcilerVersion: number;
116
+ createdAt: string;
117
+ } | null;
118
+ requirements: RequirementCoverage[];
119
+ tally: Record<CoverageKind, number>;
120
+ }
121
+ /** What the server answers for one source. */
122
+ export interface SourceDetail {
123
+ source: Source;
124
+ statements: SourceStatement[];
125
+ classifications: Classification[];
126
+ classifierVersion: number | null;
127
+ dispositions: Disposition[];
128
+ reconciledAt: {
129
+ treeSha: string;
130
+ reconcilerVersion: number;
131
+ createdAt: string;
132
+ } | null;
133
+ /** What people attested — the latest per statement. Read here; never written from the machine. */
134
+ attestations: Attestation[];
135
+ }
136
+ /** HEAD's tree and its project index, as the machine that holds the repository can produce them. */
137
+ export type IndexAtHead = {
138
+ ok: true;
139
+ treeSha: string;
140
+ snapshot: ProjectIndexSnapshot;
141
+ cached: boolean;
142
+ } | {
143
+ ok: false;
144
+ because: string;
145
+ };
146
+ export interface SourceCmdDeps {
147
+ cwd: () => string;
148
+ /** Reads a file as UTF-8; throws when it cannot. */
149
+ readFile: (absolutePath: string) => string;
150
+ /** Reads a file's bytes; throws when it cannot. */
151
+ readBytes: (absolutePath: string) => Uint8Array;
152
+ /** The PDF reader (a child process in production; a fake in tests). */
153
+ pdfPages: (bytes: Uint8Array) => Promise<PdfTextResult>;
154
+ identity: () => Identity;
155
+ /** The repository's index at HEAD (built or cached, as a run does it), or why there is none. */
156
+ index: (cwd: string) => Promise<IndexAtHead>;
157
+ client: (serverUrl: string, token: string) => SourceClient;
158
+ out: (line: string) => void;
159
+ err: (line: string) => void;
160
+ /** F32: the integration lane, git and the server, for the final verdict. Absent: this build cannot judge. */
161
+ verdict?: (cwd: string, who: {
162
+ readonly serverUrl: string;
163
+ readonly token: string;
164
+ readonly projectId: string;
165
+ }) => VerdictDeps;
166
+ }
167
+ /** Which kind a file is, decided from its extension alone — and by name what it is not. */
168
+ export declare function kindForFile(path: string): {
169
+ ok: true;
170
+ kind: SourceKind;
171
+ } | {
172
+ ok: false;
173
+ because: string;
174
+ };
175
+ /** The idempotency key for a document: its own bytes. */
176
+ export declare function clientRefFor(sha256: string): string;
177
+ export declare function sourceCommand(argv: string[], deps: SourceCmdDeps): Promise<number>;
178
+ /** Where a statement is, in the reader's own terms: `p2 L4-5` for a pdf, `L7` otherwise. */
179
+ export declare function anchorLabel(s: SourceStatement): string;
180
+ /** Where a requirement stands, on one line under it: what was found, or why nothing could be said. */
181
+ export declare function dispositionLabel(d: Disposition): string;
182
+ /** A person's word, on one line: what they said, who, at which tree, and the first place they pointed at. */
183
+ export declare function attestationLabel(a: Attestation, earlierTree: boolean): string;
184
+ /**
185
+ * One source, as a person reads it: requirements first (what is forbidden
186
+ * marked as such), then constraints, questions, exclusions (which need
187
+ * authority), duplicates pointing at their first occurrence, and how much is
188
+ * context. Every line carries its anchor so the document can be opened to it;
189
+ * every requirement and constraint carries where it stands against the
190
+ * repository, when that was measured.
191
+ */
192
+ export declare function renderSource(detail: SourceDetail): string[];
193
+ /**
194
+ * What is covered and by whom, as a person reads it: what NOBODY serves first,
195
+ * then what is served but not yet evidenced, then partial, then evidenced —
196
+ * each with its anchor and the goals that name it. Nothing here counts a
197
+ * finished queue as coverage.
198
+ */
199
+ export declare function renderCoverage(c: SourceCoverage): string[];
200
+ export declare function nodeSourceDeps(): SourceCmdDeps;
201
+ //# sourceMappingURL=source-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-cmd.d.ts","sourceRoot":"","sources":["../src/source-cmd.ts"],"names":[],"mappings":"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"}