@compilr-dev/cli 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/LICENSE +108 -0
  2. package/README.md +237 -69
  3. package/dist/.tsbuildinfo.app +1 -0
  4. package/dist/.tsbuildinfo.data +1 -0
  5. package/dist/.tsbuildinfo.domain +1 -0
  6. package/dist/.tsbuildinfo.foundation +1 -0
  7. package/dist/agent.d.ts +61 -4
  8. package/dist/agent.js +241 -245
  9. package/dist/anchors/index.d.ts +1 -1
  10. package/dist/anchors/index.js +1 -1
  11. package/dist/anchors/project-anchors.d.ts +2 -2
  12. package/dist/anchors/project-anchors.js +1 -1
  13. package/dist/auth/api-client.d.ts +124 -0
  14. package/dist/auth/api-client.js +261 -0
  15. package/dist/auth/index.d.ts +172 -0
  16. package/dist/auth/index.js +545 -0
  17. package/dist/auth/storage.d.ts +52 -0
  18. package/dist/auth/storage.js +118 -0
  19. package/dist/changelog/index.d.ts +16 -0
  20. package/dist/changelog/index.js +24 -0
  21. package/dist/changelog/releases.d.ts +17 -0
  22. package/dist/changelog/releases.js +63 -0
  23. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  24. package/dist/commands-v2/handlers/auth.js +118 -0
  25. package/dist/commands-v2/handlers/background.d.ts +14 -0
  26. package/dist/commands-v2/handlers/background.js +276 -0
  27. package/dist/commands-v2/handlers/context.js +286 -81
  28. package/dist/commands-v2/handlers/core.d.ts +1 -0
  29. package/dist/commands-v2/handlers/core.js +133 -8
  30. package/dist/commands-v2/handlers/debug.js +18 -0
  31. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  32. package/dist/commands-v2/handlers/delegations.js +29 -0
  33. package/dist/commands-v2/handlers/files.d.ts +8 -0
  34. package/dist/commands-v2/handlers/files.js +162 -0
  35. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  36. package/dist/commands-v2/handlers/filter.js +130 -0
  37. package/dist/commands-v2/handlers/games.d.ts +7 -0
  38. package/dist/commands-v2/handlers/games.js +57 -0
  39. package/dist/commands-v2/handlers/index.d.ts +13 -0
  40. package/dist/commands-v2/handlers/index.js +39 -0
  41. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  42. package/dist/commands-v2/handlers/mcp.js +39 -0
  43. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  44. package/dist/commands-v2/handlers/notifications.js +34 -0
  45. package/dist/commands-v2/handlers/project.js +295 -31
  46. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  47. package/dist/commands-v2/handlers/reset.js +118 -0
  48. package/dist/commands-v2/handlers/session.d.ts +161 -0
  49. package/dist/commands-v2/handlers/session.js +805 -0
  50. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  51. package/dist/commands-v2/handlers/settings.js +217 -35
  52. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  53. package/dist/commands-v2/handlers/tasks.js +36 -0
  54. package/dist/commands-v2/handlers/team.d.ts +9 -0
  55. package/dist/commands-v2/handlers/team.js +549 -0
  56. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  57. package/dist/commands-v2/handlers/terminals.js +34 -0
  58. package/dist/commands-v2/index.d.ts +3 -2
  59. package/dist/commands-v2/index.js +4 -1
  60. package/dist/commands-v2/registry.d.ts +15 -0
  61. package/dist/commands-v2/registry.js +34 -0
  62. package/dist/commands-v2/types.d.ts +81 -3
  63. package/dist/commands.js +13 -0
  64. package/dist/compilr-diff-companion.vsix +0 -0
  65. package/dist/db/index.js +98 -4
  66. package/dist/db/repositories/document-repository.d.ts +2 -0
  67. package/dist/db/repositories/document-repository.js +6 -1
  68. package/dist/db/repositories/index.d.ts +2 -0
  69. package/dist/db/repositories/index.js +1 -0
  70. package/dist/db/repositories/plan-repository.d.ts +101 -0
  71. package/dist/db/repositories/plan-repository.js +275 -0
  72. package/dist/db/repositories/project-repository.d.ts +6 -0
  73. package/dist/db/repositories/project-repository.js +41 -0
  74. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  75. package/dist/db/repositories/work-item-repository.js +69 -4
  76. package/dist/db/schema.d.ts +40 -3
  77. package/dist/db/schema.js +66 -3
  78. package/dist/episodes/index.d.ts +20 -0
  79. package/dist/episodes/index.js +27 -0
  80. package/dist/episodes/recorder.d.ts +51 -0
  81. package/dist/episodes/recorder.js +195 -0
  82. package/dist/episodes/significant-work.d.ts +21 -0
  83. package/dist/episodes/significant-work.js +56 -0
  84. package/dist/episodes/store.d.ts +38 -0
  85. package/dist/episodes/store.js +199 -0
  86. package/dist/episodes/types.d.ts +35 -0
  87. package/dist/episodes/types.js +6 -0
  88. package/dist/episodes/work-at-risk.d.ts +12 -0
  89. package/dist/episodes/work-at-risk.js +38 -0
  90. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  91. package/dist/episodes/work-summary-anchor.js +73 -0
  92. package/dist/games/coins.d.ts +66 -0
  93. package/dist/games/coins.js +165 -0
  94. package/dist/games/game-base.d.ts +84 -0
  95. package/dist/games/game-base.js +204 -0
  96. package/dist/games/index.d.ts +16 -0
  97. package/dist/games/index.js +49 -0
  98. package/dist/games/scores.d.ts +69 -0
  99. package/dist/games/scores.js +191 -0
  100. package/dist/games/tetris/board.d.ts +59 -0
  101. package/dist/games/tetris/board.js +170 -0
  102. package/dist/games/tetris/index.d.ts +109 -0
  103. package/dist/games/tetris/index.js +610 -0
  104. package/dist/games/tetris/pieces.d.ts +44 -0
  105. package/dist/games/tetris/pieces.js +271 -0
  106. package/dist/games/tetris/renderer.d.ts +26 -0
  107. package/dist/games/tetris/renderer.js +77 -0
  108. package/dist/guide/guide-content.d.ts +23 -0
  109. package/dist/guide/guide-content.js +196 -0
  110. package/dist/guide/index.d.ts +8 -0
  111. package/dist/guide/index.js +7 -0
  112. package/dist/guide/shared-content.d.ts +37 -0
  113. package/dist/guide/shared-content.js +1272 -0
  114. package/dist/guide/tutorial-helpers.d.ts +57 -0
  115. package/dist/guide/tutorial-helpers.js +147 -0
  116. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  117. package/dist/handlers/ask-user-handlers.js +104 -0
  118. package/dist/handlers/delegation-handlers.d.ts +34 -0
  119. package/dist/handlers/delegation-handlers.js +291 -0
  120. package/dist/handlers/permission-handler.d.ts +30 -0
  121. package/dist/handlers/permission-handler.js +205 -0
  122. package/dist/index.d.ts +11 -1
  123. package/dist/index.js +448 -271
  124. package/dist/input-handlers/memory-handler.d.ts +1 -1
  125. package/dist/input-handlers/memory-handler.js +2 -1
  126. package/dist/models/index.d.ts +10 -0
  127. package/dist/models/index.js +12 -0
  128. package/dist/models/model-registry.d.ts +38 -0
  129. package/dist/models/model-registry.js +69 -0
  130. package/dist/models/model-tiers.d.ts +28 -0
  131. package/dist/models/model-tiers.js +71 -0
  132. package/dist/models/model-validation.d.ts +25 -0
  133. package/dist/models/model-validation.js +291 -0
  134. package/dist/models/ollama-models.d.ts +73 -0
  135. package/dist/models/ollama-models.js +178 -0
  136. package/dist/models/provider-types.d.ts +6 -0
  137. package/dist/models/provider-types.js +1 -0
  138. package/dist/models/providers.d.ts +35 -0
  139. package/dist/models/providers.js +58 -0
  140. package/dist/models/types.d.ts +4 -0
  141. package/dist/models/types.js +4 -0
  142. package/dist/multi-agent/activity.d.ts +21 -0
  143. package/dist/multi-agent/activity.js +34 -0
  144. package/dist/multi-agent/agent-selection.d.ts +55 -0
  145. package/dist/multi-agent/agent-selection.js +90 -0
  146. package/dist/multi-agent/artifacts.d.ts +197 -0
  147. package/dist/multi-agent/artifacts.js +379 -0
  148. package/dist/multi-agent/checkpointer.d.ts +138 -0
  149. package/dist/multi-agent/checkpointer.js +471 -0
  150. package/dist/multi-agent/collision-utils.d.ts +16 -0
  151. package/dist/multi-agent/collision-utils.js +28 -0
  152. package/dist/multi-agent/context-resolver.d.ts +97 -0
  153. package/dist/multi-agent/context-resolver.js +316 -0
  154. package/dist/multi-agent/custom-agents.d.ts +83 -0
  155. package/dist/multi-agent/custom-agents.js +227 -0
  156. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  157. package/dist/multi-agent/delegation-tracker.js +243 -0
  158. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  159. package/dist/multi-agent/file-lock-hook.js +97 -0
  160. package/dist/multi-agent/file-locks.d.ts +58 -0
  161. package/dist/multi-agent/file-locks.js +194 -0
  162. package/dist/multi-agent/index.d.ts +24 -0
  163. package/dist/multi-agent/index.js +30 -0
  164. package/dist/multi-agent/mention-parser.d.ts +64 -0
  165. package/dist/multi-agent/mention-parser.js +146 -0
  166. package/dist/multi-agent/notification-manager.d.ts +84 -0
  167. package/dist/multi-agent/notification-manager.js +224 -0
  168. package/dist/multi-agent/pending-requests.d.ts +122 -0
  169. package/dist/multi-agent/pending-requests.js +155 -0
  170. package/dist/multi-agent/session-registry.d.ts +139 -0
  171. package/dist/multi-agent/session-registry.js +514 -0
  172. package/dist/multi-agent/shared-context.d.ts +293 -0
  173. package/dist/multi-agent/shared-context.js +671 -0
  174. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  175. package/dist/multi-agent/skill-requirements.js +178 -0
  176. package/dist/multi-agent/task-assignment.d.ts +69 -0
  177. package/dist/multi-agent/task-assignment.js +123 -0
  178. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  179. package/dist/multi-agent/task-suggestion.js +72 -0
  180. package/dist/multi-agent/team-agent.d.ts +201 -0
  181. package/dist/multi-agent/team-agent.js +488 -0
  182. package/dist/multi-agent/team.d.ts +286 -0
  183. package/dist/multi-agent/team.js +610 -0
  184. package/dist/multi-agent/tool-config.d.ts +110 -0
  185. package/dist/multi-agent/tool-config.js +661 -0
  186. package/dist/multi-agent/types.d.ts +211 -0
  187. package/dist/multi-agent/types.js +617 -0
  188. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  189. package/dist/prompts/plan-mode-prompt.js +95 -0
  190. package/dist/repl-helpers.js +5 -2
  191. package/dist/repl-v2.d.ts +401 -2
  192. package/dist/repl-v2.js +2588 -65
  193. package/dist/session/index.d.ts +6 -0
  194. package/dist/session/index.js +6 -0
  195. package/dist/session/project-session-manager.d.ts +158 -0
  196. package/dist/session/project-session-manager.js +650 -0
  197. package/dist/settings/index.d.ts +133 -13
  198. package/dist/settings/index.js +329 -24
  199. package/dist/settings/mcp-config.d.ts +76 -0
  200. package/dist/settings/mcp-config.js +143 -0
  201. package/dist/settings/paths.d.ts +4 -0
  202. package/dist/settings/paths.js +6 -0
  203. package/dist/shared-handlers.d.ts +62 -0
  204. package/dist/shared-handlers.js +48 -0
  205. package/dist/system-prompt/builder.d.ts +5 -0
  206. package/dist/system-prompt/builder.js +4 -0
  207. package/dist/system-prompt/index.d.ts +18 -0
  208. package/dist/system-prompt/index.js +18 -0
  209. package/dist/system-prompt/modules.d.ts +5 -0
  210. package/dist/system-prompt/modules.js +4 -0
  211. package/dist/tabbed-menu.js +2 -1
  212. package/dist/templates/compilr-md-import.d.ts +16 -0
  213. package/dist/templates/compilr-md-import.js +241 -0
  214. package/dist/templates/compilr-md.js +10 -61
  215. package/dist/templates/config-json.d.ts +1 -25
  216. package/dist/templates/index.d.ts +2 -0
  217. package/dist/templates/index.js +34 -73
  218. package/dist/tool-names.d.ts +113 -0
  219. package/dist/tool-names.js +239 -0
  220. package/dist/tools/ask-user-simple.d.ts +1 -1
  221. package/dist/tools/ask-user-simple.js +2 -1
  222. package/dist/tools/ask-user.d.ts +1 -1
  223. package/dist/tools/ask-user.js +2 -1
  224. package/dist/tools/backlog.d.ts +2 -2
  225. package/dist/tools/backlog.js +1 -1
  226. package/dist/tools/db-tools.d.ts +13 -61
  227. package/dist/tools/db-tools.js +12 -13
  228. package/dist/tools/delegate-background.d.ts +27 -0
  229. package/dist/tools/delegate-background.js +115 -0
  230. package/dist/tools/delegate.d.ts +22 -0
  231. package/dist/tools/delegate.js +97 -0
  232. package/dist/tools/delegation-status.d.ts +16 -0
  233. package/dist/tools/delegation-status.js +128 -0
  234. package/dist/tools/guide-tool.d.ts +12 -0
  235. package/dist/tools/guide-tool.js +59 -0
  236. package/dist/tools/handoff.d.ts +25 -0
  237. package/dist/tools/handoff.js +99 -0
  238. package/dist/tools/meta-tools.d.ts +26 -0
  239. package/dist/tools/meta-tools.js +47 -0
  240. package/dist/tools/platform-adapter.d.ts +35 -0
  241. package/dist/tools/platform-adapter.js +404 -0
  242. package/dist/tools/project-db.d.ts +5 -73
  243. package/dist/tools/project-db.js +5 -336
  244. package/dist/tools.d.ts +67 -2
  245. package/dist/tools.js +240 -48
  246. package/dist/ui/autocomplete-controller.d.ts +42 -0
  247. package/dist/ui/autocomplete-controller.js +384 -0
  248. package/dist/ui/base/index.d.ts +1 -1
  249. package/dist/ui/base/index.js +1 -1
  250. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  251. package/dist/ui/base/overlay-base-v2.js +14 -0
  252. package/dist/ui/base/render-utils.d.ts +19 -0
  253. package/dist/ui/base/render-utils.js +25 -0
  254. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  255. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  256. package/dist/ui/constants/labels.d.ts +14 -0
  257. package/dist/ui/constants/labels.js +52 -0
  258. package/dist/ui/conversation-store.d.ts +55 -0
  259. package/dist/ui/conversation-store.js +107 -0
  260. package/dist/ui/conversation.js +11 -13
  261. package/dist/ui/diff.d.ts +7 -1
  262. package/dist/ui/diff.js +85 -48
  263. package/dist/ui/ephemeral.js +3 -9
  264. package/dist/ui/file-autocomplete.d.ts +24 -0
  265. package/dist/ui/file-autocomplete.js +56 -0
  266. package/dist/ui/footer-renderer.d.ts +69 -0
  267. package/dist/ui/footer-renderer.js +431 -0
  268. package/dist/ui/footer.d.ts +74 -7
  269. package/dist/ui/footer.js +173 -16
  270. package/dist/ui/input-controller.d.ts +51 -0
  271. package/dist/ui/input-controller.js +176 -0
  272. package/dist/ui/input-prompt.d.ts +19 -0
  273. package/dist/ui/input-prompt.js +206 -14
  274. package/dist/ui/keyboard-handler.d.ts +57 -0
  275. package/dist/ui/keyboard-handler.js +557 -0
  276. package/dist/ui/live-region-facade.d.ts +42 -0
  277. package/dist/ui/live-region-facade.js +205 -0
  278. package/dist/ui/live-region.d.ts +0 -4
  279. package/dist/ui/live-region.js +6 -14
  280. package/dist/ui/mascot/renderer.d.ts +1 -1
  281. package/dist/ui/mascot/renderer.js +37 -2
  282. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  283. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  284. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  285. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  286. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  287. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  288. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  289. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  290. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  291. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  292. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  293. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  294. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  295. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  296. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  297. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  298. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  299. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  300. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  301. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  302. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  303. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  304. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  305. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  306. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  307. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  308. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  309. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  310. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  311. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  312. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  313. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  314. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  315. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  316. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  317. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  318. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  319. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  320. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  321. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  322. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  323. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  324. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  325. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  326. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  327. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  328. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  329. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  330. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  331. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  332. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  333. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  334. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  335. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  336. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  337. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  338. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  339. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  340. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  341. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  342. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  343. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  344. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  345. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  346. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  347. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  348. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  349. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  350. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  351. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  352. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  353. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  354. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  355. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  356. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  357. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  358. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  359. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  360. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  361. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  362. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  363. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  364. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  365. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  366. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  367. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  368. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  369. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  370. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  371. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  372. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  373. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  374. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  375. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  376. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  377. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  378. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  379. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  380. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  381. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  382. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  383. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  384. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  385. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  386. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  387. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  388. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  389. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  390. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  391. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  392. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  393. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  394. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  395. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  396. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  397. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  398. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  399. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  400. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  401. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  402. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  403. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  404. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  405. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  406. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  407. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  408. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  409. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  410. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  411. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
  412. package/dist/ui/overlay/impl/workflow-overlay-v2.js +10 -4
  413. package/dist/ui/overlay/index.d.ts +20 -1
  414. package/dist/ui/overlay/index.js +19 -0
  415. package/dist/ui/overlay/types.d.ts +5 -0
  416. package/dist/ui/overlay-manager.d.ts +43 -0
  417. package/dist/ui/overlay-manager.js +238 -0
  418. package/dist/ui/overlays.js +4 -16
  419. package/dist/ui/permission-overlay.js +6 -5
  420. package/dist/ui/status-bar-controller.d.ts +33 -0
  421. package/dist/ui/status-bar-controller.js +99 -0
  422. package/dist/ui/subagent-renderer.js +3 -19
  423. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  424. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  425. package/dist/ui/terminal-line-builders.d.ts +17 -0
  426. package/dist/ui/terminal-line-builders.js +42 -0
  427. package/dist/ui/terminal-render-item.d.ts +16 -0
  428. package/dist/ui/terminal-render-item.js +267 -0
  429. package/dist/ui/terminal-renderer.d.ts +7 -8
  430. package/dist/ui/terminal-renderer.js +7 -8
  431. package/dist/ui/terminal-types.d.ts +179 -0
  432. package/dist/ui/terminal-types.js +34 -0
  433. package/dist/ui/terminal-ui.d.ts +144 -276
  434. package/dist/ui/terminal-ui.js +384 -1861
  435. package/dist/ui/todo-zone.d.ts +19 -1
  436. package/dist/ui/todo-zone.js +71 -13
  437. package/dist/ui/tool-formatters.js +696 -1
  438. package/dist/ui/turn-metrics.d.ts +56 -0
  439. package/dist/ui/turn-metrics.js +75 -0
  440. package/dist/ui/types.d.ts +28 -0
  441. package/dist/ui/types.js +1 -0
  442. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  443. package/dist/ui/vscode-diff-ipc.js +385 -0
  444. package/dist/utils/credentials.d.ts +24 -5
  445. package/dist/utils/credentials.js +123 -9
  446. package/dist/utils/format-tokens.d.ts +13 -0
  447. package/dist/utils/format-tokens.js +18 -0
  448. package/dist/utils/git-config.d.ts +26 -0
  449. package/dist/utils/git-config.js +54 -0
  450. package/dist/utils/message-utils.d.ts +61 -0
  451. package/dist/utils/message-utils.js +72 -0
  452. package/dist/utils/model-tiers.d.ts +8 -1
  453. package/dist/utils/model-tiers.js +38 -16
  454. package/dist/utils/open-browser.d.ts +5 -0
  455. package/dist/utils/open-browser.js +32 -0
  456. package/dist/utils/path-safety.js +3 -2
  457. package/dist/utils/project-detection.d.ts +58 -0
  458. package/dist/utils/project-detection.js +424 -0
  459. package/dist/utils/project-memory.js +2 -1
  460. package/dist/utils/project-status.d.ts +2 -2
  461. package/dist/utils/startup-perf.d.ts +18 -0
  462. package/dist/utils/startup-perf.js +60 -0
  463. package/dist/utils/token-tracker.d.ts +62 -0
  464. package/dist/utils/token-tracker.js +150 -0
  465. package/dist/utils/token-types.d.ts +23 -0
  466. package/dist/utils/token-types.js +18 -0
  467. package/dist/utils/types/config-types.d.ts +32 -0
  468. package/dist/utils/types/config-types.js +8 -0
  469. package/dist/utils/update-checker.d.ts +28 -0
  470. package/dist/utils/update-checker.js +106 -0
  471. package/dist/utils/version.d.ts +7 -0
  472. package/dist/utils/version.js +10 -0
  473. package/dist/utils/vscode-detect.d.ts +39 -0
  474. package/dist/utils/vscode-detect.js +137 -0
  475. package/package.json +27 -13
  476. package/dist/commands/handler-types.d.ts +0 -68
  477. package/dist/commands/handler-types.js +0 -8
  478. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  479. package/dist/commands/handlers/agent-commands.js +0 -305
  480. package/dist/commands/handlers/design-commands.d.ts +0 -15
  481. package/dist/commands/handlers/design-commands.js +0 -334
  482. package/dist/commands/handlers/index.d.ts +0 -20
  483. package/dist/commands/handlers/index.js +0 -43
  484. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  485. package/dist/commands/handlers/overlay-commands.js +0 -287
  486. package/dist/commands/handlers/project-commands.d.ts +0 -11
  487. package/dist/commands/handlers/project-commands.js +0 -167
  488. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  489. package/dist/commands/handlers/simple-commands.js +0 -144
  490. package/dist/commands/registry.d.ts +0 -50
  491. package/dist/commands/registry.js +0 -75
  492. package/dist/index.old.d.ts +0 -7
  493. package/dist/index.old.js +0 -1014
  494. package/dist/repl.d.ts +0 -149
  495. package/dist/repl.js +0 -1151
  496. package/dist/templates/claude-md.d.ts +0 -7
  497. package/dist/templates/claude-md.js +0 -189
  498. package/dist/test-autocomplete.d.ts +0 -7
  499. package/dist/test-autocomplete.js +0 -85
  500. package/dist/test-tabbed-menu.d.ts +0 -7
  501. package/dist/test-tabbed-menu.js +0 -25
  502. package/dist/tool-selector.d.ts +0 -71
  503. package/dist/tool-selector.js +0 -184
  504. package/dist/tools/anchor-tools.d.ts +0 -31
  505. package/dist/tools/anchor-tools.js +0 -255
  506. package/dist/tools/backlog-wrappers.d.ts +0 -54
  507. package/dist/tools/backlog-wrappers.js +0 -338
  508. package/dist/tools/document-db.d.ts +0 -43
  509. package/dist/tools/document-db.js +0 -220
  510. package/dist/tools/workitem-db.d.ts +0 -103
  511. package/dist/tools/workitem-db.js +0 -549
  512. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  513. package/dist/ui/agents-overlay-v2.js +0 -809
  514. package/dist/ui/agents-overlay.d.ts +0 -12
  515. package/dist/ui/agents-overlay.js +0 -863
  516. package/dist/ui/anchors-overlay.d.ts +0 -12
  517. package/dist/ui/anchors-overlay.js +0 -775
  518. package/dist/ui/arch-type-overlay.d.ts +0 -15
  519. package/dist/ui/arch-type-overlay.js +0 -201
  520. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  521. package/dist/ui/ask-user-overlay-v2.js +0 -555
  522. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  523. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  524. package/dist/ui/backlog-overlay.d.ts +0 -32
  525. package/dist/ui/backlog-overlay.js +0 -652
  526. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  527. package/dist/ui/commands-overlay-v2.js +0 -441
  528. package/dist/ui/commands-overlay.d.ts +0 -16
  529. package/dist/ui/commands-overlay.js +0 -439
  530. package/dist/ui/config-overlay.d.ts +0 -35
  531. package/dist/ui/config-overlay.js +0 -707
  532. package/dist/ui/docs-overlay.d.ts +0 -17
  533. package/dist/ui/docs-overlay.js +0 -303
  534. package/dist/ui/footer-v2.d.ts +0 -222
  535. package/dist/ui/footer-v2.js +0 -1349
  536. package/dist/ui/help-overlay-v2.d.ts +0 -34
  537. package/dist/ui/help-overlay-v2.js +0 -309
  538. package/dist/ui/help-overlay.d.ts +0 -16
  539. package/dist/ui/help-overlay.js +0 -316
  540. package/dist/ui/init-overlay-v2.d.ts +0 -34
  541. package/dist/ui/init-overlay-v2.js +0 -600
  542. package/dist/ui/init-overlay.d.ts +0 -34
  543. package/dist/ui/init-overlay.js +0 -604
  544. package/dist/ui/input-prompt-v2.d.ts +0 -180
  545. package/dist/ui/input-prompt-v2.js +0 -999
  546. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  547. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  548. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  549. package/dist/ui/keys-overlay-v2.js +0 -248
  550. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  551. package/dist/ui/mascot-overlay-v2.js +0 -138
  552. package/dist/ui/mascot-overlay.d.ts +0 -21
  553. package/dist/ui/mascot-overlay.js +0 -146
  554. package/dist/ui/model-overlay-v2.d.ts +0 -49
  555. package/dist/ui/model-overlay-v2.js +0 -118
  556. package/dist/ui/model-overlay.d.ts +0 -27
  557. package/dist/ui/model-overlay.js +0 -221
  558. package/dist/ui/model-warning-overlay.d.ts +0 -30
  559. package/dist/ui/model-warning-overlay.js +0 -169
  560. package/dist/ui/new-overlay.d.ts +0 -34
  561. package/dist/ui/new-overlay.js +0 -604
  562. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  563. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  564. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  565. package/dist/ui/overlay/overlay-types.js +0 -22
  566. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  567. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  568. package/dist/ui/overlays/index.d.ts +0 -11
  569. package/dist/ui/overlays/index.js +0 -11
  570. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  571. package/dist/ui/permission-overlay-v2.js +0 -380
  572. package/dist/ui/projects-overlay.d.ts +0 -19
  573. package/dist/ui/projects-overlay.js +0 -484
  574. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  575. package/dist/ui/theme-overlay-v2.js +0 -135
  576. package/dist/ui/theme-overlay.d.ts +0 -24
  577. package/dist/ui/theme-overlay.js +0 -127
  578. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  579. package/dist/ui/tools-overlay-v2.js +0 -218
  580. package/dist/ui/tools-overlay.d.ts +0 -34
  581. package/dist/ui/tools-overlay.js +0 -230
  582. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  583. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  584. package/dist/ui/tutorial-overlay.d.ts +0 -11
  585. package/dist/ui/tutorial-overlay.js +0 -1034
  586. package/dist/ui/workflow-overlay.d.ts +0 -22
  587. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,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
+ }