dorfl 0.0.0 → 0.1.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 (619) hide show
  1. package/dist/advance-ci-template.d.ts +73 -0
  2. package/dist/advance-ci-template.d.ts.map +1 -0
  3. package/dist/advance-ci-template.js +104 -0
  4. package/dist/advance-ci-template.js.map +1 -0
  5. package/dist/advance-classify.d.ts +132 -0
  6. package/dist/advance-classify.d.ts.map +1 -0
  7. package/dist/advance-classify.js +120 -0
  8. package/dist/advance-classify.js.map +1 -0
  9. package/dist/advance-drivers.d.ts +182 -0
  10. package/dist/advance-drivers.d.ts.map +1 -0
  11. package/dist/advance-drivers.js +231 -0
  12. package/dist/advance-drivers.js.map +1 -0
  13. package/dist/advance-isolated.d.ts +156 -0
  14. package/dist/advance-isolated.d.ts.map +1 -0
  15. package/dist/advance-isolated.js +256 -0
  16. package/dist/advance-isolated.js.map +1 -0
  17. package/dist/advance-lifecycle-template.d.ts +107 -0
  18. package/dist/advance-lifecycle-template.d.ts.map +1 -0
  19. package/dist/advance-lifecycle-template.js +668 -0
  20. package/dist/advance-lifecycle-template.js.map +1 -0
  21. package/dist/advance-loop-driver.d.ts +325 -0
  22. package/dist/advance-loop-driver.d.ts.map +1 -0
  23. package/dist/advance-loop-driver.js +437 -0
  24. package/dist/advance-loop-driver.js.map +1 -0
  25. package/dist/advance-treeless-publish.d.ts +108 -0
  26. package/dist/advance-treeless-publish.d.ts.map +1 -0
  27. package/dist/advance-treeless-publish.js +71 -0
  28. package/dist/advance-treeless-publish.js.map +1 -0
  29. package/dist/advance.d.ts +340 -0
  30. package/dist/advance.d.ts.map +1 -0
  31. package/dist/advance.js +1122 -0
  32. package/dist/advance.js.map +1 -0
  33. package/dist/advancing-lock.d.ts +294 -0
  34. package/dist/advancing-lock.d.ts.map +1 -0
  35. package/dist/advancing-lock.js +594 -0
  36. package/dist/advancing-lock.js.map +1 -0
  37. package/dist/agent-launch.d.ts +79 -0
  38. package/dist/agent-launch.d.ts.map +1 -0
  39. package/dist/agent-launch.js +61 -0
  40. package/dist/agent-launch.js.map +1 -0
  41. package/dist/agent-stop.d.ts +149 -0
  42. package/dist/agent-stop.d.ts.map +1 -0
  43. package/dist/agent-stop.js +307 -0
  44. package/dist/agent-stop.js.map +1 -0
  45. package/dist/apply-decide.d.ts +127 -0
  46. package/dist/apply-decide.d.ts.map +1 -0
  47. package/dist/apply-decide.js +176 -0
  48. package/dist/apply-decide.js.map +1 -0
  49. package/dist/apply-merge-action.d.ts +206 -0
  50. package/dist/apply-merge-action.d.ts.map +1 -0
  51. package/dist/apply-merge-action.js +307 -0
  52. package/dist/apply-merge-action.js.map +1 -0
  53. package/dist/apply-persist.d.ts +174 -0
  54. package/dist/apply-persist.d.ts.map +1 -0
  55. package/dist/apply-persist.js +359 -0
  56. package/dist/apply-persist.js.map +1 -0
  57. package/dist/arbiter.d.ts +120 -0
  58. package/dist/arbiter.d.ts.map +1 -0
  59. package/dist/arbiter.js +255 -0
  60. package/dist/arbiter.js.map +1 -0
  61. package/dist/brand.d.ts +70 -0
  62. package/dist/brand.d.ts.map +1 -0
  63. package/dist/brand.js +84 -0
  64. package/dist/brand.js.map +1 -0
  65. package/dist/buildable-body.d.ts +132 -0
  66. package/dist/buildable-body.d.ts.map +1 -0
  67. package/dist/buildable-body.js +131 -0
  68. package/dist/buildable-body.js.map +1 -0
  69. package/dist/categorise.d.ts +66 -0
  70. package/dist/categorise.d.ts.map +1 -0
  71. package/dist/categorise.js +106 -0
  72. package/dist/categorise.js.map +1 -0
  73. package/dist/claim-cas.d.ts +117 -0
  74. package/dist/claim-cas.d.ts.map +1 -0
  75. package/dist/claim-cas.js +312 -0
  76. package/dist/claim-cas.js.map +1 -0
  77. package/dist/cli-spinner.d.ts +112 -0
  78. package/dist/cli-spinner.d.ts.map +1 -0
  79. package/dist/cli-spinner.js +157 -0
  80. package/dist/cli-spinner.js.map +1 -0
  81. package/dist/cli.d.ts +11 -0
  82. package/dist/cli.d.ts.map +1 -0
  83. package/dist/cli.js +3094 -0
  84. package/dist/cli.js.map +1 -0
  85. package/dist/close-job-template.d.ts +70 -0
  86. package/dist/close-job-template.d.ts.map +1 -0
  87. package/dist/close-job-template.js +180 -0
  88. package/dist/close-job-template.js.map +1 -0
  89. package/dist/close-job.d.ts +95 -0
  90. package/dist/close-job.d.ts.map +1 -0
  91. package/dist/close-job.js +226 -0
  92. package/dist/close-job.js.map +1 -0
  93. package/dist/complete.d.ts +361 -0
  94. package/dist/complete.d.ts.map +1 -0
  95. package/dist/complete.js +885 -0
  96. package/dist/complete.js.map +1 -0
  97. package/dist/concurrency.d.ts +68 -0
  98. package/dist/concurrency.d.ts.map +1 -0
  99. package/dist/concurrency.js +112 -0
  100. package/dist/concurrency.js.map +1 -0
  101. package/dist/config-override.d.ts +76 -0
  102. package/dist/config-override.d.ts.map +1 -0
  103. package/dist/config-override.js +50 -0
  104. package/dist/config-override.js.map +1 -0
  105. package/dist/config.d.ts +668 -0
  106. package/dist/config.d.ts.map +1 -0
  107. package/dist/config.js +241 -0
  108. package/dist/config.js.map +1 -0
  109. package/dist/continue-branch.d.ts +249 -0
  110. package/dist/continue-branch.d.ts.map +1 -0
  111. package/dist/continue-branch.js +389 -0
  112. package/dist/continue-branch.js.map +1 -0
  113. package/dist/cwd-section.d.ts +186 -0
  114. package/dist/cwd-section.d.ts.map +1 -0
  115. package/dist/cwd-section.js +209 -0
  116. package/dist/cwd-section.js.map +1 -0
  117. package/dist/decision-engine.d.ts +170 -0
  118. package/dist/decision-engine.d.ts.map +1 -0
  119. package/dist/decision-engine.js +136 -0
  120. package/dist/decision-engine.js.map +1 -0
  121. package/dist/detect.d.ts +17 -0
  122. package/dist/detect.d.ts.map +1 -0
  123. package/dist/detect.js +118 -0
  124. package/dist/detect.js.map +1 -0
  125. package/dist/do-autopick.d.ts +85 -0
  126. package/dist/do-autopick.d.ts.map +1 -0
  127. package/dist/do-autopick.js +112 -0
  128. package/dist/do-autopick.js.map +1 -0
  129. package/dist/do-config.d.ts +312 -0
  130. package/dist/do-config.d.ts.map +1 -0
  131. package/dist/do-config.js +358 -0
  132. package/dist/do-config.js.map +1 -0
  133. package/dist/do-remote-auto.d.ts +75 -0
  134. package/dist/do-remote-auto.d.ts.map +1 -0
  135. package/dist/do-remote-auto.js +111 -0
  136. package/dist/do-remote-auto.js.map +1 -0
  137. package/dist/do.d.ts +621 -0
  138. package/dist/do.d.ts.map +1 -0
  139. package/dist/do.js +1882 -0
  140. package/dist/do.js.map +1 -0
  141. package/dist/drop-source.d.ts +96 -0
  142. package/dist/drop-source.d.ts.map +1 -0
  143. package/dist/drop-source.js +91 -0
  144. package/dist/drop-source.js.map +1 -0
  145. package/dist/eligibility.d.ts +46 -0
  146. package/dist/eligibility.d.ts.map +1 -0
  147. package/dist/eligibility.js +34 -0
  148. package/dist/eligibility.js.map +1 -0
  149. package/dist/env-config.d.ts +51 -0
  150. package/dist/env-config.d.ts.map +1 -0
  151. package/dist/env-config.js +272 -0
  152. package/dist/env-config.js.map +1 -0
  153. package/dist/failure-cause.d.ts +70 -0
  154. package/dist/failure-cause.d.ts.map +1 -0
  155. package/dist/failure-cause.js +126 -0
  156. package/dist/failure-cause.js.map +1 -0
  157. package/dist/format.d.ts +43 -0
  158. package/dist/format.d.ts.map +1 -0
  159. package/dist/format.js +256 -0
  160. package/dist/format.js.map +1 -0
  161. package/dist/frontmatter.d.ts +215 -0
  162. package/dist/frontmatter.d.ts.map +1 -0
  163. package/dist/frontmatter.js +345 -0
  164. package/dist/frontmatter.js.map +1 -0
  165. package/dist/gate-readiness.d.ts +84 -0
  166. package/dist/gate-readiness.d.ts.map +1 -0
  167. package/dist/gate-readiness.js +103 -0
  168. package/dist/gate-readiness.js.map +1 -0
  169. package/dist/gc.d.ts +165 -0
  170. package/dist/gc.d.ts.map +1 -0
  171. package/dist/gc.js +313 -0
  172. package/dist/gc.js.map +1 -0
  173. package/dist/gh-failure.d.ts +42 -0
  174. package/dist/gh-failure.d.ts.map +1 -0
  175. package/dist/gh-failure.js +49 -0
  176. package/dist/gh-failure.js.map +1 -0
  177. package/dist/git.d.ts +75 -0
  178. package/dist/git.d.ts.map +1 -0
  179. package/dist/git.js +130 -0
  180. package/dist/git.js.map +1 -0
  181. package/dist/github.d.ts +187 -0
  182. package/dist/github.d.ts.map +1 -0
  183. package/dist/github.js +343 -0
  184. package/dist/github.js.map +1 -0
  185. package/dist/harness.d.ts +242 -0
  186. package/dist/harness.d.ts.map +1 -0
  187. package/dist/harness.js +157 -0
  188. package/dist/harness.js.map +1 -0
  189. package/dist/identity.d.ts +167 -0
  190. package/dist/identity.d.ts.map +1 -0
  191. package/dist/identity.js +231 -0
  192. package/dist/identity.js.map +1 -0
  193. package/dist/index.d.ts +147 -0
  194. package/dist/index.d.ts.map +1 -0
  195. package/dist/index.js +76 -0
  196. package/dist/index.js.map +1 -0
  197. package/dist/install-ci-branch-protection.d.ts +147 -0
  198. package/dist/install-ci-branch-protection.d.ts.map +1 -0
  199. package/dist/install-ci-branch-protection.js +166 -0
  200. package/dist/install-ci-branch-protection.js.map +1 -0
  201. package/dist/install-ci-capabilities/advance-lifecycle.d.ts +15 -0
  202. package/dist/install-ci-capabilities/advance-lifecycle.d.ts.map +1 -0
  203. package/dist/install-ci-capabilities/advance-lifecycle.js +28 -0
  204. package/dist/install-ci-capabilities/advance-lifecycle.js.map +1 -0
  205. package/dist/install-ci-capabilities/close-job.d.ts +13 -0
  206. package/dist/install-ci-capabilities/close-job.d.ts.map +1 -0
  207. package/dist/install-ci-capabilities/close-job.js +26 -0
  208. package/dist/install-ci-capabilities/close-job.js.map +1 -0
  209. package/dist/install-ci-capabilities/example-noop.d.ts +16 -0
  210. package/dist/install-ci-capabilities/example-noop.d.ts.map +1 -0
  211. package/dist/install-ci-capabilities/example-noop.js +23 -0
  212. package/dist/install-ci-capabilities/example-noop.js.map +1 -0
  213. package/dist/install-ci-capabilities/intake.d.ts +15 -0
  214. package/dist/install-ci-capabilities/intake.d.ts.map +1 -0
  215. package/dist/install-ci-capabilities/intake.js +28 -0
  216. package/dist/install-ci-capabilities/intake.js.map +1 -0
  217. package/dist/install-ci-capabilities/verify.d.ts +14 -0
  218. package/dist/install-ci-capabilities/verify.d.ts.map +1 -0
  219. package/dist/install-ci-capabilities/verify.js +27 -0
  220. package/dist/install-ci-capabilities/verify.js.map +1 -0
  221. package/dist/install-ci-core.d.ts +446 -0
  222. package/dist/install-ci-core.d.ts.map +1 -0
  223. package/dist/install-ci-core.js +760 -0
  224. package/dist/install-ci-core.js.map +1 -0
  225. package/dist/install-ci-github.d.ts +167 -0
  226. package/dist/install-ci-github.d.ts.map +1 -0
  227. package/dist/install-ci-github.js +315 -0
  228. package/dist/install-ci-github.js.map +1 -0
  229. package/dist/install-ci.d.ts +105 -0
  230. package/dist/install-ci.d.ts.map +1 -0
  231. package/dist/install-ci.js +363 -0
  232. package/dist/install-ci.js.map +1 -0
  233. package/dist/intake-event.d.ts +88 -0
  234. package/dist/intake-event.d.ts.map +1 -0
  235. package/dist/intake-event.js +66 -0
  236. package/dist/intake-event.js.map +1 -0
  237. package/dist/intake-marker.d.ts +95 -0
  238. package/dist/intake-marker.d.ts.map +1 -0
  239. package/dist/intake-marker.js +127 -0
  240. package/dist/intake-marker.js.map +1 -0
  241. package/dist/intake-triage.d.ts +48 -0
  242. package/dist/intake-triage.d.ts.map +1 -0
  243. package/dist/intake-triage.js +95 -0
  244. package/dist/intake-triage.js.map +1 -0
  245. package/dist/intake-trigger-template.d.ts +185 -0
  246. package/dist/intake-trigger-template.d.ts.map +1 -0
  247. package/dist/intake-trigger-template.js +449 -0
  248. package/dist/intake-trigger-template.js.map +1 -0
  249. package/dist/intake.d.ts +569 -0
  250. package/dist/intake.d.ts.map +1 -0
  251. package/dist/intake.js +1628 -0
  252. package/dist/intake.js.map +1 -0
  253. package/dist/integration-core.d.ts +539 -0
  254. package/dist/integration-core.d.ts.map +1 -0
  255. package/dist/integration-core.js +2195 -0
  256. package/dist/integration-core.js.map +1 -0
  257. package/dist/integrator.d.ts +343 -0
  258. package/dist/integrator.d.ts.map +1 -0
  259. package/dist/integrator.js +400 -0
  260. package/dist/integrator.js.map +1 -0
  261. package/dist/isolation.d.ts +219 -0
  262. package/dist/isolation.d.ts.map +1 -0
  263. package/dist/isolation.js +261 -0
  264. package/dist/isolation.js.map +1 -0
  265. package/dist/issue-provider.d.ts +349 -0
  266. package/dist/issue-provider.d.ts.map +1 -0
  267. package/dist/issue-provider.js +360 -0
  268. package/dist/issue-provider.js.map +1 -0
  269. package/dist/item-lock.d.ts +626 -0
  270. package/dist/item-lock.d.ts.map +1 -0
  271. package/dist/item-lock.js +1381 -0
  272. package/dist/item-lock.js.map +1 -0
  273. package/dist/item-path.d.ts +49 -0
  274. package/dist/item-path.d.ts.map +1 -0
  275. package/dist/item-path.js +66 -0
  276. package/dist/item-path.js.map +1 -0
  277. package/dist/ledger-lint.d.ts +129 -0
  278. package/dist/ledger-lint.d.ts.map +1 -0
  279. package/dist/ledger-lint.js +249 -0
  280. package/dist/ledger-lint.js.map +1 -0
  281. package/dist/ledger-read.d.ts +357 -0
  282. package/dist/ledger-read.d.ts.map +1 -0
  283. package/dist/ledger-read.js +442 -0
  284. package/dist/ledger-read.js.map +1 -0
  285. package/dist/ledger-write.d.ts +330 -0
  286. package/dist/ledger-write.d.ts.map +1 -0
  287. package/dist/ledger-write.js +411 -0
  288. package/dist/ledger-write.js.map +1 -0
  289. package/dist/lifecycle-gather.d.ts +30 -0
  290. package/dist/lifecycle-gather.d.ts.map +1 -0
  291. package/dist/lifecycle-gather.js +205 -0
  292. package/dist/lifecycle-gather.js.map +1 -0
  293. package/dist/lifecycle-pools.d.ts +180 -0
  294. package/dist/lifecycle-pools.d.ts.map +1 -0
  295. package/dist/lifecycle-pools.js +78 -0
  296. package/dist/lifecycle-pools.js.map +1 -0
  297. package/dist/merge-question-surfacer.d.ts +166 -0
  298. package/dist/merge-question-surfacer.d.ts.map +1 -0
  299. package/dist/merge-question-surfacer.js +297 -0
  300. package/dist/merge-question-surfacer.js.map +1 -0
  301. package/dist/mint-adr.d.ts +126 -0
  302. package/dist/mint-adr.d.ts.map +1 -0
  303. package/dist/mint-adr.js +257 -0
  304. package/dist/mint-adr.js.map +1 -0
  305. package/dist/mirror-pool-scan.d.ts +125 -0
  306. package/dist/mirror-pool-scan.d.ts.map +1 -0
  307. package/dist/mirror-pool-scan.js +104 -0
  308. package/dist/mirror-pool-scan.js.map +1 -0
  309. package/dist/needs-attention.d.ts +341 -0
  310. package/dist/needs-attention.d.ts.map +1 -0
  311. package/dist/needs-attention.js +900 -0
  312. package/dist/needs-attention.js.map +1 -0
  313. package/dist/orphan-sidecar.d.ts +79 -0
  314. package/dist/orphan-sidecar.d.ts.map +1 -0
  315. package/dist/orphan-sidecar.js +71 -0
  316. package/dist/orphan-sidecar.js.map +1 -0
  317. package/dist/output.d.ts +48 -0
  318. package/dist/output.d.ts.map +1 -0
  319. package/dist/output.js +66 -0
  320. package/dist/output.js.map +1 -0
  321. package/dist/pi-harness.d.ts +179 -0
  322. package/dist/pi-harness.d.ts.map +1 -0
  323. package/dist/pi-harness.js +342 -0
  324. package/dist/pi-harness.js.map +1 -0
  325. package/dist/placement.d.ts +99 -0
  326. package/dist/placement.d.ts.map +1 -0
  327. package/dist/placement.js +67 -0
  328. package/dist/placement.js.map +1 -0
  329. package/dist/prd-to-spec.d.ts +315 -0
  330. package/dist/prd-to-spec.d.ts.map +1 -0
  331. package/dist/prd-to-spec.js +684 -0
  332. package/dist/prd-to-spec.js.map +1 -0
  333. package/dist/prepare.d.ts +121 -0
  334. package/dist/prepare.d.ts.map +1 -0
  335. package/dist/prepare.js +140 -0
  336. package/dist/prepare.js.map +1 -0
  337. package/dist/prompt.d.ts +360 -0
  338. package/dist/prompt.d.ts.map +1 -0
  339. package/dist/prompt.js +499 -0
  340. package/dist/prompt.js.map +1 -0
  341. package/dist/protocol/ADR-FORMAT.md +47 -0
  342. package/dist/protocol/CLAIM-PROTOCOL.md +217 -0
  343. package/dist/protocol/REVIEW-PROTOCOL.md +119 -0
  344. package/dist/protocol/SURFACE-PROTOCOL.md +121 -0
  345. package/dist/protocol/TASKING-PROTOCOL.md +122 -0
  346. package/dist/protocol/WORK-CONTRACT.md +276 -0
  347. package/dist/protocol/spec-template.md +71 -0
  348. package/dist/protocol/task-template.md +65 -0
  349. package/dist/readiness.d.ts +66 -0
  350. package/dist/readiness.d.ts.map +1 -0
  351. package/dist/readiness.js +36 -0
  352. package/dist/readiness.js.map +1 -0
  353. package/dist/reap-branches.d.ts +102 -0
  354. package/dist/reap-branches.d.ts.map +1 -0
  355. package/dist/reap-branches.js +149 -0
  356. package/dist/reap-branches.js.map +1 -0
  357. package/dist/recover-isolated.d.ts +72 -0
  358. package/dist/recover-isolated.d.ts.map +1 -0
  359. package/dist/recover-isolated.js +188 -0
  360. package/dist/recover-isolated.js.map +1 -0
  361. package/dist/registry.d.ts +172 -0
  362. package/dist/registry.d.ts.map +1 -0
  363. package/dist/registry.js +296 -0
  364. package/dist/registry.js.map +1 -0
  365. package/dist/repo-config.d.ts +201 -0
  366. package/dist/repo-config.d.ts.map +1 -0
  367. package/dist/repo-config.js +414 -0
  368. package/dist/repo-config.js.map +1 -0
  369. package/dist/repo-key.d.ts +20 -0
  370. package/dist/repo-key.d.ts.map +1 -0
  371. package/dist/repo-key.js +68 -0
  372. package/dist/repo-key.js.map +1 -0
  373. package/dist/repo-mirror.d.ts +177 -0
  374. package/dist/repo-mirror.d.ts.map +1 -0
  375. package/dist/repo-mirror.js +271 -0
  376. package/dist/repo-mirror.js.map +1 -0
  377. package/dist/retry-backoff.d.ts +90 -0
  378. package/dist/retry-backoff.d.ts.map +1 -0
  379. package/dist/retry-backoff.js +98 -0
  380. package/dist/retry-backoff.js.map +1 -0
  381. package/dist/review-gate.d.ts +173 -0
  382. package/dist/review-gate.d.ts.map +1 -0
  383. package/dist/review-gate.js +261 -0
  384. package/dist/review-gate.js.map +1 -0
  385. package/dist/review-verdict.d.ts +149 -0
  386. package/dist/review-verdict.d.ts.map +1 -0
  387. package/dist/review-verdict.js +332 -0
  388. package/dist/review-verdict.js.map +1 -0
  389. package/dist/run.d.ts +221 -0
  390. package/dist/run.d.ts.map +1 -0
  391. package/dist/run.js +963 -0
  392. package/dist/run.js.map +1 -0
  393. package/dist/scan.d.ts +308 -0
  394. package/dist/scan.d.ts.map +1 -0
  395. package/dist/scan.js +374 -0
  396. package/dist/scan.js.map +1 -0
  397. package/dist/select-order.d.ts +75 -0
  398. package/dist/select-order.d.ts.map +1 -0
  399. package/dist/select-order.js +108 -0
  400. package/dist/select-order.js.map +1 -0
  401. package/dist/select-priority.d.ts +188 -0
  402. package/dist/select-priority.d.ts.map +1 -0
  403. package/dist/select-priority.js +80 -0
  404. package/dist/select-priority.js.map +1 -0
  405. package/dist/select.d.ts +25 -0
  406. package/dist/select.d.ts.map +1 -0
  407. package/dist/select.js +43 -0
  408. package/dist/select.js.map +1 -0
  409. package/dist/session-path.d.ts +36 -0
  410. package/dist/session-path.d.ts.map +1 -0
  411. package/dist/session-path.js +129 -0
  412. package/dist/session-path.js.map +1 -0
  413. package/dist/sidecar-apply.d.ts +83 -0
  414. package/dist/sidecar-apply.d.ts.map +1 -0
  415. package/dist/sidecar-apply.js +111 -0
  416. package/dist/sidecar-apply.js.map +1 -0
  417. package/dist/sidecar.d.ts +245 -0
  418. package/dist/sidecar.d.ts.map +1 -0
  419. package/dist/sidecar.js +481 -0
  420. package/dist/sidecar.js.map +1 -0
  421. package/dist/slug-namespace.d.ts +204 -0
  422. package/dist/slug-namespace.d.ts.map +1 -0
  423. package/dist/slug-namespace.js +229 -0
  424. package/dist/slug-namespace.js.map +1 -0
  425. package/dist/spec-complete.d.ts +44 -0
  426. package/dist/spec-complete.d.ts.map +1 -0
  427. package/dist/spec-complete.js +69 -0
  428. package/dist/spec-complete.js.map +1 -0
  429. package/dist/start.d.ts +97 -0
  430. package/dist/start.d.ts.map +1 -0
  431. package/dist/start.js +633 -0
  432. package/dist/start.js.map +1 -0
  433. package/dist/status.d.ts +199 -0
  434. package/dist/status.d.ts.map +1 -0
  435. package/dist/status.js +228 -0
  436. package/dist/status.js.map +1 -0
  437. package/dist/surface-gate.d.ts +162 -0
  438. package/dist/surface-gate.d.ts.map +1 -0
  439. package/dist/surface-gate.js +206 -0
  440. package/dist/surface-gate.js.map +1 -0
  441. package/dist/surface-persist.d.ts +86 -0
  442. package/dist/surface-persist.d.ts.map +1 -0
  443. package/dist/surface-persist.js +129 -0
  444. package/dist/surface-persist.js.map +1 -0
  445. package/dist/tasker-review-loop.d.ts +249 -0
  446. package/dist/tasker-review-loop.d.ts.map +1 -0
  447. package/dist/tasker-review-loop.js +369 -0
  448. package/dist/tasker-review-loop.js.map +1 -0
  449. package/dist/tasking-eligibility.d.ts +74 -0
  450. package/dist/tasking-eligibility.d.ts.map +1 -0
  451. package/dist/tasking-eligibility.js +52 -0
  452. package/dist/tasking-eligibility.js.map +1 -0
  453. package/dist/tasking-lock.d.ts +111 -0
  454. package/dist/tasking-lock.d.ts.map +1 -0
  455. package/dist/tasking-lock.js +256 -0
  456. package/dist/tasking-lock.js.map +1 -0
  457. package/dist/tasking.d.ts +275 -0
  458. package/dist/tasking.d.ts.map +1 -0
  459. package/dist/tasking.js +952 -0
  460. package/dist/tasking.js.map +1 -0
  461. package/dist/triage-gate.d.ts +127 -0
  462. package/dist/triage-gate.d.ts.map +1 -0
  463. package/dist/triage-gate.js +139 -0
  464. package/dist/triage-gate.js.map +1 -0
  465. package/dist/triage-persist.d.ts +163 -0
  466. package/dist/triage-persist.d.ts.map +1 -0
  467. package/dist/triage-persist.js +387 -0
  468. package/dist/triage-persist.js.map +1 -0
  469. package/dist/verdict-json.d.ts +32 -0
  470. package/dist/verdict-json.d.ts.map +1 -0
  471. package/dist/verdict-json.js +74 -0
  472. package/dist/verdict-json.js.map +1 -0
  473. package/dist/verify-workflow-template.d.ts +60 -0
  474. package/dist/verify-workflow-template.d.ts.map +1 -0
  475. package/dist/verify-workflow-template.js +126 -0
  476. package/dist/verify-workflow-template.js.map +1 -0
  477. package/dist/verify.d.ts +60 -0
  478. package/dist/verify.d.ts.map +1 -0
  479. package/dist/verify.js +62 -0
  480. package/dist/verify.js.map +1 -0
  481. package/dist/watch-session.d.ts +112 -0
  482. package/dist/watch-session.d.ts.map +1 -0
  483. package/dist/watch-session.js +347 -0
  484. package/dist/watch-session.js.map +1 -0
  485. package/dist/work-layout.d.ts +198 -0
  486. package/dist/work-layout.d.ts.map +1 -0
  487. package/dist/work-layout.js +217 -0
  488. package/dist/work-layout.js.map +1 -0
  489. package/dist/work-on.d.ts +154 -0
  490. package/dist/work-on.d.ts.map +1 -0
  491. package/dist/work-on.js +387 -0
  492. package/dist/work-on.js.map +1 -0
  493. package/dist/workspace.d.ts +224 -0
  494. package/dist/workspace.d.ts.map +1 -0
  495. package/dist/workspace.js +325 -0
  496. package/dist/workspace.js.map +1 -0
  497. package/package.json +46 -2
  498. package/src/advance-ci-template.ts +203 -0
  499. package/src/advance-classify.ts +197 -0
  500. package/src/advance-drivers.ts +414 -0
  501. package/src/advance-isolated.ts +432 -0
  502. package/src/advance-lifecycle-template.ts +791 -0
  503. package/src/advance-loop-driver.ts +745 -0
  504. package/src/advance-treeless-publish.ts +177 -0
  505. package/src/advance.ts +1564 -0
  506. package/src/advancing-lock.ts +988 -0
  507. package/src/agent-launch.ts +137 -0
  508. package/src/agent-stop.ts +361 -0
  509. package/src/apply-decide.ts +242 -0
  510. package/src/apply-merge-action.ts +502 -0
  511. package/src/apply-persist.ts +518 -0
  512. package/src/arbiter.ts +372 -0
  513. package/src/brand.ts +111 -0
  514. package/src/buildable-body.ts +196 -0
  515. package/src/categorise.ts +158 -0
  516. package/src/claim-cas.ts +513 -0
  517. package/src/cli-spinner.ts +225 -0
  518. package/src/cli.ts +4369 -0
  519. package/src/close-job-template.ts +236 -0
  520. package/src/close-job.ts +319 -0
  521. package/src/complete.ts +1379 -0
  522. package/src/concurrency.ts +151 -0
  523. package/src/config-override.ts +116 -0
  524. package/src/config.ts +883 -0
  525. package/src/continue-branch.ts +542 -0
  526. package/src/cwd-section.ts +392 -0
  527. package/src/decision-engine.ts +272 -0
  528. package/src/detect.ts +124 -0
  529. package/src/do-autopick.ts +223 -0
  530. package/src/do-config.ts +589 -0
  531. package/src/do-remote-auto.ts +197 -0
  532. package/src/do.ts +2623 -0
  533. package/src/drop-source.ts +194 -0
  534. package/src/eligibility.ts +79 -0
  535. package/src/env-config.ts +305 -0
  536. package/src/failure-cause.ts +142 -0
  537. package/src/format.ts +313 -0
  538. package/src/frontmatter.ts +485 -0
  539. package/src/gate-readiness.ts +147 -0
  540. package/src/gc.ts +510 -0
  541. package/src/gh-failure.ts +53 -0
  542. package/src/git.ts +186 -0
  543. package/src/github.ts +468 -0
  544. package/src/harness.ts +355 -0
  545. package/src/identity.ts +322 -0
  546. package/src/index.ts +785 -0
  547. package/src/install-ci-branch-protection.ts +255 -0
  548. package/src/install-ci-capabilities/advance-lifecycle.ts +34 -0
  549. package/src/install-ci-capabilities/close-job.ts +32 -0
  550. package/src/install-ci-capabilities/example-noop.ts +24 -0
  551. package/src/install-ci-capabilities/intake.ts +34 -0
  552. package/src/install-ci-capabilities/verify.ts +33 -0
  553. package/src/install-ci-core.ts +1088 -0
  554. package/src/install-ci-github.ts +376 -0
  555. package/src/install-ci.ts +552 -0
  556. package/src/intake-event.ts +102 -0
  557. package/src/intake-marker.ts +195 -0
  558. package/src/intake-triage.ts +138 -0
  559. package/src/intake-trigger-template.ts +591 -0
  560. package/src/intake.ts +2445 -0
  561. package/src/integration-core.ts +3065 -0
  562. package/src/integrator.ts +771 -0
  563. package/src/isolation.ts +484 -0
  564. package/src/issue-provider.ts +733 -0
  565. package/src/item-lock.ts +1858 -0
  566. package/src/item-path.ts +75 -0
  567. package/src/ledger-lint.ts +332 -0
  568. package/src/ledger-read.ts +924 -0
  569. package/src/ledger-write.ts +865 -0
  570. package/src/lifecycle-gather.ts +298 -0
  571. package/src/lifecycle-pools.ts +250 -0
  572. package/src/merge-question-surfacer.ts +496 -0
  573. package/src/mint-adr.ts +362 -0
  574. package/src/mirror-pool-scan.ts +240 -0
  575. package/src/needs-attention.ts +1506 -0
  576. package/src/orphan-sidecar.ts +150 -0
  577. package/src/output.ts +89 -0
  578. package/src/pi-harness.ts +403 -0
  579. package/src/placement.ts +131 -0
  580. package/src/prd-to-spec.ts +1023 -0
  581. package/src/prepare.ts +230 -0
  582. package/src/prompt.ts +760 -0
  583. package/src/readiness.ts +98 -0
  584. package/src/reap-branches.ts +278 -0
  585. package/src/recover-isolated.ts +276 -0
  586. package/src/registry.ts +475 -0
  587. package/src/repo-config.ts +550 -0
  588. package/src/repo-key.ts +74 -0
  589. package/src/repo-mirror.ts +367 -0
  590. package/src/retry-backoff.ts +130 -0
  591. package/src/review-gate.ts +389 -0
  592. package/src/review-verdict.ts +422 -0
  593. package/src/run.ts +1430 -0
  594. package/src/scan.ts +611 -0
  595. package/src/select-order.ts +143 -0
  596. package/src/select-priority.ts +266 -0
  597. package/src/select.ts +62 -0
  598. package/src/session-path.ts +153 -0
  599. package/src/sidecar-apply.ts +216 -0
  600. package/src/sidecar.ts +700 -0
  601. package/src/slug-namespace.ts +367 -0
  602. package/src/spec-complete.ts +118 -0
  603. package/src/start.ts +974 -0
  604. package/src/status.ts +441 -0
  605. package/src/surface-gate.ts +337 -0
  606. package/src/surface-persist.ts +241 -0
  607. package/src/tasker-review-loop.ts +671 -0
  608. package/src/tasking-eligibility.ts +114 -0
  609. package/src/tasking-lock.ts +416 -0
  610. package/src/tasking.ts +1438 -0
  611. package/src/triage-gate.ts +248 -0
  612. package/src/triage-persist.ts +570 -0
  613. package/src/verdict-json.ts +73 -0
  614. package/src/verify-workflow-template.ts +159 -0
  615. package/src/verify.ts +123 -0
  616. package/src/watch-session.ts +397 -0
  617. package/src/work-layout.ts +262 -0
  618. package/src/work-on.ts +660 -0
  619. package/src/workspace.ts +502 -0
