@compilr-dev/cli 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/README.md +236 -68
  2. package/dist/.tsbuildinfo.app +1 -0
  3. package/dist/.tsbuildinfo.data +1 -0
  4. package/dist/.tsbuildinfo.domain +1 -0
  5. package/dist/.tsbuildinfo.foundation +1 -0
  6. package/dist/agent.d.ts +61 -4
  7. package/dist/agent.js +241 -245
  8. package/dist/anchors/index.d.ts +1 -1
  9. package/dist/anchors/index.js +1 -1
  10. package/dist/anchors/project-anchors.d.ts +2 -2
  11. package/dist/anchors/project-anchors.js +1 -1
  12. package/dist/auth/api-client.d.ts +124 -0
  13. package/dist/auth/api-client.js +261 -0
  14. package/dist/auth/index.d.ts +172 -0
  15. package/dist/auth/index.js +545 -0
  16. package/dist/auth/storage.d.ts +52 -0
  17. package/dist/auth/storage.js +118 -0
  18. package/dist/changelog/index.d.ts +16 -0
  19. package/dist/changelog/index.js +24 -0
  20. package/dist/changelog/releases.d.ts +17 -0
  21. package/dist/changelog/releases.js +63 -0
  22. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  23. package/dist/commands-v2/handlers/auth.js +118 -0
  24. package/dist/commands-v2/handlers/background.d.ts +14 -0
  25. package/dist/commands-v2/handlers/background.js +276 -0
  26. package/dist/commands-v2/handlers/context.js +266 -81
  27. package/dist/commands-v2/handlers/core.d.ts +1 -0
  28. package/dist/commands-v2/handlers/core.js +133 -8
  29. package/dist/commands-v2/handlers/debug.js +18 -0
  30. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  31. package/dist/commands-v2/handlers/delegations.js +29 -0
  32. package/dist/commands-v2/handlers/files.d.ts +8 -0
  33. package/dist/commands-v2/handlers/files.js +162 -0
  34. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  35. package/dist/commands-v2/handlers/filter.js +130 -0
  36. package/dist/commands-v2/handlers/games.d.ts +7 -0
  37. package/dist/commands-v2/handlers/games.js +57 -0
  38. package/dist/commands-v2/handlers/index.d.ts +13 -0
  39. package/dist/commands-v2/handlers/index.js +39 -0
  40. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  41. package/dist/commands-v2/handlers/mcp.js +39 -0
  42. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  43. package/dist/commands-v2/handlers/notifications.js +34 -0
  44. package/dist/commands-v2/handlers/project.js +244 -23
  45. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  46. package/dist/commands-v2/handlers/reset.js +118 -0
  47. package/dist/commands-v2/handlers/session.d.ts +161 -0
  48. package/dist/commands-v2/handlers/session.js +805 -0
  49. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  50. package/dist/commands-v2/handlers/settings.js +217 -35
  51. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  52. package/dist/commands-v2/handlers/tasks.js +36 -0
  53. package/dist/commands-v2/handlers/team.d.ts +9 -0
  54. package/dist/commands-v2/handlers/team.js +549 -0
  55. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  56. package/dist/commands-v2/handlers/terminals.js +34 -0
  57. package/dist/commands-v2/index.d.ts +3 -2
  58. package/dist/commands-v2/index.js +4 -1
  59. package/dist/commands-v2/registry.d.ts +15 -0
  60. package/dist/commands-v2/registry.js +34 -0
  61. package/dist/commands-v2/types.d.ts +81 -3
  62. package/dist/commands.js +13 -0
  63. package/dist/compilr-diff-companion.vsix +0 -0
  64. package/dist/db/index.js +98 -4
  65. package/dist/db/repositories/document-repository.d.ts +2 -0
  66. package/dist/db/repositories/document-repository.js +5 -1
  67. package/dist/db/repositories/index.d.ts +2 -0
  68. package/dist/db/repositories/index.js +1 -0
  69. package/dist/db/repositories/plan-repository.d.ts +101 -0
  70. package/dist/db/repositories/plan-repository.js +275 -0
  71. package/dist/db/repositories/project-repository.d.ts +6 -0
  72. package/dist/db/repositories/project-repository.js +41 -0
  73. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  74. package/dist/db/repositories/work-item-repository.js +69 -4
  75. package/dist/db/schema.d.ts +40 -3
  76. package/dist/db/schema.js +66 -3
  77. package/dist/episodes/index.d.ts +20 -0
  78. package/dist/episodes/index.js +27 -0
  79. package/dist/episodes/recorder.d.ts +51 -0
  80. package/dist/episodes/recorder.js +195 -0
  81. package/dist/episodes/significant-work.d.ts +21 -0
  82. package/dist/episodes/significant-work.js +56 -0
  83. package/dist/episodes/store.d.ts +38 -0
  84. package/dist/episodes/store.js +199 -0
  85. package/dist/episodes/types.d.ts +35 -0
  86. package/dist/episodes/types.js +6 -0
  87. package/dist/episodes/work-at-risk.d.ts +12 -0
  88. package/dist/episodes/work-at-risk.js +38 -0
  89. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  90. package/dist/episodes/work-summary-anchor.js +73 -0
  91. package/dist/games/coins.d.ts +66 -0
  92. package/dist/games/coins.js +165 -0
  93. package/dist/games/game-base.d.ts +84 -0
  94. package/dist/games/game-base.js +204 -0
  95. package/dist/games/index.d.ts +16 -0
  96. package/dist/games/index.js +49 -0
  97. package/dist/games/scores.d.ts +69 -0
  98. package/dist/games/scores.js +191 -0
  99. package/dist/games/tetris/board.d.ts +59 -0
  100. package/dist/games/tetris/board.js +170 -0
  101. package/dist/games/tetris/index.d.ts +109 -0
  102. package/dist/games/tetris/index.js +610 -0
  103. package/dist/games/tetris/pieces.d.ts +44 -0
  104. package/dist/games/tetris/pieces.js +271 -0
  105. package/dist/games/tetris/renderer.d.ts +26 -0
  106. package/dist/games/tetris/renderer.js +77 -0
  107. package/dist/guide/guide-content.d.ts +23 -0
  108. package/dist/guide/guide-content.js +196 -0
  109. package/dist/guide/index.d.ts +8 -0
  110. package/dist/guide/index.js +7 -0
  111. package/dist/guide/shared-content.d.ts +37 -0
  112. package/dist/guide/shared-content.js +1272 -0
  113. package/dist/guide/tutorial-helpers.d.ts +57 -0
  114. package/dist/guide/tutorial-helpers.js +147 -0
  115. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  116. package/dist/handlers/ask-user-handlers.js +104 -0
  117. package/dist/handlers/delegation-handlers.d.ts +34 -0
  118. package/dist/handlers/delegation-handlers.js +291 -0
  119. package/dist/handlers/permission-handler.d.ts +30 -0
  120. package/dist/handlers/permission-handler.js +205 -0
  121. package/dist/index.d.ts +11 -1
  122. package/dist/index.js +448 -271
  123. package/dist/input-handlers/memory-handler.d.ts +1 -1
  124. package/dist/input-handlers/memory-handler.js +2 -1
  125. package/dist/models/index.d.ts +10 -0
  126. package/dist/models/index.js +12 -0
  127. package/dist/models/model-registry.d.ts +38 -0
  128. package/dist/models/model-registry.js +69 -0
  129. package/dist/models/model-tiers.d.ts +28 -0
  130. package/dist/models/model-tiers.js +71 -0
  131. package/dist/models/model-validation.d.ts +25 -0
  132. package/dist/models/model-validation.js +291 -0
  133. package/dist/models/ollama-models.d.ts +73 -0
  134. package/dist/models/ollama-models.js +178 -0
  135. package/dist/models/provider-types.d.ts +6 -0
  136. package/dist/models/provider-types.js +1 -0
  137. package/dist/models/providers.d.ts +35 -0
  138. package/dist/models/providers.js +58 -0
  139. package/dist/models/types.d.ts +4 -0
  140. package/dist/models/types.js +4 -0
  141. package/dist/multi-agent/activity.d.ts +21 -0
  142. package/dist/multi-agent/activity.js +34 -0
  143. package/dist/multi-agent/agent-selection.d.ts +55 -0
  144. package/dist/multi-agent/agent-selection.js +90 -0
  145. package/dist/multi-agent/artifacts.d.ts +197 -0
  146. package/dist/multi-agent/artifacts.js +379 -0
  147. package/dist/multi-agent/checkpointer.d.ts +138 -0
  148. package/dist/multi-agent/checkpointer.js +471 -0
  149. package/dist/multi-agent/collision-utils.d.ts +16 -0
  150. package/dist/multi-agent/collision-utils.js +28 -0
  151. package/dist/multi-agent/context-resolver.d.ts +97 -0
  152. package/dist/multi-agent/context-resolver.js +316 -0
  153. package/dist/multi-agent/custom-agents.d.ts +83 -0
  154. package/dist/multi-agent/custom-agents.js +227 -0
  155. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  156. package/dist/multi-agent/delegation-tracker.js +243 -0
  157. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  158. package/dist/multi-agent/file-lock-hook.js +97 -0
  159. package/dist/multi-agent/file-locks.d.ts +58 -0
  160. package/dist/multi-agent/file-locks.js +194 -0
  161. package/dist/multi-agent/index.d.ts +24 -0
  162. package/dist/multi-agent/index.js +30 -0
  163. package/dist/multi-agent/mention-parser.d.ts +64 -0
  164. package/dist/multi-agent/mention-parser.js +146 -0
  165. package/dist/multi-agent/notification-manager.d.ts +84 -0
  166. package/dist/multi-agent/notification-manager.js +224 -0
  167. package/dist/multi-agent/pending-requests.d.ts +122 -0
  168. package/dist/multi-agent/pending-requests.js +155 -0
  169. package/dist/multi-agent/session-registry.d.ts +139 -0
  170. package/dist/multi-agent/session-registry.js +514 -0
  171. package/dist/multi-agent/shared-context.d.ts +293 -0
  172. package/dist/multi-agent/shared-context.js +671 -0
  173. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  174. package/dist/multi-agent/skill-requirements.js +178 -0
  175. package/dist/multi-agent/task-assignment.d.ts +69 -0
  176. package/dist/multi-agent/task-assignment.js +123 -0
  177. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  178. package/dist/multi-agent/task-suggestion.js +72 -0
  179. package/dist/multi-agent/team-agent.d.ts +201 -0
  180. package/dist/multi-agent/team-agent.js +488 -0
  181. package/dist/multi-agent/team.d.ts +286 -0
  182. package/dist/multi-agent/team.js +610 -0
  183. package/dist/multi-agent/tool-config.d.ts +110 -0
  184. package/dist/multi-agent/tool-config.js +661 -0
  185. package/dist/multi-agent/types.d.ts +211 -0
  186. package/dist/multi-agent/types.js +617 -0
  187. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  188. package/dist/prompts/plan-mode-prompt.js +95 -0
  189. package/dist/repl-helpers.js +3 -2
  190. package/dist/repl-v2.d.ts +401 -2
  191. package/dist/repl-v2.js +2577 -65
  192. package/dist/session/index.d.ts +6 -0
  193. package/dist/session/index.js +6 -0
  194. package/dist/session/project-session-manager.d.ts +158 -0
  195. package/dist/session/project-session-manager.js +650 -0
  196. package/dist/settings/index.d.ts +133 -13
  197. package/dist/settings/index.js +329 -24
  198. package/dist/settings/mcp-config.d.ts +76 -0
  199. package/dist/settings/mcp-config.js +143 -0
  200. package/dist/settings/paths.d.ts +4 -0
  201. package/dist/settings/paths.js +6 -0
  202. package/dist/shared-handlers.d.ts +62 -0
  203. package/dist/shared-handlers.js +48 -0
  204. package/dist/system-prompt/builder.d.ts +5 -0
  205. package/dist/system-prompt/builder.js +4 -0
  206. package/dist/system-prompt/index.d.ts +18 -0
  207. package/dist/system-prompt/index.js +18 -0
  208. package/dist/system-prompt/modules.d.ts +5 -0
  209. package/dist/system-prompt/modules.js +4 -0
  210. package/dist/tabbed-menu.js +2 -1
  211. package/dist/templates/compilr-md-import.d.ts +16 -0
  212. package/dist/templates/compilr-md-import.js +241 -0
  213. package/dist/templates/compilr-md.js +10 -61
  214. package/dist/templates/config-json.d.ts +1 -25
  215. package/dist/templates/index.d.ts +2 -0
  216. package/dist/templates/index.js +34 -73
  217. package/dist/tool-names.d.ts +108 -0
  218. package/dist/tool-names.js +227 -0
  219. package/dist/tools/anchor-tools.d.ts +4 -4
  220. package/dist/tools/anchor-tools.js +1 -1
  221. package/dist/tools/artifact-tools.d.ts +42 -0
  222. package/dist/tools/artifact-tools.js +328 -0
  223. package/dist/tools/ask-user-simple.d.ts +1 -1
  224. package/dist/tools/ask-user-simple.js +2 -1
  225. package/dist/tools/ask-user.d.ts +1 -1
  226. package/dist/tools/ask-user.js +2 -1
  227. package/dist/tools/backlog-wrappers.d.ts +5 -3
  228. package/dist/tools/backlog-wrappers.js +16 -1
  229. package/dist/tools/backlog.d.ts +2 -2
  230. package/dist/tools/backlog.js +1 -1
  231. package/dist/tools/db-tools.d.ts +8 -61
  232. package/dist/tools/db-tools.js +8 -13
  233. package/dist/tools/delegate-background.d.ts +27 -0
  234. package/dist/tools/delegate-background.js +115 -0
  235. package/dist/tools/delegate.d.ts +22 -0
  236. package/dist/tools/delegate.js +97 -0
  237. package/dist/tools/delegation-status.d.ts +16 -0
  238. package/dist/tools/delegation-status.js +128 -0
  239. package/dist/tools/document-db.d.ts +5 -5
  240. package/dist/tools/document-db.js +1 -1
  241. package/dist/tools/guide-tool.d.ts +12 -0
  242. package/dist/tools/guide-tool.js +59 -0
  243. package/dist/tools/handoff.d.ts +25 -0
  244. package/dist/tools/handoff.js +99 -0
  245. package/dist/tools/meta-tools.d.ts +26 -0
  246. package/dist/tools/meta-tools.js +47 -0
  247. package/dist/tools/plan-tools.d.ts +54 -0
  248. package/dist/tools/plan-tools.js +338 -0
  249. package/dist/tools/platform-adapter.d.ts +29 -0
  250. package/dist/tools/platform-adapter.js +394 -0
  251. package/dist/tools/project-db.d.ts +5 -73
  252. package/dist/tools/project-db.js +5 -336
  253. package/dist/tools/recall-work-tool.d.ts +18 -0
  254. package/dist/tools/recall-work-tool.js +82 -0
  255. package/dist/tools/workitem-db.d.ts +43 -11
  256. package/dist/tools/workitem-db.js +186 -5
  257. package/dist/tools.d.ts +67 -2
  258. package/dist/tools.js +237 -47
  259. package/dist/ui/autocomplete-controller.d.ts +42 -0
  260. package/dist/ui/autocomplete-controller.js +384 -0
  261. package/dist/ui/base/index.d.ts +1 -1
  262. package/dist/ui/base/index.js +1 -1
  263. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  264. package/dist/ui/base/overlay-base-v2.js +14 -0
  265. package/dist/ui/base/render-utils.d.ts +19 -0
  266. package/dist/ui/base/render-utils.js +25 -0
  267. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  268. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  269. package/dist/ui/constants/labels.d.ts +14 -0
  270. package/dist/ui/constants/labels.js +51 -0
  271. package/dist/ui/conversation-store.d.ts +55 -0
  272. package/dist/ui/conversation-store.js +107 -0
  273. package/dist/ui/conversation.js +11 -13
  274. package/dist/ui/diff.d.ts +7 -1
  275. package/dist/ui/diff.js +85 -48
  276. package/dist/ui/ephemeral.js +3 -9
  277. package/dist/ui/file-autocomplete.d.ts +24 -0
  278. package/dist/ui/file-autocomplete.js +56 -0
  279. package/dist/ui/footer-renderer.d.ts +69 -0
  280. package/dist/ui/footer-renderer.js +431 -0
  281. package/dist/ui/footer.d.ts +74 -7
  282. package/dist/ui/footer.js +173 -16
  283. package/dist/ui/input-controller.d.ts +51 -0
  284. package/dist/ui/input-controller.js +176 -0
  285. package/dist/ui/input-prompt.d.ts +19 -0
  286. package/dist/ui/input-prompt.js +206 -14
  287. package/dist/ui/keyboard-handler.d.ts +57 -0
  288. package/dist/ui/keyboard-handler.js +557 -0
  289. package/dist/ui/live-region-facade.d.ts +42 -0
  290. package/dist/ui/live-region-facade.js +205 -0
  291. package/dist/ui/live-region.d.ts +0 -4
  292. package/dist/ui/live-region.js +6 -14
  293. package/dist/ui/mascot/renderer.d.ts +1 -1
  294. package/dist/ui/mascot/renderer.js +37 -2
  295. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  296. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  297. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  298. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  299. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  300. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  301. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  302. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  303. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  304. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  305. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  306. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  307. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  308. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  309. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  310. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  311. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  312. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  313. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  314. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  315. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  316. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  317. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  318. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  319. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  320. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  321. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  322. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  323. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  324. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  325. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  326. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  327. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  328. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  329. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  330. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  331. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  332. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  333. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  334. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  335. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  336. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  337. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  338. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  339. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  340. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  341. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  342. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  343. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  344. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  345. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  346. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  347. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  348. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  349. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  350. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  351. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  352. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  353. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  354. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  355. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  356. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  357. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  358. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  359. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  360. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  361. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  362. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  363. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  364. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  365. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  366. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  367. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  368. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  369. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  370. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  371. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  372. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  373. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  374. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  375. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  376. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  377. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  378. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  379. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  380. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  381. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  382. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  383. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  384. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  385. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  386. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  387. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  388. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  389. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  390. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  391. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  392. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  393. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  394. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  395. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  396. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  397. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  398. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  399. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  400. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  401. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  402. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  403. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  404. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  405. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  406. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  407. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  408. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  409. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  410. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  411. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  412. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  413. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  414. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  415. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  416. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  417. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  418. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  419. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  420. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  421. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  422. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  423. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  424. package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -1
  425. package/dist/ui/overlay/index.d.ts +20 -1
  426. package/dist/ui/overlay/index.js +19 -0
  427. package/dist/ui/overlay/types.d.ts +5 -0
  428. package/dist/ui/overlay-manager.d.ts +43 -0
  429. package/dist/ui/overlay-manager.js +238 -0
  430. package/dist/ui/overlays.js +4 -16
  431. package/dist/ui/permission-overlay.js +6 -5
  432. package/dist/ui/status-bar-controller.d.ts +33 -0
  433. package/dist/ui/status-bar-controller.js +99 -0
  434. package/dist/ui/subagent-renderer.js +3 -19
  435. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  436. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  437. package/dist/ui/terminal-line-builders.d.ts +17 -0
  438. package/dist/ui/terminal-line-builders.js +42 -0
  439. package/dist/ui/terminal-render-item.d.ts +16 -0
  440. package/dist/ui/terminal-render-item.js +267 -0
  441. package/dist/ui/terminal-renderer.d.ts +7 -8
  442. package/dist/ui/terminal-renderer.js +7 -8
  443. package/dist/ui/terminal-types.d.ts +179 -0
  444. package/dist/ui/terminal-types.js +34 -0
  445. package/dist/ui/terminal-ui.d.ts +144 -276
  446. package/dist/ui/terminal-ui.js +384 -1861
  447. package/dist/ui/todo-zone.d.ts +19 -1
  448. package/dist/ui/todo-zone.js +71 -13
  449. package/dist/ui/tool-formatters.js +512 -1
  450. package/dist/ui/turn-metrics.d.ts +56 -0
  451. package/dist/ui/turn-metrics.js +75 -0
  452. package/dist/ui/types.d.ts +28 -0
  453. package/dist/ui/types.js +1 -0
  454. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  455. package/dist/ui/vscode-diff-ipc.js +385 -0
  456. package/dist/utils/credentials.d.ts +24 -5
  457. package/dist/utils/credentials.js +123 -9
  458. package/dist/utils/format-tokens.d.ts +13 -0
  459. package/dist/utils/format-tokens.js +18 -0
  460. package/dist/utils/git-config.d.ts +26 -0
  461. package/dist/utils/git-config.js +54 -0
  462. package/dist/utils/message-utils.d.ts +61 -0
  463. package/dist/utils/message-utils.js +72 -0
  464. package/dist/utils/model-tiers.d.ts +8 -1
  465. package/dist/utils/model-tiers.js +38 -16
  466. package/dist/utils/open-browser.d.ts +5 -0
  467. package/dist/utils/open-browser.js +32 -0
  468. package/dist/utils/path-safety.js +3 -2
  469. package/dist/utils/project-detection.d.ts +58 -0
  470. package/dist/utils/project-detection.js +424 -0
  471. package/dist/utils/project-memory.js +2 -1
  472. package/dist/utils/project-status.d.ts +2 -2
  473. package/dist/utils/startup-perf.d.ts +18 -0
  474. package/dist/utils/startup-perf.js +60 -0
  475. package/dist/utils/token-tracker.d.ts +62 -0
  476. package/dist/utils/token-tracker.js +150 -0
  477. package/dist/utils/token-types.d.ts +23 -0
  478. package/dist/utils/token-types.js +18 -0
  479. package/dist/utils/types/config-types.d.ts +32 -0
  480. package/dist/utils/types/config-types.js +8 -0
  481. package/dist/utils/update-checker.d.ts +28 -0
  482. package/dist/utils/update-checker.js +106 -0
  483. package/dist/utils/version.d.ts +7 -0
  484. package/dist/utils/version.js +10 -0
  485. package/dist/utils/vscode-detect.d.ts +39 -0
  486. package/dist/utils/vscode-detect.js +137 -0
  487. package/package.json +25 -12
  488. package/dist/commands/handler-types.d.ts +0 -68
  489. package/dist/commands/handler-types.js +0 -8
  490. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  491. package/dist/commands/handlers/agent-commands.js +0 -305
  492. package/dist/commands/handlers/design-commands.d.ts +0 -15
  493. package/dist/commands/handlers/design-commands.js +0 -334
  494. package/dist/commands/handlers/index.d.ts +0 -20
  495. package/dist/commands/handlers/index.js +0 -43
  496. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  497. package/dist/commands/handlers/overlay-commands.js +0 -287
  498. package/dist/commands/handlers/project-commands.d.ts +0 -11
  499. package/dist/commands/handlers/project-commands.js +0 -167
  500. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  501. package/dist/commands/handlers/simple-commands.js +0 -144
  502. package/dist/commands/registry.d.ts +0 -50
  503. package/dist/commands/registry.js +0 -75
  504. package/dist/index.old.d.ts +0 -7
  505. package/dist/index.old.js +0 -1014
  506. package/dist/repl.d.ts +0 -149
  507. package/dist/repl.js +0 -1151
  508. package/dist/templates/claude-md.d.ts +0 -7
  509. package/dist/templates/claude-md.js +0 -189
  510. package/dist/test-autocomplete.d.ts +0 -7
  511. package/dist/test-autocomplete.js +0 -85
  512. package/dist/test-tabbed-menu.d.ts +0 -7
  513. package/dist/test-tabbed-menu.js +0 -25
  514. package/dist/tool-selector.d.ts +0 -71
  515. package/dist/tool-selector.js +0 -184
  516. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  517. package/dist/ui/agents-overlay-v2.js +0 -809
  518. package/dist/ui/agents-overlay.d.ts +0 -12
  519. package/dist/ui/agents-overlay.js +0 -863
  520. package/dist/ui/anchors-overlay.d.ts +0 -12
  521. package/dist/ui/anchors-overlay.js +0 -775
  522. package/dist/ui/arch-type-overlay.d.ts +0 -15
  523. package/dist/ui/arch-type-overlay.js +0 -201
  524. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  525. package/dist/ui/ask-user-overlay-v2.js +0 -555
  526. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  527. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  528. package/dist/ui/backlog-overlay.d.ts +0 -32
  529. package/dist/ui/backlog-overlay.js +0 -652
  530. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  531. package/dist/ui/commands-overlay-v2.js +0 -441
  532. package/dist/ui/commands-overlay.d.ts +0 -16
  533. package/dist/ui/commands-overlay.js +0 -439
  534. package/dist/ui/config-overlay.d.ts +0 -35
  535. package/dist/ui/config-overlay.js +0 -707
  536. package/dist/ui/docs-overlay.d.ts +0 -17
  537. package/dist/ui/docs-overlay.js +0 -303
  538. package/dist/ui/footer-v2.d.ts +0 -222
  539. package/dist/ui/footer-v2.js +0 -1349
  540. package/dist/ui/help-overlay-v2.d.ts +0 -34
  541. package/dist/ui/help-overlay-v2.js +0 -309
  542. package/dist/ui/help-overlay.d.ts +0 -16
  543. package/dist/ui/help-overlay.js +0 -316
  544. package/dist/ui/init-overlay-v2.d.ts +0 -34
  545. package/dist/ui/init-overlay-v2.js +0 -600
  546. package/dist/ui/init-overlay.d.ts +0 -34
  547. package/dist/ui/init-overlay.js +0 -604
  548. package/dist/ui/input-prompt-v2.d.ts +0 -180
  549. package/dist/ui/input-prompt-v2.js +0 -999
  550. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  551. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  552. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  553. package/dist/ui/keys-overlay-v2.js +0 -248
  554. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  555. package/dist/ui/mascot-overlay-v2.js +0 -138
  556. package/dist/ui/mascot-overlay.d.ts +0 -21
  557. package/dist/ui/mascot-overlay.js +0 -146
  558. package/dist/ui/model-overlay-v2.d.ts +0 -49
  559. package/dist/ui/model-overlay-v2.js +0 -118
  560. package/dist/ui/model-overlay.d.ts +0 -27
  561. package/dist/ui/model-overlay.js +0 -221
  562. package/dist/ui/model-warning-overlay.d.ts +0 -30
  563. package/dist/ui/model-warning-overlay.js +0 -169
  564. package/dist/ui/new-overlay.d.ts +0 -34
  565. package/dist/ui/new-overlay.js +0 -604
  566. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  567. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  568. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  569. package/dist/ui/overlay/overlay-types.js +0 -22
  570. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  571. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  572. package/dist/ui/overlays/index.d.ts +0 -11
  573. package/dist/ui/overlays/index.js +0 -11
  574. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  575. package/dist/ui/permission-overlay-v2.js +0 -380
  576. package/dist/ui/projects-overlay.d.ts +0 -19
  577. package/dist/ui/projects-overlay.js +0 -484
  578. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  579. package/dist/ui/theme-overlay-v2.js +0 -135
  580. package/dist/ui/theme-overlay.d.ts +0 -24
  581. package/dist/ui/theme-overlay.js +0 -127
  582. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  583. package/dist/ui/tools-overlay-v2.js +0 -218
  584. package/dist/ui/tools-overlay.d.ts +0 -34
  585. package/dist/ui/tools-overlay.js +0 -230
  586. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  587. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  588. package/dist/ui/tutorial-overlay.d.ts +0 -11
  589. package/dist/ui/tutorial-overlay.js +0 -1034
  590. package/dist/ui/workflow-overlay.d.ts +0 -22
  591. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,557 @@
