@compilr-dev/cli 0.5.0 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (591) hide show
  1. package/README.md +236 -68
  2. package/dist/.tsbuildinfo.app +1 -0
  3. package/dist/.tsbuildinfo.data +1 -0
  4. package/dist/.tsbuildinfo.domain +1 -0
  5. package/dist/.tsbuildinfo.foundation +1 -0
  6. package/dist/agent.d.ts +61 -4
  7. package/dist/agent.js +241 -245
  8. package/dist/anchors/index.d.ts +1 -1
  9. package/dist/anchors/index.js +1 -1
  10. package/dist/anchors/project-anchors.d.ts +2 -2
  11. package/dist/anchors/project-anchors.js +1 -1
  12. package/dist/auth/api-client.d.ts +124 -0
  13. package/dist/auth/api-client.js +261 -0
  14. package/dist/auth/index.d.ts +172 -0
  15. package/dist/auth/index.js +545 -0
  16. package/dist/auth/storage.d.ts +52 -0
  17. package/dist/auth/storage.js +118 -0
  18. package/dist/changelog/index.d.ts +16 -0
  19. package/dist/changelog/index.js +24 -0
  20. package/dist/changelog/releases.d.ts +17 -0
  21. package/dist/changelog/releases.js +63 -0
  22. package/dist/commands-v2/handlers/auth.d.ts +10 -0
  23. package/dist/commands-v2/handlers/auth.js +118 -0
  24. package/dist/commands-v2/handlers/background.d.ts +14 -0
  25. package/dist/commands-v2/handlers/background.js +276 -0
  26. package/dist/commands-v2/handlers/context.js +266 -81
  27. package/dist/commands-v2/handlers/core.d.ts +1 -0
  28. package/dist/commands-v2/handlers/core.js +133 -8
  29. package/dist/commands-v2/handlers/debug.js +18 -0
  30. package/dist/commands-v2/handlers/delegations.d.ts +8 -0
  31. package/dist/commands-v2/handlers/delegations.js +29 -0
  32. package/dist/commands-v2/handlers/files.d.ts +8 -0
  33. package/dist/commands-v2/handlers/files.js +162 -0
  34. package/dist/commands-v2/handlers/filter.d.ts +9 -0
  35. package/dist/commands-v2/handlers/filter.js +130 -0
  36. package/dist/commands-v2/handlers/games.d.ts +7 -0
  37. package/dist/commands-v2/handlers/games.js +57 -0
  38. package/dist/commands-v2/handlers/index.d.ts +13 -0
  39. package/dist/commands-v2/handlers/index.js +39 -0
  40. package/dist/commands-v2/handlers/mcp.d.ts +8 -0
  41. package/dist/commands-v2/handlers/mcp.js +39 -0
  42. package/dist/commands-v2/handlers/notifications.d.ts +9 -0
  43. package/dist/commands-v2/handlers/notifications.js +34 -0
  44. package/dist/commands-v2/handlers/project.js +244 -23
  45. package/dist/commands-v2/handlers/reset.d.ts +11 -0
  46. package/dist/commands-v2/handlers/reset.js +118 -0
  47. package/dist/commands-v2/handlers/session.d.ts +161 -0
  48. package/dist/commands-v2/handlers/session.js +805 -0
  49. package/dist/commands-v2/handlers/settings.d.ts +2 -0
  50. package/dist/commands-v2/handlers/settings.js +217 -35
  51. package/dist/commands-v2/handlers/tasks.d.ts +5 -0
  52. package/dist/commands-v2/handlers/tasks.js +36 -0
  53. package/dist/commands-v2/handlers/team.d.ts +9 -0
  54. package/dist/commands-v2/handlers/team.js +549 -0
  55. package/dist/commands-v2/handlers/terminals.d.ts +9 -0
  56. package/dist/commands-v2/handlers/terminals.js +34 -0
  57. package/dist/commands-v2/index.d.ts +3 -2
  58. package/dist/commands-v2/index.js +4 -1
  59. package/dist/commands-v2/registry.d.ts +15 -0
  60. package/dist/commands-v2/registry.js +34 -0
  61. package/dist/commands-v2/types.d.ts +81 -3
  62. package/dist/commands.js +13 -0
  63. package/dist/compilr-diff-companion.vsix +0 -0
  64. package/dist/db/index.js +98 -4
  65. package/dist/db/repositories/document-repository.d.ts +2 -0
  66. package/dist/db/repositories/document-repository.js +5 -1
  67. package/dist/db/repositories/index.d.ts +2 -0
  68. package/dist/db/repositories/index.js +1 -0
  69. package/dist/db/repositories/plan-repository.d.ts +101 -0
  70. package/dist/db/repositories/plan-repository.js +275 -0
  71. package/dist/db/repositories/project-repository.d.ts +6 -0
  72. package/dist/db/repositories/project-repository.js +41 -0
  73. package/dist/db/repositories/work-item-repository.d.ts +15 -0
  74. package/dist/db/repositories/work-item-repository.js +69 -4
  75. package/dist/db/schema.d.ts +40 -3
  76. package/dist/db/schema.js +66 -3
  77. package/dist/episodes/index.d.ts +20 -0
  78. package/dist/episodes/index.js +27 -0
  79. package/dist/episodes/recorder.d.ts +51 -0
  80. package/dist/episodes/recorder.js +195 -0
  81. package/dist/episodes/significant-work.d.ts +21 -0
  82. package/dist/episodes/significant-work.js +56 -0
  83. package/dist/episodes/store.d.ts +38 -0
  84. package/dist/episodes/store.js +199 -0
  85. package/dist/episodes/types.d.ts +35 -0
  86. package/dist/episodes/types.js +6 -0
  87. package/dist/episodes/work-at-risk.d.ts +12 -0
  88. package/dist/episodes/work-at-risk.js +38 -0
  89. package/dist/episodes/work-summary-anchor.d.ts +23 -0
  90. package/dist/episodes/work-summary-anchor.js +73 -0
  91. package/dist/games/coins.d.ts +66 -0
  92. package/dist/games/coins.js +165 -0
  93. package/dist/games/game-base.d.ts +84 -0
  94. package/dist/games/game-base.js +204 -0
  95. package/dist/games/index.d.ts +16 -0
  96. package/dist/games/index.js +49 -0
  97. package/dist/games/scores.d.ts +69 -0
  98. package/dist/games/scores.js +191 -0
  99. package/dist/games/tetris/board.d.ts +59 -0
  100. package/dist/games/tetris/board.js +170 -0
  101. package/dist/games/tetris/index.d.ts +109 -0
  102. package/dist/games/tetris/index.js +610 -0
  103. package/dist/games/tetris/pieces.d.ts +44 -0
  104. package/dist/games/tetris/pieces.js +271 -0
  105. package/dist/games/tetris/renderer.d.ts +26 -0
  106. package/dist/games/tetris/renderer.js +77 -0
  107. package/dist/guide/guide-content.d.ts +23 -0
  108. package/dist/guide/guide-content.js +196 -0
  109. package/dist/guide/index.d.ts +8 -0
  110. package/dist/guide/index.js +7 -0
  111. package/dist/guide/shared-content.d.ts +37 -0
  112. package/dist/guide/shared-content.js +1272 -0
  113. package/dist/guide/tutorial-helpers.d.ts +57 -0
  114. package/dist/guide/tutorial-helpers.js +147 -0
  115. package/dist/handlers/ask-user-handlers.d.ts +32 -0
  116. package/dist/handlers/ask-user-handlers.js +104 -0
  117. package/dist/handlers/delegation-handlers.d.ts +34 -0
  118. package/dist/handlers/delegation-handlers.js +291 -0
  119. package/dist/handlers/permission-handler.d.ts +30 -0
  120. package/dist/handlers/permission-handler.js +205 -0
  121. package/dist/index.d.ts +11 -1
  122. package/dist/index.js +448 -271
  123. package/dist/input-handlers/memory-handler.d.ts +1 -1
  124. package/dist/input-handlers/memory-handler.js +2 -1
  125. package/dist/models/index.d.ts +10 -0
  126. package/dist/models/index.js +12 -0
  127. package/dist/models/model-registry.d.ts +38 -0
  128. package/dist/models/model-registry.js +69 -0
  129. package/dist/models/model-tiers.d.ts +28 -0
  130. package/dist/models/model-tiers.js +71 -0
  131. package/dist/models/model-validation.d.ts +25 -0
  132. package/dist/models/model-validation.js +291 -0
  133. package/dist/models/ollama-models.d.ts +73 -0
  134. package/dist/models/ollama-models.js +178 -0
  135. package/dist/models/provider-types.d.ts +6 -0
  136. package/dist/models/provider-types.js +1 -0
  137. package/dist/models/providers.d.ts +35 -0
  138. package/dist/models/providers.js +58 -0
  139. package/dist/models/types.d.ts +4 -0
  140. package/dist/models/types.js +4 -0
  141. package/dist/multi-agent/activity.d.ts +21 -0
  142. package/dist/multi-agent/activity.js +34 -0
  143. package/dist/multi-agent/agent-selection.d.ts +55 -0
  144. package/dist/multi-agent/agent-selection.js +90 -0
  145. package/dist/multi-agent/artifacts.d.ts +197 -0
  146. package/dist/multi-agent/artifacts.js +379 -0
  147. package/dist/multi-agent/checkpointer.d.ts +138 -0
  148. package/dist/multi-agent/checkpointer.js +471 -0
  149. package/dist/multi-agent/collision-utils.d.ts +16 -0
  150. package/dist/multi-agent/collision-utils.js +28 -0
  151. package/dist/multi-agent/context-resolver.d.ts +97 -0
  152. package/dist/multi-agent/context-resolver.js +316 -0
  153. package/dist/multi-agent/custom-agents.d.ts +83 -0
  154. package/dist/multi-agent/custom-agents.js +227 -0
  155. package/dist/multi-agent/delegation-tracker.d.ts +157 -0
  156. package/dist/multi-agent/delegation-tracker.js +243 -0
  157. package/dist/multi-agent/file-lock-hook.d.ts +29 -0
  158. package/dist/multi-agent/file-lock-hook.js +97 -0
  159. package/dist/multi-agent/file-locks.d.ts +58 -0
  160. package/dist/multi-agent/file-locks.js +194 -0
  161. package/dist/multi-agent/index.d.ts +24 -0
  162. package/dist/multi-agent/index.js +30 -0
  163. package/dist/multi-agent/mention-parser.d.ts +64 -0
  164. package/dist/multi-agent/mention-parser.js +146 -0
  165. package/dist/multi-agent/notification-manager.d.ts +84 -0
  166. package/dist/multi-agent/notification-manager.js +224 -0
  167. package/dist/multi-agent/pending-requests.d.ts +122 -0
  168. package/dist/multi-agent/pending-requests.js +155 -0
  169. package/dist/multi-agent/session-registry.d.ts +139 -0
  170. package/dist/multi-agent/session-registry.js +514 -0
  171. package/dist/multi-agent/shared-context.d.ts +293 -0
  172. package/dist/multi-agent/shared-context.js +671 -0
  173. package/dist/multi-agent/skill-requirements.d.ts +66 -0
  174. package/dist/multi-agent/skill-requirements.js +178 -0
  175. package/dist/multi-agent/task-assignment.d.ts +69 -0
  176. package/dist/multi-agent/task-assignment.js +123 -0
  177. package/dist/multi-agent/task-suggestion.d.ts +31 -0
  178. package/dist/multi-agent/task-suggestion.js +72 -0
  179. package/dist/multi-agent/team-agent.d.ts +201 -0
  180. package/dist/multi-agent/team-agent.js +488 -0
  181. package/dist/multi-agent/team.d.ts +286 -0
  182. package/dist/multi-agent/team.js +610 -0
  183. package/dist/multi-agent/tool-config.d.ts +110 -0
  184. package/dist/multi-agent/tool-config.js +661 -0
  185. package/dist/multi-agent/types.d.ts +211 -0
  186. package/dist/multi-agent/types.js +617 -0
  187. package/dist/prompts/plan-mode-prompt.d.ts +11 -0
  188. package/dist/prompts/plan-mode-prompt.js +95 -0
  189. package/dist/repl-helpers.js +3 -2
  190. package/dist/repl-v2.d.ts +401 -2
  191. package/dist/repl-v2.js +2577 -65
  192. package/dist/session/index.d.ts +6 -0
  193. package/dist/session/index.js +6 -0
  194. package/dist/session/project-session-manager.d.ts +158 -0
  195. package/dist/session/project-session-manager.js +650 -0
  196. package/dist/settings/index.d.ts +133 -13
  197. package/dist/settings/index.js +329 -24
  198. package/dist/settings/mcp-config.d.ts +76 -0
  199. package/dist/settings/mcp-config.js +143 -0
  200. package/dist/settings/paths.d.ts +4 -0
  201. package/dist/settings/paths.js +6 -0
  202. package/dist/shared-handlers.d.ts +62 -0
  203. package/dist/shared-handlers.js +48 -0
  204. package/dist/system-prompt/builder.d.ts +5 -0
  205. package/dist/system-prompt/builder.js +4 -0
  206. package/dist/system-prompt/index.d.ts +18 -0
  207. package/dist/system-prompt/index.js +18 -0
  208. package/dist/system-prompt/modules.d.ts +5 -0
  209. package/dist/system-prompt/modules.js +4 -0
  210. package/dist/tabbed-menu.js +2 -1
  211. package/dist/templates/compilr-md-import.d.ts +16 -0
  212. package/dist/templates/compilr-md-import.js +241 -0
  213. package/dist/templates/compilr-md.js +10 -61
  214. package/dist/templates/config-json.d.ts +1 -25
  215. package/dist/templates/index.d.ts +2 -0
  216. package/dist/templates/index.js +34 -73
  217. package/dist/tool-names.d.ts +108 -0
  218. package/dist/tool-names.js +227 -0
  219. package/dist/tools/anchor-tools.d.ts +4 -4
  220. package/dist/tools/anchor-tools.js +1 -1
  221. package/dist/tools/artifact-tools.d.ts +42 -0
  222. package/dist/tools/artifact-tools.js +328 -0
  223. package/dist/tools/ask-user-simple.d.ts +1 -1
  224. package/dist/tools/ask-user-simple.js +2 -1
  225. package/dist/tools/ask-user.d.ts +1 -1
  226. package/dist/tools/ask-user.js +2 -1
  227. package/dist/tools/backlog-wrappers.d.ts +5 -3
  228. package/dist/tools/backlog-wrappers.js +16 -1
  229. package/dist/tools/backlog.d.ts +2 -2
  230. package/dist/tools/backlog.js +1 -1
  231. package/dist/tools/db-tools.d.ts +8 -61
  232. package/dist/tools/db-tools.js +8 -13
  233. package/dist/tools/delegate-background.d.ts +27 -0
  234. package/dist/tools/delegate-background.js +115 -0
  235. package/dist/tools/delegate.d.ts +22 -0
  236. package/dist/tools/delegate.js +97 -0
  237. package/dist/tools/delegation-status.d.ts +16 -0
  238. package/dist/tools/delegation-status.js +128 -0
  239. package/dist/tools/document-db.d.ts +5 -5
  240. package/dist/tools/document-db.js +1 -1
  241. package/dist/tools/guide-tool.d.ts +12 -0
  242. package/dist/tools/guide-tool.js +59 -0
  243. package/dist/tools/handoff.d.ts +25 -0
  244. package/dist/tools/handoff.js +99 -0
  245. package/dist/tools/meta-tools.d.ts +26 -0
  246. package/dist/tools/meta-tools.js +47 -0
  247. package/dist/tools/plan-tools.d.ts +54 -0
  248. package/dist/tools/plan-tools.js +338 -0
  249. package/dist/tools/platform-adapter.d.ts +29 -0
  250. package/dist/tools/platform-adapter.js +394 -0
  251. package/dist/tools/project-db.d.ts +5 -73
  252. package/dist/tools/project-db.js +5 -336
  253. package/dist/tools/recall-work-tool.d.ts +18 -0
  254. package/dist/tools/recall-work-tool.js +82 -0
  255. package/dist/tools/workitem-db.d.ts +43 -11
  256. package/dist/tools/workitem-db.js +186 -5
  257. package/dist/tools.d.ts +67 -2
  258. package/dist/tools.js +237 -47
  259. package/dist/ui/autocomplete-controller.d.ts +42 -0
  260. package/dist/ui/autocomplete-controller.js +384 -0
  261. package/dist/ui/base/index.d.ts +1 -1
  262. package/dist/ui/base/index.js +1 -1
  263. package/dist/ui/base/overlay-base-v2.d.ts +10 -0
  264. package/dist/ui/base/overlay-base-v2.js +14 -0
  265. package/dist/ui/base/render-utils.d.ts +19 -0
  266. package/dist/ui/base/render-utils.js +25 -0
  267. package/dist/ui/base/tabbed-list-overlay-v2.d.ts +16 -1
  268. package/dist/ui/base/tabbed-list-overlay-v2.js +19 -1
  269. package/dist/ui/constants/labels.d.ts +14 -0
  270. package/dist/ui/constants/labels.js +51 -0
  271. package/dist/ui/conversation-store.d.ts +55 -0
  272. package/dist/ui/conversation-store.js +107 -0
  273. package/dist/ui/conversation.js +11 -13
  274. package/dist/ui/diff.d.ts +7 -1
  275. package/dist/ui/diff.js +85 -48
  276. package/dist/ui/ephemeral.js +3 -9
  277. package/dist/ui/file-autocomplete.d.ts +24 -0
  278. package/dist/ui/file-autocomplete.js +56 -0
  279. package/dist/ui/footer-renderer.d.ts +69 -0
  280. package/dist/ui/footer-renderer.js +431 -0
  281. package/dist/ui/footer.d.ts +74 -7
  282. package/dist/ui/footer.js +173 -16
  283. package/dist/ui/input-controller.d.ts +51 -0
  284. package/dist/ui/input-controller.js +176 -0
  285. package/dist/ui/input-prompt.d.ts +19 -0
  286. package/dist/ui/input-prompt.js +206 -14
  287. package/dist/ui/keyboard-handler.d.ts +57 -0
  288. package/dist/ui/keyboard-handler.js +557 -0
  289. package/dist/ui/live-region-facade.d.ts +42 -0
  290. package/dist/ui/live-region-facade.js +205 -0
  291. package/dist/ui/live-region.d.ts +0 -4
  292. package/dist/ui/live-region.js +6 -14
  293. package/dist/ui/mascot/renderer.d.ts +1 -1
  294. package/dist/ui/mascot/renderer.js +37 -2
  295. package/dist/ui/overlay/data/tutorial-content.d.ts +9 -0
  296. package/dist/ui/overlay/data/tutorial-content.js +9 -0
  297. package/dist/ui/overlay/data/tutorial-registry.d.ts +12 -0
  298. package/dist/ui/overlay/data/tutorial-registry.js +116 -0
  299. package/dist/ui/overlay/data/tutorial-types.d.ts +35 -0
  300. package/dist/ui/overlay/data/tutorial-types.js +6 -0
  301. package/dist/ui/overlay/data/tutorials/basics/first-conversation.d.ts +7 -0
  302. package/dist/ui/overlay/data/tutorials/basics/first-conversation.js +220 -0
  303. package/dist/ui/overlay/data/tutorials/basics/first-project.d.ts +7 -0
  304. package/dist/ui/overlay/data/tutorials/basics/first-project.js +284 -0
  305. package/dist/ui/overlay/data/tutorials/basics/navigation.d.ts +8 -0
  306. package/dist/ui/overlay/data/tutorials/basics/navigation.js +22 -0
  307. package/dist/ui/overlay/data/tutorials/basics/welcome.d.ts +7 -0
  308. package/dist/ui/overlay/data/tutorials/basics/welcome.js +174 -0
  309. package/dist/ui/overlay/data/tutorials/config/context-management.d.ts +7 -0
  310. package/dist/ui/overlay/data/tutorials/config/context-management.js +158 -0
  311. package/dist/ui/overlay/data/tutorials/config/mcp-servers.d.ts +8 -0
  312. package/dist/ui/overlay/data/tutorials/config/mcp-servers.js +155 -0
  313. package/dist/ui/overlay/data/tutorials/config/model-selection.d.ts +7 -0
  314. package/dist/ui/overlay/data/tutorials/config/model-selection.js +162 -0
  315. package/dist/ui/overlay/data/tutorials/config/permissions-safety.d.ts +7 -0
  316. package/dist/ui/overlay/data/tutorials/config/permissions-safety.js +163 -0
  317. package/dist/ui/overlay/data/tutorials/config/settings-config.d.ts +7 -0
  318. package/dist/ui/overlay/data/tutorials/config/settings-config.js +166 -0
  319. package/dist/ui/overlay/data/tutorials/planning/arch.d.ts +7 -0
  320. package/dist/ui/overlay/data/tutorials/planning/arch.js +168 -0
  321. package/dist/ui/overlay/data/tutorials/planning/backlog.d.ts +7 -0
  322. package/dist/ui/overlay/data/tutorials/planning/backlog.js +103 -0
  323. package/dist/ui/overlay/data/tutorials/planning/build.d.ts +7 -0
  324. package/dist/ui/overlay/data/tutorials/planning/build.js +173 -0
  325. package/dist/ui/overlay/data/tutorials/planning/design.d.ts +7 -0
  326. package/dist/ui/overlay/data/tutorials/planning/design.js +205 -0
  327. package/dist/ui/overlay/data/tutorials/planning/docs.d.ts +7 -0
  328. package/dist/ui/overlay/data/tutorials/planning/docs.js +143 -0
  329. package/dist/ui/overlay/data/tutorials/planning/prd.d.ts +7 -0
  330. package/dist/ui/overlay/data/tutorials/planning/prd.js +173 -0
  331. package/dist/ui/overlay/data/tutorials/planning/scaffold.d.ts +7 -0
  332. package/dist/ui/overlay/data/tutorials/planning/scaffold.js +164 -0
  333. package/dist/ui/overlay/data/tutorials/planning/sketch.d.ts +7 -0
  334. package/dist/ui/overlay/data/tutorials/planning/sketch.js +58 -0
  335. package/dist/ui/overlay/data/tutorials/projects/anchors.d.ts +7 -0
  336. package/dist/ui/overlay/data/tutorials/projects/anchors.js +248 -0
  337. package/dist/ui/overlay/data/tutorials/projects/import-project.d.ts +7 -0
  338. package/dist/ui/overlay/data/tutorials/projects/import-project.js +172 -0
  339. package/dist/ui/overlay/data/tutorials/projects/managing-projects.d.ts +8 -0
  340. package/dist/ui/overlay/data/tutorials/projects/managing-projects.js +212 -0
  341. package/dist/ui/overlay/data/tutorials/projects/new-project.d.ts +7 -0
  342. package/dist/ui/overlay/data/tutorials/projects/new-project.js +251 -0
  343. package/dist/ui/overlay/data/tutorials/projects/session-management.d.ts +7 -0
  344. package/dist/ui/overlay/data/tutorials/projects/session-management.js +169 -0
  345. package/dist/ui/overlay/data/tutorials/teams/background-execution.d.ts +7 -0
  346. package/dist/ui/overlay/data/tutorials/teams/background-execution.js +171 -0
  347. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.d.ts +8 -0
  348. package/dist/ui/overlay/data/tutorials/teams/multi-terminal.js +147 -0
  349. package/dist/ui/overlay/data/tutorials/teams/task-assignment.d.ts +7 -0
  350. package/dist/ui/overlay/data/tutorials/teams/task-assignment.js +204 -0
  351. package/dist/ui/overlay/data/tutorials/teams/team-overview.d.ts +7 -0
  352. package/dist/ui/overlay/data/tutorials/teams/team-overview.js +165 -0
  353. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.d.ts +7 -0
  354. package/dist/ui/overlay/data/tutorials/teams/working-with-agents.js +172 -0
  355. package/dist/ui/overlay/impl/agents-overlay-v2.js +6 -17
  356. package/dist/ui/overlay/impl/anchors-overlay-v2.js +30 -64
  357. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.d.ts +43 -0
  358. package/dist/ui/overlay/impl/artifact-detail-overlay-v2.js +232 -0
  359. package/dist/ui/overlay/impl/artifact-overlay-v2.d.ts +40 -0
  360. package/dist/ui/overlay/impl/artifact-overlay-v2.js +115 -0
  361. package/dist/ui/overlay/impl/ask-user-overlay-v2.js +2 -5
  362. package/dist/ui/overlay/impl/background-overlay-v2.d.ts +40 -0
  363. package/dist/ui/overlay/impl/background-overlay-v2.js +147 -0
  364. package/dist/ui/overlay/impl/backlog-overlay-v2.d.ts +4 -1
  365. package/dist/ui/overlay/impl/backlog-overlay-v2.js +55 -16
  366. package/dist/ui/overlay/impl/changelog-overlay-v2.d.ts +44 -0
  367. package/dist/ui/overlay/impl/changelog-overlay-v2.js +165 -0
  368. package/dist/ui/overlay/impl/commands-overlay-v2.js +4 -6
  369. package/dist/ui/overlay/impl/config-overlay-v2.d.ts +12 -1
  370. package/dist/ui/overlay/impl/config-overlay-v2.js +164 -100
  371. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.d.ts +83 -0
  372. package/dist/ui/overlay/impl/custom-agent-form-overlay-v2.js +711 -0
  373. package/dist/ui/overlay/impl/dashboard-overlay-v2.d.ts +2 -0
  374. package/dist/ui/overlay/impl/dashboard-overlay-v2.js +26 -3
  375. package/dist/ui/overlay/impl/delegations-overlay-v2.d.ts +28 -0
  376. package/dist/ui/overlay/impl/delegations-overlay-v2.js +279 -0
  377. package/dist/ui/overlay/impl/docs-overlay-v2.js +12 -9
  378. package/dist/ui/overlay/impl/document-detail-overlay-v2.d.ts +7 -0
  379. package/dist/ui/overlay/impl/document-detail-overlay-v2.js +119 -78
  380. package/dist/ui/overlay/impl/filter-overlay-v2.d.ts +41 -0
  381. package/dist/ui/overlay/impl/filter-overlay-v2.js +110 -0
  382. package/dist/ui/overlay/impl/games-overlay-v2.d.ts +31 -0
  383. package/dist/ui/overlay/impl/games-overlay-v2.js +135 -0
  384. package/dist/ui/overlay/impl/help-overlay-v2.d.ts +26 -3
  385. package/dist/ui/overlay/impl/help-overlay-v2.js +20 -42
  386. package/dist/ui/overlay/impl/login-overlay-v2.d.ts +49 -0
  387. package/dist/ui/overlay/impl/login-overlay-v2.js +277 -0
  388. package/dist/ui/overlay/impl/mcp-overlay-v2.d.ts +63 -0
  389. package/dist/ui/overlay/impl/mcp-overlay-v2.js +907 -0
  390. package/dist/ui/overlay/impl/model-overlay-v2.d.ts +57 -13
  391. package/dist/ui/overlay/impl/model-overlay-v2.js +1086 -61
  392. package/dist/ui/overlay/impl/new-overlay-v2.d.ts +37 -6
  393. package/dist/ui/overlay/impl/new-overlay-v2.js +715 -65
  394. package/dist/ui/overlay/impl/notifications-overlay-v2.d.ts +20 -0
  395. package/dist/ui/overlay/impl/notifications-overlay-v2.js +116 -0
  396. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.d.ts +76 -0
  397. package/dist/ui/overlay/impl/onboarding-wizard-overlay-v2.js +728 -0
  398. package/dist/ui/overlay/impl/pending-overlay-v2.d.ts +51 -0
  399. package/dist/ui/overlay/impl/pending-overlay-v2.js +445 -0
  400. package/dist/ui/overlay/impl/permission-overlay-v2.js +5 -5
  401. package/dist/ui/overlay/impl/permissions-overlay-v2.d.ts +85 -0
  402. package/dist/ui/overlay/impl/permissions-overlay-v2.js +820 -0
  403. package/dist/ui/overlay/impl/plan-approval-overlay-v2.d.ts +35 -0
  404. package/dist/ui/overlay/impl/plan-approval-overlay-v2.js +181 -0
  405. package/dist/ui/overlay/impl/project-edit-overlay-v2.d.ts +36 -0
  406. package/dist/ui/overlay/impl/project-edit-overlay-v2.js +195 -0
  407. package/dist/ui/overlay/impl/projects-overlay-v2.d.ts +1 -0
  408. package/dist/ui/overlay/impl/projects-overlay-v2.js +278 -44
  409. package/dist/ui/overlay/impl/reset-overlay-v2.d.ts +39 -0
  410. package/dist/ui/overlay/impl/reset-overlay-v2.js +107 -0
  411. package/dist/ui/overlay/impl/resume-overlay-v2.d.ts +60 -0
  412. package/dist/ui/overlay/impl/resume-overlay-v2.js +414 -0
  413. package/dist/ui/overlay/impl/session-mode-overlay-v2.d.ts +43 -0
  414. package/dist/ui/overlay/impl/session-mode-overlay-v2.js +124 -0
  415. package/dist/ui/overlay/impl/tasks-overlay-v2.d.ts +28 -0
  416. package/dist/ui/overlay/impl/tasks-overlay-v2.js +283 -0
  417. package/dist/ui/overlay/impl/team-overlay-v2.d.ts +86 -0
  418. package/dist/ui/overlay/impl/team-overlay-v2.js +692 -0
  419. package/dist/ui/overlay/impl/terminals-overlay-v2.d.ts +26 -0
  420. package/dist/ui/overlay/impl/terminals-overlay-v2.js +217 -0
  421. package/dist/ui/overlay/impl/tools-overlay-v2.js +3 -7
  422. package/dist/ui/overlay/impl/tutorial-overlay-v2.d.ts +30 -16
  423. package/dist/ui/overlay/impl/tutorial-overlay-v2.js +133 -956
  424. package/dist/ui/overlay/impl/workflow-overlay-v2.js +5 -1
  425. package/dist/ui/overlay/index.d.ts +20 -1
  426. package/dist/ui/overlay/index.js +19 -0
  427. package/dist/ui/overlay/types.d.ts +5 -0
  428. package/dist/ui/overlay-manager.d.ts +43 -0
  429. package/dist/ui/overlay-manager.js +238 -0
  430. package/dist/ui/overlays.js +4 -16
  431. package/dist/ui/permission-overlay.js +6 -5
  432. package/dist/ui/status-bar-controller.d.ts +33 -0
  433. package/dist/ui/status-bar-controller.js +99 -0
  434. package/dist/ui/subagent-renderer.js +3 -19
  435. package/dist/ui/terminal-autocomplete-utils.d.ts +23 -0
  436. package/dist/ui/terminal-autocomplete-utils.js +83 -0
  437. package/dist/ui/terminal-line-builders.d.ts +17 -0
  438. package/dist/ui/terminal-line-builders.js +42 -0
  439. package/dist/ui/terminal-render-item.d.ts +16 -0
  440. package/dist/ui/terminal-render-item.js +267 -0
  441. package/dist/ui/terminal-renderer.d.ts +7 -8
  442. package/dist/ui/terminal-renderer.js +7 -8
  443. package/dist/ui/terminal-types.d.ts +179 -0
  444. package/dist/ui/terminal-types.js +34 -0
  445. package/dist/ui/terminal-ui.d.ts +144 -276
  446. package/dist/ui/terminal-ui.js +384 -1861
  447. package/dist/ui/todo-zone.d.ts +19 -1
  448. package/dist/ui/todo-zone.js +71 -13
  449. package/dist/ui/tool-formatters.js +512 -1
  450. package/dist/ui/turn-metrics.d.ts +56 -0
  451. package/dist/ui/turn-metrics.js +75 -0
  452. package/dist/ui/types.d.ts +28 -0
  453. package/dist/ui/types.js +1 -0
  454. package/dist/ui/vscode-diff-ipc.d.ts +102 -0
  455. package/dist/ui/vscode-diff-ipc.js +385 -0
  456. package/dist/utils/credentials.d.ts +24 -5
  457. package/dist/utils/credentials.js +123 -9
  458. package/dist/utils/format-tokens.d.ts +13 -0
  459. package/dist/utils/format-tokens.js +18 -0
  460. package/dist/utils/git-config.d.ts +26 -0
  461. package/dist/utils/git-config.js +54 -0
  462. package/dist/utils/message-utils.d.ts +61 -0
  463. package/dist/utils/message-utils.js +72 -0
  464. package/dist/utils/model-tiers.d.ts +8 -1
  465. package/dist/utils/model-tiers.js +38 -16
  466. package/dist/utils/open-browser.d.ts +5 -0
  467. package/dist/utils/open-browser.js +32 -0
  468. package/dist/utils/path-safety.js +3 -2
  469. package/dist/utils/project-detection.d.ts +58 -0
  470. package/dist/utils/project-detection.js +424 -0
  471. package/dist/utils/project-memory.js +2 -1
  472. package/dist/utils/project-status.d.ts +2 -2
  473. package/dist/utils/startup-perf.d.ts +18 -0
  474. package/dist/utils/startup-perf.js +60 -0
  475. package/dist/utils/token-tracker.d.ts +62 -0
  476. package/dist/utils/token-tracker.js +150 -0
  477. package/dist/utils/token-types.d.ts +23 -0
  478. package/dist/utils/token-types.js +18 -0
  479. package/dist/utils/types/config-types.d.ts +32 -0
  480. package/dist/utils/types/config-types.js +8 -0
  481. package/dist/utils/update-checker.d.ts +28 -0
  482. package/dist/utils/update-checker.js +106 -0
  483. package/dist/utils/version.d.ts +7 -0
  484. package/dist/utils/version.js +10 -0
  485. package/dist/utils/vscode-detect.d.ts +39 -0
  486. package/dist/utils/vscode-detect.js +137 -0
  487. package/package.json +25 -12
  488. package/dist/commands/handler-types.d.ts +0 -68
  489. package/dist/commands/handler-types.js +0 -8
  490. package/dist/commands/handlers/agent-commands.d.ts +0 -13
  491. package/dist/commands/handlers/agent-commands.js +0 -305
  492. package/dist/commands/handlers/design-commands.d.ts +0 -15
  493. package/dist/commands/handlers/design-commands.js +0 -334
  494. package/dist/commands/handlers/index.d.ts +0 -20
  495. package/dist/commands/handlers/index.js +0 -43
  496. package/dist/commands/handlers/overlay-commands.d.ts +0 -21
  497. package/dist/commands/handlers/overlay-commands.js +0 -287
  498. package/dist/commands/handlers/project-commands.d.ts +0 -11
  499. package/dist/commands/handlers/project-commands.js +0 -167
  500. package/dist/commands/handlers/simple-commands.d.ts +0 -19
  501. package/dist/commands/handlers/simple-commands.js +0 -144
  502. package/dist/commands/registry.d.ts +0 -50
  503. package/dist/commands/registry.js +0 -75
  504. package/dist/index.old.d.ts +0 -7
  505. package/dist/index.old.js +0 -1014
  506. package/dist/repl.d.ts +0 -149
  507. package/dist/repl.js +0 -1151
  508. package/dist/templates/claude-md.d.ts +0 -7
  509. package/dist/templates/claude-md.js +0 -189
  510. package/dist/test-autocomplete.d.ts +0 -7
  511. package/dist/test-autocomplete.js +0 -85
  512. package/dist/test-tabbed-menu.d.ts +0 -7
  513. package/dist/test-tabbed-menu.js +0 -25
  514. package/dist/tool-selector.d.ts +0 -71
  515. package/dist/tool-selector.js +0 -184
  516. package/dist/ui/agents-overlay-v2.d.ts +0 -43
  517. package/dist/ui/agents-overlay-v2.js +0 -809
  518. package/dist/ui/agents-overlay.d.ts +0 -12
  519. package/dist/ui/agents-overlay.js +0 -863
  520. package/dist/ui/anchors-overlay.d.ts +0 -12
  521. package/dist/ui/anchors-overlay.js +0 -775
  522. package/dist/ui/arch-type-overlay.d.ts +0 -15
  523. package/dist/ui/arch-type-overlay.js +0 -201
  524. package/dist/ui/ask-user-overlay-v2.d.ts +0 -26
  525. package/dist/ui/ask-user-overlay-v2.js +0 -555
  526. package/dist/ui/ask-user-simple-overlay-v2.d.ts +0 -25
  527. package/dist/ui/ask-user-simple-overlay-v2.js +0 -215
  528. package/dist/ui/backlog-overlay.d.ts +0 -32
  529. package/dist/ui/backlog-overlay.js +0 -652
  530. package/dist/ui/commands-overlay-v2.d.ts +0 -33
  531. package/dist/ui/commands-overlay-v2.js +0 -441
  532. package/dist/ui/commands-overlay.d.ts +0 -16
  533. package/dist/ui/commands-overlay.js +0 -439
  534. package/dist/ui/config-overlay.d.ts +0 -35
  535. package/dist/ui/config-overlay.js +0 -707
  536. package/dist/ui/docs-overlay.d.ts +0 -17
  537. package/dist/ui/docs-overlay.js +0 -303
  538. package/dist/ui/footer-v2.d.ts +0 -222
  539. package/dist/ui/footer-v2.js +0 -1349
  540. package/dist/ui/help-overlay-v2.d.ts +0 -34
  541. package/dist/ui/help-overlay-v2.js +0 -309
  542. package/dist/ui/help-overlay.d.ts +0 -16
  543. package/dist/ui/help-overlay.js +0 -316
  544. package/dist/ui/init-overlay-v2.d.ts +0 -34
  545. package/dist/ui/init-overlay-v2.js +0 -600
  546. package/dist/ui/init-overlay.d.ts +0 -34
  547. package/dist/ui/init-overlay.js +0 -604
  548. package/dist/ui/input-prompt-v2.d.ts +0 -180
  549. package/dist/ui/input-prompt-v2.js +0 -999
  550. package/dist/ui/iteration-limit-overlay-v2.d.ts +0 -21
  551. package/dist/ui/iteration-limit-overlay-v2.js +0 -114
  552. package/dist/ui/keys-overlay-v2.d.ts +0 -41
  553. package/dist/ui/keys-overlay-v2.js +0 -248
  554. package/dist/ui/mascot-overlay-v2.d.ts +0 -41
  555. package/dist/ui/mascot-overlay-v2.js +0 -138
  556. package/dist/ui/mascot-overlay.d.ts +0 -21
  557. package/dist/ui/mascot-overlay.js +0 -146
  558. package/dist/ui/model-overlay-v2.d.ts +0 -49
  559. package/dist/ui/model-overlay-v2.js +0 -118
  560. package/dist/ui/model-overlay.d.ts +0 -27
  561. package/dist/ui/model-overlay.js +0 -221
  562. package/dist/ui/model-warning-overlay.d.ts +0 -30
  563. package/dist/ui/model-warning-overlay.js +0 -169
  564. package/dist/ui/new-overlay.d.ts +0 -34
  565. package/dist/ui/new-overlay.js +0 -604
  566. package/dist/ui/overlay/impl/init-overlay-v2.d.ts +0 -77
  567. package/dist/ui/overlay/impl/init-overlay-v2.js +0 -593
  568. package/dist/ui/overlay/overlay-types.d.ts +0 -128
  569. package/dist/ui/overlay/overlay-types.js +0 -22
  570. package/dist/ui/overlays/help-overlay-v2.d.ts +0 -28
  571. package/dist/ui/overlays/help-overlay-v2.js +0 -198
  572. package/dist/ui/overlays/index.d.ts +0 -11
  573. package/dist/ui/overlays/index.js +0 -11
  574. package/dist/ui/permission-overlay-v2.d.ts +0 -36
  575. package/dist/ui/permission-overlay-v2.js +0 -380
  576. package/dist/ui/projects-overlay.d.ts +0 -19
  577. package/dist/ui/projects-overlay.js +0 -484
  578. package/dist/ui/theme-overlay-v2.d.ts +0 -42
  579. package/dist/ui/theme-overlay-v2.js +0 -135
  580. package/dist/ui/theme-overlay.d.ts +0 -24
  581. package/dist/ui/theme-overlay.js +0 -127
  582. package/dist/ui/tools-overlay-v2.d.ts +0 -47
  583. package/dist/ui/tools-overlay-v2.js +0 -218
  584. package/dist/ui/tools-overlay.d.ts +0 -34
  585. package/dist/ui/tools-overlay.js +0 -230
  586. package/dist/ui/tutorial-overlay-v2.d.ts +0 -31
  587. package/dist/ui/tutorial-overlay-v2.js +0 -1035
  588. package/dist/ui/tutorial-overlay.d.ts +0 -11
  589. package/dist/ui/tutorial-overlay.js +0 -1034
  590. package/dist/ui/workflow-overlay.d.ts +0 -22
  591. package/dist/ui/workflow-overlay.js +0 -636
@@ -0,0 +1,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;