@compilr-dev/cli 0.4.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (634) hide show
  1. package/README.md +254 -68
  2. package/dist/.tsbuildinfo.app +1 -0
  3. package/dist/.tsbuildinfo.data +1 -0
  4. package/dist/.tsbuildinfo.domain +1 -0
  5. package/dist/.tsbuildinfo.foundation +1 -0
  6. package/dist/agent.d.ts +134 -4
  7. package/dist/agent.js +345 -166
  8. package/dist/anchors/index.d.ts +9 -0
  9. package/dist/anchors/index.js +9 -0
  10. package/dist/anchors/project-anchors.d.ts +79 -0
  11. package/dist/anchors/project-anchors.js +202 -0
  12. package/dist/auth/api-client.d.ts +124 -0
  13. package/dist/auth/api-client.js +261 -0
  14. package/dist/auth/index.d.ts +172 -0
  15. package/dist/auth/index.js +545 -0
  16. package/dist/auth/storage.d.ts +52 -0
  17. package/dist/auth/storage.js +118 -0
  18. package/dist/changelog/index.d.ts +16 -0
  19. package/dist/changelog/index.js +24 -0
  20. package/dist/changelog/releases.d.ts +17 -0
  21. package/dist/changelog/releases.js +63 -0
  22. package/dist/commands/index.d.ts +2 -1
  23. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  24. package/dist/commands-v2/handlers/auth.js +118 -0
  25. package/dist/commands-v2/handlers/background.d.ts +14 -0
  26. package/dist/commands-v2/handlers/background.js +276 -0
  27. package/dist/commands-v2/handlers/context.d.ts +13 -0
  28. package/dist/commands-v2/handlers/context.js +533 -0
  29. package/dist/commands-v2/handlers/core.d.ts +14 -0
  30. package/dist/commands-v2/handlers/core.js +290 -0
  31. package/dist/commands-v2/handlers/debug.d.ts +11 -0
  32. package/dist/commands-v2/handlers/debug.js +177 -0
  33. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  34. package/dist/commands-v2/handlers/delegations.js +29 -0
  35. package/dist/commands-v2/handlers/files.d.ts +8 -0
  36. package/dist/commands-v2/handlers/files.js +162 -0
  37. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  38. package/dist/commands-v2/handlers/filter.js +130 -0
  39. package/dist/commands-v2/handlers/games.d.ts +7 -0
  40. package/dist/commands-v2/handlers/games.js +57 -0
  41. package/dist/commands-v2/handlers/index.d.ts +25 -0
  42. package/dist/commands-v2/handlers/index.js +63 -0
  43. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  44. package/dist/commands-v2/handlers/mcp.js +39 -0
  45. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  46. package/dist/commands-v2/handlers/notifications.js +34 -0
  47. package/dist/commands-v2/handlers/project.d.ts +22 -0
  48. package/dist/commands-v2/handlers/project.js +1035 -0
  49. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  50. package/dist/commands-v2/handlers/reset.js +118 -0
  51. package/dist/commands-v2/handlers/session.d.ts +161 -0
  52. package/dist/commands-v2/handlers/session.js +805 -0
  53. package/dist/commands-v2/handlers/settings.d.ts +17 -0
  54. package/dist/commands-v2/handlers/settings.js +417 -0
  55. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  56. package/dist/commands-v2/handlers/tasks.js +36 -0
  57. package/dist/commands-v2/handlers/team.d.ts +9 -0
  58. package/dist/commands-v2/handlers/team.js +549 -0
  59. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  60. package/dist/commands-v2/handlers/terminals.js +34 -0
  61. package/dist/commands-v2/index.d.ts +14 -0
  62. package/dist/commands-v2/index.js +18 -0
  63. package/dist/commands-v2/registry.d.ts +52 -0
  64. package/dist/commands-v2/registry.js +114 -0
  65. package/dist/commands-v2/types.d.ts +153 -0
  66. package/dist/commands-v2/types.js +7 -0
  67. package/dist/commands.js +123 -7
  68. package/dist/compilr-diff-companion.vsix +0 -0
  69. package/dist/db/index.js +98 -4
  70. package/dist/db/repositories/document-repository.d.ts +2 -0
  71. package/dist/db/repositories/document-repository.js +5 -1
  72. package/dist/db/repositories/index.d.ts +2 -0
  73. package/dist/db/repositories/index.js +1 -0
  74. package/dist/db/repositories/plan-repository.d.ts +101 -0
  75. package/dist/db/repositories/plan-repository.js +275 -0
  76. package/dist/db/repositories/project-repository.d.ts +6 -0
  77. package/dist/db/repositories/project-repository.js +41 -0
  78. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  79. package/dist/db/repositories/work-item-repository.js +69 -4
  80. package/dist/db/schema.d.ts +40 -3
  81. package/dist/db/schema.js +66 -3
  82. package/dist/episodes/index.d.ts +20 -0
  83. package/dist/episodes/index.js +27 -0
  84. package/dist/episodes/recorder.d.ts +51 -0
  85. package/dist/episodes/recorder.js +195 -0
  86. package/dist/episodes/significant-work.d.ts +21 -0
  87. package/dist/episodes/significant-work.js +56 -0
  88. package/dist/episodes/store.d.ts +38 -0
  89. package/dist/episodes/store.js +199 -0
  90. package/dist/episodes/types.d.ts +35 -0
  91. package/dist/episodes/types.js +6 -0
  92. package/dist/episodes/work-at-risk.d.ts +12 -0
  93. package/dist/episodes/work-at-risk.js +38 -0
  94. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  95. package/dist/episodes/work-summary-anchor.js +73 -0
  96. package/dist/games/coins.d.ts +66 -0
  97. package/dist/games/coins.js +165 -0
  98. package/dist/games/game-base.d.ts +84 -0
  99. package/dist/games/game-base.js +204 -0
  100. package/dist/games/index.d.ts +16 -0
  101. package/dist/games/index.js +49 -0
  102. package/dist/games/scores.d.ts +69 -0
  103. package/dist/games/scores.js +191 -0
  104. package/dist/games/tetris/board.d.ts +59 -0
  105. package/dist/games/tetris/board.js +170 -0
  106. package/dist/games/tetris/index.d.ts +109 -0
  107. package/dist/games/tetris/index.js +610 -0
  108. package/dist/games/tetris/pieces.d.ts +44 -0
  109. package/dist/games/tetris/pieces.js +271 -0
  110. package/dist/games/tetris/renderer.d.ts +26 -0
  111. package/dist/games/tetris/renderer.js +77 -0
  112. package/dist/guide/guide-content.d.ts +23 -0
  113. package/dist/guide/guide-content.js +196 -0
  114. package/dist/guide/index.d.ts +8 -0
  115. package/dist/guide/index.js +7 -0
  116. package/dist/guide/shared-content.d.ts +37 -0
  117. package/dist/guide/shared-content.js +1272 -0
  118. package/dist/guide/tutorial-helpers.d.ts +57 -0
  119. package/dist/guide/tutorial-helpers.js +147 -0
  120. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  121. package/dist/handlers/ask-user-handlers.js +104 -0
  122. package/dist/handlers/delegation-handlers.d.ts +34 -0
  123. package/dist/handlers/delegation-handlers.js +291 -0
  124. package/dist/handlers/permission-handler.d.ts +30 -0
  125. package/dist/handlers/permission-handler.js +205 -0
  126. package/dist/index.d.ts +11 -1
  127. package/dist/index.js +615 -179
  128. package/dist/input-handlers/index.d.ts +7 -0
  129. package/dist/input-handlers/index.js +7 -0
  130. package/dist/input-handlers/memory-handler.d.ts +26 -0
  131. package/dist/input-handlers/memory-handler.js +69 -0
  132. package/dist/models/index.d.ts +10 -0
  133. package/dist/models/index.js +12 -0
  134. package/dist/models/model-registry.d.ts +38 -0
  135. package/dist/models/model-registry.js +69 -0
  136. package/dist/models/model-tiers.d.ts +28 -0
  137. package/dist/models/model-tiers.js +71 -0
  138. package/dist/models/model-validation.d.ts +25 -0
  139. package/dist/models/model-validation.js +291 -0
  140. package/dist/models/ollama-models.d.ts +73 -0
  141. package/dist/models/ollama-models.js +178 -0
  142. package/dist/models/provider-types.d.ts +6 -0
  143. package/dist/models/provider-types.js +1 -0
  144. package/dist/models/providers.d.ts +35 -0
  145. package/dist/models/providers.js +58 -0
  146. package/dist/models/types.d.ts +4 -0
  147. package/dist/models/types.js +4 -0
  148. package/dist/multi-agent/activity.d.ts +21 -0
  149. package/dist/multi-agent/activity.js +34 -0
  150. package/dist/multi-agent/agent-selection.d.ts +55 -0
  151. package/dist/multi-agent/agent-selection.js +90 -0
  152. package/dist/multi-agent/artifacts.d.ts +197 -0
  153. package/dist/multi-agent/artifacts.js +379 -0
  154. package/dist/multi-agent/checkpointer.d.ts +138 -0
  155. package/dist/multi-agent/checkpointer.js +471 -0
  156. package/dist/multi-agent/collision-utils.d.ts +16 -0
  157. package/dist/multi-agent/collision-utils.js +28 -0
  158. package/dist/multi-agent/context-resolver.d.ts +97 -0
  159. package/dist/multi-agent/context-resolver.js +316 -0
  160. package/dist/multi-agent/custom-agents.d.ts +83 -0
  161. package/dist/multi-agent/custom-agents.js +227 -0
  162. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  163. package/dist/multi-agent/delegation-tracker.js +243 -0
  164. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  165. package/dist/multi-agent/file-lock-hook.js +97 -0
  166. package/dist/multi-agent/file-locks.d.ts +58 -0
  167. package/dist/multi-agent/file-locks.js +194 -0
  168. package/dist/multi-agent/index.d.ts +24 -0
  169. package/dist/multi-agent/index.js +30 -0
  170. package/dist/multi-agent/mention-parser.d.ts +64 -0
  171. package/dist/multi-agent/mention-parser.js +146 -0
  172. package/dist/multi-agent/notification-manager.d.ts +84 -0
  173. package/dist/multi-agent/notification-manager.js +224 -0
  174. package/dist/multi-agent/pending-requests.d.ts +122 -0
  175. package/dist/multi-agent/pending-requests.js +155 -0
  176. package/dist/multi-agent/session-registry.d.ts +139 -0
  177. package/dist/multi-agent/session-registry.js +514 -0
  178. package/dist/multi-agent/shared-context.d.ts +293 -0
  179. package/dist/multi-agent/shared-context.js +671 -0
  180. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  181. package/dist/multi-agent/skill-requirements.js +178 -0
  182. package/dist/multi-agent/task-assignment.d.ts +69 -0
  183. package/dist/multi-agent/task-assignment.js +123 -0
  184. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  185. package/dist/multi-agent/task-suggestion.js +72 -0
  186. package/dist/multi-agent/team-agent.d.ts +201 -0
  187. package/dist/multi-agent/team-agent.js +488 -0
  188. package/dist/multi-agent/team.d.ts +286 -0
  189. package/dist/multi-agent/team.js +610 -0
  190. package/dist/multi-agent/tool-config.d.ts +110 -0
  191. package/dist/multi-agent/tool-config.js +661 -0
  192. package/dist/multi-agent/types.d.ts +211 -0
  193. package/dist/multi-agent/types.js +617 -0
  194. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  195. package/dist/prompts/plan-mode-prompt.js +95 -0
  196. package/dist/repl-helpers.d.ts +63 -0
  197. package/dist/repl-helpers.js +319 -0
  198. package/dist/repl-v2.d.ts +554 -0
  199. package/dist/repl-v2.js +3286 -0
  200. package/dist/session/index.d.ts +6 -0
  201. package/dist/session/index.js +6 -0
  202. package/dist/session/project-session-manager.d.ts +158 -0
  203. package/dist/session/project-session-manager.js +650 -0
  204. package/dist/settings/index.d.ts +156 -13
  205. package/dist/settings/index.js +377 -24
  206. package/dist/settings/mcp-config.d.ts +76 -0
  207. package/dist/settings/mcp-config.js +143 -0
  208. package/dist/settings/paths.d.ts +114 -0
  209. package/dist/settings/paths.js +270 -0
  210. package/dist/shared-handlers.d.ts +62 -0
  211. package/dist/shared-handlers.js +48 -0
  212. package/dist/system-prompt/builder.d.ts +5 -0
  213. package/dist/system-prompt/builder.js +4 -0
  214. package/dist/system-prompt/index.d.ts +18 -0
  215. package/dist/system-prompt/index.js +18 -0
  216. package/dist/system-prompt/modules.d.ts +5 -0
  217. package/dist/system-prompt/modules.js +4 -0
  218. package/dist/tabbed-menu.js +2 -1
  219. package/dist/templates/compilr-md-import.d.ts +16 -0
  220. package/dist/templates/compilr-md-import.js +241 -0
  221. package/dist/templates/compilr-md.js +10 -58
  222. package/dist/templates/config-json.d.ts +1 -25
  223. package/dist/templates/index.d.ts +2 -0
  224. package/dist/templates/index.js +35 -75
  225. package/dist/themes/colors.js +3 -1
  226. package/dist/themes/registry.d.ts +5 -36
  227. package/dist/themes/registry.js +11 -95
  228. package/dist/themes/types.d.ts +3 -38
  229. package/dist/themes/types.js +2 -2
  230. package/dist/tool-names.d.ts +108 -0
  231. package/dist/tool-names.js +227 -0
  232. package/dist/tools/anchor-tools.d.ts +31 -0
  233. package/dist/tools/anchor-tools.js +255 -0
  234. package/dist/tools/artifact-tools.d.ts +42 -0
  235. package/dist/tools/artifact-tools.js +328 -0
  236. package/dist/tools/ask-user-simple.d.ts +1 -1
  237. package/dist/tools/ask-user-simple.js +2 -1
  238. package/dist/tools/ask-user.d.ts +1 -1
  239. package/dist/tools/ask-user.js +2 -1
  240. package/dist/tools/backlog-wrappers.d.ts +56 -0
  241. package/dist/tools/backlog-wrappers.js +353 -0
  242. package/dist/tools/backlog.d.ts +2 -2
  243. package/dist/tools/backlog.js +2 -2
  244. package/dist/tools/db-tools.d.ts +12 -0
  245. package/dist/tools/db-tools.js +14 -0
  246. package/dist/tools/delegate-background.d.ts +27 -0
  247. package/dist/tools/delegate-background.js +115 -0
  248. package/dist/tools/delegate.d.ts +22 -0
  249. package/dist/tools/delegate.js +97 -0
  250. package/dist/tools/delegation-status.d.ts +16 -0
  251. package/dist/tools/delegation-status.js +128 -0
  252. package/dist/tools/document-db.d.ts +43 -0
  253. package/dist/tools/document-db.js +220 -0
  254. package/dist/tools/guide-tool.d.ts +12 -0
  255. package/dist/tools/guide-tool.js +59 -0
  256. package/dist/tools/handoff.d.ts +25 -0
  257. package/dist/tools/handoff.js +99 -0
  258. package/dist/tools/meta-tools.d.ts +26 -0
  259. package/dist/tools/meta-tools.js +47 -0
  260. package/dist/tools/plan-tools.d.ts +54 -0
  261. package/dist/tools/plan-tools.js +338 -0
  262. package/dist/tools/platform-adapter.d.ts +29 -0
  263. package/dist/tools/platform-adapter.js +394 -0
  264. package/dist/tools/project-db.d.ts +34 -0
  265. package/dist/tools/project-db.js +39 -0
  266. package/dist/tools/recall-work-tool.d.ts +18 -0
  267. package/dist/tools/recall-work-tool.js +82 -0
  268. package/dist/tools/workitem-db.d.ts +135 -0
  269. package/dist/tools/workitem-db.js +730 -0
  270. package/dist/tools.d.ts +67 -2
  271. package/dist/tools.js +238 -38
  272. package/dist/ui/ask-user-overlay.d.ts +2 -2
  273. package/dist/ui/ask-user-overlay.js +443 -535
  274. package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
  275. package/dist/ui/ask-user-simple-overlay.js +182 -209
  276. package/dist/ui/autocomplete-controller.d.ts +42 -0
  277. package/dist/ui/autocomplete-controller.js +384 -0
  278. package/dist/ui/base/index.d.ts +26 -0
  279. package/dist/ui/base/index.js +33 -0
  280. package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
  281. package/dist/ui/base/inline-overlay-utils.js +320 -0
  282. package/dist/ui/base/inline-overlay.d.ts +159 -0
  283. package/dist/ui/base/inline-overlay.js +257 -0
  284. package/dist/ui/base/key-utils.d.ts +15 -0
  285. package/dist/ui/base/key-utils.js +30 -0
  286. package/dist/ui/base/overlay-base-v2.d.ts +203 -0
  287. package/dist/ui/base/overlay-base-v2.js +260 -0
  288. package/dist/ui/base/overlay-base.d.ts +156 -0
  289. package/dist/ui/base/overlay-base.js +238 -0
  290. package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
  291. package/dist/ui/base/overlay-lifecycle.js +159 -0
  292. package/dist/ui/base/overlay-types.d.ts +185 -0
  293. package/dist/ui/base/overlay-types.js +7 -0
  294. package/dist/ui/base/render-utils.d.ts +27 -0
  295. package/dist/ui/base/render-utils.js +36 -0
  296. package/dist/ui/base/screen-stack.d.ts +148 -0
  297. package/dist/ui/base/screen-stack.js +184 -0
  298. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +118 -0
  299. package/dist/ui/base/tabbed-list-overlay-v2.js +335 -0
  300. package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
  301. package/dist/ui/base/tabbed-list-overlay.js +369 -0
  302. package/dist/ui/constants/labels.d.ts +14 -0
  303. package/dist/ui/constants/labels.js +51 -0
  304. package/dist/ui/conversation-store.d.ts +55 -0
  305. package/dist/ui/conversation-store.js +107 -0
  306. package/dist/ui/conversation.d.ts +75 -4
  307. package/dist/ui/conversation.js +376 -165
  308. package/dist/ui/diff.d.ts +7 -1
  309. package/dist/ui/diff.js +85 -48
  310. package/dist/ui/ephemeral.d.ts +1 -1
  311. package/dist/ui/ephemeral.js +4 -10
  312. package/dist/ui/features/index.d.ts +34 -0
  313. package/dist/ui/features/index.js +34 -0
  314. package/dist/ui/features/input-feature.d.ts +85 -0
  315. package/dist/ui/features/input-feature.js +238 -0
  316. package/dist/ui/features/list-feature.d.ts +155 -0
  317. package/dist/ui/features/list-feature.js +244 -0
  318. package/dist/ui/features/pagination-feature.d.ts +154 -0
  319. package/dist/ui/features/pagination-feature.js +238 -0
  320. package/dist/ui/features/search-feature.d.ts +148 -0
  321. package/dist/ui/features/search-feature.js +185 -0
  322. package/dist/ui/features/tab-feature.d.ts +194 -0
  323. package/dist/ui/features/tab-feature.js +307 -0
  324. package/dist/ui/file-autocomplete.d.ts +24 -0
  325. package/dist/ui/file-autocomplete.js +56 -0
  326. package/dist/ui/footer-renderer.d.ts +69 -0
  327. package/dist/ui/footer-renderer.js +431 -0
  328. package/dist/ui/footer.d.ts +181 -7
  329. package/dist/ui/footer.js +523 -74
  330. package/dist/ui/guardrail-overlay.d.ts +29 -0
  331. package/dist/ui/guardrail-overlay.js +145 -0
  332. package/dist/ui/index.d.ts +1 -1
  333. package/dist/ui/index.js +1 -3
  334. package/dist/ui/input-controller.d.ts +51 -0
  335. package/dist/ui/input-controller.js +176 -0
  336. package/dist/ui/input-prompt.d.ts +135 -33
  337. package/dist/ui/input-prompt.js +728 -337
  338. package/dist/ui/iteration-limit-overlay.d.ts +2 -2
  339. package/dist/ui/iteration-limit-overlay.js +92 -128
  340. package/dist/ui/keyboard-handler.d.ts +57 -0
  341. package/dist/ui/keyboard-handler.js +557 -0
  342. package/dist/ui/keys-overlay.d.ts +1 -0
  343. package/dist/ui/keys-overlay.js +203 -141
  344. package/dist/ui/line-utils.d.ts +88 -0
  345. package/dist/ui/line-utils.js +150 -0
  346. package/dist/ui/live-region-facade.d.ts +42 -0
  347. package/dist/ui/live-region-facade.js +205 -0
  348. package/dist/ui/live-region.d.ts +157 -0
  349. package/dist/ui/live-region.js +379 -0
  350. package/dist/ui/mascot/expressions.d.ts +32 -0
  351. package/dist/ui/mascot/expressions.js +213 -0
  352. package/dist/ui/mascot/index.d.ts +8 -0
  353. package/dist/ui/mascot/index.js +8 -0
  354. package/dist/ui/mascot/renderer.d.ts +19 -0
  355. package/dist/ui/mascot/renderer.js +132 -0
  356. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  357. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  358. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  359. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  360. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  361. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  362. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  363. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  364. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  365. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  366. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  367. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  368. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  369. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  370. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  371. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  372. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  373. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  374. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  375. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  376. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  377. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  378. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  379. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  380. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  381. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  382. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  383. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  384. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  385. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  386. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  387. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  388. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  389. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  390. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  391. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  392. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  393. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  394. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  395. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  396. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  397. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  398. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  399. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  400. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  401. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  402. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  403. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  404. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  405. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  406. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  407. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  408. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  409. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  410. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  411. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  412. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  413. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  414. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  415. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  416. package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
  417. package/dist/ui/overlay/impl/agents-overlay-v2.js +814 -0
  418. package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
  419. package/dist/ui/overlay/impl/anchors-overlay-v2.js +749 -0
  420. package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
  421. package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
  422. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  423. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  424. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  425. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  426. package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
  427. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +581 -0
  428. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
  429. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
  430. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  431. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  432. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +52 -0
  433. package/dist/ui/overlay/impl/backlog-overlay-v2.js +681 -0
  434. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  435. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  436. package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
  437. package/dist/ui/overlay/impl/commands-overlay-v2.js +439 -0
  438. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +111 -0
  439. package/dist/ui/overlay/impl/config-overlay-v2.js +718 -0
  440. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  441. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  442. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +57 -0
  443. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +382 -0
  444. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  445. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  446. package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
  447. package/dist/ui/overlay/impl/docs-overlay-v2.js +117 -0
  448. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +84 -0
  449. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1112 -0
  450. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  451. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  452. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  453. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  454. package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
  455. package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
  456. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +57 -0
  457. package/dist/ui/overlay/impl/help-overlay-v2.js +287 -0
  458. package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
  459. package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
  460. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
  461. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
  462. package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
  463. package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
  464. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  465. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  466. package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
  467. package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
  468. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  469. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  470. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +93 -0
  471. package/dist/ui/overlay/impl/model-overlay-v2.js +1143 -0
  472. package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
  473. package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
  474. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +108 -0
  475. package/dist/ui/overlay/impl/new-overlay-v2.js +1243 -0
  476. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  477. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  478. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  479. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  480. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  481. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  482. package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
  483. package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
  484. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  485. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  486. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  487. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  488. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  489. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  490. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +37 -0
  491. package/dist/ui/overlay/impl/projects-overlay-v2.js +733 -0
  492. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  493. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  494. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  495. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  496. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  497. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  498. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  499. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  500. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  501. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  502. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  503. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  504. package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
  505. package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
  506. package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
  507. package/dist/ui/overlay/impl/tools-overlay-v2.js +214 -0
  508. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +45 -0
  509. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +212 -0
  510. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
  511. package/dist/ui/overlay/impl/workflow-overlay-v2.js +641 -0
  512. package/dist/ui/overlay/index.d.ts +52 -0
  513. package/dist/ui/overlay/index.js +54 -0
  514. package/dist/ui/overlay/key-utils.d.ts +6 -0
  515. package/dist/ui/overlay/key-utils.js +6 -0
  516. package/dist/ui/overlay/types.d.ts +140 -0
  517. package/dist/ui/overlay/types.js +22 -0
  518. package/dist/ui/overlay-manager.d.ts +43 -0
  519. package/dist/ui/overlay-manager.js +238 -0
  520. package/dist/ui/overlays.d.ts +0 -4
  521. package/dist/ui/overlays.js +4 -460
  522. package/dist/ui/permission-overlay.d.ts +1 -1
  523. package/dist/ui/permission-overlay.js +189 -300
  524. package/dist/ui/providers/types.d.ts +178 -0
  525. package/dist/ui/providers/types.js +9 -0
  526. package/dist/ui/render-modes.d.ts +36 -0
  527. package/dist/ui/render-modes.js +44 -0
  528. package/dist/ui/startup-menu.d.ts +36 -0
  529. package/dist/ui/startup-menu.js +236 -0
  530. package/dist/ui/status-bar-controller.d.ts +33 -0
  531. package/dist/ui/status-bar-controller.js +99 -0
  532. package/dist/ui/subagent-renderer.d.ts +117 -0
  533. package/dist/ui/subagent-renderer.js +318 -0
  534. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  535. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  536. package/dist/ui/terminal-codes.d.ts +94 -0
  537. package/dist/ui/terminal-codes.js +124 -0
  538. package/dist/ui/terminal-line-builders.d.ts +17 -0
  539. package/dist/ui/terminal-line-builders.js +42 -0
  540. package/dist/ui/terminal-render-item.d.ts +16 -0
  541. package/dist/ui/terminal-render-item.js +267 -0
  542. package/dist/ui/terminal-renderer.d.ts +220 -0
  543. package/dist/ui/terminal-renderer.js +750 -0
  544. package/dist/ui/terminal-types.d.ts +179 -0
  545. package/dist/ui/terminal-types.js +34 -0
  546. package/dist/ui/terminal-ui.d.ts +331 -0
  547. package/dist/ui/terminal-ui.js +819 -0
  548. package/dist/ui/terminal.d.ts +20 -0
  549. package/dist/ui/terminal.js +72 -0
  550. package/dist/ui/todo-zone.d.ts +19 -1
  551. package/dist/ui/todo-zone.js +124 -38
  552. package/dist/ui/tool-formatters.d.ts +16 -0
  553. package/dist/ui/tool-formatters.js +1027 -0
  554. package/dist/ui/turn-metrics.d.ts +56 -0
  555. package/dist/ui/turn-metrics.js +75 -0
  556. package/dist/ui/types.d.ts +28 -0
  557. package/dist/ui/types.js +1 -0
  558. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  559. package/dist/ui/vscode-diff-ipc.js +385 -0
  560. package/dist/utils/credentials.d.ts +24 -5
  561. package/dist/utils/credentials.js +123 -9
  562. package/dist/utils/debug-log.d.ts +28 -0
  563. package/dist/utils/debug-log.js +57 -0
  564. package/dist/utils/format-tokens.d.ts +13 -0
  565. package/dist/utils/format-tokens.js +18 -0
  566. package/dist/utils/git-config.d.ts +26 -0
  567. package/dist/utils/git-config.js +54 -0
  568. package/dist/utils/message-utils.d.ts +61 -0
  569. package/dist/utils/message-utils.js +72 -0
  570. package/dist/utils/model-tiers.d.ts +8 -1
  571. package/dist/utils/model-tiers.js +39 -17
  572. package/dist/utils/open-browser.d.ts +5 -0
  573. package/dist/utils/open-browser.js +32 -0
  574. package/dist/utils/path-safety.d.ts +56 -0
  575. package/dist/utils/path-safety.js +240 -0
  576. package/dist/utils/project-detection.d.ts +58 -0
  577. package/dist/utils/project-detection.js +424 -0
  578. package/dist/utils/project-memory.js +2 -1
  579. package/dist/utils/project-status.d.ts +2 -2
  580. package/dist/utils/startup-perf.d.ts +18 -0
  581. package/dist/utils/startup-perf.js +60 -0
  582. package/dist/utils/token-tracker.d.ts +62 -0
  583. package/dist/utils/token-tracker.js +150 -0
  584. package/dist/utils/token-types.d.ts +23 -0
  585. package/dist/utils/token-types.js +18 -0
  586. package/dist/utils/types/config-types.d.ts +32 -0
  587. package/dist/utils/types/config-types.js +8 -0
  588. package/dist/utils/update-checker.d.ts +28 -0
  589. package/dist/utils/update-checker.js +106 -0
  590. package/dist/utils/version.d.ts +7 -0
  591. package/dist/utils/version.js +10 -0
  592. package/dist/utils/vscode-detect.d.ts +39 -0
  593. package/dist/utils/vscode-detect.js +137 -0
  594. package/dist/workflow/guided-mode-injector.d.ts +42 -0
  595. package/dist/workflow/guided-mode-injector.js +191 -0
  596. package/dist/workflow/index.d.ts +8 -0
  597. package/dist/workflow/index.js +8 -0
  598. package/dist/workflow/step-criteria.d.ts +62 -0
  599. package/dist/workflow/step-criteria.js +150 -0
  600. package/dist/workflow/step-tracker.d.ts +92 -0
  601. package/dist/workflow/step-tracker.js +141 -0
  602. package/package.json +32 -12
  603. package/dist/index.old.d.ts +0 -7
  604. package/dist/index.old.js +0 -1014
  605. package/dist/repl.d.ts +0 -121
  606. package/dist/repl.js +0 -1878
  607. package/dist/templates/claude-md.d.ts +0 -7
  608. package/dist/templates/claude-md.js +0 -189
  609. package/dist/test-autocomplete.d.ts +0 -7
  610. package/dist/test-autocomplete.js +0 -85
  611. package/dist/test-tabbed-menu.d.ts +0 -7
  612. package/dist/test-tabbed-menu.js +0 -25
  613. package/dist/tool-selector.d.ts +0 -71
  614. package/dist/tool-selector.js +0 -184
  615. package/dist/ui/agents-overlay.d.ts +0 -12
  616. package/dist/ui/agents-overlay.js +0 -501
  617. package/dist/ui/arch-type-overlay.d.ts +0 -20
  618. package/dist/ui/arch-type-overlay.js +0 -229
  619. package/dist/ui/backlog-overlay.d.ts +0 -17
  620. package/dist/ui/backlog-overlay.js +0 -786
  621. package/dist/ui/commands-overlay.d.ts +0 -11
  622. package/dist/ui/commands-overlay.js +0 -410
  623. package/dist/ui/config-overlay.d.ts +0 -34
  624. package/dist/ui/config-overlay.js +0 -977
  625. package/dist/ui/init-overlay.d.ts +0 -24
  626. package/dist/ui/init-overlay.js +0 -525
  627. package/dist/ui/input-prompt-v2.d.ts +0 -179
  628. package/dist/ui/input-prompt-v2.js +0 -991
  629. package/dist/ui/model-warning-overlay.d.ts +0 -30
  630. package/dist/ui/model-warning-overlay.js +0 -171
  631. package/dist/ui/tools-overlay.d.ts +0 -26
  632. package/dist/ui/tools-overlay.js +0 -278
  633. package/dist/ui/tutorial-overlay.d.ts +0 -10
  634. package/dist/ui/tutorial-overlay.js +0 -936
