@compilr-dev/cli 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/README.md +236 -68
  2. package/dist/.tsbuildinfo.app +1 -0
  3. package/dist/.tsbuildinfo.data +1 -0
  4. package/dist/.tsbuildinfo.domain +1 -0
  5. package/dist/.tsbuildinfo.foundation +1 -0
  6. package/dist/agent.d.ts +61 -4
  7. package/dist/agent.js +241 -245
  8. package/dist/anchors/index.d.ts +1 -1
  9. package/dist/anchors/index.js +1 -1
  10. package/dist/anchors/project-anchors.d.ts +2 -2
  11. package/dist/anchors/project-anchors.js +1 -1
  12. package/dist/auth/api-client.d.ts +124 -0
  13. package/dist/auth/api-client.js +261 -0
  14. package/dist/auth/index.d.ts +172 -0
  15. package/dist/auth/index.js +545 -0
  16. package/dist/auth/storage.d.ts +52 -0
  17. package/dist/auth/storage.js +118 -0
  18. package/dist/changelog/index.d.ts +16 -0
  19. package/dist/changelog/index.js +24 -0
  20. package/dist/changelog/releases.d.ts +17 -0
  21. package/dist/changelog/releases.js +63 -0
  22. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  23. package/dist/commands-v2/handlers/auth.js +118 -0
  24. package/dist/commands-v2/handlers/background.d.ts +14 -0
  25. package/dist/commands-v2/handlers/background.js +276 -0
  26. package/dist/commands-v2/handlers/context.js +266 -81
  27. package/dist/commands-v2/handlers/core.d.ts +1 -0
  28. package/dist/commands-v2/handlers/core.js +133 -8
  29. package/dist/commands-v2/handlers/debug.js +18 -0
  30. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  31. package/dist/commands-v2/handlers/delegations.js +29 -0
  32. package/dist/commands-v2/handlers/files.d.ts +8 -0
  33. package/dist/commands-v2/handlers/files.js +162 -0
  34. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  35. package/dist/commands-v2/handlers/filter.js +130 -0
  36. package/dist/commands-v2/handlers/games.d.ts +7 -0
  37. package/dist/commands-v2/handlers/games.js +57 -0
  38. package/dist/commands-v2/handlers/index.d.ts +13 -0
  39. package/dist/commands-v2/handlers/index.js +39 -0
  40. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  41. package/dist/commands-v2/handlers/mcp.js +39 -0
  42. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  43. package/dist/commands-v2/handlers/notifications.js +34 -0
  44. package/dist/commands-v2/handlers/project.js +244 -23
  45. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  46. package/dist/commands-v2/handlers/reset.js +118 -0
  47. package/dist/commands-v2/handlers/session.d.ts +161 -0
  48. package/dist/commands-v2/handlers/session.js +805 -0
  49. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  50. package/dist/commands-v2/handlers/settings.js +217 -35
  51. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  52. package/dist/commands-v2/handlers/tasks.js +36 -0
  53. package/dist/commands-v2/handlers/team.d.ts +9 -0
  54. package/dist/commands-v2/handlers/team.js +549 -0
  55. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  56. package/dist/commands-v2/handlers/terminals.js +34 -0
  57. package/dist/commands-v2/index.d.ts +3 -2
  58. package/dist/commands-v2/index.js +4 -1
  59. package/dist/commands-v2/registry.d.ts +15 -0
  60. package/dist/commands-v2/registry.js +34 -0
  61. package/dist/commands-v2/types.d.ts +81 -3
  62. package/dist/commands.js +13 -0
  63. package/dist/compilr-diff-companion.vsix +0 -0
  64. package/dist/db/index.js +98 -4
  65. package/dist/db/repositories/document-repository.d.ts +2 -0
  66. package/dist/db/repositories/document-repository.js +5 -1
  67. package/dist/db/repositories/index.d.ts +2 -0
  68. package/dist/db/repositories/index.js +1 -0
  69. package/dist/db/repositories/plan-repository.d.ts +101 -0
  70. package/dist/db/repositories/plan-repository.js +275 -0
  71. package/dist/db/repositories/project-repository.d.ts +6 -0
  72. package/dist/db/repositories/project-repository.js +41 -0
  73. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  74. package/dist/db/repositories/work-item-repository.js +69 -4
  75. package/dist/db/schema.d.ts +40 -3
  76. package/dist/db/schema.js +66 -3
  77. package/dist/episodes/index.d.ts +20 -0
  78. package/dist/episodes/index.js +27 -0
  79. package/dist/episodes/recorder.d.ts +51 -0
  80. package/dist/episodes/recorder.js +195 -0
  81. package/dist/episodes/significant-work.d.ts +21 -0
  82. package/dist/episodes/significant-work.js +56 -0
  83. package/dist/episodes/store.d.ts +38 -0
  84. package/dist/episodes/store.js +199 -0
  85. package/dist/episodes/types.d.ts +35 -0
  86. package/dist/episodes/types.js +6 -0
  87. package/dist/episodes/work-at-risk.d.ts +12 -0
  88. package/dist/episodes/work-at-risk.js +38 -0
  89. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  90. package/dist/episodes/work-summary-anchor.js +73 -0
  91. package/dist/games/coins.d.ts +66 -0
  92. package/dist/games/coins.js +165 -0
  93. package/dist/games/game-base.d.ts +84 -0
  94. package/dist/games/game-base.js +204 -0
  95. package/dist/games/index.d.ts +16 -0
  96. package/dist/games/index.js +49 -0
  97. package/dist/games/scores.d.ts +69 -0
  98. package/dist/games/scores.js +191 -0
  99. package/dist/games/tetris/board.d.ts +59 -0
  100. package/dist/games/tetris/board.js +170 -0
  101. package/dist/games/tetris/index.d.ts +109 -0
  102. package/dist/games/tetris/index.js +610 -0
  103. package/dist/games/tetris/pieces.d.ts +44 -0
  104. package/dist/games/tetris/pieces.js +271 -0
  105. package/dist/games/tetris/renderer.d.ts +26 -0
  106. package/dist/games/tetris/renderer.js +77 -0
  107. package/dist/guide/guide-content.d.ts +23 -0
  108. package/dist/guide/guide-content.js +196 -0
  109. package/dist/guide/index.d.ts +8 -0
  110. package/dist/guide/index.js +7 -0
  111. package/dist/guide/shared-content.d.ts +37 -0
  112. package/dist/guide/shared-content.js +1272 -0
  113. package/dist/guide/tutorial-helpers.d.ts +57 -0
  114. package/dist/guide/tutorial-helpers.js +147 -0
  115. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  116. package/dist/handlers/ask-user-handlers.js +104 -0
  117. package/dist/handlers/delegation-handlers.d.ts +34 -0
  118. package/dist/handlers/delegation-handlers.js +291 -0
  119. package/dist/handlers/permission-handler.d.ts +30 -0
  120. package/dist/handlers/permission-handler.js +205 -0
  121. package/dist/index.d.ts +11 -1
  122. package/dist/index.js +448 -271
  123. package/dist/input-handlers/memory-handler.d.ts +1 -1
  124. package/dist/input-handlers/memory-handler.js +2 -1
  125. package/dist/models/index.d.ts +10 -0
  126. package/dist/models/index.js +12 -0
  127. package/dist/models/model-registry.d.ts +38 -0
  128. package/dist/models/model-registry.js +69 -0
  129. package/dist/models/model-tiers.d.ts +28 -0
  130. package/dist/models/model-tiers.js +71 -0
  131. package/dist/models/model-validation.d.ts +25 -0
  132. package/dist/models/model-validation.js +291 -0
  133. package/dist/models/ollama-models.d.ts +73 -0
  134. package/dist/models/ollama-models.js +178 -0
  135. package/dist/models/provider-types.d.ts +6 -0
  136. package/dist/models/provider-types.js +1 -0
  137. package/dist/models/providers.d.ts +35 -0
  138. package/dist/models/providers.js +58 -0
  139. package/dist/models/types.d.ts +4 -0
  140. package/dist/models/types.js +4 -0
  141. package/dist/multi-agent/activity.d.ts +21 -0
  142. package/dist/multi-agent/activity.js +34 -0
  143. package/dist/multi-agent/agent-selection.d.ts +55 -0
  144. package/dist/multi-agent/agent-selection.js +90 -0
  145. package/dist/multi-agent/artifacts.d.ts +197 -0
  146. package/dist/multi-agent/artifacts.js +379 -0
  147. package/dist/multi-agent/checkpointer.d.ts +138 -0
  148. package/dist/multi-agent/checkpointer.js +471 -0
  149. package/dist/multi-agent/collision-utils.d.ts +16 -0
  150. package/dist/multi-agent/collision-utils.js +28 -0
  151. package/dist/multi-agent/context-resolver.d.ts +97 -0
  152. package/dist/multi-agent/context-resolver.js +316 -0
  153. package/dist/multi-agent/custom-agents.d.ts +83 -0
  154. package/dist/multi-agent/custom-agents.js +227 -0
  155. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  156. package/dist/multi-agent/delegation-tracker.js +243 -0
  157. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  158. package/dist/multi-agent/file-lock-hook.js +97 -0
  159. package/dist/multi-agent/file-locks.d.ts +58 -0
  160. package/dist/multi-agent/file-locks.js +194 -0
  161. package/dist/multi-agent/index.d.ts +24 -0
  162. package/dist/multi-agent/index.js +30 -0
  163. package/dist/multi-agent/mention-parser.d.ts +64 -0
  164. package/dist/multi-agent/mention-parser.js +146 -0
  165. package/dist/multi-agent/notification-manager.d.ts +84 -0
  166. package/dist/multi-agent/notification-manager.js +224 -0
  167. package/dist/multi-agent/pending-requests.d.ts +122 -0
  168. package/dist/multi-agent/pending-requests.js +155 -0
  169. package/dist/multi-agent/session-registry.d.ts +139 -0
  170. package/dist/multi-agent/session-registry.js +514 -0
  171. package/dist/multi-agent/shared-context.d.ts +293 -0
  172. package/dist/multi-agent/shared-context.js +671 -0
  173. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  174. package/dist/multi-agent/skill-requirements.js +178 -0
  175. package/dist/multi-agent/task-assignment.d.ts +69 -0
  176. package/dist/multi-agent/task-assignment.js +123 -0
  177. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  178. package/dist/multi-agent/task-suggestion.js +72 -0
  179. package/dist/multi-agent/team-agent.d.ts +201 -0
  180. package/dist/multi-agent/team-agent.js +488 -0
  181. package/dist/multi-agent/team.d.ts +286 -0
  182. package/dist/multi-agent/team.js +610 -0
  183. package/dist/multi-agent/tool-config.d.ts +110 -0
  184. package/dist/multi-agent/tool-config.js +661 -0
  185. package/dist/multi-agent/types.d.ts +211 -0
  186. package/dist/multi-agent/types.js +617 -0
  187. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  188. package/dist/prompts/plan-mode-prompt.js +95 -0
  189. package/dist/repl-helpers.js +3 -2
  190. package/dist/repl-v2.d.ts +401 -2
  191. package/dist/repl-v2.js +2577 -65
  192. package/dist/session/index.d.ts +6 -0
  193. package/dist/session/index.js +6 -0
  194. package/dist/session/project-session-manager.d.ts +158 -0
  195. package/dist/session/project-session-manager.js +650 -0
  196. package/dist/settings/index.d.ts +133 -13
  197. package/dist/settings/index.js +329 -24
  198. package/dist/settings/mcp-config.d.ts +76 -0
  199. package/dist/settings/mcp-config.js +143 -0
  200. package/dist/settings/paths.d.ts +4 -0
  201. package/dist/settings/paths.js +6 -0
  202. package/dist/shared-handlers.d.ts +62 -0
  203. package/dist/shared-handlers.js +48 -0
  204. package/dist/system-prompt/builder.d.ts +5 -0
  205. package/dist/system-prompt/builder.js +4 -0
  206. package/dist/system-prompt/index.d.ts +18 -0
  207. package/dist/system-prompt/index.js +18 -0
  208. package/dist/system-prompt/modules.d.ts +5 -0
  209. package/dist/system-prompt/modules.js +4 -0
  210. package/dist/tabbed-menu.js +2 -1
  211. package/dist/templates/compilr-md-import.d.ts +16 -0
  212. package/dist/templates/compilr-md-import.js +241 -0
  213. package/dist/templates/compilr-md.js +10 -61
  214. package/dist/templates/config-json.d.ts +1 -25
  215. package/dist/templates/index.d.ts +2 -0
  216. package/dist/templates/index.js +34 -73
  217. package/dist/tool-names.d.ts +108 -0
  218. package/dist/tool-names.js +227 -0
  219. package/dist/tools/anchor-tools.d.ts +4 -4
  220. package/dist/tools/anchor-tools.js +1 -1
  221. package/dist/tools/artifact-tools.d.ts +42 -0
  222. package/dist/tools/artifact-tools.js +328 -0
  223. package/dist/tools/ask-user-simple.d.ts +1 -1
  224. package/dist/tools/ask-user-simple.js +2 -1
  225. package/dist/tools/ask-user.d.ts +1 -1
  226. package/dist/tools/ask-user.js +2 -1
  227. package/dist/tools/backlog-wrappers.d.ts +5 -3
  228. package/dist/tools/backlog-wrappers.js +16 -1
  229. package/dist/tools/backlog.d.ts +2 -2
  230. package/dist/tools/backlog.js +1 -1
  231. package/dist/tools/db-tools.d.ts +8 -61
  232. package/dist/tools/db-tools.js +8 -13
  233. package/dist/tools/delegate-background.d.ts +27 -0
  234. package/dist/tools/delegate-background.js +115 -0
  235. package/dist/tools/delegate.d.ts +22 -0
  236. package/dist/tools/delegate.js +97 -0
  237. package/dist/tools/delegation-status.d.ts +16 -0
  238. package/dist/tools/delegation-status.js +128 -0
  239. package/dist/tools/document-db.d.ts +5 -5
  240. package/dist/tools/document-db.js +1 -1
  241. package/dist/tools/guide-tool.d.ts +12 -0
  242. package/dist/tools/guide-tool.js +59 -0
  243. package/dist/tools/handoff.d.ts +25 -0
  244. package/dist/tools/handoff.js +99 -0
  245. package/dist/tools/meta-tools.d.ts +26 -0
  246. package/dist/tools/meta-tools.js +47 -0
  247. package/dist/tools/plan-tools.d.ts +54 -0
  248. package/dist/tools/plan-tools.js +338 -0
  249. package/dist/tools/platform-adapter.d.ts +29 -0
  250. package/dist/tools/platform-adapter.js +394 -0
  251. package/dist/tools/project-db.d.ts +5 -73
  252. package/dist/tools/project-db.js +5 -336
  253. package/dist/tools/recall-work-tool.d.ts +18 -0
  254. package/dist/tools/recall-work-tool.js +82 -0
  255. package/dist/tools/workitem-db.d.ts +43 -11
  256. package/dist/tools/workitem-db.js +186 -5
  257. package/dist/tools.d.ts +67 -2
  258. package/dist/tools.js +237 -47
  259. package/dist/ui/autocomplete-controller.d.ts +42 -0
  260. package/dist/ui/autocomplete-controller.js +384 -0
  261. package/dist/ui/base/index.d.ts +1 -1
  262. package/dist/ui/base/index.js +1 -1
  263. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  264. package/dist/ui/base/overlay-base-v2.js +14 -0
  265. package/dist/ui/base/render-utils.d.ts +19 -0
  266. package/dist/ui/base/render-utils.js +25 -0
  267. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  268. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  269. package/dist/ui/constants/labels.d.ts +14 -0
  270. package/dist/ui/constants/labels.js +51 -0
  271. package/dist/ui/conversation-store.d.ts +55 -0
  272. package/dist/ui/conversation-store.js +107 -0
  273. package/dist/ui/conversation.js +11 -13
  274. package/dist/ui/diff.d.ts +7 -1
  275. package/dist/ui/diff.js +85 -48
  276. package/dist/ui/ephemeral.js +3 -9
  277. package/dist/ui/file-autocomplete.d.ts +24 -0
  278. package/dist/ui/file-autocomplete.js +56 -0
  279. package/dist/ui/footer-renderer.d.ts +69 -0
  280. package/dist/ui/footer-renderer.js +431 -0
  281. package/dist/ui/footer.d.ts +74 -7
  282. package/dist/ui/footer.js +173 -16
  283. package/dist/ui/input-controller.d.ts +51 -0
  284. package/dist/ui/input-controller.js +176 -0
  285. package/dist/ui/input-prompt.d.ts +19 -0
  286. package/dist/ui/input-prompt.js +206 -14
  287. package/dist/ui/keyboard-handler.d.ts +57 -0
  288. package/dist/ui/keyboard-handler.js +557 -0
  289. package/dist/ui/live-region-facade.d.ts +42 -0
  290. package/dist/ui/live-region-facade.js +205 -0
  291. package/dist/ui/live-region.d.ts +0 -4
  292. package/dist/ui/live-region.js +6 -14
  293. package/dist/ui/mascot/renderer.d.ts +1 -1
  294. package/dist/ui/mascot/renderer.js +37 -2
  295. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  296. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  297. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  298. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  299. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  300. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  301. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  302. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  303. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  304. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  305. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  306. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  307. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  308. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  309. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  310. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  311. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  312. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  313. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  314. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  315. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  316. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  317. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  318. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  319. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  320. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  321. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  322. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  323. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  324. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  325. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  326. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  327. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  328. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  329. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  330. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  331. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  332. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  333. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  334. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  335. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  336. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  337. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  338. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  339. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  340. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  341. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  342. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  343. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  344. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  345. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  346. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  347. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  348. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  349. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  350. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  351. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  352. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  353. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  354. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  355. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  356. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  357. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  358. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  359. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  360. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  361. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  362. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  363. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  364. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  365. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  366. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  367. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  368. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  369. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  370. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  371. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  372. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  373. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  374. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  375. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  376. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  377. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  378. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  379. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  380. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  381. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  382. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  383. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  384. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  385. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  386. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  387. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  388. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  389. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  390. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  391. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  392. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  393. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  394. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  395. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  396. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  397. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  398. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  399. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  400. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  401. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  402. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  403. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  404. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  405. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  406. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  407. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  408. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  409. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  410. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  411. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  412. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  413. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  414. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  415. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  416. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  417. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  418. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  419. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  420. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  421. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  422. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  423. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  424. package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -1
  425. package/dist/ui/overlay/index.d.ts +20 -1
  426. package/dist/ui/overlay/index.js +19 -0
  427. package/dist/ui/overlay/types.d.ts +5 -0
  428. package/dist/ui/overlay-manager.d.ts +43 -0
  429. package/dist/ui/overlay-manager.js +238 -0
  430. package/dist/ui/overlays.js +4 -16
  431. package/dist/ui/permission-overlay.js +6 -5
  432. package/dist/ui/status-bar-controller.d.ts +33 -0
  433. package/dist/ui/status-bar-controller.js +99 -0
  434. package/dist/ui/subagent-renderer.js +3 -19
  435. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  436. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  437. package/dist/ui/terminal-line-builders.d.ts +17 -0
  438. package/dist/ui/terminal-line-builders.js +42 -0
  439. package/dist/ui/terminal-render-item.d.ts +16 -0
  440. package/dist/ui/terminal-render-item.js +267 -0
  441. package/dist/ui/terminal-renderer.d.ts +7 -8
  442. package/dist/ui/terminal-renderer.js +7 -8
  443. package/dist/ui/terminal-types.d.ts +179 -0
  444. package/dist/ui/terminal-types.js +34 -0
  445. package/dist/ui/terminal-ui.d.ts +144 -276
  446. package/dist/ui/terminal-ui.js +384 -1861
  447. package/dist/ui/todo-zone.d.ts +19 -1
  448. package/dist/ui/todo-zone.js +71 -13
  449. package/dist/ui/tool-formatters.js +512 -1
  450. package/dist/ui/turn-metrics.d.ts +56 -0
  451. package/dist/ui/turn-metrics.js +75 -0
  452. package/dist/ui/types.d.ts +28 -0
  453. package/dist/ui/types.js +1 -0
  454. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  455. package/dist/ui/vscode-diff-ipc.js +385 -0
  456. package/dist/utils/credentials.d.ts +24 -5
  457. package/dist/utils/credentials.js +123 -9
  458. package/dist/utils/format-tokens.d.ts +13 -0
  459. package/dist/utils/format-tokens.js +18 -0
  460. package/dist/utils/git-config.d.ts +26 -0
  461. package/dist/utils/git-config.js +54 -0
  462. package/dist/utils/message-utils.d.ts +61 -0
  463. package/dist/utils/message-utils.js +72 -0
  464. package/dist/utils/model-tiers.d.ts +8 -1
  465. package/dist/utils/model-tiers.js +38 -16
  466. package/dist/utils/open-browser.d.ts +5 -0
  467. package/dist/utils/open-browser.js +32 -0
  468. package/dist/utils/path-safety.js +3 -2
  469. package/dist/utils/project-detection.d.ts +58 -0
  470. package/dist/utils/project-detection.js +424 -0
  471. package/dist/utils/project-memory.js +2 -1
  472. package/dist/utils/project-status.d.ts +2 -2
  473. package/dist/utils/startup-perf.d.ts +18 -0
  474. package/dist/utils/startup-perf.js +60 -0
  475. package/dist/utils/token-tracker.d.ts +62 -0
  476. package/dist/utils/token-tracker.js +150 -0
  477. package/dist/utils/token-types.d.ts +23 -0
  478. package/dist/utils/token-types.js +18 -0
  479. package/dist/utils/types/config-types.d.ts +32 -0
  480. package/dist/utils/types/config-types.js +8 -0
  481. package/dist/utils/update-checker.d.ts +28 -0
  482. package/dist/utils/update-checker.js +106 -0
  483. package/dist/utils/version.d.ts +7 -0
  484. package/dist/utils/version.js +10 -0
  485. package/dist/utils/vscode-detect.d.ts +39 -0
  486. package/dist/utils/vscode-detect.js +137 -0
  487. package/package.json +25 -12
  488. package/dist/commands/handler-types.d.ts +0 -68
  489. package/dist/commands/handler-types.js +0 -8
  490. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  491. package/dist/commands/handlers/agent-commands.js +0 -305
  492. package/dist/commands/handlers/design-commands.d.ts +0 -15
  493. package/dist/commands/handlers/design-commands.js +0 -334
  494. package/dist/commands/handlers/index.d.ts +0 -20
  495. package/dist/commands/handlers/index.js +0 -43
  496. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  497. package/dist/commands/handlers/overlay-commands.js +0 -287
  498. package/dist/commands/handlers/project-commands.d.ts +0 -11
  499. package/dist/commands/handlers/project-commands.js +0 -167
  500. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  501. package/dist/commands/handlers/simple-commands.js +0 -144
  502. package/dist/commands/registry.d.ts +0 -50
  503. package/dist/commands/registry.js +0 -75
  504. package/dist/index.old.d.ts +0 -7
  505. package/dist/index.old.js +0 -1014
  506. package/dist/repl.d.ts +0 -149
  507. package/dist/repl.js +0 -1151
  508. package/dist/templates/claude-md.d.ts +0 -7
  509. package/dist/templates/claude-md.js +0 -189
  510. package/dist/test-autocomplete.d.ts +0 -7
  511. package/dist/test-autocomplete.js +0 -85
  512. package/dist/test-tabbed-menu.d.ts +0 -7
  513. package/dist/test-tabbed-menu.js +0 -25
  514. package/dist/tool-selector.d.ts +0 -71
  515. package/dist/tool-selector.js +0 -184
  516. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  517. package/dist/ui/agents-overlay-v2.js +0 -809
  518. package/dist/ui/agents-overlay.d.ts +0 -12
  519. package/dist/ui/agents-overlay.js +0 -863
  520. package/dist/ui/anchors-overlay.d.ts +0 -12
  521. package/dist/ui/anchors-overlay.js +0 -775
  522. package/dist/ui/arch-type-overlay.d.ts +0 -15
  523. package/dist/ui/arch-type-overlay.js +0 -201
  524. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  525. package/dist/ui/ask-user-overlay-v2.js +0 -555
  526. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  527. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  528. package/dist/ui/backlog-overlay.d.ts +0 -32
  529. package/dist/ui/backlog-overlay.js +0 -652
  530. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  531. package/dist/ui/commands-overlay-v2.js +0 -441
  532. package/dist/ui/commands-overlay.d.ts +0 -16
  533. package/dist/ui/commands-overlay.js +0 -439
  534. package/dist/ui/config-overlay.d.ts +0 -35
  535. package/dist/ui/config-overlay.js +0 -707
  536. package/dist/ui/docs-overlay.d.ts +0 -17
  537. package/dist/ui/docs-overlay.js +0 -303
  538. package/dist/ui/footer-v2.d.ts +0 -222
  539. package/dist/ui/footer-v2.js +0 -1349
  540. package/dist/ui/help-overlay-v2.d.ts +0 -34
  541. package/dist/ui/help-overlay-v2.js +0 -309
  542. package/dist/ui/help-overlay.d.ts +0 -16
  543. package/dist/ui/help-overlay.js +0 -316
  544. package/dist/ui/init-overlay-v2.d.ts +0 -34
  545. package/dist/ui/init-overlay-v2.js +0 -600
  546. package/dist/ui/init-overlay.d.ts +0 -34
  547. package/dist/ui/init-overlay.js +0 -604
  548. package/dist/ui/input-prompt-v2.d.ts +0 -180
  549. package/dist/ui/input-prompt-v2.js +0 -999
  550. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  551. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  552. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  553. package/dist/ui/keys-overlay-v2.js +0 -248
  554. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  555. package/dist/ui/mascot-overlay-v2.js +0 -138
  556. package/dist/ui/mascot-overlay.d.ts +0 -21
  557. package/dist/ui/mascot-overlay.js +0 -146
  558. package/dist/ui/model-overlay-v2.d.ts +0 -49
  559. package/dist/ui/model-overlay-v2.js +0 -118
  560. package/dist/ui/model-overlay.d.ts +0 -27
  561. package/dist/ui/model-overlay.js +0 -221
  562. package/dist/ui/model-warning-overlay.d.ts +0 -30
  563. package/dist/ui/model-warning-overlay.js +0 -169
  564. package/dist/ui/new-overlay.d.ts +0 -34
  565. package/dist/ui/new-overlay.js +0 -604
  566. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  567. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  568. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  569. package/dist/ui/overlay/overlay-types.js +0 -22
  570. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  571. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  572. package/dist/ui/overlays/index.d.ts +0 -11
  573. package/dist/ui/overlays/index.js +0 -11
  574. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  575. package/dist/ui/permission-overlay-v2.js +0 -380
  576. package/dist/ui/projects-overlay.d.ts +0 -19
  577. package/dist/ui/projects-overlay.js +0 -484
  578. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  579. package/dist/ui/theme-overlay-v2.js +0 -135
  580. package/dist/ui/theme-overlay.d.ts +0 -24
  581. package/dist/ui/theme-overlay.js +0 -127
  582. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  583. package/dist/ui/tools-overlay-v2.js +0 -218
  584. package/dist/ui/tools-overlay.d.ts +0 -34
  585. package/dist/ui/tools-overlay.js +0 -230
  586. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  587. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  588. package/dist/ui/tutorial-overlay.d.ts +0 -11
  589. package/dist/ui/tutorial-overlay.js +0 -1034
  590. package/dist/ui/workflow-overlay.d.ts +0 -22
  591. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,650 @@
