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,287 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.containedRoot = containedRoot;
4
+ exports.buildUntrustedGateEnv = buildUntrustedGateEnv;
5
+ exports.containedPath = containedPath;
6
+ exports.buildAgentEnv = buildAgentEnv;
7
+ exports.buildProviderEnv = buildProviderEnv;
8
+ exports.buildNotifyEnv = buildNotifyEnv;
9
+ exports.protectedPaths = protectedPaths;
10
+ exports.untrustedGrants = untrustedGrants;
11
+ exports.sharedGrantPaths = sharedGrantPaths;
12
+ const node_crypto_1 = require("node:crypto");
13
+ const node_fs_1 = require("node:fs");
14
+ const node_os_1 = require("node:os");
15
+ const node_path_1 = require("node:path");
16
+ const untrusted_exec_1 = require("./untrusted-exec");
17
+ const trusted_git_1 = require("./trusted-git");
18
+ /**
19
+ * Where a contained child keeps the profile Windows insists it has.
20
+ *
21
+ * An AppContainer needs USERPROFILE/APPDATA/LOCALAPPDATA to start at all — the
22
+ * loader resolves the container's redirected storage through them. Pointing
23
+ * them at the daemon's profile would hand back everything the container exists
24
+ * to keep away: `~/.looply/machine.json`, `~/.claude`, `~/.gitconfig`. So the
25
+ * child gets its own, created beside the system temp directory and granted to
26
+ * it explicitly.
27
+ *
28
+ * Per project and per domain, so a gate cannot read what an agent left behind.
29
+ */
30
+ function containedRoot(kind, projectKey) {
31
+ const digest = (0, node_crypto_1.createHash)('sha256').update(projectKey, 'utf8').digest('hex').slice(0, 16);
32
+ const root = (0, node_path_1.join)((0, node_os_1.tmpdir)(), 'looply-contained', `${kind}-${digest}`);
33
+ for (const sub of ['', 'appdata', 'local', 'temp']) {
34
+ (0, node_fs_1.mkdirSync)(sub === '' ? root : (0, node_path_1.join)(root, sub), { recursive: true });
35
+ }
36
+ return root;
37
+ }
38
+ /** Platform values a child cannot start without, and nothing else. */
39
+ function platformOnly() {
40
+ const out = {};
41
+ for (const name of untrusted_exec_1.PLATFORM_BASE) {
42
+ // The profile roots are deliberately NOT copied from the daemon: they are
43
+ // replaced below with the contained child's own.
44
+ if (/^(USERPROFILE|APPDATA|LOCALAPPDATA|TEMP|TMP|HOME)$/i.test(name))
45
+ continue;
46
+ const v = process.env[name];
47
+ if (typeof v === 'string' && v.length > 0)
48
+ out[name] = v;
49
+ }
50
+ /**
51
+ * 🔴 SystemRoot IS RESOLVED, NOT MERELY COPIED — AND THIS WAS THE SIXTH SITE
52
+ * THAT DID NOT ASK.
53
+ *
54
+ * The loop above copies whatever the parent happens to hold, which leaves two
55
+ * holes that `systemRoot()` exists to close and that an environment built from
56
+ * an allowlist makes reachable rather than theoretical:
57
+ *
58
+ * absent — `systemRoot`'s own comment says a child of a contained child
59
+ * legitimately has no `SystemRoot` at all, because THIS function
60
+ * is what builds its block. The loop then omits the variable, and
61
+ * CreateProcess fails with ERROR_ENVVAR_NOT_FOUND (203), which
62
+ * names no variable — an unreadable failure one level down.
63
+ * relative — a non-empty `SystemRoot=C:Windows` is copied through verbatim.
64
+ * That is the dropped-backslash value this module has been bitten
65
+ * by twice, handed to a child whose working directory is the
66
+ * project worktree.
67
+ *
68
+ * `systemRoot()` returns the parent's value unchanged whenever it is a real
69
+ * absolute path, so this is identical in the ordinary case and a repair in the
70
+ * two that are not.
71
+ */
72
+ out['SystemRoot'] = (0, untrusted_exec_1.systemRoot)();
73
+ return out;
74
+ }
75
+ function profileOf(root) {
76
+ return {
77
+ USERPROFILE: root,
78
+ HOME: root,
79
+ APPDATA: (0, node_path_1.join)(root, 'appdata'),
80
+ LOCALAPPDATA: (0, node_path_1.join)(root, 'local'),
81
+ TEMP: (0, node_path_1.join)(root, 'temp'),
82
+ TMP: (0, node_path_1.join)(root, 'temp'),
83
+ };
84
+ }
85
+ /**
86
+ * The environment for project-controlled test, build and typecheck commands.
87
+ *
88
+ * Carries no credential of any kind. The two extras are both about making the
89
+ * boundary work rather than about trust:
90
+ *
91
+ * `NODE_OPTIONS` — an AppContainer cannot stat `C:\`, and Node's module
92
+ * resolution walks to the drive root, so without these flags nothing Node runs
93
+ * at all. Scoped here rather than set on the daemon.
94
+ *
95
+ * `GIT_CONFIG_NOSYSTEM` — defence in depth only. It removes the system git
96
+ * config, and with it the ambient credential helper, from anything the gate
97
+ * runs. It is NOT the boundary: a determined process can clear a variable. The
98
+ * container is the boundary.
99
+ */
100
+ function buildUntrustedGateEnv(projectKey, toolchain) {
101
+ const root = containedRoot('gate', projectKey);
102
+ return {
103
+ ...platformOnly(),
104
+ ...profileOf(root),
105
+ PATH: containedPath(projectKey, toolchain),
106
+ NODE_OPTIONS: '--preserve-symlinks --preserve-symlinks-main',
107
+ GIT_CONFIG_NOSYSTEM: '1',
108
+ GIT_TERMINAL_PROMPT: '0',
109
+ };
110
+ }
111
+ /**
112
+ * The search path a contained child gets.
113
+ *
114
+ * Built, not inherited. The daemon's PATH names sixty-odd directories the
115
+ * container cannot read, and — worse — it names the real toolchain directory,
116
+ * which on this machine also holds `claude`, `eas` and `heroku` shims. A gate
117
+ * that could resolve those would be a gate that could deploy.
118
+ *
119
+ * So: Looply's own runtime copy first, then the project's own `.bin` (which is
120
+ * inside the granted worktree and is how `tsc`, `jest` and friends are found),
121
+ * then the two system directories a shell needs to function.
122
+ */
123
+ function containedPath(projectKey, toolchain) {
124
+ const win = (0, untrusted_exec_1.systemRoot)();
125
+ const parts = [
126
+ ...(toolchain === undefined ? [] : [toolchain]),
127
+ (0, node_path_1.join)(projectKey, 'node_modules', '.bin'),
128
+ (0, node_path_1.join)(win, 'System32'),
129
+ win,
130
+ ];
131
+ return parts.join(';');
132
+ }
133
+ /**
134
+ * The environment for the coding agent.
135
+ *
136
+ * Separate from the gate's because the agent legitimately needs its model
137
+ * provider — and separate so that giving the agent something never gives it to
138
+ * the gate. It still carries no Looply machine token and no broker credential:
139
+ * using the model is the agent's job, speaking for the machine is not.
140
+ */
141
+ function buildAgentEnv(projectKey, provider = {}, toolchain) {
142
+ const root = containedRoot('agent', projectKey);
143
+ return {
144
+ ...platformOnly(),
145
+ ...profileOf(root),
146
+ PATH: containedPath(projectKey, toolchain),
147
+ NODE_OPTIONS: '--preserve-symlinks --preserve-symlinks-main',
148
+ ...provider,
149
+ };
150
+ }
151
+ /**
152
+ * The environment for the PROVIDER TRANSPORT.
153
+ *
154
+ * This one is different in kind from the others, and the difference is the
155
+ * point of the whole decomposition. The transport is not contained — it cannot
156
+ * be, because the packaged provider spawns children with piped stdio and an
157
+ * AppContainer cannot create the named pipes that needs. So it runs as the
158
+ * daemon user, and the only thing standing between it and the machine's
159
+ * authority is what Looply chooses to hand it.
160
+ *
161
+ * Which is: the platform baseline, its own profile, and whatever the person
162
+ * named in `agent.env`. Built up rather than filtered down, so a Looply
163
+ * credential added to the daemon's environment next year does not silently
164
+ * appear here.
165
+ *
166
+ * It carries NO PATH into the project. The transport has no reason to resolve
167
+ * anything from the worktree; the tools it can call are served over MCP and run
168
+ * somewhere else entirely.
169
+ */
170
+ function buildProviderEnv(sessionDir, provider = {}) {
171
+ const win = (0, untrusted_exec_1.systemRoot)();
172
+ return {
173
+ ...platformOnly(),
174
+ ...profileOf(sessionDir),
175
+ // System directories only. Not the project's `.bin`, and not the machine's
176
+ // toolchain directory, which on this machine also holds `claude`, `eas` and
177
+ // `heroku` shims.
178
+ PATH: [(0, node_path_1.join)(win, 'System32'), win].join(';'),
179
+ ...provider,
180
+ };
181
+ }
182
+ /**
183
+ * The environment for the user's own notification script.
184
+ *
185
+ * NOT contained: this file is the person's, stored under their home directory,
186
+ * and running it is the product working as intended. But it inherited the whole
187
+ * daemon environment — every secret the daemon holds — for no reason at all. A
188
+ * notification does not need the machine token.
189
+ */
190
+ function buildNotifyEnv() {
191
+ const out = {};
192
+ for (const name of [...untrusted_exec_1.PLATFORM_BASE, 'HOME']) {
193
+ const v = process.env[name];
194
+ if (typeof v === 'string' && v.length > 0)
195
+ out[name] = v;
196
+ }
197
+ return out;
198
+ }
199
+ /**
200
+ * Paths inside a granted worktree that untrusted execution must never reach.
201
+ *
202
+ * Derived from the execution kind rather than chosen per call site, because a
203
+ * caller that forgets one is a caller that quietly hands over the authority
204
+ * state.
205
+ *
206
+ * `.looply/state` holds every durable fact Phase 6 rests on — the grant, the
207
+ * receipts, the launch and claim records, the ledger, the human control file.
208
+ * `.git` is where a repository-controlled config can turn a trusted git command
209
+ * into arbitrary execution. `config.yaml` is the one file the person edits by
210
+ * hand, and it names the gate commands and the rails: a round that could write
211
+ * it could weaken every round after it.
212
+ *
213
+ * `<projectDir>/.git` IS PROTECTED WHATEVER IT TURNS OUT TO BE. In a linked
214
+ * worktree it is a pointer file rather than a directory, and a write to it
215
+ * redirects every later git command at metadata of the writer's choosing — so
216
+ * it is protected for its own sake, not merely as a route to a directory.
217
+ *
218
+ * AND WHEREVER THE METADATA REALLY LIVES, appended below. In a linked worktree
219
+ * the real gitdir is `<common>/worktrees/<name>` and the config that decides
220
+ * what git executes is in the shared common dir; neither is under `projectDir`,
221
+ * so neither is covered by the three literals.
222
+ *
223
+ * ⚠️ THE THREE LITERALS STAY AT THE TOP OF THE BODY, and the prose stays up
224
+ * here. `project-memory-reachability.spec.ts` pins them by slicing the first 400
225
+ * characters after the signature — a deliberate guard on the ground under
226
+ * `source: 'human'` — and a comment inside the body pushes them out of it.
227
+ */
228
+ function protectedPaths(projectDir) {
229
+ const paths = [
230
+ (0, node_path_1.join)(projectDir, '.git'),
231
+ (0, node_path_1.join)(projectDir, '.looply', 'state'),
232
+ (0, node_path_1.join)(projectDir, '.looply', 'config.yaml'),
233
+ ];
234
+ /**
235
+ * Resolution failures are swallowed on purpose: this list is consulted while
236
+ * building a container, a directory that is not a repository has nothing more
237
+ * to protect, and `repoConfigTroubleAt` is the check that refuses on
238
+ * unreadable metadata. Making this throw would turn "not a repository" into a
239
+ * crash at every call site.
240
+ */
241
+ const meta = (0, trusted_git_1.worktreeMetadata)(projectDir);
242
+ if (meta !== null) {
243
+ for (const p of [meta.gitDir, meta.commonDir]) {
244
+ if (!paths.includes(p))
245
+ paths.push(p);
246
+ }
247
+ }
248
+ return paths;
249
+ }
250
+ /** What untrusted execution is granted: the worktree, and its own profile. */
251
+ function untrustedGrants(kind, projectDir) {
252
+ return [
253
+ { path: projectDir, write: true },
254
+ { path: containedRoot(kind, projectDir), write: true },
255
+ // READ AND EXECUTE ONLY. The runtime is Looply's, and untrusted code that
256
+ // could replace `node.exe` would be untrusted code choosing what every
257
+ // later gate runs.
258
+ /**
259
+ * 🔴 THE TOOLCHAIN IS NO LONGER GRANTED HERE, AND THAT IS THE n122 REPAIR.
260
+ *
261
+ * It is SHARED — every workspace, every project and every concurrent looply
262
+ * process on this machine resolves `node.exe` through it — so granting it
263
+ * per launch added one permanent inheritable ACE per container identity and
264
+ * nothing ever removed one. Measured before the repair: 262 container ACEs
265
+ * on the mirror and 509 on the tool-worker directory, against a DACL capped
266
+ * near 64 KB.
267
+ *
268
+ * Shared paths now go through `ensureSharedAccess`, which takes the same
269
+ * lock the removal takes — the addition and the removal of one shared DACL
270
+ * cannot be serialised by locking only one of them — records what it
271
+ * granted so a later mirror move does not orphan the entry, and does no
272
+ * work at all for an identity that already holds it.
273
+ *
274
+ * Run-OWNED paths stay here: the workspace and the contained root have a
275
+ * single owner, so they need no lock and are removed with the workspace.
276
+ */
277
+ ];
278
+ }
279
+ /**
280
+ * The shared directories a contained execution needs, which are granted under
281
+ * the shared-grant lock rather than per launch. `toolchain` is absent for the
282
+ * built-in provider, which resolves its own.
283
+ */
284
+ function sharedGrantPaths(toolchain, extra = []) {
285
+ return [...(toolchain === undefined ? [] : [toolchain]), ...extra].filter((p) => p.length > 0);
286
+ }
287
+ //# sourceMappingURL=exec-domains.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec-domains.js","sourceRoot":"","sources":["../src/exec-domains.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,197 @@
1
+ import type { Exemption } from '@looply/core';
2
+ import type { LedgerFs } from './ledger-store';
3
+ /**
4
+ * Which granted exemptions this machine has already spent — `exemptions.json`
5
+ * under the state dir.
6
+ *
7
+ * ─────────────────────────────────────────────────────────────────────────────
8
+ * 🔴 THE SINK WITHOUT WHICH THE SOURCE MUST NOT BE WIRED.
9
+ *
10
+ * `RoundRunner` refuses to start with `exemptionsFor` wired and no
11
+ * `spendExemption`, and its constructor says why: "one grant reopening the same
12
+ * rail every round until it expires". A grant is for ONE item, ONE path, ONCE.
13
+ * The core model carries `usedInRound` for exactly that, and something has to
14
+ * remember it after the process exits.
15
+ *
16
+ * ⚠️ THE SERVER CANNOT BE THAT SOMETHING, AND THAT IS BY DESIGN RATHER THAN AN
17
+ * OVERSIGHT. `model Exemption` records a DECISION — granted or refused, by whom,
18
+ * until when — and has no spent column, because the product's own account says a
19
+ * grant "is spent on commit, not on check" and "the commit itself carries the
20
+ * opening in its trailer". The durable audit record is the commit. This file is
21
+ * only what stops the same grant being handed to a second round on this machine.
22
+ *
23
+ * ⚠️ AND THERE IS A WINDOW THIS CANNOT CLOSE. Spending happens AFTER the commit,
24
+ * deliberately: "a discarded round leaves the door open for the retry; burning
25
+ * it on a failure would strand the next attempt outside its own door." So a
26
+ * crash between the commit and this write leaves the grant looking unspent, and
27
+ * a later run could open that rail once more. Reserving on hand-out would close
28
+ * it and would contradict the design outright, so the window is documented
29
+ * rather than engineered away — and the commit trailer is what makes it visible
30
+ * if it ever happens.
31
+ */
32
+ export interface SpentFile {
33
+ version: 1;
34
+ /** Grant identity → the round that spent it. */
35
+ spent: Record<string, number>;
36
+ }
37
+ /**
38
+ * A grant's identity, for a model that has no id of its own.
39
+ *
40
+ * 🔴 EXPIRY IS PART OF IT. Two grants for the same item and path with different
41
+ * expiries are two separate acts of permission — somebody granting the same door
42
+ * again tomorrow is not re-using yesterday's grant, and keying without the
43
+ * expiry would silently treat the new one as already spent.
44
+ *
45
+ * A NUL separator, so a path containing the separator cannot forge another
46
+ * grant's key; paths cannot contain NUL on any filesystem this runs on.
47
+ */
48
+ export declare function grantKey(e: Pick<Exemption, 'itemId' | 'path' | 'expiresAt'>): string;
49
+ export declare class ExemptionStore {
50
+ private readonly stateDir;
51
+ private readonly fs;
52
+ private readonly migrate?;
53
+ /** Distinguishes two writes from ONE process; the pid distinguishes processes. */
54
+ private static writes;
55
+ private spent;
56
+ private readable;
57
+ /**
58
+ * ⚠️ `migrate` RUNS BEFORE ANY READ, AND ITS REFUSAL IS AN UNREADABLE STORE.
59
+ *
60
+ * The ledger's home moved out of the repository (see `rails-home.ts`), and a
61
+ * move is the one moment when "I could not see the old records" and "there
62
+ * were no old records" look identical. This store's entire safety argument is
63
+ * that they must never look identical: an unreadable ledger answers `isSpent`
64
+ * true for everything, because treating a corrupt ledger as "nothing spent"
65
+ * re-opens every door the machine has already used.
66
+ *
67
+ * So a migration that cannot prove what was spent fails the store closed,
68
+ * exactly as an unparseable `exemptions.json` does. Omitted, there is no
69
+ * migration and nothing changes — which is what every existing test relies on.
70
+ */
71
+ constructor(stateDir: string, fs: LedgerFs, migrate?: (() => Promise<{
72
+ ok: boolean;
73
+ because?: string;
74
+ }>) | undefined);
75
+ private get path();
76
+ /**
77
+ * Where spends are written now: APPEND-ONLY, one JSON object per line.
78
+ *
79
+ * 🔴 THE WHOLE-MAP REWRITE BECAME A RAILS BYPASS THE MOMENT THIS LEDGER WAS
80
+ * SHARED. `record` used to serialise the entire `spent` map from the snapshot
81
+ * loaded at `open()` and rename it over the file. That was sound while one run
82
+ * owned one checkout. Phase 1 moved this file to the PROJECT state directory —
83
+ * so that a single-use grant could not be spent once per workspace — and made
84
+ * two runs concurrent in the same change. Two runs spending two DIFFERENT
85
+ * grants then each wrote a map that did not contain the other's spend, and the
86
+ * loser's spend was erased: a single-use grant over a railed path, spendable
87
+ * again. The scope fix had turned into a lost-update bug, which is precisely
88
+ * what the recon warned would happen if the format were left alone.
89
+ *
90
+ * An append never loses a concurrent write. `exemptions.json` is still READ,
91
+ * so a machine that has spent grants before this change keeps them, and it is
92
+ * never written again — that is the whole migration.
93
+ */
94
+ private get spendLogPath();
95
+ /**
96
+ * Read what is on disk.
97
+ *
98
+ * 🔴 AN UNREADABLE FILE FAILS CLOSED, WHICH IS THE OPPOSITE OF `CursorStore`.
99
+ *
100
+ * There it is safe to replay too much, so a corrupt cursor is treated as no
101
+ * cursor. Here the equivalent — treating a corrupt file as "nothing spent" —
102
+ * would re-open every door this machine has already used. So an unreadable
103
+ * store stops handing out grants entirely: `isSpent` answers true for
104
+ * everything, and every rail stays shut. Deny is the default the whole rails
105
+ * design rests on.
106
+ */
107
+ open(): Promise<'ok' | 'unreadable'>;
108
+ /**
109
+ * Fold the append-only spend log over whatever the legacy file held.
110
+ *
111
+ * ⚠️ FAILS CLOSED LIKE ITS SIBLING. A log that exists and cannot be read is a
112
+ * log whose spends cannot be seen, and a store that cannot see a spend would
113
+ * re-open a door somebody already used. A MALFORMED LINE is different and is
114
+ * skipped: an append can be torn by a crash mid-write, and discarding every
115
+ * spend on the strength of one truncated last line would be the same
116
+ * fail-open by another route.
117
+ */
118
+ private readSpendLog;
119
+ /** True when this grant must not be handed to another round. Fails closed. */
120
+ isSpent(e: Pick<Exemption, 'itemId' | 'path' | 'expiresAt'>): boolean;
121
+ /**
122
+ * Record a grant as spent.
123
+ *
124
+ * ⚠️ IDEMPOTENT, AND THE FIRST ROUND WINS. A retry that spends the same grant
125
+ * again must not rewrite the round number: the round recorded is the one that
126
+ * actually used the door, and overwriting it would make the trailer and this
127
+ * file disagree about which commit opened it.
128
+ *
129
+ * A store that could not be read refuses to write. Writing a fresh file over
130
+ * one that failed to parse would discard every spend it contained.
131
+ */
132
+ record(e: Exemption): Promise<void>;
133
+ /** What this machine has spent, for a report or a test. */
134
+ all(): Record<string, number>;
135
+ }
136
+ /**
137
+ * The grants a round may be offered for one item.
138
+ *
139
+ * ─────────────────────────────────────────────────────────────────────────────
140
+ * 🔴 THE `!isSpent` HERE IS NOT A DUPLICATE OF THE ONE IN `grantsFromServer`.
141
+ *
142
+ * That one runs ONCE, when the run starts. This one runs every time the gate
143
+ * asks, which is once per item per ROUND — and between two rounds of the same
144
+ * run a grant can be spent.
145
+ *
146
+ * Without it the wiring reproduced exactly the failure `RoundRunner` refuses to
147
+ * allow: its constructor rejects a grant source with no spend sink because that
148
+ * is "one grant reopening the same rail every round until it expires". Wiring
149
+ * both halves satisfied that check STRUCTURALLY while defeating it in fact —
150
+ * the sink recorded the spend and the source, a plain array captured before the
151
+ * first round, kept offering the same grant to every round after it. One grant,
152
+ * one round, was true only across runs and false within one.
153
+ *
154
+ * ⚠️ IT READS THE STORE'S IN-MEMORY STATE, WHICH IS WHAT MAKES IT WORK. `record`
155
+ * assigns `spent[key]` before it awaits the write, so the very next round sees
156
+ * the spend whether or not the file has landed. A store that cannot be read
157
+ * answers true for everything and every rail stays shut.
158
+ *
159
+ * ⚠️ WHAT IT DOES NOT DO: notice a grant made DURING a run. The source is
160
+ * fetched once at start, so a person who grants a rail while a run is going
161
+ * opens it for the NEXT run, not this one. That is a closed door rather than an
162
+ * open one, so it is recorded here instead of being engineered away with a
163
+ * mid-run refetch nothing asked for.
164
+ */
165
+ export declare function offerableFor(grants: readonly Exemption[], itemId: string, isSpent: (e: Pick<Exemption, 'itemId' | 'path' | 'expiresAt'>) => boolean): Exemption[];
166
+ /** A granted exemption as the server sends it — the subset this mapping needs. */
167
+ export interface GrantRow {
168
+ itemId: string;
169
+ path: string;
170
+ decision: string;
171
+ actor: string;
172
+ expiresAt: string | null;
173
+ }
174
+ /**
175
+ * Server rows → the grants a round may be offered.
176
+ *
177
+ * 🔴 THREE FILTERS, AND EACH ONE IS LOAD-BEARING.
178
+ *
179
+ * - `decision === 'granted'` — a REFUSAL is recorded in the same table, and
180
+ * handing one to a gate would open the door a person explicitly shut.
181
+ * - a real `expiresAt` — the model treats a grant with no expiry as no grant;
182
+ * `listGranted` already excludes both, and asking again means a source that
183
+ * widened cannot widen the rails silently.
184
+ * - not already spent on this machine — one grant, one round.
185
+ *
186
+ * ⚠️ IT DOES NOT JUDGE THE PATH, AND MUST NOT. Whether a grant opens the file
187
+ * actually being written is decided at the interlock by `isExemptionValid`,
188
+ * which is the only place that sees it. Pre-filtering here would be a second
189
+ * opinion about the same question, free to disagree.
190
+ */
191
+ export declare function grantsFromServer(rows: readonly GrantRow[], isSpent: (e: Pick<Exemption, 'itemId' | 'path' | 'expiresAt'>) => boolean, fromGrant: (p: {
192
+ itemId: string;
193
+ path: string;
194
+ expiresAt: string;
195
+ actor: string;
196
+ }) => Exemption): Exemption[];
197
+ //# sourceMappingURL=exemption-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exemption-store.d.ts","sourceRoot":"","sources":["../src/exemption-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE/C;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,CAAC,CAAC;IACX,gDAAgD;IAChD,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAC/B;AAMD;;;;;;;;;;GAUG;AAEH,wBAAgB,QAAQ,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC,GAAG,MAAM,CAEpF;AAED,qBAAa,cAAc;IAsBvB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,EAAE;IACnB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC;IAvB3B,kFAAkF;IAClF,OAAO,CAAC,MAAM,CAAC,MAAM,CAAK;IAE1B,OAAO,CAAC,KAAK,CAA8B;IAC3C,OAAO,CAAC,QAAQ,CAAQ;IAExB;;;;;;;;;;;;;OAaG;gBAEgB,QAAQ,EAAE,MAAM,EAChB,EAAE,EAAE,QAAQ,EACZ,OAAO,CAAC,GAAE,MAAM,OAAO,CAAC;QAAE,EAAE,EAAE,OAAO,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC,aAAA;IAG7E,OAAO,KAAK,IAAI,GAEf;IAED;;;;;;;;;;;;;;;;;OAiBG;IACH,OAAO,KAAK,YAAY,GAEvB;IAED;;;;;;;;;;;OAWG;IACG,IAAI,IAAI,OAAO,CAAC,IAAI,GAAG,YAAY,CAAC;IAsC1C;;;;;;;;;OASG;YACW,YAAY;IAuB1B,8EAA8E;IAC9E,OAAO,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC,GAAG,OAAO;IAKrE;;;;;;;;;;OAUG;IACG,MAAM,CAAC,CAAC,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAqBzC,2DAA2D;IAC3D,GAAG,IAAI,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;CAG9B;AACD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAgB,YAAY,CAC1B,MAAM,EAAE,SAAS,SAAS,EAAE,EAC5B,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC,KAAK,OAAO,GACxE,SAAS,EAAE,CAEb;AAED,kFAAkF;AAClF,MAAM,WAAW,QAAQ;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,SAAS,QAAQ,EAAE,EACzB,OAAO,EAAE,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,EAAE,QAAQ,GAAG,MAAM,GAAG,WAAW,CAAC,KAAK,OAAO,EACzE,SAAS,EAAE,CAAC,CAAC,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,KAAK,SAAS,GAC9F,SAAS,EAAE,CAYb"}