@compilr-dev/cli 0.4.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 (634) hide show
  1. package/README.md +254 -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 +134 -4
  7. package/dist/agent.js +345 -166
  8. package/dist/anchors/index.d.ts +9 -0
  9. package/dist/anchors/index.js +9 -0
  10. package/dist/anchors/project-anchors.d.ts +79 -0
  11. package/dist/anchors/project-anchors.js +202 -0
  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/index.d.ts +2 -1
  23. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  24. package/dist/commands-v2/handlers/auth.js +118 -0
  25. package/dist/commands-v2/handlers/background.d.ts +14 -0
  26. package/dist/commands-v2/handlers/background.js +276 -0
  27. package/dist/commands-v2/handlers/context.d.ts +13 -0
  28. package/dist/commands-v2/handlers/context.js +533 -0
  29. package/dist/commands-v2/handlers/core.d.ts +14 -0
  30. package/dist/commands-v2/handlers/core.js +290 -0
  31. package/dist/commands-v2/handlers/debug.d.ts +11 -0
  32. package/dist/commands-v2/handlers/debug.js +177 -0
  33. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  34. package/dist/commands-v2/handlers/delegations.js +29 -0
  35. package/dist/commands-v2/handlers/files.d.ts +8 -0
  36. package/dist/commands-v2/handlers/files.js +162 -0
  37. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  38. package/dist/commands-v2/handlers/filter.js +130 -0
  39. package/dist/commands-v2/handlers/games.d.ts +7 -0
  40. package/dist/commands-v2/handlers/games.js +57 -0
  41. package/dist/commands-v2/handlers/index.d.ts +25 -0
  42. package/dist/commands-v2/handlers/index.js +63 -0
  43. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  44. package/dist/commands-v2/handlers/mcp.js +39 -0
  45. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  46. package/dist/commands-v2/handlers/notifications.js +34 -0
  47. package/dist/commands-v2/handlers/project.d.ts +22 -0
  48. package/dist/commands-v2/handlers/project.js +1035 -0
  49. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  50. package/dist/commands-v2/handlers/reset.js +118 -0
  51. package/dist/commands-v2/handlers/session.d.ts +161 -0
  52. package/dist/commands-v2/handlers/session.js +805 -0
  53. package/dist/commands-v2/handlers/settings.d.ts +17 -0
  54. package/dist/commands-v2/handlers/settings.js +417 -0
  55. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  56. package/dist/commands-v2/handlers/tasks.js +36 -0
  57. package/dist/commands-v2/handlers/team.d.ts +9 -0
  58. package/dist/commands-v2/handlers/team.js +549 -0
  59. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  60. package/dist/commands-v2/handlers/terminals.js +34 -0
  61. package/dist/commands-v2/index.d.ts +14 -0
  62. package/dist/commands-v2/index.js +18 -0
  63. package/dist/commands-v2/registry.d.ts +52 -0
  64. package/dist/commands-v2/registry.js +114 -0
  65. package/dist/commands-v2/types.d.ts +153 -0
  66. package/dist/commands-v2/types.js +7 -0
  67. package/dist/commands.js +123 -7
  68. package/dist/compilr-diff-companion.vsix +0 -0
  69. package/dist/db/index.js +98 -4
  70. package/dist/db/repositories/document-repository.d.ts +2 -0
  71. package/dist/db/repositories/document-repository.js +5 -1
  72. package/dist/db/repositories/index.d.ts +2 -0
  73. package/dist/db/repositories/index.js +1 -0
  74. package/dist/db/repositories/plan-repository.d.ts +101 -0
  75. package/dist/db/repositories/plan-repository.js +275 -0
  76. package/dist/db/repositories/project-repository.d.ts +6 -0
  77. package/dist/db/repositories/project-repository.js +41 -0
  78. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  79. package/dist/db/repositories/work-item-repository.js +69 -4
  80. package/dist/db/schema.d.ts +40 -3
  81. package/dist/db/schema.js +66 -3
  82. package/dist/episodes/index.d.ts +20 -0
  83. package/dist/episodes/index.js +27 -0
  84. package/dist/episodes/recorder.d.ts +51 -0
  85. package/dist/episodes/recorder.js +195 -0
  86. package/dist/episodes/significant-work.d.ts +21 -0
  87. package/dist/episodes/significant-work.js +56 -0
  88. package/dist/episodes/store.d.ts +38 -0
  89. package/dist/episodes/store.js +199 -0
  90. package/dist/episodes/types.d.ts +35 -0
  91. package/dist/episodes/types.js +6 -0
  92. package/dist/episodes/work-at-risk.d.ts +12 -0
  93. package/dist/episodes/work-at-risk.js +38 -0
  94. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  95. package/dist/episodes/work-summary-anchor.js +73 -0
  96. package/dist/games/coins.d.ts +66 -0
  97. package/dist/games/coins.js +165 -0
  98. package/dist/games/game-base.d.ts +84 -0
  99. package/dist/games/game-base.js +204 -0
  100. package/dist/games/index.d.ts +16 -0
  101. package/dist/games/index.js +49 -0
  102. package/dist/games/scores.d.ts +69 -0
  103. package/dist/games/scores.js +191 -0
  104. package/dist/games/tetris/board.d.ts +59 -0
  105. package/dist/games/tetris/board.js +170 -0
  106. package/dist/games/tetris/index.d.ts +109 -0
  107. package/dist/games/tetris/index.js +610 -0
  108. package/dist/games/tetris/pieces.d.ts +44 -0
  109. package/dist/games/tetris/pieces.js +271 -0
  110. package/dist/games/tetris/renderer.d.ts +26 -0
  111. package/dist/games/tetris/renderer.js +77 -0
  112. package/dist/guide/guide-content.d.ts +23 -0
  113. package/dist/guide/guide-content.js +196 -0
  114. package/dist/guide/index.d.ts +8 -0
  115. package/dist/guide/index.js +7 -0
  116. package/dist/guide/shared-content.d.ts +37 -0
  117. package/dist/guide/shared-content.js +1272 -0
  118. package/dist/guide/tutorial-helpers.d.ts +57 -0
  119. package/dist/guide/tutorial-helpers.js +147 -0
  120. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  121. package/dist/handlers/ask-user-handlers.js +104 -0
  122. package/dist/handlers/delegation-handlers.d.ts +34 -0
  123. package/dist/handlers/delegation-handlers.js +291 -0
  124. package/dist/handlers/permission-handler.d.ts +30 -0
  125. package/dist/handlers/permission-handler.js +205 -0
  126. package/dist/index.d.ts +11 -1
  127. package/dist/index.js +615 -179
  128. package/dist/input-handlers/index.d.ts +7 -0
  129. package/dist/input-handlers/index.js +7 -0
  130. package/dist/input-handlers/memory-handler.d.ts +26 -0
  131. package/dist/input-handlers/memory-handler.js +69 -0
  132. package/dist/models/index.d.ts +10 -0
  133. package/dist/models/index.js +12 -0
  134. package/dist/models/model-registry.d.ts +38 -0
  135. package/dist/models/model-registry.js +69 -0
  136. package/dist/models/model-tiers.d.ts +28 -0
  137. package/dist/models/model-tiers.js +71 -0
  138. package/dist/models/model-validation.d.ts +25 -0
  139. package/dist/models/model-validation.js +291 -0
  140. package/dist/models/ollama-models.d.ts +73 -0
  141. package/dist/models/ollama-models.js +178 -0
  142. package/dist/models/provider-types.d.ts +6 -0
  143. package/dist/models/provider-types.js +1 -0
  144. package/dist/models/providers.d.ts +35 -0
  145. package/dist/models/providers.js +58 -0
  146. package/dist/models/types.d.ts +4 -0
  147. package/dist/models/types.js +4 -0
  148. package/dist/multi-agent/activity.d.ts +21 -0
  149. package/dist/multi-agent/activity.js +34 -0
  150. package/dist/multi-agent/agent-selection.d.ts +55 -0
  151. package/dist/multi-agent/agent-selection.js +90 -0
  152. package/dist/multi-agent/artifacts.d.ts +197 -0
  153. package/dist/multi-agent/artifacts.js +379 -0
  154. package/dist/multi-agent/checkpointer.d.ts +138 -0
  155. package/dist/multi-agent/checkpointer.js +471 -0
  156. package/dist/multi-agent/collision-utils.d.ts +16 -0
  157. package/dist/multi-agent/collision-utils.js +28 -0
  158. package/dist/multi-agent/context-resolver.d.ts +97 -0
  159. package/dist/multi-agent/context-resolver.js +316 -0
  160. package/dist/multi-agent/custom-agents.d.ts +83 -0
  161. package/dist/multi-agent/custom-agents.js +227 -0
  162. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  163. package/dist/multi-agent/delegation-tracker.js +243 -0
  164. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  165. package/dist/multi-agent/file-lock-hook.js +97 -0
  166. package/dist/multi-agent/file-locks.d.ts +58 -0
  167. package/dist/multi-agent/file-locks.js +194 -0
  168. package/dist/multi-agent/index.d.ts +24 -0
  169. package/dist/multi-agent/index.js +30 -0
  170. package/dist/multi-agent/mention-parser.d.ts +64 -0
  171. package/dist/multi-agent/mention-parser.js +146 -0
  172. package/dist/multi-agent/notification-manager.d.ts +84 -0
  173. package/dist/multi-agent/notification-manager.js +224 -0
  174. package/dist/multi-agent/pending-requests.d.ts +122 -0
  175. package/dist/multi-agent/pending-requests.js +155 -0
  176. package/dist/multi-agent/session-registry.d.ts +139 -0
  177. package/dist/multi-agent/session-registry.js +514 -0
  178. package/dist/multi-agent/shared-context.d.ts +293 -0
  179. package/dist/multi-agent/shared-context.js +671 -0
  180. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  181. package/dist/multi-agent/skill-requirements.js +178 -0
  182. package/dist/multi-agent/task-assignment.d.ts +69 -0
  183. package/dist/multi-agent/task-assignment.js +123 -0
  184. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  185. package/dist/multi-agent/task-suggestion.js +72 -0
  186. package/dist/multi-agent/team-agent.d.ts +201 -0
  187. package/dist/multi-agent/team-agent.js +488 -0
  188. package/dist/multi-agent/team.d.ts +286 -0
  189. package/dist/multi-agent/team.js +610 -0
  190. package/dist/multi-agent/tool-config.d.ts +110 -0
  191. package/dist/multi-agent/tool-config.js +661 -0
  192. package/dist/multi-agent/types.d.ts +211 -0
  193. package/dist/multi-agent/types.js +617 -0
  194. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  195. package/dist/prompts/plan-mode-prompt.js +95 -0
  196. package/dist/repl-helpers.d.ts +63 -0
  197. package/dist/repl-helpers.js +319 -0
  198. package/dist/repl-v2.d.ts +554 -0
  199. package/dist/repl-v2.js +3286 -0
  200. package/dist/session/index.d.ts +6 -0
  201. package/dist/session/index.js +6 -0
  202. package/dist/session/project-session-manager.d.ts +158 -0
  203. package/dist/session/project-session-manager.js +650 -0
  204. package/dist/settings/index.d.ts +156 -13
  205. package/dist/settings/index.js +377 -24
  206. package/dist/settings/mcp-config.d.ts +76 -0
  207. package/dist/settings/mcp-config.js +143 -0
  208. package/dist/settings/paths.d.ts +114 -0
  209. package/dist/settings/paths.js +270 -0
  210. package/dist/shared-handlers.d.ts +62 -0
  211. package/dist/shared-handlers.js +48 -0
  212. package/dist/system-prompt/builder.d.ts +5 -0
  213. package/dist/system-prompt/builder.js +4 -0
  214. package/dist/system-prompt/index.d.ts +18 -0
  215. package/dist/system-prompt/index.js +18 -0
  216. package/dist/system-prompt/modules.d.ts +5 -0
  217. package/dist/system-prompt/modules.js +4 -0
  218. package/dist/tabbed-menu.js +2 -1
  219. package/dist/templates/compilr-md-import.d.ts +16 -0
  220. package/dist/templates/compilr-md-import.js +241 -0
  221. package/dist/templates/compilr-md.js +10 -58
  222. package/dist/templates/config-json.d.ts +1 -25
  223. package/dist/templates/index.d.ts +2 -0
  224. package/dist/templates/index.js +35 -75
  225. package/dist/themes/colors.js +3 -1
  226. package/dist/themes/registry.d.ts +5 -36
  227. package/dist/themes/registry.js +11 -95
  228. package/dist/themes/types.d.ts +3 -38
  229. package/dist/themes/types.js +2 -2
  230. package/dist/tool-names.d.ts +108 -0
  231. package/dist/tool-names.js +227 -0
  232. package/dist/tools/anchor-tools.d.ts +31 -0
  233. package/dist/tools/anchor-tools.js +255 -0
  234. package/dist/tools/artifact-tools.d.ts +42 -0
  235. package/dist/tools/artifact-tools.js +328 -0
  236. package/dist/tools/ask-user-simple.d.ts +1 -1
  237. package/dist/tools/ask-user-simple.js +2 -1
  238. package/dist/tools/ask-user.d.ts +1 -1
  239. package/dist/tools/ask-user.js +2 -1
  240. package/dist/tools/backlog-wrappers.d.ts +56 -0
  241. package/dist/tools/backlog-wrappers.js +353 -0
  242. package/dist/tools/backlog.d.ts +2 -2
  243. package/dist/tools/backlog.js +2 -2
  244. package/dist/tools/db-tools.d.ts +12 -0
  245. package/dist/tools/db-tools.js +14 -0
  246. package/dist/tools/delegate-background.d.ts +27 -0
  247. package/dist/tools/delegate-background.js +115 -0
  248. package/dist/tools/delegate.d.ts +22 -0
  249. package/dist/tools/delegate.js +97 -0
  250. package/dist/tools/delegation-status.d.ts +16 -0
  251. package/dist/tools/delegation-status.js +128 -0
  252. package/dist/tools/document-db.d.ts +43 -0
  253. package/dist/tools/document-db.js +220 -0
  254. package/dist/tools/guide-tool.d.ts +12 -0
  255. package/dist/tools/guide-tool.js +59 -0
  256. package/dist/tools/handoff.d.ts +25 -0
  257. package/dist/tools/handoff.js +99 -0
  258. package/dist/tools/meta-tools.d.ts +26 -0
  259. package/dist/tools/meta-tools.js +47 -0
  260. package/dist/tools/plan-tools.d.ts +54 -0
  261. package/dist/tools/plan-tools.js +338 -0
  262. package/dist/tools/platform-adapter.d.ts +29 -0
  263. package/dist/tools/platform-adapter.js +394 -0
  264. package/dist/tools/project-db.d.ts +34 -0
  265. package/dist/tools/project-db.js +39 -0
  266. package/dist/tools/recall-work-tool.d.ts +18 -0
  267. package/dist/tools/recall-work-tool.js +82 -0
  268. package/dist/tools/workitem-db.d.ts +135 -0
  269. package/dist/tools/workitem-db.js +730 -0
  270. package/dist/tools.d.ts +67 -2
  271. package/dist/tools.js +238 -38
  272. package/dist/ui/ask-user-overlay.d.ts +2 -2
  273. package/dist/ui/ask-user-overlay.js +443 -535
  274. package/dist/ui/ask-user-simple-overlay.d.ts +2 -2
  275. package/dist/ui/ask-user-simple-overlay.js +182 -209
  276. package/dist/ui/autocomplete-controller.d.ts +42 -0
  277. package/dist/ui/autocomplete-controller.js +384 -0
  278. package/dist/ui/base/index.d.ts +26 -0
  279. package/dist/ui/base/index.js +33 -0
  280. package/dist/ui/base/inline-overlay-utils.d.ts +217 -0
  281. package/dist/ui/base/inline-overlay-utils.js +320 -0
  282. package/dist/ui/base/inline-overlay.d.ts +159 -0
  283. package/dist/ui/base/inline-overlay.js +257 -0
  284. package/dist/ui/base/key-utils.d.ts +15 -0
  285. package/dist/ui/base/key-utils.js +30 -0
  286. package/dist/ui/base/overlay-base-v2.d.ts +203 -0
  287. package/dist/ui/base/overlay-base-v2.js +260 -0
  288. package/dist/ui/base/overlay-base.d.ts +156 -0
  289. package/dist/ui/base/overlay-base.js +238 -0
  290. package/dist/ui/base/overlay-lifecycle.d.ts +65 -0
  291. package/dist/ui/base/overlay-lifecycle.js +159 -0
  292. package/dist/ui/base/overlay-types.d.ts +185 -0
  293. package/dist/ui/base/overlay-types.js +7 -0
  294. package/dist/ui/base/render-utils.d.ts +27 -0
  295. package/dist/ui/base/render-utils.js +36 -0
  296. package/dist/ui/base/screen-stack.d.ts +148 -0
  297. package/dist/ui/base/screen-stack.js +184 -0
  298. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +118 -0
  299. package/dist/ui/base/tabbed-list-overlay-v2.js +335 -0
  300. package/dist/ui/base/tabbed-list-overlay.d.ts +153 -0
  301. package/dist/ui/base/tabbed-list-overlay.js +369 -0
  302. package/dist/ui/constants/labels.d.ts +14 -0
  303. package/dist/ui/constants/labels.js +51 -0
  304. package/dist/ui/conversation-store.d.ts +55 -0
  305. package/dist/ui/conversation-store.js +107 -0
  306. package/dist/ui/conversation.d.ts +75 -4
  307. package/dist/ui/conversation.js +376 -165
  308. package/dist/ui/diff.d.ts +7 -1
  309. package/dist/ui/diff.js +85 -48
  310. package/dist/ui/ephemeral.d.ts +1 -1
  311. package/dist/ui/ephemeral.js +4 -10
  312. package/dist/ui/features/index.d.ts +34 -0
  313. package/dist/ui/features/index.js +34 -0
  314. package/dist/ui/features/input-feature.d.ts +85 -0
  315. package/dist/ui/features/input-feature.js +238 -0
  316. package/dist/ui/features/list-feature.d.ts +155 -0
  317. package/dist/ui/features/list-feature.js +244 -0
  318. package/dist/ui/features/pagination-feature.d.ts +154 -0
  319. package/dist/ui/features/pagination-feature.js +238 -0
  320. package/dist/ui/features/search-feature.d.ts +148 -0
  321. package/dist/ui/features/search-feature.js +185 -0
  322. package/dist/ui/features/tab-feature.d.ts +194 -0
  323. package/dist/ui/features/tab-feature.js +307 -0
  324. package/dist/ui/file-autocomplete.d.ts +24 -0
  325. package/dist/ui/file-autocomplete.js +56 -0
  326. package/dist/ui/footer-renderer.d.ts +69 -0
  327. package/dist/ui/footer-renderer.js +431 -0
  328. package/dist/ui/footer.d.ts +181 -7
  329. package/dist/ui/footer.js +523 -74
  330. package/dist/ui/guardrail-overlay.d.ts +29 -0
  331. package/dist/ui/guardrail-overlay.js +145 -0
  332. package/dist/ui/index.d.ts +1 -1
  333. package/dist/ui/index.js +1 -3
  334. package/dist/ui/input-controller.d.ts +51 -0
  335. package/dist/ui/input-controller.js +176 -0
  336. package/dist/ui/input-prompt.d.ts +135 -33
  337. package/dist/ui/input-prompt.js +728 -337
  338. package/dist/ui/iteration-limit-overlay.d.ts +2 -2
  339. package/dist/ui/iteration-limit-overlay.js +92 -128
  340. package/dist/ui/keyboard-handler.d.ts +57 -0
  341. package/dist/ui/keyboard-handler.js +557 -0
  342. package/dist/ui/keys-overlay.d.ts +1 -0
  343. package/dist/ui/keys-overlay.js +203 -141
  344. package/dist/ui/line-utils.d.ts +88 -0
  345. package/dist/ui/line-utils.js +150 -0
  346. package/dist/ui/live-region-facade.d.ts +42 -0
  347. package/dist/ui/live-region-facade.js +205 -0
  348. package/dist/ui/live-region.d.ts +157 -0
  349. package/dist/ui/live-region.js +379 -0
  350. package/dist/ui/mascot/expressions.d.ts +32 -0
  351. package/dist/ui/mascot/expressions.js +213 -0
  352. package/dist/ui/mascot/index.d.ts +8 -0
  353. package/dist/ui/mascot/index.js +8 -0
  354. package/dist/ui/mascot/renderer.d.ts +19 -0
  355. package/dist/ui/mascot/renderer.js +132 -0
  356. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  357. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  358. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  359. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  360. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  361. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  362. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  363. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  364. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  365. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  366. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  367. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  368. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  369. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  370. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  371. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  372. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  373. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  374. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  375. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  376. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  377. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  378. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  379. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  380. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  381. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  382. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  383. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  384. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  385. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  386. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  387. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  388. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  389. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  390. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  391. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  392. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  393. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  394. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  395. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  396. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  397. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  398. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  399. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  400. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  401. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  402. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  403. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  404. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  405. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  406. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  407. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  408. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  409. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  410. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  411. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  412. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  413. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  414. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  415. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  416. package/dist/ui/overlay/impl/agents-overlay-v2.d.ts +45 -0
  417. package/dist/ui/overlay/impl/agents-overlay-v2.js +814 -0
  418. package/dist/ui/overlay/impl/anchors-overlay-v2.d.ts +47 -0
  419. package/dist/ui/overlay/impl/anchors-overlay-v2.js +749 -0
  420. package/dist/ui/overlay/impl/arch-type-overlay-v2.d.ts +37 -0
  421. package/dist/ui/overlay/impl/arch-type-overlay-v2.js +240 -0
  422. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  423. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  424. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  425. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  426. package/dist/ui/overlay/impl/ask-user-overlay-v2.d.ts +72 -0
  427. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +581 -0
  428. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.d.ts +46 -0
  429. package/dist/ui/overlay/impl/ask-user-simple-overlay-v2.js +204 -0
  430. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  431. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  432. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +52 -0
  433. package/dist/ui/overlay/impl/backlog-overlay-v2.js +681 -0
  434. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  435. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  436. package/dist/ui/overlay/impl/commands-overlay-v2.d.ts +33 -0
  437. package/dist/ui/overlay/impl/commands-overlay-v2.js +439 -0
  438. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +111 -0
  439. package/dist/ui/overlay/impl/config-overlay-v2.js +718 -0
  440. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  441. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  442. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +57 -0
  443. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +382 -0
  444. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  445. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  446. package/dist/ui/overlay/impl/docs-overlay-v2.d.ts +45 -0
  447. package/dist/ui/overlay/impl/docs-overlay-v2.js +117 -0
  448. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +84 -0
  449. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +1112 -0
  450. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  451. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  452. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  453. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  454. package/dist/ui/overlay/impl/guardrail-overlay-v2.d.ts +43 -0
  455. package/dist/ui/overlay/impl/guardrail-overlay-v2.js +114 -0
  456. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +57 -0
  457. package/dist/ui/overlay/impl/help-overlay-v2.js +287 -0
  458. package/dist/ui/overlay/impl/init-setup-overlay-v2.d.ts +25 -0
  459. package/dist/ui/overlay/impl/init-setup-overlay-v2.js +97 -0
  460. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.d.ts +35 -0
  461. package/dist/ui/overlay/impl/iteration-limit-overlay-v2.js +105 -0
  462. package/dist/ui/overlay/impl/keys-overlay-v2.d.ts +41 -0
  463. package/dist/ui/overlay/impl/keys-overlay-v2.js +248 -0
  464. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  465. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  466. package/dist/ui/overlay/impl/mascot-overlay-v2.d.ts +41 -0
  467. package/dist/ui/overlay/impl/mascot-overlay-v2.js +138 -0
  468. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  469. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  470. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +93 -0
  471. package/dist/ui/overlay/impl/model-overlay-v2.js +1143 -0
  472. package/dist/ui/overlay/impl/model-warning-overlay-v2.d.ts +46 -0
  473. package/dist/ui/overlay/impl/model-warning-overlay-v2.js +132 -0
  474. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +108 -0
  475. package/dist/ui/overlay/impl/new-overlay-v2.js +1243 -0
  476. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  477. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  478. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  479. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  480. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  481. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  482. package/dist/ui/overlay/impl/permission-overlay-v2.d.ts +36 -0
  483. package/dist/ui/overlay/impl/permission-overlay-v2.js +380 -0
  484. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  485. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  486. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  487. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  488. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  489. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  490. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +37 -0
  491. package/dist/ui/overlay/impl/projects-overlay-v2.js +733 -0
  492. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  493. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  494. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  495. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  496. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  497. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  498. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  499. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  500. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  501. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  502. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  503. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  504. package/dist/ui/overlay/impl/theme-overlay-v2.d.ts +42 -0
  505. package/dist/ui/overlay/impl/theme-overlay-v2.js +135 -0
  506. package/dist/ui/overlay/impl/tools-overlay-v2.d.ts +47 -0
  507. package/dist/ui/overlay/impl/tools-overlay-v2.js +214 -0
  508. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +45 -0
  509. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +212 -0
  510. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +80 -0
  511. package/dist/ui/overlay/impl/workflow-overlay-v2.js +641 -0
  512. package/dist/ui/overlay/index.d.ts +52 -0
  513. package/dist/ui/overlay/index.js +54 -0
  514. package/dist/ui/overlay/key-utils.d.ts +6 -0
  515. package/dist/ui/overlay/key-utils.js +6 -0
  516. package/dist/ui/overlay/types.d.ts +140 -0
  517. package/dist/ui/overlay/types.js +22 -0
  518. package/dist/ui/overlay-manager.d.ts +43 -0
  519. package/dist/ui/overlay-manager.js +238 -0
  520. package/dist/ui/overlays.d.ts +0 -4
  521. package/dist/ui/overlays.js +4 -460
  522. package/dist/ui/permission-overlay.d.ts +1 -1
  523. package/dist/ui/permission-overlay.js +189 -300
  524. package/dist/ui/providers/types.d.ts +178 -0
  525. package/dist/ui/providers/types.js +9 -0
  526. package/dist/ui/render-modes.d.ts +36 -0
  527. package/dist/ui/render-modes.js +44 -0
  528. package/dist/ui/startup-menu.d.ts +36 -0
  529. package/dist/ui/startup-menu.js +236 -0
  530. package/dist/ui/status-bar-controller.d.ts +33 -0
  531. package/dist/ui/status-bar-controller.js +99 -0
  532. package/dist/ui/subagent-renderer.d.ts +117 -0
  533. package/dist/ui/subagent-renderer.js +318 -0
  534. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  535. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  536. package/dist/ui/terminal-codes.d.ts +94 -0
  537. package/dist/ui/terminal-codes.js +124 -0
  538. package/dist/ui/terminal-line-builders.d.ts +17 -0
  539. package/dist/ui/terminal-line-builders.js +42 -0
  540. package/dist/ui/terminal-render-item.d.ts +16 -0
  541. package/dist/ui/terminal-render-item.js +267 -0
  542. package/dist/ui/terminal-renderer.d.ts +220 -0
  543. package/dist/ui/terminal-renderer.js +750 -0
  544. package/dist/ui/terminal-types.d.ts +179 -0
  545. package/dist/ui/terminal-types.js +34 -0
  546. package/dist/ui/terminal-ui.d.ts +331 -0
  547. package/dist/ui/terminal-ui.js +819 -0
  548. package/dist/ui/terminal.d.ts +20 -0
  549. package/dist/ui/terminal.js +72 -0
  550. package/dist/ui/todo-zone.d.ts +19 -1
  551. package/dist/ui/todo-zone.js +124 -38
  552. package/dist/ui/tool-formatters.d.ts +16 -0
  553. package/dist/ui/tool-formatters.js +1027 -0
  554. package/dist/ui/turn-metrics.d.ts +56 -0
  555. package/dist/ui/turn-metrics.js +75 -0
  556. package/dist/ui/types.d.ts +28 -0
  557. package/dist/ui/types.js +1 -0
  558. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  559. package/dist/ui/vscode-diff-ipc.js +385 -0
  560. package/dist/utils/credentials.d.ts +24 -5
  561. package/dist/utils/credentials.js +123 -9
  562. package/dist/utils/debug-log.d.ts +28 -0
  563. package/dist/utils/debug-log.js +57 -0
  564. package/dist/utils/format-tokens.d.ts +13 -0
  565. package/dist/utils/format-tokens.js +18 -0
  566. package/dist/utils/git-config.d.ts +26 -0
  567. package/dist/utils/git-config.js +54 -0
  568. package/dist/utils/message-utils.d.ts +61 -0
  569. package/dist/utils/message-utils.js +72 -0
  570. package/dist/utils/model-tiers.d.ts +8 -1
  571. package/dist/utils/model-tiers.js +39 -17
  572. package/dist/utils/open-browser.d.ts +5 -0
  573. package/dist/utils/open-browser.js +32 -0
  574. package/dist/utils/path-safety.d.ts +56 -0
  575. package/dist/utils/path-safety.js +240 -0
  576. package/dist/utils/project-detection.d.ts +58 -0
  577. package/dist/utils/project-detection.js +424 -0
  578. package/dist/utils/project-memory.js +2 -1
  579. package/dist/utils/project-status.d.ts +2 -2
  580. package/dist/utils/startup-perf.d.ts +18 -0
  581. package/dist/utils/startup-perf.js +60 -0
  582. package/dist/utils/token-tracker.d.ts +62 -0
  583. package/dist/utils/token-tracker.js +150 -0
  584. package/dist/utils/token-types.d.ts +23 -0
  585. package/dist/utils/token-types.js +18 -0
  586. package/dist/utils/types/config-types.d.ts +32 -0
  587. package/dist/utils/types/config-types.js +8 -0
  588. package/dist/utils/update-checker.d.ts +28 -0
  589. package/dist/utils/update-checker.js +106 -0
  590. package/dist/utils/version.d.ts +7 -0
  591. package/dist/utils/version.js +10 -0
  592. package/dist/utils/vscode-detect.d.ts +39 -0
  593. package/dist/utils/vscode-detect.js +137 -0
  594. package/dist/workflow/guided-mode-injector.d.ts +42 -0
  595. package/dist/workflow/guided-mode-injector.js +191 -0
  596. package/dist/workflow/index.d.ts +8 -0
  597. package/dist/workflow/index.js +8 -0
  598. package/dist/workflow/step-criteria.d.ts +62 -0
  599. package/dist/workflow/step-criteria.js +150 -0
  600. package/dist/workflow/step-tracker.d.ts +92 -0
  601. package/dist/workflow/step-tracker.js +141 -0
  602. package/package.json +32 -12
  603. package/dist/index.old.d.ts +0 -7
  604. package/dist/index.old.js +0 -1014
  605. package/dist/repl.d.ts +0 -121
  606. package/dist/repl.js +0 -1878
  607. package/dist/templates/claude-md.d.ts +0 -7
  608. package/dist/templates/claude-md.js +0 -189
  609. package/dist/test-autocomplete.d.ts +0 -7
  610. package/dist/test-autocomplete.js +0 -85
  611. package/dist/test-tabbed-menu.d.ts +0 -7
  612. package/dist/test-tabbed-menu.js +0 -25
  613. package/dist/tool-selector.d.ts +0 -71
  614. package/dist/tool-selector.js +0 -184
  615. package/dist/ui/agents-overlay.d.ts +0 -12
  616. package/dist/ui/agents-overlay.js +0 -501
  617. package/dist/ui/arch-type-overlay.d.ts +0 -20
  618. package/dist/ui/arch-type-overlay.js +0 -229
  619. package/dist/ui/backlog-overlay.d.ts +0 -17
  620. package/dist/ui/backlog-overlay.js +0 -786
  621. package/dist/ui/commands-overlay.d.ts +0 -11
  622. package/dist/ui/commands-overlay.js +0 -410
  623. package/dist/ui/config-overlay.d.ts +0 -34
  624. package/dist/ui/config-overlay.js +0 -977
  625. package/dist/ui/init-overlay.d.ts +0 -24
  626. package/dist/ui/init-overlay.js +0 -525
  627. package/dist/ui/input-prompt-v2.d.ts +0 -179
  628. package/dist/ui/input-prompt-v2.js +0 -991
  629. package/dist/ui/model-warning-overlay.d.ts +0 -30
  630. package/dist/ui/model-warning-overlay.js +0 -171
  631. package/dist/ui/tools-overlay.d.ts +0 -26
  632. package/dist/ui/tools-overlay.js +0 -278
  633. package/dist/ui/tutorial-overlay.d.ts +0 -10
  634. package/dist/ui/tutorial-overlay.js +0 -936
