@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,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
+ }