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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 vuedale
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md CHANGED
@@ -1,3 +1,137 @@
1
- # Temporary Holding Version
2
-
3
- This version is a temporary placeholder for this package. An operational version to replace this has been submitted for review and is awaiting a staged release.
1
+ # looply
2
+
3
+ **looply does not write your code.** Your coding agent does — Claude Code, or whichever
4
+ one you already use. looply is the harness around it: it decides what the agent works
5
+ on, refuses the paths you named, runs your checks, has a *second* agent prove the change
6
+ against the task, and then keeps it or throws it away.
7
+
8
+ Your code never leaves your machine.
9
+
10
+ ```sh
11
+ npx looply-cli init # read the repo, ask the few things it cannot infer
12
+ npx looply-cli doctor # run every check once — no agent calls, no cost
13
+ npx looply-cli scan # fill the queue with findings tied to a file and a line
14
+ npx looply-cli verify # confirm each finding against the code as it stands
15
+ npx looply-cli run --hours 4
16
+ ```
17
+
18
+ ## The two-key rule
19
+
20
+ A round commits only if **both** keys turn:
21
+
22
+ | | |
23
+ |---|---|
24
+ | **Key one** | your own checks — typecheck, tests, build — in the order you wrote them |
25
+ | **Key two** | a second agent reads the diff against the task. It did not write the code, and it never sees the first agent's account of what it did. |
26
+
27
+ Either one fails and the work is discarded, the tree is cleaned, and the task goes back
28
+ in the queue carrying the reason — so the next attempt starts knowing what went wrong
29
+ with the last one.
30
+
31
+ This exists because of a measured failure. An earlier version of this harness ran 166
32
+ unattended rounds and kept all 166, because the checks it ran were the same checks the
33
+ agent had already run before finishing. A green build is not evidence. **A prover that
34
+ never rejects anything is not checking.**
35
+
36
+ ## What one round is
37
+
38
+ ```
39
+ pick → implement → check → prove → keep or discard
40
+ ```
41
+
42
+ - **pick** — the top item whose premise still holds. If the code moved under it, it goes
43
+ back through verification first: an item describing a bug somebody already fixed is
44
+ worse than no item at all.
45
+ - **implement** — your agent, starting at the file and line the item already located.
46
+ - **check** — your gates, cheapest first, stopping at the first failure.
47
+ - **prove** — the second agent.
48
+ - **keep or discard** — a commit on the run branch with a trailer naming only the checks
49
+ that actually ran, or nothing at all.
50
+
51
+ ## Rails
52
+
53
+ Name the paths the agent must never touch. looply reports what it finds there and
54
+ refuses the edit; a task that genuinely needs one becomes a question, for that one file,
55
+ once.
56
+
57
+ ```yaml
58
+ rails:
59
+ forbidden_paths: ["prisma/", "src/auth/", "src/modules/payments/"]
60
+ prod_patterns: [herokuapp, amazonaws, ".render.com"]
61
+ exemptions: ask # or never
62
+ ```
63
+
64
+ A railed path or a reachable production database **aborts** the round before a single
65
+ check runs. That is a different thing from a failing check, and it is reported
66
+ differently.
67
+
68
+ ## Commands
69
+
70
+ | command | what it is for | costs |
71
+ |---|---|---|
72
+ | `looply` | where you are, and the single most useful next step | — |
73
+ | `looply init` | profile the project and write `.looply/config.yaml` | — |
74
+ | `looply doctor` | validate the config and run every check once | — |
75
+ | `looply scan` | read the code through several lenses and fill the queue | agent |
76
+ | `looply verify` | confirm draft items against the code, so a run can pick them | agent |
77
+ | `looply run --hours N` | work the queue for N hours | agent |
78
+ | `looply run --dry-run` | print exactly what a run would do | — |
79
+ | `looply status` | what it is doing right now | — |
80
+ | `looply report` | what a finished run actually did | — |
81
+ | `looply pair` | connect this machine to your phone | — |
82
+ | `looply daemon` | stay connected so the phone can drive it | — |
83
+ | `looply agent --json` | machine-readable state, for other tools | — |
84
+
85
+ `doctor` and `--dry-run` cost nothing. Use them rather than starting a run to find out
86
+ the config is wrong.
87
+
88
+ ## Using a different agent
89
+
90
+ The prompt is written to the agent's **stdin**, never onto a command line, so a
91
+ multi-line prompt and a diff full of quotes are not your problem:
92
+
93
+ ```yaml
94
+ agent:
95
+ command: "claude -p --dangerously-skip-permissions"
96
+ output_format_flag: "--output-format" # "" if your agent has no such flag
97
+ ```
98
+
99
+ The agent runs **contained**: it inherits no PATH and no environment, which is
100
+ the point — but it means a provider outside your project has to be named, or it
101
+ cannot start at all. Two keys do that, and skipping them produces exactly two
102
+ failures, both measured:
103
+
104
+ ```yaml
105
+ agent:
106
+ # Where the binary lives. Without it every lens reports
107
+ # "'claude' is not recognized as an internal or external command".
108
+ runtime: ["/home/you/.local/bin"]
109
+ # Names only — the VALUE comes from the environment the daemon holds, so no
110
+ # key is ever written into this file. Without it a provider that keeps its
111
+ # login in a credential store answers "Not logged in · Please run /login",
112
+ # because looply will not grant an agent a credential store.
113
+ env: ["CLAUDE_CODE_OAUTH_TOKEN"]
114
+ ```
115
+
116
+ Confirm both with `looply doctor --provider`, which spends one model call and
117
+ tells you whether the process actually started, answered, or hung.
118
+
119
+ ## Requirements
120
+
121
+ - Node 20 or newer
122
+ - A git repository with a clean working tree — a run refuses to start otherwise, because
123
+ the first discard would destroy uncommitted work
124
+ - At least one check of your own that exits non-zero when it fails. Without one there is
125
+ nothing for the first key to turn.
126
+
127
+ ## What it is not
128
+
129
+ - Not a coding agent. It drives the one you already use and is worth nothing without it.
130
+ - Not a replacement for review. It narrows what you review and shows its working.
131
+ - Not free. Every round is agent time, and a check that rejects work has still been paid for.
132
+
133
+ ## Documentation
134
+
135
+ <https://looply-agent-app.web.app/docs/>
136
+
137
+ MIT © vuedale
package/dist/.src-hash ADDED
@@ -0,0 +1 @@
1
+ 0718ecc55a9ad89af6ef6bfb9f39e9139d823f2be48bcd1675cb79cd8be97d7a
@@ -0,0 +1,108 @@
1
+ import { type AcceptanceStepShape, type ObservedProfile } from '@looply/core';
2
+ import type { CommandRunner } from './gate';
3
+ import type { ContainmentProbe } from './untrusted-exec';
4
+ export interface LockIdentity {
5
+ readonly file: string;
6
+ readonly digest: string;
7
+ }
8
+ /**
9
+ * The dependency DECLARATION in a checkout, as `<file>@<sha256:16>`.
10
+ *
11
+ * ⚠️ A DECLARATION, NOT AN INSTALLATION — see `deps` below. Returns null when the
12
+ * project holds no lockfile at all, which is a readable answer and not a
13
+ * failure: plenty of real projects have none, and a default that demanded one
14
+ * would refuse them for ever.
15
+ */
16
+ export declare function readLockIdentity(dir: string): LockIdentity | null;
17
+ export interface EnvironmentSource {
18
+ /** `process.platform`, injected rather than read, so a test can state it. */
19
+ readonly platform: string;
20
+ /** `process.arch`. */
21
+ readonly arch: string;
22
+ /** `process.versions.node`. */
23
+ readonly nodeVersion: string;
24
+ /** The acceptance map this pass ran under — `cfg.gates`. */
25
+ readonly gates: readonly AcceptanceStepShape[];
26
+ /**
27
+ * `DoctorReport.containment`, or null when nothing asked.
28
+ *
29
+ * 🔴 THIS IS THE FACT THE LANE ALREADY COMPUTED AND THREW AWAY.
30
+ * `integration-deps.ts` mapped the doctor report down to `{name, ok, detail}`
31
+ * and dropped `containment` with it, so the one question "was there a boundary
32
+ * around this execution" was answered on every lane pass and recorded nowhere.
33
+ */
34
+ readonly containment: ContainmentProbe | null;
35
+ /** The candidate checkout's own lockfile, or null when it holds none. */
36
+ readonly lock: LockIdentity | null;
37
+ /**
38
+ * Did this checkout receive `node_modules` (or anything else) from the host
39
+ * rather than installing from its own lockfile?
40
+ *
41
+ * 🔴 NOT A FORMALITY, AND THE REASON `deps` EXISTS APART FROM `lock`. The lane
42
+ * copies `run.carry_into_checkouts` into the candidate's worktree from the
43
+ * LANE's tree (integration-runtime.ts, `carryIntoCheckout`), so the gate runs
44
+ * the candidate's lockfile against the host's installed tree. Recording a lock
45
+ * digest alone would assert a dependency identity the check did not have.
46
+ */
47
+ readonly depsCarried: boolean;
48
+ }
49
+ /**
50
+ * Assemble the observation. PURE: every fact arrives as an argument.
51
+ *
52
+ * ⚠️ A FACT THAT COULD NOT BE READ IS `null`, NEVER OMITTED AND NEVER GUESSED.
53
+ * Absent means nobody asked and `null` means it was asked and could not be read;
54
+ * the matcher refuses each by its own name, and Rule #1 makes both non-evidence
55
+ * in strict mode.
56
+ */
57
+ export declare function observedProfile(src: EnvironmentSource): ObservedProfile;
58
+ /**
59
+ * The observation for a gate pass in `dir`, reading this process and that
60
+ * checkout.
61
+ *
62
+ * ⚠️ `platform`/`arch`/`nodeVersion` DESCRIBE THE PROCESS THAT RAN THE GATE, and
63
+ * that is the right answer: the lane runs the candidate's checks in a worktree
64
+ * on this machine, so this machine is where they happened.
65
+ */
66
+ export declare function observeAt(dir: string, gates: readonly AcceptanceStepShape[], containment: ContainmentProbe | null, depsCarried: boolean): ObservedProfile;
67
+ /** How long a declared probe may take before it is treated as unreadable. */
68
+ export declare const PROBE_TIMEOUT_MS = 30000;
69
+ /** A probe answer longer than this is a command that misunderstood its job. */
70
+ export declare const PROBE_VALUE_MAX = 200;
71
+ /**
72
+ * Read the facts this machine cannot read for itself — a database engine and
73
+ * major version, a migration head, a build target.
74
+ *
75
+ * 🔴 EVERY FAILURE IS `null`, WHICH IS "ASKED AND UNREADABLE", AND IN STRICT
76
+ * MODE THAT IS A REFUSAL. A probe that exits non-zero, times out, or prints
77
+ * nothing does NOT quietly drop out of the profile — dropping it would read
78
+ * downstream as "nobody asked", which is a different fact and the softer one.
79
+ * Fail-closed is the charter's rule for a required fact that cannot be read.
80
+ *
81
+ * ⚠️ THE FIRST NON-EMPTY LINE, TRIMMED. A probe is a fact reader, not a report;
82
+ * anything longer than a short identifier is a command that misunderstood its
83
+ * job, and truncating silently would make two different databases digest alike.
84
+ * An over-long answer is `null` for the same reason a crash is.
85
+ *
86
+ * ⚠️ RUN UNDER THE SAME CONTAINED RUNNER AS THE GATE, in the candidate's own
87
+ * checkout. On a platform whose containment backend refuses outright, every
88
+ * probe answers `null` — which is honest, and is why an owner who declares one
89
+ * is told by `doctor` before a Start is ever spent on it.
90
+ */
91
+ export declare function runAcceptanceProbes(probes: readonly {
92
+ readonly fact: string;
93
+ readonly run: string;
94
+ }[], runner: CommandRunner, timeoutMs?: number): Promise<Record<string, string | null>>;
95
+ /**
96
+ * The full observation: the facts this process and checkout can state, plus
97
+ * whatever the project's declared probes answer.
98
+ *
99
+ * ⚠️ PROBE ANSWERS GO THROUGH `normaliseObserved` WITH THE REST, so a probe
100
+ * cannot invent a fact outside the closed set — a probe declared for
101
+ * `probe.db-engine` cannot return a `user` key, because it returns a string and
102
+ * the key is the one the owner declared.
103
+ */
104
+ export declare function observeAtWithProbes(dir: string, gates: readonly AcceptanceStepShape[], containment: ContainmentProbe | null, depsCarried: boolean, probes: readonly {
105
+ readonly fact: string;
106
+ readonly run: string;
107
+ }[], runner: CommandRunner): Promise<ObservedProfile>;
108
+ //# sourceMappingURL=acceptance-observe.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acceptance-observe.d.ts","sourceRoot":"","sources":["../src/acceptance-observe.ts"],"names":[],"mappings":"AAGA,OAAO,EAGL,KAAK,mBAAmB,EACxB,KAAK,eAAe,EACrB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AA0BzD,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,YAAY,GAAG,IAAI,CAUjE;AAED,MAAM,WAAW,iBAAiB;IAChC,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,sBAAsB;IACtB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,+BAA+B;IAC/B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,4DAA4D;IAC5D,QAAQ,CAAC,KAAK,EAAE,SAAS,mBAAmB,EAAE,CAAC;IAC/C;;;;;;;OAOG;IACH,QAAQ,CAAC,WAAW,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAC9C,yEAAyE;IACzE,QAAQ,CAAC,IAAI,EAAE,YAAY,GAAG,IAAI,CAAC;IACnC;;;;;;;;;OASG;IACH,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;CAC/B;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,iBAAiB,GAAG,eAAe,CAavE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CACvB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,WAAW,EAAE,gBAAgB,GAAG,IAAI,EACpC,WAAW,EAAE,OAAO,GACnB,eAAe,CAUjB;AAED,6EAA6E;AAC7E,eAAO,MAAM,gBAAgB,QAAS,CAAC;AACvC,+EAA+E;AAC/E,eAAO,MAAM,eAAe,MAAM,CAAC;AAEnC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,mBAAmB,CACvC,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,EAClE,MAAM,EAAE,aAAa,EACrB,SAAS,GAAE,MAAyB,GACnC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC,CAAC,CAgBxC;AAED;;;;;;;;GAQG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,SAAS,mBAAmB,EAAE,EACrC,WAAW,EAAE,gBAAgB,GAAG,IAAI,EACpC,WAAW,EAAE,OAAO,EACpB,MAAM,EAAE,SAAS;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAA;CAAE,EAAE,EAClE,MAAM,EAAE,aAAa,GACpB,OAAO,CAAC,eAAe,CAAC,CAI1B"}
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PROBE_VALUE_MAX = exports.PROBE_TIMEOUT_MS = void 0;
4
+ exports.readLockIdentity = readLockIdentity;
5
+ exports.observedProfile = observedProfile;
6
+ exports.observeAt = observeAt;
7
+ exports.runAcceptanceProbes = runAcceptanceProbes;
8
+ exports.observeAtWithProbes = observeAtWithProbes;
9
+ const node_crypto_1 = require("node:crypto");
10
+ const node_fs_1 = require("node:fs");
11
+ const node_path_1 = require("node:path");
12
+ const core_1 = require("@looply/core");
13
+ /**
14
+ * THE READER FOR RULE #1 — what a gate pass was actually observed to happen
15
+ * under.
16
+ *
17
+ * 🔴 EVERY FACT COMES FROM THIS PROCESS, FROM THE CANDIDATE'S OWN CHECKOUT, OR
18
+ * FROM THE GATE REPORT. No agent output reaches this file and there is no field
19
+ * on `IntegrationCandidate` that could supply one — which is the mechanical form
20
+ * of "no model decides whether its own environment qualifies". The matcher
21
+ * (`packages/core/src/acceptance-environment.ts`) then decides on the
22
+ * OBSERVATION IT IS HANDED and never on this host, and a purity spec pins that.
23
+ *
24
+ * ⚠️ FACTS ARE COLLECTED WHETHER OR NOT ANYTHING REQUIRES THEM. An observation
25
+ * is a record for a person to read; `matchProfile` loops over `required`, so a
26
+ * fact nobody asked for cannot refuse anything. Collecting broadly and matching
27
+ * narrowly is the whole shape of "irrelevant facts must not invalidate".
28
+ *
29
+ * ⚠️ AND NOTHING SECRET IS COLLECTED. The closed list in core is the guard —
30
+ * `normaliseObserved` drops anything outside it — but the first defence is that
31
+ * nothing here reads an env var, a credential store or a home directory.
32
+ */
33
+ /** The lockfiles worth recognising, in the order a project would hold them. */
34
+ const LOCKFILES = ['package-lock.json', 'pnpm-lock.yaml', 'yarn.lock', 'npm-shrinkwrap.json'];
35
+ /**
36
+ * The dependency DECLARATION in a checkout, as `<file>@<sha256:16>`.
37
+ *
38
+ * ⚠️ A DECLARATION, NOT AN INSTALLATION — see `deps` below. Returns null when the
39
+ * project holds no lockfile at all, which is a readable answer and not a
40
+ * failure: plenty of real projects have none, and a default that demanded one
41
+ * would refuse them for ever.
42
+ */
43
+ function readLockIdentity(dir) {
44
+ for (const file of LOCKFILES) {
45
+ try {
46
+ const bytes = (0, node_fs_1.readFileSync)((0, node_path_1.join)(dir, file));
47
+ return { file, digest: (0, node_crypto_1.createHash)('sha256').update(bytes).digest('hex').slice(0, 16) };
48
+ }
49
+ catch {
50
+ /* not this one */
51
+ }
52
+ }
53
+ return null;
54
+ }
55
+ /**
56
+ * Assemble the observation. PURE: every fact arrives as an argument.
57
+ *
58
+ * ⚠️ A FACT THAT COULD NOT BE READ IS `null`, NEVER OMITTED AND NEVER GUESSED.
59
+ * Absent means nobody asked and `null` means it was asked and could not be read;
60
+ * the matcher refuses each by its own name, and Rule #1 makes both non-evidence
61
+ * in strict mode.
62
+ */
63
+ function observedProfile(src) {
64
+ return (0, core_1.normaliseObserved)({
65
+ os: src.platform,
66
+ arch: src.arch,
67
+ runtime: `node@${src.nodeVersion}`,
68
+ lock: src.lock === null ? 'none' : `${src.lock.file}@${src.lock.digest}`,
69
+ deps: src.depsCarried ? 'carried-from-host' : 'from-lock',
70
+ gates: (0, core_1.acceptanceMapDigest)(src.gates),
71
+ containment: src.containment === null
72
+ ? null
73
+ : `${src.containment.backend}:${src.containment.available ? 'available' : 'unavailable'}`,
74
+ });
75
+ }
76
+ /**
77
+ * The observation for a gate pass in `dir`, reading this process and that
78
+ * checkout.
79
+ *
80
+ * ⚠️ `platform`/`arch`/`nodeVersion` DESCRIBE THE PROCESS THAT RAN THE GATE, and
81
+ * that is the right answer: the lane runs the candidate's checks in a worktree
82
+ * on this machine, so this machine is where they happened.
83
+ */
84
+ function observeAt(dir, gates, containment, depsCarried) {
85
+ return observedProfile({
86
+ platform: process.platform,
87
+ arch: process.arch,
88
+ nodeVersion: process.versions.node,
89
+ gates,
90
+ containment,
91
+ lock: readLockIdentity(dir),
92
+ depsCarried,
93
+ });
94
+ }
95
+ /** How long a declared probe may take before it is treated as unreadable. */
96
+ exports.PROBE_TIMEOUT_MS = 30_000;
97
+ /** A probe answer longer than this is a command that misunderstood its job. */
98
+ exports.PROBE_VALUE_MAX = 200;
99
+ /**
100
+ * Read the facts this machine cannot read for itself — a database engine and
101
+ * major version, a migration head, a build target.
102
+ *
103
+ * 🔴 EVERY FAILURE IS `null`, WHICH IS "ASKED AND UNREADABLE", AND IN STRICT
104
+ * MODE THAT IS A REFUSAL. A probe that exits non-zero, times out, or prints
105
+ * nothing does NOT quietly drop out of the profile — dropping it would read
106
+ * downstream as "nobody asked", which is a different fact and the softer one.
107
+ * Fail-closed is the charter's rule for a required fact that cannot be read.
108
+ *
109
+ * ⚠️ THE FIRST NON-EMPTY LINE, TRIMMED. A probe is a fact reader, not a report;
110
+ * anything longer than a short identifier is a command that misunderstood its
111
+ * job, and truncating silently would make two different databases digest alike.
112
+ * An over-long answer is `null` for the same reason a crash is.
113
+ *
114
+ * ⚠️ RUN UNDER THE SAME CONTAINED RUNNER AS THE GATE, in the candidate's own
115
+ * checkout. On a platform whose containment backend refuses outright, every
116
+ * probe answers `null` — which is honest, and is why an owner who declares one
117
+ * is told by `doctor` before a Start is ever spent on it.
118
+ */
119
+ async function runAcceptanceProbes(probes, runner, timeoutMs = exports.PROBE_TIMEOUT_MS) {
120
+ const out = {};
121
+ for (const p of probes) {
122
+ try {
123
+ const r = await runner(p.run, timeoutMs);
124
+ const line = (r.output ?? '')
125
+ .split('\n')
126
+ .map((l) => l.trim())
127
+ .find((l) => l !== '');
128
+ out[p.fact] = r.ok && !r.timedOut && line !== undefined && line.length <= exports.PROBE_VALUE_MAX ? line : null;
129
+ }
130
+ catch {
131
+ // A runner that throws is a machine that cannot answer, not a fact.
132
+ out[p.fact] = null;
133
+ }
134
+ }
135
+ return out;
136
+ }
137
+ /**
138
+ * The full observation: the facts this process and checkout can state, plus
139
+ * whatever the project's declared probes answer.
140
+ *
141
+ * ⚠️ PROBE ANSWERS GO THROUGH `normaliseObserved` WITH THE REST, so a probe
142
+ * cannot invent a fact outside the closed set — a probe declared for
143
+ * `probe.db-engine` cannot return a `user` key, because it returns a string and
144
+ * the key is the one the owner declared.
145
+ */
146
+ async function observeAtWithProbes(dir, gates, containment, depsCarried, probes, runner) {
147
+ const core = observeAt(dir, gates, containment, depsCarried);
148
+ if (probes.length === 0)
149
+ return core;
150
+ return (0, core_1.normaliseObserved)({ ...core, ...(await runAcceptanceProbes(probes, runner)) });
151
+ }
152
+ //# sourceMappingURL=acceptance-observe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acceptance-observe.js","sourceRoot":"","sources":["../src/acceptance-observe.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,131 @@
1
+ import type { Item, Status } from '@looply/core';
2
+ import type { LooplyConfig } from './config';
3
+ /**
4
+ * `looply agent` — the machine-readable surface.
5
+ *
6
+ * Everything else in this CLI is written for a person: boxes, colour, a next
7
+ * step spelled out. This one is written for another program, and the two goals
8
+ * fight each other badly enough that mixing them produces output neither can
9
+ * use. So the split is explicit.
10
+ *
11
+ * Three promises, because a tool that consumes this has no way to ask:
12
+ *
13
+ * 1. `schemaVersion` changes when a field's meaning changes. A consumer can
14
+ * refuse to guess rather than silently misread.
15
+ * 2. Every field is either present or explicitly `null`. Nothing is omitted,
16
+ * so `undefined` never has to be told apart from "absent because false".
17
+ * 3. It exits 0 whenever it could answer at all, including "nothing is
18
+ * running". A non-zero exit means the question could not be answered —
19
+ * never that the answer was boring.
20
+ */
21
+ export declare const AGENT_SCHEMA_VERSION = 1;
22
+ export interface AgentQueueItem {
23
+ id: string;
24
+ title: string;
25
+ tag: string;
26
+ state: string;
27
+ attempts: number;
28
+ /** Why the last attempt was thrown away, when there was one. */
29
+ lastFailure: string | null;
30
+ evidence: {
31
+ path: string;
32
+ line: number | null;
33
+ }[];
34
+ }
35
+ export interface AgentSnapshot {
36
+ schemaVersion: number;
37
+ cliVersion: string;
38
+ project: {
39
+ name: string;
40
+ configured: boolean;
41
+ id: string | null;
42
+ };
43
+ machine: {
44
+ paired: boolean;
45
+ id: string | null;
46
+ serverUrl: string | null;
47
+ };
48
+ run: {
49
+ live: boolean;
50
+ id: string | null;
51
+ branch: string | null;
52
+ startedAt: string | null;
53
+ endedAt: string | null;
54
+ stopReason: string | null;
55
+ /** Whether events are still arriving; null when no run has ever happened. */
56
+ stale: boolean | null;
57
+ };
58
+ round: {
59
+ n: number | null;
60
+ itemId: string | null;
61
+ title: string | null;
62
+ attempt: number | null;
63
+ phase: string | null;
64
+ checks: {
65
+ name: string;
66
+ ok: boolean;
67
+ skipped: boolean;
68
+ ms: number;
69
+ }[];
70
+ } | null;
71
+ totals: {
72
+ rounds: number;
73
+ committed: number;
74
+ discarded: number;
75
+ abandoned: number;
76
+ };
77
+ queue: {
78
+ ready: number;
79
+ draft: number;
80
+ blocked: number;
81
+ total: number;
82
+ items: AgentQueueItem[];
83
+ };
84
+ questions: {
85
+ id: string;
86
+ text: string;
87
+ default: string;
88
+ deadline: string;
89
+ }[];
90
+ /** Guidance for a caller deciding what to do next, in machine terms. */
91
+ suggests: string | null;
92
+ }
93
+ export interface AgentInput {
94
+ cliVersion: string;
95
+ config: LooplyConfig | null;
96
+ status: Status | null;
97
+ items: readonly Item[];
98
+ machine: {
99
+ paired: boolean;
100
+ id: string | null;
101
+ serverUrl: string | null;
102
+ };
103
+ now: number;
104
+ staleAfterMs?: number;
105
+ /** Cap on items included; the counts stay complete regardless. */
106
+ limit?: number;
107
+ }
108
+ /**
109
+ * What a caller should probably do next, as a stable token rather than prose.
110
+ *
111
+ * Deliberately not a sentence: a program branching on `"scan"` keeps working
112
+ * when the wording changes, and a program branching on English does not.
113
+ */
114
+ export declare function suggestion(input: {
115
+ configured: boolean;
116
+ live: boolean;
117
+ ready: number;
118
+ draft: number;
119
+ openQuestions: number;
120
+ }): string | null;
121
+ export declare function buildSnapshot(input: AgentInput): AgentSnapshot;
122
+ /** Stable two-space JSON — diffable, and readable when a human ends up reading it. */
123
+ export declare function renderAgentJson(snapshot: AgentSnapshot): string;
124
+ /**
125
+ * The same snapshot as lines of `key=value`.
126
+ *
127
+ * For shell callers, where reaching for `jq` to learn whether a run is going is
128
+ * more ceremony than the question deserves.
129
+ */
130
+ export declare function renderAgentText(s: AgentSnapshot): string;
131
+ //# sourceMappingURL=agent-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-cmd.d.ts","sourceRoot":"","sources":["../src/agent-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AACjD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAE7C;;;;;;;;;;;;;;;;;GAiBG;AAEH,eAAO,MAAM,oBAAoB,IAAI,CAAC;AAEtC,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,gEAAgE;IAChE,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,QAAQ,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,EAAE,CAAC;CACnD;AAED,MAAM,WAAW,aAAa;IAC5B,aAAa,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;IACnB,OAAO,EAAE;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAClE,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC1E,GAAG,EAAE;QACH,IAAI,EAAE,OAAO,CAAC;QACd,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAClB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;QACzB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,6EAA6E;QAC7E,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;KACvB,CAAC;IACF,KAAK,EAAE;QACL,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACjB,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;QACtB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;QACvB,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;QACrB,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,OAAO,CAAC;YAAC,OAAO,EAAE,OAAO,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,EAAE,CAAC;KACvE,GAAG,IAAI,CAAC;IACT,MAAM,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,CAAC;IACpF,KAAK,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,cAAc,EAAE,CAAA;KAAE,CAAC;IACjG,SAAS,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IAC7E,wEAAwE;IACxE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAED,MAAM,WAAW,UAAU;IACzB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;IAC5B,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,EAAE,SAAS,IAAI,EAAE,CAAC;IACvB,OAAO,EAAE;QAAE,MAAM,EAAE,OAAO,CAAC;QAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC1E,GAAG,EAAE,MAAM,CAAC;IACZ,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,kEAAkE;IAClE,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAKD;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,KAAK,EAAE;IAChC,UAAU,EAAE,OAAO,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;IACd,aAAa,EAAE,MAAM,CAAC;CACvB,GAAG,MAAM,GAAG,IAAI,CAMhB;AAED,wBAAgB,aAAa,CAAC,KAAK,EAAE,UAAU,GAAG,aAAa,CAqE9D;AAcD,sFAAsF;AACtF,wBAAgB,eAAe,CAAC,QAAQ,EAAE,aAAa,GAAG,MAAM,CAE/D;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,CAAC,EAAE,aAAa,GAAG,MAAM,CAmBxD"}