looply-cli 0.0.0-stage → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (793) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -3
  3. package/dist/.src-hash +1 -0
  4. package/dist/acceptance-observe.d.ts +108 -0
  5. package/dist/acceptance-observe.d.ts.map +1 -0
  6. package/dist/acceptance-observe.js +152 -0
  7. package/dist/acceptance-observe.js.map +1 -0
  8. package/dist/agent-cmd.d.ts +131 -0
  9. package/dist/agent-cmd.d.ts.map +1 -0
  10. package/dist/agent-cmd.js +154 -0
  11. package/dist/agent-cmd.js.map +1 -0
  12. package/dist/agent-contained.d.ts +114 -0
  13. package/dist/agent-contained.d.ts.map +1 -0
  14. package/dist/agent-contained.js +292 -0
  15. package/dist/agent-contained.js.map +1 -0
  16. package/dist/agent-driver.d.ts +130 -0
  17. package/dist/agent-driver.d.ts.map +1 -0
  18. package/dist/agent-driver.js +170 -0
  19. package/dist/agent-driver.js.map +1 -0
  20. package/dist/agent-envelope.d.ts +94 -0
  21. package/dist/agent-envelope.d.ts.map +1 -0
  22. package/dist/agent-envelope.js +214 -0
  23. package/dist/agent-envelope.js.map +1 -0
  24. package/dist/agent-exec.d.ts +182 -0
  25. package/dist/agent-exec.d.ts.map +1 -0
  26. package/dist/agent-exec.js +125 -0
  27. package/dist/agent-exec.js.map +1 -0
  28. package/dist/agent-runtime.d.ts +23 -0
  29. package/dist/agent-runtime.d.ts.map +1 -0
  30. package/dist/agent-runtime.js +143 -0
  31. package/dist/agent-runtime.js.map +1 -0
  32. package/dist/approval-gate-read.d.ts +66 -0
  33. package/dist/approval-gate-read.d.ts.map +1 -0
  34. package/dist/approval-gate-read.js +138 -0
  35. package/dist/approval-gate-read.js.map +1 -0
  36. package/dist/approval-resolution.d.ts +87 -0
  37. package/dist/approval-resolution.d.ts.map +1 -0
  38. package/dist/approval-resolution.js +100 -0
  39. package/dist/approval-resolution.js.map +1 -0
  40. package/dist/approval-resumes.d.ts +102 -0
  41. package/dist/approval-resumes.d.ts.map +1 -0
  42. package/dist/approval-resumes.js +167 -0
  43. package/dist/approval-resumes.js.map +1 -0
  44. package/dist/ask-brain.d.ts +167 -0
  45. package/dist/ask-brain.d.ts.map +1 -0
  46. package/dist/ask-brain.js +355 -0
  47. package/dist/ask-brain.js.map +1 -0
  48. package/dist/autonomy-authority.d.ts +80 -0
  49. package/dist/autonomy-authority.d.ts.map +1 -0
  50. package/dist/autonomy-authority.js +82 -0
  51. package/dist/autonomy-authority.js.map +1 -0
  52. package/dist/autonomy-controller.d.ts +321 -0
  53. package/dist/autonomy-controller.d.ts.map +1 -0
  54. package/dist/autonomy-controller.js +517 -0
  55. package/dist/autonomy-controller.js.map +1 -0
  56. package/dist/autonomy-store.d.ts +327 -0
  57. package/dist/autonomy-store.d.ts.map +1 -0
  58. package/dist/autonomy-store.js +581 -0
  59. package/dist/autonomy-store.js.map +1 -0
  60. package/dist/autonomy-tick.d.ts +257 -0
  61. package/dist/autonomy-tick.d.ts.map +1 -0
  62. package/dist/autonomy-tick.js +616 -0
  63. package/dist/autonomy-tick.js.map +1 -0
  64. package/dist/bin.d.ts +3 -0
  65. package/dist/bin.d.ts.map +1 -0
  66. package/dist/bin.js +2727 -0
  67. package/dist/bin.js.map +1 -0
  68. package/dist/brain-advice.d.ts +21 -0
  69. package/dist/brain-advice.d.ts.map +1 -0
  70. package/dist/brain-advice.js +51 -0
  71. package/dist/brain-advice.js.map +1 -0
  72. package/dist/candidate-replay-runtime.d.ts +125 -0
  73. package/dist/candidate-replay-runtime.d.ts.map +1 -0
  74. package/dist/candidate-replay-runtime.js +188 -0
  75. package/dist/candidate-replay-runtime.js.map +1 -0
  76. package/dist/checkout-carry.d.ts +76 -0
  77. package/dist/checkout-carry.d.ts.map +1 -0
  78. package/dist/checkout-carry.js +125 -0
  79. package/dist/checkout-carry.js.map +1 -0
  80. package/dist/citation-readers.d.ts +26 -0
  81. package/dist/citation-readers.d.ts.map +1 -0
  82. package/dist/citation-readers.js +102 -0
  83. package/dist/citation-readers.js.map +1 -0
  84. package/dist/command-receipts.d.ts +79 -0
  85. package/dist/command-receipts.d.ts.map +1 -0
  86. package/dist/command-receipts.js +143 -0
  87. package/dist/command-receipts.js.map +1 -0
  88. package/dist/command-runner.d.ts +32 -0
  89. package/dist/command-runner.d.ts.map +1 -0
  90. package/dist/command-runner.js +108 -0
  91. package/dist/command-runner.js.map +1 -0
  92. package/dist/compatible-sets.d.ts +67 -0
  93. package/dist/compatible-sets.d.ts.map +1 -0
  94. package/dist/compatible-sets.js +81 -0
  95. package/dist/compatible-sets.js.map +1 -0
  96. package/dist/compile-check.d.ts +31 -0
  97. package/dist/compile-check.d.ts.map +1 -0
  98. package/dist/compile-check.js +34 -0
  99. package/dist/compile-check.js.map +1 -0
  100. package/dist/compile-store.d.ts +16 -0
  101. package/dist/compile-store.d.ts.map +1 -0
  102. package/dist/compile-store.js +21 -0
  103. package/dist/compile-store.js.map +1 -0
  104. package/dist/completion.d.ts +106 -0
  105. package/dist/completion.d.ts.map +1 -0
  106. package/dist/completion.js +131 -0
  107. package/dist/completion.js.map +1 -0
  108. package/dist/config.d.ts +549 -0
  109. package/dist/config.d.ts.map +1 -0
  110. package/dist/config.js +763 -0
  111. package/dist/config.js.map +1 -0
  112. package/dist/control-file.d.ts +142 -0
  113. package/dist/control-file.d.ts.map +1 -0
  114. package/dist/control-file.js +144 -0
  115. package/dist/control-file.js.map +1 -0
  116. package/dist/coordinator-state.d.ts +131 -0
  117. package/dist/coordinator-state.d.ts.map +1 -0
  118. package/dist/coordinator-state.js +380 -0
  119. package/dist/coordinator-state.js.map +1 -0
  120. package/dist/coordinator.d.ts +95 -0
  121. package/dist/coordinator.d.ts.map +1 -0
  122. package/dist/coordinator.js +97 -0
  123. package/dist/coordinator.js.map +1 -0
  124. package/dist/cursor-store.d.ts +53 -0
  125. package/dist/cursor-store.d.ts.map +1 -0
  126. package/dist/cursor-store.js +98 -0
  127. package/dist/cursor-store.js.map +1 -0
  128. package/dist/daemon-cmd.d.ts +239 -0
  129. package/dist/daemon-cmd.d.ts.map +1 -0
  130. package/dist/daemon-cmd.js +1751 -0
  131. package/dist/daemon-cmd.js.map +1 -0
  132. package/dist/daemon-lock.d.ts +140 -0
  133. package/dist/daemon-lock.d.ts.map +1 -0
  134. package/dist/daemon-lock.js +352 -0
  135. package/dist/daemon-lock.js.map +1 -0
  136. package/dist/daemon-recovery.d.ts +78 -0
  137. package/dist/daemon-recovery.d.ts.map +1 -0
  138. package/dist/daemon-recovery.js +161 -0
  139. package/dist/daemon-recovery.js.map +1 -0
  140. package/dist/daemon.d.ts +368 -0
  141. package/dist/daemon.d.ts.map +1 -0
  142. package/dist/daemon.js +601 -0
  143. package/dist/daemon.js.map +1 -0
  144. package/dist/declared-response-shape.d.ts +93 -0
  145. package/dist/declared-response-shape.d.ts.map +1 -0
  146. package/dist/declared-response-shape.js +200 -0
  147. package/dist/declared-response-shape.js.map +1 -0
  148. package/dist/declared-surfaces.d.ts +16 -0
  149. package/dist/declared-surfaces.d.ts.map +1 -0
  150. package/dist/declared-surfaces.js +19 -0
  151. package/dist/declared-surfaces.js.map +1 -0
  152. package/dist/depends-review.d.ts +113 -0
  153. package/dist/depends-review.d.ts.map +1 -0
  154. package/dist/depends-review.js +110 -0
  155. package/dist/depends-review.js.map +1 -0
  156. package/dist/doctor.d.ts +91 -0
  157. package/dist/doctor.d.ts.map +1 -0
  158. package/dist/doctor.js +71 -0
  159. package/dist/doctor.js.map +1 -0
  160. package/dist/edge-approval.d.ts +105 -0
  161. package/dist/edge-approval.d.ts.map +1 -0
  162. package/dist/edge-approval.js +100 -0
  163. package/dist/edge-approval.js.map +1 -0
  164. package/dist/evidence-cache.d.ts +45 -0
  165. package/dist/evidence-cache.d.ts.map +1 -0
  166. package/dist/evidence-cache.js +90 -0
  167. package/dist/evidence-cache.js.map +1 -0
  168. package/dist/evidence-cmd.d.ts +133 -0
  169. package/dist/evidence-cmd.d.ts.map +1 -0
  170. package/dist/evidence-cmd.js +347 -0
  171. package/dist/evidence-cmd.js.map +1 -0
  172. package/dist/evidence-facts.d.ts +40 -0
  173. package/dist/evidence-facts.d.ts.map +1 -0
  174. package/dist/evidence-facts.js +114 -0
  175. package/dist/evidence-facts.js.map +1 -0
  176. package/dist/exclusive-lock.d.ts +52 -0
  177. package/dist/exclusive-lock.d.ts.map +1 -0
  178. package/dist/exclusive-lock.js +150 -0
  179. package/dist/exclusive-lock.js.map +1 -0
  180. package/dist/exec-domains.d.ts +140 -0
  181. package/dist/exec-domains.d.ts.map +1 -0
  182. package/dist/exec-domains.js +287 -0
  183. package/dist/exec-domains.js.map +1 -0
  184. package/dist/exemption-store.d.ts +197 -0
  185. package/dist/exemption-store.d.ts.map +1 -0
  186. package/dist/exemption-store.js +266 -0
  187. package/dist/exemption-store.js.map +1 -0
  188. package/dist/explicit-start-gate.d.ts +96 -0
  189. package/dist/explicit-start-gate.d.ts.map +1 -0
  190. package/dist/explicit-start-gate.js +103 -0
  191. package/dist/explicit-start-gate.js.map +1 -0
  192. package/dist/fs-trouble.d.ts +70 -0
  193. package/dist/fs-trouble.d.ts.map +1 -0
  194. package/dist/fs-trouble.js +98 -0
  195. package/dist/fs-trouble.js.map +1 -0
  196. package/dist/gate.d.ts +278 -0
  197. package/dist/gate.d.ts.map +1 -0
  198. package/dist/gate.js +278 -0
  199. package/dist/gate.js.map +1 -0
  200. package/dist/git-driver.d.ts +519 -0
  201. package/dist/git-driver.d.ts.map +1 -0
  202. package/dist/git-driver.js +900 -0
  203. package/dist/git-driver.js.map +1 -0
  204. package/dist/git-push-executor.d.ts +41 -0
  205. package/dist/git-push-executor.d.ts.map +1 -0
  206. package/dist/git-push-executor.js +142 -0
  207. package/dist/git-push-executor.js.map +1 -0
  208. package/dist/glob.d.ts +26 -0
  209. package/dist/glob.d.ts.map +1 -0
  210. package/dist/glob.js +93 -0
  211. package/dist/glob.js.map +1 -0
  212. package/dist/goal-adaptive.d.ts +295 -0
  213. package/dist/goal-adaptive.d.ts.map +1 -0
  214. package/dist/goal-adaptive.js +393 -0
  215. package/dist/goal-adaptive.js.map +1 -0
  216. package/dist/goal-compile.d.ts +342 -0
  217. package/dist/goal-compile.d.ts.map +1 -0
  218. package/dist/goal-compile.js +444 -0
  219. package/dist/goal-compile.js.map +1 -0
  220. package/dist/goal-depends-executor.d.ts +55 -0
  221. package/dist/goal-depends-executor.d.ts.map +1 -0
  222. package/dist/goal-depends-executor.js +202 -0
  223. package/dist/goal-depends-executor.js.map +1 -0
  224. package/dist/goal-execution-evidence.d.ts +135 -0
  225. package/dist/goal-execution-evidence.d.ts.map +1 -0
  226. package/dist/goal-execution-evidence.js +159 -0
  227. package/dist/goal-execution-evidence.js.map +1 -0
  228. package/dist/goal-gap.d.ts +140 -0
  229. package/dist/goal-gap.d.ts.map +1 -0
  230. package/dist/goal-gap.js +197 -0
  231. package/dist/goal-gap.js.map +1 -0
  232. package/dist/goal-met-target.d.ts +98 -0
  233. package/dist/goal-met-target.d.ts.map +1 -0
  234. package/dist/goal-met-target.js +92 -0
  235. package/dist/goal-met-target.js.map +1 -0
  236. package/dist/goal-ownership.d.ts +416 -0
  237. package/dist/goal-ownership.d.ts.map +1 -0
  238. package/dist/goal-ownership.js +576 -0
  239. package/dist/goal-ownership.js.map +1 -0
  240. package/dist/goal-runs.d.ts +82 -0
  241. package/dist/goal-runs.d.ts.map +1 -0
  242. package/dist/goal-runs.js +120 -0
  243. package/dist/goal-runs.js.map +1 -0
  244. package/dist/goal-store.d.ts +146 -0
  245. package/dist/goal-store.d.ts.map +1 -0
  246. package/dist/goal-store.js +294 -0
  247. package/dist/goal-store.js.map +1 -0
  248. package/dist/goal-view.d.ts +156 -0
  249. package/dist/goal-view.d.ts.map +1 -0
  250. package/dist/goal-view.js +499 -0
  251. package/dist/goal-view.js.map +1 -0
  252. package/dist/governed-approvals.d.ts +152 -0
  253. package/dist/governed-approvals.d.ts.map +1 -0
  254. package/dist/governed-approvals.js +246 -0
  255. package/dist/governed-approvals.js.map +1 -0
  256. package/dist/governed-broker.d.ts +169 -0
  257. package/dist/governed-broker.d.ts.map +1 -0
  258. package/dist/governed-broker.js +196 -0
  259. package/dist/governed-broker.js.map +1 -0
  260. package/dist/governed-run.d.ts +220 -0
  261. package/dist/governed-run.d.ts.map +1 -0
  262. package/dist/governed-run.js +406 -0
  263. package/dist/governed-run.js.map +1 -0
  264. package/dist/grant-reconcile.d.ts +63 -0
  265. package/dist/grant-reconcile.d.ts.map +1 -0
  266. package/dist/grant-reconcile.js +121 -0
  267. package/dist/grant-reconcile.js.map +1 -0
  268. package/dist/index-for-head.d.ts +56 -0
  269. package/dist/index-for-head.d.ts.map +1 -0
  270. package/dist/index-for-head.js +103 -0
  271. package/dist/index-for-head.js.map +1 -0
  272. package/dist/index.d.ts +39 -0
  273. package/dist/index.d.ts.map +1 -0
  274. package/dist/index.js +55 -0
  275. package/dist/index.js.map +1 -0
  276. package/dist/init-detect.d.ts +39 -0
  277. package/dist/init-detect.d.ts.map +1 -0
  278. package/dist/init-detect.js +188 -0
  279. package/dist/init-detect.js.map +1 -0
  280. package/dist/integration-deps.d.ts +62 -0
  281. package/dist/integration-deps.d.ts.map +1 -0
  282. package/dist/integration-deps.js +251 -0
  283. package/dist/integration-deps.js.map +1 -0
  284. package/dist/integration-runtime.d.ts +458 -0
  285. package/dist/integration-runtime.d.ts.map +1 -0
  286. package/dist/integration-runtime.js +681 -0
  287. package/dist/integration-runtime.js.map +1 -0
  288. package/dist/integration.d.ts +45 -0
  289. package/dist/integration.d.ts.map +1 -0
  290. package/dist/integration.js +87 -0
  291. package/dist/integration.js.map +1 -0
  292. package/dist/integrator.d.ts +84 -0
  293. package/dist/integrator.d.ts.map +1 -0
  294. package/dist/integrator.js +193 -0
  295. package/dist/integrator.js.map +1 -0
  296. package/dist/lane-claims.d.ts +174 -0
  297. package/dist/lane-claims.d.ts.map +1 -0
  298. package/dist/lane-claims.js +218 -0
  299. package/dist/lane-claims.js.map +1 -0
  300. package/dist/lane-coverage.d.ts +87 -0
  301. package/dist/lane-coverage.d.ts.map +1 -0
  302. package/dist/lane-coverage.js +129 -0
  303. package/dist/lane-coverage.js.map +1 -0
  304. package/dist/ledger-replay.d.ts +115 -0
  305. package/dist/ledger-replay.d.ts.map +1 -0
  306. package/dist/ledger-replay.js +155 -0
  307. package/dist/ledger-replay.js.map +1 -0
  308. package/dist/ledger-store.d.ts +68 -0
  309. package/dist/ledger-store.d.ts.map +1 -0
  310. package/dist/ledger-store.js +111 -0
  311. package/dist/ledger-store.js.map +1 -0
  312. package/dist/loop-safety-observer.d.ts +132 -0
  313. package/dist/loop-safety-observer.d.ts.map +1 -0
  314. package/dist/loop-safety-observer.js +76 -0
  315. package/dist/loop-safety-observer.js.map +1 -0
  316. package/dist/loop-safety-store.d.ts +339 -0
  317. package/dist/loop-safety-store.d.ts.map +1 -0
  318. package/dist/loop-safety-store.js +800 -0
  319. package/dist/loop-safety-store.js.map +1 -0
  320. package/dist/machine-store.d.ts +54 -0
  321. package/dist/machine-store.d.ts.map +1 -0
  322. package/dist/machine-store.js +149 -0
  323. package/dist/machine-store.js.map +1 -0
  324. package/dist/mcp-main.d.ts +2 -0
  325. package/dist/mcp-main.d.ts.map +1 -0
  326. package/dist/mcp-main.js +116 -0
  327. package/dist/mcp-main.js.map +1 -0
  328. package/dist/mcp-server.d.ts +72 -0
  329. package/dist/mcp-server.d.ts.map +1 -0
  330. package/dist/mcp-server.js +259 -0
  331. package/dist/mcp-server.js.map +1 -0
  332. package/dist/model-routing.d.ts +75 -0
  333. package/dist/model-routing.d.ts.map +1 -0
  334. package/dist/model-routing.js +108 -0
  335. package/dist/model-routing.js.map +1 -0
  336. package/dist/model-transport.d.ts +188 -0
  337. package/dist/model-transport.d.ts.map +1 -0
  338. package/dist/model-transport.js +625 -0
  339. package/dist/model-transport.js.map +1 -0
  340. package/dist/notify-cadence.d.ts +55 -0
  341. package/dist/notify-cadence.d.ts.map +1 -0
  342. package/dist/notify-cadence.js +68 -0
  343. package/dist/notify-cadence.js.map +1 -0
  344. package/dist/notify-channel.d.ts +69 -0
  345. package/dist/notify-channel.d.ts.map +1 -0
  346. package/dist/notify-channel.js +151 -0
  347. package/dist/notify-channel.js.map +1 -0
  348. package/dist/notify.d.ts +71 -0
  349. package/dist/notify.d.ts.map +1 -0
  350. package/dist/notify.js +125 -0
  351. package/dist/notify.js.map +1 -0
  352. package/dist/observation-inventory.d.ts +65 -0
  353. package/dist/observation-inventory.d.ts.map +1 -0
  354. package/dist/observation-inventory.js +139 -0
  355. package/dist/observation-inventory.js.map +1 -0
  356. package/dist/owned-children.d.ts +45 -0
  357. package/dist/owned-children.d.ts.map +1 -0
  358. package/dist/owned-children.js +64 -0
  359. package/dist/owned-children.js.map +1 -0
  360. package/dist/packet-for-goal.d.ts +19 -0
  361. package/dist/packet-for-goal.d.ts.map +1 -0
  362. package/dist/packet-for-goal.js +32 -0
  363. package/dist/packet-for-goal.js.map +1 -0
  364. package/dist/pair-cmd.d.ts +85 -0
  365. package/dist/pair-cmd.d.ts.map +1 -0
  366. package/dist/pair-cmd.js +205 -0
  367. package/dist/pair-cmd.js.map +1 -0
  368. package/dist/partial-asker.d.ts +96 -0
  369. package/dist/partial-asker.d.ts.map +1 -0
  370. package/dist/partial-asker.js +117 -0
  371. package/dist/partial-asker.js.map +1 -0
  372. package/dist/pdf-text-lines.d.ts +17 -0
  373. package/dist/pdf-text-lines.d.ts.map +1 -0
  374. package/dist/pdf-text-lines.js +70 -0
  375. package/dist/pdf-text-lines.js.map +1 -0
  376. package/dist/pdf-text-worker.d.ts +2 -0
  377. package/dist/pdf-text-worker.d.ts.map +1 -0
  378. package/dist/pdf-text-worker.js +81 -0
  379. package/dist/pdf-text-worker.js.map +1 -0
  380. package/dist/pdf-text.d.ts +56 -0
  381. package/dist/pdf-text.d.ts.map +1 -0
  382. package/dist/pdf-text.js +64 -0
  383. package/dist/pdf-text.js.map +1 -0
  384. package/dist/pending-action.d.ts +154 -0
  385. package/dist/pending-action.d.ts.map +1 -0
  386. package/dist/pending-action.js +148 -0
  387. package/dist/pending-action.js.map +1 -0
  388. package/dist/preemptor.d.ts +40 -0
  389. package/dist/preemptor.d.ts.map +1 -0
  390. package/dist/preemptor.js +49 -0
  391. package/dist/preemptor.js.map +1 -0
  392. package/dist/programme-mode.d.ts +29 -0
  393. package/dist/programme-mode.d.ts.map +1 -0
  394. package/dist/programme-mode.js +50 -0
  395. package/dist/programme-mode.js.map +1 -0
  396. package/dist/progress-view.d.ts +14 -0
  397. package/dist/progress-view.d.ts.map +1 -0
  398. package/dist/progress-view.js +114 -0
  399. package/dist/progress-view.js.map +1 -0
  400. package/dist/project-graph-builder.d.ts +81 -0
  401. package/dist/project-graph-builder.d.ts.map +1 -0
  402. package/dist/project-graph-builder.js +246 -0
  403. package/dist/project-graph-builder.js.map +1 -0
  404. package/dist/project-graph-runtime.d.ts +86 -0
  405. package/dist/project-graph-runtime.d.ts.map +1 -0
  406. package/dist/project-graph-runtime.js +112 -0
  407. package/dist/project-graph-runtime.js.map +1 -0
  408. package/dist/project-index-builder.d.ts +96 -0
  409. package/dist/project-index-builder.d.ts.map +1 -0
  410. package/dist/project-index-builder.js +298 -0
  411. package/dist/project-index-builder.js.map +1 -0
  412. package/dist/project-index-facts.d.ts +51 -0
  413. package/dist/project-index-facts.d.ts.map +1 -0
  414. package/dist/project-index-facts.js +117 -0
  415. package/dist/project-index-facts.js.map +1 -0
  416. package/dist/project-index-store.d.ts +97 -0
  417. package/dist/project-index-store.d.ts.map +1 -0
  418. package/dist/project-index-store.js +140 -0
  419. package/dist/project-index-store.js.map +1 -0
  420. package/dist/project-memory-store.d.ts +127 -0
  421. package/dist/project-memory-store.d.ts.map +1 -0
  422. package/dist/project-memory-store.js +302 -0
  423. package/dist/project-memory-store.js.map +1 -0
  424. package/dist/proposal-store.d.ts +14 -0
  425. package/dist/proposal-store.d.ts.map +1 -0
  426. package/dist/proposal-store.js +19 -0
  427. package/dist/proposal-store.js.map +1 -0
  428. package/dist/prover.d.ts +80 -0
  429. package/dist/prover.d.ts.map +1 -0
  430. package/dist/prover.js +137 -0
  431. package/dist/prover.js.map +1 -0
  432. package/dist/provider-identity-store.d.ts +34 -0
  433. package/dist/provider-identity-store.d.ts.map +1 -0
  434. package/dist/provider-identity-store.js +72 -0
  435. package/dist/provider-identity-store.js.map +1 -0
  436. package/dist/provider-identity.d.ts +104 -0
  437. package/dist/provider-identity.d.ts.map +1 -0
  438. package/dist/provider-identity.js +167 -0
  439. package/dist/provider-identity.js.map +1 -0
  440. package/dist/provider-limit.d.ts +79 -0
  441. package/dist/provider-limit.d.ts.map +1 -0
  442. package/dist/provider-limit.js +148 -0
  443. package/dist/provider-limit.js.map +1 -0
  444. package/dist/provider-preflight.d.ts +171 -0
  445. package/dist/provider-preflight.d.ts.map +1 -0
  446. package/dist/provider-preflight.js +395 -0
  447. package/dist/provider-preflight.js.map +1 -0
  448. package/dist/provider-state.d.ts +120 -0
  449. package/dist/provider-state.d.ts.map +1 -0
  450. package/dist/provider-state.js +182 -0
  451. package/dist/provider-state.js.map +1 -0
  452. package/dist/providers.d.ts +132 -0
  453. package/dist/providers.d.ts.map +1 -0
  454. package/dist/providers.js +161 -0
  455. package/dist/providers.js.map +1 -0
  456. package/dist/publication-recorder.d.ts +117 -0
  457. package/dist/publication-recorder.d.ts.map +1 -0
  458. package/dist/publication-recorder.js +124 -0
  459. package/dist/publication-recorder.js.map +1 -0
  460. package/dist/pursuit-delivery.d.ts +24 -0
  461. package/dist/pursuit-delivery.d.ts.map +1 -0
  462. package/dist/pursuit-delivery.js +38 -0
  463. package/dist/pursuit-delivery.js.map +1 -0
  464. package/dist/queue-store.d.ts +132 -0
  465. package/dist/queue-store.d.ts.map +1 -0
  466. package/dist/queue-store.js +185 -0
  467. package/dist/queue-store.js.map +1 -0
  468. package/dist/queue-summary.d.ts +14 -0
  469. package/dist/queue-summary.d.ts.map +1 -0
  470. package/dist/queue-summary.js +82 -0
  471. package/dist/queue-summary.js.map +1 -0
  472. package/dist/queue-view.d.ts +20 -0
  473. package/dist/queue-view.d.ts.map +1 -0
  474. package/dist/queue-view.js +163 -0
  475. package/dist/queue-view.js.map +1 -0
  476. package/dist/queue-write-lease.d.ts +106 -0
  477. package/dist/queue-write-lease.d.ts.map +1 -0
  478. package/dist/queue-write-lease.js +282 -0
  479. package/dist/queue-write-lease.js.map +1 -0
  480. package/dist/rails-home.d.ts +162 -0
  481. package/dist/rails-home.d.ts.map +1 -0
  482. package/dist/rails-home.js +452 -0
  483. package/dist/rails-home.js.map +1 -0
  484. package/dist/rails-migrations.d.ts +75 -0
  485. package/dist/rails-migrations.d.ts.map +1 -0
  486. package/dist/rails-migrations.js +199 -0
  487. package/dist/rails-migrations.js.map +1 -0
  488. package/dist/rails-stores.d.ts +49 -0
  489. package/dist/rails-stores.d.ts.map +1 -0
  490. package/dist/rails-stores.js +100 -0
  491. package/dist/rails-stores.js.map +1 -0
  492. package/dist/reaper.d.ts +69 -0
  493. package/dist/reaper.d.ts.map +1 -0
  494. package/dist/reaper.js +152 -0
  495. package/dist/reaper.js.map +1 -0
  496. package/dist/record-store.d.ts +36 -0
  497. package/dist/record-store.d.ts.map +1 -0
  498. package/dist/record-store.js +78 -0
  499. package/dist/record-store.js.map +1 -0
  500. package/dist/recovery-io.d.ts +50 -0
  501. package/dist/recovery-io.d.ts.map +1 -0
  502. package/dist/recovery-io.js +122 -0
  503. package/dist/recovery-io.js.map +1 -0
  504. package/dist/recovery.d.ts +146 -0
  505. package/dist/recovery.d.ts.map +1 -0
  506. package/dist/recovery.js +110 -0
  507. package/dist/recovery.js.map +1 -0
  508. package/dist/redraw.d.ts +34 -0
  509. package/dist/redraw.d.ts.map +1 -0
  510. package/dist/redraw.js +62 -0
  511. package/dist/redraw.js.map +1 -0
  512. package/dist/rejected-evidence.d.ts +255 -0
  513. package/dist/rejected-evidence.d.ts.map +1 -0
  514. package/dist/rejected-evidence.js +324 -0
  515. package/dist/rejected-evidence.js.map +1 -0
  516. package/dist/report-cmd.d.ts +32 -0
  517. package/dist/report-cmd.d.ts.map +1 -0
  518. package/dist/report-cmd.js +201 -0
  519. package/dist/report-cmd.js.map +1 -0
  520. package/dist/repos-cmd.d.ts +80 -0
  521. package/dist/repos-cmd.d.ts.map +1 -0
  522. package/dist/repos-cmd.js +240 -0
  523. package/dist/repos-cmd.js.map +1 -0
  524. package/dist/request-body-shape.d.ts +93 -0
  525. package/dist/request-body-shape.d.ts.map +1 -0
  526. package/dist/request-body-shape.js +407 -0
  527. package/dist/request-body-shape.js.map +1 -0
  528. package/dist/requirement-claims.d.ts +89 -0
  529. package/dist/requirement-claims.d.ts.map +1 -0
  530. package/dist/requirement-claims.js +92 -0
  531. package/dist/requirement-claims.js.map +1 -0
  532. package/dist/retention-apply-runtime.d.ts +105 -0
  533. package/dist/retention-apply-runtime.d.ts.map +1 -0
  534. package/dist/retention-apply-runtime.js +269 -0
  535. package/dist/retention-apply-runtime.js.map +1 -0
  536. package/dist/reverify.d.ts +41 -0
  537. package/dist/reverify.d.ts.map +1 -0
  538. package/dist/reverify.js +69 -0
  539. package/dist/reverify.js.map +1 -0
  540. package/dist/round-records.d.ts +65 -0
  541. package/dist/round-records.d.ts.map +1 -0
  542. package/dist/round-records.js +61 -0
  543. package/dist/round-records.js.map +1 -0
  544. package/dist/round-runner.d.ts +924 -0
  545. package/dist/round-runner.d.ts.map +1 -0
  546. package/dist/round-runner.js +1693 -0
  547. package/dist/round-runner.js.map +1 -0
  548. package/dist/run-approval.d.ts +180 -0
  549. package/dist/run-approval.d.ts.map +1 -0
  550. package/dist/run-approval.js +199 -0
  551. package/dist/run-approval.js.map +1 -0
  552. package/dist/run-cmd.d.ts +359 -0
  553. package/dist/run-cmd.d.ts.map +1 -0
  554. package/dist/run-cmd.js +4418 -0
  555. package/dist/run-cmd.js.map +1 -0
  556. package/dist/run-delivery.d.ts +71 -0
  557. package/dist/run-delivery.d.ts.map +1 -0
  558. package/dist/run-delivery.js +104 -0
  559. package/dist/run-delivery.js.map +1 -0
  560. package/dist/run-ended.d.ts +75 -0
  561. package/dist/run-ended.d.ts.map +1 -0
  562. package/dist/run-ended.js +27 -0
  563. package/dist/run-ended.js.map +1 -0
  564. package/dist/run-ending-locator.d.ts +125 -0
  565. package/dist/run-ending-locator.d.ts.map +1 -0
  566. package/dist/run-ending-locator.js +133 -0
  567. package/dist/run-ending-locator.js.map +1 -0
  568. package/dist/run-launcher.d.ts +459 -0
  569. package/dist/run-launcher.d.ts.map +1 -0
  570. package/dist/run-launcher.js +652 -0
  571. package/dist/run-launcher.js.map +1 -0
  572. package/dist/run-lease.d.ts +208 -0
  573. package/dist/run-lease.d.ts.map +1 -0
  574. package/dist/run-lease.js +301 -0
  575. package/dist/run-lease.js.map +1 -0
  576. package/dist/run-refusal-marks.d.ts +189 -0
  577. package/dist/run-refusal-marks.d.ts.map +1 -0
  578. package/dist/run-refusal-marks.js +249 -0
  579. package/dist/run-refusal-marks.js.map +1 -0
  580. package/dist/run-start-marks.d.ts +153 -0
  581. package/dist/run-start-marks.d.ts.map +1 -0
  582. package/dist/run-start-marks.js +269 -0
  583. package/dist/run-start-marks.js.map +1 -0
  584. package/dist/scan-cmd.d.ts +14 -0
  585. package/dist/scan-cmd.d.ts.map +1 -0
  586. package/dist/scan-cmd.js +270 -0
  587. package/dist/scan-cmd.js.map +1 -0
  588. package/dist/scan-events.d.ts +50 -0
  589. package/dist/scan-events.d.ts.map +1 -0
  590. package/dist/scan-events.js +91 -0
  591. package/dist/scan-events.js.map +1 -0
  592. package/dist/scan.d.ts +191 -0
  593. package/dist/scan.d.ts.map +1 -0
  594. package/dist/scan.js +417 -0
  595. package/dist/scan.js.map +1 -0
  596. package/dist/scope-rule.d.ts +148 -0
  597. package/dist/scope-rule.d.ts.map +1 -0
  598. package/dist/scope-rule.js +121 -0
  599. package/dist/scope-rule.js.map +1 -0
  600. package/dist/self-repo-id.d.ts +18 -0
  601. package/dist/self-repo-id.d.ts.map +1 -0
  602. package/dist/self-repo-id.js +70 -0
  603. package/dist/self-repo-id.js.map +1 -0
  604. package/dist/serve-cmd.d.ts +115 -0
  605. package/dist/serve-cmd.d.ts.map +1 -0
  606. package/dist/serve-cmd.js +505 -0
  607. package/dist/serve-cmd.js.map +1 -0
  608. package/dist/serve.d.ts +167 -0
  609. package/dist/serve.d.ts.map +1 -0
  610. package/dist/serve.js +336 -0
  611. package/dist/serve.js.map +1 -0
  612. package/dist/server-client.d.ts +766 -0
  613. package/dist/server-client.d.ts.map +1 -0
  614. package/dist/server-client.js +475 -0
  615. package/dist/server-client.js.map +1 -0
  616. package/dist/session-adapter-runtime.d.ts +195 -0
  617. package/dist/session-adapter-runtime.d.ts.map +1 -0
  618. package/dist/session-adapter-runtime.js +373 -0
  619. package/dist/session-adapter-runtime.js.map +1 -0
  620. package/dist/session-checkpoint-runtime.d.ts +62 -0
  621. package/dist/session-checkpoint-runtime.d.ts.map +1 -0
  622. package/dist/session-checkpoint-runtime.js +268 -0
  623. package/dist/session-checkpoint-runtime.js.map +1 -0
  624. package/dist/session-control-transport.d.ts +106 -0
  625. package/dist/session-control-transport.d.ts.map +1 -0
  626. package/dist/session-control-transport.js +232 -0
  627. package/dist/session-control-transport.js.map +1 -0
  628. package/dist/session-observation-store.d.ts +98 -0
  629. package/dist/session-observation-store.d.ts.map +1 -0
  630. package/dist/session-observation-store.js +155 -0
  631. package/dist/session-observation-store.js.map +1 -0
  632. package/dist/session-observe-runtime.d.ts +123 -0
  633. package/dist/session-observe-runtime.d.ts.map +1 -0
  634. package/dist/session-observe-runtime.js +317 -0
  635. package/dist/session-observe-runtime.js.map +1 -0
  636. package/dist/session-store.d.ts +98 -0
  637. package/dist/session-store.d.ts.map +1 -0
  638. package/dist/session-store.js +116 -0
  639. package/dist/session-store.js.map +1 -0
  640. package/dist/sessions-cmd.d.ts +202 -0
  641. package/dist/sessions-cmd.d.ts.map +1 -0
  642. package/dist/sessions-cmd.js +609 -0
  643. package/dist/sessions-cmd.js.map +1 -0
  644. package/dist/settings-overlay.d.ts +53 -0
  645. package/dist/settings-overlay.d.ts.map +1 -0
  646. package/dist/settings-overlay.js +175 -0
  647. package/dist/settings-overlay.js.map +1 -0
  648. package/dist/setup-prompt.d.ts +34 -0
  649. package/dist/setup-prompt.d.ts.map +1 -0
  650. package/dist/setup-prompt.js +92 -0
  651. package/dist/setup-prompt.js.map +1 -0
  652. package/dist/setup.d.ts +103 -0
  653. package/dist/setup.d.ts.map +1 -0
  654. package/dist/setup.js +283 -0
  655. package/dist/setup.js.map +1 -0
  656. package/dist/shared-grants.d.ts +164 -0
  657. package/dist/shared-grants.d.ts.map +1 -0
  658. package/dist/shared-grants.js +242 -0
  659. package/dist/shared-grants.js.map +1 -0
  660. package/dist/signals.d.ts +55 -0
  661. package/dist/signals.d.ts.map +1 -0
  662. package/dist/signals.js +85 -0
  663. package/dist/signals.js.map +1 -0
  664. package/dist/source-cmd.d.ts +201 -0
  665. package/dist/source-cmd.d.ts.map +1 -0
  666. package/dist/source-cmd.js +684 -0
  667. package/dist/source-cmd.js.map +1 -0
  668. package/dist/source-verdict.d.ts +99 -0
  669. package/dist/source-verdict.d.ts.map +1 -0
  670. package/dist/source-verdict.js +182 -0
  671. package/dist/source-verdict.js.map +1 -0
  672. package/dist/spend-ledger.d.ts +350 -0
  673. package/dist/spend-ledger.d.ts.map +1 -0
  674. package/dist/spend-ledger.js +546 -0
  675. package/dist/spend-ledger.js.map +1 -0
  676. package/dist/stale-run-sweep.d.ts +79 -0
  677. package/dist/stale-run-sweep.d.ts.map +1 -0
  678. package/dist/stale-run-sweep.js +116 -0
  679. package/dist/stale-run-sweep.js.map +1 -0
  680. package/dist/start-attempts.d.ts +385 -0
  681. package/dist/start-attempts.d.ts.map +1 -0
  682. package/dist/start-attempts.js +613 -0
  683. package/dist/start-attempts.js.map +1 -0
  684. package/dist/status-cmd.d.ts +28 -0
  685. package/dist/status-cmd.d.ts.map +1 -0
  686. package/dist/status-cmd.js +116 -0
  687. package/dist/status-cmd.js.map +1 -0
  688. package/dist/stop-follow-up.d.ts +107 -0
  689. package/dist/stop-follow-up.d.ts.map +1 -0
  690. package/dist/stop-follow-up.js +172 -0
  691. package/dist/stop-follow-up.js.map +1 -0
  692. package/dist/surface-lease.d.ts +118 -0
  693. package/dist/surface-lease.d.ts.map +1 -0
  694. package/dist/surface-lease.js +485 -0
  695. package/dist/surface-lease.js.map +1 -0
  696. package/dist/sync.d.ts +54 -0
  697. package/dist/sync.d.ts.map +1 -0
  698. package/dist/sync.js +93 -0
  699. package/dist/sync.js.map +1 -0
  700. package/dist/syncing-ledger.d.ts +45 -0
  701. package/dist/syncing-ledger.d.ts.map +1 -0
  702. package/dist/syncing-ledger.js +53 -0
  703. package/dist/syncing-ledger.js.map +1 -0
  704. package/dist/temp-fixtures.d.ts +68 -0
  705. package/dist/temp-fixtures.d.ts.map +1 -0
  706. package/dist/temp-fixtures.js +38 -0
  707. package/dist/temp-fixtures.js.map +1 -0
  708. package/dist/token-window.d.ts +84 -0
  709. package/dist/token-window.d.ts.map +1 -0
  710. package/dist/token-window.js +143 -0
  711. package/dist/token-window.js.map +1 -0
  712. package/dist/tool-bridge.d.ts +177 -0
  713. package/dist/tool-bridge.d.ts.map +1 -0
  714. package/dist/tool-bridge.js +329 -0
  715. package/dist/tool-bridge.js.map +1 -0
  716. package/dist/tool-call-record.d.ts +197 -0
  717. package/dist/tool-call-record.d.ts.map +1 -0
  718. package/dist/tool-call-record.js +276 -0
  719. package/dist/tool-call-record.js.map +1 -0
  720. package/dist/tool-protocol.d.ts +135 -0
  721. package/dist/tool-protocol.d.ts.map +1 -0
  722. package/dist/tool-protocol.js +104 -0
  723. package/dist/tool-protocol.js.map +1 -0
  724. package/dist/tool-worker.d.ts +3 -0
  725. package/dist/tool-worker.d.ts.map +1 -0
  726. package/dist/tool-worker.js +478 -0
  727. package/dist/tool-worker.js.map +1 -0
  728. package/dist/toolchain-mirror.d.ts +86 -0
  729. package/dist/toolchain-mirror.d.ts.map +1 -0
  730. package/dist/toolchain-mirror.js +307 -0
  731. package/dist/toolchain-mirror.js.map +1 -0
  732. package/dist/trusted-git.d.ts +243 -0
  733. package/dist/trusted-git.d.ts.map +1 -0
  734. package/dist/trusted-git.js +920 -0
  735. package/dist/trusted-git.js.map +1 -0
  736. package/dist/ui.d.ts +76 -0
  737. package/dist/ui.d.ts.map +1 -0
  738. package/dist/ui.js +118 -0
  739. package/dist/ui.js.map +1 -0
  740. package/dist/untrusted-exec.d.ts +275 -0
  741. package/dist/untrusted-exec.d.ts.map +1 -0
  742. package/dist/untrusted-exec.js +479 -0
  743. package/dist/untrusted-exec.js.map +1 -0
  744. package/dist/untrusted-gate.d.ts +73 -0
  745. package/dist/untrusted-gate.d.ts.map +1 -0
  746. package/dist/untrusted-gate.js +226 -0
  747. package/dist/untrusted-gate.js.map +1 -0
  748. package/dist/uploader.d.ts +153 -0
  749. package/dist/uploader.d.ts.map +1 -0
  750. package/dist/uploader.js +204 -0
  751. package/dist/uploader.js.map +1 -0
  752. package/dist/verifier.d.ts +66 -0
  753. package/dist/verifier.d.ts.map +1 -0
  754. package/dist/verifier.js +170 -0
  755. package/dist/verifier.js.map +1 -0
  756. package/dist/verify-apply.d.ts +26 -0
  757. package/dist/verify-apply.d.ts.map +1 -0
  758. package/dist/verify-apply.js +36 -0
  759. package/dist/verify-apply.js.map +1 -0
  760. package/dist/verify-cmd.d.ts +44 -0
  761. package/dist/verify-cmd.d.ts.map +1 -0
  762. package/dist/verify-cmd.js +125 -0
  763. package/dist/verify-cmd.js.map +1 -0
  764. package/dist/verify-pass.d.ts +73 -0
  765. package/dist/verify-pass.d.ts.map +1 -0
  766. package/dist/verify-pass.js +103 -0
  767. package/dist/verify-pass.js.map +1 -0
  768. package/dist/welcome.d.ts +43 -0
  769. package/dist/welcome.d.ts.map +1 -0
  770. package/dist/welcome.js +116 -0
  771. package/dist/welcome.js.map +1 -0
  772. package/dist/workspace-provisioner.d.ts +65 -0
  773. package/dist/workspace-provisioner.d.ts.map +1 -0
  774. package/dist/workspace-provisioner.js +66 -0
  775. package/dist/workspace-provisioner.js.map +1 -0
  776. package/dist/workspace-quarantine.d.ts +64 -0
  777. package/dist/workspace-quarantine.d.ts.map +1 -0
  778. package/dist/workspace-quarantine.js +156 -0
  779. package/dist/workspace-quarantine.js.map +1 -0
  780. package/dist/workspace-residue-sweep.d.ts +113 -0
  781. package/dist/workspace-residue-sweep.d.ts.map +1 -0
  782. package/dist/workspace-residue-sweep.js +158 -0
  783. package/dist/workspace-residue-sweep.js.map +1 -0
  784. package/dist/workspace.d.ts +639 -0
  785. package/dist/workspace.d.ts.map +1 -0
  786. package/dist/workspace.js +2026 -0
  787. package/dist/workspace.js.map +1 -0
  788. package/package.json +52 -4
  789. package/win/CredProbe.cs +64 -0
  790. package/win/FakeClaude.cs +56 -0
  791. package/win/HandleProbe.cs +116 -0
  792. package/win/TokenProbe.cs +53 -0
  793. package/win/appcontainer.ps1 +500 -0
