looply-cli 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (785) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +137 -3
  3. package/dist/.src-hash +1 -0
  4. package/dist/acceptance-observe.d.ts +108 -0
  5. package/dist/acceptance-observe.d.ts.map +1 -0
  6. package/dist/acceptance-observe.js +152 -0
  7. package/dist/acceptance-observe.js.map +1 -0
  8. package/dist/agent-cmd.d.ts +131 -0
  9. package/dist/agent-cmd.d.ts.map +1 -0
  10. package/dist/agent-cmd.js +154 -0
  11. package/dist/agent-cmd.js.map +1 -0
  12. package/dist/agent-contained.d.ts +114 -0
  13. package/dist/agent-contained.d.ts.map +1 -0
  14. package/dist/agent-contained.js +292 -0
  15. package/dist/agent-contained.js.map +1 -0
  16. package/dist/agent-driver.d.ts +130 -0
  17. package/dist/agent-driver.d.ts.map +1 -0
  18. package/dist/agent-driver.js +170 -0
  19. package/dist/agent-driver.js.map +1 -0
  20. package/dist/agent-envelope.d.ts +94 -0
  21. package/dist/agent-envelope.d.ts.map +1 -0
  22. package/dist/agent-envelope.js +214 -0
  23. package/dist/agent-envelope.js.map +1 -0
  24. package/dist/agent-exec.d.ts +182 -0
  25. package/dist/agent-exec.d.ts.map +1 -0
  26. package/dist/agent-exec.js +125 -0
  27. package/dist/agent-exec.js.map +1 -0
  28. package/dist/agent-runtime.d.ts +23 -0
  29. package/dist/agent-runtime.d.ts.map +1 -0
  30. package/dist/agent-runtime.js +143 -0
  31. package/dist/agent-runtime.js.map +1 -0
  32. package/dist/approval-gate-read.d.ts +66 -0
  33. package/dist/approval-gate-read.d.ts.map +1 -0
  34. package/dist/approval-gate-read.js +138 -0
  35. package/dist/approval-gate-read.js.map +1 -0
  36. package/dist/approval-resolution.d.ts +87 -0
  37. package/dist/approval-resolution.d.ts.map +1 -0
  38. package/dist/approval-resolution.js +100 -0
  39. package/dist/approval-resolution.js.map +1 -0
  40. package/dist/approval-resumes.d.ts +102 -0
  41. package/dist/approval-resumes.d.ts.map +1 -0
  42. package/dist/approval-resumes.js +167 -0
  43. package/dist/approval-resumes.js.map +1 -0
  44. package/dist/ask-brain.d.ts +167 -0
  45. package/dist/ask-brain.d.ts.map +1 -0
  46. package/dist/ask-brain.js +355 -0
  47. package/dist/ask-brain.js.map +1 -0
  48. package/dist/autonomy-authority.d.ts +80 -0
  49. package/dist/autonomy-authority.d.ts.map +1 -0
  50. package/dist/autonomy-authority.js +82 -0
  51. package/dist/autonomy-authority.js.map +1 -0
  52. package/dist/autonomy-controller.d.ts +321 -0
  53. package/dist/autonomy-controller.d.ts.map +1 -0
  54. package/dist/autonomy-controller.js +517 -0
  55. package/dist/autonomy-controller.js.map +1 -0
  56. package/dist/autonomy-store.d.ts +327 -0
  57. package/dist/autonomy-store.d.ts.map +1 -0
  58. package/dist/autonomy-store.js +581 -0
  59. package/dist/autonomy-store.js.map +1 -0
  60. package/dist/autonomy-tick.d.ts +257 -0
  61. package/dist/autonomy-tick.d.ts.map +1 -0
  62. package/dist/autonomy-tick.js +616 -0
  63. package/dist/autonomy-tick.js.map +1 -0
  64. package/dist/bin.d.ts +3 -0
  65. package/dist/bin.d.ts.map +1 -0
  66. package/dist/bin.js +2719 -0
  67. package/dist/bin.js.map +1 -0
  68. package/dist/brain-advice.d.ts +21 -0
  69. package/dist/brain-advice.d.ts.map +1 -0
  70. package/dist/brain-advice.js +51 -0
  71. package/dist/brain-advice.js.map +1 -0
  72. package/dist/candidate-replay-runtime.d.ts +125 -0
  73. package/dist/candidate-replay-runtime.d.ts.map +1 -0
  74. package/dist/candidate-replay-runtime.js +188 -0
  75. package/dist/candidate-replay-runtime.js.map +1 -0
  76. package/dist/checkout-carry.d.ts +76 -0
  77. package/dist/checkout-carry.d.ts.map +1 -0
  78. package/dist/checkout-carry.js +125 -0
  79. package/dist/checkout-carry.js.map +1 -0
  80. package/dist/citation-readers.d.ts +26 -0
  81. package/dist/citation-readers.d.ts.map +1 -0
  82. package/dist/citation-readers.js +102 -0
  83. package/dist/citation-readers.js.map +1 -0
  84. package/dist/command-receipts.d.ts +79 -0
  85. package/dist/command-receipts.d.ts.map +1 -0
  86. package/dist/command-receipts.js +143 -0
  87. package/dist/command-receipts.js.map +1 -0
  88. package/dist/command-runner.d.ts +32 -0
  89. package/dist/command-runner.d.ts.map +1 -0
  90. package/dist/command-runner.js +108 -0
  91. package/dist/command-runner.js.map +1 -0
  92. package/dist/compatible-sets.d.ts +67 -0
  93. package/dist/compatible-sets.d.ts.map +1 -0
  94. package/dist/compatible-sets.js +81 -0
  95. package/dist/compatible-sets.js.map +1 -0
  96. package/dist/compile-check.d.ts +31 -0
  97. package/dist/compile-check.d.ts.map +1 -0
  98. package/dist/compile-check.js +34 -0
  99. package/dist/compile-check.js.map +1 -0
  100. package/dist/compile-store.d.ts +16 -0
  101. package/dist/compile-store.d.ts.map +1 -0
  102. package/dist/compile-store.js +21 -0
  103. package/dist/compile-store.js.map +1 -0
  104. package/dist/completion.d.ts +106 -0
  105. package/dist/completion.d.ts.map +1 -0
  106. package/dist/completion.js +131 -0
  107. package/dist/completion.js.map +1 -0
  108. package/dist/config.d.ts +549 -0
  109. package/dist/config.d.ts.map +1 -0
  110. package/dist/config.js +763 -0
  111. package/dist/config.js.map +1 -0
  112. package/dist/control-file.d.ts +142 -0
  113. package/dist/control-file.d.ts.map +1 -0
  114. package/dist/control-file.js +144 -0
  115. package/dist/control-file.js.map +1 -0
  116. package/dist/coordinator-state.d.ts +131 -0
  117. package/dist/coordinator-state.d.ts.map +1 -0
  118. package/dist/coordinator-state.js +380 -0
  119. package/dist/coordinator-state.js.map +1 -0
  120. package/dist/coordinator.d.ts +95 -0
  121. package/dist/coordinator.d.ts.map +1 -0
  122. package/dist/coordinator.js +97 -0
  123. package/dist/coordinator.js.map +1 -0
  124. package/dist/cursor-store.d.ts +53 -0
  125. package/dist/cursor-store.d.ts.map +1 -0
  126. package/dist/cursor-store.js +98 -0
  127. package/dist/cursor-store.js.map +1 -0
  128. package/dist/daemon-cmd.d.ts +239 -0
  129. package/dist/daemon-cmd.d.ts.map +1 -0
  130. package/dist/daemon-cmd.js +1751 -0
  131. package/dist/daemon-cmd.js.map +1 -0
  132. package/dist/daemon-lock.d.ts +140 -0
  133. package/dist/daemon-lock.d.ts.map +1 -0
  134. package/dist/daemon-lock.js +352 -0
  135. package/dist/daemon-lock.js.map +1 -0
  136. package/dist/daemon-recovery.d.ts +78 -0
  137. package/dist/daemon-recovery.d.ts.map +1 -0
  138. package/dist/daemon-recovery.js +161 -0
  139. package/dist/daemon-recovery.js.map +1 -0
  140. package/dist/daemon.d.ts +368 -0
  141. package/dist/daemon.d.ts.map +1 -0
  142. package/dist/daemon.js +601 -0
  143. package/dist/daemon.js.map +1 -0
  144. package/dist/declared-response-shape.d.ts +93 -0
  145. package/dist/declared-response-shape.d.ts.map +1 -0
  146. package/dist/declared-response-shape.js +200 -0
  147. package/dist/declared-response-shape.js.map +1 -0
  148. package/dist/declared-surfaces.d.ts +16 -0
  149. package/dist/declared-surfaces.d.ts.map +1 -0
  150. package/dist/declared-surfaces.js +19 -0
  151. package/dist/declared-surfaces.js.map +1 -0
  152. package/dist/depends-review.d.ts +113 -0
  153. package/dist/depends-review.d.ts.map +1 -0
  154. package/dist/depends-review.js +110 -0
  155. package/dist/depends-review.js.map +1 -0
  156. package/dist/doctor.d.ts +91 -0
  157. package/dist/doctor.d.ts.map +1 -0
  158. package/dist/doctor.js +71 -0
  159. package/dist/doctor.js.map +1 -0
  160. package/dist/edge-approval.d.ts +105 -0
  161. package/dist/edge-approval.d.ts.map +1 -0
  162. package/dist/edge-approval.js +100 -0
  163. package/dist/edge-approval.js.map +1 -0
  164. package/dist/evidence-cache.d.ts +45 -0
  165. package/dist/evidence-cache.d.ts.map +1 -0
  166. package/dist/evidence-cache.js +90 -0
  167. package/dist/evidence-cache.js.map +1 -0
  168. package/dist/evidence-cmd.d.ts +133 -0
  169. package/dist/evidence-cmd.d.ts.map +1 -0
  170. package/dist/evidence-cmd.js +347 -0
  171. package/dist/evidence-cmd.js.map +1 -0
  172. package/dist/evidence-facts.d.ts +40 -0
  173. package/dist/evidence-facts.d.ts.map +1 -0
  174. package/dist/evidence-facts.js +114 -0
  175. package/dist/evidence-facts.js.map +1 -0
  176. package/dist/exclusive-lock.d.ts +52 -0
  177. package/dist/exclusive-lock.d.ts.map +1 -0
  178. package/dist/exclusive-lock.js +150 -0
  179. package/dist/exclusive-lock.js.map +1 -0
  180. package/dist/exec-domains.d.ts +140 -0
  181. package/dist/exec-domains.d.ts.map +1 -0
  182. package/dist/exec-domains.js +287 -0
  183. package/dist/exec-domains.js.map +1 -0
  184. package/dist/exemption-store.d.ts +197 -0
  185. package/dist/exemption-store.d.ts.map +1 -0
  186. package/dist/exemption-store.js +266 -0
  187. package/dist/exemption-store.js.map +1 -0
  188. package/dist/explicit-start-gate.d.ts +96 -0
  189. package/dist/explicit-start-gate.d.ts.map +1 -0
  190. package/dist/explicit-start-gate.js +103 -0
  191. package/dist/explicit-start-gate.js.map +1 -0
  192. package/dist/fs-trouble.d.ts +70 -0
  193. package/dist/fs-trouble.d.ts.map +1 -0
  194. package/dist/fs-trouble.js +98 -0
  195. package/dist/fs-trouble.js.map +1 -0
  196. package/dist/gate.d.ts +278 -0
  197. package/dist/gate.d.ts.map +1 -0
  198. package/dist/gate.js +278 -0
  199. package/dist/gate.js.map +1 -0
  200. package/dist/git-driver.d.ts +519 -0
  201. package/dist/git-driver.d.ts.map +1 -0
  202. package/dist/git-driver.js +900 -0
  203. package/dist/git-driver.js.map +1 -0
  204. package/dist/git-push-executor.d.ts +41 -0
  205. package/dist/git-push-executor.d.ts.map +1 -0
  206. package/dist/git-push-executor.js +142 -0
  207. package/dist/git-push-executor.js.map +1 -0
  208. package/dist/glob.d.ts +26 -0
  209. package/dist/glob.d.ts.map +1 -0
  210. package/dist/glob.js +93 -0
  211. package/dist/glob.js.map +1 -0
  212. package/dist/goal-adaptive.d.ts +295 -0
  213. package/dist/goal-adaptive.d.ts.map +1 -0
  214. package/dist/goal-adaptive.js +393 -0
  215. package/dist/goal-adaptive.js.map +1 -0
  216. package/dist/goal-compile.d.ts +342 -0
  217. package/dist/goal-compile.d.ts.map +1 -0
  218. package/dist/goal-compile.js +444 -0
  219. package/dist/goal-compile.js.map +1 -0
  220. package/dist/goal-depends-executor.d.ts +55 -0
  221. package/dist/goal-depends-executor.d.ts.map +1 -0
  222. package/dist/goal-depends-executor.js +202 -0
  223. package/dist/goal-depends-executor.js.map +1 -0
  224. package/dist/goal-execution-evidence.d.ts +135 -0
  225. package/dist/goal-execution-evidence.d.ts.map +1 -0
  226. package/dist/goal-execution-evidence.js +159 -0
  227. package/dist/goal-execution-evidence.js.map +1 -0
  228. package/dist/goal-gap.d.ts +140 -0
  229. package/dist/goal-gap.d.ts.map +1 -0
  230. package/dist/goal-gap.js +197 -0
  231. package/dist/goal-gap.js.map +1 -0
  232. package/dist/goal-met-target.d.ts +98 -0
  233. package/dist/goal-met-target.d.ts.map +1 -0
  234. package/dist/goal-met-target.js +92 -0
  235. package/dist/goal-met-target.js.map +1 -0
  236. package/dist/goal-ownership.d.ts +416 -0
  237. package/dist/goal-ownership.d.ts.map +1 -0
  238. package/dist/goal-ownership.js +576 -0
  239. package/dist/goal-ownership.js.map +1 -0
  240. package/dist/goal-runs.d.ts +82 -0
  241. package/dist/goal-runs.d.ts.map +1 -0
  242. package/dist/goal-runs.js +120 -0
  243. package/dist/goal-runs.js.map +1 -0
  244. package/dist/goal-store.d.ts +146 -0
  245. package/dist/goal-store.d.ts.map +1 -0
  246. package/dist/goal-store.js +294 -0
  247. package/dist/goal-store.js.map +1 -0
  248. package/dist/goal-view.d.ts +156 -0
  249. package/dist/goal-view.d.ts.map +1 -0
  250. package/dist/goal-view.js +499 -0
  251. package/dist/goal-view.js.map +1 -0
  252. package/dist/governed-approvals.d.ts +152 -0
  253. package/dist/governed-approvals.d.ts.map +1 -0
  254. package/dist/governed-approvals.js +246 -0
  255. package/dist/governed-approvals.js.map +1 -0
  256. package/dist/governed-broker.d.ts +169 -0
  257. package/dist/governed-broker.d.ts.map +1 -0
  258. package/dist/governed-broker.js +196 -0
  259. package/dist/governed-broker.js.map +1 -0
  260. package/dist/governed-run.d.ts +220 -0
  261. package/dist/governed-run.d.ts.map +1 -0
  262. package/dist/governed-run.js +406 -0
  263. package/dist/governed-run.js.map +1 -0
  264. package/dist/grant-reconcile.d.ts +63 -0
  265. package/dist/grant-reconcile.d.ts.map +1 -0
  266. package/dist/grant-reconcile.js +121 -0
  267. package/dist/grant-reconcile.js.map +1 -0
  268. package/dist/index-for-head.d.ts +56 -0
  269. package/dist/index-for-head.d.ts.map +1 -0
  270. package/dist/index-for-head.js +103 -0
  271. package/dist/index-for-head.js.map +1 -0
  272. package/dist/index.d.ts +39 -0
  273. package/dist/index.d.ts.map +1 -0
  274. package/dist/index.js +55 -0
  275. package/dist/index.js.map +1 -0
  276. package/dist/init-detect.d.ts +39 -0
  277. package/dist/init-detect.d.ts.map +1 -0
  278. package/dist/init-detect.js +188 -0
  279. package/dist/init-detect.js.map +1 -0
  280. package/dist/integration-deps.d.ts +62 -0
  281. package/dist/integration-deps.d.ts.map +1 -0
  282. package/dist/integration-deps.js +251 -0
  283. package/dist/integration-deps.js.map +1 -0
  284. package/dist/integration-runtime.d.ts +458 -0
  285. package/dist/integration-runtime.d.ts.map +1 -0
  286. package/dist/integration-runtime.js +681 -0
  287. package/dist/integration-runtime.js.map +1 -0
  288. package/dist/integration.d.ts +45 -0
  289. package/dist/integration.d.ts.map +1 -0
  290. package/dist/integration.js +87 -0
  291. package/dist/integration.js.map +1 -0
  292. package/dist/integrator.d.ts +84 -0
  293. package/dist/integrator.d.ts.map +1 -0
  294. package/dist/integrator.js +193 -0
  295. package/dist/integrator.js.map +1 -0
  296. package/dist/lane-claims.d.ts +174 -0
  297. package/dist/lane-claims.d.ts.map +1 -0
  298. package/dist/lane-claims.js +218 -0
  299. package/dist/lane-claims.js.map +1 -0
  300. package/dist/lane-coverage.d.ts +87 -0
  301. package/dist/lane-coverage.d.ts.map +1 -0
  302. package/dist/lane-coverage.js +129 -0
  303. package/dist/lane-coverage.js.map +1 -0
  304. package/dist/ledger-replay.d.ts +115 -0
  305. package/dist/ledger-replay.d.ts.map +1 -0
  306. package/dist/ledger-replay.js +155 -0
  307. package/dist/ledger-replay.js.map +1 -0
  308. package/dist/ledger-store.d.ts +68 -0
  309. package/dist/ledger-store.d.ts.map +1 -0
  310. package/dist/ledger-store.js +111 -0
  311. package/dist/ledger-store.js.map +1 -0
  312. package/dist/loop-safety-observer.d.ts +132 -0
  313. package/dist/loop-safety-observer.d.ts.map +1 -0
  314. package/dist/loop-safety-observer.js +76 -0
  315. package/dist/loop-safety-observer.js.map +1 -0
  316. package/dist/loop-safety-store.d.ts +339 -0
  317. package/dist/loop-safety-store.d.ts.map +1 -0
  318. package/dist/loop-safety-store.js +800 -0
  319. package/dist/loop-safety-store.js.map +1 -0
  320. package/dist/machine-store.d.ts +54 -0
  321. package/dist/machine-store.d.ts.map +1 -0
  322. package/dist/machine-store.js +149 -0
  323. package/dist/machine-store.js.map +1 -0
  324. package/dist/mcp-main.d.ts +2 -0
  325. package/dist/mcp-main.d.ts.map +1 -0
  326. package/dist/mcp-main.js +116 -0
  327. package/dist/mcp-main.js.map +1 -0
  328. package/dist/mcp-server.d.ts +72 -0
  329. package/dist/mcp-server.d.ts.map +1 -0
  330. package/dist/mcp-server.js +259 -0
  331. package/dist/mcp-server.js.map +1 -0
  332. package/dist/model-routing.d.ts +75 -0
  333. package/dist/model-routing.d.ts.map +1 -0
  334. package/dist/model-routing.js +108 -0
  335. package/dist/model-routing.js.map +1 -0
  336. package/dist/model-transport.d.ts +188 -0
  337. package/dist/model-transport.d.ts.map +1 -0
  338. package/dist/model-transport.js +625 -0
  339. package/dist/model-transport.js.map +1 -0
  340. package/dist/notify-cadence.d.ts +55 -0
  341. package/dist/notify-cadence.d.ts.map +1 -0
  342. package/dist/notify-cadence.js +68 -0
  343. package/dist/notify-cadence.js.map +1 -0
  344. package/dist/notify-channel.d.ts +69 -0
  345. package/dist/notify-channel.d.ts.map +1 -0
  346. package/dist/notify-channel.js +151 -0
  347. package/dist/notify-channel.js.map +1 -0
  348. package/dist/notify.d.ts +71 -0
  349. package/dist/notify.d.ts.map +1 -0
  350. package/dist/notify.js +125 -0
  351. package/dist/notify.js.map +1 -0
  352. package/dist/observation-inventory.d.ts +65 -0
  353. package/dist/observation-inventory.d.ts.map +1 -0
  354. package/dist/observation-inventory.js +139 -0
  355. package/dist/observation-inventory.js.map +1 -0
  356. package/dist/owned-children.d.ts +45 -0
  357. package/dist/owned-children.d.ts.map +1 -0
  358. package/dist/owned-children.js +64 -0
  359. package/dist/owned-children.js.map +1 -0
  360. package/dist/packet-for-goal.d.ts +19 -0
  361. package/dist/packet-for-goal.d.ts.map +1 -0
  362. package/dist/packet-for-goal.js +32 -0
  363. package/dist/packet-for-goal.js.map +1 -0
  364. package/dist/pair-cmd.d.ts +85 -0
  365. package/dist/pair-cmd.d.ts.map +1 -0
  366. package/dist/pair-cmd.js +205 -0
  367. package/dist/pair-cmd.js.map +1 -0
  368. package/dist/partial-asker.d.ts +96 -0
  369. package/dist/partial-asker.d.ts.map +1 -0
  370. package/dist/partial-asker.js +117 -0
  371. package/dist/partial-asker.js.map +1 -0
  372. package/dist/pdf-text-lines.d.ts +17 -0
  373. package/dist/pdf-text-lines.d.ts.map +1 -0
  374. package/dist/pdf-text-lines.js +70 -0
  375. package/dist/pdf-text-lines.js.map +1 -0
  376. package/dist/pdf-text-worker.d.ts +2 -0
  377. package/dist/pdf-text-worker.d.ts.map +1 -0
  378. package/dist/pdf-text-worker.js +81 -0
  379. package/dist/pdf-text-worker.js.map +1 -0
  380. package/dist/pdf-text.d.ts +56 -0
  381. package/dist/pdf-text.d.ts.map +1 -0
  382. package/dist/pdf-text.js +64 -0
  383. package/dist/pdf-text.js.map +1 -0
  384. package/dist/pending-action.d.ts +154 -0
  385. package/dist/pending-action.d.ts.map +1 -0
  386. package/dist/pending-action.js +148 -0
  387. package/dist/pending-action.js.map +1 -0
  388. package/dist/preemptor.d.ts +40 -0
  389. package/dist/preemptor.d.ts.map +1 -0
  390. package/dist/preemptor.js +49 -0
  391. package/dist/preemptor.js.map +1 -0
  392. package/dist/programme-mode.d.ts +29 -0
  393. package/dist/programme-mode.d.ts.map +1 -0
  394. package/dist/programme-mode.js +50 -0
  395. package/dist/programme-mode.js.map +1 -0
  396. package/dist/progress-view.d.ts +14 -0
  397. package/dist/progress-view.d.ts.map +1 -0
  398. package/dist/progress-view.js +114 -0
  399. package/dist/progress-view.js.map +1 -0
  400. package/dist/project-graph-builder.d.ts +81 -0
  401. package/dist/project-graph-builder.d.ts.map +1 -0
  402. package/dist/project-graph-builder.js +246 -0
  403. package/dist/project-graph-builder.js.map +1 -0
  404. package/dist/project-graph-runtime.d.ts +86 -0
  405. package/dist/project-graph-runtime.d.ts.map +1 -0
  406. package/dist/project-graph-runtime.js +112 -0
  407. package/dist/project-graph-runtime.js.map +1 -0
  408. package/dist/project-index-builder.d.ts +96 -0
  409. package/dist/project-index-builder.d.ts.map +1 -0
  410. package/dist/project-index-builder.js +298 -0
  411. package/dist/project-index-builder.js.map +1 -0
  412. package/dist/project-index-facts.d.ts +51 -0
  413. package/dist/project-index-facts.d.ts.map +1 -0
  414. package/dist/project-index-facts.js +117 -0
  415. package/dist/project-index-facts.js.map +1 -0
  416. package/dist/project-index-store.d.ts +97 -0
  417. package/dist/project-index-store.d.ts.map +1 -0
  418. package/dist/project-index-store.js +140 -0
  419. package/dist/project-index-store.js.map +1 -0
  420. package/dist/project-memory-store.d.ts +127 -0
  421. package/dist/project-memory-store.d.ts.map +1 -0
  422. package/dist/project-memory-store.js +302 -0
  423. package/dist/project-memory-store.js.map +1 -0
  424. package/dist/proposal-store.d.ts +14 -0
  425. package/dist/proposal-store.d.ts.map +1 -0
  426. package/dist/proposal-store.js +19 -0
  427. package/dist/proposal-store.js.map +1 -0
  428. package/dist/prover.d.ts +80 -0
  429. package/dist/prover.d.ts.map +1 -0
  430. package/dist/prover.js +137 -0
  431. package/dist/prover.js.map +1 -0
  432. package/dist/provider-identity-store.d.ts +34 -0
  433. package/dist/provider-identity-store.d.ts.map +1 -0
  434. package/dist/provider-identity-store.js +72 -0
  435. package/dist/provider-identity-store.js.map +1 -0
  436. package/dist/provider-identity.d.ts +104 -0
  437. package/dist/provider-identity.d.ts.map +1 -0
  438. package/dist/provider-identity.js +167 -0
  439. package/dist/provider-identity.js.map +1 -0
  440. package/dist/provider-limit.d.ts +79 -0
  441. package/dist/provider-limit.d.ts.map +1 -0
  442. package/dist/provider-limit.js +148 -0
  443. package/dist/provider-limit.js.map +1 -0
  444. package/dist/provider-preflight.d.ts +171 -0
  445. package/dist/provider-preflight.d.ts.map +1 -0
  446. package/dist/provider-preflight.js +395 -0
  447. package/dist/provider-preflight.js.map +1 -0
  448. package/dist/provider-state.d.ts +120 -0
  449. package/dist/provider-state.d.ts.map +1 -0
  450. package/dist/provider-state.js +182 -0
  451. package/dist/provider-state.js.map +1 -0
  452. package/dist/providers.d.ts +132 -0
  453. package/dist/providers.d.ts.map +1 -0
  454. package/dist/providers.js +161 -0
  455. package/dist/providers.js.map +1 -0
  456. package/dist/publication-recorder.d.ts +117 -0
  457. package/dist/publication-recorder.d.ts.map +1 -0
  458. package/dist/publication-recorder.js +124 -0
  459. package/dist/publication-recorder.js.map +1 -0
  460. package/dist/pursuit-delivery.d.ts +24 -0
  461. package/dist/pursuit-delivery.d.ts.map +1 -0
  462. package/dist/pursuit-delivery.js +38 -0
  463. package/dist/pursuit-delivery.js.map +1 -0
  464. package/dist/queue-store.d.ts +132 -0
  465. package/dist/queue-store.d.ts.map +1 -0
  466. package/dist/queue-store.js +185 -0
  467. package/dist/queue-store.js.map +1 -0
  468. package/dist/queue-summary.d.ts +14 -0
  469. package/dist/queue-summary.d.ts.map +1 -0
  470. package/dist/queue-summary.js +82 -0
  471. package/dist/queue-summary.js.map +1 -0
  472. package/dist/queue-view.d.ts +20 -0
  473. package/dist/queue-view.d.ts.map +1 -0
  474. package/dist/queue-view.js +163 -0
  475. package/dist/queue-view.js.map +1 -0
  476. package/dist/queue-write-lease.d.ts +106 -0
  477. package/dist/queue-write-lease.d.ts.map +1 -0
  478. package/dist/queue-write-lease.js +282 -0
  479. package/dist/queue-write-lease.js.map +1 -0
  480. package/dist/rails-home.d.ts +162 -0
  481. package/dist/rails-home.d.ts.map +1 -0
  482. package/dist/rails-home.js +452 -0
  483. package/dist/rails-home.js.map +1 -0
  484. package/dist/rails-migrations.d.ts +75 -0
  485. package/dist/rails-migrations.d.ts.map +1 -0
  486. package/dist/rails-migrations.js +199 -0
  487. package/dist/rails-migrations.js.map +1 -0
  488. package/dist/rails-stores.d.ts +49 -0
  489. package/dist/rails-stores.d.ts.map +1 -0
  490. package/dist/rails-stores.js +100 -0
  491. package/dist/rails-stores.js.map +1 -0
  492. package/dist/reaper.d.ts +69 -0
  493. package/dist/reaper.d.ts.map +1 -0
  494. package/dist/reaper.js +152 -0
  495. package/dist/reaper.js.map +1 -0
  496. package/dist/record-store.d.ts +36 -0
  497. package/dist/record-store.d.ts.map +1 -0
  498. package/dist/record-store.js +78 -0
  499. package/dist/record-store.js.map +1 -0
  500. package/dist/recovery-io.d.ts +50 -0
  501. package/dist/recovery-io.d.ts.map +1 -0
  502. package/dist/recovery-io.js +122 -0
  503. package/dist/recovery-io.js.map +1 -0
  504. package/dist/recovery.d.ts +146 -0
  505. package/dist/recovery.d.ts.map +1 -0
  506. package/dist/recovery.js +110 -0
  507. package/dist/recovery.js.map +1 -0
  508. package/dist/redraw.d.ts +34 -0
  509. package/dist/redraw.d.ts.map +1 -0
  510. package/dist/redraw.js +62 -0
  511. package/dist/redraw.js.map +1 -0
  512. package/dist/rejected-evidence.d.ts +255 -0
  513. package/dist/rejected-evidence.d.ts.map +1 -0
  514. package/dist/rejected-evidence.js +324 -0
  515. package/dist/rejected-evidence.js.map +1 -0
  516. package/dist/report-cmd.d.ts +32 -0
  517. package/dist/report-cmd.d.ts.map +1 -0
  518. package/dist/report-cmd.js +201 -0
  519. package/dist/report-cmd.js.map +1 -0
  520. package/dist/repos-cmd.d.ts +80 -0
  521. package/dist/repos-cmd.d.ts.map +1 -0
  522. package/dist/repos-cmd.js +240 -0
  523. package/dist/repos-cmd.js.map +1 -0
  524. package/dist/request-body-shape.d.ts +93 -0
  525. package/dist/request-body-shape.d.ts.map +1 -0
  526. package/dist/request-body-shape.js +407 -0
  527. package/dist/request-body-shape.js.map +1 -0
  528. package/dist/requirement-claims.d.ts +89 -0
  529. package/dist/requirement-claims.d.ts.map +1 -0
  530. package/dist/requirement-claims.js +92 -0
  531. package/dist/requirement-claims.js.map +1 -0
  532. package/dist/retention-apply-runtime.d.ts +105 -0
  533. package/dist/retention-apply-runtime.d.ts.map +1 -0
  534. package/dist/retention-apply-runtime.js +269 -0
  535. package/dist/retention-apply-runtime.js.map +1 -0
  536. package/dist/reverify.d.ts +41 -0
  537. package/dist/reverify.d.ts.map +1 -0
  538. package/dist/reverify.js +69 -0
  539. package/dist/reverify.js.map +1 -0
  540. package/dist/round-records.d.ts +65 -0
  541. package/dist/round-records.d.ts.map +1 -0
  542. package/dist/round-records.js +61 -0
  543. package/dist/round-records.js.map +1 -0
  544. package/dist/round-runner.d.ts +924 -0
  545. package/dist/round-runner.d.ts.map +1 -0
  546. package/dist/round-runner.js +1693 -0
  547. package/dist/round-runner.js.map +1 -0
  548. package/dist/run-approval.d.ts +180 -0
  549. package/dist/run-approval.d.ts.map +1 -0
  550. package/dist/run-approval.js +199 -0
  551. package/dist/run-approval.js.map +1 -0
  552. package/dist/run-cmd.d.ts +359 -0
  553. package/dist/run-cmd.d.ts.map +1 -0
  554. package/dist/run-cmd.js +4418 -0
  555. package/dist/run-cmd.js.map +1 -0
  556. package/dist/run-delivery.d.ts +71 -0
  557. package/dist/run-delivery.d.ts.map +1 -0
  558. package/dist/run-delivery.js +104 -0
  559. package/dist/run-delivery.js.map +1 -0
  560. package/dist/run-ended.d.ts +75 -0
  561. package/dist/run-ended.d.ts.map +1 -0
  562. package/dist/run-ended.js +27 -0
  563. package/dist/run-ended.js.map +1 -0
  564. package/dist/run-ending-locator.d.ts +125 -0
  565. package/dist/run-ending-locator.d.ts.map +1 -0
  566. package/dist/run-ending-locator.js +133 -0
  567. package/dist/run-ending-locator.js.map +1 -0
  568. package/dist/run-launcher.d.ts +459 -0
  569. package/dist/run-launcher.d.ts.map +1 -0
  570. package/dist/run-launcher.js +652 -0
  571. package/dist/run-launcher.js.map +1 -0
  572. package/dist/run-lease.d.ts +208 -0
  573. package/dist/run-lease.d.ts.map +1 -0
  574. package/dist/run-lease.js +301 -0
  575. package/dist/run-lease.js.map +1 -0
  576. package/dist/run-refusal-marks.d.ts +189 -0
  577. package/dist/run-refusal-marks.d.ts.map +1 -0
  578. package/dist/run-refusal-marks.js +249 -0
  579. package/dist/run-refusal-marks.js.map +1 -0
  580. package/dist/run-start-marks.d.ts +153 -0
  581. package/dist/run-start-marks.d.ts.map +1 -0
  582. package/dist/run-start-marks.js +269 -0
  583. package/dist/run-start-marks.js.map +1 -0
  584. package/dist/scan-cmd.d.ts +14 -0
  585. package/dist/scan-cmd.d.ts.map +1 -0
  586. package/dist/scan-cmd.js +270 -0
  587. package/dist/scan-cmd.js.map +1 -0
  588. package/dist/scan-events.d.ts +50 -0
  589. package/dist/scan-events.d.ts.map +1 -0
  590. package/dist/scan-events.js +91 -0
  591. package/dist/scan-events.js.map +1 -0
  592. package/dist/scan.d.ts +191 -0
  593. package/dist/scan.d.ts.map +1 -0
  594. package/dist/scan.js +417 -0
  595. package/dist/scan.js.map +1 -0
  596. package/dist/scope-rule.d.ts +148 -0
  597. package/dist/scope-rule.d.ts.map +1 -0
  598. package/dist/scope-rule.js +121 -0
  599. package/dist/scope-rule.js.map +1 -0
  600. package/dist/self-repo-id.d.ts +18 -0
  601. package/dist/self-repo-id.d.ts.map +1 -0
  602. package/dist/self-repo-id.js +70 -0
  603. package/dist/self-repo-id.js.map +1 -0
  604. package/dist/server-client.d.ts +766 -0
  605. package/dist/server-client.d.ts.map +1 -0
  606. package/dist/server-client.js +475 -0
  607. package/dist/server-client.js.map +1 -0
  608. package/dist/session-adapter-runtime.d.ts +195 -0
  609. package/dist/session-adapter-runtime.d.ts.map +1 -0
  610. package/dist/session-adapter-runtime.js +373 -0
  611. package/dist/session-adapter-runtime.js.map +1 -0
  612. package/dist/session-checkpoint-runtime.d.ts +62 -0
  613. package/dist/session-checkpoint-runtime.d.ts.map +1 -0
  614. package/dist/session-checkpoint-runtime.js +268 -0
  615. package/dist/session-checkpoint-runtime.js.map +1 -0
  616. package/dist/session-control-transport.d.ts +106 -0
  617. package/dist/session-control-transport.d.ts.map +1 -0
  618. package/dist/session-control-transport.js +232 -0
  619. package/dist/session-control-transport.js.map +1 -0
  620. package/dist/session-observation-store.d.ts +98 -0
  621. package/dist/session-observation-store.d.ts.map +1 -0
  622. package/dist/session-observation-store.js +155 -0
  623. package/dist/session-observation-store.js.map +1 -0
  624. package/dist/session-observe-runtime.d.ts +123 -0
  625. package/dist/session-observe-runtime.d.ts.map +1 -0
  626. package/dist/session-observe-runtime.js +317 -0
  627. package/dist/session-observe-runtime.js.map +1 -0
  628. package/dist/session-store.d.ts +98 -0
  629. package/dist/session-store.d.ts.map +1 -0
  630. package/dist/session-store.js +116 -0
  631. package/dist/session-store.js.map +1 -0
  632. package/dist/sessions-cmd.d.ts +202 -0
  633. package/dist/sessions-cmd.d.ts.map +1 -0
  634. package/dist/sessions-cmd.js +609 -0
  635. package/dist/sessions-cmd.js.map +1 -0
  636. package/dist/settings-overlay.d.ts +53 -0
  637. package/dist/settings-overlay.d.ts.map +1 -0
  638. package/dist/settings-overlay.js +175 -0
  639. package/dist/settings-overlay.js.map +1 -0
  640. package/dist/setup-prompt.d.ts +34 -0
  641. package/dist/setup-prompt.d.ts.map +1 -0
  642. package/dist/setup-prompt.js +92 -0
  643. package/dist/setup-prompt.js.map +1 -0
  644. package/dist/setup.d.ts +103 -0
  645. package/dist/setup.d.ts.map +1 -0
  646. package/dist/setup.js +283 -0
  647. package/dist/setup.js.map +1 -0
  648. package/dist/shared-grants.d.ts +164 -0
  649. package/dist/shared-grants.d.ts.map +1 -0
  650. package/dist/shared-grants.js +242 -0
  651. package/dist/shared-grants.js.map +1 -0
  652. package/dist/signals.d.ts +55 -0
  653. package/dist/signals.d.ts.map +1 -0
  654. package/dist/signals.js +85 -0
  655. package/dist/signals.js.map +1 -0
  656. package/dist/source-cmd.d.ts +201 -0
  657. package/dist/source-cmd.d.ts.map +1 -0
  658. package/dist/source-cmd.js +684 -0
  659. package/dist/source-cmd.js.map +1 -0
  660. package/dist/source-verdict.d.ts +99 -0
  661. package/dist/source-verdict.d.ts.map +1 -0
  662. package/dist/source-verdict.js +182 -0
  663. package/dist/source-verdict.js.map +1 -0
  664. package/dist/spend-ledger.d.ts +350 -0
  665. package/dist/spend-ledger.d.ts.map +1 -0
  666. package/dist/spend-ledger.js +546 -0
  667. package/dist/spend-ledger.js.map +1 -0
  668. package/dist/stale-run-sweep.d.ts +79 -0
  669. package/dist/stale-run-sweep.d.ts.map +1 -0
  670. package/dist/stale-run-sweep.js +116 -0
  671. package/dist/stale-run-sweep.js.map +1 -0
  672. package/dist/start-attempts.d.ts +385 -0
  673. package/dist/start-attempts.d.ts.map +1 -0
  674. package/dist/start-attempts.js +613 -0
  675. package/dist/start-attempts.js.map +1 -0
  676. package/dist/status-cmd.d.ts +28 -0
  677. package/dist/status-cmd.d.ts.map +1 -0
  678. package/dist/status-cmd.js +116 -0
  679. package/dist/status-cmd.js.map +1 -0
  680. package/dist/stop-follow-up.d.ts +107 -0
  681. package/dist/stop-follow-up.d.ts.map +1 -0
  682. package/dist/stop-follow-up.js +172 -0
  683. package/dist/stop-follow-up.js.map +1 -0
  684. package/dist/surface-lease.d.ts +118 -0
  685. package/dist/surface-lease.d.ts.map +1 -0
  686. package/dist/surface-lease.js +485 -0
  687. package/dist/surface-lease.js.map +1 -0
  688. package/dist/sync.d.ts +54 -0
  689. package/dist/sync.d.ts.map +1 -0
  690. package/dist/sync.js +93 -0
  691. package/dist/sync.js.map +1 -0
  692. package/dist/syncing-ledger.d.ts +45 -0
  693. package/dist/syncing-ledger.d.ts.map +1 -0
  694. package/dist/syncing-ledger.js +53 -0
  695. package/dist/syncing-ledger.js.map +1 -0
  696. package/dist/temp-fixtures.d.ts +68 -0
  697. package/dist/temp-fixtures.d.ts.map +1 -0
  698. package/dist/temp-fixtures.js +38 -0
  699. package/dist/temp-fixtures.js.map +1 -0
  700. package/dist/token-window.d.ts +84 -0
  701. package/dist/token-window.d.ts.map +1 -0
  702. package/dist/token-window.js +143 -0
  703. package/dist/token-window.js.map +1 -0
  704. package/dist/tool-bridge.d.ts +177 -0
  705. package/dist/tool-bridge.d.ts.map +1 -0
  706. package/dist/tool-bridge.js +329 -0
  707. package/dist/tool-bridge.js.map +1 -0
  708. package/dist/tool-call-record.d.ts +197 -0
  709. package/dist/tool-call-record.d.ts.map +1 -0
  710. package/dist/tool-call-record.js +276 -0
  711. package/dist/tool-call-record.js.map +1 -0
  712. package/dist/tool-protocol.d.ts +135 -0
  713. package/dist/tool-protocol.d.ts.map +1 -0
  714. package/dist/tool-protocol.js +104 -0
  715. package/dist/tool-protocol.js.map +1 -0
  716. package/dist/tool-worker.d.ts +3 -0
  717. package/dist/tool-worker.d.ts.map +1 -0
  718. package/dist/tool-worker.js +478 -0
  719. package/dist/tool-worker.js.map +1 -0
  720. package/dist/toolchain-mirror.d.ts +86 -0
  721. package/dist/toolchain-mirror.d.ts.map +1 -0
  722. package/dist/toolchain-mirror.js +307 -0
  723. package/dist/toolchain-mirror.js.map +1 -0
  724. package/dist/trusted-git.d.ts +243 -0
  725. package/dist/trusted-git.d.ts.map +1 -0
  726. package/dist/trusted-git.js +920 -0
  727. package/dist/trusted-git.js.map +1 -0
  728. package/dist/ui.d.ts +76 -0
  729. package/dist/ui.d.ts.map +1 -0
  730. package/dist/ui.js +118 -0
  731. package/dist/ui.js.map +1 -0
  732. package/dist/untrusted-exec.d.ts +275 -0
  733. package/dist/untrusted-exec.d.ts.map +1 -0
  734. package/dist/untrusted-exec.js +479 -0
  735. package/dist/untrusted-exec.js.map +1 -0
  736. package/dist/untrusted-gate.d.ts +73 -0
  737. package/dist/untrusted-gate.d.ts.map +1 -0
  738. package/dist/untrusted-gate.js +226 -0
  739. package/dist/untrusted-gate.js.map +1 -0
  740. package/dist/uploader.d.ts +153 -0
  741. package/dist/uploader.d.ts.map +1 -0
  742. package/dist/uploader.js +204 -0
  743. package/dist/uploader.js.map +1 -0
  744. package/dist/verifier.d.ts +66 -0
  745. package/dist/verifier.d.ts.map +1 -0
  746. package/dist/verifier.js +170 -0
  747. package/dist/verifier.js.map +1 -0
  748. package/dist/verify-apply.d.ts +26 -0
  749. package/dist/verify-apply.d.ts.map +1 -0
  750. package/dist/verify-apply.js +36 -0
  751. package/dist/verify-apply.js.map +1 -0
  752. package/dist/verify-cmd.d.ts +44 -0
  753. package/dist/verify-cmd.d.ts.map +1 -0
  754. package/dist/verify-cmd.js +125 -0
  755. package/dist/verify-cmd.js.map +1 -0
  756. package/dist/verify-pass.d.ts +73 -0
  757. package/dist/verify-pass.d.ts.map +1 -0
  758. package/dist/verify-pass.js +103 -0
  759. package/dist/verify-pass.js.map +1 -0
  760. package/dist/welcome.d.ts +43 -0
  761. package/dist/welcome.d.ts.map +1 -0
  762. package/dist/welcome.js +116 -0
  763. package/dist/welcome.js.map +1 -0
  764. package/dist/workspace-provisioner.d.ts +65 -0
  765. package/dist/workspace-provisioner.d.ts.map +1 -0
  766. package/dist/workspace-provisioner.js +66 -0
  767. package/dist/workspace-provisioner.js.map +1 -0
  768. package/dist/workspace-quarantine.d.ts +64 -0
  769. package/dist/workspace-quarantine.d.ts.map +1 -0
  770. package/dist/workspace-quarantine.js +156 -0
  771. package/dist/workspace-quarantine.js.map +1 -0
  772. package/dist/workspace-residue-sweep.d.ts +113 -0
  773. package/dist/workspace-residue-sweep.d.ts.map +1 -0
  774. package/dist/workspace-residue-sweep.js +158 -0
  775. package/dist/workspace-residue-sweep.js.map +1 -0
  776. package/dist/workspace.d.ts +639 -0
  777. package/dist/workspace.d.ts.map +1 -0
  778. package/dist/workspace.js +2026 -0
  779. package/dist/workspace.js.map +1 -0
  780. package/package.json +54 -6
  781. package/win/CredProbe.cs +64 -0
  782. package/win/FakeClaude.cs +56 -0
  783. package/win/HandleProbe.cs +116 -0
  784. package/win/TokenProbe.cs +53 -0
  785. package/win/appcontainer.ps1 +500 -0
