@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,138 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { parseEventLines } from './report-events.js';
4
+ /** The fixed flag ids in the order the digest emits them. */
5
+ const FLAG_IDS = [
6
+ 'shared_file',
7
+ 'sensitive_path',
8
+ 'verify_without_test',
9
+ 'removed_requirement',
10
+ 'unknown_capability',
11
+ 'verify_starts_conflict',
12
+ ];
13
+ /** The key used for changes whose recorded flag ids are empty. */
14
+ export const NO_APPROVAL_FLAGS = 'none';
15
+ /** Every reported key, never recomputed: the flag ids then `none`. */
16
+ export const APPROVAL_FLAG_KEYS = [...FLAG_IDS, NO_APPROVAL_FLAGS];
17
+ function emptyFlagOutcome() {
18
+ return {
19
+ shown: { fired: 0, troubled: 0 },
20
+ confirmed: { fired: 0, troubled: 0 },
21
+ };
22
+ }
23
+ /**
24
+ * The recorded `approvalFlags` of a manifest, or null when the file is
25
+ * malformed or the field is absent or does not carry a valid `ids` array and
26
+ * `shown`/`confirmed` mode.
27
+ */
28
+ function parseRecordedFlags(content) {
29
+ let parsed;
30
+ try {
31
+ parsed = JSON.parse(content);
32
+ }
33
+ catch {
34
+ return null;
35
+ }
36
+ if (!parsed || typeof parsed !== 'object' || Array.isArray(parsed))
37
+ return null;
38
+ const flags = parsed.approvalFlags;
39
+ if (!flags || typeof flags !== 'object' || Array.isArray(flags))
40
+ return null;
41
+ const record = flags;
42
+ if (record.mode !== 'shown' && record.mode !== 'confirmed')
43
+ return null;
44
+ if (!Array.isArray(record.ids))
45
+ return null;
46
+ if (!record.ids.every((id) => typeof id === 'string'))
47
+ return null;
48
+ return { ids: record.ids, mode: record.mode };
49
+ }
50
+ /** One numbered task stream; `change.jsonl` is the change-level stream. */
51
+ function isTaskStream(entry) {
52
+ return /^\d+\.jsonl$/.test(entry);
53
+ }
54
+ /** True when a stream carries trouble: a task `dead` or any kind of `regressed`. */
55
+ function streamHasTrouble(entry, content) {
56
+ const taskStream = isTaskStream(entry);
57
+ return parseEventLines(content).some((event) => {
58
+ if (event.type === 'regressed')
59
+ return true;
60
+ return taskStream && event.type === 'dead';
61
+ });
62
+ }
63
+ /**
64
+ * A change has later trouble when any numbered task stream holds a `dead`
65
+ * event, or any task or change stream holds a `regressed` event.
66
+ */
67
+ async function changeHasTrouble(folderPath) {
68
+ const eventsDir = path.join(folderPath, '.run', 'events');
69
+ let entries = [];
70
+ try {
71
+ entries = await fs.readdir(eventsDir);
72
+ }
73
+ catch {
74
+ return false;
75
+ }
76
+ for (const entry of entries) {
77
+ if (!entry.endsWith('.jsonl'))
78
+ continue;
79
+ if (!isTaskStream(entry) && entry !== 'change.jsonl')
80
+ continue;
81
+ const content = await fs.readFile(path.join(eventsDir, entry), 'utf8').catch(() => '');
82
+ if (streamHasTrouble(entry, content))
83
+ return true;
84
+ }
85
+ return false;
86
+ }
87
+ /** Every reported key starts at zero so callers never infer an absent key. */
88
+ function emptyByFlag() {
89
+ const byFlag = {};
90
+ for (const key of APPROVAL_FLAG_KEYS)
91
+ byFlag[key] = emptyFlagOutcome();
92
+ return byFlag;
93
+ }
94
+ /**
95
+ * Reads recorded `approvalFlags` from every given change folder's manifest and
96
+ * counts, per key and mode, how many changes fired it and how many later had
97
+ * trouble. Folders without a valid recorded field contribute nothing; flags
98
+ * are never recomputed from the authored change.
99
+ */
100
+ export async function collectApprovalFlagOutcomes(folders) {
101
+ const byFlag = emptyByFlag();
102
+ let changes = 0;
103
+ for (const folderPath of folders) {
104
+ const content = await fs
105
+ .readFile(path.join(folderPath, '.run', 'manifest.json'), 'utf8')
106
+ .catch(() => null);
107
+ if (content === null)
108
+ continue;
109
+ const recorded = parseRecordedFlags(content);
110
+ if (!recorded)
111
+ continue;
112
+ changes++;
113
+ const troubled = await changeHasTrouble(folderPath);
114
+ const keys = new Set(recorded.ids.length === 0 ? [NO_APPROVAL_FLAGS] : recorded.ids);
115
+ for (const key of keys) {
116
+ const outcome = byFlag[key];
117
+ if (!outcome)
118
+ continue;
119
+ const bucket = recorded.mode === 'confirmed' ? outcome.confirmed : outcome.shown;
120
+ bucket.fired++;
121
+ if (troubled)
122
+ bucket.troubled++;
123
+ }
124
+ }
125
+ return { changes, byFlag };
126
+ }
127
+ /** Render the `Approval flags:` body, one line per key in fixed order. */
128
+ export function formatApprovalFlagOutcomes(outcomes) {
129
+ const lines = [` ${outcomes.changes} approved changes recorded flags`];
130
+ for (const key of APPROVAL_FLAG_KEYS) {
131
+ const outcome = outcomes.byFlag[key] ?? emptyFlagOutcome();
132
+ const fired = outcome.shown.fired + outcome.confirmed.fired;
133
+ const troubled = outcome.shown.troubled + outcome.confirmed.troubled;
134
+ lines.push(` ${key}: fired ${fired} (shown ${outcome.shown.fired}, confirmed ${outcome.confirmed.fired}), later trouble ${troubled} (shown ${outcome.shown.troubled}, confirmed ${outcome.confirmed.troubled})`);
135
+ }
136
+ return lines;
137
+ }
138
+ //# sourceMappingURL=approval-flags.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"approval-flags.js","sourceRoot":"","sources":["../../../src/core/report/approval-flags.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /** Per-kind planning token totals of one change; null means nothing reported. */
2
+ export interface PlanningChangeTokens {
3
+ readonly input: number | null;
4
+ readonly output: number | null;
5
+ readonly cacheRead: number | null;
6
+ readonly cacheWrite: number | null;
7
+ readonly reasoning: number | null;
8
+ }
9
+ /** Per-change planning economics derived from slices, usage, and measures. */
10
+ export interface PlanningChangeEconomics {
11
+ readonly sessions: number;
12
+ readonly tokens: PlanningChangeTokens;
13
+ readonly activeMinutes: number | null;
14
+ readonly cost: number | null;
15
+ readonly specWords: number | null;
16
+ readonly changedLines: number | null;
17
+ readonly specWordsPerChangedLine: number | null;
18
+ readonly minutesLastEditToApproval: number | null;
19
+ }
20
+ /** One side of the planning-versus-execution comparison. */
21
+ export interface PlanningComparisonSide {
22
+ /** Null when nothing on this side reported that kind of token. */
23
+ readonly input: number | null;
24
+ readonly output: number | null;
25
+ readonly cached: number | null;
26
+ readonly reasoning: number | null;
27
+ /** Null when nothing on this side reported a cost. */
28
+ readonly cost: number | null;
29
+ }
30
+ /** Planning against executor tokens and cost, in totals. */
31
+ export interface PlanningComparison {
32
+ readonly planning: PlanningComparisonSide;
33
+ readonly execution: PlanningComparisonSide;
34
+ }
35
+ /** Planning economics for every change folder carrying a valid planning start. */
36
+ export declare function computePlanningByChange(folders: readonly string[]): Promise<Record<string, PlanningChangeEconomics>>;
37
+ /** Planning against execution totals, with null costs when nothing reported. */
38
+ export declare function buildPlanningComparison(planning: PlanningComparisonSide, execution: PlanningComparisonSide): PlanningComparison;
39
+ //# sourceMappingURL=planning-economics.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planning-economics.d.ts","sourceRoot":"","sources":["../../../src/core/report/planning-economics.ts"],"names":[],"mappings":"AAMA,iFAAiF;AACjF,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CACnC;AAED,8EAA8E;AAC9E,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IACtC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,uBAAuB,EAAE,MAAM,GAAG,IAAI,CAAC;IAChD,QAAQ,CAAC,yBAAyB,EAAE,MAAM,GAAG,IAAI,CAAC;CACnD;AAED,4DAA4D;AAC5D,MAAM,WAAW,sBAAsB;IACrC,kEAAkE;IAClE,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,sDAAsD;IACtD,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED,4DAA4D;AAC5D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,QAAQ,EAAE,sBAAsB,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,sBAAsB,CAAC;CAC5C;AA+JD,kFAAkF;AAClF,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,SAAS,MAAM,EAAE,GACzB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,uBAAuB,CAAC,CAAC,CAOlD;AAED,gFAAgF;AAChF,wBAAgB,uBAAuB,CACrC,QAAQ,EAAE,sBAAsB,EAChC,SAAS,EAAE,sBAAsB,GAChC,kBAAkB,CAEpB"}
@@ -0,0 +1,168 @@
1
+ import fs from 'node:fs/promises';
2
+ import path from 'node:path';
3
+ import { compareNumericPrefix } from '../status/state.js';
4
+ import { readPlanningSessions } from './planning-records.js';
5
+ import { asData, parseEventLines } from './report-events.js';
6
+ function round2(value) {
7
+ return Math.round(value * 100) / 100;
8
+ }
9
+ /** Sum a nullable observation, staying null until the first report arrives. */
10
+ function addNullable(current, value) {
11
+ if (value === null)
12
+ return current;
13
+ return current === null ? value : current + value;
14
+ }
15
+ /** Epoch milliseconds for a persisted ISO timestamp, or null when invalid. */
16
+ function parseTimeMs(value) {
17
+ if (typeof value !== 'string' || !value)
18
+ return null;
19
+ const ms = Date.parse(value);
20
+ return Number.isFinite(ms) ? ms : null;
21
+ }
22
+ function finiteNumber(value) {
23
+ return typeof value === 'number' && Number.isFinite(value) ? value : null;
24
+ }
25
+ /** Task event files (`<n>.jsonl`) in stable numeric order. */
26
+ function numericTaskFiles(entries) {
27
+ return entries.filter((entry) => /^\d+\.jsonl$/.test(entry)).sort(compareNumericPrefix);
28
+ }
29
+ /**
30
+ * One change's spec words and changed lines from `measures` events. Spec words
31
+ * are the first task start's `proposalWords` plus every task's first start
32
+ * `taskWords`; changed lines sum each task's last end `changedLines`.
33
+ */
34
+ async function readMeasuresTotals(folderPath) {
35
+ const eventsDir = path.join(folderPath, '.run', 'events');
36
+ let entries = [];
37
+ try {
38
+ entries = numericTaskFiles(await fs.readdir(eventsDir));
39
+ }
40
+ catch {
41
+ return { specWords: null, changedLines: null };
42
+ }
43
+ let sawStart = false;
44
+ let firstProposalWords = null;
45
+ let taskWordsTotal = null;
46
+ let changedLines = null;
47
+ for (const entry of entries) {
48
+ const content = await fs.readFile(path.join(eventsDir, entry), 'utf8').catch(() => null);
49
+ if (content === null)
50
+ continue;
51
+ let firstStart = null;
52
+ let lastEndChanged = null;
53
+ for (const event of parseEventLines(content)) {
54
+ if (event.type !== 'measures')
55
+ continue;
56
+ const data = asData(event);
57
+ if (!data)
58
+ continue;
59
+ if (data.phase === 'start' && firstStart === null) {
60
+ firstStart = data;
61
+ if (!sawStart) {
62
+ sawStart = true;
63
+ firstProposalWords = finiteNumber(data.proposalWords);
64
+ }
65
+ }
66
+ else if (data.phase === 'end') {
67
+ const value = finiteNumber(data.changedLines);
68
+ lastEndChanged = value !== null && value >= 0 ? value : null;
69
+ }
70
+ }
71
+ if (firstStart !== null) {
72
+ const taskWords = finiteNumber(firstStart.taskWords);
73
+ if (taskWords !== null)
74
+ taskWordsTotal = (taskWordsTotal ?? 0) + taskWords;
75
+ }
76
+ if (lastEndChanged !== null)
77
+ changedLines = (changedLines ?? 0) + lastEndChanged;
78
+ }
79
+ return {
80
+ specWords: sawStart ? (firstProposalWords ?? 0) + (taskWordsTotal ?? 0) : null,
81
+ changedLines,
82
+ };
83
+ }
84
+ /**
85
+ * Per-change planning economics for one folder, or null when it has no valid
86
+ * planning start. Sliced sessions contribute their slice; legacy sessions
87
+ * contribute usage input, output, and reasoning with a null cache split.
88
+ */
89
+ async function changeEconomics(folderPath) {
90
+ const sessions = await readPlanningSessions(folderPath);
91
+ const validSessions = sessions.filter((session) => session.started !== null);
92
+ if (validSessions.length === 0)
93
+ return null;
94
+ let tokens = {
95
+ input: null,
96
+ output: null,
97
+ cacheRead: null,
98
+ cacheWrite: null,
99
+ reasoning: null,
100
+ };
101
+ let activeMinutes = null;
102
+ let cost = null;
103
+ let latestApprovedMs = null;
104
+ let latestLastEditMs = null;
105
+ for (const session of validSessions) {
106
+ const exited = session.exited;
107
+ if (!exited)
108
+ continue;
109
+ const usage = exited.data.usage;
110
+ const slice = exited.data.slice;
111
+ if (slice) {
112
+ tokens = {
113
+ input: addNullable(tokens.input, slice.tokens.input),
114
+ output: addNullable(tokens.output, slice.tokens.output),
115
+ cacheRead: addNullable(tokens.cacheRead, slice.tokens.cacheRead),
116
+ cacheWrite: addNullable(tokens.cacheWrite, slice.tokens.cacheWrite),
117
+ reasoning: addNullable(tokens.reasoning, slice.tokens.reasoning),
118
+ };
119
+ activeMinutes = addNullable(activeMinutes, slice.activeMinutes);
120
+ const approvedMs = parseTimeMs(slice.approvedAt);
121
+ if (approvedMs !== null)
122
+ latestApprovedMs = Math.max(latestApprovedMs ?? approvedMs, approvedMs);
123
+ const lastEditMs = parseTimeMs(slice.lastEditAt);
124
+ if (lastEditMs !== null)
125
+ latestLastEditMs = Math.max(latestLastEditMs ?? lastEditMs, lastEditMs);
126
+ }
127
+ else {
128
+ tokens = {
129
+ ...tokens,
130
+ input: addNullable(tokens.input, usage.inputTokens),
131
+ output: addNullable(tokens.output, usage.outputTokens),
132
+ reasoning: addNullable(tokens.reasoning, usage.reasoningTokens),
133
+ };
134
+ }
135
+ cost = addNullable(cost, usage.cost);
136
+ }
137
+ const measures = await readMeasuresTotals(folderPath);
138
+ const ratio = measures.specWords !== null && measures.changedLines !== null && measures.changedLines !== 0
139
+ ? round2(measures.specWords / measures.changedLines)
140
+ : null;
141
+ return {
142
+ sessions: validSessions.length,
143
+ tokens,
144
+ activeMinutes,
145
+ cost,
146
+ specWords: measures.specWords,
147
+ changedLines: measures.changedLines,
148
+ specWordsPerChangedLine: ratio,
149
+ minutesLastEditToApproval: latestApprovedMs !== null && latestLastEditMs !== null
150
+ ? round2((latestApprovedMs - latestLastEditMs) / 60000)
151
+ : null,
152
+ };
153
+ }
154
+ /** Planning economics for every change folder carrying a valid planning start. */
155
+ export async function computePlanningByChange(folders) {
156
+ const byChange = {};
157
+ for (const folderPath of folders) {
158
+ const economics = await changeEconomics(folderPath);
159
+ if (economics)
160
+ byChange[path.basename(folderPath)] = economics;
161
+ }
162
+ return byChange;
163
+ }
164
+ /** Planning against execution totals, with null costs when nothing reported. */
165
+ export function buildPlanningComparison(planning, execution) {
166
+ return { planning, execution };
167
+ }
168
+ //# sourceMappingURL=planning-economics.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planning-economics.js","sourceRoot":"","sources":["../../../src/core/report/planning-economics.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ import { type PlanningConfig } from '../foundation/config-planning.js';
2
+ import { type PlanningUsage } from './planning-records.js';
3
+ import { type PlanningSlice, type PlanningTurn } from './planning-slice.js';
4
+ export type { PlanningSlice, PlanningTurn } from './planning-slice.js';
5
+ export { isSegmentContained, normalizeObservedTarget } from './planning-slice.js';
6
+ export { resolveChangeApprovalTime, resolveChangeCreationTime } from './planning-slice-lookup.js';
7
+ export interface PlanningSessionEdit {
8
+ /** Path exactly as reported by the native tool call, absolute or relative. */
9
+ readonly path: string;
10
+ readonly timestamp: string;
11
+ }
12
+ /** The reader port every harness returns; one turn per native model response. */
13
+ export interface ObservedPlanningSession {
14
+ readonly harness: string;
15
+ readonly nativeSessionId: string;
16
+ readonly sessionDir: string | null;
17
+ readonly model: string | null;
18
+ /** Harness version when the transcript records one. */
19
+ readonly harnessVersion?: string | null;
20
+ /** Whole-session reported cost when the harness records one. */
21
+ readonly sessionCost?: number | null;
22
+ readonly turns: readonly PlanningTurn[];
23
+ }
24
+ /** Independent local reader for one harness. Failure degrades to no matches. */
25
+ export type PlanningSessionReader = () => Promise<readonly ObservedPlanningSession[]>;
26
+ /** A session reduced to the turns the selected change owns. */
27
+ export interface PlanningObservation {
28
+ readonly harness: string;
29
+ readonly nativeSessionId: string;
30
+ readonly sessionId: string;
31
+ readonly model: string | null;
32
+ readonly startedAt: string;
33
+ readonly endedAt: string;
34
+ readonly usage: PlanningUsage;
35
+ readonly slice: PlanningSlice;
36
+ }
37
+ export interface FindPlanningSessionsOptions {
38
+ /** Persisted change creation time; invalid or absent yields no matches. */
39
+ readonly createdAt: string | null;
40
+ /** Single captured observation end. */
41
+ readonly observedAt: string;
42
+ /** Directory holding the session's change folders and their `archive/`. */
43
+ readonly changesDir?: string;
44
+ /** Resolved planning measurement settings. */
45
+ readonly planning?: PlanningConfig;
46
+ readonly readers: readonly PlanningSessionReader[];
47
+ }
48
+ export interface AppendObservedOptions {
49
+ /** SHA-256 digest of the current `brief.md` bytes. */
50
+ readonly briefHash: string;
51
+ readonly osqVersion: string;
52
+ }
53
+ /** Stable observed session id derived from reader name and native id. */
54
+ export declare function observedSessionId(harness: string, nativeSessionId: string): string;
55
+ /** Ask every reader for sessions editing inside the change during the window. */
56
+ export declare function findPlanningSessions(changeFolder: string, options: FindPlanningSessionsOptions): Promise<PlanningObservation[]>;
57
+ /** Append one deterministic observed pair per native session, idempotently. */
58
+ export declare function appendObservedSessions(changeFolder: string, observations: readonly PlanningObservation[], options: AppendObservedOptions): Promise<number>;
59
+ //# sourceMappingURL=planning-observed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planning-observed.d.ts","sourceRoot":"","sources":["../../../src/core/report/planning-observed.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2B,KAAK,cAAc,EAAE,MAAM,kCAAkC,CAAC;AAChG,OAAO,EAAmB,KAAK,aAAa,EAAmB,MAAM,uBAAuB,CAAC;AAG7F,OAAO,EAAE,KAAK,aAAa,EAAE,KAAK,YAAY,EAAwB,MAAM,qBAAqB,CAAC;AAGlG,YAAY,EAAE,aAAa,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAClF,OAAO,EAAE,yBAAyB,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AAElG,MAAM,WAAW,mBAAmB;IAClC,8EAA8E;IAC9E,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AAED,iFAAiF;AACjF,MAAM,WAAW,uBAAuB;IACtC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IACnC,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,uDAAuD;IACvD,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACxC,gEAAgE;IAChE,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,KAAK,EAAE,SAAS,YAAY,EAAE,CAAC;CACzC;AAED,gFAAgF;AAChF,MAAM,MAAM,qBAAqB,GAAG,MAAM,OAAO,CAAC,SAAS,uBAAuB,EAAE,CAAC,CAAC;AAEtF,+DAA+D;AAC/D,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,aAAa,CAAC;CAC/B;AAED,MAAM,WAAW,2BAA2B;IAC1C,2EAA2E;IAC3E,QAAQ,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IAClC,uCAAuC;IACvC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,2EAA2E;IAC3E,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,8CAA8C;IAC9C,QAAQ,CAAC,QAAQ,CAAC,EAAE,cAAc,CAAC;IACnC,QAAQ,CAAC,OAAO,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACpD;AAED,MAAM,WAAW,qBAAqB;IACpC,sDAAsD;IACtD,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;CAC7B;AAUD,yEAAyE;AACzE,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,MAAM,CAElF;AAUD,iFAAiF;AACjF,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,mBAAmB,EAAE,CAAC,CA4DhC;AASD,+EAA+E;AAC/E,wBAAsB,sBAAsB,CAC1C,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,SAAS,mBAAmB,EAAE,EAC5C,OAAO,EAAE,qBAAqB,GAC7B,OAAO,CAAC,MAAM,CAAC,CAsCjB"}
@@ -0,0 +1,135 @@
1
+ import { DEFAULT_PLANNING_CONFIG } from '../foundation/config-planning.js';
2
+ import { readPlanRecords } from './planning-records.js';
3
+ import { resolveChangeApprovalTime } from './planning-slice-lookup.js';
4
+ import { firstMatchingEdit, lastTurnModel, parseMs, sessionEdits } from './planning-slice-turns.js';
5
+ import { sliceChangeOwnership } from './planning-slice.js';
6
+ import { appendPlanRecord } from './planning.js';
7
+ export { isSegmentContained, normalizeObservedTarget } from './planning-slice.js';
8
+ export { resolveChangeApprovalTime, resolveChangeCreationTime } from './planning-slice-lookup.js';
9
+ /** Fixed reader order so appended records are deterministic. */
10
+ const HARNESS_ORDER = ['codex', 'opencode', 'claude'];
11
+ function harnessRank(harness) {
12
+ const index = HARNESS_ORDER.indexOf(harness);
13
+ return index === -1 ? HARNESS_ORDER.length : index;
14
+ }
15
+ /** Stable observed session id derived from reader name and native id. */
16
+ export function observedSessionId(harness, nativeSessionId) {
17
+ return `observed:${harness}:${nativeSessionId}`;
18
+ }
19
+ function compareObservations(a, b) {
20
+ const rank = harnessRank(a.harness) - harnessRank(b.harness);
21
+ if (rank !== 0)
22
+ return rank;
23
+ const start = a.startedAt.localeCompare(b.startedAt);
24
+ if (start !== 0)
25
+ return start;
26
+ return a.nativeSessionId.localeCompare(b.nativeSessionId);
27
+ }
28
+ /** Ask every reader for sessions editing inside the change during the window. */
29
+ export async function findPlanningSessions(changeFolder, options) {
30
+ const createdMs = parseMs(options.createdAt);
31
+ const observedMs = parseMs(options.observedAt);
32
+ if (createdMs === null || observedMs === null || observedMs < createdMs)
33
+ return [];
34
+ const approvedAt = options.observedAt;
35
+ const planning = options.planning ?? DEFAULT_PLANNING_CONFIG;
36
+ const approvalCache = new Map();
37
+ const bySessionId = new Map();
38
+ for (const reader of options.readers) {
39
+ let candidates;
40
+ try {
41
+ candidates = await reader();
42
+ }
43
+ catch {
44
+ continue;
45
+ }
46
+ if (!Array.isArray(candidates))
47
+ continue;
48
+ const ordered = [...candidates].sort((a, b) => (a.nativeSessionId ?? '').localeCompare(b.nativeSessionId ?? ''));
49
+ for (const candidate of ordered) {
50
+ if (!candidate?.harness || !candidate?.nativeSessionId)
51
+ continue;
52
+ const sessionDir = candidate.sessionDir ?? null;
53
+ const edit = firstMatchingEdit(sessionEdits(candidate), sessionDir, changeFolder, createdMs, observedMs);
54
+ if (!edit)
55
+ continue;
56
+ const sessionId = observedSessionId(candidate.harness, candidate.nativeSessionId);
57
+ if (bySessionId.has(sessionId))
58
+ continue;
59
+ const result = await sliceChangeOwnership({
60
+ changeFolder,
61
+ changesDir: options.changesDir ?? null,
62
+ sessionId,
63
+ sessionDir,
64
+ approvedAt,
65
+ turns: candidate.turns,
66
+ sessionCost: candidate.sessionCost ?? null,
67
+ idleGapMinutes: planning.idleGapMinutes,
68
+ ...(planning.prices ? { prices: planning.prices } : {}),
69
+ resolveApproval: (folder, id) => resolveChangeApprovalTime(folder, id, approvalCache),
70
+ });
71
+ if (!result)
72
+ continue;
73
+ const sessionModel = candidate.model && candidate.model.length > 0 ? candidate.model : null;
74
+ bySessionId.set(sessionId, {
75
+ harness: candidate.harness,
76
+ nativeSessionId: candidate.nativeSessionId,
77
+ sessionId,
78
+ model: lastTurnModel(result.ownedTurns) ?? sessionModel,
79
+ startedAt: result.slice.start,
80
+ endedAt: result.slice.end,
81
+ usage: result.usage,
82
+ slice: result.slice,
83
+ });
84
+ }
85
+ }
86
+ return [...bySessionId.values()].sort(compareObservations);
87
+ }
88
+ function observedWallSeconds(startedAt, endedAt) {
89
+ const start = Date.parse(startedAt);
90
+ const end = Date.parse(endedAt);
91
+ if (!Number.isFinite(start) || !Number.isFinite(end) || end <= start)
92
+ return 0;
93
+ return (end - start) / 1000;
94
+ }
95
+ /** Append one deterministic observed pair per native session, idempotently. */
96
+ export async function appendObservedSessions(changeFolder, observations, options) {
97
+ if (observations.length === 0)
98
+ return 0;
99
+ const existing = new Set((await readPlanRecords(changeFolder))
100
+ .filter((record) => record.type === 'plan_started')
101
+ .map((record) => record.sessionId));
102
+ let appended = 0;
103
+ for (const observation of observations) {
104
+ if (existing.has(observation.sessionId))
105
+ continue;
106
+ existing.add(observation.sessionId);
107
+ await appendPlanRecord(changeFolder, {
108
+ type: 'plan_started',
109
+ sessionId: observation.sessionId,
110
+ timestamp: observation.startedAt,
111
+ source: 'observed',
112
+ data: {
113
+ harness: observation.harness,
114
+ model: observation.model,
115
+ osqVersion: options.osqVersion,
116
+ briefHash: options.briefHash,
117
+ },
118
+ });
119
+ await appendPlanRecord(changeFolder, {
120
+ type: 'plan_exited',
121
+ sessionId: observation.sessionId,
122
+ timestamp: observation.endedAt,
123
+ source: 'observed',
124
+ data: {
125
+ exitCode: null,
126
+ wallSeconds: observedWallSeconds(observation.startedAt, observation.endedAt),
127
+ usage: observation.usage,
128
+ slice: observation.slice,
129
+ },
130
+ });
131
+ appended++;
132
+ }
133
+ return appended;
134
+ }
135
+ //# sourceMappingURL=planning-observed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"planning-observed.js","sourceRoot":"","sources":["../../../src/core/report/planning-observed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import type { PlanningSlice } from './planning-slice.js';
2
+ /** Origin of one lifecycle record: osq-owned interactive session or local observation. */
3
+ export type PlanningSource = 'owned' | 'observed';
4
+ /** Observed-only planning usage. Every field is independently nullable. */
5
+ export interface PlanningUsage {
6
+ inputTokens: number | null;
7
+ outputTokens: number | null;
8
+ cachedTokens: number | null;
9
+ reasoningTokens: number | null;
10
+ cost: number | null;
11
+ }
12
+ /** Value used when no reader exists or a reader cannot supply values. */
13
+ export declare const NULL_PLANNING_USAGE: PlanningUsage;
14
+ /** Interval and working directory passed to an optional harness usage reader. */
15
+ export interface PlanningUsageReaderOptions {
16
+ readonly cwd: string;
17
+ readonly startedAt: string;
18
+ readonly endedAt: string;
19
+ }
20
+ /** Structural port matching the optional `HarnessAdapter.readInteractiveUsage`. */
21
+ export type PlanningUsageReader = (options: PlanningUsageReaderOptions) => Promise<PlanningUsage>;
22
+ export interface PlanStartedRecord {
23
+ type: 'plan_started';
24
+ sessionId: string;
25
+ timestamp: string;
26
+ /** Absent on legacy records; absence reads as owned. */
27
+ source?: PlanningSource;
28
+ data: {
29
+ harness: string;
30
+ model: string | null;
31
+ agent?: string;
32
+ osqVersion: string;
33
+ briefHash: string;
34
+ };
35
+ }
36
+ export interface PlanExitedRecord {
37
+ type: 'plan_exited';
38
+ sessionId: string;
39
+ timestamp: string;
40
+ /** Absent on legacy records; absence reads as owned. */
41
+ source?: PlanningSource;
42
+ data: {
43
+ exitCode: number | null;
44
+ wallSeconds: number;
45
+ usage: PlanningUsage;
46
+ /** Observed slice measures; absent on legacy or malformed records. */
47
+ slice?: PlanningSlice;
48
+ };
49
+ }
50
+ export type PlanRecord = PlanStartedRecord | PlanExitedRecord;
51
+ /** A lifecycle pair correlated by planning-session identifier. */
52
+ export interface PlanningSession {
53
+ sessionId: string;
54
+ started: PlanStartedRecord | null;
55
+ exited: PlanExitedRecord | null;
56
+ }
57
+ /** Source of one record, reading a legacy record without a source as owned. */
58
+ export declare function planningRecordSource(record: PlanRecord): PlanningSource;
59
+ /** `<changeFolder>/.run/plan.jsonl`. */
60
+ export declare function getPlanLogPath(changeFolder: string): string;
61
+ /** Parses a `plan.jsonl` body, skipping blank and malformed lines. */
62
+ export declare function parsePlanRecords(content: string): PlanRecord[];
63
+ /** Reads `<change>/.run/plan.jsonl`; a missing log yields an empty array. */
64
+ export declare function readPlanRecords(changeFolder: string): Promise<PlanRecord[]>;
65
+ /** Correlates records by session id, returning sessions in start order. */
66
+ export declare function correlatePlanSessions(records: readonly PlanRecord[]): PlanningSession[];
67
+ /** Reads and correlates a change's planning log in one call. */
68
+ export declare function readPlanningSessions(changeFolder: string): Promise<PlanningSession[]>;
69
+ //# sourceMappingURL=planning-records.d.ts.map