@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,51 @@
1
+ /**
2
+ * Pending Requests Overlay V2
3
+ *
4
+ * Modal overlay for viewing and responding to pending requests from background agents.
5
+ * Users can approve, deny, or view details of each request.
6
+ *
7
+ * Phase 3b: Background Agents
8
+ */
9
+ import { BaseOverlayV2 } from '../../base/index.js';
10
+ import type { RenderContext, OverlayAction, KeyEvent } from '../index.js';
11
+ import { type PendingRequest } from '../../../multi-agent/index.js';
12
+ export type PendingOverlayResult = {
13
+ type: 'closed';
14
+ } | {
15
+ type: 'respond';
16
+ request: PendingRequest;
17
+ };
18
+ interface PendingOverlayState {
19
+ /** Currently selected request index */
20
+ selectedIndex: number;
21
+ /** Requests snapshot at render time */
22
+ requests: PendingRequest[];
23
+ /** Whether we're showing a diff detail view */
24
+ showingDiff: boolean;
25
+ /** Scroll offset in diff view */
26
+ diffScrollOffset: number;
27
+ /** Pre-rendered diff lines (colored) */
28
+ diffLines: string[];
29
+ /** Which request the diff is for */
30
+ diffRequestId: string;
31
+ }
32
+ export declare class PendingOverlayV2 extends BaseOverlayV2<PendingOverlayState, PendingOverlayResult> {
33
+ readonly type: "inline";
34
+ readonly id = "pending-overlay-v2";
35
+ /** Active VS Code diff watchers, keyed by pending request ID */
36
+ private readonly vsDiffWatchers;
37
+ constructor();
38
+ protected renderContent(context: RenderContext): string[];
39
+ private renderListView;
40
+ private renderDiffView;
41
+ handleKey(key: KeyEvent): OverlayAction<PendingOverlayResult>;
42
+ private handleListKey;
43
+ /**
44
+ * Cancel an active VS Code diff for a pending request (if any).
45
+ * Called when the request is resolved from the terminal.
46
+ */
47
+ private cancelVSDiffForRequest;
48
+ private handleDiffKey;
49
+ getCloseSummary(result: PendingOverlayResult): string | null;
50
+ }
51
+ export {};
@@ -0,0 +1,445 @@
1
+ /**
2
+ * Pending Requests Overlay V2
3
+ *
4
+ * Modal overlay for viewing and responding to pending requests from background agents.
5
+ * Users can approve, deny, or view details of each request.
6
+ *
7
+ * Phase 3b: Background Agents
8
+ */
9
+ import chalk from 'chalk';
10
+ import { getStyles } from '../../../themes/index.js';
11
+ import { BaseOverlayV2, truncate } from '../../base/index.js';
12
+ import * as terminal from '../../terminal.js';
13
+ import * as diff from '../../diff.js';
14
+ import { isVSDiffAvailable } from '../../../utils/vscode-detect.js';
15
+ import { openVSCodeDiffForTool, cancelDiffRequest, waitForDiffResponse, } from '../../vscode-diff-ipc.js';
16
+ import { getPendingRequestsManager, } from '../../../multi-agent/index.js';
17
+ // Fixed height for diff view content area
18
+ const DIFF_VIEW_CONTENT_LINES = 15;
19
+ // Tool names that support diff viewing
20
+ const DIFFABLE_TOOLS = new Set(['edit', 'write_file', 'write']);
21
+ // =============================================================================
22
+ // Helpers
23
+ // =============================================================================
24
+ /**
25
+ * Check if a pending request has a diffable tool
26
+ */
27
+ function isDiffableRequest(req) {
28
+ if (req.type !== 'permission' || !req.context)
29
+ return false;
30
+ const ctx = req.context;
31
+ return typeof ctx.toolName === 'string' && DIFFABLE_TOOLS.has(ctx.toolName);
32
+ }
33
+ /**
34
+ * Generate diff lines for a pending request.
35
+ * Returns an array of formatted lines, or null if diff can't be generated.
36
+ */
37
+ function generateDiffForRequest(req) {
38
+ if (!req.context)
39
+ return null;
40
+ const ctx = req.context;
41
+ if (!ctx.toolName || !ctx.input)
42
+ return null;
43
+ const s = getStyles();
44
+ const toolName = ctx.toolName;
45
+ const input = ctx.input;
46
+ if (toolName === 'edit') {
47
+ const filePath = (input.filePath ?? input.file_path ?? input.path ?? '');
48
+ const oldText = (input.oldString ?? input.old_string ?? input.old_text ?? '');
49
+ const newText = (input.newString ?? input.new_string ?? input.new_text ?? '');
50
+ const replaceAll = Boolean(input.replaceAll ?? input.replace_all);
51
+ if (!filePath || !oldText)
52
+ return null;
53
+ const editDiff = diff.generateEditDiff(filePath, oldText, newText, replaceAll);
54
+ if (!editDiff) {
55
+ // Fallback: show raw old/new text
56
+ const lines = [];
57
+ lines.push(s.primary(`File: ${filePath}`));
58
+ lines.push('');
59
+ lines.push(s.muted('Could not read file to generate diff.'));
60
+ lines.push('');
61
+ lines.push(s.muted('Old text:'));
62
+ for (const line of oldText.split('\n').slice(0, 20)) {
63
+ lines.push(' ' + line);
64
+ }
65
+ lines.push('');
66
+ lines.push(s.muted('New text:'));
67
+ for (const line of newText.split('\n').slice(0, 20)) {
68
+ lines.push(' ' + line);
69
+ }
70
+ return lines;
71
+ }
72
+ const header = diff.formatDiffHeader(filePath, editDiff.additions, editDiff.removals);
73
+ return [header, '', ...editDiff.lines];
74
+ }
75
+ if (toolName === 'write_file' || toolName === 'write') {
76
+ const filePath = (input.path ?? input.file_path ?? input.filePath ?? '');
77
+ const content = (input.content ?? '');
78
+ if (!filePath || !content)
79
+ return null;
80
+ const writeDiff = diff.generateWriteDiff(filePath, content, true);
81
+ const header = diff.formatWriteHeader(filePath, writeDiff.additions, true);
82
+ return [header, '', ...writeDiff.lines];
83
+ }
84
+ return null;
85
+ }
86
+ // =============================================================================
87
+ // Pending Overlay V2 Class
88
+ // =============================================================================
89
+ export class PendingOverlayV2 extends BaseOverlayV2 {
90
+ type = 'inline';
91
+ id = 'pending-overlay-v2';
92
+ /** Active VS Code diff watchers, keyed by pending request ID */
93
+ vsDiffWatchers = new Map();
94
+ constructor() {
95
+ const manager = getPendingRequestsManager();
96
+ const requests = manager.getAll();
97
+ super({
98
+ selectedIndex: 0,
99
+ requests,
100
+ showingDiff: false,
101
+ diffScrollOffset: 0,
102
+ diffLines: [],
103
+ diffRequestId: '',
104
+ });
105
+ // Set minimum height for stable rendering
106
+ this.minHeight = 10;
107
+ }
108
+ renderContent(context) {
109
+ if (this.state.showingDiff) {
110
+ return this.renderDiffView(context);
111
+ }
112
+ return this.renderListView(context);
113
+ }
114
+ renderListView(context) {
115
+ const s = context.styles;
116
+ const lines = [];
117
+ const cols = terminal.getTerminalWidth();
118
+ const border = s.muted('─'.repeat(Math.max(1, cols - 1)));
119
+ // Refresh requests each render
120
+ const manager = getPendingRequestsManager();
121
+ this.state.requests = manager.getAll();
122
+ // Header
123
+ lines.push(border);
124
+ lines.push(' ' + chalk.bold('Pending Requests') + s.muted(` (${String(this.state.requests.length)} total)`));
125
+ lines.push(border);
126
+ lines.push('');
127
+ if (this.state.requests.length === 0) {
128
+ lines.push(s.muted(' No pending requests from background agents.'));
129
+ lines.push('');
130
+ }
131
+ else {
132
+ // Render each request
133
+ for (let i = 0; i < this.state.requests.length; i++) {
134
+ const req = this.state.requests[i];
135
+ const isSelected = i === this.state.selectedIndex;
136
+ const prefix = isSelected ? ' ❯ ' : ' ';
137
+ // Request header: [mascot] agent: prompt
138
+ const header = `${req.mascot} $${req.agentId}: ${req.prompt}`;
139
+ const maxHeaderLen = cols - 6;
140
+ const truncHeader = truncate(header, maxHeaderLen);
141
+ if (isSelected) {
142
+ lines.push(s.primary(prefix + `${String(i + 1)}. ${truncHeader}`));
143
+ }
144
+ else {
145
+ lines.push(s.muted(prefix + `${String(i + 1)}. ${truncHeader}`));
146
+ }
147
+ // Type indicator
148
+ const typeLabel = req.type === 'permission' ? 'Permission request' : 'Question';
149
+ lines.push(s.muted(` Type: ${typeLabel}`));
150
+ // Actions line (only for selected)
151
+ if (isSelected) {
152
+ if (req.type === 'question') {
153
+ lines.push(s.info(' [r]espond · [d]eny/skip'));
154
+ }
155
+ else if (isDiffableRequest(req)) {
156
+ lines.push(s.info(' [a]pprove [d]eny [v] diff'));
157
+ }
158
+ else {
159
+ lines.push(s.info(' [a]pprove [d]eny'));
160
+ }
161
+ }
162
+ else {
163
+ lines.push('');
164
+ }
165
+ lines.push('');
166
+ }
167
+ }
168
+ // Footer
169
+ lines.push(border);
170
+ if (this.state.requests.length > 0) {
171
+ // Check if selected request is a question
172
+ const selectedReq = this.state.requests[this.state.selectedIndex];
173
+ if (selectedReq && selectedReq.type === 'question') {
174
+ lines.push(s.muted(' ↑↓ Navigate · r/Enter Respond · d Deny/Skip · Esc Close'));
175
+ }
176
+ else if (selectedReq && isDiffableRequest(selectedReq)) {
177
+ lines.push(s.muted(' ↑↓ Navigate · a Approve · d Deny · v View diff · Esc Close'));
178
+ }
179
+ else {
180
+ lines.push(s.muted(' ↑↓ Navigate · a Approve · d Deny · Esc Close'));
181
+ }
182
+ }
183
+ else {
184
+ lines.push(s.muted(' Esc Close'));
185
+ }
186
+ return lines;
187
+ }
188
+ renderDiffView(context) {
189
+ const s = context.styles;
190
+ const cols = terminal.getTerminalWidth();
191
+ const lines = [];
192
+ const border = s.muted('─'.repeat(Math.max(1, cols - 1)));
193
+ // Refresh requests each render
194
+ const manager = getPendingRequestsManager();
195
+ this.state.requests = manager.getAll();
196
+ // Find the request this diff is for (may have been resolved externally via VS Code)
197
+ const req = this.state.requests.find(r => r.id === this.state.diffRequestId);
198
+ if (!req) {
199
+ // Request was resolved externally — return to list view
200
+ this.state.showingDiff = false;
201
+ return this.renderListView(context);
202
+ }
203
+ const agentLabel = `$${req.agentId}`;
204
+ const ctx = req.context;
205
+ const filePath = ctx?.input
206
+ ? (ctx.input.filePath ?? ctx.input.file_path ?? ctx.input.path ?? '')
207
+ : '';
208
+ const fileName = filePath.split('/').pop() || filePath;
209
+ // Header
210
+ lines.push(border);
211
+ lines.push(' ' + chalk.bold('Diff: ') + s.primary(fileName) + s.muted(agentLabel ? ` (${agentLabel})` : ''));
212
+ lines.push(border);
213
+ lines.push('');
214
+ // Content with scroll
215
+ const contentLines = this.state.diffLines;
216
+ const visibleLines = DIFF_VIEW_CONTENT_LINES;
217
+ const endLine = Math.min(this.state.diffScrollOffset + visibleLines, contentLines.length);
218
+ for (let i = this.state.diffScrollOffset; i < endLine; i++) {
219
+ const line = contentLines[i];
220
+ const safeLine = truncate(line, cols - 2);
221
+ lines.push(' ' + safeLine);
222
+ }
223
+ // Pad to fixed height
224
+ const renderedLines = endLine - this.state.diffScrollOffset;
225
+ for (let i = renderedLines; i < DIFF_VIEW_CONTENT_LINES; i++) {
226
+ lines.push('');
227
+ }
228
+ // Footer with scroll indicator
229
+ lines.push('');
230
+ const scrollInfo = contentLines.length > visibleLines
231
+ ? s.muted(` [${String(this.state.diffScrollOffset + 1)}-${String(endLine)}/${String(contentLines.length)}]`)
232
+ : '';
233
+ lines.push(border);
234
+ lines.push(s.muted(' ↑↓/PgUp/PgDn Scroll · a Approve · d Deny · Esc Back') + scrollInfo);
235
+ return lines;
236
+ }
237
+ handleKey(key) {
238
+ if (this.state.showingDiff) {
239
+ return this.handleDiffKey(key);
240
+ }
241
+ return this.handleListKey(key);
242
+ }
243
+ handleListKey(key) {
244
+ // Escape or Ctrl+C = close
245
+ if (key.name === 'escape' || (key.ctrl && key.name === 'c')) {
246
+ // Cancel all active VS Code diff watchers
247
+ for (const [, watcher] of this.vsDiffWatchers) {
248
+ watcher.abort();
249
+ cancelDiffRequest(watcher.diffReqId);
250
+ }
251
+ this.vsDiffWatchers.clear();
252
+ return this.close({ type: 'closed' });
253
+ }
254
+ // No requests - just allow closing
255
+ if (this.state.requests.length === 0) {
256
+ return this.rerender();
257
+ }
258
+ const keyStr = key.char?.toLowerCase() ?? '';
259
+ // Arrow navigation
260
+ if (key.name === 'up') {
261
+ this.state.selectedIndex = Math.max(0, this.state.selectedIndex - 1);
262
+ return this.rerender();
263
+ }
264
+ if (key.name === 'down') {
265
+ this.state.selectedIndex = Math.min(this.state.requests.length - 1, this.state.selectedIndex + 1);
266
+ return this.rerender();
267
+ }
268
+ // View diff (for permission-type with diffable tool)
269
+ if (keyStr === 'v') {
270
+ const req = this.state.requests[this.state.selectedIndex];
271
+ if (req && isDiffableRequest(req)) {
272
+ // Open VS Code diff if available
273
+ if (isVSDiffAvailable() && !this.vsDiffWatchers.has(req.id)) {
274
+ const ctx = req.context;
275
+ const diffReqId = openVSCodeDiffForTool({
276
+ toolName: ctx.toolName,
277
+ input: ctx.input,
278
+ agentId: req.agentId,
279
+ });
280
+ if (diffReqId) {
281
+ // Start background watcher for VS Code approve/deny response
282
+ const { promise, abort } = waitForDiffResponse(diffReqId, 120_000);
283
+ this.vsDiffWatchers.set(req.id, { abort, diffReqId });
284
+ promise.then((response) => {
285
+ if (response && !response.cancelled) {
286
+ const manager = getPendingRequestsManager();
287
+ const pending = manager.getAll().find(r => r.id === req.id);
288
+ if (pending) {
289
+ manager.respond(req.id, { approved: response.accepted });
290
+ // Trigger overlay re-render to reflect the change
291
+ this.requestRender();
292
+ }
293
+ }
294
+ this.vsDiffWatchers.delete(req.id);
295
+ }).catch(() => {
296
+ this.vsDiffWatchers.delete(req.id);
297
+ });
298
+ }
299
+ }
300
+ // Also show terminal diff view (for terminal-based approve/deny)
301
+ const terminalDiffLines = generateDiffForRequest(req);
302
+ if (terminalDiffLines) {
303
+ this.state.showingDiff = true;
304
+ this.state.diffScrollOffset = 0;
305
+ this.state.diffLines = terminalDiffLines;
306
+ this.state.diffRequestId = req.id;
307
+ return this.rerender();
308
+ }
309
+ }
310
+ return this.rerender();
311
+ }
312
+ // Approve selected request (for permission-type only)
313
+ if (keyStr === 'a') {
314
+ const req = this.state.requests[this.state.selectedIndex];
315
+ if (req && req.type === 'permission') {
316
+ this.cancelVSDiffForRequest(req.id);
317
+ const manager = getPendingRequestsManager();
318
+ manager.respond(req.id, { approved: true });
319
+ // Auto-close if no requests remain
320
+ if (manager.getCount() === 0) {
321
+ return this.close({ type: 'closed' });
322
+ }
323
+ // Update selection if needed
324
+ if (this.state.selectedIndex >= this.state.requests.length - 1) {
325
+ this.state.selectedIndex = Math.max(0, this.state.selectedIndex - 1);
326
+ }
327
+ }
328
+ return this.rerender();
329
+ }
330
+ // Deny selected request
331
+ if (keyStr === 'd') {
332
+ const req = this.state.requests[this.state.selectedIndex];
333
+ if (req) {
334
+ this.cancelVSDiffForRequest(req.id);
335
+ const manager = getPendingRequestsManager();
336
+ manager.respond(req.id, { approved: false });
337
+ // Auto-close if no requests remain
338
+ if (manager.getCount() === 0) {
339
+ return this.close({ type: 'closed' });
340
+ }
341
+ // Update selection if needed
342
+ if (this.state.selectedIndex >= this.state.requests.length - 1) {
343
+ this.state.selectedIndex = Math.max(0, this.state.selectedIndex - 1);
344
+ }
345
+ }
346
+ return this.rerender();
347
+ }
348
+ // Respond to question with standard overlay (r or Enter)
349
+ if (keyStr === 'r' || key.name === 'return') {
350
+ const req = this.state.requests[this.state.selectedIndex];
351
+ if (req && req.type === 'question') {
352
+ // Close overlay and return the request to show standard overlay
353
+ return this.close({ type: 'respond', request: req });
354
+ }
355
+ }
356
+ return this.rerender();
357
+ }
358
+ /**
359
+ * Cancel an active VS Code diff for a pending request (if any).
360
+ * Called when the request is resolved from the terminal.
361
+ */
362
+ cancelVSDiffForRequest(pendingReqId) {
363
+ const watcher = this.vsDiffWatchers.get(pendingReqId);
364
+ if (watcher) {
365
+ watcher.abort();
366
+ cancelDiffRequest(watcher.diffReqId);
367
+ this.vsDiffWatchers.delete(pendingReqId);
368
+ }
369
+ }
370
+ handleDiffKey(key) {
371
+ const keyStr = key.char?.toLowerCase() ?? '';
372
+ // Escape or q = go back to list view
373
+ if (key.name === 'escape' || keyStr === 'q') {
374
+ this.state.showingDiff = false;
375
+ return this.rerender();
376
+ }
377
+ // Approve from diff view
378
+ if (keyStr === 'a') {
379
+ const req = this.state.requests.find(r => r.id === this.state.diffRequestId);
380
+ if (req && req.type === 'permission') {
381
+ this.cancelVSDiffForRequest(req.id);
382
+ const manager = getPendingRequestsManager();
383
+ manager.respond(req.id, { approved: true });
384
+ this.state.showingDiff = false;
385
+ // Auto-close if no requests remain
386
+ if (manager.getCount() === 0) {
387
+ return this.close({ type: 'closed' });
388
+ }
389
+ // Update selection if needed
390
+ if (this.state.selectedIndex >= this.state.requests.length - 1) {
391
+ this.state.selectedIndex = Math.max(0, this.state.selectedIndex - 1);
392
+ }
393
+ }
394
+ return this.rerender();
395
+ }
396
+ // Deny from diff view
397
+ if (keyStr === 'd') {
398
+ const req = this.state.requests.find(r => r.id === this.state.diffRequestId);
399
+ if (req) {
400
+ this.cancelVSDiffForRequest(req.id);
401
+ const manager = getPendingRequestsManager();
402
+ manager.respond(req.id, { approved: false });
403
+ this.state.showingDiff = false;
404
+ // Auto-close if no requests remain
405
+ if (manager.getCount() === 0) {
406
+ return this.close({ type: 'closed' });
407
+ }
408
+ // Update selection if needed
409
+ if (this.state.selectedIndex >= this.state.requests.length - 1) {
410
+ this.state.selectedIndex = Math.max(0, this.state.selectedIndex - 1);
411
+ }
412
+ }
413
+ return this.rerender();
414
+ }
415
+ // Scroll
416
+ const visibleLines = DIFF_VIEW_CONTENT_LINES;
417
+ const maxOffset = Math.max(0, this.state.diffLines.length - visibleLines);
418
+ if (key.name === 'up') {
419
+ this.state.diffScrollOffset = Math.max(0, this.state.diffScrollOffset - 1);
420
+ }
421
+ else if (key.name === 'pageup') {
422
+ this.state.diffScrollOffset = Math.max(0, this.state.diffScrollOffset - visibleLines);
423
+ }
424
+ else if (key.name === 'down') {
425
+ this.state.diffScrollOffset = Math.min(maxOffset, this.state.diffScrollOffset + 1);
426
+ }
427
+ else if (key.name === 'pagedown') {
428
+ this.state.diffScrollOffset = Math.min(maxOffset, this.state.diffScrollOffset + visibleLines);
429
+ }
430
+ return this.rerender();
431
+ }
432
+ getCloseSummary(result) {
433
+ // Don't show summary if we're responding to a question (will show overlay)
434
+ if (result.type === 'respond') {
435
+ return null;
436
+ }
437
+ const s = getStyles();
438
+ const manager = getPendingRequestsManager();
439
+ const remaining = manager.getCount();
440
+ if (remaining > 0) {
441
+ return s.muted(`Pending requests: ${String(remaining)} remaining`);
442
+ }
443
+ return s.success('All pending requests resolved.');
444
+ }
445
+ }
@@ -6,7 +6,7 @@
6
6
  */
