@compilr-dev/cli 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/README.md +236 -68
  2. package/dist/.tsbuildinfo.app +1 -0
  3. package/dist/.tsbuildinfo.data +1 -0
  4. package/dist/.tsbuildinfo.domain +1 -0
  5. package/dist/.tsbuildinfo.foundation +1 -0
  6. package/dist/agent.d.ts +61 -4
  7. package/dist/agent.js +241 -245
  8. package/dist/anchors/index.d.ts +1 -1
  9. package/dist/anchors/index.js +1 -1
  10. package/dist/anchors/project-anchors.d.ts +2 -2
  11. package/dist/anchors/project-anchors.js +1 -1
  12. package/dist/auth/api-client.d.ts +124 -0
  13. package/dist/auth/api-client.js +261 -0
  14. package/dist/auth/index.d.ts +172 -0
  15. package/dist/auth/index.js +545 -0
  16. package/dist/auth/storage.d.ts +52 -0
  17. package/dist/auth/storage.js +118 -0
  18. package/dist/changelog/index.d.ts +16 -0
  19. package/dist/changelog/index.js +24 -0
  20. package/dist/changelog/releases.d.ts +17 -0
  21. package/dist/changelog/releases.js +63 -0
  22. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  23. package/dist/commands-v2/handlers/auth.js +118 -0
  24. package/dist/commands-v2/handlers/background.d.ts +14 -0
  25. package/dist/commands-v2/handlers/background.js +276 -0
  26. package/dist/commands-v2/handlers/context.js +266 -81
  27. package/dist/commands-v2/handlers/core.d.ts +1 -0
  28. package/dist/commands-v2/handlers/core.js +133 -8
  29. package/dist/commands-v2/handlers/debug.js +18 -0
  30. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  31. package/dist/commands-v2/handlers/delegations.js +29 -0
  32. package/dist/commands-v2/handlers/files.d.ts +8 -0
  33. package/dist/commands-v2/handlers/files.js +162 -0
  34. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  35. package/dist/commands-v2/handlers/filter.js +130 -0
  36. package/dist/commands-v2/handlers/games.d.ts +7 -0
  37. package/dist/commands-v2/handlers/games.js +57 -0
  38. package/dist/commands-v2/handlers/index.d.ts +13 -0
  39. package/dist/commands-v2/handlers/index.js +39 -0
  40. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  41. package/dist/commands-v2/handlers/mcp.js +39 -0
  42. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  43. package/dist/commands-v2/handlers/notifications.js +34 -0
  44. package/dist/commands-v2/handlers/project.js +244 -23
  45. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  46. package/dist/commands-v2/handlers/reset.js +118 -0
  47. package/dist/commands-v2/handlers/session.d.ts +161 -0
  48. package/dist/commands-v2/handlers/session.js +805 -0
  49. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  50. package/dist/commands-v2/handlers/settings.js +217 -35
  51. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  52. package/dist/commands-v2/handlers/tasks.js +36 -0
  53. package/dist/commands-v2/handlers/team.d.ts +9 -0
  54. package/dist/commands-v2/handlers/team.js +549 -0
  55. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  56. package/dist/commands-v2/handlers/terminals.js +34 -0
  57. package/dist/commands-v2/index.d.ts +3 -2
  58. package/dist/commands-v2/index.js +4 -1
  59. package/dist/commands-v2/registry.d.ts +15 -0
  60. package/dist/commands-v2/registry.js +34 -0
  61. package/dist/commands-v2/types.d.ts +81 -3
  62. package/dist/commands.js +13 -0
  63. package/dist/compilr-diff-companion.vsix +0 -0
  64. package/dist/db/index.js +98 -4
  65. package/dist/db/repositories/document-repository.d.ts +2 -0
  66. package/dist/db/repositories/document-repository.js +5 -1
  67. package/dist/db/repositories/index.d.ts +2 -0
  68. package/dist/db/repositories/index.js +1 -0
  69. package/dist/db/repositories/plan-repository.d.ts +101 -0
  70. package/dist/db/repositories/plan-repository.js +275 -0
  71. package/dist/db/repositories/project-repository.d.ts +6 -0
  72. package/dist/db/repositories/project-repository.js +41 -0
  73. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  74. package/dist/db/repositories/work-item-repository.js +69 -4
  75. package/dist/db/schema.d.ts +40 -3
  76. package/dist/db/schema.js +66 -3
  77. package/dist/episodes/index.d.ts +20 -0
  78. package/dist/episodes/index.js +27 -0
  79. package/dist/episodes/recorder.d.ts +51 -0
  80. package/dist/episodes/recorder.js +195 -0
  81. package/dist/episodes/significant-work.d.ts +21 -0
  82. package/dist/episodes/significant-work.js +56 -0
  83. package/dist/episodes/store.d.ts +38 -0
  84. package/dist/episodes/store.js +199 -0
  85. package/dist/episodes/types.d.ts +35 -0
  86. package/dist/episodes/types.js +6 -0
  87. package/dist/episodes/work-at-risk.d.ts +12 -0
  88. package/dist/episodes/work-at-risk.js +38 -0
  89. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  90. package/dist/episodes/work-summary-anchor.js +73 -0
  91. package/dist/games/coins.d.ts +66 -0
  92. package/dist/games/coins.js +165 -0
  93. package/dist/games/game-base.d.ts +84 -0
  94. package/dist/games/game-base.js +204 -0
  95. package/dist/games/index.d.ts +16 -0
  96. package/dist/games/index.js +49 -0
  97. package/dist/games/scores.d.ts +69 -0
  98. package/dist/games/scores.js +191 -0
  99. package/dist/games/tetris/board.d.ts +59 -0
  100. package/dist/games/tetris/board.js +170 -0
  101. package/dist/games/tetris/index.d.ts +109 -0
  102. package/dist/games/tetris/index.js +610 -0
  103. package/dist/games/tetris/pieces.d.ts +44 -0
  104. package/dist/games/tetris/pieces.js +271 -0
  105. package/dist/games/tetris/renderer.d.ts +26 -0
  106. package/dist/games/tetris/renderer.js +77 -0
  107. package/dist/guide/guide-content.d.ts +23 -0
  108. package/dist/guide/guide-content.js +196 -0
  109. package/dist/guide/index.d.ts +8 -0
  110. package/dist/guide/index.js +7 -0
  111. package/dist/guide/shared-content.d.ts +37 -0
  112. package/dist/guide/shared-content.js +1272 -0
  113. package/dist/guide/tutorial-helpers.d.ts +57 -0
  114. package/dist/guide/tutorial-helpers.js +147 -0
  115. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  116. package/dist/handlers/ask-user-handlers.js +104 -0
  117. package/dist/handlers/delegation-handlers.d.ts +34 -0
  118. package/dist/handlers/delegation-handlers.js +291 -0
  119. package/dist/handlers/permission-handler.d.ts +30 -0
  120. package/dist/handlers/permission-handler.js +205 -0
  121. package/dist/index.d.ts +11 -1
  122. package/dist/index.js +448 -271
  123. package/dist/input-handlers/memory-handler.d.ts +1 -1
  124. package/dist/input-handlers/memory-handler.js +2 -1
  125. package/dist/models/index.d.ts +10 -0
  126. package/dist/models/index.js +12 -0
  127. package/dist/models/model-registry.d.ts +38 -0
  128. package/dist/models/model-registry.js +69 -0
  129. package/dist/models/model-tiers.d.ts +28 -0
  130. package/dist/models/model-tiers.js +71 -0
  131. package/dist/models/model-validation.d.ts +25 -0
  132. package/dist/models/model-validation.js +291 -0
  133. package/dist/models/ollama-models.d.ts +73 -0
  134. package/dist/models/ollama-models.js +178 -0
  135. package/dist/models/provider-types.d.ts +6 -0
  136. package/dist/models/provider-types.js +1 -0
  137. package/dist/models/providers.d.ts +35 -0
  138. package/dist/models/providers.js +58 -0
  139. package/dist/models/types.d.ts +4 -0
  140. package/dist/models/types.js +4 -0
  141. package/dist/multi-agent/activity.d.ts +21 -0
  142. package/dist/multi-agent/activity.js +34 -0
  143. package/dist/multi-agent/agent-selection.d.ts +55 -0
  144. package/dist/multi-agent/agent-selection.js +90 -0
  145. package/dist/multi-agent/artifacts.d.ts +197 -0
  146. package/dist/multi-agent/artifacts.js +379 -0
  147. package/dist/multi-agent/checkpointer.d.ts +138 -0
  148. package/dist/multi-agent/checkpointer.js +471 -0
  149. package/dist/multi-agent/collision-utils.d.ts +16 -0
  150. package/dist/multi-agent/collision-utils.js +28 -0
  151. package/dist/multi-agent/context-resolver.d.ts +97 -0
  152. package/dist/multi-agent/context-resolver.js +316 -0
  153. package/dist/multi-agent/custom-agents.d.ts +83 -0
  154. package/dist/multi-agent/custom-agents.js +227 -0
  155. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  156. package/dist/multi-agent/delegation-tracker.js +243 -0
  157. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  158. package/dist/multi-agent/file-lock-hook.js +97 -0
  159. package/dist/multi-agent/file-locks.d.ts +58 -0
  160. package/dist/multi-agent/file-locks.js +194 -0
  161. package/dist/multi-agent/index.d.ts +24 -0
  162. package/dist/multi-agent/index.js +30 -0
  163. package/dist/multi-agent/mention-parser.d.ts +64 -0
  164. package/dist/multi-agent/mention-parser.js +146 -0
  165. package/dist/multi-agent/notification-manager.d.ts +84 -0
  166. package/dist/multi-agent/notification-manager.js +224 -0
  167. package/dist/multi-agent/pending-requests.d.ts +122 -0
  168. package/dist/multi-agent/pending-requests.js +155 -0
  169. package/dist/multi-agent/session-registry.d.ts +139 -0
  170. package/dist/multi-agent/session-registry.js +514 -0
  171. package/dist/multi-agent/shared-context.d.ts +293 -0
  172. package/dist/multi-agent/shared-context.js +671 -0
  173. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  174. package/dist/multi-agent/skill-requirements.js +178 -0
  175. package/dist/multi-agent/task-assignment.d.ts +69 -0
  176. package/dist/multi-agent/task-assignment.js +123 -0
  177. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  178. package/dist/multi-agent/task-suggestion.js +72 -0
  179. package/dist/multi-agent/team-agent.d.ts +201 -0
  180. package/dist/multi-agent/team-agent.js +488 -0
  181. package/dist/multi-agent/team.d.ts +286 -0
  182. package/dist/multi-agent/team.js +610 -0
  183. package/dist/multi-agent/tool-config.d.ts +110 -0
  184. package/dist/multi-agent/tool-config.js +661 -0
  185. package/dist/multi-agent/types.d.ts +211 -0
  186. package/dist/multi-agent/types.js +617 -0
  187. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  188. package/dist/prompts/plan-mode-prompt.js +95 -0
  189. package/dist/repl-helpers.js +3 -2
  190. package/dist/repl-v2.d.ts +401 -2
  191. package/dist/repl-v2.js +2577 -65
  192. package/dist/session/index.d.ts +6 -0
  193. package/dist/session/index.js +6 -0
  194. package/dist/session/project-session-manager.d.ts +158 -0
  195. package/dist/session/project-session-manager.js +650 -0
  196. package/dist/settings/index.d.ts +133 -13
  197. package/dist/settings/index.js +329 -24
  198. package/dist/settings/mcp-config.d.ts +76 -0
  199. package/dist/settings/mcp-config.js +143 -0
  200. package/dist/settings/paths.d.ts +4 -0
  201. package/dist/settings/paths.js +6 -0
  202. package/dist/shared-handlers.d.ts +62 -0
  203. package/dist/shared-handlers.js +48 -0
  204. package/dist/system-prompt/builder.d.ts +5 -0
  205. package/dist/system-prompt/builder.js +4 -0
  206. package/dist/system-prompt/index.d.ts +18 -0
  207. package/dist/system-prompt/index.js +18 -0
  208. package/dist/system-prompt/modules.d.ts +5 -0
  209. package/dist/system-prompt/modules.js +4 -0
  210. package/dist/tabbed-menu.js +2 -1
  211. package/dist/templates/compilr-md-import.d.ts +16 -0
  212. package/dist/templates/compilr-md-import.js +241 -0
  213. package/dist/templates/compilr-md.js +10 -61
  214. package/dist/templates/config-json.d.ts +1 -25
  215. package/dist/templates/index.d.ts +2 -0
  216. package/dist/templates/index.js +34 -73
  217. package/dist/tool-names.d.ts +108 -0
  218. package/dist/tool-names.js +227 -0
  219. package/dist/tools/anchor-tools.d.ts +4 -4
  220. package/dist/tools/anchor-tools.js +1 -1
  221. package/dist/tools/artifact-tools.d.ts +42 -0
  222. package/dist/tools/artifact-tools.js +328 -0
  223. package/dist/tools/ask-user-simple.d.ts +1 -1
  224. package/dist/tools/ask-user-simple.js +2 -1
  225. package/dist/tools/ask-user.d.ts +1 -1
  226. package/dist/tools/ask-user.js +2 -1
  227. package/dist/tools/backlog-wrappers.d.ts +5 -3
  228. package/dist/tools/backlog-wrappers.js +16 -1
  229. package/dist/tools/backlog.d.ts +2 -2
  230. package/dist/tools/backlog.js +1 -1
  231. package/dist/tools/db-tools.d.ts +8 -61
  232. package/dist/tools/db-tools.js +8 -13
  233. package/dist/tools/delegate-background.d.ts +27 -0
  234. package/dist/tools/delegate-background.js +115 -0
  235. package/dist/tools/delegate.d.ts +22 -0
  236. package/dist/tools/delegate.js +97 -0
  237. package/dist/tools/delegation-status.d.ts +16 -0
  238. package/dist/tools/delegation-status.js +128 -0
  239. package/dist/tools/document-db.d.ts +5 -5
  240. package/dist/tools/document-db.js +1 -1
  241. package/dist/tools/guide-tool.d.ts +12 -0
  242. package/dist/tools/guide-tool.js +59 -0
  243. package/dist/tools/handoff.d.ts +25 -0
  244. package/dist/tools/handoff.js +99 -0
  245. package/dist/tools/meta-tools.d.ts +26 -0
  246. package/dist/tools/meta-tools.js +47 -0
  247. package/dist/tools/plan-tools.d.ts +54 -0
  248. package/dist/tools/plan-tools.js +338 -0
  249. package/dist/tools/platform-adapter.d.ts +29 -0
  250. package/dist/tools/platform-adapter.js +394 -0
  251. package/dist/tools/project-db.d.ts +5 -73
  252. package/dist/tools/project-db.js +5 -336
  253. package/dist/tools/recall-work-tool.d.ts +18 -0
  254. package/dist/tools/recall-work-tool.js +82 -0
  255. package/dist/tools/workitem-db.d.ts +43 -11
  256. package/dist/tools/workitem-db.js +186 -5
  257. package/dist/tools.d.ts +67 -2
  258. package/dist/tools.js +237 -47
  259. package/dist/ui/autocomplete-controller.d.ts +42 -0
  260. package/dist/ui/autocomplete-controller.js +384 -0
  261. package/dist/ui/base/index.d.ts +1 -1
  262. package/dist/ui/base/index.js +1 -1
  263. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  264. package/dist/ui/base/overlay-base-v2.js +14 -0
  265. package/dist/ui/base/render-utils.d.ts +19 -0
  266. package/dist/ui/base/render-utils.js +25 -0
  267. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  268. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  269. package/dist/ui/constants/labels.d.ts +14 -0
  270. package/dist/ui/constants/labels.js +51 -0
  271. package/dist/ui/conversation-store.d.ts +55 -0
  272. package/dist/ui/conversation-store.js +107 -0
  273. package/dist/ui/conversation.js +11 -13
  274. package/dist/ui/diff.d.ts +7 -1
  275. package/dist/ui/diff.js +85 -48
  276. package/dist/ui/ephemeral.js +3 -9
  277. package/dist/ui/file-autocomplete.d.ts +24 -0
  278. package/dist/ui/file-autocomplete.js +56 -0
  279. package/dist/ui/footer-renderer.d.ts +69 -0
  280. package/dist/ui/footer-renderer.js +431 -0
  281. package/dist/ui/footer.d.ts +74 -7
  282. package/dist/ui/footer.js +173 -16
  283. package/dist/ui/input-controller.d.ts +51 -0
  284. package/dist/ui/input-controller.js +176 -0
  285. package/dist/ui/input-prompt.d.ts +19 -0
  286. package/dist/ui/input-prompt.js +206 -14
  287. package/dist/ui/keyboard-handler.d.ts +57 -0
  288. package/dist/ui/keyboard-handler.js +557 -0
  289. package/dist/ui/live-region-facade.d.ts +42 -0
  290. package/dist/ui/live-region-facade.js +205 -0
  291. package/dist/ui/live-region.d.ts +0 -4
  292. package/dist/ui/live-region.js +6 -14
  293. package/dist/ui/mascot/renderer.d.ts +1 -1
  294. package/dist/ui/mascot/renderer.js +37 -2
  295. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  296. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  297. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  298. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  299. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  300. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  301. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  302. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  303. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  304. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  305. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  306. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  307. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  308. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  309. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  310. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  311. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  312. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  313. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  314. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  315. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  316. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  317. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  318. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  319. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  320. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  321. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  322. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  323. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  324. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  325. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  326. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  327. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  328. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  329. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  330. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  331. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  332. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  333. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  334. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  335. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  336. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  337. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  338. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  339. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  340. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  341. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  342. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  343. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  344. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  345. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  346. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  347. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  348. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  349. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  350. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  351. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  352. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  353. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  354. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  355. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  356. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  357. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  358. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  359. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  360. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  361. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  362. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  363. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  364. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  365. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  366. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  367. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  368. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  369. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  370. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  371. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  372. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  373. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  374. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  375. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  376. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  377. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  378. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  379. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  380. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  381. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  382. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  383. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  384. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  385. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  386. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  387. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  388. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  389. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  390. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  391. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  392. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  393. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  394. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  395. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  396. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  397. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  398. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  399. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  400. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  401. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  402. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  403. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  404. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  405. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  406. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  407. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  408. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  409. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  410. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  411. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  412. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  413. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  414. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  415. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  416. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  417. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  418. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  419. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  420. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  421. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  422. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  423. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  424. package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -1
  425. package/dist/ui/overlay/index.d.ts +20 -1
  426. package/dist/ui/overlay/index.js +19 -0
  427. package/dist/ui/overlay/types.d.ts +5 -0
  428. package/dist/ui/overlay-manager.d.ts +43 -0
  429. package/dist/ui/overlay-manager.js +238 -0
  430. package/dist/ui/overlays.js +4 -16
  431. package/dist/ui/permission-overlay.js +6 -5
  432. package/dist/ui/status-bar-controller.d.ts +33 -0
  433. package/dist/ui/status-bar-controller.js +99 -0
  434. package/dist/ui/subagent-renderer.js +3 -19
  435. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  436. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  437. package/dist/ui/terminal-line-builders.d.ts +17 -0
  438. package/dist/ui/terminal-line-builders.js +42 -0
  439. package/dist/ui/terminal-render-item.d.ts +16 -0
  440. package/dist/ui/terminal-render-item.js +267 -0
  441. package/dist/ui/terminal-renderer.d.ts +7 -8
  442. package/dist/ui/terminal-renderer.js +7 -8
  443. package/dist/ui/terminal-types.d.ts +179 -0
  444. package/dist/ui/terminal-types.js +34 -0
  445. package/dist/ui/terminal-ui.d.ts +144 -276
  446. package/dist/ui/terminal-ui.js +384 -1861
  447. package/dist/ui/todo-zone.d.ts +19 -1
  448. package/dist/ui/todo-zone.js +71 -13
  449. package/dist/ui/tool-formatters.js +512 -1
  450. package/dist/ui/turn-metrics.d.ts +56 -0
  451. package/dist/ui/turn-metrics.js +75 -0
  452. package/dist/ui/types.d.ts +28 -0
  453. package/dist/ui/types.js +1 -0
  454. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  455. package/dist/ui/vscode-diff-ipc.js +385 -0
  456. package/dist/utils/credentials.d.ts +24 -5
  457. package/dist/utils/credentials.js +123 -9
  458. package/dist/utils/format-tokens.d.ts +13 -0
  459. package/dist/utils/format-tokens.js +18 -0
  460. package/dist/utils/git-config.d.ts +26 -0
  461. package/dist/utils/git-config.js +54 -0
  462. package/dist/utils/message-utils.d.ts +61 -0
  463. package/dist/utils/message-utils.js +72 -0
  464. package/dist/utils/model-tiers.d.ts +8 -1
  465. package/dist/utils/model-tiers.js +38 -16
  466. package/dist/utils/open-browser.d.ts +5 -0
  467. package/dist/utils/open-browser.js +32 -0
  468. package/dist/utils/path-safety.js +3 -2
  469. package/dist/utils/project-detection.d.ts +58 -0
  470. package/dist/utils/project-detection.js +424 -0
  471. package/dist/utils/project-memory.js +2 -1
  472. package/dist/utils/project-status.d.ts +2 -2
  473. package/dist/utils/startup-perf.d.ts +18 -0
  474. package/dist/utils/startup-perf.js +60 -0
  475. package/dist/utils/token-tracker.d.ts +62 -0
  476. package/dist/utils/token-tracker.js +150 -0
  477. package/dist/utils/token-types.d.ts +23 -0
  478. package/dist/utils/token-types.js +18 -0
  479. package/dist/utils/types/config-types.d.ts +32 -0
  480. package/dist/utils/types/config-types.js +8 -0
  481. package/dist/utils/update-checker.d.ts +28 -0
  482. package/dist/utils/update-checker.js +106 -0
  483. package/dist/utils/version.d.ts +7 -0
  484. package/dist/utils/version.js +10 -0
  485. package/dist/utils/vscode-detect.d.ts +39 -0
  486. package/dist/utils/vscode-detect.js +137 -0
  487. package/package.json +25 -12
  488. package/dist/commands/handler-types.d.ts +0 -68
  489. package/dist/commands/handler-types.js +0 -8
  490. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  491. package/dist/commands/handlers/agent-commands.js +0 -305
  492. package/dist/commands/handlers/design-commands.d.ts +0 -15
  493. package/dist/commands/handlers/design-commands.js +0 -334
  494. package/dist/commands/handlers/index.d.ts +0 -20
  495. package/dist/commands/handlers/index.js +0 -43
  496. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  497. package/dist/commands/handlers/overlay-commands.js +0 -287
  498. package/dist/commands/handlers/project-commands.d.ts +0 -11
  499. package/dist/commands/handlers/project-commands.js +0 -167
  500. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  501. package/dist/commands/handlers/simple-commands.js +0 -144
  502. package/dist/commands/registry.d.ts +0 -50
  503. package/dist/commands/registry.js +0 -75
  504. package/dist/index.old.d.ts +0 -7
  505. package/dist/index.old.js +0 -1014
  506. package/dist/repl.d.ts +0 -149
  507. package/dist/repl.js +0 -1151
  508. package/dist/templates/claude-md.d.ts +0 -7
  509. package/dist/templates/claude-md.js +0 -189
  510. package/dist/test-autocomplete.d.ts +0 -7
  511. package/dist/test-autocomplete.js +0 -85
  512. package/dist/test-tabbed-menu.d.ts +0 -7
  513. package/dist/test-tabbed-menu.js +0 -25
  514. package/dist/tool-selector.d.ts +0 -71
  515. package/dist/tool-selector.js +0 -184
  516. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  517. package/dist/ui/agents-overlay-v2.js +0 -809
  518. package/dist/ui/agents-overlay.d.ts +0 -12
  519. package/dist/ui/agents-overlay.js +0 -863
  520. package/dist/ui/anchors-overlay.d.ts +0 -12
  521. package/dist/ui/anchors-overlay.js +0 -775
  522. package/dist/ui/arch-type-overlay.d.ts +0 -15
  523. package/dist/ui/arch-type-overlay.js +0 -201
  524. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  525. package/dist/ui/ask-user-overlay-v2.js +0 -555
  526. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  527. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  528. package/dist/ui/backlog-overlay.d.ts +0 -32
  529. package/dist/ui/backlog-overlay.js +0 -652
  530. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  531. package/dist/ui/commands-overlay-v2.js +0 -441
  532. package/dist/ui/commands-overlay.d.ts +0 -16
  533. package/dist/ui/commands-overlay.js +0 -439
  534. package/dist/ui/config-overlay.d.ts +0 -35
  535. package/dist/ui/config-overlay.js +0 -707
  536. package/dist/ui/docs-overlay.d.ts +0 -17
  537. package/dist/ui/docs-overlay.js +0 -303
  538. package/dist/ui/footer-v2.d.ts +0 -222
  539. package/dist/ui/footer-v2.js +0 -1349
  540. package/dist/ui/help-overlay-v2.d.ts +0 -34
  541. package/dist/ui/help-overlay-v2.js +0 -309
  542. package/dist/ui/help-overlay.d.ts +0 -16
  543. package/dist/ui/help-overlay.js +0 -316
  544. package/dist/ui/init-overlay-v2.d.ts +0 -34
  545. package/dist/ui/init-overlay-v2.js +0 -600
  546. package/dist/ui/init-overlay.d.ts +0 -34
  547. package/dist/ui/init-overlay.js +0 -604
  548. package/dist/ui/input-prompt-v2.d.ts +0 -180
  549. package/dist/ui/input-prompt-v2.js +0 -999
  550. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  551. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  552. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  553. package/dist/ui/keys-overlay-v2.js +0 -248
  554. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  555. package/dist/ui/mascot-overlay-v2.js +0 -138
  556. package/dist/ui/mascot-overlay.d.ts +0 -21
  557. package/dist/ui/mascot-overlay.js +0 -146
  558. package/dist/ui/model-overlay-v2.d.ts +0 -49
  559. package/dist/ui/model-overlay-v2.js +0 -118
  560. package/dist/ui/model-overlay.d.ts +0 -27
  561. package/dist/ui/model-overlay.js +0 -221
  562. package/dist/ui/model-warning-overlay.d.ts +0 -30
  563. package/dist/ui/model-warning-overlay.js +0 -169
  564. package/dist/ui/new-overlay.d.ts +0 -34
  565. package/dist/ui/new-overlay.js +0 -604
  566. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  567. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  568. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  569. package/dist/ui/overlay/overlay-types.js +0 -22
  570. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  571. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  572. package/dist/ui/overlays/index.d.ts +0 -11
  573. package/dist/ui/overlays/index.js +0 -11
  574. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  575. package/dist/ui/permission-overlay-v2.js +0 -380
  576. package/dist/ui/projects-overlay.d.ts +0 -19
  577. package/dist/ui/projects-overlay.js +0 -484
  578. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  579. package/dist/ui/theme-overlay-v2.js +0 -135
  580. package/dist/ui/theme-overlay.d.ts +0 -24
  581. package/dist/ui/theme-overlay.js +0 -127
  582. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  583. package/dist/ui/tools-overlay-v2.js +0 -218
  584. package/dist/ui/tools-overlay.d.ts +0 -34
  585. package/dist/ui/tools-overlay.js +0 -230
  586. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  587. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  588. package/dist/ui/tutorial-overlay.d.ts +0 -11
  589. package/dist/ui/tutorial-overlay.js +0 -1034
  590. package/dist/ui/workflow-overlay.d.ts +0 -22
  591. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Conversation history and filtering.
