@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,384 @@
1
+ /**
2
+ * Autocomplete controller for command, file, and agent autocomplete.
3
+ *
4
+ * Extracted from TerminalUI — owns all three autocomplete states and their
5
+ * management methods. Input state is passed in as parameters; accept() returns
6
+ * new input state instead of mutating directly.
7
+ */
8
+ import { getStyles } from '../themes/index.js';
9
+ import { getVisibleLength } from './line-utils.js';
10
+ import { MAX_VISIBLE_COMMANDS, } from './terminal-types.js';
11
+ import { filterCommands } from './terminal-autocomplete-utils.js';
12
+ import { getFileMatches, extractAtMention, replaceAtMention, extractDollarMention, replaceDollarMention, } from './file-autocomplete.js';
13
+ export class AutocompleteController {
14
+ command = {
15
+ active: false,
16
+ matches: [],
17
+ selectedIndex: 0,
18
+ scrollOffset: 0,
19
+ };
20
+ file = {
21
+ active: false,
22
+ matches: [],
23
+ selectedIndex: 0,
24
+ scrollOffset: 0,
25
+ partial: '',
26
+ };
27
+ agent = {
28
+ active: false,
29
+ matches: [],
30
+ selectedIndex: 0,
31
+ scrollOffset: 0,
32
+ partial: '',
33
+ startPos: 0,
34
+ lineIndex: 0,
35
+ };
36
+ getAgentSuggestions;
37
+ getCommands;
38
+ /** Whether any autocomplete is currently active. */
39
+ isActive() {
40
+ return this.command.active || this.file.active || this.agent.active;
41
+ }
42
+ // ===========================================================================
43
+ // Update (called when input changes)
44
+ // ===========================================================================
45
+ /**
46
+ * Detect and activate autocomplete based on current input state.
47
+ * Priority: @ file > $ agent > / command
48
+ */
49
+ update(lines, currentLine, cursorPos) {
50
+ const currentLineContent = lines[currentLine];
51
+ // Check for @ file path autocomplete first (works on any line)
52
+ const atMention = extractAtMention(currentLineContent, cursorPos);
53
+ if (atMention !== null) {
54
+ // File autocomplete mode - disable other autocompletes
55
+ this.command.active = false;
56
+ this.command.matches = [];
57
+ this.command.selectedIndex = 0;
58
+ this.command.scrollOffset = 0;
59
+ this.agent.active = false;
60
+ this.agent.matches = [];
61
+ // Enable file autocomplete
62
+ this.file.active = true;
63
+ this.file.partial = atMention;
64
+ this.file.matches = getFileMatches(atMention);
65
+ if (this.file.selectedIndex >= this.file.matches.length) {
66
+ this.file.selectedIndex = Math.max(0, this.file.matches.length - 1);
67
+ this.file.scrollOffset = 0;
68
+ }
69
+ return;
70
+ }
71
+ // Reset file autocomplete
72
+ this.file.active = false;
73
+ this.file.matches = [];
74
+ this.file.selectedIndex = 0;
75
+ this.file.scrollOffset = 0;
76
+ this.file.partial = '';
77
+ // Check for $ agent autocomplete (anywhere in the current line)
78
+ if (this.getAgentSuggestions) {
79
+ const dollarMention = extractDollarMention(currentLineContent, cursorPos);
80
+ if (dollarMention !== null) {
81
+ const partial = dollarMention.partial.toLowerCase();
82
+ const allAgents = this.getAgentSuggestions();
83
+ // Filter agents by partial match
84
+ const matches = allAgents.filter(a => a.id.toLowerCase().startsWith(partial) ||
85
+ a.displayName.toLowerCase().includes(partial));
86
+ if (matches.length > 0) {
87
+ this.agent.active = true;
88
+ this.agent.partial = partial;
89
+ this.agent.matches = matches;
90
+ this.agent.startPos = dollarMention.startPos;
91
+ this.agent.lineIndex = currentLine;
92
+ if (this.agent.selectedIndex >= matches.length) {
93
+ this.agent.selectedIndex = Math.max(0, matches.length - 1);
94
+ this.agent.scrollOffset = 0;
95
+ }
96
+ // Reset command autocomplete
97
+ this.command.active = false;
98
+ this.command.matches = [];
99
+ return;
100
+ }
101
+ }
102
+ }
103
+ // Reset agent autocomplete
104
+ this.agent.active = false;
105
+ this.agent.matches = [];
106
+ this.agent.selectedIndex = 0;
107
+ this.agent.scrollOffset = 0;
108
+ this.agent.partial = '';
109
+ this.agent.startPos = 0;
110
+ this.agent.lineIndex = 0;
111
+ // Activate command autocomplete when first line starts with /
112
+ const firstLine = lines[0];
113
+ if (currentLine === 0 && firstLine.startsWith('/')) {
114
+ this.command.active = true;
115
+ const freshCommands = this.getCommands?.() ?? [];
116
+ this.command.matches = filterCommands(firstLine, freshCommands);
117
+ // Reset selection if it's out of bounds
118
+ if (this.command.selectedIndex >= this.command.matches.length) {
119
+ this.command.selectedIndex = Math.max(0, this.command.matches.length - 1);
120
+ this.command.scrollOffset = 0;
121
+ }
122
+ }
123
+ else {
124
+ this.command.active = false;
125
+ this.command.matches = [];
126
+ this.command.selectedIndex = 0;
127
+ this.command.scrollOffset = 0;
128
+ }
129
+ }
130
+ // ===========================================================================
131
+ // Accept (apply selected autocomplete)
132
+ // ===========================================================================
133
+ /**
134
+ * Apply the selected autocomplete match.
135
+ * Returns new input state if something was accepted, null otherwise.
136
+ * Caller must also call update() after applying the result for file autocomplete
137
+ * (directory selection may trigger continued autocomplete).
138
+ */
139
+ accept(lines, currentLine, cursorPos) {
140
+ // Agent autocomplete takes highest priority
141
+ if (this.agent.active && this.agent.matches.length > 0) {
142
+ const selectedAgent = this.agent.matches[this.agent.selectedIndex];
143
+ const lineIdx = this.agent.lineIndex;
144
+ const line = lines[lineIdx];
145
+ const result = replaceDollarMention(line, cursorPos, selectedAgent.id);
146
+ const newLines = [...lines];
147
+ newLines[lineIdx] = result.input;
148
+ this.agent.active = false;
149
+ this.agent.matches = [];
150
+ this.agent.selectedIndex = 0;
151
+ this.agent.scrollOffset = 0;
152
+ this.agent.partial = '';
153
+ this.agent.startPos = 0;
154
+ this.agent.lineIndex = 0;
155
+ return { lines: newLines, currentLine: lineIdx, cursorPos: result.cursorPos };
156
+ }
157
+ // File autocomplete takes priority (works on current line)
158
+ if (this.file.active && this.file.matches.length > 0) {
159
+ const selectedFile = this.file.matches[this.file.selectedIndex];
160
+ const currentLineContent = lines[currentLine];
161
+ const result = replaceAtMention(currentLineContent, cursorPos, selectedFile.path);
162
+ const newLines = [...lines];
163
+ newLines[currentLine] = result.input;
164
+ this.file.active = false;
165
+ this.file.matches = [];
166
+ this.file.selectedIndex = 0;
167
+ this.file.scrollOffset = 0;
168
+ this.file.partial = '';
169
+ return { lines: newLines, currentLine, cursorPos: result.cursorPos };
170
+ }
171
+ // Command autocomplete (works on first line only)
172
+ if (this.command.active && this.command.matches.length > 0) {
173
+ const selected = this.command.matches[this.command.selectedIndex];
174
+ const newLines = [...lines];
175
+ newLines[0] = selected.command;
176
+ this.command.active = false;
177
+ this.command.matches = [];
178
+ this.command.selectedIndex = 0;
179
+ this.command.scrollOffset = 0;
180
+ return { lines: newLines, currentLine: 0, cursorPos: selected.command.length };
181
+ }
182
+ return null;
183
+ }
184
+ // ===========================================================================
185
+ // Close / Navigate
186
+ // ===========================================================================
187
+ close() {
188
+ this.agent.active = false;
189
+ this.agent.matches = [];
190
+ this.agent.selectedIndex = 0;
191
+ this.agent.scrollOffset = 0;
192
+ this.agent.partial = '';
193
+ this.agent.startPos = 0;
194
+ this.agent.lineIndex = 0;
195
+ this.file.active = false;
196
+ this.file.matches = [];
197
+ this.file.selectedIndex = 0;
198
+ this.file.scrollOffset = 0;
199
+ this.file.partial = '';
200
+ this.command.active = false;
201
+ this.command.matches = [];
202
+ this.command.selectedIndex = 0;
203
+ this.command.scrollOffset = 0;
204
+ }
205
+ navigateUp() {
206
+ if (this.agent.active && this.agent.matches.length > 0) {
207
+ if (this.agent.selectedIndex > 0) {
208
+ this.agent.selectedIndex--;
209
+ if (this.agent.selectedIndex < this.agent.scrollOffset) {
210
+ this.agent.scrollOffset = this.agent.selectedIndex;
211
+ }
212
+ return true;
213
+ }
214
+ return false;
215
+ }
216
+ if (this.file.active && this.file.matches.length > 0) {
217
+ if (this.file.selectedIndex > 0) {
218
+ this.file.selectedIndex--;
219
+ if (this.file.selectedIndex < this.file.scrollOffset) {
220
+ this.file.scrollOffset = this.file.selectedIndex;
221
+ }
222
+ return true;
223
+ }
224
+ return false;
225
+ }
226
+ if (!this.command.active || this.command.matches.length === 0) {
227
+ return false;
228
+ }
229
+ if (this.command.selectedIndex > 0) {
230
+ this.command.selectedIndex--;
231
+ if (this.command.selectedIndex < this.command.scrollOffset) {
232
+ this.command.scrollOffset = this.command.selectedIndex;
233
+ }
234
+ return true;
235
+ }
236
+ return false;
237
+ }
238
+ navigateDown() {
239
+ if (this.agent.active && this.agent.matches.length > 0) {
240
+ if (this.agent.selectedIndex < this.agent.matches.length - 1) {
241
+ this.agent.selectedIndex++;
242
+ const maxVisibleIndex = this.agent.scrollOffset + MAX_VISIBLE_COMMANDS - 1;
243
+ if (this.agent.selectedIndex > maxVisibleIndex) {
244
+ this.agent.scrollOffset = this.agent.selectedIndex - MAX_VISIBLE_COMMANDS + 1;
245
+ }
246
+ return true;
247
+ }
248
+ return false;
249
+ }
250
+ if (this.file.active && this.file.matches.length > 0) {
251
+ if (this.file.selectedIndex < this.file.matches.length - 1) {
252
+ this.file.selectedIndex++;
253
+ const maxVisibleIndex = this.file.scrollOffset + MAX_VISIBLE_COMMANDS - 1;
254
+ if (this.file.selectedIndex > maxVisibleIndex) {
255
+ this.file.scrollOffset = this.file.selectedIndex - MAX_VISIBLE_COMMANDS + 1;
256
+ }
257
+ return true;
258
+ }
259
+ return false;
260
+ }
261
+ if (!this.command.active || this.command.matches.length === 0) {
262
+ return false;
263
+ }
264
+ if (this.command.selectedIndex < this.command.matches.length - 1) {
265
+ this.command.selectedIndex++;
266
+ const maxVisibleIndex = this.command.scrollOffset + MAX_VISIBLE_COMMANDS - 1;
267
+ if (this.command.selectedIndex > maxVisibleIndex) {
268
+ this.command.scrollOffset = this.command.selectedIndex - MAX_VISIBLE_COMMANDS + 1;
269
+ }
270
+ return true;
271
+ }
272
+ return false;
273
+ }
274
+ // ===========================================================================
275
+ // Build lines (for footer rendering)
276
+ // ===========================================================================
277
+ buildCommandLines(termWidth) {
278
+ if (!this.command.active || this.command.matches.length === 0) {
279
+ return [];
280
+ }
281
+ const s = getStyles();
282
+ const lines = [];
283
+ const { matches, selectedIndex, scrollOffset } = this.command;
284
+ const visible = matches.slice(scrollOffset, scrollOffset + MAX_VISIBLE_COMMANDS);
285
+ const total = matches.length;
286
+ if (scrollOffset > 0) {
287
+ lines.push(s.muted(` ↑ ${String(scrollOffset)} more above`));
288
+ }
289
+ for (let i = 0; i < visible.length; i++) {
290
+ const cmd = visible[i];
291
+ const actualIndex = scrollOffset + i;
292
+ const isSelected = actualIndex === selectedIndex;
293
+ const prefix = isSelected ? s.primary('❯ ') : ' ';
294
+ const name = isSelected ? s.primaryBold(cmd.command) : cmd.command;
295
+ const baseLen = getVisibleLength(prefix) + getVisibleLength(name) + 3;
296
+ const maxDescLen = termWidth - baseLen - 2;
297
+ const truncatedDesc = cmd.description.length > maxDescLen
298
+ ? cmd.description.slice(0, maxDescLen - 1) + '…'
299
+ : cmd.description;
300
+ lines.push(`${prefix}${name} ${s.muted('- ' + truncatedDesc)}`);
301
+ }
302
+ const belowCount = total - scrollOffset - visible.length;
303
+ if (belowCount > 0) {
304
+ lines.push(s.muted(` ↓ ${String(belowCount)} more below`));
305
+ }
306
+ return lines;
307
+ }
308
+ buildFileLines(termWidth) {
309
+ if (!this.file.active || this.file.matches.length === 0) {
310
+ return [];
311
+ }
312
+ const s = getStyles();
313
+ const lines = [];
314
+ const { matches, selectedIndex, scrollOffset } = this.file;
315
+ const visible = matches.slice(scrollOffset, scrollOffset + MAX_VISIBLE_COMMANDS);
316
+ const total = matches.length;
317
+ if (scrollOffset > 0) {
318
+ lines.push(s.muted(` ↑ ${String(scrollOffset)} more above`));
319
+ }
320
+ for (let i = 0; i < visible.length; i++) {
321
+ const file = visible[i];
322
+ const actualIndex = scrollOffset + i;
323
+ const isSelected = actualIndex === selectedIndex;
324
+ const prefix = isSelected ? s.primary('❯ ') : ' ';
325
+ const icon = file.isDirectory ? '📁 ' : '📄 ';
326
+ const name = isSelected ? s.primaryBold(file.path) : file.path;
327
+ const baseLen = getVisibleLength(prefix) + 3 + getVisibleLength(file.path);
328
+ if (baseLen > termWidth - 2) {
329
+ const maxLen = termWidth - getVisibleLength(prefix) - 5;
330
+ const truncatedPath = file.path.length > maxLen
331
+ ? '…' + file.path.slice(-(maxLen - 1))
332
+ : file.path;
333
+ const truncatedName = isSelected ? s.primaryBold(truncatedPath) : truncatedPath;
334
+ lines.push(`${prefix}${icon}${truncatedName}`);
335
+ }
336
+ else {
337
+ lines.push(`${prefix}${icon}${name}`);
338
+ }
339
+ }
340
+ const belowCount = total - scrollOffset - visible.length;
341
+ if (belowCount > 0) {
342
+ lines.push(s.muted(` ↓ ${String(belowCount)} more below`));
343
+ }
344
+ return lines;
345
+ }
346
+ buildAgentLines(termWidth) {
347
+ if (!this.agent.active || this.agent.matches.length === 0) {
348
+ return [];
349
+ }
350
+ const s = getStyles();
351
+ const lines = [];
352
+ const { matches, selectedIndex, scrollOffset } = this.agent;
353
+ const visible = matches.slice(scrollOffset, scrollOffset + MAX_VISIBLE_COMMANDS);
354
+ const total = matches.length;
355
+ if (scrollOffset > 0) {
356
+ lines.push(s.muted(` ↑ ${String(scrollOffset)} more above`));
357
+ }
358
+ for (let i = 0; i < visible.length; i++) {
359
+ const agentItem = visible[i];
360
+ const actualIndex = scrollOffset + i;
361
+ const isSelected = actualIndex === selectedIndex;
362
+ const prefix = isSelected ? s.primary('❯ ') : ' ';
363
+ const mascot = agentItem.mascot + ' ';
364
+ const name = isSelected ? s.primaryBold('$' + agentItem.id) : '$' + agentItem.id;
365
+ const desc = s.muted(' - ' + agentItem.displayName);
366
+ const baseLen = getVisibleLength(prefix) + 6 + agentItem.id.length + 3 + agentItem.displayName.length;
367
+ if (baseLen > termWidth - 2) {
368
+ const maxDescLen = termWidth - getVisibleLength(prefix) - 6 - agentItem.id.length - 5;
369
+ const truncatedDesc = agentItem.displayName.length > maxDescLen
370
+ ? s.muted(' - ' + agentItem.displayName.slice(0, maxDescLen - 1) + '…')
371
+ : desc;
372
+ lines.push(`${prefix}${mascot}${name}${truncatedDesc}`);
373
+ }
374
+ else {
375
+ lines.push(`${prefix}${mascot}${name}${desc}`);
376
+ }
377
+ }
378
+ const belowCount = total - scrollOffset - visible.length;
379
+ if (belowCount > 0) {
380
+ lines.push(s.muted(` ↓ ${String(belowCount)} more below`));
381
+ }
382
+ return lines;
383
+ }
384
+ }
@@ -16,7 +16,7 @@ export { OverlayLifecycle, setupOverlay } from './overlay-lifecycle.js';
16
16
  export type { KeyHandler } from './overlay-lifecycle.js';