package/dist/index.js CHANGED
@@ -8,27 +8,48 @@ process.env.FORCE_COLOR = '3';
8
8
  * AI-powered coding assistant CLI using @compilr-dev/agents.
9
9
  * A terminal-based REPL for interacting with AI agents.
10
10
  */
11
+ import { perf, flushStartupPerf } from './utils/startup-perf.js';
12
+ perf('imports-start');
11
13
  import { createAgent } from './agent.js';
12
- import { REPL } from './repl.js';
13
- import * as diff from './ui/diff.js';
14
- import * as terminal from './ui/terminal.js';
14
+ import { getModelForTier } from './models/index.js';
15
+ import { ReplV2 } from './repl-v2.js';
16
+ import { AgentTeam, setActiveSharedContext } from './multi-agent/index.js';
15
17
  import { getStyles } from './themes/index.js';
16
- import { getDefaultProvider, getDefaultModel as getDefaultModelSetting } from './settings/index.js';
17
- import { showAskUserOverlay } from './ui/ask-user-overlay.js';
18
+ import { getDefaultProvider, getDefaultModel as getDefaultModelSetting, getProjectStartupMode, getLastProjectId, isCheckUpdatesEnabled, getLastUpdateCheck, recordUpdateCheck, isFirstRunComplete, setSetting, getSetting } from './settings/index.js';
19
+ import { checkForUpdates, performUpdate } from './utils/update-checker.js';
18
20
  import { showAskUserSimpleOverlay } from './ui/ask-user-simple-overlay.js';
