@compilr-dev/cli 0.5.0 → 0.5.1

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