3
+ *
4
+ * Extracted from TerminalUI — owns conversation data, restored history,
5
+ * and agent-based filtering. Rendering orchestration stays on TerminalUI.
6
+ */
7
+ import type { PrintableItem } from './terminal-types.js';
8
+ export declare class ConversationStore {
9
+ /** All printed items (stored for re-rendering on config change). */
10
+ history: PrintableItem[];
11
+ /** Session history for Ctrl+R replay. */
12
+ restoredHistory: PrintableItem[];
13
+ /** Agent-based conversation filter. */
14
+ private filter;
15
+ /** Add an item to conversation history. */
16
+ addItem(item: PrintableItem): void;
17
+ /** Get a copy of conversation history. */
18
+ getHistory(): PrintableItem[];
19
+ /** Clear all conversation history. */
20
+ clearHistory(): void;
21
+ /** Store restored conversation items for Ctrl+R history view. */
22
+ setRestoredHistory(items: PrintableItem[]): void;
23
+ /** Check if there is restored history available. */
24
+ hasRestoredHistory(): boolean;
25
+ /**
26
+ * Set conversation filter to show only specific agents.
27
+ * Pass empty array to show all agents.
28
+ */
29
+ setFilter(agentIds: string[]): void;
30
+ /** Clear conversation filter (show all agents). */
31
+ clearFilter(): void;
32
+ /** Get current conversation filter state. */
33
+ getFilter(): {
34
+ agentIds: string[];
35
+ isActive: boolean;
36
+ };
37
+ /** Whether the filter is currently active. */
38
+ get isFilterActive(): boolean;
39
+ /** Get the set of filtered agent IDs (for display). */
40
+ get filterAgentIds(): ReadonlySet<string>;
41
+ /**
42
+ * Add an agent to the conversation filter (auto-expand).
43
+ * Returns true if agent was added, false if filter not active or agent already included.
44
+ */
45
+ addToFilter(agentId: string): boolean;
46
+ /**
47
+ * Check if an agent is in the current filter (or filter is inactive).
48
+ * Returns true if messages from this agent would be shown.
49
+ */
50
+ isAgentInFilter(agentId: string): boolean;
51
+ /**
52
+ * Check if an item should be shown based on current filter.
53
+ */
54
+ shouldShowItem(item: PrintableItem): boolean;
55
+ }
@@ -0,0 +1,107 @@
1
+ /**
2
+ * Conversation history and filtering.
3
+ *
4
+ * Extracted from TerminalUI — owns conversation data, restored history,
5
+ * and agent-based filtering. Rendering orchestration stays on TerminalUI.
6
+ */
7
+ export class ConversationStore {
8
+ /** All printed items (stored for re-rendering on config change). */
9
+ history = [];
10
+ /** Session history for Ctrl+R replay. */
11
+ restoredHistory = [];
12
+ /** Agent-based conversation filter. */
13
+ filter = {
14
+ agentIds: new Set(),
15
+ isActive: false,
16
+ };
17
+ // ===========================================================================
18
+ // History
19
+ // ===========================================================================
20
+ /** Add an item to conversation history. */
21
+ addItem(item) {
22
+ this.history.push(item);
23
+ }
24
+ /** Get a copy of conversation history. */
25
+ getHistory() {
26
+ return [...this.history];
27
+ }
28
+ /** Clear all conversation history. */
29
+ clearHistory() {
30
+ this.history = [];
31
+ }
32
+ // ===========================================================================
33
+ // Restored History (Ctrl+R)
34
+ // ===========================================================================
35
+ /** Store restored conversation items for Ctrl+R history view. */
36
+ setRestoredHistory(items) {
37
+ this.restoredHistory = items;
38
+ }
39
+ /** Check if there is restored history available. */
40
+ hasRestoredHistory() {
41
+ return this.restoredHistory.length > 0;
42
+ }
43
+ // ===========================================================================
44
+ // Conversation Filter
45
+ // ===========================================================================
46
+ /**
47
+ * Set conversation filter to show only specific agents.
48
+ * Pass empty array to show all agents.
49
+ */
50
+ setFilter(agentIds) {
51
+ this.filter = {
52
+ agentIds: new Set(agentIds),
53
+ isActive: agentIds.length > 0,
54
+ };
55
+ }
56
+ /** Clear conversation filter (show all agents). */
57
+ clearFilter() {
58
+ this.filter = { agentIds: new Set(), isActive: false };
59
+ }
60
+ /** Get current conversation filter state. */
61
+ getFilter() {
62
+ return {
63
+ agentIds: [...this.filter.agentIds],
64
+ isActive: this.filter.isActive,
65
+ };
66
+ }
67
+ /** Whether the filter is currently active. */
68
+ get isFilterActive() {
69
+ return this.filter.isActive;
70
+ }
71
+ /** Get the set of filtered agent IDs (for display). */
72
+ get filterAgentIds() {
73
+ return this.filter.agentIds;
74
+ }
75
+ /**
76
+ * Add an agent to the conversation filter (auto-expand).
77
+ * Returns true if agent was added, false if filter not active or agent already included.
78
+ */
79
+ addToFilter(agentId) {
80
+ if (!this.filter.isActive)
81
+ return false;
82
+ if (this.filter.agentIds.has(agentId))
83
+ return false;
84
+ this.filter.agentIds.add(agentId);
85
+ return true;
86
+ }
87
+ /**
88
+ * Check if an agent is in the current filter (or filter is inactive).
89
+ * Returns true if messages from this agent would be shown.
90
+ */
91
+ isAgentInFilter(agentId) {
92
+ if (!this.filter.isActive)
93
+ return true;
94
+ return this.filter.agentIds.has(agentId);
95
+ }
96
+ /**
97
+ * Check if an item should be shown based on current filter.
98
+ */
99
+ shouldShowItem(item) {
100
+ if (!this.filter.isActive)
101
+ return true;
102
+ const agentId = 'agentId' in item ? item.agentId : undefined;
103
+ if (!agentId)
104
+ return true;
105
+ return this.filter.agentIds.has(agentId);
106
+ }
107
+ }
@@ -15,6 +15,7 @@ import * as terminal from './terminal.js';
15
15
  import { isVerboseEnabled, getMascotSetting } from '../settings/index.js';
