@entelligentsia/forgecli 1.0.20 → 1.0.21

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 (324) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/README.md +7 -1
  3. package/dist/bin/config.js +4 -4
  4. package/dist/bin/config.js.map +1 -1
  5. package/dist/bin/update-cli.d.ts +1 -1
  6. package/dist/bin/update-cli.js +1 -1
  7. package/dist/bin/update-cli.js.map +1 -1
  8. package/dist/extensions/forgecli/ask-user-tool.js +1 -1
  9. package/dist/extensions/forgecli/ask-user-tool.js.map +1 -1
  10. package/dist/extensions/forgecli/commands/add-pipeline.d.ts +19 -0
  11. package/dist/extensions/forgecli/commands/add-pipeline.js +143 -0
  12. package/dist/extensions/forgecli/commands/add-pipeline.js.map +1 -0
  13. package/dist/extensions/forgecli/commands/add-task.d.ts +20 -0
  14. package/dist/extensions/forgecli/commands/add-task.js +154 -0
  15. package/dist/extensions/forgecli/commands/add-task.js.map +1 -0
  16. package/dist/extensions/forgecli/commands/approve.d.ts +22 -0
  17. package/dist/extensions/forgecli/commands/approve.js +152 -0
  18. package/dist/extensions/forgecli/commands/approve.js.map +1 -0
  19. package/dist/extensions/forgecli/commands/collate.d.ts +22 -0
  20. package/dist/extensions/forgecli/commands/collate.js +134 -0
  21. package/dist/extensions/forgecli/commands/collate.js.map +1 -0
  22. package/dist/extensions/forgecli/commands/commit.d.ts +22 -0
  23. package/dist/extensions/forgecli/commands/commit.js +152 -0
  24. package/dist/extensions/forgecli/commands/commit.js.map +1 -0
  25. package/dist/extensions/forgecli/commands/config-command.d.ts +8 -0
  26. package/dist/extensions/forgecli/commands/config-command.js +67 -0
  27. package/dist/extensions/forgecli/commands/config-command.js.map +1 -0
  28. package/dist/extensions/forgecli/commands/enhance.d.ts +45 -0
  29. package/dist/extensions/forgecli/commands/enhance.js +219 -0
  30. package/dist/extensions/forgecli/commands/enhance.js.map +1 -0
  31. package/dist/extensions/forgecli/commands/implement.d.ts +22 -0
  32. package/dist/extensions/forgecli/commands/implement.js +170 -0
  33. package/dist/extensions/forgecli/commands/implement.js.map +1 -0
  34. package/dist/extensions/forgecli/commands/plan.d.ts +22 -0
  35. package/dist/extensions/forgecli/commands/plan.js +167 -0
  36. package/dist/extensions/forgecli/commands/plan.js.map +1 -0
  37. package/dist/extensions/forgecli/commands/quiz-agent.d.ts +17 -0
  38. package/dist/extensions/forgecli/commands/quiz-agent.js +98 -0
  39. package/dist/extensions/forgecli/commands/quiz-agent.js.map +1 -0
  40. package/dist/extensions/forgecli/commands/read-command.d.ts +2 -0
  41. package/dist/extensions/forgecli/commands/read-command.js +100 -0
  42. package/dist/extensions/forgecli/commands/read-command.js.map +1 -0
  43. package/dist/extensions/forgecli/commands/regenerate.d.ts +40 -0
  44. package/dist/extensions/forgecli/commands/regenerate.js +426 -0
  45. package/dist/extensions/forgecli/commands/regenerate.js.map +1 -0
  46. package/dist/extensions/forgecli/commands/remove-command.d.ts +17 -0
  47. package/dist/extensions/forgecli/commands/remove-command.js +124 -0
  48. package/dist/extensions/forgecli/commands/remove-command.js.map +1 -0
  49. package/dist/extensions/forgecli/commands/report-bug.d.ts +25 -0
  50. package/dist/extensions/forgecli/commands/report-bug.js +159 -0
  51. package/dist/extensions/forgecli/commands/report-bug.js.map +1 -0
  52. package/dist/extensions/forgecli/commands/retrospective.d.ts +20 -0
  53. package/dist/extensions/forgecli/commands/retrospective.js +126 -0
  54. package/dist/extensions/forgecli/commands/retrospective.js.map +1 -0
  55. package/dist/extensions/forgecli/commands/review-code.d.ts +35 -0
  56. package/dist/extensions/forgecli/commands/review-code.js +196 -0
  57. package/dist/extensions/forgecli/commands/review-code.js.map +1 -0
  58. package/dist/extensions/forgecli/commands/review-plan.d.ts +35 -0
  59. package/dist/extensions/forgecli/commands/review-plan.js +200 -0
  60. package/dist/extensions/forgecli/commands/review-plan.js.map +1 -0
  61. package/dist/extensions/forgecli/commands/sprint-intake.d.ts +10 -0
  62. package/dist/extensions/forgecli/commands/sprint-intake.js +91 -0
  63. package/dist/extensions/forgecli/commands/sprint-intake.js.map +1 -0
  64. package/dist/extensions/forgecli/commands/sprint-plan.d.ts +14 -0
  65. package/dist/extensions/forgecli/commands/sprint-plan.js +122 -0
  66. package/dist/extensions/forgecli/commands/sprint-plan.js.map +1 -0
  67. package/dist/extensions/forgecli/commands/status-command.d.ts +19 -0
  68. package/dist/extensions/forgecli/commands/status-command.js +140 -0
  69. package/dist/extensions/forgecli/commands/status-command.js.map +1 -0
  70. package/dist/extensions/forgecli/commands/store-query.d.ts +22 -0
  71. package/dist/extensions/forgecli/commands/store-query.js +107 -0
  72. package/dist/extensions/forgecli/commands/store-query.js.map +1 -0
  73. package/dist/extensions/forgecli/commands/store-repair.d.ts +17 -0
  74. package/dist/extensions/forgecli/commands/store-repair.js +123 -0
  75. package/dist/extensions/forgecli/commands/store-repair.js.map +1 -0
  76. package/dist/extensions/forgecli/commands/test-orchestrate.d.ts +2 -0
  77. package/dist/extensions/forgecli/commands/test-orchestrate.js +182 -0
  78. package/dist/extensions/forgecli/commands/test-orchestrate.js.map +1 -0
  79. package/dist/extensions/forgecli/commands/transcripts-command.d.ts +87 -0
  80. package/dist/extensions/forgecli/commands/transcripts-command.js +418 -0
  81. package/dist/extensions/forgecli/commands/transcripts-command.js.map +1 -0
  82. package/dist/extensions/forgecli/commands/validate.d.ts +22 -0
  83. package/dist/extensions/forgecli/commands/validate.js +152 -0
  84. package/dist/extensions/forgecli/commands/validate.js.map +1 -0
  85. package/dist/extensions/forgecli/config/config-layer.d.ts +53 -0
  86. package/dist/extensions/forgecli/config/config-layer.js +72 -0
  87. package/dist/extensions/forgecli/config/config-layer.js.map +1 -0
  88. package/dist/extensions/forgecli/config/config-writer.d.ts +16 -0
  89. package/dist/extensions/forgecli/config/config-writer.js +69 -0
  90. package/dist/extensions/forgecli/config/config-writer.js.map +1 -0
  91. package/dist/extensions/forgecli/config/model-registry.d.ts +61 -0
  92. package/dist/extensions/forgecli/config/model-registry.js +127 -0
  93. package/dist/extensions/forgecli/config/model-registry.js.map +1 -0
  94. package/dist/extensions/forgecli/config/model-resolver.d.ts +32 -0
  95. package/dist/extensions/forgecli/config/model-resolver.js +65 -0
  96. package/dist/extensions/forgecli/config/model-resolver.js.map +1 -0
  97. package/dist/extensions/forgecli/config/model-validator.d.ts +29 -0
  98. package/dist/extensions/forgecli/config/model-validator.js +107 -0
  99. package/dist/extensions/forgecli/config/model-validator.js.map +1 -0
  100. package/dist/extensions/forgecli/config-tui/component.js +1 -1
  101. package/dist/extensions/forgecli/config-tui/component.js.map +1 -1
  102. package/dist/extensions/forgecli/config-tui/handler.js +1 -1
  103. package/dist/extensions/forgecli/config-tui/handler.js.map +1 -1
  104. package/dist/extensions/forgecli/config-tui/screens/override-editor.js +1 -1
  105. package/dist/extensions/forgecli/config-tui/screens/override-editor.js.map +1 -1
  106. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js +1 -1
  107. package/dist/extensions/forgecli/config-tui/screens/overrides-list-phases.js.map +1 -1
  108. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js +1 -1
  109. package/dist/extensions/forgecli/config-tui/screens/show-resolved.js.map +1 -1
  110. package/dist/extensions/forgecli/config-tui/state/buffer.d.ts +2 -2
  111. package/dist/extensions/forgecli/config-tui/state/model.d.ts +1 -1
  112. package/dist/extensions/forgecli/config-tui/state/reducer.js.map +1 -1
  113. package/dist/extensions/forgecli/config-tui/state/selectors.d.ts +2 -2
  114. package/dist/extensions/forgecli/config-tui/state/selectors.js +1 -1
  115. package/dist/extensions/forgecli/config-tui/state/selectors.js.map +1 -1
  116. package/dist/extensions/forgecli/context-governor-compaction.d.ts +13 -2
  117. package/dist/extensions/forgecli/context-governor-compaction.js +66 -41
  118. package/dist/extensions/forgecli/context-governor-compaction.js.map +1 -1
  119. package/dist/extensions/forgecli/context-governor.d.ts +3 -7
  120. package/dist/extensions/forgecli/context-governor.js +43 -69
  121. package/dist/extensions/forgecli/context-governor.js.map +1 -1
  122. package/dist/extensions/forgecli/dashboard/component.d.ts +10 -1
  123. package/dist/extensions/forgecli/dashboard/component.js +84 -18
  124. package/dist/extensions/forgecli/dashboard/component.js.map +1 -1
  125. package/dist/extensions/forgecli/dashboard/register.js +1 -1
  126. package/dist/extensions/forgecli/dashboard/register.js.map +1 -1
  127. package/dist/extensions/forgecli/forge-artifact-tool.js +1 -1
  128. package/dist/extensions/forgecli/forge-commands.js +1 -1
  129. package/dist/extensions/forgecli/forge-commands.js.map +1 -1
  130. package/dist/extensions/forgecli/forge-init/forge-init.d.ts +26 -0
  131. package/dist/extensions/forgecli/forge-init/forge-init.js +514 -0
  132. package/dist/extensions/forgecli/forge-init/forge-init.js.map +1 -0
  133. package/dist/extensions/forgecli/forge-init/init-context.d.ts +99 -0
  134. package/dist/extensions/forgecli/forge-init/init-context.js +178 -0
  135. package/dist/extensions/forgecli/forge-init/init-context.js.map +1 -0
  136. package/dist/extensions/forgecli/forge-init/init-progress.d.ts +39 -0
  137. package/dist/extensions/forgecli/forge-init/init-progress.js +117 -0
  138. package/dist/extensions/forgecli/forge-init/init-progress.js.map +1 -0
  139. package/dist/extensions/forgecli/forge-init/phase4-register.js +1 -1
  140. package/dist/extensions/forgecli/forge-init/phase4-register.js.map +1 -1
  141. package/dist/extensions/forgecli/forge-init/run-phases.js +2 -2
  142. package/dist/extensions/forgecli/forge-init/run-phases.js.map +1 -1
  143. package/dist/extensions/forgecli/forge-subagent.d.ts +22 -0
  144. package/dist/extensions/forgecli/forge-subagent.js +42 -15
  145. package/dist/extensions/forgecli/forge-subagent.js.map +1 -1
  146. package/dist/extensions/forgecli/forge-tools.d.ts +0 -25
  147. package/dist/extensions/forgecli/forge-tools.js +6 -37
  148. package/dist/extensions/forgecli/forge-tools.js.map +1 -1
  149. package/dist/extensions/forgecli/governor-config.d.ts +19 -0
  150. package/dist/extensions/forgecli/governor-config.js +58 -0
  151. package/dist/extensions/forgecli/governor-config.js.map +1 -0
  152. package/dist/extensions/forgecli/health-check.js +1 -1
  153. package/dist/extensions/forgecli/health-check.js.map +1 -1
  154. package/dist/extensions/forgecli/hook-dispatcher.js +2 -2
  155. package/dist/extensions/forgecli/hook-dispatcher.js.map +1 -1
  156. package/dist/extensions/forgecli/hooks/post-init-hook.js +11 -6
  157. package/dist/extensions/forgecli/hooks/post-init-hook.js.map +1 -1
  158. package/dist/extensions/forgecli/hooks/post-sprint-hook.js +11 -6
  159. package/dist/extensions/forgecli/hooks/post-sprint-hook.js.map +1 -1
  160. package/dist/extensions/forgecli/hooks/write-guard.js +1 -1
  161. package/dist/extensions/forgecli/hooks/write-guard.js.map +1 -1
  162. package/dist/extensions/forgecli/index.js +37 -35
  163. package/dist/extensions/forgecli/index.js.map +1 -1
  164. package/dist/extensions/forgecli/kickoff.d.ts +9 -0
  165. package/dist/extensions/forgecli/kickoff.js +15 -0
  166. package/dist/extensions/forgecli/kickoff.js.map +1 -1
  167. package/dist/extensions/forgecli/lib/forge-config.d.ts +1 -1
  168. package/dist/extensions/forgecli/lib/forge-config.js +1 -1
  169. package/dist/extensions/forgecli/lib/forge-config.js.map +1 -1
  170. package/dist/extensions/forgecli/lib/forge-root.d.ts +10 -0
  171. package/dist/extensions/forgecli/lib/forge-root.js +62 -0
  172. package/dist/extensions/forgecli/lib/forge-root.js.map +1 -0
  173. package/dist/extensions/forgecli/lib/run-cjs.d.ts +26 -0
  174. package/dist/extensions/forgecli/lib/run-cjs.js +42 -0
  175. package/dist/extensions/forgecli/lib/run-cjs.js.map +1 -0
  176. package/dist/extensions/forgecli/orchestrator-tree.d.ts +4 -0
  177. package/dist/extensions/forgecli/orchestrator-tree.js +21 -3
  178. package/dist/extensions/forgecli/orchestrator-tree.js.map +1 -1
  179. package/dist/extensions/forgecli/orchestrators/calibrate.d.ts +64 -0
  180. package/dist/extensions/forgecli/orchestrators/calibrate.js +481 -0
  181. package/dist/extensions/forgecli/orchestrators/calibrate.js.map +1 -0
  182. package/dist/extensions/forgecli/orchestrators/fix-bug.d.ts +93 -0
  183. package/dist/extensions/forgecli/orchestrators/fix-bug.js +1705 -0
  184. package/dist/extensions/forgecli/orchestrators/fix-bug.js.map +1 -0
  185. package/dist/extensions/forgecli/orchestrators/halt-advisor.d.ts +59 -0
  186. package/dist/extensions/forgecli/orchestrators/halt-advisor.js +113 -0
  187. package/dist/extensions/forgecli/orchestrators/halt-advisor.js.map +1 -0
  188. package/dist/extensions/forgecli/orchestrators/materialize.d.ts +16 -0
  189. package/dist/extensions/forgecli/orchestrators/materialize.js +195 -0
  190. package/dist/extensions/forgecli/orchestrators/materialize.js.map +1 -0
  191. package/dist/extensions/forgecli/orchestrators/migrate.d.ts +22 -0
  192. package/dist/extensions/forgecli/orchestrators/migrate.js +260 -0
  193. package/dist/extensions/forgecli/orchestrators/migrate.js.map +1 -0
  194. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.d.ts +46 -0
  195. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js +64 -0
  196. package/dist/extensions/forgecli/orchestrators/orchestrator-preflight.js.map +1 -0
  197. package/dist/extensions/forgecli/orchestrators/run-sprint.d.ts +27 -0
  198. package/dist/extensions/forgecli/orchestrators/run-sprint.js +734 -0
  199. package/dist/extensions/forgecli/orchestrators/run-sprint.js.map +1 -0
  200. package/dist/extensions/forgecli/orchestrators/run-task.d.ts +215 -0
  201. package/dist/extensions/forgecli/orchestrators/run-task.js +1491 -0
  202. package/dist/extensions/forgecli/orchestrators/run-task.js.map +1 -0
  203. package/dist/extensions/forgecli/paths/paths.d.ts +8 -0
  204. package/dist/extensions/forgecli/paths/paths.js +17 -0
  205. package/dist/extensions/forgecli/paths/paths.js.map +1 -1
  206. package/dist/extensions/forgecli/phase-vocab.d.ts +31 -0
  207. package/dist/extensions/forgecli/phase-vocab.js +82 -0
  208. package/dist/extensions/forgecli/phase-vocab.js.map +1 -0
  209. package/dist/extensions/forgecli/session-registry.d.ts +2 -2
  210. package/dist/extensions/forgecli/session-registry.js +6 -2
  211. package/dist/extensions/forgecli/session-registry.js.map +1 -1
  212. package/dist/extensions/forgecli/skill-curation/friction-emit.d.ts +99 -0
  213. package/dist/extensions/forgecli/skill-curation/friction-emit.js +245 -0
  214. package/dist/extensions/forgecli/skill-curation/friction-emit.js.map +1 -0
  215. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.d.ts +21 -0
  216. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js +71 -0
  217. package/dist/extensions/forgecli/skill-curation/skill-curation-flag.js.map +1 -0
  218. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.d.ts +102 -0
  219. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js +339 -0
  220. package/dist/extensions/forgecli/skill-curation/skill-curator-subagent.js.map +1 -0
  221. package/dist/extensions/forgecli/skill-curation/skill-retriever.d.ts +84 -0
  222. package/dist/extensions/forgecli/skill-curation/skill-retriever.js +246 -0
  223. package/dist/extensions/forgecli/skill-curation/skill-retriever.js.map +1 -0
  224. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.d.ts +91 -0
  225. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js +224 -0
  226. package/dist/extensions/forgecli/skill-curation/skill-usage-tracker.js.map +1 -0
  227. package/dist/extensions/forgecli/store/store-error-remediation.d.ts +65 -0
  228. package/dist/extensions/forgecli/store/store-error-remediation.js +307 -0
  229. package/dist/extensions/forgecli/store/store-error-remediation.js.map +1 -0
  230. package/dist/extensions/forgecli/store/store-resolver.d.ts +56 -0
  231. package/dist/extensions/forgecli/store/store-resolver.js +263 -0
  232. package/dist/extensions/forgecli/store/store-resolver.js.map +1 -0
  233. package/dist/extensions/forgecli/store/store-validator.d.ts +16 -0
  234. package/dist/extensions/forgecli/store/store-validator.js +32 -0
  235. package/dist/extensions/forgecli/store/store-validator.js.map +1 -0
  236. package/dist/extensions/forgecli/store/transition-guard.d.ts +20 -0
  237. package/dist/extensions/forgecli/store/transition-guard.js +89 -0
  238. package/dist/extensions/forgecli/store/transition-guard.js.map +1 -0
  239. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js +5 -0
  240. package/dist/extensions/forgecli/subagent/orchestrator-transcript.js.map +1 -1
  241. package/dist/extensions/forgecli/transcript-archive-types.d.ts +171 -0
  242. package/dist/extensions/forgecli/transcript-archive-types.js +130 -0
  243. package/dist/extensions/forgecli/transcript-archive-types.js.map +1 -0
  244. package/dist/extensions/forgecli/transcript-archive.d.ts +127 -0
  245. package/dist/extensions/forgecli/transcript-archive.js +656 -0
  246. package/dist/extensions/forgecli/transcript-archive.js.map +1 -0
  247. package/dist/extensions/forgecli/transcript-replay.d.ts +28 -0
  248. package/dist/extensions/forgecli/transcript-replay.js +153 -0
  249. package/dist/extensions/forgecli/transcript-replay.js.map +1 -0
  250. package/dist/extensions/forgecli/transcripts-tui/component.d.ts +36 -0
  251. package/dist/extensions/forgecli/transcripts-tui/component.js +112 -0
  252. package/dist/extensions/forgecli/transcripts-tui/component.js.map +1 -0
  253. package/dist/extensions/forgecli/transcripts-tui/index.d.ts +4 -0
  254. package/dist/extensions/forgecli/transcripts-tui/index.js +5 -0
  255. package/dist/extensions/forgecli/transcripts-tui/index.js.map +1 -0
  256. package/dist/extensions/forgecli/transcripts-tui/screens/browse.d.ts +21 -0
  257. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js +172 -0
  258. package/dist/extensions/forgecli/transcripts-tui/screens/browse.js.map +1 -0
  259. package/dist/extensions/forgecli/transcripts-tui/screens/types.d.ts +22 -0
  260. package/dist/extensions/forgecli/transcripts-tui/screens/types.js +4 -0
  261. package/dist/extensions/forgecli/transcripts-tui/screens/types.js.map +1 -0
  262. package/dist/extensions/forgecli/transcripts-tui/state/index.d.ts +4 -0
  263. package/dist/extensions/forgecli/transcripts-tui/state/index.js +5 -0
  264. package/dist/extensions/forgecli/transcripts-tui/state/index.js.map +1 -0
  265. package/dist/extensions/forgecli/transcripts-tui/state/init.d.ts +8 -0
  266. package/dist/extensions/forgecli/transcripts-tui/state/init.js +18 -0
  267. package/dist/extensions/forgecli/transcripts-tui/state/init.js.map +1 -0
  268. package/dist/extensions/forgecli/transcripts-tui/state/model.d.ts +56 -0
  269. package/dist/extensions/forgecli/transcripts-tui/state/model.js +6 -0
  270. package/dist/extensions/forgecli/transcripts-tui/state/model.js.map +1 -0
  271. package/dist/extensions/forgecli/transcripts-tui/state/reducer.d.ts +2 -0
  272. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js +51 -0
  273. package/dist/extensions/forgecli/transcripts-tui/state/reducer.js.map +1 -0
  274. package/dist/extensions/forgecli/transcripts-tui/state/selectors.d.ts +10 -0
  275. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js +62 -0
  276. package/dist/extensions/forgecli/transcripts-tui/state/selectors.js.map +1 -0
  277. package/dist/extensions/forgecli/transcripts-tui/theme.d.ts +20 -0
  278. package/dist/extensions/forgecli/transcripts-tui/theme.js +47 -0
  279. package/dist/extensions/forgecli/transcripts-tui/theme.js.map +1 -0
  280. package/dist/extensions/forgecli/tui/banner.d.ts +10 -0
  281. package/dist/extensions/forgecli/tui/banner.js +36 -0
  282. package/dist/extensions/forgecli/tui/banner.js.map +1 -0
  283. package/dist/extensions/forgecli/tui/forge-header.d.ts +12 -0
  284. package/dist/extensions/forgecli/tui/forge-header.js +114 -0
  285. package/dist/extensions/forgecli/tui/forge-header.js.map +1 -0
  286. package/dist/extensions/forgecli/tui/input-router.d.ts +33 -0
  287. package/dist/extensions/forgecli/tui/input-router.js +136 -0
  288. package/dist/extensions/forgecli/tui/input-router.js.map +1 -0
  289. package/dist/extensions/forgecli/tui/orchestrator-status-bar.d.ts +26 -0
  290. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js +213 -0
  291. package/dist/extensions/forgecli/tui/orchestrator-status-bar.js.map +1 -0
  292. package/dist/extensions/forgecli/tui/thread-switcher.d.ts +18 -0
  293. package/dist/extensions/forgecli/tui/thread-switcher.js +194 -0
  294. package/dist/extensions/forgecli/tui/thread-switcher.js.map +1 -0
  295. package/dist/extensions/forgecli/update/forge-update-command.d.ts +100 -0
  296. package/dist/extensions/forgecli/update/forge-update-command.js +435 -0
  297. package/dist/extensions/forgecli/update/forge-update-command.js.map +1 -0
  298. package/dist/extensions/forgecli/update/migration-engine.d.ts +117 -0
  299. package/dist/extensions/forgecli/update/migration-engine.js +563 -0
  300. package/dist/extensions/forgecli/update/migration-engine.js.map +1 -0
  301. package/dist/extensions/forgecli/update/update-check.d.ts +37 -0
  302. package/dist/extensions/forgecli/update/update-check.js +185 -0
  303. package/dist/extensions/forgecli/update/update-check.js.map +1 -0
  304. package/dist/extensions/forgecli/update/update-tools.d.ts +23 -0
  305. package/dist/extensions/forgecli/update/update-tools.js +135 -0
  306. package/dist/extensions/forgecli/update/update-tools.js.map +1 -0
  307. package/dist/extensions/forgecli/update/whats-new-widget.d.ts +26 -0
  308. package/dist/extensions/forgecli/update/whats-new-widget.js +376 -0
  309. package/dist/extensions/forgecli/update/whats-new-widget.js.map +1 -0
  310. package/dist/extensions/forgecli/update/whats-new.d.ts +120 -0
  311. package/dist/extensions/forgecli/update/whats-new.js +470 -0
  312. package/dist/extensions/forgecli/update/whats-new.js.map +1 -0
  313. package/dist/extensions/forgecli/viewport/events.d.ts +113 -0
  314. package/dist/extensions/forgecli/viewport/events.js +290 -0
  315. package/dist/extensions/forgecli/viewport/events.js.map +1 -0
  316. package/dist/extensions/forgecli/viewport/renderer.d.ts +102 -0
  317. package/dist/extensions/forgecli/viewport/renderer.js +277 -0
  318. package/dist/extensions/forgecli/viewport/renderer.js.map +1 -0
  319. package/dist/extensions/forgecli/viewport/theme.d.ts +11 -0
  320. package/dist/extensions/forgecli/viewport/theme.js +131 -0
  321. package/dist/extensions/forgecli/viewport/theme.js.map +1 -0
  322. package/dist/extensions/forgecli/wf-engine/engine.js +1 -1
  323. package/dist/extensions/forgecli/wf-engine/engine.js.map +1 -1
  324. package/package.json +4 -2