19
- import { showPermissionOverlay } from './ui/permission-overlay.js';
20
- import { showIterationLimitOverlay } from './ui/iteration-limit-overlay.js';
21
21
  import { showKeysOverlay } from './ui/keys-overlay.js';
22
+ import { projectRepository, workItemRepository } from './db/repositories/index.js';
23
+ import { setActiveProject } from './tools/project-db.js';
24
+ import { getFullGuidedPrompt, shouldInjectGuidedContext, } from './workflow/index.js';
22
25
  import { hasApiKey, settingsProviderToCredentialKey } from './utils/credentials.js';
23
- import { printLogo } from './ui/conversation.js';
24
- import { loadProjectMemory, formatBytes, getSizeCategory } from './utils/project-memory.js';
25
- import { registerAskUserHandler, registerAskUserSimpleHandler, setOverlayActive, } from './shared-handlers.js';
26
- import chalk from 'chalk';
27
- const sharedState = { mode: 'normal', pendingSuggestion: null };
26
+ import { loadProjectMemory } from './utils/project-memory.js';
27
+ import { getGlobalAnchorManager, getAnchorManager } from './anchors/index.js';
28
+ import { getAuthManager } from './auth/index.js';
29
+ import { loadMCPConfig } from './settings/mcp-config.js';
30
+ import { isInVSCode } from './utils/vscode-detect.js';
31
+ import { cleanupStaleDiffs } from './ui/vscode-diff-ipc.js';
32
+ import { createPermissionHandler } from './handlers/permission-handler.js';
33
+ import { registerDelegationHandlers } from './handlers/delegation-handlers.js';
34
+ import { registerAskUserHandlers } from './handlers/ask-user-handlers.js';
35
+ import { EpisodeRecorder, FileEpisodeStore, setGlobalEpisodeStore } from './episodes/index.js';
36
+ import { updateWorkSummaryAnchor } from './episodes/work-summary-anchor.js';
37
+ import { getSessionsPath } from './settings/paths.js';
38
+ import * as path from 'path';
39
+ perf('imports-done');
40
+ const sharedState = {
41
+ mode: 'normal',
42
+ pendingSuggestion: null,
43
+ pendingDelegation: null,
44
+ vsDiffEnabled: false,
45
+ sessionPrefix: '',
46
+ vsDiffExtensionChecked: false,
47
+ };
28
48
  // =============================================================================
