@compilr-dev/cli 0.4.0 → 0.5.1

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