@matteeh/osq 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (619) hide show
  1. package/README.md +415 -72
  2. package/dist/cli/approve.d.ts +13 -3
  3. package/dist/cli/approve.d.ts.map +1 -1
  4. package/dist/cli/approve.js +59 -4
  5. package/dist/cli/approve.js.map +1 -1
  6. package/dist/cli/bin.js +0 -0
  7. package/dist/cli/confirm.d.ts +21 -0
  8. package/dist/cli/confirm.d.ts.map +1 -0
  9. package/dist/cli/confirm.js +28 -0
  10. package/dist/cli/confirm.js.map +1 -0
  11. package/dist/cli/doctor.d.ts +13 -0
  12. package/dist/cli/doctor.d.ts.map +1 -0
  13. package/dist/cli/doctor.js +23 -0
  14. package/dist/cli/doctor.js.map +1 -0
  15. package/dist/cli/done.d.ts +12 -0
  16. package/dist/cli/done.d.ts.map +1 -0
  17. package/dist/cli/done.js +26 -0
  18. package/dist/cli/done.js.map +1 -0
  19. package/dist/cli/inbox.d.ts +22 -0
  20. package/dist/cli/inbox.d.ts.map +1 -0
  21. package/dist/cli/inbox.js +41 -0
  22. package/dist/cli/inbox.js.map +1 -0
  23. package/dist/cli/index.d.ts.map +1 -1
  24. package/dist/cli/index.js +127 -8
  25. package/dist/cli/index.js.map +1 -1
  26. package/dist/cli/init.d.ts +1 -0
  27. package/dist/cli/init.d.ts.map +1 -1
  28. package/dist/cli/init.js +9 -3
  29. package/dist/cli/init.js.map +1 -1
  30. package/dist/cli/lint.d.ts +26 -0
  31. package/dist/cli/lint.d.ts.map +1 -0
  32. package/dist/cli/lint.js +60 -0
  33. package/dist/cli/lint.js.map +1 -0
  34. package/dist/cli/migrate.d.ts +18 -0
  35. package/dist/cli/migrate.d.ts.map +1 -0
  36. package/dist/cli/migrate.js +42 -0
  37. package/dist/cli/migrate.js.map +1 -0
  38. package/dist/cli/new.js +1 -1
  39. package/dist/cli/new.js.map +1 -1
  40. package/dist/cli/plan-queue.d.ts +50 -0
  41. package/dist/cli/plan-queue.d.ts.map +1 -0
  42. package/dist/cli/plan-queue.js +167 -0
  43. package/dist/cli/plan-queue.js.map +1 -0
  44. package/dist/cli/plan.d.ts +35 -0
  45. package/dist/cli/plan.d.ts.map +1 -0
  46. package/dist/cli/plan.js +153 -0
  47. package/dist/cli/plan.js.map +1 -0
  48. package/dist/cli/queue.d.ts +9 -0
  49. package/dist/cli/queue.d.ts.map +1 -0
  50. package/dist/cli/queue.js +24 -0
  51. package/dist/cli/queue.js.map +1 -0
  52. package/dist/cli/reject.d.ts +8 -0
  53. package/dist/cli/reject.d.ts.map +1 -0
  54. package/dist/cli/reject.js +18 -0
  55. package/dist/cli/reject.js.map +1 -0
  56. package/dist/cli/report.d.ts +1 -1
  57. package/dist/cli/report.d.ts.map +1 -1
  58. package/dist/cli/report.js +141 -14
  59. package/dist/cli/report.js.map +1 -1
  60. package/dist/cli/retry.d.ts +7 -0
  61. package/dist/cli/retry.d.ts.map +1 -0
  62. package/dist/cli/retry.js +29 -0
  63. package/dist/cli/retry.js.map +1 -0
  64. package/dist/cli/serve.d.ts +30 -0
  65. package/dist/cli/serve.d.ts.map +1 -0
  66. package/dist/cli/serve.js +136 -0
  67. package/dist/cli/serve.js.map +1 -0
  68. package/dist/cli/setup.d.ts.map +1 -1
  69. package/dist/cli/setup.js +7 -1
  70. package/dist/cli/setup.js.map +1 -1
  71. package/dist/cli/show.d.ts +2 -1
  72. package/dist/cli/show.d.ts.map +1 -1
  73. package/dist/cli/show.js +20 -3
  74. package/dist/cli/show.js.map +1 -1
  75. package/dist/cli/status.d.ts +1 -1
  76. package/dist/cli/status.d.ts.map +1 -1
  77. package/dist/cli/status.js +2 -2
  78. package/dist/cli/status.js.map +1 -1
  79. package/dist/cli/watch.d.ts +9 -6
  80. package/dist/cli/watch.d.ts.map +1 -1
  81. package/dist/cli/watch.js +15 -2
  82. package/dist/cli/watch.js.map +1 -1
  83. package/dist/core/foundation/config-codex.d.ts +22 -0
  84. package/dist/core/foundation/config-codex.d.ts.map +1 -0
  85. package/dist/core/foundation/config-codex.js +58 -0
  86. package/dist/core/foundation/config-codex.js.map +1 -0
  87. package/dist/core/foundation/config-doctor.d.ts +14 -0
  88. package/dist/core/foundation/config-doctor.d.ts.map +1 -0
  89. package/dist/core/foundation/config-doctor.js +29 -0
  90. package/dist/core/foundation/config-doctor.js.map +1 -0
  91. package/dist/core/foundation/config-env.d.ts +3 -0
  92. package/dist/core/foundation/config-env.d.ts.map +1 -0
  93. package/dist/core/foundation/config-env.js +22 -0
  94. package/dist/core/foundation/config-env.js.map +1 -0
  95. package/dist/core/foundation/config-gates.d.ts +22 -0
  96. package/dist/core/foundation/config-gates.d.ts.map +1 -0
  97. package/dist/core/foundation/config-gates.js +43 -0
  98. package/dist/core/foundation/config-gates.js.map +1 -0
  99. package/dist/core/foundation/config-pi.d.ts +64 -0
  100. package/dist/core/foundation/config-pi.d.ts.map +1 -0
  101. package/dist/core/foundation/config-pi.js +131 -0
  102. package/dist/core/foundation/config-pi.js.map +1 -0
  103. package/dist/core/foundation/config-planning.d.ts +24 -0
  104. package/dist/core/foundation/config-planning.d.ts.map +1 -0
  105. package/dist/core/foundation/config-planning.js +60 -0
  106. package/dist/core/foundation/config-planning.js.map +1 -0
  107. package/dist/core/foundation/config-queue.d.ts +15 -0
  108. package/dist/core/foundation/config-queue.d.ts.map +1 -0
  109. package/dist/core/foundation/config-queue.js +24 -0
  110. package/dist/core/foundation/config-queue.js.map +1 -0
  111. package/dist/core/foundation/config-serve.d.ts +20 -0
  112. package/dist/core/foundation/config-serve.d.ts.map +1 -0
  113. package/dist/core/foundation/config-serve.js +35 -0
  114. package/dist/core/foundation/config-serve.js.map +1 -0
  115. package/dist/core/{config.d.ts → foundation/config.d.ts} +34 -3
  116. package/dist/core/foundation/config.d.ts.map +1 -0
  117. package/dist/core/{config.js → foundation/config.js} +35 -18
  118. package/dist/core/foundation/config.js.map +1 -0
  119. package/dist/core/foundation/doctor-managed.d.ts +13 -0
  120. package/dist/core/foundation/doctor-managed.d.ts.map +1 -0
  121. package/dist/core/foundation/doctor-managed.js +77 -0
  122. package/dist/core/foundation/doctor-managed.js.map +1 -0
  123. package/dist/core/foundation/doctor.d.ts +19 -0
  124. package/dist/core/foundation/doctor.d.ts.map +1 -0
  125. package/dist/core/foundation/doctor.js +187 -0
  126. package/dist/core/foundation/doctor.js.map +1 -0
  127. package/dist/core/foundation/harness-catalog.d.ts +96 -0
  128. package/dist/core/foundation/harness-catalog.d.ts.map +1 -0
  129. package/dist/core/foundation/harness-catalog.js +182 -0
  130. package/dist/core/foundation/harness-catalog.js.map +1 -0
  131. package/dist/core/foundation/init-blocks.d.ts +33 -0
  132. package/dist/core/foundation/init-blocks.d.ts.map +1 -0
  133. package/dist/core/foundation/init-blocks.js +165 -0
  134. package/dist/core/foundation/init-blocks.js.map +1 -0
  135. package/dist/core/foundation/init-managed.d.ts +10 -0
  136. package/dist/core/foundation/init-managed.d.ts.map +1 -0
  137. package/dist/core/foundation/init-managed.js +115 -0
  138. package/dist/core/foundation/init-managed.js.map +1 -0
  139. package/dist/core/foundation/init.d.ts +18 -0
  140. package/dist/core/foundation/init.d.ts.map +1 -0
  141. package/dist/core/foundation/init.js +113 -0
  142. package/dist/core/foundation/init.js.map +1 -0
  143. package/dist/core/{logger.d.ts → foundation/logger.d.ts} +1 -0
  144. package/dist/core/foundation/logger.d.ts.map +1 -0
  145. package/dist/core/{logger.js → foundation/logger.js} +18 -2
  146. package/dist/core/foundation/logger.js.map +1 -0
  147. package/dist/core/{new.d.ts → foundation/new.d.ts} +3 -0
  148. package/dist/core/foundation/new.d.ts.map +1 -0
  149. package/dist/core/foundation/new.js +206 -0
  150. package/dist/core/foundation/new.js.map +1 -0
  151. package/dist/core/foundation/package-root.d.ts +9 -0
  152. package/dist/core/foundation/package-root.d.ts.map +1 -0
  153. package/dist/core/foundation/package-root.js +11 -0
  154. package/dist/core/foundation/package-root.js.map +1 -0
  155. package/dist/core/lifecycle/done.d.ts +17 -0
  156. package/dist/core/lifecycle/done.d.ts.map +1 -0
  157. package/dist/core/lifecycle/done.js +97 -0
  158. package/dist/core/lifecycle/done.js.map +1 -0
  159. package/dist/core/lifecycle/reject.d.ts +26 -0
  160. package/dist/core/lifecycle/reject.d.ts.map +1 -0
  161. package/dist/core/lifecycle/reject.js +83 -0
  162. package/dist/core/lifecycle/reject.js.map +1 -0
  163. package/dist/core/lifecycle/retry-transition.d.ts +23 -0
  164. package/dist/core/lifecycle/retry-transition.d.ts.map +1 -0
  165. package/dist/core/lifecycle/retry-transition.js +41 -0
  166. package/dist/core/lifecycle/retry-transition.js.map +1 -0
  167. package/dist/core/lifecycle/retry.d.ts +18 -0
  168. package/dist/core/lifecycle/retry.d.ts.map +1 -0
  169. package/dist/core/lifecycle/retry.js +179 -0
  170. package/dist/core/lifecycle/retry.js.map +1 -0
  171. package/dist/core/report/approval-flags.d.ts +29 -0
  172. package/dist/core/report/approval-flags.d.ts.map +1 -0
  173. package/dist/core/report/approval-flags.js +138 -0
  174. package/dist/core/report/approval-flags.js.map +1 -0
  175. package/dist/core/report/planning-economics.d.ts +39 -0
  176. package/dist/core/report/planning-economics.d.ts.map +1 -0
  177. package/dist/core/report/planning-economics.js +168 -0
  178. package/dist/core/report/planning-economics.js.map +1 -0
  179. package/dist/core/report/planning-observed.d.ts +59 -0
  180. package/dist/core/report/planning-observed.d.ts.map +1 -0
  181. package/dist/core/report/planning-observed.js +135 -0
  182. package/dist/core/report/planning-observed.js.map +1 -0
  183. package/dist/core/report/planning-records.d.ts +69 -0
  184. package/dist/core/report/planning-records.d.ts.map +1 -0
  185. package/dist/core/report/planning-records.js +149 -0
  186. package/dist/core/report/planning-records.js.map +1 -0
  187. package/dist/core/report/planning-slice-lookup.d.ts +13 -0
  188. package/dist/core/report/planning-slice-lookup.d.ts.map +1 -0
  189. package/dist/core/report/planning-slice-lookup.js +146 -0
  190. package/dist/core/report/planning-slice-lookup.js.map +1 -0
  191. package/dist/core/report/planning-slice-measures.d.ts +17 -0
  192. package/dist/core/report/planning-slice-measures.d.ts.map +1 -0
  193. package/dist/core/report/planning-slice-measures.js +85 -0
  194. package/dist/core/report/planning-slice-measures.js.map +1 -0
  195. package/dist/core/report/planning-slice-record.d.ts +4 -0
  196. package/dist/core/report/planning-slice-record.d.ts.map +1 -0
  197. package/dist/core/report/planning-slice-record.js +66 -0
  198. package/dist/core/report/planning-slice-record.js.map +1 -0
  199. package/dist/core/report/planning-slice-turns.d.ts +13 -0
  200. package/dist/core/report/planning-slice-turns.d.ts.map +1 -0
  201. package/dist/core/report/planning-slice-turns.js +41 -0
  202. package/dist/core/report/planning-slice-turns.js.map +1 -0
  203. package/dist/core/report/planning-slice.d.ts +70 -0
  204. package/dist/core/report/planning-slice.d.ts.map +1 -0
  205. package/dist/core/report/planning-slice.js +147 -0
  206. package/dist/core/report/planning-slice.js.map +1 -0
  207. package/dist/core/report/planning.d.ts +31 -0
  208. package/dist/core/report/planning.d.ts.map +1 -0
  209. package/dist/core/report/planning.js +75 -0
  210. package/dist/core/report/planning.js.map +1 -0
  211. package/dist/core/report/report-events.d.ts +52 -0
  212. package/dist/core/report/report-events.d.ts.map +1 -0
  213. package/dist/core/report/report-events.js +198 -0
  214. package/dist/core/report/report-events.js.map +1 -0
  215. package/dist/core/report/report-pre-spawn.d.ts +25 -0
  216. package/dist/core/report/report-pre-spawn.d.ts.map +1 -0
  217. package/dist/core/report/report-pre-spawn.js +40 -0
  218. package/dist/core/report/report-pre-spawn.js.map +1 -0
  219. package/dist/core/report/report-retries.d.ts +30 -0
  220. package/dist/core/report/report-retries.d.ts.map +1 -0
  221. package/dist/core/report/report-retries.js +100 -0
  222. package/dist/core/report/report-retries.js.map +1 -0
  223. package/dist/core/report/report.d.ts +276 -0
  224. package/dist/core/report/report.d.ts.map +1 -0
  225. package/dist/core/report/report.js +1421 -0
  226. package/dist/core/report/report.js.map +1 -0
  227. package/dist/core/{lock.d.ts → run/lock.d.ts} +6 -0
  228. package/dist/core/run/lock.d.ts.map +1 -0
  229. package/dist/core/{lock.js → run/lock.js} +7 -15
  230. package/dist/core/run/lock.js.map +1 -0
  231. package/dist/core/run/manifest.d.ts +39 -0
  232. package/dist/core/run/manifest.d.ts.map +1 -0
  233. package/dist/core/run/manifest.js +137 -0
  234. package/dist/core/run/manifest.js.map +1 -0
  235. package/dist/core/run/scope-hash.d.ts +71 -0
  236. package/dist/core/run/scope-hash.d.ts.map +1 -0
  237. package/dist/core/run/scope-hash.js +177 -0
  238. package/dist/core/run/scope-hash.js.map +1 -0
  239. package/dist/core/run/scope.d.ts +30 -0
  240. package/dist/core/run/scope.d.ts.map +1 -0
  241. package/dist/core/run/scope.js +193 -0
  242. package/dist/core/run/scope.js.map +1 -0
  243. package/dist/core/run/summary.d.ts +8 -0
  244. package/dist/core/run/summary.d.ts.map +1 -0
  245. package/dist/core/run/summary.js +25 -0
  246. package/dist/core/run/summary.js.map +1 -0
  247. package/dist/core/run/verification.d.ts +23 -0
  248. package/dist/core/run/verification.d.ts.map +1 -0
  249. package/dist/core/run/verification.js +78 -0
  250. package/dist/core/run/verification.js.map +1 -0
  251. package/dist/core/spec/approve.d.ts +31 -0
  252. package/dist/core/spec/approve.d.ts.map +1 -0
  253. package/dist/core/spec/approve.js +111 -0
  254. package/dist/core/spec/approve.js.map +1 -0
  255. package/dist/core/spec/delta.d.ts +77 -0
  256. package/dist/core/spec/delta.d.ts.map +1 -0
  257. package/dist/core/spec/delta.js +581 -0
  258. package/dist/core/spec/delta.js.map +1 -0
  259. package/dist/core/spec/digest-flags.d.ts +21 -0
  260. package/dist/core/spec/digest-flags.d.ts.map +1 -0
  261. package/dist/core/spec/digest-flags.js +194 -0
  262. package/dist/core/spec/digest-flags.js.map +1 -0
  263. package/dist/core/spec/digest-verify-starts.d.ts +5 -0
  264. package/dist/core/spec/digest-verify-starts.d.ts.map +1 -0
  265. package/dist/core/spec/digest-verify-starts.js +31 -0
  266. package/dist/core/spec/digest-verify-starts.js.map +1 -0
  267. package/dist/core/spec/digest.d.ts +42 -0
  268. package/dist/core/spec/digest.d.ts.map +1 -0
  269. package/dist/core/spec/digest.js +170 -0
  270. package/dist/core/spec/digest.js.map +1 -0
  271. package/dist/core/spec/hasher.d.ts +11 -0
  272. package/dist/core/spec/hasher.d.ts.map +1 -0
  273. package/dist/core/{hasher.js → spec/hasher.js} +27 -3
  274. package/dist/core/spec/hasher.js.map +1 -0
  275. package/dist/core/spec/linter.d.ts +79 -0
  276. package/dist/core/spec/linter.d.ts.map +1 -0
  277. package/dist/core/spec/linter.js +826 -0
  278. package/dist/core/spec/linter.js.map +1 -0
  279. package/dist/core/spec/migrate.d.ts +54 -0
  280. package/dist/core/spec/migrate.d.ts.map +1 -0
  281. package/dist/core/spec/migrate.js +297 -0
  282. package/dist/core/spec/migrate.js.map +1 -0
  283. package/dist/core/spec/openspec-version.d.ts +30 -0
  284. package/dist/core/spec/openspec-version.d.ts.map +1 -0
  285. package/dist/core/spec/openspec-version.js +118 -0
  286. package/dist/core/spec/openspec-version.js.map +1 -0
  287. package/dist/core/spec/parser.d.ts +82 -0
  288. package/dist/core/spec/parser.d.ts.map +1 -0
  289. package/dist/core/spec/parser.js +221 -0
  290. package/dist/core/spec/parser.js.map +1 -0
  291. package/dist/core/spec/verify-paths.d.ts +18 -0
  292. package/dist/core/spec/verify-paths.d.ts.map +1 -0
  293. package/dist/core/spec/verify-paths.js +139 -0
  294. package/dist/core/spec/verify-paths.js.map +1 -0
  295. package/dist/core/spec/verify-starts.d.ts +45 -0
  296. package/dist/core/spec/verify-starts.d.ts.map +1 -0
  297. package/dist/core/spec/verify-starts.js +61 -0
  298. package/dist/core/spec/verify-starts.js.map +1 -0
  299. package/dist/core/status/inbox-cursor.d.ts +10 -0
  300. package/dist/core/status/inbox-cursor.d.ts.map +1 -0
  301. package/dist/core/status/inbox-cursor.js +33 -0
  302. package/dist/core/status/inbox-cursor.js.map +1 -0
  303. package/dist/core/status/inbox-projection.d.ts +15 -0
  304. package/dist/core/status/inbox-projection.d.ts.map +1 -0
  305. package/dist/core/status/inbox-projection.js +20 -0
  306. package/dist/core/status/inbox-projection.js.map +1 -0
  307. package/dist/core/status/inbox-text.d.ts +4 -0
  308. package/dist/core/status/inbox-text.d.ts.map +1 -0
  309. package/dist/core/status/inbox-text.js +48 -0
  310. package/dist/core/status/inbox-text.js.map +1 -0
  311. package/dist/core/status/inbox.d.ts +53 -0
  312. package/dist/core/status/inbox.d.ts.map +1 -0
  313. package/dist/core/status/inbox.js +167 -0
  314. package/dist/core/status/inbox.js.map +1 -0
  315. package/dist/core/status/layout.d.ts +29 -0
  316. package/dist/core/status/layout.d.ts.map +1 -0
  317. package/dist/core/status/layout.js +77 -0
  318. package/dist/core/status/layout.js.map +1 -0
  319. package/dist/core/status/queue-parser.d.ts +13 -0
  320. package/dist/core/status/queue-parser.d.ts.map +1 -0
  321. package/dist/core/status/queue-parser.js +88 -0
  322. package/dist/core/status/queue-parser.js.map +1 -0
  323. package/dist/core/status/queue-planning.d.ts +62 -0
  324. package/dist/core/status/queue-planning.d.ts.map +1 -0
  325. package/dist/core/status/queue-planning.js +158 -0
  326. package/dist/core/status/queue-planning.js.map +1 -0
  327. package/dist/core/status/queue-report-detail.d.ts +50 -0
  328. package/dist/core/status/queue-report-detail.d.ts.map +1 -0
  329. package/dist/core/status/queue-report-detail.js +140 -0
  330. package/dist/core/status/queue-report-detail.js.map +1 -0
  331. package/dist/core/status/queue-report.d.ts +14 -0
  332. package/dist/core/status/queue-report.d.ts.map +1 -0
  333. package/dist/core/status/queue-report.js +41 -0
  334. package/dist/core/status/queue-report.js.map +1 -0
  335. package/dist/core/status/queue-state.d.ts +53 -0
  336. package/dist/core/status/queue-state.d.ts.map +1 -0
  337. package/dist/core/status/queue-state.js +167 -0
  338. package/dist/core/status/queue-state.js.map +1 -0
  339. package/dist/core/status/queue.d.ts +7 -0
  340. package/dist/core/status/queue.d.ts.map +1 -0
  341. package/dist/core/status/queue.js +4 -0
  342. package/dist/core/status/queue.js.map +1 -0
  343. package/dist/core/status/show.d.ts +102 -0
  344. package/dist/core/status/show.d.ts.map +1 -0
  345. package/dist/core/status/show.js +704 -0
  346. package/dist/core/status/show.js.map +1 -0
  347. package/dist/core/status/state.d.ts +56 -0
  348. package/dist/core/status/state.d.ts.map +1 -0
  349. package/dist/core/status/state.js +187 -0
  350. package/dist/core/status/state.js.map +1 -0
  351. package/dist/core/status/status.d.ts +23 -0
  352. package/dist/core/status/status.d.ts.map +1 -0
  353. package/dist/core/status/status.js +173 -0
  354. package/dist/core/status/status.js.map +1 -0
  355. package/dist/core/web/web-data-change.d.ts +10 -0
  356. package/dist/core/web/web-data-change.d.ts.map +1 -0
  357. package/dist/core/web/web-data-change.js +106 -0
  358. package/dist/core/web/web-data-change.js.map +1 -0
  359. package/dist/core/web/web-data-folders.d.ts +39 -0
  360. package/dist/core/web/web-data-folders.d.ts.map +1 -0
  361. package/dist/core/web/web-data-folders.js +125 -0
  362. package/dist/core/web/web-data-folders.js.map +1 -0
  363. package/dist/core/web/web-data-graph.d.ts +8 -0
  364. package/dist/core/web/web-data-graph.d.ts.map +1 -0
  365. package/dist/core/web/web-data-graph.js +113 -0
  366. package/dist/core/web/web-data-graph.js.map +1 -0
  367. package/dist/core/web/web-data-lifecycle.d.ts +43 -0
  368. package/dist/core/web/web-data-lifecycle.d.ts.map +1 -0
  369. package/dist/core/web/web-data-lifecycle.js +141 -0
  370. package/dist/core/web/web-data-lifecycle.js.map +1 -0
  371. package/dist/core/web/web-data-observations.d.ts +30 -0
  372. package/dist/core/web/web-data-observations.d.ts.map +1 -0
  373. package/dist/core/web/web-data-observations.js +181 -0
  374. package/dist/core/web/web-data-observations.js.map +1 -0
  375. package/dist/core/web/web-data-tokens.d.ts +29 -0
  376. package/dist/core/web/web-data-tokens.d.ts.map +1 -0
  377. package/dist/core/web/web-data-tokens.js +62 -0
  378. package/dist/core/web/web-data-tokens.js.map +1 -0
  379. package/dist/core/web/web-data-types.d.ts +156 -0
  380. package/dist/core/web/web-data-types.d.ts.map +1 -0
  381. package/dist/core/web/web-data-types.js +15 -0
  382. package/dist/core/web/web-data-types.js.map +1 -0
  383. package/dist/core/web/web-data.d.ts +10 -0
  384. package/dist/core/web/web-data.d.ts.map +1 -0
  385. package/dist/core/web/web-data.js +8 -0
  386. package/dist/core/web/web-data.js.map +1 -0
  387. package/dist/core/web/web-events.d.ts +54 -0
  388. package/dist/core/web/web-events.d.ts.map +1 -0
  389. package/dist/core/web/web-events.js +162 -0
  390. package/dist/core/web/web-events.js.map +1 -0
  391. package/dist/core/web/web-export.d.ts +18 -0
  392. package/dist/core/web/web-export.d.ts.map +1 -0
  393. package/dist/core/web/web-export.js +112 -0
  394. package/dist/core/web/web-export.js.map +1 -0
  395. package/dist/core/web/web-server.d.ts +34 -0
  396. package/dist/core/web/web-server.d.ts.map +1 -0
  397. package/dist/core/web/web-server.js +182 -0
  398. package/dist/core/web/web-server.js.map +1 -0
  399. package/dist/core/web/web-static.d.ts +20 -0
  400. package/dist/core/web/web-static.d.ts.map +1 -0
  401. package/dist/core/web/web-static.js +104 -0
  402. package/dist/core/web/web-static.js.map +1 -0
  403. package/dist/harness/{agy.d.ts → agy/agy.d.ts} +8 -6
  404. package/dist/harness/agy/agy.d.ts.map +1 -0
  405. package/dist/harness/{agy.js → agy/agy.js} +49 -34
  406. package/dist/harness/agy/agy.js.map +1 -0
  407. package/dist/harness/claude/claude-turns.d.ts +29 -0
  408. package/dist/harness/claude/claude-turns.d.ts.map +1 -0
  409. package/dist/harness/claude/claude-turns.js +162 -0
  410. package/dist/harness/claude/claude-turns.js.map +1 -0
  411. package/dist/harness/claude/claude-usage.d.ts +12 -0
  412. package/dist/harness/claude/claude-usage.d.ts.map +1 -0
  413. package/dist/harness/claude/claude-usage.js +144 -0
  414. package/dist/harness/claude/claude-usage.js.map +1 -0
  415. package/dist/harness/codex/codex-observe-usage.d.ts +6 -0
  416. package/dist/harness/codex/codex-observe-usage.d.ts.map +1 -0
  417. package/dist/harness/codex/codex-observe-usage.js +215 -0
  418. package/dist/harness/codex/codex-observe-usage.js.map +1 -0
  419. package/dist/harness/codex/codex-prompt.d.ts +17 -0
  420. package/dist/harness/codex/codex-prompt.d.ts.map +1 -0
  421. package/dist/harness/codex/codex-prompt.js +43 -0
  422. package/dist/harness/codex/codex-prompt.js.map +1 -0
  423. package/dist/harness/codex/codex-stream.d.ts +23 -0
  424. package/dist/harness/codex/codex-stream.d.ts.map +1 -0
  425. package/dist/harness/codex/codex-stream.js +182 -0
  426. package/dist/harness/codex/codex-stream.js.map +1 -0
  427. package/dist/harness/codex/codex-usage.d.ts +26 -0
  428. package/dist/harness/codex/codex-usage.d.ts.map +1 -0
  429. package/dist/harness/codex/codex-usage.js +122 -0
  430. package/dist/harness/codex/codex-usage.js.map +1 -0
  431. package/dist/harness/codex/codex.d.ts +16 -0
  432. package/dist/harness/codex/codex.d.ts.map +1 -0
  433. package/dist/harness/codex/codex.js +92 -0
  434. package/dist/harness/codex/codex.js.map +1 -0
  435. package/dist/harness/index.d.ts +11 -2
  436. package/dist/harness/index.d.ts.map +1 -1
  437. package/dist/harness/index.js +24 -9
  438. package/dist/harness/index.js.map +1 -1
  439. package/dist/harness/mock.d.ts +5 -2
  440. package/dist/harness/mock.d.ts.map +1 -1
  441. package/dist/harness/mock.js +10 -11
  442. package/dist/harness/mock.js.map +1 -1
  443. package/dist/harness/opencode/opencode-observe-usage.d.ts +4 -0
  444. package/dist/harness/opencode/opencode-observe-usage.d.ts.map +1 -0
  445. package/dist/harness/opencode/opencode-observe-usage.js +100 -0
  446. package/dist/harness/opencode/opencode-observe-usage.js.map +1 -0
  447. package/dist/harness/opencode/opencode-usage.d.ts +24 -0
  448. package/dist/harness/opencode/opencode-usage.d.ts.map +1 -0
  449. package/dist/harness/opencode/opencode-usage.js +181 -0
  450. package/dist/harness/opencode/opencode-usage.js.map +1 -0
  451. package/dist/harness/{opencode.d.ts → opencode/opencode.d.ts} +10 -7
  452. package/dist/harness/opencode/opencode.d.ts.map +1 -0
  453. package/dist/harness/{opencode.js → opencode/opencode.js} +159 -70
  454. package/dist/harness/opencode/opencode.js.map +1 -0
  455. package/dist/harness/pi/pi-args.d.ts +9 -0
  456. package/dist/harness/pi/pi-args.d.ts.map +1 -0
  457. package/dist/harness/pi/pi-args.js +33 -0
  458. package/dist/harness/pi/pi-args.js.map +1 -0
  459. package/dist/harness/pi/pi-stream.d.ts +27 -0
  460. package/dist/harness/pi/pi-stream.d.ts.map +1 -0
  461. package/dist/harness/pi/pi-stream.js +176 -0
  462. package/dist/harness/pi/pi-stream.js.map +1 -0
  463. package/dist/harness/pi/pi-tools.d.ts +5 -0
  464. package/dist/harness/pi/pi-tools.d.ts.map +1 -0
  465. package/dist/harness/pi/pi-tools.js +31 -0
  466. package/dist/harness/pi/pi-tools.js.map +1 -0
  467. package/dist/harness/pi/pi.d.ts +11 -0
  468. package/dist/harness/pi/pi.d.ts.map +1 -0
  469. package/dist/harness/pi/pi.js +109 -0
  470. package/dist/harness/pi/pi.js.map +1 -0
  471. package/dist/harness/prompt.d.ts +11 -0
  472. package/dist/harness/prompt.d.ts.map +1 -0
  473. package/dist/harness/prompt.js +105 -0
  474. package/dist/harness/prompt.js.map +1 -0
  475. package/dist/harness/types.d.ts +287 -8
  476. package/dist/harness/types.d.ts.map +1 -1
  477. package/dist/harness/types.js +125 -0
  478. package/dist/harness/types.js.map +1 -1
  479. package/dist/index.d.ts +13 -2
  480. package/dist/index.d.ts.map +1 -1
  481. package/dist/index.js +8 -1
  482. package/dist/index.js.map +1 -1
  483. package/dist/watcher/archive-verify.d.ts +9 -0
  484. package/dist/watcher/archive-verify.d.ts.map +1 -0
  485. package/dist/watcher/archive-verify.js +80 -0
  486. package/dist/watcher/archive-verify.js.map +1 -0
  487. package/dist/watcher/archiver.d.ts +14 -2
  488. package/dist/watcher/archiver.d.ts.map +1 -1
  489. package/dist/watcher/archiver.js +112 -33
  490. package/dist/watcher/archiver.js.map +1 -1
  491. package/dist/watcher/attempt.d.ts +19 -0
  492. package/dist/watcher/attempt.d.ts.map +1 -0
  493. package/dist/watcher/attempt.js +94 -0
  494. package/dist/watcher/attempt.js.map +1 -0
  495. package/dist/watcher/auto-retry.d.ts +11 -0
  496. package/dist/watcher/auto-retry.d.ts.map +1 -0
  497. package/dist/watcher/auto-retry.js +180 -0
  498. package/dist/watcher/auto-retry.js.map +1 -0
  499. package/dist/watcher/build.d.ts +24 -0
  500. package/dist/watcher/build.d.ts.map +1 -0
  501. package/dist/watcher/build.js +169 -0
  502. package/dist/watcher/build.js.map +1 -0
  503. package/dist/watcher/change-verify.d.ts +25 -0
  504. package/dist/watcher/change-verify.d.ts.map +1 -0
  505. package/dist/watcher/change-verify.js +57 -0
  506. package/dist/watcher/change-verify.js.map +1 -0
  507. package/dist/watcher/dev.d.ts +51 -0
  508. package/dist/watcher/dev.d.ts.map +1 -0
  509. package/dist/watcher/dev.js +124 -0
  510. package/dist/watcher/dev.js.map +1 -0
  511. package/dist/watcher/failure-reason.d.ts +7 -0
  512. package/dist/watcher/failure-reason.d.ts.map +1 -0
  513. package/dist/watcher/failure-reason.js +2 -0
  514. package/dist/watcher/failure-reason.js.map +1 -0
  515. package/dist/watcher/fingerprint.d.ts +19 -0
  516. package/dist/watcher/fingerprint.d.ts.map +1 -0
  517. package/dist/watcher/fingerprint.js +53 -0
  518. package/dist/watcher/fingerprint.js.map +1 -0
  519. package/dist/watcher/heartbeat.d.ts +33 -0
  520. package/dist/watcher/heartbeat.d.ts.map +1 -0
  521. package/dist/watcher/heartbeat.js +135 -0
  522. package/dist/watcher/heartbeat.js.map +1 -0
  523. package/dist/watcher/lock.d.ts +10 -0
  524. package/dist/watcher/lock.d.ts.map +1 -0
  525. package/dist/watcher/lock.js +14 -0
  526. package/dist/watcher/lock.js.map +1 -0
  527. package/dist/watcher/loop.d.ts +26 -6
  528. package/dist/watcher/loop.d.ts.map +1 -1
  529. package/dist/watcher/loop.js +154 -37
  530. package/dist/watcher/loop.js.map +1 -1
  531. package/dist/watcher/measures.d.ts +46 -0
  532. package/dist/watcher/measures.d.ts.map +1 -0
  533. package/dist/watcher/measures.js +203 -0
  534. package/dist/watcher/measures.js.map +1 -0
  535. package/dist/watcher/outcome.d.ts +32 -0
  536. package/dist/watcher/outcome.d.ts.map +1 -0
  537. package/dist/watcher/outcome.js +127 -0
  538. package/dist/watcher/outcome.js.map +1 -0
  539. package/dist/watcher/regression.d.ts +43 -0
  540. package/dist/watcher/regression.d.ts.map +1 -0
  541. package/dist/watcher/regression.js +175 -0
  542. package/dist/watcher/regression.js.map +1 -0
  543. package/dist/watcher/runner.d.ts +6 -68
  544. package/dist/watcher/runner.d.ts.map +1 -1
  545. package/dist/watcher/runner.js +74 -523
  546. package/dist/watcher/runner.js.map +1 -1
  547. package/dist/watcher/spawn.d.ts +48 -0
  548. package/dist/watcher/spawn.d.ts.map +1 -0
  549. package/dist/watcher/spawn.js +130 -0
  550. package/dist/watcher/spawn.js.map +1 -0
  551. package/dist/watcher/task-verify.d.ts +59 -0
  552. package/dist/watcher/task-verify.d.ts.map +1 -0
  553. package/dist/watcher/task-verify.js +108 -0
  554. package/dist/watcher/task-verify.js.map +1 -0
  555. package/dist/watcher/verify.d.ts +44 -0
  556. package/dist/watcher/verify.d.ts.map +1 -0
  557. package/dist/watcher/verify.js +156 -0
  558. package/dist/watcher/verify.js.map +1 -0
  559. package/package.json +21 -9
  560. package/templates/PLANNER.md +77 -0
  561. package/templates/openspec/config.yaml +24 -0
  562. package/templates/openspec/schemas/osq/README.md +30 -0
  563. package/templates/openspec/schemas/osq/schema.yaml +133 -0
  564. package/templates/openspec/schemas/osq/templates/proposal.md +66 -0
  565. package/templates/openspec/schemas/osq/templates/spec.md +13 -0
  566. package/templates/openspec/schemas/osq/templates/tasks.md +11 -0
  567. package/templates/proposal.md +66 -0
  568. package/templates/tasks.md +5 -0
  569. package/ui/dist/assets/index-CZYeQ8la.js +9 -0
  570. package/ui/dist/assets/index-D6zVSjO7.css +1 -0
  571. package/ui/dist/index.html +14 -0
  572. package/dist/core/approve.d.ts +0 -11
  573. package/dist/core/approve.d.ts.map +0 -1
  574. package/dist/core/approve.js +0 -52
  575. package/dist/core/approve.js.map +0 -1
  576. package/dist/core/config.d.ts.map +0 -1
  577. package/dist/core/config.js.map +0 -1
  578. package/dist/core/hasher.d.ts +0 -4
  579. package/dist/core/hasher.d.ts.map +0 -1
  580. package/dist/core/hasher.js.map +0 -1
  581. package/dist/core/init.d.ts +0 -12
  582. package/dist/core/init.d.ts.map +0 -1
  583. package/dist/core/init.js +0 -151
  584. package/dist/core/init.js.map +0 -1
  585. package/dist/core/linter.d.ts +0 -8
  586. package/dist/core/linter.d.ts.map +0 -1
  587. package/dist/core/linter.js +0 -100
  588. package/dist/core/linter.js.map +0 -1
  589. package/dist/core/lock.d.ts.map +0 -1
  590. package/dist/core/lock.js.map +0 -1
  591. package/dist/core/logger.d.ts.map +0 -1
  592. package/dist/core/logger.js.map +0 -1
  593. package/dist/core/new.d.ts.map +0 -1
  594. package/dist/core/new.js +0 -79
  595. package/dist/core/new.js.map +0 -1
  596. package/dist/core/parser.d.ts +0 -32
  597. package/dist/core/parser.d.ts.map +0 -1
  598. package/dist/core/parser.js +0 -87
  599. package/dist/core/parser.js.map +0 -1
  600. package/dist/core/report.d.ts +0 -54
  601. package/dist/core/report.d.ts.map +0 -1
  602. package/dist/core/report.js +0 -475
  603. package/dist/core/report.js.map +0 -1
  604. package/dist/core/show.d.ts +0 -50
  605. package/dist/core/show.d.ts.map +0 -1
  606. package/dist/core/show.js +0 -374
  607. package/dist/core/show.js.map +0 -1
  608. package/dist/core/state.d.ts +0 -25
  609. package/dist/core/state.d.ts.map +0 -1
  610. package/dist/core/state.js +0 -180
  611. package/dist/core/state.js.map +0 -1
  612. package/dist/core/status.d.ts +0 -10
  613. package/dist/core/status.d.ts.map +0 -1
  614. package/dist/core/status.js +0 -106
  615. package/dist/core/status.js.map +0 -1
  616. package/dist/harness/agy.d.ts.map +0 -1
  617. package/dist/harness/agy.js.map +0 -1
  618. package/dist/harness/opencode.d.ts.map +0 -1
  619. package/dist/harness/opencode.js.map +0 -1
