@compilr-dev/cli 0.5.0 → 0.5.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (587) hide show
  1. package/LICENSE +108 -0
  2. package/README.md +237 -69
  3. package/dist/.tsbuildinfo.app +1 -0
  4. package/dist/.tsbuildinfo.data +1 -0
  5. package/dist/.tsbuildinfo.domain +1 -0
  6. package/dist/.tsbuildinfo.foundation +1 -0
  7. package/dist/agent.d.ts +61 -4
  8. package/dist/agent.js +241 -245
  9. package/dist/anchors/index.d.ts +1 -1
  10. package/dist/anchors/index.js +1 -1
  11. package/dist/anchors/project-anchors.d.ts +2 -2
  12. package/dist/anchors/project-anchors.js +1 -1
  13. package/dist/auth/api-client.d.ts +124 -0
  14. package/dist/auth/api-client.js +261 -0
  15. package/dist/auth/index.d.ts +172 -0
  16. package/dist/auth/index.js +545 -0
  17. package/dist/auth/storage.d.ts +52 -0
  18. package/dist/auth/storage.js +118 -0
  19. package/dist/changelog/index.d.ts +16 -0
  20. package/dist/changelog/index.js +24 -0
  21. package/dist/changelog/releases.d.ts +17 -0
  22. package/dist/changelog/releases.js +63 -0
  23. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  24. package/dist/commands-v2/handlers/auth.js +118 -0
  25. package/dist/commands-v2/handlers/background.d.ts +14 -0
  26. package/dist/commands-v2/handlers/background.js +276 -0
  27. package/dist/commands-v2/handlers/context.js +286 -81
  28. package/dist/commands-v2/handlers/core.d.ts +1 -0
  29. package/dist/commands-v2/handlers/core.js +133 -8
  30. package/dist/commands-v2/handlers/debug.js +18 -0
  31. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  32. package/dist/commands-v2/handlers/delegations.js +29 -0
  33. package/dist/commands-v2/handlers/files.d.ts +8 -0
  34. package/dist/commands-v2/handlers/files.js +162 -0
  35. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  36. package/dist/commands-v2/handlers/filter.js +130 -0
  37. package/dist/commands-v2/handlers/games.d.ts +7 -0
  38. package/dist/commands-v2/handlers/games.js +57 -0
  39. package/dist/commands-v2/handlers/index.d.ts +13 -0
  40. package/dist/commands-v2/handlers/index.js +39 -0
  41. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  42. package/dist/commands-v2/handlers/mcp.js +39 -0
  43. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  44. package/dist/commands-v2/handlers/notifications.js +34 -0
  45. package/dist/commands-v2/handlers/project.js +295 -31
  46. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  47. package/dist/commands-v2/handlers/reset.js +118 -0
  48. package/dist/commands-v2/handlers/session.d.ts +161 -0
  49. package/dist/commands-v2/handlers/session.js +805 -0
  50. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  51. package/dist/commands-v2/handlers/settings.js +217 -35
  52. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  53. package/dist/commands-v2/handlers/tasks.js +36 -0
  54. package/dist/commands-v2/handlers/team.d.ts +9 -0
  55. package/dist/commands-v2/handlers/team.js +549 -0
  56. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  57. package/dist/commands-v2/handlers/terminals.js +34 -0
  58. package/dist/commands-v2/index.d.ts +3 -2
  59. package/dist/commands-v2/index.js +4 -1
  60. package/dist/commands-v2/registry.d.ts +15 -0
  61. package/dist/commands-v2/registry.js +34 -0
  62. package/dist/commands-v2/types.d.ts +81 -3
  63. package/dist/commands.js +13 -0
  64. package/dist/compilr-diff-companion.vsix +0 -0
  65. package/dist/db/index.js +98 -4
  66. package/dist/db/repositories/document-repository.d.ts +2 -0
  67. package/dist/db/repositories/document-repository.js +6 -1
  68. package/dist/db/repositories/index.d.ts +2 -0
  69. package/dist/db/repositories/index.js +1 -0
  70. package/dist/db/repositories/plan-repository.d.ts +101 -0
  71. package/dist/db/repositories/plan-repository.js +275 -0
  72. package/dist/db/repositories/project-repository.d.ts +6 -0
  73. package/dist/db/repositories/project-repository.js +41 -0
  74. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  75. package/dist/db/repositories/work-item-repository.js +69 -4
  76. package/dist/db/schema.d.ts +40 -3
  77. package/dist/db/schema.js +66 -3
  78. package/dist/episodes/index.d.ts +20 -0
  79. package/dist/episodes/index.js +27 -0
  80. package/dist/episodes/recorder.d.ts +51 -0
  81. package/dist/episodes/recorder.js +195 -0
  82. package/dist/episodes/significant-work.d.ts +21 -0
  83. package/dist/episodes/significant-work.js +56 -0
  84. package/dist/episodes/store.d.ts +38 -0
  85. package/dist/episodes/store.js +199 -0
  86. package/dist/episodes/types.d.ts +35 -0
  87. package/dist/episodes/types.js +6 -0
  88. package/dist/episodes/work-at-risk.d.ts +12 -0
  89. package/dist/episodes/work-at-risk.js +38 -0
  90. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  91. package/dist/episodes/work-summary-anchor.js +73 -0
  92. package/dist/games/coins.d.ts +66 -0
  93. package/dist/games/coins.js +165 -0
  94. package/dist/games/game-base.d.ts +84 -0
  95. package/dist/games/game-base.js +204 -0
  96. package/dist/games/index.d.ts +16 -0
  97. package/dist/games/index.js +49 -0
  98. package/dist/games/scores.d.ts +69 -0
  99. package/dist/games/scores.js +191 -0
  100. package/dist/games/tetris/board.d.ts +59 -0
  101. package/dist/games/tetris/board.js +170 -0
  102. package/dist/games/tetris/index.d.ts +109 -0
  103. package/dist/games/tetris/index.js +610 -0
  104. package/dist/games/tetris/pieces.d.ts +44 -0
  105. package/dist/games/tetris/pieces.js +271 -0
  106. package/dist/games/tetris/renderer.d.ts +26 -0
  107. package/dist/games/tetris/renderer.js +77 -0
  108. package/dist/guide/guide-content.d.ts +23 -0
  109. package/dist/guide/guide-content.js +196 -0
  110. package/dist/guide/index.d.ts +8 -0
  111. package/dist/guide/index.js +7 -0
  112. package/dist/guide/shared-content.d.ts +37 -0
  113. package/dist/guide/shared-content.js +1272 -0
  114. package/dist/guide/tutorial-helpers.d.ts +57 -0
  115. package/dist/guide/tutorial-helpers.js +147 -0
  116. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  117. package/dist/handlers/ask-user-handlers.js +104 -0
  118. package/dist/handlers/delegation-handlers.d.ts +34 -0
  119. package/dist/handlers/delegation-handlers.js +291 -0
  120. package/dist/handlers/permission-handler.d.ts +30 -0
  121. package/dist/handlers/permission-handler.js +205 -0
  122. package/dist/index.d.ts +11 -1
  123. package/dist/index.js +448 -271
  124. package/dist/input-handlers/memory-handler.d.ts +1 -1
  125. package/dist/input-handlers/memory-handler.js +2 -1
  126. package/dist/models/index.d.ts +10 -0
  127. package/dist/models/index.js +12 -0
  128. package/dist/models/model-registry.d.ts +38 -0
  129. package/dist/models/model-registry.js +69 -0
  130. package/dist/models/model-tiers.d.ts +28 -0
  131. package/dist/models/model-tiers.js +71 -0
  132. package/dist/models/model-validation.d.ts +25 -0
  133. package/dist/models/model-validation.js +291 -0
  134. package/dist/models/ollama-models.d.ts +73 -0
  135. package/dist/models/ollama-models.js +178 -0
  136. package/dist/models/provider-types.d.ts +6 -0
  137. package/dist/models/provider-types.js +1 -0
  138. package/dist/models/providers.d.ts +35 -0
  139. package/dist/models/providers.js +58 -0
  140. package/dist/models/types.d.ts +4 -0
  141. package/dist/models/types.js +4 -0
  142. package/dist/multi-agent/activity.d.ts +21 -0
  143. package/dist/multi-agent/activity.js +34 -0
  144. package/dist/multi-agent/agent-selection.d.ts +55 -0
  145. package/dist/multi-agent/agent-selection.js +90 -0
  146. package/dist/multi-agent/artifacts.d.ts +197 -0
  147. package/dist/multi-agent/artifacts.js +379 -0
  148. package/dist/multi-agent/checkpointer.d.ts +138 -0
  149. package/dist/multi-agent/checkpointer.js +471 -0
  150. package/dist/multi-agent/collision-utils.d.ts +16 -0
  151. package/dist/multi-agent/collision-utils.js +28 -0
  152. package/dist/multi-agent/context-resolver.d.ts +97 -0
  153. package/dist/multi-agent/context-resolver.js +316 -0
  154. package/dist/multi-agent/custom-agents.d.ts +83 -0
  155. package/dist/multi-agent/custom-agents.js +227 -0
  156. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  157. package/dist/multi-agent/delegation-tracker.js +243 -0
  158. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  159. package/dist/multi-agent/file-lock-hook.js +97 -0
  160. package/dist/multi-agent/file-locks.d.ts +58 -0
  161. package/dist/multi-agent/file-locks.js +194 -0
  162. package/dist/multi-agent/index.d.ts +24 -0
  163. package/dist/multi-agent/index.js +30 -0
  164. package/dist/multi-agent/mention-parser.d.ts +64 -0
  165. package/dist/multi-agent/mention-parser.js +146 -0
  166. package/dist/multi-agent/notification-manager.d.ts +84 -0
  167. package/dist/multi-agent/notification-manager.js +224 -0
  168. package/dist/multi-agent/pending-requests.d.ts +122 -0
  169. package/dist/multi-agent/pending-requests.js +155 -0
  170. package/dist/multi-agent/session-registry.d.ts +139 -0
  171. package/dist/multi-agent/session-registry.js +514 -0
  172. package/dist/multi-agent/shared-context.d.ts +293 -0
  173. package/dist/multi-agent/shared-context.js +671 -0
  174. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  175. package/dist/multi-agent/skill-requirements.js +178 -0
  176. package/dist/multi-agent/task-assignment.d.ts +69 -0
  177. package/dist/multi-agent/task-assignment.js +123 -0
  178. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  179. package/dist/multi-agent/task-suggestion.js +72 -0
  180. package/dist/multi-agent/team-agent.d.ts +201 -0
  181. package/dist/multi-agent/team-agent.js +488 -0
  182. package/dist/multi-agent/team.d.ts +286 -0
  183. package/dist/multi-agent/team.js +610 -0
  184. package/dist/multi-agent/tool-config.d.ts +110 -0
  185. package/dist/multi-agent/tool-config.js +661 -0
  186. package/dist/multi-agent/types.d.ts +211 -0
  187. package/dist/multi-agent/types.js +617 -0
  188. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  189. package/dist/prompts/plan-mode-prompt.js +95 -0
  190. package/dist/repl-helpers.js +5 -2
  191. package/dist/repl-v2.d.ts +401 -2
  192. package/dist/repl-v2.js +2588 -65
  193. package/dist/session/index.d.ts +6 -0
  194. package/dist/session/index.js +6 -0
  195. package/dist/session/project-session-manager.d.ts +158 -0
  196. package/dist/session/project-session-manager.js +650 -0
  197. package/dist/settings/index.d.ts +133 -13
  198. package/dist/settings/index.js +329 -24
  199. package/dist/settings/mcp-config.d.ts +76 -0
  200. package/dist/settings/mcp-config.js +143 -0
  201. package/dist/settings/paths.d.ts +4 -0
  202. package/dist/settings/paths.js +6 -0
  203. package/dist/shared-handlers.d.ts +62 -0
  204. package/dist/shared-handlers.js +48 -0
  205. package/dist/system-prompt/builder.d.ts +5 -0
  206. package/dist/system-prompt/builder.js +4 -0
  207. package/dist/system-prompt/index.d.ts +18 -0
  208. package/dist/system-prompt/index.js +18 -0
  209. package/dist/system-prompt/modules.d.ts +5 -0
  210. package/dist/system-prompt/modules.js +4 -0
  211. package/dist/tabbed-menu.js +2 -1
  212. package/dist/templates/compilr-md-import.d.ts +16 -0
  213. package/dist/templates/compilr-md-import.js +241 -0
  214. package/dist/templates/compilr-md.js +10 -61
  215. package/dist/templates/config-json.d.ts +1 -25
  216. package/dist/templates/index.d.ts +2 -0
  217. package/dist/templates/index.js +34 -73
  218. package/dist/tool-names.d.ts +113 -0
  219. package/dist/tool-names.js +239 -0
  220. package/dist/tools/ask-user-simple.d.ts +1 -1
  221. package/dist/tools/ask-user-simple.js +2 -1
  222. package/dist/tools/ask-user.d.ts +1 -1
  223. package/dist/tools/ask-user.js +2 -1
  224. package/dist/tools/backlog.d.ts +2 -2
  225. package/dist/tools/backlog.js +1 -1
  226. package/dist/tools/db-tools.d.ts +13 -61
  227. package/dist/tools/db-tools.js +12 -13
  228. package/dist/tools/delegate-background.d.ts +27 -0
  229. package/dist/tools/delegate-background.js +115 -0
  230. package/dist/tools/delegate.d.ts +22 -0
  231. package/dist/tools/delegate.js +97 -0
  232. package/dist/tools/delegation-status.d.ts +16 -0
  233. package/dist/tools/delegation-status.js +128 -0
  234. package/dist/tools/guide-tool.d.ts +12 -0
  235. package/dist/tools/guide-tool.js +59 -0
  236. package/dist/tools/handoff.d.ts +25 -0
  237. package/dist/tools/handoff.js +99 -0
  238. package/dist/tools/meta-tools.d.ts +26 -0
  239. package/dist/tools/meta-tools.js +47 -0
  240. package/dist/tools/platform-adapter.d.ts +35 -0
  241. package/dist/tools/platform-adapter.js +404 -0
  242. package/dist/tools/project-db.d.ts +5 -73
  243. package/dist/tools/project-db.js +5 -336
  244. package/dist/tools.d.ts +67 -2
  245. package/dist/tools.js +240 -48
  246. package/dist/ui/autocomplete-controller.d.ts +42 -0
  247. package/dist/ui/autocomplete-controller.js +384 -0
  248. package/dist/ui/base/index.d.ts +1 -1
  249. package/dist/ui/base/index.js +1 -1
  250. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  251. package/dist/ui/base/overlay-base-v2.js +14 -0
  252. package/dist/ui/base/render-utils.d.ts +19 -0
  253. package/dist/ui/base/render-utils.js +25 -0
  254. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  255. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  256. package/dist/ui/constants/labels.d.ts +14 -0
  257. package/dist/ui/constants/labels.js +52 -0
  258. package/dist/ui/conversation-store.d.ts +55 -0
  259. package/dist/ui/conversation-store.js +107 -0
  260. package/dist/ui/conversation.js +11 -13
  261. package/dist/ui/diff.d.ts +7 -1
  262. package/dist/ui/diff.js +85 -48
  263. package/dist/ui/ephemeral.js +3 -9
  264. package/dist/ui/file-autocomplete.d.ts +24 -0
  265. package/dist/ui/file-autocomplete.js +56 -0
  266. package/dist/ui/footer-renderer.d.ts +69 -0
  267. package/dist/ui/footer-renderer.js +431 -0
  268. package/dist/ui/footer.d.ts +74 -7
  269. package/dist/ui/footer.js +173 -16
  270. package/dist/ui/input-controller.d.ts +51 -0
  271. package/dist/ui/input-controller.js +176 -0
  272. package/dist/ui/input-prompt.d.ts +19 -0
  273. package/dist/ui/input-prompt.js +206 -14
  274. package/dist/ui/keyboard-handler.d.ts +57 -0
  275. package/dist/ui/keyboard-handler.js +557 -0
  276. package/dist/ui/live-region-facade.d.ts +42 -0
  277. package/dist/ui/live-region-facade.js +205 -0
  278. package/dist/ui/live-region.d.ts +0 -4
  279. package/dist/ui/live-region.js +6 -14
  280. package/dist/ui/mascot/renderer.d.ts +1 -1
  281. package/dist/ui/mascot/renderer.js +37 -2
  282. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  283. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  284. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  285. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  286. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  287. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  288. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  289. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  290. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  291. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  292. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  293. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  294. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  295. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  296. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  297. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  298. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  299. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  300. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  301. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  302. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  303. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  304. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  305. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  306. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  307. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  308. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  309. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  310. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  311. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  312. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  313. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  314. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  315. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  316. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  317. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  318. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  319. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  320. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  321. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  322. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  323. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  324. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  325. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  326. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  327. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  328. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  329. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  330. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  331. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  332. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  333. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  334. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  335. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  336. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  337. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  338. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  339. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  340. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  341. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  342. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  343. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  344. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  345. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  346. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  347. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  348. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  349. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  350. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  351. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  352. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  353. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  354. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  355. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  356. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  357. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  358. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  359. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  360. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  361. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  362. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  363. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  364. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  365. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  366. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  367. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  368. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  369. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  370. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  371. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  372. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  373. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  374. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  375. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  376. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  377. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  378. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  379. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  380. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  381. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  382. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  383. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  384. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  385. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  386. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  387. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  388. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  389. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  390. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  391. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  392. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  393. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  394. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  395. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  396. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  397. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  398. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  399. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  400. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  401. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  402. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  403. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  404. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  405. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  406. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  407. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  408. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  409. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  410. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  411. package/dist/ui/overlay/impl/workflow-overlay-v2.d.ts +1 -0
  412. package/dist/ui/overlay/impl/workflow-overlay-v2.js +10 -4
  413. package/dist/ui/overlay/index.d.ts +20 -1
  414. package/dist/ui/overlay/index.js +19 -0
  415. package/dist/ui/overlay/types.d.ts +5 -0
  416. package/dist/ui/overlay-manager.d.ts +43 -0
  417. package/dist/ui/overlay-manager.js +238 -0
  418. package/dist/ui/overlays.js +4 -16
  419. package/dist/ui/permission-overlay.js +6 -5
  420. package/dist/ui/status-bar-controller.d.ts +33 -0
  421. package/dist/ui/status-bar-controller.js +99 -0
  422. package/dist/ui/subagent-renderer.js +3 -19
  423. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  424. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  425. package/dist/ui/terminal-line-builders.d.ts +17 -0
  426. package/dist/ui/terminal-line-builders.js +42 -0
  427. package/dist/ui/terminal-render-item.d.ts +16 -0
  428. package/dist/ui/terminal-render-item.js +267 -0
  429. package/dist/ui/terminal-renderer.d.ts +7 -8
  430. package/dist/ui/terminal-renderer.js +7 -8
  431. package/dist/ui/terminal-types.d.ts +179 -0
  432. package/dist/ui/terminal-types.js +34 -0
  433. package/dist/ui/terminal-ui.d.ts +144 -276
  434. package/dist/ui/terminal-ui.js +384 -1861
  435. package/dist/ui/todo-zone.d.ts +19 -1
  436. package/dist/ui/todo-zone.js +71 -13
  437. package/dist/ui/tool-formatters.js +696 -1
  438. package/dist/ui/turn-metrics.d.ts +56 -0
  439. package/dist/ui/turn-metrics.js +75 -0
  440. package/dist/ui/types.d.ts +28 -0
  441. package/dist/ui/types.js +1 -0
  442. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  443. package/dist/ui/vscode-diff-ipc.js +385 -0
  444. package/dist/utils/credentials.d.ts +24 -5
  445. package/dist/utils/credentials.js +123 -9
  446. package/dist/utils/format-tokens.d.ts +13 -0
  447. package/dist/utils/format-tokens.js +18 -0
  448. package/dist/utils/git-config.d.ts +26 -0
  449. package/dist/utils/git-config.js +54 -0
  450. package/dist/utils/message-utils.d.ts +61 -0
  451. package/dist/utils/message-utils.js +72 -0
  452. package/dist/utils/model-tiers.d.ts +8 -1
  453. package/dist/utils/model-tiers.js +38 -16
  454. package/dist/utils/open-browser.d.ts +5 -0
  455. package/dist/utils/open-browser.js +32 -0
  456. package/dist/utils/path-safety.js +3 -2
  457. package/dist/utils/project-detection.d.ts +58 -0
  458. package/dist/utils/project-detection.js +424 -0
  459. package/dist/utils/project-memory.js +2 -1
  460. package/dist/utils/project-status.d.ts +2 -2
  461. package/dist/utils/startup-perf.d.ts +18 -0
  462. package/dist/utils/startup-perf.js +60 -0
  463. package/dist/utils/token-tracker.d.ts +62 -0
  464. package/dist/utils/token-tracker.js +150 -0
  465. package/dist/utils/token-types.d.ts +23 -0
  466. package/dist/utils/token-types.js +18 -0
  467. package/dist/utils/types/config-types.d.ts +32 -0
  468. package/dist/utils/types/config-types.js +8 -0
  469. package/dist/utils/update-checker.d.ts +28 -0
  470. package/dist/utils/update-checker.js +106 -0
  471. package/dist/utils/version.d.ts +7 -0
  472. package/dist/utils/version.js +10 -0
  473. package/dist/utils/vscode-detect.d.ts +39 -0
  474. package/dist/utils/vscode-detect.js +137 -0
  475. package/package.json +27 -13
  476. package/dist/commands/handler-types.d.ts +0 -68
  477. package/dist/commands/handler-types.js +0 -8
  478. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  479. package/dist/commands/handlers/agent-commands.js +0 -305
  480. package/dist/commands/handlers/design-commands.d.ts +0 -15
  481. package/dist/commands/handlers/design-commands.js +0 -334
  482. package/dist/commands/handlers/index.d.ts +0 -20
  483. package/dist/commands/handlers/index.js +0 -43
  484. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  485. package/dist/commands/handlers/overlay-commands.js +0 -287
  486. package/dist/commands/handlers/project-commands.d.ts +0 -11
  487. package/dist/commands/handlers/project-commands.js +0 -167
  488. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  489. package/dist/commands/handlers/simple-commands.js +0 -144
  490. package/dist/commands/registry.d.ts +0 -50
  491. package/dist/commands/registry.js +0 -75
  492. package/dist/index.old.d.ts +0 -7
  493. package/dist/index.old.js +0 -1014
  494. package/dist/repl.d.ts +0 -149
  495. package/dist/repl.js +0 -1151
  496. package/dist/templates/claude-md.d.ts +0 -7
  497. package/dist/templates/claude-md.js +0 -189
  498. package/dist/test-autocomplete.d.ts +0 -7
  499. package/dist/test-autocomplete.js +0 -85
  500. package/dist/test-tabbed-menu.d.ts +0 -7
  501. package/dist/test-tabbed-menu.js +0 -25
  502. package/dist/tool-selector.d.ts +0 -71
  503. package/dist/tool-selector.js +0 -184
  504. package/dist/tools/anchor-tools.d.ts +0 -31
  505. package/dist/tools/anchor-tools.js +0 -255
  506. package/dist/tools/backlog-wrappers.d.ts +0 -54
  507. package/dist/tools/backlog-wrappers.js +0 -338
  508. package/dist/tools/document-db.d.ts +0 -43
  509. package/dist/tools/document-db.js +0 -220
  510. package/dist/tools/workitem-db.d.ts +0 -103
  511. package/dist/tools/workitem-db.js +0 -549
  512. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  513. package/dist/ui/agents-overlay-v2.js +0 -809
  514. package/dist/ui/agents-overlay.d.ts +0 -12
  515. package/dist/ui/agents-overlay.js +0 -863
  516. package/dist/ui/anchors-overlay.d.ts +0 -12
  517. package/dist/ui/anchors-overlay.js +0 -775
  518. package/dist/ui/arch-type-overlay.d.ts +0 -15
  519. package/dist/ui/arch-type-overlay.js +0 -201
  520. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  521. package/dist/ui/ask-user-overlay-v2.js +0 -555
  522. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  523. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  524. package/dist/ui/backlog-overlay.d.ts +0 -32
  525. package/dist/ui/backlog-overlay.js +0 -652
  526. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  527. package/dist/ui/commands-overlay-v2.js +0 -441
  528. package/dist/ui/commands-overlay.d.ts +0 -16
  529. package/dist/ui/commands-overlay.js +0 -439
  530. package/dist/ui/config-overlay.d.ts +0 -35
  531. package/dist/ui/config-overlay.js +0 -707
  532. package/dist/ui/docs-overlay.d.ts +0 -17
  533. package/dist/ui/docs-overlay.js +0 -303
  534. package/dist/ui/footer-v2.d.ts +0 -222
  535. package/dist/ui/footer-v2.js +0 -1349
  536. package/dist/ui/help-overlay-v2.d.ts +0 -34
  537. package/dist/ui/help-overlay-v2.js +0 -309
  538. package/dist/ui/help-overlay.d.ts +0 -16
  539. package/dist/ui/help-overlay.js +0 -316
  540. package/dist/ui/init-overlay-v2.d.ts +0 -34
  541. package/dist/ui/init-overlay-v2.js +0 -600
  542. package/dist/ui/init-overlay.d.ts +0 -34
  543. package/dist/ui/init-overlay.js +0 -604
  544. package/dist/ui/input-prompt-v2.d.ts +0 -180
  545. package/dist/ui/input-prompt-v2.js +0 -999
  546. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  547. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  548. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  549. package/dist/ui/keys-overlay-v2.js +0 -248
  550. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  551. package/dist/ui/mascot-overlay-v2.js +0 -138
  552. package/dist/ui/mascot-overlay.d.ts +0 -21
  553. package/dist/ui/mascot-overlay.js +0 -146
  554. package/dist/ui/model-overlay-v2.d.ts +0 -49
  555. package/dist/ui/model-overlay-v2.js +0 -118
  556. package/dist/ui/model-overlay.d.ts +0 -27
  557. package/dist/ui/model-overlay.js +0 -221
  558. package/dist/ui/model-warning-overlay.d.ts +0 -30
  559. package/dist/ui/model-warning-overlay.js +0 -169
  560. package/dist/ui/new-overlay.d.ts +0 -34
  561. package/dist/ui/new-overlay.js +0 -604
  562. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  563. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  564. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  565. package/dist/ui/overlay/overlay-types.js +0 -22
  566. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  567. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  568. package/dist/ui/overlays/index.d.ts +0 -11
  569. package/dist/ui/overlays/index.js +0 -11
  570. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  571. package/dist/ui/permission-overlay-v2.js +0 -380
  572. package/dist/ui/projects-overlay.d.ts +0 -19
  573. package/dist/ui/projects-overlay.js +0 -484
  574. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  575. package/dist/ui/theme-overlay-v2.js +0 -135
  576. package/dist/ui/theme-overlay.d.ts +0 -24
  577. package/dist/ui/theme-overlay.js +0 -127
  578. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  579. package/dist/ui/tools-overlay-v2.js +0 -218
  580. package/dist/ui/tools-overlay.d.ts +0 -34
  581. package/dist/ui/tools-overlay.js +0 -230
  582. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  583. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  584. package/dist/ui/tutorial-overlay.d.ts +0 -11
  585. package/dist/ui/tutorial-overlay.js +0 -1034
  586. package/dist/ui/workflow-overlay.d.ts +0 -22
  587. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,545 @@
