@compilr-dev/cli 0.4.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 (634) hide show
  1. package/README.md +254 -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 +134 -4
  7. package/dist/agent.js +345 -166
  8. package/dist/anchors/index.d.ts +9 -0
  9. package/dist/anchors/index.js +9 -0
  10. package/dist/anchors/project-anchors.d.ts +79 -0
  11. package/dist/anchors/project-anchors.js +202 -0
  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/index.d.ts +2 -1
  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.d.ts +13 -0
  28. package/dist/commands-v2/handlers/context.js +533 -0
  29. package/dist/commands-v2/handlers/core.d.ts +14 -0
  30. package/dist/commands-v2/handlers/core.js +290 -0
  31. package/dist/commands-v2/handlers/debug.d.ts +11 -0
  32. package/dist/commands-v2/handlers/debug.js +177 -0
  33. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  34. package/dist/commands-v2/handlers/delegations.js +29 -0
  35. package/dist/commands-v2/handlers/files.d.ts +8 -0
  36. package/dist/commands-v2/handlers/files.js +162 -0
  37. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  38. package/dist/commands-v2/handlers/filter.js +130 -0
  39. package/dist/commands-v2/handlers/games.d.ts +7 -0
  40. package/dist/commands-v2/handlers/games.js +57 -0
  41. package/dist/commands-v2/handlers/index.d.ts +25 -0
  42. package/dist/commands-v2/handlers/index.js +63 -0
  43. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  44. package/dist/commands-v2/handlers/mcp.js +39 -0
  45. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  46. package/dist/commands-v2/handlers/notifications.js +34 -0
  47. package/dist/commands-v2/handlers/project.d.ts +22 -0
  48. package/dist/commands-v2/handlers/project.js +1035 -0
  49. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  50. package/dist/commands-v2/handlers/reset.js +118 -0
  51. package/dist/commands-v2/handlers/session.d.ts +161 -0
  52. package/dist/commands-v2/handlers/session.js +805 -0
  53. package/dist/commands-v2/handlers/settings.d.ts +17 -0
  54. package/dist/commands-v2/handlers/settings.js +417 -0
  55. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  56. package/dist/commands-v2/handlers/tasks.js +36 -0
  57. package/dist/commands-v2/handlers/team.d.ts +9 -0
  58. package/dist/commands-v2/handlers/team.js +549 -0
  59. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  60. package/dist/commands-v2/handlers/terminals.js +34 -0
  61. package/dist/commands-v2/index.d.ts +14 -0
  62. package/dist/commands-v2/index.js +18 -0
  63. package/dist/commands-v2/registry.d.ts +52 -0
  64. package/dist/commands-v2/registry.js +114 -0
  65. package/dist/commands-v2/types.d.ts +153 -0
  66. package/dist/commands-v2/types.js +7 -0
  67. package/dist/commands.js +123 -7
  68. package/dist/compilr-diff-companion.vsix +0 -0
  69. package/dist/db/index.js +98 -4
  70. package/dist/db/repositories/document-repository.d.ts +2 -0
  71. package/dist/db/repositories/document-repository.js +5 -1
  72. package/dist/db/repositories/index.d.ts +2 -0
  73. package/dist/db/repositories/index.js +1 -0
  74. package/dist/db/repositories/plan-repository.d.ts +101 -0
  75. package/dist/db/repositories/plan-repository.js +275 -0
  76. package/dist/db/repositories/project-repository.d.ts +6 -0
  77. package/dist/db/repositories/project-repository.js +41 -0
  78. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  79. package/dist/db/repositories/work-item-repository.js +69 -4
  80. package/dist/db/schema.d.ts +40 -3
  81. package/dist/db/schema.js +66 -3
  82. package/dist/episodes/index.d.ts +20 -0
  83. package/dist/episodes/index.js +27 -0
  84. package/dist/episodes/recorder.d.ts +51 -0
  85. package/dist/episodes/recorder.js +195 -0
  86. package/dist/episodes/significant-work.d.ts +21 -0
  87. package/dist/episodes/significant-work.js +56 -0
  88. package/dist/episodes/store.d.ts +38 -0
  89. package/dist/episodes/store.js +199 -0
  90. package/dist/episodes/types.d.ts +35 -0
  91. package/dist/episodes/types.js +6 -0
  92. package/dist/episodes/work-at-risk.d.ts +12 -0
  93. package/dist/episodes/work-at-risk.js +38 -0
  94. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  95. package/dist/episodes/work-summary-anchor.js +73 -0
  96. package/dist/games/coins.d.ts +66 -0
  97. package/dist/games/coins.js +165 -0
  98. package/dist/games/game-base.d.ts +84 -0
  99. package/dist/games/game-base.js +204 -0
  100. package/dist/games/index.d.ts +16 -0
  101. package/dist/games/index.js +49 -0
  102. package/dist/games/scores.d.ts +69 -0
  103. package/dist/games/scores.js +191 -0
  104. package/dist/games/tetris/board.d.ts +59 -0
  105. package/dist/games/tetris/board.js +170 -0
  106. package/dist/games/tetris/index.d.ts +109 -0
  107. package/dist/games/tetris/index.js +610 -0
  108. package/dist/games/tetris/pieces.d.ts +44 -0
  109. package/dist/games/tetris/pieces.js +271 -0
  110. package/dist/games/tetris/renderer.d.ts +26 -0
  111. package/dist/games/tetris/renderer.js +77 -0
  112. package/dist/guide/guide-content.d.ts +23 -0
  113. package/dist/guide/guide-content.js +196 -0
  114. package/dist/guide/index.d.ts +8 -0
  115. package/dist/guide/index.js +7 -0
  116. package/dist/guide/shared-content.d.ts +37 -0
  117. package/dist/guide/shared-content.js +1272 -0
  118. package/dist/guide/tutorial-helpers.d.ts +57 -0
  119. package/dist/guide/tutorial-helpers.js +147 -0
  120. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  121. package/dist/handlers/ask-user-handlers.js +104 -0
  122. package/dist/handlers/delegation-handlers.d.ts +34 -0
  123. package/dist/handlers/delegation-handlers.js +291 -0
  124. package/dist/handlers/permission-handler.d.ts +30 -0
  125. package/dist/handlers/permission-handler.js +205 -0
  126. package/dist/index.d.ts +11 -1
  127. package/dist/index.js +615 -179
  128. package/dist/input-handlers/index.d.ts +7 -0
  129. package/dist/input-handlers/index.js +7 -0
  130. package/dist/input-handlers/memory-handler.d.ts +26 -0
  131. package/dist/input-handlers/memory-handler.js +69 -0
  132. package/dist/models/index.d.ts +10 -0
  133. package/dist/models/index.js +12 -0
  134. package/dist/models/model-registry.d.ts +38 -0
  135. package/dist/models/model-registry.js +69 -0
  136. package/dist/models/model-tiers.d.ts +28 -0
  137. package/dist/models/model-tiers.js +71 -0
  138. package/dist/models/model-validation.d.ts +25 -0
  139. package/dist/models/model-validation.js +291 -0
  140. package/dist/models/ollama-models.d.ts +73 -0
  141. package/dist/models/ollama-models.js +178 -0
  142. package/dist/models/provider-types.d.ts +6 -0
  143. package/dist/models/provider-types.js +1 -0
  144. package/dist/models/providers.d.ts +35 -0
  145. package/dist/models/providers.js +58 -0
  146. package/dist/models/types.d.ts +4 -0
  147. package/dist/models/types.js +4 -0
  148. package/dist/multi-agent/activity.d.ts +21 -0
  149. package/dist/multi-agent/activity.js +34 -0
  150. package/dist/multi-agent/agent-selection.d.ts +55 -0
  151. package/dist/multi-agent/agent-selection.js +90 -0
  152. package/dist/multi-agent/artifacts.d.ts +197 -0
  153. package/dist/multi-agent/artifacts.js +379 -0
  154. package/dist/multi-agent/checkpointer.d.ts +138 -0
  155. package/dist/multi-agent/checkpointer.js +471 -0
  156. package/dist/multi-agent/collision-utils.d.ts +16 -0
  157. package/dist/multi-agent/collision-utils.js +28 -0
  158. package/dist/multi-agent/context-resolver.d.ts +97 -0
  159. package/dist/multi-agent/context-resolver.js +316 -0
  160. package/dist/multi-agent/custom-agents.d.ts +83 -0
  161. package/dist/multi-agent/custom-agents.js +227 -0
  162. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  163. package/dist/multi-agent/delegation-tracker.js +243 -0
  164. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  165. package/dist/multi-agent/file-lock-hook.js +97 -0
  166. package/dist/multi-agent/file-locks.d.ts +58 -0
  167. package/dist/multi-agent/file-locks.js +194 -0
  168. package/dist/multi-agent/index.d.ts +24 -0
  169. package/dist/multi-agent/index.js +30 -0
  170. package/dist/multi-agent/mention-parser.d.ts +64 -0
  171. package/dist/multi-agent/mention-parser.js +146 -0
  172. package/dist/multi-agent/notification-manager.d.ts +84 -0
  173. package/dist/multi-agent/notification-manager.js +224 -0
  174. package/dist/multi-agent/pending-requests.d.ts +122 -0
  175. package/dist/multi-agent/pending-requests.js +155 -0
  176. package/dist/multi-agent/session-registry.d.ts +139 -0
  177. package/dist/multi-agent/session-registry.js +514 -0
  178. package/dist/multi-agent/shared-context.d.ts +293 -0
  179. package/dist/multi-agent/shared-context.js +671 -0
  180. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  181. package/dist/multi-agent/skill-requirements.js +178 -0
  182. package/dist/multi-agent/task-assignment.d.ts +69 -0
  183. package/dist/multi-agent/task-assignment.js +123 -0
  184. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  185. package/dist/multi-agent/task-suggestion.js +72 -0
  186. package/dist/multi-agent/team-agent.d.ts +201 -0
  187. package/dist/multi-agent/team-agent.js +488 -0
  188. package/dist/multi-agent/team.d.ts +286 -0
  189. package/dist/multi-agent/team.js +610 -0
  190. package/dist/multi-agent/tool-config.d.ts +110 -0
  191. package/dist/multi-agent/tool-config.js +661 -0
  192. package/dist/multi-agent/types.d.ts +211 -0
  193. package/dist/multi-agent/types.js +617 -0
  194. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  195. package/dist/prompts/plan-mode-prompt.js +95 -0
  196. package/dist/repl-helpers.d.ts +63 -0
  197. package/dist/repl-helpers.js +319 -0
  198. package/dist/repl-v2.d.ts +554 -0
  199. package/dist/repl-v2.js +3286 -0
  200. package/dist/session/index.d.ts +6 -0
  201. package/dist/session/index.js +6 -0
  202. package/dist/session/project-session-manager.d.ts +158 -0
  203. package/dist/session/project-session-manager.js +650 -0
  204. package/dist/settings/index.d.ts +156 -13
  205. package/dist/settings/index.js +377 -24
  206. package/dist/settings/mcp-config.d.ts +76 -0
  207. package/dist/settings/mcp-config.js +143 -0
  208. package/dist/settings/paths.d.ts +114 -0
  209. package/dist/settings/paths.js +270 -0
  210. package/dist/shared-handlers.d.ts +62 -0
  211. package/dist/shared-handlers.js +48 -0
  212. package/dist/system-prompt/builder.d.ts +5 -0
  213. package/dist/system-prompt/builder.js +4 -0
  214. package/dist/system-prompt/index.d.ts +18 -0
  215. package/dist/system-prompt/index.js +18 -0
  216. package/dist/system-prompt/modules.d.ts +5 -0
  217. package/dist/system-prompt/modules.js +4 -0
  218. package/dist/tabbed-menu.js +2 -1
  219. package/dist/templates/compilr-md-import.d.ts +16 -0
  220. package/dist/templates/compilr-md-import.js +241 -0
  221. package/dist/templates/compilr-md.js +10 -58
  222. package/dist/templates/config-json.d.ts +1 -25
  223. package/dist/templates/index.d.ts +2 -0
  224. package/dist/templates/index.js +35 -75
  225. package/dist/themes/colors.js +3 -1
  226. package/dist/themes/registry.d.ts +5 -36
  227. package/dist/themes/registry.js +11 -95
  228. package/dist/themes/types.d.ts +3 -38
  229. package/dist/themes/types.js +2 -2
  230. package/dist/tool-names.d.ts +108 -0
  231. package/dist/tool-names.js +227 -0
  232. package/dist/tools/anchor-tools.d.ts +31 -0
  233. package/dist/tools/anchor-tools.js +255 -0
  234. package/dist/tools/artifact-tools.d.ts +42 -0
  235. package/dist/tools/artifact-tools.js +328 -0
  236. package/dist/tools/ask-user-simple.d.ts +1 -1
  237. package/dist/tools/ask-user-simple.js +2 -1
  238. package/dist/tools/ask-user.d.ts +1 -1
  239. package/dist/tools/ask-user.js +2 -1
  240. package/dist/tools/backlog-wrappers.d.ts +56 -0
  241. package/dist/tools/backlog-wrappers.js +353 -0
  242. package/dist/tools/backlog.d.ts +2 -2
  243. package/dist/tools/backlog.js +2 -2
  244. package/dist/tools/db-tools.d.ts +12 -0
  245. package/dist/tools/db-tools.js +14 -0
  246. package/dist/tools/delegate-background.d.ts +27 -0
  247. package/dist/tools/delegate-background.js +115 -0
  248. package/dist/tools/delegate.d.ts +22 -0
  249. package/dist/tools/delegate.js +97 -0
  250. package/dist/tools/delegation-status.d.ts +16 -0
  251. package/dist/tools/delegation-status.js +128 -0
  252. package/dist/tools/document-db.d.ts +43 -0
  253. package/dist/tools/document-db.js +220 -0
  254. package/dist/tools/guide-tool.d.ts +12 -0
  255. package/dist/tools/guide-tool.js +59 -0
  256. package/dist/tools/handoff.d.ts +25 -0
  257. package/dist/tools/handoff.js +99 -0
  258. package/dist/tools/meta-tools.d.ts +26 -0
  259. package/dist/tools/meta-tools.js +47 -0
  260. package/dist/tools/plan-tools.d.ts +54 -0
  261. package/dist/tools/plan-tools.js +338 -0
  262. package/dist/tools/platform-adapter.d.ts +29 -0
  263. package/dist/tools/platform-adapter.js +394 -0
  264. package/dist/tools/project-db.d.ts +34 -0
  265. package/dist/tools/project-db.js +39 -0
  266. package/dist/tools/recall-work-tool.d.ts +18 -0
  267. package/dist/tools/recall-work-tool.js +82 -0
  268. package/dist/tools/workitem-db.d.ts +135 -0
  269. package/dist/tools/workitem-db.js +730 -0
  270. package/dist/tools.d.ts +67 -2
  271. package/dist/tools.js +238 -38
  272. package/dist/ui/ask-user-overlay.d.ts +2 -2
  273. package/dist/ui/ask-user-overlay.js +443 -535
  274. package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
  275. package/dist/ui/ask-user-simple-overlay.js +182 -209
  276. package/dist/ui/autocomplete-controller.d.ts +42 -0
  277. package/dist/ui/autocomplete-controller.js +384 -0
  278. package/dist/ui/base/index.d.ts +26 -0
  279. package/dist/ui/base/index.js +33 -0
  280. package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
  281. package/dist/ui/base/inline-overlay-utils.js +320 -0
  282. package/dist/ui/base/inline-overlay.d.ts +159 -0
  283. package/dist/ui/base/inline-overlay.js +257 -0
  284. package/dist/ui/base/key-utils.d.ts +15 -0
  285. package/dist/ui/base/key-utils.js +30 -0
  286. package/dist/ui/base/overlay-base-v2.d.ts +203 -0
  287. package/dist/ui/base/overlay-base-v2.js +260 -0
  288. package/dist/ui/base/overlay-base.d.ts +156 -0
  289. package/dist/ui/base/overlay-base.js +238 -0
  290. package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
  291. package/dist/ui/base/overlay-lifecycle.js +159 -0
  292. package/dist/ui/base/overlay-types.d.ts +185 -0
  293. package/dist/ui/base/overlay-types.js +7 -0
  294. package/dist/ui/base/render-utils.d.ts +27 -0
  295. package/dist/ui/base/render-utils.js +36 -0
  296. package/dist/ui/base/screen-stack.d.ts +148 -0
  297. package/dist/ui/base/screen-stack.js +184 -0
  298. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +118 -0
  299. package/dist/ui/base/tabbed-list-overlay-v2.js +335 -0
  300. package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
  301. package/dist/ui/base/tabbed-list-overlay.js +369 -0
  302. package/dist/ui/constants/labels.d.ts +14 -0
  303. package/dist/ui/constants/labels.js +51 -0
  304. package/dist/ui/conversation-store.d.ts +55 -0
  305. package/dist/ui/conversation-store.js +107 -0
  306. package/dist/ui/conversation.d.ts +75 -4
  307. package/dist/ui/conversation.js +376 -165
  308. package/dist/ui/diff.d.ts +7 -1
  309. package/dist/ui/diff.js +85 -48
  310. package/dist/ui/ephemeral.d.ts +1 -1
  311. package/dist/ui/ephemeral.js +4 -10
  312. package/dist/ui/features/index.d.ts +34 -0
  313. package/dist/ui/features/index.js +34 -0
  314. package/dist/ui/features/input-feature.d.ts +85 -0
  315. package/dist/ui/features/input-feature.js +238 -0
  316. package/dist/ui/features/list-feature.d.ts +155 -0
  317. package/dist/ui/features/list-feature.js +244 -0
  318. package/dist/ui/features/pagination-feature.d.ts +154 -0
  319. package/dist/ui/features/pagination-feature.js +238 -0
  320. package/dist/ui/features/search-feature.d.ts +148 -0
  321. package/dist/ui/features/search-feature.js +185 -0
  322. package/dist/ui/features/tab-feature.d.ts +194 -0
  323. package/dist/ui/features/tab-feature.js +307 -0
  324. package/dist/ui/file-autocomplete.d.ts +24 -0
  325. package/dist/ui/file-autocomplete.js +56 -0
  326. package/dist/ui/footer-renderer.d.ts +69 -0
  327. package/dist/ui/footer-renderer.js +431 -0
  328. package/dist/ui/footer.d.ts +181 -7
  329. package/dist/ui/footer.js +523 -74
  330. package/dist/ui/guardrail-overlay.d.ts +29 -0
  331. package/dist/ui/guardrail-overlay.js +145 -0
  332. package/dist/ui/index.d.ts +1 -1
  333. package/dist/ui/index.js +1 -3
  334. package/dist/ui/input-controller.d.ts +51 -0
  335. package/dist/ui/input-controller.js +176 -0
  336. package/dist/ui/input-prompt.d.ts +135 -33
  337. package/dist/ui/input-prompt.js +728 -337
  338. package/dist/ui/iteration-limit-overlay.d.ts +2 -2
  339. package/dist/ui/iteration-limit-overlay.js +92 -128
  340. package/dist/ui/keyboard-handler.d.ts +57 -0
  341. package/dist/ui/keyboard-handler.js +557 -0
  342. package/dist/ui/keys-overlay.d.ts +1 -0
  343. package/dist/ui/keys-overlay.js +203 -141
  344. package/dist/ui/line-utils.d.ts +88 -0
  345. package/dist/ui/line-utils.js +150 -0
  346. package/dist/ui/live-region-facade.d.ts +42 -0
  347. package/dist/ui/live-region-facade.js +205 -0
  348. package/dist/ui/live-region.d.ts +157 -0
  349. package/dist/ui/live-region.js +379 -0
  350. package/dist/ui/mascot/expressions.d.ts +32 -0
  351. package/dist/ui/mascot/expressions.js +213 -0
  352. package/dist/ui/mascot/index.d.ts +8 -0
  353. package/dist/ui/mascot/index.js +8 -0
  354. package/dist/ui/mascot/renderer.d.ts +19 -0
  355. package/dist/ui/mascot/renderer.js +132 -0
  356. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  357. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  358. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  359. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  360. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  361. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  362. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  363. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  364. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  365. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  366. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  367. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  368. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  369. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  370. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  371. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  372. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  373. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  374. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  375. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  376. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  377. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  378. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  379. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  380. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  381. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  382. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  383. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  384. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  385. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  386. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  387. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  388. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  389. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  390. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  391. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  392. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  393. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  394. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  395. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  396. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  397. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  398. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  399. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  400. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  401. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  402. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  403. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  404. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  405. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  406. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  407. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  408. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  409. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  410. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  411. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  412. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  413. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  414. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  415. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  416. package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
  417. package/dist/ui/overlay/impl/agents-overlay-v2.js +814 -0
  418. package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
  419. package/dist/ui/overlay/impl/anchors-overlay-v2.js +749 -0
  420. package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
  421. package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
  422. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  423. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  424. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  425. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  426. package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
  427. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +581 -0
  428. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
  429. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
  430. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  431. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  432. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +52 -0
  433. package/dist/ui/overlay/impl/backlog-overlay-v2.js +681 -0
  434. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  435. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  436. package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
  437. package/dist/ui/overlay/impl/commands-overlay-v2.js +439 -0
  438. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +111 -0
  439. package/dist/ui/overlay/impl/config-overlay-v2.js +718 -0
  440. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  441. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  442. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +57 -0
  443. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +382 -0
  444. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  445. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  446. package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
  447. package/dist/ui/overlay/impl/docs-overlay-v2.js +117 -0
  448. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +84 -0
  449. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1112 -0
  450. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  451. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  452. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  453. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  454. package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
  455. package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
  456. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +57 -0
  457. package/dist/ui/overlay/impl/help-overlay-v2.js +287 -0
  458. package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
  459. package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
  460. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
  461. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
  462. package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
  463. package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
  464. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  465. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  466. package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
  467. package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
  468. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  469. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  470. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +93 -0
  471. package/dist/ui/overlay/impl/model-overlay-v2.js +1143 -0
  472. package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
  473. package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
  474. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +108 -0
  475. package/dist/ui/overlay/impl/new-overlay-v2.js +1243 -0
  476. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  477. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  478. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  479. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  480. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  481. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  482. package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
  483. package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
  484. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  485. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  486. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  487. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  488. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  489. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  490. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +37 -0
  491. package/dist/ui/overlay/impl/projects-overlay-v2.js +733 -0
  492. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  493. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  494. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  495. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  496. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  497. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  498. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  499. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  500. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  501. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  502. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  503. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  504. package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
  505. package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
  506. package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
  507. package/dist/ui/overlay/impl/tools-overlay-v2.js +214 -0
  508. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +45 -0
  509. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +212 -0
  510. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
  511. package/dist/ui/overlay/impl/workflow-overlay-v2.js +641 -0
  512. package/dist/ui/overlay/index.d.ts +52 -0
  513. package/dist/ui/overlay/index.js +54 -0
  514. package/dist/ui/overlay/key-utils.d.ts +6 -0
  515. package/dist/ui/overlay/key-utils.js +6 -0
  516. package/dist/ui/overlay/types.d.ts +140 -0
  517. package/dist/ui/overlay/types.js +22 -0
  518. package/dist/ui/overlay-manager.d.ts +43 -0
  519. package/dist/ui/overlay-manager.js +238 -0
  520. package/dist/ui/overlays.d.ts +0 -4
  521. package/dist/ui/overlays.js +4 -460
  522. package/dist/ui/permission-overlay.d.ts +1 -1
  523. package/dist/ui/permission-overlay.js +189 -300
  524. package/dist/ui/providers/types.d.ts +178 -0
  525. package/dist/ui/providers/types.js +9 -0
  526. package/dist/ui/render-modes.d.ts +36 -0
  527. package/dist/ui/render-modes.js +44 -0
  528. package/dist/ui/startup-menu.d.ts +36 -0
  529. package/dist/ui/startup-menu.js +236 -0
  530. package/dist/ui/status-bar-controller.d.ts +33 -0
  531. package/dist/ui/status-bar-controller.js +99 -0
  532. package/dist/ui/subagent-renderer.d.ts +117 -0
  533. package/dist/ui/subagent-renderer.js +318 -0
  534. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  535. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  536. package/dist/ui/terminal-codes.d.ts +94 -0
  537. package/dist/ui/terminal-codes.js +124 -0
  538. package/dist/ui/terminal-line-builders.d.ts +17 -0
  539. package/dist/ui/terminal-line-builders.js +42 -0
  540. package/dist/ui/terminal-render-item.d.ts +16 -0
  541. package/dist/ui/terminal-render-item.js +267 -0
  542. package/dist/ui/terminal-renderer.d.ts +220 -0
  543. package/dist/ui/terminal-renderer.js +750 -0
  544. package/dist/ui/terminal-types.d.ts +179 -0
  545. package/dist/ui/terminal-types.js +34 -0
  546. package/dist/ui/terminal-ui.d.ts +331 -0
  547. package/dist/ui/terminal-ui.js +819 -0
  548. package/dist/ui/terminal.d.ts +20 -0
  549. package/dist/ui/terminal.js +72 -0
  550. package/dist/ui/todo-zone.d.ts +19 -1
  551. package/dist/ui/todo-zone.js +124 -38
  552. package/dist/ui/tool-formatters.d.ts +16 -0
  553. package/dist/ui/tool-formatters.js +1027 -0
  554. package/dist/ui/turn-metrics.d.ts +56 -0
  555. package/dist/ui/turn-metrics.js +75 -0
  556. package/dist/ui/types.d.ts +28 -0
  557. package/dist/ui/types.js +1 -0
  558. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  559. package/dist/ui/vscode-diff-ipc.js +385 -0
  560. package/dist/utils/credentials.d.ts +24 -5
  561. package/dist/utils/credentials.js +123 -9
  562. package/dist/utils/debug-log.d.ts +28 -0
  563. package/dist/utils/debug-log.js +57 -0
  564. package/dist/utils/format-tokens.d.ts +13 -0
  565. package/dist/utils/format-tokens.js +18 -0
  566. package/dist/utils/git-config.d.ts +26 -0
  567. package/dist/utils/git-config.js +54 -0
  568. package/dist/utils/message-utils.d.ts +61 -0
  569. package/dist/utils/message-utils.js +72 -0
  570. package/dist/utils/model-tiers.d.ts +8 -1
  571. package/dist/utils/model-tiers.js +39 -17
  572. package/dist/utils/open-browser.d.ts +5 -0
  573. package/dist/utils/open-browser.js +32 -0
  574. package/dist/utils/path-safety.d.ts +56 -0
  575. package/dist/utils/path-safety.js +240 -0
  576. package/dist/utils/project-detection.d.ts +58 -0
  577. package/dist/utils/project-detection.js +424 -0
  578. package/dist/utils/project-memory.js +2 -1
  579. package/dist/utils/project-status.d.ts +2 -2
  580. package/dist/utils/startup-perf.d.ts +18 -0
  581. package/dist/utils/startup-perf.js +60 -0
  582. package/dist/utils/token-tracker.d.ts +62 -0
  583. package/dist/utils/token-tracker.js +150 -0
  584. package/dist/utils/token-types.d.ts +23 -0
  585. package/dist/utils/token-types.js +18 -0
  586. package/dist/utils/types/config-types.d.ts +32 -0
  587. package/dist/utils/types/config-types.js +8 -0
  588. package/dist/utils/update-checker.d.ts +28 -0
  589. package/dist/utils/update-checker.js +106 -0
  590. package/dist/utils/version.d.ts +7 -0
  591. package/dist/utils/version.js +10 -0
  592. package/dist/utils/vscode-detect.d.ts +39 -0
  593. package/dist/utils/vscode-detect.js +137 -0
  594. package/dist/workflow/guided-mode-injector.d.ts +42 -0
  595. package/dist/workflow/guided-mode-injector.js +191 -0
  596. package/dist/workflow/index.d.ts +8 -0
  597. package/dist/workflow/index.js +8 -0
  598. package/dist/workflow/step-criteria.d.ts +62 -0
  599. package/dist/workflow/step-criteria.js +150 -0
  600. package/dist/workflow/step-tracker.d.ts +92 -0
  601. package/dist/workflow/step-tracker.js +141 -0
  602. package/package.json +32 -12
  603. package/dist/index.old.d.ts +0 -7
  604. package/dist/index.old.js +0 -1014
  605. package/dist/repl.d.ts +0 -121
  606. package/dist/repl.js +0 -1878
  607. package/dist/templates/claude-md.d.ts +0 -7
  608. package/dist/templates/claude-md.js +0 -189
  609. package/dist/test-autocomplete.d.ts +0 -7
  610. package/dist/test-autocomplete.js +0 -85
  611. package/dist/test-tabbed-menu.d.ts +0 -7
  612. package/dist/test-tabbed-menu.js +0 -25
  613. package/dist/tool-selector.d.ts +0 -71
  614. package/dist/tool-selector.js +0 -184
  615. package/dist/ui/agents-overlay.d.ts +0 -12
  616. package/dist/ui/agents-overlay.js +0 -501
  617. package/dist/ui/arch-type-overlay.d.ts +0 -20
  618. package/dist/ui/arch-type-overlay.js +0 -229
  619. package/dist/ui/backlog-overlay.d.ts +0 -17
  620. package/dist/ui/backlog-overlay.js +0 -786
  621. package/dist/ui/commands-overlay.d.ts +0 -11
  622. package/dist/ui/commands-overlay.js +0 -410
  623. package/dist/ui/config-overlay.d.ts +0 -34
  624. package/dist/ui/config-overlay.js +0 -977
  625. package/dist/ui/init-overlay.d.ts +0 -24
  626. package/dist/ui/init-overlay.js +0 -525
  627. package/dist/ui/input-prompt-v2.d.ts +0 -179
  628. package/dist/ui/input-prompt-v2.js +0 -991
  629. package/dist/ui/model-warning-overlay.d.ts +0 -30
  630. package/dist/ui/model-warning-overlay.js +0 -171
  631. package/dist/ui/tools-overlay.d.ts +0 -26
  632. package/dist/ui/tools-overlay.js +0 -278
  633. package/dist/ui/tutorial-overlay.d.ts +0 -10
  634. package/dist/ui/tutorial-overlay.js +0 -936
