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,139 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.OBSERVATIONS_STORE = void 0;
4
+ exports.inventoryObservations = inventoryObservations;
5
+ exports.observationFacts = observationFacts;
6
+ const node_fs_1 = require("node:fs");
7
+ const node_path_1 = require("node:path");
8
+ const core_1 = require("@looply/core");
9
+ const session_observation_store_1 = require("./session-observation-store");
10
+ /**
11
+ * OBSERVATIONS, AS ARTIFACTS THE RETENTION POLICY CAN SEE.
12
+ *
13
+ * ─────────────────────────────────────────────────────────────────────────────
14
+ * 🔴 THE ROOT EXISTED AND NOTHING WAS POINTED AT IT.
15
+ * `session-observation-store.ts` says so itself: *"its own root, one file per
16
+ * watch, and a root a retention policy can be pointed at — this product already
17
+ * decided how disposable artifacts are removed (D5), and an observation is
18
+ * exactly that kind of artifact."* `looply evidence` inventoried two folders and
19
+ * listed `observations/` under *uninventoried*. That is honest reporting of an
20
+ * unbounded store, and `OWNER_CHARTER.md` §5 D5 asks for more than honesty:
21
+ * *"Also cover the named compile/tool/rejected stores or report exact
22
+ * unclassified entries; do not claim complete retention from an inventory of
23
+ * only two folders."*
24
+ *
25
+ * ─────────────────────────────────────────────────────────────────────────────
26
+ * ⚠️ THE UNIT IS ONE WATCH, NOT ONE SESSION. A session directory holds a file
27
+ * per watch, taken at different times and ending in different ways — a
28
+ * directory-level decision would either keep a year-old complete account
29
+ * because a recent watch sits beside it, or expire a record that is still
30
+ * running. So the artifact id is `<sessionId>/<file>`, which is also the path
31
+ * under the store, so `pathOf` resolves without a second convention.
32
+ *
33
+ * 🔴 AND NOTHING UNREADABLE BECOMES AN ARTIFACT. *"Missing/unreadable/unknown
34
+ * is never deletion permission."* A file that cannot be parsed, a link, a
35
+ * `coversFrom` that is not a time — each is NAMED here and left out of the
36
+ * plan, which is the only way a policy can be wrong about it in the safe
37
+ * direction.
38
+ */
39
+ exports.OBSERVATIONS_STORE = 'observations';
40
+ /** `<sessionId>/<file>.json`, and nothing that could leave the store. */
41
+ const ID = /^[^\\/.][^\\/]*\/[^\\/.][^\\/]*\.json$/;
42
+ function sizeOf(path) {
43
+ try {
44
+ const st = (0, node_fs_1.statSync)(path);
45
+ return st.isFile() ? st.size : null;
46
+ }
47
+ catch {
48
+ return null;
49
+ }
50
+ }
51
+ /**
52
+ * Every watch on file, classified.
53
+ *
54
+ * ⚠️ `createdAtMs` IS `coversFrom`, NOT THE FILE'S MTIME. The record is written
55
+ * twice — once at attach and once at the close — so its mtime is the moment the
56
+ * watch ENDED, and a long watch would look hours younger than it is. What the
57
+ * age window is about is when the observation began.
58
+ */
59
+ function inventoryObservations(stateDir) {
60
+ const root = (0, session_observation_store_1.observationPaths)(stateDir, '').root;
61
+ let sessions;
62
+ try {
63
+ sessions = (0, node_fs_1.readdirSync)(root, { withFileTypes: true })
64
+ .filter((e) => e.isDirectory())
65
+ .map((e) => e.name)
66
+ .sort();
67
+ }
68
+ catch {
69
+ // No root at all: nothing has ever been watched here. Not an error, and
70
+ // not an unreadable entry either.
71
+ return { artifacts: [], unreadable: [] };
72
+ }
73
+ const artifacts = [];
74
+ const unreadable = [];
75
+ for (const sessionId of sessions) {
76
+ const paths = (0, session_observation_store_1.observationPaths)(stateDir, sessionId);
77
+ const read = (0, session_observation_store_1.readObservations)(paths);
78
+ for (const why of read.unreadable)
79
+ unreadable.push(`${sessionId}/${why}`);
80
+ for (const stored of read.observations) {
81
+ const name = stored.file.slice(paths.session.length + 1);
82
+ const id = `${sessionId}/${name}`;
83
+ const createdAtMs = Date.parse(stored.record.coversFrom);
84
+ if (!Number.isFinite(createdAtMs)) {
85
+ unreadable.push(`${id} has no readable coversFrom, so its age could not be established`);
86
+ continue;
87
+ }
88
+ const bytes = sizeOf(stored.file);
89
+ if (bytes === null) {
90
+ unreadable.push(`${id} could not be sized`);
91
+ continue;
92
+ }
93
+ const d = (0, core_1.observationDisposition)(stored.record);
94
+ artifacts.push({
95
+ id,
96
+ store: exports.OBSERVATIONS_STORE,
97
+ bytes,
98
+ createdAtMs,
99
+ class: d.class,
100
+ // 🔴 Asserted only for files under THIS project's own observations
101
+ // root, written by this product's own watcher. Nothing outside it is
102
+ // claimed — an unowned artifact is untouchable, and the value of that
103
+ // rule is that ownership is not handed out loosely.
104
+ owned: true,
105
+ pinned: d.pinned,
106
+ });
107
+ }
108
+ }
109
+ return { artifacts, unreadable };
110
+ }
111
+ /**
112
+ * The re-check `--apply` makes immediately before removing one.
113
+ *
114
+ * 🔴 D5: *"check identity, ownership, current policy eligibility, pins,
115
+ * references and path boundaries AGAIN before removal."* The plan was made from
116
+ * a walk that may be minutes old; a watch that has since been re-opened, or a
117
+ * record replaced by something that is not one, must not be removed on the
118
+ * strength of what was true then.
119
+ *
120
+ * `null` means "this is not an observation this inventory owns" — an id that
121
+ * could leave the store, a session with no such file, a file that no longer
122
+ * parses. The caller must treat that as a refusal, never as permission.
123
+ */
124
+ function observationFacts(stateDir, id) {
125
+ if (!ID.test(id))
126
+ return null;
127
+ const cut = id.indexOf('/');
128
+ const sessionId = id.slice(0, cut);
129
+ const name = id.slice(cut + 1);
130
+ const paths = (0, session_observation_store_1.observationPaths)(stateDir, sessionId);
131
+ // The whole path, not a suffix: `a.json` is a suffix of `extra.json`.
132
+ const want = (0, node_path_1.join)(paths.session, name);
133
+ const hit = (0, session_observation_store_1.readObservations)(paths).observations.find((o) => o.file === want);
134
+ if (hit === undefined)
135
+ return null;
136
+ const d = (0, core_1.observationDisposition)(hit.record);
137
+ return { owned: true, pinned: d.pinned, class: d.class };
138
+ }
139
+ //# sourceMappingURL=observation-inventory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"observation-inventory.js","sourceRoot":"","sources":["../src/observation-inventory.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,45 @@
1
+ /**
2
+ * The child processes this run started, and is therefore responsible for.
3
+ *
4
+ * A run spawns a coding agent per round, with a generous timeout — 45 minutes
5
+ * for the implementer. If the runner goes away during one, nothing stops the
6
+ * agent: measured on this machine, hard-killing the runner leaves the leaf
7
+ * process alive and still writing files into the repository, with no parent to
8
+ * notice. The next run then finds a tree being edited by nobody.
9
+ *
10
+ * This is the in-process half of closing that, and it is deliberately only that
11
+ * half. Killing an orphan *after* the fact would mean proving the pid we are
12
+ * about to kill is still the process we spawned, and pids are reused. The one
13
+ * portable identity a parent has is the handle it is already holding, so this
14
+ * keeps handles and uses them while the process that owns them is alive.
15
+ *
16
+ * What that covers: an ordinary exit, a thrown error, a Ctrl-C, a `looply stop`.
17
+ * What it cannot: SIGKILL, a power cut, or a taskkill /F on the runner. Those
18
+ * leave an orphan, and no amount of bookkeeping in this process changes that —
19
+ * the honest response is to report it during recovery rather than to claim a
20
+ * guarantee that does not exist.
21
+ */
22
+ export interface OwnedChild {
23
+ /** For the message. The kill goes through the handle, never through this. */
24
+ pid: number | undefined;
25
+ /** What this child was for, so a report can name it. */
26
+ label: string;
27
+ kill(): void;
28
+ }
29
+ export declare class OwnedChildren {
30
+ private readonly children;
31
+ /** Take ownership. The returned function gives it back when the child ends. */
32
+ adopt(child: OwnedChild): () => void;
33
+ size(): number;
34
+ /** What is still running, for a message rather than for a decision. */
35
+ describe(): string[];
36
+ /**
37
+ * Stop everything this process started.
38
+ *
39
+ * Every child is attempted even if one throws: a registry that gives up on
40
+ * the first failure would leave the rest running, which is the situation it
41
+ * exists to prevent. Returns how many it tried, so a caller can say so.
42
+ */
43
+ killAll(): number;
44
+ }
45
+ //# sourceMappingURL=owned-children.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-children.d.ts","sourceRoot":"","sources":["../src/owned-children.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,MAAM,WAAW,UAAU;IACzB,6EAA6E;IAC7E,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,wDAAwD;IACxD,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,IAAI,IAAI,CAAC;CACd;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAElD,+EAA+E;IAC/E,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,MAAM,IAAI;IAOpC,IAAI,IAAI,MAAM;IAId,uEAAuE;IACvE,QAAQ,IAAI,MAAM,EAAE;IAIpB;;;;;;OAMG;IACH,OAAO,IAAI,MAAM;CAalB"}
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ /**
3
+ * The child processes this run started, and is therefore responsible for.
4
+ *
5
+ * A run spawns a coding agent per round, with a generous timeout — 45 minutes
6
+ * for the implementer. If the runner goes away during one, nothing stops the
7
+ * agent: measured on this machine, hard-killing the runner leaves the leaf
8
+ * process alive and still writing files into the repository, with no parent to
9
+ * notice. The next run then finds a tree being edited by nobody.
10
+ *
11
+ * This is the in-process half of closing that, and it is deliberately only that
12
+ * half. Killing an orphan *after* the fact would mean proving the pid we are
13
+ * about to kill is still the process we spawned, and pids are reused. The one
14
+ * portable identity a parent has is the handle it is already holding, so this
15
+ * keeps handles and uses them while the process that owns them is alive.
16
+ *
17
+ * What that covers: an ordinary exit, a thrown error, a Ctrl-C, a `looply stop`.
18
+ * What it cannot: SIGKILL, a power cut, or a taskkill /F on the runner. Those
19
+ * leave an orphan, and no amount of bookkeeping in this process changes that —
20
+ * the honest response is to report it during recovery rather than to claim a
21
+ * guarantee that does not exist.
22
+ */
23
+ Object.defineProperty(exports, "__esModule", { value: true });
24
+ exports.OwnedChildren = void 0;
25
+ class OwnedChildren {
26
+ children = new Set();
27
+ /** Take ownership. The returned function gives it back when the child ends. */
28
+ adopt(child) {
29
+ this.children.add(child);
30
+ return () => {
31
+ this.children.delete(child);
32
+ };
33
+ }
34
+ size() {
35
+ return this.children.size;
36
+ }
37
+ /** What is still running, for a message rather than for a decision. */
38
+ describe() {
39
+ return [...this.children].map((c) => `${c.label}${c.pid === undefined ? '' : ` (pid ${c.pid})`}`);
40
+ }
41
+ /**
42
+ * Stop everything this process started.
43
+ *
44
+ * Every child is attempted even if one throws: a registry that gives up on
45
+ * the first failure would leave the rest running, which is the situation it
46
+ * exists to prevent. Returns how many it tried, so a caller can say so.
47
+ */
48
+ killAll() {
49
+ const all = [...this.children];
50
+ this.children.clear();
51
+ for (const child of all) {
52
+ try {
53
+ child.kill();
54
+ }
55
+ catch {
56
+ // Already gone is the goal state; anything else is not worth failing a
57
+ // shutdown over.
58
+ }
59
+ }
60
+ return all.length;
61
+ }
62
+ }
63
+ exports.OwnedChildren = OwnedChildren;
64
+ //# sourceMappingURL=owned-children.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"owned-children.js","sourceRoot":"","sources":["../src/owned-children.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;;;AAUH,MAAa,aAAa;IACP,QAAQ,GAAG,IAAI,GAAG,EAAc,CAAC;IAElD,+EAA+E;IAC/E,KAAK,CAAC,KAAiB;QACrB,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;QACzB,OAAO,GAAG,EAAE;YACV,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC9B,CAAC,CAAC;IACJ,CAAC;IAED,IAAI;QACF,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IAED,uEAAuE;IACvE,QAAQ;QACN,OAAO,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;IACpG,CAAC;IAED;;;;;;OAMG;IACH,OAAO;QACL,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC/B,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;QACtB,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,CAAC;YACxB,IAAI,CAAC;gBACH,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,CAAC;YAAC,MAAM,CAAC;gBACP,uEAAuE;gBACvE,iBAAiB;YACnB,CAAC;QACH,CAAC;QACD,OAAO,GAAG,CAAC,MAAM,CAAC;IACpB,CAAC;CACF;AAxCD,sCAwCC"}
@@ -0,0 +1,19 @@
1
+ import { type Goal, type PacketSource, type TaskPacket } from '@looply/core';
2
+ /**
3
+ * THE PACKET FOR A RUN'S GOAL — the sources read, the packet assembled.
4
+ *
5
+ * One read per linked source, through whatever `read` the composition root
6
+ * hands over (the server client in a run; a service or a fake in a test). A
7
+ * read that fails puts that source's links under `missing`: a source the
8
+ * server cannot answer right now is a line in the packet, never a reason to
9
+ * refuse a run and never a reason to invent text. Assembly itself is pure —
10
+ * `taskPacketFor` in core — so what the compiler is told is a function of
11
+ * the records, not of this file.
12
+ */
13
+ export declare function packetForGoal(goal: Pick<Goal, 'id' | 'version' | 'text' | 'requirements'>, read: (sourceId: string) => Promise<PacketSource>,
14
+ /** The programme's other goals, so the packet can name what they own (F19). Absent: nothing named. */
15
+ siblings?: readonly Pick<Goal, 'id' | 'state' | 'requirements'>[]): Promise<{
16
+ packet: TaskPacket;
17
+ unreadable: string[];
18
+ }>;
19
+ //# sourceMappingURL=packet-for-goal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-for-goal.d.ts","sourceRoot":"","sources":["../src/packet-for-goal.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,IAAI,EAAE,KAAK,YAAY,EAAE,KAAK,UAAU,EAAE,MAAM,cAAc,CAAC;AAE5F;;;;;;;;;;GAUG;AACH,wBAAsB,aAAa,CACjC,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,cAAc,CAAC,EAC5D,IAAI,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,YAAY,CAAC;AACjD,sGAAsG;AACtG,QAAQ,GAAE,SAAS,IAAI,CAAC,IAAI,EAAE,IAAI,GAAG,OAAO,GAAG,cAAc,CAAC,EAAO,GACpE,OAAO,CAAC;IAAE,MAAM,EAAE,UAAU,CAAC;IAAC,UAAU,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAYvD"}
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.packetForGoal = packetForGoal;
4
+ const core_1 = require("@looply/core");
5
+ /**
6
+ * THE PACKET FOR A RUN'S GOAL — the sources read, the packet assembled.
7
+ *
8
+ * One read per linked source, through whatever `read` the composition root
9
+ * hands over (the server client in a run; a service or a fake in a test). A
10
+ * read that fails puts that source's links under `missing`: a source the
11
+ * server cannot answer right now is a line in the packet, never a reason to
12
+ * refuse a run and never a reason to invent text. Assembly itself is pure —
13
+ * `taskPacketFor` in core — so what the compiler is told is a function of
14
+ * the records, not of this file.
15
+ */
16
+ async function packetForGoal(goal, read,
17
+ /** The programme's other goals, so the packet can name what they own (F19). Absent: nothing named. */
18
+ siblings = []) {
19
+ const ids = [...new Set((goal.requirements ?? []).map((l) => l.sourceId))].sort();
20
+ const sources = new Map();
21
+ const unreadable = [];
22
+ for (const id of ids) {
23
+ try {
24
+ sources.set(id, await read(id));
25
+ }
26
+ catch {
27
+ unreadable.push(id);
28
+ }
29
+ }
30
+ return { packet: (0, core_1.taskPacketFor)(goal, sources, siblings), unreadable };
31
+ }
32
+ //# sourceMappingURL=packet-for-goal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"packet-for-goal.js","sourceRoot":"","sources":["../src/packet-for-goal.ts"],"names":[],"mappings":";;AAaA,sCAiBC;AA9BD,uCAA4F;AAE5F;;;;;;;;;;GAUG;AACI,KAAK,UAAU,aAAa,CACjC,IAA4D,EAC5D,IAAiD;AACjD,sGAAsG;AACtG,WAAmE,EAAE;IAErE,MAAM,GAAG,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAClF,MAAM,OAAO,GAAG,IAAI,GAAG,EAAwB,CAAC;IAChD,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,EAAE,IAAI,GAAG,EAAE,CAAC;QACrB,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,UAAU,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACtB,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,IAAA,oBAAa,EAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,CAAC,EAAE,UAAU,EAAE,CAAC;AACxE,CAAC"}
@@ -0,0 +1,85 @@
1
+ import type { MachineStore } from './machine-store';
2
+ import { ServerClient } from './server-client';
3
+ /**
4
+ * `looply pair`.
5
+ *
6
+ * The machine asks the server for a code, shows it, and waits for a phone to
7
+ * claim it. The code rotates every thirty seconds, so this loop re-issues rather
8
+ * than displaying a dead one — a code on screen that expired ninety seconds ago
9
+ * is worse than no code, because the person typing it has no way to tell.
10
+ */
11
+ export interface PairOptions {
12
+ serverUrl: string;
13
+ machineName: string;
14
+ store: MachineStore;
15
+ client: ServerClient;
16
+ /** Overall budget before giving up. */
17
+ timeoutMs?: number;
18
+ /** How often to ask whether a phone has claimed the current code. */
19
+ pollMs?: number;
20
+ /** Re-issue the code slightly before the server expires it. */
21
+ reissueMs?: number;
22
+ log: (line: string) => void;
23
+ render: (info: {
24
+ pairCode: string;
25
+ qrPayload: string;
26
+ expiresAt: string;
27
+ }, secondsLeft?: number) => void;
28
+ sleep(ms: number): Promise<void>;
29
+ now(): number;
30
+ }
31
+ export interface PairResult {
32
+ machineId: string;
33
+ paired: boolean;
34
+ reason?: string;
35
+ }
36
+ export declare function runPair(opts: PairOptions): Promise<PairResult>;
37
+ /**
38
+ * The code, big enough to read across a desk.
39
+ *
40
+ * Drawn with block characters rather than printed small, because this is a
41
+ * number somebody reads off one screen and types into another — often at arm's
42
+ * length, sometimes read aloud to someone else holding the phone.
43
+ *
44
+ * Grouped three and three: that is how a six-digit code is spoken, and a solid
45
+ * block of six is measurably harder to type without losing your place.
46
+ */
47
+ export declare function renderPairCode(info: {
48
+ pairCode: string;
49
+ qrPayload: string;
50
+ expiresAt: string;
51
+ }, secondsLeft?: number): string;
52
+ /**
53
+ * The same code as a square.
54
+ *
55
+ * The server has always sent `qrPayload` and nothing ever drew it, so the
56
+ * camera path existed in the design and in the API and nowhere a person could
57
+ * reach. Six digits typed at arm's length is still the primitive — this is the
58
+ * faster path when the phone is already in your hand.
59
+ */
60
+ export declare function qrLines(payload: string): string[];
61
+ export declare function bigDigits(text: string): string[];
62
+ /**
63
+ * The reissue interval in words, DERIVED from the interval itself.
64
+ *
65
+ * 🔴 THIS SENTENCE IS PRINTED TO EVERY USER ON THE FIRST DRAW OF EVERY CODE, and
66
+ * it said "every 25 seconds" while `DEFAULT_REISSUE_MS` was 150_000 — six times
67
+ * wrong, telling somebody their code had already rotated four times when it had
68
+ * not moved. 25s was true against the old 30s TTL; both numbers moved and the
69
+ * copy did not.
70
+ *
71
+ * ⚠️ IT IS COMPUTED, NOT WRITTEN DOWN. A second hardcoded number is a second
72
+ * thing to forget: the only way this can disagree with the behaviour again is if
73
+ * somebody changes what the words mean, not what the interval is.
74
+ */
75
+ export declare function reissueWording(ms?: number): string;
76
+ /**
77
+ * How long this code has left.
78
+ *
79
+ * A static "it changes every N seconds" cannot tell you whether the code in
80
+ * front of you is nine seconds old or twenty-nine — and typing a six-digit
81
+ * number takes long enough for that to be the difference between pairing and
82
+ * "the code is invalid no matter what I do".
83
+ */
84
+ export declare function freshness(secondsLeft?: number): string;
85
+ //# sourceMappingURL=pair-cmd.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pair-cmd.d.ts","sourceRoot":"","sources":["../src/pair-cmd.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAe,MAAM,iBAAiB,CAAC;AAI5D;;;;;;;GAOG;AAEH,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,YAAY,CAAC;IACpB,MAAM,EAAE,YAAY,CAAC;IACrB,uCAAuC;IACvC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,qEAAqE;IACrE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,+DAA+D;IAC/D,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC5B,MAAM,EAAE,CAAC,IAAI,EAAE;QAAE,QAAQ,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAA;KAAE,EAAE,WAAW,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzG,KAAK,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACjC,GAAG,IAAI,MAAM,CAAC;CACf;AAED,MAAM,WAAW,UAAU;IACzB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,OAAO,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAcD,wBAAsB,OAAO,CAAC,IAAI,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CA2DpE;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAA;CAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CA6B7H;AAED;;;;;;;GAOG;AACH,wBAAgB,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,EAAE,CASjD;AAsBD,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUhD;AAED;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAAC,EAAE,GAAE,MAA2B,GAAG,MAAM,CAKtE;AAED;;;;;;;GAOG;AACH,wBAAgB,SAAS,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAOtD"}
@@ -0,0 +1,205 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.runPair = runPair;
7
+ exports.renderPairCode = renderPairCode;
8
+ exports.qrLines = qrLines;
9
+ exports.bigDigits = bigDigits;
10
+ exports.reissueWording = reissueWording;
11
+ exports.freshness = freshness;
12
+ const server_client_1 = require("./server-client");
13
+ const qrcode_terminal_1 = __importDefault(require("qrcode-terminal"));
14
+ const ui_1 = require("./ui");
15
+ const DEFAULT_TIMEOUT_MS = 10 * 60 * 1000;
16
+ const DEFAULT_POLL_MS = 2000;
17
+ /**
18
+ * Reissue comfortably INSIDE the server TTL (180s), not at its edge.
19
+ *
20
+ * At 25s against a 30s TTL the two were almost the same number, so the code on
21
+ * screen was routinely dead-or-dying while being read: a claim 8 seconds after
22
+ * an issue could still fail because the digits belonged to the previous cycle.
23
+ * A wide margin means the code you are looking at is the code that works.
24
+ */
25
+ const DEFAULT_REISSUE_MS = 150_000;
26
+ async function runPair(opts) {
27
+ const deadline = opts.now() + (opts.timeoutMs ?? DEFAULT_TIMEOUT_MS);
28
+ const pollMs = opts.pollMs ?? DEFAULT_POLL_MS;
29
+ const reissueMs = opts.reissueMs ?? DEFAULT_REISSUE_MS;
30
+ // Re-pairing is allowed but never silent: the existing token stops being the
31
+ // one the server knows, and a person who did not mean to do that should hear
32
+ // about it here rather than when the app goes quiet.
33
+ const existing = opts.store.load();
34
+ if (existing) {
35
+ opts.log(`note : this machine is already paired as ${existing.machineId}.`);
36
+ opts.log(' pairing again replaces that identity.');
37
+ }
38
+ let machineId = '';
39
+ while (opts.now() < deadline) {
40
+ const started = await opts.client.pairStart(opts.machineName);
41
+ machineId = started.machineId;
42
+ opts.render(started);
43
+ const codeDies = opts.now() + reissueMs;
44
+ while (opts.now() < codeDies && opts.now() < deadline) {
45
+ await opts.sleep(pollMs);
46
+ // Redrawn every poll so the countdown moves. Without it the block is
47
+ // static for a whole reissue interval and there is no way to tell a live code from
48
+ // one that died while you were looking at it.
49
+ opts.render(started, Math.max(0, Math.ceil((codeDies - opts.now()) / 1000)));
50
+ let polled;
51
+ try {
52
+ polled = await opts.client.pairPoll(machineId);
53
+ }
54
+ catch (e) {
55
+ // A blip while waiting is not a failure to pair; the code is still live
56
+ // on the server and the next poll will find it.
57
+ if (e instanceof server_client_1.ServerError && e.isOffline)
58
+ continue;
59
+ throw e;
60
+ }
61
+ if (polled.status === 'claimed' && polled.machineToken) {
62
+ opts.store.save({
63
+ machineId,
64
+ token: polled.machineToken,
65
+ serverUrl: opts.serverUrl,
66
+ pairedAt: new Date(opts.now()).toISOString(),
67
+ });
68
+ opts.log('');
69
+ opts.log(`paired : ${machineId}`);
70
+ opts.log(' token stored in ~/.looply/machine.json — outside this repo, so a');
71
+ opts.log(' discarded round cannot delete it.');
72
+ return { machineId, paired: true };
73
+ }
74
+ }
75
+ // No line here announcing the reissue: the block is redrawn in place, so
76
+ // an extra line would shift the cursor maths and leave a half-erased box
77
+ // above the live one. The code changing IS the announcement.
78
+ }
79
+ return { machineId, paired: false, reason: 'nobody claimed the code in time' };
80
+ }
81
+ /**
82
+ * The code, big enough to read across a desk.
83
+ *
84
+ * Drawn with block characters rather than printed small, because this is a
85
+ * number somebody reads off one screen and types into another — often at arm's
86
+ * length, sometimes read aloud to someone else holding the phone.
87
+ *
88
+ * Grouped three and three: that is how a six-digit code is spoken, and a solid
89
+ * block of six is measurably harder to type without losing your place.
90
+ */
91
+ function renderPairCode(info, secondsLeft) {
92
+ const code = info.pairCode;
93
+ const grouped = `${code.slice(0, 3)} ${code.slice(3)}`;
94
+ // The box holds the number and nothing else. Instructions inside it compete
95
+ // with the thing being read, and this is read at a glance from across a desk —
96
+ // whatever shares the frame steals from that.
97
+ return [
98
+ '',
99
+ (0, ui_1.box)(
100
+ // Indented so the digits sit inside the frame rather than against it; the
101
+ // box sizes to its widest line, so the padding lands on both sides.
102
+ ['', '', ...bigDigits(grouped).map((l) => ` ${(0, ui_1.volt)(l)} `), '', ''], { title: 'pairing code', tone: ui_1.volt }),
103
+ '',
104
+ ` ${(0, ui_1.grey)('type this into looply on your phone, or scan the square below')}`,
105
+ ` ${(0, ui_1.dim)(freshness(secondsLeft))}`,
106
+ '',
107
+ ...qrLines(info.qrPayload).map((l) => ` ${l}`),
108
+ '',
109
+ // Said here because this is the screen an agent is most likely to be
110
+ // driving. A pairing code only works if a HUMAN can see it: run it inside
111
+ // the session so the output lands in front of the person, not in some
112
+ // other terminal they are not looking at.
113
+ ` ${(0, ui_1.dim)('driving this from an agent? keep it in the session — nobody can read')}`,
114
+ ` ${(0, ui_1.dim)('a code that printed into a window they cannot see.')}`,
115
+ '',
116
+ ].join('\n');
117
+ }
118
+ /**
119
+ * The same code as a square.
120
+ *
121
+ * The server has always sent `qrPayload` and nothing ever drew it, so the
122
+ * camera path existed in the design and in the API and nowhere a person could
123
+ * reach. Six digits typed at arm's length is still the primitive — this is the
124
+ * faster path when the phone is already in your hand.
125
+ */
126
+ function qrLines(payload) {
127
+ let out = '';
128
+ // Low correction: the payload is short and the square is read off a screen a
129
+ // foot away, not a poster. Smaller is easier to fit in a terminal.
130
+ qrcode_terminal_1.default.setErrorLevel('L');
131
+ qrcode_terminal_1.default.generate(payload, { small: true }, (code) => {
132
+ out = code;
133
+ });
134
+ return out.replace(/\s+$/, '').split('\n');
135
+ }
136
+ /**
137
+ * Seven-segment-ish digits from block characters.
138
+ *
139
+ * Three rows rather than five: tall enough to read across a room, short enough
140
+ * that the whole pairing screen still fits above the fold in a small terminal.
141
+ */
142
+ const GLYPHS = {
143
+ '0': ['█▀█', '█ █', '█▄█'],
144
+ '1': [' ▀█', ' █', ' █'],
145
+ '2': ['▀▀█', '▄▀ ', '█▄▄'],
146
+ '3': ['▀▀█', ' ▀█', '▄▄█'],
147
+ '4': ['█ █', '▀▀█', ' █'],
148
+ '5': ['█▀▀', '▀▀█', '▄▄█'],
149
+ '6': ['█▀▀', '█▀█', '█▄█'],
150
+ '7': ['▀▀█', ' █', ' █'],
151
+ '8': ['█▀█', '█▀█', '█▄█'],
152
+ '9': ['█▀█', '▀▀█', '▄▄█'],
153
+ ' ': [' ', ' ', ' '],
154
+ };
155
+ function bigDigits(text) {
156
+ const rows = ['', '', ''];
157
+ for (const ch of text) {
158
+ const glyph = GLYPHS[ch];
159
+ // An unknown character falls back to itself rather than vanishing — a code
160
+ // that renders wrong is still typeable, a code that renders as nothing is not.
161
+ const cell = glyph ?? [ch, ch, ch];
162
+ for (let i = 0; i < 3; i++)
163
+ rows[i] += `${cell[i]} `;
164
+ }
165
+ return rows.map((r) => r.trimEnd());
166
+ }
167
+ /**
168
+ * The reissue interval in words, DERIVED from the interval itself.
169
+ *
170
+ * 🔴 THIS SENTENCE IS PRINTED TO EVERY USER ON THE FIRST DRAW OF EVERY CODE, and
171
+ * it said "every 25 seconds" while `DEFAULT_REISSUE_MS` was 150_000 — six times
172
+ * wrong, telling somebody their code had already rotated four times when it had
173
+ * not moved. 25s was true against the old 30s TTL; both numbers moved and the
174
+ * copy did not.
175
+ *
176
+ * ⚠️ IT IS COMPUTED, NOT WRITTEN DOWN. A second hardcoded number is a second
177
+ * thing to forget: the only way this can disagree with the behaviour again is if
178
+ * somebody changes what the words mean, not what the interval is.
179
+ */
180
+ function reissueWording(ms = DEFAULT_REISSUE_MS) {
181
+ const s = Math.round(ms / 1000);
182
+ if (s < 120)
183
+ return `${s} seconds`;
184
+ const mins = s / 60;
185
+ return `${Number.isInteger(mins) ? mins : mins.toFixed(1)} minutes`;
186
+ }
187
+ /**
188
+ * How long this code has left.
189
+ *
190
+ * A static "it changes every N seconds" cannot tell you whether the code in
191
+ * front of you is nine seconds old or twenty-nine — and typing a six-digit
192
+ * number takes long enough for that to be the difference between pairing and
193
+ * "the code is invalid no matter what I do".
194
+ */
195
+ function freshness(secondsLeft) {
196
+ if (secondsLeft === undefined) {
197
+ return `a new code appears every ${reissueWording()} — leave this running`;
198
+ }
199
+ if (secondsLeft <= 0)
200
+ return 'expired — a new one is coming';
201
+ if (secondsLeft <= 6)
202
+ return `${secondsLeft}s left — wait for the next one rather than rushing this`;
203
+ return `${secondsLeft}s left`;
204
+ }
205
+ //# sourceMappingURL=pair-cmd.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pair-cmd.js","sourceRoot":"","sources":["../src/pair-cmd.ts"],"names":[],"mappings":"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"}