package/dist/setup.js ADDED
@@ -0,0 +1,283 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.GATES_ARE_TOOLCHAIN = exports.DEFAULT_ANSWERS = exports.QUESTIONS = void 0;
4
+ exports.suggestRails = suggestRails;
5
+ exports.parseAnswer = parseAnswer;
6
+ exports.renderConfig = renderConfig;
7
+ exports.summarise = summarise;
8
+ /**
9
+ * Guesses for the rails, by ecosystem.
10
+ *
11
+ * Offered rather than applied. A wrong guess that is presented as a suggestion
12
+ * costs a keystroke; a wrong guess applied silently costs a schema.
13
+ */
14
+ function suggestRails(profile) {
15
+ const guesses = [];
16
+ const has = (p) => profile.workspaces.some((w) => w.includes(p)) || profile.name.includes(p);
17
+ // Anything that migrates a database, moves money, or decides who you are.
18
+ const candidates = [
19
+ 'prisma/',
20
+ 'migrations/',
21
+ 'src/common/guards/',
22
+ 'src/modules/payments/',
23
+ 'src/modules/billing/',
24
+ 'src/auth/',
25
+ 'infra/',
26
+ '.github/workflows/',
27
+ ];
28
+ for (const c of candidates)
29
+ guesses.push(c);
30
+ if (has('api'))
31
+ guesses.push('api/prisma/');
32
+ return [...new Set(guesses)];
33
+ }
34
+ exports.QUESTIONS = [
35
+ {
36
+ key: 'rails',
37
+ ask: 'Which paths must looply never touch?',
38
+ why: 'Schema, migrations, auth and anything that moves money. It will report what it finds there and refuse to change it. This is the one answer worth taking a minute over.',
39
+ kind: 'paths',
40
+ default: '',
41
+ suggest: suggestRails,
42
+ },
43
+ {
44
+ key: 'prodDb',
45
+ ask: 'Can this machine reach a production database?',
46
+ why: 'If yes, looply refuses to start whenever it sees a live connection string — a loop that can write to production is not a loop, it is an incident.',
47
+ kind: 'confirm',
48
+ default: 'no',
49
+ },
50
+ {
51
+ key: 'push',
52
+ ask: 'May looply publish anything?',
53
+ why: 'Nothing leaves your machine unless you say so. Most people want the default.',
54
+ kind: 'choice',
55
+ default: 'never',
56
+ choices: [
57
+ { value: 'never', label: 'never', hint: 'commits stay on a local branch' },
58
+ { value: 'on-approval', label: 'on approval', hint: 'push once you approve, from the app' },
59
+ { value: 'manual', label: 'manual', hint: 'you push, by hand, as usual' },
60
+ ],
61
+ },
62
+ {
63
+ key: 'scope',
64
+ ask: 'What kind of work should it do?',
65
+ why: 'Improving what exists produces work you can review. Inventing new surface produces work nobody asked for, which is how an overnight run turns into a morning of reverting.',
66
+ kind: 'choice',
67
+ default: 'improve',
68
+ choices: [
69
+ { value: 'improve', label: 'improve what is there', hint: 'fixes, tests, missing states' },
70
+ { value: 'anything', label: 'anything', hint: 'including new screens and flows' },
71
+ ],
72
+ },
73
+ {
74
+ key: 'hours',
75
+ ask: 'How long should a run go by default?',
76
+ why: 'It finishes the round it is on rather than cutting it off, so this is a floor and not a deadline.',
77
+ kind: 'number',
78
+ default: '4',
79
+ },
80
+ ];
81
+ exports.DEFAULT_ANSWERS = {
82
+ rails: [],
83
+ prodDb: false,
84
+ push: 'never',
85
+ scope: 'improve',
86
+ hours: 4,
87
+ };
88
+ /**
89
+ * Turn one raw answer into a value, or say why it cannot be.
90
+ *
91
+ * A blank answer always means the default — a setup that punishes pressing enter
92
+ * is a setup people abandon halfway.
93
+ */
94
+ function parseAnswer(question, raw) {
95
+ const text = raw.trim();
96
+ // Blank is resolved here rather than by re-entering with the default: a
97
+ // question whose default is itself blank (rails, where "none" is the sane
98
+ // answer) recursed forever, which hung the CLI on the very first enter.
99
+ if (!text)
100
+ return { ok: true, value: emptyAnswer(question) };
101
+ switch (question.kind) {
102
+ case 'confirm': {
103
+ const yes = /^(y|yes|true)$/i.test(text);
104
+ const no = /^(n|no|false)$/i.test(text);
105
+ if (!yes && !no)
106
+ return { ok: false, error: 'answer yes or no' };
107
+ return { ok: true, value: yes };
108
+ }
109
+ case 'choice': {
110
+ const match = question.choices?.find((c) => c.value === text.toLowerCase() || c.label.toLowerCase() === text.toLowerCase());
111
+ // A number is accepted too, since the choices are printed numbered.
112
+ const asIndex = Number(text);
113
+ if (!match && Number.isInteger(asIndex) && question.choices?.[asIndex - 1]) {
114
+ return { ok: true, value: question.choices[asIndex - 1].value };
115
+ }
116
+ if (!match) {
117
+ return { ok: false, error: `pick one of: ${question.choices?.map((c) => c.value).join(', ')}` };
118
+ }
119
+ return { ok: true, value: match.value };
120
+ }
121
+ case 'number': {
122
+ const n = Number(text);
123
+ if (!Number.isFinite(n) || n <= 0)
124
+ return { ok: false, error: 'give a positive number of hours' };
125
+ if (n > 24)
126
+ return { ok: false, error: 'a run longer than 24 hours is almost certainly a mistake' };
127
+ return { ok: true, value: n };
128
+ }
129
+ case 'paths': {
130
+ const paths = text
131
+ .split(/[,\s]+/)
132
+ .map((p) => p.trim())
133
+ .filter(Boolean);
134
+ const bad = paths.find((p) => p.startsWith('/') || p.includes('..'));
135
+ if (bad) {
136
+ // An absolute or climbing path would either match nothing or match
137
+ // outside the repository, and both fail quietly at exactly the wrong time.
138
+ return { ok: false, error: `${bad} must be a path inside this repository` };
139
+ }
140
+ return { ok: true, value: paths };
141
+ }
142
+ }
143
+ }
144
+ /** What pressing enter means, per kind. Always a value, never another prompt. */
145
+ function emptyAnswer(q) {
146
+ switch (q.kind) {
147
+ case 'paths':
148
+ return q.default ? q.default.split(/[,\s]+/).filter(Boolean) : [];
149
+ case 'confirm':
150
+ return /^(y|yes|true)$/i.test(q.default);
151
+ case 'number':
152
+ return Number(q.default) || 0;
153
+ case 'choice':
154
+ return q.default;
155
+ }
156
+ }
157
+ /**
158
+ * The config file, written from what was detected and what was answered.
159
+ *
160
+ * Commented throughout, because this file is meant to be read and edited after
161
+ * setup rather than treated as generated output nobody opens.
162
+ */
163
+ /**
164
+ * What detection could see, said in the file it wrote.
165
+ *
166
+ * 🔴 THIS MODULE'S OWN RULE, APPLIED TO THE ONE THING IT SKIPPED (the audit's
167
+ * B-01). The docblock at the top of this file draws the line precisely:
168
+ * detection covers what the repository can tell you, and *"it cannot tell you
169
+ * the things that are expensive to get wrong… So those are asked."* Three are
170
+ * asked — forbidden paths, a reachable production database, whether anything
171
+ * may be published.
172
+ *
173
+ * `gates` is the most expensive thing in this file to get wrong, and it is the
174
+ * one that is **neither asked nor defaulted**: it is DETECTED, from the
175
+ * lockfile, `package.json` scripts and `tsconfig` — the toolchain, and nothing
176
+ * else. A person handed a populated list has no way to know that contracts,
177
+ * data and migrations were never candidates.
178
+ *
179
+ * ⚠️ AND THE FILE ALREADY KNEW HOW TO SAY IT — IN ONE BRANCH ONLY. When nothing
180
+ * is detected the list reads *"none detected — add at least one, or a green
181
+ * round proves nothing"*, which is exactly the right sentence. It appears only
182
+ * when the list is EMPTY, and *"a green round proves nothing about your
183
+ * migrations"* is just as true when it is full.
184
+ *
185
+ * ⚠️ IT CLAIMS NOTHING ABOUT THIS REPOSITORY. Not that migrations exist, not
186
+ * that a contract is unchecked, not that the gates are insufficient. It says
187
+ * what was looked for, which is the only thing detection can honestly report.
188
+ */
189
+ exports.GATES_ARE_TOOLCHAIN = [
190
+ '# Detected from the toolchain: the lockfile, package.json scripts and tsconfig.',
191
+ '# Contracts, data and migrations are not looked for — so a green round says',
192
+ '# nothing about them. Add a gate for anything here that has to hold.',
193
+ ].join('\n');
194
+ function renderConfig(profile, answers) {
195
+ const gates = [
196
+ profile.typecheck ? ` - { name: "${profile.typecheck.name}", run: "${profile.typecheck.run}", timeout_s: 300 }` : null,
197
+ profile.testRunner
198
+ ? ` - { name: "${profile.testRunner.name}", run: "${profile.testRunner.run}", timeout_s: 900, required: true }`
199
+ : null,
200
+ ].filter(Boolean);
201
+ // An empty list must be written as `[]`, not as a comment where a value
202
+ // belongs: YAML reads a key with only comments under it as null, and the
203
+ // config parser then rejects the very file setup just produced.
204
+ const rails = answers.rails.length
205
+ ? '\n' + answers.rails.map((p) => ` - "${p}"`).join('\n')
206
+ : ' [] # nothing is off limits until you list something here';
207
+ // Where work may happen. Detected workspaces become the free scope; without
208
+ // any, the whole repository is free, because a scope of nothing means a run
209
+ // that can never touch a file.
210
+ const free = profile.workspaces.length
211
+ ? profile.workspaces.map((w) => `${w}/**`)
212
+ : ['**'];
213
+ const additive = answers.scope === 'improve' ? free : [];
214
+ return `# .looply/config.yaml
215
+ #
216
+ # Written by \`looply init\`. Meant to be read and edited — every value here is
217
+ # a decision, and the comments say what each one costs.
218
+
219
+ project:
220
+ name: "${profile.name}"
221
+
222
+ # Checks that decide whether a round's work is kept. Cheapest first: a broken
223
+ # typecheck should not wait on a full test suite.
224
+ #
225
+ ${exports.GATES_ARE_TOOLCHAIN}
226
+ gates:
227
+ ${gates.length ? gates.join('\n') : ' # none detected — add at least one, or a green round proves nothing'}
228
+
229
+ rails:
230
+ # looply reports what it finds in these and refuses to change them. A task
231
+ # that needs one becomes a question for you rather than an edit.
232
+ forbidden_paths:${rails}
233
+ ${answers.prodDb
234
+ ? ` # This machine can reach production, so a live connection string aborts the
235
+ # run before any check executes.
236
+ prod_patterns: [herokuapp, amazonaws, ".render.com", "supabase.co", ".neon.tech"]`
237
+ : ` prod_patterns: [herokuapp, amazonaws, ".render.com", "supabase.co", ".neon.tech"]`}
238
+ exemptions: ask # it may ask to cross a rail once, for one file. "never" to refuse outright.
239
+
240
+ run:
241
+ min_hours: ${answers.hours}
242
+ max_rounds: 400
243
+ cooldown_s: 5
244
+
245
+ proof:
246
+ # A second agent, which did not write the code, checks the change against the
247
+ # task before it is kept. Turning this off means work is kept on a passing
248
+ # build alone — which proves it compiles, not that it was worth doing.
249
+ enabled: true
250
+ on_partial: ask
251
+
252
+ queue:
253
+ topup_threshold: 5
254
+ topup_size: 10
255
+ # Caps near-identical chores in one batch. Without it a self-written queue
256
+ # drifts into seven versions of the same small fix.
257
+ max_same_shape: 3
258
+
259
+ scope:
260
+ # ${answers.scope === 'improve' ? 'Improve what exists: fixes, tests, missing states. No new flows.' : 'Anything, including new screens and flows.'}
261
+ free: [${free.map((p) => `"${p}"`).join(', ')}]
262
+ # Paths where only new files may be added, never existing ones edited.
263
+ additive: [${additive.map((p) => `"${p}"`).join(', ')}]
264
+
265
+ publish:
266
+ policy: ${answers.push}
267
+
268
+ notify:
269
+ channel: push
270
+ every_min: 30
271
+ `;
272
+ }
273
+ /** A short account of what was decided, shown when setup finishes. */
274
+ function summarise(answers, profile) {
275
+ return [
276
+ `project ${profile.name}`,
277
+ `checks ${[profile.typecheck?.name, profile.testRunner?.name].filter(Boolean).join(', ') || 'none detected'}`,
278
+ `rails ${answers.rails.length ? answers.rails.join(', ') : 'none — nothing is off limits'}`,
279
+ `publish ${answers.push}`,
280
+ `run ${answers.hours}h by default`,
281
+ ];
282
+ }
283
+ //# sourceMappingURL=setup.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"setup.js","sourceRoot":"","sources":["../src/setup.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * WHO MAY READ THE SHARED DIRECTORIES, AND WHEN THAT STOPS BEING TRUE.
3
+ *
4
+ * ─────────────────────────────────────────────────────────────────────────────
5
+ * 🔴 THE MEASUREMENT THIS EXISTS FOR. Two directories are shared by every
6
+ * workspace on the machine — the toolchain mirror and the tool-worker directory
7
+ * — and each contained execution added an inheritable ACE for its own container
8
+ * SID. Nothing ever removed one. Measured on a real machine before this module:
9
+ *
10
+ * %TEMP%\looply-toolworker\<digest> 512 ACEs, 509 of them container SIDs
11
+ * ~\.looply\toolchains\node-v20.19.4-<h> 266 ACEs, 262 of them container SIDs
12
+ *
13
+ * A Windows DACL is capped at about 64 KB. At the cap `Set-Acl` throws, the
14
+ * helper reports `stage: 'grant'`, and every contained run on the machine stops
15
+ * — it fails CLOSED, which is the only good thing about it.
16
+ *
17
+ * ⚠️ THE PROFILE COUNT IS NOT THE ACE COUNT. A previous note reasoned from
18
+ * "1,921 container profiles" to saturation. Those numbers are unrelated: the
19
+ * grant lands on the toolchain and worker CHILD directories, not their roots,
20
+ * and the roots carry zero container ACEs. Both figures above were read off the
21
+ * actual DACLs.
22
+ *
23
+ * ─────────────────────────────────────────────────────────────────────────────
24
+ * WHY A LEDGER, AND NOT JUST THE SID.
25
+ *
26
+ * A workspace-derived SID names the PRINCIPAL. It does not enumerate where that
27
+ * principal was ever granted. The toolchain directory is versioned — a node
28
+ * upgrade moves the mirror to a new path — so a SID granted on
29
+ * `node-v20.19.4-<h>` cannot be cleaned up by looking at wherever the mirror
30
+ * lives today. The ledger records the path that was actually granted.
31
+ *
32
+ * ⚠️ AND IT RECORDS THE NUMERIC SID. After a profile is deleted, a friendly
33
+ * name no longer resolves; the numeric identity still does, and `icacls` takes
34
+ * it directly. Recording the container name too costs nothing and keeps the
35
+ * rows readable.
36
+ *
37
+ * ⚠️ INTENT IS RECORDED BEFORE THE GRANT, NOT AFTER. A crash between the two
38
+ * would otherwise leave an ACE nothing remembers — the exact shape of the leak
39
+ * this module removes. A record whose grant never landed is harmless: the purge
40
+ * is idempotent and removing an ACE that is not there succeeds.
41
+ *
42
+ * Append-only, with a LEADING newline per record, so a torn write costs one row
43
+ * rather than corrupting the row beside it.
44
+ */
45
+ export interface SharedGrantRecord {
46
+ /** The container profile name — derivable from (kind, workspace), and readable. */
47
+ name: string;
48
+ /** NUMERIC. The identity that still resolves after the profile is gone. */
49
+ sid: string;
50
+ /** The exact directory granted, which a later mirror move would otherwise lose. */
51
+ path: string;
52
+ at: string;
53
+ state: 'granted' | 'released';
54
+ }
55
+ export declare function sharedGrantsPath(home?: string): string;
56
+ /**
57
+ * F43: HOW LONG ONE GRANT WAITS FOR ANOTHER — longer than an ACL write takes.
58
+ *
59
+ * `icacls /grant (OI)(CI)` rewrites the entry on every file under the toolchain
60
+ * mirror, and the time grows with the list: 8–11 s on 09-15, 26–29 s on 09-26
61
+ * at ~1,230 entries. The shared mutex's default wait (5 s) is sized for
62
+ * check-and-claims that take microseconds, so a second identity arriving during
63
+ * a grant was refused ("could not be serialised") — a gate step or a tool call
64
+ * that did not run, and in the lane an inconclusive check nobody re-offers.
65
+ * A holder that dies is still broken at once (`withExclusiveLock`); this only
66
+ * bounds how long a LIVE holder is waited for.
67
+ */
68
+ export declare const SHARED_GRANT_LOCK_WAIT_MS = 300000;
69
+ /** Every row, oldest first. A row that will not parse is skipped, never fatal. */
70
+ export declare function readSharedGrants(home?: string): SharedGrantRecord[];
71
+ /**
72
+ * What is still granted: the last state wins, per (sid, path).
73
+ *
74
+ * Folded rather than filtered, because a path can legitimately be granted,
75
+ * released, and granted again when a workspace identity is reused.
76
+ */
77
+ export declare function liveSharedGrants(home?: string): SharedGrantRecord[];
78
+ export interface AclResult {
79
+ ok: boolean;
80
+ because?: string;
81
+ }
82
+ /**
83
+ * Add one inheritable read-and-execute ACE for a container SID.
84
+ *
85
+ * READ AND EXECUTE ONLY, on both shared paths, because both hold Looply's own
86
+ * artefacts: a container that could replace `node.exe` or the tool worker would
87
+ * be choosing what every later execution runs.
88
+ */
89
+ export declare function grantAce(path: string, sid: string): AclResult;
90
+ /**
91
+ * Remove every granted ACE for one SID from one path, and nothing else.
92
+ *
93
+ * `/remove:g` names a single principal. It cannot touch another SID's entry, an
94
+ * inherited entry, or the owner's own rights — which is what "without changing
95
+ * unrelated user permissions" has to mean in practice.
96
+ */
97
+ export declare function removeAce(path: string, sid: string): AclResult;
98
+ export interface SharedGrantDeps {
99
+ home?: string;
100
+ /** Overridable so tests drive the ledger and the lock without touching ACLs. */
101
+ grant?: (path: string, sid: string) => AclResult;
102
+ remove?: (path: string, sid: string) => AclResult;
103
+ now?: () => Date;
104
+ }
105
+ /**
106
+ * Make sure this identity may read a shared path, recording that it now may.
107
+ *
108
+ * 🔴 THE SAME LOCK AS THE REMOVAL, WHICH IS THE POINT. `Set-Acl` and `icacls`
109
+ * are both read-modify-write over one DACL, so an addition racing a removal
110
+ * loses whichever entry it did not see. Locking only the cleanup would leave
111
+ * exactly that race open on every launch.
112
+ *
113
+ * ⚠️ THE CRITICAL SECTION IS THE ACL WRITE, AND NOTHING MORE. The lock is taken
114
+ * here and released before the caller launches anything: it is never held
115
+ * across a provider invocation or a gate step.
116
+ *
117
+ * Idempotent: an identity already recorded as holding this path does no ACL work
118
+ * at all, so the cost is paid once per identity rather than once per launch.
119
+ */
120
+ export declare function ensureSharedGrant(name: string, sid: string, path: string, deps?: SharedGrantDeps): AclResult;
121
+ /** The narrow slice of the containment backend this needs: a SID lookup. */
122
+ export interface SidSource {
123
+ call(req: {
124
+ action: string;
125
+ profile: string;
126
+ }): Promise<{
127
+ ok: boolean;
128
+ sid?: string;
129
+ error?: string;
130
+ }>;
131
+ }
132
+ /**
133
+ * Ensure one container identity may read the shared paths, before it launches.
134
+ *
135
+ * ⚠️ THE COMMON CASE COSTS NOTHING. An identity whose rows are already in the
136
+ * ledger takes no lock, makes no probe and touches no ACL — so the extra round
137
+ * trip is paid once per identity, not once per launch.
138
+ */
139
+ export declare function ensureSharedAccess(backend: SidSource | null, name: string, paths: readonly string[], deps?: SharedGrantDeps): Promise<AclResult>;
140
+ export interface ReleaseOutcome {
141
+ released: {
142
+ path: string;
143
+ sid: string;
144
+ }[];
145
+ pending: {
146
+ path: string;
147
+ sid: string;
148
+ because: string;
149
+ }[];
150
+ }
151
+ /**
152
+ * Give back every shared-path grant held by these identities.
153
+ *
154
+ * 🔴 CALLED ONLY FOR AN IDENTITY WHOSE WORKSPACE IS BEING RETIRED, and the
155
+ * caller establishes that. This function does not decide liveness; it does the
156
+ * ACL work for a decision already made, so a caller that skips the check cannot
157
+ * be rescued here.
158
+ *
159
+ * ⚠️ A FAILURE LEAVES THE ROW `granted`, DELIBERATELY. That is the truthful
160
+ * cleanup-pending state: the next retirement sweep finds the row and tries
161
+ * again, and nothing ever reports cleanup it did not do.
162
+ */
163
+ export declare function releaseSharedGrants(names: readonly string[], deps?: SharedGrantDeps): ReleaseOutcome;
164
+ //# sourceMappingURL=shared-grants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shared-grants.d.ts","sourceRoot":"","sources":["../src/shared-grants.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,MAAM,WAAW,iBAAiB;IAChC,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,2EAA2E;IAC3E,GAAG,EAAE,MAAM,CAAC;IACZ,mFAAmF;IACnF,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,SAAS,GAAG,UAAU,CAAC;CAC/B;AAED,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAkB,GAAG,MAAM,CAEjE;AAED;;;;;;;;;;;GAWG;AACH,eAAO,MAAM,yBAAyB,SAAU,CAAC;AAMjD,kFAAkF;AAClF,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAkB,GAAG,iBAAiB,EAAE,CAqB9E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,MAAkB,GAAG,iBAAiB,EAAE,CAI9E;AAYD,MAAM,WAAW,SAAS;IACxB,EAAE,EAAE,OAAO,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;GAMG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAO7D;AAED;;;;;;GAMG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,SAAS,CAO9D;AAED,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,gFAAgF;IAChF,KAAK,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IACjD,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IAClD,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,iBAAiB,CAC/B,IAAI,EAAE,MAAM,EACZ,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,eAAoB,GACzB,SAAS,CAsBX;AAED,4EAA4E;AAC5E,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,GAAG,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,GAAG,CAAC,EAAE,MAAM,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxG;AAED;;;;;;GAMG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,SAAS,GAAG,IAAI,EACzB,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,SAAS,CAAC,CA8CpB;AAED,MAAM,WAAW,cAAc;IAC7B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC1C,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;CAC3D;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,IAAI,GAAE,eAAoB,GAAG,cAAc,CAyBxG"}