@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,819 @@
1
+ /**
2
+ * TerminalUI - Single Renderer for Terminal Applications
3
+ *
4
+ * Single point of control for all terminal UI:
5
+ * - Owns all rendering decisions (when to clear, when to render)
6
+ * - Owns all UI state (agentRunning, todos, currentTool, etc.)
7
+ * - Provides output methods that handle clear/render automatically
8
+ * - Manages overlays (render, input routing)
9
+ * - REPL emits events, doesn't manage rendering timing
10
+ *
11
+ * Key principles:
12
+ * - NO scroll regions (preserves terminal scrollback)
13
+ * - Deterministic render cycle
14
+ * - All output goes through TerminalUI (no external console.log)
15
+ */
16
+ import { EventEmitter } from 'events';
17
+ import { getVisibleLength } from './line-utils.js';
18
+ import { getStyles } from '../themes/index.js';
19
+ import { renderItem } from './terminal-render-item.js';
20
+ import { TurnMetrics } from './turn-metrics.js';
21
+ import { StatusBarController } from './status-bar-controller.js';
22
+ import { ConversationStore } from './conversation-store.js';
23
+ import { AutocompleteController } from './autocomplete-controller.js';
24
+ import { InputController } from './input-controller.js';
25
+ import { LiveRegionFacade } from './live-region-facade.js';
26
+ import { OverlayManager } from './overlay-manager.js';
27
+ import { FooterRenderer } from './footer-renderer.js';
28
+ import { KeyboardHandler } from './keyboard-handler.js';
29
+ import { DEFAULT_TERMINAL_UI_CONFIG, } from './terminal-types.js';
30
+ export { DEFAULT_TERMINAL_UI_CONFIG, MASCOT } from './terminal-types.js';
31
+ import { getPendingRequestsManager } from '../multi-agent/index.js';
32
+ import { getSessionRegistry } from '../multi-agent/session-registry.js';
33
+ import { getNotificationManager } from '../multi-agent/notification-manager.js';
34
+ // =============================================================================
35
+ // Footer V2 Class
36
+ // =============================================================================
37
+ export class TerminalUI extends EventEmitter {
38
+ // Configuration
39
+ promptPrefix;
40
+ promptPrefixLen;
41
+ config;
42
+ // Conversation history, restored history, and filtering
43
+ conversation = new ConversationStore();
44
+ // Input state (delegated to InputController)
45
+ input = new InputController();
46
+ get lines() { return this.input.lines; }
47
+ set lines(v) { this.input.lines = v; }
48
+ get currentLine() { return this.input.currentLine; }
49
+ set currentLine(v) { this.input.currentLine = v; }
50
+ get cursorPos() { return this.input.cursorPos; }
51
+ set cursorPos(v) { this.input.cursorPos = v; }
52
+ get suggestion() { return this.input.suggestion; }
53
+ set suggestion(v) { this.input.suggestion = v; }
54
+ get queuedInputs() { return this.input.queuedInputs; }
55
+ set queuedInputs(v) { this.input.queuedInputs = v; }
56
+ mode;
57
+ projectName = null;
58
+ todos = [];
59
+ // Plan mode state
60
+ activePlanId = null;
61
+ activePlanName = null;
62
+ spinnerText = null;
63
+ agentRunning = false;
64
+ agentMessageQueue = [];
65
+ currentTool = null;
66
+ // Per-turn token and tool call tracking
67
+ turnMetrics = new TurnMetrics();
68
+ // LiveRegion for running tools (bash, subagents)
69
+ live = new LiveRegionFacade({
70
+ requestRender: () => { this.needsRender = true; },
71
+ print: (item) => { this.print(item); },
72
+ emit: (event, ...args) => { this.emit(event, ...args); },
73
+ setSpinnerText: (text) => { this.spinnerText = text; },
74
+ });
75
+ // Autocomplete controller (command, file, agent)
76
+ ac = new AutocompleteController();
77
+ // Render tracking
78
+ isRunning = false;
79
+ isPaused = false;
80
+ renderTimer = null;
81
+ needsRender = false;
82
+ // Active team agent (for multi-agent footer display)
83
+ activeTeamAgent = null;
84
+ // Todo visibility (Ctrl+T to toggle)
85
+ showTodos = true;
86
+ // View mode (Ctrl+O to toggle verbose view)
87
+ // normal: compact output
88
+ // verbose-temp: temporarily show last N items verbose (any key returns to normal)
89
+ viewMode = 'normal';
90
+ // Status bar navigation (down arrow into footer indicators)
91
+ statusBar = new StatusBarController({
92
+ requestRender: () => { this.needsRender = true; },
93
+ emit: (event, ...args) => { this.emit(event, ...args); },
94
+ });
95
+ // Overlay lifecycle (stack, resolvers, render state, print buffer)
96
+ overlay = new OverlayManager({
97
+ clearFooter: () => { this.footer.clear(); },
98
+ renderFooter: () => { this.footer.render(); },
99
+ print: (item) => { this.print(item); },
100
+ renderItemToConsole: (item) => { this.renderItemToConsole(item); },
101
+ });
102
+ // Footer renderer (clear, render, spinner animation, line builders)
103
+ footer = new FooterRenderer({
104
+ isFooterRenderAllowed: () => this.isRunning && !this.isPaused && !this.overlay.hasActiveOverlay(),
105
+ getRenderData: () => ({
106
+ liveRegion: this.live.region,
107
+ liveVerbose: this.config.verbose,
108
+ agentRunning: this.agentRunning,
109
+ currentTool: this.currentTool,
110
+ spinnerText: this.spinnerText,
111
+ activeBashInfo: this.live.getActiveBashInfo(),
112
+ turnMetrics: this.turnMetrics,
113
+ todos: this.todos,
114
+ showTodos: this.showTodos,
115
+ lines: this.lines,
116
+ currentLine: this.currentLine,
117
+ cursorPos: this.cursorPos,
118
+ queuedInputs: this.queuedInputs,
119
+ suggestion: this.suggestion,
120
+ promptPrefix: this.promptPrefix,
121
+ promptPrefixLen: this.promptPrefixLen,
122
+ ac: this.ac,
123
+ statusBar: this.statusBar,
124
+ mode: this.mode,
125
+ activePlanName: this.activePlanName,
126
+ activeTeamAgent: this.activeTeamAgent,
127
+ projectName: this.projectName,
128
+ conversationFilterActive: this.conversation.isFilterActive,
129
+ hasRestoredHistory: this.conversation.hasRestoredHistory(),
130
+ config: this.config,
131
+ }),
132
+ });
133
+ // Keyboard input handler (capture, escape, overlay routing, keypress dispatch)
134
+ keyboard = new KeyboardHandler({
135
+ isGuardActive: () => !this.isRunning || this.isPaused,
136
+ isAgentRunning: () => this.agentRunning,
137
+ getViewMode: () => this.viewMode,
138
+ setViewMode: (mode) => { this.viewMode = mode; },
139
+ requestRender: () => { this.needsRender = true; },
140
+ emit: (event, ...args) => { this.emit(event, ...args); },
141
+ input: this.input,
142
+ ac: this.ac,
143
+ overlay: this.overlay,
144
+ statusBar: this.statusBar,
145
+ getActiveOverlay: () => this.overlay.getActiveOverlay(),
146
+ hasActiveOverlay: () => this.overlay.hasActiveOverlay(),
147
+ hasActiveBash: () => this.live.hasActiveBash(),
148
+ backgroundBashCommand: () => { this.backgroundBashCommand(); },
149
+ hasRestoredHistory: () => this.conversation.hasRestoredHistory(),
150
+ showRestoredHistory: () => { this.showRestoredHistory(); },
151
+ toggleVerboseView: () => { this.toggleVerboseView(); },
152
+ toggleLiveRegionExpanded: () => { this.toggleLiveRegionExpanded(); },
153
+ toggleTodos: () => { this.toggleTodos(); },
154
+ reRenderConversationVerbose: (verbose) => { this.reRenderConversationVerbose(verbose); },
155
+ });
156
+ constructor(options = {}) {
157
+ super();
158
+ const s = getStyles();
159
+ this.promptPrefix = options.prompt ?? s.primaryBold('compilr>') + ' ';
160
+ this.promptPrefixLen = getVisibleLength(this.promptPrefix);
161
+ this.mode = options.initialMode ?? 'normal';
162
+ this.config = { ...DEFAULT_TERMINAL_UI_CONFIG, ...options.config };
163
+ }
164
+ // ===========================================================================
165
+ // Status bar navigation (delegated to StatusBarController)
166
+ // ===========================================================================
167
+ /** Set background agent count (called by REPL to keep UI in sync). */
168
+ setBackgroundAgentCount(count) {
169
+ this.statusBar.setBackgroundAgentCount(count);
170
+ }
171
+ /** Set MCP loading state for status bar indicator. */
172
+ setMCPLoading(loading, toolCount) {
173
+ this.statusBar.setMCPLoading(loading, toolCount);
174
+ }
175
+ // ===========================================================================
176
+ // Lifecycle
177
+ // ===========================================================================
178
+ start(skipInitialRender) {
179
+ if (this.isRunning)
180
+ return;
181
+ this.isRunning = true;
182
+ this.isPaused = false;
183
+ // Start keyboard input handling
184
+ this.keyboard.startCapture();
185
+ // Initial render (skip when a startup overlay will be shown immediately)
186
+ if (!skipInitialRender) {
187
+ this.footer.render();
188
+ }
189
+ // Phase 3b: Listen for pending requests changes to trigger re-render
190
+ const pendingManager = getPendingRequestsManager();
191
+ pendingManager.on('count-changed', () => {
192
+ this.needsRender = true;
193
+ });
194
+ // Multi-terminal: Listen for session count changes (other terminals joining/leaving)
195
+ const registry = getSessionRegistry();
196
+ if (registry) {
197
+ registry.onCountChange(() => {
198
+ this.needsRender = true;
199
+ });
200
+ }
201
+ // Cross-session notifications: re-render when count changes
202
+ const notifMgr = getNotificationManager();
203
+ if (notifMgr) {
204
+ notifMgr.on('count-changed', () => {
205
+ this.needsRender = true;
206
+ });
207
+ }
208
+ // Start render loop (60ms = ~16fps)
209
+ this.renderTimer = setInterval(() => {
210
+ if (this.needsRender && !this.isPaused) {
211
+ this.footer.render();
212
+ this.needsRender = false;
213
+ }
214
+ }, 60);
215
+ }
216
+ stop() {
217
+ if (!this.isRunning)
218
+ return;
219
+ this.isRunning = false;
220
+ // Stop render loop
221
+ if (this.renderTimer) {
222
+ clearInterval(this.renderTimer);
223
+ this.renderTimer = null;
224
+ }
225
+ // Stop spinner
226
+ this.footer.stopSpinnerAnimation();
227
+ // Stop keyboard capture
228
+ this.keyboard.stopCapture();
229
+ // Clear footer
230
+ this.footer.clear();
231
+ }
232
+ // ===========================================================================
233
+ // Public API - Output (THE KEY METHODS)
234
+ // ===========================================================================
235
+ /**
236
+ * Print a semantic item to the scrolling zone.
237
+ * Items are stored in conversation history for re-rendering when config changes.
238
+ *
239
+ * IMPORTANT: When an overlay is active, items are buffered and rendered after
240
+ * the overlay closes. This prevents cursor position corruption that causes
241
+ * ghost lines and visual artifacts.
242
+ */
243
+ print(item) {
244
+ // Store in history for re-render capability
245
+ this.conversation.addItem(item);
246
+ // Check if item should be shown based on current filter
247
+ if (!this.conversation.shouldShowItem(item)) {
248
+ return; // Filtered out - stored but not displayed
249
+ }
250
+ // If overlay is active, buffer the item to render later
251
+ // This prevents output from corrupting overlay cursor tracking
252
+ if (this.overlay.hasActiveOverlay()) {
253
+ this.overlay.bufferItem(item);
254
+ return;
255
+ }
256
+ // IMPORTANT: If needsRender is true, render FIRST to update lastRenderHeight.
257
+ // This prevents ghost lines when footer height changed (e.g., spinner started)
258
+ // but render loop hasn't fired yet. Without this, clear() uses stale height.
259
+ if (this.needsRender) {
260
+ this.footer.render();
261
+ this.needsRender = false;
262
+ }
263
+ // Clear footer, render item, re-render footer
264
+ this.footer.clear();
265
+ this.renderItemToConsole(item);
266
+ this.footer.render();
267
+ }
268
+ /**
269
+ * Render a single item to the console.
270
+ * Config-aware: respects verbose, showMascot settings.
271
+ * Delegates to standalone renderItem() function.
272
+ */
273
+ renderItemToConsole(item) {
274
+ const suggestion = renderItem(item, this.config);
275
+ if (suggestion !== null) {
276
+ this.setSuggestion(suggestion);
277
+ }
278
+ }
279
+ /**
280
+ * Execute a callback that outputs to terminal.
281
+ * Handles clear → callback → render automatically.
282
+ * Use this for complex output that needs multiple console.log calls.
283
+ * @deprecated Prefer using print() with PrintableItem
284
+ */
285
+ output(callback) {
286
+ this.footer.clear();
287
+ callback();
288
+ this.footer.render();
289
+ }
290
+ // ===========================================================================
291
+ // Public API - State setters
292
+ // ===========================================================================
293
+ setAgentRunning(running) {
294
+ const wasRunning = this.agentRunning;
295
+ this.agentRunning = running;
296
+ if (running && !wasRunning) {
297
+ this.footer.startSpinnerAnimation(() => { this.needsRender = true; });
298
+ // Let render loop handle it
299
+ }
300
+ else if (!running && wasRunning) {
301
+ this.footer.stopSpinnerAnimation();
302
+ this.currentTool = null;
303
+ }
304
+ this.needsRender = true;
305
+ }
306
+ isAgentRunning() {
307
+ return this.agentRunning;
308
+ }
309
+ setTodos(todos) {
310
+ this.todos = todos;
311
+ this.needsRender = true;
312
+ }
313
+ getTodos() {
314
+ return [...this.todos];
315
+ }
316
+ setSpinnerText(text) {
317
+ this.spinnerText = text;
318
+ this.needsRender = true;
319
+ }
320
+ setCurrentTool(tool) {
321
+ this.currentTool = tool;
322
+ if (tool) {
323
+ this.spinnerText = tool;
324
+ }
325
+ this.needsRender = true;
326
+ }
327
+ /**
328
+ * Set whether extended thinking mode is active
329
+ * Shows "thinking" indicator in status line
330
+ */
331
+ setThinking(thinking) {
332
+ this.turnMetrics.isThinking = thinking;
333
+ this.needsRender = true;
334
+ }
335
+ // ===========================================================================
336
+ // Token Tracking (per-turn metrics)
337
+ // ===========================================================================
338
+ /**
339
+ * Add input/output tokens for live display
340
+ * @param thinkingTokens - Optional thinking tokens (Gemini 2.5+ models)
341
+ * @param cacheReadTokens - Optional cache read tokens (Anthropic/Gemini)
342
+ * @param debugPayload - Optional debug payload sizes (char counts)
343
+ */
344
+ addTokens(inputTokens, outputTokens, thinkingTokens, cacheReadTokens, debugPayload) {
345
+ this.turnMetrics.addTokens(inputTokens, outputTokens, thinkingTokens, cacheReadTokens, debugPayload);
346
+ this.needsRender = true;
347
+ }
348
+ /**
349
+ * Increment tool call counter
350
+ */
351
+ incrementToolCalls() {
352
+ this.turnMetrics.incrementToolCalls();
353
+ }
354
+ /**
355
+ * Increment API call counter (called on each LLM request completion)
356
+ */
357
+ incrementApiCalls() {
358
+ this.turnMetrics.incrementApiCalls();
359
+ }
360
+ /**
361
+ * Reset turn metrics (call when agent starts a new turn)
362
+ */
363
+ resetTurnMetrics() {
364
+ this.turnMetrics.reset();
365
+ }
366
+ /**
367
+ * Get current turn metrics
368
+ */
369
+ getTurnMetrics() {
370
+ return this.turnMetrics.getSnapshot();
371
+ }
372
+ setMode(mode) {
373
+ this.mode = mode;
374
+ this.needsRender = true;
375
+ }
376
+ getMode() {
377
+ return this.mode;
378
+ }
379
+ setProjectName(name) {
380
+ this.projectName = name;
381
+ this.needsRender = true;
382
+ }
383
+ getProjectName() {
384
+ return this.projectName;
385
+ }
386
+ /**
387
+ * Set the active team agent (displayed in footer)
388
+ * Pass null to clear (default agent or no team)
389
+ */
390
+ setActiveTeamAgent(agent) {
391
+ this.activeTeamAgent = agent;
392
+ this.needsRender = true;
393
+ }
394
+ /**
395
+ * Get the active team agent
396
+ */
397
+ getActiveTeamAgent() {
398
+ return this.activeTeamAgent;
399
+ }
400
+ /**
401
+ * Set the callback to get available team agents for $ autocomplete
402
+ */
403
+ setAgentSuggestionsCallback(callback) {
404
+ this.ac.getAgentSuggestions = callback;
405
+ }
406
+ /**
407
+ * Set the callback to get available commands for / autocomplete
408
+ */
409
+ setCommandsCallback(callback) {
410
+ this.ac.getCommands = callback;
411
+ }
412
+ /**
413
+ * Set the active plan (for Plan Mode display in footer)
414
+ */
415
+ setActivePlan(planId, planName) {
416
+ this.activePlanId = planId;
417
+ this.activePlanName = planName;
418
+ this.needsRender = true;
419
+ }
420
+ /**
421
+ * Get the active plan info
422
+ */
423
+ getActivePlan() {
424
+ return { id: this.activePlanId, name: this.activePlanName };
425
+ }
426
+ /**
427
+ * Clear the active plan
428
+ */
429
+ clearActivePlan() {
430
+ this.activePlanId = null;
431
+ this.activePlanName = null;
432
+ this.needsRender = true;
433
+ }
434
+ /**
435
+ * Set ghost text suggestion (shown when input is empty)
436
+ */
437
+ setSuggestion(text) {
438
+ this.input.suggestion = text;
439
+ this.needsRender = true;
440
+ }
441
+ getSuggestion() {
442
+ return this.input.suggestion;
443
+ }
444
+ clearSuggestion() {
445
+ this.input.suggestion = null;
446
+ this.needsRender = true;
447
+ }
448
+ // ===========================================================================
449
+ // Public API - LiveRegion (subagents, bash commands)
450
+ // ===========================================================================
451
+ addSubagent(id, agentType, description) {
452
+ this.live.addSubagent(id, agentType, description);
453
+ }
454
+ updateSubagentTool(id, toolName, summary) {
455
+ this.live.updateSubagentTool(id, toolName, summary);
456
+ }
457
+ completeSubagent(id, success, tokenCount, _error) {
458
+ this.live.completeSubagent(id, success, tokenCount, _error);
459
+ }
460
+ removeSubagent(id) {
461
+ return this.live.removeSubagent(id);
462
+ }
463
+ clearLiveRegion() {
464
+ this.live.clearLiveRegion();
465
+ }
466
+ toggleLiveRegionExpanded() {
467
+ this.live.toggleLiveRegionExpanded();
468
+ }
469
+ hasLiveItems() {
470
+ return this.live.hasLiveItems();
471
+ }
472
+ getLiveRegion() {
473
+ return this.live.getLiveRegion();
474
+ }
475
+ addBashCommand(id, command) {
476
+ this.live.addBashCommand(id, command);
477
+ }
478
+ updateBashOutput(id, line) {
479
+ this.live.updateBashOutput(id, line);
480
+ }
481
+ completeBashCommand(id, exitCode) {
482
+ this.live.completeBashCommand(id, exitCode);
483
+ }
484
+ commitBashCommand(id) {
485
+ this.live.commitBashCommand(id);
486
+ }
487
+ backgroundBashCommand() {
488
+ this.live.backgroundBashCommand();
489
+ }
490
+ hasActiveBash() {
491
+ return this.live.hasActiveBash();
492
+ }
493
+ getActiveBashInfo() {
494
+ return this.live.getActiveBashInfo();
495
+ }
496
+ commitSubagent(id, resultContent, success) {
497
+ return this.live.commitSubagent(id, resultContent, success);
498
+ }
499
+ /**
500
+ * Toggle todo list visibility (Ctrl+T)
501
+ */
502
+ toggleTodos() {
503
+ this.showTodos = !this.showTodos;
504
+ this.needsRender = true;
505
+ }
506
+ /**
507
+ * Set todo list visibility
508
+ */
509
+ setShowTodos(show) {
510
+ this.showTodos = show;
511
+ this.needsRender = true;
512
+ }
513
+ /**
514
+ * Get todo list visibility
515
+ */
516
+ getShowTodos() {
517
+ return this.showTodos;
518
+ }
519
+ /**
520
+ * Toggle verbose view mode (Ctrl+O)
521
+ * Shows conversation in verbose mode temporarily.
522
+ * Any key returns to normal view.
523
+ */
524
+ toggleVerboseView() {
525
+ if (this.viewMode === 'normal') {
526
+ this.viewMode = 'verbose-temp';
527
+ this.reRenderConversationVerbose(true);
528
+ }
529
+ else {
530
+ this.viewMode = 'normal';
531
+ this.reRenderConversationVerbose(false);
532
+ }
533
+ }
534
+ /**
535
+ * Re-render conversation with temporary verbose setting.
536
+ */
537
+ reRenderConversationVerbose(verbose) {
538
+ const s = getStyles();
539
+ // Clear screen and scrollback buffer
540
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
541
+ // Reset footer state
542
+ this.footer.resetRenderState();
543
+ // Show mode indicator at top
544
+ if (verbose) {
545
+ console.log(s.info(`[Verbose View Mode] Press any key to return to normal view`));
546
+ console.log('');
547
+ }
548
+ // Re-render all items with temporary verbose override
549
+ const originalVerbose = this.config.verbose;
550
+ this.config.verbose = verbose;
551
+ for (const item of this.conversation.history) {
552
+ this.renderItemToConsole(item);
553
+ }
554
+ // Restore original config
555
+ this.config.verbose = originalVerbose;
556
+ // Footer will be re-rendered by the render loop
557
+ this.needsRender = true;
558
+ }
559
+ // ===========================================================================
560
+ // Public API - Restored History (Ctrl+R)
561
+ // ===========================================================================
562
+ /**
563
+ * Store restored conversation items for Ctrl+R history view.
564
+ * Called when a session is resumed/restored.
565
+ */
566
+ setRestoredHistory(items) {
567
+ this.conversation.setRestoredHistory(items);
568
+ }
569
+ /**
570
+ * Check if there is restored history available.
571
+ */
572
+ hasRestoredHistory() {
573
+ return this.conversation.hasRestoredHistory();
574
+ }
575
+ /**
576
+ * Show restored conversation history (Ctrl+R).
577
+ * Renders items permanently into the scrollback buffer.
578
+ * Stays in normal mode — the output persists like any other printed content.
579
+ */
580
+ showRestoredHistory() {
581
+ const s = getStyles();
582
+ // Clear existing footer to make room for output
583
+ this.footer.clear();
584
+ // Print header
585
+ console.log('');
586
+ console.log(s.info(`── Conversation History (${String(this.conversation.restoredHistory.length)} items) ──`));
587
+ console.log('');
588
+ // Render each restored item into the scrollback
589
+ for (const item of this.conversation.restoredHistory) {
590
+ this.renderItemToConsole(item);
591
+ }
592
+ console.log('');
593
+ console.log(s.muted(`── End of history ──`));
594
+ console.log('');
595
+ // Reset footer state so it re-renders cleanly below the output
596
+ this.footer.resetRenderState();
597
+ this.needsRender = true;
598
+ }
599
+ // ===========================================================================
600
+ // Public API - Config
601
+ // ===========================================================================
602
+ /**
603
+ * Update configuration at runtime.
604
+ * If verbose changes, re-renders the entire conversation.
605
+ */
606
+ setConfig(newConfig) {
607
+ const oldVerbose = this.config.verbose;
608
+ this.config = { ...this.config, ...newConfig };
609
+ // If verbose changed, re-render entire conversation
610
+ if (newConfig.verbose !== undefined && newConfig.verbose !== oldVerbose) {
611
+ this.reRenderConversation();
612
+ }
613
+ // Theme change requires prompt refresh
614
+ if (newConfig.theme !== undefined) {
615
+ this.refreshPrompt();
616
+ }
617
+ this.needsRender = true;
618
+ }
619
+ /**
620
+ * Get current configuration.
621
+ */
622
+ getConfig() {
623
+ return { ...this.config };
624
+ }
625
+ /**
626
+ * Re-render entire conversation with current config.
627
+ * Called when verbose mode changes.
628
+ */
629
+ reRenderConversation() {
630
+ // Clear screen AND scrollback buffer, then move to home
631
+ process.stdout.write('\x1b[2J\x1b[3J\x1b[H');
632
+ // Reset footer state since we cleared everything
633
+ this.footer.resetRenderState();
634
+ // Show filter indicator if active
635
+ if (this.conversation.isFilterActive) {
636
+ const agentList = [...this.conversation.filterAgentIds].map(id => `$${id}`).join(', ');
637
+ const s = getStyles();
638
+ console.log(s.muted(`── Showing messages from: ${agentList} ──`));
639
+ console.log('');
640
+ }
641
+ // Re-render all items with new config (applying filter)
642
+ for (const item of this.conversation.history) {
643
+ if (this.conversation.shouldShowItem(item)) {
644
+ this.renderItemToConsole(item);
645
+ }
646
+ }
647
+ // Footer will be re-rendered by the render loop
648
+ this.needsRender = true;
649
+ }
650
+ // ===========================================================================
651
+ // Public API - Conversation History
652
+ // ===========================================================================
653
+ /**
654
+ * Clear conversation history.
655
+ * Called by /clear command.
656
+ */
657
+ clearConversationHistory() {
658
+ this.conversation.clearHistory();
659
+ }
660
+ /**
661
+ * Get conversation history (copy).
662
+ */
663
+ getConversationHistory() {
664
+ return this.conversation.getHistory();
665
+ }
666
+ // ===========================================================================
667
+ // Public API - Conversation Filter (delegated to ConversationStore)
668
+ // ===========================================================================
669
+ setConversationFilter(agentIds) {
670
+ this.conversation.setFilter(agentIds);
671
+ this.reRenderConversation();
672
+ }
673
+ clearConversationFilter() {
674
+ this.conversation.clearFilter();
675
+ this.reRenderConversation();
676
+ }
677
+ getConversationFilter() {
678
+ return this.conversation.getFilter();
679
+ }
680
+ addToConversationFilter(agentId) {
681
+ return this.conversation.addToFilter(agentId);
682
+ }
683
+ isAgentInFilter(agentId) {
684
+ return this.conversation.isAgentInFilter(agentId);
685
+ }
686
+ // ===========================================================================
687
+ // Public API - Overlays (delegated to OverlayManager)
688
+ // ===========================================================================
689
+ hasActiveOverlay() {
690
+ return this.overlay.hasActiveOverlay();
691
+ }
692
+ getActiveOverlay() {
693
+ return this.overlay.getActiveOverlay();
694
+ }
695
+ async showOverlay(overlay) {
696
+ return this.overlay.showOverlay(overlay);
697
+ }
698
+ requestOverlayRender() {
699
+ this.overlay.requestOverlayRender();
700
+ }
701
+ // ===========================================================================
702
+ // Public API - Input queue
703
+ // ===========================================================================
704
+ getQueuedInputs() {
705
+ return this.input.getQueuedInputs();
706
+ }
707
+ popQueuedInput() {
708
+ const result = this.input.popQueuedInput();
709
+ if (result !== null)
710
+ this.needsRender = true;
711
+ return result;
712
+ }
713
+ hasQueuedInput() {
714
+ return this.input.hasQueuedInput();
715
+ }
716
+ clearQueue() {
717
+ this.input.clearQueue();
718
+ this.needsRender = true;
719
+ }
720
+ // ===========================================================================
721
+ // Public API - Agent message queue
722
+ // ===========================================================================
723
+ /**
724
+ * Queue a message to be sent to the agent.
725
+ * Used by commands that need to invoke the agent programmatically.
726
+ */
727
+ queueAgentMessage(options) {
728
+ this.agentMessageQueue.push(options);
729
+ }
730
+ /**
731
+ * Pop the next agent message from the queue.
732
+ */
733
+ popAgentMessage() {
734
+ return this.agentMessageQueue.shift() ?? null;
735
+ }
736
+ /**
737
+ * Check if there are queued agent messages.
738
+ */
739
+ hasAgentMessage() {
740
+ return this.agentMessageQueue.length > 0;
741
+ }
742
+ /**
743
+ * Clear all queued agent messages.
744
+ */
745
+ clearAgentMessageQueue() {
746
+ this.agentMessageQueue = [];
747
+ }
748
+ // ===========================================================================
749
+ // Public API - Animation control (for overlays)
750
+ // ===========================================================================
751
+ /**
752
+ * Pause footer completely (for overlays)
753
+ */
754
+ pauseAnimation() {
755
+ this.isPaused = true;
756
+ // Stop render loop
757
+ if (this.renderTimer) {
758
+ clearInterval(this.renderTimer);
759
+ this.renderTimer = null;
760
+ }
761
+ // Stop spinner
762
+ this.footer.stopSpinnerAnimation();
763
+ // Stop keyboard capture
764
+ this.keyboard.stopCapture();
765
+ // Clear footer from screen
766
+ this.footer.clear();
767
+ }
768
+ /**
769
+ * Resume footer after pause
770
+ */
771
+ resumeAnimation() {
772
+ this.isPaused = false;
773
+ // Resume spinner if agent running
774
+ if (this.agentRunning) {
775
+ this.footer.startSpinnerAnimation(() => { this.needsRender = true; });
776
+ }
777
+ // Restart keyboard capture
778
+ this.keyboard.startCapture();
779
+ // Restart render loop
780
+ this.footer.render();
781
+ this.renderTimer = setInterval(() => {
782
+ if (this.needsRender && !this.isPaused) {
783
+ this.footer.render();
784
+ this.needsRender = false;
785
+ }
786
+ }, 60);
787
+ }
788
+ /**
789
+ * Restart input after command
790
+ */
791
+ restartInput() {
792
+ this.footer.render();
793
+ }
794
+ /**
795
+ * Refresh prompt with theme colors
796
+ */
797
+ refreshPrompt() {
798
+ const s = getStyles();
799
+ this.promptPrefix = s.primaryBold('compilr>') + ' ';
800
+ this.promptPrefixLen = getVisibleLength(this.promptPrefix);
801
+ this.needsRender = true;
802
+ }
803
+ // ===========================================================================
804
+ // Public API - Legacy compatibility (for gradual migration)
805
+ // ===========================================================================
806
+ /**
807
+ * @deprecated Use print() or output() instead
808
+ */
809
+ clearForOutput() {
810
+ this.footer.clear();
811
+ }
812
+ /**
813
+ * @deprecated Use print() or output() instead
814
+ */
815
+ forceRender() {
816
+ this.footer.render();
817
+ this.needsRender = false;
818
+ }
819
+ }