@compilr-dev/cli 0.5.0 → 0.5.2

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 (587) hide show
  1. package/LICENSE +108 -0
  2. package/README.md +237 -69
  3. package/dist/.tsbuildinfo.app +1 -0
  4. package/dist/.tsbuildinfo.data +1 -0
  5. package/dist/.tsbuildinfo.domain +1 -0
  6. package/dist/.tsbuildinfo.foundation +1 -0
  7. package/dist/agent.d.ts +61 -4
  8. package/dist/agent.js +241 -245
  9. package/dist/anchors/index.d.ts +1 -1
  10. package/dist/anchors/index.js +1 -1
  11. package/dist/anchors/project-anchors.d.ts +2 -2
  12. package/dist/anchors/project-anchors.js +1 -1
  13. package/dist/auth/api-client.d.ts +124 -0
  14. package/dist/auth/api-client.js +261 -0
  15. package/dist/auth/index.d.ts +172 -0
  16. package/dist/auth/index.js +545 -0
  17. package/dist/auth/storage.d.ts +52 -0
  18. package/dist/auth/storage.js +118 -0
  19. package/dist/changelog/index.d.ts +16 -0
  20. package/dist/changelog/index.js +24 -0
  21. package/dist/changelog/releases.d.ts +17 -0
  22. package/dist/changelog/releases.js +63 -0
  23. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  24. package/dist/commands-v2/handlers/auth.js +118 -0
  25. package/dist/commands-v2/handlers/background.d.ts +14 -0
  26. package/dist/commands-v2/handlers/background.js +276 -0
  27. package/dist/commands-v2/handlers/context.js +286 -81
  28. package/dist/commands-v2/handlers/core.d.ts +1 -0
  29. package/dist/commands-v2/handlers/core.js +133 -8
  30. package/dist/commands-v2/handlers/debug.js +18 -0
  31. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  32. package/dist/commands-v2/handlers/delegations.js +29 -0
  33. package/dist/commands-v2/handlers/files.d.ts +8 -0
  34. package/dist/commands-v2/handlers/files.js +162 -0
  35. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  36. package/dist/commands-v2/handlers/filter.js +130 -0
  37. package/dist/commands-v2/handlers/games.d.ts +7 -0
  38. package/dist/commands-v2/handlers/games.js +57 -0
  39. package/dist/commands-v2/handlers/index.d.ts +13 -0
  40. package/dist/commands-v2/handlers/index.js +39 -0
  41. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  42. package/dist/commands-v2/handlers/mcp.js +39 -0
  43. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  44. package/dist/commands-v2/handlers/notifications.js +34 -0
  45. package/dist/commands-v2/handlers/project.js +295 -31
  46. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  47. package/dist/commands-v2/handlers/reset.js +118 -0
  48. package/dist/commands-v2/handlers/session.d.ts +161 -0
  49. package/dist/commands-v2/handlers/session.js +805 -0
  50. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  51. package/dist/commands-v2/handlers/settings.js +217 -35
  52. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  53. package/dist/commands-v2/handlers/tasks.js +36 -0
  54. package/dist/commands-v2/handlers/team.d.ts +9 -0
  55. package/dist/commands-v2/handlers/team.js +549 -0
  56. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  57. package/dist/commands-v2/handlers/terminals.js +34 -0
  58. package/dist/commands-v2/index.d.ts +3 -2
  59. package/dist/commands-v2/index.js +4 -1
  60. package/dist/commands-v2/registry.d.ts +15 -0
  61. package/dist/commands-v2/registry.js +34 -0
  62. package/dist/commands-v2/types.d.ts +81 -3
  63. package/dist/commands.js +13 -0
  64. package/dist/compilr-diff-companion.vsix +0 -0
  65. package/dist/db/index.js +98 -4
  66. package/dist/db/repositories/document-repository.d.ts +2 -0
  67. package/dist/db/repositories/document-repository.js +6 -1
  68. package/dist/db/repositories/index.d.ts +2 -0
  69. package/dist/db/repositories/index.js +1 -0
  70. package/dist/db/repositories/plan-repository.d.ts +101 -0
  71. package/dist/db/repositories/plan-repository.js +275 -0
  72. package/dist/db/repositories/project-repository.d.ts +6 -0
  73. package/dist/db/repositories/project-repository.js +41 -0
  74. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  75. package/dist/db/repositories/work-item-repository.js +69 -4
  76. package/dist/db/schema.d.ts +40 -3
  77. package/dist/db/schema.js +66 -3
  78. package/dist/episodes/index.d.ts +20 -0
  79. package/dist/episodes/index.js +27 -0
  80. package/dist/episodes/recorder.d.ts +51 -0
  81. package/dist/episodes/recorder.js +195 -0
  82. package/dist/episodes/significant-work.d.ts +21 -0
  83. package/dist/episodes/significant-work.js +56 -0
  84. package/dist/episodes/store.d.ts +38 -0
  85. package/dist/episodes/store.js +199 -0
  86. package/dist/episodes/types.d.ts +35 -0
  87. package/dist/episodes/types.js +6 -0
  88. package/dist/episodes/work-at-risk.d.ts +12 -0
  89. package/dist/episodes/work-at-risk.js +38 -0
  90. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  91. package/dist/episodes/work-summary-anchor.js +73 -0
  92. package/dist/games/coins.d.ts +66 -0
  93. package/dist/games/coins.js +165 -0
  94. package/dist/games/game-base.d.ts +84 -0
  95. package/dist/games/game-base.js +204 -0
  96. package/dist/games/index.d.ts +16 -0
  97. package/dist/games/index.js +49 -0
  98. package/dist/games/scores.d.ts +69 -0
  99. package/dist/games/scores.js +191 -0
  100. package/dist/games/tetris/board.d.ts +59 -0
  101. package/dist/games/tetris/board.js +170 -0
  102. package/dist/games/tetris/index.d.ts +109 -0
  103. package/dist/games/tetris/index.js +610 -0
  104. package/dist/games/tetris/pieces.d.ts +44 -0
  105. package/dist/games/tetris/pieces.js +271 -0
  106. package/dist/games/tetris/renderer.d.ts +26 -0
  107. package/dist/games/tetris/renderer.js +77 -0
  108. package/dist/guide/guide-content.d.ts +23 -0
  109. package/dist/guide/guide-content.js +196 -0
  110. package/dist/guide/index.d.ts +8 -0
  111. package/dist/guide/index.js +7 -0
  112. package/dist/guide/shared-content.d.ts +37 -0
  113. package/dist/guide/shared-content.js +1272 -0
  114. package/dist/guide/tutorial-helpers.d.ts +57 -0
  115. package/dist/guide/tutorial-helpers.js +147 -0
  116. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  117. package/dist/handlers/ask-user-handlers.js +104 -0
  118. package/dist/handlers/delegation-handlers.d.ts +34 -0
  119. package/dist/handlers/delegation-handlers.js +291 -0
  120. package/dist/handlers/permission-handler.d.ts +30 -0
  121. package/dist/handlers/permission-handler.js +205 -0
  122. package/dist/index.d.ts +11 -1
  123. package/dist/index.js +448 -271
  124. package/dist/input-handlers/memory-handler.d.ts +1 -1
  125. package/dist/input-handlers/memory-handler.js +2 -1
  126. package/dist/models/index.d.ts +10 -0
  127. package/dist/models/index.js +12 -0
  128. package/dist/models/model-registry.d.ts +38 -0
  129. package/dist/models/model-registry.js +69 -0
  130. package/dist/models/model-tiers.d.ts +28 -0
  131. package/dist/models/model-tiers.js +71 -0
  132. package/dist/models/model-validation.d.ts +25 -0
  133. package/dist/models/model-validation.js +291 -0
  134. package/dist/models/ollama-models.d.ts +73 -0
  135. package/dist/models/ollama-models.js +178 -0
  136. package/dist/models/provider-types.d.ts +6 -0
  137. package/dist/models/provider-types.js +1 -0
  138. package/dist/models/providers.d.ts +35 -0
  139. package/dist/models/providers.js +58 -0
  140. package/dist/models/types.d.ts +4 -0
  141. package/dist/models/types.js +4 -0
  142. package/dist/multi-agent/activity.d.ts +21 -0
  143. package/dist/multi-agent/activity.js +34 -0
  144. package/dist/multi-agent/agent-selection.d.ts +55 -0
  145. package/dist/multi-agent/agent-selection.js +90 -0
  146. package/dist/multi-agent/artifacts.d.ts +197 -0
  147. package/dist/multi-agent/artifacts.js +379 -0
  148. package/dist/multi-agent/checkpointer.d.ts +138 -0
  149. package/dist/multi-agent/checkpointer.js +471 -0
  150. package/dist/multi-agent/collision-utils.d.ts +16 -0
  151. package/dist/multi-agent/collision-utils.js +28 -0
  152. package/dist/multi-agent/context-resolver.d.ts +97 -0
  153. package/dist/multi-agent/context-resolver.js +316 -0
  154. package/dist/multi-agent/custom-agents.d.ts +83 -0
  155. package/dist/multi-agent/custom-agents.js +227 -0
  156. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  157. package/dist/multi-agent/delegation-tracker.js +243 -0
  158. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  159. package/dist/multi-agent/file-lock-hook.js +97 -0
  160. package/dist/multi-agent/file-locks.d.ts +58 -0
  161. package/dist/multi-agent/file-locks.js +194 -0
  162. package/dist/multi-agent/index.d.ts +24 -0
  163. package/dist/multi-agent/index.js +30 -0
  164. package/dist/multi-agent/mention-parser.d.ts +64 -0
  165. package/dist/multi-agent/mention-parser.js +146 -0
  166. package/dist/multi-agent/notification-manager.d.ts +84 -0
  167. package/dist/multi-agent/notification-manager.js +224 -0
  168. package/dist/multi-agent/pending-requests.d.ts +122 -0
  169. package/dist/multi-agent/pending-requests.js +155 -0
  170. package/dist/multi-agent/session-registry.d.ts +139 -0
  171. package/dist/multi-agent/session-registry.js +514 -0
  172. package/dist/multi-agent/shared-context.d.ts +293 -0
  173. package/dist/multi-agent/shared-context.js +671 -0
  174. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  175. package/dist/multi-agent/skill-requirements.js +178 -0
  176. package/dist/multi-agent/task-assignment.d.ts +69 -0
  177. package/dist/multi-agent/task-assignment.js +123 -0
  178. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  179. package/dist/multi-agent/task-suggestion.js +72 -0
  180. package/dist/multi-agent/team-agent.d.ts +201 -0
  181. package/dist/multi-agent/team-agent.js +488 -0
  182. package/dist/multi-agent/team.d.ts +286 -0
  183. package/dist/multi-agent/team.js +610 -0
  184. package/dist/multi-agent/tool-config.d.ts +110 -0
  185. package/dist/multi-agent/tool-config.js +661 -0
  186. package/dist/multi-agent/types.d.ts +211 -0
  187. package/dist/multi-agent/types.js +617 -0
  188. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  189. package/dist/prompts/plan-mode-prompt.js +95 -0
  190. package/dist/repl-helpers.js +5 -2
  191. package/dist/repl-v2.d.ts +401 -2
  192. package/dist/repl-v2.js +2588 -65
  193. package/dist/session/index.d.ts +6 -0
  194. package/dist/session/index.js +6 -0
  195. package/dist/session/project-session-manager.d.ts +158 -0
  196. package/dist/session/project-session-manager.js +650 -0
  197. package/dist/settings/index.d.ts +133 -13
  198. package/dist/settings/index.js +329 -24
  199. package/dist/settings/mcp-config.d.ts +76 -0
  200. package/dist/settings/mcp-config.js +143 -0
  201. package/dist/settings/paths.d.ts +4 -0
  202. package/dist/settings/paths.js +6 -0
  203. package/dist/shared-handlers.d.ts +62 -0
  204. package/dist/shared-handlers.js +48 -0
  205. package/dist/system-prompt/builder.d.ts +5 -0
  206. package/dist/system-prompt/builder.js +4 -0
  207. package/dist/system-prompt/index.d.ts +18 -0
  208. package/dist/system-prompt/index.js +18 -0
  209. package/dist/system-prompt/modules.d.ts +5 -0
  210. package/dist/system-prompt/modules.js +4 -0
  211. package/dist/tabbed-menu.js +2 -1
  212. package/dist/templates/compilr-md-import.d.ts +16 -0
  213. package/dist/templates/compilr-md-import.js +241 -0
  214. package/dist/templates/compilr-md.js +10 -61
  215. package/dist/templates/config-json.d.ts +1 -25
  216. package/dist/templates/index.d.ts +2 -0
  217. package/dist/templates/index.js +34 -73
  218. package/dist/tool-names.d.ts +113 -0
  219. package/dist/tool-names.js +239 -0
  220. package/dist/tools/ask-user-simple.d.ts +1 -1
  221. package/dist/tools/ask-user-simple.js +2 -1
  222. package/dist/tools/ask-user.d.ts +1 -1
  223. package/dist/tools/ask-user.js +2 -1
  224. package/dist/tools/backlog.d.ts +2 -2
  225. package/dist/tools/backlog.js +1 -1
  226. package/dist/tools/db-tools.d.ts +13 -61
  227. package/dist/tools/db-tools.js +12 -13
  228. package/dist/tools/delegate-background.d.ts +27 -0
  229. package/dist/tools/delegate-background.js +115 -0
  230. package/dist/tools/delegate.d.ts +22 -0
  231. package/dist/tools/delegate.js +97 -0
  232. package/dist/tools/delegation-status.d.ts +16 -0
  233. package/dist/tools/delegation-status.js +128 -0
  234. package/dist/tools/guide-tool.d.ts +12 -0
  235. package/dist/tools/guide-tool.js +59 -0
  236. package/dist/tools/handoff.d.ts +25 -0
  237. package/dist/tools/handoff.js +99 -0
  238. package/dist/tools/meta-tools.d.ts +26 -0
  239. package/dist/tools/meta-tools.js +47 -0
  240. package/dist/tools/platform-adapter.d.ts +35 -0
  241. package/dist/tools/platform-adapter.js +404 -0
  242. package/dist/tools/project-db.d.ts +5 -73
  243. package/dist/tools/project-db.js +5 -336
  244. package/dist/tools.d.ts +67 -2
  245. package/dist/tools.js +240 -48
  246. package/dist/ui/autocomplete-controller.d.ts +42 -0
  247. package/dist/ui/autocomplete-controller.js +384 -0
  248. package/dist/ui/base/index.d.ts +1 -1
  249. package/dist/ui/base/index.js +1 -1
  250. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  251. package/dist/ui/base/overlay-base-v2.js +14 -0
  252. package/dist/ui/base/render-utils.d.ts +19 -0
  253. package/dist/ui/base/render-utils.js +25 -0
  254. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  255. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  256. package/dist/ui/constants/labels.d.ts +14 -0
  257. package/dist/ui/constants/labels.js +52 -0
  258. package/dist/ui/conversation-store.d.ts +55 -0
  259. package/dist/ui/conversation-store.js +107 -0
  260. package/dist/ui/conversation.js +11 -13
  261. package/dist/ui/diff.d.ts +7 -1
  262. package/dist/ui/diff.js +85 -48
  263. package/dist/ui/ephemeral.js +3 -9
  264. package/dist/ui/file-autocomplete.d.ts +24 -0
  265. package/dist/ui/file-autocomplete.js +56 -0
  266. package/dist/ui/footer-renderer.d.ts +69 -0
  267. package/dist/ui/footer-renderer.js +431 -0
  268. package/dist/ui/footer.d.ts +74 -7
  269. package/dist/ui/footer.js +173 -16
  270. package/dist/ui/input-controller.d.ts +51 -0
  271. package/dist/ui/input-controller.js +176 -0
  272. package/dist/ui/input-prompt.d.ts +19 -0
  273. package/dist/ui/input-prompt.js +206 -14
  274. package/dist/ui/keyboard-handler.d.ts +57 -0
  275. package/dist/ui/keyboard-handler.js +557 -0
  276. package/dist/ui/live-region-facade.d.ts +42 -0
  277. package/dist/ui/live-region-facade.js +205 -0
  278. package/dist/ui/live-region.d.ts +0 -4
  279. package/dist/ui/live-region.js +6 -14
  280. package/dist/ui/mascot/renderer.d.ts +1 -1
  281. package/dist/ui/mascot/renderer.js +37 -2
  282. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  283. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  284. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  285. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  286. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  287. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  288. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  289. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  290. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  291. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  292. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  293. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  294. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  295. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  296. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  297. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  298. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  299. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  300. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  301. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  302. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  303. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  304. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  305. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  306. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  307. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  308. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  309. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  310. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  311. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  312. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  313. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  314. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  315. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  316. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  317. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  318. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  319. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  320. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  321. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  322. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  323. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  324. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  325. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  326. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  327. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  328. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  329. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  330. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  331. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  332. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  333. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  334. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  335. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  336. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  337. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  338. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  339. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  340. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  341. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  342. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  343. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  344. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  345. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  346. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  347. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  348. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  349. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  350. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  351. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  352. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  353. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  354. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  355. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  356. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  357. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  358. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  359. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  360. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  361. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  362. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  363. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  364. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  365. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  366. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  367. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  368. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  369. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  370. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  371. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  372. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  373. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  374. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  375. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  376. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  377. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  378. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  379. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  380. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  381. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  382. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  383. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  384. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  385. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  386. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  387. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  388. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  389. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  390. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  391. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  392. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  393. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  394. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  395. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  396. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  397. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  398. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  399. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  400. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  401. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  402. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  403. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  404. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  405. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  406. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  407. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  408. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  409. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  410. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  411. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
  412. package/dist/ui/overlay/impl/workflow-overlay-v2.js +10 -4
  413. package/dist/ui/overlay/index.d.ts +20 -1
  414. package/dist/ui/overlay/index.js +19 -0
  415. package/dist/ui/overlay/types.d.ts +5 -0
  416. package/dist/ui/overlay-manager.d.ts +43 -0
  417. package/dist/ui/overlay-manager.js +238 -0
  418. package/dist/ui/overlays.js +4 -16
  419. package/dist/ui/permission-overlay.js +6 -5
  420. package/dist/ui/status-bar-controller.d.ts +33 -0
  421. package/dist/ui/status-bar-controller.js +99 -0
  422. package/dist/ui/subagent-renderer.js +3 -19
  423. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  424. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  425. package/dist/ui/terminal-line-builders.d.ts +17 -0
  426. package/dist/ui/terminal-line-builders.js +42 -0
  427. package/dist/ui/terminal-render-item.d.ts +16 -0
  428. package/dist/ui/terminal-render-item.js +267 -0
  429. package/dist/ui/terminal-renderer.d.ts +7 -8
  430. package/dist/ui/terminal-renderer.js +7 -8
  431. package/dist/ui/terminal-types.d.ts +179 -0
  432. package/dist/ui/terminal-types.js +34 -0
  433. package/dist/ui/terminal-ui.d.ts +144 -276
  434. package/dist/ui/terminal-ui.js +384 -1861
  435. package/dist/ui/todo-zone.d.ts +19 -1
  436. package/dist/ui/todo-zone.js +71 -13
  437. package/dist/ui/tool-formatters.js +696 -1
  438. package/dist/ui/turn-metrics.d.ts +56 -0
  439. package/dist/ui/turn-metrics.js +75 -0
  440. package/dist/ui/types.d.ts +28 -0
  441. package/dist/ui/types.js +1 -0
  442. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  443. package/dist/ui/vscode-diff-ipc.js +385 -0
  444. package/dist/utils/credentials.d.ts +24 -5
  445. package/dist/utils/credentials.js +123 -9
  446. package/dist/utils/format-tokens.d.ts +13 -0
  447. package/dist/utils/format-tokens.js +18 -0
  448. package/dist/utils/git-config.d.ts +26 -0
  449. package/dist/utils/git-config.js +54 -0
  450. package/dist/utils/message-utils.d.ts +61 -0
  451. package/dist/utils/message-utils.js +72 -0
  452. package/dist/utils/model-tiers.d.ts +8 -1
  453. package/dist/utils/model-tiers.js +38 -16
  454. package/dist/utils/open-browser.d.ts +5 -0
  455. package/dist/utils/open-browser.js +32 -0
  456. package/dist/utils/path-safety.js +3 -2
  457. package/dist/utils/project-detection.d.ts +58 -0
  458. package/dist/utils/project-detection.js +424 -0
  459. package/dist/utils/project-memory.js +2 -1
  460. package/dist/utils/project-status.d.ts +2 -2
  461. package/dist/utils/startup-perf.d.ts +18 -0
  462. package/dist/utils/startup-perf.js +60 -0
  463. package/dist/utils/token-tracker.d.ts +62 -0
  464. package/dist/utils/token-tracker.js +150 -0
  465. package/dist/utils/token-types.d.ts +23 -0
  466. package/dist/utils/token-types.js +18 -0
  467. package/dist/utils/types/config-types.d.ts +32 -0
  468. package/dist/utils/types/config-types.js +8 -0
  469. package/dist/utils/update-checker.d.ts +28 -0
  470. package/dist/utils/update-checker.js +106 -0
  471. package/dist/utils/version.d.ts +7 -0
  472. package/dist/utils/version.js +10 -0
  473. package/dist/utils/vscode-detect.d.ts +39 -0
  474. package/dist/utils/vscode-detect.js +137 -0
  475. package/package.json +27 -13
  476. package/dist/commands/handler-types.d.ts +0 -68
  477. package/dist/commands/handler-types.js +0 -8
  478. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  479. package/dist/commands/handlers/agent-commands.js +0 -305
  480. package/dist/commands/handlers/design-commands.d.ts +0 -15
  481. package/dist/commands/handlers/design-commands.js +0 -334
  482. package/dist/commands/handlers/index.d.ts +0 -20
  483. package/dist/commands/handlers/index.js +0 -43
  484. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  485. package/dist/commands/handlers/overlay-commands.js +0 -287
  486. package/dist/commands/handlers/project-commands.d.ts +0 -11
  487. package/dist/commands/handlers/project-commands.js +0 -167
  488. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  489. package/dist/commands/handlers/simple-commands.js +0 -144
  490. package/dist/commands/registry.d.ts +0 -50
  491. package/dist/commands/registry.js +0 -75
  492. package/dist/index.old.d.ts +0 -7
  493. package/dist/index.old.js +0 -1014
  494. package/dist/repl.d.ts +0 -149
  495. package/dist/repl.js +0 -1151
  496. package/dist/templates/claude-md.d.ts +0 -7
  497. package/dist/templates/claude-md.js +0 -189
  498. package/dist/test-autocomplete.d.ts +0 -7
  499. package/dist/test-autocomplete.js +0 -85
  500. package/dist/test-tabbed-menu.d.ts +0 -7
  501. package/dist/test-tabbed-menu.js +0 -25
  502. package/dist/tool-selector.d.ts +0 -71
  503. package/dist/tool-selector.js +0 -184
  504. package/dist/tools/anchor-tools.d.ts +0 -31
  505. package/dist/tools/anchor-tools.js +0 -255
  506. package/dist/tools/backlog-wrappers.d.ts +0 -54
  507. package/dist/tools/backlog-wrappers.js +0 -338
  508. package/dist/tools/document-db.d.ts +0 -43
  509. package/dist/tools/document-db.js +0 -220
  510. package/dist/tools/workitem-db.d.ts +0 -103
  511. package/dist/tools/workitem-db.js +0 -549
  512. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  513. package/dist/ui/agents-overlay-v2.js +0 -809
  514. package/dist/ui/agents-overlay.d.ts +0 -12
  515. package/dist/ui/agents-overlay.js +0 -863
  516. package/dist/ui/anchors-overlay.d.ts +0 -12
  517. package/dist/ui/anchors-overlay.js +0 -775
  518. package/dist/ui/arch-type-overlay.d.ts +0 -15
  519. package/dist/ui/arch-type-overlay.js +0 -201
  520. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  521. package/dist/ui/ask-user-overlay-v2.js +0 -555
  522. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  523. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  524. package/dist/ui/backlog-overlay.d.ts +0 -32
  525. package/dist/ui/backlog-overlay.js +0 -652
  526. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  527. package/dist/ui/commands-overlay-v2.js +0 -441
  528. package/dist/ui/commands-overlay.d.ts +0 -16
  529. package/dist/ui/commands-overlay.js +0 -439
  530. package/dist/ui/config-overlay.d.ts +0 -35
  531. package/dist/ui/config-overlay.js +0 -707
  532. package/dist/ui/docs-overlay.d.ts +0 -17
  533. package/dist/ui/docs-overlay.js +0 -303
  534. package/dist/ui/footer-v2.d.ts +0 -222
  535. package/dist/ui/footer-v2.js +0 -1349
  536. package/dist/ui/help-overlay-v2.d.ts +0 -34
  537. package/dist/ui/help-overlay-v2.js +0 -309
  538. package/dist/ui/help-overlay.d.ts +0 -16
  539. package/dist/ui/help-overlay.js +0 -316
  540. package/dist/ui/init-overlay-v2.d.ts +0 -34
  541. package/dist/ui/init-overlay-v2.js +0 -600
  542. package/dist/ui/init-overlay.d.ts +0 -34
  543. package/dist/ui/init-overlay.js +0 -604
  544. package/dist/ui/input-prompt-v2.d.ts +0 -180
  545. package/dist/ui/input-prompt-v2.js +0 -999
  546. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  547. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  548. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  549. package/dist/ui/keys-overlay-v2.js +0 -248
  550. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  551. package/dist/ui/mascot-overlay-v2.js +0 -138
  552. package/dist/ui/mascot-overlay.d.ts +0 -21
  553. package/dist/ui/mascot-overlay.js +0 -146
  554. package/dist/ui/model-overlay-v2.d.ts +0 -49
  555. package/dist/ui/model-overlay-v2.js +0 -118
  556. package/dist/ui/model-overlay.d.ts +0 -27
  557. package/dist/ui/model-overlay.js +0 -221
  558. package/dist/ui/model-warning-overlay.d.ts +0 -30
  559. package/dist/ui/model-warning-overlay.js +0 -169
  560. package/dist/ui/new-overlay.d.ts +0 -34
  561. package/dist/ui/new-overlay.js +0 -604
  562. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  563. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  564. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  565. package/dist/ui/overlay/overlay-types.js +0 -22
  566. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  567. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  568. package/dist/ui/overlays/index.d.ts +0 -11
  569. package/dist/ui/overlays/index.js +0 -11
  570. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  571. package/dist/ui/permission-overlay-v2.js +0 -380
  572. package/dist/ui/projects-overlay.d.ts +0 -19
  573. package/dist/ui/projects-overlay.js +0 -484
  574. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  575. package/dist/ui/theme-overlay-v2.js +0 -135
  576. package/dist/ui/theme-overlay.d.ts +0 -24
  577. package/dist/ui/theme-overlay.js +0 -127
  578. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  579. package/dist/ui/tools-overlay-v2.js +0 -218
  580. package/dist/ui/tools-overlay.d.ts +0 -34
  581. package/dist/ui/tools-overlay.js +0 -230
  582. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  583. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  584. package/dist/ui/tutorial-overlay.d.ts +0 -11
  585. package/dist/ui/tutorial-overlay.js +0 -1034
  586. package/dist/ui/workflow-overlay.d.ts +0 -22
  587. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,431 @@
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 * as terminal from './terminal.js';
9
+ import { getPhysicalLineCount, getVisibleLength } from './line-utils.js';
10
+ import { getStyles } from '../themes/index.js';
11
+ import { formatTokens } from './base/index.js';
12
+ import { formatInputText } from './terminal-autocomplete-utils.js';
13
+ import { buildTodoLine, formatDuration } from './terminal-line-builders.js';
14
+ import { getDefaultShellManager } from '@compilr-dev/sdk';
15
+ import { MASCOT } from './terminal-types.js';
16
+ import { MODE_INFO } from './types.js';
17
+ import { getPendingRequestsManager } from '../multi-agent/index.js';
18
+ import { getSessionRegistry } from '../multi-agent/session-registry.js';
19
+ import { getNotificationManager } from '../multi-agent/notification-manager.js';
20
+ export class FooterRenderer {
21
+ lastRenderHeight = 0;
22
+ cursorLineFromBottom = 0;
23
+ spinnerFrame = 0;
24
+ spinnerTimer = null;
25
+ spinnerFrames = MASCOT.crt;
26
+ host;
27
+ constructor(host) {
28
+ this.host = host;
29
+ }
30
+ // ===========================================================================
31
+ // Clear / Render
32
+ // ===========================================================================
33
+ clear() {
34
+ if (this.lastRenderHeight === 0) {
35
+ return;
36
+ }
37
+ terminal.moveCursorToLineStart();
38
+ // Move cursor to TOP of footer
39
+ // cursorRowFromTop = which row the cursor is on (1-indexed from top of footer)
40
+ const cursorRowFromTop = this.lastRenderHeight - this.cursorLineFromBottom;
41
+ const rowsToMoveUp = cursorRowFromTop - 1;
42
+ if (rowsToMoveUp > 0) {
43
+ terminal.moveCursorUp(rowsToMoveUp);
44
+ }
45
+ terminal.clearToEndOfScreen();
46
+ this.lastRenderHeight = 0;
47
+ this.cursorLineFromBottom = 0;
48
+ }
49
+ render() {
50
+ if (!this.host.isFooterRenderAllowed()) {
51
+ return;
52
+ }
53
+ const data = this.host.getRenderData();
54
+ const termWidth = terminal.getTerminalWidth();
55
+ const s = getStyles();
56
+ // Build all lines in order
57
+ const lines = [];
58
+ // 0. LiveRegion (if has items) - rendered at top of footer
59
+ if (data.liveRegion.hasItems()) {
60
+ const liveLines = data.liveRegion.render({
61
+ width: termWidth,
62
+ verbose: data.liveVerbose,
63
+ showTokens: true,
64
+ });
65
+ for (const line of liveLines) {
66
+ lines.push({
67
+ content: line,
68
+ physicalLines: getPhysicalLineCount(line, termWidth),
69
+ });
70
+ }
71
+ // Blank line after live region for spacing
72
+ if (liveLines.length > 0) {
73
+ lines.push({ content: '', physicalLines: 1 });
74
+ }
75
+ }
76
+ // 1. Header: Spinner (when running) or "Todos" (when idle with todos)
77
+ if (data.agentRunning) {
78
+ const spinnerLine = this.buildSpinnerLine(data);
79
+ lines.push({
80
+ content: spinnerLine,
81
+ physicalLines: getPhysicalLineCount(spinnerLine, termWidth),
82
+ });
83
+ }
84
+ else if (data.todos.length > 0) {
85
+ const headerLine = s.muted('Todos');
86
+ lines.push({
87
+ content: headerLine,
88
+ physicalLines: 1,
89
+ });
90
+ }
91
+ // 2. Todo list (show if there are todos AND showTodos is true)
92
+ // Sort: in_progress → pending → completed (completed sink to bottom)
93
+ // Stable sort preserves original order within each status group.
94
+ if (data.todos.length > 0 && data.showTodos) {
95
+ const indexed = data.todos.map((todo, i) => ({ todo, taskNumber: i + 1 }));
96
+ const statusOrder = { in_progress: 0, pending: 1, completed: 2 };
97
+ const sorted = [...indexed].sort((a, b) => (statusOrder[a.todo.status] ?? 1) - (statusOrder[b.todo.status] ?? 1));
98
+ for (const { todo, taskNumber } of sorted) {
99
+ const todoLine = buildTodoLine(todo, taskNumber);
100
+ lines.push({
101
+ content: todoLine,
102
+ physicalLines: getPhysicalLineCount(todoLine, termWidth),
103
+ });
104
+ }
105
+ // Blank line after todos for spacing
106
+ lines.push({ content: '', physicalLines: 1 });
107
+ }
108
+ // 3. Queued inputs (show multiline as single line with ↵ indicator)
109
+ for (const queued of data.queuedInputs) {
110
+ const displayText = queued.replace(/\n/g, ' ↵ ');
111
+ const queuedLine = s.muted(`queued: "${displayText}"`);
112
+ lines.push({
113
+ content: queuedLine,
114
+ physicalLines: getPhysicalLineCount(queuedLine, termWidth),
115
+ });
116
+ }
117
+ // 4. Top separator
118
+ const separator = '─'.repeat(termWidth);
119
+ lines.push({ content: separator, physicalLines: 1 });
120
+ // 5. Input prompt (multiline support)
121
+ const continuationPrompt = s.muted(' \\ ');
122
+ const continuationPromptLen = getVisibleLength(continuationPrompt);
123
+ const cursorLineIndex = lines.length + data.currentLine; // Index where cursor is
124
+ for (let i = 0; i < data.lines.length; i++) {
125
+ const linePrompt = i === 0 ? data.promptPrefix : continuationPrompt;
126
+ const linePromptLen = i === 0 ? data.promptPrefixLen : continuationPromptLen;
127
+ const lineContent = data.lines[i];
128
+ // Show ghost text on first line when input is empty and no autocomplete
129
+ let fullLine;
130
+ let totalLen;
131
+ if (i === 0 &&
132
+ lineContent === '' &&
133
+ data.lines.length === 1 &&
134
+ data.suggestion &&
135
+ !data.ac.isActive()) {
136
+ // Build: [prompt][suggestion]...[↵ send]
137
+ const rightHint = '↵ send';
138
+ const leftContent = linePrompt + s.muted(data.suggestion);
139
+ const leftLen = linePromptLen + data.suggestion.length;
140
+ const rightLen = rightHint.length;
141
+ const padding = Math.max(1, termWidth - leftLen - rightLen);
142
+ fullLine = leftContent + ' '.repeat(padding) + s.muted(rightHint);
143
+ totalLen = termWidth; // Full width
144
+ }
145
+ else {
146
+ // Format special prefixes: $agent, @path, /command
147
+ const formattedContent = formatInputText(lineContent);
148
+ fullLine = linePrompt + formattedContent;
149
+ totalLen = linePromptLen + getVisibleLength(lineContent);
150
+ }
151
+ const physicalLines = totalLen === 0 ? 1 : Math.ceil(totalLen / termWidth) || 1;
152
+ lines.push({
153
+ content: fullLine,
154
+ physicalLines,
155
+ });
156
+ }
157
+ // 6. Bottom separator
158
+ lines.push({ content: separator, physicalLines: 1 });
159
+ // 7. Mode indicator
160
+ const modeLine = this.buildModeLine(data, termWidth);
161
+ lines.push({
162
+ content: modeLine,
163
+ physicalLines: getPhysicalLineCount(modeLine, termWidth),
164
+ });
165
+ // 7b. Status bar indicators (single horizontal line)
166
+ const statusItems = data.statusBar.getItems();
167
+ if (statusItems.length > 0) {
168
+ const pendingCount = getPendingRequestsManager().getCount();
169
+ const terminalCount = getSessionRegistry()?.getProjectScopedSessionCount() ?? 0;
170
+ const notifCount = getNotificationManager()?.getUnreadCount() ?? 0;
171
+ const segments = [];
172
+ for (let idx = 0; idx < statusItems.length; idx++) {
173
+ const item = statusItems[idx];
174
+ const isSelected = data.statusBar.navActive && data.statusBar.selectedIndex === idx;
175
+ let label;
176
+ if (item.id === 'notifications') {
177
+ label = `[!] ${String(notifCount)} notif`;
178
+ }
179
+ else if (item.id === 'pending') {
180
+ label = `pending: ${String(pendingCount)}`;
181
+ }
182
+ else if (item.id === 'terminals') {
183
+ label = `terminals: ${String(terminalCount)}`;
184
+ }
185
+ else if (item.id === 'mcp') {
186
+ label = 'mcp: connecting...';
187
+ }
188
+ else {
189
+ label = `bg: ${String(data.statusBar.backgroundAgentCount)}`;
190
+ }
191
+ if (isSelected) {
192
+ segments.push(s.inverse(` ${label} `));
193
+ }
194
+ else if (data.statusBar.navActive) {
195
+ segments.push(s.muted(label));
196
+ }
197
+ else {
198
+ segments.push(s.warning(label));
199
+ }
200
+ }
201
+ let statusLine = segments.join(' ');
202
+ if (data.statusBar.navActive) {
203
+ statusLine += ' ' + s.muted('[Enter]');
204
+ }
205
+ else {
206
+ statusLine += ' ' + s.muted('[↓]');
207
+ }
208
+ lines.push({
209
+ content: statusLine,
210
+ physicalLines: getPhysicalLineCount(statusLine, termWidth),
211
+ });
212
+ }
213
+ // 8. Autocomplete dropdown (if active) - agent > file > command priority
214
+ const agentAutocompleteLines = data.ac.buildAgentLines(termWidth);
215
+ const fileAutocompleteLines = data.ac.buildFileLines(termWidth);
216
+ const autocompleteLines = agentAutocompleteLines.length > 0
217
+ ? agentAutocompleteLines
218
+ : fileAutocompleteLines.length > 0
219
+ ? fileAutocompleteLines
220
+ : data.ac.buildCommandLines(termWidth);
221
+ for (const line of autocompleteLines) {
222
+ lines.push({
223
+ content: line,
224
+ physicalLines: getPhysicalLineCount(line, termWidth),
225
+ });
226
+ }
227
+ // Calculate total physical height
228
+ let totalPhysicalLines = 0;
229
+ for (const line of lines) {
230
+ totalPhysicalLines += line.physicalLines;
231
+ }
232
+ // Clear existing footer
233
+ this.clear();
234
+ // Write all lines
235
+ for (let i = 0; i < lines.length; i++) {
236
+ terminal.write(lines[i].content);
237
+ if (i < lines.length - 1) {
238
+ terminal.write('\n');
239
+ }
240
+ }
241
+ // Calculate cursor position (for multiline, position on the line where cursor is)
242
+ let rowsAfterCursor = 0;
243
+ for (let i = cursorLineIndex + 1; i < lines.length; i++) {
244
+ rowsAfterCursor += lines[i].physicalLines;
245
+ }
246
+ if (rowsAfterCursor > 0) {
247
+ terminal.moveCursorUp(rowsAfterCursor);
248
+ }
249
+ // Calculate column within current line
250
+ const currentLinePromptLen = data.currentLine === 0 ? data.promptPrefixLen : continuationPromptLen;
251
+ const totalPos = currentLinePromptLen + data.cursorPos;
252
+ const cursorCol = (totalPos % termWidth) + 1;
253
+ terminal.moveCursorToColumn(cursorCol);
254
+ terminal.showCursor();
255
+ this.lastRenderHeight = totalPhysicalLines;
256
+ this.cursorLineFromBottom = rowsAfterCursor;
257
+ }
258
+ // ===========================================================================
259
+ // Render state reset
260
+ // ===========================================================================
261
+ resetRenderState() {
262
+ this.lastRenderHeight = 0;
263
+ this.cursorLineFromBottom = 0;
264
+ }
265
+ // ===========================================================================
266
+ // Spinner animation
267
+ // ===========================================================================
268
+ startSpinnerAnimation(onTick) {
269
+ if (this.spinnerTimer)
270
+ return;
271
+ this.spinnerTimer = setInterval(() => {
272
+ this.spinnerFrame++;
273
+ onTick();
274
+ }, 200); // Slower, more relaxed animation
275
+ }
276
+ stopSpinnerAnimation() {
277
+ if (this.spinnerTimer) {
278
+ clearInterval(this.spinnerTimer);
279
+ this.spinnerTimer = null;
280
+ }
281
+ this.spinnerFrame = 0;
282
+ }
283
+ // ===========================================================================
284
+ // Line builders (private)
285
+ // ===========================================================================
286
+ buildSpinnerLine(data) {
287
+ const s = getStyles();
288
+ const frame = this.spinnerFrames[this.spinnerFrame % this.spinnerFrames.length];
289
+ const text = data.currentTool ?? data.spinnerText ?? 'Thinking...';
290
+ // Build hints (Claude Code style: ctrl+c to interrupt · time · tokens · thinking)
291
+ const hints = ['esc to interrupt'];
292
+ // Show "ctrl+b to background" hint if bash running for more than 3 seconds
293
+ if (data.activeBashInfo && (Date.now() - data.activeBashInfo.startTime) > 3000) {
294
+ hints.push('ctrl+b to background');
295
+ }
296
+ // Add elapsed time
297
+ if (data.turnMetrics.startTime > 0) {
298
+ const elapsedMs = Date.now() - data.turnMetrics.startTime;
299
+ hints.push(formatDuration(elapsedMs));
300
+ }
301
+ // Add token counts (↓ input ↑ output) with thinking/cache tokens and API call count
302
+ if (data.turnMetrics.inputTokens > 0 || data.turnMetrics.outputTokens > 0) {
303
+ const inputStr = formatTokens(data.turnMetrics.inputTokens);
304
+ const outputStr = formatTokens(data.turnMetrics.outputTokens);
305
+ let tokenDisplay = `↓ ${inputStr} ↑ ${outputStr}`;
306
+ // Build parenthetical for thinking/cache tokens
307
+ const extras = [];
308
+ if (data.turnMetrics.thinkingTokens > 0) {
309
+ extras.push(`think: ${formatTokens(data.turnMetrics.thinkingTokens)}`);
310
+ }
311
+ if (data.turnMetrics.cacheReadTokens > 0) {
312
+ extras.push(`cache: ${formatTokens(data.turnMetrics.cacheReadTokens)}`);
313
+ }
314
+ if (extras.length > 0) {
315
+ tokenDisplay += ` (${extras.join(', ')})`;
316
+ }
317
+ // Add API call count if multiple calls
318
+ if (data.turnMetrics.apiCalls > 1) {
319
+ tokenDisplay += ` (${String(data.turnMetrics.apiCalls)} calls)`;
320
+ }
321
+ hints.push(tokenDisplay);
322
+ }
323
+ // Add "thinking" indicator when extended thinking is active
324
+ if (data.turnMetrics.isThinking) {
325
+ hints.push('thinking');
326
+ }
327
+ // Add background task count
328
+ const bgTaskCount = getDefaultShellManager().listRunning().length;
329
+ if (bgTaskCount > 0) {
330
+ hints.push(`bg: ${String(bgTaskCount)}`);
331
+ }
332
+ if (data.todos.length > 0 && data.showTodos) {
333
+ hints.push('ctrl+t to hide todos');
334
+ }
335
+ else if (data.todos.length > 0 && !data.showTodos) {
336
+ hints.push('ctrl+t to show todos');
337
+ }
338
+ const hintsText = hints.length > 0 ? ` (${hints.join(' · ')})` : '';
339
+ // Format: [CRT scanner] text (hints)
340
+ return s.muted(`${frame} ${text}${hintsText}`);
341
+ }
342
+ buildModeLine(data, termWidth) {
343
+ const s = getStyles();
344
+ const modeInfo = MODE_INFO[data.mode];
345
+ // Build mode part (left)
346
+ let modePart;
347
+ let modePartLen;
348
+ switch (data.mode) {
349
+ case 'normal':
350
+ modePart = s.muted(`mode: ${modeInfo.label}`);
351
+ modePartLen = `mode: ${modeInfo.label}`.length;
352
+ break;
353
+ case 'auto-accept':
354
+ modePart = s.warning(`mode: ${modeInfo.label}`);
355
+ modePartLen = `mode: ${modeInfo.label}`.length;
356
+ break;
357
+ case 'plan':
358
+ if (data.activePlanName) {
359
+ modePart = s.info(`mode: ${modeInfo.label}`) + s.secondary(` [${data.activePlanName}]`);
360
+ modePartLen = `mode: ${modeInfo.label} [${data.activePlanName}]`.length;
361
+ }
362
+ else {
363
+ modePart = s.info(`mode: ${modeInfo.label}`);
364
+ modePartLen = `mode: ${modeInfo.label}`.length;
365
+ }
366
+ break;
367
+ default:
368
+ modePart = s.muted(`mode: ${modeInfo.label}`);
369
+ modePartLen = `mode: ${modeInfo.label}`.length;
370
+ }
371
+ // Add background task count indicator after mode (if any running)
372
+ const bgCount = getDefaultShellManager().listRunning().length;
373
+ if (bgCount > 0) {
374
+ modePart += ' ' + s.info(`[bg: ${String(bgCount)}]`);
375
+ modePartLen += 1 + `[bg: ${String(bgCount)}]`.length;
376
+ }
377
+ // Add conversation filter indicator (if active)
378
+ if (data.conversationFilterActive) {
379
+ const filterText = '[/f: on]';
380
+ modePart += ' ' + s.secondary(filterText);
381
+ modePartLen += 1 + filterText.length;
382
+ }
383
+ // Add restored history hint (if available, only when not running)
384
+ if (!data.agentRunning && data.hasRestoredHistory) {
385
+ const histHint = '[ctrl+r: history]';
386
+ modePart += ' ' + s.muted(histHint);
387
+ modePartLen += 1 + histHint.length;
388
+ }
389
+ // Build agent part (center) - only if not default
390
+ let agentPart = '';
391
+ let agentPartLen = 0;
392
+ if (data.activeTeamAgent && data.activeTeamAgent.id !== 'default') {
393
+ const agent = data.activeTeamAgent;
394
+ agentPart = s.secondary(`${agent.mascot} $${agent.id}`) + s.muted(` (${agent.displayName})`);
395
+ agentPartLen = `${agent.mascot} $${agent.id} (${agent.displayName})`.length;
396
+ }
397
+ // Build project part (right)
398
+ let projectPart = '';
399
+ let projectPartLen = 0;
400
+ if (data.projectName) {
401
+ const projectText = `Project: ${data.projectName}`;
402
+ projectPart = s.muted(projectText);
403
+ projectPartLen = projectText.length;
404
+ }
405
+ // Calculate layout
406
+ const totalContentLen = modePartLen + agentPartLen + projectPartLen;
407
+ const availableSpace = termWidth - totalContentLen;
408
+ if (availableSpace < 4) {
409
+ // Not enough space - just put mode on left, project on right, skip agent
410
+ if (!data.projectName) {
411
+ return modePart;
412
+ }
413
+ const padding = Math.max(2, termWidth - modePartLen - projectPartLen);
414
+ return modePart + ' '.repeat(padding) + projectPart;
415
+ }
416
+ // Distribute space: split between left-center and center-right gaps
417
+ if (agentPartLen > 0) {
418
+ const leftGap = Math.floor(availableSpace / 2);
419
+ const rightGap = availableSpace - leftGap;
420
+ return modePart + ' '.repeat(Math.max(2, leftGap)) + agentPart + ' '.repeat(Math.max(2, rightGap)) + projectPart;
421
+ }
422
+ else {
423
+ // No agent, just mode and project
424
+ if (!data.projectName) {
425
+ return modePart;
426
+ }
427
+ const padding = Math.max(2, termWidth - modePartLen - projectPartLen);
428
+ return modePart + ' '.repeat(padding) + projectPart;
429
+ }
430
+ }
431
+ }
@@ -1,16 +1,20 @@
1
1
  /**
2
+ * @deprecated DEAD CODE — This class is never instantiated. Do NOT modify this file.
3
+ *
4
+ * The active footer/render pipeline is in TerminalUI (src/ui/terminal-ui.ts).
5
+ * TerminalUI has its own inline render loop with numbered sections (1-8),
6
+ * status bar items, mode indicator, etc. All footer changes should go there.
7
+ *
8
+ * This file is kept only because it is type-imported by terminal-renderer.ts
9
+ * and memory-handler.ts. It can be safely deleted once those imports are removed.
10
+ *
11
+ * --- Original description ---
2
12
  * Footer Orchestrator
3
13
  *
4
14
  * Manages all persistent UI elements below the scrolling zone:
5
15
  * - TodoZone (spinner + todo list)
6
16
  * - Queued input display
7
17
  * - InputPrompt
8
- *
9
- * Handles:
10
- * - Coordinated rendering via single render loop
11
- * - Event forwarding from InputPrompt
12
- * - Clearing for scrolling output
13
- * - State management for agent running/idle modes
14
18
  */