@@ -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';
@@ -30,12 +34,17 @@ export interface FooterOptions {
30
34
  export declare class Footer extends EventEmitter {
31
35
  private readonly todoZone;
32
36
  private readonly inputPrompt;
37
+ private readonly subagentRenderer;
33
38
  private agentRunning;
34
39
  private mode;
35
40
  private lastRenderHeight;
36
41
  private isRunning;
37
42
  private isPaused;
43
+ private isRendering;
38
44
  private cursorLineFromBottom;
45
+ private projectName;
46
+ private externalRendererEnabled;
47
+ private activeTeamAgent;
39
48
  private readonly renderInterval;
40
49
  private renderTimer;
41
50
  private needsRender;
@@ -65,6 +74,39 @@ export declare class Footer extends EventEmitter {
65
74
  * Get the current mode
66
75
  */
67
76
  getMode(): AgentMode;
77
+ /**
78
+ * Set the current project name (displayed in footer)
79
+ */
80
+ setProjectName(name: string | null): void;
81
+ /**
82
+ * Get the current project name
83
+ */
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;
68
110
  /**
69
111
  * Update the todo list
70
112
  */
@@ -83,9 +125,69 @@ export declare class Footer extends EventEmitter {
83
125
  */
84
126
  setSpinnerText(text: string | null): void;
85
127
  /**
86
- * Add tokens to the spinner counter
128
+ * Add tokens to the spinner counter (legacy)
87
129
  */
88
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;
148
+ /**
149
+ * Called when a subagent starts
150
+ */
151
+ onSubagentStart(agentId: string, agentType: string, description: string): void;
152
+ /**
153
+ * Called when a subagent uses a tool
154
+ */
155
+ onSubagentToolUse(agentId: string, toolName: string, summary?: string): void;
156
+ /**
157
+ * Called when a subagent completes
158
+ *
159
+ * CRITICAL (legacy mode only): We must pause rendering immediately to prevent a race condition.
160
+ * The render loop could fire between onSubagentEnd and clearForOutput, which would:
161
+ * 1. See the subagent as 'done'
162
+ * 2. Render with 0 subagent lines
163
+ * 3. Update lastRenderHeight to a smaller value
164
+ * 4. Then clearForOutput would not clear enough lines → ghost lines!
165
+ *
166
+ * In external renderer mode: No pause needed since the internal render loop is disabled.
167
+ */
168
+ onSubagentEnd(agentId: string, success: boolean, tokenCount: number, error?: string): void;
169
+ /**
170
+ * Toggle expanded view for subagents (Ctrl+O)
171
+ */
172
+ toggleSubagentExpand(): void;
173
+ /**
174
+ * Check if there are active subagents
175
+ */
176
+ hasActiveSubagents(): boolean;
177
+ /**
178
+ * Clear subagent tracking (after completion displayed)
179
+ */
180
+ clearSubagents(): void;
181
+ /**
182
+ * Get the last subagent's stats before clearing
183
+ */
184
+ getLastSubagentStats(): {
185
+ type: string;
186
+ description: string;
187
+ toolCount: number;
188
+ tokenCount: number;
189
+ durationMs: number;
190
+ } | null;
89
191
  /**
90
192
  * Get queued inputs
91
193
  */
@@ -105,12 +207,26 @@ export declare class Footer extends EventEmitter {
105
207
  /**
106
208
  * Clear footer before scrolling output
107
209
  * Call this before writing to the scrolling zone
210
+ * Pauses interval rendering to prevent ghost lines during output
211
+ *
212
+ * When external renderer is enabled (scroll region mode):
213
+ * - Footer doesn't need clearing (it's in a separate scroll region)
214
+ * - Just mark that we need a re-render
108
215
  */
109
216
  clearForOutput(): void;
110
217
  /**
111
218
  * Force an immediate render
219
+ * Resumes interval rendering after clearForOutput()
220
+ *
221
+ * When external renderer is enabled (scroll region mode):
222
+ * - Just mark that we need a re-render (TerminalRenderer's loop will pick it up)
112
223
  */
113
224
  forceRender(): void;
225
+ /**
226
+ * Restart input prompt after a command completes
227
+ * Use this for non-overlay commands where finishInput() stopped the prompt
228
+ */
229
+ restartInput(): void;
114
230
  /**
115
231
  * Pause footer completely (for overlays)
116
232
  * Stops render loop, input capture, and animation
@@ -125,6 +241,37 @@ export declare class Footer extends EventEmitter {
125
241
  * Get the height of last render
126
242
  */
127
243
  getLastRenderHeight(): number;
244
+ /**
245
+ * Get all footer lines for rendering (for TerminalRenderer integration)
246
+ * Returns the lines WITHOUT writing to terminal
247
+ */
248
+ getFooterLines(): string[];
249
+ /**
250
+ * Get cursor position within footer content (for TerminalRenderer)
251
+ * Returns { row, col } where row is 0-indexed from start of footer lines
252
+ */
253
+ getFooterCursorPosition(): {
254
+ row: number;
255
+ col: number;
256
+ };
257
+ /**
258
+ * Enable external renderer mode (TerminalRenderer manages rendering)
259
+ * When enabled:
260
+ * - Footer's internal render loop is disabled
261
+ * - Input capture remains active
262
+ * - Event forwarding remains active
263
+ * - TerminalRenderer calls getFooterLines() and renders
264
+ */
265
+ setExternalRenderer(enabled: boolean): void;
266
+ /**
267
+ * Check if external renderer is enabled
268
+ */
269
+ isExternalRendererEnabled(): boolean;
270
+ /**
271
+ * Request a render from external renderer
272
+ * Call this to notify TerminalRenderer that footer needs re-rendering
273
+ */
274
+ requestExternalRender(): void;
128
275
  /**
129
276
  * Refresh the prompt with current theme colors
130
277
  * Call after theme changes to apply new colors immediately
@@ -132,6 +279,12 @@ export declare class Footer extends EventEmitter {
132
279
  refreshPrompt(): void;
133
280
  /**
134
281
  * Clear the footer area
282
+ *
283
+ * Strategy: Simply move to the top of the CURRENT footer and clear to end.
284
+ * - When footer SHRINKS: clearToEndOfScreen handles the extra lines
285
+ * - When footer GROWS: terminal scrolls naturally when we write more lines
286
+ *
287
+ * We NEVER move up into the scrolling zone - that would eat content!
135
288
  */
136
289
  private clear;
137
290
  /**
@@ -142,8 +295,29 @@ export declare class Footer extends EventEmitter {
142
295
  * Render mode indicator line
143
296
  */
144
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;
145
318
  /**
146
319
  * Calculate how many terminal rows a line takes (accounting for wrapping)
320
+ * Uses unified line-utils for consistent calculation across all components.
147
321
  */
148
322
  private getTerminalRowsForLine;
149
323
  /**