1
+ /**
2
+ * Auth Manager Module
3
+ *
4
+ * Singleton authentication manager for the CLI.
5
+ * Handles login, logout, token refresh, and session management.
6
+ *
7
+ * Usage:
8
+ * const auth = getAuthManager();
9
+ * if (!await auth.isAuthenticated()) {
10
+ * // Show login prompt
11
+ * }
12
+ */
13
+ import { v4 as uuidv4 } from 'uuid';
14
+ import * as os from 'os';
15
+ import { loadAuthData, saveAuthData, clearAuthData, updateSession, hasAuthData, checkAuthFilePermissions, } from './storage.js';
16
+ import { refreshToken as apiRefreshToken, sendHeartbeat, getProfile, updateProfile, requestDeviceCode, pollDeviceToken, getAuthorizationUrl, } from './api-client.js';
17
+ import { isTelemetryEnabled } from '../settings/index.js';
18
+ import * as fs from 'fs';
19
+ import * as path from 'path';
20
+ // Get version from package.json to avoid circular import with index.ts
21
+ function getVersion() {
22
+ try {
23
+ const dir = path.dirname(new URL(import.meta.url).pathname);
24
+ const pkgPath = path.join(dir, '../../package.json');
25
+ const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf-8'));
26
+ return pkg.version;
27
+ }
28
+ catch {
29
+ return '0.0.0';
30
+ }
31
+ }
32
+ // =============================================================================
33
+ // Auth Manager Class
34
+ // =============================================================================
35
+ class AuthManager {
36
+ authData = null;
37
+ profileData = null;
38
+ sessionInfo = null;
39
+ heartbeatInterval = null;
40
+ constructor() {
41
+ // Load cached auth data
42
+ this.authData = loadAuthData();
43
+ // Check for insecure permissions
44
+ const warning = checkAuthFilePermissions();
45
+ if (warning) {
46
+ console.warn(warning);
47
+ }
48
+ }
49
+ // ===========================================================================
50
+ // Authentication Status
51
+ // ===========================================================================
52
+ /**
53
+ * Check if user is authenticated with a valid session.
54
+ *
55
+ * If an API token (tok_xxx) is present, authentication is immediate —
56
+ * no expiry check or refresh needed (server validates on each call).
57
+ *
58
+ * Falls back to JWT refresh for pre-v2 users who don't have an API token yet.
59
+ */
60
+ async isAuthenticated() {
61
+ if (!this.authData) {
62
+ return false;
63
+ }
64
+ // API token: server validates on each request, no local expiry check needed
65
+ if (this.authData.session.apiToken) {
66
+ return true;
67
+ }
68
+ // Legacy JWT fallback: check expiry and refresh if needed
69
+ const expiresAt = new Date(this.authData.session.expiresAt);
70
+ const now = new Date();
71
+ // If token expires in less than 5 minutes, try to refresh
72
+ const fiveMinutes = 5 * 60 * 1000;
73
+ if (expiresAt.getTime() - now.getTime() < fiveMinutes) {
74
+ const refreshed = await this.refreshToken();
75
+ if (!refreshed) {
76
+ // Refresh failed — clear in-memory state but preserve auth.json on disk.
77
+ // The refresh token may still be valid (transient error, cold start, etc.)
78
+ // Only explicit logout() should delete stored credentials.
79
+ this.authData = null;
80
+ this.profileData = null;
81
+ return false;
82
+ }
83
+ }
84
+ return true;
85
+ }
86
+ /**
87
+ * Check if any auth data exists (quick check without validation).
88
+ */
89
+ hasStoredAuth() {
90
+ return hasAuthData();
91
+ }
92
+ /**
93
+ * Get cached email from local auth data (no network call).
94
+ * Returns null if not authenticated.
95
+ */
96
+ getEmail() {
97
+ return this.authData?.user.email ?? null;
98
+ }
99
+ // ===========================================================================
100
+ // User Operations
101
+ // ===========================================================================
102
+ /**
103
+ * Get the current user.
104
+ * Throws if not authenticated.
105
+ */
106
+ async getUser() {
107
+ if (!await this.isAuthenticated()) {
108
+ throw new Error('Not authenticated');
109
+ }
110
+ // After isAuthenticated(), authData is guaranteed to exist
111
+ const authData = this.authData;
112
+ if (!authData) {
113
+ throw new Error('Authentication state inconsistent');
114
+ }
115
+ // Return cached user if available
116
+ if (this.profileData) {
117
+ return {
118
+ id: authData.user.id,
119
+ email: authData.user.email,
120
+ accountType: this.profileData.account_type,
121
+ createdAt: new Date(authData.user.createdAt),
122
+ };
123
+ }
124
+ // Fetch profile to get account type
125
+ await this.fetchProfile();
126
+ // Get account type from fetched profile
127
+ // Cast to work around TypeScript control flow narrowing issue
128
+ const profile = this.profileData;
129
+ return {
130
+ id: authData.user.id,
131
+ email: authData.user.email,
132
+ accountType: profile?.account_type ?? 'free',
133
+ createdAt: new Date(authData.user.createdAt),
134
+ };
135
+ }
136
+ /**
137
+ * Get the access token (auto-refreshes if needed).
138
+ * Prefers API token (tok_xxx) over JWT when available.
139
+ */
140
+ async getAccessToken() {
141
+ if (!await this.isAuthenticated()) {
142
+ throw new Error('Not authenticated');
143
+ }
144
+ const authData = this.authData;
145
+ if (!authData) {
146
+ throw new Error('Authentication state inconsistent');
147
+ }
148
+ // Prefer long-lived API token over short-lived JWT
149
+ return authData.session.apiToken ?? authData.session.accessToken;
150
+ }
151
+ // ===========================================================================
152
+ // Login / Logout
153
+ // ===========================================================================
154
+ /**
155
+ * Login using device flow (browser-based authentication).
156
+ * This is the recommended way to authenticate the CLI.
157
+ *
158
+ * @param callbacks - Callbacks for progress updates
159
+ * @param signal - AbortSignal for cancellation
160
+ */
161
+ async loginWithDeviceFlow(callbacks, signal) {
162
+ // Step 1: Request device code
163
+ const codeResult = await requestDeviceCode();
164
+ if (!codeResult.success || !codeResult.data) {
165
+ return {
166
+ success: false,
167
+ error: codeResult.error ?? 'Failed to get device code',
168
+ };
169
+ }
170
+ const { device_code, user_code, expires_in, interval } = codeResult.data;
171
+ // Use client-side URL (respects COMPILR_WEB_URL env var for testing)
172
+ const authUrl = getAuthorizationUrl(user_code);
173
+ // Step 2: Notify callback with code and URL
174
+ callbacks.onCodeReady(user_code, authUrl);
175
+ // Step 3: Try to open browser
176
+ if (callbacks.onOpenBrowser) {
177
+ await callbacks.onOpenBrowser(authUrl);
178
+ }
179
+ // Step 4: Poll for token
180
+ const startTime = Date.now();
181
+ const expiresAt = startTime + (expires_in * 1000);
182
+ let pollInterval = interval * 1000; // Convert to milliseconds
183
+ while (Date.now() < expiresAt) {
184
+ // Check for cancellation
185
+ if (signal?.aborted) {
186
+ return {
187
+ success: false,
188
+ error: 'Login cancelled',
189
+ };
190
+ }
191
+ // Wait before polling (with cancellation support)
192
+ const cancelled = await new Promise((resolve) => {
193
+ const timeout = setTimeout(() => {
194
+ cleanup();
195
+ resolve(false);
196
+ }, pollInterval);
197
+ const onAbort = () => {
198
+ clearTimeout(timeout);
199
+ resolve(true);
200
+ };
201
+ const cleanup = () => {
202
+ signal?.removeEventListener('abort', onAbort);
203
+ };
204
+ signal?.addEventListener('abort', onAbort, { once: true });
205
+ });
206
+ if (cancelled || signal?.aborted) {
207
+ return {
208
+ success: false,
209
+ error: 'Login cancelled',
210
+ };
211
+ }
212
+ // Poll for token
213
+ callbacks.onStatusUpdate?.('polling');
214
+ const tokenResult = await pollDeviceToken(device_code);
215
+ if (tokenResult.success && tokenResult.data) {
216
+ // Success! Save the tokens
217
+ callbacks.onStatusUpdate?.('authorized');
218
+ const { access_token, refresh_token, api_token, expires_in: tokenExpiresIn, user } = tokenResult.data;
219
+ const expiresAt = new Date(Date.now() + (tokenExpiresIn * 1000)).toISOString();
220
+ const authData = {
221
+ version: 1,
222
+ user: {
223
+ id: user.id,
224
+ email: user.email,
225
+ createdAt: new Date().toISOString(), // We don't get this from device flow
226
+ },
227
+ session: {
228
+ accessToken: access_token,
229
+ refreshToken: refresh_token,
230
+ expiresAt,
231
+ apiToken: api_token, // Long-lived CLI token (tok_xxx)
232
+ },
233
+ };
234
+ saveAuthData(authData);
235
+ this.authData = authData;
236
+ // Fetch profile to get account type
237
+ await this.fetchProfile();
238
+ return {
239
+ success: true,
240
+ user: {
241
+ id: user.id,
242
+ email: user.email,
243
+ accountType: this.profileData?.account_type ?? 'free',
244
+ createdAt: new Date(),
245
+ },
246
+ };
247
+ }
248
+ // Handle errors
249
+ if (tokenResult.error) {
250
+ switch (tokenResult.error.error) {
251
+ case 'authorization_pending':
252
+ // Keep polling
253
+ continue;
254
+ case 'slow_down':
255
+ // Increase poll interval
256
+ pollInterval = Math.min(pollInterval + 5000, 30000);
257
+ continue;
258
+ case 'expired_token':
259
+ callbacks.onStatusUpdate?.('expired');
260
+ return {
261
+ success: false,
262
+ error: 'Authorization expired. Please try again.',
263
+ };
264
+ case 'access_denied':
265
+ callbacks.onStatusUpdate?.('denied');
266
+ return {
267
+ success: false,
268
+ error: 'Authorization denied.',
269
+ };
270
+ default:
271
+ return {
272
+ success: false,
273
+ error: tokenResult.error.error_description,
274
+ };
275
+ }
276
+ }
277
+ // Network error - retry
278
+ if (tokenResult.networkError) {
279
+ // Wait a bit longer on network errors
280
+ await new Promise(resolve => setTimeout(resolve, 2000));
281
+ continue;
282
+ }
283
+ }
284
+ // Expired
285
+ callbacks.onStatusUpdate?.('expired');
286
+ return {
287
+ success: false,
288
+ error: 'Authorization timed out. Please try again.',
289
+ };
290
+ }
291
+ /**
292
+ * Logout (clear local session).
293
+ * Tokens expire naturally (1 hour). No server call needed.
294
+ */
295
+ logout() {
296
+ // Stop heartbeat
297
+ this.stopHeartbeat();
298
+ // Clear local data
299
+ clearAuthData();
300
+ this.authData = null;
301
+ this.profileData = null;
302
+ this.sessionInfo = null;
303
+ }
304
+ // ===========================================================================
305
+ // Token Management
306
+ // ===========================================================================
307
+ /**
308
+ * Refresh the access token using the refresh token.
309
+ * Calls the server-side Netlify function (no direct Supabase SDK).
310
+ */
311
+ async refreshToken() {
312
+ if (!this.authData?.session.refreshToken) {
313
+ return false;
314
+ }
315
+ const result = await apiRefreshToken(this.authData.session.refreshToken);
316
+ if (!result.success || !result.access_token || !result.refresh_token) {
317
+ // Debug: log refresh failure details
318
+ console.error('[auth] Token refresh failed:', result.error ?? 'missing token fields');
319
+ console.error('[auth] API_BASE_URL:', process.env.COMPILR_API_URL ?? '(not set, using compilr.dev)');
320
+ return false;
321
+ }
322
+ // Calculate expiry from expires_in (seconds), default to 1 hour
323
+ const expiresIn = result.expires_in ?? 3600;
324
+ const expiresAt = new Date(Date.now() + expiresIn * 1000).toISOString();
325
+ const newSession = {
326
+ accessToken: result.access_token,
327
+ refreshToken: result.refresh_token,
328
+ expiresAt,
329
+ };
330
+ updateSession(newSession);
331
+ this.authData.session = newSession;
332
+ return true;
333
+ }
334
+ // ===========================================================================
335
+ // Profile Management
336
+ // ===========================================================================
337
+ /**
338
+ * Get the best available token for API calls.
339
+ * Prefers API token (tok_xxx) over short-lived JWT.
340
+ */
341
+ getBestToken() {
342
+ if (!this.authData)
343
+ return null;
344
+ return this.authData.session.apiToken ?? this.authData.session.accessToken;
345
+ }
346
+ /**
347
+ * Fetch user profile from server.
348
+ */
349
+ async fetchProfile() {
350
+ const token = this.getBestToken();
351
+ if (!token)
352
+ return;
353
+ const result = await getProfile(token);
354
+ if (result.success && result.profile) {
355
+ this.profileData = result.profile;
356
+ }
357
+ }
358
+ /**
359
+ * Get cached profile data.
360
+ */
361
+ getProfile() {
362
+ return this.profileData;
363
+ }
364
+ /**
365
+ * Update profile settings on server.
366
+ */
367
+ async updateProfileSettings(updates) {
368
+ if (!await this.isAuthenticated()) {
369
+ return false;
370
+ }
371
+ const token = this.getBestToken();
372
+ if (!token) {
373
+ return false;
374
+ }
375
+ const result = await updateProfile(token, updates);
376
+ if (result.success && result.profile) {
377
+ this.profileData = result.profile;
378
+ }
379
+ return result.success;
380
+ }
381
+ // ===========================================================================
382
+ // Session / Telemetry
383
+ // ===========================================================================
384
+ /**
385
+ * Start a new CLI session and begin heartbeat.
386
+ */
387
+ async startSession(projectId) {
388
+ this.sessionInfo = {
389
+ sessionId: uuidv4(),
390
+ startedAt: new Date(),
391
+ projectId,
392
+ messageCount: 0,
393
+ tokensIn: 0,
394
+ tokensOut: 0,
395
+ commandsUsed: {},
396
+ agentsUsed: new Set(),
397
+ toolsUsed: new Set(),
398
+ };
399
+ // Send initial heartbeat
400
+ await this.sendHeartbeat();
401
+ // Start periodic heartbeat (every 60 seconds)
402
+ this.heartbeatInterval = setInterval(() => {
403
+ void this.sendHeartbeat();
404
+ }, 60 * 1000);
405
+ }
406
+ /**
407
+ * Stop the current session.
408
+ */
409
+ stopHeartbeat() {
410
+ if (this.heartbeatInterval) {
411
+ clearInterval(this.heartbeatInterval);
412
+ this.heartbeatInterval = null;
413
+ }
414
+ // Send final heartbeat
415
+ if (this.sessionInfo) {
416
+ void this.sendHeartbeat();
417
+ }
418
+ }
419
+ /**
420
+ * Record a message in the current session.
421
+ */
422
+ recordMessage(tokensIn, tokensOut) {
423
+ if (this.sessionInfo) {
424
+ this.sessionInfo.messageCount++;
425
+ this.sessionInfo.tokensIn += tokensIn;
426
+ this.sessionInfo.tokensOut += tokensOut;
427
+ }
428
+ }
429
+ /**
430
+ * Record command usage.
431
+ */
432
+ recordCommand(command) {
433
+ if (this.sessionInfo) {
434
+ this.sessionInfo.commandsUsed[command] = (this.sessionInfo.commandsUsed[command] ?? 0) + 1;
435
+ }
436
+ }
437
+ /**
438
+ * Record agent usage.
439
+ */
440
+ recordAgent(agentId) {
441
+ if (this.sessionInfo) {
442
+ this.sessionInfo.agentsUsed.add(agentId);
443
+ }
444
+ }
445
+ /**
446
+ * Record tool usage.
447
+ */
448
+ recordTool(toolName) {
449
+ if (this.sessionInfo) {
450
+ this.sessionInfo.toolsUsed.add(toolName);
451
+ }
452
+ }
453
+ /**
454
+ * Set LLM provider/model for session.
455
+ */
456
+ setLLMInfo(provider, model) {
457
+ if (this.sessionInfo) {
458
+ this.sessionInfo.llmProvider = provider;
459
+ this.sessionInfo.llmModel = model;
460
+ }
461
+ }
462
+ /**
463
+ * Send a single heartbeat regardless of telemetry setting.
464
+ * Called once at login to register the CLI connection with the server
465
+ * (sets first_session_at on cli_users_extended). This is account metadata,
466
+ * not telemetry data.
467
+ */
468
+ async sendForcedHeartbeat() {
469
+ const token = this.getBestToken();
470
+ if (!token)
471
+ return;
472
+ const sessionId = this.sessionInfo?.sessionId ?? uuidv4();
473
+ const data = {
474
+ session_id: sessionId,
475
+ cli_version: getVersion(),
476
+ os: os.platform(),
477
+ node_version: process.version,
478
+ };
479
+ try {
480
+ await sendHeartbeat(token, data);
481
+ }
482
+ catch {
483
+ // Silently ignore - this is best-effort
484
+ }
485
+ }
486
+ /**
487
+ * Send heartbeat to server (if telemetry enabled).
488
+ */
489
+ async sendHeartbeat() {
490
+ // Check local telemetry setting
491
+ if (!isTelemetryEnabled()) {
492
+ return;
493
+ }
494
+ // Check if authenticated
495
+ const token = this.getBestToken();
496
+ if (!token || !this.sessionInfo) {
497
+ return;
498
+ }
499
+ const data = {
500
+ session_id: this.sessionInfo.sessionId,
501
+ cli_version: getVersion(),
502
+ os: os.platform(),
503
+ node_version: process.version,
504
+ project_id: this.sessionInfo.projectId,
505
+ total_messages: this.sessionInfo.messageCount,
506
+ total_tokens_in: this.sessionInfo.tokensIn,
507
+ total_tokens_out: this.sessionInfo.tokensOut,
508
+ commands_used: this.sessionInfo.commandsUsed,
509
+ agents_used: Array.from(this.sessionInfo.agentsUsed),
510
+ tools_used: Array.from(this.sessionInfo.toolsUsed),
511
+ llm_provider: this.sessionInfo.llmProvider,
512
+ llm_model: this.sessionInfo.llmModel,
513
+ };
514
+ try {
515
+ await sendHeartbeat(token, data);
516
+ }
517
+ catch {
518
+ // Silently ignore heartbeat failures
519
+ }
520
+ }
521
+ }
522
+ // =============================================================================
523
+ // Singleton
524
+ // =============================================================================
525
+ let authManagerInstance = null;
526
+ /**
527
+ * Get the AuthManager singleton instance.
528
+ */
529
+ export function getAuthManager() {
530
+ if (!authManagerInstance) {
531
+ authManagerInstance = new AuthManager();
532
+ }
533
+ return authManagerInstance;
534
+ }
535
+ /**
536
+ * Reset AuthManager (for testing).
537
+ */
538
+ export function resetAuthManager() {
539
+ if (authManagerInstance) {
540
+ authManagerInstance.stopHeartbeat();
541
+ }
542
+ authManagerInstance = null;
543
+ }
544
+ // Re-export device flow utilities
545
+ export { getAuthorizationUrl } from './api-client.js';
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Auth Storage Module
3
+ *
4
+ * Manages persistent storage of authentication credentials.
5
+ * File: ~/.compilr-dev/auth.json
6
+ *
7
+ * Security:
8
+ * - File permissions set to 0600 (owner read/write only)
9
+ * - Tokens are JWTs from Supabase Auth
10
+ */
11
+ export interface AuthUser {
12
+ id: string;
13
+ email: string;
14
+ createdAt: string;
15
+ }
16
+ export interface AuthSession {
17
+ accessToken: string;
18
+ refreshToken: string;
19
+ expiresAt: string;
20
+ apiToken?: string;
21
+ }
22
+ export interface AuthData {
23
+ version: number;
24
+ user: AuthUser;
25
+ session: AuthSession;
26
+ }
27
+ /**
28
+ * Load auth data from disk.
29
+ * Returns null if file doesn't exist or is invalid.
30
+ */
31
+ export declare function loadAuthData(): AuthData | null;
32
+ /**
33
+ * Save auth data to disk with secure permissions.
34
+ */
35
+ export declare function saveAuthData(data: AuthData): void;
36
+ /**
37
+ * Clear auth data (logout).
38
+ */
39
+ export declare function clearAuthData(): void;
40
+ /**
41
+ * Update just the session tokens (after refresh).
42
+ */
43
+ export declare function updateSession(session: AuthSession): boolean;
44
+ /**
45
+ * Check if auth data exists (quick check without loading).
46
+ */
47
+ export declare function hasAuthData(): boolean;
48
+ /**
49
+ * Check if stored auth file has insecure permissions.
50
+ * Returns warning message if insecure, null if OK.
51
+ */
52
+ export declare function checkAuthFilePermissions(): string | null;