@compilr-dev/cli 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/LICENSE +108 -0
  2. package/README.md +237 -69
  3. package/dist/.tsbuildinfo.app +1 -0
  4. package/dist/.tsbuildinfo.data +1 -0
  5. package/dist/.tsbuildinfo.domain +1 -0
  6. package/dist/.tsbuildinfo.foundation +1 -0
  7. package/dist/agent.d.ts +61 -4
  8. package/dist/agent.js +241 -245
  9. package/dist/anchors/index.d.ts +1 -1
  10. package/dist/anchors/index.js +1 -1
  11. package/dist/anchors/project-anchors.d.ts +2 -2
  12. package/dist/anchors/project-anchors.js +1 -1
  13. package/dist/auth/api-client.d.ts +124 -0
  14. package/dist/auth/api-client.js +261 -0
  15. package/dist/auth/index.d.ts +172 -0
  16. package/dist/auth/index.js +545 -0
  17. package/dist/auth/storage.d.ts +52 -0
  18. package/dist/auth/storage.js +118 -0
  19. package/dist/changelog/index.d.ts +16 -0
  20. package/dist/changelog/index.js +24 -0
  21. package/dist/changelog/releases.d.ts +17 -0
  22. package/dist/changelog/releases.js +63 -0
  23. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  24. package/dist/commands-v2/handlers/auth.js +118 -0
  25. package/dist/commands-v2/handlers/background.d.ts +14 -0
  26. package/dist/commands-v2/handlers/background.js +276 -0
  27. package/dist/commands-v2/handlers/context.js +286 -81
  28. package/dist/commands-v2/handlers/core.d.ts +1 -0
  29. package/dist/commands-v2/handlers/core.js +133 -8
  30. package/dist/commands-v2/handlers/debug.js +18 -0
  31. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  32. package/dist/commands-v2/handlers/delegations.js +29 -0
  33. package/dist/commands-v2/handlers/files.d.ts +8 -0
  34. package/dist/commands-v2/handlers/files.js +162 -0
  35. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  36. package/dist/commands-v2/handlers/filter.js +130 -0
  37. package/dist/commands-v2/handlers/games.d.ts +7 -0
  38. package/dist/commands-v2/handlers/games.js +57 -0
  39. package/dist/commands-v2/handlers/index.d.ts +13 -0
  40. package/dist/commands-v2/handlers/index.js +39 -0
  41. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  42. package/dist/commands-v2/handlers/mcp.js +39 -0
  43. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  44. package/dist/commands-v2/handlers/notifications.js +34 -0
  45. package/dist/commands-v2/handlers/project.js +295 -31
  46. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  47. package/dist/commands-v2/handlers/reset.js +118 -0
  48. package/dist/commands-v2/handlers/session.d.ts +161 -0
  49. package/dist/commands-v2/handlers/session.js +805 -0
  50. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  51. package/dist/commands-v2/handlers/settings.js +217 -35
  52. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  53. package/dist/commands-v2/handlers/tasks.js +36 -0
  54. package/dist/commands-v2/handlers/team.d.ts +9 -0
  55. package/dist/commands-v2/handlers/team.js +549 -0
  56. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  57. package/dist/commands-v2/handlers/terminals.js +34 -0
  58. package/dist/commands-v2/index.d.ts +3 -2
  59. package/dist/commands-v2/index.js +4 -1
  60. package/dist/commands-v2/registry.d.ts +15 -0
  61. package/dist/commands-v2/registry.js +34 -0
  62. package/dist/commands-v2/types.d.ts +81 -3
  63. package/dist/commands.js +13 -0
  64. package/dist/compilr-diff-companion.vsix +0 -0
  65. package/dist/db/index.js +98 -4
  66. package/dist/db/repositories/document-repository.d.ts +2 -0
  67. package/dist/db/repositories/document-repository.js +6 -1
  68. package/dist/db/repositories/index.d.ts +2 -0
  69. package/dist/db/repositories/index.js +1 -0
  70. package/dist/db/repositories/plan-repository.d.ts +101 -0
  71. package/dist/db/repositories/plan-repository.js +275 -0
  72. package/dist/db/repositories/project-repository.d.ts +6 -0
  73. package/dist/db/repositories/project-repository.js +41 -0
  74. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  75. package/dist/db/repositories/work-item-repository.js +69 -4
  76. package/dist/db/schema.d.ts +40 -3
  77. package/dist/db/schema.js +66 -3
  78. package/dist/episodes/index.d.ts +20 -0
  79. package/dist/episodes/index.js +27 -0
  80. package/dist/episodes/recorder.d.ts +51 -0
  81. package/dist/episodes/recorder.js +195 -0
  82. package/dist/episodes/significant-work.d.ts +21 -0
  83. package/dist/episodes/significant-work.js +56 -0
  84. package/dist/episodes/store.d.ts +38 -0
  85. package/dist/episodes/store.js +199 -0
  86. package/dist/episodes/types.d.ts +35 -0
  87. package/dist/episodes/types.js +6 -0
  88. package/dist/episodes/work-at-risk.d.ts +12 -0
  89. package/dist/episodes/work-at-risk.js +38 -0
  90. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  91. package/dist/episodes/work-summary-anchor.js +73 -0
  92. package/dist/games/coins.d.ts +66 -0
  93. package/dist/games/coins.js +165 -0
  94. package/dist/games/game-base.d.ts +84 -0
  95. package/dist/games/game-base.js +204 -0
  96. package/dist/games/index.d.ts +16 -0
  97. package/dist/games/index.js +49 -0
  98. package/dist/games/scores.d.ts +69 -0
  99. package/dist/games/scores.js +191 -0
  100. package/dist/games/tetris/board.d.ts +59 -0
  101. package/dist/games/tetris/board.js +170 -0
  102. package/dist/games/tetris/index.d.ts +109 -0
  103. package/dist/games/tetris/index.js +610 -0
  104. package/dist/games/tetris/pieces.d.ts +44 -0
  105. package/dist/games/tetris/pieces.js +271 -0
  106. package/dist/games/tetris/renderer.d.ts +26 -0
  107. package/dist/games/tetris/renderer.js +77 -0
  108. package/dist/guide/guide-content.d.ts +23 -0
  109. package/dist/guide/guide-content.js +196 -0
  110. package/dist/guide/index.d.ts +8 -0
  111. package/dist/guide/index.js +7 -0
  112. package/dist/guide/shared-content.d.ts +37 -0
  113. package/dist/guide/shared-content.js +1272 -0
  114. package/dist/guide/tutorial-helpers.d.ts +57 -0
  115. package/dist/guide/tutorial-helpers.js +147 -0
  116. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  117. package/dist/handlers/ask-user-handlers.js +104 -0
  118. package/dist/handlers/delegation-handlers.d.ts +34 -0
  119. package/dist/handlers/delegation-handlers.js +291 -0
  120. package/dist/handlers/permission-handler.d.ts +30 -0
  121. package/dist/handlers/permission-handler.js +205 -0
  122. package/dist/index.d.ts +11 -1
  123. package/dist/index.js +448 -271
  124. package/dist/input-handlers/memory-handler.d.ts +1 -1
  125. package/dist/input-handlers/memory-handler.js +2 -1
  126. package/dist/models/index.d.ts +10 -0
  127. package/dist/models/index.js +12 -0
  128. package/dist/models/model-registry.d.ts +38 -0
  129. package/dist/models/model-registry.js +69 -0
  130. package/dist/models/model-tiers.d.ts +28 -0
  131. package/dist/models/model-tiers.js +71 -0
  132. package/dist/models/model-validation.d.ts +25 -0
  133. package/dist/models/model-validation.js +291 -0
  134. package/dist/models/ollama-models.d.ts +73 -0
  135. package/dist/models/ollama-models.js +178 -0
  136. package/dist/models/provider-types.d.ts +6 -0
  137. package/dist/models/provider-types.js +1 -0
  138. package/dist/models/providers.d.ts +35 -0
  139. package/dist/models/providers.js +58 -0
  140. package/dist/models/types.d.ts +4 -0
  141. package/dist/models/types.js +4 -0
  142. package/dist/multi-agent/activity.d.ts +21 -0
  143. package/dist/multi-agent/activity.js +34 -0
  144. package/dist/multi-agent/agent-selection.d.ts +55 -0
  145. package/dist/multi-agent/agent-selection.js +90 -0
  146. package/dist/multi-agent/artifacts.d.ts +197 -0
  147. package/dist/multi-agent/artifacts.js +379 -0
  148. package/dist/multi-agent/checkpointer.d.ts +138 -0
  149. package/dist/multi-agent/checkpointer.js +471 -0
  150. package/dist/multi-agent/collision-utils.d.ts +16 -0
  151. package/dist/multi-agent/collision-utils.js +28 -0
  152. package/dist/multi-agent/context-resolver.d.ts +97 -0
  153. package/dist/multi-agent/context-resolver.js +316 -0
  154. package/dist/multi-agent/custom-agents.d.ts +83 -0
  155. package/dist/multi-agent/custom-agents.js +227 -0
  156. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  157. package/dist/multi-agent/delegation-tracker.js +243 -0
  158. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  159. package/dist/multi-agent/file-lock-hook.js +97 -0
  160. package/dist/multi-agent/file-locks.d.ts +58 -0
  161. package/dist/multi-agent/file-locks.js +194 -0
  162. package/dist/multi-agent/index.d.ts +24 -0
  163. package/dist/multi-agent/index.js +30 -0
  164. package/dist/multi-agent/mention-parser.d.ts +64 -0
  165. package/dist/multi-agent/mention-parser.js +146 -0
  166. package/dist/multi-agent/notification-manager.d.ts +84 -0
  167. package/dist/multi-agent/notification-manager.js +224 -0
  168. package/dist/multi-agent/pending-requests.d.ts +122 -0
  169. package/dist/multi-agent/pending-requests.js +155 -0
  170. package/dist/multi-agent/session-registry.d.ts +139 -0
  171. package/dist/multi-agent/session-registry.js +514 -0
  172. package/dist/multi-agent/shared-context.d.ts +293 -0
  173. package/dist/multi-agent/shared-context.js +671 -0
  174. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  175. package/dist/multi-agent/skill-requirements.js +178 -0
  176. package/dist/multi-agent/task-assignment.d.ts +69 -0
  177. package/dist/multi-agent/task-assignment.js +123 -0
  178. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  179. package/dist/multi-agent/task-suggestion.js +72 -0
  180. package/dist/multi-agent/team-agent.d.ts +201 -0
  181. package/dist/multi-agent/team-agent.js +488 -0
  182. package/dist/multi-agent/team.d.ts +286 -0
  183. package/dist/multi-agent/team.js +610 -0
  184. package/dist/multi-agent/tool-config.d.ts +110 -0
  185. package/dist/multi-agent/tool-config.js +661 -0
  186. package/dist/multi-agent/types.d.ts +211 -0
  187. package/dist/multi-agent/types.js +617 -0
  188. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  189. package/dist/prompts/plan-mode-prompt.js +95 -0
  190. package/dist/repl-helpers.js +5 -2
  191. package/dist/repl-v2.d.ts +401 -2
  192. package/dist/repl-v2.js +2588 -65
  193. package/dist/session/index.d.ts +6 -0
  194. package/dist/session/index.js +6 -0
  195. package/dist/session/project-session-manager.d.ts +158 -0
  196. package/dist/session/project-session-manager.js +650 -0
  197. package/dist/settings/index.d.ts +133 -13
  198. package/dist/settings/index.js +329 -24
  199. package/dist/settings/mcp-config.d.ts +76 -0
  200. package/dist/settings/mcp-config.js +143 -0
  201. package/dist/settings/paths.d.ts +4 -0
  202. package/dist/settings/paths.js +6 -0
  203. package/dist/shared-handlers.d.ts +62 -0
  204. package/dist/shared-handlers.js +48 -0
  205. package/dist/system-prompt/builder.d.ts +5 -0
  206. package/dist/system-prompt/builder.js +4 -0
  207. package/dist/system-prompt/index.d.ts +18 -0
  208. package/dist/system-prompt/index.js +18 -0
  209. package/dist/system-prompt/modules.d.ts +5 -0
  210. package/dist/system-prompt/modules.js +4 -0
  211. package/dist/tabbed-menu.js +2 -1
  212. package/dist/templates/compilr-md-import.d.ts +16 -0
  213. package/dist/templates/compilr-md-import.js +241 -0
  214. package/dist/templates/compilr-md.js +10 -61
  215. package/dist/templates/config-json.d.ts +1 -25
  216. package/dist/templates/index.d.ts +2 -0
  217. package/dist/templates/index.js +34 -73
  218. package/dist/tool-names.d.ts +113 -0
  219. package/dist/tool-names.js +239 -0
  220. package/dist/tools/ask-user-simple.d.ts +1 -1
  221. package/dist/tools/ask-user-simple.js +2 -1
  222. package/dist/tools/ask-user.d.ts +1 -1
  223. package/dist/tools/ask-user.js +2 -1
  224. package/dist/tools/backlog.d.ts +2 -2
  225. package/dist/tools/backlog.js +1 -1
  226. package/dist/tools/db-tools.d.ts +13 -61
  227. package/dist/tools/db-tools.js +12 -13
  228. package/dist/tools/delegate-background.d.ts +27 -0
  229. package/dist/tools/delegate-background.js +115 -0
  230. package/dist/tools/delegate.d.ts +22 -0
  231. package/dist/tools/delegate.js +97 -0
  232. package/dist/tools/delegation-status.d.ts +16 -0
  233. package/dist/tools/delegation-status.js +128 -0
  234. package/dist/tools/guide-tool.d.ts +12 -0
  235. package/dist/tools/guide-tool.js +59 -0
  236. package/dist/tools/handoff.d.ts +25 -0
  237. package/dist/tools/handoff.js +99 -0
  238. package/dist/tools/meta-tools.d.ts +26 -0
  239. package/dist/tools/meta-tools.js +47 -0
  240. package/dist/tools/platform-adapter.d.ts +35 -0
  241. package/dist/tools/platform-adapter.js +404 -0
  242. package/dist/tools/project-db.d.ts +5 -73
  243. package/dist/tools/project-db.js +5 -336
  244. package/dist/tools.d.ts +67 -2
  245. package/dist/tools.js +240 -48
  246. package/dist/ui/autocomplete-controller.d.ts +42 -0
  247. package/dist/ui/autocomplete-controller.js +384 -0
  248. package/dist/ui/base/index.d.ts +1 -1
  249. package/dist/ui/base/index.js +1 -1
  250. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  251. package/dist/ui/base/overlay-base-v2.js +14 -0
  252. package/dist/ui/base/render-utils.d.ts +19 -0
  253. package/dist/ui/base/render-utils.js +25 -0
  254. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  255. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  256. package/dist/ui/constants/labels.d.ts +14 -0
  257. package/dist/ui/constants/labels.js +52 -0
  258. package/dist/ui/conversation-store.d.ts +55 -0
  259. package/dist/ui/conversation-store.js +107 -0
  260. package/dist/ui/conversation.js +11 -13
  261. package/dist/ui/diff.d.ts +7 -1
  262. package/dist/ui/diff.js +85 -48
  263. package/dist/ui/ephemeral.js +3 -9
  264. package/dist/ui/file-autocomplete.d.ts +24 -0
  265. package/dist/ui/file-autocomplete.js +56 -0
  266. package/dist/ui/footer-renderer.d.ts +69 -0
  267. package/dist/ui/footer-renderer.js +431 -0
  268. package/dist/ui/footer.d.ts +74 -7
  269. package/dist/ui/footer.js +173 -16
  270. package/dist/ui/input-controller.d.ts +51 -0
  271. package/dist/ui/input-controller.js +176 -0
  272. package/dist/ui/input-prompt.d.ts +19 -0
  273. package/dist/ui/input-prompt.js +206 -14
  274. package/dist/ui/keyboard-handler.d.ts +57 -0
  275. package/dist/ui/keyboard-handler.js +557 -0
  276. package/dist/ui/live-region-facade.d.ts +42 -0
  277. package/dist/ui/live-region-facade.js +205 -0
  278. package/dist/ui/live-region.d.ts +0 -4
  279. package/dist/ui/live-region.js +6 -14
  280. package/dist/ui/mascot/renderer.d.ts +1 -1
  281. package/dist/ui/mascot/renderer.js +37 -2
  282. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  283. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  284. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  285. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  286. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  287. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  288. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  289. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  290. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  291. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  292. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  293. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  294. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  295. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  296. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  297. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  298. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  299. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  300. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  301. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  302. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  303. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  304. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  305. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  306. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  307. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  308. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  309. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  310. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  311. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  312. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  313. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  314. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  315. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  316. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  317. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  318. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  319. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  320. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  321. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  322. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  323. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  324. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  325. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  326. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  327. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  328. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  329. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  330. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  331. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  332. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  333. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  334. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  335. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  336. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  337. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  338. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  339. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  340. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  341. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  342. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  343. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  344. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  345. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  346. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  347. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  348. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  349. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  350. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  351. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  352. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  353. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  354. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  355. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  356. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  357. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  358. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  359. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  360. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  361. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  362. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  363. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  364. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  365. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  366. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  367. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  368. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  369. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  370. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  371. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  372. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  373. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  374. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  375. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  376. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  377. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  378. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  379. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  380. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  381. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  382. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  383. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  384. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  385. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  386. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  387. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  388. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  389. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  390. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  391. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  392. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  393. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  394. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  395. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  396. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  397. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  398. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  399. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  400. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  401. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  402. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  403. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  404. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  405. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  406. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  407. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  408. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  409. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  410. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  411. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
  412. package/dist/ui/overlay/impl/workflow-overlay-v2.js +10 -4
  413. package/dist/ui/overlay/index.d.ts +20 -1
  414. package/dist/ui/overlay/index.js +19 -0
  415. package/dist/ui/overlay/types.d.ts +5 -0
  416. package/dist/ui/overlay-manager.d.ts +43 -0
  417. package/dist/ui/overlay-manager.js +238 -0
  418. package/dist/ui/overlays.js +4 -16
  419. package/dist/ui/permission-overlay.js +6 -5
  420. package/dist/ui/status-bar-controller.d.ts +33 -0
  421. package/dist/ui/status-bar-controller.js +99 -0
  422. package/dist/ui/subagent-renderer.js +3 -19
  423. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  424. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  425. package/dist/ui/terminal-line-builders.d.ts +17 -0
  426. package/dist/ui/terminal-line-builders.js +42 -0
  427. package/dist/ui/terminal-render-item.d.ts +16 -0
  428. package/dist/ui/terminal-render-item.js +267 -0
  429. package/dist/ui/terminal-renderer.d.ts +7 -8
  430. package/dist/ui/terminal-renderer.js +7 -8
  431. package/dist/ui/terminal-types.d.ts +179 -0
  432. package/dist/ui/terminal-types.js +34 -0
  433. package/dist/ui/terminal-ui.d.ts +144 -276
  434. package/dist/ui/terminal-ui.js +384 -1861
  435. package/dist/ui/todo-zone.d.ts +19 -1
  436. package/dist/ui/todo-zone.js +71 -13
  437. package/dist/ui/tool-formatters.js +696 -1
  438. package/dist/ui/turn-metrics.d.ts +56 -0
  439. package/dist/ui/turn-metrics.js +75 -0
  440. package/dist/ui/types.d.ts +28 -0
  441. package/dist/ui/types.js +1 -0
  442. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  443. package/dist/ui/vscode-diff-ipc.js +385 -0
  444. package/dist/utils/credentials.d.ts +24 -5
  445. package/dist/utils/credentials.js +123 -9
  446. package/dist/utils/format-tokens.d.ts +13 -0
  447. package/dist/utils/format-tokens.js +18 -0
  448. package/dist/utils/git-config.d.ts +26 -0
  449. package/dist/utils/git-config.js +54 -0
  450. package/dist/utils/message-utils.d.ts +61 -0
  451. package/dist/utils/message-utils.js +72 -0
  452. package/dist/utils/model-tiers.d.ts +8 -1
  453. package/dist/utils/model-tiers.js +38 -16
  454. package/dist/utils/open-browser.d.ts +5 -0
  455. package/dist/utils/open-browser.js +32 -0
  456. package/dist/utils/path-safety.js +3 -2
  457. package/dist/utils/project-detection.d.ts +58 -0
  458. package/dist/utils/project-detection.js +424 -0
  459. package/dist/utils/project-memory.js +2 -1
  460. package/dist/utils/project-status.d.ts +2 -2
  461. package/dist/utils/startup-perf.d.ts +18 -0
  462. package/dist/utils/startup-perf.js +60 -0
  463. package/dist/utils/token-tracker.d.ts +62 -0
  464. package/dist/utils/token-tracker.js +150 -0
  465. package/dist/utils/token-types.d.ts +23 -0
  466. package/dist/utils/token-types.js +18 -0
  467. package/dist/utils/types/config-types.d.ts +32 -0
  468. package/dist/utils/types/config-types.js +8 -0
  469. package/dist/utils/update-checker.d.ts +28 -0
  470. package/dist/utils/update-checker.js +106 -0
  471. package/dist/utils/version.d.ts +7 -0
  472. package/dist/utils/version.js +10 -0
  473. package/dist/utils/vscode-detect.d.ts +39 -0
  474. package/dist/utils/vscode-detect.js +137 -0
  475. package/package.json +27 -13
  476. package/dist/commands/handler-types.d.ts +0 -68
  477. package/dist/commands/handler-types.js +0 -8
  478. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  479. package/dist/commands/handlers/agent-commands.js +0 -305
  480. package/dist/commands/handlers/design-commands.d.ts +0 -15
  481. package/dist/commands/handlers/design-commands.js +0 -334
  482. package/dist/commands/handlers/index.d.ts +0 -20
  483. package/dist/commands/handlers/index.js +0 -43
  484. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  485. package/dist/commands/handlers/overlay-commands.js +0 -287
  486. package/dist/commands/handlers/project-commands.d.ts +0 -11
  487. package/dist/commands/handlers/project-commands.js +0 -167
  488. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  489. package/dist/commands/handlers/simple-commands.js +0 -144
  490. package/dist/commands/registry.d.ts +0 -50
  491. package/dist/commands/registry.js +0 -75
  492. package/dist/index.old.d.ts +0 -7
  493. package/dist/index.old.js +0 -1014
  494. package/dist/repl.d.ts +0 -149
  495. package/dist/repl.js +0 -1151
  496. package/dist/templates/claude-md.d.ts +0 -7
  497. package/dist/templates/claude-md.js +0 -189
  498. package/dist/test-autocomplete.d.ts +0 -7
  499. package/dist/test-autocomplete.js +0 -85
  500. package/dist/test-tabbed-menu.d.ts +0 -7
  501. package/dist/test-tabbed-menu.js +0 -25
  502. package/dist/tool-selector.d.ts +0 -71
  503. package/dist/tool-selector.js +0 -184
  504. package/dist/tools/anchor-tools.d.ts +0 -31
  505. package/dist/tools/anchor-tools.js +0 -255
  506. package/dist/tools/backlog-wrappers.d.ts +0 -54
  507. package/dist/tools/backlog-wrappers.js +0 -338
  508. package/dist/tools/document-db.d.ts +0 -43
  509. package/dist/tools/document-db.js +0 -220
  510. package/dist/tools/workitem-db.d.ts +0 -103
  511. package/dist/tools/workitem-db.js +0 -549
  512. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  513. package/dist/ui/agents-overlay-v2.js +0 -809
  514. package/dist/ui/agents-overlay.d.ts +0 -12
  515. package/dist/ui/agents-overlay.js +0 -863
  516. package/dist/ui/anchors-overlay.d.ts +0 -12
  517. package/dist/ui/anchors-overlay.js +0 -775
  518. package/dist/ui/arch-type-overlay.d.ts +0 -15
  519. package/dist/ui/arch-type-overlay.js +0 -201
  520. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  521. package/dist/ui/ask-user-overlay-v2.js +0 -555
  522. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  523. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  524. package/dist/ui/backlog-overlay.d.ts +0 -32
  525. package/dist/ui/backlog-overlay.js +0 -652
  526. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  527. package/dist/ui/commands-overlay-v2.js +0 -441
  528. package/dist/ui/commands-overlay.d.ts +0 -16
  529. package/dist/ui/commands-overlay.js +0 -439
  530. package/dist/ui/config-overlay.d.ts +0 -35
  531. package/dist/ui/config-overlay.js +0 -707
  532. package/dist/ui/docs-overlay.d.ts +0 -17
  533. package/dist/ui/docs-overlay.js +0 -303
  534. package/dist/ui/footer-v2.d.ts +0 -222
  535. package/dist/ui/footer-v2.js +0 -1349
  536. package/dist/ui/help-overlay-v2.d.ts +0 -34
  537. package/dist/ui/help-overlay-v2.js +0 -309
  538. package/dist/ui/help-overlay.d.ts +0 -16
  539. package/dist/ui/help-overlay.js +0 -316
  540. package/dist/ui/init-overlay-v2.d.ts +0 -34
  541. package/dist/ui/init-overlay-v2.js +0 -600
  542. package/dist/ui/init-overlay.d.ts +0 -34
  543. package/dist/ui/init-overlay.js +0 -604
  544. package/dist/ui/input-prompt-v2.d.ts +0 -180
  545. package/dist/ui/input-prompt-v2.js +0 -999
  546. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  547. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  548. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  549. package/dist/ui/keys-overlay-v2.js +0 -248
  550. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  551. package/dist/ui/mascot-overlay-v2.js +0 -138
  552. package/dist/ui/mascot-overlay.d.ts +0 -21
  553. package/dist/ui/mascot-overlay.js +0 -146
  554. package/dist/ui/model-overlay-v2.d.ts +0 -49
  555. package/dist/ui/model-overlay-v2.js +0 -118
  556. package/dist/ui/model-overlay.d.ts +0 -27
  557. package/dist/ui/model-overlay.js +0 -221
  558. package/dist/ui/model-warning-overlay.d.ts +0 -30
  559. package/dist/ui/model-warning-overlay.js +0 -169
  560. package/dist/ui/new-overlay.d.ts +0 -34
  561. package/dist/ui/new-overlay.js +0 -604
  562. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  563. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  564. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  565. package/dist/ui/overlay/overlay-types.js +0 -22
  566. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  567. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  568. package/dist/ui/overlays/index.d.ts +0 -11
  569. package/dist/ui/overlays/index.js +0 -11
  570. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  571. package/dist/ui/permission-overlay-v2.js +0 -380
  572. package/dist/ui/projects-overlay.d.ts +0 -19
  573. package/dist/ui/projects-overlay.js +0 -484
  574. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  575. package/dist/ui/theme-overlay-v2.js +0 -135
  576. package/dist/ui/theme-overlay.d.ts +0 -24
  577. package/dist/ui/theme-overlay.js +0 -127
  578. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  579. package/dist/ui/tools-overlay-v2.js +0 -218
  580. package/dist/ui/tools-overlay.d.ts +0 -34
  581. package/dist/ui/tools-overlay.js +0 -230
  582. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  583. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  584. package/dist/ui/tutorial-overlay.d.ts +0 -11
  585. package/dist/ui/tutorial-overlay.js +0 -1034
  586. package/dist/ui/workflow-overlay.d.ts +0 -22
  587. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,414 @@
