@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,260 @@
1
+ /**
2
+ * Base Overlay V2
3
+ *
4
+ * Abstract base class for overlays using the new Overlay interface.
5
+ * Designed to work with TerminalUI's overlay management.
6
+ *
7
+ * Key differences from BaseOverlay:
8
+ * - render() returns OverlayContent, not string[]
9
+ * - handleKey() returns OverlayAction, not void
10
+ * - TerminalUI manages the render loop (not the overlay itself)
11
+ * - Lifecycle via onMount()/onUnmount() instead of show()/close()
12
+ *
13
+ * Usage:
14
+ * ```typescript
15
+ * interface MyState {
16
+ * selectedIndex: number;
17
+ * }
18
+ *
19
+ * class MyOverlay extends BaseOverlayV2<MyState, string | null> {
20
+ * readonly type = 'inline';
21
+ * readonly id = 'my-overlay';
22
+ *
23
+ * constructor() {
24
+ * super({ selectedIndex: 0 });
25
+ * }
26
+ *
27
+ * protected renderContent(context: RenderContext): string[] {
28
+ * return [
29
+ * ...this.renderHeader('My Overlay'),
30
+ * ' Content here...',
31
+ * ...this.renderFooter('↑↓ Navigate · Enter Select · q/Esc Cancel')
32
+ * ];
33
+ * }
34
+ *
35
+ * handleKey(key: KeyEvent): OverlayAction<string | null> {
36
+ * if (key.name === 'escape' || key.name === 'q') {
37
+ * return this.close(null);
38
+ * }
39
+ * // ...
40
+ * return this.rerender();
41
+ * }
42
+ * }
43
+ * ```
44
+ */
45
+ // =============================================================================
46
+ // BaseOverlayV2 Abstract Class
47
+ // =============================================================================
48
+ /**
49
+ * Abstract base class for overlays using the new Overlay interface.
50
+ *
51
+ * @template TState - State interface for the overlay
52
+ * @template TResult - Return type when overlay closes
53
+ */
54
+ export class BaseOverlayV2 {
55
+ /** Current overlay state */
56
+ state;
57
+ /** Cached styles from last render context */
58
+ styles = null;
59
+ /** Cached terminal width from last render context */
60
+ termWidth = 80;
61
+ /** Minimum height for stable rendering (prevents visual jitter) */
62
+ minHeight = 0;
63
+ /** Callback to request re-render from async operations */
64
+ renderCallback = null;
65
+ /**
66
+ * Create a new overlay instance.
67
+ *
68
+ * @param initialState - Initial state
69
+ */
70
+ constructor(initialState) {
71
+ this.state = initialState;
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
+ }
85
+ // ===========================================================================
86
+ // Overlay Interface Implementation
87
+ // ===========================================================================
88
+ /**
89
+ * Get current state.
90
+ */
91
+ getState() {
92
+ return this.state;
93
+ }
94
+ /**
95
+ * Render the overlay.
96
+ * Calls renderContent() and wraps in OverlayContent.
97
+ */
98
+ render(context) {
99
+ // Cache context values for helper methods
100
+ this.styles = context.styles;
101
+ this.termWidth = context.width;
102
+ // Get content from subclass
103
+ const lines = this.renderContent(context);
104
+ // Include minHeight for stable rendering (prevents visual jitter when content height varies)
105
+ return this.minHeight > 0 ? { lines, minHeight: this.minHeight } : { lines };
106
+ }
107
+ // ===========================================================================
108
+ // Protected Methods - Action Helpers
109
+ // ===========================================================================
110
+ /**
111
+ * Return action to close with result.
112
+ */
113
+ close(result) {
114
+ return { type: 'close', result };
115
+ }
116
+ /**
117
+ * Return action to close as cancelled.
118
+ */
119
+ cancel() {
120
+ return { type: 'close', cancelled: true };
121
+ }
122
+ /**
123
+ * Return action to re-render.
124
+ */
125
+ rerender() {
126
+ return { type: 'render' };
127
+ }
128
+ /**
129
+ * Return action for no change.
130
+ */
131
+ noAction() {
132
+ return { type: 'none' };
133
+ }
134
+ /**
135
+ * Return action to push a sub-overlay.
136
+ */
137
+ push(overlay) {
138
+ return { type: 'push', overlay };
139
+ }
140
+ /**
141
+ * Return action to pop back to parent.
142
+ */
143
+ pop() {
144
+ return { type: 'pop' };
145
+ }
146
+ /**
147
+ * Get the cached styles (or throw if not available).
148
+ */
149
+ getStyles() {
150
+ if (!this.styles) {
151
+ throw new Error('Styles not available - render() must be called first');
152
+ }
153
+ return this.styles;
154
+ }
155
+ /**
156
+ * Render a standard header with border and title.
157
+ *
158
+ * @param title - Main title
159
+ * @param subtitle - Optional subtitle (shown in muted)
160
+ * @returns Array of lines
161
+ */
162
+ renderHeader(title, subtitle) {
163
+ const s = this.getStyles();
164
+ const border = s.muted('─'.repeat(Math.max(1, this.termWidth - 1)));
165
+ const lines = [border];
166
+ if (subtitle) {
167
+ lines.push(' ' + s.primaryBold(title) + s.muted(` ${subtitle}`));
168
+ }
169
+ else {
170
+ lines.push(' ' + s.primaryBold(title));
171
+ }
172
+ lines.push('');
173
+ return lines;
174
+ }
175
+ /**
176
+ * Render a standard footer with hints and border.
177
+ *
178
+ * @param hints - Keyboard hints string (e.g., "↑↓ Navigate · Enter Select")
179
+ * @returns Array of lines
180
+ */
181
+ renderFooter(hints) {
182
+ const s = this.getStyles();
183
+ const border = s.muted('─'.repeat(Math.max(1, this.termWidth - 1)));
184
+ return [border, s.muted(' ' + hints), border];
185
+ }
186
+ /**
187
+ * Render a border line spanning terminal width.
188
+ */
189
+ renderBorder() {
190
+ const s = this.getStyles();
191
+ return s.muted('─'.repeat(Math.max(1, this.termWidth - 1)));
192
+ }
193
+ // ===========================================================================
194
+ // Protected Methods - Key Helpers
195
+ // ===========================================================================
196
+ /**
197
+ * Check if key is a close key (escape or 'q').
198
+ */
199
+ isCloseKey(key) {
200
+ return key.name === 'escape' || key.name === 'q';
201
+ }
202
+ /**
203
+ * Check if key is Ctrl+C.
204
+ */
205
+ isInterruptKey(key) {
206
+ return key.ctrl && key.name === 'c';
207
+ }
208
+ /**
209
+ * Check if key is Enter/Return.
210
+ */
211
+ isEnterKey(key) {
212
+ return key.name === 'return';
213
+ }
214
+ /**
215
+ * Check if key is up arrow or 'k' (vim).
216
+ */
217
+ isUpKey(key) {
218
+ return key.name === 'up' || key.name === 'k';
219
+ }
220
+ /**
221
+ * Check if key is down arrow or 'j' (vim).
222
+ */
223
+ isDownKey(key) {
224
+ return key.name === 'down' || key.name === 'j';
225
+ }
226
+ /**
227
+ * Check if key is left arrow or 'h' (vim).
228
+ */
229
+ isLeftKey(key) {
230
+ return key.name === 'left' || key.name === 'h';
231
+ }
232
+ /**
233
+ * Check if key is right arrow or 'l' (vim).
234
+ */
235
+ isRightKey(key) {
236
+ return key.name === 'right' || key.name === 'l';
237
+ }
238
+ /**
239
+ * Check if key is Tab.
240
+ */
241
+ isTabKey(key) {
242
+ return key.name === 'tab' && !key.shift;
243
+ }
244
+ /**
245
+ * Check if key is Shift+Tab.
246
+ */
247
+ isShiftTabKey(key) {
248
+ return key.name === 'tab' && key.shift;
249
+ }
250
+ /**
251
+ * Get number if key is 1-9.
252
+ */
253
+ getNumberKey(key) {
254
+ const num = parseInt(key.name, 10);
255
+ if (num >= 1 && num <= 9) {
256
+ return num;
257
+ }
258
+ return null;
259
+ }
260
+ }
@@ -0,0 +1,156 @@
1
+ /**
2
+ * Base Overlay Class
3
+ *
4
+ * Abstract base class for all overlays. Provides:
5
+ * - Lifecycle management (setup, cleanup)
6
+ * - Rendering infrastructure (frame, header, footer)
7
+ * - State management
8
+ * - Common key handling patterns
9
+ *
10
+ * Usage:
11
+ * ```typescript
12
+ * interface MyState extends OverlayState {
13
+ * selectedIndex: number;
14
+ * }
15
+ *
16
+ * class MyOverlay extends BaseOverlay<MyState, string | null> {
17
+ * constructor() {
18
+ * super({ lineCount: 0, maxLineCount: 0, selectedIndex: 0 });
19
+ * }
20
+ *
21
+ * render(): string[] {
22
+ * return [
23
+ * ...this.renderHeader('My Overlay'),
24
+ * ' Content here...',
25
+ * ...this.renderFooter('↑↓ Navigate · Enter Select · q/Esc Cancel')
26
+ * ];
27
+ * }
28
+ *
29
+ * handleKey(data: Buffer): void {
30
+ * if (isClose(data)) { this.close(null); return; }
31
+ * // ... handle keys
32
+ * }
33
+ * }
34
+ *
35
+ * // Export function for backward compatibility
36
+ * export async function showMyOverlay(): Promise<string | null> {
37
+ * return new MyOverlay().show();
38
+ * }
39
+ * ```
40
+ */
41
+ import { getStyles } from '../../themes/index.js';
42
+ import { OverlayLifecycle } from './overlay-lifecycle.js';
43
+ import type { OverlayState, OverlayConfig } from './overlay-types.js';
44
+ export type { OverlayState, OverlayConfig };
45
+ /**
46
+ * Abstract base class for overlays.
47
+ *
48
+ * @template TState - State interface (must extend OverlayState)
49
+ * @template TResult - Return type when overlay closes
50
+ */
51
+ export declare abstract class BaseOverlay<TState extends OverlayState, TResult = void> {
52
+ /** Current overlay state */
53
+ protected state: TState;
54
+ /** Lifecycle manager */
55
+ protected lifecycle: OverlayLifecycle;
56
+ /** Overlay configuration */
57
+ protected config: OverlayConfig;
58
+ /** Theme styles - lazily initialized */
59
+ private _styles;
60
+ /** Promise resolver for show() */
61
+ private resolvePromise;
62
+ /**
63
+ * Create a new overlay instance.
64
+ *
65
+ * @param initialState - Initial state (must include lineCount: 0, maxLineCount: 0)
66
+ * @param config - Optional configuration
67
+ */
68
+ constructor(initialState: TState, config?: OverlayConfig);
69
+ /**
70
+ * Get theme styles (cached).
71
+ */
72
+ protected get styles(): ReturnType<typeof getStyles>;
73
+ /**
74
+ * Show the overlay and wait for it to close.
75
+ * This is the main entry point.
76
+ *
77
+ * @returns Promise that resolves when the overlay closes
78
+ */
79
+ show(): Promise<TResult>;
80
+ /**
81
+ * Close the overlay with a result.
82
+ *
83
+ * @param result - Value to return from show() (optional for void result type)
84
+ */
85
+ protected close(result?: TResult): void;
86
+ /**
87
+ * Re-render the overlay after state changes.
88
+ * Call this after modifying state.
89
+ */
90
+ protected update(): void;
91
+ /**
92
+ * Reset render state after a screen change.
93
+ * Call this after pushing/popping screens that may have cleared the screen.
94
+ * This ensures the next render starts fresh without trying to restore old cursor positions.
95
+ */
96
+ protected resetRenderState(): void;
97
+ /**
98
+ * Render the full frame (clear + render + pad).
99
+ * Returns the number of PHYSICAL lines rendered.
100
+ *
101
+ * IMPORTANT: Tracks physical lines (accounting for wrapped content)
102
+ * not logical lines (array entries). This ensures proper clearing
103
+ * when navigating between screens of different heights.
104
+ */
105
+ protected renderFrame(): number;
106
+ /**
107
+ * Render a standard header with border and title.
108
+ *
109
+ * @param title - Main title
110
+ * @param subtitle - Optional subtitle (shown in muted)
111
+ * @returns Array of lines
112
+ */
113
+ protected renderHeader(title: string, subtitle?: string): string[];
114
+ /**
115
+ * Render a standard footer with hints and border.
116
+ *
117
+ * @param hints - Keyboard hints string (e.g., "↑↓ Navigate · Enter Select")
118
+ * @returns Array of lines
119
+ */
120
+ protected renderFooter(hints: string): string[];
121
+ /**
122
+ * Render a border line spanning terminal width.
123
+ */
124
+ protected renderBorder(): string;
125
+ /**
126
+ * Render the overlay content.
127
+ * Called automatically by renderFrame().
128
+ *
129
+ * @returns Array of lines to render
130
+ */
131
+ abstract render(): string[];
132
+ /**
133
+ * Handle a key press.
134
+ * Called automatically when the user presses a key.
135
+ *
136
+ * Common pattern:
137
+ * ```typescript
138
+ * handleKey(data: Buffer): void {
139
+ * // Global close keys
140
+ * if (isClose(data)) {
141
+ * this.close(null);
142
+ * return;
143
+ * }
144
+ *
145
+ * // Feature-specific key handling
146
+ * // ...
147
+ *
148
+ * // Re-render if state changed
149
+ * this.update();
150
+ * }
151
+ * ```
152
+ *
153
+ * @param data - Raw key buffer
154
+ */
155
+ abstract handleKey(data: Buffer): void;
156
+ }
@@ -0,0 +1,238 @@
1
+ /**
2
+ * Base Overlay Class
3
+ *
4
+ * Abstract base class for all overlays. Provides:
5
+ * - Lifecycle management (setup, cleanup)
6
+ * - Rendering infrastructure (frame, header, footer)
7
+ * - State management
8
+ * - Common key handling patterns
9
+ *
10
+ * Usage:
11
+ * ```typescript
12
+ * interface MyState extends OverlayState {
13
+ * selectedIndex: number;
14
+ * }
15
+ *
16
+ * class MyOverlay extends BaseOverlay<MyState, string | null> {
17
+ * constructor() {
18
+ * super({ lineCount: 0, maxLineCount: 0, selectedIndex: 0 });
19
+ * }
20
+ *
21
+ * render(): string[] {
22
+ * return [
23
+ * ...this.renderHeader('My Overlay'),
24
+ * ' Content here...',
25
+ * ...this.renderFooter('↑↓ Navigate · Enter Select · q/Esc Cancel')
26
+ * ];
27
+ * }
28
+ *
29
+ * handleKey(data: Buffer): void {
30
+ * if (isClose(data)) { this.close(null); return; }
31
+ * // ... handle keys
32
+ * }
33
+ * }
34
+ *
35
+ * // Export function for backward compatibility
36
+ * export async function showMyOverlay(): Promise<string | null> {
37
+ * return new MyOverlay().show();
38
+ * }
39
+ * ```
40
+ */
41
+ import * as terminal from '../terminal.js';
42
+ import { getStyles } from '../../themes/index.js';
43
+ import { OverlayLifecycle } from './overlay-lifecycle.js';
44
+ import { debugLog } from '../../utils/debug-log.js';
45
+ // =============================================================================
46
+ // BaseOverlay Abstract Class
47
+ // =============================================================================
48
+ /**
49
+ * Abstract base class for overlays.
50
+ *
51
+ * @template TState - State interface (must extend OverlayState)
52
+ * @template TResult - Return type when overlay closes
53
+ */
54
+ export class BaseOverlay {
55
+ /** Current overlay state */
56
+ state;
57
+ /** Lifecycle manager */
58
+ lifecycle;
59
+ /** Overlay configuration */
60
+ config;
61
+ /** Theme styles - lazily initialized */
62
+ _styles = null;
63
+ /** Promise resolver for show() */
64
+ resolvePromise = null;
65
+ /**
66
+ * Create a new overlay instance.
67
+ *
68
+ * @param initialState - Initial state (must include lineCount: 0, maxLineCount: 0)
69
+ * @param config - Optional configuration
70
+ */
71
+ constructor(initialState, config = {}) {
72
+ this.state = initialState;
73
+ this.config = config;
74
+ this.lifecycle = new OverlayLifecycle(config, (data) => {
75
+ this.handleKey(data);
76
+ });
77
+ }
78
+ // ===========================================================================
79
+ // Protected Getters
80
+ // ===========================================================================
81
+ /**
82
+ * Get theme styles (cached).
83
+ */
84
+ get styles() {
85
+ if (!this._styles) {
86
+ this._styles = getStyles();
87
+ }
88
+ return this._styles;
89
+ }
90
+ // ===========================================================================
91
+ // Public Entry Point
92
+ // ===========================================================================
93
+ /**
94
+ * Show the overlay and wait for it to close.
95
+ * This is the main entry point.
96
+ *
97
+ * @returns Promise that resolves when the overlay closes
98
+ */
99
+ async show() {
100
+ debugLog('BaseOverlay:show', 'start');
101
+ // Setup lifecycle FIRST (pause footer, raw mode, hide cursor)
102
+ // This is done HERE (not in REPL) so constructor I/O doesn't cause blank screen
103
+ debugLog('BaseOverlay:show', 'calling lifecycle.setup');
104
+ this.lifecycle.setup();
105
+ debugLog('BaseOverlay:show', 'lifecycle.setup done');
106
+ // Save cursor position for render updates
107
+ terminal.saveCursor();
108
+ debugLog('BaseOverlay:show', 'cursor saved');
109
+ // Initial render
110
+ debugLog('BaseOverlay:show', 'calling renderFrame');
111
+ this.state.lineCount = this.renderFrame();
112
+ this.state.maxLineCount = this.state.lineCount;
113
+ debugLog('BaseOverlay:show', `renderFrame done, ${String(this.state.lineCount)} lines`);
114
+ // Return promise that resolves when closed
115
+ return new Promise((resolve) => {
116
+ this.resolvePromise = resolve;
117
+ });
118
+ }
119
+ // ===========================================================================
120
+ // Protected Methods - Lifecycle
121
+ // ===========================================================================
122
+ /**
123
+ * Close the overlay with a result.
124
+ *
125
+ * @param result - Value to return from show() (optional for void result type)
126
+ */
127
+ close(result) {
128
+ this.lifecycle.cleanup(this.state.maxLineCount);
129
+ if (this.resolvePromise) {
130
+ this.resolvePromise(result);
131
+ this.resolvePromise = null;
132
+ }
133
+ }
134
+ /**
135
+ * Re-render the overlay after state changes.
136
+ * Call this after modifying state.
137
+ */
138
+ update() {
139
+ this.state.lineCount = this.renderFrame();
140
+ this.state.maxLineCount = Math.max(this.state.maxLineCount, this.state.lineCount);
141
+ }
142
+ /**
143
+ * Reset render state after a screen change.
144
+ * Call this after pushing/popping screens that may have cleared the screen.
145
+ * This ensures the next render starts fresh without trying to restore old cursor positions.
146
+ */
147
+ resetRenderState() {
148
+ // Reset line tracking so renderFrame() doesn't try to restore cursor
149
+ this.state.lineCount = 0;
150
+ this.state.maxLineCount = 0;
151
+ // Explicitly move cursor to home and save position
152
+ // This ensures we're at (0,0) regardless of what clearScreen() did
153
+ process.stdout.write('\x1b[H');
154
+ terminal.saveCursor();
155
+ }
156
+ // ===========================================================================
157
+ // Protected Methods - Rendering
158
+ // ===========================================================================
159
+ /**
160
+ * Render the full frame (clear + render + pad).
161
+ * Returns the number of PHYSICAL lines rendered.
162
+ *
163
+ * IMPORTANT: Tracks physical lines (accounting for wrapped content)
164
+ * not logical lines (array entries). This ensures proper clearing
165
+ * when navigating between screens of different heights.
166
+ */
167
+ renderFrame() {
168
+ // Get content from subclass
169
+ const lines = this.render();
170
+ const termWidth = terminal.getTerminalWidth();
171
+ // Calculate physical lines of content (accounts for wrapped lines)
172
+ let physicalLines = terminal.totalPhysicalLines(lines, termWidth);
173
+ // Position cursor for render
174
+ if (this.state.lineCount > 0) {
175
+ // Normal re-render: restore cursor to saved position, clear to end
176
+ terminal.restoreCursor();
177
+ terminal.clearToEndOfScreen();
178
+ }
179
+ // Note: when lineCount is 0, cursor should already be at correct position
180
+ // (either from initial show() or from resetRenderState() after clearScreen)
181
+ // Pad to minimum height for consistent sizing
182
+ const minHeight = this.config.minHeight ?? 0;
183
+ while (physicalLines < minHeight) {
184
+ lines.push('');
185
+ physicalLines++;
186
+ }
187
+ // Also pad to previous max to prevent shrinking
188
+ while (physicalLines < this.state.maxLineCount) {
189
+ lines.push('');
190
+ physicalLines++;
191
+ }
192
+ // Render
193
+ terminal.write(lines.join('\n'));
194
+ return physicalLines;
195
+ }
196
+ /**
197
+ * Render a standard header with border and title.
198
+ *
199
+ * @param title - Main title
200
+ * @param subtitle - Optional subtitle (shown in muted)
201
+ * @returns Array of lines
202
+ */
203
+ renderHeader(title, subtitle) {
204
+ const cols = terminal.getTerminalWidth();
205
+ const border = this.styles.muted('─'.repeat(Math.max(1, cols - 1)));
206
+ const lines = [border];
207
+ if (subtitle) {
208
+ lines.push(' ' + this.styles.primaryBold(title) + this.styles.muted(` ${subtitle}`));
209
+ }
210
+ else {
211
+ lines.push(' ' + this.styles.primaryBold(title));
212
+ }
213
+ lines.push('');
214
+ return lines;
215
+ }
216
+ /**
217
+ * Render a standard footer with hints and border.
218
+ *
219
+ * @param hints - Keyboard hints string (e.g., "↑↓ Navigate · Enter Select")
220
+ * @returns Array of lines
221
+ */
222
+ renderFooter(hints) {
223
+ const cols = terminal.getTerminalWidth();
224
+ const border = this.styles.muted('─'.repeat(Math.max(1, cols - 1)));
225
+ return [
226
+ '',
227
+ this.styles.muted(' ' + hints),
228
+ border,
229
+ ];
230
+ }
231
+ /**
232
+ * Render a border line spanning terminal width.
233
+ */
234
+ renderBorder() {
235
+ const cols = terminal.getTerminalWidth();
236
+ return this.styles.muted('─'.repeat(Math.max(1, cols - 1)));
237
+ }
238
+ }