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,45 @@
1
+ import type { AnyEvent } from '@looply/core';
2
+ import type { AnyEventInput } from './ledger-store';
3
+ /**
4
+ * A ledger that also ships what it writes.
5
+ *
6
+ * Without this a run was complete and correct and entirely invisible: every
7
+ * transition landed in `.looply/state/events.jsonl` and nothing ever left the
8
+ * machine, so the phone showed a project that never moved. The runner should not
9
+ * know a server exists, so the wiring goes here rather than into the runner.
10
+ *
11
+ * Local first, always. The append to disk is the record; the upload is a copy.
12
+ * If shipping fails the run carries on and the events wait — which is the same
13
+ * rule the daemon follows, for the same reason.
14
+ */
15
+ export interface AppendOnlyLedger {
16
+ append(input: AnyEventInput): Promise<AnyEvent>;
17
+ }
18
+ export interface EventSink {
19
+ enqueue(event: AnyEvent): void;
20
+ }
21
+ export declare class SyncingLedger implements AppendOnlyLedger {
22
+ private readonly inner;
23
+ private readonly sink;
24
+ /** Never fatal: a broken sink must not stop a run that is otherwise fine. */
25
+ private readonly onSinkError?;
26
+ constructor(inner: AppendOnlyLedger, sink: EventSink,
27
+ /** Never fatal: a broken sink must not stop a run that is otherwise fine. */
28
+ onSinkError?: ((e: Error) => void) | undefined);
29
+ append(input: AnyEventInput): Promise<AnyEvent>;
30
+ }
31
+ /**
32
+ * The error reporter every construction site passes.
33
+ *
34
+ * `onSinkError` is optional and nobody passed one, so the catch above was a
35
+ * silent drop: the event stayed on disk, never reached the phone, and the user
36
+ * saw a project that had simply stopped moving — the exact failure this class
37
+ * was written to prevent.
38
+ *
39
+ * Said once, on the first failure. This is the append path of a run that may
40
+ * last hours, and a line per event would be a second, louder way of failing to
41
+ * reach the server; `Daemon.enqueue` holds its overflow notice back for the
42
+ * same reason. What is worth saying is that the stream broke, not how often.
43
+ */
44
+ export declare function logSinkErrorOnce(log: (line: string) => void): (e: Error) => void;
45
+ //# sourceMappingURL=syncing-ledger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncing-ledger.d.ts","sourceRoot":"","sources":["../src/syncing-ledger.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD;;;;;;;;;;;GAWG;AAEH,MAAM,WAAW,gBAAgB;IAC/B,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC,CAAC;CACjD;AAED,MAAM,WAAW,SAAS;IACxB,OAAO,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAAC;CAChC;AAED,qBAAa,aAAc,YAAW,gBAAgB;IAElD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,6EAA6E;IAC7E,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC;gBAHZ,KAAK,EAAE,gBAAgB,EACvB,IAAI,EAAE,SAAS;IAChC,6EAA6E;IAC5D,WAAW,CAAC,GAAE,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,aAAA;IAG7C,MAAM,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,QAAQ,CAAC;CAStD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,GAAG,CAAC,CAAC,EAAE,KAAK,KAAK,IAAI,CAUhF"}
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.SyncingLedger = void 0;
4
+ exports.logSinkErrorOnce = logSinkErrorOnce;
5
+ class SyncingLedger {
6
+ inner;
7
+ sink;
8
+ onSinkError;
9
+ constructor(inner, sink,
10
+ /** Never fatal: a broken sink must not stop a run that is otherwise fine. */
11
+ onSinkError) {
12
+ this.inner = inner;
13
+ this.sink = sink;
14
+ this.onSinkError = onSinkError;
15
+ }
16
+ async append(input) {
17
+ const event = await this.inner.append(input);
18
+ try {
19
+ this.sink.enqueue(event);
20
+ }
21
+ catch (e) {
22
+ this.onSinkError?.(e);
23
+ }
24
+ return event;
25
+ }
26
+ }
27
+ exports.SyncingLedger = SyncingLedger;
28
+ /**
29
+ * The error reporter every construction site passes.
30
+ *
31
+ * `onSinkError` is optional and nobody passed one, so the catch above was a
32
+ * silent drop: the event stayed on disk, never reached the phone, and the user
33
+ * saw a project that had simply stopped moving — the exact failure this class
34
+ * was written to prevent.
35
+ *
36
+ * Said once, on the first failure. This is the append path of a run that may
37
+ * last hours, and a line per event would be a second, louder way of failing to
38
+ * reach the server; `Daemon.enqueue` holds its overflow notice back for the
39
+ * same reason. What is worth saying is that the stream broke, not how often.
40
+ */
41
+ function logSinkErrorOnce(log) {
42
+ let said = false;
43
+ return (e) => {
44
+ if (said)
45
+ return;
46
+ said = true;
47
+ // `enqueue` is somebody else's code and a throw need not be an Error.
48
+ const why = e instanceof Error ? e.message : String(e);
49
+ log(`sync : an event did not reach the stream (${why}) — it stays on disk.`);
50
+ log(' Your phone may show a gap; the ledger on this machine is complete.');
51
+ };
52
+ }
53
+ //# sourceMappingURL=syncing-ledger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"syncing-ledger.js","sourceRoot":"","sources":["../src/syncing-ledger.ts"],"names":[],"mappings":";;;AAwDA,4CAUC;AA1CD,MAAa,aAAa;IAEL;IACA;IAEA;IAJnB,YACmB,KAAuB,EACvB,IAAe;IAChC,6EAA6E;IAC5D,WAAgC;QAHhC,UAAK,GAAL,KAAK,CAAkB;QACvB,SAAI,GAAJ,IAAI,CAAW;QAEf,gBAAW,GAAX,WAAW,CAAqB;IAChD,CAAC;IAEJ,KAAK,CAAC,MAAM,CAAC,KAAoB;QAC/B,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,CAAC;YACH,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,IAAI,CAAC,WAAW,EAAE,CAAC,CAAU,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;CACF;AAjBD,sCAiBC;AAED;;;;;;;;;;;;GAYG;AACH,SAAgB,gBAAgB,CAAC,GAA2B;IAC1D,IAAI,IAAI,GAAG,KAAK,CAAC;IACjB,OAAO,CAAC,CAAC,EAAE,EAAE;QACX,IAAI,IAAI;YAAE,OAAO;QACjB,IAAI,GAAG,IAAI,CAAC;QACZ,sEAAsE;QACtE,MAAM,GAAG,GAAG,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;QACvD,GAAG,CAAC,gDAAgD,GAAG,uBAAuB,CAAC,CAAC;QAChF,GAAG,CAAC,8EAA8E,CAAC,CAAC;IACtF,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,68 @@
1
+ /**
2
+ * A TEST FIXTURE OWNS THE TEMP DIRECTORIES IT CREATES, AND REMOVES EXACTLY
3
+ * THOSE.
4
+ *
5
+ * ─────────────────────────────────────────────────────────────────────────────
6
+ * WHY THIS EXISTS, MEASURED RATHER THAN SUPPOSED.
7
+ *
8
+ * 🔴 THE SUITES LEAKED 23,604 TEMP DIRECTORIES — about 8 GB — AND IT TOOK A GATE
9
+ * DOWN. `mkdtempSync` was called in ninety files and twenty-three of them
10
+ * created more directories than they removed; thirteen had no cleanup hook at
11
+ * all. The accumulation filled the disk mid-gate, `ENOSPC` truncated a jest
12
+ * transform-cache entry as it was being written, and the next run failed with a
13
+ * parse error at line 1 of a source file nobody had touched. Three separate
14
+ * symptoms, one owner.
15
+ *
16
+ * ⚠️ THE FIX IS OWNERSHIP, NOT A SWEEPER. A background cleaner that deleted old
17
+ * directories by age or by name prefix would be guessing about files it did not
18
+ * create — and the one thing worse than a leak is a cleaner that removes
19
+ * somebody else's live fixture because it looked old. Every path this removes is
20
+ * one it returned from `make`.
21
+ *
22
+ * ─────────────────────────────────────────────────────────────────────────────
23
+ * WHY IT TOUCHES NO TEST-FRAMEWORK GLOBAL.
24
+ *
25
+ * ⚠️ IT DOES NOT CALL `afterAll` ITSELF, AND THAT IS DELIBERATE TWICE OVER.
26
+ *
27
+ * First, a module that registers a lifecycle hook at import time hides the
28
+ * hook from the file that needs to be responsible for it: the spec declares
29
+ * `afterAll(() => tmp.cleanup())` in its own body, where a reader looking for
30
+ * "what cleans this up" will find it.
31
+ *
32
+ * Second, this file is ordinary source and stays free of `describe`/`it`/
33
+ * `afterAll`. A helper that called them would have to live in a `.spec.ts` to
34
+ * get the globals — and a `.spec.ts` imported by another suite executes its
35
+ * module body in that suite's worker, so any `describe` it declares would be
36
+ * registered into every importing suite. The controls for this helper live in
37
+ * `temp-fixtures.spec.ts`; the helper itself is importable from anywhere.
38
+ */
39
+ export interface OwnedTempDirs {
40
+ /**
41
+ * Create a temp directory under the OS temp root and take ownership of it.
42
+ *
43
+ * The prefix is `mkdtemp`'s, so the returned path always ends in six random
44
+ * characters and two calls with the same prefix are two different
45
+ * directories.
46
+ */
47
+ make(prefix: string): string;
48
+ /** The paths this fixture created and has not yet removed, in creation order. */
49
+ readonly owned: readonly string[];
50
+ /**
51
+ * Remove exactly the directories this fixture created, and forget them.
52
+ *
53
+ * ⚠️ SAFE TO CALL TWICE, and safe to call when nothing was created — a spec
54
+ * that throws before its first `make` still runs its `afterAll`.
55
+ *
56
+ * ⚠️ AND IT NEVER THROWS. A directory a live process still holds open on
57
+ * Windows cannot be removed, and a fixture that threw from its own cleanup
58
+ * would turn a passing suite red for a housekeeping failure. The paths it
59
+ * could not remove come back in `failed` so a caller that wants to assert on
60
+ * them can.
61
+ */
62
+ cleanup(): {
63
+ readonly removed: number;
64
+ readonly failed: readonly string[];
65
+ };
66
+ }
67
+ export declare function ownedTempDirs(): OwnedTempDirs;
68
+ //# sourceMappingURL=temp-fixtures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-fixtures.d.ts","sourceRoot":"","sources":["../src/temp-fixtures.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,MAAM,WAAW,aAAa;IAC5B;;;;;;OAMG;IACH,IAAI,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IAC7B,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,SAAS,MAAM,EAAE,CAAC;IAClC;;;;;;;;;;;OAWG;IACH,OAAO,IAAI;QAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAA;KAAE,CAAC;CAC7E;AAED,wBAAgB,aAAa,IAAI,aAAa,CA6B7C"}
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ownedTempDirs = ownedTempDirs;
4
+ const node_fs_1 = require("node:fs");
5
+ const node_os_1 = require("node:os");
6
+ const node_path_1 = require("node:path");
7
+ function ownedTempDirs() {
8
+ const owned = [];
9
+ return {
10
+ make(prefix) {
11
+ const dir = (0, node_fs_1.mkdtempSync)((0, node_path_1.join)((0, node_os_1.tmpdir)(), prefix));
12
+ owned.push(dir);
13
+ return dir;
14
+ },
15
+ get owned() {
16
+ return [...owned];
17
+ },
18
+ cleanup() {
19
+ const failed = [];
20
+ let removed = 0;
21
+ // Drained rather than iterated: a second call must not retry a path this
22
+ // one already removed, and a throw mid-loop must not leave the list half
23
+ // consumed in a way that hides what is still owned.
24
+ const mine = owned.splice(0, owned.length);
25
+ for (const dir of mine) {
26
+ try {
27
+ (0, node_fs_1.rmSync)(dir, { recursive: true, force: true, maxRetries: 2 });
28
+ removed += 1;
29
+ }
30
+ catch {
31
+ failed.push(dir);
32
+ }
33
+ }
34
+ return { removed, failed };
35
+ },
36
+ };
37
+ }
38
+ //# sourceMappingURL=temp-fixtures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"temp-fixtures.js","sourceRoot":"","sources":["../src/temp-fixtures.ts"],"names":[],"mappings":";;AAqEA,sCA6BC;AAlGD,qCAA8C;AAC9C,qCAAiC;AACjC,yCAAiC;AAmEjC,SAAgB,aAAa;IAC3B,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,OAAO;QACL,IAAI,CAAC,MAAc;YACjB,MAAM,GAAG,GAAG,IAAA,qBAAW,EAAC,IAAA,gBAAI,EAAC,IAAA,gBAAM,GAAE,EAAE,MAAM,CAAC,CAAC,CAAC;YAChD,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YAChB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,IAAI,KAAK;YACP,OAAO,CAAC,GAAG,KAAK,CAAC,CAAC;QACpB,CAAC;QACD,OAAO;YACL,MAAM,MAAM,GAAa,EAAE,CAAC;YAC5B,IAAI,OAAO,GAAG,CAAC,CAAC;YAChB,yEAAyE;YACzE,yEAAyE;YACzE,oDAAoD;YACpD,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,CAAC,MAAM,CAAC,CAAC;YAC3C,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;gBACvB,IAAI,CAAC;oBACH,IAAA,gBAAM,EAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC;oBAC7D,OAAO,IAAI,CAAC,CAAC;gBACf,CAAC;gBAAC,MAAM,CAAC;oBACP,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;YACD,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,CAAC;QAC7B,CAAC;KACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,84 @@
1
+ import { type SpendRecord } from './spend-ledger';
2
+ /**
3
+ * WHAT A WINDOW OF WORK COST IN TOKENS, AND WHETHER THAT CAN BE SAID AT ALL.
4
+ *
5
+ * 🔴 THE FIGURES WERE RECORDED AND NOBODY READ THEM. `inputTokens` and
6
+ * `outputTokens` have been parsed out of every envelope and written onto every
7
+ * spend row since they were added, and the only reader of that ledger sums
8
+ * `usd`. The two cache counts were not even parsed — `costOf` stopped one line
9
+ * short of them — so the question "did this night pay again for context it
10
+ * already had" had no answer anywhere, which is the capability audit's E-05.
11
+ *
12
+ * ⚠️ THE MONEY RULE, UNCHANGED, RATHER THAN A SOFTER SECOND ONE. `spendInWindow`
13
+ * reports `usd: null` the moment one charged row in the window is silent,
14
+ * because adding up the rows that did report and calling it the total is "a
15
+ * number that looks like a measurement and is not one". The same applies here
16
+ * and for the same reason — the audit says any context-reuse figure "would be
17
+ * an estimate, and must be labelled so" — and a reader who has learned the rule
18
+ * once does not have to learn a second one that behaves differently.
19
+ *
20
+ * ⚠️ EACH FIGURE REFUSES SEPARATELY. A provider may report input and output and
21
+ * say nothing about its cache, and that is not a reason to throw away the two
22
+ * numbers it did give. So `input` can be a number while `cacheRead` is null.
23
+ *
24
+ * ⚠️ AND `null` IS NEVER LEFT BARE. `invocations` and `reported` travel with it,
25
+ * so "cannot say" always arrives with the count that explains it.
26
+ *
27
+ * ⚠️ THIS IS NOT ON CORE'S `Spend`. That type feeds `withinEnvelope`, which is a
28
+ * CEILING — a safety decision about money and concurrency. Widening a safety
29
+ * type to carry a reporting figure is how a reporting bug becomes a ceiling
30
+ * bug, so this is its own view over the same records.
31
+ */
32
+ /**
33
+ * The window used when a machine declares no envelope of its own.
34
+ *
35
+ * Eight hours: a night, which is the unit this system is about. It lives here
36
+ * rather than in the command so the figure and the rule that governs it stay
37
+ * in one file.
38
+ */
39
+ export declare const DEFAULT_TOKEN_WINDOW_MS: number;
40
+ export interface TokenTotals {
41
+ /** Null when one charged invocation in the window did not report this figure. */
42
+ readonly input: number | null;
43
+ readonly output: number | null;
44
+ readonly cacheRead: number | null;
45
+ readonly cacheWrite: number | null;
46
+ /** Charged invocations in the window — what the figures above are over. */
47
+ readonly invocations: number;
48
+ /** How many of those reported each figure, so a null is never mysterious. */
49
+ readonly reported: {
50
+ readonly input: number;
51
+ readonly output: number;
52
+ readonly cacheRead: number;
53
+ readonly cacheWrite: number;
54
+ };
55
+ }
56
+ export type TokenView = {
57
+ readonly ok: true;
58
+ readonly tokens: TokenTotals;
59
+ } | {
60
+ readonly ok: false;
61
+ readonly because: string;
62
+ };
63
+ /**
64
+ * A row that represents work actually done.
65
+ *
66
+ * Reservations and cancellations are money-shaped bookkeeping — a hold placed
67
+ * and a hold released — and neither ever carried a token count. Counting them
68
+ * as silent invocations would make every window unmeasurable for a reason that
69
+ * has nothing to do with what a provider reported.
70
+ */
71
+ export declare function isChargedInvocation(r: SpendRecord): boolean;
72
+ export declare function totalsOf(records: readonly SpendRecord[]): TokenTotals;
73
+ /** The window ending now, read from this machine's spend ledger. */
74
+ export declare function tokensInWindow(now: number, windowMs: number, home?: string): TokenView;
75
+ /**
76
+ * The one line `looply doctor` prints.
77
+ *
78
+ * It never prints a bare number for a figure it cannot stand behind, and it
79
+ * never prints "cannot say" without the count that explains it — a reader who
80
+ * is told a figure is unavailable deserves to know whether that is because
81
+ * nothing ran or because their provider is quiet.
82
+ */
83
+ export declare function tokenLine(view: TokenView, windowMs: number): string;
84
+ //# sourceMappingURL=token-window.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-window.d.ts","sourceRoot":"","sources":["../src/token-window.ts"],"names":[],"mappings":"AACA,OAAO,EAAa,KAAK,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;;GAMG;AACH,eAAO,MAAM,uBAAuB,QAAqB,CAAC;AAE1D,MAAM,WAAW,WAAW;IAC1B,iFAAiF;IACjF,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,2EAA2E;IAC3E,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,6EAA6E;IAC7E,QAAQ,CAAC,QAAQ,EAAE;QACjB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;QACvB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;QAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;KAC7B,CAAC;CACH;AAED,MAAM,MAAM,SAAS,GACjB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,EAAE,WAAW,CAAA;CAAE,GACnD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAErD;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,EAAE,WAAW,GAAG,OAAO,CAE3D;AAED,wBAAgB,QAAQ,CAAC,OAAO,EAAE,SAAS,WAAW,EAAE,GAAG,WAAW,CA0CrE;AAED,oEAAoE;AACpE,wBAAgB,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,GAAE,MAAkB,GAAG,SAAS,CAWjG;AAKD;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,CAiBnE"}
@@ -0,0 +1,143 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DEFAULT_TOKEN_WINDOW_MS = void 0;
4
+ exports.isChargedInvocation = isChargedInvocation;
5
+ exports.totalsOf = totalsOf;
6
+ exports.tokensInWindow = tokensInWindow;
7
+ exports.tokenLine = tokenLine;
8
+ const node_os_1 = require("node:os");
9
+ const spend_ledger_1 = require("./spend-ledger");
10
+ /**
11
+ * WHAT A WINDOW OF WORK COST IN TOKENS, AND WHETHER THAT CAN BE SAID AT ALL.
12
+ *
13
+ * 🔴 THE FIGURES WERE RECORDED AND NOBODY READ THEM. `inputTokens` and
14
+ * `outputTokens` have been parsed out of every envelope and written onto every
15
+ * spend row since they were added, and the only reader of that ledger sums
16
+ * `usd`. The two cache counts were not even parsed — `costOf` stopped one line
17
+ * short of them — so the question "did this night pay again for context it
18
+ * already had" had no answer anywhere, which is the capability audit's E-05.
19
+ *
20
+ * ⚠️ THE MONEY RULE, UNCHANGED, RATHER THAN A SOFTER SECOND ONE. `spendInWindow`
21
+ * reports `usd: null` the moment one charged row in the window is silent,
22
+ * because adding up the rows that did report and calling it the total is "a
23
+ * number that looks like a measurement and is not one". The same applies here
24
+ * and for the same reason — the audit says any context-reuse figure "would be
25
+ * an estimate, and must be labelled so" — and a reader who has learned the rule
26
+ * once does not have to learn a second one that behaves differently.
27
+ *
28
+ * ⚠️ EACH FIGURE REFUSES SEPARATELY. A provider may report input and output and
29
+ * say nothing about its cache, and that is not a reason to throw away the two
30
+ * numbers it did give. So `input` can be a number while `cacheRead` is null.
31
+ *
32
+ * ⚠️ AND `null` IS NEVER LEFT BARE. `invocations` and `reported` travel with it,
33
+ * so "cannot say" always arrives with the count that explains it.
34
+ *
35
+ * ⚠️ THIS IS NOT ON CORE'S `Spend`. That type feeds `withinEnvelope`, which is a
36
+ * CEILING — a safety decision about money and concurrency. Widening a safety
37
+ * type to carry a reporting figure is how a reporting bug becomes a ceiling
38
+ * bug, so this is its own view over the same records.
39
+ */
40
+ /**
41
+ * The window used when a machine declares no envelope of its own.
42
+ *
43
+ * Eight hours: a night, which is the unit this system is about. It lives here
44
+ * rather than in the command so the figure and the rule that governs it stay
45
+ * in one file.
46
+ */
47
+ exports.DEFAULT_TOKEN_WINDOW_MS = 8 * 60 * 60 * 1000;
48
+ /**
49
+ * A row that represents work actually done.
50
+ *
51
+ * Reservations and cancellations are money-shaped bookkeeping — a hold placed
52
+ * and a hold released — and neither ever carried a token count. Counting them
53
+ * as silent invocations would make every window unmeasurable for a reason that
54
+ * has nothing to do with what a provider reported.
55
+ */
56
+ function isChargedInvocation(r) {
57
+ return r.kind === undefined || r.kind === 'spend' || r.kind === 'settlement';
58
+ }
59
+ function totalsOf(records) {
60
+ const fields = ['inputTokens', 'outputTokens', 'cacheReadTokens', 'cacheWriteTokens'];
61
+ const sums = {
62
+ inputTokens: 0,
63
+ outputTokens: 0,
64
+ cacheReadTokens: 0,
65
+ cacheWriteTokens: 0,
66
+ };
67
+ const said = {
68
+ inputTokens: 0,
69
+ outputTokens: 0,
70
+ cacheReadTokens: 0,
71
+ cacheWriteTokens: 0,
72
+ };
73
+ let invocations = 0;
74
+ for (const r of records) {
75
+ if (!isChargedInvocation(r))
76
+ continue;
77
+ invocations += 1;
78
+ for (const f of fields) {
79
+ const v = r[f];
80
+ if (typeof v === 'number' && Number.isFinite(v) && v >= 0) {
81
+ sums[f] += v;
82
+ said[f] += 1;
83
+ }
84
+ }
85
+ }
86
+ // Complete or nothing, per figure. An empty window is complete and zero:
87
+ // nothing ran, which is a fact rather than a gap.
88
+ const total = (f) => (said[f] === invocations ? sums[f] : null);
89
+ return {
90
+ input: total('inputTokens'),
91
+ output: total('outputTokens'),
92
+ cacheRead: total('cacheReadTokens'),
93
+ cacheWrite: total('cacheWriteTokens'),
94
+ invocations,
95
+ reported: {
96
+ input: said.inputTokens,
97
+ output: said.outputTokens,
98
+ cacheRead: said.cacheReadTokens,
99
+ cacheWrite: said.cacheWriteTokens,
100
+ },
101
+ };
102
+ }
103
+ /** The window ending now, read from this machine's spend ledger. */
104
+ function tokensInWindow(now, windowMs, home = (0, node_os_1.homedir)()) {
105
+ const read = (0, spend_ledger_1.readSpend)(home);
106
+ if (!read.ok)
107
+ return { ok: false, because: read.because };
108
+ const since = now - windowMs;
109
+ // The same bounds `spendInWindow` uses: a row stamped later than this
110
+ // reader's clock is still somebody's, and excluding it flatters the machine.
111
+ const inWindow = read.records.filter((r) => {
112
+ const at = Date.parse(r.at);
113
+ return Number.isFinite(at) && at >= since;
114
+ });
115
+ return { ok: true, tokens: totalsOf(inWindow) };
116
+ }
117
+ const thousands = (n) => n >= 1_000_000 ? `${(n / 1_000_000).toFixed(1)}M` : n >= 1_000 ? `${Math.round(n / 1_000)}k` : String(n);
118
+ /**
119
+ * The one line `looply doctor` prints.
120
+ *
121
+ * It never prints a bare number for a figure it cannot stand behind, and it
122
+ * never prints "cannot say" without the count that explains it — a reader who
123
+ * is told a figure is unavailable deserves to know whether that is because
124
+ * nothing ran or because their provider is quiet.
125
+ */
126
+ function tokenLine(view, windowMs) {
127
+ if (!view.ok)
128
+ return `tokens : cannot be read — ${view.because}`;
129
+ const t = view.tokens;
130
+ const hours = Math.round(windowMs / 3_600_000);
131
+ const over = `last ${hours}h`;
132
+ if (t.invocations === 0)
133
+ return `tokens : ${over} — nothing has run`;
134
+ const fig = (label, v, said) => v === null ? `${label} not reported by ${t.invocations - said} of ${t.invocations}` : `${label} ${thousands(v)}`;
135
+ return (`tokens : ${over}, ${t.invocations} invocation${t.invocations === 1 ? '' : 's'} — ` +
136
+ [
137
+ fig('in', t.input, t.reported.input),
138
+ fig('out', t.output, t.reported.output),
139
+ fig('cache read', t.cacheRead, t.reported.cacheRead),
140
+ fig('cache written', t.cacheWrite, t.reported.cacheWrite),
141
+ ].join(' · '));
142
+ }
143
+ //# sourceMappingURL=token-window.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"token-window.js","sourceRoot":"","sources":["../src/token-window.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,177 @@
1
+ import { type SharedGrantDeps } from './shared-grants';
2
+ import { type ToolchainResult } from './toolchain-mirror';
3
+ import { type ToolName, type ToolResponse } from './tool-protocol';
4
+ import { type UntrustedExecutionBackend } from './untrusted-exec';
5
+ import { type ToolCallRecorder } from './tool-call-record';
6
+ import { type ActionRequest, type BuildActionErrorCode, type TrustedActionContext } from '@looply/core';
7
+ /** The worker script, somewhere the container can read and cannot write. */
8
+ export declare function toolWorkerRoot(deps?: ToolBridgeDeps): string;
9
+ /**
10
+ * Put the worker where a contained process can read it.
11
+ *
12
+ * READ ONLY, and keyed by content. The worker is the one thing in this design
13
+ * that runs with the container's grants, so a directory the container could
14
+ * write would be a directory it could replace the worker in — which is the same
15
+ * as having no worker policy at all.
16
+ */
17
+ export declare function ensureToolWorker(deps?: ToolBridgeDeps): {
18
+ ok: true;
19
+ path: string;
20
+ } | {
21
+ ok: false;
22
+ because: string;
23
+ };
24
+ export interface ToolBridgeDeps {
25
+ backend?: UntrustedExecutionBackend;
26
+ toolchain?: () => ToolchainResult;
27
+ /** Overridable so tests never write to the shared worker root. */
28
+ workerRoot?: string;
29
+ /** Overridable so a test can point at a different worker build. */
30
+ workerSource?: string;
31
+ now?: () => number;
32
+ /** Per-call ceiling. A worker that hangs must not hang the session. */
33
+ timeoutMs?: number;
34
+ /**
35
+ * Who this run is and what it is working on.
36
+ *
37
+ * Absent means no action can be proposed at all — fail closed rather than
38
+ * invent an identity, because the identity is half of what an approval is
39
+ * about.
40
+ */
41
+ actionContext?: TrustedActionContext;
42
+ /**
43
+ * Where what was served is written down (the audit's G-05).
44
+ *
45
+ * Absent means nothing is kept — which is every caller that has no run to
46
+ * attach it to, and is byte for byte what this did before the record existed.
47
+ * See `tool-call-record.ts` for why the run id is the switch.
48
+ */
49
+ record?: ToolCallRecorder;
50
+ /**
51
+ * F43: WHERE THE SHARED-GRANT LEDGER AND ITS LOCK LIVE — the machine's, handed
52
+ * over by the trusted launcher (`mcp-main.ts`).
53
+ *
54
+ * Absent means `homedir()`, and inside a provider session that is the sterile
55
+ * session directory: every role kept its own ledger and its own lock, so an
56
+ * agent's grant was serialised against no other grant (`icacls` is a
57
+ * read-modify-write of one DACL) and was released by nothing — retirement reads
58
+ * the machine ledger only.
59
+ */
60
+ sharedGrants?: SharedGrantDeps;
61
+ }
62
+ /** What one role is allowed to ask for. */
63
+ export interface ToolPolicy {
64
+ readonly role: string;
65
+ readonly tools: readonly ToolName[];
66
+ }
67
+ /**
68
+ * The seam a consequential tool will one day arrive through.
69
+ *
70
+ * A tool that can push, deploy or send does NOT get an executor here. It gets
71
+ * this: the model describes what it wants, Looply turns that into a structured
72
+ * request with an exact fingerprint, and the request goes off to be approved by
73
+ * a person. Nothing in this phase can carry any of them out, and there is no
74
+ * approval state — that is the next slice.
75
+ *
76
+ * WHAT THE MODEL DOES NOT SUPPLY. The project and the actor come from the run
77
+ * that is executing, injected below. A model that could name its own project
78
+ * would make "approve this for project A" authorise something in project B, and
79
+ * one that could name its own actor would be able to sign as a person.
80
+ */
81
+ export type ActionOutcome = {
82
+ readonly ok: true;
83
+ readonly request: ActionRequest;
84
+ } | {
85
+ readonly ok: false;
86
+ readonly code: BuildActionErrorCode | 'no_context';
87
+ readonly because: string;
88
+ };
89
+ export interface ToolBridge {
90
+ call(req: unknown): Promise<ToolResponse>;
91
+ /**
92
+ * Describe a consequential action as data. Executes nothing, stores nothing.
93
+ *
94
+ * `type` and `payload` are model input and are validated to death; the
95
+ * trusted context is the run's own and is never taken from either.
96
+ */
97
+ proposeAction(type: unknown, payload: unknown, note?: string): ActionOutcome;
98
+ /** What has been spent so far, for tests and for logging. */
99
+ spent(): {
100
+ calls: number;
101
+ bytesRead: number;
102
+ bytesWritten: number;
103
+ };
104
+ }
105
+ /**
106
+ * A bridge for one project and one role.
107
+ *
108
+ * The budget is per bridge, which is per provider invocation. It exists because
109
+ * the model may call tools as many times as it likes inside one session and
110
+ * nobody is watching the loop. It is NOT the Goal or autonomy budget — those
111
+ * count provider invocations and belong to Phase 6, which this must not touch.
112
+ */
113
+ export declare function makeToolBridge(projectDir: string, policy: ToolPolicy, deps?: ToolBridgeDeps): ToolBridge;
114
+ /**
115
+ * What each role may call.
116
+ *
117
+ * LEAST PRIVILEGE BY ROLE, derived from what each one actually does rather than
118
+ * granted by habit. The implementer changes code, so it edits and writes. The
119
+ * verifier and the scanner form a judgement about code that already exists;
120
+ * neither has ever needed to change it, and giving them write access would be
121
+ * handing out authority nothing asked for.
122
+ *
123
+ * Nobody gets a shell. There is no tool here that runs anything at all —
124
+ * project code is executed in exactly one place, the gate, under Looply's own
125
+ * orchestration and never at the model's request.
126
+ */
127
+ export declare const TOOL_POLICIES: {
128
+ readonly implementer: {
129
+ readonly role: "implementer";
130
+ readonly tools: readonly ["read", "glob", "grep", "edit", "write"];
131
+ };
132
+ readonly verifier: {
133
+ readonly role: "verifier";
134
+ readonly tools: readonly ["read", "glob", "grep"];
135
+ };
136
+ readonly scanner: {
137
+ readonly role: "scanner";
138
+ readonly tools: readonly ["read", "glob", "grep"];
139
+ };
140
+ /**
141
+ * THE BRAIN. READ, GLOB, GREP — AND NOTHING THAT CHANGES ANYTHING.
142
+ *
143
+ * 🔴 IT PROPOSES; IT NEVER ACTS. A brain that could `edit` would be a second
144
+ * implementer with none of the first one's gate, and a brain that could
145
+ * `write` would be able to manufacture the very evidence its proposals are
146
+ * checked against. The narrowest role in the table is the one belonging to
147
+ * the only component that reasons.
148
+ *
149
+ * ⚠️ ENFORCED TWICE, LIKE THE OTHER THREE — once where the policy is applied
150
+ * and once at the bridge — because a single check is a single line to delete.
151
+ */
152
+ readonly brain: {
153
+ readonly role: "brain";
154
+ readonly tools: readonly ["read", "glob", "grep"];
155
+ };
156
+ /**
157
+ * THE PROVER. READ, GLOB, GREP — THE SECOND KEY GRADES THE TREE; IT NEVER TOUCHES IT.
158
+ *
159
+ * 🔴 IT WAS LENT THE IMPLEMENTER'S TRANSPORT. `run-cmd.ts` handed `runProver`
160
+ * the same invoke as the round, so the prover ran with `edit` and `write` —
161
+ * while its own prompt told it "read-only access … you must not modify
162
+ * anything". The prompt asked; nothing enforced. MEASURED, LIVE, 2026-09-24
163
+ * (LIVE-1 run 2): the prover's bridge was launched as role `implementer` with
164
+ * `mcp__looply__edit,mcp__looply__write` allowed, between a GREEN gate and
165
+ * the commit — the one window in a round where a write is kept without being
166
+ * gated — and its spend was booked as the implementer's.
167
+ *
168
+ * ⚠️ ENFORCED TWICE, LIKE THE OTHERS: the allowlist on the provider's
169
+ * command line, and the bridge, which refuses a tool the role does not hold.
170
+ */
171
+ readonly prover: {
172
+ readonly role: "prover";
173
+ readonly tools: readonly ["read", "glob", "grep"];
174
+ };
175
+ };
176
+ export type ToolRole = keyof typeof TOOL_POLICIES;
177
+ //# sourceMappingURL=tool-bridge.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-bridge.d.ts","sourceRoot":"","sources":["../src/tool-bridge.ts"],"names":[],"mappings":"AAWA,OAAO,EAAsB,KAAK,eAAe,EAAkB,MAAM,iBAAiB,CAAC;AAC3F,OAAO,EAAyB,KAAK,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACjF,OAAO,EAKL,KAAK,QAAQ,EAEb,KAAK,YAAY,EAClB,MAAM,iBAAiB,CAAC;AACzB,OAAO,EAIL,KAAK,yBAAyB,EAC/B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtE,OAAO,EAEL,KAAK,aAAa,EAClB,KAAK,oBAAoB,EACzB,KAAK,oBAAoB,EAC1B,MAAM,cAAc,CAAC;AAwCtB,4EAA4E;AAC5E,wBAAgB,cAAc,CAAC,IAAI,GAAE,cAAmB,GAAG,MAAM,CAEhE;AAED;;;;;;;GAOG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,GAAE,cAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAoBvH;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,CAAC,EAAE,yBAAyB,CAAC;IACpC,SAAS,CAAC,EAAE,MAAM,eAAe,CAAC;IAClC,kEAAkE;IAClE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,oBAAoB,CAAC;IACrC;;;;;;OAMG;IACH,MAAM,CAAC,EAAE,gBAAgB,CAAC;IAC1B;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,eAAe,CAAC;CAChC;AAED,2CAA2C;AAC3C,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,SAAS,QAAQ,EAAE,CAAC;CACrC;AAED;;;;;;;;;;;;;GAaG;AACH,MAAM,MAAM,aAAa,GACrB;IAAE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,aAAa,CAAA;CAAE,GACtD;IAAE,QAAQ,CAAC,EAAE,EAAE,KAAK,CAAC;IAAC,QAAQ,CAAC,IAAI,EAAE,oBAAoB,GAAG,YAAY,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzG,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC1C;;;;;OAKG;IACH,aAAa,CAAC,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,aAAa,CAAC;IAC7E,6DAA6D;IAC7D,KAAK,IAAI;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAA;KAAE,CAAC;CACrE;AAkDD;;;;;;;GAOG;AACH,wBAAgB,cAAc,CAC5B,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,UAAU,EAClB,IAAI,GAAE,cAAmB,GACxB,UAAU,CA0IZ;AAED;;;;;;;;;;;;GAYG;AACH,eAAO,MAAM,aAAa;;;;;;;;;;;;;IAIxB;;;;;;;;;;;OAWG;;;;;IAEH;;;;;;;;;;;;;;OAcG;;;;;CAE0C,CAAC;AAEhD,MAAM,MAAM,QAAQ,GAAG,MAAM,OAAO,aAAa,CAAC"}