1
+ /**
2
+ * Resume Overlay V2
3
+ *
4
+ * Modal overlay for viewing and resuming saved sessions.
5
+ * Uses TabbedListOverlayV2 for consistent list/tab/search behavior.
6
+ *
7
+ * Features:
8
+ * - List saved sessions with relative timestamps
9
+ * - Preview of last user message
10
+ * - Search sessions by content
11
+ * - Delete sessions
12
+ * - Resume selected session
13
+ */
14
+ import * as terminal from '../../terminal.js';
15
+ import { TabbedListOverlayV2, BaseScreen, stay, popScreen, closeOverlay, isEscape, isCtrlC, isEnter, isClose, extractPrintable, renderBorder, wrapText, truncate, } from '../../base/index.js';
16
+ const TABS = [
17
+ { id: 'recent', label: 'Recent' },
18
+ { id: 'all', label: 'All' },
19
+ ];
20
+ // =============================================================================
21
+ // Helper Functions
22
+ // =============================================================================
23
+ /**
24
+ * Format a date as a relative time string.
25
+ */
26
+ function formatRelativeTime(date) {
27
+ const now = Date.now();
28
+ const then = new Date(date).getTime();
29
+ const diff = now - then;
30
+ const seconds = Math.floor(diff / 1000);
31
+ const minutes = Math.floor(seconds / 60);
32
+ const hours = Math.floor(minutes / 60);
33
+ const days = Math.floor(hours / 24);
34
+ if (days > 7) {
35
+ return new Date(date).toLocaleDateString();
36
+ }
37
+ if (days > 1) {
38
+ return `${String(days)} days ago`;
39
+ }
40
+ if (days === 1) {
41
+ return 'Yesterday';
42
+ }
43
+ if (hours >= 1) {
44
+ return `${String(hours)} hour${hours > 1 ? 's' : ''} ago`;
45
+ }
46
+ if (minutes >= 1) {
47
+ return `${String(minutes)} minute${minutes > 1 ? 's' : ''} ago`;
48
+ }
49
+ return 'Just now';
50
+ }
51
+ /**
52
+ * Convert SessionInfo to SessionItem with relative time.
53
+ */
54
+ function toSessionItem(session, currentProjectId) {
55
+ // Check if this is a ProjectSessionInfo with project metadata
56
+ const projectSession = session;
57
+ const projectId = projectSession.projectId;
58
+ const projectName = projectSession.projectName;
59
+ const isCurrentProject = projectId === currentProjectId;
60
+ return {
61
+ sessionId: session.sessionId,
62
+ preview: session.preview || 'No preview available',
63
+ messageCount: session.messageCount,
64
+ createdAt: session.createdAt,
65
+ updatedAt: session.updatedAt,
66
+ relativeTime: formatRelativeTime(session.updatedAt),
67
+ projectId,
68
+ projectName,
69
+ isCurrentProject,
70
+ terminalPrefix: projectSession.terminalPrefix ?? null,
71
+ terminalLabel: projectSession.terminalLabel ?? null,
72
+ isActiveTerminal: projectSession.isActiveTerminal ?? false,
73
+ teamAgentCount: projectSession.teamAgentCount ?? 0,
74
+ };
75
+ }
76
+ // =============================================================================
77
+ // Detail Screen (Session Details)
78
+ // =============================================================================
79
+ /**
80
+ * Screen for viewing session details before resuming.
81
+ */
82
+ class DetailScreen extends BaseScreen {
83
+ item;
84
+ styles;
85
+ onDelete;
86
+ confirmDelete = false;
87
+ confirmCrossProject = false;
88
+ confirmSelected = 1; // 0 = Yes, 1 = No (for both confirmations)
89
+ constructor(item, styles, onDelete) {
90
+ super();
91
+ this.item = item;
92
+ this.styles = styles;
93
+ this.onDelete = onDelete;
94
+ }
95
+ render() {
96
+ const s = this.styles;
97
+ const cols = terminal.getTerminalWidth();
98
+ const border = renderBorder(cols, s);
99
+ const lines = [];
100
+ lines.push(border);
101
+ lines.push(` ${s.primaryBold('Session Details')}`);
102
+ lines.push('');
103
+ // Delete confirmation
104
+ if (this.confirmDelete) {
105
+ lines.push(` ${s.error('Delete this session?')}`);
106
+ lines.push('');
107
+ lines.push(` ${s.muted('Session ID:')} ${s.secondary(this.item.sessionId)}`);
108
+ lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.item.messageCount))}`);
109
+ lines.push('');
110
+ lines.push(this.confirmSelected === 0
111
+ ? ` ${s.error('> Yes, delete')}`
112
+ : ` ${s.muted(' Yes, delete')}`);
113
+ lines.push(this.confirmSelected === 1
114
+ ? ` ${s.primary('> No, cancel')}`
115
+ : ` ${s.muted(' No, cancel')}`);
116
+ lines.push('');
117
+ lines.push(border);
118
+ lines.push(` ${s.muted('↑/↓ Navigate · Enter Select · Esc Cancel')}`);
119
+ lines.push(border);
120
+ return lines;
121
+ }
122
+ // Cross-project confirmation
123
+ if (this.confirmCrossProject) {
124
+ const projName = this.item.projectName ?? `Project ${String(this.item.projectId)}`;
125
+ lines.push(` ${s.warning('⚠ This session is from a different project')}`);
126
+ lines.push('');
127
+ lines.push(` ${s.muted('Project:')} ${s.primary(projName)}`);
128
+ lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.item.messageCount))}`);
129
+ lines.push('');
130
+ lines.push(` ${s.secondary('Resuming will load conversation history from that project.')}`);
131
+ lines.push(` ${s.secondary('Your current project context will remain unchanged.')}`);
132
+ lines.push('');
133
+ lines.push(this.confirmSelected === 0
134
+ ? ` ${s.warning('> Yes, resume anyway')}`
135
+ : ` ${s.muted(' Yes, resume anyway')}`);
136
+ lines.push(this.confirmSelected === 1
137
+ ? ` ${s.primary('> No, cancel')}`
138
+ : ` ${s.muted(' No, cancel')}`);
139
+ lines.push('');
140
+ lines.push(border);
141
+ lines.push(` ${s.muted('↑/↓ Navigate · Enter Select · Esc Cancel')}`);
142
+ lines.push(border);
143
+ return lines;
144
+ }
145
+ // Show cross-project warning banner if applicable
146
+ if (!this.item.isCurrentProject && this.item.projectId !== null) {
147
+ const projName = this.item.projectName ?? `Project ${String(this.item.projectId)}`;
148
+ lines.push(` ${s.warning(`⚠ From different project: ${projName}`)}`);
149
+ lines.push('');
150
+ }
151
+ // Active terminal warning
152
+ if (this.item.isActiveTerminal) {
153
+ lines.push(` ${s.warning('\u26A0 This session is in use by another terminal')}`);
154
+ lines.push('');
155
+ }
156
+ // Session info
157
+ lines.push(` ${s.muted('Updated:')} ${s.primary(this.item.relativeTime)}`);
158
+ lines.push(` ${s.muted('Created:')} ${s.secondary(new Date(this.item.createdAt).toLocaleString())}`);
159
+ if (this.item.messageCount > 0) {
160
+ lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.item.messageCount))}`);
161
+ }
162
+ else if (this.item.teamAgentCount && this.item.teamAgentCount > 1) {
163
+ lines.push(` ${s.muted('Messages:')} ${s.secondary('None (team only)')}`);
164
+ }
165
+ else {
166
+ lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.item.messageCount))}`);
167
+ }
168
+ if (this.item.teamAgentCount && this.item.teamAgentCount > 1) {
169
+ lines.push(` ${s.muted('Team:')} ${s.secondary(`${String(this.item.teamAgentCount)} agents`)}`);
170
+ }
171
+ lines.push(` ${s.muted('Session ID:')} ${s.secondary(this.item.sessionId)}`);
172
+ // Terminal info (for multi-terminal sessions)
173
+ if (this.item.terminalLabel) {
174
+ const prefixStr = this.item.terminalPrefix ? ` (${this.item.terminalPrefix})` : '';
175
+ const statusStr = this.item.isActiveTerminal
176
+ ? s.success('\u25CF Active')
177
+ : s.muted('\u2014 Exited');
178
+ lines.push(` ${s.muted('Terminal:')} ${s.secondary(this.item.terminalLabel + prefixStr)} ${statusStr}`);
179
+ }
180
+ lines.push('');
181
+ // Preview
182
+ lines.push(` ${s.muted('Last message:')}`);
183
+ const previewLines = wrapText(this.item.preview, cols - 6);
184
+ for (const line of previewLines.slice(0, 3)) {
185
+ lines.push(` ${s.secondary(line)}`);
186
+ }
187
+ if (previewLines.length > 3) {
188
+ lines.push(` ${s.muted('...')}`);
189
+ }
190
+ lines.push('');
191
+ lines.push(border);
192
+ if (this.item.isActiveTerminal) {
193
+ lines.push(` ${s.muted('d Delete · q/Esc Back')} ${s.warning('(in use — cannot resume)')}`);
194
+ }
195
+ else {
196
+ lines.push(` ${s.muted('Enter Resume · d Delete · q/Esc Back')}`);
197
+ }
198
+ lines.push(border);
199
+ return lines;
200
+ }
201
+ handleKey(data) {
202
+ const char = extractPrintable(data);
203
+ const key = data.toString();
204
+ // Ctrl+C closes everything
205
+ if (isCtrlC(data)) {
206
+ return closeOverlay(undefined);
207
+ }
208
+ // Confirm delete mode
209
+ if (this.confirmDelete) {
210
+ if (isEscape(data)) {
211
+ this.confirmDelete = false;
212
+ return stay();
213
+ }
214
+ if (char === 'j' || char === 'k' || key === '\x1b[A' || key === '\x1b[B') {
215
+ this.confirmSelected = this.confirmSelected === 0 ? 1 : 0;
216
+ return stay();
217
+ }
218
+ if (isEnter(data)) {
219
+ if (this.confirmSelected === 0) {
220
+ // Yes - delete the session
221
+ void this.handleDelete();
222
+ return closeOverlay({ deleted: this.item.sessionId });
223
+ }
224
+ else {
225
+ // No - cancel
226
+ this.confirmDelete = false;
227
+ return stay();
228
+ }
229
+ }
230
+ return stay(false);
231
+ }
232
+ // Cross-project confirmation mode
233
+ if (this.confirmCrossProject) {
234
+ if (isEscape(data)) {
235
+ this.confirmCrossProject = false;
236
+ return stay();
237
+ }
238
+ if (char === 'j' || char === 'k' || key === '\x1b[A' || key === '\x1b[B') {
239
+ this.confirmSelected = this.confirmSelected === 0 ? 1 : 0;
240
+ return stay();
241
+ }
242
+ if (isEnter(data)) {
243
+ if (this.confirmSelected === 0) {
244
+ // Yes - resume anyway
245
+ return closeOverlay({ sessionId: this.item.sessionId });
246
+ }
247
+ else {
248
+ // No - cancel
249
+ this.confirmCrossProject = false;
250
+ return stay();
251
+ }
252
+ }
253
+ return stay(false);
254
+ }
255
+ // Normal mode
256
+ if (isEscape(data) || isClose(data)) {
257
+ return popScreen();
258
+ }
259
+ // Enter resumes the session (with confirmation if cross-project)
260
+ if (isEnter(data)) {
261
+ // Active terminal sessions cannot be resumed
262
+ if (this.item.isActiveTerminal) {
263
+ return stay(false);
264
+ }
265
+ // Check if this is a cross-project session
266
+ if (!this.item.isCurrentProject && this.item.projectId !== null) {
267
+ this.confirmCrossProject = true;
268
+ this.confirmSelected = 1; // Default to "No"
269
+ return stay();
270
+ }
271
+ return closeOverlay({ sessionId: this.item.sessionId });
272
+ }
273
+ // 'd' deletes the session
274
+ if (char === 'd' && this.onDelete) {
275
+ this.confirmDelete = true;
276
+ this.confirmSelected = 1; // Default to "No"
277
+ return stay();
278
+ }
279
+ return stay(false);
280
+ }
281
+ async handleDelete() {
282
+ if (this.onDelete) {
283
+ await this.onDelete(this.item.sessionId);
284
+ }
285
+ }
286
+ /**
287
+ * Minimum height for stable rendering.
288
+ */
289
+ getMinHeight() {
290
+ return 20;
291
+ }
292
+ }
293
+ // =============================================================================
294
+ // Resume Overlay V2 Class
295
+ // =============================================================================
296
+ export class ResumeOverlayV2 extends TabbedListOverlayV2 {
297
+ type = 'inline';
298
+ id = 'resume-overlay-v2';
299
+ onDeleteSession;
300
+ constructor(options) {
301
+ const currentProjectId = options.currentProjectId;
302
+ const items = options.sessions.map((s) => toSessionItem(s, currentProjectId));
303
+ super({
304
+ title: 'Resume Session',
305
+ tabs: TABS,
306
+ items,
307
+ pageSize: 10,
308
+ filterByTab: (item, tabId) => {
309
+ if (tabId === 'all')
310
+ return true;
311
+ if (tabId === 'recent') {
312
+ // Show sessions from last 24 hours
313
+ const twentyFourHoursAgo = Date.now() - 24 * 60 * 60 * 1000;
314
+ return new Date(item.updatedAt).getTime() > twentyFourHoursAgo;
315
+ }
316
+ return true;
317
+ },
318
+ getSearchText: (item) => `${item.preview} ${item.sessionId} ${item.projectName ?? ''} ${item.terminalLabel ?? ''}`,
319
+ renderItem: (item, isSelected, styles) => {
320
+ const prefix = isSelected ? styles.primary('❯ ') : ' ';
321
+ // Fixed-width columns for alignment (visual character widths)
322
+ const PROJECT_COL_WIDTH = 18; // [Project Long Na..] or [Global]
323
+ const TERMINAL_COL_WIDTH = 16; // [Terminal 1 ●] or [Terminal d772]
324
+ const TIME_COL_WIDTH = 16; // "33 minutes ago"
325
+ const COUNT_COL_WIDTH = 10; // " 82 msgs " or " 2 agents"
326
+ // Project indicator (fixed width)
327
+ let projectName;
328
+ let isCurrentProj = false;
329
+ if (item.projectId !== null && item.projectId !== undefined) {
330
+ projectName = item.projectName ?? `Project ${String(item.projectId)}`;
331
+ isCurrentProj = item.isCurrentProject ?? false;
332
+ }
333
+ else {
334
+ projectName = 'Global';
335
+ }
336
+ // Truncate project name to fit in brackets
337
+ const maxProjLen = PROJECT_COL_WIDTH - 2; // -2 for brackets
338
+ const truncatedProj = truncate(projectName, maxProjLen);
339
+ const projectStr = `[${truncatedProj}]`.padEnd(PROJECT_COL_WIDTH);
340
+ const projectIndicator = isCurrentProj
341
+ ? styles.success(projectStr)
342
+ : styles.muted(projectStr);
343
+ // Terminal indicator (fixed width — pad inner label, then wrap + style)
344
+ let terminalStr = '';
345
+ if (item.terminalLabel) {
346
+ // Pad inner label to fixed width: TERMINAL_COL_WIDTH - 2 for brackets
347
+ const innerWidth = TERMINAL_COL_WIDTH - 2;
348
+ if (item.isActiveTerminal) {
349
+ const inner = `${item.terminalLabel} \u25CF`.padEnd(innerWidth);
350
+ terminalStr = styles.warning(`[${inner}]`);
351
+ }
352
+ else {
353
+ const inner = item.terminalLabel.padEnd(innerWidth);
354
+ terminalStr = styles.muted(`[${inner}]`);
355
+ }
356
+ }
357
+ else {
358
+ terminalStr = ''.padEnd(TERMINAL_COL_WIDTH);
359
+ }
360
+ // Time (fixed width)
361
+ const timeStr = item.relativeTime.padEnd(TIME_COL_WIDTH);
362
+ const timeStyled = isSelected ? styles.primary(timeStr) : styles.muted(timeStr);
363
+ // Message count or team-only indicator (fixed width, left-aligned)
364
+ let countStr;
365
+ if (item.messageCount === 0 && item.teamAgentCount && item.teamAgentCount > 1) {
366
+ countStr = `${String(item.teamAgentCount)} agents`.padEnd(COUNT_COL_WIDTH);
367
+ }
368
+ else {
369
+ const label = item.messageCount !== 1 ? 'msgs' : 'msg';
370
+ countStr = `${String(item.messageCount)} ${label}`.padEnd(COUNT_COL_WIDTH);
371
+ }
372
+ const countStyled = isSelected ? styles.secondary(countStr) : styles.muted(countStr);
373
+ // Sanitize preview: remove newlines, carriage returns, and collapse whitespace
374
+ const sanitized = item.preview
375
+ .replace(/[\r\n]+/g, ' ')
376
+ .replace(/\s+/g, ' ')
377
+ .replace(/^#+\s*/g, '')
378
+ .trim();
379
+ // Calculate remaining space for preview
380
+ const usedWidth = 2 + PROJECT_COL_WIDTH + 1 + TERMINAL_COL_WIDTH + 1 + TIME_COL_WIDTH + COUNT_COL_WIDTH + 1;
381
+ const cols = terminal.getTerminalWidth();
382
+ const maxPreview = Math.max(20, cols - usedWidth - 2);
383
+ const preview = truncate(sanitized, maxPreview);
384
+ const previewStyled = isSelected ? styles.secondary(preview) : styles.muted(preview);
385
+ return `${prefix}${projectIndicator} ${terminalStr} ${timeStyled}${countStyled} ${previewStyled}`;
386
+ },
387
+ showCount: true,
388
+ emptyMessage: 'No saved sessions found.',
389
+ noResultsMessage: 'No sessions match the search.',
390
+ footerHints: (searchMode) => {
391
+ if (searchMode) {
392
+ return 'Type to search Enter Select Esc Exit search';
393
+ }
394
+ return 'j/k Navigate / Search Enter Resume d Delete q/Esc Close';
395
+ },
396
+ });
397
+ this.onDeleteSession = options.onDelete;
398
+ }
399
+ createDetailScreen(item) {
400
+ return new DetailScreen(item, this.getStyles(), this.onDeleteSession);
401
+ }
402
+ onItemSelected(item) {
403
+ // Active terminal sessions cannot be resumed (in use by another terminal)
404
+ if (item.isActiveTerminal) {
405
+ return undefined; // Stay on list - no action
406
+ }
407
+ // Cross-project sessions need confirmation - go to detail screen
408
+ if (!item.isCurrentProject && item.projectId !== null) {
409
+ return undefined; // Fall through to detail screen for confirmation
410
+ }
411
+ // Same project - resume directly
412
+ return { sessionId: item.sessionId };
413
+ }
414
+ }
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Session Mode Overlay V2
3
+ *
4
+ * Modal overlay shown at startup when projectSessionMode='ask' and a previous session exists.
5
+ * Gives the user control over how to handle the existing session:
6
+ * - Resume full: Continue where you left off (conversation + context)
7
+ * - Resume messages: Keep conversation, refresh project context
8
+ * - Start fresh: Clear conversation, fresh project context
9
+ */
10
+ import { BaseOverlayV2 } from '../../base/index.js';
11
+ import type { RenderContext, OverlayAction, KeyEvent } from '../types.js';
12
+ export type SessionModeOption = 'resume-full' | 'resume-messages' | 'start-fresh';
13
+ interface SessionModeState {
14
+ /** Selected option index */
15
+ selectedIndex: number;
16
+ }
17
+ export interface SessionModeOverlayV2Options {
18
+ /** Project name for display */
19
+ projectName: string;
20
+ /** Number of messages in existing session */
21
+ messageCount: number;
22
+ /** Last activity timestamp */
23
+ lastActivity: Date;
24
+ /** Preview of last user message (optional) */
25
+ lastMessagePreview?: string;
26
+ }
27
+ export interface SessionModeOverlayV2Result {
28
+ /** Selected option */
29
+ option: SessionModeOption;
30
+ }
31
+ export declare class SessionModeOverlayV2 extends BaseOverlayV2<SessionModeState, SessionModeOverlayV2Result> {
32
+ readonly type: "inline";
33
+ readonly id = "session-mode-overlay-v2";
34
+ private readonly projectName;
35
+ private readonly messageCount;
36
+ private readonly lastActivity;
37
+ private readonly lastMessagePreview?;
38
+ constructor(options: SessionModeOverlayV2Options);
39
+ protected renderContent(context: RenderContext): string[];
40
+ handleKey(key: KeyEvent): OverlayAction<SessionModeOverlayV2Result>;
41
+ private formatTimeAgo;
42
+ }
43
+ export {};
@@ -0,0 +1,124 @@
1
+ /**
2
+ * Session Mode Overlay V2
3
+ *
4
+ * Modal overlay shown at startup when projectSessionMode='ask' and a previous session exists.
5
+ * Gives the user control over how to handle the existing session:
6
+ * - Resume full: Continue where you left off (conversation + context)
7
+ * - Resume messages: Keep conversation, refresh project context
8
+ * - Start fresh: Clear conversation, fresh project context
9
+ */
10
+ import { BaseOverlayV2, renderBorder, truncate } from '../../base/index.js';
11
+ const SESSION_MODE_OPTIONS = [
12
+ {
13
+ id: 'resume-full',
14
+ label: 'Resume full',
15
+ description: 'Continue where you left off',
16
+ },
17
+ {
18
+ id: 'resume-messages',
19
+ label: 'Resume messages',
20
+ description: 'Keep conversation, refresh project context',
21
+ },
22
+ {
23
+ id: 'start-fresh',
24
+ label: 'Start fresh',
25
+ description: 'Clear conversation, fresh project context',
26
+ },
27
+ ];
28
+ // =============================================================================
29
+ // Session Mode Overlay V2 Class
30
+ // =============================================================================
31
+ export class SessionModeOverlayV2 extends BaseOverlayV2 {
32
+ type = 'inline';
33
+ id = 'session-mode-overlay-v2';
34
+ projectName;
35
+ messageCount;
36
+ lastActivity;
37
+ lastMessagePreview;
38
+ constructor(options) {
39
+ super({ selectedIndex: 0 });
40
+ this.projectName = options.projectName;
41
+ this.messageCount = options.messageCount;
42
+ this.lastActivity = options.lastActivity;
43
+ this.lastMessagePreview = options.lastMessagePreview;
44
+ this.minHeight = 18;
45
+ }
46
+ renderContent(context) {
47
+ const s = context.styles;
48
+ const border = renderBorder(context.width, s);
49
+ const lines = [];
50
+ lines.push(border);
51
+ lines.push(` ${s.primaryBold('Previous Session Found')}`);
52
+ lines.push('');
53
+ // Session info
54
+ lines.push(` ${s.muted('Project:')} ${s.primary(this.projectName)}`);
55
+ lines.push(` ${s.muted('Messages:')} ${s.secondary(String(this.messageCount))}`);
56
+ // Format time ago
57
+ const timeAgo = this.formatTimeAgo(this.lastActivity);
58
+ lines.push(` ${s.muted('Last active:')} ${s.secondary(timeAgo)}`);
59
+ // Last message preview if available
60
+ if (this.lastMessagePreview) {
61
+ const preview = truncate(this.lastMessagePreview, 50);
62
+ lines.push(` ${s.muted('Last message:')} ${s.secondary(`"${preview}"`)}`);
63
+ }
64
+ lines.push('');
65
+ lines.push(` ${s.muted('How would you like to continue?')}`);
66
+ lines.push('');
67
+ // Options
68
+ for (let i = 0; i < SESSION_MODE_OPTIONS.length; i++) {
69
+ const opt = SESSION_MODE_OPTIONS[i];
70
+ const isSelected = i === this.state.selectedIndex;
71
+ const prefix = isSelected ? s.primary('> ') : ' ';
72
+ const label = isSelected ? s.primaryBold(opt.label) : s.secondary(opt.label);
73
+ const desc = s.muted(` - ${opt.description}`);
74
+ lines.push(` ${prefix}${label}${desc}`);
75
+ }
76
+ lines.push('');
77
+ lines.push(border);
78
+ lines.push(` ${s.muted('j/k Navigate Enter Select')}`);
79
+ lines.push(border);
80
+ return lines;
81
+ }
82
+ handleKey(key) {
83
+ // Ctrl+C closes with start-fresh (safest default for interrupt)
84
+ if (key.ctrl && key.name === 'c') {
85
+ return this.close({ option: 'start-fresh' });
86
+ }
87
+ // Escape defaults to resume-full (most common expectation)
88
+ if (key.name === 'escape') {
89
+ return this.close({ option: 'resume-full' });
90
+ }
91
+ // Navigation with j/k
92
+ if (key.char === 'j' || key.name === 'down') {
93
+ this.state.selectedIndex = Math.min(this.state.selectedIndex + 1, SESSION_MODE_OPTIONS.length - 1);
94
+ return this.rerender();
95
+ }
96
+ if (key.char === 'k' || key.name === 'up') {
97
+ this.state.selectedIndex = Math.max(this.state.selectedIndex - 1, 0);
98
+ return this.rerender();
99
+ }
100
+ // Enter selects
101
+ if (key.name === 'return') {
102
+ const selected = SESSION_MODE_OPTIONS[this.state.selectedIndex];
103
+ return this.close({ option: selected.id });
104
+ }
105
+ return this.rerender();
106
+ }
107
+ formatTimeAgo(date) {
108
+ const now = new Date();
109
+ const diffMs = now.getTime() - date.getTime();
110
+ const diffMins = Math.floor(diffMs / (1000 * 60));
111
+ const diffHours = Math.floor(diffMs / (1000 * 60 * 60));
112
+ const diffDays = Math.floor(diffMs / (1000 * 60 * 60 * 24));
113
+ if (diffMins < 1)
114
+ return 'just now';
115
+ if (diffMins < 60)
116
+ return `${String(diffMins)} minute${diffMins === 1 ? '' : 's'} ago`;
117
+ if (diffHours < 24)
118
+ return `${String(diffHours)} hour${diffHours === 1 ? '' : 's'} ago`;
119
+ if (diffDays < 7)
120
+ return `${String(diffDays)} day${diffDays === 1 ? '' : 's'} ago`;
121
+ // For older sessions, show the date
122
+ return date.toLocaleDateString();
123
+ }
124
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * Tasks Overlay V2 - View and manage background shell tasks
3
+ *
4
+ * Shows background shells started via `bash` with `run_in_background=true`.
5
+ * Allows viewing output, killing running tasks, and clearing completed ones.
6
+ */
7
+ import { BaseOverlayV2 } from '../../base/overlay-base-v2.js';
8
+ import type { RenderContext, OverlayAction, KeyEvent } from '../index.js';
9
+ interface TasksOverlayState {
10
+ selectedIndex: number;
11
+ screen: 'list' | 'detail';
12
+ detailShellId: string | null;
13
+ lastRefresh: number;
14
+ }
15
+ export declare class TasksOverlayV2 extends BaseOverlayV2<TasksOverlayState> {
16
+ readonly type: "inline";
17
+ readonly id = "tasks-overlay";
18
+ constructor();
19
+ protected renderContent(context: RenderContext): string[];
20
+ private renderList;
21
+ private formatShellLine;
22
+ private formatDuration;
23
+ private renderDetail;
24
+ handleKey(key: KeyEvent): OverlayAction<void>;
25
+ private handleListKey;
26
+ private handleDetailKey;
27
+ }
28
+ export {};