15
19
  import { EventEmitter } from 'events';
16
20
  import type { TodoItem, AgentMode } from './types.js';
@@ -40,6 +44,7 @@ export declare class Footer extends EventEmitter {
40
44
  private cursorLineFromBottom;
41
45
  private projectName;
42
46
  private externalRendererEnabled;
47
+ private activeTeamAgent;
43
48
  private readonly renderInterval;
44
49
  private renderTimer;
45
50
  private needsRender;
@@ -77,6 +82,31 @@ export declare class Footer extends EventEmitter {
77
82
  * Get the current project name
78
83
  */
79
84
  getProjectName(): string | null;
85
+ /**
86
+ * Set the active team agent (displayed in footer)
87
+ * Pass null to clear (default agent or no team)
88
+ */
89
+ setActiveTeamAgent(agent: {
90
+ id: string;
91
+ displayName: string;
92
+ mascot: string;
93
+ } | null): void;
94
+ /**
95
+ * Set the callback to get available team agents for $ autocomplete
96
+ */
97
+ setAgentSuggestionsCallback(callback: (() => {
98
+ id: string;
99
+ displayName: string;
100
+ mascot: string;
101
+ }[]) | undefined): void;
102
+ /**
103
+ * Get the active team agent
104
+ */
105
+ getActiveTeamAgent(): {
106
+ id: string;
107
+ displayName: string;
108
+ mascot: string;
109
+ } | null;
80
110
  /**
81
111
  * Update the todo list
82
112
  */
@@ -95,9 +125,26 @@ export declare class Footer extends EventEmitter {
95
125
  */
96
126
  setSpinnerText(text: string | null): void;
97
127
  /**
98
- * Add tokens to the spinner counter
128
+ * Add tokens to the spinner counter (legacy)
99
129
  */
100
130
  addTokens(count: number): void;
131
+ /**
132
+ * Add input/output tokens separately (new API for live display)
133
+ */
134
+ addTokensDetailed(inputTokens: number, outputTokens: number): void;
135
+ /**
136
+ * Get current token counts
137
+ */
138
+ getTokenCounts(): {
139
+ input: number;
140
+ output: number;
141
+ total: number;
142
+ };
143
+ /**
144
+ * Set whether extended thinking mode is active
145
+ * Shows "thinking" indicator in status line
146
+ */
147
+ setThinking(thinking: boolean): void;
101
148
  /**
102
149
  * Called when a subagent starts
103
150
  */
@@ -248,6 +295,26 @@ export declare class Footer extends EventEmitter {
248
295
  * Render mode indicator line
249
296
  */
250
297
  private renderModeIndicator;
298
+ /**
299
+ * Render agent indicator line (only when team agent is active and not default)
300
+ * Returns empty string if no team agent or default agent.
301
+ * Format: "[◈_◈] $arch (Solution Architect) /team to switch"
302
+ */
303
+ private renderAgentIndicator;
304
+ /**
305
+ * Render pending requests indicator (Phase 3b: Background Agents)
306
+ * Shows count of pending requests from background agents if any.
307
+ * Format: "⚠ 2 pending requests [/pending to view]"
308
+ * Returns empty string if no pending requests.
309
+ */
310
+ private renderPendingRequestsIndicator;
311
+ /**
312
+ * Render terminal count indicator (multi-terminal awareness).
313
+ * Shows count of active terminal sessions if more than 1.
314
+ * Format: "+ 2 terminals [/terminals]"
315
+ * Returns empty string if only this terminal is active.
316
+ */
317
+ private renderTerminalCountIndicator;
251
318
  /**
252
319
  * Calculate how many terminal rows a line takes (accounting for wrapping)
253
320
  * Uses unified line-utils for consistent calculation across all components.