1
+ /**
2
+ * Keyboard input handler.
3
+ *
4
+ * Extracted from TerminalUI — owns keyboard capture, escape handling,
5
+ * overlay key routing, and the main keypress dispatch loop. Accesses
6
+ * sub-controllers (input, autocomplete, overlay, status bar) directly
7
+ * through the host interface.
8
+ */
9
+ import * as readline from 'readline';
10
+ import { parseKeyEvent } from './overlay/index.js';
11
+ export class KeyboardHandler {
12
+ keyHandler = null;
13
+ dataHandler = null;
14
+ lastEscapeTime = 0;
15
+ lastTabTime = 0;
16
+ host;
17
+ constructor(host) {
18
+ this.host = host;
19
+ }
20
+ // ===========================================================================
21
+ // Capture start / stop
22
+ // ===========================================================================
23
+ startCapture() {
24
+ if (this.keyHandler)
25
+ return; // Already capturing
26
+ readline.emitKeypressEvents(process.stdin);
27
+ if (process.stdin.isTTY) {
28
+ process.stdin.setRawMode(true);
29
+ }
30
+ // Handle raw data for reliable Escape and Option+Arrow detection
31
+ this.dataHandler = (data) => {
32
+ if (this.host.isGuardActive())
33
+ return;
34
+ // Pure Escape key is a single byte 0x1B
35
+ if (data.length === 1 && data[0] === 0x1b) {
36
+ this.handleEscape();
37
+ return;
38
+ }
39
+ // When an overlay is active, handle escape sequences directly from raw
40
+ // data. This avoids a bug where readline's emitKeys generator, left
41
+ // suspended after a standalone escape (e.g. popping a detail screen),
42
+ // misparsest the next escape sequence — arrow keys arrive as individual
43
+ // character keypresses instead of recognized key events.
44
+ if (this.host.hasActiveOverlay() && data[0] === 0x1b && data.length > 1) {
45
+ this.handleOverlayEscapeSequence(data);
46
+ return;
47
+ }
48
+ // Mac Option+Left (word left): ESC b or ESC [ 1 ; 9 D
49
+ const isOptionLeft = (data.length === 2 && data[0] === 0x1b && data[1] === 0x62) ||
50
+ (data.length === 6 &&
51
+ data[0] === 0x1b &&
52
+ data[1] === 0x5b &&
53
+ data[2] === 0x31 &&
54
+ data[3] === 0x3b &&
55
+ data[4] === 0x39 &&
56
+ data[5] === 0x44);
57
+ // Mac Option+Right (word right): ESC f or ESC [ 1 ; 9 C
58
+ const isOptionRight = (data.length === 2 && data[0] === 0x1b && data[1] === 0x66) ||
59
+ (data.length === 6 &&
60
+ data[0] === 0x1b &&
61
+ data[1] === 0x5b &&
62
+ data[2] === 0x31 &&
63
+ data[3] === 0x3b &&
64
+ data[4] === 0x39 &&
65
+ data[5] === 0x43);
66
+ if (isOptionLeft) {
67
+ if (this.host.input.moveWordLeft())
68
+ this.host.requestRender();
69
+ return;
70
+ }
71
+ if (isOptionRight) {
72
+ if (this.host.input.moveWordRight())
73
+ this.host.requestRender();
74
+ return;
75
+ }
76
+ // Home/Cmd+Left: Ctrl+A (\x01) or ESC [ H
77
+ const isHome = (data.length === 1 && data[0] === 0x01) ||
78
+ (data.length === 3 && data[0] === 0x1b && data[1] === 0x5b && data[2] === 0x48);
79
+ // End/Cmd+Right: Ctrl+E (\x05) or ESC [ F
80
+ const isEnd = (data.length === 1 && data[0] === 0x05) ||
81
+ (data.length === 3 && data[0] === 0x1b && data[1] === 0x5b && data[2] === 0x46);
82
+ if (isHome) {
83
+ this.host.input.cursorPos = 0;
84
+ this.host.requestRender();
85
+ return;
86
+ }
87
+ if (isEnd) {
88
+ this.host.input.cursorPos = this.host.input.lines[this.host.input.currentLine].length;
89
+ this.host.requestRender();
90
+ return;
91
+ }
92
+ };
93
+ this.keyHandler = (str, key) => {
94
+ if (this.host.isGuardActive())
95
+ return;
96
+ // Skip escape here - handled by dataHandler
97
+ if (key.name === 'escape')
98
+ return;
99
+ // When overlay is active, escape sequences are handled directly from
100
+ // raw data in dataHandler (see handleOverlayEscapeSequence). Skip them
101
+ // here to prevent double-processing.
102
+ if (this.host.hasActiveOverlay() && key.sequence?.startsWith('\x1b'))
103
+ return;
104
+ this.handleKeypress(str, key);
105
+ };
106
+ process.stdin.on('data', this.dataHandler);
107
+ process.stdin.on('keypress', this.keyHandler);
108
+ process.stdin.resume();
109
+ }
110
+ stopCapture() {
111
+ if (this.dataHandler) {
112
+ process.stdin.removeListener('data', this.dataHandler);
113
+ this.dataHandler = null;
114
+ }
115
+ if (this.keyHandler) {
116
+ process.stdin.removeListener('keypress', this.keyHandler);
117
+ this.keyHandler = null;
118
+ }
119
+ if (process.stdin.isTTY) {
120
+ process.stdin.setRawMode(false);
121
+ }
122
+ }
123
+ // ===========================================================================
124
+ // Escape handling
125
+ // ===========================================================================
126
+ handleEscape() {
127
+ const host = this.host;
128
+ const { input, ac } = host;
129
+ // In verbose-temp mode, escape returns to normal
130
+ if (host.getViewMode() === 'verbose-temp') {
131
+ host.setViewMode('normal');
132
+ host.reRenderConversationVerbose(false);
133
+ return;
134
+ }
135
+ // Route escape to active overlay if present
136
+ const overlay = host.getActiveOverlay();
137
+ if (overlay) {
138
+ const keyEvent = {
139
+ raw: Buffer.from([0x1b]),
140
+ name: 'escape',
141
+ ctrl: false,
142
+ shift: false,
143
+ meta: false,
144
+ };
145
+ const actionOrPromise = overlay.handleKey(keyEvent);
146
+ // Handle both sync and async handleKey
147
+ if (actionOrPromise instanceof Promise) {
148
+ actionOrPromise
149
+ .then((action) => { host.overlay.processOverlayAction(action); })
150
+ .catch((err) => { console.error('Overlay handleKey error:', err); });
151
+ }
152
+ else {
153
+ host.overlay.processOverlayAction(actionOrPromise);
154
+ }
155
+ return;
156
+ }
157
+ const now = Date.now();
158
+ const timeSinceLastEsc = now - this.lastEscapeTime;
159
+ const isDoubleEsc = timeSinceLastEsc < 500;
160
+ this.lastEscapeTime = now;
161
+ if (ac.isActive()) {
162
+ ac.close();
163
+ host.requestRender();
164
+ }
165
+ else if (isDoubleEsc && input.getInputValue().length > 0) {
166
+ // 4. Double Esc clears input (if there's content)
167
+ input.clearInput();
168
+ input.resetHistoryNavigation();
169
+ host.requestRender();
170
+ }
171
+ else if (host.isAgentRunning()) {
172
+ // 5. Single Esc cancels agent
173
+ host.emit('cancel');
174
+ }
175
+ else {
176
+ // 6. Single Esc emits escape
177
+ host.emit('escape');
178
+ }
179
+ }
180
+ // ===========================================================================
181
+ // Overlay key routing
182
+ // ===========================================================================
183
+ handleOverlayKeypress(str, key) {
184
+ const overlay = this.host.getActiveOverlay();
185
+ if (!overlay)
186
+ return;
187
+ // Build KeyEvent from keypress data
188
+ const rawData = key.sequence ?? str;
189
+ const keyName = key.name ?? (str ? str.toLowerCase() : '');
190
+ const keyEvent = {
191
+ raw: Buffer.from(rawData),
192
+ name: keyName,
193
+ char: str && str.length === 1 && str.charCodeAt(0) >= 32 ? str : undefined,
194
+ ctrl: key.ctrl ?? false,
195
+ shift: key.shift ?? false,
196
+ meta: key.meta ?? false,
197
+ };
198
+ const actionOrPromise = overlay.handleKey(keyEvent);
199
+ // Handle both sync and async handleKey
200
+ if (actionOrPromise instanceof Promise) {
201
+ actionOrPromise
202
+ .then((action) => { this.host.overlay.processOverlayAction(action); })
203
+ .catch((err) => { console.error('Overlay handleKey error:', err); });
204
+ }
205
+ else {
206
+ this.host.overlay.processOverlayAction(actionOrPromise);
207
+ }
208
+ }
209
+ /**
210
+ * Handle escape sequences for overlays directly from raw stdin data.
211
+ *
212
+ * Bypasses readline's keypress events which can be corrupted when the
213
+ * emitKeys generator is left suspended after a standalone escape key.
214
+ * Uses parseKeyEvent (from ui-core) to reliably parse the raw bytes.
215
+ */
216
+ handleOverlayEscapeSequence(data) {
217
+ const overlay = this.host.getActiveOverlay();
218
+ if (!overlay)
219
+ return;
220
+ const keyEvent = parseKeyEvent(data);
221
+ const actionOrPromise = overlay.handleKey(keyEvent);
222
+ if (actionOrPromise instanceof Promise) {
223
+ actionOrPromise
224
+ .then((action) => { this.host.overlay.processOverlayAction(action); })
225
+ .catch((err) => { console.error('Overlay handleKey error:', err); });
226
+ }
227
+ else {
228
+ this.host.overlay.processOverlayAction(actionOrPromise);
229
+ }
230
+ }
231
+ // ===========================================================================
232
+ // Autocomplete accept
233
+ // ===========================================================================
234
+ applyAutocomplete() {
235
+ const { input, ac } = this.host;
236
+ const wasFileActive = ac.file.active;
237
+ const result = ac.accept(input.lines, input.currentLine, input.cursorPos);
238
+ if (result) {
239
+ input.lines = result.lines;
240
+ input.currentLine = result.currentLine;
241
+ input.cursorPos = result.cursorPos;
242
+ // After file autocomplete, check if still in @ context (directory selected)
243
+ if (wasFileActive) {
244
+ ac.update(input.lines, input.currentLine, input.cursorPos);
245
+ }
246
+ }
247
+ }
248
+ // ===========================================================================
249
+ // Main keypress dispatch
250
+ // ===========================================================================
251
+ handleKeypress(str, key) {
252
+ const host = this.host;
253
+ const { input, ac } = host;
254
+ // Route to active overlay if present
255
+ if (host.hasActiveOverlay()) {
256
+ this.handleOverlayKeypress(str, key);
257
+ return;
258
+ }
259
+ // Status bar navigation mode intercepts all keys
260
+ if (host.statusBar.navActive) {
261
+ host.statusBar.handleKey(str, key);
262
+ return;
263
+ }
264
+ // In verbose-temp mode, any key (except Ctrl+O) returns to normal
265
+ if (host.getViewMode() === 'verbose-temp') {
266
+ // Ctrl+O toggles back
267
+ if (key.ctrl && key.name === 'o') {
268
+ host.toggleVerboseView();
269
+ host.toggleLiveRegionExpanded();
270
+ return;
271
+ }
272
+ // Any other key returns to normal
273
+ host.setViewMode('normal');
274
+ host.reRenderConversationVerbose(false);
275
+ // Don't consume the key - let it be processed normally
276
+ }
277
+ // Ctrl+C - interrupt/exit
278
+ if (key.ctrl && key.name === 'c') {
279
+ host.emit('interrupt');
280
+ return;
281
+ }
282
+ // Ctrl+T - toggle todo list visibility
283
+ if (key.ctrl && key.name === 't') {
284
+ host.toggleTodos();
285
+ return;
286
+ }
287
+ // Ctrl+O - toggle verbose view mode AND LiveRegion expansion
288
+ if (key.ctrl && key.name === 'o') {
289
+ host.toggleVerboseView();
290
+ host.toggleLiveRegionExpanded();
291
+ return;
292
+ }
293
+ // Ctrl+B - background active bash OR show background tasks overlay
294
+ if (key.ctrl && key.name === 'b') {
295
+ // If there's an active bash command, move it to background
296
+ if (host.hasActiveBash()) {
297
+ host.backgroundBashCommand();
298
+ return;
299
+ }
300
+ // Otherwise, show the tasks overlay
301
+ host.emit('showTasks');
302
+ return;
303
+ }
304
+ // Ctrl+R - view restored conversation history
305
+ if (key.ctrl && key.name === 'r') {
306
+ if (host.hasRestoredHistory()) {
307
+ host.showRestoredHistory();
308
+ }
309
+ return;
310
+ }
311
+ // Tab - accept suggestion, or autocomplete
312
+ if (key.name === 'tab' && !key.shift) {
313
+ // Accept ghost text suggestion if input is empty
314
+ if (input.suggestion && input.getInputValue() === '') {
315
+ input.lines[0] = input.suggestion;
316
+ input.cursorPos = input.suggestion.length;
317
+ input.suggestion = null;
318
+ host.requestRender();
319
+ return;
320
+ }
321
+ if (ac.isActive()) {
322
+ this.applyAutocomplete();
323
+ host.requestRender();
324
+ return;
325
+ }
326
+ // Double Tab → open /pending
327
+ const now = Date.now();
328
+ if (now - this.lastTabTime < 400) {
329
+ this.lastTabTime = 0;
330
+ host.emit('showPending');
331
+ return;
332
+ }
333
+ this.lastTabTime = now;
334
+ return;
335
+ }
336
+ // Enter - handle multiline continuation, autocomplete, then execute
337
+ if (key.name === 'return') {
338
+ // Check for backslash continuation at end of current line
339
+ const currentLine = input.getCurrentLineContent();
340
+ if (currentLine.endsWith('\\')) {
341
+ // Remove backslash and add new line
342
+ input.lines[input.currentLine] = currentLine.slice(0, -1);
343
+ input.lines.push('');
344
+ input.currentLine++;
345
+ input.cursorPos = 0;
346
+ ac.close();
347
+ input.resetHistoryNavigation();
348
+ host.requestRender();
349
+ return;
350
+ }
351
+ // If agent autocomplete is active, accept selection and let user type message
352
+ if (ac.agent.active && ac.agent.matches.length > 0) {
353
+ this.applyAutocomplete();
354
+ host.requestRender();
355
+ return; // Don't submit - let user type the message
356
+ }
357
+ // If file or command autocomplete is active, accept and fall through to submit
358
+ if (ac.isActive()) {
359
+ this.applyAutocomplete();
360
+ }
361
+ let inputValue = input.getInputValue().trim();
362
+ // If input is empty but we have a ghost text suggestion, accept it
363
+ if (!inputValue && input.suggestion) {
364
+ inputValue = input.suggestion;
365
+ input.suggestion = null;
366
+ }
367
+ if (inputValue) {
368
+ // Add to history before processing (store as single line for history)
369
+ input.addToHistory(inputValue.replace(/\n/g, ' '));
370
+ input.resetHistoryNavigation();
371
+ if (inputValue.startsWith('/')) {
372
+ // Slash commands always execute immediately, even when agent is busy.
373
+ // This ensures /pending, /bg, /fg, /kill are never blocked by a running agent.
374
+ const spaceIndex = inputValue.indexOf(' ');
375
+ const cmd = spaceIndex > 0 ? inputValue.slice(1, spaceIndex) : inputValue.slice(1);
376
+ const args = spaceIndex > 0 ? inputValue.slice(spaceIndex + 1) : '';
377
+ ac.close();
378
+ host.emit('command', cmd, args);
379
+ }
380
+ else if (inputValue.startsWith('$') && host.isAgentRunning()) {
381
+ // $agent prefix fires immediately when agent is busy (agent switching).
382
+ // When idle, falls through to normal submit path which handles $agent too.
383
+ const cleanedInput = inputValue.replace(/(?<![@\w])@([\w./-]+)/g, '$1');
384
+ host.emit('submit', cleanedInput);
385
+ }
386
+ else if (host.isAgentRunning()) {
387
+ // Regular messages queue when agent is busy
388
+ input.queuedInputs.push(inputValue);
389
+ host.requestRender();
390
+ }
391
+ else {
392
+ // Strip @ prefix from file paths (autocomplete uses @ but agent doesn't need it)
393
+ const cleanedInput = inputValue.replace(/(?<![@\w])@([\w./-]+)/g, '$1');
394
+ host.emit('submit', cleanedInput);
395
+ }
396
+ input.clearInput();
397
+ ac.close();
398
+ host.requestRender();
399
+ }
400
+ return;
401
+ }
402
+ // Arrow Up - autocomplete > multiline navigation > history
403
+ if (key.name === 'up') {
404
+ // 1. Autocomplete navigation takes priority
405
+ if (ac.navigateUp()) {
406
+ host.requestRender();
407
+ return;
408
+ }
409
+ // 2. Navigate to previous line in multiline input
410
+ if (input.currentLine > 0) {
411
+ input.currentLine--;
412
+ // Try to keep same cursor position, but clamp to line length
413
+ input.cursorPos = Math.min(input.cursorPos, input.lines[input.currentLine].length);
414
+ host.requestRender();
415
+ return;
416
+ }
417
+ // 3. History navigation (only when at first line)
418
+ if (input.navigateHistoryUp(ac.isActive())) {
419
+ ac.close();
420
+ host.requestRender();
421
+ }
422
+ return;
423
+ }
424
+ // Arrow Down - autocomplete > multiline navigation > history
425
+ if (key.name === 'down') {
426
+ // 1. Autocomplete navigation takes priority
427
+ if (ac.navigateDown()) {
428
+ host.requestRender();
429
+ return;
430
+ }
431
+ // 2. Navigate to next line in multiline input
432
+ if (input.currentLine < input.lines.length - 1) {
433
+ input.currentLine++;
434
+ // Try to keep same cursor position, but clamp to line length
435
+ input.cursorPos = Math.min(input.cursorPos, input.lines[input.currentLine].length);
436
+ host.requestRender();
437
+ return;
438
+ }
439
+ // 3. History forward (only when at last line)
440
+ if (input.historyIndex >= 0 && input.navigateHistoryDown(ac.isActive())) {
441
+ host.requestRender();
442
+ return;
443
+ }
444
+ // 4. Enter status bar navigation if navigable indicators exist
445
+ const statusItems = host.statusBar.getItems();
446
+ if (statusItems.length > 0) {
447
+ host.statusBar.navActive = true;
448
+ host.statusBar.selectedIndex = 0;
449
+ host.requestRender();
450
+ }
451
+ return;
452
+ }
453
+ // Backspace
454
+ if (key.name === 'backspace') {
455
+ if (input.cursorPos > 0) {
456
+ // Delete character in current line
457
+ const line = input.lines[input.currentLine];
458
+ input.lines[input.currentLine] = line.slice(0, input.cursorPos - 1) + line.slice(input.cursorPos);
459
+ input.cursorPos--;
460
+ input.resetHistoryNavigation();
461
+ ac.update(input.lines, input.currentLine, input.cursorPos);
462
+ host.requestRender();
463
+ }
464
+ else if (input.currentLine > 0) {
465
+ // At start of line - merge with previous line
466
+ const currentLineTxt = input.lines[input.currentLine];
467
+ const prevLine = input.lines[input.currentLine - 1];
468
+ input.lines[input.currentLine - 1] = prevLine + currentLineTxt;
469
+ input.lines.splice(input.currentLine, 1);
470
+ input.currentLine--;
471
+ input.cursorPos = prevLine.length;
472
+ input.resetHistoryNavigation();
473
+ ac.update(input.lines, input.currentLine, input.cursorPos);
474
+ host.requestRender();
475
+ }
476
+ return;
477
+ }
478
+ // Delete
479
+ if (key.name === 'delete') {
480
+ const line = input.lines[input.currentLine];
481
+ if (input.cursorPos < line.length) {
482
+ // Delete character in current line
483
+ input.lines[input.currentLine] = line.slice(0, input.cursorPos) + line.slice(input.cursorPos + 1);
484
+ input.resetHistoryNavigation();
485
+ ac.update(input.lines, input.currentLine, input.cursorPos);
486
+ host.requestRender();
487
+ }
488
+ else if (input.currentLine < input.lines.length - 1) {
489
+ // At end of line - merge with next line
490
+ const nextLine = input.lines[input.currentLine + 1];
491
+ input.lines[input.currentLine] = line + nextLine;
492
+ input.lines.splice(input.currentLine + 1, 1);
493
+ input.resetHistoryNavigation();
494
+ ac.update(input.lines, input.currentLine, input.cursorPos);
495
+ host.requestRender();
496
+ }
497
+ return;
498
+ }
499
+ // Arrow keys (left/right for cursor movement with multiline support)
500
+ if (key.name === 'left') {
501
+ if (input.cursorPos > 0) {
502
+ input.cursorPos--;
503
+ host.requestRender();
504
+ }
505
+ else if (input.currentLine > 0) {
506
+ // Move to end of previous line
507
+ input.currentLine--;
508
+ input.cursorPos = input.lines[input.currentLine].length;
509
+ host.requestRender();
510
+ }
511
+ return;
512
+ }
513
+ if (key.name === 'right') {
514
+ const lineLen = input.lines[input.currentLine].length;
515
+ if (input.cursorPos < lineLen) {
516
+ input.cursorPos++;
517
+ host.requestRender();
518
+ }
519
+ else if (input.currentLine < input.lines.length - 1) {
520
+ // Move to start of next line
521
+ input.currentLine++;
522
+ input.cursorPos = 0;
523
+ host.requestRender();
524
+ }
525
+ return;
526
+ }
527
+ if (key.name === 'home') {
528
+ input.cursorPos = 0;
529
+ host.requestRender();
530
+ return;
531
+ }
532
+ if (key.name === 'end') {
533
+ input.cursorPos = input.lines[input.currentLine].length;
534
+ host.requestRender();
535
+ return;
536
+ }
537
+ // Shift+Tab - mode change
538
+ if (key.shift && key.name === 'tab') {
539
+ host.emit('modeChange');
540
+ return;
541
+ }
542
+ // Regular character
543
+ if (str && str.length === 1 && str.charCodeAt(0) >= 32) {
544
+ // Clear ghost text suggestion when user starts typing
545
+ if (input.suggestion) {
546
+ input.suggestion = null;
547
+ }
548
+ const line = input.lines[input.currentLine];
549
+ input.lines[input.currentLine] =
550
+ line.slice(0, input.cursorPos) + str + line.slice(input.cursorPos);
551
+ input.cursorPos++;
552
+ input.resetHistoryNavigation();
553
+ ac.update(input.lines, input.currentLine, input.cursorPos);
554
+ host.requestRender();
555
+ }
556
+ }
557
+ }
@@ -0,0 +1,42 @@
1
+ /**
2
+ * LiveRegion facade.
3
+ *
4
+ * Extracted from TerminalUI — owns the LiveRegion instance and active
5
+ * bash tracking. Methods that need to commit items to the scrolling
6
+ * zone or emit events go through the host interface.
7
+ */
8
+ import { LiveRegion, type LiveItem, type SubagentLiveItem } from './live-region.js';
9
+ import type { PrintableItem } from './terminal-types.js';
10
+ export interface LiveRegionHost {
11
+ requestRender(): void;
12
+ print(item: PrintableItem): void;
13
+ emit(event: string, ...args: unknown[]): void;
14
+ setSpinnerText(text: string | null): void;
15
+ }
16
+ export declare class LiveRegionFacade {
17
+ /** The underlying LiveRegion (exposed for render pipeline). */
18
+ readonly region: LiveRegion;
19
+ /** Active bash command tracking (for Ctrl+B background feature). */
20
+ activeBashToolUseId: string | null;
21
+ private readonly host;
22
+ constructor(host: LiveRegionHost);
23
+ addSubagent(id: string, agentType: string, description: string): void;
24
+ updateSubagentTool(id: string, toolName: string, summary: string): void;
25
+ completeSubagent(id: string, success: boolean, tokenCount?: number, _error?: string): void;
26
+ removeSubagent(id: string): LiveItem | undefined;
27
+ commitSubagent(id: string, resultContent: string, success: boolean): SubagentLiveItem | undefined;
28
+ addBashCommand(id: string, command: string): void;
29
+ updateBashOutput(id: string, line: string): void;
30
+ completeBashCommand(id: string, exitCode: number): void;
31
+ commitBashCommand(id: string): void;
32
+ backgroundBashCommand(): void;
33
+ hasActiveBash(): boolean;
34
+ getActiveBashInfo(): {
35
+ toolUseId: string;
36
+ startTime: number;
37
+ } | null;
38
+ clearLiveRegion(): void;
39
+ toggleLiveRegionExpanded(): void;
40
+ hasLiveItems(): boolean;
41
+ getLiveRegion(): LiveRegion;
42
+ }