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,199 @@
1
+ import { type Harness } from './harness.js';
2
+ import './pi-harness.js';
3
+ import { type JobState } from './workspace.js';
4
+ import { type ArbiterStatusReport } from './arbiter.js';
5
+ import { type LockEntry } from './item-lock.js';
6
+ import type { CwdSection } from './cwd-section.js';
7
+ import { type DuplicateSlug } from './ledger-lint.js';
8
+ /**
9
+ * `dorfl status` — the **operational dashboard of jobs** (ADR §4/§5/§12
10
+ * in `docs/adr/execution-substrate-decisions.md`). Split out of
11
+ * `agent-workspaces` so the substrate stays thin; this module owns the view.
12
+ *
13
+ * It lists the jobs under `<workspacesDir>/work/*` from their
14
+ * `.dorfl-job.json` records + worktree state, grouped by state:
15
+ *
16
+ * - **active** — `running` AND the harness reports the job still alive.
17
+ * - **failed / retained** — everything that wants a human's eye: a job the
18
+ * `needs-attention` mechanism flagged (with its reason, ADR §12), a `done`
19
+ * job whose worktree was never reaped (awaiting cleanup), or a `running`
20
+ * job whose harness reports it DEAD (crashed — the runner died mid-flight).
21
+ *
22
+ * **Liveness comes from the harness seam (PID / session), NOT filesystem mtime**
23
+ * (ADR §5): a live agent can think for minutes without writing files, so mtime
24
+ * would mistake a thinking agent for a dead one. The harness answers liveness
25
+ * from the real signal.
26
+ *
27
+ * **Fetch-first (ADR §5/§6):** the per-mirror lock-ref + one-slug-one-folder
28
+ * lint surfaces are read AFTER refreshing each registered hub mirror's `main` —
29
+ * the old "scan is always offline" framing is RETIRED (it was the roots-local
30
+ * model). A failed mirror fetch is NOT fatal: it WARNS and falls back to that
31
+ * mirror's last-known `main`. The ledger read STRATEGY is unchanged
32
+ * (`claim-ledger-vs-protected-main.md`); `status` only ensures the ref is fresh.
33
+ *
34
+ * It is strictly **read-only**: it inspects records/worktrees; it never claims,
35
+ * runs, moves, or deletes (deletion is `gc`). It reuses the `gc` `discoverJobs`
36
+ * primitive to enumerate jobs (it does NOT re-implement the work-area layout).
37
+ *
38
+ * Distinct from `scan`: `scan` answers "what work is in the *backlog* and who
39
+ * can take it"; `status` answers "what is *running / stuck / awaiting cleanup*
40
+ * right now". The retained-worktree + stuck-lock items are the "look here" set.
41
+ */
42
+ /** One job as the operational dashboard sees it (a record + its liveness). */
43
+ export interface JobStatus {
44
+ /** The work slug being processed. */
45
+ slug: string;
46
+ /** The encoded repo key the job's hub mirror was cut from. */
47
+ repo: string;
48
+ /** The work branch checked out in the worktree (`work/<slug>`). */
49
+ branch: string;
50
+ /** ISO timestamp the job worktree was created. */
51
+ startedAt: string;
52
+ /** The persisted lifecycle state. */
53
+ state: JobState;
54
+ /** Liveness FROM THE HARNESS SEAM (PID/session), never mtime (ADR §5). */
55
+ alive: boolean;
56
+ /**
57
+ * Why the job is stuck (ADR §12), when known — surfaced for the
58
+ * failed/retained group. Present for `needs-attention` jobs that recorded a
59
+ * reason; absent otherwise.
60
+ */
61
+ reason?: string;
62
+ /**
63
+ * The review-request URL (e.g. a GitHub PR) opened for this job, when a
64
+ * `propose`-mode provider opened one (ADR §6). Surfaced so the human can jump
65
+ * straight to the PR. Absent otherwise.
66
+ */
67
+ prUrl?: string;
68
+ /** Absolute path to the job worktree (for the human to look). */
69
+ dir: string;
70
+ }
71
+ /**
72
+ * One repo's PER-ITEM LOCK refs, surfaced for the dashboard (prd
73
+ * `ledger-status-per-item-lock-refs` US #8; task
74
+ * `needs-attention-as-stuck-lock-state`). The in-flight view read from the lock
75
+ * refs — held (`active` = in-progress) and stuck (`needs-attention`) entries +
76
+ * their reasons — is the SOLE stuck-state surface (the
77
+ * `work/needs-attention/` folder is retired, task
78
+ * `cutover-needs-attention-becomes-lock-stuck-recovery-surface`).
79
+ */
80
+ export interface RepoLockEntries {
81
+ /** The repo path whose lock refs were read (a hub-mirror path). */
82
+ repoPath: string;
83
+ /** The held lock entries (action × state + reason), sorted by entry. */
84
+ entries: LockEntry[];
85
+ }
86
+ /** One repo's one-slug-one-folder LINT result, surfaced for the dashboard. */
87
+ export interface RepoLedgerDuplicates {
88
+ /** The repo path whose `work/` ledger was linted (a hub-mirror path). */
89
+ repoPath: string;
90
+ /** The slugs present in more than one status folder (non-empty here). */
91
+ duplicates: DuplicateSlug[];
92
+ }
93
+ /** The operational groups `status` reports. */
94
+ export interface StatusReport {
95
+ /** Running jobs the harness reports still alive. */
96
+ active: JobStatus[];
97
+ /** Stuck (needs-attention), crashed (running-but-dead), or un-reaped (done) jobs. */
98
+ attention: JobStatus[];
99
+ /**
100
+ * The PER-ITEM LOCK in-flight view (prd `ledger-status-per-item-lock-refs` US
101
+ * #8; task `needs-attention-as-stuck-lock-state`): per registered hub mirror,
102
+ * the held lock entries read from the mirror's `refs/dorfl/lock/*` refs —
103
+ * `active` holds (in-progress) and `stuck` holds (needs-attention) + reasons.
104
+ * This is the SOLE stuck-state surface (the `work/needs-attention/` folder is
105
+ * retired, task
106
+ * `cutover-needs-attention-becomes-lock-stuck-recovery-surface`). Only repos
107
+ * WITH at least one held lock appear. Empty when no `mirrorPaths` were given or
108
+ * no locks are held. Optional so older literals stay valid; `status()` always
109
+ * populates it (possibly empty).
110
+ */
111
+ lockHeld?: RepoLockEntries[];
112
+ /**
113
+ * The one-slug-one-folder LINT (prd `ledger-integrity` story 3): per registered
114
+ * hub mirror, any slug present in MORE THAN ONE `work/` status folder (a corrupt
115
+ * ledger). Read from the mirror's bare `main` ref (the SAME `ls-tree` source the
116
+ * needs-attention surface uses). Only repos WITH a duplicate appear. `status`
117
+ * WARNS loudly about each (never a silent pass); a human resolves it. Empty when
118
+ * no `mirrorPaths` were given or every ledger is clean.
119
+ */
120
+ ledgerDuplicates?: RepoLedgerDuplicates[];
121
+ /**
122
+ * The current repo's arbiter state (folded in from the old `arbiter status`,
123
+ * ADR §1/§7): which remote, URL/path, exists/bare, main reachable, and the
124
+ * unsafe non-bare-with-main flag. Present only when the CLI resolved one (it is
125
+ * a current-checkout concern); absent for the pure job-area dashboard.
126
+ */
127
+ arbiter?: ArbiterStatusReport;
128
+ /**
129
+ * The CWD-LOCAL section (the `scan-status-read-cwd-repo` task): when `status`
130
+ * runs INSIDE a participating repo, this is that CURRENT repo read from its
131
+ * LOCAL WORKING TREE (fetch-its-arbiter-first), reported as a DISTINCT,
132
+ * separately-counted block alongside (never merged into) the registry view.
133
+ * Absent when the cwd does not participate or the caller did not resolve it.
134
+ */
135
+ cwd?: CwdSection;
136
+ }
137
+ export interface StatusOptions {
138
+ /** The execution working area to inspect (config `workspacesDir`). */
139
+ workspacesDir: string;
140
+ /**
141
+ * The harness used to answer liveness (PID/session — never mtime). When given,
142
+ * it answers liveness for EVERY job (tests inject a stub here). When omitted,
143
+ * each job's liveness is answered by the adapter that OWNS its record
144
+ * (`resolveHarness` keyed off the record's `adapter`) — so a `pi` job reports
145
+ * via the pi adapter (PID + session pointer) and a `null` job via the null
146
+ * adapter, never mtime.
147
+ */
148
+ harness?: Harness;
149
+ /**
150
+ * Hub-mirror PATHS whose lock refs + one-slug-one-folder lint to surface, read
151
+ * from each mirror's BARE `main` ref (mirrors have no working tree). The CLI
152
+ * wires these from the registry's {@link listMirrors}. `status` FETCHES each
153
+ * mirror's `main` first (ADR §5/§6 — the registry's remote is the source of
154
+ * truth); a failed fetch WARNS and falls back to last-known (never errors).
155
+ * Omitted ⇒ only the job worktrees are reported.
156
+ */
157
+ mirrorPaths?: string[];
158
+ /**
159
+ * Sink for the fetch-first fall-back warning (ADR §5/§6): when a mirror's `main`
160
+ * cannot be fetched, `status` warns through this and reads that mirror's
161
+ * last-known state. The CLI wires it to the standard `>>` stderr note.
162
+ */
163
+ warn?: (message: string) => void;
164
+ /**
165
+ * The current repo's arbiter state to fold into the dashboard (the old `arbiter
166
+ * status`, ADR §1). The CLI resolves it via `arbiterStatus` for the current
167
+ * checkout; omitted ⇒ no arbiter section.
168
+ */
169
+ arbiter?: ArbiterStatusReport;
170
+ /**
171
+ * The pre-resolved CWD-LOCAL section (the `scan-status-read-cwd-repo` task).
172
+ * The CLI resolves it via `resolveCwdSection` (cwd participation + fetch-first
173
+ * divergence + registry de-dup) and hands it here; `status` carries it onto the
174
+ * report and `formatStatus` renders it as a distinct local block. Omitted ⇒ no
175
+ * local section.
176
+ */
177
+ cwd?: CwdSection;
178
+ env?: NodeJS.ProcessEnv;
179
+ }
180
+ /**
181
+ * Build the operational status of every job under `<workspacesDir>/work/*`
182
+ * (ADR §4/§5/§12). READ-ONLY: enumerates job records via the `gc` `discoverJobs`
183
+ * primitive, asks the harness for liveness (NOT mtime), and groups each job as
184
+ * **active** (running + alive) or **failed/retained** (needs-attention, a
185
+ * crashed running-but-dead job, or a done-but-un-reaped one). Mutates nothing —
186
+ * no claim/run/move/delete.
187
+ */
188
+ export declare function status(options: StatusOptions): Promise<StatusReport>;
189
+ /**
190
+ * Render the operational status for the terminal: an **Active jobs** section and
191
+ * a **Failed / retained jobs** section, each line carrying slug, repo, branch,
192
+ * and started-at — plus, for stuck jobs, the recorded reason, and for a
193
+ * running-but-dead job a `(crashed — no longer alive)` marker.
194
+ *
195
+ * Deliberately framed in terms of **jobs** (running / stuck / awaiting cleanup),
196
+ * NOT the backlog *queue* — that is what keeps it visibly distinct from `scan`.
197
+ */
198
+ export declare function formatStatus(report: StatusReport): string;
199
+ //# sourceMappingURL=status.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,OAAO,EAAC,MAAM,cAAc,CAAC;AAG1D,OAAO,iBAAiB,CAAC;AACzB,OAAO,EAAC,KAAK,QAAQ,EAAC,MAAM,gBAAgB,CAAC;AAE7C,OAAO,EAAsB,KAAK,mBAAmB,EAAC,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAsB,KAAK,SAAS,EAAC,MAAM,gBAAgB,CAAC;AAEnE,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAGN,KAAK,aAAa,EAClB,MAAM,kBAAkB,CAAC;AAE1B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,8EAA8E;AAC9E,MAAM,WAAW,SAAS;IACzB,qCAAqC;IACrC,IAAI,EAAE,MAAM,CAAC;IACb,8DAA8D;IAC9D,IAAI,EAAE,MAAM,CAAC;IACb,mEAAmE;IACnE,MAAM,EAAE,MAAM,CAAC;IACf,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,KAAK,EAAE,QAAQ,CAAC;IAChB,0EAA0E;IAC1E,KAAK,EAAE,OAAO,CAAC;IACf;;;;OAIG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;;;OAIG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,iEAAiE;IACjE,GAAG,EAAE,MAAM,CAAC;CACZ;AAED;;;;;;;;GAQG;AACH,MAAM,WAAW,eAAe;IAC/B,mEAAmE;IACnE,QAAQ,EAAE,MAAM,CAAC;IACjB,wEAAwE;IACxE,OAAO,EAAE,SAAS,EAAE,CAAC;CACrB;AAED,8EAA8E;AAC9E,MAAM,WAAW,oBAAoB;IACpC,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;IACjB,yEAAyE;IACzE,UAAU,EAAE,aAAa,EAAE,CAAC;CAC5B;AAED,+CAA+C;AAC/C,MAAM,WAAW,YAAY;IAC5B,oDAAoD;IACpD,MAAM,EAAE,SAAS,EAAE,CAAC;IACpB,qFAAqF;IACrF,SAAS,EAAE,SAAS,EAAE,CAAC;IACvB;;;;;;;;;;;OAWG;IACH,QAAQ,CAAC,EAAE,eAAe,EAAE,CAAC;IAC7B;;;;;;;OAOG;IACH,gBAAgB,CAAC,EAAE,oBAAoB,EAAE,CAAC;IAC1C;;;;;OAKG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,UAAU,CAAC;CACjB;AAED,MAAM,WAAW,aAAa;IAC7B,sEAAsE;IACtE,aAAa,EAAE,MAAM,CAAC;IACtB;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;;OAOG;IACH,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;IACvB;;;;OAIG;IACH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACjC;;;;OAIG;IACH,OAAO,CAAC,EAAE,mBAAmB,CAAC;IAC9B;;;;;;OAMG;IACH,GAAG,CAAC,EAAE,UAAU,CAAC;IACjB,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;CACxB;AAED;;;;;;;GAOG;AACH,wBAAsB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,CAkE1E;AAiCD;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,YAAY,GAAG,MAAM,CAgGzD"}
package/dist/status.js ADDED
@@ -0,0 +1,228 @@
1
+ import { discoverJobs } from './gc.js';
2
+ import { resolveHarness } from './harness.js';
3
+ // Import for the registration side-effect: ensures the `pi` adapter is in the
4
+ // harness registry so `resolveHarness` dispatches pi jobs' liveness to it.
5
+ import './pi-harness.js';
6
+ import { fetchMirrorMainOrWarn } from './repo-mirror.js';
7
+ import { formatArbiterStatus } from './arbiter.js';
8
+ import { listItemLockEntries } from './item-lock.js';
9
+ import { formatCwdSection, formatLockEntryLines } from './format.js';
10
+ import { lintRefLedger, formatDuplicateWarnings, } from './ledger-lint.js';
11
+ /**
12
+ * Build the operational status of every job under `<workspacesDir>/work/*`
13
+ * (ADR §4/§5/§12). READ-ONLY: enumerates job records via the `gc` `discoverJobs`
14
+ * primitive, asks the harness for liveness (NOT mtime), and groups each job as
15
+ * **active** (running + alive) or **failed/retained** (needs-attention, a
16
+ * crashed running-but-dead job, or a done-but-un-reaped one). Mutates nothing —
17
+ * no claim/run/move/delete.
18
+ */
19
+ export async function status(options) {
20
+ const active = [];
21
+ const attention = [];
22
+ for (const job of discoverJobs(options.workspacesDir)) {
23
+ const view = toJobStatus(job, options.harness);
24
+ // Active iff the runner believes the job is in flight (`running`) AND the
25
+ // harness confirms it is still alive. Everything else is "look here":
26
+ // - needs-attention: the runner flagged it (gate red, conflict, …)
27
+ // - done: landed but the worktree wasn't reaped (awaiting cleanup)
28
+ // - running but NOT alive: the process died mid-flight (crashed)
29
+ if (view.state === 'running' && view.alive) {
30
+ active.push(view);
31
+ }
32
+ else {
33
+ attention.push(view);
34
+ }
35
+ }
36
+ active.sort(bySlug);
37
+ attention.sort(bySlug);
38
+ // The STUCK-STATE surface is now the PER-ITEM LOCK `state: stuck` (task
39
+ // `cutover-needs-attention-becomes-lock-stuck-recovery-surface`, decision i+:
40
+ // the `needs-attention/` folder is retired — NO code reads
41
+ // `work/needs-attention/`). `status` reads the lock refs per mirror to surface
42
+ // held (`active` = in-progress) AND stuck (`needs-attention`) entries + their
43
+ // reasons/questions.
44
+ const lockHeld = [];
45
+ const ledgerDuplicates = [];
46
+ for (const mirrorPath of options.mirrorPaths ?? []) {
47
+ // Fetch-first (ADR §5/§6): refresh this mirror's `main` so the duplicate lint
48
+ // reflects the remote truth. Never fatal — a failed fetch WARNS and falls back
49
+ // to the mirror's last-known `main`.
50
+ fetchMirrorMainOrWarn({ mirrorPath, warn: options.warn, env: options.env });
51
+ // The PER-ITEM LOCK in-flight view (prd US #8): read the mirror's lock refs to
52
+ // surface held (`active` = in-progress) and stuck (`needs-attention`) entries +
53
+ // reasons/questions. A bare hub mirror's arbiter is its `origin` (the SAME
54
+ // handle the `scan` held-slug subtraction reads). Best-effort: a fetch/read
55
+ // fault yields an EMPTY list (see {@link listItemLockEntries}), so this
56
+ // read-only view degrades to "no in-flight locks" rather than erroring.
57
+ const entries = await listItemLockEntries(mirrorPath, 'origin', options.env);
58
+ if (entries.length > 0) {
59
+ lockHeld.push({ repoPath: mirrorPath, entries });
60
+ }
61
+ // The one-slug-one-folder LINT (prd story 3): derive any slug residing in >1
62
+ // status folder from the SAME freshly-fetched `main` ref, surfaced LOUDLY.
63
+ const dups = lintRefLedger('main', mirrorPath, options.env);
64
+ if (dups.length > 0) {
65
+ ledgerDuplicates.push({ repoPath: mirrorPath, duplicates: dups });
66
+ }
67
+ }
68
+ lockHeld.sort((a, b) => a.repoPath.localeCompare(b.repoPath));
69
+ ledgerDuplicates.sort((a, b) => a.repoPath.localeCompare(b.repoPath));
70
+ return {
71
+ active,
72
+ attention,
73
+ lockHeld,
74
+ ledgerDuplicates,
75
+ ...(options.arbiter ? { arbiter: options.arbiter } : {}),
76
+ ...(options.cwd ? { cwd: options.cwd } : {}),
77
+ };
78
+ }
79
+ function bySlug(a, b) {
80
+ return a.slug.localeCompare(b.slug);
81
+ }
82
+ /**
83
+ * Project a discovered job + its harness liveness into a `JobStatus`. When no
84
+ * harness is forced (the normal case), each record's liveness is answered by the
85
+ * adapter that OWNS it (`resolveHarness`) — a pi job via the pi adapter (PID +
86
+ * session), never mtime.
87
+ */
88
+ function toJobStatus(job, forced) {
89
+ const record = job.record;
90
+ const harness = forced ?? (record ? resolveHarness(record.harness) : undefined);
91
+ const alive = record !== undefined && harness !== undefined
92
+ ? harness.isAlive(record.harness)
93
+ : false;
94
+ return {
95
+ slug: job.slug,
96
+ repo: record?.repoKey ?? '(unknown)',
97
+ branch: job.branch,
98
+ startedAt: record?.startedAt ?? '(unknown)',
99
+ state: record?.state ?? 'running',
100
+ alive,
101
+ reason: record?.reason,
102
+ prUrl: record?.prUrl,
103
+ dir: job.dir,
104
+ };
105
+ }
106
+ /**
107
+ * Render the operational status for the terminal: an **Active jobs** section and
108
+ * a **Failed / retained jobs** section, each line carrying slug, repo, branch,
109
+ * and started-at — plus, for stuck jobs, the recorded reason, and for a
110
+ * running-but-dead job a `(crashed — no longer alive)` marker.
111
+ *
112
+ * Deliberately framed in terms of **jobs** (running / stuck / awaiting cleanup),
113
+ * NOT the backlog *queue* — that is what keeps it visibly distinct from `scan`.
114
+ */
115
+ export function formatStatus(report) {
116
+ const lines = [];
117
+ // The cwd-local section (the `scan-status-read-cwd-repo` task): a DISTINCT,
118
+ // separately-counted block for the CURRENT repo's working tree, ABOVE the
119
+ // job/registry dashboard (never merged into the job counts).
120
+ const cwdLines = report.cwd !== undefined ? formatCwdSection(report.cwd) : [];
121
+ const lockHeld = report.lockHeld ?? [];
122
+ const lockCount = lockHeld.reduce((sum, r) => sum + r.entries.length, 0);
123
+ const ledgerDuplicates = report.ledgerDuplicates ?? [];
124
+ const dupCount = ledgerDuplicates.reduce((sum, r) => sum + r.duplicates.length, 0);
125
+ if (report.active.length === 0 &&
126
+ report.attention.length === 0 &&
127
+ lockCount === 0 &&
128
+ dupCount === 0 &&
129
+ report.arbiter === undefined &&
130
+ cwdLines.length === 0) {
131
+ return 'No jobs running or retained (the work area is empty).';
132
+ }
133
+ if (cwdLines.length > 0) {
134
+ lines.push(...cwdLines);
135
+ lines.push('');
136
+ }
137
+ lines.push('Active jobs (running):');
138
+ if (report.active.length === 0) {
139
+ lines.push(' (none)');
140
+ }
141
+ else {
142
+ for (const job of report.active) {
143
+ lines.push(formatJobLine(job));
144
+ }
145
+ }
146
+ lines.push('');
147
+ lines.push('Failed / retained jobs (look here):');
148
+ if (report.attention.length === 0) {
149
+ lines.push(' (none)');
150
+ }
151
+ else {
152
+ for (const job of report.attention) {
153
+ lines.push(formatJobLine(job));
154
+ }
155
+ }
156
+ // The PER-ITEM LOCK in-flight view (prd US #8; task
157
+ // `cutover-needs-attention-becomes-lock-stuck-recovery-surface`): the held lock
158
+ // refs read from each mirror — `active` holds (in-progress) and `stuck` holds
159
+ // (needs-attention) + their reasons/questions. This is the SOLE stuck-state
160
+ // surface now (the `needs-attention/` folder is retired).
161
+ if (lockCount > 0) {
162
+ lines.push('');
163
+ lines.push('In-flight locks (refs/dorfl/lock/* — held + stuck):');
164
+ for (const repo of lockHeld) {
165
+ lines.push(` ${repo.repoPath}`);
166
+ for (const entry of repo.entries) {
167
+ // SHARED renderer (NOT a forked one) so the cwd section
168
+ // (`formatCwdSection`) presents a held/stuck item identically.
169
+ lines.push(...formatLockEntryLines(entry, ' '));
170
+ }
171
+ }
172
+ }
173
+ // The one-slug-one-folder LINT (prd `ledger-integrity` story 3): WARN LOUDLY
174
+ // about every slug residing in >1 status folder of a registered mirror's ledger
175
+ // (a corrupt ledger — never a silent pass). A human must resolve each.
176
+ if (dupCount > 0) {
177
+ lines.push('');
178
+ for (const repo of ledgerDuplicates) {
179
+ lines.push(` ${repo.repoPath}`);
180
+ for (const w of formatDuplicateWarnings(repo.duplicates)) {
181
+ lines.push(` ${w}`);
182
+ }
183
+ }
184
+ }
185
+ lines.push('');
186
+ lines.push(`Summary: ${report.active.length} active, ${report.attention.length} failed/retained job(s)` +
187
+ (lockCount > 0 ? `, ${lockCount} in-flight lock(s)` : '') +
188
+ (dupCount > 0 ? `, ${dupCount} one-slug-one-folder violation(s)` : '') +
189
+ '.');
190
+ // The folded-in arbiter state (ADR §1/§7, the old `arbiter status`).
191
+ if (report.arbiter !== undefined) {
192
+ lines.push('');
193
+ lines.push(formatArbiterStatus(report.arbiter));
194
+ }
195
+ return lines.join('\n');
196
+ }
197
+ /** One `slug repo branch started-at [marker]` job line, with reason below. */
198
+ function formatJobLine(job) {
199
+ const marker = jobMarker(job);
200
+ const head = ` ${job.slug} ${job.repo} ${job.branch} started ${job.startedAt}${marker}`;
201
+ const extra = [];
202
+ if (job.reason !== undefined && job.reason !== '') {
203
+ extra.push(` reason: ${job.reason}`);
204
+ }
205
+ if (job.prUrl !== undefined && job.prUrl !== '') {
206
+ extra.push(` PR: ${job.prUrl}`);
207
+ }
208
+ return extra.length > 0 ? [head, ...extra].join('\n') : head;
209
+ }
210
+ /**
211
+ * A trailing marker that explains WHY a non-active job is in the look-here group:
212
+ * a `running` job the harness reports dead is a **crashed** runner; a `done` job
213
+ * is **awaiting cleanup** (`gc` will reap it); a `needs-attention` job is
214
+ * **stuck** (its reason is rendered separately).
215
+ */
216
+ function jobMarker(job) {
217
+ if (job.state === 'running' && !job.alive) {
218
+ return ' (crashed — no longer alive)';
219
+ }
220
+ if (job.state === 'done') {
221
+ return ' (done — awaiting cleanup)';
222
+ }
223
+ if (job.state === 'needs-attention') {
224
+ return ' (needs attention)';
225
+ }
226
+ return '';
227
+ }
228
+ //# sourceMappingURL=status.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status.js","sourceRoot":"","sources":["../src/status.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,162 @@
1
+ import { type Harness } from './harness.js';
2
+ import type { NewQuestion } from './sidecar.js';
3
+ /**
4
+ * The **SURFACE gate** (prd `advance-loop`, task `advance-rung-surface`,
5
+ * US #32/33) — the surface-question rung's fresh-context spawn, the DIRECT mirror
6
+ * of the PR/code review gate ({@link import('./review-gate.js')}). On
7
+ * `classify=surface`, the advance engine spawns a FRESH-CONTEXT agent with the
8
+ * `surface-questions` SKILL loaded (`skills/surface-questions/SKILL.md`); the
9
+ * skill GATHERS the item's open-judgement residue and EMITS questions and writes
10
+ * NOTHING (doc-shaped, like `review`). The ENGINE then ITSELF persists them to
11
+ * the sidecar CAS-atomically + sets `needsAnswers:true` (task
12
+ * `advance-rung-surface`'s persist half) — **the skill JUDGES, the engine
13
+ * PERSISTS.**
14
+ *
15
+ * This module is the SEAM (the {@link SurfaceGate} function type) + its
16
+ * production harness-backed implementation ({@link harnessSurfaceGate}), exactly
17
+ * as `review-gate.ts` is the seam + `harnessReviewGate`. The seam is injectable:
18
+ * tests stub a canned emitted-questions list (no real model); production launches
19
+ * the `surface-questions` agent through the EXISTING harness seam
20
+ * ({@link Harness}/`LaunchInput`), routing an optional `surfaceModel` override
21
+ * through `LaunchInput.model` — NOT a new model/launch mechanism (the §13
22
+ * model-routing intent). It mirrors `harnessReviewGate` byte-for-byte in shape;
23
+ * only the PROMPT ({@link buildSurfacePrompt}) and the parsed payload
24
+ * ({@link parseSurfaceEmit}, a `{questions}` list rather than a `{verdict}`)
25
+ * differ.
26
+ *
27
+ * ALWAYS-allowed: there is NO gate check before surfacing — surfacing a question
28
+ * is never gated, even with every autonomy flag off (the "question loop with zero
29
+ * autonomy" case, US #23). The expensive (agent/model) work is POST-lock,
30
+ * winner-only — but that sequencing is the ENGINE's job (`advance.ts`); this
31
+ * module is only the spawn→emit→parse.
32
+ */
33
+ /**
34
+ * One question the `surface-questions` skill EMITS — the THREE authoring fields of
35
+ * the sidecar entry shape (`skills/surface-questions/SKILL.md` → "The emitted
36
+ * question shape"). It maps 1:1 onto {@link NewQuestion} (what the engine appends
37
+ * to the sidecar), so the engine persists with ZERO translation. The skill does
38
+ * NOT assign `id`/`answered`/`answer`/`allAnswered` — those are the sidecar's
39
+ * machine-owned fields the engine owns. A surfaced question is a PLAIN question:
40
+ * there is NO `disposition` token any more (task
41
+ * `agentic-apply-retire-disposition-vocabulary`) — what to DO with the answered
42
+ * signal is decided by the AGENTIC apply decision, not stamped on the question.
43
+ */
44
+ export interface SurfaceQuestion {
45
+ /** The question, verbatim. */
46
+ question: string;
47
+ /** Inline context so the human need not open the item. */
48
+ context?: string;
49
+ /** Optional suggested default (the humility aid; NEVER a decision). */
50
+ default?: string;
51
+ }
52
+ /**
53
+ * What the `surface-questions` SKILL emits (and this gate parses): the item's
54
+ * identity (orientation only) + an ORDERED list of questions. An EMPTY list is a
55
+ * valid, honest result ("no open judgement") — the engine writes no sidecar.
56
+ */
57
+ export interface SurfaceEmit {
58
+ /** The namespaced identity the skill surfaced for (orientation; advisory). */
59
+ item?: string;
60
+ /** The ordered emitted questions (possibly empty). */
61
+ questions: SurfaceQuestion[];
62
+ }
63
+ /** What the surface gate needs to launch a fresh-context surface of one item. */
64
+ export interface SurfaceGateInput {
65
+ /** The namespaced identity the surface is for (`task:foo` / `prd:bar` / `observation:baz`). */
66
+ item: string;
67
+ /** The working clone/checkout the gate runs in. */
68
+ cwd: string;
69
+ /**
70
+ * The model the SURFACE agent runs on. `undefined` ⇒ no forced model (the
71
+ * harness's own default). Flows to the launch through `LaunchInput.model`.
72
+ */
73
+ surfaceModel?: string;
74
+ /** Environment for the surface-agent launch. */
75
+ env?: NodeJS.ProcessEnv;
76
+ /** `--watch`: tail the surface agent's pi session live (pure observer). */
77
+ watch?: boolean;
78
+ /** Where the tailed surface lines are written (defaults to stderr). */
79
+ watchSink?: (line: string) => void;
80
+ /** Emit ANSI colour in the tailed surface lines (the caller's TTY decision). */
81
+ color?: boolean;
82
+ /** The HOST-ONLY sessions root the surface session FILE is generated under. */
83
+ sessionsDir?: string;
84
+ }
85
+ /**
86
+ * The surface-gate SEAM: run a fresh-context surface of the item and return the
87
+ * parsed emitted questions. Injected by tests (a canned list, no real model);
88
+ * production uses {@link harnessSurfaceGate}. Mirrors `review-gate.ts`'s
89
+ * `ReviewGate` seam shape so the engine wiring is testable as pure logic.
90
+ */
91
+ export type SurfaceGate = (input: SurfaceGateInput) => Promise<SurfaceEmit>;
92
+ /** Raised when the surface agent ran but produced no parseable emit. */
93
+ export declare class SurfaceParseError extends Error {
94
+ }
95
+ /**
96
+ * Parse the `surface-questions` SKILL's emitted questions out of the surface
97
+ * agent's textual output. The skill emits a `{item, questions:[…]}` JSON object
98
+ * (the agent may wrap it in prose / a fenced block), so we extract the first JSON
99
+ * object carrying a `questions` field and validate its shape. An EMPTY
100
+ * `questions` list is VALID (the honest "no open judgement" result). Throws
101
+ * {@link SurfaceParseError} when no valid emit is present (the caller treats an
102
+ * unparseable emit as an error — never a silent "surfaced nothing").
103
+ *
104
+ * The emit MAY also carry a free-prose `note` field (the surface counterpart of
105
+ * the verdict's `review`): a HOME inside the object for the agent's reasoning /
106
+ * findings so it never needs to write prose AROUND the JSON (the cause of the
107
+ * "no parseable {questions}" trailing-chatter failure — observation
108
+ * `surface-rung-agent-emits-no-parseable-questions`). The engine does not
109
+ * persist `note`, so it is simply IGNORED here (like every unrecognised field);
110
+ * the prompt's job is to give the prose a place to go, not the parser's to keep
111
+ * it.
112
+ */
113
+ export declare function parseSurfaceEmit(output: string): SurfaceEmit;
114
+ /**
115
+ * Convert the emitted questions to the {@link NewQuestion} shape the engine
116
+ * appends to the sidecar — a 1:1 field map (the emit shape IS the sidecar
117
+ * authoring shape, by design), so the engine persists with ZERO translation.
118
+ */
119
+ export declare function toNewQuestions(emit: SurfaceEmit): NewQuestion[];
120
+ /**
121
+ * Render the surface-agent PROMPT: instruct a fresh-context agent to apply the
122
+ * **surface-questions discipline** (`work/protocol/SURFACE-PROTOCOL.md`) to ONE
123
+ * `work/` item and to EMIT a single `{item, questions}` JSON object (so
124
+ * {@link parseSurfaceEmit} can read it). The discipline body (the two laws —
125
+ * GATHER-only / PERSIST-NEVER — the humility rule, the composed sources, the
126
+ * emitted-question shape) lives in `SURFACE-PROTOCOL.md` — NOT inlined here
127
+ * (task `surface-protocol-doc-and-prompt`). The shape's source of truth is
128
+ * {@link parseSurfaceEmit}; the doc DESCRIBES it (D2).
129
+ *
130
+ * This builder owns ONLY the PER-BUILDER framing: who you are (a fresh-context
131
+ * question-surfacer, the engine's surface-question rung), what you are
132
+ * surfacing (ONE namespaced item), and the required JSON output shape. It
133
+ * MIRRORS {@link buildReviewPrompt}: a fresh-context agent that EDITS nothing
134
+ * and EMITS a single structured object the ENGINE routes/persists.
135
+ */
136
+ export declare function buildSurfacePrompt(item: string): string;
137
+ /** What a harness-backed surface gate needs to launch the surface agent. */
138
+ export interface HarnessSurfaceGateOptions {
139
+ /** The harness seam used to launch the fresh-context surface agent. */
140
+ harness?: Harness;
141
+ /** The agent command the null/shell adapter shells out to (`{model}`-aware). */
142
+ agentCmd?: string;
143
+ /**
144
+ * Read the surface agent's textual output for parsing. Production reads
145
+ * `launched.output` (the ANSWER channel, distinct from `detail`); tests inject
146
+ * `readOutput` to stub a canned emit string.
147
+ */
148
+ readOutput?: (output: string | undefined) => string;
149
+ }
150
+ /**
151
+ * The PRODUCTION surface gate: launch the `surface-questions` SKILL as a
152
+ * fresh-context agent through the EXISTING harness seam, routing the
153
+ * `surfaceModel` override via `LaunchInput.model` (the §13 model-routing intent —
154
+ * NOT a new mechanism), then parse the emitted `{item, questions}`. It is the
155
+ * DIRECT mirror of `harnessReviewGate`: a SEPARATE harness launch (fresh context
156
+ * = not the engine's session) in the same checkout `cwd`, fed
157
+ * {@link buildSurfacePrompt}; the model flows through `LaunchInput.model`, which
158
+ * each adapter injects natively. The surface uses a DISTINCT session id
159
+ * (`<item>-surface`) so its session never collides with a build/review session.
160
+ */
161
+ export declare function harnessSurfaceGate(options?: HarnessSurfaceGateOptions): SurfaceGate;
162
+ //# sourceMappingURL=surface-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"surface-gate.d.ts","sourceRoot":"","sources":["../src/surface-gate.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,KAAK,OAAO,EAAC,MAAM,cAAc,CAAC;AAKvD,OAAO,KAAK,EAAC,WAAW,EAAC,MAAM,cAAc,CAAC;AAE9C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH;;;;;;;;;;GAUG;AACH,MAAM,WAAW,eAAe;IAC/B,8BAA8B;IAC9B,QAAQ,EAAE,MAAM,CAAC;IACjB,0DAA0D;IAC1D,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,WAAW;IAC3B,8EAA8E;IAC9E,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,sDAAsD;IACtD,SAAS,EAAE,eAAe,EAAE,CAAC;CAC7B;AAED,iFAAiF;AACjF,MAAM,WAAW,gBAAgB;IAChC,+FAA+F;IAC/F,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,GAAG,EAAE,MAAM,CAAC;IACZ;;;OAGG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gDAAgD;IAChD,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,2EAA2E;IAC3E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,+EAA+E;IAC/E,WAAW,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;;;;GAKG;AACH,MAAM,MAAM,WAAW,GAAG,CAAC,KAAK,EAAE,gBAAgB,KAAK,OAAO,CAAC,WAAW,CAAC,CAAC;AAE5E,wEAAwE;AACxE,qBAAa,iBAAkB,SAAQ,KAAK;CAAG;AAE/C;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,WAAW,CAgB5D;AAsCD;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,WAAW,EAAE,CAW/D;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAuDvD;AAED,4EAA4E;AAC5E,MAAM,WAAW,yBAAyB;IACzC,uEAAuE;IACvE,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,KAAK,MAAM,CAAC;CACpD;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,kBAAkB,CACjC,OAAO,GAAE,yBAA8B,GACrC,WAAW,CA0Cb"}