17
17
  export { BaseOverlay } from './overlay-base.js';
18
18
  export { BaseScreen, ScreenStack, stay, pushScreen, popScreen, closeOverlay, } from './screen-stack.js';
19
- export { renderBorder, wrapText, truncate, truncateAnsi, normalizeText, padToHeight, emptyLines, } from './render-utils.js';
19
+ export { renderBorder, wrapText, truncate, truncateAnsi, normalizeText, padToHeight, emptyLines, renderProgressBar, formatTokens, } from './render-utils.js';
20
20
  export { TabbedListOverlay } from './tabbed-list-overlay.js';
21
21
  export type { TabbedListConfig, TabbedListState } from './tabbed-list-overlay.js';
22
22
  export { BaseOverlayV2 } from './overlay-base-v2.js';
@@ -21,7 +21,7 @@ export { BaseOverlay } from './overlay-base.js';
21
21
  // Screen stack for multi-screen overlays
22
22
  export { BaseScreen, ScreenStack, stay, pushScreen, popScreen, closeOverlay, } from './screen-stack.js';
23
23
  // Render utilities
24
- export { renderBorder, wrapText, truncate, truncateAnsi, normalizeText, padToHeight, emptyLines, } from './render-utils.js';
24
+ export { renderBorder, wrapText, truncate, truncateAnsi, normalizeText, padToHeight, emptyLines, renderProgressBar, formatTokens, } from './render-utils.js';
25
25
  // Tabbed list overlay base
