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,329 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TOOL_POLICIES = void 0;
4
+ exports.toolWorkerRoot = toolWorkerRoot;
5
+ exports.ensureToolWorker = ensureToolWorker;
6
+ exports.makeToolBridge = makeToolBridge;
7
+ const node_crypto_1 = require("node:crypto");
8
+ const node_fs_1 = require("node:fs");
9
+ const node_os_1 = require("node:os");
10
+ const node_path_1 = require("node:path");
11
+ const exec_domains_1 = require("./exec-domains");
12
+ const shared_grants_1 = require("./shared-grants");
13
+ const toolchain_mirror_1 = require("./toolchain-mirror");
14
+ const tool_protocol_1 = require("./tool-protocol");
15
+ const untrusted_exec_1 = require("./untrusted-exec");
16
+ const tool_call_record_1 = require("./tool-call-record");
17
+ const core_1 = require("@looply/core");
18
+ /**
19
+ * THE TRUSTED HALF, WHICH DELIBERATELY DOES NO FILE WORK.
20
+ *
21
+ * This is the load-bearing decision of the whole decomposition. The obvious
22
+ * implementation of a tool bridge is:
23
+ *
24
+ * request arrives -> validate the path -> fs.readFile(project + path)
25
+ *
26
+ * and that would put every model-supplied string one validator bug away from
27
+ * the daemon's own authority. So this never touches a project file. It checks
28
+ * the SHAPE of a request, refuses what is obviously not a request at all, and
29
+ * hands the rest to a worker running inside the container.
30
+ *
31
+ * The path checking here is a courtesy, not a boundary: it turns nonsense into
32
+ * a clean structured refusal instead of a container denial that reads like a
33
+ * crash. If it were wrong tomorrow, the worker still resolves the physical path
34
+ * and the container still refuses what it was never granted.
35
+ *
36
+ * WHAT THE MODEL CANNOT CHOOSE. The worker executable, the project root, the
37
+ * container profile, the grants and the network policy all come from the run
38
+ * context. Nothing in a tool request reaches any of them.
39
+ */
40
+ /**
41
+ * The compiled worker, whether this file is running compiled or from source.
42
+ *
43
+ * In production both sit in `dist` together. Under the test runner this module
44
+ * is loaded from `src`, where there is no compiled worker — and the worker MUST
45
+ * be the compiled one either way, because that is the file the container runs.
46
+ * Falling back to the sibling `dist` keeps the tests exercising production's
47
+ * artefact rather than a second copy that could drift from it.
48
+ */
49
+ function workerSourcePath() {
50
+ const beside = (0, node_path_1.join)(__dirname, 'tool-worker.js');
51
+ if ((0, node_fs_1.existsSync)(beside))
52
+ return beside;
53
+ return (0, node_path_1.join)(__dirname, '..', 'dist', 'tool-worker.js');
54
+ }
55
+ /** The worker script, somewhere the container can read and cannot write. */
56
+ function toolWorkerRoot(deps = {}) {
57
+ return deps.workerRoot ?? (0, node_path_1.join)((0, node_os_1.tmpdir)(), 'looply-toolworker');
58
+ }
59
+ /**
60
+ * Put the worker where a contained process can read it.
61
+ *
62
+ * READ ONLY, and keyed by content. The worker is the one thing in this design
63
+ * that runs with the container's grants, so a directory the container could
64
+ * write would be a directory it could replace the worker in — which is the same
65
+ * as having no worker policy at all.
66
+ */
67
+ function ensureToolWorker(deps = {}) {
68
+ const src = deps.workerSource ?? workerSourcePath();
69
+ if (!(0, node_fs_1.existsSync)(src))
70
+ return { ok: false, because: `no tool worker at ${src}` };
71
+ let digest;
72
+ try {
73
+ digest = (0, node_crypto_1.createHash)('sha256').update((0, node_fs_1.readFileSync)(src)).digest('hex').slice(0, 16);
74
+ }
75
+ catch (e) {
76
+ return { ok: false, because: `the tool worker could not be read (${e.message})` };
77
+ }
78
+ const dir = (0, node_path_1.join)(toolWorkerRoot(deps), digest);
79
+ const dest = (0, node_path_1.join)(dir, 'tool-worker.js');
80
+ try {
81
+ (0, node_fs_1.mkdirSync)(dir, { recursive: true });
82
+ // Copied every time rather than trusted once: the copy is cheap and the
83
+ // alternative is believing whatever is already sitting there.
84
+ (0, node_fs_1.copyFileSync)(src, dest);
85
+ }
86
+ catch (e) {
87
+ return { ok: false, because: `the tool worker could not be placed (${e.message})` };
88
+ }
89
+ return { ok: true, path: dest };
90
+ }
91
+ function refuse(tool, code, because) {
92
+ return { ok: false, tool, because, code };
93
+ }
94
+ /**
95
+ * Shape checking only. Anything that depends on what is actually on disk —
96
+ * whether a file exists, whether it is text, where a junction leads — is the
97
+ * worker's business, because the worker is the one inside the boundary.
98
+ */
99
+ function shapeTrouble(req) {
100
+ switch (req.tool) {
101
+ case 'read':
102
+ return (0, tool_protocol_1.pathTrouble)(req.path);
103
+ case 'edit': {
104
+ const p = (0, tool_protocol_1.pathTrouble)(req.path);
105
+ if (p !== null)
106
+ return p;
107
+ if (typeof req.oldText !== 'string' || req.oldText.length === 0)
108
+ return 'oldText is required';
109
+ if (typeof req.newText !== 'string')
110
+ return 'newText is required';
111
+ if (req.expected !== undefined && (!Number.isInteger(req.expected) || req.expected < 1)) {
112
+ return 'expected must be a positive whole number';
113
+ }
114
+ return null;
115
+ }
116
+ case 'write': {
117
+ const p = (0, tool_protocol_1.pathTrouble)(req.path);
118
+ if (p !== null)
119
+ return p;
120
+ if (typeof req.contents !== 'string')
121
+ return 'contents are required';
122
+ if (req.intent !== 'create' && req.intent !== 'overwrite') {
123
+ return 'intent must be create or overwrite';
124
+ }
125
+ if (Buffer.byteLength(req.contents, 'utf8') > tool_protocol_1.LIMITS.writeBytes)
126
+ return 'that is too large to write';
127
+ return null;
128
+ }
129
+ case 'glob':
130
+ if (typeof req.pattern !== 'string' || req.pattern.length === 0)
131
+ return 'a pattern is required';
132
+ return req.under === undefined ? null : (0, tool_protocol_1.pathTrouble)(req.under);
133
+ case 'grep':
134
+ if (typeof req.pattern !== 'string' || req.pattern.length === 0)
135
+ return 'a pattern is required';
136
+ if (req.under !== undefined) {
137
+ const u = (0, tool_protocol_1.pathTrouble)(req.under);
138
+ if (u !== null)
139
+ return u;
140
+ }
141
+ return null;
142
+ default:
143
+ return 'no such tool';
144
+ }
145
+ }
146
+ /**
147
+ * A bridge for one project and one role.
148
+ *
149
+ * The budget is per bridge, which is per provider invocation. It exists because
150
+ * the model may call tools as many times as it likes inside one session and
151
+ * nobody is watching the loop. It is NOT the Goal or autonomy budget — those
152
+ * count provider invocations and belong to Phase 6, which this must not touch.
153
+ */
154
+ function makeToolBridge(projectDir, policy, deps = {}) {
155
+ const backend = deps.backend ?? new untrusted_exec_1.AppContainerBackend();
156
+ const ensureToolchain = deps.toolchain ?? (() => (0, toolchain_mirror_1.ensureToolchainMirror)());
157
+ const timeoutMs = deps.timeoutMs ?? 60_000;
158
+ const now = deps.now ?? Date.now;
159
+ const recorder = deps.record ?? tool_call_record_1.NO_RECORD;
160
+ let calls = 0;
161
+ let bytesRead = 0;
162
+ let bytesWritten = 0;
163
+ /**
164
+ * Serve one request. Every return below is a response the model will see, and
165
+ * `call` writes every one of them down — including the refusals that never
166
+ * reach the worker, which are a large share of what a model ends up quoting.
167
+ */
168
+ const serve = async (raw) => {
169
+ if (raw === null || typeof raw !== 'object') {
170
+ return refuse('unknown', 'bad_request', 'a tool request is required');
171
+ }
172
+ const req = raw;
173
+ const name = req.tool;
174
+ // THE ALLOWLIST IS THE ROLE'S, NOT THE MODEL'S. A scanner that asks to
175
+ // write is refused here, before anything is launched.
176
+ if (!policy.tools.includes(name)) {
177
+ return refuse('unknown', 'bad_request', `the ${policy.role} may not call ${String(name)}`);
178
+ }
179
+ if (calls >= tool_protocol_1.INVOCATION_BUDGET.calls) {
180
+ return refuse(name, 'budget_exhausted', 'this invocation has made too many tool calls');
181
+ }
182
+ if (bytesRead >= tool_protocol_1.INVOCATION_BUDGET.bytesRead) {
183
+ return refuse(name, 'budget_exhausted', 'this invocation has read too much');
184
+ }
185
+ if (bytesWritten >= tool_protocol_1.INVOCATION_BUDGET.bytesWritten) {
186
+ return refuse(name, 'budget_exhausted', 'this invocation has written too much');
187
+ }
188
+ const bad = shapeTrouble(req);
189
+ if (bad !== null)
190
+ return refuse(name, 'bad_request', bad);
191
+ const tools = ensureToolchain();
192
+ if (!tools.ok)
193
+ return refuse(name, 'worker_failed', `no contained toolchain — ${tools.because}`);
194
+ const worker = ensureToolWorker(deps);
195
+ if (!worker.ok)
196
+ return refuse(name, 'worker_failed', worker.because);
197
+ calls += 1;
198
+ /*
199
+ * BOTH SHARED PATHS GO THROUGH THE LOCK, not through the per-launch grant
200
+ * list. The toolchain mirror and the tool-worker directory are shared by
201
+ * every workspace on the machine, and granting them per launch is what left
202
+ * 262 and 509 permanent container ACEs on them. Read and execute only, so
203
+ * the thing running inside the boundary cannot rewrite the thing that will
204
+ * run inside it next time.
205
+ */
206
+ const shared = await (0, shared_grants_1.ensureSharedAccess)(backend instanceof untrusted_exec_1.AppContainerBackend ? backend : null, (0, untrusted_exec_1.containerName)('agent', projectDir), (0, exec_domains_1.sharedGrantPaths)(tools.path, [(0, node_path_1.join)(worker.path, '..')]), deps.sharedGrants ?? {});
207
+ if (!shared.ok)
208
+ return refuse(name, 'worker_failed', `shared grant failed — ${shared.because}`);
209
+ const grants = [...(0, exec_domains_1.untrustedGrants)('agent', projectDir)];
210
+ const out = await backend.run({
211
+ kind: 'agent',
212
+ projectKey: projectDir,
213
+ executable: (0, node_path_1.join)(tools.path, 'node.exe'),
214
+ argv: [worker.path, projectDir],
215
+ cwd: projectDir,
216
+ // The GATE environment, not the provider's: this process runs project
217
+ // files' neighbourhood and needs no provider credential of any kind.
218
+ env: (0, exec_domains_1.buildUntrustedGateEnv)(projectDir, tools.path),
219
+ grants,
220
+ protect: (0, exec_domains_1.protectedPaths)(projectDir),
221
+ // NO NETWORK. The transport reaches the model; the thing that touches
222
+ // files has no reason to reach anything, and this is stronger than the
223
+ // contained-provider design it replaces.
224
+ network: 'none',
225
+ stdin: JSON.stringify(req),
226
+ timeoutMs,
227
+ });
228
+ if (!out.ok) {
229
+ return refuse(name, 'worker_failed', `untrusted execution was unavailable (${out.reason})`);
230
+ }
231
+ if (out.timedOut)
232
+ return refuse(name, 'worker_failed', 'the tool worker did not finish in time');
233
+ let parsed;
234
+ try {
235
+ parsed = JSON.parse(out.stdout.trim());
236
+ }
237
+ catch {
238
+ return refuse(name, 'worker_failed', 'the tool worker did not answer');
239
+ }
240
+ if (parsed.ok) {
241
+ if (name === 'write' || name === 'edit')
242
+ bytesWritten += parsed.bytes ?? 0;
243
+ else
244
+ bytesRead += parsed.bytes ?? Buffer.byteLength(parsed.text, 'utf8');
245
+ }
246
+ return parsed;
247
+ };
248
+ /**
249
+ * The model's request in, the model's answer out, and one line written down
250
+ * about what happened in between.
251
+ *
252
+ * The clock is read around `serve` rather than inside it so a refusal that
253
+ * never launched anything is timed the same way a container run is — "it came
254
+ * back in 2 ms" is itself an answer to "what did the bridge do with this".
255
+ */
256
+ const call = async (raw) => {
257
+ const started = now();
258
+ const res = await serve(raw);
259
+ // A record is not worth a tool call: the recorder swallows its own
260
+ // failures, and this never stands between an answer and the model.
261
+ recorder.record(raw, res, Math.max(0, now() - started));
262
+ return res;
263
+ };
264
+ const proposeAction = (type, payload, note) => {
265
+ const ctx = deps.actionContext;
266
+ if (ctx === undefined) {
267
+ return {
268
+ ok: false,
269
+ code: 'no_context',
270
+ because: 'this run cannot request consequential actions',
271
+ };
272
+ }
273
+ // The context is passed SEPARATELY from the payload on purpose: there is no
274
+ // arrangement of model input that can reach it.
275
+ const built = (0, core_1.buildActionRequest)(type, payload, ctx, note);
276
+ return built.ok
277
+ ? { ok: true, request: built.request }
278
+ : { ok: false, code: built.code, because: built.because };
279
+ };
280
+ return { call, proposeAction, spent: () => ({ calls, bytesRead, bytesWritten }) };
281
+ }
282
+ /**
283
+ * What each role may call.
284
+ *
285
+ * LEAST PRIVILEGE BY ROLE, derived from what each one actually does rather than
286
+ * granted by habit. The implementer changes code, so it edits and writes. The
287
+ * verifier and the scanner form a judgement about code that already exists;
288
+ * neither has ever needed to change it, and giving them write access would be
289
+ * handing out authority nothing asked for.
290
+ *
291
+ * Nobody gets a shell. There is no tool here that runs anything at all —
292
+ * project code is executed in exactly one place, the gate, under Looply's own
293
+ * orchestration and never at the model's request.
294
+ */
295
+ exports.TOOL_POLICIES = {
296
+ implementer: { role: 'implementer', tools: ['read', 'glob', 'grep', 'edit', 'write'] },
297
+ verifier: { role: 'verifier', tools: ['read', 'glob', 'grep'] },
298
+ scanner: { role: 'scanner', tools: ['read', 'glob', 'grep'] },
299
+ /**
300
+ * THE BRAIN. READ, GLOB, GREP — AND NOTHING THAT CHANGES ANYTHING.
301
+ *
302
+ * 🔴 IT PROPOSES; IT NEVER ACTS. A brain that could `edit` would be a second
303
+ * implementer with none of the first one's gate, and a brain that could
304
+ * `write` would be able to manufacture the very evidence its proposals are
305
+ * checked against. The narrowest role in the table is the one belonging to
306
+ * the only component that reasons.
307
+ *
308
+ * ⚠️ ENFORCED TWICE, LIKE THE OTHER THREE — once where the policy is applied
309
+ * and once at the bridge — because a single check is a single line to delete.
310
+ */
311
+ brain: { role: 'brain', tools: ['read', 'glob', 'grep'] },
312
+ /**
313
+ * THE PROVER. READ, GLOB, GREP — THE SECOND KEY GRADES THE TREE; IT NEVER TOUCHES IT.
314
+ *
315
+ * 🔴 IT WAS LENT THE IMPLEMENTER'S TRANSPORT. `run-cmd.ts` handed `runProver`
316
+ * the same invoke as the round, so the prover ran with `edit` and `write` —
317
+ * while its own prompt told it "read-only access … you must not modify
318
+ * anything". The prompt asked; nothing enforced. MEASURED, LIVE, 2026-09-24
319
+ * (LIVE-1 run 2): the prover's bridge was launched as role `implementer` with
320
+ * `mcp__looply__edit,mcp__looply__write` allowed, between a GREEN gate and
321
+ * the commit — the one window in a round where a write is kept without being
322
+ * gated — and its spend was booked as the implementer's.
323
+ *
324
+ * ⚠️ ENFORCED TWICE, LIKE THE OTHERS: the allowlist on the provider's
325
+ * command line, and the bridge, which refuses a tool the role does not hold.
326
+ */
327
+ prover: { role: 'prover', tools: ['read', 'glob', 'grep'] },
328
+ };
329
+ //# sourceMappingURL=tool-bridge.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-bridge.js","sourceRoot":"","sources":["../src/tool-bridge.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ import { type ToolErrorCode, type ToolName, type ToolResponse } from './tool-protocol';
2
+ /**
3
+ * WHAT THE BRIDGE ACTUALLY SERVED.
4
+ *
5
+ * 🔴 A MODEL-QUOTED TOOL ERROR COULD NOT BE MATCHED TO ANYTHING. The round's
6
+ * note carries the model's sentence about a tool that failed, and nothing
7
+ * carried the other half — so the one question worth asking, *did the bridge
8
+ * serve what the model says it served*, could not be answered at all, and any
9
+ * argument about it was two people reading the same quote. The capability
10
+ * audit's G-05.
11
+ *
12
+ * ⚠️ THE BRIDGE KEEPS THIS, NOT THE WORKER, and that is the load-bearing
13
+ * choice. `makeToolBridge.call()` is the single funnel: every request arrives
14
+ * there and every response leaves there, INCLUDING every refusal — a role that
15
+ * may not call the tool, an exhausted invocation budget, a request whose shape
16
+ * is wrong, a toolchain that is not there, a worker that did not answer. None
17
+ * of those ever reaches the worker. They are also a large share of what a model
18
+ * quotes, so a record kept on the far side would be missing the cases it exists
19
+ * for.
20
+ *
21
+ * ⚠️ WHAT THE MODEL ASKED FOR IS KEPT; WHAT IT WAS GIVEN, OR ASKED TO WRITE, IS
22
+ * COUNTED AND NEVER COPIED. No `contents`, no `oldText`/`newText`, and none of
23
+ * the response text. Their sizes are already computed for the invocation budget
24
+ * and those numbers go in instead. A project-relative path and a search pattern
25
+ * are what the model chose rather than what the project holds — and this file
26
+ * sits inside the very checkout whose files it would otherwise be copying, so
27
+ * they add nothing a reader of that directory does not already have.
28
+ *
29
+ * ⚠️ THE RUN ID IS THE SWITCH. A record of what a run was served belongs to a
30
+ * run; `scan` and `verify` carry no run id and write nothing, byte for byte as
31
+ * before this existed. It is not a config setting because it could not be one:
32
+ * `LOOPLY_`-prefixed variables are stripped from the provider's environment and
33
+ * this process is spawned BY the provider, which is why the daemon's home is
34
+ * told on argv rather than inherited. And a record that answers a question
35
+ * raised after the fact is worth nothing if it was switched off when the
36
+ * surprise happened, which is G-05 restated.
37
+ */
38
+ /** Beside `events.jsonl` and `run-starts.jsonl`, in the run's own state directory. */
39
+ export declare const TOOL_CALL_FILE = "tool-calls.jsonl";
40
+ /**
41
+ * How large the record may grow in one checkout.
42
+ *
43
+ * A cap rather than a rotation: rewriting an append-only log is how a
44
+ * neighbour's record gets lost, and this file's whole value is that what it
45
+ * says happened, happened. Two megabytes is thousands of calls — far more than
46
+ * the 300 one invocation may make — and it is the file, not the night, that is
47
+ * bounded.
48
+ */
49
+ export declare const TOOL_CALL_CAP_BYTES: number;
50
+ /** Longest model-chosen string kept on an entry. A pattern is identity, not content. */
51
+ export declare const MAX_FIELD_CHARS = 512;
52
+ export interface ToolCallEntry {
53
+ readonly at: string;
54
+ readonly runId: string;
55
+ readonly role: string;
56
+ readonly tool: ToolName | 'unknown';
57
+ readonly ok: boolean;
58
+ readonly ms: number;
59
+ readonly path?: string;
60
+ readonly pattern?: string;
61
+ readonly under?: string;
62
+ readonly bytes?: number;
63
+ readonly truncated?: true;
64
+ readonly code?: ToolErrorCode;
65
+ readonly because?: string;
66
+ }
67
+ /**
68
+ * What one provider invocation served in total, written as it ends.
69
+ *
70
+ * `ToolBridge.spent()`'s first reader. Distinguished from an entry by
71
+ * `invocation: true`, so a summariser can tell a total from a call without
72
+ * guessing from which fields happen to be present.
73
+ */
74
+ export interface ToolCallInvocationTotal {
75
+ readonly at: string;
76
+ readonly runId: string;
77
+ readonly role: string;
78
+ readonly invocation: true;
79
+ readonly calls: number;
80
+ readonly bytesRead: number;
81
+ readonly bytesWritten: number;
82
+ }
83
+ /** The one line that closes a record at its cap. */
84
+ export interface ToolCallCapped {
85
+ readonly at: string;
86
+ readonly capped: true;
87
+ readonly because: string;
88
+ }
89
+ export declare const CAPPED_BECAUSE = "this record reached its cap of 2097152 bytes \u2014 tool calls after this line are not recorded here";
90
+ /**
91
+ * The request's identity, and nothing it carries.
92
+ *
93
+ * Read as `unknown` rather than as a typed request on purpose: this is called
94
+ * on the refusal paths too, where the request failed its shape check and may be
95
+ * any shape at all. A record that threw on a malformed request would be missing
96
+ * exactly the entries a person came looking for.
97
+ */
98
+ export declare function identityOf(raw: unknown): Pick<ToolCallEntry, 'path' | 'pattern' | 'under'>;
99
+ /** What an answer cost, never what it contained. */
100
+ export declare function answerOf(res: ToolResponse): Pick<ToolCallEntry, 'bytes' | 'truncated' | 'code' | 'because'>;
101
+ export declare function entryFor(raw: unknown, res: ToolResponse, meta: {
102
+ runId: string;
103
+ role: string;
104
+ at: string;
105
+ ms: number;
106
+ }): ToolCallEntry;
107
+ export interface RecordFs {
108
+ size(path: string): number | null;
109
+ append(path: string, line: string): void;
110
+ mkdir(dir: string): void;
111
+ }
112
+ export declare const nodeRecordFs: RecordFs;
113
+ export interface ToolCallRecorder {
114
+ /** Never throws and never returns a failure: a record is not worth a tool call. */
115
+ record(raw: unknown, res: ToolResponse, ms: number): void;
116
+ /**
117
+ * What this invocation served in total, written once as it ends.
118
+ *
119
+ * `ToolBridge.spent()` had no consumer for most of its life — its own
120
+ * comment said "for tests and for logging" and nothing logged it, which is
121
+ * how the capability audit found it (E-05). It is also the closest thing this
122
+ * system has to E-05's "repeated-context bytes": how much the bridge actually
123
+ * served one provider invocation. `mcp-main` has the one moment that knows an
124
+ * invocation is over — the pipe closes and stdin ends — and calls this there.
125
+ *
126
+ * ⚠️ THE FIRST LINE OF THIS BLOCK USED TO SAY `spent()` "HAS HAD NO CONSUMER
127
+ * SINCE IT WAS WRITTEN", three lines above the sentence naming its consumer.
128
+ * 🔴 It was written by the very commit that ADDED that consumer: the block was
129
+ * extended to describe the fix and its opening line was left alone, so it was
130
+ * false from the moment it was typed. Fixed in M9-4.
131
+ */
132
+ total(spent: {
133
+ calls: number;
134
+ bytesRead: number;
135
+ bytesWritten: number;
136
+ }): void;
137
+ }
138
+ /** A recorder that keeps nothing — what a bridge with no run id gets. */
139
+ export declare const NO_RECORD: ToolCallRecorder;
140
+ /**
141
+ * The recorder for one bridge, which is one provider invocation.
142
+ *
143
+ * ⚠️ IT SWALLOWS ITS OWN FAILURES, deliberately and to the end. A full disk, a
144
+ * read-only checkout or a path that vanished must cost the round nothing: the
145
+ * tool call has already been served and its answer is already on its way back
146
+ * to the model. Losing a line of the record is a smaller harm than turning a
147
+ * working round into a failed one to complain about bookkeeping.
148
+ */
149
+ export declare function makeToolCallRecorder(stateDir: string, meta: {
150
+ runId: string;
151
+ role: string;
152
+ }, deps?: {
153
+ fs?: RecordFs;
154
+ now?: () => number;
155
+ }): ToolCallRecorder;
156
+ /**
157
+ * What a person is told about the record, from the file's own text.
158
+ *
159
+ * Parsed the way every other reader here parses a ledger: a damaged line is
160
+ * dropped and counted rather than thrown over, because a record is read when
161
+ * something has already gone wrong and refusing to answer then is the worst
162
+ * possible moment for it.
163
+ */
164
+ export interface ToolCallSummary {
165
+ readonly calls: number;
166
+ readonly refused: number;
167
+ readonly badLines: number;
168
+ readonly capped: boolean;
169
+ /** The most recent refusal, which is usually the one being looked for. */
170
+ readonly lastRefusal: {
171
+ tool: string;
172
+ code: string;
173
+ because: string;
174
+ } | null;
175
+ /**
176
+ * What the bridge served, summed over the invocations that said.
177
+ *
178
+ * Null when no invocation total is in the file — a record written before this
179
+ * existed, or one whose invocation is still going. Never a zero standing in
180
+ * for silence, for the reason every other figure here is absent rather than
181
+ * zero.
182
+ */
183
+ readonly served: {
184
+ invocations: number;
185
+ calls: number;
186
+ bytesRead: number;
187
+ bytesWritten: number;
188
+ } | null;
189
+ }
190
+ export declare function summariseToolCalls(text: string | null): ToolCallSummary | null;
191
+ /** Kept beside the cap so a reader can see the two numbers agree. */
192
+ export declare const RECORD_LIMITS: {
193
+ capBytes: number;
194
+ fieldChars: number;
195
+ readBytes: number;
196
+ };
197
+ //# sourceMappingURL=tool-call-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-call-record.d.ts","sourceRoot":"","sources":["../src/tool-call-record.ts"],"names":[],"mappings":"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"}