@@ -0,0 +1,470 @@
1
+ // What's-New startup panel.
2
+ //
3
+ // On `session_start`, compares the running versions of pi-coding-agent,
4
+ // the bundled forge plugin, and forge-cli itself against the last-seen
5
+ // versions in `~/.pi/forge-cli/cache/whats-new-seen.json` (resolved via
6
+ // the central path resolver; migrated from the pre-v0.10.0 location at
7
+ // `~/.cache/forgecli/whats-new-seen.json`). When any has advanced, emits
8
+ // a compact 3-line summary via `ctx.ui.notify`, then records the new
9
+ // versions so subsequent sessions stay quiet.
10
+ //
11
+ // `/whats-new` re-renders the summary from the same cache, and
12
+ // `/whats-new <component>` drills into one component's full changelog
13
+ // entries between the previous-seen and current versions.
14
+ //
15
+ // All disk I/O is fail-silent on the user surface; FORGE_DEBUG_WHATS_NEW=1
16
+ // prints diagnostic output to stderr.
17
+ import { existsSync, promises as fs, readFileSync } from "node:fs";
18
+ import * as path from "node:path";
19
+ import { getUserCacheDir } from "../paths/paths.js";
20
+ const COMPONENT_LABELS = {
21
+ pi: "pi",
22
+ "forge-plugin": "forge-plugin",
23
+ "forge-cli": "forge-cli",
24
+ };
25
+ const COMPONENT_ORDER = ["pi", "forge-plugin", "forge-cli"];
26
+ function defaultCacheDir() {
27
+ return getUserCacheDir();
28
+ }
29
+ function cachePath(cacheDir) {
30
+ return path.join(cacheDir, "whats-new-seen.json");
31
+ }
32
+ function debug(...args) {
33
+ if (process.env.FORGE_DEBUG_WHATS_NEW === "1") {
34
+ console.error("[forge-cli whats-new]", ...args);
35
+ }
36
+ }
37
+ export function emptySeenState() {
38
+ return {
39
+ pi: null,
40
+ forgePlugin: null,
41
+ forgeCli: null,
42
+ prevPi: null,
43
+ prevForgePlugin: null,
44
+ prevForgeCli: null,
45
+ lastShownFromPi: null,
46
+ lastShownFromForgePlugin: null,
47
+ lastShownFromForgeCli: null,
48
+ lastShownAt: 0,
49
+ };
50
+ }
51
+ export async function readSeenState(cacheDir) {
52
+ try {
53
+ const raw = await fs.readFile(cachePath(cacheDir), "utf8");
54
+ const parsed = JSON.parse(raw);
55
+ const s = emptySeenState();
56
+ if (typeof parsed.pi === "string")
57
+ s.pi = parsed.pi;
58
+ if (typeof parsed.forgePlugin === "string")
59
+ s.forgePlugin = parsed.forgePlugin;
60
+ if (typeof parsed.forgeCli === "string")
61
+ s.forgeCli = parsed.forgeCli;
62
+ if (typeof parsed.prevPi === "string")
63
+ s.prevPi = parsed.prevPi;
64
+ if (typeof parsed.prevForgePlugin === "string")
65
+ s.prevForgePlugin = parsed.prevForgePlugin;
66
+ if (typeof parsed.prevForgeCli === "string")
67
+ s.prevForgeCli = parsed.prevForgeCli;
68
+ if (typeof parsed.lastShownFromPi === "string")
69
+ s.lastShownFromPi = parsed.lastShownFromPi;
70
+ if (typeof parsed.lastShownFromForgePlugin === "string")
71
+ s.lastShownFromForgePlugin = parsed.lastShownFromForgePlugin;
72
+ if (typeof parsed.lastShownFromForgeCli === "string")
73
+ s.lastShownFromForgeCli = parsed.lastShownFromForgeCli;
74
+ if (typeof parsed.lastShownAt === "number")
75
+ s.lastShownAt = parsed.lastShownAt;
76
+ return s;
77
+ }
78
+ catch {
79
+ return emptySeenState();
80
+ }
81
+ }
82
+ export async function writeSeenState(cacheDir, state) {
83
+ await fs.mkdir(cacheDir, { recursive: true });
84
+ const final = cachePath(cacheDir);
85
+ const tmp = `${final}.${process.pid}.${Date.now()}.tmp`;
86
+ await fs.writeFile(tmp, JSON.stringify(state, null, 2), "utf8");
87
+ await fs.rename(tmp, final);
88
+ }
89
+ // ── semver helpers ────────────────────────────────────────────────────────
90
+ function parseTriple(v) {
91
+ const cleaned = v.startsWith("v") ? v.slice(1) : v;
92
+ const parts = cleaned.split("-")[0].split(".");
93
+ if (parts.length !== 3)
94
+ return null;
95
+ const nums = [];
96
+ for (const p of parts) {
97
+ if (!/^\d+$/.test(p))
98
+ return null;
99
+ nums.push(Number.parseInt(p, 10));
100
+ }
101
+ return [nums[0], nums[1], nums[2]];
102
+ }
103
+ export function semverGt(a, b) {
104
+ const pa = parseTriple(a);
105
+ const pb = parseTriple(b);
106
+ if (!pa || !pb)
107
+ return false;
108
+ for (let i = 0; i < 3; i++) {
109
+ if (pa[i] > pb[i])
110
+ return true;
111
+ if (pa[i] < pb[i])
112
+ return false;
113
+ }
114
+ return false;
115
+ }
116
+ // ── changelog parsing ─────────────────────────────────────────────────────
117
+ const VERSION_HEADER = /^##\s+\[?([^\]\s]+)\]?(?:\s*[—–-]\s*(.+))?$/;
118
+ const SECTION_HEADER = /^###\s+(.+)$/;
119
+ /**
120
+ * Parse a Keep-a-Changelog–style markdown body into per-version entries.
121
+ * Tolerates pi's `### New Features` overview sections (which precede the
122
+ * standard `### Added`/`### Fixed` sections) and the `[Unreleased]` block.
123
+ */
124
+ export function parseChangelog(markdown) {
125
+ const lines = markdown.split("\n");
126
+ const entries = [];
127
+ let current = null;
128
+ let currentSection = null;
129
+ const currentBodyLines = [];
130
+ const flushSection = () => {
131
+ if (current && currentSection && currentSection.bullets.length > 0) {
132
+ current.sections.push(currentSection);
133
+ }
134
+ currentSection = null;
135
+ };
136
+ const flushEntry = () => {
137
+ flushSection();
138
+ if (current) {
139
+ current.rawBody = currentBodyLines.join("\n").trim();
140
+ entries.push(current);
141
+ }
142
+ current = null;
143
+ currentBodyLines.length = 0;
144
+ };
145
+ for (const line of lines) {
146
+ const vMatch = line.match(VERSION_HEADER);
147
+ if (vMatch) {
148
+ flushEntry();
149
+ const version = vMatch[1].trim();
150
+ if (version.toLowerCase() === "unreleased") {
151
+ // Skip [Unreleased] blocks entirely.
152
+ current = null;
153
+ continue;
154
+ }
155
+ current = {
156
+ version,
157
+ date: vMatch[2]?.trim() ?? null,
158
+ sections: [],
159
+ rawBody: "",
160
+ };
161
+ currentBodyLines.length = 0;
162
+ continue;
163
+ }
164
+ if (!current)
165
+ continue;
166
+ currentBodyLines.push(line);
167
+ const sMatch = line.match(SECTION_HEADER);
168
+ if (sMatch) {
169
+ flushSection();
170
+ currentSection = { name: sMatch[1].trim(), bullets: [] };
171
+ continue;
172
+ }
173
+ if (currentSection && /^\s*[-*]\s+/.test(line)) {
174
+ currentSection.bullets.push(line.replace(/^\s*[-*]\s+/, "").trim());
175
+ }
176
+ }
177
+ flushEntry();
178
+ return entries;
179
+ }
180
+ /**
181
+ * Reduce a list of changelog entries down to the ones strictly newer than
182
+ * `from`, up to and including `to`. When `from` is null, returns only the
183
+ * `to` entry (first-install case — don't dump the whole history).
184
+ */
185
+ export function entriesBetween(entries, from, to) {
186
+ const matchExact = entries.filter((e) => e.version === to);
187
+ if (from === null) {
188
+ return matchExact;
189
+ }
190
+ return entries.filter((e) => semverGt(e.version, from) && (e.version === to || !semverGt(e.version, to)));
191
+ }
192
+ const CATEGORY_ALIASES = {
193
+ "new features": "added",
194
+ added: "added",
195
+ changed: "changed",
196
+ fixed: "fixed",
197
+ deprecated: "deprecated",
198
+ removed: "removed",
199
+ security: "security",
200
+ tests: "tests",
201
+ docs: "docs",
202
+ };
203
+ function normalizeCategory(name) {
204
+ const key = name.toLowerCase().trim();
205
+ return CATEGORY_ALIASES[key] ?? key;
206
+ }
207
+ export function summarizeEntries(entries) {
208
+ const byCategory = new Map();
209
+ let total = 0;
210
+ for (const entry of entries) {
211
+ for (const section of entry.sections) {
212
+ const cat = normalizeCategory(section.name);
213
+ const n = section.bullets.length;
214
+ if (n === 0)
215
+ continue;
216
+ byCategory.set(cat, (byCategory.get(cat) ?? 0) + n);
217
+ total += n;
218
+ }
219
+ }
220
+ return { total, byCategory };
221
+ }
222
+ export function resolveChangelogPaths(pkgRoot) {
223
+ const candidates = {
224
+ pi: [
225
+ path.join(pkgRoot, "dist", "CHANGELOG-pi.md"),
226
+ path.join(pkgRoot, "node_modules", "@earendil-works", "pi-coding-agent", "CHANGELOG.md"),
227
+ ],
228
+ forgePlugin: [
229
+ path.join(pkgRoot, "dist", "CHANGELOG-forge-plugin.md"),
230
+ path.join(pkgRoot, "..", "forge", "CHANGELOG.md"),
231
+ ],
232
+ forgeCli: [path.join(pkgRoot, "CHANGELOG.md")],
233
+ };
234
+ const pick = (paths) => paths.find((p) => existsSync(p)) ?? null;
235
+ return {
236
+ pi: pick(candidates.pi),
237
+ forgePlugin: pick(candidates.forgePlugin),
238
+ forgeCli: pick(candidates.forgeCli),
239
+ };
240
+ }
241
+ function readChangelogSafe(p) {
242
+ if (!p)
243
+ return null;
244
+ try {
245
+ return readFileSync(p, "utf8");
246
+ }
247
+ catch (err) {
248
+ debug("read failed:", p, err);
249
+ return null;
250
+ }
251
+ }
252
+ export function computeSummaries(opts) {
253
+ const baseline = opts.baseline ?? "seen";
254
+ const pickFrom = (id) => {
255
+ const s = opts.seen;
256
+ switch (baseline) {
257
+ case "seen":
258
+ return id === "pi" ? s.pi : id === "forge-plugin" ? s.forgePlugin : s.forgeCli;
259
+ case "prev":
260
+ return id === "pi" ? s.prevPi : id === "forge-plugin" ? s.prevForgePlugin : s.prevForgeCli;
261
+ case "lastShown":
262
+ return id === "pi"
263
+ ? s.lastShownFromPi
264
+ : id === "forge-plugin"
265
+ ? s.lastShownFromForgePlugin
266
+ : s.lastShownFromForgeCli;
267
+ }
268
+ };
269
+ const pairs = [
270
+ { id: "pi", current: opts.current.pi, src: opts.sources.pi },
271
+ { id: "forge-plugin", current: opts.current.forgePlugin, src: opts.sources.forgePlugin },
272
+ { id: "forge-cli", current: opts.current.forgeCli, src: opts.sources.forgeCli },
273
+ ];
274
+ const out = [];
275
+ // For the lastShown baseline, presence of any panel-ever-shown is
276
+ // signalled by lastShownAt > 0. If no panel was ever shown, return
277
+ // no summaries so /whats-new prints "no recent updates" cleanly.
278
+ if (baseline === "lastShown" && opts.seen.lastShownAt === 0)
279
+ return out;
280
+ for (const p of pairs) {
281
+ if (!p.current)
282
+ continue;
283
+ const useFrom = pickFrom(p.id);
284
+ // For the prev baseline, null means we have no replay info for this
285
+ // component — skip it. (seen and lastShown null are both valid: seen
286
+ // null = first install; lastShown null with lastShownAt>0 = the most
287
+ // recent panel was a first-install panel.)
288
+ if (useFrom === null && baseline === "prev")
289
+ continue;
290
+ // When the component has not advanced (useFrom === current), fall back to
291
+ // null so entriesBetween returns the exact current-version entry. This
292
+ // ensures all three component tabs always appear in the strip.
293
+ const effectiveFrom = useFrom !== null && !semverGt(p.current, useFrom) ? null : useFrom;
294
+ const markdown = readChangelogSafe(p.src);
295
+ if (!markdown) {
296
+ debug("no changelog source for", p.id);
297
+ continue;
298
+ }
299
+ const parsed = parseChangelog(markdown);
300
+ const slice = entriesBetween(parsed, effectiveFrom, p.current);
301
+ if (slice.length === 0) {
302
+ debug("no matching entries for", p.id, "between", useFrom, "and", p.current);
303
+ continue;
304
+ }
305
+ const sum = summarizeEntries(slice);
306
+ out.push({
307
+ component: p.id,
308
+ label: COMPONENT_LABELS[p.id],
309
+ fromVersion: effectiveFrom,
310
+ toVersion: p.current,
311
+ totalChanges: sum.total,
312
+ byCategory: sum.byCategory,
313
+ entries: slice,
314
+ });
315
+ }
316
+ return out;
317
+ }
318
+ // ── rendering ────────────────────────────────────────────────────────────
319
+ function formatVersionRange(from, to) {
320
+ return from ? `${from} → ${to}` : to;
321
+ }
322
+ function formatCategoryBreakdown(byCategory) {
323
+ const order = ["added", "changed", "fixed", "removed", "security", "deprecated", "tests", "docs"];
324
+ const parts = [];
325
+ for (const key of order) {
326
+ const n = byCategory.get(key);
327
+ if (n)
328
+ parts.push(`${n} ${key}`);
329
+ }
330
+ // Surface unknown categories at the end so we never silently drop counts.
331
+ for (const [key, n] of byCategory) {
332
+ if (!order.includes(key))
333
+ parts.push(`${n} ${key}`);
334
+ }
335
+ return parts.length > 0 ? `(${parts.join(" · ")})` : "";
336
+ }
337
+ function padRight(s, n) {
338
+ return s.length >= n ? s : s + " ".repeat(n - s.length);
339
+ }
340
+ export function renderSummaryPanel(summaries) {
341
+ if (summaries.length === 0)
342
+ return "What's New: no recent updates.";
343
+ const sorted = [...summaries].sort((a, b) => COMPONENT_ORDER.indexOf(a.component) - COMPONENT_ORDER.indexOf(b.component));
344
+ const labelWidth = Math.max(...sorted.map((s) => s.label.length), 12);
345
+ const rangeWidth = Math.max(...sorted.map((s) => formatVersionRange(s.fromVersion, s.toVersion).length), 14);
346
+ const lines = ["What's New since last login:"];
347
+ for (const s of sorted) {
348
+ const label = padRight(s.label, labelWidth);
349
+ const range = padRight(formatVersionRange(s.fromVersion, s.toVersion), rangeWidth);
350
+ const count = `${s.totalChanges} change${s.totalChanges === 1 ? "" : "s"}`;
351
+ const breakdown = formatCategoryBreakdown(s.byCategory);
352
+ lines.push(` ${label} ${range} ${padRight(count, 12)}${breakdown ? " " + breakdown : ""}`);
353
+ }
354
+ lines.push("");
355
+ lines.push("Run /whats-new pi | forge-plugin | forge-cli for details. /whats-new dismiss to clear.");
356
+ return lines.join("\n");
357
+ }
358
+ export function renderComponentDetail(summary) {
359
+ const heading = `What's New — ${summary.label} ${formatVersionRange(summary.fromVersion, summary.toVersion)}`;
360
+ const lines = [heading, ""];
361
+ for (const entry of summary.entries) {
362
+ lines.push(`## ${entry.version}${entry.date ? ` — ${entry.date}` : ""}`);
363
+ for (const section of entry.sections) {
364
+ lines.push("");
365
+ lines.push(`### ${section.name}`);
366
+ for (const bullet of section.bullets) {
367
+ lines.push(`- ${bullet}`);
368
+ }
369
+ }
370
+ lines.push("");
371
+ }
372
+ return lines.join("\n").trim();
373
+ }
374
+ /**
375
+ * Compute the startup summary and, when present, update the seen state
376
+ * so subsequent sessions don't replay. Returns the rendered string (or
377
+ * null when there's nothing to show).
378
+ *
379
+ * The `prev*` fields in the seen state preserve the prior baseline so
380
+ * /whats-new can re-render until the user explicitly dismisses.
381
+ */
382
+ export async function computeAndPersistStartupPanel(rt) {
383
+ const cacheDir = rt.cacheDir ?? defaultCacheDir();
384
+ const seen = await readSeenState(cacheDir);
385
+ const sources = resolveChangelogPaths(rt.pkgRoot);
386
+ const summaries = computeSummaries({ sources, current: rt.current, seen, baseline: "seen" });
387
+ if (summaries.length === 0)
388
+ return null;
389
+ const findFrom = (id) => summaries.find((s) => s.component === id)?.fromVersion ?? null;
390
+ const next = {
391
+ pi: rt.current.pi,
392
+ forgePlugin: rt.current.forgePlugin,
393
+ forgeCli: rt.current.forgeCli,
394
+ // Preserve old prev baseline if present; otherwise snapshot what was seen.
395
+ prevPi: seen.prevPi ?? seen.pi,
396
+ prevForgePlugin: seen.prevForgePlugin ?? seen.forgePlugin,
397
+ prevForgeCli: seen.prevForgeCli ?? seen.forgeCli,
398
+ // Freeze the just-shown `from` baseline so /whats-new can replay this
399
+ // exact set even after the user dismisses (which collapses prev).
400
+ lastShownFromPi: findFrom("pi") ?? seen.lastShownFromPi,
401
+ lastShownFromForgePlugin: findFrom("forge-plugin") ?? seen.lastShownFromForgePlugin,
402
+ lastShownFromForgeCli: findFrom("forge-cli") ?? seen.lastShownFromForgeCli,
403
+ lastShownAt: Date.now(),
404
+ };
405
+ try {
406
+ await writeSeenState(cacheDir, next);
407
+ }
408
+ catch (err) {
409
+ debug("writeSeenState failed:", err);
410
+ }
411
+ return { rendered: renderSummaryPanel(summaries), summaries };
412
+ }
413
+ /**
414
+ * Re-compute summaries against the `prev*` baseline (so users can replay
415
+ * the panel after auto-dismiss). When `componentArg` matches one of the
416
+ * three component IDs, returns that component's full detail view instead.
417
+ */
418
+ export async function computeWhatsNewView(rt, componentArg) {
419
+ const cacheDir = rt.cacheDir ?? defaultCacheDir();
420
+ const seen = await readSeenState(cacheDir);
421
+ const sources = resolveChangelogPaths(rt.pkgRoot);
422
+ // Prefer the prev baseline (post auto-dismiss, pre explicit dismiss); fall
423
+ // back to the lastShown frozen baseline so dismissed users can still
424
+ // re-read what was last shown to them.
425
+ let summaries = computeSummaries({ sources, current: rt.current, seen, baseline: "prev" });
426
+ if (summaries.length === 0) {
427
+ summaries = computeSummaries({ sources, current: rt.current, seen, baseline: "lastShown" });
428
+ }
429
+ if (componentArg && componentArg !== "summary") {
430
+ const wanted = componentArg.toLowerCase();
431
+ const match = summaries.find((s) => s.component === wanted || s.label === wanted);
432
+ if (!match) {
433
+ return `whats-new: no recent changes for "${componentArg}". Components: ${COMPONENT_ORDER.join(", ")}.`;
434
+ }
435
+ return renderComponentDetail(match);
436
+ }
437
+ return renderSummaryPanel(summaries);
438
+ }
439
+ /**
440
+ * Clear the `prev*` baseline so /whats-new stops replaying past changes.
441
+ * Current `seen` values are left untouched.
442
+ */
443
+ export async function dismissWhatsNew(rt) {
444
+ const cacheDir = rt.cacheDir ?? defaultCacheDir();
445
+ const seen = await readSeenState(cacheDir);
446
+ const next = {
447
+ ...seen,
448
+ prevPi: seen.pi,
449
+ prevForgePlugin: seen.forgePlugin,
450
+ prevForgeCli: seen.forgeCli,
451
+ };
452
+ try {
453
+ await writeSeenState(cacheDir, next);
454
+ }
455
+ catch (err) {
456
+ debug("writeSeenState (dismiss) failed:", err);
457
+ }
458
+ return "whats-new: dismissed.";
459
+ }
460
+ // Slash-command registration lives in whats-new-widget.ts (it owns the
461
+ // interactive surface). This module remains the pure parser + state +
462
+ // computer used by both the widget and the slash handler.
463
+ export const __test__ = {
464
+ defaultCacheDir,
465
+ cachePath,
466
+ normalizeCategory,
467
+ formatCategoryBreakdown,
468
+ formatVersionRange,
469
+ };
470
+ //# sourceMappingURL=whats-new.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"whats-new.js","sourceRoot":"","sources":["../../../../src/extensions/forgecli/update/whats-new.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,113 @@
1
+ import type { SessionRegistry } from "../session-registry.js";
2
+ import { type UsageDelta } from "./renderer.js";
3
+ /** Minimal shape of the AgentSessionEvent union we care about — kept loose
4
+ * so the file doesn't pull in @earendil-works/pi-agent-core types at compile
5
+ * time for callers that only consume the factory. */
6
+ type SubagentEvent = {
7
+ type: "turn_start";
8
+ } | {
9
+ type: "turn_end";
10
+ message: unknown;
11
+ } | {
12
+ type: "tool_execution_start";
13
+ toolCallId: string;
14
+ toolName: string;
15
+ args: unknown;
16
+ } | {
17
+ type: "tool_execution_end";
18
+ toolCallId: string;
19
+ toolName: string;
20
+ result: unknown;
21
+ isError: boolean;
22
+ } | {
23
+ type: "compaction_start";
24
+ reason: string;
25
+ } | {
26
+ type: "auto_retry_start";
27
+ attempt: number;
28
+ maxAttempts: number;
29
+ errorMessage?: string;
30
+ } | {
31
+ type: string;
32
+ [k: string]: unknown;
33
+ };
34
+ export interface ViewportObserverOpts {
35
+ registry: SessionRegistry;
36
+ /** session key in the registry (taskId, bugId, or sprintId:ceremony, etc.) */
37
+ sessionId: string;
38
+ /** phase scope for tail buffer and per-phase usage */
39
+ phaseRole: string;
40
+ /** Exact OrchestratorTree node ID for this dispatch. Orchestrators know
41
+ * the node they started (`<sessionId>:<role>:<attempt>`) — passing it pins
42
+ * every telemetry event to that node. Without it the observer falls back
43
+ * to a role-prefix scan for the first *running* match, which misattributes
44
+ * telemetry whenever an earlier same-role node is still open (the
45
+ * CART-BUG-003 dashboard regression: review-plan:2's logs accumulated on a
46
+ * leaked review-plan:1). */
47
+ nodeId?: string;
48
+ /** displayed in the per-line prefix `[<displayRole> HH:MM:SS tN]`. Usually same
49
+ * as `phaseRole` but kept separate so callers like run-sprint ceremony can
50
+ * show a friendlier role label without changing the registry key. */
51
+ displayRole?: string;
52
+ /** optional `─── phase X/Y begin · sessionId ───` header to emit immediately */
53
+ beginHeader?: string;
54
+ /** optional JSONL audit sink (the run-task debug log). */
55
+ writeDebug?: (rec: Record<string, unknown>) => void;
56
+ /** optional verbose status setter — only called when FORGE_VERBOSE=1.
57
+ * The observer doesn't read FORGE_VERBOSE itself; caller decides whether to
58
+ * wire this. */
59
+ setStatusVerbose?: (key: string, msg: string) => void;
60
+ /** optional toast for compaction/retry; ignore to suppress. */
61
+ notify?: (msg: string, level: "info" | "warning" | "error") => void;
62
+ /** keys used for `setStatusVerbose` when caller wants verbose status. */
63
+ verboseKeys?: {
64
+ messageKey?: string;
65
+ };
66
+ /** invoked after every handled event so orchestrators can refresh their own
67
+ * status line (e.g. FORGE_VERBOSE status with `lastTool`, elapsed seconds). */
68
+ afterEach?: () => void;
69
+ }
70
+ /** One persisted tail-view line — exactly what the live dashboard rendered. */
71
+ export interface TailLogEntry {
72
+ line: string;
73
+ warning?: boolean;
74
+ }
75
+ /**
76
+ * Head-preserving cap on the recorded tail log. Live phases rarely exceed a
77
+ * few hundred lines; the cap only bounds pathological runs. Head-preserving
78
+ * (stop recording, don't drop oldest) because the log's consumer is the
79
+ * transcript-archive REPLAY, where the beginning is the valuable part.
80
+ */
81
+ export declare const TAIL_LOG_CAP = 5000;
82
+ export interface AttachedObserver {
83
+ onEvent: (event: SubagentEvent) => void;
84
+ /** Mutable counters orchestrator can read after subagent returns. */
85
+ state: {
86
+ turn: number;
87
+ toolCount: number;
88
+ errCount: number;
89
+ lastTool: string;
90
+ cumUsage: UsageDelta;
91
+ cumCompression: {
92
+ calls: number;
93
+ tokensSaved: number;
94
+ };
95
+ /**
96
+ * Verbatim record of every tail line this observer rendered, in
97
+ * order — the live view stream. Orchestrators persist it next to
98
+ * the phase transcript (`<transcript>.tail.jsonl`) so transcript
99
+ * replay re-reads the EXACT lines the live dashboard showed
100
+ * instead of reconstructing an approximation from messages.
101
+ */
102
+ tailLog: TailLogEntry[];
103
+ };
104
+ }
105
+ /**
106
+ * Persist the recorded tail log next to its phase transcript as JSONL
107
+ * (`<transcript-base>.tail.jsonl`). The transcript archive sweeps it with
108
+ * the run; replay re-reads the exact lines the live dashboard showed.
109
+ * Best-effort — observability data, never throws.
110
+ */
111
+ export declare function persistTailLog(subagentTranscriptPath: string, tailLog: TailLogEntry[]): string | null;
112
+ export declare function attachViewportObserver(opts: ViewportObserverOpts): AttachedObserver;
113
+ export {};