26
26
  export { TabbedListOverlay } from './tabbed-list-overlay.js';
27
27
  // V2 Overlay base classes (new Overlay interface)
@@ -63,12 +63,22 @@ export declare abstract class BaseOverlayV2<TState = unknown, TResult = void> im
63
63
  protected termWidth: number;
64
64
  /** Minimum height for stable rendering (prevents visual jitter) */
65
65
  protected minHeight: number;
66
+ /** Callback to request re-render from async operations */
67
+ protected renderCallback: (() => void) | null;
66
68
  /**
67
69
  * Create a new overlay instance.
68
70
  *
69
71
  * @param initialState - Initial state
70
72
  */
71
73
  constructor(initialState: TState);
74
+ /**
75
+ * Set the render callback. Called by TerminalUI when mounting.
76
+ */
77
+ setRenderCallback(callback: () => void): void;
78
+ /**
79
+ * Request a re-render. Call from async operations.
80
+ */
81
+ protected requestRender(): void;
72
82
  /**
73
83
  * Get current state.
74
84
  */
@@ -60,6 +60,8 @@ export class BaseOverlayV2 {
60
60
  termWidth = 80;
61
61
  /** Minimum height for stable rendering (prevents visual jitter) */
62
62
  minHeight = 0;
63
+ /** Callback to request re-render from async operations */
64
+ renderCallback = null;
63
65
  /**
64
66
  * Create a new overlay instance.
65
67
  *
@@ -68,6 +70,18 @@ export class BaseOverlayV2 {
68
70
  constructor(initialState) {
69
71
  this.state = initialState;
70
72
  }
73
+ /**
74
+ * Set the render callback. Called by TerminalUI when mounting.
75
+ */
76
+ setRenderCallback(callback) {
77
+ this.renderCallback = callback;
78
+ }
79
+ /**
80
+ * Request a re-render. Call from async operations.
81
+ */
82
+ requestRender() {
83
+ this.renderCallback?.();
84
+ }
71
85
  // ===========================================================================
72
86
  // Overlay Interface Implementation
73
87
  // ===========================================================================
@@ -6,3 +6,22 @@
6
6
  */
7
7
  export { renderBorder, wrapText, truncatePlain, truncateAnsi, normalizeText, padToHeight, emptyLines, padToWidth, } from '@compilr-dev/ui-core/utils';
8
8
  export { truncatePlain as truncate } from '@compilr-dev/ui-core/utils';
9
+ import type { ThemeStyleFunctions } from '../../themes/index.js';
10
+ /**
11
+ * Render a progress bar with color coding.
12
+ *
13
+ * Color thresholds: >0.8 = error, >0.6 = warning, else success.
14
+ *
15
+ * @param ratio - Fill ratio (0-1, clamped)
16
+ * @param width - Width of the bar in characters
17
+ * @param s - Theme style functions for coloring
18
+ * @returns Colored bar string (no percentage text appended — caller adds if needed)
19
+ *
20
+ * @example
21
+ * ```ts
22
+ * const bar = renderProgressBar(0.75, 20, styles);
23
+ * // Returns: "████████████████░░░░" (colored based on ratio)
24
+ * ```
25
+ */
26
+ export declare function renderProgressBar(ratio: number, width: number, s: ThemeStyleFunctions): string;
27
+ export { formatTokens } from '../../utils/format-tokens.js';
@@ -9,3 +9,28 @@ export { renderBorder, wrapText, truncatePlain, truncateAnsi, normalizeText, pad
9
9
  // (ui-core's truncate in ansi.ts is ANSI-aware with '...' suffix,
10
10
  // CLI expects plain text truncate with '…' suffix)
11
11
  export { truncatePlain as truncate } from '@compilr-dev/ui-core/utils';
12
+ /**
13
+ * Render a progress bar with color coding.
14
+ *
15
+ * Color thresholds: >0.8 = error, >0.6 = warning, else success.
16
+ *
17
+ * @param ratio - Fill ratio (0-1, clamped)
18
+ * @param width - Width of the bar in characters
19
+ * @param s - Theme style functions for coloring
20
+ * @returns Colored bar string (no percentage text appended — caller adds if needed)
21
+ *
22
+ * @example
23
+ * ```ts
24
+ * const bar = renderProgressBar(0.75, 20, styles);
25
+ * // Returns: "████████████████░░░░" (colored based on ratio)
26
+ * ```
27
+ */
28
+ export function renderProgressBar(ratio, width, s) {
29
+ const clamped = Math.max(0, Math.min(1, ratio));
30
+ const filled = Math.round(clamped * width);
31
+ const empty = width - filled;
32
+ const colorFn = clamped > 0.8 ? s.error : clamped > 0.6 ? s.warning : s.success;
33
+ return colorFn('█'.repeat(filled)) + s.muted('░'.repeat(empty));
34
+ }
35
+ // Re-export formatTokens from utils for backward compatibility
36
+ export { formatTokens } from '../../utils/format-tokens.js';
@@ -50,12 +50,27 @@ export interface TabbedListConfigV2<TItem> {
50
50
  /** Custom no-results message */
51
51
  noResultsMessage?: string;
52
52
  /** Custom footer hints */
53
- footerHints?: (searchMode: boolean) => string;
53
+ footerHints?: (searchMode: boolean, activeTabId?: string) => string;
54
54
  /**
55
55
  * Render preview content for the selected item.
56
56
  * Displayed between the list and footer.
57
57
  */
58
58
  renderSelectedPreview?: (item: TItem, styles: ThemeStyleFunctions) => string[];
59
+ /**
60
+ * Render sub-header content below the tab bar.
61
+ * Useful for showing status info like API key status.
62
+ */
63
+ renderSubHeader?: (tabId: string, styles: ThemeStyleFunctions) => string[];
64
+ /**
65
+ * Handle custom key presses before default handling.
66
+ * Return { handled: true, render: boolean } to consume the key.
67
+ * Return { handled: false } to let default handling proceed.
68
+ */
69
+ handleCustomKey?: (key: Buffer, tabId: string) => {
70
+ handled: boolean;
71
+ render?: boolean;
72
+ pushScreen?: BaseScreen;
73
+ };
59
74
  }
60
75
  /**
61
76
  * State for TabbedListOverlayV2.
@@ -91,6 +91,12 @@ class ListScreenV2 extends BaseScreen {
91
91
  const tabHint = s.muted(`(${this.tabFeature.renderHints()})`);
92
92
  lines.push(` ${tabBar} ${tabHint}`);
93
93
  lines.push('');
94
+ // Sub-header (if provided) - e.g., API key status
95
+ if (this.config.renderSubHeader) {
96
+ const tabId = this.tabFeature.getCurrentTabId(this.state);
97
+ const subHeaderLines = this.config.renderSubHeader(tabId, s);
98
+ lines.push(...subHeaderLines);
99
+ }
94
100
  // Search box (if in search mode)
95
101
  if (this.state.searchMode) {
96
102
  const query = this.state.searchQuery;
@@ -143,7 +149,8 @@ class ListScreenV2 extends BaseScreen {
143
149
  }
144
150
  getFooterHints() {
145
151
  if (this.config.footerHints) {
146
- return this.config.footerHints(this.state.searchMode);
152
+ const activeTab = this.config.tabs[this.state.currentTab];
153
+ return this.config.footerHints(this.state.searchMode, activeTab.id);
147
154
  }
148
155
  if (this.state.searchMode) {
149
156
  return 'Type to filter · ↑↓/jk Navigate · Enter Details · Esc Exit search';
@@ -179,6 +186,17 @@ class ListScreenV2 extends BaseScreen {
179
186
  return { action: 'stay', render: false };
180
187
  }
181
188
  // Not in search mode
189
+ // Custom key handling (before default handling)
190
+ if (this.config.handleCustomKey) {
191
+ const tabId = this.tabFeature.getCurrentTabId(this.state);
192
+ const customResult = this.config.handleCustomKey(data, tabId);
193
+ if (customResult.handled) {
194
+ if (customResult.pushScreen) {
195
+ return { action: 'push', screen: customResult.pushScreen };
196
+ }
197
+ return { action: 'stay', render: customResult.render ?? false };
198
+ }
199
+ }
182
200
  if (isSlash(data)) {
183
201
  this.state.searchMode = true;
184
202
  return { action: 'stay', render: true };
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Shared Label Constants
3
+ *
4
+ * Centralized display labels for domain types used across multiple overlays.
5
+ */
6
+ import type { ArtifactType } from '../../multi-agent/index.js';
7
+ import type { DocumentType, PlanStatus } from '../../db/schema.js';
8
+ export declare const ARTIFACT_TYPE_LABELS: Record<ArtifactType, string>;
9
+ export declare const DOC_TYPE_LABELS: Record<DocumentType, string>;
10
+ /** Icon-only labels for compact display (e.g., list views) */
11
+ export declare const PLAN_STATUS_ICONS: Record<PlanStatus, string>;
12
+ /** Icon + text labels for detailed display (e.g., detail views) */
13
+ export declare const PLAN_STATUS_LABELS: Record<PlanStatus, string>;
14
+ export declare const PLAN_STATUS_COLORS: Record<PlanStatus, 'muted' | 'warning' | 'primary' | 'success' | 'error'>;
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Shared Label Constants
3
+ *
4
+ * Centralized display labels for domain types used across multiple overlays.
5
+ */
6
+ // =============================================================================
7
+ // Artifact Labels
8
+ // =============================================================================
9
+ export const ARTIFACT_TYPE_LABELS = {
10
+ 'design': 'DESIGN',
11
+ 'plan': 'PLAN',
12
+ 'review': 'REVIEW',
13
+ 'decision': 'DECISION',
14
+ 'note': 'NOTE',
15
+ };
16
+ // =============================================================================
17
+ // Document Labels
18
+ // =============================================================================
19
+ export const DOC_TYPE_LABELS = {
20
+ 'prd': 'PRD',
21
+ 'architecture': 'ARCH',
22
+ 'design': 'DESIGN',
23
+ 'notes': 'NOTES',
24
+ 'plan': 'PLAN',
25
+ 'app-model': 'MODEL',
26
+ };
27
+ // =============================================================================
28
+ // Plan Status Labels
29
+ // =============================================================================
30
+ /** Icon-only labels for compact display (e.g., list views) */
31
+ export const PLAN_STATUS_ICONS = {
32
+ 'draft': '○',
33
+ 'approved': '◐',
34
+ 'in_progress': '◑',
35
+ 'completed': '●',
36
+ 'abandoned': '✗',
37
+ };
38
+ /** Icon + text labels for detailed display (e.g., detail views) */
39
+ export const PLAN_STATUS_LABELS = {
40
+ 'draft': '○ Draft',
41
+ 'approved': '◐ Approved',
42
+ 'in_progress': '◑ In Progress',
43
+ 'completed': '● Completed',
44
+ 'abandoned': '✗ Abandoned',
45
+ };
46
+ export const PLAN_STATUS_COLORS = {
47
+ 'draft': 'muted',
48
+ 'approved': 'warning',
49
+ 'in_progress': 'primary',
50
+ 'completed': 'success',
51
+ 'abandoned': 'error',
52
+ };