16
16
  import { detectProjectStatus, getWorkflowStage } from '../utils/project-status.js';
17
17
  import { renderMascotWithLogo } from './mascot/index.js';
18
+ import { formatTokens, truncate } from './base/index.js';
18
19
  // =============================================================================
19
20
  // Renderer Integration
20
21
  // =============================================================================
@@ -126,6 +127,7 @@ function postProcessFormatting(text) {
126
127
  const chalk = new Chalk({ level: 3 });
127
128
  const colors = getThemeColors();
128
129
  const primary = chalk.hex(colors.primary);
130
+ const secondary = chalk.hex(colors.secondary || colors.primary);
129
131
  let result = text;
130
132
  // Handle **`code`** (bold code) - common pattern in tool docs
131
133
  result = result.replace(/\*\*`([^`]+)`\*\*/g, (_match, code) => chalk.bold(primary(code)));
@@ -133,6 +135,9 @@ function postProcessFormatting(text) {
133
135
  result = result.replace(/`([^`]+)`/g, (_match, code) => primary(code));
134
136
  // Handle remaining **bold**
135
137
  result = result.replace(/\*\*([^*]+)\*\*/g, (_match, content) => chalk.bold(content));
138
+ // Handle $agent references - bold + secondary color
139
+ // Match $word at word boundaries (not inside other text)
140
+ result = result.replace(/(?<![$\w])\$([a-zA-Z_][a-zA-Z0-9_]*)\b/g, (_match, agentId) => chalk.bold(secondary(`$${agentId}`)));
136
141
  return result;
137
142
  }
