@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,750 @@
1
+ /**
2
+ * @deprecated DEAD CODE — This class is never instantiated. Do NOT modify this file.
3
+ *
4
+ * The active render pipeline is in TerminalUI (src/ui/terminal-ui.ts).
5
+ * TerminalUI handles all rendering, keyboard input, overlays, and footer display.
6
+ * All UI changes should go there.
7
+ *
8
+ * --- Original description ---
9
+ * Terminal Renderer
10
+ *
11
+ * Single point of terminal output. All rendering goes through this class.
12
+ * Eliminates race conditions by ensuring only one writer.
13
+ */
14
+ import { EventEmitter } from 'events';
15
+ import { RenderMode, isValidTransition } from './render-modes.js';
16
+ // Re-export RenderMode for convenience
17
+ export { RenderMode } from './render-modes.js';
18
+ import * as codes from './terminal-codes.js';
19
+ import { getPhysicalLineCount } from './line-utils.js';
20
+ // =============================================================================
21
+ // TerminalRenderer Class
22
+ // =============================================================================
23
+ export class TerminalRenderer extends EventEmitter {
24
+ // === Configuration ===
25
+ renderDebounceMs;
26
+ debug;
27
+ useScrollRegions;
28
+ // === State ===
29
+ mode;
30
+ terminalRows = 24;
31
+ terminalCols = 80;
32
+ footerHeight = 0;
33
+ scrollRegionBottom = 0;
34
+ isRendering = false;
35
+ renderPending = false;
36
+ renderTimer = null;
37
+ started = false;
38
+ simpleMode = false;
39
+ // === Content Queues ===
40
+ pendingScrollContent = [];
41
+ // === Scroll Position Tracking ===
42
+ // Track where the next output should go in scroll zone
43
+ scrollCursorRow = 1; // 1-indexed, starts at top
44
+ // === Providers ===
45
+ providers = {};
46
+ // === Footer (for scroll region mode) ===
47
+ footer = null;
48
+ // === Resize Handler ===
49
+ resizeHandler = null;
50
+ // === Render Loop (for scroll region mode) ===
51
+ renderLoopTimer = null;
52
+ renderLoopInterval = 60; // 60ms = ~16fps
53
+ constructor(options = {}) {
54
+ super();
55
+ this.mode = options.initialMode ?? RenderMode.REPL;
56
+ this.renderDebounceMs = options.renderDebounceMs ?? 16;
57
+ this.debug = options.debug ?? false;
58
+ this.useScrollRegions = options.useScrollRegions ?? false;
59
+ this.updateDimensions();
60
+ }
61
+ // ===========================================================================
62
+ // Lifecycle
63
+ // ===========================================================================
64
+ /**
65
+ * Start the renderer.
66
+ * Sets up terminal state and begins render loop.
67
+ */
68
+ start() {
69
+ if (this.started) {
70
+ this.log('Already started, ignoring start() call');
71
+ return;
72
+ }
73
+ this.log(`Starting in ${this.mode} mode`);
74
+ // Check if stdout is a TTY
75
+ if (!process.stdout.isTTY) {
76
+ this.log('Not a TTY, using simple mode');
77
+ this.simpleMode = true;
78
+ this.started = true;
79
+ return;
80
+ }
81
+ // Update dimensions
82
+ this.updateDimensions();
83
+ // Set up resize handler
84
+ this.resizeHandler = () => {
85
+ this.handleResize();
86
+ };
87
+ process.stdout.on('resize', this.resizeHandler);
88
+ // Mark as started
89
+ this.started = true;
90
+ // Initial mode setup
91
+ this.setupMode(this.mode);
92
+ // Start render loop if using scroll regions
93
+ if (this.useScrollRegions) {
94
+ this.startRenderLoop();
95
+ }
96
+ this.log('Started successfully');
97
+ }
98
+ /**
99
+ * Start the render loop (for scroll region mode)
100
+ * Polls footer for changes and re-renders
101
+ */
102
+ startRenderLoop() {
103
+ if (this.renderLoopTimer)
104
+ return;
105
+ this.log('Starting render loop');
106
+ this.renderLoopTimer = setInterval(() => {
107
+ if (this.started && !this.simpleMode) {
108
+ // In scroll region mode, always re-render to pick up footer changes
109
+ this.forceRender();
110
+ }
111
+ }, this.renderLoopInterval);
112
+ }
113
+ /**
114
+ * Stop the render loop
115
+ */
116
+ stopRenderLoop() {
117
+ if (this.renderLoopTimer) {
118
+ clearInterval(this.renderLoopTimer);
119
+ this.renderLoopTimer = null;
120
+ this.log('Render loop stopped');
121
+ }
122
+ }
123
+ /**
124
+ * Stop the renderer.
125
+ * Cleans up terminal state and stops render loop.
126
+ */
127
+ stop() {
128
+ if (!this.started) {
129
+ this.log('Not started, ignoring stop() call');
130
+ return;
131
+ }
132
+ this.log('Stopping');
133
+ // Stop render loop
134
+ this.stopRenderLoop();
135
+ // Clear any pending render
136
+ if (this.renderTimer) {
137
+ clearTimeout(this.renderTimer);
138
+ this.renderTimer = null;
139
+ }
140
+ // Remove resize handler
141
+ if (this.resizeHandler) {
142
+ process.stdout.off('resize', this.resizeHandler);
143
+ this.resizeHandler = null;
144
+ }
145
+ // Reset terminal state (only if TTY)
146
+ if (!this.simpleMode) {
147
+ // Reset scroll region
148
+ this.write(codes.resetScrollRegion);
149
+ // Show cursor
150
+ this.write(codes.showCursor);
151
+ }
152
+ this.started = false;
153
+ this.log('Stopped');
154
+ }
155
+ /**
156
+ * Check if renderer is running
157
+ */
158
+ isStarted() {
159
+ return this.started;
160
+ }
161
+ // ===========================================================================
162
+ // Mode Management
163
+ // ===========================================================================
164
+ /**
165
+ * Get current render mode
166
+ */
167
+ getMode() {
168
+ return this.mode;
169
+ }
170
+ /**
171
+ * Switch to a different render mode
172
+ */
173
+ setMode(newMode, reason = 'programmatic') {
174
+ if (newMode === this.mode) {
175
+ this.log(`Already in ${newMode} mode, ignoring`);
176
+ return;
177
+ }
178
+ if (!isValidTransition(this.mode, newMode)) {
179
+ this.log(`Invalid transition: ${this.mode} -> ${newMode}`);
180
+ this.emit('error', new Error(`Invalid mode transition: ${this.mode} -> ${newMode}`));
181
+ return;
182
+ }
183
+ const transition = {
184
+ from: this.mode,
185
+ to: newMode,
186
+ reason,
187
+ timestamp: Date.now(),
188
+ };
189
+ this.log(`Mode transition: ${this.mode} -> ${newMode} (${reason})`);
190
+ // Cleanup current mode
191
+ this.cleanupMode(this.mode);
192
+ // Switch mode
193
+ this.mode = newMode;
194
+ // Setup new mode
195
+ this.setupMode(newMode);
196
+ // Emit event
197
+ this.emit('mode-change', transition);
198
+ // Force render
199
+ this.forceRender();
200
+ }
201
+ /**
202
+ * Set up terminal for a specific mode
203
+ */
204
+ setupMode(mode) {
205
+ if (this.simpleMode)
206
+ return;
207
+ switch (mode) {
208
+ case RenderMode.MENU:
209
+ // Full screen, no scroll region, hidden cursor
210
+ this.write(codes.resetScrollRegion);
211
+ this.write(codes.clearScreenAndHome);
212
+ this.write(codes.hideCursor);
213
+ break;
214
+ case RenderMode.REPL:
215
+ // Set up scroll region (will be adjusted on first render)
216
+ this.footerHeight = 0; // Will be calculated
217
+ this.write(codes.resetScrollRegion);
218
+ this.write(codes.showCursor);
219
+ break;
220
+ case RenderMode.OVERLAY:
221
+ // Full screen, no scroll region
222
+ this.write(codes.resetScrollRegion);
223
+ this.write(codes.clearScreenAndHome);
224
+ // Cursor visibility depends on overlay
225
+ break;
226
+ }
227
+ }
228
+ /**
229
+ * Clean up terminal state when leaving a mode
230
+ */
231
+ cleanupMode(mode) {
232
+ if (this.simpleMode)
233
+ return;
234
+ switch (mode) {
235
+ case RenderMode.MENU:
236
+ // Nothing special to clean up
237
+ break;
238
+ case RenderMode.REPL:
239
+ // Reset scroll region before leaving
240
+ this.write(codes.resetScrollRegion);
241
+ break;
242
+ case RenderMode.OVERLAY:
243
+ // Nothing special to clean up
244
+ break;
245
+ }
246
+ }
247
+ // ===========================================================================
248
+ // Provider Management
249
+ // ===========================================================================
250
+ /**
251
+ * Register content providers
252
+ */
253
+ setProviders(providers) {
254
+ this.providers = { ...this.providers, ...providers };
255
+ this.log(`Providers updated: ${Object.keys(providers).join(', ')}`);
256
+ }
257
+ /**
258
+ * Get a specific provider
259
+ */
260
+ getProvider(key) {
261
+ return this.providers[key];
262
+ }
263
+ // ===========================================================================
264
+ // Footer Integration (for scroll region mode)
265
+ // ===========================================================================
266
+ /**
267
+ * Set the Footer instance for scroll region rendering
268
+ * When useScrollRegions is true, TerminalRenderer uses footer.getFooterLines()
269
+ * and manages the scroll region. Footer's own render loop is disabled.
270
+ */
271
+ setFooter(footer) {
272
+ this.footer = footer;
273
+ this.log('Footer connected');
274
+ // When scroll regions are enabled, disable Footer's internal render loop
275
+ // TerminalRenderer will handle all rendering
276
+ if (this.useScrollRegions) {
277
+ footer.setExternalRenderer(true);
278
+ this.log('Footer external renderer enabled (scroll region mode)');
279
+ }
280
+ }
281
+ /**
282
+ * Get the connected Footer instance
283
+ */
284
+ getFooter() {
285
+ return this.footer;
286
+ }
287
+ // ===========================================================================
288
+ // Scroll Zone (REPL mode)
289
+ // ===========================================================================
290
+ /**
291
+ * Queue content for scroll zone (REPL mode only)
292
+ * Content will be written on next render
293
+ *
294
+ * In legacy mode (useScrollRegions=false), writes immediately via console.log
295
+ * In scroll region mode, queues for next render cycle
296
+ */
297
+ appendToScrollZone(content) {
298
+ if (this.mode !== RenderMode.REPL) {
299
+ this.log('appendToScrollZone called outside REPL mode, ignoring');
300
+ return;
301
+ }
302
+ const lines = Array.isArray(content) ? content : content.split('\n');
303
+ if (!this.useScrollRegions) {
304
+ // Legacy mode: write immediately via console.log
305
+ // This works with existing Footer class that manages its own rendering
306
+ for (const line of lines) {
307
+ console.log(line);
308
+ }
309
+ return;
310
+ }
311
+ // Scroll region mode: queue for render
312
+ this.pendingScrollContent.push(...lines);
313
+ this.requestRender();
314
+ }
315
+ /**
316
+ * Flush pending scroll content to terminal
317
+ *
318
+ * Uses tracked scroll position to append content naturally.
319
+ * When content would exceed scroll region, scrolling occurs automatically.
320
+ */
321
+ flushScrollContent() {
322
+ if (this.pendingScrollContent.length === 0)
323
+ return;
324
+ this.log(`Flushing ${String(this.pendingScrollContent.length)} lines at row ${String(this.scrollCursorRow)}`);
325
+ // Move to current scroll position (within scroll region)
326
+ this.write(codes.cursorTo(this.scrollCursorRow, 1));
327
+ // Write each line
328
+ for (const line of this.pendingScrollContent) {
329
+ this.write(line);
330
+ this.write('\n');
331
+ // Track position (clamped to scroll region bottom)
332
+ this.scrollCursorRow++;
333
+ if (this.scrollCursorRow > this.scrollRegionBottom) {
334
+ // Content will scroll, cursor stays at bottom of scroll region
335
+ this.scrollCursorRow = this.scrollRegionBottom;
336
+ }
337
+ }
338
+ this.pendingScrollContent = [];
339
+ }
340
+ // ===========================================================================
341
+ // Rendering
342
+ // ===========================================================================
343
+ /**
344
+ * Request a render (debounced)
345
+ */
346
+ requestRender() {
347
+ if (!this.started || this.simpleMode)
348
+ return;
349
+ if (this.renderPending)
350
+ return;
351
+ this.renderPending = true;
352
+ if (this.renderTimer) {
353
+ clearTimeout(this.renderTimer);
354
+ }
355
+ this.renderTimer = setTimeout(() => {
356
+ this.doRender();
357
+ }, this.renderDebounceMs);
358
+ }
359
+ /**
360
+ * Force immediate render (bypasses debounce)
361
+ */
362
+ forceRender() {
363
+ if (!this.started)
364
+ return;
365
+ // Clear any pending debounced render
366
+ if (this.renderTimer) {
367
+ clearTimeout(this.renderTimer);
368
+ this.renderTimer = null;
369
+ }
370
+ this.renderPending = false;
371
+ this.doRender();
372
+ }
373
+ /**
374
+ * Main render method
375
+ */
376
+ doRender() {
377
+ if (this.isRendering) {
378
+ // Already rendering, schedule another
379
+ this.renderPending = true;
380
+ return;
381
+ }
382
+ this.isRendering = true;
383
+ this.renderPending = false;
384
+ try {
385
+ if (this.simpleMode) {
386
+ this.renderSimpleMode();
387
+ }
388
+ else {
389
+ switch (this.mode) {
390
+ case RenderMode.MENU:
391
+ this.renderMenuMode();
392
+ break;
393
+ case RenderMode.REPL:
394
+ this.renderReplMode();
395
+ break;
396
+ case RenderMode.OVERLAY:
397
+ this.renderOverlayMode();
398
+ break;
399
+ }
400
+ }
401
+ this.emit('render', this.mode);
402
+ }
403
+ catch (error) {
404
+ this.emit('error', error instanceof Error ? error : new Error(String(error)));
405
+ }
406
+ finally {
407
+ this.isRendering = false;
408
+ // Check if another render was requested during this one
409
+ // (renderPending can be set by callbacks during render)
410
+ // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
411
+ if (this.renderPending) {
412
+ this.requestRender();
413
+ }
414
+ }
415
+ }
416
+ /**
417
+ * Render in simple mode (non-TTY)
418
+ */
419
+ renderSimpleMode() {
420
+ // In simple mode, just flush any pending content
421
+ for (const line of this.pendingScrollContent) {
422
+ console.log(line);
423
+ }
424
+ this.pendingScrollContent = [];
425
+ }
426
+ /**
427
+ * Render MENU mode
428
+ */
429
+ renderMenuMode() {
430
+ const menuProvider = this.providers.menu;
431
+ if (!menuProvider) {
432
+ this.log('No menu provider, skipping menu render');
433
+ return;
434
+ }
435
+ const lines = menuProvider.getLines();
436
+ // Clear and render from top
437
+ this.write(codes.cursorHome);
438
+ this.write(codes.clearToEndOfScreen);
439
+ for (const line of lines) {
440
+ this.write(line + '\n');
441
+ }
442
+ }
443
+ /**
444
+ * Render REPL mode
445
+ */
446
+ renderReplMode() {
447
+ // If scroll regions disabled (legacy mode), do nothing
448
+ // Footer manages its own rendering and scroll content goes via console.log
449
+ if (!this.useScrollRegions) {
450
+ return;
451
+ }
452
+ // 1. Build footer content (from Footer or providers)
453
+ const footerLines = this.footer ? this.footer.getFooterLines() : this.buildFooterLines();
454
+ const newFooterHeight = this.calculatePhysicalHeight(footerLines);
455
+ this.log(`renderReplMode: footerHeight=${String(newFooterHeight)}, pending=${String(this.pendingScrollContent.length)}, scrollCursor=${String(this.scrollCursorRow)}`);
456
+ // 2. Adjust scroll region if footer height changed
457
+ if (newFooterHeight !== this.footerHeight) {
458
+ this.adjustScrollRegion(newFooterHeight);
459
+ }
460
+ // 3. Flush pending scroll content
461
+ if (this.pendingScrollContent.length > 0) {
462
+ this.flushScrollContent();
463
+ }
464
+ // 4. Render footer
465
+ this.renderFooter(footerLines);
466
+ // 5. Position cursor if footer is connected
467
+ if (this.footer) {
468
+ this.positionFooterCursor();
469
+ }
470
+ }
471
+ /**
472
+ * Build footer lines from providers
473
+ */
474
+ buildFooterLines() {
475
+ const lines = [];
476
+ // 1. Subagent status (if any)
477
+ if (this.providers.subagent) {
478
+ lines.push(...this.providers.subagent.getLines());
479
+ }
480
+ // 2. Spinner OR Todo list (mutually exclusive)
481
+ if (this.providers.spinner?.isAgentRunning()) {
482
+ lines.push(...(this.providers.spinner.getLines()));
483
+ }
484
+ else if (this.providers.todo) {
485
+ lines.push(...this.providers.todo.getLines());
486
+ }
487
+ // 3. Input prompt (includes separator)
488
+ if (this.providers.input) {
489
+ lines.push(...this.providers.input.getLines());
490
+ }
491
+ // 4. Queued messages
492
+ if (this.providers.queue) {
493
+ lines.push(...this.providers.queue.getLines());
494
+ }
495
+ // 5. Mode indicator
496
+ if (this.providers.mode) {
497
+ lines.push(...this.providers.mode.getLines());
498
+ }
499
+ // Cap at 80% of terminal height
500
+ const maxHeight = Math.floor(this.terminalRows * 0.8);
501
+ const physicalHeight = this.calculatePhysicalHeight(lines);
502
+ if (physicalHeight > maxHeight) {
503
+ // TODO: Implement truncation (Phase 4)
504
+ this.log(`Footer too tall: ${String(physicalHeight)} > ${String(maxHeight)}`);
505
+ }
506
+ return lines;
507
+ }
508
+ /**
509
+ * Calculate physical height of lines (accounting for wrapping)
510
+ */
511
+ calculatePhysicalHeight(lines) {
512
+ let height = 0;
513
+ for (const line of lines) {
514
+ height += getPhysicalLineCount(line, this.terminalCols);
515
+ }
516
+ return height;
517
+ }
518
+ /**
519
+ * Adjust scroll region when footer height changes
520
+ */
521
+ adjustScrollRegion(newFooterHeight) {
522
+ if (newFooterHeight === this.footerHeight)
523
+ return;
524
+ const oldBottom = this.scrollRegionBottom;
525
+ this.footerHeight = newFooterHeight;
526
+ this.scrollRegionBottom = this.terminalRows - newFooterHeight;
527
+ this.log(`Scroll region: [1-${String(oldBottom)}] -> [1-${String(this.scrollRegionBottom)}] (footer: ${String(newFooterHeight)} lines)`);
528
+ // Set new scroll region (1-indexed)
529
+ this.write(codes.setScrollRegion(1, this.scrollRegionBottom));
530
+ // Keep scroll cursor within new bounds
531
+ if (this.scrollCursorRow > this.scrollRegionBottom) {
532
+ this.scrollCursorRow = this.scrollRegionBottom;
533
+ }
534
+ }
535
+ /**
536
+ * Render footer content
537
+ */
538
+ renderFooter(lines) {
539
+ if (lines.length === 0)
540
+ return;
541
+ // Move to footer area (row after scroll region)
542
+ const footerStartRow = this.scrollRegionBottom + 1;
543
+ this.write(codes.cursorTo(footerStartRow, 1));
544
+ // Clear footer area
545
+ this.write(codes.clearToEndOfScreen);
546
+ // Write footer lines
547
+ for (let i = 0; i < lines.length; i++) {
548
+ if (i > 0)
549
+ this.write('\n');
550
+ this.write(lines[i]);
551
+ }
552
+ // Position cursor for input
553
+ this.positionCursor();
554
+ }
555
+ /**
556
+ * Position cursor for input (provider-based)
557
+ */
558
+ positionCursor() {
559
+ const inputProvider = this.providers.input;
560
+ if (!inputProvider)
561
+ return;
562
+ const cursorPos = inputProvider.getCursorPosition();
563
+ // Calculate absolute row: footer start + provider's relative row
564
+ const footerStartRow = this.scrollRegionBottom + 1;
565
+ // Find which line in footer is the input
566
+ // For now, assume input is after subagent + spinner/todo lines
567
+ let inputStartRow = footerStartRow;
568
+ if (this.providers.subagent) {
569
+ inputStartRow += this.providers.subagent.getLines().length;
570
+ }
571
+ if (this.providers.spinner?.isAgentRunning()) {
572
+ inputStartRow += this.providers.spinner.getLines().length;
573
+ }
574
+ else if (this.providers.todo) {
575
+ inputStartRow += this.providers.todo.getLines().length;
576
+ }
577
+ // Add provider's relative row
578
+ const absoluteRow = inputStartRow + cursorPos.row;
579
+ const absoluteCol = cursorPos.col + 1; // 1-indexed
580
+ this.write(codes.cursorTo(absoluteRow, absoluteCol));
581
+ this.write(codes.showCursor);
582
+ }
583
+ /**
584
+ * Position cursor for Footer integration (scroll region mode)
585
+ */
586
+ positionFooterCursor() {
587
+ if (!this.footer)
588
+ return;
589
+ const cursorPos = this.footer.getFooterCursorPosition();
590
+ const footerStartRow = this.scrollRegionBottom + 1;
591
+ // cursorPos.row is 0-indexed from footer start
592
+ const absoluteRow = footerStartRow + cursorPos.row;
593
+ const absoluteCol = cursorPos.col + 1; // 1-indexed
594
+ this.write(codes.cursorTo(absoluteRow, absoluteCol));
595
+ this.write(codes.showCursor);
596
+ }
597
+ /**
598
+ * Render OVERLAY mode
599
+ */
600
+ renderOverlayMode() {
601
+ const overlayProvider = this.providers.overlay;
602
+ if (!overlayProvider || !overlayProvider.isActive()) {
603
+ this.log('No active overlay provider');
604
+ return;
605
+ }
606
+ const lines = overlayProvider.getLines();
607
+ // Clear and render from top
608
+ this.write(codes.cursorHome);
609
+ this.write(codes.clearToEndOfScreen);
610
+ for (let i = 0; i < lines.length; i++) {
611
+ if (i > 0)
612
+ this.write('\n');
613
+ this.write(lines[i]);
614
+ }
615
+ // Position cursor if overlay needs it
616
+ const cursorPos = overlayProvider.getCursorPosition();
617
+ if (cursorPos) {
618
+ this.write(codes.showCursor);
619
+ this.write(codes.cursorTo(cursorPos.row + 1, cursorPos.col + 1));
620
+ }
621
+ else {
622
+ this.write(codes.hideCursor);
623
+ }
624
+ }
625
+ // ===========================================================================
626
+ // Resize Handling
627
+ // ===========================================================================
628
+ /**
629
+ * Handle terminal resize
630
+ */
631
+ handleResize() {
632
+ const oldCols = this.terminalCols;
633
+ const oldRows = this.terminalRows;
634
+ this.updateDimensions();
635
+ this.log(`Resize: ${String(oldCols)}x${String(oldRows)} -> ${String(this.terminalCols)}x${String(this.terminalRows)}`);
636
+ // Emit event
637
+ this.emit('resize', this.terminalCols, this.terminalRows);
638
+ // Mode-specific handling
639
+ switch (this.mode) {
640
+ case RenderMode.REPL:
641
+ // Recalculate scroll region
642
+ if (this.footerHeight > 0) {
643
+ this.scrollRegionBottom = this.terminalRows - this.footerHeight;
644
+ this.write(codes.setScrollRegion(1, this.scrollRegionBottom));
645
+ }
646
+ break;
647
+ case RenderMode.MENU:
648
+ case RenderMode.OVERLAY:
649
+ // Full screen modes just re-render
650
+ break;
651
+ }
652
+ // Force full re-render
653
+ this.forceRender();
654
+ }
655
+ /**
656
+ * Update terminal dimensions from stdout
657
+ */
658
+ updateDimensions() {
659
+ this.terminalRows = process.stdout.rows || 24;
660
+ this.terminalCols = process.stdout.columns || 80;
661
+ }
662
+ /**
663
+ * Get current terminal dimensions
664
+ */
665
+ getDimensions() {
666
+ return { rows: this.terminalRows, cols: this.terminalCols };
667
+ }
668
+ // ===========================================================================
669
+ // Low-Level Output
670
+ // ===========================================================================
671
+ /**
672
+ * Write to stdout (single output point)
673
+ */
674
+ write(text) {
675
+ if (text.length === 0)
676
+ return;
677
+ process.stdout.write(text);
678
+ }
679
+ // ===========================================================================
680
+ // Keyboard Routing (stub for Phase 2+)
681
+ // ===========================================================================
682
+ /**
683
+ * Route keyboard input to appropriate handler
684
+ */
685
+ handleKeyboard(key) {
686
+ switch (this.mode) {
687
+ case RenderMode.MENU:
688
+ if (this.providers.menu) {
689
+ const action = this.providers.menu.handleKey(key);
690
+ if (action === 'select') {
691
+ // TODO: Handle menu selection (Phase 2)
692
+ }
693
+ this.requestRender();
694
+ }
695
+ break;
696
+ case RenderMode.REPL:
697
+ if (this.providers.input) {
698
+ const action = this.providers.input.handleKey(key);
699
+ if (action) {
700
+ // TODO: Handle input action (Phase 4)
701
+ }
702
+ this.requestRender();
703
+ }
704
+ break;
705
+ case RenderMode.OVERLAY:
706
+ if (this.providers.overlay) {
707
+ const action = this.providers.overlay.handleKey(key);
708
+ if (action?.type === 'close') {
709
+ this.setMode(RenderMode.REPL, 'overlay-closed');
710
+ }
711
+ this.requestRender();
712
+ }
713
+ break;
714
+ }
715
+ }
716
+ // ===========================================================================
717
+ // Debug Logging
718
+ // ===========================================================================
719
+ /**
720
+ * Log debug message if debug mode enabled
721
+ */
722
+ log(message) {
723
+ if (this.debug) {
724
+ const timestamp = new Date().toISOString().slice(11, 23);
725
+ console.error(`[TerminalRenderer ${timestamp}] ${message}`);
726
+ }
727
+ }
728
+ }
729
+ // =============================================================================
730
+ // Singleton Export (optional)
731
+ // =============================================================================
732
+ let defaultRenderer = null;
733
+ /**
734
+ * Get or create the default renderer instance
735
+ */
736
+ export function getRenderer(options) {
737
+ if (!defaultRenderer) {
738
+ defaultRenderer = new TerminalRenderer(options);
739
+ }
740
+ return defaultRenderer;
741
+ }
742
+ /**
743
+ * Reset the default renderer (for testing)
744
+ */
745
+ export function resetRenderer() {
746
+ if (defaultRenderer) {
747
+ defaultRenderer.stop();
748
+ defaultRenderer = null;
749
+ }
750
+ }