@matteeh/osq 0.1.0 → 0.2.1

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 (627) 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-capability.d.ts +17 -0
  260. package/dist/core/spec/digest-capability.d.ts.map +1 -0
  261. package/dist/core/spec/digest-capability.js +89 -0
  262. package/dist/core/spec/digest-capability.js.map +1 -0
  263. package/dist/core/spec/digest-flags.d.ts +22 -0
  264. package/dist/core/spec/digest-flags.d.ts.map +1 -0
  265. package/dist/core/spec/digest-flags.js +194 -0
  266. package/dist/core/spec/digest-flags.js.map +1 -0
  267. package/dist/core/spec/digest-verify-starts.d.ts +5 -0
  268. package/dist/core/spec/digest-verify-starts.d.ts.map +1 -0
  269. package/dist/core/spec/digest-verify-starts.js +31 -0
  270. package/dist/core/spec/digest-verify-starts.js.map +1 -0
  271. package/dist/core/spec/digest.d.ts +43 -0
  272. package/dist/core/spec/digest.d.ts.map +1 -0
  273. package/dist/core/spec/digest.js +175 -0
  274. package/dist/core/spec/digest.js.map +1 -0
  275. package/dist/core/spec/hasher.d.ts +11 -0
  276. package/dist/core/spec/hasher.d.ts.map +1 -0
  277. package/dist/core/{hasher.js → spec/hasher.js} +27 -3
  278. package/dist/core/spec/hasher.js.map +1 -0
  279. package/dist/core/spec/linter.d.ts +79 -0
  280. package/dist/core/spec/linter.d.ts.map +1 -0
  281. package/dist/core/spec/linter.js +826 -0
  282. package/dist/core/spec/linter.js.map +1 -0
  283. package/dist/core/spec/migrate.d.ts +54 -0
  284. package/dist/core/spec/migrate.d.ts.map +1 -0
  285. package/dist/core/spec/migrate.js +297 -0
  286. package/dist/core/spec/migrate.js.map +1 -0
  287. package/dist/core/spec/openspec-version.d.ts +30 -0
  288. package/dist/core/spec/openspec-version.d.ts.map +1 -0
  289. package/dist/core/spec/openspec-version.js +118 -0
  290. package/dist/core/spec/openspec-version.js.map +1 -0
  291. package/dist/core/spec/parser.d.ts +82 -0
  292. package/dist/core/spec/parser.d.ts.map +1 -0
  293. package/dist/core/spec/parser.js +221 -0
  294. package/dist/core/spec/parser.js.map +1 -0
  295. package/dist/core/spec/verify-paths.d.ts +18 -0
  296. package/dist/core/spec/verify-paths.d.ts.map +1 -0
  297. package/dist/core/spec/verify-paths.js +139 -0
  298. package/dist/core/spec/verify-paths.js.map +1 -0
  299. package/dist/core/spec/verify-starts.d.ts +45 -0
  300. package/dist/core/spec/verify-starts.d.ts.map +1 -0
  301. package/dist/core/spec/verify-starts.js +61 -0
  302. package/dist/core/spec/verify-starts.js.map +1 -0
  303. package/dist/core/status/inbox-cursor.d.ts +10 -0
  304. package/dist/core/status/inbox-cursor.d.ts.map +1 -0
  305. package/dist/core/status/inbox-cursor.js +33 -0
  306. package/dist/core/status/inbox-cursor.js.map +1 -0
  307. package/dist/core/status/inbox-projection.d.ts +15 -0
  308. package/dist/core/status/inbox-projection.d.ts.map +1 -0
  309. package/dist/core/status/inbox-projection.js +20 -0
  310. package/dist/core/status/inbox-projection.js.map +1 -0
  311. package/dist/core/status/inbox-text.d.ts +4 -0
  312. package/dist/core/status/inbox-text.d.ts.map +1 -0
  313. package/dist/core/status/inbox-text.js +48 -0
  314. package/dist/core/status/inbox-text.js.map +1 -0
  315. package/dist/core/status/inbox.d.ts +53 -0
  316. package/dist/core/status/inbox.d.ts.map +1 -0
  317. package/dist/core/status/inbox.js +167 -0
  318. package/dist/core/status/inbox.js.map +1 -0
  319. package/dist/core/status/layout.d.ts +29 -0
  320. package/dist/core/status/layout.d.ts.map +1 -0
  321. package/dist/core/status/layout.js +77 -0
  322. package/dist/core/status/layout.js.map +1 -0
  323. package/dist/core/status/queue-parser.d.ts +13 -0
  324. package/dist/core/status/queue-parser.d.ts.map +1 -0
  325. package/dist/core/status/queue-parser.js +88 -0
  326. package/dist/core/status/queue-parser.js.map +1 -0
  327. package/dist/core/status/queue-planning.d.ts +62 -0
  328. package/dist/core/status/queue-planning.d.ts.map +1 -0
  329. package/dist/core/status/queue-planning.js +158 -0
  330. package/dist/core/status/queue-planning.js.map +1 -0
  331. package/dist/core/status/queue-report-detail.d.ts +50 -0
  332. package/dist/core/status/queue-report-detail.d.ts.map +1 -0
  333. package/dist/core/status/queue-report-detail.js +140 -0
  334. package/dist/core/status/queue-report-detail.js.map +1 -0
  335. package/dist/core/status/queue-report.d.ts +14 -0
  336. package/dist/core/status/queue-report.d.ts.map +1 -0
  337. package/dist/core/status/queue-report.js +41 -0
  338. package/dist/core/status/queue-report.js.map +1 -0
  339. package/dist/core/status/queue-state.d.ts +53 -0
  340. package/dist/core/status/queue-state.d.ts.map +1 -0
  341. package/dist/core/status/queue-state.js +167 -0
  342. package/dist/core/status/queue-state.js.map +1 -0
  343. package/dist/core/status/queue.d.ts +7 -0
  344. package/dist/core/status/queue.d.ts.map +1 -0
  345. package/dist/core/status/queue.js +4 -0
  346. package/dist/core/status/queue.js.map +1 -0
  347. package/dist/core/status/show.d.ts +102 -0
  348. package/dist/core/status/show.d.ts.map +1 -0
  349. package/dist/core/status/show.js +704 -0
  350. package/dist/core/status/show.js.map +1 -0
  351. package/dist/core/status/state.d.ts +56 -0
  352. package/dist/core/status/state.d.ts.map +1 -0
  353. package/dist/core/status/state.js +187 -0
  354. package/dist/core/status/state.js.map +1 -0
  355. package/dist/core/status/status.d.ts +23 -0
  356. package/dist/core/status/status.d.ts.map +1 -0
  357. package/dist/core/status/status.js +173 -0
  358. package/dist/core/status/status.js.map +1 -0
  359. package/dist/core/web/web-data-change.d.ts +10 -0
  360. package/dist/core/web/web-data-change.d.ts.map +1 -0
  361. package/dist/core/web/web-data-change.js +106 -0
  362. package/dist/core/web/web-data-change.js.map +1 -0
  363. package/dist/core/web/web-data-folders.d.ts +39 -0
  364. package/dist/core/web/web-data-folders.d.ts.map +1 -0
  365. package/dist/core/web/web-data-folders.js +125 -0
  366. package/dist/core/web/web-data-folders.js.map +1 -0
  367. package/dist/core/web/web-data-graph.d.ts +8 -0
  368. package/dist/core/web/web-data-graph.d.ts.map +1 -0
  369. package/dist/core/web/web-data-graph.js +113 -0
  370. package/dist/core/web/web-data-graph.js.map +1 -0
  371. package/dist/core/web/web-data-lifecycle.d.ts +43 -0
  372. package/dist/core/web/web-data-lifecycle.d.ts.map +1 -0
  373. package/dist/core/web/web-data-lifecycle.js +141 -0
  374. package/dist/core/web/web-data-lifecycle.js.map +1 -0
  375. package/dist/core/web/web-data-observations.d.ts +30 -0
  376. package/dist/core/web/web-data-observations.d.ts.map +1 -0
  377. package/dist/core/web/web-data-observations.js +181 -0
  378. package/dist/core/web/web-data-observations.js.map +1 -0
  379. package/dist/core/web/web-data-tokens.d.ts +29 -0
  380. package/dist/core/web/web-data-tokens.d.ts.map +1 -0
  381. package/dist/core/web/web-data-tokens.js +62 -0
  382. package/dist/core/web/web-data-tokens.js.map +1 -0
  383. package/dist/core/web/web-data-types.d.ts +156 -0
  384. package/dist/core/web/web-data-types.d.ts.map +1 -0
  385. package/dist/core/web/web-data-types.js +15 -0
  386. package/dist/core/web/web-data-types.js.map +1 -0
  387. package/dist/core/web/web-data.d.ts +10 -0
  388. package/dist/core/web/web-data.d.ts.map +1 -0
  389. package/dist/core/web/web-data.js +8 -0
  390. package/dist/core/web/web-data.js.map +1 -0
  391. package/dist/core/web/web-events.d.ts +54 -0
  392. package/dist/core/web/web-events.d.ts.map +1 -0
  393. package/dist/core/web/web-events.js +162 -0
  394. package/dist/core/web/web-events.js.map +1 -0
  395. package/dist/core/web/web-export.d.ts +18 -0
  396. package/dist/core/web/web-export.d.ts.map +1 -0
  397. package/dist/core/web/web-export.js +112 -0
  398. package/dist/core/web/web-export.js.map +1 -0
  399. package/dist/core/web/web-server.d.ts +34 -0
  400. package/dist/core/web/web-server.d.ts.map +1 -0
  401. package/dist/core/web/web-server.js +182 -0
  402. package/dist/core/web/web-server.js.map +1 -0
  403. package/dist/core/web/web-static.d.ts +20 -0
  404. package/dist/core/web/web-static.d.ts.map +1 -0
  405. package/dist/core/web/web-static.js +104 -0
  406. package/dist/core/web/web-static.js.map +1 -0
  407. package/dist/harness/{agy.d.ts → agy/agy.d.ts} +8 -6
  408. package/dist/harness/agy/agy.d.ts.map +1 -0
  409. package/dist/harness/{agy.js → agy/agy.js} +49 -34
  410. package/dist/harness/agy/agy.js.map +1 -0
  411. package/dist/harness/claude/claude-turns.d.ts +29 -0
  412. package/dist/harness/claude/claude-turns.d.ts.map +1 -0
  413. package/dist/harness/claude/claude-turns.js +162 -0
  414. package/dist/harness/claude/claude-turns.js.map +1 -0
  415. package/dist/harness/claude/claude-usage.d.ts +12 -0
  416. package/dist/harness/claude/claude-usage.d.ts.map +1 -0
  417. package/dist/harness/claude/claude-usage.js +144 -0
  418. package/dist/harness/claude/claude-usage.js.map +1 -0
  419. package/dist/harness/codex/codex-observe-usage.d.ts +6 -0
  420. package/dist/harness/codex/codex-observe-usage.d.ts.map +1 -0
  421. package/dist/harness/codex/codex-observe-usage.js +215 -0
  422. package/dist/harness/codex/codex-observe-usage.js.map +1 -0
  423. package/dist/harness/codex/codex-prompt.d.ts +17 -0
  424. package/dist/harness/codex/codex-prompt.d.ts.map +1 -0
  425. package/dist/harness/codex/codex-prompt.js +43 -0
  426. package/dist/harness/codex/codex-prompt.js.map +1 -0
  427. package/dist/harness/codex/codex-stream.d.ts +23 -0
  428. package/dist/harness/codex/codex-stream.d.ts.map +1 -0
  429. package/dist/harness/codex/codex-stream.js +182 -0
  430. package/dist/harness/codex/codex-stream.js.map +1 -0
  431. package/dist/harness/codex/codex-usage.d.ts +26 -0
  432. package/dist/harness/codex/codex-usage.d.ts.map +1 -0
  433. package/dist/harness/codex/codex-usage.js +122 -0
  434. package/dist/harness/codex/codex-usage.js.map +1 -0
  435. package/dist/harness/codex/codex.d.ts +16 -0
  436. package/dist/harness/codex/codex.d.ts.map +1 -0
  437. package/dist/harness/codex/codex.js +92 -0
  438. package/dist/harness/codex/codex.js.map +1 -0
  439. package/dist/harness/index.d.ts +11 -2
  440. package/dist/harness/index.d.ts.map +1 -1
  441. package/dist/harness/index.js +24 -9
  442. package/dist/harness/index.js.map +1 -1
  443. package/dist/harness/mock.d.ts +5 -2
  444. package/dist/harness/mock.d.ts.map +1 -1
  445. package/dist/harness/mock.js +10 -11
  446. package/dist/harness/mock.js.map +1 -1
  447. package/dist/harness/opencode/opencode-observe-usage.d.ts +4 -0
  448. package/dist/harness/opencode/opencode-observe-usage.d.ts.map +1 -0
  449. package/dist/harness/opencode/opencode-observe-usage.js +100 -0
  450. package/dist/harness/opencode/opencode-observe-usage.js.map +1 -0
  451. package/dist/harness/opencode/opencode-usage.d.ts +24 -0
  452. package/dist/harness/opencode/opencode-usage.d.ts.map +1 -0
  453. package/dist/harness/opencode/opencode-usage.js +181 -0
  454. package/dist/harness/opencode/opencode-usage.js.map +1 -0
  455. package/dist/harness/{opencode.d.ts → opencode/opencode.d.ts} +10 -7
  456. package/dist/harness/opencode/opencode.d.ts.map +1 -0
  457. package/dist/harness/{opencode.js → opencode/opencode.js} +159 -70
  458. package/dist/harness/opencode/opencode.js.map +1 -0
  459. package/dist/harness/pi/pi-args.d.ts +9 -0
  460. package/dist/harness/pi/pi-args.d.ts.map +1 -0
  461. package/dist/harness/pi/pi-args.js +33 -0
  462. package/dist/harness/pi/pi-args.js.map +1 -0
  463. package/dist/harness/pi/pi-stream.d.ts +27 -0
  464. package/dist/harness/pi/pi-stream.d.ts.map +1 -0
  465. package/dist/harness/pi/pi-stream.js +176 -0
  466. package/dist/harness/pi/pi-stream.js.map +1 -0
  467. package/dist/harness/pi/pi-tools.d.ts +5 -0
  468. package/dist/harness/pi/pi-tools.d.ts.map +1 -0
  469. package/dist/harness/pi/pi-tools.js +31 -0
  470. package/dist/harness/pi/pi-tools.js.map +1 -0
  471. package/dist/harness/pi/pi.d.ts +11 -0
  472. package/dist/harness/pi/pi.d.ts.map +1 -0
  473. package/dist/harness/pi/pi.js +109 -0
  474. package/dist/harness/pi/pi.js.map +1 -0
  475. package/dist/harness/prompt.d.ts +11 -0
  476. package/dist/harness/prompt.d.ts.map +1 -0
  477. package/dist/harness/prompt.js +105 -0
  478. package/dist/harness/prompt.js.map +1 -0
  479. package/dist/harness/types.d.ts +289 -8
  480. package/dist/harness/types.d.ts.map +1 -1
  481. package/dist/harness/types.js +125 -0
  482. package/dist/harness/types.js.map +1 -1
  483. package/dist/index.d.ts +13 -2
  484. package/dist/index.d.ts.map +1 -1
  485. package/dist/index.js +8 -1
  486. package/dist/index.js.map +1 -1
  487. package/dist/watcher/archive-verify.d.ts +9 -0
  488. package/dist/watcher/archive-verify.d.ts.map +1 -0
  489. package/dist/watcher/archive-verify.js +80 -0
  490. package/dist/watcher/archive-verify.js.map +1 -0
  491. package/dist/watcher/archiver.d.ts +14 -2
  492. package/dist/watcher/archiver.d.ts.map +1 -1
  493. package/dist/watcher/archiver.js +112 -33
  494. package/dist/watcher/archiver.js.map +1 -1
  495. package/dist/watcher/attempt.d.ts +19 -0
  496. package/dist/watcher/attempt.d.ts.map +1 -0
  497. package/dist/watcher/attempt.js +94 -0
  498. package/dist/watcher/attempt.js.map +1 -0
  499. package/dist/watcher/auto-retry.d.ts +11 -0
  500. package/dist/watcher/auto-retry.d.ts.map +1 -0
  501. package/dist/watcher/auto-retry.js +180 -0
  502. package/dist/watcher/auto-retry.js.map +1 -0
  503. package/dist/watcher/build-project.d.ts +11 -0
  504. package/dist/watcher/build-project.d.ts.map +1 -0
  505. package/dist/watcher/build-project.js +36 -0
  506. package/dist/watcher/build-project.js.map +1 -0
  507. package/dist/watcher/build.d.ts +27 -0
  508. package/dist/watcher/build.d.ts.map +1 -0
  509. package/dist/watcher/build.js +165 -0
  510. package/dist/watcher/build.js.map +1 -0
  511. package/dist/watcher/change-verify.d.ts +25 -0
  512. package/dist/watcher/change-verify.d.ts.map +1 -0
  513. package/dist/watcher/change-verify.js +57 -0
  514. package/dist/watcher/change-verify.js.map +1 -0
  515. package/dist/watcher/dev.d.ts +51 -0
  516. package/dist/watcher/dev.d.ts.map +1 -0
  517. package/dist/watcher/dev.js +124 -0
  518. package/dist/watcher/dev.js.map +1 -0
  519. package/dist/watcher/failure-reason.d.ts +7 -0
  520. package/dist/watcher/failure-reason.d.ts.map +1 -0
  521. package/dist/watcher/failure-reason.js +2 -0
  522. package/dist/watcher/failure-reason.js.map +1 -0
  523. package/dist/watcher/fingerprint.d.ts +19 -0
  524. package/dist/watcher/fingerprint.d.ts.map +1 -0
  525. package/dist/watcher/fingerprint.js +82 -0
  526. package/dist/watcher/fingerprint.js.map +1 -0
  527. package/dist/watcher/heartbeat.d.ts +33 -0
  528. package/dist/watcher/heartbeat.d.ts.map +1 -0
  529. package/dist/watcher/heartbeat.js +135 -0
  530. package/dist/watcher/heartbeat.js.map +1 -0
  531. package/dist/watcher/lock.d.ts +10 -0
  532. package/dist/watcher/lock.d.ts.map +1 -0
  533. package/dist/watcher/lock.js +14 -0
  534. package/dist/watcher/lock.js.map +1 -0
  535. package/dist/watcher/loop.d.ts +26 -6
  536. package/dist/watcher/loop.d.ts.map +1 -1
  537. package/dist/watcher/loop.js +154 -37
  538. package/dist/watcher/loop.js.map +1 -1
  539. package/dist/watcher/measures.d.ts +46 -0
  540. package/dist/watcher/measures.d.ts.map +1 -0
  541. package/dist/watcher/measures.js +203 -0
  542. package/dist/watcher/measures.js.map +1 -0
  543. package/dist/watcher/outcome.d.ts +34 -0
  544. package/dist/watcher/outcome.d.ts.map +1 -0
  545. package/dist/watcher/outcome.js +131 -0
  546. package/dist/watcher/outcome.js.map +1 -0
  547. package/dist/watcher/regression.d.ts +43 -0
  548. package/dist/watcher/regression.d.ts.map +1 -0
  549. package/dist/watcher/regression.js +178 -0
  550. package/dist/watcher/regression.js.map +1 -0
  551. package/dist/watcher/runner.d.ts +6 -68
  552. package/dist/watcher/runner.d.ts.map +1 -1
  553. package/dist/watcher/runner.js +74 -523
  554. package/dist/watcher/runner.js.map +1 -1
  555. package/dist/watcher/spawn.d.ts +48 -0
  556. package/dist/watcher/spawn.d.ts.map +1 -0
  557. package/dist/watcher/spawn.js +135 -0
  558. package/dist/watcher/spawn.js.map +1 -0
  559. package/dist/watcher/task-verify.d.ts +59 -0
  560. package/dist/watcher/task-verify.d.ts.map +1 -0
  561. package/dist/watcher/task-verify.js +108 -0
  562. package/dist/watcher/task-verify.js.map +1 -0
  563. package/dist/watcher/verify.d.ts +44 -0
  564. package/dist/watcher/verify.d.ts.map +1 -0
  565. package/dist/watcher/verify.js +156 -0
  566. package/dist/watcher/verify.js.map +1 -0
  567. package/package.json +21 -9
  568. package/templates/PLANNER.md +77 -0
  569. package/templates/openspec/config.yaml +24 -0
  570. package/templates/openspec/schemas/osq/README.md +30 -0
  571. package/templates/openspec/schemas/osq/schema.yaml +133 -0
  572. package/templates/openspec/schemas/osq/templates/proposal.md +66 -0
  573. package/templates/openspec/schemas/osq/templates/spec.md +13 -0
  574. package/templates/openspec/schemas/osq/templates/tasks.md +11 -0
  575. package/templates/proposal.md +66 -0
  576. package/templates/tasks.md +5 -0
  577. package/ui/dist/assets/index-CZYeQ8la.js +9 -0
  578. package/ui/dist/assets/index-D6zVSjO7.css +1 -0
  579. package/ui/dist/index.html +14 -0
  580. package/dist/core/approve.d.ts +0 -11
  581. package/dist/core/approve.d.ts.map +0 -1
  582. package/dist/core/approve.js +0 -52
  583. package/dist/core/approve.js.map +0 -1
  584. package/dist/core/config.d.ts.map +0 -1
  585. package/dist/core/config.js.map +0 -1
  586. package/dist/core/hasher.d.ts +0 -4
  587. package/dist/core/hasher.d.ts.map +0 -1
  588. package/dist/core/hasher.js.map +0 -1
  589. package/dist/core/init.d.ts +0 -12
  590. package/dist/core/init.d.ts.map +0 -1
  591. package/dist/core/init.js +0 -151
  592. package/dist/core/init.js.map +0 -1
  593. package/dist/core/linter.d.ts +0 -8
  594. package/dist/core/linter.d.ts.map +0 -1
  595. package/dist/core/linter.js +0 -100
  596. package/dist/core/linter.js.map +0 -1
  597. package/dist/core/lock.d.ts.map +0 -1
  598. package/dist/core/lock.js.map +0 -1
  599. package/dist/core/logger.d.ts.map +0 -1
  600. package/dist/core/logger.js.map +0 -1
  601. package/dist/core/new.d.ts.map +0 -1
  602. package/dist/core/new.js +0 -79
  603. package/dist/core/new.js.map +0 -1
  604. package/dist/core/parser.d.ts +0 -32
  605. package/dist/core/parser.d.ts.map +0 -1
  606. package/dist/core/parser.js +0 -87
  607. package/dist/core/parser.js.map +0 -1
  608. package/dist/core/report.d.ts +0 -54
  609. package/dist/core/report.d.ts.map +0 -1
  610. package/dist/core/report.js +0 -475
  611. package/dist/core/report.js.map +0 -1
  612. package/dist/core/show.d.ts +0 -50
  613. package/dist/core/show.d.ts.map +0 -1
  614. package/dist/core/show.js +0 -374
  615. package/dist/core/show.js.map +0 -1
  616. package/dist/core/state.d.ts +0 -25
  617. package/dist/core/state.d.ts.map +0 -1
  618. package/dist/core/state.js +0 -180
  619. package/dist/core/state.js.map +0 -1
  620. package/dist/core/status.d.ts +0 -10
  621. package/dist/core/status.d.ts.map +0 -1
  622. package/dist/core/status.js +0 -106
  623. package/dist/core/status.js.map +0 -1
  624. package/dist/harness/agy.d.ts.map +0 -1
  625. package/dist/harness/agy.js.map +0 -1
  626. package/dist/harness/opencode.d.ts.map +0 -1
  627. package/dist/harness/opencode.js.map +0 -1