138
143
  // =============================================================================
@@ -196,6 +201,8 @@ export function renderInlineMarkdown(text) {
196
201
  result = result.replace(/(?<![*\s])\*(\S+)\*(?!\*)/g, (_match, word) => chalkWithColors.italic(word));
197
202
  // Handle `code` - use theme primary color
198
203
  result = result.replace(/`([^`]+)`/g, (_match, code) => s.primary(code));
204
+ // Handle $agent references - bold + secondary color
205
+ result = result.replace(/(?<![$\w])\$([a-zA-Z_][a-zA-Z0-9_]*)\b/g, (_match, agentId) => chalkWithColors.bold(s.secondary(`$${agentId}`)));
199
206
  return result;
200
207
  }
201
208
  // =============================================================================
@@ -244,8 +251,8 @@ export function formatToolResult(result) {
244
251
  if (nonEmptyLines > 3) {
245
252
  return s.muted(`${String(nonEmptyLines)} lines`);
246
253
  }
247
- const truncated = result.slice(0, 80).replace(/\n/g, ' ');
248
- return s.muted(truncated + (result.length > 80 ? '...' : ''));
254
+ const singleLine = result.replace(/\n/g, ' ');
255
+ return s.muted(truncate(singleLine, 80));
249
256
  }
250
257
  }
251
258
  // Array result - show count and type hint
@@ -452,7 +459,7 @@ export function formatToolExecution(name, args, result) {
452
459
  const lines = [];
453
460
  let displayArgs = args;
454
461
  if (args && !verbose && args.length > 60) {
455
- displayArgs = args.slice(0, 57) + '...';
462
+ displayArgs = truncate(args, 60);
456
463
  }
457
464
  const toolHeader = displayArgs
458
465
  ? s.warning(`● ${name}`) + s.secondary(`(${displayArgs})`)
@@ -560,15 +567,6 @@ function formatDuration(ms) {
560
567
  const remainingSeconds = Math.floor(seconds % 60);
561
568
  return `${String(minutes)}m ${String(remainingSeconds)}s`;
562
569
  }
563
- /**
564
- * Format token count (e.g., "18.1k", "500")
565
- */
566
- function formatTokens(tokens) {
567
- if (tokens >= 1000) {
568
- return `${(tokens / 1000).toFixed(1)}k`;
569
- }
570
- return tokens.toString();
571
- }
572
570
  /**
573
571
  * Print sub-agent completion summary
574
572
  * Format matches the footer's subagent zone when done:
@@ -716,6 +714,6 @@ function printWorkflowGuidance(status, stage) {
716
714
  */
717
715
  export function formatPendingMessage(content) {
718
716
  const s = getStyles();
719
- const truncated = content.length > 60 ? content.slice(0, 57) + '...' : content;
717
+ const truncated = truncate(content, 60);
720
718
  return s.muted('⏳ ') + s.muted(truncated);
721
719
  }
package/dist/ui/diff.d.ts CHANGED
@@ -28,10 +28,16 @@ export declare function generateEditDiff(filePath: string, oldText: string, newT
28
28
  * Format a diff header showing what changed
29
29
  */
30
30
  export declare function formatDiffHeader(filePath: string, additions: number, removals: number): string;
31
+ /**
32
+ * Compute the full modified file content after applying an edit.
33
+ * For edit: reads file, applies text replacement, returns full modified content.
34
+ * Returns null if the file can't be read or the old text isn't found.
35
+ */
36
+ export declare function computeModifiedContent(filePath: string, oldText: string, newText: string, replaceAll?: boolean): string | null;
31
37
  /**
32
38
  * Generate a simple diff for write_file operations (new content only)
33
39
  */
34
- export declare function generateWriteDiff(filePath: string, content: string, _isNew: boolean): DiffResult;
40
+ export declare function generateWriteDiff(_filePath: string, content: string, _isNew: boolean): DiffResult;
35
41
  /**
36
42
  * Format header for write_file operations
37
43
  */
package/dist/ui/diff.js CHANGED
@@ -36,65 +36,77 @@ export function generateEditDiff(filePath, oldText, newText, replaceAll = false)
36
36
  // File doesn't exist yet or can't be read
37
37
  return null;
38
38
  }
39
- // Split file into lines
40
- const lines = fileContent.split('\n');
41
- // Find all line numbers that contain the old text
42
- const affectedLines = [];
43
- for (let i = 0; i < lines.length; i++) {
44
- if (lines[i].includes(oldText)) {
45
- affectedLines.push(i);
46
- if (!replaceAll)
47
- break; // Only find first occurrence
48
- }
39
+ // Find all occurrences of oldText in the file (supports multi-line)
40
+ const occurrences = [];
41
+ let searchFrom = 0;
42
+ let idx = fileContent.indexOf(oldText, searchFrom);
43
+ while (idx !== -1) {
44
+ occurrences.push(idx);
45
+ if (!replaceAll)
46
+ break;
47
+ searchFrom = idx + oldText.length;
48
+ idx = fileContent.indexOf(oldText, searchFrom);
49
49
  }
50
- if (affectedLines.length === 0) {
51
- // Old text not found
50
+ if (occurrences.length === 0) {
52
51
  return null;
53
52
  }
53
+ const lines = fileContent.split('\n');
54
+ // Convert character offset to line number
55
+ const charOffsetToLine = (offset) => {
56
+ let chars = 0;
57
+ for (let i = 0; i < lines.length; i++) {
58
+ if (offset <= chars + lines[i].length)
59
+ return i;
60
+ chars += lines[i].length + 1; // +1 for \n
61
+ }
62
+ return lines.length - 1;
63
+ };
64
+ const oldLines = oldText.split('\n');
65
+ const newLines = newText.split('\n');
54
66
  // Build the diff output
55
67
  const diffLines = [];
56
68
  let additions = 0;
57
69
  let removals = 0;
58
- // Track which context lines have been shown
59
70
  const shownContextLines = new Set();
60
71
  let lastShownLine = -999;
61
- for (let idx = 0; idx < affectedLines.length; idx++) {
62
- const lineNum = affectedLines[idx];
63
- // Calculate context range for this change
64
- const contextStart = Math.max(0, lineNum - CONTEXT_LINES);
65
- const contextEnd = Math.min(lines.length - 1, lineNum + CONTEXT_LINES);
66
- // Add separator if there's a gap from the last shown line
72
+ for (let occIdx = 0; occIdx < occurrences.length; occIdx++) {
73
+ const startLine = charOffsetToLine(occurrences[occIdx]);
74
+ const endLine = startLine + oldLines.length - 1;
75
+ const contextStart = Math.max(0, startLine - CONTEXT_LINES);
76
+ const contextEnd = Math.min(lines.length - 1, endLine + CONTEXT_LINES);
77
+ // Add separator if there's a gap
67
78
  const s = getStyles();
68
79
  if (lastShownLine >= 0 && contextStart > lastShownLine + 1) {
69
80
  diffLines.push(s.muted(' ...'));
70
81
  }
71
- // Show context lines before the change
72
- for (let i = contextStart; i < lineNum; i++) {
82
+ // Context lines before
83
+ for (let i = contextStart; i < startLine; i++) {
73
84
  if (!shownContextLines.has(i)) {
74
- const lineNumStr = String(i + 1).padStart(6);
75
- diffLines.push(formatContextLine(lineNumStr, lines[i]));
85
+ diffLines.push(formatContextLine(String(i + 1).padStart(6), lines[i]));
76
86
  shownContextLines.add(i);
77
87
  lastShownLine = i;
78
88
  }
79
89
  }
80
- // Show the changed line (removal + addition)
81
- const lineNumStr = String(lineNum + 1).padStart(6);
82
- const originalLine = lines[lineNum];
83
- const modifiedLine = replaceAll
84
- ? originalLine.split(oldText).join(newText) // Replace all in line
85
- : originalLine.replace(oldText, newText); // Replace first in line
86
- diffLines.push(formatRemovedLine(lineNumStr, originalLine));
87
- diffLines.push(formatAddedLine(lineNumStr, modifiedLine));
88
- removals++;
89
- additions++;
90
- shownContextLines.add(lineNum);
91
- lastShownLine = lineNum;
92
- // Show context lines after the change (but only if not overlapping with next change)
93
- const nextChangeLineNum = idx < affectedLines.length - 1 ? affectedLines[idx + 1] : Infinity;
94
- for (let i = lineNum + 1; i <= contextEnd && i < nextChangeLineNum; i++) {
90
+ // Removed lines (old text)
91
+ for (let i = 0; i < oldLines.length; i++) {
92
+ const lineNum = startLine + i;
93
+ diffLines.push(formatRemovedLine(String(lineNum + 1).padStart(6), lines[lineNum]));
94
+ shownContextLines.add(lineNum);
95
+ lastShownLine = lineNum;
96
+ }
97
+ removals += oldLines.length;
98
+ // Added lines (new text)
99
+ for (let i = 0; i < newLines.length; i++) {
100
+ diffLines.push(formatAddedLine(String(startLine + 1).padStart(6), newLines[i]));
101
+ }
102
+ additions += newLines.length;
103
+ // Context lines after
104
+ const nextStartLine = occIdx < occurrences.length - 1
105
+ ? charOffsetToLine(occurrences[occIdx + 1])
106
+ : Infinity;
107
+ for (let i = endLine + 1; i <= contextEnd && i < nextStartLine; i++) {
95
108
  if (!shownContextLines.has(i)) {
96
- const ctxLineNumStr = String(i + 1).padStart(6);
97
- diffLines.push(formatContextLine(ctxLineNumStr, lines[i]));
109
+ diffLines.push(formatContextLine(String(i + 1).padStart(6), lines[i]));
98
110
  shownContextLines.add(i);
99
111
  lastShownLine = i;
100
112
  }
@@ -147,24 +159,49 @@ function formatAddedLine(lineNum, content) {
147
159
  return `${s.muted(lineNum)} ${chalk.bgGreen.black('+')} ${chalk.bgGreen.black(content)}`;
148
160
  }
149
161
  // =============================================================================
162
+ // Modified Content Generation (for VS Code diff view)
163
+ // =============================================================================
164
+ /**
165
+ * Compute the full modified file content after applying an edit.
166
+ * For edit: reads file, applies text replacement, returns full modified content.
167
+ * Returns null if the file can't be read or the old text isn't found.
168
+ */
169
+ export function computeModifiedContent(filePath, oldText, newText, replaceAll) {
170
+ let fileContent;
171
+ try {
172
+ fileContent = fs.readFileSync(filePath, 'utf-8');
173
+ }
174
+ catch {
175
+ return null;
176
+ }
177
+ // Check that oldText exists in the file
178
+ if (!fileContent.includes(oldText)) {
179
+ return null;
180
+ }
181
+ if (replaceAll) {
182
+ // Replace all occurrences
183
+ let result = fileContent;
184
+ while (result.includes(oldText)) {
185
+ result = result.replace(oldText, newText);
186
+ }
187
+ return result;
188
+ }
189
+ // Replace first occurrence only
190
+ return fileContent.replace(oldText, newText);
191
+ }
192
+ // =============================================================================
150
193
  // Write File Diff (for new files or complete overwrites)
151
194
  // =============================================================================
152
195
  /**
153
196
  * Generate a simple diff for write_file operations (new content only)
154
197
  */
155
- export function generateWriteDiff(filePath, content, _isNew) {
198
+ export function generateWriteDiff(_filePath, content, _isNew) {
156
199
  const lines = content.split('\n');
157
200
  const diffLines = [];
158
- // Show first few lines as preview
159
- const previewLines = Math.min(lines.length, 10);
160
- for (let i = 0; i < previewLines; i++) {
201
+ for (let i = 0; i < lines.length; i++) {
161
202
  const lineNum = String(i + 1).padStart(6);
162
203
  diffLines.push(formatAddedLine(lineNum, lines[i]));
163
204
  }
164
- if (lines.length > previewLines) {
165
- const s = getStyles();
166
- diffLines.push(s.muted(` ... ${String(lines.length - previewLines)} more lines`));
167
- }
168
205
  return {
169
206
  lines: diffLines,
170
207
  additions: lines.length,
@@ -11,6 +11,7 @@
11
11
  import chalk from 'chalk';
12
12
  import { getStyles } from '../themes/index.js';
13
13
  import * as terminal from './terminal.js';
14
+ import { formatTokens } from './base/index.js';
14
15
  import { formatPendingMessage } from './conversation.js';
15
16
  // Note: This file is deprecated but kept for reference.
16
17
  // All pc.* calls below have been converted to use getStyles() for theme support.
@@ -59,15 +60,6 @@ function formatDuration(ms) {
59
60
  const remainingSeconds = seconds % 60;
60
61
  return `${String(minutes)}m ${String(remainingSeconds)}s`;
61
62
  }
62
- /**
63
- * Format token count (e.g., "1.2k", "500")
64
- */
65
- function formatTokens(tokens) {
66
- if (tokens >= 1000) {
67
- return `${(tokens / 1000).toFixed(1)}k`;
68
- }
69
- return tokens.toString();
70
- }
71
63
  /**
72
64
  * Render todo list with visual styling
73
65
  */
@@ -129,6 +121,8 @@ export class EphemeralZone {
129
121
  this.state.spinner = {
130
122
  text: this.thinkingWord,
131
123
  tokens: 0,
124
+ inputTokens: 0,
125
+ outputTokens: 0,
132
126
  startTime: Date.now(),
133
127
  };
134
128
  // Start animation
@@ -39,6 +39,30 @@ export declare function replaceAtMention(input: string, cursorPos: number, compl
39
39
  input: string;
40
40
  cursorPos: number;
41
41
  };
42
+ /**
43
+ * Extract the $ mention being typed at the cursor position
44
+ * Returns the partial text after $ if in a $ context, null otherwise
45
+ *
46
+ * @param input - The current line text
47
+ * @param cursorPos - Current cursor position within the line
48
+ * @returns The partial agent name after $, or null if not in $ context
49
+ */
50
+ export declare function extractDollarMention(input: string, cursorPos: number): {
51
+ partial: string;
52
+ startPos: number;
53
+ } | null;
54
+ /**
55
+ * Replace the $ mention with completed agent name
56
+ *
57
+ * @param input - Full input text
58
+ * @param cursorPos - Current cursor position
59
+ * @param agentId - The completed agent ID to insert
60
+ * @returns New input text and new cursor position
61
+ */
62
+ export declare function replaceDollarMention(input: string, cursorPos: number, agentId: string): {
63
+ input: string;
64
+ cursorPos: number;
65
+ };
42
66
  /**
43
67
  * Clear the file cache (call when cwd changes)
44
68
  */
@@ -228,6 +228,62 @@ export function replaceAtMention(input, cursorPos, completedPath) {
228
228
  const newCursorPos = atPos + 1 + completedPath.length;
229
229
  return { input: newInput, cursorPos: newCursorPos };
230
230
  }
231
+ /**
232
+ * Extract the $ mention being typed at the cursor position
233
+ * Returns the partial text after $ if in a $ context, null otherwise
234
+ *
235
+ * @param input - The current line text
236
+ * @param cursorPos - Current cursor position within the line
237
+ * @returns The partial agent name after $, or null if not in $ context
238
+ */
239
+ export function extractDollarMention(input, cursorPos) {
240
+ // Look backwards from cursor to find $
241
+ let start = cursorPos - 1;
242
+ while (start >= 0) {
243
+ const char = input[start];
244
+ // Found $
245
+ if (char === '$') {
246
+ // Make sure it's at start or after whitespace
247
+ if (start === 0 || /\s/.test(input[start - 1])) {
248
+ return {
249
+ partial: input.slice(start + 1, cursorPos),
250
+ startPos: start,
251
+ };
252
+ }
253
+ return null;
254
+ }
255
+ // Hit whitespace without finding $ - not in $ context
256
+ if (/\s/.test(char)) {
257
+ return null;
258
+ }
259
+ start--;
260
+ }
261
+ return null;
262
+ }
263
+ /**
264
+ * Replace the $ mention with completed agent name
265
+ *
266
+ * @param input - Full input text
267
+ * @param cursorPos - Current cursor position
268
+ * @param agentId - The completed agent ID to insert
269
+ * @returns New input text and new cursor position
270
+ */
271
+ export function replaceDollarMention(input, cursorPos, agentId) {
272
+ // Find the $ position
273
+ let dollarPos = cursorPos - 1;
274
+ while (dollarPos >= 0 && input[dollarPos] !== '$') {
275
+ dollarPos--;
276
+ }
277
+ if (dollarPos < 0) {
278
+ return { input, cursorPos };
279
+ }
280
+ // Replace from $ to cursor with the completed agent + space
281
+ const before = input.slice(0, dollarPos);
282
+ const after = input.slice(cursorPos);
283
+ const newInput = `${before}$${agentId} ${after}`;
284
+ const newCursorPos = dollarPos + 1 + agentId.length + 1; // +1 for $ +1 for space
285
+ return { input: newInput, cursorPos: newCursorPos };
286
+ }
231
287
  /**
232
288
  * Clear the file cache (call when cwd changes)
233
289
  */
@@ -0,0 +1,69 @@
1
+ /**
2
+ * Footer renderer.
3
+ *
4
+ * Extracted from TerminalUI — owns render state (line height tracking,
5
+ * spinner animation) and the render pipeline (clear, render, line builders).
6
+ * Reads application state through the host's getRenderData() snapshot.
7
+ */
8
+ import type { TodoItem, AgentMode } from './types.js';
9
+ import type { TerminalUIConfig } from './terminal-types.js';
10
+ import type { TurnMetrics } from './turn-metrics.js';
11
+ import type { StatusBarController } from './status-bar-controller.js';
12
+ import type { AutocompleteController } from './autocomplete-controller.js';
13
+ import type { LiveRegion } from './live-region.js';
14
+ export interface FooterRendererHost {
15
+ /** Check if footer rendering should proceed. */
16
+ isFooterRenderAllowed(): boolean;
17
+ /** Build a snapshot of application state for the render pipeline. */
18
+ getRenderData(): FooterRenderData;
19
+ }
20
+ export interface FooterRenderData {
21
+ liveRegion: LiveRegion;
22
+ liveVerbose: boolean;
23
+ agentRunning: boolean;
24
+ currentTool: string | null;
25
+ spinnerText: string | null;
26
+ activeBashInfo: {
27
+ toolUseId: string;
28
+ startTime: number;
29
+ } | null;
30
+ turnMetrics: TurnMetrics;
31
+ todos: TodoItem[];
32
+ showTodos: boolean;
33
+ lines: readonly string[];
34
+ currentLine: number;
35
+ cursorPos: number;
36
+ queuedInputs: readonly string[];
37
+ suggestion: string | null;
38
+ promptPrefix: string;
39
+ promptPrefixLen: number;
40
+ ac: AutocompleteController;
41
+ statusBar: StatusBarController;
42
+ mode: AgentMode;
43
+ activePlanName: string | null;
44
+ activeTeamAgent: {
45
+ id: string;
46
+ displayName: string;
47
+ mascot: string;
48
+ } | null;
49
+ projectName: string | null;
50
+ conversationFilterActive: boolean;
51
+ hasRestoredHistory: boolean;
52
+ config: TerminalUIConfig;
53
+ }
54
+ export declare class FooterRenderer {
55
+ private lastRenderHeight;
56
+ private cursorLineFromBottom;
57
+ private spinnerFrame;
58
+ private spinnerTimer;
59
+ private readonly spinnerFrames;
60
+ private readonly host;
61
+ constructor(host: FooterRendererHost);
62
+ clear(): void;
63
+ render(): void;
64
+ resetRenderState(): void;
65
+ startSpinnerAnimation(onTick: () => void): void;
66
+ stopSpinnerAnimation(): void;
67
+ private buildSpinnerLine;
68
+ private buildModeLine;
69
+ }