1
+ /**
2
+ * Project Session Manager
3
+ *
4
+ * Manages per-project session persistence. Each project has its own
5
+ * session directory with terminal-scoped sessions and optional history.
6
+ *
7
+ * Directory structure:
8
+ * ~/.compilr-dev/sessions/
9
+ * ├── project-{id}/
10
+ * │ ├── current-{8hex}.json # Active session (terminal-scoped)
11
+ * │ └── history/ # Previous sessions (optional)
12
+ * │ └── {timestamp}.json
13
+ * └── global/
14
+ * └── current-{8hex}.json # Quick chat mode (no project)
15
+ */
16
+ import * as fs from 'fs';
17
+ import * as path from 'path';
18
+ import { getSessionsPath } from '../settings/paths.js';
19
+ import { truncatePlain as truncate } from '@compilr-dev/ui-core/utils';
20
+ import { getActiveTerminalSessionId } from '../multi-agent/session-registry.js';
21
+ import { getDb } from '../db/index.js';
22
+ import { getTeamCheckpointer } from '../multi-agent/checkpointer.js';
23
+ // =============================================================================
24
+ // Constants
25
+ // =============================================================================
26
+ const GLOBAL_SESSION_DIR = 'global';
27
+ const HISTORY_DIR = 'history';
28
+ /**
29
+ * Get the current session filename, scoped to this terminal.
30
+ * Requires an active terminal session ID.
31
+ */
32
+ function getCurrentSessionFilename() {
33
+ const sessionId = getActiveTerminalSessionId();
34
+ if (sessionId) {
35
+ return `current-${sessionId.slice(0, 8)}.json`;
36
+ }
37
+ // Shouldn't happen — terminal session is always registered at startup.
38
+ // Use a random prefix to avoid collisions if it somehow does.
39
+ const fallback = Math.random().toString(16).slice(2, 10);
40
+ return `current-${fallback}.json`;
41
+ }
42
+ // =============================================================================
43
+ // Project Session Manager
44
+ // =============================================================================
45
+ export class ProjectSessionManager {
46
+ sessionsPath;
47
+ constructor(sessionsPath) {
48
+ this.sessionsPath = sessionsPath ?? getSessionsPath();
49
+ }
50
+ // ---------------------------------------------------------------------------
51
+ // Path Helpers
52
+ // ---------------------------------------------------------------------------
53
+ /**
54
+ * Get the session directory for a project.
55
+ */
56
+ getProjectSessionDir(projectId) {
57
+ if (projectId === null) {
58
+ return path.join(this.sessionsPath, GLOBAL_SESSION_DIR);
59
+ }
60
+ return path.join(this.sessionsPath, `project-${String(projectId)}`);
61
+ }
62
+ /**
63
+ * Get the path to the current session file for a project.
64
+ * Uses terminal-scoped filename when multi-terminal is active.
65
+ */
66
+ getCurrentSessionPath(projectId) {
67
+ return path.join(this.getProjectSessionDir(projectId), getCurrentSessionFilename());
68
+ }
69
+ /**
70
+ * Get the path to the history directory for a project.
71
+ */
72
+ getHistoryDir(projectId) {
73
+ return path.join(this.getProjectSessionDir(projectId), HISTORY_DIR);
74
+ }
75
+ /**
76
+ * Ensure project session directory exists.
77
+ */
78
+ ensureProjectSessionDir(projectId) {
79
+ const dir = this.getProjectSessionDir(projectId);
80
+ if (!fs.existsSync(dir)) {
81
+ fs.mkdirSync(dir, { recursive: true });
82
+ }
83
+ }
84
+ // ---------------------------------------------------------------------------
85
+ // Save/Load Operations
86
+ // ---------------------------------------------------------------------------
87
+ /**
88
+ * Save a session for a project.
89
+ * Overwrites the current session file.
90
+ */
91
+ async saveProjectSession(projectId, projectName, state, workflowState) {
92
+ this.ensureProjectSessionDir(projectId);
93
+ const session = {
94
+ sessionId: state.sessionId,
95
+ projectId,
96
+ projectName,
97
+ messages: state.messages,
98
+ todos: state.todos,
99
+ turnCount: state.turnCount,
100
+ totalTokensUsed: state.totalTokensUsed,
101
+ workflowState,
102
+ createdAt: new Date().toISOString(),
103
+ updatedAt: new Date().toISOString(),
104
+ };
105
+ // Check if current session exists - preserve createdAt
106
+ const existingPath = this.getCurrentSessionPath(projectId);
107
+ if (fs.existsSync(existingPath)) {
108
+ try {
109
+ const existing = JSON.parse(fs.readFileSync(existingPath, 'utf-8'));
110
+ session.createdAt = existing.createdAt;
111
+ }
112
+ catch {
113
+ // Ignore parse errors
114
+ }
115
+ }
116
+ const content = JSON.stringify(session, null, 2);
117
+ await fs.promises.writeFile(existingPath, content, 'utf-8');
118
+ }
119
+ /**
120
+ * Load the current session for a project.
121
+ * Returns null if no session exists.
122
+ */
123
+ async loadProjectSession(projectId) {
124
+ const sessionPath = this.getCurrentSessionPath(projectId);
125
+ if (!fs.existsSync(sessionPath))
126
+ return null;
127
+ try {
128
+ const content = await fs.promises.readFile(sessionPath, 'utf-8');
129
+ return JSON.parse(content);
130
+ }
131
+ catch {
132
+ return null;
133
+ }
134
+ }
135
+ /**
136
+ * Load a specific terminal's session file by prefix.
137
+ * Used when resuming another terminal's session from the resume overlay.
138
+ */
139
+ async loadProjectSessionByPrefix(projectId, terminalPrefix) {
140
+ const dir = this.getProjectSessionDir(projectId);
141
+ const sessionPath = path.join(dir, `current-${terminalPrefix}.json`);
142
+ if (!fs.existsSync(sessionPath))
143
+ return null;
144
+ try {
145
+ const content = await fs.promises.readFile(sessionPath, 'utf-8');
146
+ return JSON.parse(content);
147
+ }
148
+ catch {
149
+ return null;
150
+ }
151
+ }
152
+ /**
153
+ * Delete a specific terminal's current session file.
154
+ */
155
+ async deleteSessionByPrefix(projectId, terminalPrefix) {
156
+ const dir = this.getProjectSessionDir(projectId);
157
+ const sessionPath = path.join(dir, `current-${terminalPrefix}.json`);
158
+ if (!fs.existsSync(sessionPath))
159
+ return false;
160
+ try {
161
+ await fs.promises.unlink(sessionPath);
162
+ return true;
163
+ }
164
+ catch {
165
+ return false;
166
+ }
167
+ }
168
+ /**
169
+ * Claim a session from another terminal by renaming its file to this terminal's prefix.
170
+ * This makes the session "owned" by the current terminal so other terminals won't see it
171
+ * as available.
172
+ */
173
+ claimSession(projectId, fromPrefix, toPrefix) {
174
+ const dir = this.getProjectSessionDir(projectId);
175
+ const fromPath = path.join(dir, `current-${fromPrefix}.json`);
176
+ const toPath = path.join(dir, `current-${toPrefix}.json`);
177
+ if (!fs.existsSync(fromPath))
178
+ return false;
179
+ try {
180
+ fs.renameSync(fromPath, toPath);
181
+ return true;
182
+ }
183
+ catch {
184
+ return false;
185
+ }
186
+ }
187
+ /**
188
+ * Check if a project has a current session for this terminal.
189
+ */
190
+ hasProjectSession(projectId) {
191
+ return fs.existsSync(this.getCurrentSessionPath(projectId));
192
+ }
193
+ /**
194
+ * Fast check: does the current project have a session modified within maxAge ms?
195
+ * Uses fs.statSync — O(1) instead of scanning all session directories.
196
+ */
197
+ hasRecentSessionFast(projectId, maxAgeMs = 24 * 60 * 60 * 1000) {
198
+ const sessionPath = this.getCurrentSessionPath(projectId);
199
+ try {
200
+ const stat = fs.statSync(sessionPath);
201
+ return Date.now() - stat.mtimeMs < maxAgeMs;
202
+ }
203
+ catch {
204
+ return false;
205
+ }
206
+ }
207
+ /**
208
+ * Archive the current session to history (before starting fresh).
209
+ */
210
+ async archiveCurrentSession(projectId) {
211
+ const currentPath = this.getCurrentSessionPath(projectId);
212
+ if (!fs.existsSync(currentPath)) {
213
+ return false;
214
+ }
215
+ try {
216
+ const historyDir = this.getHistoryDir(projectId);
217
+ fs.mkdirSync(historyDir, { recursive: true });
218
+ // Generate timestamp-based filename
219
+ const timestamp = new Date().toISOString().replace(/[:.]/g, '-');
220
+ const historyPath = path.join(historyDir, `${timestamp}.json`);
221
+ // Move current to history
222
+ await fs.promises.rename(currentPath, historyPath);
223
+ return true;
224
+ }
225
+ catch {
226
+ return false;
227
+ }
228
+ }
229
+ /**
230
+ * Delete the current session for a project.
231
+ */
232
+ async deleteCurrentSession(projectId) {
233
+ const currentPath = this.getCurrentSessionPath(projectId);
234
+ if (!fs.existsSync(currentPath)) {
235
+ return false;
236
+ }
237
+ try {
238
+ await fs.promises.unlink(currentPath);
239
+ return true;
240
+ }
241
+ catch {
242
+ return false;
243
+ }
244
+ }
245
+ // ---------------------------------------------------------------------------
246
+ // Listing Operations
247
+ // ---------------------------------------------------------------------------
248
+ /**
249
+ * List all sessions grouped by project.
250
+ */
251
+ async listAllSessions() {
252
+ const result = new Map();
253
+ if (!fs.existsSync(this.sessionsPath)) {
254
+ return result;
255
+ }
256
+ const entries = await fs.promises.readdir(this.sessionsPath, { withFileTypes: true });
257
+ for (const entry of entries) {
258
+ if (!entry.isDirectory())
259
+ continue;
260
+ let projectId = null;
261
+ if (entry.name === GLOBAL_SESSION_DIR) {
262
+ projectId = null;
263
+ }
264
+ else if (entry.name.startsWith('project-')) {
265
+ const idStr = entry.name.replace('project-', '');
266
+ projectId = parseInt(idStr, 10);
267
+ if (isNaN(projectId))
268
+ continue;
269
+ }
270
+ else {
271
+ continue;
272
+ }
273
+ const sessions = await this.listProjectSessions(projectId);
274
+ if (sessions.length > 0) {
275
+ result.set(projectId, sessions);
276
+ }
277
+ }
278
+ return result;
279
+ }
280
+ /**
281
+ * List sessions for a specific project (all current terminals + history).
282
+ */
283
+ async listProjectSessions(projectId) {
284
+ const sessions = [];
285
+ // Load ALL terminal-scoped current sessions (not just ours)
286
+ const currentSessions = await this.listAllCurrentSessions(projectId);
287
+ sessions.push(...currentSessions);
288
+ // Load history sessions
289
+ const historyDir = this.getHistoryDir(projectId);
290
+ if (fs.existsSync(historyDir)) {
291
+ const historyFiles = await fs.promises.readdir(historyDir);
292
+ for (const file of historyFiles) {
293
+ if (!file.endsWith('.json'))
294
+ continue;
295
+ try {
296
+ const content = await fs.promises.readFile(path.join(historyDir, file), 'utf-8');
297
+ const session = JSON.parse(content);
298
+ sessions.push(this.toSessionInfo(session, false));
299
+ }
300
+ catch {
301
+ // Skip invalid files
302
+ }
303
+ }
304
+ }
305
+ // Sort by updatedAt descending
306
+ sessions.sort((a, b) => new Date(b.updatedAt).getTime() - new Date(a.updatedAt).getTime());
307
+ return sessions;
308
+ }
309
+ /**
310
+ * Scan a project directory for ALL current-*.json files (not just this terminal's).
311
+ * Returns a ProjectSessionInfo for each one found.
312
+ */
313
+ async listAllCurrentSessions(projectId) {
314
+ const dir = this.getProjectSessionDir(projectId);
315
+ if (!fs.existsSync(dir))
316
+ return [];
317
+ const files = await fs.promises.readdir(dir);
318
+ const sessions = [];
319
+ for (const file of files) {
320
+ // Match current-{8hex}.json only (skip legacy current.json)
321
+ if (!/^current-[a-f0-9]{8}\.json$/.test(file))
322
+ continue;
323
+ try {
324
+ const content = await fs.promises.readFile(path.join(dir, file), 'utf-8');
325
+ const session = JSON.parse(content);
326
+ const terminalPrefix = this.extractTerminalPrefix(file);
327
+ sessions.push(this.toSessionInfo(session, true, terminalPrefix));
328
+ }
329
+ catch {
330
+ // Skip invalid files
331
+ }
332
+ }
333
+ return sessions;
334
+ }
335
+ /**
336
+ * Extract the 8-hex terminal prefix from a session filename.
337
+ */
338
+ extractTerminalPrefix(filename) {
339
+ const match = /^current-([a-f0-9]{8})\.json$/.exec(filename);
340
+ return match ? match[1] : null;
341
+ }
342
+ /**
343
+ * Look up terminal info (label, active status) from the terminal_sessions table.
344
+ * If the terminal has exited (row deleted), returns a fallback label from the prefix.
345
+ */
346
+ getTerminalInfo(prefix) {
347
+ try {
348
+ // Check for active terminal first
349
+ const row = getDb().prepare(`SELECT label, status FROM terminal_sessions WHERE id LIKE ? || '%' LIMIT 1`).get(prefix);
350
+ if (row) {
351
+ return {
352
+ label: row.label ?? `Terminal ${prefix.slice(0, 4)}`,
353
+ isActive: row.status === 'active',
354
+ };
355
+ }
356
+ }
357
+ catch {
358
+ // DB not available — fall through to fallback
359
+ }
360
+ // Terminal exited and row was deleted — generate fallback label
361
+ return { label: `Terminal ${prefix.slice(0, 4)}`, isActive: false };
362
+ }
363
+ /**
364
+ * Convert ProjectSession to ProjectSessionInfo.
365
+ */
366
+ toSessionInfo(session, isCurrent, terminalPrefix) {
367
+ // Extract preview from last actual user message (not tool_result)
368
+ let preview = '';
369
+ // Filter to only user messages that have actual text content (not tool_result)
370
+ const userTextMessages = session.messages.filter((m) => {
371
+ if (m.role !== 'user')
372
+ return false;
373
+ // String content is always user text
374
+ if (typeof m.content === 'string')
375
+ return true;
376
+ // Array content - check if it has text blocks (not just tool_result)
377
+ if (Array.isArray(m.content)) {
378
+ return m.content.some((b) => b.type === 'text');
379
+ }
380
+ return false;
381
+ });
382
+ if (userTextMessages.length > 0) {
383
+ const lastUserMsg = userTextMessages[userTextMessages.length - 1];
384
+ if (typeof lastUserMsg.content === 'string') {
385
+ preview = lastUserMsg.content;
386
+ }
387
+ else if (Array.isArray(lastUserMsg.content)) {
388
+ const textBlock = lastUserMsg.content.find((b) => b.type === 'text');
389
+ if (textBlock?.type === 'text') {
390
+ preview = textBlock.text;
391
+ }
392
+ }
393
+ }
394
+ // Truncate preview
395
+ const maxPreviewLen = 100;
396
+ if (preview.length > maxPreviewLen) {
397
+ preview = truncate(preview, maxPreviewLen);
398
+ }
399
+ // Sanitize preview (remove markdown, newlines)
400
+ preview = preview.replace(/^#+\s*/gm, '').replace(/\n/g, ' ').trim();
401
+ // Build session ID that preserves terminal identity
402
+ let sessionId;
403
+ if (isCurrent) {
404
+ const projectSuffix = session.projectId !== null ? String(session.projectId) : 'global';
405
+ sessionId = terminalPrefix
406
+ ? `current-${terminalPrefix}-${projectSuffix}`
407
+ : `current-${projectSuffix}`;
408
+ }
409
+ else {
410
+ sessionId = session.sessionId;
411
+ }
412
+ // Look up terminal info from DB if we have a prefix
413
+ let terminalLabel = null;
414
+ let isActiveTerminal = false;
415
+ if (terminalPrefix) {
416
+ const ownSessionId = getActiveTerminalSessionId();
417
+ const ownPrefix = ownSessionId ? ownSessionId.slice(0, 8) : null;
418
+ if (terminalPrefix === ownPrefix) {
419
+ // This is our own session — use our known label
420
+ isActiveTerminal = true;
421
+ try {
422
+ const row = getDb().prepare(`SELECT label FROM terminal_sessions WHERE id = ? LIMIT 1`).get(ownSessionId);
423
+ terminalLabel = row?.label ?? 'This terminal';
424
+ }
425
+ catch {
426
+ terminalLabel = 'This terminal';
427
+ }
428
+ }
429
+ else {
430
+ const info = this.getTerminalInfo(terminalPrefix);
431
+ terminalLabel = info.label;
432
+ isActiveTerminal = info.isActive;
433
+ }
434
+ }
435
+ // Look up team agent count from team file (if terminal-scoped)
436
+ let teamAgentCount = 0;
437
+ if (terminalPrefix) {
438
+ try {
439
+ teamAgentCount = getTeamCheckpointer().getTeamAgentCountByPrefix(session.projectId, terminalPrefix);
440
+ }
441
+ catch {
442
+ // Best effort
443
+ }
444
+ }
445
+ return {
446
+ sessionId,
447
+ createdAt: session.createdAt,
448
+ updatedAt: session.updatedAt,
449
+ messageCount: session.messages.length,
450
+ preview,
451
+ projectId: session.projectId,
452
+ projectName: session.projectName,
453
+ workflowMode: session.workflowState?.mode,
454
+ terminalPrefix: terminalPrefix ?? null,
455
+ terminalLabel,
456
+ isActiveTerminal,
457
+ teamAgentCount,
458
+ };
459
+ }
460
+ // ---------------------------------------------------------------------------
461
+ // Cleanup
462
+ // ---------------------------------------------------------------------------
463
+ /**
464
+ * Delete legacy (pre-multi-terminal) files from all project session directories.
465
+ * Removes: current.json, team.json, shared-context.json, agent-{id}.json (no 8-hex prefix).
466
+ * Call once at startup. Safe to call multiple times (no-op if no legacy files).
467
+ */
468
+ async cleanupLegacyFiles() {
469
+ if (!fs.existsSync(this.sessionsPath))
470
+ return 0;
471
+ let deleted = 0;
472
+ // Legacy file patterns (no 8-hex terminal prefix)
473
+ const isLegacyFile = (name) => {
474
+ if (name === 'current.json')
475
+ return true;
476
+ if (name === 'team.json')
477
+ return true;
478
+ if (name === 'shared-context.json')
479
+ return true;
480
+ // agent-{id}.json but NOT agent-{8hex}-{id}.json
481
+ if (name.startsWith('agent-') && name.endsWith('.json')) {
482
+ // New format: agent-{8hex}-{id}.json — has two dashes after "agent-"
483
+ const rest = name.slice('agent-'.length, -'.json'.length);
484
+ // If rest matches {8hex}-{anything}, it's new format → NOT legacy
485
+ if (/^[a-f0-9]{8}-.+$/.test(rest))
486
+ return false;
487
+ return true;
488
+ }
489
+ return false;
490
+ };
491
+ try {
492
+ const entries = await fs.promises.readdir(this.sessionsPath, { withFileTypes: true });
493
+ for (const entry of entries) {
494
+ if (!entry.isDirectory())
495
+ continue;
496
+ const dirPath = path.join(this.sessionsPath, entry.name);
497
+ try {
498
+ const files = await fs.promises.readdir(dirPath);
499
+ for (const file of files) {
500
+ if (isLegacyFile(file)) {
501
+ try {
502
+ await fs.promises.unlink(path.join(dirPath, file));
503
+ deleted++;
504
+ }
505
+ catch {
506
+ // Ignore individual file errors
507
+ }
508
+ }
509
+ }
510
+ }
511
+ catch {
512
+ // Ignore directory read errors
513
+ }
514
+ }
515
+ }
516
+ catch {
517
+ // Ignore top-level errors
518
+ }
519
+ return deleted;
520
+ }
521
+ /**
522
+ * Delete old history sessions beyond retention limit.
523
+ */
524
+ async cleanupHistory(projectId, maxHistoryCount = 10) {
525
+ const historyDir = this.getHistoryDir(projectId);
526
+ if (!fs.existsSync(historyDir)) {
527
+ return 0;
528
+ }
529
+ const files = await fs.promises.readdir(historyDir);
530
+ const jsonFiles = files.filter((f) => f.endsWith('.json'));
531
+ if (jsonFiles.length <= maxHistoryCount) {
532
+ return 0;
533
+ }
534
+ // Sort by filename (timestamp-based, oldest first)
535
+ jsonFiles.sort();
536
+ const toDelete = jsonFiles.slice(0, jsonFiles.length - maxHistoryCount);
537
+ let deleted = 0;
538
+ for (const file of toDelete) {
539
+ try {
540
+ await fs.promises.unlink(path.join(historyDir, file));
541
+ deleted++;
542
+ }
543
+ catch {
544
+ // Ignore errors
545
+ }
546
+ }
547
+ return deleted;
548
+ }
549
+ /**
550
+ * Clean up old sessions across all projects based on retention days.
551
+ * Only deletes history files — current sessions are always preserved.
552
+ * Returns count of deleted files.
553
+ */
554
+ async cleanupOldSessions(retentionDays) {
555
+ if (retentionDays <= 0)
556
+ return 0; // 0 = forever, no cleanup
557
+ if (!fs.existsSync(this.sessionsPath))
558
+ return 0;
559
+ const cutoffMs = Date.now() - (retentionDays * 24 * 60 * 60 * 1000);
560
+ let totalDeleted = 0;
561
+ try {
562
+ const entries = await fs.promises.readdir(this.sessionsPath, { withFileTypes: true });
563
+ for (const entry of entries) {
564
+ if (!entry.isDirectory())
565
+ continue;
566
+ const historyDir = path.join(this.sessionsPath, entry.name, HISTORY_DIR);
567
+ if (!fs.existsSync(historyDir))
568
+ continue;
569
+ try {
570
+ const files = await fs.promises.readdir(historyDir);
571
+ for (const file of files) {
572
+ if (!file.endsWith('.json'))
573
+ continue;
574
+ const filePath = path.join(historyDir, file);
575
+ try {
576
+ const stat = await fs.promises.stat(filePath);
577
+ if (stat.mtimeMs < cutoffMs) {
578
+ await fs.promises.unlink(filePath);
579
+ totalDeleted++;
580
+ }
581
+ }
582
+ catch {
583
+ // Skip individual file errors
584
+ }
585
+ }
586
+ }
587
+ catch {
588
+ // Skip directory read errors
589
+ }
590
+ }
591
+ }
592
+ catch {
593
+ // Best effort cleanup
594
+ }
595
+ return totalDeleted;
596
+ }
597
+ /**
598
+ * Delete all history files for a specific project.
599
+ * Optionally also deletes the current session.
600
+ * Returns count of deleted files.
601
+ */
602
+ async deleteProjectHistory(projectId, includeCurrentSession = false) {
603
+ let deleted = 0;
604
+ // Delete history files
605
+ const historyDir = this.getHistoryDir(projectId);
606
+ if (fs.existsSync(historyDir)) {
607
+ try {
608
+ const files = await fs.promises.readdir(historyDir);
609
+ for (const file of files) {
610
+ if (!file.endsWith('.json'))
611
+ continue;
612
+ try {
613
+ await fs.promises.unlink(path.join(historyDir, file));
614
+ deleted++;
615
+ }
616
+ catch {
617
+ // Skip individual file errors
618
+ }
619
+ }
620
+ }
621
+ catch {
622
+ // Best effort
623
+ }
624
+ }
625
+ // Optionally delete current session
626
+ if (includeCurrentSession) {
627
+ const currentPath = this.getCurrentSessionPath(projectId);
628
+ if (fs.existsSync(currentPath)) {
629
+ try {
630
+ await fs.promises.unlink(currentPath);
631
+ deleted++;
632
+ }
633
+ catch {
634
+ // Best effort
635
+ }
636
+ }
637
+ }
638
+ return deleted;
639
+ }
640
+ }
641
+ // =============================================================================
642
+ // Singleton Instance
643
+ // =============================================================================
644
+ let _instance = null;
645
+ export function getProjectSessionManager() {
646
+ if (!_instance) {
647
+ _instance = new ProjectSessionManager();
648
+ }
649
+ return _instance;
650
+ }