@@ -0,0 +1,184 @@
1
+ /**
2
+ * Screen Stack
3
+ *
4
+ * Navigation stack for multi-screen overlays.
5
+ * Enables proper "back" behavior where Esc goes to previous screen.
6
+ *
7
+ * Usage:
8
+ * ```typescript
9
+ * class MyOverlay extends BaseOverlay<MyState, MyResult> {
10
+ * private screenStack = new ScreenStack();
11
+ *
12
+ * constructor() {
13
+ * super(initialState);
14
+ * this.screenStack.push(new ListScreen());
15
+ * }
16
+ *
17
+ * handleKey(data: Buffer): void {
18
+ * if (isEscape(data)) {
19
+ * if (this.screenStack.size() > 1) {
20
+ * this.screenStack.pop();
21
+ * this.update();
22
+ * } else {
23
+ * this.close(null);
24
+ * }
25
+ * return;
26
+ * }
27
+ *
28
+ * const result = this.screenStack.current()?.handleKey(data);
29
+ * this.handleScreenResult(result);
30
+ * }
31
+ *
32
+ * render(): string[] {
33
+ * return [
34
+ * ...this.renderHeader('My Overlay'),
35
+ * ...this.screenStack.current()?.render() ?? [],
36
+ * ...this.renderFooter(this.getCurrentHints())
37
+ * ];
38
+ * }
39
+ * }
40
+ * ```
41
+ */
42
+ // =============================================================================
43
+ // BaseScreen Abstract Class
44
+ // =============================================================================
45
+ /**
46
+ * Abstract base class for screens.
47
+ * Extend this to create screens for multi-screen overlays.
48
+ */
49
+ export class BaseScreen {
50
+ /**
51
+ * Optional: Return minimum height for stable rendering.
52
+ * Override to prevent visual jitter when screen content varies.
53
+ * @returns Minimum number of lines this screen should occupy
54
+ */
55
+ getMinHeight() {
56
+ return 0; // Default: no minimum, use overlay's minHeight
57
+ }
58
+ }
59
+ // =============================================================================
60
+ // ScreenStack Class
61
+ // =============================================================================
62
+ /**
63
+ * Stack-based navigation for multi-screen overlays.
64
+ *
65
+ * The stack maintains a history of screens, allowing:
66
+ * - push() to navigate forward to a new screen
67
+ * - pop() to go back to the previous screen
68
+ * - current() to get the active screen
69
+ */
70
+ export class ScreenStack {
71
+ screens = [];
72
+ /**
73
+ * Push a new screen onto the stack.
74
+ * Calls onExit() on current screen and onEnter() on new screen.
75
+ *
76
+ * @param screen - Screen to push
77
+ */
78
+ push(screen) {
79
+ // Call exit hook on current screen
80
+ this.current()?.onExit?.();
81
+ // Push new screen
82
+ this.screens.push(screen);
83
+ // Call enter hook on new screen
84
+ screen.onEnter?.();
85
+ }
86
+ /**
87
+ * Pop the current screen and return to the previous one.
88
+ * Calls onExit() on popped screen and onEnter() on revealed screen.
89
+ *
90
+ * @returns The popped screen, or null if stack was empty
91
+ */
92
+ pop() {
93
+ if (this.screens.length === 0) {
94
+ return null;
95
+ }
96
+ // Pop and call exit hook
97
+ const screen = this.screens.pop();
98
+ if (screen) {
99
+ screen.onExit?.();
100
+ }
101
+ // Call enter hook on now-current screen
102
+ this.current()?.onEnter?.();
103
+ return screen ?? null;
104
+ }
105
+ /**
106
+ * Get the current (topmost) screen.
107
+ *
108
+ * @returns Current screen, or undefined if stack is empty
109
+ */
110
+ current() {
111
+ return this.screens[this.screens.length - 1];
112
+ }
113
+ /**
114
+ * Get the number of screens in the stack.
115
+ */
116
+ size() {
117
+ return this.screens.length;
118
+ }
119
+ /**
120
+ * Check if the stack is empty.
121
+ */
122
+ isEmpty() {
123
+ return this.screens.length === 0;
124
+ }
125
+ /**
126
+ * Check if there's more than one screen (can go back).
127
+ */
128
+ canGoBack() {
129
+ return this.screens.length > 1;
130
+ }
131
+ /**
132
+ * Clear all screens from the stack.
133
+ * Calls onExit() on each screen in reverse order.
134
+ */
135
+ clear() {
136
+ while (this.screens.length > 0) {
137
+ this.pop();
138
+ }
139
+ }
140
+ /**
141
+ * Replace the current screen with a new one.
142
+ * Useful for "replace" navigation (no back).
143
+ *
144
+ * @param screen - Screen to replace with
145
+ */
146
+ replace(screen) {
147
+ if (this.screens.length > 0) {
148
+ const current = this.screens.pop();
149
+ if (current) {
150
+ current.onExit?.();
151
+ }
152
+ }
153
+ this.screens.push(screen);
154
+ screen.onEnter?.();
155
+ }
156
+ }
157
+ // =============================================================================
158
+ // Helper Types
159
+ // =============================================================================
160
+ /**
161
+ * Helper to create a ScreenResult for staying on the current screen.
162
+ */
163
+ export function stay(render = true) {
164
+ return { action: 'stay', render };
165
+ }
166
+ /**
167
+ * Helper to create a ScreenResult for pushing a new screen.
168
+ */
169
+ export function pushScreen(screen) {
170
+ return { action: 'push', screen };
171
+ }
172
+ /**
173
+ * Helper to create a ScreenResult for popping the current screen.
174
+ */
175
+ export function popScreen() {
176
+ return { action: 'pop' };
177
+ }
178
+ /**
179
+ * Helper to create a ScreenResult for closing the overlay.
180
+ * Result is optional for void result types.
181
+ */
182
+ export function closeOverlay(result) {
183
+ return { action: 'close', result: result };
184
+ }
@@ -0,0 +1,118 @@
1
+ /**
2
+ * Tabbed List Overlay V2
3
+ *
4
+ * A reusable base for overlays using the new Overlay interface.
5
+ * Provides tabs, pagination, search, and detail views.
6
+ *
7
+ * Key differences from TabbedListOverlay:
8
+ * - Extends BaseOverlayV2 (implements new Overlay interface)
9
+ * - handleKey returns OverlayAction instead of void
10
+ * - Works with TerminalUI's overlay management
11
+ * - Keeps ScreenStack internally for detail screen navigation
12
+ */
13
+ import { BaseOverlayV2 } from './overlay-base-v2.js';
14
+ import { BaseScreen, ScreenStack } from './screen-stack.js';
15
+ import { type PaginationState } from '../features/pagination-feature.js';
16
+ import { type SearchState } from '../features/search-feature.js';
17
+ import type { TabDefinition, TabState } from './overlay-types.js';
18
+ import type { RenderContext, OverlayAction, KeyEvent } from '../overlay/index.js';
19
+ import type { ThemeStyleFunctions } from '../../themes/index.js';
20
+ /**
21
+ * Configuration for a TabbedListOverlayV2.
22
+ */
23
+ export interface TabbedListConfigV2<TItem> {
24
+ /** Title shown in header */
25
+ title: string;
26
+ /** Tab definitions */
27
+ tabs: TabDefinition[];
28
+ /** All items (will be filtered by tab and search) */
29
+ items: TItem[];
30
+ /** Number of items per page (default: 12) */
31
+ pageSize?: number;
32
+ /**
33
+ * Filter items by tab.
34
+ * Return true to include item in the current tab.
35
+ */
36
+ filterByTab: (item: TItem, tabId: string) => boolean;
37
+ /**
38
+ * Get searchable text from an item.
39
+ * Used for search filtering.
40
+ */
41
+ getSearchText: (item: TItem) => string;
42
+ /**
43
+ * Render an item as a string line.
44
+ */
45
+ renderItem: (item: TItem, isSelected: boolean, styles: ThemeStyleFunctions) => string;
46
+ /** Show count badge in header (default: true) */
47
+ showCount?: boolean;
48
+ /** Custom empty state message */
49
+ emptyMessage?: string;
50
+ /** Custom no-results message */
51
+ noResultsMessage?: string;
52
+ /** Custom footer hints */
53
+ footerHints?: (searchMode: boolean, activeTabId?: string) => string;
54
+ /**
55
+ * Render preview content for the selected item.
56
+ * Displayed between the list and footer.
57
+ */
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
+ };
74
+ }
75
+ /**
76
+ * State for TabbedListOverlayV2.
77
+ */
78
+ export interface TabbedListStateV2<TItem> extends TabState, PaginationState, SearchState {
79
+ /** All items */
80
+ items: TItem[];
81
+ /** Filtered items (by tab and search) */
82
+ filteredItems: TItem[];
83
+ /** Whether search mode is active */
84
+ searchMode: boolean;
85
+ }
86
+ /**
87
+ * Abstract base class for tabbed list overlays using the new Overlay interface.
88
+ */
89
+ export declare abstract class TabbedListOverlayV2<TItem, TResult = void> extends BaseOverlayV2<TabbedListStateV2<TItem>, TResult> {
90
+ abstract readonly type: 'fullscreen' | 'inline';
91
+ abstract readonly id: string;
92
+ protected readonly screenStack: ScreenStack;
93
+ protected readonly listConfig: TabbedListConfigV2<TItem>;
94
+ constructor(config: TabbedListConfigV2<TItem>);
95
+ /**
96
+ * Override to create a detail screen for an item.
97
+ * Return null to disable detail view.
98
+ */
99
+ protected createDetailScreen(_item: TItem): BaseScreen | null;
100
+ /**
101
+ * Override to handle item selection.
102
+ * Return a result to close the overlay, or undefined to fall back to detail screen.
103
+ */
104
+ protected onItemSelected(_item: TItem): TResult | undefined;
105
+ protected renderContent(_context: RenderContext): string[];
106
+ /**
107
+ * Override render to use the effective minHeight (max of overlay and current screen).
108
+ */
109
+ render(context: RenderContext): {
110
+ lines: string[];
111
+ minHeight?: number;
112
+ };
113
+ handleKey(key: KeyEvent): OverlayAction<TResult>;
114
+ /**
115
+ * Get the currently selected item.
116
+ */
117
+ protected getSelectedItem(): TItem | undefined;
118
+ }
@@ -0,0 +1,335 @@
1
+ /**
2
+ * Tabbed List Overlay V2
3
+ *
4
+ * A reusable base for overlays using the new Overlay interface.
5
+ * Provides tabs, pagination, search, and detail views.
6
+ *
7
+ * Key differences from TabbedListOverlay:
8
+ * - Extends BaseOverlayV2 (implements new Overlay interface)
9
+ * - handleKey returns OverlayAction instead of void
10
+ * - Works with TerminalUI's overlay management
11
+ * - Keeps ScreenStack internally for detail screen navigation
12
+ */
13
+ // Terminal width is passed via getWidth callback
14
+ import { BaseOverlayV2 } from './overlay-base-v2.js';
15
+ import { BaseScreen, ScreenStack } from './screen-stack.js';
16
+ import { TabFeature } from '../features/tab-feature.js';
17
+ import { PaginationFeature } from '../features/pagination-feature.js';
18
+ import { SearchFeature } from '../features/search-feature.js';
19
+ import { isCtrlC, isClose, isEscape, isSlash, isEnter } from './key-utils.js';
20
+ import { renderBorder } from './render-utils.js';
21
+ // =============================================================================
22
+ // List Screen V2 (Main View)
23
+ // =============================================================================
24
+ /**
25
+ * The main list screen for TabbedListOverlayV2.
26
+ */
27
+ class ListScreenV2 extends BaseScreen {
28
+ config;
29
+ state;
30
+ getStyles;
31
+ getWidth;
32
+ createDetailScreen;
33
+ onItemSelected;
34
+ tabFeature;
35
+ pagination;
36
+ searchFeature;
37
+ constructor(config, state, getStyles, getWidth, createDetailScreen, onItemSelected) {
38
+ super();
39
+ this.config = config;
40
+ this.state = state;
41
+ this.getStyles = getStyles;
42
+ this.getWidth = getWidth;
43
+ this.createDetailScreen = createDetailScreen;
44
+ this.onItemSelected = onItemSelected;
45
+ this.tabFeature = new TabFeature(config.tabs, () => {
46
+ this.onTabChange();
47
+ });
48
+ this.pagination = new PaginationFeature({
49
+ pageSize: config.pageSize ?? 12,
50
+ });
51
+ this.searchFeature = new SearchFeature({
52
+ onSearch: () => {
53
+ this.applyFilters();
54
+ },
55
+ escapeClearsSearch: false,
56
+ });
57
+ }
58
+ onTabChange() {
59
+ this.state.selectedIndex = 0;
60
+ this.state.scrollOffset = 0;
61
+ this.state.searchMode = false;
62
+ this.state.searchQuery = '';
63
+ this.applyFilters();
64
+ }
65
+ applyFilters() {
66
+ const tabId = this.tabFeature.getCurrentTabId(this.state);
67
+ let filtered = this.state.items.filter((item) => this.config.filterByTab(item, tabId));
68
+ if (this.state.searchQuery) {
69
+ filtered = this.searchFeature.filterItems(filtered, this.state, this.config.getSearchText);
70
+ }
71
+ this.state.filteredItems = filtered;
72
+ this.state.selectedIndex = 0;
73
+ this.state.scrollOffset = 0;
74
+ }
75
+ render() {
76
+ const s = this.getStyles();
77
+ const cols = this.getWidth();
78
+ const border = renderBorder(cols, s);
79
+ const pageSize = this.config.pageSize ?? 12;
80
+ const lines = [];
81
+ // Header
82
+ lines.push(border);
83
+ const showCount = this.config.showCount ?? true;
84
+ const countBadge = showCount
85
+ ? s.muted(` [${String(this.state.filteredItems.length)}/${String(this.state.items.length)}]`)
86
+ : '';
87
+ lines.push(` ${s.primaryBold(this.config.title)}${countBadge}`);
88
+ lines.push('');
89
+ // Tab bar with hint
90
+ const tabBar = this.tabFeature.renderTabs(this.state, s);
91
+ const tabHint = s.muted(`(${this.tabFeature.renderHints()})`);
92
+ lines.push(` ${tabBar} ${tabHint}`);
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
+ }
100
+ // Search box (if in search mode)
101
+ if (this.state.searchMode) {
102
+ const query = this.state.searchQuery;
103
+ lines.push(` ${s.muted('Search:')} ${query ? s.primary(query) : ''}█`);
104
+ lines.push('');
105
+ }
106
+ // Items
107
+ const visibleItems = this.pagination.getVisibleItems(this.state, this.state.filteredItems);
108
+ if (visibleItems.length === 0) {
109
+ const msg = this.state.searchQuery
110
+ ? (this.config.noResultsMessage ?? 'No items match the search.')
111
+ : (this.config.emptyMessage ?? 'No items available.');
112
+ lines.push(` ${s.muted(msg)}`);
113
+ for (let i = 0; i < pageSize - 1; i++) {
114
+ lines.push('');
115
+ }
116
+ }
117
+ else {
118
+ for (let i = 0; i < visibleItems.length; i++) {
119
+ const item = visibleItems[i];
120
+ const absoluteIndex = this.state.scrollOffset + i;
121
+ const isSelected = absoluteIndex === this.state.selectedIndex;
122
+ lines.push(this.config.renderItem(item, isSelected, s));
123
+ }
124
+ // Pad to fixed height
125
+ for (let i = visibleItems.length; i < pageSize; i++) {
126
+ lines.push('');
127
+ }
128
+ }
129
+ // Pagination indicator
130
+ lines.push('');
131
+ const indicator = this.pagination.renderIndicator(this.state, this.state.filteredItems.length, s);
132
+ if (indicator) {
133
+ lines.push(indicator);
134
+ }
135
+ // Selected item preview
136
+ if (this.config.renderSelectedPreview && visibleItems.length > 0) {
137
+ const selectedItem = this.state.filteredItems[this.state.selectedIndex];
138
+ if (selectedItem) {
139
+ lines.push('');
140
+ const previewLines = this.config.renderSelectedPreview(selectedItem, s);
141
+ lines.push(...previewLines);
142
+ }
143
+ }
144
+ // Footer
145
+ lines.push(border);
146
+ lines.push(` ${s.muted(this.getFooterHints())}`);
147
+ lines.push(border);
148
+ return lines;
149
+ }
150
+ getFooterHints() {
151
+ if (this.config.footerHints) {
152
+ const activeTab = this.config.tabs[this.state.currentTab];
153
+ return this.config.footerHints(this.state.searchMode, activeTab.id);
154
+ }
155
+ if (this.state.searchMode) {
156
+ return 'Type to filter · ↑↓/jk Navigate · Enter Details · Esc Exit search';
157
+ }
158
+ return this.pagination.renderHints() + ' · / Search · Enter Details · q/Esc Close';
159
+ }
160
+ handleKey(data) {
161
+ // Ctrl+C always closes
162
+ if (isCtrlC(data)) {
163
+ return { action: 'close', result: undefined };
164
+ }
165
+ // Search mode handling
166
+ if (this.state.searchMode) {
167
+ if (isEscape(data)) {
168
+ this.state.searchMode = false;
169
+ if (this.state.searchQuery) {
170
+ this.state.searchQuery = '';
171
+ this.applyFilters();
172
+ }
173
+ return { action: 'stay', render: true };
174
+ }
175
+ const searchResult = this.searchFeature.handleKey(data, this.state);
176
+ if (searchResult?.handled) {
177
+ return { action: 'stay', render: searchResult.action === 'render' };
178
+ }
179
+ if (isEnter(data)) {
180
+ return this.handleEnter();
181
+ }
182
+ const paginationResult = this.pagination.handleKey(data, this.state, this.state.filteredItems.length);
183
+ if (paginationResult?.handled) {
184
+ return { action: 'stay', render: paginationResult.action === 'render' };
185
+ }
186
+ return { action: 'stay', render: false };
187
+ }
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
+ }
200
+ if (isSlash(data)) {
201
+ this.state.searchMode = true;
202
+ return { action: 'stay', render: true };
203
+ }
204
+ if (isClose(data)) {
205
+ return { action: 'close', result: undefined };
206
+ }
207
+ // Tab navigation
208
+ const tabResult = this.tabFeature.handleKey(data, this.state);
209
+ if (tabResult?.handled) {
210
+ return { action: 'stay', render: tabResult.action === 'render' };
211
+ }
212
+ // Enter shows detail
213
+ if (isEnter(data)) {
214
+ return this.handleEnter();
215
+ }
216
+ // Pagination
217
+ const paginationResult = this.pagination.handleKey(data, this.state, this.state.filteredItems.length);
218
+ if (paginationResult?.handled) {
219
+ return { action: 'stay', render: paginationResult.action === 'render' };
220
+ }
221
+ return { action: 'stay', render: false };
222
+ }
223
+ handleEnter() {
224
+ if (this.state.filteredItems.length === 0) {
225
+ return { action: 'stay', render: false };
226
+ }
227
+ const item = this.state.filteredItems[this.state.selectedIndex];
228
+ // First, check if there's an item selection handler
229
+ if (this.onItemSelected) {
230
+ const result = this.onItemSelected(item);
231
+ if (result !== undefined) {
232
+ // Item was selected, close overlay with result
233
+ return { action: 'close', result };
234
+ }
235
+ }
236
+ // Fall back to detail screen
237
+ const detailScreen = this.createDetailScreen(item);
238
+ if (detailScreen) {
239
+ return { action: 'push', screen: detailScreen };
240
+ }
241
+ return { action: 'stay', render: false };
242
+ }
243
+ }
244
+ // =============================================================================
245
+ // TabbedListOverlayV2 Base Class
246
+ // =============================================================================
247
+ /**
248
+ * Abstract base class for tabbed list overlays using the new Overlay interface.
249
+ */
250
+ export class TabbedListOverlayV2 extends BaseOverlayV2 {
251
+ screenStack;
252
+ listConfig;
253
+ constructor(config) {
254
+ const initialState = {
255
+ currentTab: 0,
256
+ selectedIndex: 0,
257
+ scrollOffset: 0,
258
+ searchQuery: '',
259
+ searchMode: false,
260
+ items: config.items,
261
+ filteredItems: config.items.filter((item) => config.filterByTab(item, config.tabs[0]?.id ?? 'all')),
262
+ };
263
+ super(initialState);
264
+ this.listConfig = config;
265
+ // Calculate minimum height for stable rendering:
266
+ // Header (5) + pageSize items + pagination (2) + footer (3) = 10 + pageSize
267
+ const pageSize = config.pageSize ?? 12;
268
+ this.minHeight = 10 + pageSize;
269
+ this.screenStack = new ScreenStack();
270
+ this.screenStack.push(new ListScreenV2(config, this.state, () => this.getStyles(), () => this.termWidth, (item) => this.createDetailScreen(item), (item) => this.onItemSelected(item)));
271
+ }
272
+ /**
273
+ * Override to create a detail screen for an item.
274
+ * Return null to disable detail view.
275
+ */
276
+ createDetailScreen(_item) {
277
+ return null;
278
+ }
279
+ /**
280
+ * Override to handle item selection.
281
+ * Return a result to close the overlay, or undefined to fall back to detail screen.
282
+ */
283
+ onItemSelected(_item) {
284
+ return undefined;
285
+ }
286
+ renderContent(_context) {
287
+ const screen = this.screenStack.current();
288
+ return screen?.render() ?? [];
289
+ }
290
+ /**
291
+ * Override render to use the effective minHeight (max of overlay and current screen).
292
+ */
293
+ render(context) {
294
+ // Cache context values for helper methods
295
+ this.styles = context.styles;
296
+ this.termWidth = context.width;
297
+ // Get content from subclass
298
+ const lines = this.renderContent(context);
299
+ // Calculate effective minHeight: max of overlay's base and current screen's minHeight
300
+ const screen = this.screenStack.current();
301
+ const screenMinHeight = screen?.getMinHeight?.() ?? 0;
302
+ const effectiveMinHeight = Math.max(this.minHeight, screenMinHeight);
303
+ return effectiveMinHeight > 0 ? { lines, minHeight: effectiveMinHeight } : { lines };
304
+ }
305
+ handleKey(key) {
306
+ // Convert KeyEvent to Buffer for old-style BaseScreen.handleKey
307
+ const data = key.raw;
308
+ const screen = this.screenStack.current();
309
+ if (!screen) {
310
+ return this.cancel();
311
+ }
312
+ const result = screen.handleKey(data);
313
+ switch (result.action) {
314
+ case 'stay':
315
+ return result.render ? this.rerender() : this.noAction();
316
+ case 'push':
317
+ this.screenStack.push(result.screen);
318
+ return this.rerender();
319
+ case 'pop':
320
+ this.screenStack.pop();
321
+ return this.rerender();
322
+ case 'close':
323
+ if (result.result !== undefined) {
324
+ return this.close(result.result);
325
+ }
326
+ return this.cancel();
327
+ }
328
+ }
329
+ /**
330
+ * Get the currently selected item.
331
+ */
332
+ getSelectedItem() {
333
+ return this.state.filteredItems[this.state.selectedIndex];
334
+ }
335
+ }