@@ -0,0 +1,62 @@
1
+ import { type OsqConfig } from '../foundation/config.js';
2
+ import type { QueueItem } from './queue-parser.js';
3
+ import { type QueueRow } from './queue-state.js';
4
+ export interface LandedDependency {
5
+ readonly slug: string;
6
+ readonly changeId: string;
7
+ readonly archivePath: string;
8
+ }
9
+ export interface QueuePlanSelection {
10
+ readonly item: QueueItem;
11
+ readonly row: QueueRow;
12
+ readonly replan: boolean;
13
+ readonly landedDependencies: readonly LandedDependency[];
14
+ }
15
+ export type QueuePlanPreparation = {
16
+ readonly kind: 'ready';
17
+ readonly selection: QueuePlanSelection;
18
+ readonly notice?: string;
19
+ } | {
20
+ readonly kind: 'refused';
21
+ readonly message: string;
22
+ };
23
+ /** Recorded queue planning spend across every associated change. */
24
+ export interface QueuePlanningUsage {
25
+ /** Number of valid `plan_started` records (each counted once). */
26
+ readonly sessions: number;
27
+ /** Sum of finite recorded cost from singly correlated exits. */
28
+ readonly cost: number;
29
+ /** True only when every counted start has one exit with a finite cost. */
30
+ readonly costCoverageComplete: boolean;
31
+ }
32
+ export type QueueBudgetEvaluation = {
33
+ readonly kind: 'ok';
34
+ readonly notice?: string;
35
+ } | {
36
+ readonly kind: 'refused';
37
+ readonly message: string;
38
+ };
39
+ /**
40
+ * Read the planning spend of every queue-associated change across active,
41
+ * archived, and rejected locations, including retained attempts whose slug is
42
+ * no longer in the current queue. Malformed records and non-queue changes
43
+ * contribute nothing.
44
+ */
45
+ export declare function readQueuePlanningUsage(projectRoot: string, config?: OsqConfig): Promise<QueuePlanningUsage>;
46
+ /**
47
+ * Apply the queue spend gates to a read-only usage aggregate. The session gate
48
+ * is always enforced; the cost gate is enforced only when coverage is complete.
49
+ * Incomplete coverage yields one factual note and leaves the cost gate off.
50
+ */
51
+ export declare function evaluateQueueBudget(config: OsqConfig, usage: QueuePlanningUsage): QueueBudgetEvaluation;
52
+ /**
53
+ * Read-only next-item preparation: halt on any active failure, then select the
54
+ * first unplanned or rejected item whose queue dependencies are landed. A
55
+ * rejected first eligible item refuses unless `replan` is set. Nothing is
56
+ * written here.
57
+ */
58
+ export declare function prepareQueuePlan(projectRoot: string, config?: OsqConfig, options?: {
59
+ replan?: boolean;
60
+ enforceBudget?: boolean;
61
+ }): Promise<QueuePlanPreparation>;
62
+ //# sourceMappingURL=queue-planning.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-planning.d.ts","sourceRoot":"","sources":["../../../src/core/status/queue-planning.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzE,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AACnD,OAAO,EACL,KAAK,QAAQ,EAKd,MAAM,kBAAkB,CAAC;AAE1B,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;CAC9B;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IACzB,QAAQ,CAAC,GAAG,EAAE,QAAQ,CAAC;IACvB,QAAQ,CAAC,MAAM,EAAE,OAAO,CAAC;IACzB,QAAQ,CAAC,kBAAkB,EAAE,SAAS,gBAAgB,EAAE,CAAC;CAC1D;AAED,MAAM,MAAM,oBAAoB,GAC5B;IAAE,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,SAAS,EAAE,kBAAkB,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5F;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3D,oEAAoE;AACpE,MAAM,WAAW,kBAAkB;IACjC,kEAAkE;IAClE,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,gEAAgE;IAChE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,0EAA0E;IAC1E,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACxC;AAED,MAAM,MAAM,qBAAqB,GAC7B;IAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC;IAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,GACjD;IAAE,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC;IAAC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAkC3D;;;;;GAKG;AACH,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,kBAAkB,CAAC,CAiB7B;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,kBAAkB,GACxB,qBAAqB,CA+BvB;AAYD;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,EAClC,OAAO,GAAE;IAAE,MAAM,CAAC,EAAE,OAAO,CAAC;IAAC,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GAC1D,OAAO,CAAC,oBAAoB,CAAC,CAwD/B"}
@@ -0,0 +1,158 @@
1
+ import path from 'node:path';
2
+ import { DEFAULT_CONFIG } from '../foundation/config.js';
3
+ import { readPlanRecords } from '../report/planning.js';
4
+ import { findActiveQueueFailures, readQueueState, scanQueueAssociations, } from './queue-state.js';
5
+ const QUEUE_BUDGET_REQUIRED = 'Non-print `plan --next` requires queue.maxPlanningSessions and queue.maxPlanningCost in osq.config.ts.';
6
+ /** Correlate one change's planning records into start counts and finite cost. */
7
+ function aggregatePlanUsage(records) {
8
+ const starts = new Map();
9
+ const exits = new Map();
10
+ for (const record of records) {
11
+ if (record.type === 'plan_started') {
12
+ starts.set(record.sessionId, (starts.get(record.sessionId) ?? 0) + 1);
13
+ }
14
+ else {
15
+ const costs = exits.get(record.sessionId) ?? [];
16
+ costs.push(record.data.usage.cost);
17
+ exits.set(record.sessionId, costs);
18
+ }
19
+ }
20
+ let sessions = 0;
21
+ let cost = 0;
22
+ let complete = true;
23
+ for (const [sessionId, startCount] of starts) {
24
+ // Count every valid start once; malformed duplicates do not shift the count.
25
+ sessions += startCount;
26
+ const matched = exits.get(sessionId) ?? [];
27
+ if (startCount !== 1 || matched.length !== 1 || matched[0] === null) {
28
+ complete = false;
29
+ continue;
30
+ }
31
+ cost += matched[0];
32
+ }
33
+ return { sessions, cost, costCoverageComplete: complete };
34
+ }
35
+ /**
36
+ * Read the planning spend of every queue-associated change across active,
37
+ * archived, and rejected locations, including retained attempts whose slug is
38
+ * no longer in the current queue. Malformed records and non-queue changes
39
+ * contribute nothing.
40
+ */
41
+ export async function readQueuePlanningUsage(projectRoot, config = DEFAULT_CONFIG) {
42
+ const groups = await scanQueueAssociations(projectRoot, config, null);
43
+ const visited = new Set();
44
+ let sessions = 0;
45
+ let cost = 0;
46
+ let complete = true;
47
+ for (const group of groups.values()) {
48
+ for (const assoc of [...group.active, ...group.archived, ...group.rejected]) {
49
+ if (visited.has(assoc.folderPath))
50
+ continue;
51
+ visited.add(assoc.folderPath);
52
+ const aggregate = aggregatePlanUsage(await readPlanRecords(assoc.folderPath));
53
+ sessions += aggregate.sessions;
54
+ cost += aggregate.cost;
55
+ complete = complete && aggregate.costCoverageComplete;
56
+ }
57
+ }
58
+ return { sessions, cost, costCoverageComplete: complete };
59
+ }
60
+ /**
61
+ * Apply the queue spend gates to a read-only usage aggregate. The session gate
62
+ * is always enforced; the cost gate is enforced only when coverage is complete.
63
+ * Incomplete coverage yields one factual note and leaves the cost gate off.
64
+ */
65
+ export function evaluateQueueBudget(config, usage) {
66
+ const queue = config.queue;
67
+ if (!queue ||
68
+ !Number.isFinite(queue.maxPlanningSessions) ||
69
+ !Number.isFinite(queue.maxPlanningCost) ||
70
+ queue.maxPlanningSessions < 0 ||
71
+ queue.maxPlanningCost < 0) {
72
+ return { kind: 'refused', message: QUEUE_BUDGET_REQUIRED };
73
+ }
74
+ if (usage.sessions + 1 > queue.maxPlanningSessions) {
75
+ return {
76
+ kind: 'refused',
77
+ message: `Queue planning session limit reached: ${usage.sessions} recorded session(s) against a maximum of ${queue.maxPlanningSessions}; launching another planner would exceed it.`,
78
+ };
79
+ }
80
+ if (usage.costCoverageComplete && usage.cost >= queue.maxPlanningCost) {
81
+ return {
82
+ kind: 'refused',
83
+ message: `Queue planning cost limit reached: recorded cost ${usage.cost} has reached the maximum of ${queue.maxPlanningCost}.`,
84
+ };
85
+ }
86
+ if (!usage.costCoverageComplete) {
87
+ return {
88
+ kind: 'ok',
89
+ notice: 'Recorded planning cost coverage is incomplete, so the queue cost ceiling is not enforced.',
90
+ };
91
+ }
92
+ return { kind: 'ok' };
93
+ }
94
+ function summarizeRows(rows) {
95
+ return rows
96
+ .map((row) => {
97
+ const waiting = row.unmetDependencies.length > 0 ? ` (waiting on ${row.unmetDependencies.join(', ')})` : '';
98
+ return ` - ${row.slug}: ${row.state}${waiting}`;
99
+ })
100
+ .join('\n');
101
+ }
102
+ /**
103
+ * Read-only next-item preparation: halt on any active failure, then select the
104
+ * first unplanned or rejected item whose queue dependencies are landed. A
105
+ * rejected first eligible item refuses unless `replan` is set. Nothing is
106
+ * written here.
107
+ */
108
+ export async function prepareQueuePlan(projectRoot, config = DEFAULT_CONFIG, options = {}) {
109
+ const failures = await findActiveQueueFailures(projectRoot, config);
110
+ if (failures.length > 0) {
111
+ const lines = failures.map((f) => ` - ${f.changeId} ${f.target} (${f.reason}): ${f.retryCommand}`);
112
+ return {
113
+ kind: 'refused',
114
+ message: `Queue planning is blocked by active failures:\n${lines.join('\n')}`,
115
+ };
116
+ }
117
+ const state = await readQueueState(projectRoot, config);
118
+ const { items, groups, rows } = state;
119
+ const index = rows.findIndex((row) => (row.state === 'unplanned' || row.state === 'rejected') && row.unmetDependencies.length === 0);
120
+ if (index === -1) {
121
+ return {
122
+ kind: 'refused',
123
+ message: `No queue item is eligible to plan.\n${summarizeRows(rows)}`,
124
+ };
125
+ }
126
+ const row = rows[index];
127
+ if (row.state === 'rejected' && !options.replan) {
128
+ return {
129
+ kind: 'refused',
130
+ message: `Queue item "${row.slug}" has ${row.rejectionCount} rejected attempt(s) and no active plan. Re-run with --replan to create a new attempt.`,
131
+ };
132
+ }
133
+ let notice;
134
+ if (options.enforceBudget) {
135
+ const evaluation = evaluateQueueBudget(config, await readQueuePlanningUsage(projectRoot, config));
136
+ if (evaluation.kind === 'refused')
137
+ return { kind: 'refused', message: evaluation.message };
138
+ notice = evaluation.notice;
139
+ }
140
+ const item = items[index];
141
+ const landedDependencies = [];
142
+ for (const dep of item.dependsOn) {
143
+ const archived = groups.get(dep)?.archived ?? [];
144
+ if (archived.length === 1) {
145
+ landedDependencies.push({
146
+ slug: dep,
147
+ changeId: archived[0].id,
148
+ archivePath: path.relative(projectRoot, archived[0].folderPath),
149
+ });
150
+ }
151
+ }
152
+ return {
153
+ kind: 'ready',
154
+ selection: { item, row, replan: row.state === 'rejected', landedDependencies },
155
+ ...(notice ? { notice } : {}),
156
+ };
157
+ }
158
+ //# sourceMappingURL=queue-planning.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-planning.js","sourceRoot":"","sources":["../../../src/core/status/queue-planning.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { OsqConfig } from '../foundation/config.js';
2
+ import type { QueueActiveFailure, QueueAssociationGroups, QueueItemState, QueueRow } from './queue.js';
3
+ /** The queue-specific spend aggregate carried in the delivery report. */
4
+ export interface QueueReportPlanning {
5
+ readonly sessions: number;
6
+ readonly cost: number;
7
+ readonly costCoverageComplete: boolean;
8
+ }
9
+ /** One current queue item with its derived state and nullable planned-to-landed time. */
10
+ export interface QueueReportItem {
11
+ readonly slug: string;
12
+ readonly title: string;
13
+ readonly state: QueueItemState;
14
+ readonly change: string | null;
15
+ readonly rejectionCount: number;
16
+ readonly changedSincePlanned: boolean;
17
+ readonly plannedToLandedSeconds: number | null;
18
+ }
19
+ /** One active dead or regressed target associated with the queue. */
20
+ export interface QueueReportFailure {
21
+ readonly change: string;
22
+ readonly target: string;
23
+ readonly reason: string;
24
+ }
25
+ /** One retained rejected queue attempt, preserved per folder. */
26
+ export interface QueueReportRejection {
27
+ readonly slug: string;
28
+ readonly change: string;
29
+ readonly reason: string;
30
+ readonly timestamp: string | null;
31
+ }
32
+ /** The stable top-level queue view of the delivery report. */
33
+ export interface QueueReport {
34
+ readonly configured: boolean;
35
+ readonly landed: number;
36
+ readonly total: number;
37
+ readonly planning: QueueReportPlanning;
38
+ readonly items: readonly QueueReportItem[];
39
+ readonly failures: readonly QueueReportFailure[];
40
+ readonly rejections: readonly QueueReportRejection[];
41
+ }
42
+ /** Deterministic empty projection used when no queue file is configured. */
43
+ export declare function emptyQueueReport(): QueueReport;
44
+ /** Project one derived queue row, deriving elapsed time only for a landed association. */
45
+ export declare function readQueueReportItem(row: QueueRow, groups: QueueAssociationGroups | undefined): Promise<QueueReportItem>;
46
+ /** Enrich one active failure with its canonical marker reason. */
47
+ export declare function readQueueReportFailure(projectRoot: string, config: OsqConfig, failure: QueueActiveFailure): Promise<QueueReportFailure>;
48
+ /** One retained rejection row per rejected queue attempt, sorted by numeric change. */
49
+ export declare function readQueueReportRejections(associations: ReadonlyMap<string, QueueAssociationGroups>): Promise<QueueReportRejection[]>;
50
+ //# sourceMappingURL=queue-report-detail.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-report-detail.d.ts","sourceRoot":"","sources":["../../../src/core/status/queue-report-detail.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AASzD,OAAO,KAAK,EACV,kBAAkB,EAClB,sBAAsB,EACtB,cAAc,EACd,QAAQ,EACT,MAAM,YAAY,CAAC;AAGpB,yEAAyE;AACzE,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;CACxC;AAED,yFAAyF;AACzF,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,sBAAsB,EAAE,MAAM,GAAG,IAAI,CAAC;CAChD;AAED,qEAAqE;AACrE,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,iEAAiE;AACjE,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,8DAA8D;AAC9D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,mBAAmB,CAAC;IACvC,QAAQ,CAAC,KAAK,EAAE,SAAS,eAAe,EAAE,CAAC;IAC3C,QAAQ,CAAC,QAAQ,EAAE,SAAS,kBAAkB,EAAE,CAAC;IACjD,QAAQ,CAAC,UAAU,EAAE,SAAS,oBAAoB,EAAE,CAAC;CACtD;AAID,4EAA4E;AAC5E,wBAAgB,gBAAgB,IAAI,WAAW,CAU9C;AAsDD,0FAA0F;AAC1F,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,QAAQ,EACb,MAAM,EAAE,sBAAsB,GAAG,SAAS,GACzC,OAAO,CAAC,eAAe,CAAC,CAiB1B;AAUD,kEAAkE;AAClE,wBAAsB,sBAAsB,CAC1C,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,kBAAkB,GAC1B,OAAO,CAAC,kBAAkB,CAAC,CAiB7B;AAED,uFAAuF;AACvF,wBAAsB,yBAAyB,CAC7C,YAAY,EAAE,WAAW,CAAC,MAAM,EAAE,sBAAsB,CAAC,GACxD,OAAO,CAAC,oBAAoB,EAAE,CAAC,CAoBjC"}
@@ -0,0 +1,140 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { readPlanRecords } from '../report/planning.js';
4
+ import { parseFrontmatter } from '../spec/parser.js';
5
+ import { getChangesDir, getDeadMarkerPath, getRegressedMarkerPath, getRejectedMarkerPath, } from './layout.js';
6
+ import { compareNumericPrefix } from './state.js';
7
+ const UNAVAILABLE = 'unavailable';
8
+ /** Deterministic empty projection used when no queue file is configured. */
9
+ export function emptyQueueReport() {
10
+ return {
11
+ configured: false,
12
+ landed: 0,
13
+ total: 0,
14
+ planning: { sessions: 0, cost: 0, costCoverageComplete: false },
15
+ items: [],
16
+ failures: [],
17
+ rejections: [],
18
+ };
19
+ }
20
+ function finiteTimestamp(value) {
21
+ if (typeof value !== 'string')
22
+ return null;
23
+ const ms = Date.parse(value);
24
+ return Number.isFinite(ms) ? ms : null;
25
+ }
26
+ /** Rounded non-negative seconds between two endpoints, or null when missing or reversed. */
27
+ function elapsedSeconds(startMs, endMs) {
28
+ if (startMs === null || endMs === null || endMs < startMs)
29
+ return null;
30
+ return Math.round((endMs - startMs) / 1000);
31
+ }
32
+ /** Earliest valid `plan_started` timestamp across every attempt for one item. */
33
+ async function earliestPlanStartMs(groups) {
34
+ if (!groups)
35
+ return null;
36
+ let earliest = null;
37
+ for (const assoc of [...groups.active, ...groups.archived, ...groups.rejected]) {
38
+ for (const record of await readPlanRecords(assoc.folderPath)) {
39
+ if (record.type !== 'plan_started')
40
+ continue;
41
+ const ms = finiteTimestamp(record.timestamp);
42
+ if (ms !== null && (earliest === null || ms < earliest))
43
+ earliest = ms;
44
+ }
45
+ }
46
+ return earliest;
47
+ }
48
+ /** Timestamp of the first valid typed `archived` event in a change-level stream. */
49
+ async function archivedEventMs(folderPath) {
50
+ const content = await fs
51
+ .readFile(path.join(folderPath, '.run', 'events', 'change.jsonl'), 'utf8')
52
+ .catch(() => null);
53
+ if (content === null)
54
+ return null;
55
+ for (const line of content.split('\n')) {
56
+ const trimmed = line.trim();
57
+ if (!trimmed)
58
+ continue;
59
+ let parsed;
60
+ try {
61
+ parsed = JSON.parse(trimmed);
62
+ }
63
+ catch {
64
+ continue;
65
+ }
66
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
67
+ continue;
68
+ const event = parsed;
69
+ if (event.type !== 'archived')
70
+ continue;
71
+ const ms = finiteTimestamp(event.timestamp);
72
+ if (ms !== null)
73
+ return ms;
74
+ }
75
+ return null;
76
+ }
77
+ /** Project one derived queue row, deriving elapsed time only for a landed association. */
78
+ export async function readQueueReportItem(row, groups) {
79
+ let plannedToLandedSeconds = null;
80
+ if (row.state === 'landed' && groups?.archived.length === 1) {
81
+ plannedToLandedSeconds = elapsedSeconds(await earliestPlanStartMs(groups), await archivedEventMs(groups.archived[0].folderPath));
82
+ }
83
+ return {
84
+ slug: row.slug,
85
+ title: row.title,
86
+ state: row.state,
87
+ change: row.changeId,
88
+ rejectionCount: row.rejectionCount,
89
+ changedSincePlanned: row.changedSincePlanned,
90
+ plannedToLandedSeconds,
91
+ };
92
+ }
93
+ /** Non-empty `reason` frontmatter from a marker, or null when absent or malformed. */
94
+ async function markerReason(markerPath) {
95
+ const content = await fs.readFile(markerPath, 'utf8').catch(() => null);
96
+ if (content === null)
97
+ return null;
98
+ const value = parseFrontmatter(content).data.reason;
99
+ return typeof value === 'string' && value.trim() ? value.trim() : null;
100
+ }
101
+ /** Enrich one active failure with its canonical marker reason. */
102
+ export async function readQueueReportFailure(projectRoot, config, failure) {
103
+ const folderPath = path.join(getChangesDir(config.paths.openspecRoot, projectRoot), failure.folderName);
104
+ const candidates = failure.target === 'change'
105
+ ? [getRegressedMarkerPath(folderPath, 'change')]
106
+ : [
107
+ getRegressedMarkerPath(folderPath, failure.target),
108
+ getDeadMarkerPath(folderPath, failure.target),
109
+ ];
110
+ for (const candidate of candidates) {
111
+ const reason = await markerReason(candidate);
112
+ if (reason !== null)
113
+ return { change: failure.changeId, target: failure.target, reason };
114
+ }
115
+ return { change: failure.changeId, target: failure.target, reason: UNAVAILABLE };
116
+ }
117
+ /** One retained rejection row per rejected queue attempt, sorted by numeric change. */
118
+ export async function readQueueReportRejections(associations) {
119
+ const rows = [];
120
+ for (const [slug, groups] of associations) {
121
+ for (const assoc of groups.rejected) {
122
+ const content = await fs
123
+ .readFile(getRejectedMarkerPath(assoc.folderPath), 'utf8')
124
+ .catch(() => null);
125
+ let reason = UNAVAILABLE;
126
+ let timestamp = null;
127
+ if (content !== null) {
128
+ const data = parseFrontmatter(content).data;
129
+ if (typeof data.reason === 'string' && data.reason.trim())
130
+ reason = data.reason.trim();
131
+ if (typeof data.timestamp === 'string' && data.timestamp.trim()) {
132
+ timestamp = data.timestamp.trim();
133
+ }
134
+ }
135
+ rows.push({ slug, change: assoc.folderName, reason, timestamp });
136
+ }
137
+ }
138
+ return rows.sort((a, b) => compareNumericPrefix(a.change, b.change));
139
+ }
140
+ //# sourceMappingURL=queue-report-detail.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-report-detail.js","sourceRoot":"","sources":["../../../src/core/status/queue-report-detail.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ import { type OsqConfig } from '../foundation/config.js';
2
+ import { type QueueReport } from './queue-report-detail.js';
3
+ export type { QueueReport, QueueReportFailure, QueueReportItem, QueueReportPlanning, QueueReportRejection, } from './queue-report-detail.js';
4
+ /**
5
+ * Read the stable queue view for the delivery report.
6
+ *
7
+ * A missing queue file yields the deterministic unconfigured empty view so
8
+ * ordinary repositories never depend on a queue. Once the file exists, queue
9
+ * parse errors and ambiguous associations propagate unchanged. The projection
10
+ * reuses the established queue facade for state, failures, and spend, and adds
11
+ * report-only rejection and elapsed-time derivation.
12
+ */
13
+ export declare function readQueueReport(projectRoot: string, config?: OsqConfig): Promise<QueueReport>;
14
+ //# sourceMappingURL=queue-report.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-report.d.ts","sourceRoot":"","sources":["../../../src/core/status/queue-report.ts"],"names":[],"mappings":"AACA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzE,OAAO,EACL,KAAK,WAAW,EAKjB,MAAM,0BAA0B,CAAC;AASlC,YAAY,EACV,WAAW,EACX,kBAAkB,EAClB,eAAe,EACf,mBAAmB,EACnB,oBAAoB,GACrB,MAAM,0BAA0B,CAAC;AASlC;;;;;;;;GAQG;AACH,wBAAsB,eAAe,CACnC,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,WAAW,CAAC,CA6BtB"}
@@ -0,0 +1,41 @@
1
+ import fs from 'node:fs/promises';
2
+ import { DEFAULT_CONFIG } from '../foundation/config.js';
3
+ import { emptyQueueReport, readQueueReportFailure, readQueueReportItem, readQueueReportRejections, } from './queue-report-detail.js';
4
+ import { findActiveQueueFailures, getQueuePath, projectQueue, readQueuePlanningUsage, scanQueueAssociations, } from './queue.js';
5
+ async function fileExists(filePath) {
6
+ return fs.stat(filePath).then(() => true, () => false);
7
+ }
8
+ /**
9
+ * Read the stable queue view for the delivery report.
10
+ *
11
+ * A missing queue file yields the deterministic unconfigured empty view so
12
+ * ordinary repositories never depend on a queue. Once the file exists, queue
13
+ * parse errors and ambiguous associations propagate unchanged. The projection
14
+ * reuses the established queue facade for state, failures, and spend, and adds
15
+ * report-only rejection and elapsed-time derivation.
16
+ */
17
+ export async function readQueueReport(projectRoot, config = DEFAULT_CONFIG) {
18
+ if (!(await fileExists(getQueuePath(projectRoot, config))))
19
+ return emptyQueueReport();
20
+ const projection = await projectQueue(projectRoot, config);
21
+ const associations = await scanQueueAssociations(projectRoot, config, null);
22
+ const usage = await readQueuePlanningUsage(projectRoot, config);
23
+ const failures = await findActiveQueueFailures(projectRoot, config);
24
+ const items = await Promise.all(projection.items.map((row) => readQueueReportItem(row, associations.get(row.slug))));
25
+ const failureRows = await Promise.all(failures.map((failure) => readQueueReportFailure(projectRoot, config, failure)));
26
+ const rejections = await readQueueReportRejections(associations);
27
+ return {
28
+ configured: true,
29
+ landed: projection.landedCount,
30
+ total: projection.totalCount,
31
+ planning: {
32
+ sessions: usage.sessions,
33
+ cost: usage.cost,
34
+ costCoverageComplete: usage.costCoverageComplete,
35
+ },
36
+ items,
37
+ failures: failureRows,
38
+ rejections,
39
+ };
40
+ }
41
+ //# sourceMappingURL=queue-report.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-report.js","sourceRoot":"","sources":["../../../src/core/status/queue-report.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,kBAAkB,CAAC;AAClC,OAAO,EAAE,cAAc,EAAkB,MAAM,yBAAyB,CAAC;AACzE,OAAO,EAEL,gBAAgB,EAChB,sBAAsB,EACtB,mBAAmB,EACnB,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EACL,uBAAuB,EACvB,YAAY,EACZ,YAAY,EACZ,sBAAsB,EACtB,qBAAqB,GACtB,MAAM,YAAY,CAAC;AAUpB,KAAK,UAAU,UAAU,CAAC,QAAgB;IACxC,OAAO,EAAE,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAC3B,GAAG,EAAE,CAAC,IAAI,EACV,GAAG,EAAE,CAAC,KAAK,CACZ,CAAC;AACJ,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CACnC,WAAmB,EACnB,SAAoB,cAAc;IAElC,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;QAAE,OAAO,gBAAgB,EAAE,CAAC;IAEtF,MAAM,UAAU,GAAG,MAAM,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAC3D,MAAM,YAAY,GAAG,MAAM,qBAAqB,CAAC,WAAW,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;IAC5E,MAAM,KAAK,GAAG,MAAM,sBAAsB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAChE,MAAM,QAAQ,GAAG,MAAM,uBAAuB,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;IAEpE,MAAM,KAAK,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,mBAAmB,CAAC,GAAG,EAAE,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CACpF,CAAC;IACF,MAAM,WAAW,GAAG,MAAM,OAAO,CAAC,GAAG,CACnC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,sBAAsB,CAAC,WAAW,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC,CAChF,CAAC;IACF,MAAM,UAAU,GAAG,MAAM,yBAAyB,CAAC,YAAY,CAAC,CAAC;IAEjE,OAAO;QACL,UAAU,EAAE,IAAI;QAChB,MAAM,EAAE,UAAU,CAAC,WAAW;QAC9B,KAAK,EAAE,UAAU,CAAC,UAAU;QAC5B,QAAQ,EAAE;YACR,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,oBAAoB,EAAE,KAAK,CAAC,oBAAoB;SACjD;QACD,KAAK;QACL,QAAQ,EAAE,WAAW;QACrB,UAAU;KACX,CAAC;AACJ,CAAC"}
@@ -0,0 +1,53 @@
1
+ import { type OsqConfig } from '../foundation/config.js';
2
+ import { type QueueItem } from './queue-parser.js';
3
+ export type QueueItemState = 'landed' | 'dead' | 'running' | 'approved' | 'planned' | 'rejected' | 'unplanned';
4
+ export interface QueueRow {
5
+ readonly slug: string;
6
+ readonly title: string;
7
+ readonly state: QueueItemState;
8
+ readonly changeId: string | null;
9
+ readonly rejectionCount: number;
10
+ readonly changedSincePlanned: boolean;
11
+ readonly unmetDependencies: readonly string[];
12
+ }
13
+ export type QueueProjection = {
14
+ items: QueueRow[];
15
+ landedCount: number;
16
+ totalCount: number;
17
+ };
18
+ export interface QueueActiveFailure {
19
+ readonly changeId: string;
20
+ readonly folderName: string;
21
+ readonly target: string;
22
+ readonly reason: string;
23
+ readonly retryCommand: string;
24
+ }
25
+ /** One change folder associated with a queue item through `brief.md` metadata. */
26
+ export interface QueueAssociation {
27
+ readonly folderName: string;
28
+ readonly folderPath: string;
29
+ readonly id: string;
30
+ readonly queueHash: string | null;
31
+ }
32
+ export interface QueueAssociationGroups {
33
+ readonly active: QueueAssociation[];
34
+ readonly archived: QueueAssociation[];
35
+ readonly rejected: QueueAssociation[];
36
+ }
37
+ /** Internal state projection shared by queue planning and later report views. */
38
+ export interface QueueStateSnapshot {
39
+ readonly items: QueueItem[];
40
+ readonly groups: Map<string, QueueAssociationGroups>;
41
+ readonly rows: QueueRow[];
42
+ readonly landed: Set<string>;
43
+ }
44
+ /** Scan active, archived, and rejected folders for queue metadata; null keeps retired slugs. */
45
+ export declare function scanQueueAssociations(projectRoot: string, config: OsqConfig, slugs: ReadonlySet<string> | null): Promise<Map<string, QueueAssociationGroups>>;
46
+ /** Project the current queue's filesystem-derived state for planning and report views. */
47
+ export declare function readQueueState(projectRoot: string, config: OsqConfig): Promise<QueueStateSnapshot>;
48
+ /** Derive the queue projection afresh from disk on every invocation. */
49
+ export declare function projectQueue(projectRoot: string, config?: OsqConfig): Promise<QueueProjection>;
50
+ /** Active dead, regressed, and change-level queue failures in numeric order. */
51
+ export declare function findActiveQueueFailures(projectRoot: string, config?: OsqConfig): Promise<QueueActiveFailure[]>;
52
+ export declare function formatQueue(projection: QueueProjection): string;
53
+ //# sourceMappingURL=queue-state.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"queue-state.d.ts","sourceRoot":"","sources":["../../../src/core/status/queue-state.ts"],"names":[],"mappings":"AAEA,OAAO,EAAkB,KAAK,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAGzE,OAAO,EAAE,KAAK,SAAS,EAAa,MAAM,mBAAmB,CAAC;AAS9D,MAAM,MAAM,cAAc,GACtB,QAAQ,GACR,MAAM,GACN,SAAS,GACT,UAAU,GACV,SAAS,GACT,UAAU,GACV,WAAW,CAAC;AAEhB,MAAM,WAAW,QAAQ;IACvB,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,QAAQ,CAAC,KAAK,EAAE,cAAc,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,MAAM,EAAE,CAAC;CAC/C;AAED,MAAM,MAAM,eAAe,GAAG;IAAE,KAAK,EAAE,QAAQ,EAAE,CAAC;IAAC,WAAW,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAE7F,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;CAC/B;AAED,kFAAkF;AAClF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,MAAM,WAAW,sBAAsB;IACrC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC;IACpC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;IACtC,QAAQ,CAAC,QAAQ,EAAE,gBAAgB,EAAE,CAAC;CACvC;AAED,iFAAiF;AACjF,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,KAAK,EAAE,SAAS,EAAE,CAAC;IAC5B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,EAAE,QAAQ,EAAE,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC9B;AAID,gGAAgG;AAChG,wBAAsB,qBAAqB,CACzC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,EACjB,KAAK,EAAE,WAAW,CAAC,MAAM,CAAC,GAAG,IAAI,GAChC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC,CAgC9C;AA4CD,0FAA0F;AAC1F,wBAAsB,cAAc,CAClC,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,kBAAkB,CAAC,CAwB7B;AAED,wEAAwE;AACxE,wBAAsB,YAAY,CAChC,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,eAAe,CAAC,CAG1B;AAgBD,gFAAgF;AAChF,wBAAsB,uBAAuB,CAC3C,WAAW,EAAE,MAAM,EACnB,MAAM,GAAE,SAA0B,GACjC,OAAO,CAAC,kBAAkB,EAAE,CAAC,CA0B/B;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,eAAe,GAAG,MAAM,CAY/D"}