7
7
  import chalk from 'chalk';
8
8
  import { getStyles } from '../../../themes/index.js';
9
- import { BaseOverlayV2 } from '../../base/index.js';
9
+ import { BaseOverlayV2, truncate } from '../../base/index.js';
10
10
  import * as terminal from '../../terminal.js';
11
11
  // =============================================================================
12
12
  // Helpers
@@ -18,7 +18,7 @@ import * as terminal from '../../terminal.js';
18
18
  function formatValue(value, maxLen) {
19
19
  if (typeof value === 'string') {
20
20
  const singleLine = value.replace(/\r?\n|\r/g, '↵');
21
- return singleLine.length > maxLen ? singleLine.slice(0, maxLen) + '...' : singleLine;
21
+ return truncate(singleLine, maxLen);
22
22
  }
23
23
  if (typeof value === 'boolean' || typeof value === 'number') {
24
24
  return String(value);
@@ -76,7 +76,7 @@ function formatArgs(toolName, args, maxWidth) {
76
76
  else {
77
77
  lines.push(prefix);
78
78
  const maxCmdLength = availableWidth * 3;
79
- const truncatedCmd = cmd.length > maxCmdLength ? cmd.slice(0, maxCmdLength) + '...' : cmd;
79
+ const truncatedCmd = truncate(cmd, maxCmdLength);
80
80
  lines.push(' ' + truncatedCmd);
81
81
  }
82
82
  return lines;
@@ -242,7 +242,7 @@ export class PermissionOverlayV2 extends BaseOverlayV2 {
242
242
  const maxArgWidth = cols - 6;
243
243
  const argLines = formatArgs(this.options.toolName, this.options.args, maxArgWidth);
244
244
  for (const argLine of argLines) {
245
- const safeArg = argLine.length > maxArgWidth ? argLine.slice(0, maxArgWidth - 3) + '...' : argLine;
245
+ const safeArg = truncate(argLine, maxArgWidth);
246
246
  lines.push(' ' + s.muted(safeArg));
247
247
  }
248
248
  lines.push('');
@@ -282,7 +282,7 @@ export class PermissionOverlayV2 extends BaseOverlayV2 {
282
282
  const endLine = Math.min(this.state.detailScrollOffset + visibleLines, contentLines.length);
283
283
  for (let i = this.state.detailScrollOffset; i < endLine; i++) {
284
284
  const line = contentLines[i];
285
- const safeLine = line.length > cols - 4 ? line.slice(0, cols - 7) + '...' : line;
285
+ const safeLine = truncate(line, cols - 4);
286
286
  lines.push(' ' + safeLine);
287
287
  }
288
288
  // Pad to fixed height
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Permissions Overlay V2
3
+ *
4
+ * Modal overlay for managing tool permissions.
5
+ * 3 tabs:
6
+ * - Rules: View/edit permission rules (add, edit, delete, wildcards)
7
+ * - Mode: Set global permission mode
8
+ * - Session: View/revoke session grants, toggle auto-accept
9
+ *
10
+ * Uses BaseOverlayV2 for the new Overlay interface.
11
+ */
12
+ import { BaseOverlayV2 } from '../../base/index.js';
13
+ import type { RenderContext, OverlayAction, KeyEvent } from '../index.js';
14
+ import { type PermissionRule, type PermissionLevel, type PermissionMode } from '../../../settings/index.js';
15
+ interface SessionGrant {
16
+ toolName: string;
17
+ grantedAt: Date;
18
+ }
19
+ type EditMode = 'none' | 'edit-level' | 'add-step1' | 'add-step2' | 'add-step3' | 'confirm-reset' | 'confirm-delete' | 'confirm-mode-change';
20
+ interface PermissionsState {
21
+ currentTab: number;
22
+ rules: PermissionRule[];
23
+ rulesSelectedIndex: number;
24
+ rulesScrollOffset: number;
25
+ editMode: EditMode;
26
+ editLevelIndex: number;
27
+ addInput: string;
28
+ addLevel: PermissionLevel;
29
+ addDescription: string;
30
+ modeSelectedIndex: number;
31
+ pendingMode: PermissionMode | null;
32
+ clearGrantsOnModeChange: boolean;
33
+ sessionGrants: SessionGrant[];
34
+ sessionSelectedIndex: number;
35
+ autoAcceptMode: boolean;
36
+ settingsChanged: boolean;
37
+ }
38
+ export interface PermissionsOverlayV2Result {
39
+ settingsChanged: boolean;
40
+ }
41
+ export interface PermissionsOverlayV2Options {
42
+ /** Session grants from PermissionManager */
43
+ sessionGrants?: Map<string, Date>;
44
+ /** Current auto-accept mode state */
45
+ autoAcceptMode?: boolean;
46
+ /** Callback to revoke a session grant */
47
+ onRevokeGrant?: (toolName: string) => void;
48
+ /** Callback to clear all session grants */
49
+ onClearGrants?: () => void;
50
+ /** Callback to toggle auto-accept mode */
51
+ onToggleAutoAccept?: (enabled: boolean) => void;
52
+ /** Callback to sync UI mode when permission mode changes */
53
+ onModeChange?: (newMode: PermissionMode) => void;
54
+ }
55
+ export declare class PermissionsOverlayV2 extends BaseOverlayV2<PermissionsState, PermissionsOverlayV2Result> {
56
+ readonly type: "inline";
57
+ readonly id = "permissions-overlay-v2";
58
+ protected minHeight: number;
59
+ private readonly options;
60
+ constructor(options?: PermissionsOverlayV2Options);
61
+ protected renderContent(context: RenderContext): string[];
62
+ private renderTabHeader;
63
+ private renderRulesTab;
64
+ private renderEditLevelMode;
65
+ private renderAddWizard;
66
+ private renderConfirmReset;
67
+ private renderConfirmDelete;
68
+ private getLevelDescription;
69
+ private renderModeTab;
70
+ private getModeDescription;
71
+ private renderModeChangeConfirm;
72
+ private renderSessionTab;
73
+ private formatTime;
74
+ private renderTabFooter;
75
+ handleKey(key: KeyEvent): OverlayAction<PermissionsOverlayV2Result>;
76
+ private handleRulesTabKey;
77
+ private handleEditLevelKey;
78
+ private handleAddWizardKey;
79
+ private handleConfirmResetKey;
80
+ private handleConfirmDeleteKey;
81
+ private handleModeTabKey;
82
+ private handleModeChangeConfirmKey;
83
+ private handleSessionTabKey;
84
+ }
85
+ export {};