@@ -0,0 +1,182 @@
1
+ import type { CommandResult } from './gate';
2
+ import type { OwnedChildren } from './owned-children';
3
+ import type { Effort, RoleModels } from './model-routing';
4
+ /**
5
+ * How looply starts a coding agent.
6
+ *
7
+ * **The prompt never touches the command line.** It is written to the agent's
8
+ * stdin and stdin is closed; the command line carries flags only. That is the
9
+ * whole point of this module, and it is not a stylistic preference:
10
+ *
11
+ * - Prompts are multi-line. `spawn(cmd, { shell: true })` on Windows runs
12
+ * `cmd.exe /d /s /c "<cmd>"`, and cmd.exe ends the command at the first
13
+ * newline. Every looply agent call made before this module existed delivered
14
+ * only the first line of its prompt — `["-p", "You are one round of looply."]`
15
+ * — and dropped every flag after it. The agent, handed a sentence fragment
16
+ * and no contract, answered in prose or asked what it was for. That is the
17
+ * sole reason `looply run` had never completed a round and `scan` never
18
+ * produced findings.
19
+ * - POSIX escaping is not escaping on cmd.exe: an escaped quote or dollar sign
20
+ * arrives as a literal backslash, so even a one-line prompt was corrupted.
21
+ * - cmd.exe caps a command line at 8191 characters. The prover prompt embeds a
22
+ * whole diff, so it would have blown that ceiling as soon as a round changed
23
+ * anything substantial.
24
+ *
25
+ * Sending the prompt down stdin removes all three at once, on every platform,
26
+ * with no quoting layer to get wrong. The command line is built from config the
27
+ * user wrote and carries no round data at all, so there is nothing left to
28
+ * inject into.
29
+ *
30
+ * The agent is still started through a shell, because on Windows the CLI is
31
+ * `claude.cmd` — a batch shim Node has refused to spawn directly since 20.12.
32
+ * That stays safe here precisely because the command line holds no prompt.
33
+ */
34
+ /** The seam the prover and verifier already declared: a prompt, not a command. */
35
+ export type AgentInvoke = (prompt: string, timeoutMs: number) => Promise<CommandResult>;
36
+ /** The slice of a child process this needs; callbacks may fire in any order. */
37
+ export interface AgentSpawnHandle {
38
+ pid: number | undefined;
39
+ onExit(cb: (code: number | null) => void): void;
40
+ onError(cb: (err: Error) => void): void;
41
+ /** Interleaved stdout + stderr, already decoded. */
42
+ onOutput(cb: (chunk: string) => void): void;
43
+ /**
44
+ * Write the prompt and close stdin. Must never throw: an agent that exits
45
+ * before reading its prompt makes this EPIPE, and that is a failed round to
46
+ * report, not a crash of the runner (DESIGN section 12 case 6).
47
+ */
48
+ writePrompt(text: string): void;
49
+ }
50
+ export interface AgentExecDeps {
51
+ spawn(cmd: string): AgentSpawnHandle;
52
+ /** Must take down `pid` and every descendant, not just `pid`. */
53
+ killTree(pid: number): void;
54
+ now(): number;
55
+ }
56
+ /**
57
+ * Build an {@link AgentInvoke} over a fixed command line.
58
+ *
59
+ * Settlement rules match the gate's command runner deliberately — first outcome
60
+ * wins, and a timeout kills the tree then resolves immediately rather than
61
+ * waiting for an exit that may never come — so a hung agent and a hung test
62
+ * behave the same way and there is one story to reason about.
63
+ */
64
+ export declare function makeAgentRunner(deps: AgentExecDeps, command: string,
65
+ /**
66
+ * Where to register the spawned process while it runs.
67
+ *
68
+ * Optional so every existing caller and test is unaffected. Given one, the
69
+ * run can stop its agent on the way out instead of leaving it editing the
70
+ * repository with no parent — measured: a hard-killed runner leaves the leaf
71
+ * process alive and still writing.
72
+ */
73
+ owned?: OwnedChildren): AgentInvoke;
74
+ export declare function nodeAgentSpawn(cmd: string): AgentSpawnHandle;
75
+ /**
76
+ * The agent command, as configured.
77
+ *
78
+ * `command` is the invocation minus the output format, which each caller picks:
79
+ * the implementer, prover and verifier want the plain transcript, while `scan`
80
+ * reads the structured envelope. Neither ever appends anything derived from the
81
+ * repository, so the line stays free of round data.
82
+ */
83
+ export interface AgentSpec {
84
+ command: string;
85
+ outputFormatFlag: string;
86
+ /**
87
+ * Which model each role runs, for the BUILT-IN provider — `--model` on the
88
+ * mediated invocation. `default` covers every role not named; `brain` is the
89
+ * one a project usually names separately. Absent means the provider's own
90
+ * default, which is what every project got before this existed.
91
+ *
92
+ * ⚠️ IGNORED for a configured `agent.command`, like `executable` below: looply
93
+ * cannot guess the flag somebody else's binary takes for a model, and a flag
94
+ * that silently does nothing reads exactly like one that works.
95
+ *
96
+ * A Fable model may be named for `brain` only; `parseConfig` refuses anything
97
+ * else, and `model-routing.ts` says why.
98
+ */
99
+ models?: RoleModels;
100
+ /** `--effort` on every built-in turn. Absent leaves it to the provider. */
101
+ effort?: Effort;
102
+ /**
103
+ * An ABSOLUTE path to the built-in provider's executable, when it is not
104
+ * where `claudePackageDir` looks.
105
+ *
106
+ * 🔴 IT SELECTS A BINARY, NOT A MEDIATION. This exists so a Claude Code
107
+ * installed somewhere other than `node_modules/@anthropic-ai/claude-code`
108
+ * still goes through the MEDIATED path — the one that passes `--tools ""`,
109
+ * `--strict-mcp-config` and an `--allowedTools` list naming only Looply's
110
+ * bridge. The alternative was to configure it as a generic `agent.command`,
111
+ * which takes the configured branch: that appends the declared suppression
112
+ * arguments but wires no MCP bridge at all, so the model would end up with
113
+ * NO tools rather than only Looply's. A weaker configuration for a provider
114
+ * Looply has a purpose-built adapter for is the wrong trade.
115
+ *
116
+ * ⚠️ IGNORED unless `command` is the default. Writing an `agent.command`
117
+ * means "drive this as an unknown binary", and this must not quietly
118
+ * re-route that back through Claude's flags.
119
+ */
120
+ executable?: string;
121
+ /**
122
+ * Directories the contained agent may read and execute from.
123
+ *
124
+ * A provider runtime usually lives OUTSIDE the repository, which is right —
125
+ * it is machine material, not model-editable source. A contained process can
126
+ * only run what it was granted, so it has to be told where that is, and told
127
+ * EXPLICITLY: parsing the command line to guess would put a heuristic between
128
+ * a config string and a filesystem permission.
129
+ *
130
+ * The built-in provider needs none of this; it resolves its own package.
131
+ */
132
+ runtime?: readonly string[];
133
+ /**
134
+ * Environment variables to forward into the contained agent, BY NAME.
135
+ *
136
+ * A contained agent inherits nothing, which is the point — but a configured
137
+ * provider may genuinely need something from the environment: an API base
138
+ * URL, a model name, a provider key. Naming them is a deliberate act by a
139
+ * person, in a file the model cannot write, and it forwards the VALUE the
140
+ * daemon holds rather than putting a secret in the config.
141
+ *
142
+ * Nothing is forwarded unless it is named here. "The agent does not
143
+ * automatically inherit the daemon's environment" stays true; this is the
144
+ * word "automatically" doing its work.
145
+ */
146
+ env?: readonly string[];
147
+ /**
148
+ * HOW THIS PROVIDER IS STOPPED FROM USING ITS OWN TOOLS.
149
+ *
150
+ * 🔴 THE DEFAULT PROVIDER GETS `allowedToolArgs`; A CONFIGURED ONE GOT
151
+ * NOTHING. "The model gets no host tools" was delivered by Claude flags on
152
+ * one branch and by nothing at all on the other — so a configured provider
153
+ * launched through `cmd.exe` with its own file, shell and network tools fully
154
+ * enabled, beside a daemon holding a machine token.
155
+ *
156
+ * ⚠️ AND IT CANNOT BE FIXED BY INVENTING FLAGS. Looply does not know what
157
+ * argument turns an unknown binary's tools off, and guessing would be worse
158
+ * than the gap: a flag that silently does nothing reads exactly like one that
159
+ * works. So the person states it, in a file the model cannot write, and a
160
+ * provider that states nothing is REFUSED rather than launched unmediated.
161
+ *
162
+ * The built-in provider needs none of this; it has its own branch.
163
+ */
164
+ noHostTools?: readonly string[];
165
+ /**
166
+ * WHICH `agent.*` KEYS THE CONFIG FILE ACTUALLY CONTAINED.
167
+ *
168
+ * Set by `parseConfig` and read by `resolveProvider`, which needs to tell
169
+ * "the person wrote this" from "the parser defaulted it". Optional, so every
170
+ * hand-built spec in this tree and in every test keeps working — an absent
171
+ * list means "nothing is known to be explicit", which is the direction that
172
+ * lets a preset supply its own facts.
173
+ */
174
+ declared?: readonly string[];
175
+ }
176
+ export declare const DEFAULT_AGENT: AgentSpec;
177
+ export declare function agentCommandLine(spec: AgentSpec, format: 'text' | 'json'): string;
178
+ /** Text transcript: the implementer, the prover and the verifier. */
179
+ export declare function nodeAgentRunner(spec?: AgentSpec, owned?: OwnedChildren): AgentInvoke;
180
+ /** Structured envelope: `scan`, which reads `result` off the JSON. */
181
+ export declare function nodeAgentJsonRunner(spec?: AgentSpec): AgentInvoke;
182
+ //# sourceMappingURL=agent-exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-exec.d.ts","sourceRoot":"","sources":["../src/agent-exec.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,QAAQ,CAAC;AAC5C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,kFAAkF;AAClF,MAAM,MAAM,WAAW,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;AAExF,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,MAAM,CAAC,EAAE,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,GAAG,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,KAAK,KAAK,IAAI,GAAG,IAAI,CAAC;IACxC,oDAAoD;IACpD,QAAQ,CAAC,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,IAAI,GAAG,IAAI,CAAC;IAC5C;;;;OAIG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,MAAM,WAAW,aAAa;IAC5B,KAAK,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CAAC;IACrC,iEAAiE;IACjE,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,GAAG,IAAI,MAAM,CAAC;CACf;AAED;;;;;;;GAOG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,aAAa,EACnB,OAAO,EAAE,MAAM;AACf;;;;;;;GAOG;AACH,KAAK,CAAC,EAAE,aAAa,GACpB,WAAW,CA+Cb;AAED,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,gBAAgB,CA8B5D;AAQD;;;;;;;GAOG;AACH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,gBAAgB,EAAE,MAAM,CAAC;IACzB;;;;;;;;;;;;OAYG;IACH,MAAM,CAAC,EAAE,UAAU,CAAC;IACpB,2EAA2E;IAC3E,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;;;;;;;;;;;;;;OAiBG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;;;OAUG;IACH,OAAO,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAC5B;;;;;;;;;;;;OAYG;IACH,GAAG,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IACxB;;;;;;;;;;;;;;;;OAgBG;IACH,WAAW,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;IAChC;;;;;;;;OAQG;IACH,QAAQ,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;CAC9B;AAED,eAAO,MAAM,aAAa,EAAE,SAG3B,CAAC;AAEF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,MAAM,CAEjF;AAED,qEAAqE;AACrE,wBAAgB,eAAe,CAAC,IAAI,GAAE,SAAyB,EAAE,KAAK,CAAC,EAAE,aAAa,GAAG,WAAW,CAEnG;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,CAAC,IAAI,GAAE,SAAyB,GAAG,WAAW,CAEhF"}
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_AGENT = void 0;
4
+ exports.makeAgentRunner = makeAgentRunner;
5
+ exports.nodeAgentSpawn = nodeAgentSpawn;
6
+ exports.agentCommandLine = agentCommandLine;
7
+ exports.nodeAgentRunner = nodeAgentRunner;
8
+ exports.nodeAgentJsonRunner = nodeAgentJsonRunner;
9
+ const node_child_process_1 = require("node:child_process");
10
+ const command_runner_1 = require("./command-runner");
11
+ /**
12
+ * Build an {@link AgentInvoke} over a fixed command line.
13
+ *
14
+ * Settlement rules match the gate's command runner deliberately — first outcome
15
+ * wins, and a timeout kills the tree then resolves immediately rather than
16
+ * waiting for an exit that may never come — so a hung agent and a hung test
17
+ * behave the same way and there is one story to reason about.
18
+ */
19
+ function makeAgentRunner(deps, command,
20
+ /**
21
+ * Where to register the spawned process while it runs.
22
+ *
23
+ * Optional so every existing caller and test is unaffected. Given one, the
24
+ * run can stop its agent on the way out instead of leaving it editing the
25
+ * repository with no parent — measured: a hard-killed runner leaves the leaf
26
+ * process alive and still writing.
27
+ */
28
+ owned) {
29
+ return (prompt, timeoutMs) => new Promise((resolve) => {
30
+ const started = deps.now();
31
+ const chunks = [];
32
+ let settled = false;
33
+ let timer;
34
+ let release;
35
+ const finish = (ok, timedOut) => {
36
+ if (settled)
37
+ return;
38
+ settled = true;
39
+ if (timer !== undefined)
40
+ clearTimeout(timer);
41
+ // Given back the moment it settles, so a finished agent is not killed
42
+ // later by a shutdown that thinks it is still running.
43
+ release?.();
44
+ resolve({ ok, timedOut, ms: deps.now() - started, output: chunks.join('') });
45
+ };
46
+ const handle = deps.spawn(command);
47
+ if (owned && handle.pid !== undefined) {
48
+ const pid = handle.pid;
49
+ release = owned.adopt({
50
+ pid,
51
+ label: 'coding agent',
52
+ kill: () => deps.killTree(pid),
53
+ });
54
+ }
55
+ handle.onOutput((c) => chunks.push(c));
56
+ handle.onError((err) => {
57
+ // Kept in the output so "the agent is not installed" reads differently
58
+ // in the round log from "the agent disagreed".
59
+ chunks.push(err.message);
60
+ finish(false, false);
61
+ });
62
+ handle.onExit((code) => finish(code === 0, false));
63
+ timer = setTimeout(() => {
64
+ if (settled)
65
+ return;
66
+ if (handle.pid !== undefined)
67
+ deps.killTree(handle.pid);
68
+ finish(false, true);
69
+ }, timeoutMs);
70
+ // After the listeners are attached, so a synchronous EPIPE is reported
71
+ // through onError rather than thrown out of the promise constructor.
72
+ handle.writePrompt(prompt);
73
+ });
74
+ }
75
+ function nodeAgentSpawn(cmd) {
76
+ const child = (0, node_child_process_1.spawn)(cmd, {
77
+ shell: true,
78
+ detached: process.platform !== 'win32',
79
+ stdio: ['pipe', 'pipe', 'pipe'],
80
+ });
81
+ const errCbs = [];
82
+ child.on('error', (e) => errCbs.forEach((cb) => cb(e)));
83
+ // A child that exits before reading its prompt raises EPIPE on the stream
84
+ // rather than at the write call, so the stream needs a listener of its own or
85
+ // Node treats it as unhandled and takes the whole run down with it.
86
+ child.stdin?.on('error', (e) => errCbs.forEach((cb) => cb(e)));
87
+ return {
88
+ pid: child.pid,
89
+ onExit: (cb) => child.on('exit', (code) => cb(code)),
90
+ onError: (cb) => errCbs.push(cb),
91
+ onOutput: (cb) => {
92
+ child.stdout?.on('data', (d) => cb(d.toString('utf8')));
93
+ child.stderr?.on('data', (d) => cb(d.toString('utf8')));
94
+ },
95
+ writePrompt: (text) => {
96
+ try {
97
+ child.stdin?.end(text);
98
+ }
99
+ catch {
100
+ // Already reported through the stream's own error listener above.
101
+ }
102
+ },
103
+ };
104
+ }
105
+ const nodeDeps = {
106
+ spawn: nodeAgentSpawn,
107
+ killTree: command_runner_1.nodeKillTree,
108
+ now: () => Date.now(),
109
+ };
110
+ exports.DEFAULT_AGENT = {
111
+ command: 'claude -p --dangerously-skip-permissions',
112
+ outputFormatFlag: '--output-format',
113
+ };
114
+ function agentCommandLine(spec, format) {
115
+ return spec.outputFormatFlag ? `${spec.command} ${spec.outputFormatFlag} ${format}` : spec.command;
116
+ }
117
+ /** Text transcript: the implementer, the prover and the verifier. */
118
+ function nodeAgentRunner(spec = exports.DEFAULT_AGENT, owned) {
119
+ return makeAgentRunner(nodeDeps, agentCommandLine(spec, 'text'), owned);
120
+ }
121
+ /** Structured envelope: `scan`, which reads `result` off the JSON. */
122
+ function nodeAgentJsonRunner(spec = exports.DEFAULT_AGENT) {
123
+ return makeAgentRunner(nodeDeps, agentCommandLine(spec, 'json'));
124
+ }
125
+ //# sourceMappingURL=agent-exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-exec.js","sourceRoot":"","sources":["../src/agent-exec.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Why this path may not be granted to untrusted execution, or null if it may.
3
+ *
4
+ * Compared as resolved paths rather than as strings: `C:\Users\x\..\x` is the
5
+ * same directory as `C:\Users\x`, and a check that could not see that would be
6
+ * a check somebody routes around by accident.
7
+ */
8
+ export declare function unsafeRuntimeGrant(path: string, home?: string, projectDir?: string): string | null;
9
+ /**
10
+ * Validate every declared runtime path, or say which one is wrong.
11
+ *
12
+ * Fails closed on the whole list: a configuration with one unsafe entry is a
13
+ * configuration nobody has checked, and running with the rest of it would be
14
+ * obeying half of what was written.
15
+ */
16
+ export declare function checkRuntimeGrants(paths: readonly string[], home?: string, projectDir?: string): {
17
+ ok: true;
18
+ paths: string[];
19
+ } | {
20
+ ok: false;
21
+ because: string;
22
+ };
23
+ //# sourceMappingURL=agent-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runtime.d.ts","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"AAwFA;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,IAAI,GAAE,MAAkB,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB,MAAM,GAAG,IAAI,CA4Bf;AAED;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAChC,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,IAAI,GAAE,MAAkB,EACxB,UAAU,CAAC,EAAE,MAAM,GAClB;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAQhE"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.unsafeRuntimeGrant = unsafeRuntimeGrant;
4
+ exports.checkRuntimeGrants = checkRuntimeGrants;
5
+ const node_fs_1 = require("node:fs");
6
+ const node_os_1 = require("node:os");
7
+ const node_path_1 = require("node:path");
8
+ const untrusted_exec_1 = require("./untrusted-exec");
9
+ /**
10
+ * WHERE A CONFIGURED AGENT'S RUNTIME IS ALLOWED TO LIVE.
11
+ *
12
+ * A contained agent can only execute what it was granted, and the provider
13
+ * runtime is trusted machine material that generally sits OUTSIDE the
14
+ * model-editable repository — which is right, and which means containment needs
15
+ * to be told where it is.
16
+ *
17
+ * It must be TOLD, not have it inferred. A command line is not an authority
18
+ * description: parsing `node C:\somewhere\agent.js --flag` to guess what to
19
+ * grant would be a heuristic standing between untrusted input and a filesystem
20
+ * permission, and the first quoting surprise becomes a grant nobody intended.
21
+ * So the grant is a separate, explicit field a person writes.
22
+ *
23
+ * `.looply/config.yaml` is already protected from contained execution, so the
24
+ * model cannot edit its own next launch. That is what makes it safe to treat
25
+ * this as human configuration — and it is why the protection matters more now
26
+ * than it did when it was only about gate commands.
27
+ */
28
+ /**
29
+ * Roots too broad to grant, whatever the configuration says.
30
+ *
31
+ * Not a blocklist of paths somebody might type — a check that the grant is not
32
+ * a root whose whole subtree would come with it. Granting the home directory
33
+ * hands over `~/.looply/machine.json` and `~/.claude`; granting a drive root
34
+ * hands over everything.
35
+ */
36
+ function forbiddenRoots(home = (0, node_os_1.homedir)()) {
37
+ const win = (0, untrusted_exec_1.systemRoot)();
38
+ const roots = [
39
+ home,
40
+ (0, node_path_1.resolve)(home, '.looply'),
41
+ (0, node_path_1.resolve)(home, '.claude'),
42
+ win,
43
+ (0, node_path_1.resolve)(win, '..'),
44
+ process.env['ProgramFiles'] ?? 'C:\\Program Files',
45
+ process.env['ProgramFiles(x86)'] ?? 'C:\\Program Files (x86)',
46
+ process.env['APPDATA'] ?? (0, node_path_1.resolve)(home, 'AppData', 'Roaming'),
47
+ process.env['LOCALAPPDATA'] ?? (0, node_path_1.resolve)(home, 'AppData', 'Local'),
48
+ (0, node_path_1.resolve)(home, 'AppData'),
49
+ ];
50
+ return roots.map((r) => (0, node_path_1.resolve)(r));
51
+ }
52
+ /** True when `p` IS `root`, or `root` itself is inside `p`. */
53
+ function coversOrIs(p, root) {
54
+ const a = (0, node_path_1.resolve)(p);
55
+ const b = (0, node_path_1.resolve)(root);
56
+ if (a.toLowerCase() === b.toLowerCase())
57
+ return true;
58
+ // `p` is an ANCESTOR of a forbidden root — granting it grants that root too.
59
+ const withSep = a.endsWith(node_path_1.sep) ? a : a + node_path_1.sep;
60
+ return b.toLowerCase().startsWith(withSep.toLowerCase());
61
+ }
62
+ /**
63
+ * Every name for this path: the lexical one, and the one it really is.
64
+ *
65
+ * A lexical check alone reads a junction as an ordinary directory. `mklink /J`
66
+ * needs no privilege on Windows, a junction to the home directory resolves to
67
+ * itself under `resolve`, and the ACL a grant writes follows the reparse point
68
+ * to the target — so a forbidden root would have been granted under a name that
69
+ * never looked like one.
70
+ *
71
+ * Both names are checked rather than only the real one, because a path can be
72
+ * unsafe either way round: a link that lands somewhere forbidden, or a plain
73
+ * forbidden path that resolves elsewhere.
74
+ *
75
+ * A path that does not exist yet has no real name, so only the lexical one is
76
+ * available. That gap is not closable from here: the grant is applied moments
77
+ * after this check, and anything that can create a junction in between can
78
+ * already write where the runtime lives.
79
+ */
80
+ function bothNames(path) {
81
+ const lexical = (0, node_path_1.resolve)(path);
82
+ try {
83
+ const real = (0, node_path_1.resolve)(node_fs_1.realpathSync.native(lexical));
84
+ return real.toLowerCase() === lexical.toLowerCase() ? [lexical] : [lexical, real];
85
+ }
86
+ catch {
87
+ return [lexical];
88
+ }
89
+ }
90
+ /**
91
+ * Why this path may not be granted to untrusted execution, or null if it may.
92
+ *
93
+ * Compared as resolved paths rather than as strings: `C:\Users\x\..\x` is the
94
+ * same directory as `C:\Users\x`, and a check that could not see that would be
95
+ * a check somebody routes around by accident.
96
+ */
97
+ function unsafeRuntimeGrant(path, home = (0, node_os_1.homedir)(), projectDir) {
98
+ const bad = forbiddenRoots(home);
99
+ for (const p of bothNames(path)) {
100
+ // INSIDE THE WORKTREE IS NOT A PLACE A RUNTIME MAY LIVE.
101
+ //
102
+ // This is the one place the validate-then-grant race is actually winnable.
103
+ // Everywhere else a declared runtime path sits outside the worktree, where
104
+ // contained execution holds no grant and so cannot swap a directory for a
105
+ // link between the check above and the moment the ACL is written. Inside
106
+ // the worktree the model has write access by design, so it could.
107
+ //
108
+ // Refusing costs nothing: the worktree is already granted in full, so a
109
+ // runtime declared there would be reachable anyway. What the declaration
110
+ // would add is only the race.
111
+ if (projectDir !== undefined && coversOrIs((0, node_path_1.resolve)(projectDir), p)) {
112
+ return `${path} is inside the project worktree, which the model can write`;
113
+ }
114
+ const root = (0, node_path_1.parse)(p).root;
115
+ if (p.toLowerCase() === (0, node_path_1.resolve)(root).toLowerCase()) {
116
+ return `${path} is a drive root, which would grant the whole machine`;
117
+ }
118
+ for (const b of bad) {
119
+ if (coversOrIs(p, b)) {
120
+ return `${path} covers ${b}, which holds credentials or machine state`;
121
+ }
122
+ }
123
+ }
124
+ return null;
125
+ }
126
+ /**
127
+ * Validate every declared runtime path, or say which one is wrong.
128
+ *
129
+ * Fails closed on the whole list: a configuration with one unsafe entry is a
130
+ * configuration nobody has checked, and running with the rest of it would be
131
+ * obeying half of what was written.
132
+ */
133
+ function checkRuntimeGrants(paths, home = (0, node_os_1.homedir)(), projectDir) {
134
+ const out = [];
135
+ for (const p of paths) {
136
+ const bad = unsafeRuntimeGrant(p, home, projectDir);
137
+ if (bad !== null)
138
+ return { ok: false, because: `agent.runtime: ${bad}` };
139
+ out.push((0, node_path_1.resolve)(p));
140
+ }
141
+ return { ok: true, paths: out };
142
+ }
143
+ //# sourceMappingURL=agent-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-runtime.js","sourceRoot":"","sources":["../src/agent-runtime.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,66 @@
1
+ import { type ApprovalGate } from '@looply/core';
2
+ import type { ServerApprovalRow } from './server-client';
3
+ /**
4
+ * ASKING THE SERVER WHAT A PURSUIT IS WAITING FOR.
5
+ *
6
+ * The thin half of the gate: one HTTP read, a shape check, and the pure
7
+ * derivation. Everything that could be a judgement lives in
8
+ * `deriveApprovalGate`, so this file has no branches about what an approval
9
+ * MEANS — only about whether it was heard.
10
+ *
11
+ * ─────────────────────────────────────────────────────────────────────────────
12
+ * IT FAILS CLOSED, AND THAT IS THE WHOLE REASON IT IS NOT INLINE.
13
+ *
14
+ * The tempting shape is `catch { return { kind: 'none' } }`, and it is the one
15
+ * mistake that matters here. "I could not ask" and "there is nothing
16
+ * outstanding" arrive as the same silence and are opposite facts: the first
17
+ * means a person may be mid-decision, and treating it as the second is a
18
+ * machine carrying on past a question it simply could not see.
19
+ *
20
+ * So a read that does not produce a well-formed answer produces `unknown`,
21
+ * which holds — and holding is free, because the next tick asks again.
22
+ */
23
+ /** Just enough of the client to ask. Injected so a test can fail it precisely. */
24
+ export interface ApprovalReader {
25
+ projectApprovals(projectId: string, goal: {
26
+ goalId: string;
27
+ goalVersion: number;
28
+ }, limit?: number): Promise<ServerApprovalRow[]>;
29
+ }
30
+ export interface ReadApprovalGateInput {
31
+ readonly projectId: string;
32
+ readonly goalId: string;
33
+ readonly goalVersion: number;
34
+ /** Milliseconds since the epoch, from the caller's clock. */
35
+ readonly now: number;
36
+ /**
37
+ * Which of these resolutions a resumed run has already been given.
38
+ *
39
+ * A FUNCTION, and asked with the ids that came back, because the machine
40
+ * cannot know which answers to look for until it has seen which exist. The
41
+ * claims are local: consuming a resolution is something this machine did, and
42
+ * the row on the server looks identical before and after.
43
+ *
44
+ * A failure here is `unknown`, like every other. A claim that could not be
45
+ * read is not a claim that is not there, and reading it as absent would hand
46
+ * the same answer to a second run.
47
+ */
48
+ readonly consumed?: (approvalIds: readonly string[]) => Promise<{
49
+ ok: true;
50
+ consumed: ReadonlySet<string>;
51
+ } | {
52
+ ok: false;
53
+ because: string;
54
+ }>;
55
+ }
56
+ /**
57
+ * How many rows to ask for.
58
+ *
59
+ * A pursuit at one version accumulates approvals slowly — a run raises at most
60
+ * one and then stops — so this is generous rather than tuned. It exists at all
61
+ * because the route's own default is 50 and silently taking the newest 50 of a
62
+ * larger set would be a gate that stops seeing the oldest outstanding question.
63
+ */
64
+ export declare const APPROVAL_PAGE = 200;
65
+ export declare function readApprovalGate(server: ApprovalReader, input: ReadApprovalGateInput): Promise<ApprovalGate>;
66
+ //# sourceMappingURL=approval-gate-read.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-gate-read.d.ts","sourceRoot":"","sources":["../src/approval-gate-read.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAElB,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAEzD;;;;;;;;;;;;;;;;;;;GAmBG;AAEH,kFAAkF;AAClF,MAAM,WAAW,cAAc;IAC7B,gBAAgB,CACd,SAAS,EAAE,MAAM,EACjB,IAAI,EAAE;QAAE,MAAM,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,MAAM,CAAA;KAAE,EAC7C,KAAK,CAAC,EAAE,MAAM,GACb,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;CACjC;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6DAA6D;IAC7D,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAClB,WAAW,EAAE,SAAS,MAAM,EAAE,KAC3B,OAAO,CAAC;QAAE,EAAE,EAAE,IAAI,CAAC;QAAC,QAAQ,EAAE,WAAW,CAAC,MAAM,CAAC,CAAA;KAAE,GAAG;QAAE,EAAE,EAAE,KAAK,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAC5F;AAED;;;;;;;GAOG;AACH,eAAO,MAAM,aAAa,MAAM,CAAC;AA8EjC,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE,qBAAqB,GAC3B,OAAO,CAAC,YAAY,CAAC,CA6CvB"}