@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,224 @@
1
+ /**
2
+ * NotificationManager - Cross-session notifications
3
+ *
4
+ * Polls the shared session_notifications table so that events in one terminal
5
+ * (e.g. a background agent finishing, a pending approval request) are surfaced
6
+ * to other terminals working on the same project.
7
+ *
8
+ * Singleton pattern — same as SessionRegistry and FileLockManager.
9
+ */
10
+ import { EventEmitter } from 'events';
11
+ import { randomUUID } from 'crypto';
12
+ import { getDb } from '../db/index.js';
13
+ import { getActiveTerminalSessionId } from './session-registry.js';
14
+ // =============================================================================
15
+ // Constants
16
+ // =============================================================================
17
+ const POLL_INTERVAL_MS = 5_000; // 5 seconds
18
+ // =============================================================================
19
+ // Module-level singleton
20
+ // =============================================================================
21
+ let _notificationManager = null;
22
+ /**
23
+ * Get the current NotificationManager instance (null if not initialized)
24
+ */
25
+ export function getNotificationManager() {
26
+ return _notificationManager;
27
+ }
28
+ /**
29
+ * Initialize and return the NotificationManager singleton.
30
+ */
31
+ export function initNotificationManager() {
32
+ if (!_notificationManager) {
33
+ _notificationManager = new NotificationManager(getDb());
34
+ }
35
+ return _notificationManager;
36
+ }
37
+ // =============================================================================
38
+ // NotificationManager
39
+ // =============================================================================
40
+ export class NotificationManager extends EventEmitter {
41
+ db;
42
+ pollInterval = null;
43
+ lastKnownCount = 0;
44
+ constructor(db) {
45
+ super();
46
+ this.db = db;
47
+ }
48
+ /**
49
+ * Start polling for new notifications (5s interval, .unref()).
50
+ */
51
+ startPolling() {
52
+ if (this.pollInterval)
53
+ return;
54
+ // Initial count
55
+ this.lastKnownCount = this.getUnreadCount();
56
+ this.pollInterval = setInterval(() => {
57
+ this.checkForNewNotifications();
58
+ }, POLL_INTERVAL_MS);
59
+ this.pollInterval.unref();
60
+ }
61
+ /**
62
+ * Stop polling.
63
+ */
64
+ stopPolling() {
65
+ if (this.pollInterval) {
66
+ clearInterval(this.pollInterval);
67
+ this.pollInterval = null;
68
+ }
69
+ }
70
+ /**
71
+ * Insert a new notification into the shared DB.
72
+ * Returns the notification ID, or null on failure.
73
+ */
74
+ insert(options) {
75
+ try {
76
+ const id = randomUUID();
77
+ const payloadJson = options.payload ? JSON.stringify(options.payload) : null;
78
+ this.db.prepare(`
79
+ INSERT INTO session_notifications (id, project_id, from_session_id, to_session_id, type, title, message, payload_json)
80
+ VALUES (?, ?, ?, ?, ?, ?, ?, ?)
81
+ `).run(id, options.projectId, options.fromSessionId, options.toSessionId ?? null, options.type, options.title, options.message ?? null, payloadJson);
82
+ return id;
83
+ }
84
+ catch {
85
+ return null;
86
+ }
87
+ }
88
+ /**
89
+ * Get the count of unread notifications for this session.
90
+ * Lightweight COUNT(*) — used by the status bar poll.
91
+ */
92
+ getUnreadCount() {
93
+ const selfId = getActiveTerminalSessionId();
94
+ if (!selfId)
95
+ return 0;
96
+ try {
97
+ const row = this.db.prepare(`
98
+ SELECT COUNT(*) as count
99
+ FROM session_notifications n
100
+ WHERE n.from_session_id != ?
101
+ AND n.read_at IS NULL
102
+ AND n.project_id = (SELECT project_id FROM terminal_sessions WHERE id = ?)
103
+ AND (n.to_session_id IS NULL OR n.to_session_id = ?)
104
+ `).get(selfId, selfId, selfId);
105
+ return row.count;
106
+ }
107
+ catch {
108
+ return 0;
109
+ }
110
+ }
111
+ /**
112
+ * Get all unread notifications for this session (with sender label).
113
+ * Used by the overlay for full display.
114
+ */
115
+ getUnread() {
116
+ const selfId = getActiveTerminalSessionId();
117
+ if (!selfId)
118
+ return [];
119
+ try {
120
+ return this.db.prepare(`
121
+ SELECT n.*, ts.label as from_label
122
+ FROM session_notifications n
123
+ LEFT JOIN terminal_sessions ts ON ts.id = n.from_session_id
124
+ WHERE n.from_session_id != ?
125
+ AND n.read_at IS NULL
126
+ AND n.project_id = (SELECT project_id FROM terminal_sessions WHERE id = ?)
127
+ AND (n.to_session_id IS NULL OR n.to_session_id = ?)
128
+ ORDER BY n.created_at DESC
129
+ `).all(selfId, selfId, selfId);
130
+ }
131
+ catch {
132
+ return [];
133
+ }
134
+ }
135
+ /**
136
+ * Mark a single notification as read.
137
+ */
138
+ markRead(notificationId) {
139
+ try {
140
+ this.db.prepare(`UPDATE session_notifications SET read_at = CURRENT_TIMESTAMP WHERE id = ?`).run(notificationId);
141
+ this.emitCountChange();
142
+ }
143
+ catch {
144
+ // Best effort
145
+ }
146
+ }
147
+ /**
148
+ * Mark all unread notifications for this session as read.
149
+ */
150
+ markAllRead() {
151
+ const selfId = getActiveTerminalSessionId();
152
+ if (!selfId)
153
+ return;
154
+ try {
155
+ this.db.prepare(`
156
+ UPDATE session_notifications SET read_at = CURRENT_TIMESTAMP
157
+ WHERE from_session_id != ?
158
+ AND read_at IS NULL
159
+ AND project_id = (SELECT project_id FROM terminal_sessions WHERE id = ?)
160
+ AND (to_session_id IS NULL OR to_session_id = ?)
161
+ `).run(selfId, selfId, selfId);
162
+ this.emitCountChange();
163
+ }
164
+ catch {
165
+ // Best effort
166
+ }
167
+ }
168
+ /**
169
+ * Clean up old notifications:
170
+ * - Delete read notifications older than 1 hour
171
+ * - Delete orphaned notifications (sender session gone, CASCADE missed)
172
+ */
173
+ cleanup() {
174
+ try {
175
+ // Delete read notifications older than 1 hour
176
+ this.db.prepare(`
177
+ DELETE FROM session_notifications
178
+ WHERE read_at IS NOT NULL
179
+ AND read_at < datetime('now', '-1 hour')
180
+ `).run();
181
+ // Delete unread notifications older than 24 hours (stale)
182
+ this.db.prepare(`
183
+ DELETE FROM session_notifications
184
+ WHERE created_at < datetime('now', '-24 hours')
185
+ `).run();
186
+ }
187
+ catch {
188
+ // Best effort
189
+ }
190
+ }
191
+ // ---------------------------------------------------------------------------
192
+ // Private
193
+ // ---------------------------------------------------------------------------
194
+ /**
195
+ * Poll for new notifications and emit 'count-changed' on delta.
196
+ */
197
+ checkForNewNotifications() {
198
+ try {
199
+ const currentCount = this.getUnreadCount();
200
+ if (currentCount !== this.lastKnownCount) {
201
+ this.lastKnownCount = currentCount;
202
+ this.emit('count-changed', currentCount);
203
+ }
204
+ }
205
+ catch {
206
+ // Best effort
207
+ }
208
+ }
209
+ /**
210
+ * Re-check count and emit if changed (after mark operations).
211
+ */
212
+ emitCountChange() {
213
+ try {
214
+ const currentCount = this.getUnreadCount();
215
+ if (currentCount !== this.lastKnownCount) {
216
+ this.lastKnownCount = currentCount;
217
+ this.emit('count-changed', currentCount);
218
+ }
219
+ }
220
+ catch {
221
+ // Best effort
222
+ }
223
+ }
224
+ }
@@ -0,0 +1,122 @@
1
+ /**
2
+ * Pending Requests Manager (Phase 3b - Background Agents)
3
+ *
4
+ * Manages a queue of requests from background agents that need user input.
5
+ * Background agents can enqueue permission requests or questions, and the
6
+ * user can respond when convenient without blocking foreground work.
7
+ */
8
+ import { EventEmitter } from 'events';
9
+ export type PendingRequestType = 'permission' | 'question';
10
+ export interface PendingRequest {
11
+ /** Unique request ID */
12
+ id: string;
13
+ /** Agent that made the request */
14
+ agentId: string;
15
+ /** Agent's mascot for display */
16
+ mascot: string;
17
+ /** Type of request */
18
+ type: PendingRequestType;
19
+ /** The prompt/question to show user */
20
+ prompt: string;
21
+ /** Available options (for questions) */
22
+ options?: string[];
23
+ /** When the request was created */
24
+ createdAt: Date;
25
+ /** Additional context (e.g., file path for permission, tool name) */
26
+ context?: Record<string, unknown>;
27
+ /** Resolve function - called when user responds */
28
+ resolve: (response: PendingRequestResponse) => void;
29
+ /** Reject function - called if request is cancelled */
30
+ reject: (error: Error) => void;
31
+ }
32
+ export interface PendingRequestResponse {
33
+ /** Whether the request was approved (for permissions) or answered (for questions) */
34
+ approved: boolean;
35
+ /** The selected option (for questions with options) */
36
+ selectedOption?: string;
37
+ /** Free-form response text */
38
+ responseText?: string;
39
+ /** Full overlay result (for question-type requests that use standard overlays) */
40
+ overlayResult?: unknown;
41
+ }
42
+ export interface EnqueueOptions {
43
+ agentId: string;
44
+ mascot: string;
45
+ type: PendingRequestType;
46
+ prompt: string;
47
+ options?: string[];
48
+ context?: Record<string, unknown>;
49
+ }
50
+ export interface PendingRequestsEvents {
51
+ /** Emitted when a new request is added */
52
+ 'request-added': (request: PendingRequest) => void;
53
+ /** Emitted when a request is resolved */
54
+ 'request-resolved': (requestId: string, response: PendingRequestResponse) => void;
55
+ /** Emitted when a request is rejected/cancelled */
56
+ 'request-rejected': (requestId: string, error: Error) => void;
57
+ /** Emitted when the pending count changes */
58
+ 'count-changed': (count: number) => void;
59
+ }
60
+ export declare class PendingRequestsManager extends EventEmitter {
61
+ private readonly requests;
62
+ /**
63
+ * Enqueue a request from a background agent.
64
+ * Returns a promise that resolves when the user responds.
65
+ *
66
+ * @param options - Request options
67
+ * @returns Promise that resolves with the user's response
68
+ */
69
+ enqueue(options: EnqueueOptions): Promise<PendingRequestResponse>;
70
+ /**
71
+ * Get the number of pending requests.
72
+ */
73
+ getCount(): number;
74
+ /**
75
+ * Get all pending requests (for overlay display).
76
+ */
77
+ getAll(): PendingRequest[];
78
+ /**
79
+ * Get a specific request by ID.
80
+ */
81
+ get(id: string): PendingRequest | undefined;
82
+ /**
83
+ * Get requests for a specific agent.
84
+ */
85
+ getByAgent(agentId: string): PendingRequest[];
86
+ /**
87
+ * Respond to a pending request (approve/answer).
88
+ * This resolves the promise returned by enqueue().
89
+ *
90
+ * @param id - Request ID
91
+ * @param response - User's response
92
+ */
93
+ respond(id: string, response: PendingRequestResponse): boolean;
94
+ /**
95
+ * Reject/cancel a pending request.
96
+ * This rejects the promise returned by enqueue().
97
+ *
98
+ * @param id - Request ID
99
+ * @param reason - Rejection reason
100
+ */
101
+ reject(id: string, reason?: string): boolean;
102
+ /**
103
+ * Reject all requests for a specific agent.
104
+ * Called when an agent is killed/cancelled.
105
+ *
106
+ * @param agentId - Agent ID
107
+ * @param reason - Rejection reason
108
+ */
109
+ rejectAllForAgent(agentId: string, reason?: string): number;
110
+ /**
111
+ * Clear all pending requests.
112
+ */
113
+ clear(): void;
114
+ }
115
+ /**
116
+ * Get the singleton PendingRequestsManager instance.
117
+ */
118
+ export declare function getPendingRequestsManager(): PendingRequestsManager;
119
+ /**
120
+ * Reset the singleton (for testing).
121
+ */
122
+ export declare function resetPendingRequestsManager(): void;
@@ -0,0 +1,155 @@
1
+ /**
2
+ * Pending Requests Manager (Phase 3b - Background Agents)
3
+ *
4
+ * Manages a queue of requests from background agents that need user input.
5
+ * Background agents can enqueue permission requests or questions, and the
6
+ * user can respond when convenient without blocking foreground work.
7
+ */
8
+ import { EventEmitter } from 'events';
9
+ import { randomUUID } from 'crypto';
10
+ // =============================================================================
11
+ // Manager Class
12
+ // =============================================================================
13
+ export class PendingRequestsManager extends EventEmitter {
14
+ requests = new Map();
15
+ /**
16
+ * Enqueue a request from a background agent.
17
+ * Returns a promise that resolves when the user responds.
18
+ *
19
+ * @param options - Request options
20
+ * @returns Promise that resolves with the user's response
21
+ */
22
+ enqueue(options) {
23
+ return new Promise((resolve, reject) => {
24
+ const request = {
25
+ id: randomUUID(),
26
+ agentId: options.agentId,
27
+ mascot: options.mascot,
28
+ type: options.type,
29
+ prompt: options.prompt,
30
+ options: options.options,
31
+ context: options.context,
32
+ createdAt: new Date(),
33
+ resolve,
34
+ reject,
35
+ };
36
+ this.requests.set(request.id, request);
37
+ this.emit('request-added', request);
38
+ this.emit('count-changed', this.requests.size);
39
+ });
40
+ }
41
+ /**
42
+ * Get the number of pending requests.
43
+ */
44
+ getCount() {
45
+ return this.requests.size;
46
+ }
47
+ /**
48
+ * Get all pending requests (for overlay display).
49
+ */
50
+ getAll() {
51
+ return Array.from(this.requests.values()).sort((a, b) => a.createdAt.getTime() - b.createdAt.getTime());
52
+ }
53
+ /**
54
+ * Get a specific request by ID.
55
+ */
56
+ get(id) {
57
+ return this.requests.get(id);
58
+ }
59
+ /**
60
+ * Get requests for a specific agent.
61
+ */
62
+ getByAgent(agentId) {
63
+ return this.getAll().filter(r => r.agentId === agentId);
64
+ }
65
+ /**
66
+ * Respond to a pending request (approve/answer).
67
+ * This resolves the promise returned by enqueue().
68
+ *
69
+ * @param id - Request ID
70
+ * @param response - User's response
71
+ */
72
+ respond(id, response) {
73
+ const request = this.requests.get(id);
74
+ if (!request) {
75
+ return false;
76
+ }
77
+ // Remove from queue
78
+ this.requests.delete(id);
79
+ // Resolve the promise
80
+ request.resolve(response);
81
+ // Emit events
82
+ this.emit('request-resolved', id, response);
83
+ this.emit('count-changed', this.requests.size);
84
+ return true;
85
+ }
86
+ /**
87
+ * Reject/cancel a pending request.
88
+ * This rejects the promise returned by enqueue().
89
+ *
90
+ * @param id - Request ID
91
+ * @param reason - Rejection reason
92
+ */
93
+ reject(id, reason = 'Request cancelled') {
94
+ const request = this.requests.get(id);
95
+ if (!request) {
96
+ return false;
97
+ }
98
+ // Remove from queue
99
+ this.requests.delete(id);
100
+ // Reject the promise
101
+ const error = new Error(reason);
102
+ request.reject(error);
103
+ // Emit events
104
+ this.emit('request-rejected', id, error);
105
+ this.emit('count-changed', this.requests.size);
106
+ return true;
107
+ }
108
+ /**
109
+ * Reject all requests for a specific agent.
110
+ * Called when an agent is killed/cancelled.
111
+ *
112
+ * @param agentId - Agent ID
113
+ * @param reason - Rejection reason
114
+ */
115
+ rejectAllForAgent(agentId, reason = 'Agent cancelled') {
116
+ const agentRequests = this.getByAgent(agentId);
117
+ for (const request of agentRequests) {
118
+ this.reject(request.id, reason);
119
+ }
120
+ return agentRequests.length;
121
+ }
122
+ /**
123
+ * Clear all pending requests.
124
+ */
125
+ clear() {
126
+ for (const request of this.requests.values()) {
127
+ request.reject(new Error('All requests cleared'));
128
+ }
129
+ this.requests.clear();
130
+ this.emit('count-changed', 0);
131
+ }
132
+ }
133
+ // =============================================================================
134
+ // Singleton Instance
135
+ // =============================================================================
136
+ let instance = null;
137
+ /**
138
+ * Get the singleton PendingRequestsManager instance.
139
+ */
140
+ export function getPendingRequestsManager() {
141
+ if (!instance) {
142
+ instance = new PendingRequestsManager();
143
+ }
144
+ return instance;
145
+ }
146
+ /**
147
+ * Reset the singleton (for testing).
148
+ */
149
+ export function resetPendingRequestsManager() {
150
+ if (instance) {
151
+ instance.clear();
152
+ instance.removeAllListeners();
153
+ }
154
+ instance = null;
155
+ }
@@ -0,0 +1,139 @@
1
+ /**
2
+ * SessionRegistry - Multi-terminal session awareness
3
+ *
4
+ * Manages this terminal's session lifecycle in a shared SQLite table.
5
+ * Each CLI instance registers on startup, heartbeats periodically,
6
+ * and unregisters on shutdown. Other instances can query active sessions.
7
+ *
8
+ * Uses the shared projects.db with WAL mode for concurrent access.
9
+ */
10
+ import type Database from 'better-sqlite3';
11
+ import { type TerminalSessionRecord } from '../db/index.js';
12
+ export interface AgentDescriptor {
13
+ id: string;
14
+ displayName: string;
15
+ mascot: string;
16
+ }
17
+ /**
18
+ * Get the current SessionRegistry instance (null if not initialized)
19
+ */
20
+ export declare function getSessionRegistry(): SessionRegistry | null;
21
+ /**
22
+ * Initialize and return the SessionRegistry singleton.
23
+ * @param sessionsBasePath - Optional base path for session files (e.g., ~/.compilr-dev/sessions).
24
+ * Used for session file cleanup when terminals unregister.
25
+ */
26
+ export declare function initSessionRegistry(sessionsBasePath?: string): SessionRegistry;
27
+ /**
28
+ * Get the active terminal session ID for this process
29
+ */
30
+ export declare function getActiveTerminalSessionId(): string | null;
31
+ /**
32
+ * Set the active terminal session ID for this process
33
+ */
34
+ export declare function setActiveTerminalSessionId(id: string | null): void;
35
+ export declare class SessionRegistry {
36
+ private sessionId;
37
+ private currentProjectId;
38
+ private heartbeatInterval;
39
+ private countCheckInterval;
40
+ private readonly db;
41
+ private readonly sessionsBasePath;
42
+ private lastKnownCount;
43
+ private onCountChangeCallback;
44
+ constructor(db: Database.Database, sessionsBasePath?: string);
45
+ /**
46
+ * Set a callback invoked when the active session count changes.
47
+ * Used by the footer to trigger a re-render when terminals join/leave.
48
+ */
49
+ onCountChange(callback: (count: number) => void): void;
50
+ /**
51
+ * Register this terminal in the session registry.
52
+ * Cleans up stale sessions, then inserts a new row.
53
+ * Returns the session ID.
54
+ */
55
+ register(projectId: number | null, label?: string): string;
56
+ /**
57
+ * Unregister this terminal from the session registry.
58
+ * Stops heartbeat and deletes the row.
59
+ */
60
+ unregister(): void;
61
+ /**
62
+ * Update the agent roster for this terminal session
63
+ */
64
+ updateAgents(agents: AgentDescriptor[]): void;
65
+ /**
66
+ * Set the currently active agent for this terminal session
67
+ */
68
+ setActiveAgent(agentId: string): void;
69
+ /**
70
+ * Get the project-scoped active session count.
71
+ * Returns the count scoped to this terminal's current project,
72
+ * or global count if no project is set.
73
+ * Used by footer rendering to show the correct terminal count.
74
+ */
75
+ getProjectScopedSessionCount(): number;
76
+ /**
77
+ * Update the project ID for this terminal session.
78
+ * Called when the user switches projects.
79
+ * Triggers an immediate count re-check for the new project scope.
80
+ */
81
+ updateProjectId(projectId: number | null): void;
82
+ /**
83
+ * Get all active sessions, optionally filtered by project.
84
+ * Pass undefined to get all sessions regardless of project.
85
+ */
86
+ getActiveSessions(projectId?: number | null): TerminalSessionRecord[];
87
+ /**
88
+ * Get the count of active sessions, optionally filtered by project.
89
+ * Pass undefined to count all sessions.
90
+ */
91
+ getActiveSessionCount(projectId?: number | null): number;
92
+ /**
93
+ * Clean up stale and dead sessions.
94
+ * A session is stale if its last heartbeat is older than the threshold.
95
+ * A session is dead if its PID no longer exists.
96
+ * Returns the count of sessions cleaned.
97
+ */
98
+ cleanupStale(): number;
99
+ /**
100
+ * Get all agent IDs in use by other terminals (excluding self).
101
+ * Optionally filtered to the same project.
102
+ * Used for cross-terminal collision detection.
103
+ */
104
+ getGlobalAgentIds(projectId?: number | null): string[];
105
+ /**
106
+ * Clean up orphaned session files for all stale sessions.
107
+ * Scans project directories under sessionsBasePath for terminal-scoped files
108
+ * whose session prefix is not in the active set.
109
+ * Returns the count of files cleaned.
110
+ */
111
+ cleanupSessionFiles(): number;
112
+ /**
113
+ * Clean up transient session files for a specific session prefix in all project directories.
114
+ * Preserves current-{prefix}.json files so they remain available for /resume.
115
+ */
116
+ private cleanupSessionFilesForPrefix;
117
+ /**
118
+ * Clean up orphaned transient session files in a single project directory.
119
+ * Preserves current-*.json files so they remain available for /resume.
120
+ * Returns count of files removed.
121
+ */
122
+ private cleanupOrphanFilesInDir;
123
+ /**
124
+ * Send a heartbeat (update last_heartbeat timestamp).
125
+ * Also opportunistically clean up stale sessions.
126
+ */
127
+ private heartbeat;
128
+ /**
129
+ * Check if the active session count changed and notify listener.
130
+ * Runs on a 5s interval — lightweight SELECT COUNT query.
131
+ * Scoped to current project for project-aware terminal count.
132
+ */
133
+ private checkCountChange;
134
+ /**
135
+ * Generate a label like "Terminal 1", "Terminal 2" using the next available number.
136
+ * Avoids duplicates by checking which numbers are already in use.
137
+ */
138
+ private generateLabel;
139
+ }