@@ -0,0 +1,389 @@
1
+ import { run } from './git.js';
2
+ /**
3
+ * The **continue-detection** shared by BOTH onboarding paths (the keystone of
4
+ * the `requeue-continue-and-reset` task). `requeue` keeps the `work/<slug>`
5
+ * branch so the NEXT claim CONTINUES from its tip instead of force-cutting a
6
+ * fresh branch off main. This module factors the one question both onboarding
7
+ * paths must ask — **"does the arbiter have a `work/<slug>` ref AHEAD of
8
+ * main?"** — into ONE helper, plus the rebase-onto-fresh-main step the continued
9
+ * branch needs at onboard-time (ADR §10: rebase-or-abort, never auto-resolve →
10
+ * conflict routes to needs-attention; the agent builds on a CURRENT base).
11
+ *
12
+ * The two onboarding paths reference the same two refs differently:
13
+ * - **in-place** (`src/start.ts` `switchToWorkBranch`, used by
14
+ * `do`/`start`/`work-on`): a normal clone. After `git fetch <arbiter>` the
15
+ * branch is the remote-tracking ref `<arbiter>/work/<slug>` and main is
16
+ * `<arbiter>/main`.
17
+ * - **job-worktree** (`src/workspace.ts` `createJob`, used by
18
+ * `do --remote`/`run`): a BARE hub mirror. `ensureMirror` fetches
19
+ * `+refs/heads/*:refs/heads/*`, so the arbiter's `work/<slug>` lands as a
20
+ * LOCAL head `work/<slug>` and main is the local head `main`.
21
+ *
22
+ * Both call {@link branchAheadOf} with the appropriate ref names; the predicate
23
+ * is identical (ref exists AND is not an ancestor of main, i.e. it carries
24
+ * commits beyond main — the prior attempt's work to continue from). When the
25
+ * branch is ABSENT (the common case: a fresh task, or a `requeue --reset` that
26
+ * deleted it) the predicate is false and the caller falls through to the normal
27
+ * fresh-cut-off-main path with NO special logic.
28
+ */
29
+ /** Run git, returning the raw result (no throw) — for soft checks. */
30
+ function gitSoft(args, cwd, env) {
31
+ return run('git', args, cwd, { env });
32
+ }
33
+ /**
34
+ * True iff the git ref `branchRef` exists in `cwd` AND its tip is NOT an
35
+ * ancestor of `mainRef` — i.e. it carries commits beyond main (the prior
36
+ * attempt's work a `requeue` kept, to be continued). False when the ref is
37
+ * absent (nothing to continue → fresh cut) or already merged into main (no work
38
+ * beyond main → nothing to continue). Read-only; never throws.
39
+ *
40
+ * Both onboarding paths feed this ONE predicate with their own ref names:
41
+ * - in-place clone: branchRef=`<arbiter>/work/<slug>`, mainRef=`<arbiter>/main`
42
+ * - bare hub mirror: branchRef=`work/<slug>`, mainRef=`main`
43
+ */
44
+ export function branchAheadOf(cwd, branchRef, mainRef, env) {
45
+ const tip = gitSoft(['rev-parse', '--verify', '--quiet', `${branchRef}^{commit}`], cwd, env).stdout.trim();
46
+ if (tip === '') {
47
+ return false; // the branch is not on the arbiter → fresh cut, no continue
48
+ }
49
+ const mainTip = gitSoft(['rev-parse', '--verify', '--quiet', `${mainRef}^{commit}`], cwd, env).stdout.trim();
50
+ if (mainTip === '') {
51
+ // No main to compare against (shouldn't happen): treat as ahead so the kept
52
+ // branch is continued rather than silently dropped.
53
+ return true;
54
+ }
55
+ // Ahead ⇔ the branch tip is NOT an ancestor of main (it has commits main lacks).
56
+ const isAncestor = gitSoft(['merge-base', '--is-ancestor', tip, mainTip], cwd, env).status ===
57
+ 0;
58
+ return !isAncestor;
59
+ }
60
+ /**
61
+ * Arbiter-authoritative continue-detection: like {@link branchAheadOf}, but
62
+ * first asks the arbiter (`git ls-remote <arbiterRemote> refs/heads/<branch>`)
63
+ * whether the kept branch EXISTS — so a STALE local remote-tracking ref
64
+ * (`refs/remotes/<arbiter>/<branch>` or a bare mirror's `refs/heads/<branch>`)
65
+ * pointing at a branch already DELETED on the arbiter (by `requeue --reset`, by
66
+ * the merge-reap, or cross-machine by `gc --remote-branches`) can no longer
67
+ * fool the onboard into "continue". This is the READ-side backstop that pairs
68
+ * with the WRITE-side write-through ordering at every delete site
69
+ * (local-ref-first, then `git push <arbiter> --delete`): write-through keeps
70
+ * SAME-MACHINE state in sync at the source; this catches the CROSS-MACHINE
71
+ * residue at the read (the other machine cannot touch this machine's local
72
+ * tracking refs). A plain `git remote prune` does NOT cover this — verified a
73
+ * no-op on the bare hub mirror, which has no `remote.origin.fetch` refspec for
74
+ * the orphaned `refs/remotes/origin/*` namespace.
75
+ *
76
+ * The decision rules, in order:
77
+ * - `git ls-remote <arbiterRemote> refs/heads/<branch>` exits 0 with EMPTY
78
+ * stdout (branch absent on the arbiter) ⇒ NOT ahead (fresh cut). This is
79
+ * the bug-fix case: a stale local ref CANNOT override the arbiter's truth.
80
+ * - `ls-remote` exits 0 with a sha ⇒ delegate to {@link branchAheadOf} on
81
+ * the local refs (the existing predicate: ref exists AND not an ancestor
82
+ * of main). The arbiter-present case is the normal continue path.
83
+ * - `ls-remote` exits non-zero (unreachable arbiter / offline) ⇒ fall back
84
+ * to {@link branchAheadOf} on the local refs — the best the read can do
85
+ * when the arbiter cannot answer (same direction as today).
86
+ *
87
+ * `branch` is the unqualified branch name on the arbiter (e.g.
88
+ * `work/task-<slug>`); `branchRef` + `mainRef` are the local refs the
89
+ * arbiter-present delegate uses (in-place clone: `<arbiter>/<branch>` /
90
+ * `<arbiter>/main`; bare hub mirror: `<branch>` / `main`). `arbiterRemote` is
91
+ * the remote NAME to ls-remote (e.g. `origin` for the mirror, `arbiter` for an
92
+ * in-place clone with the conventional remote name).
93
+ */
94
+ export function branchAheadOfArbiter(options) {
95
+ const { cwd, arbiterRemote, branch, branchRef, mainRef, env } = options;
96
+ const ls = gitSoft(['ls-remote', '--heads', arbiterRemote, branch], cwd, env);
97
+ if (ls.status === 0) {
98
+ // Reachable arbiter: its answer is AUTHORITATIVE. Empty ⇒ branch absent
99
+ // ⇒ no continue (a stale local ref cannot resurrect a deleted branch).
100
+ if (ls.stdout.trim() === '') {
101
+ return false;
102
+ }
103
+ // Present on the arbiter ⇒ use the existing local-ref predicate to decide
104
+ // ahead-of-main (which is how "there is work to continue" is defined).
105
+ return branchAheadOf(cwd, branchRef, mainRef, env);
106
+ }
107
+ // Unreachable arbiter / offline — fall back to the local-ref answer (the
108
+ // best the read can do when the arbiter cannot answer; same direction as
109
+ // before this backstop existed).
110
+ return branchAheadOf(cwd, branchRef, mainRef, env);
111
+ }
112
+ /**
113
+ * Rebase the CURRENTLY-CHECKED-OUT continued `work/<slug>` branch onto
114
+ * `mainRef` (the freshly-fetched main), so the agent builds on a CURRENT base
115
+ * (ADR §10: rebase, NOT merge — linear history; the prior attempt's commits were
116
+ * based on an OLD main that moved while the item sat in backlog).
117
+ *
118
+ * This is a PLAIN rebase. After the per-item-lock cut-over (prd
119
+ * `ledger-status-per-item-lock-refs`, tasks 9a–9d) NO transient status lands on
120
+ * a work branch: claim does not move the body (it rests in `backlog/`),
121
+ * needs-attention is the lock `state: stuck` (not a `git mv`), and the
122
+ * tasking/advancing markers are gone. So a branch cut from `main` inherits no
123
+ * runner-authored move-only bookkeeping commit, there is nothing to drop, and
124
+ * the old `drop-bookkeeping-rebase` machinery (which papered over the
125
+ * rename/rename ledger conflict that inheritance caused) is deleted. The ONLY
126
+ * commits replayed are the agent's own wip / `→done` commits.
127
+ *
128
+ * A CLEAN rebase returns `{kind: 'clean'}`; a CONFLICTING rebase (a GENUINE code
129
+ * conflict) is `--abort`ed (NEVER auto-resolved) and returns `{kind: 'conflict'}`
130
+ * so the caller can route the item to needs-attention via the §10 path. Must be
131
+ * called while HEAD is the continued branch.
132
+ *
133
+ * RENAME-DETECTION-OFF (task `disable-rename-detection-on-continue-rebase`): the
134
+ * rebase is invoked with `-c merge.directoryRenames=false` SCOPED to the
135
+ * invocation (never a persistent `git config` write), so a single durable
136
+ * folder-transition `git mv` out of a SPARSE source folder is NOT misread by
137
+ * git's directory-rename heuristic as a whole-DIRECTORY rename — which would
138
+ * spuriously flag every sibling file main added into that same folder as
139
+ * `CONFLICT (file location)` and force a FALSE needs-attention. Content-rename
140
+ * detection (`-Xno-renames` / `merge.renames` / `diff.renames`) is NOT what
141
+ * controls this conflict and was empirically verified ineffective; only
142
+ * `merge.directoryRenames=false` suppresses it. A GENUINE same-path content
143
+ * conflict still conflicts unchanged.
144
+ */
145
+ export function rebaseContinuedBranchOntoMain(cwd, mainRef, env) {
146
+ const rebase = gitSoft(['-c', 'merge.directoryRenames=false', 'rebase', mainRef], cwd, env);
147
+ if (rebase.status === 0) {
148
+ return { kind: 'clean' };
149
+ }
150
+ // NEVER auto-resolve: abort back to a clean continued-branch tip.
151
+ gitSoft(['rebase', '--abort'], cwd, env);
152
+ return { kind: 'conflict' };
153
+ }
154
+ /**
155
+ * The default cap on stale-lease push retries — mirrors the claim / tasking-lock
156
+ * INSTANT-contention loop's `retries: 3` default (`claim-cas.ts` `DEFAULT_RETRIES`).
157
+ * After this many re-fetch + re-rebase + re-push attempts the green work is left
158
+ * RECOVERABLE and the caller surfaces a clear terminal failure.
159
+ */
160
+ export const DEFAULT_STALE_LEASE_RETRIES = 3;
161
+ /**
162
+ * Lexical signal of a `--force-with-lease` STALE-LEASE rejection (git prints
163
+ * `! [rejected] <ref> (stale info)`), as distinct from any OTHER push failure
164
+ * (connectivity, auth, a protected ref). ONLY this case is safe to re-lease +
165
+ * retry on the UNSHARED work branch — every other failure must surface, never
166
+ * silently overwrite. This is the SAME family of contention markers the
167
+ * ledger-write CAS recognises (`ledger-write.ts`), narrowed here to the lease's
168
+ * own `stale info`.
169
+ */
170
+ export function isStaleLeaseRejection(stderr) {
171
+ return /stale info/i.test(stderr);
172
+ }
173
+ /**
174
+ * Push the propose-mode work branch with the SAME stale-lease retry semantics
175
+ * as {@link pushContinuedBranchWithStaleLeaseRetry} (explicit
176
+ * `--force-with-lease=<branch>:<expectedTip>`, `stale info` detection, bounded
177
+ * re-observation + retry, terminal throw on cap exhaustion / non-stale
178
+ * failure), plus the one race the continue path does not have: a `work/<slug>`
179
+ * ref that is GONE on the arbiter because the work already LANDED on `main` is
180
+ * a BENIGN already-landed success, not a failure. The predicate mirrors the
181
+ * leased-delete `already-reaped` + merged-head-reap ancestor guards: gone ref
182
+ * AND `HEAD` is an ancestor of `<arbiter>/main`.
183
+ *
184
+ * WHY a propose-specific helper instead of the continue helper verbatim: the
185
+ * continue helper's stale-lease retry RE-REBASES the kept branch onto the
186
+ * freshly-fetched main (a kept-branch onboard's job — main may have moved
187
+ * while the prior attempt sat in backlog). In the propose path the caller has
188
+ * ALREADY rebased the branch onto `<arbiter>/main` (`integrateWithRebase`, or
189
+ * `integration-core.ts` `recoverAlreadyCommitted`'s recovery rebase), so the
190
+ * only race the lease needs to survive here is the remote work ref MOVING /
191
+ * REAPING under us — re-leasing against the freshly-observed tip is enough,
192
+ * AND a re-rebase mid-integrate would smuggle a NEW rebase past
193
+ * `integrateWithRebase`'s explicit conflict-aborts-to-needs-attention contract.
194
+ * So this helper shares the stale-info detection + bounded retry shape (the
195
+ * `--force-with-lease`-only / never-bare-force / never-`:main` guardrails are
196
+ * identical) but does NOT layer the rebase step.
197
+ *
198
+ * Guardrails (ADR §11): `--force-with-lease` ONLY (re-computed each attempt),
199
+ * NEVER bare `--force`, NEVER `:main`, the WORK branch ONLY. The lease is
200
+ * threaded as `<branch>:<expectedTip>` — using EMPTY (`<branch>:`) when the
201
+ * arbiter has no ref yet (the first-time propose / post-reap shape — the same
202
+ * create-only lease form `item-lock.ts` uses for the lock CAS), so a bare-hub-
203
+ * mirror worktree (no `refs/remotes/<arbiter>/*` upstream) leases correctly.
204
+ *
205
+ * Bounded by `retries` (default {@link DEFAULT_STALE_LEASE_RETRIES}, mirroring
206
+ * the claim / continue retry cap). Must be called while HEAD is the propose
207
+ * `<branch>`.
208
+ */
209
+ export function pushProposeBranchWithStaleLeaseRetry(options) {
210
+ const { cwd, branch, arbiter, env } = options;
211
+ const note = options.note ?? (() => { });
212
+ const retries = options.retries ?? DEFAULT_STALE_LEASE_RETRIES;
213
+ const mainRef = `refs/remotes/${arbiter}/main`;
214
+ const refreshMain = () => {
215
+ gitSoft(['fetch', '--quiet', arbiter, `+refs/heads/main:${mainRef}`], cwd, env);
216
+ };
217
+ /** The arbiter's CURRENT `<branch>` sha (via `ls-remote`), or `''` when absent / unreachable. */
218
+ const observeArbiterTip = () => {
219
+ const ls = gitSoft(['ls-remote', '--heads', arbiter, branch], cwd, env);
220
+ if (ls.status !== 0)
221
+ return '';
222
+ const m = /^([0-9a-f]{40})/m.exec(ls.stdout.trim());
223
+ return m ? m[1] : '';
224
+ };
225
+ /** True iff HEAD is provably reachable from `<arbiter>/main` (the work landed). */
226
+ const headOnArbiterMain = () => {
227
+ const head = gitSoft(['rev-parse', '--verify', '--quiet', 'HEAD'], cwd, env).stdout.trim();
228
+ if (head === '')
229
+ return false;
230
+ return (gitSoft(['merge-base', '--is-ancestor', head, mainRef], cwd, env)
231
+ .status === 0);
232
+ };
233
+ /**
234
+ * The BENIGN already-landed predicate: the remote work ref is GONE on the
235
+ * arbiter AND our HEAD is provably reachable from `<arbiter>/main`. Mirrors
236
+ * `integrator.ts` `deleteMergedHeadBranch`'s ancestor-guarded reap + the
237
+ * `item-lock.ts` leased-delete `already-reaped` precedent: a vanished ref
238
+ * whose work is provably landed is the desired end state. Re-fetches main
239
+ * first so the answer reflects the current arbiter, not a stale local view.
240
+ */
241
+ const benignAlreadyLanded = () => {
242
+ refreshMain();
243
+ return observeArbiterTip() === '' && headOnArbiterMain();
244
+ };
245
+ // Short-circuit BEFORE any push: the dominant recovery race shape (a sibling
246
+ // already merged this work and reaped the head before we even attempted our
247
+ // push). Avoids burning a stale-lease retry budget on a no-op.
248
+ if (benignAlreadyLanded()) {
249
+ note(`${branch}: already landed on ${arbiter}/main + remote head reaped — ` +
250
+ 'clean no-op (no push, no review request).');
251
+ return { kind: 'already-landed' };
252
+ }
253
+ let attempt = 0;
254
+ // eslint-disable-next-line no-constant-condition
255
+ while (true) {
256
+ const observed = observeArbiterTip();
257
+ // Explicit `<branch>:<expected>` — EMPTY when the ref is absent (first-time
258
+ // propose, or a post-reap retry), MATCHING when present. The empty-expected
259
+ // shape is the same create-only `--force-with-lease=<ref>:` form
260
+ // `item-lock.ts` uses for the CAS create.
261
+ const lease = observed === '' ? `${branch}:` : `${branch}:${observed}`;
262
+ const push = gitSoft(['push', arbiter, `${branch}:${branch}`, `--force-with-lease=${lease}`], cwd, env);
263
+ if (push.status === 0) {
264
+ return { kind: 'pushed' };
265
+ }
266
+ // Only `stale info` is re-leasable on this unshared work branch; every
267
+ // other failure (connectivity, protected ref, auth) SURFACES at once.
268
+ if (!isStaleLeaseRejection(push.stderr)) {
269
+ throw new Error(`pushing ${branch} to ${arbiter} failed (not a stale lease): ` +
270
+ (push.stderr.trim() || `exit ${push.status}`));
271
+ }
272
+ // A stale lease: re-check the BENIGN already-landed predicate first (the
273
+ // race tail this task carries), else retry with a freshly-observed lease.
274
+ if (benignAlreadyLanded()) {
275
+ note(`${branch}: stale lease + work already on ${arbiter}/main + remote ` +
276
+ 'head reaped — clean no-op.');
277
+ return { kind: 'already-landed' };
278
+ }
279
+ attempt += 1;
280
+ if (attempt > retries) {
281
+ throw new Error(`pushing ${branch} to ${arbiter} kept failing with a stale ` +
282
+ `--force-with-lease after ${retries} retr${retries === 1 ? 'y' : 'ies'} ` +
283
+ '(the arbiter work ref keeps moving under us, and the work is not ' +
284
+ `provably on main). The green work is still committed on ${branch} — ` +
285
+ 'route to needs-attention and retry when the churn settles.');
286
+ }
287
+ note(`${branch} propose push rejected (stale lease) — re-observe + retry ` +
288
+ `(${attempt}/${retries})...`);
289
+ }
290
+ }
291
+ /**
292
+ * Push the CONTINUED `work/<slug>` branch to the arbiter with
293
+ * `--force-with-lease`, surviving a STALE-LEASE ("stale info") rejection by
294
+ * re-observing the arbiter's tip and replaying our green work onto it — instead
295
+ * of stranding a committed, gate-green build in the job worktree (the observed
296
+ * `advance-verb-resolver` incident).
297
+ *
298
+ * WHY a retry is SAFE here: the `work/<slug>` branch is UNSHARED — the arbiter
299
+ * CAS serialises the claim per slug, so no rival writer legitimately advances it
300
+ * concurrently. The lease's job is to catch a STALE LOCAL view, not a rival; so
301
+ * on a stale-lease rejection the correct response is to re-fetch the actual
302
+ * remote tip, rebase our work onto current main, and push again, re-leased
303
+ * against the JUST-fetched ref. This stays within the existing guardrails:
304
+ * `--force-with-lease` ONLY (re-computed each attempt), NEVER bare `--force`,
305
+ * NEVER targeting `main`, the WORK branch ONLY (ADR §11).
306
+ *
307
+ * The flow, bounded by `retries` (default {@link DEFAULT_STALE_LEASE_RETRIES},
308
+ * mirroring the claim/tasking-lock instant-contention cap):
309
+ * 1. Push `<branch>:<branch> --force-with-lease=<branch>:<expectedRemoteTip>`.
310
+ * 2. On success → `{kind: 'pushed'}`.
311
+ * 3. On a STALE-LEASE rejection → re-fetch `main` + `<branch>` from the arbiter
312
+ * (into a remote-tracking ref, since the branch is CHECKED OUT here), re-run
313
+ * the onboard-time rebase onto the freshly-fetched main, and retry with the
314
+ * lease re-leased against the freshly-fetched remote tip. A rebase CONFLICT
315
+ * on a retry → `{kind: 'conflict'}` (the existing abort → needs-attention
316
+ * path; the retry covers ONLY the clean-rebase stale-lease case).
317
+ * 4. After the cap → THROW a clear terminal error (the green work is still
318
+ * committed on the branch, so the caller's needs-attention route keeps it
319
+ * recoverable).
320
+ * 5. Any NON-stale push failure (connectivity, protected ref) → THROW at once
321
+ * (never re-leased, never silently swallowed).
322
+ *
323
+ * `expectedRemoteTip` is the arbiter `work/<slug>` sha the caller already
324
+ * observed (the pre-rebase mirror head). The explicit `<branch>:<sha>` lease is
325
+ * REQUIRED in the bare-hub-mirror worktree, which has no `refs/remotes/origin/*`
326
+ * upstream for git to imply the lease from. Must be called while HEAD is the
327
+ * continued `<branch>`.
328
+ */
329
+ export function pushContinuedBranchWithStaleLeaseRetry(options) {
330
+ const { cwd, branch, arbiter, mainRef, env } = options;
331
+ const note = options.note ?? (() => { });
332
+ const retries = options.retries ?? DEFAULT_STALE_LEASE_RETRIES;
333
+ // The remote-tracking ref we re-fetch the arbiter `<branch>` into so the lease
334
+ // can be re-computed WITHOUT touching the checked-out local `<branch>` head
335
+ // (git refuses to fetch into a checked-out branch).
336
+ const trackingRef = `refs/remotes/${arbiter}/${branch}`;
337
+ let expectedTip = options.expectedRemoteTip;
338
+ let attempt = 0;
339
+ // eslint-disable-next-line no-constant-condition
340
+ while (true) {
341
+ const push = gitSoft([
342
+ 'push',
343
+ arbiter,
344
+ `${branch}:${branch}`,
345
+ `--force-with-lease=${branch}:${expectedTip}`,
346
+ ], cwd, env);
347
+ if (push.status === 0) {
348
+ return { kind: 'pushed' };
349
+ }
350
+ // Only a STALE-LEASE rejection is re-leasable on this unshared branch; any
351
+ // other failure (connectivity, protected ref) surfaces immediately.
352
+ if (!isStaleLeaseRejection(push.stderr)) {
353
+ throw new Error(`pushing ${branch} to ${arbiter} failed (not a stale lease): ` +
354
+ (push.stderr.trim() || `exit ${push.status}`));
355
+ }
356
+ attempt += 1;
357
+ if (attempt > retries) {
358
+ throw new Error(`pushing ${branch} to ${arbiter} kept failing with a stale ` +
359
+ `--force-with-lease after ${retries} retr${retries === 1 ? 'y' : 'ies'} ` +
360
+ '(the arbiter work ref keeps moving under us). The green work is ' +
361
+ `still committed on ${branch} — route to needs-attention and retry ` +
362
+ 'when the churn settles.');
363
+ }
364
+ note(`${branch} push rejected (stale lease) — re-fetch + re-rebase + retry ` +
365
+ `(${attempt}/${retries})...`);
366
+ // Re-observe the arbiter: refresh local `main` (NOT checked out → fetch into
367
+ // its head) and the arbiter `<branch>` (CHECKED OUT → fetch into a
368
+ // remote-tracking ref so the lease can re-compute against it).
369
+ gitSoft([
370
+ 'fetch',
371
+ arbiter,
372
+ `+refs/heads/main:${mainRef}`,
373
+ `+refs/heads/${branch}:${trackingRef}`,
374
+ ], cwd, env);
375
+ const fresh = gitSoft(['rev-parse', '--verify', '--quiet', trackingRef], cwd, env).stdout.trim();
376
+ if (fresh !== '') {
377
+ expectedTip = fresh;
378
+ }
379
+ // Replay our green work onto the freshly-fetched main (ADR §10: rebase, not
380
+ // merge). A CONFLICT is the EXISTING abort → needs-attention path — the retry
381
+ // handles ONLY the clean-rebase stale-lease case (never auto-resolves).
382
+ const rebase = rebaseContinuedBranchOntoMain(cwd, mainRef, env);
383
+ if (rebase.kind === 'conflict') {
384
+ return { kind: 'conflict' };
385
+ }
386
+ // Loop: retry the push, now re-leased against the freshly-fetched remote tip.
387
+ }
388
+ }
389
+ //# sourceMappingURL=continue-branch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"continue-branch.js","sourceRoot":"","sources":["../src/continue-branch.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,186 @@
1
+ import { type RepoReport } from './scan.js';
2
+ import type { Config } from './config.js';
3
+ import type { ConfigOverrideMap } from './config-override.js';
4
+ /**
5
+ * The CWD-LOCAL section of `scan`/`status` (the `scan-status-read-cwd-repo`
6
+ * task). When a command runs INSIDE a participating repo, it ALSO reports that
7
+ * CURRENT repo as a clearly-labelled, separately-counted LOCAL section, in
8
+ * addition to (NEVER merged into) the cross-repo REGISTRY view.
9
+ *
10
+ * The consistency rule this module enforces (do not violate):
11
+ *
12
+ * - The local section reads the LOCAL WORKING TREE (`scanRepoPaths([cwd])`) —
13
+ * your possibly-uncommitted / unpushed / diverged state — NOT the bare
14
+ * mirror-ref the registry reads. The two reads have DIFFERENT freshness +
15
+ * storage models, so they are kept VISUALLY + SEMANTICALLY distinct, each
16
+ * with its OWN count. A merged grand total would be true in NEITHER model.
17
+ * - **The SELECTION pool is REMOTE-AUTHORITATIVE + FAILS CLOSED offline.** The
18
+ * held-lock set (`refs/dorfl/lock/*`) lives ONLY on the arbiter, and it is the
19
+ * LOAD-BEARING signal that keeps a claimed / in-flight item out of the
20
+ * eligible pool (the body no longer moves on claim). So the cwd pool reads the
21
+ * held set from the arbiter (`heldTaskSlugsStrict`) and SUBTRACTS it before
22
+ * reporting eligibility — exactly as the registry `scan()` does. When the cwd
23
+ * repo has a configured arbiter but that read cannot reach it, eligibility is
24
+ * UNKNOWN and the section THROWS rather than emit a confident-but-wrong pool
25
+ * (the
26
+ * `scan-cwd-selection-pool-read-local-skips-held-lock-subtraction-offline-must-fail`
27
+ * decision: offline selection fails; there is NO `--local` fallback). This is
28
+ * the SELECTION concern; the divergence line is the SURFACE concern and keeps
29
+ * its graceful warn+last-known behaviour.
30
+ * - **Fetch-first ALSO for the cwd** (the maintainer's explicit ask): the cwd
31
+ * repo's arbiter is fetched BEFORE the divergence is computed (the local
32
+ * working tree is the LEAST authoritative view), reusing the
33
+ * `scan-status-fetch-first` fetch+warn+fallback discipline — a failed fetch
34
+ * WARNS and falls back to last-known, NEVER errors out (a read-only command
35
+ * must degrade, ADR §5/§6).
36
+ * - The divergence-vs-arbiter is shown with the `main-divergence-guard` framing
37
+ * (`local main is N commits ahead of <arbiter>/main` = unpushed).
38
+ * - **De-dup:** if the cwd repo is ALSO registered, it is shown ONCE in the
39
+ * local section marked "(also registered)" and its registry row is dropped
40
+ * from the registry list — so the same repo never appears as two mystery
41
+ * rows with possibly-disagreeing states.
42
+ *
43
+ * The registry model is UNCHANGED by this: `scan`/`status` are read-only DISPLAY
44
+ * surfaces; the daemon (`run`) + the arbiter CAS still claim against the REGISTRY
45
+ * only. Showing the cwd changes nothing about where claims happen.
46
+ */
47
+ /** The cwd repo's arbiter, as resolved for the local section's divergence line. */
48
+ export interface CwdArbiter {
49
+ /** The arbiter remote name inspected (e.g. `arbiter` / `origin`). */
50
+ remote: string;
51
+ /** True iff the cwd repo has a remote with that name. */
52
+ configured: boolean;
53
+ /** The arbiter's URL, when configured. */
54
+ url?: string;
55
+ /**
56
+ * True iff the cwd repo's arbiter `main` was FRESHLY FETCHED before the
57
+ * divergence was computed. False ⇒ the fetch failed (offline / no arbiter) and
58
+ * the divergence reflects the last-known arbiter ref (a warning was emitted).
59
+ */
60
+ fetched: boolean;
61
+ /** Commits local `main` is AHEAD of `<arbiter>/main` (unpushed). */
62
+ ahead: number;
63
+ /** Commits local `main` is BEHIND `<arbiter>/main` (needs a pull/rebase). */
64
+ behind: number;
65
+ }
66
+ /** The cwd-local section report (one repo: the current working tree). */
67
+ export interface CwdSection {
68
+ /** Absolute path to the cwd repo. */
69
+ path: string;
70
+ /**
71
+ * True iff the cwd is a participating repo (a `work/` tree with lifecycle
72
+ * content in any pool — see {@link isParticipatingRepo}, NOT `tasks/ready/`
73
+ * alone). When false, every other field is absent — there is NO local section.
74
+ */
75
+ participating: boolean;
76
+ /** The cwd repo's `work/` lifecycle, read from the LOCAL WORKING TREE. */
77
+ repo?: RepoReport;
78
+ /** Total backlog item count for the cwd (its OWN count, never merged). */
79
+ totalItems?: number;
80
+ /** Eligible item count for the cwd (its OWN count). */
81
+ totalEligible?: number;
82
+ /**
83
+ * True iff the cwd repo is ALSO in the registry (its arbiter URL keys to a
84
+ * registered hub mirror). When true the cwd is de-duped: shown once here,
85
+ * marked "(also registered)", and its registry row is dropped.
86
+ */
87
+ alsoRegistered?: boolean;
88
+ /**
89
+ * The registered hub-mirror PATH the cwd de-dups against (so the registry view
90
+ * can drop that row). Present only when {@link alsoRegistered} is true.
91
+ */
92
+ registeredMirrorPath?: string;
93
+ /** The cwd repo's arbiter + divergence (fetch-first). Absent when no arbiter. */
94
+ arbiter?: CwdArbiter;
95
+ }
96
+ /** The verdict of the FETCH-FREE cwd pre-check {@link cwdSectionDisposition}. */
97
+ export interface CwdDisposition {
98
+ /** True iff the cwd is a participating repo (a `work/` tree with lifecycle
99
+ * content in any pool — see {@link isParticipatingRepo}, NOT `tasks/ready/`
100
+ * alone). */
101
+ participating: boolean;
102
+ /**
103
+ * True iff the cwd's arbiter URL keys to a registered hub mirror. When true the
104
+ * registry view ALREADY covers this repo, so a default `scan`/`status` should
105
+ * SKIP resolving the (expensive, fetch-first) cwd section entirely — the registry
106
+ * row represents it, and re-reading the cwd would just re-fetch the SAME arbiter
107
+ * `main` + lock refs the registry loop already fetched (the redundant-fetch the
108
+ * `scan-here-and-skip-redundant-cwd` decision eliminates). Meaningful only when
109
+ * {@link participating}.
110
+ */
111
+ alsoRegistered: boolean;
112
+ }
113
+ /**
114
+ * The FETCH-FREE pre-check that decides whether a DEFAULT `scan`/`status` should
115
+ * pay for the cwd section at all. It does NO network I/O: it reads whether the cwd
116
+ * participates (local `readdirSync`) and resolves the cwd's arbiter URL via the
117
+ * fetch-free {@link arbiterStatus} (a local `git remote get-url`), then asks the
118
+ * fetch-free {@link resolveRegistration} (local {@link listMirrors} key match)
119
+ * whether that URL is already a registered mirror.
120
+ *
121
+ * The CLI gates on this BEFORE calling {@link resolveCwdSection}: a participating
122
+ * cwd that is ALSO registered is skipped (the registry already covers it, and the
123
+ * cwd read would only re-fetch the same arbiter), while a participating cwd with
124
+ * NO mirror is resolved + shown standalone so a mirror-less repo you are standing
125
+ * in is never invisible. `--here` bypasses this gate (it ALWAYS resolves the cwd,
126
+ * and only the cwd).
127
+ */
128
+ export declare function cwdSectionDisposition(input: {
129
+ cwd: string;
130
+ config: Config;
131
+ /** The DIVERGENCE/arbiter remote whose URL keys the registration check. */
132
+ arbiterRemote?: string;
133
+ env?: NodeJS.ProcessEnv;
134
+ }): CwdDisposition;
135
+ /** Inputs to {@link resolveCwdSection}. */
136
+ export interface ResolveCwdSectionOptions {
137
+ /** The current working directory to inspect (the candidate cwd repo). */
138
+ cwd: string;
139
+ /** Resolved global config (for `workspacesDir` + per-repo `autoBuild`). */
140
+ config: Config;
141
+ /**
142
+ * The per-machine {@link ConfigOverrideMap}. Threaded into the local
143
+ * working-tree scan so the cwd section's eligibility reflects the per-machine
144
+ * override (consistent with the autopick / advance paths). Default: none.
145
+ */
146
+ override?: ConfigOverrideMap;
147
+ /**
148
+ * The arbiter remote name to fetch + diff against (the SURFACE/divergence
149
+ * remote). Defaults to the same remote `status`'s arbiter section resolves
150
+ * (`arbiter`); the CLI passes the configured value.
151
+ */
152
+ arbiterRemote?: string;
153
+ /**
154
+ * The COORDINATION arbiter remote where the per-item lock refs
155
+ * (`refs/dorfl/lock/*`) live — the remote the held-lock SUBTRACTION reads. This
156
+ * is the SAME remote `claim`/`do`/`complete` push locks to, which defaults to
157
+ * `origin` (NOT the `arbiter`-named DIVERGENCE remote above — a repo can use
158
+ * `origin` as its arbiter and have no `arbiter` remote at all, exactly this
159
+ * repo's shape). Decoupled so the held-lock read targets the real coordination
160
+ * arbiter even when the divergence remote is absent. Default `origin`.
161
+ */
162
+ lockArbiterRemote?: string;
163
+ /** Sink for the fetch-first fall-back warning (warn + last-known, never error). */
164
+ warn?: (message: string) => void;
165
+ env?: NodeJS.ProcessEnv;
166
+ }
167
+ /**
168
+ * Resolve the cwd-local section for `scan`/`status`. Returns
169
+ * `{participating: false}` when the cwd is NOT a participating repo (the callers
170
+ * then render only the registry view, unchanged). When participating it:
171
+ *
172
+ * 1. FETCHES the cwd repo's arbiter first (warn + fall back to last-known on
173
+ * failure — never errors), then computes the divergence vs `<arbiter>/main`;
174
+ * 2. reads the COORDINATION arbiter's HELD-LOCK set (the remote where
175
+ * `refs/dorfl/lock/*` live, default `origin`; fail-closed: throws when that
176
+ * remote exists but is unreachable) to SUBTRACT in-flight items from the pool;
177
+ * 3. reads the cwd's `work/` lifecycle from the LOCAL WORKING TREE
178
+ * (`scanRepoPaths([cwd])`) with that held set subtracted;
179
+ * 4. de-dups against the registry (is the cwd's arbiter URL a registered
180
+ * mirror?).
181
+ *
182
+ * It MUTATES nothing but the arbiter fetch (a read refresh, same as the registry
183
+ * fetch-first); it never claims/moves/integrates.
184
+ */
185
+ export declare function resolveCwdSection(options: ResolveCwdSectionOptions): Promise<CwdSection>;
186
+ //# sourceMappingURL=cwd-section.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cwd-section.d.ts","sourceRoot":"","sources":["../src/cwd-section.ts"],"names":[],"mappings":"AAEA,OAAO,EAAgB,KAAK,UAAU,EAAC,MAAM,WAAW,CAAC;AAKzD,OAAO,KAAK,EAAC,MAAM,EAAC,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAC,iBAAiB,EAAC,MAAM,sBAAsB,CAAC;AAE5D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA0CG;AAEH,mFAAmF;AACnF,MAAM,WAAW,UAAU;IAC1B,qEAAqE;IACrE,MAAM,EAAE,MAAM,CAAC;IACf,yDAAyD;IACzD,UAAU,EAAE,OAAO,CAAC;IACpB,0CAA0C;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,OAAO,EAAE,OAAO,CAAC;IACjB,oEAAoE;IACpE,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;CACf;AAED,yEAAyE;AACzE,MAAM,WAAW,UAAU;IAC1B,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb;;;;OAIG;IACH,aAAa,EAAE,OAAO,CAAC;IACvB,0EAA0E;IAC1E,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,0EAA0E;IAC1E,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,uDAAuD;IACvD,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB;;;OAGG;IACH,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,iFAAiF;IACjF,OAAO,CAAC,EAAE,UAAU,CAAC;CACrB;AAcD,iFAAiF;AACjF,MAAM,WAAW,cAAc;IAC9B;;iBAEa;IACb,aAAa,EAAE,OAAO,CAAC;IACvB;;;;;;;;OAQG;IACH,cAAc,EAAE,OAAO,CAAC;CACxB;AAED;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE;IAC5C,GAAG,EAAE,MAAM,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,2EAA2E;IAC3E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB,GAAG,cAAc,CAgBjB;AAED,2CAA2C;AAC3C,MAAM,WAAW,wBAAwB;IACxC,yEAAyE;IACzE,GAAG,EAAE,MAAM,CAAC;IACZ,2EAA2E;IAC3E,MAAM,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,QAAQ,CAAC,EAAE,iBAAiB,CAAC;IAC7B;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;;;OAQG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,mFAAmF;IACnF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAsB,iBAAiB,CACtC,OAAO,EAAE,wBAAwB,GAC/B,OAAO,CAAC,UAAU,CAAC,CAwFrB"}