29
49
  // Version
30
50
  // =============================================================================
31
- const VERSION = '0.0.1';
51
+ import { VERSION } from './utils/version.js';
52
+ export { VERSION };
32
53
  function parseArgs() {
33
54
  const args = process.argv.slice(2);
34
55
  const options = {};
@@ -46,6 +67,9 @@ function parseArgs() {
46
67
  else if (arg === '--show-filtering') {
47
68
  options.showFiltering = true;
48
69
  }
70
+ else if (arg === '--update') {
71
+ options.update = true;
72
+ }
49
73
  else if (arg === '--help' || arg === '-h') {
50
74
  showHelp();
51
75
  process.exit(0);
@@ -64,6 +88,7 @@ Options:
64
88
  --model, -m <model> Model name (e.g., claude-3-5-haiku-20241022)
65
89
  --minimal Use minimal tool set
66
90
  --show-filtering Show tool filtering analysis
91
+ --update Check for and install updates
67
92
  --help, -h Show this help
68
93
 
69
94
  Environment Variables:
@@ -76,241 +101,652 @@ Examples:
76
101
  npm run dev -- --model claude-3-5-haiku-20241022
77
102
  npm run dev -- --provider gemini --model gemini-2.0-flash
78
103
  npm run dev -- --minimal --show-filtering
104
+ npm run dev -- --update
79
105
  `);
80
106
  }
81
107
  // =============================================================================
108
+ // MCP Initialization
109
+ // =============================================================================
110
+ /** MCPManager instance — stored at module level for /mcp command and cleanup */
111
+ let mcpManagerInstance = null;
112
+ async function createMCPManager(servers) {
113
+ // Dynamic import to avoid loading MCP code when not needed
114
+ perf('mcp-dynamic-import');
115
+ const { MCPManager } = await import('@compilr-dev/sdk');
116
+ perf('mcp-dynamic-import-done');
117
+ const manager = new MCPManager({ toolPrefix: 'mcp', autoConnect: true });
118
+ // Connect all servers in parallel — each addServer is independent
119
+ perf(`mcp-connect-${String(servers.length)}-servers`);
120
+ await Promise.allSettled(servers.map(server => manager.addServer(server)));
121
+ perf('mcp-connect-done');
122
+ return manager;
123
+ }
124
+ /**
125
+ * Initialize MCP servers and discover tools.
126
+ * Returns empty array if no servers configured or on error.
127
+ * Non-blocking: failures are silently ignored.
128
+ */
129
+ async function initializeMCP(projectPath) {
130
+ const servers = loadMCPConfig(projectPath);
131
+ if (servers.length === 0) {
132
+ return [];
133
+ }
134
+ try {
135
+ const manager = await createMCPManager(servers);
136
+ mcpManagerInstance = manager;
137
+ perf('mcp-discover-tools');
138
+ const tools = await manager.discoverTools();
139
+ perf('mcp-discover-tools-done');
140
+ return tools;
141
+ }
142
+ catch {
143
+ // MCP initialization failed — continue without MCP tools
144
+ return [];
145
+ }
146
+ }
147
+ /** Get the MCPManager instance (for /mcp command) */
148
+ export function getMCPManager() {
149
+ return mcpManagerInstance;
150
+ }
151
+ /**
152
+ * Get or lazily create an MCPManager instance.
153
+ * When no servers were configured at startup, mcpManagerInstance is null.
154
+ * This creates one on demand so the /mcp overlay can add servers at runtime.
155
+ */
156
+ export async function ensureMCPManager() {
157
+ if (mcpManagerInstance)
158
+ return mcpManagerInstance;
159
+ const { MCPManager: MCPManagerClass } = await import('@compilr-dev/sdk');
160
+ mcpManagerInstance = new MCPManagerClass({ toolPrefix: 'mcp', autoConnect: true });
161
+ return mcpManagerInstance;
162
+ }
163
+ // =============================================================================
82
164
  // Main Entry Point
83
165
  // =============================================================================
84
166
  async function main() {
167
+ perf('main-start');
85
168
  const options = parseArgs();
86
- // Show logo immediately on startup
87
- printLogo(VERSION);
169
+ const s = getStyles();
170
+ // ==========================================================================
171
+ // Handle --update flag: perform update and exit
172
+ // ==========================================================================
173
+ if (options.update) {
174
+ console.log('Checking for updates...');
175
+ const updateInfo = await checkForUpdates();
176
+ if (updateInfo.updateAvailable) {
177
+ console.log(s.primary(`Update available: v${updateInfo.currentVersion} → v${updateInfo.latestVersion}`));
178
+ console.log('Installing update...\n');
179
+ const result = await performUpdate();
180
+ console.log(result.success ? s.success(result.message) : s.error(result.message));
181
+ }
182
+ else {
183
+ console.log(s.success(`You're on the latest version (v${updateInfo.currentVersion})`));
184
+ }
185
+ process.exit(0);
186
+ }
187
+ // ==========================================================================
188
+ // Update check (deferred to background — don't block startup)
189
+ // ==========================================================================
190
+ let updateAvailable = null;
191
+ // Fire update check in background (result used later if available before REPL starts)
192
+ let updateCheckPromise = null;
193
+ if (isCheckUpdatesEnabled()) {
194
+ const lastCheck = getLastUpdateCheck();
195
+ const oneDayAgo = Date.now() - 24 * 60 * 60 * 1000;
196
+ if (!lastCheck || lastCheck < oneDayAgo) {
197
+ updateCheckPromise = checkForUpdates()
198
+ .then((updateInfo) => {
199
+ recordUpdateCheck();
200
+ if (updateInfo.updateAvailable) {
201
+ updateAvailable = {
202
+ current: updateInfo.currentVersion,
203
+ latest: updateInfo.latestVersion,
204
+ };
205
+ }
206
+ })
207
+ .catch(() => {
208
+ // Silently ignore update check failures
209
+ });
210
+ }
211
+ }
212
+ // ==========================================================================
213
+ // VS Code diff IPC: clean up stale files from previous sessions
214
+ // ==========================================================================
215
+ perf('stale-diff-cleanup');
216
+ cleanupStaleDiffs(300_000); // 5 minutes
217
+ // ==========================================================================
218
+ // Authentication check (mandatory — but fast with API tokens)
219
+ // ==========================================================================
220
+ perf('auth-start');
221
+ const auth = getAuthManager();
222
+ const isAuthenticated = await auth.isAuthenticated();
223
+ perf('auth-done');
224
+ const showLogin = !isAuthenticated;
225
+ // Auth status is used by REPL to skip login overlay
226
+ // (email displayed in welcome banner, not here)
88
227
  // Resolve provider: CLI arg > settings > auto-detect
89
228
  const settingsProvider = getDefaultProvider();
90
- const provider = options.provider
229
+ let provider = options.provider
91
230
  ?? (settingsProvider !== 'auto' ? settingsProvider : null)
92
231
  ?? detectProvider();
93
232
  // Resolve model: CLI arg > settings > provider default
94
233
  const settingsModel = getDefaultModelSetting();
95
- const model = options.model ?? settingsModel ?? getDefaultModel(provider);
234
+ let model = options.model ?? settingsModel ?? getDefaultModel(provider);
96
235
  // Check if API key is available for selected provider (skip for ollama)
97
236
  if (provider !== 'ollama') {
98
237
  const credentialKey = settingsProviderToCredentialKey(provider === 'claude' ? 'claude' : provider);
99
238
  if (!hasApiKey(credentialKey)) {
100
- const s = getStyles();
101
239
  console.log(s.warning('⚠ No API key found for ' + provider));
102
240
  console.log(s.muted(' Use --provider ollama for local models without an API key.'));
103
241
  console.log('');
104
- // Show keys overlay to let user set up their key
105
- const result = await showKeysOverlay();
106
- // Check again after overlay closes
107
- if (!result.changed || !hasApiKey(credentialKey)) {
108
- console.log('');
242
+ // Ask user what they want to do
243
+ const choice = await showAskUserSimpleOverlay({
244
+ question: 'What would you like to do?',
245
+ options: [
246
+ `Set API key for ${provider}`,
247
+ 'Switch to a different provider',
248
+ ],
249
+ });
250
+ if (choice.skipped) {
109
251
  console.log(s.error('No API key configured. Cannot start.'));
110
- console.log(s.muted(' Set a key with /keys or use: export ANTHROPIC_API_KEY=sk-ant-...'));
111
- console.log('');
112
252
  process.exit(1);
113
253
  }
114
- console.log(s.success('✓ API key configured'));
115
- console.log('');
254
+ if (choice.answer.includes('Switch')) {
255
+ // Let user pick a different provider
256
+ const providerChoice = await showAskUserSimpleOverlay({
257
+ question: 'Select a provider:',
258
+ options: [
259
+ 'Claude (Anthropic)',
260
+ 'OpenAI (GPT)',
261
+ 'Gemini (Google)',
262
+ 'Ollama (local, no key needed)',
263
+ ],
264
+ });
265
+ if (providerChoice.skipped) {
266
+ console.log(s.error('No provider selected. Cannot start.'));
267
+ process.exit(1);
268
+ }
269
+ // Map choice to provider
270
+ let newProvider;
271
+ if (providerChoice.answer.includes('Claude')) {
272
+ newProvider = 'claude';
273
+ }
274
+ else if (providerChoice.answer.includes('OpenAI')) {
275
+ newProvider = 'openai';
276
+ }
277
+ else if (providerChoice.answer.includes('Gemini')) {
278
+ newProvider = 'gemini';
279
+ }
280
+ else if (providerChoice.answer.includes('Ollama')) {
281
+ newProvider = 'ollama';
282
+ }
283
+ else {
284
+ newProvider = 'claude'; // Default fallback
285
+ }
286
+ // Update settings (provider AND model) and restart check
287
+ const newModel = getDefaultModel(newProvider);
288
+ setSetting('defaultProvider', newProvider);
289
+ setSetting('defaultModel', newModel);
290
+ provider = newProvider;
291
+ model = newModel;
292
+ console.log(s.success(`✓ Switched to ${newProvider} (${newModel})`));
293
+ console.log('');
294
+ // Re-check API key for new provider
295
+ if (newProvider !== 'ollama') {
296
+ const newCredKey = settingsProviderToCredentialKey(newProvider);
297
+ if (!hasApiKey(newCredKey)) {
298
+ console.log(s.warning(`⚠ No API key found for ${newProvider}`));
299
+ const result = await showKeysOverlay();
300
+ if (!result.changed || !hasApiKey(newCredKey)) {
301
+ console.log(s.error('No API key configured. Cannot start.'));
302
+ process.exit(1);
303
+ }
304
+ }
305
+ }
306
+ }
307
+ else {
308
+ // Show keys overlay to set API key
309
+ const result = await showKeysOverlay();
310
+ // Check again after overlay closes
311
+ if (!result.changed || !hasApiKey(credentialKey)) {
312
+ console.log('');
313
+ console.log(s.error('No API key configured. Cannot start.'));
314
+ console.log(s.muted(' Set a key with /keys or use: export ANTHROPIC_API_KEY=sk-ant-...'));
315
+ console.log('');
316
+ process.exit(1);
317
+ }
318
+ console.log(s.success('✓ API key configured'));
319
+ console.log('');
320
+ }
116
321
  }
117
322
  }
118
323
  // Load project memory (COMPILR.md or CLAUDE.md)
324
+ perf('project-memory-start');
119
325
  const projectMemory = loadProjectMemory();
120
326
  let projectContext;
121
327
  if (projectMemory.found && projectMemory.filePath) {
122
- const s = getStyles();
123
- const filename = projectMemory.filePath.split('/').pop() ?? 'COMPILR.md';
124
- const sizeCategory = getSizeCategory(projectMemory.originalSize);
125
- if (projectMemory.truncated) {
126
- // Large file - was truncated
127
- console.log(s.warning(`⚠ Loaded ${filename} (${formatBytes(projectMemory.originalSize)} → truncated to 100KB)`));
128
- }
129
- else if (sizeCategory === 'medium') {
130
- // Medium file - loaded with note
131
- console.log(s.muted(` Loaded ${filename} (${formatBytes(projectMemory.originalSize)}, ~${projectMemory.estimatedTokens.toLocaleString()} tokens)`));
132
- }
133
- else {
134
- // Small file - loaded silently (just a subtle note)
135
- console.log(s.muted(` Loaded ${filename}`));
136
- }
137
328
  projectContext = projectMemory.content;
138
329
  }
139
- // Create permission handler that respects mode state
140
- const onPermissionRequest = async (request) => {
141
- // Auto-accept mode: allow everything without prompting
142
- if (sharedState.mode === 'auto-accept') {
143
- return true;
330
+ // ==========================================================================
331
+ // Load guided mode context from database (if project uses guided mode)
332
+ // ==========================================================================
333
+ perf('project-db-start');
334
+ let guidedModeContext;
335
+ // Determine which project to load based on projectStartup setting
336
+ const projectStartupMode = getProjectStartupMode();
337
+ let dbProject = null;
338
+ if (projectStartupMode === 'last') {
339
+ // Try to load the last opened project
340
+ const lastProjectId = getLastProjectId();
341
+ if (lastProjectId !== null) {
342
+ dbProject = projectRepository.getById(lastProjectId);
343
+ // If last project no longer exists (deleted), don't auto-load any project
144
344
  }
145
- // Normal mode: show permission prompt
146
- // Pause footer to prevent interference with the overlay
147
- sharedState.pauseFooter?.();
148
- // Set overlay active flag so REPL buffers any text output
149
- setOverlayActive(true);
150
- // For edit operations, show the diff BEFORE the permission prompt
151
- if (request.toolName === 'edit') {
152
- const filePath = ((typeof request.input.filePath === 'string' ? request.input.filePath : null) ||
153
- (typeof request.input.file_path === 'string' ? request.input.file_path : null) ||
154
- (typeof request.input.path === 'string' ? request.input.path : null) || '');
155
- const oldText = ((typeof request.input.oldString === 'string' ? request.input.oldString : null) ||
156
- (typeof request.input.old_string === 'string' ? request.input.old_string : null) ||
157
- (typeof request.input.old_text === 'string' ? request.input.old_text : null) || '');
158
- const newText = ((typeof request.input.newString === 'string' ? request.input.newString : null) ||
159
- (typeof request.input.new_string === 'string' ? request.input.new_string : null) ||
160
- (typeof request.input.new_text === 'string' ? request.input.new_text : null) || '');
161
- const replaceAll = Boolean(request.input.replaceAll);
162
- if (filePath && oldText && newText) {
163
- const editDiff = diff.generateEditDiff(filePath, oldText, newText, replaceAll);
164
- const s = getStyles();
165
- terminal.writeLine('');
166
- if (editDiff) {
167
- terminal.writeLine(s.warning('● ') + chalk.bold(`Edit(${filePath.split('/').pop() ?? 'unknown'})`));
168
- terminal.writeLine(diff.formatDiffHeader(filePath, editDiff.additions, editDiff.removals));
169
- for (const line of editDiff.lines) {
170
- terminal.writeLine(line);
171
- }
172
- terminal.writeLine('');
173
- }
174
- else {
175
- // Fallback: show simple edit info
176
- terminal.writeLine(s.warning('● ') + chalk.bold(`Edit(${filePath.split('/').pop() ?? 'unknown'})`));
177
- terminal.writeLine(` ${s.muted('⎿')} Will replace text in ${s.primary(filePath.split('/').pop() ?? filePath)}`);
178
- terminal.writeLine(` ${chalk.bgRed.white(' - ')} ${s.muted(oldText.slice(0, 60))}${oldText.length > 60 ? '...' : ''}`);
179
- terminal.writeLine(` ${chalk.bgGreen.black(' + ')} ${s.muted(newText.slice(0, 60))}${newText.length > 60 ? '...' : ''}`);
180
- terminal.writeLine('');
181
- }
345
+ // If no lastProjectId remembered, don't auto-load any project
346
+ }
347
+ // else projectStartupMode === 'off': don't auto-load any project
348
+ if (dbProject) {
349
+ // Set as active project for tools to use
350
+ setActiveProject({ id: dbProject.id, name: dbProject.name, displayName: dbProject.displayName, path: dbProject.path });
351
+ // If in guided mode, generate context
352
+ if (shouldInjectGuidedContext(dbProject)) {
353
+ // Get work item counts
354
+ const statusCounts = workItemRepository.getStatusCounts(dbProject.id);
355
+ // Get current work item if set
356
+ let currentItem = null;
357
+ if (dbProject.currentItemId) {
358
+ currentItem = workItemRepository.getByItemId(dbProject.id, dbProject.currentItemId);
182
359
  }
183
- }
184
- try {
185
- const result = await showPermissionOverlay({
186
- toolName: request.toolName,
187
- args: request.input,
188
- description: request.description,
189
- });
190
- // If user chose 'allow-always', grant session permission and switch to auto-accept mode
191
- if (result === 'allow-always') {
192
- sharedState.grantSession?.(request.toolName);
193
- // Switch to auto-accept mode so user can see and toggle back if needed
194
- sharedState.setMode?.('auto-accept');
360
+ else {
361
+ // Look for any in-progress item
362
+ const inProgressItems = workItemRepository.query({
363
+ project_id: dbProject.id,
364
+ status: 'in_progress',
365
+ limit: 1,
366
+ });
367
+ if (inProgressItems.items.length > 0) {
368
+ currentItem = inProgressItems.items[0];
369
+ }
195
370
  }
196
- // Convert result to boolean (allow/allow-always = true, deny = false)
197
- return result !== 'deny';
198
- }
199
- finally {
200
- // Clear overlay active flag and resume footer
201
- setOverlayActive(false);
202
- sharedState.resumeFooter?.();
203
- }
204
- };
205
- // Register ask_user handler that coordinates with footer
206
- registerAskUserHandler(async (input) => {
207
- // Pause footer to prevent interference with the overlay
208
- sharedState.pauseFooter?.();
209
- try {
210
- // Show the overlay and get answers
211
- const result = await showAskUserOverlay({
212
- questions: input.questions,
213
- context: input.context,
214
- });
215
- return result;
216
- }
217
- finally {
218
- // Resume footer after overlay closes
219
- sharedState.resumeFooter?.();
371
+ // Generate guided mode context
372
+ const contextOptions = {
373
+ project: dbProject,
374
+ currentItem,
375
+ backlogCount: statusCounts.backlog,
376
+ inProgressCount: statusCounts.in_progress,
377
+ completedCount: statusCounts.completed,
378
+ };
379
+ guidedModeContext = getFullGuidedPrompt(contextOptions);
220
380
  }
221
- });
222
- // Register ask_user_simple handler for smaller models (flat schema)
223
- registerAskUserSimpleHandler(async (input) => {
224
- // Pause footer to prevent interference with the overlay
225
- sharedState.pauseFooter?.();
226
- try {
227
- // Show the simple overlay and get answer
228
- const result = await showAskUserSimpleOverlay({
229
- question: input.question,
230
- options: input.options,
231
- allowCustom: input.allowCustom,
232
- });
233
- return result;
234
- }
235
- finally {
236
- // Resume footer after overlay closes
237
- sharedState.resumeFooter?.();
238
- }
239
- });
381
+ }
382
+ // ==========================================================================
383
+ // Load persisted anchors (critical info that survives compaction)
384
+ // ==========================================================================
385
+ perf('anchors-start');
386
+ // Load global anchors (always)
387
+ const globalAnchors = getGlobalAnchorManager().getAll({ scope: 'persistent' });
388
+ // Load project-specific anchors (if in a tracked project)
389
+ const projectAnchors = dbProject
390
+ ? getAnchorManager(String(dbProject.id)).getAll({ scope: 'persistent' })
391
+ : [];
392
+ // Combine into persistedAnchors array for agent
393
+ const persistedAnchors = [
394
+ ...globalAnchors.map((a) => ({
395
+ id: a.id,
396
+ content: a.content,
397
+ priority: a.priority,
398
+ scope: a.scope,
399
+ tags: a.tags,
400
+ })),
401
+ ...projectAnchors.map((a) => ({
402
+ id: a.id,
403
+ content: a.content,
404
+ priority: a.priority,
405
+ scope: a.scope,
406
+ tags: a.tags,
407
+ projectId: String(dbProject?.id),
408
+ })),
409
+ ];
410
+ // ==========================================================================
411
+ // Create handlers and agent BEFORE menu (so menu can access agent info)
412
+ // ==========================================================================
413
+ perf('handlers-start');
414
+ // Create permission handler that respects mode state and custom rules
415
+ const onPermissionRequest = createPermissionHandler(sharedState);
416
+ // Register ask_user and ask_user_simple handlers
417
+ registerAskUserHandlers(sharedState);
418
+ // Register delegate, delegate_background, and handoff handlers for multi-agent delegation
419
+ registerDelegationHandlers(sharedState);
240
420
  // Create iteration limit handler that shows overlay
241
421
  const onIterationLimitReached = async (context) => {
242
- // Pause footer to prevent interference with the overlay
243
- sharedState.pauseFooter?.();
244
- setOverlayActive(true);
245
- try {
246
- const result = await showIterationLimitOverlay({
247
- iteration: context.iteration,
248
- maxIterations: context.maxIterations,
249
- toolCallCount: context.toolCallCount,
250
- });
251
- if (result.continue) {
252
- return result.additionalIterations;
253
- }
254
- return false;
422
+ // Wait for event loop to process any pending tool_end events
423
+ await new Promise((resolve) => setImmediate(resolve));
424
+ // Flush any accumulated text BEFORE showing the overlay
425
+ sharedState.flushTextBuffer?.();
426
+ // Use TerminalUI overlay system
427
+ if (!sharedState.showIterationLimitOverlayV2) {
428
+ throw new Error('iteration_limit overlay not initialized');
255
429
  }
256
- finally {
257
- // Clear overlay active flag and resume footer
258
- setOverlayActive(false);
259
- sharedState.resumeFooter?.();
430
+ const result = await sharedState.showIterationLimitOverlayV2({
431
+ iteration: context.iteration,
432
+ maxIterations: context.maxIterations,
433
+ toolCallCount: context.toolCallCount,
434
+ });
435
+ if (result.continue) {
436
+ return result.additionalIterations;
260
437
  }
438
+ return false;
439
+ };
440
+ // Create guardrail confirmation handler (for risky operations that need approval)
441
+ const onGuardrailTriggered = async (result, context) => {
442
+ // Wait for event loop to process any pending events
443
+ await new Promise((resolve) => setImmediate(resolve));
444
+ // Flush any accumulated text BEFORE showing the overlay
445
+ sharedState.flushTextBuffer?.();
446
+ const overlayOptions = {
447
+ name: result.guardrail?.name ?? 'Unknown Guardrail',
448
+ message: result.guardrail?.message ?? 'This operation requires confirmation.',
449
+ action: result.guardrail?.action ?? 'confirm',
450
+ toolName: context.toolName,
451
+ matchedInput: result.match ?? context.inputString,
452
+ category: result.guardrail?.tags?.[0],
453
+ };
454
+ // Use TerminalUI overlay system
455
+ if (!sharedState.showGuardrailOverlayV2) {
456
+ throw new Error('guardrail overlay not initialized');
457
+ }
458
+ const overlayResult = await sharedState.showGuardrailOverlayV2(overlayOptions);
459
+ return overlayResult.approved;
460
+ };
461
+ // ==========================================================================
462
+ // MCP Server Initialization (deferred — connects in background after REPL starts)
463
+ // ==========================================================================
464
+ perf('mcp-init-fire');
465
+ // Check if there are MCP servers to connect — fire the promise but don't await yet
466
+ const mcpServerCount = loadMCPConfig(dbProject?.path).length;
467
+ const mcpInitPromise = mcpServerCount > 0 ? initializeMCP(dbProject?.path) : null;
468
+ // Mutable ref for MCP tools — read by team agent factory when creating new agents.
469
+ // Updated when background MCP init completes.
470
+ let mcpToolsRef = [];
471
+ // ==========================================================================
472
+ // Episode Recorder Setup (work history tracking)
473
+ // ==========================================================================
474
+ const createEpisodeRecorder = (agentId) => {
475
+ if (!dbProject)
476
+ return undefined;
477
+ const episodesPath = path.join(getSessionsPath(), `project-${String(dbProject.id)}`, 'episodes.json');
478
+ const store = new FileEpisodeStore({ filePath: episodesPath });
479
+ // Set global store for recall_work tool access
480
+ setGlobalEpisodeStore(store);
481
+ return new EpisodeRecorder({
482
+ store,
483
+ agentId,
484
+ terminalPrefix: sharedState.sessionPrefix || 'unknown',
485
+ sessionId: sharedState.sessionPrefix || 'unknown',
486
+ onBatchFlushed: () => {
487
+ updateWorkSummaryAnchor({
488
+ store,
489
+ projectId: String(dbProject.id),
490
+ getAnchorManager,
491
+ });
492
+ },
493
+ });
261
494
  };
262
- // Create agent with permission handler and suggestion callback
495
+ const defaultEpisodeRecorder = createEpisodeRecorder('default');
496
+ // Create agent with permission handler and suggestion callback (no MCP tools yet)
497
+ perf('create-agent-start');
263
498
  const agent = createAgent({
264
499
  provider,
265
500
  model,
266
501
  minimal: options.minimal,
502
+ quiet: true,
503
+ enableMetaTools: !options.minimal, // Use meta-tools for token optimization
267
504
  onPermissionRequest,
268
505
  onIterationLimitReached,
269
506
  onSuggest: (event) => {
270
507
  // Store suggestion to be applied after agent finishes
271
508
  sharedState.pendingSuggestion = event.action;
272
509
  },
510
+ projectName: dbProject?.displayName,
273
511
  projectContext,
512
+ guidedModeContext,
513
+ // Anchors - library handles re-injection on every LLM call
514
+ enableAnchors: true,
515
+ persistedAnchors: persistedAnchors.length > 0 ? persistedAnchors : undefined,
516
+ // Guardrails - 15 built-in safety patterns for risky operations
517
+ // Warnings are emitted as 'guardrail_warning' events and handled by REPL
518
+ enableGuardrails: true,
519
+ onGuardrailTriggered,
520
+ // Subagent tracking callbacks (forwarded to footer via sharedState)
521
+ // Now using toolUseId for direct correlation (no more FIFO matching)
522
+ onSubagentStart: (toolUseId, agentType, description) => {
523
+ sharedState.onSubagentStart?.(toolUseId, agentType, description);
524
+ },
525
+ onSubagentEnd: (toolUseId, success, tokenCount, error) => {
526
+ sharedState.onSubagentEnd?.(toolUseId, success, tokenCount, error);
527
+ },
528
+ onSubagentToolUse: (toolUseId, toolName, summary) => {
529
+ sharedState.onSubagentToolUse?.(toolUseId, toolName, summary);
530
+ },
531
+ // Receive function to clear subagent tracking between runs
532
+ onSubagentTrackingReady: (clearTracking) => {
533
+ sharedState.clearSubagentTracking = clearTracking;
534
+ },
535
+ // MCP tools injected later via agent.registerTools() when background init completes
536
+ // Episode recorder for work history tracking
537
+ episodeRecorder: defaultEpisodeRecorder,
274
538
  });
539
+ perf('create-agent-done');
275
540
  // Bind grantSession for the permission handler to use
276
541
  sharedState.grantSession = (toolName) => {
277
542
  agent.grantSessionPermission(toolName);
278
543
  };
279
- // Note: setMode will be bound after REPL is created (see below)
280
- // Create and run REPL with mode state setter and footer callbacks
281
- const repl = new REPL({
544
+ // ==========================================================================
545
+ // Create AgentTeam with the default agent (or restore from persistence)
546
+ // ==========================================================================
547
+ perf('team-setup-start');
548
+ // Define agent factory for creating team agents
549
+ const agentFactory = (_config, systemPromptAddition, useMinimalSystemPrompt, noTools, toolFilter, modelTier) => {
550
+ // Resolve model from tier if provided, otherwise use global model
551
+ const agentModel = modelTier ? getModelForTier(provider, modelTier) : model;
552
+ // Create new agent with same base options plus role-specific system prompt
553
+ return Promise.resolve(createAgent({
554
+ provider,
555
+ model: agentModel,
556
+ minimal: options.minimal,
557
+ enableMetaTools: !options.minimal && !noTools, // Disable meta-tools if noTools is set
558
+ onPermissionRequest,
559
+ onIterationLimitReached,
560
+ onSuggest: (event) => {
561
+ sharedState.pendingSuggestion = event.action;
562
+ },
563
+ projectName: dbProject?.displayName,
564
+ projectContext,
565
+ guidedModeContext,
566
+ enableAnchors: true,
567
+ persistedAnchors: persistedAnchors.length > 0 ? persistedAnchors : undefined,
568
+ enableGuardrails: true,
569
+ onGuardrailTriggered,
570
+ onSubagentStart: (toolUseId, agentType, description) => {
571
+ sharedState.onSubagentStart?.(toolUseId, agentType, description);
572
+ },
573
+ onSubagentEnd: (toolUseId, success, tokenCount, error) => {
574
+ sharedState.onSubagentEnd?.(toolUseId, success, tokenCount, error);
575
+ },
576
+ onSubagentToolUse: (toolUseId, toolName, summary) => {
577
+ sharedState.onSubagentToolUse?.(toolUseId, toolName, summary);
578
+ },
579
+ onSubagentTrackingReady: (clearTracking) => {
580
+ sharedState.clearSubagentTracking = clearTracking;
581
+ },
582
+ // Add role-specific system prompt
583
+ systemPromptAddition,
584
+ // Use minimal system prompt (skip all modules) - for testing role identity
585
+ useMinimalSystemPrompt,
586
+ // Skip all tool registration - for testing role identity without tool interference
587
+ noTools,
588
+ // Tool filter - limit which tools this agent can use
589
+ toolFilter,
590
+ // MCP tools from external servers (reads mutable ref — includes tools once MCP init completes)
591
+ mcpTools: mcpToolsRef.length > 0 ? mcpToolsRef : undefined,
592
+ // Suppress startup logs for team agents (avoid UI interference)
593
+ quiet: true,
594
+ // Episode recorder for work history tracking (team agents share project store)
595
+ episodeRecorder: createEpisodeRecorder('team-agent'),
596
+ }));
597
+ };
598
+ // Create fresh team — team restoration happens through session restore in ReplV2.
599
+ // This ensures team state is always bound to a session (no independent team loading).
600
+ const team = new AgentTeam({
601
+ name: 'Team',
602
+ agentFactory,
603
+ });
604
+ team.setDefaultAgent(agent);
605
+ // Set the active shared context for activity recording
606
+ setActiveSharedContext(team.sharedContext);
607
+ // Populate shared context with actual project info so agents know the project name
608
+ if (dbProject) {
609
+ team.sharedContext.setProject({
610
+ id: dbProject.id,
611
+ name: dbProject.displayName,
612
+ path: dbProject.path,
613
+ });
614
+ }
615
+ // ==========================================================================
616
+ // Create and run REPL
617
+ // ==========================================================================
618
+ perf('repl-setup-start');
619
+ // Store team reference in sharedState for delegate handler access
620
+ sharedState.team = team;
621
+ // Await background update check (ran in parallel with auth + project loading)
622
+ if (updateCheckPromise) {
623
+ perf('update-check-wait');
624
+ await updateCheckPromise;
625
+ perf('update-check-done');
626
+ }
627
+ // VS Code diff: set enabled state based on settings + environment
628
+ perf('vscode-detect');
629
+ sharedState.vsDiffEnabled = isInVSCode() && getSetting('vsDiffExtension');
630
+ perf('repl-v2-create');
631
+ const replV2 = new ReplV2({
282
632
  agent,
633
+ team,
634
+ agentFactory,
283
635
  model,
284
636
  provider,
285
637
  version: VERSION,
286
- showFiltering: options.showFiltering,
287
- onModeChange: (mode) => {
288
- sharedState.mode = mode;
638
+ updateAvailable,
639
+ projectName: dbProject?.displayName ?? process.cwd().split('/').pop(),
640
+ // Set up V2 permission overlay callback when UI is ready
641
+ onUIReady: (showOverlay) => {
642
+ sharedState.showPermissionOverlayV2 = showOverlay;
643
+ },
644
+ // Set up text buffer flush callback for V2 mode
645
+ onTextBufferReady: (flushTextBuffer) => {
646
+ sharedState.flushTextBuffer = flushTextBuffer;
647
+ },
648
+ // Set up ask_user_simple V2 overlay callback
649
+ onAskUserSimpleReady: (showOverlay) => {
650
+ sharedState.showAskUserSimpleOverlayV2 = showOverlay;
651
+ },
652
+ // Set up guardrail V2 overlay callback
653
+ onGuardrailReady: (showOverlay) => {
654
+ sharedState.showGuardrailOverlayV2 = showOverlay;
655
+ },
656
+ // Set up ask_user V2 overlay callback
657
+ onAskUserReady: (showOverlay) => {
658
+ sharedState.showAskUserOverlayV2 = showOverlay;
289
659
  },
290
- onFooterReady: (pause, resume, setSuggestion) => {
291
- sharedState.pauseFooter = pause;
292
- sharedState.resumeFooter = resume;
660
+ // Set up iteration_limit V2 overlay callback
661
+ onIterationLimitReady: (showOverlay) => {
662
+ sharedState.showIterationLimitOverlayV2 = showOverlay;
663
+ },
664
+ // Set up delegate V2 overlay callback
665
+ onDelegateReady: (showOverlay) => {
666
+ sharedState.showDelegateOverlayV2 = showOverlay;
667
+ },
668
+ // Callback to handle pending delegation after agent finishes
669
+ onPendingDelegation: () => {
670
+ const pending = sharedState.pendingDelegation;
671
+ sharedState.pendingDelegation = null;
672
+ return pending ?? null;
673
+ },
674
+ // Set up subagent tracking callbacks for LiveRegion rendering
675
+ onSubagentReady: (callbacks) => {
676
+ sharedState.onSubagentStart = callbacks.onStart;
677
+ sharedState.onSubagentToolUse = callbacks.onToolUse;
678
+ sharedState.onSubagentEnd = callbacks.onEnd;
679
+ },
680
+ // Pass function to clear agent.ts subagent tracking between runs
681
+ clearSubagentTracking: sharedState.clearSubagentTracking,
682
+ // Set up suggestion callback when UI is ready
683
+ onSuggestionReady: (setSuggestion) => {
293
684
  sharedState.setSuggestion = setSuggestion;
294
685
  },
686
+ // Apply pending suggestions when agent finishes
295
687
  onAgentFinish: () => {
296
- // Apply any pending suggestion now that agent has finished
297
688
  if (sharedState.pendingSuggestion) {
298
689
  sharedState.setSuggestion?.(sharedState.pendingSuggestion);
299
690
  sharedState.pendingSuggestion = null;
300
691
  }
301
692
  },
693
+ // Phase 3b: Set up background agent tracking callbacks for permission routing
694
+ onBackgroundAgentReady: (callbacks) => {
695
+ sharedState.isBackgroundAgent = callbacks.isBackgroundAgent;
696
+ sharedState.getActiveBackgroundAgentId = callbacks.getActiveBackgroundAgentId;
697
+ sharedState.getBackgroundAgentInfo = callbacks.getBackgroundAgentInfo;
698
+ },
699
+ // Phase 3d-beta: Set up background delegation callback for coordinator mode
700
+ onBackgroundDelegationReady: (runDelegation) => {
701
+ sharedState.runBackgroundDelegation = runDelegation;
702
+ },
703
+ // Update sharedState.team when session restore replaces the team object
704
+ // (so delegation handlers see restored agents, not just 'default')
705
+ onTeamReplaced: (newTeam) => {
706
+ sharedState.team = newTeam;
707
+ },
708
+ // Set session prefix for VS Code diff IPC after session registration
709
+ onSessionRegistered: (sessionId) => {
710
+ sharedState.sessionPrefix = sessionId.slice(0, 8);
711
+ },
712
+ // Show onboarding wizard on first run
713
+ showOnboarding: !isFirstRunComplete(),
714
+ // Show login overlay if not authenticated
715
+ showLogin,
302
716
  });
303
- // Bind setMode for the permission handler to use
304
- sharedState.setMode = (mode) => {
305
- repl.setMode(mode);
306
- };
307
717
  // Handle Ctrl+C gracefully
308
718
  process.on('SIGINT', () => {
309
- repl.stop();
719
+ // Flush episode recorder before exit
720
+ defaultEpisodeRecorder?.flush();
721
+ replV2.stop();
722
+ // Clean up MCP servers (kill child processes)
723
+ void mcpManagerInstance?.disconnectAll();
310
724
  process.exit(0);
311
725
  });
312
- await repl.run();
313
- process.exit(0);
726
+ perf('repl-v2-start');
727
+ replV2.start();
728
+ perf('startup-complete');
729
+ flushStartupPerf();
730
+ // Complete MCP initialization in background — inject tools once connected.
731
+ // Shows "mcp: connecting..." in footer status bar while loading.
732
+ // MCP timing details available in ~/.compilr-dev/startup-perf.log.
733
+ if (mcpInitPromise) {
734
+ replV2.setMCPLoading(true);
735
+ mcpInitPromise
736
+ .then((tools) => {
737
+ perf('mcp-background-done');
738
+ replV2.setMCPLoading(false, tools.length);
739
+ if (tools.length > 0) {
740
+ agent.registerTools(tools);
741
+ mcpToolsRef = tools;
742
+ }
743
+ })
744
+ .catch(() => {
745
+ // MCP failure is non-fatal — agent works without MCP tools
746
+ replV2.setMCPLoading(false);
747
+ });
748
+ }
749
+ // REPL V2 runs in event loop - the ReplV2 manages its own lifecycle
314
750
  }
315
751
  // =============================================================================
316
752
  // Provider Detection
@@ -328,15 +764,15 @@ function detectProvider() {
328
764
  function getDefaultModel(provider) {
329
765
  switch (provider) {
330
766
  case 'claude':
331
- return 'claude-sonnet-4-20250514';
767
+ return 'claude-sonnet-4-5-20250929';
332
768
  case 'openai':
333
- return 'gpt-4o';
769
+ return 'gpt-5-mini-2025-08-07';
334
770
  case 'gemini':
335
- return 'gemini-2.0-flash';
771
+ return 'gemini-3-flash-preview';
336
772
  case 'ollama':
337
- return 'llama3.2';
773
+ return 'llama3.2:8b';
338
774
  default:
339
- return 'claude-sonnet-4-20250514';
775
+ return 'claude-sonnet-4-5-20250929';
340
776
  }
341
777
  }
342
778
  // =============================================================================