@@ -0,0 +1,94 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { resolveSymbol } from '../core/foundation/logger.js';
4
+ import { parseFrontmatter } from '../core/spec/parser.js';
5
+ import { asRecord } from '../harness/stream.js';
6
+ import { stripAnsi } from './fingerprint.js';
7
+ const ELLIPSIS = '…';
8
+ function truncateToWidth(text, width) {
9
+ if (width <= 0)
10
+ return '';
11
+ if (text.length <= width)
12
+ return text;
13
+ if (width === 1)
14
+ return ELLIPSIS;
15
+ return `${text.slice(0, width - 1)}${ELLIPSIS}`;
16
+ }
17
+ /** Curated task-started line: prefix plus the title truncated to terminal width. */
18
+ export function formatTaskStartedLine(taskNumber, title, pid, timeoutSeconds, symbols, terminalWidth = process.stderr.columns ?? 80) {
19
+ const symbol = resolveSymbol('▶', '[task]', symbols);
20
+ const prefix = `${symbol} task ${taskNumber} started (pid: ${pid ?? 'unknown'}, timeout: ${timeoutSeconds}s): `;
21
+ return `${prefix}${truncateToWidth(title, Math.max(0, terminalWidth - prefix.length))}`;
22
+ }
23
+ /**
24
+ * Body after the frontmatter of the dead marker a retry retained, with ANSI
25
+ * codes stripped. The retained attempt ordinal is one less than the following
26
+ * execution attempt. A missing marker, as after retrying a regression, yields no
27
+ * output.
28
+ */
29
+ async function readRetainedMarkerBody(specFolderPath, taskNumber, attempt) {
30
+ const markerPath = path.join(specFolderPath, '.run', 'dead', `${taskNumber}.${attempt - 1}.md`);
31
+ const content = await fs.readFile(markerPath, 'utf8').catch(() => undefined);
32
+ if (content === undefined)
33
+ return undefined;
34
+ return stripAnsi(parseFrontmatter(content).body);
35
+ }
36
+ /**
37
+ * Reconstruct the target-wide execution attempt, prior failure reason, and
38
+ * failure output from the append-only event stream. The latest `retry`
39
+ * transition or requeued `recertification` wins, so a watcher restart loses
40
+ * neither the attempt nor the failure context. A retry's output is the body of
41
+ * the dead marker it retained; a requeued recertification keeps its captured
42
+ * verification output. A passed recertification is not a transition and never
43
+ * advances attempts. Without either event the target starts at attempt 1.
44
+ */
45
+ export async function readRetryContext(specFolderPath, taskNumber) {
46
+ const eventPath = path.join(specFolderPath, '.run', 'events', `${taskNumber}.jsonl`);
47
+ const content = await fs.readFile(eventPath, 'utf8').catch(() => '');
48
+ let attempt = 1;
49
+ let reason;
50
+ let output;
51
+ for (const line of content.split('\n')) {
52
+ if (!line.trim())
53
+ continue;
54
+ let parsed;
55
+ try {
56
+ parsed = JSON.parse(line);
57
+ }
58
+ catch {
59
+ continue;
60
+ }
61
+ const event = asRecord(parsed);
62
+ if (event?.type === 'retry') {
63
+ const data = asRecord(event.data);
64
+ if (typeof data?.attempt === 'number' && Number.isInteger(data.attempt)) {
65
+ attempt = data.attempt;
66
+ }
67
+ if (typeof data?.reason === 'string' && data.reason) {
68
+ reason = data.reason;
69
+ }
70
+ output = await readRetainedMarkerBody(specFolderPath, taskNumber, attempt);
71
+ continue;
72
+ }
73
+ if (event?.type !== 'recertification')
74
+ continue;
75
+ const data = asRecord(event.data);
76
+ if (data?.outcome !== 'requeued')
77
+ continue;
78
+ if (typeof data.attempt === 'number' && Number.isInteger(data.attempt)) {
79
+ attempt = data.attempt;
80
+ }
81
+ if (typeof data.reason === 'string' && data.reason) {
82
+ reason = data.reason;
83
+ }
84
+ if (typeof data.output === 'string') {
85
+ output = data.output;
86
+ }
87
+ }
88
+ return {
89
+ attempt,
90
+ ...(reason ? { reason } : {}),
91
+ ...(output ? { output } : {}),
92
+ };
93
+ }
94
+ //# sourceMappingURL=attempt.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attempt.js","sourceRoot":"","sources":["../../src/watcher/attempt.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import type { OsqConfig } from '../core/foundation/config.js';
2
+ import { type Logger } from '../core/foundation/logger.js';
3
+ export declare const ELIGIBLE_AUTO_RETRY_REASONS: readonly ["verify_red", "change_verify_red", "undeclared_test_change", "verify_path_missing", "no_result", "crashed", "timeout"];
4
+ export type EligibleAutoRetryReason = (typeof ELIGIBLE_AUTO_RETRY_REASONS)[number];
5
+ /**
6
+ * Decide, per active dead task in an approved change, whether to retry it. Runs
7
+ * from disk every cycle so a watcher restart between a death and its retry
8
+ * neither loses nor repeats the action. Returns the number of retries made.
9
+ */
10
+ export declare function runAutomaticRetries(projectRoot: string, folderPath: string, config: OsqConfig, logger?: Logger): Promise<number>;
11
+ //# sourceMappingURL=auto-retry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-retry.d.ts","sourceRoot":"","sources":["../../src/watcher/auto-retry.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAC9D,OAAO,EAAE,KAAK,MAAM,EAAiB,MAAM,8BAA8B,CAAC;AAU1E,eAAO,MAAM,2BAA2B,kIAQ9B,CAAC;AAEX,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,2BAA2B,CAAC,CAAC,MAAM,CAAC,CAAC;AA6KnF;;;;GAIG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,UAAU,EAAE,MAAM,EAClB,MAAM,EAAE,SAAS,EACjB,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,CAAC,CAwBjB"}
@@ -0,0 +1,180 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import YAML from 'yaml';
4
+ import { resolveSymbol } from '../core/foundation/logger.js';
5
+ import { retrySpec } from '../core/lifecycle/retry.js';
6
+ import { parseFrontmatter } from '../core/spec/parser.js';
7
+ import { appendHarnessEvent } from '../harness/types.js';
8
+ import { markerFingerprint } from './fingerprint.js';
9
+ // Automatic retry spends one agent attempt on a dead task when a fresh run
10
+ // could plausibly fix it. The decision is re-derived from disk every cycle; the
11
+ // retry transition itself (renaming the active marker) is the commit point.
12
+ export const ELIGIBLE_AUTO_RETRY_REASONS = [
13
+ 'verify_red',
14
+ 'change_verify_red',
15
+ 'undeclared_test_change',
16
+ 'verify_path_missing',
17
+ 'no_result',
18
+ 'crashed',
19
+ 'timeout',
20
+ ];
21
+ const ELIGIBLE = new Set(ELIGIBLE_AUTO_RETRY_REASONS);
22
+ const ACTIVE_DEAD = /^\d+\.md$/;
23
+ const RETAINED_DEAD = /^(\d+)\.(\d+)\.md$/;
24
+ async function readStream(folderPath, taskNumber) {
25
+ const raw = await fs
26
+ .readFile(path.join(folderPath, '.run', 'events', `${taskNumber}.jsonl`), 'utf8')
27
+ .catch(() => '');
28
+ const events = [];
29
+ for (const line of raw.split('\n')) {
30
+ if (!line.trim())
31
+ continue;
32
+ try {
33
+ events.push(JSON.parse(line));
34
+ }
35
+ catch {
36
+ // A malformed line never blocks the decision.
37
+ }
38
+ }
39
+ return events;
40
+ }
41
+ function dataOf(event) {
42
+ return event.data !== null && typeof event.data === 'object'
43
+ ? event.data
44
+ : {};
45
+ }
46
+ function laterOf(a, b) {
47
+ if (a === undefined)
48
+ return b;
49
+ if (b === undefined)
50
+ return a;
51
+ return a > b ? a : b;
52
+ }
53
+ function lastManualRetryAt(events) {
54
+ let latest;
55
+ for (const event of events) {
56
+ if (event.type !== 'retry' || dataOf(event).automatic === true)
57
+ continue;
58
+ if (typeof event.timestamp !== 'string')
59
+ continue;
60
+ latest = laterOf(latest, event.timestamp);
61
+ }
62
+ return latest;
63
+ }
64
+ function automaticRetriesSince(events, cutoff) {
65
+ let count = 0;
66
+ for (const event of events) {
67
+ if (event.type !== 'retry' || dataOf(event).automatic !== true)
68
+ continue;
69
+ if (cutoff !== undefined && typeof event.timestamp === 'string' && event.timestamp < cutoff) {
70
+ continue;
71
+ }
72
+ count += 1;
73
+ }
74
+ return count;
75
+ }
76
+ async function readApprovedAt(runDir) {
77
+ const raw = await fs.readFile(path.join(runDir, 'manifest.json'), 'utf8').catch(() => '');
78
+ try {
79
+ const parsed = JSON.parse(raw);
80
+ return typeof parsed.approvedAt === 'string' ? parsed.approvedAt : undefined;
81
+ }
82
+ catch {
83
+ return undefined;
84
+ }
85
+ }
86
+ /** Stored fingerprint, falling back to a content-derived one for legacy markers. */
87
+ function fingerprintOf(content, projectRoot) {
88
+ const stored = parseFrontmatter(content).data.fingerprint;
89
+ return typeof stored === 'string' && stored ? stored : markerFingerprint(content, projectRoot);
90
+ }
91
+ async function highestRetained(deadDir, taskNumber, projectRoot) {
92
+ const entries = await fs.readdir(deadDir).catch(() => []);
93
+ let bestOrdinal = -1;
94
+ let best;
95
+ for (const entry of entries) {
96
+ const match = entry.match(RETAINED_DEAD);
97
+ if (!match || match[1] !== taskNumber)
98
+ continue;
99
+ const ordinal = Number.parseInt(match[2], 10);
100
+ if (ordinal > bestOrdinal) {
101
+ bestOrdinal = ordinal;
102
+ best = entry;
103
+ }
104
+ }
105
+ if (best === undefined)
106
+ return undefined;
107
+ const content = await fs.readFile(path.join(deadDir, best), 'utf8').catch(() => '');
108
+ return fingerprintOf(content, projectRoot);
109
+ }
110
+ function shortFingerprint(fingerprint) {
111
+ const hex = fingerprint.startsWith('sha256:') ? fingerprint.slice(7) : fingerprint;
112
+ return hex.slice(0, 12);
113
+ }
114
+ function errorMessage(err) {
115
+ return err instanceof Error ? err.message : String(err);
116
+ }
117
+ /** Mark the active marker stuck once, preserving the body after its frontmatter. */
118
+ async function markStuck(folderPath, specId, taskNumber, deadPath, fingerprint, logger) {
119
+ const content = await fs.readFile(deadPath, 'utf8');
120
+ const { data, body } = parseFrontmatter(content);
121
+ if (data.stuck === true)
122
+ return;
123
+ await fs.writeFile(deadPath, `---\n${YAML.stringify({ ...data, stuck: true })}---\n${body}`, 'utf8');
124
+ await appendHarnessEvent(folderPath, taskNumber, {
125
+ type: 'stuck',
126
+ timestamp: new Date().toISOString(),
127
+ data: { task: taskNumber, fingerprint },
128
+ });
129
+ logger?.info(`${resolveSymbol('■', '[stuck]', logger?.symbols === true)} task ${taskNumber} of ${specId} stuck: same failure twice (${shortFingerprint(fingerprint)})`);
130
+ }
131
+ async function decideDeadTask(projectRoot, folderPath, specId, taskNumber, deadPath, config, limit, logger) {
132
+ const content = await fs.readFile(deadPath, 'utf8').catch(() => '');
133
+ const reason = parseFrontmatter(content).data.reason;
134
+ if (typeof reason !== 'string' || !ELIGIBLE.has(reason))
135
+ return 'none';
136
+ const runDir = path.join(folderPath, '.run');
137
+ const events = await readStream(folderPath, taskNumber);
138
+ const fingerprint = fingerprintOf(content, projectRoot);
139
+ const previous = await highestRetained(path.join(runDir, 'dead'), taskNumber, projectRoot);
140
+ if (previous !== undefined && previous === fingerprint) {
141
+ await markStuck(folderPath, specId, taskNumber, deadPath, fingerprint, logger);
142
+ return 'stuck';
143
+ }
144
+ const cutoff = laterOf(await readApprovedAt(runDir), lastManualRetryAt(events));
145
+ if (automaticRetriesSince(events, cutoff) >= limit)
146
+ return 'none';
147
+ try {
148
+ const result = await retrySpec(projectRoot, specId, taskNumber, config, { automatic: true });
149
+ logger?.info(`${resolveSymbol('↻', '[retry]', logger?.symbols === true)} task ${taskNumber} of ${specId} retried automatically after ${result.reason} (attempt ${result.attempt})`);
150
+ return 'retried';
151
+ }
152
+ catch (err) {
153
+ logger?.warn(`task ${taskNumber} of ${specId} automatic retry failed: ${errorMessage(err)}`);
154
+ return 'none';
155
+ }
156
+ }
157
+ /**
158
+ * Decide, per active dead task in an approved change, whether to retry it. Runs
159
+ * from disk every cycle so a watcher restart between a death and its retry
160
+ * neither loses nor repeats the action. Returns the number of retries made.
161
+ */
162
+ export async function runAutomaticRetries(projectRoot, folderPath, config, logger) {
163
+ const limit = config.gates?.autoRetries ?? 1;
164
+ if (limit <= 0)
165
+ return 0;
166
+ const folderName = path.basename(folderPath);
167
+ const specId = folderName.match(/^(\d+)/)?.[1] ?? folderName;
168
+ const deadDir = path.join(folderPath, '.run', 'dead');
169
+ const entries = (await fs.readdir(deadDir).catch(() => []))
170
+ .filter((entry) => ACTIVE_DEAD.test(entry))
171
+ .sort();
172
+ let retried = 0;
173
+ for (const entry of entries) {
174
+ const decision = await decideDeadTask(projectRoot, folderPath, specId, entry.replace(/\.md$/, ''), path.join(deadDir, entry), config, limit, logger);
175
+ if (decision === 'retried')
176
+ retried += 1;
177
+ }
178
+ return retried;
179
+ }
180
+ //# sourceMappingURL=auto-retry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-retry.js","sourceRoot":"","sources":["../../src/watcher/auto-retry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ /** Short HEAD commit for `cwd`, or null when git is missing / not a repo. */
2
+ export declare function readGitCommit(cwd: string): Promise<string | null>;
3
+ /** Top of the git work tree containing `cwd`, or null when not in a repo. */
4
+ export declare function readGitTopLevel(cwd: string): Promise<string | null>;
5
+ /**
6
+ * Short HEAD commit of the project root, or null when it is not inside a git
7
+ * repository. Unlike osq's own identity this may resolve to an enclosing work
8
+ * tree, which is exactly what the project commit means for an installed osq.
9
+ */
10
+ export declare function resolveProjectCommit(projectRoot: string): Promise<string | null>;
11
+ //# sourceMappingURL=build-project.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-project.d.ts","sourceRoot":"","sources":["../../src/watcher/build-project.ts"],"names":[],"mappings":"AAEA,6EAA6E;AAC7E,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWjE;AAED,6EAA6E;AAC7E,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAWnE;AAED;;;;GAIG;AACH,wBAAsB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAEtF"}
@@ -0,0 +1,36 @@
1
+ import { execFile } from 'node:child_process';
2
+ /** Short HEAD commit for `cwd`, or null when git is missing / not a repo. */
3
+ export function readGitCommit(cwd) {
4
+ return new Promise((resolve) => {
5
+ execFile('git', ['rev-parse', '--short', 'HEAD'], { cwd }, (error, stdout) => {
6
+ if (error) {
7
+ resolve(null);
8
+ return;
9
+ }
10
+ const commit = String(stdout).trim();
11
+ resolve(commit.length > 0 ? commit : null);
12
+ });
13
+ });
14
+ }
15
+ /** Top of the git work tree containing `cwd`, or null when not in a repo. */
16
+ export function readGitTopLevel(cwd) {
17
+ return new Promise((resolve) => {
18
+ execFile('git', ['rev-parse', '--show-toplevel'], { cwd }, (error, stdout) => {
19
+ if (error) {
20
+ resolve(null);
21
+ return;
22
+ }
23
+ const top = String(stdout).trim();
24
+ resolve(top.length > 0 ? top : null);
25
+ });
26
+ });
27
+ }
28
+ /**
29
+ * Short HEAD commit of the project root, or null when it is not inside a git
30
+ * repository. Unlike osq's own identity this may resolve to an enclosing work
31
+ * tree, which is exactly what the project commit means for an installed osq.
32
+ */
33
+ export async function resolveProjectCommit(projectRoot) {
34
+ return readGitCommit(projectRoot);
35
+ }
36
+ //# sourceMappingURL=build-project.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-project.js","sourceRoot":"","sources":["../../src/watcher/build-project.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE9C,6EAA6E;AAC7E,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,SAAS,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3E,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,OAAO,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,QAAQ,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,iBAAiB,CAAC,EAAE,EAAE,GAAG,EAAE,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;YAC3E,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;YAClC,OAAO,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,oBAAoB,CAAC,WAAmB;IAC5D,OAAO,aAAa,CAAC,WAAW,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1,27 @@
1
+ /** Identity of the osq build currently executing: package version plus commit. */
2
+ export interface BuildInfo {
3
+ version: string;
4
+ commit: string;
5
+ }
6
+ /**
7
+ * Resolve the active osq build identity from an optional osq package root,
8
+ * defaulting to the running package. Version comes from that root's
9
+ * `package.json`; the commit is the short git SHA only when the root is the top
10
+ * of a git work tree, otherwise a hash of that root's `dist/`, otherwise
11
+ * `unknown`. The project's `package.json` and HEAD are never consulted here;
12
+ * an installed osq must not report the consumer's identity. The result is
13
+ * cached per resolved root so the watcher pays the git spawn at most once.
14
+ */
15
+ export declare function resolveBuildInfo(packageRoot?: string): Promise<BuildInfo>;
16
+ export interface CheckStaleBuildOptions {
17
+ allowStale?: boolean;
18
+ packageRoot?: string;
19
+ }
20
+ /**
21
+ * Refuse to run a compiled osq build whose `dist/` is older than `src/` when
22
+ * started from a repository checkout. An installed package carries no `src/`
23
+ * and is never considered stale. Prints exactly one error line and exits with
24
+ * code 1 when stale, so a developer rebuilds instead of debugging a phantom.
25
+ */
26
+ export declare function checkStaleBuild(options?: CheckStaleBuildOptions): Promise<void>;
27
+ //# sourceMappingURL=build.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.d.ts","sourceRoot":"","sources":["../../src/watcher/build.ts"],"names":[],"mappings":"AAOA,kFAAkF;AAClF,MAAM,WAAW,SAAS;IACxB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AA8FD;;;;;;;;GAQG;AACH,wBAAsB,gBAAgB,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,CAAC,CAe/E;AA0BD,MAAM,WAAW,sBAAsB;IACrC,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED;;;;;GAKG;AACH,wBAAsB,eAAe,CAAC,OAAO,GAAE,sBAA2B,GAAG,OAAO,CAAC,IAAI,CAAC,CA2BzF"}
@@ -0,0 +1,165 @@
1
+ import { createHash } from 'node:crypto';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import { readGitCommit, readGitTopLevel } from './build-project.js';
6
+ const UNKNOWN = 'unknown';
7
+ /**
8
+ * Package root of the running osq build: `src/watcher/` when executed through
9
+ * `tsx`, `dist/watcher/` once compiled. Both resolve two levels up.
10
+ */
11
+ const PACKAGE_ROOT = path.resolve(fileURLToPath(new URL('../../', import.meta.url)));
12
+ /**
13
+ * Whether this module is being executed from TypeScript source (via `tsx`)
14
+ * rather than from compiled output. Source execution always reflects the
15
+ * latest code, so there is no compiled build that could be stale.
16
+ */
17
+ const RUNNING_FROM_SOURCE = fileURLToPath(import.meta.url).endsWith('.ts');
18
+ const buildInfoCache = new Map();
19
+ /**
20
+ * Read the `version` field from the osq package root's own `package.json`.
21
+ * The project being watched is never consulted: an installed osq must report
22
+ * its own version, not the consumer's.
23
+ */
24
+ async function readVersion(packageRoot) {
25
+ try {
26
+ const raw = await fs.readFile(path.join(packageRoot, 'package.json'), 'utf8');
27
+ const parsed = JSON.parse(raw);
28
+ if (typeof parsed.version === 'string' && parsed.version.trim().length > 0) {
29
+ return parsed.version.trim();
30
+ }
31
+ }
32
+ catch {
33
+ // Missing or malformed file: report unknown.
34
+ }
35
+ return UNKNOWN;
36
+ }
37
+ /**
38
+ * SHA-256 over every file under `dist/`, first 8 hex characters. Paths are
39
+ * sorted so the hash is stable across filesystems; the relative path is folded
40
+ * in so a rename changes the hash even when contents do not. Returns `unknown`
41
+ * when `dist/` is absent or empty.
42
+ */
43
+ async function hashDist(projectRoot) {
44
+ const distDir = path.join(projectRoot, 'dist');
45
+ const files = [];
46
+ const walk = async (dir) => {
47
+ let entries;
48
+ try {
49
+ entries = await fs.readdir(dir, { withFileTypes: true });
50
+ }
51
+ catch {
52
+ return;
53
+ }
54
+ for (const entry of entries) {
55
+ const full = path.join(dir, entry.name);
56
+ if (entry.isDirectory()) {
57
+ await walk(full);
58
+ }
59
+ else if (entry.isFile()) {
60
+ files.push(full);
61
+ }
62
+ }
63
+ };
64
+ await walk(distDir);
65
+ if (files.length === 0) {
66
+ return UNKNOWN;
67
+ }
68
+ files.sort();
69
+ const hash = createHash('sha256');
70
+ for (const file of files) {
71
+ const relative = path.relative(distDir, file).split(path.sep).join('/');
72
+ hash.update(relative);
73
+ hash.update('\0');
74
+ hash.update(await fs.readFile(file));
75
+ hash.update('\0');
76
+ }
77
+ return hash.digest('hex').slice(0, 8);
78
+ }
79
+ /** Whether two paths resolve to the same real location on disk. */
80
+ async function sameRealPath(a, b) {
81
+ try {
82
+ const [realA, realB] = await Promise.all([fs.realpath(a), fs.realpath(b)]);
83
+ return realA === realB;
84
+ }
85
+ catch {
86
+ return false;
87
+ }
88
+ }
89
+ /**
90
+ * Resolve the active osq build identity from an optional osq package root,
91
+ * defaulting to the running package. Version comes from that root's
92
+ * `package.json`; the commit is the short git SHA only when the root is the top
93
+ * of a git work tree, otherwise a hash of that root's `dist/`, otherwise
94
+ * `unknown`. The project's `package.json` and HEAD are never consulted here;
95
+ * an installed osq must not report the consumer's identity. The result is
96
+ * cached per resolved root so the watcher pays the git spawn at most once.
97
+ */
98
+ export async function resolveBuildInfo(packageRoot) {
99
+ const root = path.resolve(packageRoot ?? PACKAGE_ROOT);
100
+ const cached = buildInfoCache.get(root);
101
+ if (cached) {
102
+ return cached;
103
+ }
104
+ const [version, gitTopLevel] = await Promise.all([readVersion(root), readGitTopLevel(root)]);
105
+ const commit = gitTopLevel && (await sameRealPath(gitTopLevel, root))
106
+ ? ((await readGitCommit(root)) ?? (await hashDist(root)))
107
+ : await hashDist(root);
108
+ const info = { version, commit };
109
+ buildInfoCache.set(root, info);
110
+ return info;
111
+ }
112
+ /** Newest `mtimeMs` among every file below `dir`, or 0 when none exist. */
113
+ async function newestMtimeMs(dir) {
114
+ let entries;
115
+ try {
116
+ entries = await fs.readdir(dir, { withFileTypes: true });
117
+ }
118
+ catch {
119
+ return 0;
120
+ }
121
+ let newest = 0;
122
+ for (const entry of entries) {
123
+ const full = path.join(dir, entry.name);
124
+ if (entry.isDirectory()) {
125
+ newest = Math.max(newest, await newestMtimeMs(full));
126
+ }
127
+ else if (entry.isFile()) {
128
+ const stat = await fs.stat(full).catch(() => null);
129
+ if (stat) {
130
+ newest = Math.max(newest, stat.mtimeMs);
131
+ }
132
+ }
133
+ }
134
+ return newest;
135
+ }
136
+ /**
137
+ * Refuse to run a compiled osq build whose `dist/` is older than `src/` when
138
+ * started from a repository checkout. An installed package carries no `src/`
139
+ * and is never considered stale. Prints exactly one error line and exits with
140
+ * code 1 when stale, so a developer rebuilds instead of debugging a phantom.
141
+ */
142
+ export async function checkStaleBuild(options = {}) {
143
+ if (options.allowStale === true) {
144
+ return;
145
+ }
146
+ // Executing from TypeScript source means the running code *is* the latest
147
+ // source, so there is no compiled output that can be stale. An explicit
148
+ // `packageRoot` (tests, diagnostics) always performs the comparison.
149
+ if (options.packageRoot === undefined && RUNNING_FROM_SOURCE) {
150
+ return;
151
+ }
152
+ const packageRoot = options.packageRoot ? path.resolve(options.packageRoot) : PACKAGE_ROOT;
153
+ const srcDir = path.join(packageRoot, 'src');
154
+ const srcStat = await fs.stat(srcDir).catch(() => null);
155
+ if (!srcStat?.isDirectory()) {
156
+ return;
157
+ }
158
+ const srcNewest = await newestMtimeMs(srcDir);
159
+ const distNewest = await newestMtimeMs(path.join(packageRoot, 'dist'));
160
+ if (srcNewest > distNewest) {
161
+ console.error("osq build is stale: src/ is newer than dist/. Run 'npm run build' or pass --allow-stale.");
162
+ process.exit(1);
163
+ }
164
+ }
165
+ //# sourceMappingURL=build.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build.js","sourceRoot":"","sources":["../../src/watcher/build.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ import type { OsqConfig } from '../core/foundation/config.js';
2
+ import { type VerificationGateResult } from './verify.js';
3
+ /** Failure evidence for a red change gate; the runner writes it through `fail`. */
4
+ export interface ChangeVerifyFailure {
5
+ marker: string;
6
+ error: string;
7
+ extra?: string;
8
+ }
9
+ export type ChangeVerifyOutcome = {
10
+ ok: true;
11
+ } | ({
12
+ ok: false;
13
+ } & ChangeVerifyFailure);
14
+ /** Deterministic marker with reason, command, numeric exit code, timeout, output. */
15
+ export declare function formatChangeVerifyMarker(command: string, result: VerificationGateResult): string;
16
+ /** Marker used when an approved proposal exposes no change-level verify command. */
17
+ export declare function formatMissingChangeVerifyMarker(): string;
18
+ /**
19
+ * Run the proposal's change-level verify after a passing task verify. Returns a
20
+ * passing outcome when the gate is disabled or green, otherwise failure
21
+ * evidence for the runner's single `fail` path. The shared gate entrypoint owns
22
+ * the single `verify_ran` event, attributed to the established `change` target.
23
+ */
24
+ export declare function runChangeVerifyGate(projectRoot: string, specFolderPath: string, config: OsqConfig): Promise<ChangeVerifyOutcome>;
25
+ //# sourceMappingURL=change-verify.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-verify.d.ts","sourceRoot":"","sources":["../../src/watcher/change-verify.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,8BAA8B,CAAC;AAE9D,OAAO,EAAE,KAAK,sBAAsB,EAA6B,MAAM,aAAa,CAAC;AAErF,mFAAmF;AACnF,MAAM,WAAW,mBAAmB;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,mBAAmB,GAAG;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,CAAC;IAAE,EAAE,EAAE,KAAK,CAAA;CAAE,GAAG,mBAAmB,CAAC,CAAC;AAEvF,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,sBAAsB,GAAG,MAAM,CAahG;AAED,oFAAoF;AACpF,wBAAgB,+BAA+B,IAAI,MAAM,CAQxD;AAED;;;;;GAKG;AACH,wBAAsB,mBAAmB,CACvC,WAAW,EAAE,MAAM,EACnB,cAAc,EAAE,MAAM,EACtB,MAAM,EAAE,SAAS,GAChB,OAAO,CAAC,mBAAmB,CAAC,CA4B9B"}