codingbuddy 4.0.1 → 4.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 (458) hide show
  1. package/README.md +3 -3
  2. package/dist/api/mcp.js +1 -2
  3. package/dist/api/mcp.js.map +1 -1
  4. package/dist/src/agent/agent-prompt.builder.js.map +1 -1
  5. package/dist/src/agent/agent-summary.utils.d.ts +2 -1
  6. package/dist/src/agent/agent.service.d.ts +2 -1
  7. package/dist/src/agent/agent.service.js +49 -0
  8. package/dist/src/agent/agent.service.js.map +1 -1
  9. package/dist/src/agent/agent.types.d.ts +26 -0
  10. package/dist/src/agent/agent.types.js +2 -10
  11. package/dist/src/agent/agent.types.js.map +1 -1
  12. package/dist/src/analyzer/analyzer.service.js +2 -4
  13. package/dist/src/analyzer/analyzer.service.js.map +1 -1
  14. package/dist/src/analyzer/code.sampler.js +4 -9
  15. package/dist/src/analyzer/code.sampler.js.map +1 -1
  16. package/dist/src/analyzer/config.analyzer.js +3 -13
  17. package/dist/src/analyzer/config.analyzer.js.map +1 -1
  18. package/dist/src/analyzer/conventions.analyzer.js +3 -11
  19. package/dist/src/analyzer/conventions.analyzer.js.map +1 -1
  20. package/dist/src/analyzer/conventions.schemas.d.ts +0 -4
  21. package/dist/src/analyzer/conventions.schemas.js.map +1 -1
  22. package/dist/src/analyzer/conventions.types.d.ts +5 -7
  23. package/dist/src/analyzer/conventions.types.js.map +1 -1
  24. package/dist/src/analyzer/directory.analyzer.d.ts +1 -1
  25. package/dist/src/analyzer/directory.analyzer.js +5 -23
  26. package/dist/src/analyzer/directory.analyzer.js.map +1 -1
  27. package/dist/src/analyzer/package.analyzer.js +1 -3
  28. package/dist/src/analyzer/package.analyzer.js.map +1 -1
  29. package/dist/src/app.module.js +2 -0
  30. package/dist/src/app.module.js.map +1 -1
  31. package/dist/src/checklist/checklist.schema.d.ts +2 -1
  32. package/dist/src/checklist/checklist.schema.js.map +1 -1
  33. package/dist/src/checklist/checklist.service.js.map +1 -1
  34. package/dist/src/checklist/checklist.types.js +1 -6
  35. package/dist/src/checklist/checklist.types.js.map +1 -1
  36. package/dist/src/cli/cli.d.ts +1 -2
  37. package/dist/src/cli/cli.js +9 -1
  38. package/dist/src/cli/cli.js.map +1 -1
  39. package/dist/src/cli/init/claude-settings.utils.d.ts +14 -0
  40. package/dist/src/cli/init/claude-settings.utils.js +74 -0
  41. package/dist/src/cli/init/claude-settings.utils.js.map +1 -0
  42. package/dist/src/cli/init/config.generator.d.ts +0 -2
  43. package/dist/src/cli/init/config.generator.js +0 -2
  44. package/dist/src/cli/init/config.generator.js.map +1 -1
  45. package/dist/src/cli/init/config.writer.d.ts +0 -1
  46. package/dist/src/cli/init/config.writer.js +0 -1
  47. package/dist/src/cli/init/config.writer.js.map +1 -1
  48. package/dist/src/cli/init/index.d.ts +2 -2
  49. package/dist/src/cli/init/index.js.map +1 -1
  50. package/dist/src/cli/init/init.command.js +13 -8
  51. package/dist/src/cli/init/init.command.js.map +1 -1
  52. package/dist/src/cli/init/init.constants.d.ts +1 -0
  53. package/dist/src/cli/init/init.constants.js +12 -2
  54. package/dist/src/cli/init/init.constants.js.map +1 -1
  55. package/dist/src/cli/init/init.wizard.d.ts +2 -1
  56. package/dist/src/cli/init/init.wizard.js +3 -8
  57. package/dist/src/cli/init/init.wizard.js.map +1 -1
  58. package/dist/src/cli/init/prompt.builder.js.map +1 -1
  59. package/dist/src/cli/init/prompts/basic-prompt.js.map +1 -1
  60. package/dist/src/cli/init/prompts/index.d.ts +3 -3
  61. package/dist/src/cli/init/prompts/index.js.map +1 -1
  62. package/dist/src/cli/init/prompts/language-prompt.js +1 -3
  63. package/dist/src/cli/init/prompts/language-prompt.js.map +1 -1
  64. package/dist/src/cli/init/prompts/model-prompt.js.map +1 -1
  65. package/dist/src/cli/init/prompts/tech-stack-prompt.js.map +1 -1
  66. package/dist/src/cli/init/prompts/test-strategy-prompt.js.map +1 -1
  67. package/dist/src/cli/init/summary/index.d.ts +1 -1
  68. package/dist/src/cli/init/summary/index.js.map +1 -1
  69. package/dist/src/cli/init/templates/config-renderer.js.map +1 -1
  70. package/dist/src/cli/init/templates/index.d.ts +1 -1
  71. package/dist/src/cli/init/templates/index.js.map +1 -1
  72. package/dist/src/cli/init/templates/template.renderer.js.map +1 -1
  73. package/dist/src/cli/init/templates/template.selector.js.map +1 -1
  74. package/dist/src/cli/run-tui.d.ts +1 -0
  75. package/dist/src/cli/run-tui.js +67 -0
  76. package/dist/src/cli/run-tui.js.map +1 -0
  77. package/dist/src/config/config-diff.service.js +6 -7
  78. package/dist/src/config/config-diff.service.js.map +1 -1
  79. package/dist/src/config/config.loader.d.ts +0 -2
  80. package/dist/src/config/config.loader.js +1 -5
  81. package/dist/src/config/config.loader.js.map +1 -1
  82. package/dist/src/config/config.schema.d.ts +0 -16
  83. package/dist/src/config/config.schema.js +8 -10
  84. package/dist/src/config/config.schema.js.map +1 -1
  85. package/dist/src/config/config.service.js +1 -4
  86. package/dist/src/config/config.service.js.map +1 -1
  87. package/dist/src/config/context.loader.js.map +1 -1
  88. package/dist/src/config/ignore.parser.js.map +1 -1
  89. package/dist/src/config/index.d.ts +2 -2
  90. package/dist/src/config/index.js.map +1 -1
  91. package/dist/src/context/context-document.service.js +3 -1
  92. package/dist/src/context/context-document.service.js.map +1 -1
  93. package/dist/src/context/context-document.types.d.ts +2 -8
  94. package/dist/src/context/context-document.types.js +10 -16
  95. package/dist/src/context/context-document.types.js.map +1 -1
  96. package/dist/src/context/context-parser.utils.d.ts +1 -9
  97. package/dist/src/context/context-parser.utils.js +2 -39
  98. package/dist/src/context/context-parser.utils.js.map +1 -1
  99. package/dist/src/context/context-serializer.utils.js +1 -2
  100. package/dist/src/context/context-serializer.utils.js.map +1 -1
  101. package/dist/src/context/context.service.js +4 -16
  102. package/dist/src/context/context.service.js.map +1 -1
  103. package/dist/src/context/context.types.js +3 -17
  104. package/dist/src/context/context.types.js.map +1 -1
  105. package/dist/src/custom/custom.service.js.map +1 -1
  106. package/dist/src/diagnostic/diagnostic-log.service.js +1 -3
  107. package/dist/src/diagnostic/diagnostic-log.service.js.map +1 -1
  108. package/dist/src/keyword/activation-message.builder.js +2 -6
  109. package/dist/src/keyword/activation-message.builder.js.map +1 -1
  110. package/dist/src/keyword/auto-executor.js +1 -3
  111. package/dist/src/keyword/auto-executor.js.map +1 -1
  112. package/dist/src/keyword/auto-executor.types.js.map +1 -1
  113. package/dist/src/keyword/auto-formatter.js +2 -3
  114. package/dist/src/keyword/auto-formatter.js.map +1 -1
  115. package/dist/src/keyword/auto-prompt-builder.js +1 -3
  116. package/dist/src/keyword/auto-prompt-builder.js.map +1 -1
  117. package/dist/src/keyword/complexity-classifier.js +3 -7
  118. package/dist/src/keyword/complexity-classifier.js.map +1 -1
  119. package/dist/src/keyword/complexity-indicators.js.map +1 -1
  120. package/dist/src/keyword/keyword.module.js +1 -6
  121. package/dist/src/keyword/keyword.module.js.map +1 -1
  122. package/dist/src/keyword/keyword.service.d.ts +1 -0
  123. package/dist/src/keyword/keyword.service.js +29 -26
  124. package/dist/src/keyword/keyword.service.js.map +1 -1
  125. package/dist/src/keyword/keyword.types.d.ts +17 -4
  126. package/dist/src/keyword/keyword.types.js +2 -10
  127. package/dist/src/keyword/keyword.types.js.map +1 -1
  128. package/dist/src/keyword/patterns/devops.patterns.d.ts +2 -0
  129. package/dist/src/keyword/patterns/devops.patterns.js +56 -0
  130. package/dist/src/keyword/patterns/devops.patterns.js.map +1 -0
  131. package/dist/src/keyword/patterns/frontend.patterns.d.ts +2 -0
  132. package/dist/src/keyword/patterns/frontend.patterns.js +76 -0
  133. package/dist/src/keyword/patterns/frontend.patterns.js.map +1 -0
  134. package/dist/src/keyword/patterns/index.d.ts +1 -1
  135. package/dist/src/keyword/patterns/index.js.map +1 -1
  136. package/dist/src/keyword/patterns/intent-pattern-checks.js +12 -0
  137. package/dist/src/keyword/patterns/intent-pattern-checks.js.map +1 -1
  138. package/dist/src/keyword/primary-agent-resolver.d.ts +1 -1
  139. package/dist/src/keyword/primary-agent-resolver.js +2 -1
  140. package/dist/src/keyword/primary-agent-resolver.js.map +1 -1
  141. package/dist/src/keyword/rule-filter.js.map +1 -1
  142. package/dist/src/keyword/srp-template.d.ts +0 -2
  143. package/dist/src/keyword/srp-template.js +0 -2
  144. package/dist/src/keyword/srp-template.js.map +1 -1
  145. package/dist/src/keyword/strategies/__tests__/strategy-test.utils.js.map +1 -1
  146. package/dist/src/keyword/strategies/act-agent.strategy.js +14 -5
  147. package/dist/src/keyword/strategies/act-agent.strategy.js.map +1 -1
  148. package/dist/src/keyword/strategies/eval-agent.strategy.js.map +1 -1
  149. package/dist/src/keyword/strategies/plan-agent.strategy.js.map +1 -1
  150. package/dist/src/keyword/strategies/resolution-strategy.interface.d.ts +1 -0
  151. package/dist/src/main.js +174 -1
  152. package/dist/src/main.js.map +1 -1
  153. package/dist/src/mcp/handlers/agent.handler.d.ts +1 -0
  154. package/dist/src/mcp/handlers/agent.handler.js +78 -5
  155. package/dist/src/mcp/handlers/agent.handler.js.map +1 -1
  156. package/dist/src/mcp/handlers/config.handler.js.map +1 -1
  157. package/dist/src/mcp/handlers/context-document.handler.js +13 -20
  158. package/dist/src/mcp/handlers/context-document.handler.js.map +1 -1
  159. package/dist/src/mcp/handlers/conventions.handler.js.map +1 -1
  160. package/dist/src/mcp/handlers/mode.handler.d.ts +4 -1
  161. package/dist/src/mcp/handlers/mode.handler.js +58 -5
  162. package/dist/src/mcp/handlers/mode.handler.js.map +1 -1
  163. package/dist/src/mcp/handlers/skill.handler.js +1 -3
  164. package/dist/src/mcp/handlers/skill.handler.js.map +1 -1
  165. package/dist/src/mcp/mcp-serverless.d.ts +1 -13
  166. package/dist/src/mcp/mcp-serverless.js +24 -206
  167. package/dist/src/mcp/mcp-serverless.js.map +1 -1
  168. package/dist/src/mcp/mcp.controller.d.ts +6 -2
  169. package/dist/src/mcp/mcp.controller.js +38 -9
  170. package/dist/src/mcp/mcp.controller.js.map +1 -1
  171. package/dist/src/mcp/mcp.module.js +2 -0
  172. package/dist/src/mcp/mcp.module.js.map +1 -1
  173. package/dist/src/mcp/mcp.service.d.ts +7 -1
  174. package/dist/src/mcp/mcp.service.js +55 -24
  175. package/dist/src/mcp/mcp.service.js.map +1 -1
  176. package/dist/src/mcp/sse-auth.guard.d.ts +6 -0
  177. package/dist/src/mcp/sse-auth.guard.js +53 -0
  178. package/dist/src/mcp/sse-auth.guard.js.map +1 -0
  179. package/dist/src/model/model.resolver.js.map +1 -1
  180. package/dist/src/rules/agent.schema.js.map +1 -1
  181. package/dist/src/rules/rules-content.utils.js.map +1 -1
  182. package/dist/src/rules/rules.service.d.ts +1 -3
  183. package/dist/src/rules/rules.service.js +43 -102
  184. package/dist/src/rules/rules.service.js.map +1 -1
  185. package/dist/src/rules/rules.types.d.ts +3 -2
  186. package/dist/src/rules/skill.schema.d.ts +0 -5
  187. package/dist/src/rules/skill.schema.js +3 -3
  188. package/dist/src/rules/skill.schema.js.map +1 -1
  189. package/dist/src/shared/async.utils.d.ts +3 -2
  190. package/dist/src/shared/async.utils.js.map +1 -1
  191. package/dist/src/shared/esm-import.d.ts +1 -0
  192. package/dist/src/shared/esm-import.js +17 -0
  193. package/dist/src/shared/esm-import.js.map +1 -0
  194. package/dist/src/shared/file.utils.d.ts +3 -2
  195. package/dist/src/shared/file.utils.js +1 -2
  196. package/dist/src/shared/file.utils.js.map +1 -1
  197. package/dist/src/shared/filesystem.interface.d.ts +0 -10
  198. package/dist/src/shared/filesystem.interface.js +1 -10
  199. package/dist/src/shared/filesystem.interface.js.map +1 -1
  200. package/dist/src/shared/format.utils.js.map +1 -1
  201. package/dist/src/shared/keyword-core.d.ts +10 -0
  202. package/dist/src/shared/keyword-core.js +97 -0
  203. package/dist/src/shared/keyword-core.js.map +1 -0
  204. package/dist/src/shared/language.service.js.map +1 -1
  205. package/dist/src/shared/language.types.d.ts +2 -1
  206. package/dist/src/shared/lru-cache.d.ts +2 -6
  207. package/dist/src/shared/path.utils.d.ts +0 -1
  208. package/dist/src/shared/path.utils.js +1 -3
  209. package/dist/src/shared/path.utils.js.map +1 -1
  210. package/dist/src/shared/pattern-matcher.d.ts +2 -1
  211. package/dist/src/shared/pattern-matcher.js.map +1 -1
  212. package/dist/src/shared/rules-core.d.ts +28 -0
  213. package/dist/src/shared/rules-core.js +167 -0
  214. package/dist/src/shared/rules-core.js.map +1 -0
  215. package/dist/src/shared/security.utils.d.ts +4 -3
  216. package/dist/src/shared/security.utils.js +1 -2
  217. package/dist/src/shared/security.utils.js.map +1 -1
  218. package/dist/src/shared/slug.utils.js.map +1 -1
  219. package/dist/src/shared/tui-bundle-path.d.ts +1 -0
  220. package/dist/src/shared/tui-bundle-path.js +8 -0
  221. package/dist/src/shared/tui-bundle-path.js.map +1 -0
  222. package/dist/src/shared/validation.constants.d.ts +3 -3
  223. package/dist/src/shared/validation.constants.js +9 -6
  224. package/dist/src/shared/validation.constants.js.map +1 -1
  225. package/dist/src/shared/verbosity.types.d.ts +2 -1
  226. package/dist/src/shared/verbosity.types.js +1 -2
  227. package/dist/src/shared/verbosity.types.js.map +1 -1
  228. package/dist/src/skill/i18n/keywords.js +44 -318
  229. package/dist/src/skill/i18n/keywords.js.map +1 -1
  230. package/dist/src/skill/i18n/keywords.types.js.map +1 -1
  231. package/dist/src/skill/skill-content.utils.d.ts +0 -1
  232. package/dist/src/skill/skill-content.utils.js +5 -7
  233. package/dist/src/skill/skill-content.utils.js.map +1 -1
  234. package/dist/src/skill/skill-recommendation.service.js.map +1 -1
  235. package/dist/src/skill/skill-triggers.js.map +1 -1
  236. package/dist/src/state/state.service.js.map +1 -1
  237. package/dist/src/tui/__perf__/memory-stability.spec.d.ts +1 -0
  238. package/dist/src/tui/__perf__/memory-stability.spec.js +105 -0
  239. package/dist/src/tui/__perf__/memory-stability.spec.js.map +1 -0
  240. package/dist/src/tui/__perf__/rendering-performance.spec.d.ts +1 -0
  241. package/dist/src/tui/__perf__/rendering-performance.spec.js +166 -0
  242. package/dist/src/tui/__perf__/rendering-performance.spec.js.map +1 -0
  243. package/dist/src/tui/cli-flags.d.ts +1 -0
  244. package/dist/src/tui/cli-flags.js +7 -0
  245. package/dist/src/tui/cli-flags.js.map +1 -0
  246. package/dist/src/tui/components/ActivityVisualizer.d.ts +10 -0
  247. package/dist/src/tui/components/ActivityVisualizer.js +22 -0
  248. package/dist/src/tui/components/ActivityVisualizer.js.map +1 -0
  249. package/dist/src/tui/components/ActivityVisualizer.spec.d.ts +1 -0
  250. package/dist/src/tui/components/ActivityVisualizer.spec.js +45 -0
  251. package/dist/src/tui/components/ActivityVisualizer.spec.js.map +1 -0
  252. package/dist/src/tui/components/ContextSection.d.ts +7 -0
  253. package/dist/src/tui/components/ContextSection.js +24 -0
  254. package/dist/src/tui/components/ContextSection.js.map +1 -0
  255. package/dist/src/tui/components/FlowMap.d.ts +12 -0
  256. package/dist/src/tui/components/FlowMap.js +55 -0
  257. package/dist/src/tui/components/FlowMap.js.map +1 -0
  258. package/dist/src/tui/components/FlowMap.spec.d.ts +1 -0
  259. package/dist/src/tui/components/FlowMap.spec.js +59 -0
  260. package/dist/src/tui/components/FlowMap.spec.js.map +1 -0
  261. package/dist/src/tui/components/FocusedAgentPanel.d.ts +19 -0
  262. package/dist/src/tui/components/FocusedAgentPanel.js +74 -0
  263. package/dist/src/tui/components/FocusedAgentPanel.js.map +1 -0
  264. package/dist/src/tui/components/FocusedAgentPanel.spec.d.ts +1 -0
  265. package/dist/src/tui/components/FocusedAgentPanel.spec.js +140 -0
  266. package/dist/src/tui/components/FocusedAgentPanel.spec.js.map +1 -0
  267. package/dist/src/tui/components/HeaderBar.d.ts +12 -0
  268. package/dist/src/tui/components/HeaderBar.js +55 -0
  269. package/dist/src/tui/components/HeaderBar.js.map +1 -0
  270. package/dist/src/tui/components/HeaderBar.spec.d.ts +1 -0
  271. package/dist/src/tui/components/HeaderBar.spec.js +78 -0
  272. package/dist/src/tui/components/HeaderBar.spec.js.map +1 -0
  273. package/dist/src/tui/components/SessionTabBar.d.ts +9 -0
  274. package/dist/src/tui/components/SessionTabBar.js +15 -0
  275. package/dist/src/tui/components/SessionTabBar.js.map +1 -0
  276. package/dist/src/tui/components/SessionTabBar.spec.d.ts +1 -0
  277. package/dist/src/tui/components/SessionTabBar.spec.js +59 -0
  278. package/dist/src/tui/components/SessionTabBar.spec.js.map +1 -0
  279. package/dist/src/tui/components/StageHealthBar.d.ts +10 -0
  280. package/dist/src/tui/components/StageHealthBar.js +63 -0
  281. package/dist/src/tui/components/StageHealthBar.js.map +1 -0
  282. package/dist/src/tui/components/StageHealthBar.spec.d.ts +1 -0
  283. package/dist/src/tui/components/StageHealthBar.spec.js +63 -0
  284. package/dist/src/tui/components/StageHealthBar.spec.js.map +1 -0
  285. package/dist/src/tui/components/activity-visualizer.pure.d.ts +9 -0
  286. package/dist/src/tui/components/activity-visualizer.pure.js +70 -0
  287. package/dist/src/tui/components/activity-visualizer.pure.js.map +1 -0
  288. package/dist/src/tui/components/context-section.pure.d.ts +3 -0
  289. package/dist/src/tui/components/context-section.pure.js +38 -0
  290. package/dist/src/tui/components/context-section.pure.js.map +1 -0
  291. package/dist/src/tui/components/flow-map.pure.d.ts +26 -0
  292. package/dist/src/tui/components/flow-map.pure.js +263 -0
  293. package/dist/src/tui/components/flow-map.pure.js.map +1 -0
  294. package/dist/src/tui/components/focused-agent.pure.d.ts +23 -0
  295. package/dist/src/tui/components/focused-agent.pure.js +87 -0
  296. package/dist/src/tui/components/focused-agent.pure.js.map +1 -0
  297. package/dist/src/tui/components/grid-layout.pure.d.ts +2 -0
  298. package/dist/src/tui/components/grid-layout.pure.js +50 -0
  299. package/dist/src/tui/components/grid-layout.pure.js.map +1 -0
  300. package/dist/src/tui/components/header-bar.pure.d.ts +1 -0
  301. package/dist/src/tui/components/header-bar.pure.js +9 -0
  302. package/dist/src/tui/components/header-bar.pure.js.map +1 -0
  303. package/dist/src/tui/components/index.d.ts +12 -0
  304. package/dist/src/tui/components/index.js +38 -0
  305. package/dist/src/tui/components/index.js.map +1 -0
  306. package/dist/src/tui/components/session-tab-bar.pure.d.ts +9 -0
  307. package/dist/src/tui/components/session-tab-bar.pure.js +45 -0
  308. package/dist/src/tui/components/session-tab-bar.pure.js.map +1 -0
  309. package/dist/src/tui/components/stage-health.pure.d.ts +4 -0
  310. package/dist/src/tui/components/stage-health.pure.js +59 -0
  311. package/dist/src/tui/components/stage-health.pure.js.map +1 -0
  312. package/dist/src/tui/dashboard-app.d.ts +8 -0
  313. package/dist/src/tui/dashboard-app.js +43 -0
  314. package/dist/src/tui/dashboard-app.js.map +1 -0
  315. package/dist/src/tui/dashboard-app.spec.d.ts +1 -0
  316. package/dist/src/tui/dashboard-app.spec.js +136 -0
  317. package/dist/src/tui/dashboard-app.spec.js.map +1 -0
  318. package/dist/src/tui/dashboard-types.d.ts +88 -0
  319. package/dist/src/tui/dashboard-types.js +32 -0
  320. package/dist/src/tui/dashboard-types.js.map +1 -0
  321. package/dist/src/tui/ensure-tui-ready.d.ts +3 -0
  322. package/dist/src/tui/ensure-tui-ready.js +39 -0
  323. package/dist/src/tui/ensure-tui-ready.js.map +1 -0
  324. package/dist/src/tui/eventbus-ui.integration.spec.d.ts +1 -0
  325. package/dist/src/tui/eventbus-ui.integration.spec.js +573 -0
  326. package/dist/src/tui/eventbus-ui.integration.spec.js.map +1 -0
  327. package/dist/src/tui/events/agent-metadata.service.d.ts +16 -0
  328. package/dist/src/tui/events/agent-metadata.service.js +80 -0
  329. package/dist/src/tui/events/agent-metadata.service.js.map +1 -0
  330. package/dist/src/tui/events/agent-metadata.types.d.ts +11 -0
  331. package/dist/src/tui/events/agent-metadata.types.js +59 -0
  332. package/dist/src/tui/events/agent-metadata.types.js.map +1 -0
  333. package/dist/src/tui/events/event-bus.d.ts +13 -0
  334. package/dist/src/tui/events/event-bus.js +42 -0
  335. package/dist/src/tui/events/event-bus.js.map +1 -0
  336. package/dist/src/tui/events/events.module.d.ts +2 -0
  337. package/dist/src/tui/events/events.module.js +25 -0
  338. package/dist/src/tui/events/events.module.js.map +1 -0
  339. package/dist/src/tui/events/index.d.ts +7 -0
  340. package/dist/src/tui/events/index.js +19 -0
  341. package/dist/src/tui/events/index.js.map +1 -0
  342. package/dist/src/tui/events/parse-agent.d.ts +2 -0
  343. package/dist/src/tui/events/parse-agent.js +85 -0
  344. package/dist/src/tui/events/parse-agent.js.map +1 -0
  345. package/dist/src/tui/events/parse-tool-response.d.ts +1 -0
  346. package/dist/src/tui/events/parse-tool-response.js +24 -0
  347. package/dist/src/tui/events/parse-tool-response.js.map +1 -0
  348. package/dist/src/tui/events/response-event-extractor.d.ts +27 -0
  349. package/dist/src/tui/events/response-event-extractor.js +224 -0
  350. package/dist/src/tui/events/response-event-extractor.js.map +1 -0
  351. package/dist/src/tui/events/tui-interceptor.d.ts +16 -0
  352. package/dist/src/tui/events/tui-interceptor.js +160 -0
  353. package/dist/src/tui/events/tui-interceptor.js.map +1 -0
  354. package/dist/src/tui/events/types.d.ts +95 -0
  355. package/dist/src/tui/events/types.js +19 -0
  356. package/dist/src/tui/events/types.js.map +1 -0
  357. package/dist/src/tui/hooks/index.d.ts +8 -0
  358. package/dist/src/tui/hooks/index.js +17 -0
  359. package/dist/src/tui/hooks/index.js.map +1 -0
  360. package/dist/src/tui/hooks/use-clock.d.ts +1 -0
  361. package/dist/src/tui/hooks/use-clock.js +16 -0
  362. package/dist/src/tui/hooks/use-clock.js.map +1 -0
  363. package/dist/src/tui/hooks/use-clock.spec.d.ts +1 -0
  364. package/dist/src/tui/hooks/use-clock.spec.js +43 -0
  365. package/dist/src/tui/hooks/use-clock.spec.js.map +1 -0
  366. package/dist/src/tui/hooks/use-dashboard-state.d.ts +46 -0
  367. package/dist/src/tui/hooks/use-dashboard-state.js +249 -0
  368. package/dist/src/tui/hooks/use-dashboard-state.js.map +1 -0
  369. package/dist/src/tui/hooks/use-focus-agent.d.ts +2 -0
  370. package/dist/src/tui/hooks/use-focus-agent.js +26 -0
  371. package/dist/src/tui/hooks/use-focus-agent.js.map +1 -0
  372. package/dist/src/tui/hooks/use-multi-session-state.d.ts +16 -0
  373. package/dist/src/tui/hooks/use-multi-session-state.js +163 -0
  374. package/dist/src/tui/hooks/use-multi-session-state.js.map +1 -0
  375. package/dist/src/tui/hooks/use-terminal-size.d.ts +9 -0
  376. package/dist/src/tui/hooks/use-terminal-size.js +31 -0
  377. package/dist/src/tui/hooks/use-terminal-size.js.map +1 -0
  378. package/dist/src/tui/index.d.ts +20 -0
  379. package/dist/src/tui/index.js +43 -0
  380. package/dist/src/tui/index.js.map +1 -0
  381. package/dist/src/tui/ipc/index.d.ts +12 -0
  382. package/dist/src/tui/ipc/index.js +24 -0
  383. package/dist/src/tui/ipc/index.js.map +1 -0
  384. package/dist/src/tui/ipc/instance-registry.d.ts +12 -0
  385. package/dist/src/tui/ipc/instance-registry.js +81 -0
  386. package/dist/src/tui/ipc/instance-registry.js.map +1 -0
  387. package/dist/src/tui/ipc/ipc-bridge.d.ts +11 -0
  388. package/dist/src/tui/ipc/ipc-bridge.js +33 -0
  389. package/dist/src/tui/ipc/ipc-bridge.js.map +1 -0
  390. package/dist/src/tui/ipc/ipc-client.d.ts +21 -0
  391. package/dist/src/tui/ipc/ipc-client.js +102 -0
  392. package/dist/src/tui/ipc/ipc-client.js.map +1 -0
  393. package/dist/src/tui/ipc/ipc-debug.d.ts +1 -0
  394. package/dist/src/tui/ipc/ipc-debug.js +11 -0
  395. package/dist/src/tui/ipc/ipc-debug.js.map +1 -0
  396. package/dist/src/tui/ipc/ipc-server.d.ts +15 -0
  397. package/dist/src/tui/ipc/ipc-server.js +98 -0
  398. package/dist/src/tui/ipc/ipc-server.js.map +1 -0
  399. package/dist/src/tui/ipc/ipc-state-cache.d.ts +17 -0
  400. package/dist/src/tui/ipc/ipc-state-cache.js +69 -0
  401. package/dist/src/tui/ipc/ipc-state-cache.js.map +1 -0
  402. package/dist/src/tui/ipc/ipc.types.d.ts +19 -0
  403. package/dist/src/tui/ipc/ipc.types.js +45 -0
  404. package/dist/src/tui/ipc/ipc.types.js.map +1 -0
  405. package/dist/src/tui/ipc/multi-session-manager.d.ts +39 -0
  406. package/dist/src/tui/ipc/multi-session-manager.js +143 -0
  407. package/dist/src/tui/ipc/multi-session-manager.js.map +1 -0
  408. package/dist/src/tui/ipc/shutdown-manager.d.ts +7 -0
  409. package/dist/src/tui/ipc/shutdown-manager.js +32 -0
  410. package/dist/src/tui/ipc/shutdown-manager.js.map +1 -0
  411. package/dist/src/tui/ipc/test-utils.d.ts +2 -0
  412. package/dist/src/tui/ipc/test-utils.js +20 -0
  413. package/dist/src/tui/ipc/test-utils.js.map +1 -0
  414. package/dist/src/tui/ipc/tui-auto-launcher.d.ts +22 -0
  415. package/dist/src/tui/ipc/tui-auto-launcher.js +113 -0
  416. package/dist/src/tui/ipc/tui-auto-launcher.js.map +1 -0
  417. package/dist/src/tui/multi-session-app.d.ts +6 -0
  418. package/dist/src/tui/multi-session-app.js +55 -0
  419. package/dist/src/tui/multi-session-app.js.map +1 -0
  420. package/dist/src/tui/multi-session-app.spec.d.ts +1 -0
  421. package/dist/src/tui/multi-session-app.spec.js +95 -0
  422. package/dist/src/tui/multi-session-app.spec.js.map +1 -0
  423. package/dist/src/tui/transport-tui.integration.spec.d.ts +1 -0
  424. package/dist/src/tui/transport-tui.integration.spec.js +189 -0
  425. package/dist/src/tui/transport-tui.integration.spec.js.map +1 -0
  426. package/dist/src/tui/tui-config.d.ts +12 -0
  427. package/dist/src/tui/tui-config.js +32 -0
  428. package/dist/src/tui/tui-config.js.map +1 -0
  429. package/dist/src/tui/types.d.ts +22 -0
  430. package/dist/src/tui/types.js +37 -0
  431. package/dist/src/tui/types.js.map +1 -0
  432. package/dist/src/tui/utils/color-buffer.d.ts +31 -0
  433. package/dist/src/tui/utils/color-buffer.js +86 -0
  434. package/dist/src/tui/utils/color-buffer.js.map +1 -0
  435. package/dist/src/tui/utils/colors.d.ts +5 -0
  436. package/dist/src/tui/utils/colors.js +35 -0
  437. package/dist/src/tui/utils/colors.js.map +1 -0
  438. package/dist/src/tui/utils/display-width.d.ts +3 -0
  439. package/dist/src/tui/utils/display-width.js +45 -0
  440. package/dist/src/tui/utils/display-width.js.map +1 -0
  441. package/dist/src/tui/utils/edge-router.d.ts +9 -0
  442. package/dist/src/tui/utils/edge-router.js +65 -0
  443. package/dist/src/tui/utils/edge-router.js.map +1 -0
  444. package/dist/src/tui/utils/icons.d.ts +7 -0
  445. package/dist/src/tui/utils/icons.js +49 -0
  446. package/dist/src/tui/utils/icons.js.map +1 -0
  447. package/dist/src/tui/utils/index.d.ts +6 -0
  448. package/dist/src/tui/utils/index.js +36 -0
  449. package/dist/src/tui/utils/index.js.map +1 -0
  450. package/dist/src/tui/utils/theme.d.ts +50 -0
  451. package/dist/src/tui/utils/theme.js +128 -0
  452. package/dist/src/tui/utils/theme.js.map +1 -0
  453. package/dist/src/tui-bundle.mjs +5755 -0
  454. package/dist/tsconfig.build.tsbuildinfo +1 -1
  455. package/package.json +16 -6
  456. package/dist/src/shared/token-counter.d.ts +0 -13
  457. package/dist/src/shared/token-counter.js +0 -41
  458. package/dist/src/shared/token-counter.js.map +0 -1
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_1 = require("react");
4
+ const vitest_1 = require("vitest");
5
+ const ink_testing_library_1 = require("ink-testing-library");
6
+ const SessionTabBar_1 = require("./SessionTabBar");
7
+ function makeTab(overrides) {
8
+ return {
9
+ pid: overrides.index * 1000,
10
+ projectName: `project-${overrides.index}`,
11
+ globalState: 'IDLE',
12
+ isActive: false,
13
+ ...overrides,
14
+ };
15
+ }
16
+ (0, vitest_1.describe)('tui/components/SessionTabBar', () => {
17
+ (0, vitest_1.it)('should render nothing for a single session', () => {
18
+ const sessions = [makeTab({ index: 1, isActive: true })];
19
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: sessions, width: 120, layoutMode: "wide" }));
20
+ (0, vitest_1.expect)(lastFrame()).toBe('');
21
+ });
22
+ (0, vitest_1.it)('should render tab indicators and project names for multiple sessions', () => {
23
+ const sessions = [
24
+ makeTab({ index: 1, projectName: 'my-app', isActive: true }),
25
+ makeTab({ index: 2, projectName: 'api-server', isActive: false }),
26
+ ];
27
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: sessions, width: 120, layoutMode: "wide" }));
28
+ const frame = lastFrame() ?? '';
29
+ (0, vitest_1.expect)(frame).toContain('[1]');
30
+ (0, vitest_1.expect)(frame).toContain('[2]');
31
+ (0, vitest_1.expect)(frame).toContain('my-app');
32
+ (0, vitest_1.expect)(frame).toContain('api-server');
33
+ });
34
+ (0, vitest_1.it)('should contain status icons for multiple sessions', () => {
35
+ const sessions = [
36
+ makeTab({ index: 1, globalState: 'RUNNING', isActive: true }),
37
+ makeTab({ index: 2, globalState: 'IDLE', isActive: false }),
38
+ ];
39
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: sessions, width: 120, layoutMode: "wide" }));
40
+ const frame = lastFrame() ?? '';
41
+ (0, vitest_1.expect)(frame).toContain('●');
42
+ (0, vitest_1.expect)(frame).toContain('○');
43
+ });
44
+ (0, vitest_1.it)('should render compact counter in narrow layout', () => {
45
+ const sessions = [
46
+ makeTab({ index: 1, isActive: true }),
47
+ makeTab({ index: 2, isActive: false }),
48
+ makeTab({ index: 3, isActive: false }),
49
+ ];
50
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: sessions, width: 60, layoutMode: "narrow" }));
51
+ const frame = lastFrame() ?? '';
52
+ (0, vitest_1.expect)(frame).toContain('(1/3)');
53
+ });
54
+ (0, vitest_1.it)('should render nothing for zero sessions', () => {
55
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(SessionTabBar_1.SessionTabBar, { sessions: [], width: 120, layoutMode: "wide" }));
56
+ (0, vitest_1.expect)(lastFrame()).toBe('');
57
+ });
58
+ });
59
+ //# sourceMappingURL=SessionTabBar.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SessionTabBar.spec.js","sourceRoot":"","sources":["../../../../src/tui/components/SessionTabBar.spec.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ import type { StageStats } from '../dashboard-types';
3
+ import type { Mode } from '../types';
4
+ export interface StageHealthBarProps {
5
+ stageHealth: Record<Mode, StageStats>;
6
+ bottlenecks: string[];
7
+ toolCount: number;
8
+ width: number;
9
+ }
10
+ export declare function StageHealthBar({ stageHealth, bottlenecks, toolCount, width, }: StageHealthBarProps): React.ReactElement;
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.StageHealthBar = StageHealthBar;
4
+ const react_1 = require("react");
5
+ const ink_1 = require("ink");
6
+ const theme_1 = require("../utils/theme");
7
+ function StageStatDisplay({ mode, stats, }) {
8
+ const color = (0, theme_1.getModeColor)(mode);
9
+ const parts = [];
10
+ if (stats.running > 0)
11
+ parts.push(react_1.default.createElement(ink_1.Text, { key: "r", color: "green" },
12
+ ' ',
13
+ "\u25CF ",
14
+ stats.running,
15
+ " running"));
16
+ if (stats.blocked > 0)
17
+ parts.push(react_1.default.createElement(ink_1.Text, { key: "b", color: "yellow" },
18
+ ' ',
19
+ "\u23F8 ",
20
+ stats.blocked,
21
+ " blocked"));
22
+ if (stats.waiting > 0)
23
+ parts.push(react_1.default.createElement(ink_1.Text, { key: "w", dimColor: true },
24
+ ' ',
25
+ "\u25CB ",
26
+ stats.waiting,
27
+ " waiting"));
28
+ if (stats.done > 0)
29
+ parts.push(react_1.default.createElement(ink_1.Text, { key: "d", color: "green" },
30
+ ' ',
31
+ "\u2713 ",
32
+ stats.done));
33
+ if (stats.error > 0)
34
+ parts.push(react_1.default.createElement(ink_1.Text, { key: "e", color: "red", bold: true },
35
+ ' ',
36
+ "! ",
37
+ stats.error,
38
+ " err"));
39
+ if (parts.length === 0)
40
+ parts.push(react_1.default.createElement(ink_1.Text, { key: "idle", dimColor: true },
41
+ ' ',
42
+ "idle"));
43
+ return (react_1.default.createElement(ink_1.Box, null,
44
+ react_1.default.createElement(ink_1.Text, { color: color, bold: true },
45
+ mode,
46
+ ":"),
47
+ parts));
48
+ }
49
+ function StageHealthBar({ stageHealth, bottlenecks, toolCount, width, }) {
50
+ const countStr = toolCount >= 1000 ? `${Math.round(toolCount / 1000)}k` : String(toolCount);
51
+ return (react_1.default.createElement(ink_1.Box, { borderStyle: "double", borderColor: theme_1.BORDER_COLORS.panel, width: width, flexDirection: "column" },
52
+ react_1.default.createElement(ink_1.Box, null,
53
+ react_1.default.createElement(ink_1.Box, { gap: 2 }, ['PLAN', 'ACT', 'EVAL'].map(mode => (react_1.default.createElement(StageStatDisplay, { key: mode, mode: mode, stats: stageHealth[mode] })))),
54
+ react_1.default.createElement(ink_1.Box, { flexGrow: 1 }),
55
+ react_1.default.createElement(ink_1.Box, { gap: 2 },
56
+ bottlenecks.length > 0 && (react_1.default.createElement(ink_1.Text, { color: "red", bold: true },
57
+ "\u26A1 Bottlenecks: ",
58
+ bottlenecks.join(' / '))),
59
+ react_1.default.createElement(ink_1.Text, { dimColor: true },
60
+ "tools: ",
61
+ countStr)))));
62
+ }
63
+ //# sourceMappingURL=StageHealthBar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StageHealthBar.js","sourceRoot":"","sources":["../../../../src/tui/components/StageHealthBar.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,63 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const react_1 = require("react");
4
+ const vitest_1 = require("vitest");
5
+ const ink_testing_library_1 = require("ink-testing-library");
6
+ const StageHealthBar_1 = require("./StageHealthBar");
7
+ const dashboard_types_1 = require("../dashboard-types");
8
+ function makeHealth() {
9
+ return {
10
+ PLAN: { ...(0, dashboard_types_1.createEmptyStageStats)(), running: 1, done: 5 },
11
+ ACT: { ...(0, dashboard_types_1.createEmptyStageStats)(), running: 2, waiting: 1 },
12
+ EVAL: { ...(0, dashboard_types_1.createEmptyStageStats)(), error: 1 },
13
+ AUTO: (0, dashboard_types_1.createEmptyStageStats)(),
14
+ };
15
+ }
16
+ (0, vitest_1.describe)('tui/components/StageHealthBar', () => {
17
+ (0, vitest_1.it)('should render stage names with colors', () => {
18
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: [], toolCount: 128000, width: 120 }));
19
+ const frame = lastFrame() ?? '';
20
+ (0, vitest_1.expect)(frame).toContain('PLAN:');
21
+ (0, vitest_1.expect)(frame).toContain('ACT:');
22
+ (0, vitest_1.expect)(frame).toContain('EVAL:');
23
+ });
24
+ (0, vitest_1.it)('should render running/done/error stats', () => {
25
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: [], toolCount: 0, width: 120 }));
26
+ const frame = lastFrame() ?? '';
27
+ (0, vitest_1.expect)(frame).toContain('running');
28
+ (0, vitest_1.expect)(frame).toContain('err');
29
+ });
30
+ (0, vitest_1.it)('should render tool count', () => {
31
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: [], toolCount: 64000, width: 120 }));
32
+ (0, vitest_1.expect)(lastFrame()).toContain('64k');
33
+ });
34
+ (0, vitest_1.it)('should render bottlenecks', () => {
35
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: ['tests failing(3)', 'lint errors'], toolCount: 0, width: 120 }));
36
+ const frame = lastFrame() ?? '';
37
+ (0, vitest_1.expect)(frame).toContain('tests failing');
38
+ (0, vitest_1.expect)(frame).toContain('Bottlenecks');
39
+ });
40
+ (0, vitest_1.it)('should render in narrow mode', () => {
41
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: ['long bottleneck description'], toolCount: 50000, width: 60 }));
42
+ (0, vitest_1.expect)(lastFrame()).toBeTruthy();
43
+ });
44
+ (0, vitest_1.it)('should render with empty stats', () => {
45
+ const empty = {
46
+ PLAN: (0, dashboard_types_1.createEmptyStageStats)(),
47
+ ACT: (0, dashboard_types_1.createEmptyStageStats)(),
48
+ EVAL: (0, dashboard_types_1.createEmptyStageStats)(),
49
+ AUTO: (0, dashboard_types_1.createEmptyStageStats)(),
50
+ };
51
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: empty, bottlenecks: [], toolCount: 0, width: 120 }));
52
+ const frame = lastFrame() ?? '';
53
+ (0, vitest_1.expect)(frame).toContain('PLAN:');
54
+ (0, vitest_1.expect)(frame).toContain('idle');
55
+ });
56
+ (0, vitest_1.it)('should render double border', () => {
57
+ const { lastFrame } = (0, ink_testing_library_1.render)(react_1.default.createElement(StageHealthBar_1.StageHealthBar, { stageHealth: makeHealth(), bottlenecks: [], toolCount: 0, width: 120 }));
58
+ const frame = lastFrame() ?? '';
59
+ (0, vitest_1.expect)(frame).toContain('╔');
60
+ (0, vitest_1.expect)(frame).toContain('╝');
61
+ });
62
+ });
63
+ //# sourceMappingURL=StageHealthBar.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"StageHealthBar.spec.js","sourceRoot":"","sources":["../../../../src/tui/components/StageHealthBar.spec.tsx"],"names":[],"mappings":";;AAAA,iCAA0B;AAC1B,mCAA8C;AAC9C,6DAA6C;AAC7C,qDAAkD;AAClD,wDAA2D;AAE3D,SAAS,UAAU;IACjB,OAAO;QACL,IAAI,EAAE,EAAE,GAAG,IAAA,uCAAqB,GAAE,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE;QACzD,GAAG,EAAE,EAAE,GAAG,IAAA,uCAAqB,GAAE,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE;QAC3D,IAAI,EAAE,EAAE,GAAG,IAAA,uCAAqB,GAAE,EAAE,KAAK,EAAE,CAAC,EAAE;QAC9C,IAAI,EAAE,IAAA,uCAAqB,GAAE;KAC9B,CAAC;AACJ,CAAC;AAED,IAAA,iBAAQ,EAAC,+BAA+B,EAAE,GAAG,EAAE;IAC7C,IAAA,WAAE,EAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,4BAAM,EAC1B,8BAAC,+BAAc,IAAC,WAAW,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,GAAI,CAC9F,CAAC;QACF,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;QAChC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;QAChC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,wCAAwC,EAAE,GAAG,EAAE;QAChD,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,4BAAM,EAC1B,8BAAC,+BAAc,IAAC,WAAW,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,GAAI,CACzF,CAAC;QACF,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;QAChC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QACnC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,0BAA0B,EAAE,GAAG,EAAE;QAClC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,4BAAM,EAC1B,8BAAC,+BAAc,IAAC,WAAW,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,GAAI,CAC7F,CAAC;QACF,IAAA,eAAM,EAAC,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,4BAAM,EAC1B,8BAAC,+BAAc,IACb,WAAW,EAAE,UAAU,EAAE,EACzB,WAAW,EAAE,CAAC,kBAAkB,EAAE,aAAa,CAAC,EAChD,SAAS,EAAE,CAAC,EACZ,KAAK,EAAE,GAAG,GACV,CACH,CAAC;QACF,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;QAChC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;QACzC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;IACzC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,8BAA8B,EAAE,GAAG,EAAE;QACtC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,4BAAM,EAC1B,8BAAC,+BAAc,IACb,WAAW,EAAE,UAAU,EAAE,EACzB,WAAW,EAAE,CAAC,6BAA6B,CAAC,EAC5C,SAAS,EAAE,KAAK,EAChB,KAAK,EAAE,EAAE,GACT,CACH,CAAC;QACF,IAAA,eAAM,EAAC,SAAS,EAAE,CAAC,CAAC,UAAU,EAAE,CAAC;IACnC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,gCAAgC,EAAE,GAAG,EAAE;QACxC,MAAM,KAAK,GAAG;YACZ,IAAI,EAAE,IAAA,uCAAqB,GAAE;YAC7B,GAAG,EAAE,IAAA,uCAAqB,GAAE;YAC5B,IAAI,EAAE,IAAA,uCAAqB,GAAE;YAC7B,IAAI,EAAE,IAAA,uCAAqB,GAAE;SAC9B,CAAC;QACF,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,4BAAM,EAC1B,8BAAC,+BAAc,IAAC,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,GAAI,CAClF,CAAC;QACF,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;QAChC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;QACjC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC,CAAC,CAAC;IAEH,IAAA,WAAE,EAAC,6BAA6B,EAAE,GAAG,EAAE;QACrC,MAAM,EAAE,SAAS,EAAE,GAAG,IAAA,4BAAM,EAC1B,8BAAC,+BAAc,IAAC,WAAW,EAAE,UAAU,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,GAAG,GAAI,CACzF,CAAC;QACF,MAAM,KAAK,GAAG,SAAS,EAAE,IAAI,EAAE,CAAC;QAChC,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAA,eAAM,EAAC,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type { ToolCallRecord } from '../dashboard-types';
2
+ import type { Mode } from '../types';
3
+ export interface BarChartItem {
4
+ tool: string;
5
+ count: number;
6
+ }
7
+ export declare function aggregateForBarChart(calls: ToolCallRecord[], maxTools?: number): BarChartItem[];
8
+ export declare function renderBarChart(data: BarChartItem[], width: number, height: number): string[];
9
+ export declare function renderLiveContext(calls: ToolCallRecord[], currentMode: Mode | null, width: number, height: number, now?: number): string[];
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.aggregateForBarChart = aggregateForBarChart;
4
+ exports.renderBarChart = renderBarChart;
5
+ exports.renderLiveContext = renderLiveContext;
6
+ const display_width_1 = require("../utils/display-width");
7
+ function aggregateForBarChart(calls, maxTools = 10) {
8
+ if (calls.length === 0)
9
+ return [];
10
+ const toolCounts = new Map();
11
+ for (const call of calls) {
12
+ toolCounts.set(call.toolName, (toolCounts.get(call.toolName) ?? 0) + 1);
13
+ }
14
+ return [...toolCounts.entries()]
15
+ .sort((a, b) => b[1] - a[1])
16
+ .slice(0, maxTools)
17
+ .map(([tool, count]) => ({ tool, count }));
18
+ }
19
+ const TOOL_NAME_WIDTH = 12;
20
+ const BAR_FIXED_OVERHEAD = TOOL_NAME_WIDTH + 2 + 2 + 4;
21
+ function renderBarChart(data, width, height) {
22
+ if (data.length === 0 || height <= 0 || width <= 0)
23
+ return [];
24
+ const lines = [(0, display_width_1.truncateToDisplayWidth)('📊 Activity', width)];
25
+ const barWidth = Math.max(1, width - BAR_FIXED_OVERHEAD);
26
+ const maxCount = data[0]?.count || 1;
27
+ for (const item of data) {
28
+ if (lines.length >= height)
29
+ break;
30
+ const name = (0, display_width_1.padEndDisplayWidth)((0, display_width_1.truncateToDisplayWidth)(item.tool, TOOL_NAME_WIDTH), TOOL_NAME_WIDTH);
31
+ const filled = Math.round((item.count / maxCount) * barWidth);
32
+ const empty = barWidth - filled;
33
+ const bar = '█'.repeat(filled) + '░'.repeat(empty);
34
+ const countStr = String(item.count).padStart(4);
35
+ lines.push((0, display_width_1.truncateToDisplayWidth)(`${name} [${bar}] ${countStr}`, width));
36
+ }
37
+ return lines.slice(0, height);
38
+ }
39
+ const LIVE_AGENT_NAME_WIDTH = 15;
40
+ const LIVE_HOT_WINDOW_MS = 5_000;
41
+ const LIVE_RECENT_WINDOW_MS = 30_000;
42
+ const LIVE_HOT_SEC = LIVE_HOT_WINDOW_MS / 1000;
43
+ const LIVE_RECENT_SEC = LIVE_RECENT_WINDOW_MS / 1000;
44
+ function renderLiveContext(calls, currentMode, width, height, now) {
45
+ const currentTime = now ?? Date.now();
46
+ if (height <= 0 || width <= 0)
47
+ return [];
48
+ const lines = [(0, display_width_1.truncateToDisplayWidth)('💬 Live', width)];
49
+ if (currentMode) {
50
+ lines.push((0, display_width_1.truncateToDisplayWidth)(`⟫ Mode: ${currentMode}`, width));
51
+ }
52
+ const maxItems = height - lines.length;
53
+ const seen = new Set();
54
+ for (let i = calls.length - 1; i >= 0 && seen.size < maxItems; i--) {
55
+ const call = calls[i];
56
+ if (call.status === 'error')
57
+ continue;
58
+ if (seen.has(call.toolName))
59
+ continue;
60
+ seen.add(call.toolName);
61
+ const ageSec = Math.floor((currentTime - call.timestamp) / 1000);
62
+ const ageIndicator = ageSec < LIVE_HOT_SEC ? '◉' : ageSec < LIVE_RECENT_SEC ? '○' : '·';
63
+ const agent = call.agentId !== 'unknown'
64
+ ? (0, display_width_1.truncateToDisplayWidth)(call.agentId, LIVE_AGENT_NAME_WIDTH) + ' '
65
+ : '';
66
+ lines.push((0, display_width_1.truncateToDisplayWidth)(`${ageIndicator} ${agent}${call.toolName}`, width));
67
+ }
68
+ return lines.slice(0, height);
69
+ }
70
+ //# sourceMappingURL=activity-visualizer.pure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"activity-visualizer.pure.js","sourceRoot":"","sources":["../../../../src/tui/components/activity-visualizer.pure.ts"],"names":[],"mappings":";;AASA,oDAYC;AAKD,wCAwBC;AAQD,8CAmCC;AA3FD,0DAAoF;AAOpF,SAAgB,oBAAoB,CAAC,KAAuB,EAAE,QAAQ,GAAG,EAAE;IACzE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAkB,CAAC;IAC7C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,CAAC,GAAG,UAAU,CAAC,OAAO,EAAE,CAAC;SAC7B,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;SAC3B,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC;SAClB,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC;AAC/C,CAAC;AAED,MAAM,eAAe,GAAG,EAAE,CAAC;AAC3B,MAAM,kBAAkB,GAAG,eAAe,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;AAEvD,SAAgB,cAAc,CAAC,IAAoB,EAAE,KAAa,EAAE,MAAc;IAChF,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAE9D,MAAM,KAAK,GAAa,CAAC,IAAA,sCAAsB,EAAC,aAAa,EAAE,KAAK,CAAC,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,kBAAkB,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,CAAC,CAAC;IAErC,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,KAAK,CAAC,MAAM,IAAI,MAAM;YAAE,MAAM;QAElC,MAAM,IAAI,GAAG,IAAA,kCAAkB,EAC7B,IAAA,sCAAsB,EAAC,IAAI,CAAC,IAAI,EAAE,eAAe,CAAC,EAClD,eAAe,CAChB,CAAC;QACF,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,KAAK,GAAG,QAAQ,CAAC,GAAG,QAAQ,CAAC,CAAC;QAC9D,MAAM,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;QAChC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAEhD,KAAK,CAAC,IAAI,CAAC,IAAA,sCAAsB,EAAC,GAAG,IAAI,KAAK,GAAG,KAAK,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,MAAM,qBAAqB,GAAG,EAAE,CAAC;AACjC,MAAM,kBAAkB,GAAG,KAAK,CAAC;AACjC,MAAM,qBAAqB,GAAG,MAAM,CAAC;AACrC,MAAM,YAAY,GAAG,kBAAkB,GAAG,IAAI,CAAC;AAC/C,MAAM,eAAe,GAAG,qBAAqB,GAAG,IAAI,CAAC;AAErD,SAAgB,iBAAiB,CAC/B,KAAuB,EACvB,WAAwB,EACxB,KAAa,EACb,MAAc,EACd,GAAY;IAEZ,MAAM,WAAW,GAAG,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACtC,IAAI,MAAM,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,KAAK,GAAa,CAAC,IAAA,sCAAsB,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC,CAAC;IAEnE,IAAI,WAAW,EAAE,CAAC;QAChB,KAAK,CAAC,IAAI,CAAC,IAAA,sCAAsB,EAAC,WAAW,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACtE,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;IACvC,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAE/B,KAAK,IAAI,CAAC,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAI,GAAG,QAAQ,EAAE,CAAC,EAAE,EAAE,CAAC;QACnE,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,MAAM,KAAK,OAAO;YAAE,SAAS;QACtC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC;YAAE,SAAS;QACtC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAExB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,WAAW,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,CAAC;QACjE,MAAM,YAAY,GAAG,MAAM,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACxF,MAAM,KAAK,GACT,IAAI,CAAC,OAAO,KAAK,SAAS;YACxB,CAAC,CAAC,IAAA,sCAAsB,EAAC,IAAI,CAAC,OAAO,EAAE,qBAAqB,CAAC,GAAG,GAAG;YACnE,CAAC,CAAC,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,IAAA,sCAAsB,EAAC,GAAG,YAAY,IAAI,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;IACxF,CAAC;IAED,OAAO,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;AAChC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function formatContextDecisions(decisions: string[], maxItems?: number): string | null;
2
+ export declare function formatContextNotes(notes: string[], maxItems?: number): string | null;
3
+ export declare function formatContextSection(decisions: string[], notes: string[]): string | null;
@@ -0,0 +1,38 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.formatContextDecisions = formatContextDecisions;
4
+ exports.formatContextNotes = formatContextNotes;
5
+ exports.formatContextSection = formatContextSection;
6
+ function formatContextDecisions(decisions, maxItems = 5) {
7
+ if (decisions.length === 0)
8
+ return null;
9
+ const visible = decisions.slice(0, maxItems);
10
+ const lines = visible.map((d, i) => ` ${i + 1}. ${d}`);
11
+ if (decisions.length > maxItems) {
12
+ lines.push(` ⋯ (+${decisions.length - maxItems} more)`);
13
+ }
14
+ return lines.join('\n');
15
+ }
16
+ function formatContextNotes(notes, maxItems = 5) {
17
+ if (notes.length === 0)
18
+ return null;
19
+ const visible = notes.slice(0, maxItems);
20
+ const lines = visible.map(n => ` › ${n}`);
21
+ if (notes.length > maxItems) {
22
+ lines.push(` ⋯ (+${notes.length - maxItems} more)`);
23
+ }
24
+ return lines.join('\n');
25
+ }
26
+ function formatContextSection(decisions, notes) {
27
+ const decStr = formatContextDecisions(decisions);
28
+ const noteStr = formatContextNotes(notes);
29
+ if (!decStr && !noteStr)
30
+ return null;
31
+ const parts = [];
32
+ if (decStr)
33
+ parts.push(decStr);
34
+ if (noteStr)
35
+ parts.push(noteStr);
36
+ return parts.join('\n');
37
+ }
38
+ //# sourceMappingURL=context-section.pure.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context-section.pure.js","sourceRoot":"","sources":["../../../../src/tui/components/context-section.pure.ts"],"names":[],"mappings":";;AASA,wDAQC;AAMD,gDAQC;AAMD,oDAQC;AApCD,SAAgB,sBAAsB,CAAC,SAAmB,EAAE,QAAQ,GAAG,CAAC;IACtE,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACxC,MAAM,OAAO,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IAC7C,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;IACxD,IAAI,SAAS,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAChC,KAAK,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,MAAM,GAAG,QAAQ,QAAQ,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAMD,SAAgB,kBAAkB,CAAC,KAAe,EAAE,QAAQ,GAAG,CAAC;IAC9D,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC3C,IAAI,KAAK,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,MAAM,GAAG,QAAQ,QAAQ,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAMD,SAAgB,oBAAoB,CAAC,SAAmB,EAAE,KAAe;IACvE,MAAM,MAAM,GAAG,sBAAsB,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,OAAO,GAAG,kBAAkB,CAAC,KAAK,CAAC,CAAC;IAC1C,IAAI,CAAC,MAAM,IAAI,CAAC,OAAO;QAAE,OAAO,IAAI,CAAC;IACrC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,MAAM;QAAE,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC/B,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC"}
@@ -0,0 +1,26 @@
1
+ import { ColorBuffer } from '../utils/color-buffer';
2
+ import type { DashboardNode, Edge } from '../dashboard-types';
3
+ import type { Mode } from '../types';
4
+ interface StageColumn {
5
+ startX: number;
6
+ width: number;
7
+ label: Mode;
8
+ }
9
+ interface NodePosition {
10
+ x: number;
11
+ y: number;
12
+ width: number;
13
+ height: number;
14
+ }
15
+ export declare function layoutStageColumns(totalWidth: number, hasAutoAgents?: boolean): Record<Mode, StageColumn>;
16
+ export declare function layoutAgentNodes(agents: Map<string, DashboardNode>, columns: Record<Mode, StageColumn>): Map<string, NodePosition>;
17
+ export declare function buildProgressBar(value: number, barWidth: number): {
18
+ filled: number;
19
+ empty: number;
20
+ label: string;
21
+ };
22
+ export declare function renderPipelineHeader(buf: ColorBuffer, width: number, activeStage: Mode | null, hasAutoAgents?: boolean): void;
23
+ export declare function renderFlowMap(agents: Map<string, DashboardNode>, edges: Edge[], width: number, height: number, activeStage?: Mode | null): ColorBuffer;
24
+ export declare function renderFlowMapSimplified(agents: Map<string, DashboardNode>, width: number, height: number): ColorBuffer;
25
+ export declare function renderFlowMapCompact(agents: Map<string, DashboardNode>): string;
26
+ export {};
@@ -0,0 +1,263 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.layoutStageColumns = layoutStageColumns;
4
+ exports.layoutAgentNodes = layoutAgentNodes;
5
+ exports.buildProgressBar = buildProgressBar;
6
+ exports.renderPipelineHeader = renderPipelineHeader;
7
+ exports.renderFlowMap = renderFlowMap;
8
+ exports.renderFlowMapSimplified = renderFlowMapSimplified;
9
+ exports.renderFlowMapCompact = renderFlowMapCompact;
10
+ const color_buffer_1 = require("../utils/color-buffer");
11
+ const edge_router_1 = require("../utils/edge-router");
12
+ const theme_1 = require("../utils/theme");
13
+ const NODE_WIDTH = 17;
14
+ const NODE_HEIGHT = 4;
15
+ const STAGE_ORDER = ['PLAN', 'ACT', 'EVAL', 'AUTO'];
16
+ const STAGE_SLOT_WIDTH = 8;
17
+ const PIPELINE_RIGHT_MARGIN = 10;
18
+ function groupByStage(agents) {
19
+ const byStage = new Map();
20
+ for (const agent of agents.values()) {
21
+ const list = byStage.get(agent.stage) ?? [];
22
+ list.push(agent);
23
+ byStage.set(agent.stage, list);
24
+ }
25
+ return byStage;
26
+ }
27
+ function sortAgents(agents) {
28
+ return [...agents].sort((a, b) => {
29
+ if (a.isPrimary !== b.isPrimary)
30
+ return a.isPrimary ? -1 : 1;
31
+ return a.name.localeCompare(b.name);
32
+ });
33
+ }
34
+ function layoutStageColumns(totalWidth, hasAutoAgents = false) {
35
+ if (hasAutoAgents) {
36
+ const colWidth = Math.floor(totalWidth / 4);
37
+ return {
38
+ PLAN: { startX: 0, width: colWidth, label: 'PLAN' },
39
+ ACT: { startX: colWidth, width: colWidth, label: 'ACT' },
40
+ EVAL: { startX: colWidth * 2, width: colWidth, label: 'EVAL' },
41
+ AUTO: { startX: colWidth * 3, width: totalWidth - colWidth * 3, label: 'AUTO' },
42
+ };
43
+ }
44
+ const colWidth = Math.floor(totalWidth / 3);
45
+ return {
46
+ PLAN: { startX: 0, width: colWidth, label: 'PLAN' },
47
+ ACT: { startX: colWidth, width: colWidth, label: 'ACT' },
48
+ EVAL: {
49
+ startX: colWidth * 2,
50
+ width: totalWidth - colWidth * 2,
51
+ label: 'EVAL',
52
+ },
53
+ AUTO: { startX: 0, width: totalWidth, label: 'AUTO' },
54
+ };
55
+ }
56
+ function layoutAgentNodes(agents, columns) {
57
+ const positions = new Map();
58
+ const byStage = groupByStage(agents);
59
+ for (const [stage, stageAgents] of byStage) {
60
+ const col = columns[stage];
61
+ if (!col)
62
+ continue;
63
+ const sorted = sortAgents(stageAgents);
64
+ const startY = 3;
65
+ sorted.forEach((agent, idx) => {
66
+ positions.set(agent.id, {
67
+ x: col.startX + Math.floor((col.width - NODE_WIDTH) / 2),
68
+ y: startY + idx * (NODE_HEIGHT + 1),
69
+ width: NODE_WIDTH,
70
+ height: NODE_HEIGHT,
71
+ });
72
+ });
73
+ }
74
+ return positions;
75
+ }
76
+ function getNodeTextStyle(status) {
77
+ if (status === 'running')
78
+ return { fg: 'white', bold: true };
79
+ return { dim: true };
80
+ }
81
+ function drawAgentNode(buf, x, y, boxW, agent) {
82
+ const borderStyle = (0, theme_1.getStatusStyle)(agent.status);
83
+ if (agent.isPrimary) {
84
+ buf.drawDoubleBox(x, y, boxW, NODE_HEIGHT, borderStyle);
85
+ }
86
+ else {
87
+ buf.drawRoundBox(x, y, boxW, NODE_HEIGHT, borderStyle);
88
+ }
89
+ const icon = theme_1.STATUS_ICONS[agent.status];
90
+ const maxNameLen = Math.max(1, boxW - 5);
91
+ const nameStr = agent.name.length > maxNameLen ? agent.name.slice(0, maxNameLen - 3) + '...' : agent.name;
92
+ buf.writeText(x + 2, y + 1, nameStr, getNodeTextStyle(agent.status));
93
+ buf.writeText(x + 2 + nameStr.length + 1, y + 1, icon, theme_1.STATUS_STYLES[agent.status]);
94
+ const barWidth = boxW - 4;
95
+ const bar = buildProgressBar(agent.progress, barWidth);
96
+ const filledStr = theme_1.PROGRESS_BAR_CHARS.filled.repeat(bar.filled);
97
+ const emptyStr = theme_1.PROGRESS_BAR_CHARS.empty.repeat(bar.empty);
98
+ buf.writeText(x + 2, y + 2, filledStr, theme_1.PROGRESS_BAR_STYLES.filled);
99
+ if (bar.empty > 0) {
100
+ buf.writeText(x + 2 + bar.filled, y + 2, emptyStr, theme_1.PROGRESS_BAR_STYLES.empty);
101
+ }
102
+ }
103
+ function buildProgressBar(value, barWidth) {
104
+ const clamped = Math.max(0, Math.min(100, value));
105
+ const filled = Math.round((clamped / 100) * barWidth);
106
+ const empty = barWidth - filled;
107
+ const label = clamped === 100 ? '100' : clamped.toString().padStart(2, ' ') + '%';
108
+ return { filled, empty, label };
109
+ }
110
+ function drawGlow(buf, x, y, w, h, style) {
111
+ for (let i = x - 1; i <= x + w; i++) {
112
+ buf.setChar(i, y - 1, '░', style);
113
+ }
114
+ for (let i = x - 1; i <= x + w; i++) {
115
+ buf.setChar(i, y + h, '░', style);
116
+ }
117
+ for (let j = y - 1; j <= y + h; j++) {
118
+ buf.setChar(x - 1, j, '░', style);
119
+ buf.setChar(x + w, j, '░', style);
120
+ }
121
+ }
122
+ function countByStatus(agents) {
123
+ const counts = {
124
+ running: 0,
125
+ idle: 0,
126
+ blocked: 0,
127
+ error: 0,
128
+ done: 0,
129
+ };
130
+ for (const agent of agents.values()) {
131
+ counts[agent.status]++;
132
+ }
133
+ return counts;
134
+ }
135
+ function renderPipelineHeader(buf, width, activeStage, hasAutoAgents = false) {
136
+ const stages = hasAutoAgents ? STAGE_ORDER : STAGE_ORDER.filter(s => s !== 'AUTO');
137
+ let x = 1;
138
+ for (let i = 0; i < stages.length; i++) {
139
+ const stage = stages[i];
140
+ const isActive = stage === activeStage;
141
+ const stageStyle = isActive
142
+ ? theme_1.STAGE_LABEL_STYLES[stage]
143
+ : { fg: theme_1.STAGE_LABEL_STYLES[stage].fg, dim: true };
144
+ buf.setChar(x, 0, '▸', isActive ? theme_1.PIPELINE_STYLES.arrow : theme_1.PIPELINE_STYLES.connector);
145
+ x += 2;
146
+ buf.writeText(x, 0, stage, stageStyle);
147
+ x += stage.length;
148
+ if (i < stages.length - 1) {
149
+ x += 1;
150
+ const connLen = Math.max(3, Math.floor((width - stages.length * STAGE_SLOT_WIDTH) / (stages.length - 1)));
151
+ const safeLen = Math.max(0, Math.min(connLen, width - x - PIPELINE_RIGHT_MARGIN));
152
+ for (let j = 0; j < safeLen; j++) {
153
+ buf.setChar(x + j, 0, '═', theme_1.PIPELINE_STYLES.connector);
154
+ }
155
+ x += safeLen;
156
+ }
157
+ }
158
+ buf.drawHLine(1, 1, width - 2, '┄', { fg: 'gray', dim: true });
159
+ }
160
+ function renderFlowMap(agents, edges, width, height, activeStage = null) {
161
+ let hasAutoAgents = false;
162
+ for (const a of agents.values()) {
163
+ if (a.stage === 'AUTO') {
164
+ hasAutoAgents = true;
165
+ break;
166
+ }
167
+ }
168
+ const buf = new color_buffer_1.ColorBuffer(width, height);
169
+ const columns = layoutStageColumns(width, hasAutoAgents);
170
+ const positions = layoutAgentNodes(agents, columns);
171
+ renderPipelineHeader(buf, width, activeStage, hasAutoAgents);
172
+ for (const [id, pos] of positions) {
173
+ const agent = agents.get(id);
174
+ if (!agent)
175
+ continue;
176
+ if (agent.status === 'running' && agent.isPrimary) {
177
+ drawGlow(buf, pos.x, pos.y, pos.width, pos.height, theme_1.GLOW_STYLE);
178
+ }
179
+ }
180
+ for (const [id, pos] of positions) {
181
+ const agent = agents.get(id);
182
+ if (!agent)
183
+ continue;
184
+ drawAgentNode(buf, pos.x, pos.y, pos.width, agent);
185
+ }
186
+ for (const edge of edges) {
187
+ const fromPos = positions.get(edge.from);
188
+ const toPos = positions.get(edge.to);
189
+ if (!fromPos || !toPos)
190
+ continue;
191
+ const fromPoint = {
192
+ x: fromPos.x + fromPos.width,
193
+ y: fromPos.y + Math.floor(fromPos.height / 2),
194
+ };
195
+ const toPoint = {
196
+ x: toPos.x - 1,
197
+ y: toPos.y + Math.floor(toPos.height / 2),
198
+ };
199
+ const path = (0, edge_router_1.computeEdgePath)(fromPoint, toPoint);
200
+ for (const seg of path) {
201
+ const isArrow = seg.char === '▸' || seg.char === '◂' || seg.char === '▾' || seg.char === '▴';
202
+ buf.setChar(seg.x, seg.y, seg.char, isArrow ? theme_1.EDGE_STYLES.arrow : theme_1.EDGE_STYLES.path);
203
+ }
204
+ const labelPos = (0, edge_router_1.computeLabelPosition)(path, edge.label);
205
+ if (labelPos) {
206
+ buf.writeText(labelPos.x, labelPos.y - 1, edge.label, theme_1.EDGE_STYLES.label);
207
+ }
208
+ }
209
+ const counts = countByStatus(agents);
210
+ const legendY = height - 1;
211
+ let lx = 1;
212
+ const legendParts = [
213
+ { text: `● ${counts.running} active`, style: theme_1.STATUS_STYLES.running },
214
+ { text: ` ○ ${counts.idle} idle`, style: theme_1.STATUS_STYLES.idle },
215
+ { text: ` ⏸ ${counts.blocked} blocked`, style: theme_1.STATUS_STYLES.blocked },
216
+ { text: ` ! ${counts.error} error`, style: theme_1.STATUS_STYLES.error },
217
+ { text: ` ✓ ${counts.done} done`, style: theme_1.STATUS_STYLES.done },
218
+ ];
219
+ for (const part of legendParts) {
220
+ buf.writeText(lx, legendY, part.text, part.style);
221
+ lx += part.text.length;
222
+ }
223
+ return buf;
224
+ }
225
+ function renderFlowMapSimplified(agents, width, height) {
226
+ const buf = new color_buffer_1.ColorBuffer(width, height);
227
+ const byStage = groupByStage(agents);
228
+ let y = 0;
229
+ for (const stage of STAGE_ORDER) {
230
+ const stageAgents = byStage.get(stage);
231
+ if (!stageAgents || stageAgents.length === 0)
232
+ continue;
233
+ buf.writeText(1, y, stage, theme_1.STAGE_LABEL_STYLES[stage]);
234
+ y++;
235
+ const sorted = sortAgents(stageAgents);
236
+ for (const agent of sorted) {
237
+ if (y >= height - 1)
238
+ break;
239
+ const boxW = Math.min(width - 2, NODE_WIDTH);
240
+ drawAgentNode(buf, 1, y, boxW, agent);
241
+ y += NODE_HEIGHT + 1;
242
+ }
243
+ }
244
+ return buf;
245
+ }
246
+ function renderFlowMapCompact(agents) {
247
+ const lines = [];
248
+ const byStage = groupByStage(agents);
249
+ for (const stage of STAGE_ORDER) {
250
+ const stageAgents = byStage.get(stage);
251
+ if (!stageAgents)
252
+ continue;
253
+ const sorted = sortAgents(stageAgents);
254
+ for (const agent of sorted) {
255
+ const icon = theme_1.STATUS_ICONS[agent.status];
256
+ const star = agent.isPrimary ? '★ ' : '';
257
+ const progress = agent.progress > 0 ? ` ${agent.progress}%` : '';
258
+ lines.push(`${icon} ${star}${agent.name} (${stage})${progress}`);
259
+ }
260
+ }
261
+ return lines.join('\n');
262
+ }
263
+ //# sourceMappingURL=flow-map.pure.js.map