helixmind 0.1.0

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.

Potentially problematic release.


This version of helixmind might be problematic. Click here for more details.

Files changed (479) hide show
  1. package/LICENSE +20 -0
  2. package/README.md +207 -0
  3. package/dist/cli/agent/autonomous.d.ts +10 -0
  4. package/dist/cli/agent/autonomous.d.ts.map +1 -0
  5. package/dist/cli/agent/autonomous.js +172 -0
  6. package/dist/cli/agent/autonomous.js.map +1 -0
  7. package/dist/cli/agent/loop.d.ts +76 -0
  8. package/dist/cli/agent/loop.d.ts.map +1 -0
  9. package/dist/cli/agent/loop.js +333 -0
  10. package/dist/cli/agent/loop.js.map +1 -0
  11. package/dist/cli/agent/permissions.d.ts +28 -0
  12. package/dist/cli/agent/permissions.d.ts.map +1 -0
  13. package/dist/cli/agent/permissions.js +180 -0
  14. package/dist/cli/agent/permissions.js.map +1 -0
  15. package/dist/cli/agent/sandbox.d.ts +17 -0
  16. package/dist/cli/agent/sandbox.d.ts.map +1 -0
  17. package/dist/cli/agent/sandbox.js +124 -0
  18. package/dist/cli/agent/sandbox.js.map +1 -0
  19. package/dist/cli/agent/tools/edit-file.d.ts +2 -0
  20. package/dist/cli/agent/tools/edit-file.d.ts.map +1 -0
  21. package/dist/cli/agent/tools/edit-file.js +49 -0
  22. package/dist/cli/agent/tools/edit-file.js.map +1 -0
  23. package/dist/cli/agent/tools/find.d.ts +2 -0
  24. package/dist/cli/agent/tools/find.d.ts.map +1 -0
  25. package/dist/cli/agent/tools/find.js +35 -0
  26. package/dist/cli/agent/tools/find.js.map +1 -0
  27. package/dist/cli/agent/tools/git-commit.d.ts +2 -0
  28. package/dist/cli/agent/tools/git-commit.d.ts.map +1 -0
  29. package/dist/cli/agent/tools/git-commit.js +51 -0
  30. package/dist/cli/agent/tools/git-commit.js.map +1 -0
  31. package/dist/cli/agent/tools/git-diff.d.ts +2 -0
  32. package/dist/cli/agent/tools/git-diff.d.ts.map +1 -0
  33. package/dist/cli/agent/tools/git-diff.js +36 -0
  34. package/dist/cli/agent/tools/git-diff.js.map +1 -0
  35. package/dist/cli/agent/tools/git-log.d.ts +2 -0
  36. package/dist/cli/agent/tools/git-log.d.ts.map +1 -0
  37. package/dist/cli/agent/tools/git-log.js +32 -0
  38. package/dist/cli/agent/tools/git-log.js.map +1 -0
  39. package/dist/cli/agent/tools/git-status.d.ts +2 -0
  40. package/dist/cli/agent/tools/git-status.d.ts.map +1 -0
  41. package/dist/cli/agent/tools/git-status.js +38 -0
  42. package/dist/cli/agent/tools/git-status.js.map +1 -0
  43. package/dist/cli/agent/tools/list-dir.d.ts +2 -0
  44. package/dist/cli/agent/tools/list-dir.d.ts.map +1 -0
  45. package/dist/cli/agent/tools/list-dir.js +73 -0
  46. package/dist/cli/agent/tools/list-dir.js.map +1 -0
  47. package/dist/cli/agent/tools/read-file.d.ts +2 -0
  48. package/dist/cli/agent/tools/read-file.d.ts.map +1 -0
  49. package/dist/cli/agent/tools/read-file.js +45 -0
  50. package/dist/cli/agent/tools/read-file.js.map +1 -0
  51. package/dist/cli/agent/tools/registry.d.ts +18 -0
  52. package/dist/cli/agent/tools/registry.d.ts.map +1 -0
  53. package/dist/cli/agent/tools/registry.js +31 -0
  54. package/dist/cli/agent/tools/registry.js.map +1 -0
  55. package/dist/cli/agent/tools/run-command.d.ts +2 -0
  56. package/dist/cli/agent/tools/run-command.d.ts.map +1 -0
  57. package/dist/cli/agent/tools/run-command.js +79 -0
  58. package/dist/cli/agent/tools/run-command.js.map +1 -0
  59. package/dist/cli/agent/tools/search.d.ts +2 -0
  60. package/dist/cli/agent/tools/search.d.ts.map +1 -0
  61. package/dist/cli/agent/tools/search.js +104 -0
  62. package/dist/cli/agent/tools/search.js.map +1 -0
  63. package/dist/cli/agent/tools/spiral-query.d.ts +2 -0
  64. package/dist/cli/agent/tools/spiral-query.d.ts.map +1 -0
  65. package/dist/cli/agent/tools/spiral-query.js +52 -0
  66. package/dist/cli/agent/tools/spiral-query.js.map +1 -0
  67. package/dist/cli/agent/tools/spiral-store.d.ts +2 -0
  68. package/dist/cli/agent/tools/spiral-store.d.ts.map +1 -0
  69. package/dist/cli/agent/tools/spiral-store.js +37 -0
  70. package/dist/cli/agent/tools/spiral-store.js.map +1 -0
  71. package/dist/cli/agent/tools/web-research.d.ts +2 -0
  72. package/dist/cli/agent/tools/web-research.d.ts.map +1 -0
  73. package/dist/cli/agent/tools/web-research.js +96 -0
  74. package/dist/cli/agent/tools/web-research.js.map +1 -0
  75. package/dist/cli/agent/tools/write-file.d.ts +2 -0
  76. package/dist/cli/agent/tools/write-file.d.ts.map +1 -0
  77. package/dist/cli/agent/tools/write-file.js +91 -0
  78. package/dist/cli/agent/tools/write-file.js.map +1 -0
  79. package/dist/cli/agent/undo.d.ts +30 -0
  80. package/dist/cli/agent/undo.d.ts.map +1 -0
  81. package/dist/cli/agent/undo.js +48 -0
  82. package/dist/cli/agent/undo.js.map +1 -0
  83. package/dist/cli/auth/callback-server.d.ts +15 -0
  84. package/dist/cli/auth/callback-server.d.ts.map +1 -0
  85. package/dist/cli/auth/callback-server.js +168 -0
  86. package/dist/cli/auth/callback-server.js.map +1 -0
  87. package/dist/cli/auth/feature-gate.d.ts +19 -0
  88. package/dist/cli/auth/feature-gate.d.ts.map +1 -0
  89. package/dist/cli/auth/feature-gate.js +74 -0
  90. package/dist/cli/auth/feature-gate.js.map +1 -0
  91. package/dist/cli/auth/guard.d.ts +10 -0
  92. package/dist/cli/auth/guard.d.ts.map +1 -0
  93. package/dist/cli/auth/guard.js +46 -0
  94. package/dist/cli/auth/guard.js.map +1 -0
  95. package/dist/cli/auth/login.d.ts +22 -0
  96. package/dist/cli/auth/login.d.ts.map +1 -0
  97. package/dist/cli/auth/login.js +194 -0
  98. package/dist/cli/auth/login.js.map +1 -0
  99. package/dist/cli/auth/logout.d.ts +6 -0
  100. package/dist/cli/auth/logout.d.ts.map +1 -0
  101. package/dist/cli/auth/logout.js +36 -0
  102. package/dist/cli/auth/logout.js.map +1 -0
  103. package/dist/cli/bench/dataset.d.ts +13 -0
  104. package/dist/cli/bench/dataset.d.ts.map +1 -0
  105. package/dist/cli/bench/dataset.js +97 -0
  106. package/dist/cli/bench/dataset.js.map +1 -0
  107. package/dist/cli/bench/harness.d.ts +7 -0
  108. package/dist/cli/bench/harness.d.ts.map +1 -0
  109. package/dist/cli/bench/harness.js +135 -0
  110. package/dist/cli/bench/harness.js.map +1 -0
  111. package/dist/cli/bench/metrics.d.ts +15 -0
  112. package/dist/cli/bench/metrics.d.ts.map +1 -0
  113. package/dist/cli/bench/metrics.js +98 -0
  114. package/dist/cli/bench/metrics.js.map +1 -0
  115. package/dist/cli/bench/output.d.ts +42 -0
  116. package/dist/cli/bench/output.d.ts.map +1 -0
  117. package/dist/cli/bench/output.js +140 -0
  118. package/dist/cli/bench/output.js.map +1 -0
  119. package/dist/cli/bench/prompt.d.ts +13 -0
  120. package/dist/cli/bench/prompt.d.ts.map +1 -0
  121. package/dist/cli/bench/prompt.js +106 -0
  122. package/dist/cli/bench/prompt.js.map +1 -0
  123. package/dist/cli/bench/runner.d.ts +14 -0
  124. package/dist/cli/bench/runner.d.ts.map +1 -0
  125. package/dist/cli/bench/runner.js +334 -0
  126. package/dist/cli/bench/runner.js.map +1 -0
  127. package/dist/cli/bench/types.d.ts +109 -0
  128. package/dist/cli/bench/types.d.ts.map +1 -0
  129. package/dist/cli/bench/types.js +2 -0
  130. package/dist/cli/bench/types.js.map +1 -0
  131. package/dist/cli/bench/ui.d.ts +12 -0
  132. package/dist/cli/bench/ui.d.ts.map +1 -0
  133. package/dist/cli/bench/ui.js +126 -0
  134. package/dist/cli/bench/ui.js.map +1 -0
  135. package/dist/cli/brain/archive.d.ts +33 -0
  136. package/dist/cli/brain/archive.d.ts.map +1 -0
  137. package/dist/cli/brain/archive.js +159 -0
  138. package/dist/cli/brain/archive.js.map +1 -0
  139. package/dist/cli/brain/control-protocol.d.ts +159 -0
  140. package/dist/cli/brain/control-protocol.d.ts.map +1 -0
  141. package/dist/cli/brain/control-protocol.js +41 -0
  142. package/dist/cli/brain/control-protocol.js.map +1 -0
  143. package/dist/cli/brain/exporter.d.ts +34 -0
  144. package/dist/cli/brain/exporter.d.ts.map +1 -0
  145. package/dist/cli/brain/exporter.js +37 -0
  146. package/dist/cli/brain/exporter.js.map +1 -0
  147. package/dist/cli/brain/generator.d.ts +67 -0
  148. package/dist/cli/brain/generator.d.ts.map +1 -0
  149. package/dist/cli/brain/generator.js +239 -0
  150. package/dist/cli/brain/generator.js.map +1 -0
  151. package/dist/cli/brain/relay-client.d.ts +8 -0
  152. package/dist/cli/brain/relay-client.d.ts.map +1 -0
  153. package/dist/cli/brain/relay-client.js +173 -0
  154. package/dist/cli/brain/relay-client.js.map +1 -0
  155. package/dist/cli/brain/server.d.ts +34 -0
  156. package/dist/cli/brain/server.d.ts.map +1 -0
  157. package/dist/cli/brain/server.js +425 -0
  158. package/dist/cli/brain/server.js.map +1 -0
  159. package/dist/cli/brain/template.d.ts +3 -0
  160. package/dist/cli/brain/template.d.ts.map +1 -0
  161. package/dist/cli/brain/template.js +2072 -0
  162. package/dist/cli/brain/template.js.map +1 -0
  163. package/dist/cli/checkpoints/browser.d.ts +27 -0
  164. package/dist/cli/checkpoints/browser.d.ts.map +1 -0
  165. package/dist/cli/checkpoints/browser.js +238 -0
  166. package/dist/cli/checkpoints/browser.js.map +1 -0
  167. package/dist/cli/checkpoints/keybinding.d.ts +22 -0
  168. package/dist/cli/checkpoints/keybinding.d.ts.map +1 -0
  169. package/dist/cli/checkpoints/keybinding.js +43 -0
  170. package/dist/cli/checkpoints/keybinding.js.map +1 -0
  171. package/dist/cli/checkpoints/revert.d.ts +37 -0
  172. package/dist/cli/checkpoints/revert.d.ts.map +1 -0
  173. package/dist/cli/checkpoints/revert.js +144 -0
  174. package/dist/cli/checkpoints/revert.js.map +1 -0
  175. package/dist/cli/checkpoints/store.d.ts +48 -0
  176. package/dist/cli/checkpoints/store.d.ts.map +1 -0
  177. package/dist/cli/checkpoints/store.js +188 -0
  178. package/dist/cli/checkpoints/store.js.map +1 -0
  179. package/dist/cli/commands/archive.d.ts +7 -0
  180. package/dist/cli/commands/archive.d.ts.map +1 -0
  181. package/dist/cli/commands/archive.js +66 -0
  182. package/dist/cli/commands/archive.js.map +1 -0
  183. package/dist/cli/commands/auth.d.ts +10 -0
  184. package/dist/cli/commands/auth.d.ts.map +1 -0
  185. package/dist/cli/commands/auth.js +44 -0
  186. package/dist/cli/commands/auth.js.map +1 -0
  187. package/dist/cli/commands/bench.d.ts +25 -0
  188. package/dist/cli/commands/bench.d.ts.map +1 -0
  189. package/dist/cli/commands/bench.js +114 -0
  190. package/dist/cli/commands/bench.js.map +1 -0
  191. package/dist/cli/commands/chat.d.ts +11 -0
  192. package/dist/cli/commands/chat.d.ts.map +1 -0
  193. package/dist/cli/commands/chat.js +2321 -0
  194. package/dist/cli/commands/chat.js.map +1 -0
  195. package/dist/cli/commands/config.d.ts +4 -0
  196. package/dist/cli/commands/config.d.ts.map +1 -0
  197. package/dist/cli/commands/config.js +41 -0
  198. package/dist/cli/commands/config.js.map +1 -0
  199. package/dist/cli/commands/feed.d.ts +6 -0
  200. package/dist/cli/commands/feed.d.ts.map +1 -0
  201. package/dist/cli/commands/feed.js +95 -0
  202. package/dist/cli/commands/feed.js.map +1 -0
  203. package/dist/cli/commands/helix-menu.d.ts +4 -0
  204. package/dist/cli/commands/helix-menu.d.ts.map +1 -0
  205. package/dist/cli/commands/helix-menu.js +400 -0
  206. package/dist/cli/commands/helix-menu.js.map +1 -0
  207. package/dist/cli/commands/init.d.ts +2 -0
  208. package/dist/cli/commands/init.d.ts.map +1 -0
  209. package/dist/cli/commands/init.js +26 -0
  210. package/dist/cli/commands/init.js.map +1 -0
  211. package/dist/cli/commands/setup.d.ts +20 -0
  212. package/dist/cli/commands/setup.d.ts.map +1 -0
  213. package/dist/cli/commands/setup.js +314 -0
  214. package/dist/cli/commands/setup.js.map +1 -0
  215. package/dist/cli/commands/spiral.d.ts +4 -0
  216. package/dist/cli/commands/spiral.d.ts.map +1 -0
  217. package/dist/cli/commands/spiral.js +81 -0
  218. package/dist/cli/commands/spiral.js.map +1 -0
  219. package/dist/cli/config/store.d.ts +72 -0
  220. package/dist/cli/config/store.d.ts.map +1 -0
  221. package/dist/cli/config/store.js +241 -0
  222. package/dist/cli/config/store.js.map +1 -0
  223. package/dist/cli/context/assembler.d.ts +8 -0
  224. package/dist/cli/context/assembler.d.ts.map +1 -0
  225. package/dist/cli/context/assembler.js +124 -0
  226. package/dist/cli/context/assembler.js.map +1 -0
  227. package/dist/cli/context/project.d.ts +13 -0
  228. package/dist/cli/context/project.d.ts.map +1 -0
  229. package/dist/cli/context/project.js +126 -0
  230. package/dist/cli/context/project.js.map +1 -0
  231. package/dist/cli/context/session-buffer.d.ts +57 -0
  232. package/dist/cli/context/session-buffer.d.ts.map +1 -0
  233. package/dist/cli/context/session-buffer.js +268 -0
  234. package/dist/cli/context/session-buffer.js.map +1 -0
  235. package/dist/cli/context/trimmer.d.ts +26 -0
  236. package/dist/cli/context/trimmer.d.ts.map +1 -0
  237. package/dist/cli/context/trimmer.js +105 -0
  238. package/dist/cli/context/trimmer.js.map +1 -0
  239. package/dist/cli/feed/analyzer.d.ts +17 -0
  240. package/dist/cli/feed/analyzer.d.ts.map +1 -0
  241. package/dist/cli/feed/analyzer.js +220 -0
  242. package/dist/cli/feed/analyzer.js.map +1 -0
  243. package/dist/cli/feed/intent.d.ts +8 -0
  244. package/dist/cli/feed/intent.d.ts.map +1 -0
  245. package/dist/cli/feed/intent.js +70 -0
  246. package/dist/cli/feed/intent.js.map +1 -0
  247. package/dist/cli/feed/parser.d.ts +23 -0
  248. package/dist/cli/feed/parser.d.ts.map +1 -0
  249. package/dist/cli/feed/parser.js +166 -0
  250. package/dist/cli/feed/parser.js.map +1 -0
  251. package/dist/cli/feed/pipeline.d.ts +32 -0
  252. package/dist/cli/feed/pipeline.d.ts.map +1 -0
  253. package/dist/cli/feed/pipeline.js +242 -0
  254. package/dist/cli/feed/pipeline.js.map +1 -0
  255. package/dist/cli/feed/reader.d.ts +10 -0
  256. package/dist/cli/feed/reader.d.ts.map +1 -0
  257. package/dist/cli/feed/reader.js +61 -0
  258. package/dist/cli/feed/reader.js.map +1 -0
  259. package/dist/cli/feed/scanner.d.ts +10 -0
  260. package/dist/cli/feed/scanner.d.ts.map +1 -0
  261. package/dist/cli/feed/scanner.js +124 -0
  262. package/dist/cli/feed/scanner.js.map +1 -0
  263. package/dist/cli/feed/watcher.d.ts +14 -0
  264. package/dist/cli/feed/watcher.d.ts.map +1 -0
  265. package/dist/cli/feed/watcher.js +76 -0
  266. package/dist/cli/feed/watcher.js.map +1 -0
  267. package/dist/cli/index.d.ts +3 -0
  268. package/dist/cli/index.d.ts.map +1 -0
  269. package/dist/cli/index.js +204 -0
  270. package/dist/cli/index.js.map +1 -0
  271. package/dist/cli/providers/anthropic.d.ts +10 -0
  272. package/dist/cli/providers/anthropic.d.ts.map +1 -0
  273. package/dist/cli/providers/anthropic.js +117 -0
  274. package/dist/cli/providers/anthropic.js.map +1 -0
  275. package/dist/cli/providers/ollama.d.ts +37 -0
  276. package/dist/cli/providers/ollama.d.ts.map +1 -0
  277. package/dist/cli/providers/ollama.js +151 -0
  278. package/dist/cli/providers/ollama.js.map +1 -0
  279. package/dist/cli/providers/openai.d.ts +13 -0
  280. package/dist/cli/providers/openai.d.ts.map +1 -0
  281. package/dist/cli/providers/openai.js +283 -0
  282. package/dist/cli/providers/openai.js.map +1 -0
  283. package/dist/cli/providers/rate-limiter.d.ts +51 -0
  284. package/dist/cli/providers/rate-limiter.d.ts.map +1 -0
  285. package/dist/cli/providers/rate-limiter.js +164 -0
  286. package/dist/cli/providers/rate-limiter.js.map +1 -0
  287. package/dist/cli/providers/registry.d.ts +16 -0
  288. package/dist/cli/providers/registry.d.ts.map +1 -0
  289. package/dist/cli/providers/registry.js +99 -0
  290. package/dist/cli/providers/registry.js.map +1 -0
  291. package/dist/cli/providers/types.d.ts +61 -0
  292. package/dist/cli/providers/types.d.ts.map +1 -0
  293. package/dist/cli/providers/types.js +2 -0
  294. package/dist/cli/providers/types.js.map +1 -0
  295. package/dist/cli/sessions/manager.d.ts +69 -0
  296. package/dist/cli/sessions/manager.d.ts.map +1 -0
  297. package/dist/cli/sessions/manager.js +200 -0
  298. package/dist/cli/sessions/manager.js.map +1 -0
  299. package/dist/cli/sessions/session.d.ts +54 -0
  300. package/dist/cli/sessions/session.d.ts.map +1 -0
  301. package/dist/cli/sessions/session.js +70 -0
  302. package/dist/cli/sessions/session.js.map +1 -0
  303. package/dist/cli/sessions/tab-view.d.ts +18 -0
  304. package/dist/cli/sessions/tab-view.d.ts.map +1 -0
  305. package/dist/cli/sessions/tab-view.js +134 -0
  306. package/dist/cli/sessions/tab-view.js.map +1 -0
  307. package/dist/cli/ui/activity.d.ts +82 -0
  308. package/dist/cli/ui/activity.d.ts.map +1 -0
  309. package/dist/cli/ui/activity.js +309 -0
  310. package/dist/cli/ui/activity.js.map +1 -0
  311. package/dist/cli/ui/chat-view.d.ts +10 -0
  312. package/dist/cli/ui/chat-view.d.ts.map +1 -0
  313. package/dist/cli/ui/chat-view.js +165 -0
  314. package/dist/cli/ui/chat-view.js.map +1 -0
  315. package/dist/cli/ui/command-suggest.d.ts +22 -0
  316. package/dist/cli/ui/command-suggest.d.ts.map +1 -0
  317. package/dist/cli/ui/command-suggest.js +115 -0
  318. package/dist/cli/ui/command-suggest.js.map +1 -0
  319. package/dist/cli/ui/logo.d.ts +3 -0
  320. package/dist/cli/ui/logo.d.ts.map +1 -0
  321. package/dist/cli/ui/logo.js +25 -0
  322. package/dist/cli/ui/logo.js.map +1 -0
  323. package/dist/cli/ui/progress.d.ts +21 -0
  324. package/dist/cli/ui/progress.d.ts.map +1 -0
  325. package/dist/cli/ui/progress.js +125 -0
  326. package/dist/cli/ui/progress.js.map +1 -0
  327. package/dist/cli/ui/select-menu.d.ts +22 -0
  328. package/dist/cli/ui/select-menu.d.ts.map +1 -0
  329. package/dist/cli/ui/select-menu.js +152 -0
  330. package/dist/cli/ui/select-menu.js.map +1 -0
  331. package/dist/cli/ui/spinner.d.ts +3 -0
  332. package/dist/cli/ui/spinner.d.ts.map +1 -0
  333. package/dist/cli/ui/spinner.js +14 -0
  334. package/dist/cli/ui/spinner.js.map +1 -0
  335. package/dist/cli/ui/statusbar.d.ts +65 -0
  336. package/dist/cli/ui/statusbar.d.ts.map +1 -0
  337. package/dist/cli/ui/statusbar.js +272 -0
  338. package/dist/cli/ui/statusbar.js.map +1 -0
  339. package/dist/cli/ui/theme.d.ts +20 -0
  340. package/dist/cli/ui/theme.d.ts.map +1 -0
  341. package/dist/cli/ui/theme.js +25 -0
  342. package/dist/cli/ui/theme.js.map +1 -0
  343. package/dist/cli/ui/tool-output.d.ts +25 -0
  344. package/dist/cli/ui/tool-output.d.ts.map +1 -0
  345. package/dist/cli/ui/tool-output.js +171 -0
  346. package/dist/cli/ui/tool-output.js.map +1 -0
  347. package/dist/cli/validation/autofix.d.ts +32 -0
  348. package/dist/cli/validation/autofix.d.ts.map +1 -0
  349. package/dist/cli/validation/autofix.js +148 -0
  350. package/dist/cli/validation/autofix.js.map +1 -0
  351. package/dist/cli/validation/classifier.d.ts +17 -0
  352. package/dist/cli/validation/classifier.d.ts.map +1 -0
  353. package/dist/cli/validation/classifier.js +174 -0
  354. package/dist/cli/validation/classifier.js.map +1 -0
  355. package/dist/cli/validation/criteria.d.ts +22 -0
  356. package/dist/cli/validation/criteria.d.ts.map +1 -0
  357. package/dist/cli/validation/criteria.js +188 -0
  358. package/dist/cli/validation/criteria.js.map +1 -0
  359. package/dist/cli/validation/dynamic-checks.d.ts +16 -0
  360. package/dist/cli/validation/dynamic-checks.d.ts.map +1 -0
  361. package/dist/cli/validation/dynamic-checks.js +109 -0
  362. package/dist/cli/validation/dynamic-checks.js.map +1 -0
  363. package/dist/cli/validation/model.d.ts +16 -0
  364. package/dist/cli/validation/model.d.ts.map +1 -0
  365. package/dist/cli/validation/model.js +59 -0
  366. package/dist/cli/validation/model.js.map +1 -0
  367. package/dist/cli/validation/reporter.d.ts +18 -0
  368. package/dist/cli/validation/reporter.d.ts.map +1 -0
  369. package/dist/cli/validation/reporter.js +167 -0
  370. package/dist/cli/validation/reporter.js.map +1 -0
  371. package/dist/cli/validation/spiral-checks.d.ts +12 -0
  372. package/dist/cli/validation/spiral-checks.d.ts.map +1 -0
  373. package/dist/cli/validation/spiral-checks.js +167 -0
  374. package/dist/cli/validation/spiral-checks.js.map +1 -0
  375. package/dist/cli/validation/static-checks.d.ts +26 -0
  376. package/dist/cli/validation/static-checks.d.ts.map +1 -0
  377. package/dist/cli/validation/static-checks.js +492 -0
  378. package/dist/cli/validation/static-checks.js.map +1 -0
  379. package/dist/cli/validation/stats.d.ts +29 -0
  380. package/dist/cli/validation/stats.d.ts.map +1 -0
  381. package/dist/cli/validation/stats.js +137 -0
  382. package/dist/cli/validation/stats.js.map +1 -0
  383. package/dist/index.d.ts +3 -0
  384. package/dist/index.d.ts.map +1 -0
  385. package/dist/index.js +35 -0
  386. package/dist/index.js.map +1 -0
  387. package/dist/server.d.ts +8 -0
  388. package/dist/server.d.ts.map +1 -0
  389. package/dist/server.js +43 -0
  390. package/dist/server.js.map +1 -0
  391. package/dist/spiral/cloud/content-extractor.d.ts +27 -0
  392. package/dist/spiral/cloud/content-extractor.d.ts.map +1 -0
  393. package/dist/spiral/cloud/content-extractor.js +175 -0
  394. package/dist/spiral/cloud/content-extractor.js.map +1 -0
  395. package/dist/spiral/cloud/search-provider.d.ts +22 -0
  396. package/dist/spiral/cloud/search-provider.d.ts.map +1 -0
  397. package/dist/spiral/cloud/search-provider.js +212 -0
  398. package/dist/spiral/cloud/search-provider.js.map +1 -0
  399. package/dist/spiral/cloud/topic-detector.d.ts +25 -0
  400. package/dist/spiral/cloud/topic-detector.d.ts.map +1 -0
  401. package/dist/spiral/cloud/topic-detector.js +196 -0
  402. package/dist/spiral/cloud/topic-detector.js.map +1 -0
  403. package/dist/spiral/cloud/web-enricher.d.ts +58 -0
  404. package/dist/spiral/cloud/web-enricher.d.ts.map +1 -0
  405. package/dist/spiral/cloud/web-enricher.js +170 -0
  406. package/dist/spiral/cloud/web-enricher.js.map +1 -0
  407. package/dist/spiral/compression.d.ts +54 -0
  408. package/dist/spiral/compression.d.ts.map +1 -0
  409. package/dist/spiral/compression.js +175 -0
  410. package/dist/spiral/compression.js.map +1 -0
  411. package/dist/spiral/embeddings.d.ts +24 -0
  412. package/dist/spiral/embeddings.d.ts.map +1 -0
  413. package/dist/spiral/embeddings.js +69 -0
  414. package/dist/spiral/embeddings.js.map +1 -0
  415. package/dist/spiral/engine.d.ts +95 -0
  416. package/dist/spiral/engine.d.ts.map +1 -0
  417. package/dist/spiral/engine.js +271 -0
  418. package/dist/spiral/engine.js.map +1 -0
  419. package/dist/spiral/injection.d.ts +29 -0
  420. package/dist/spiral/injection.d.ts.map +1 -0
  421. package/dist/spiral/injection.js +164 -0
  422. package/dist/spiral/injection.js.map +1 -0
  423. package/dist/spiral/relevance.d.ts +37 -0
  424. package/dist/spiral/relevance.d.ts.map +1 -0
  425. package/dist/spiral/relevance.js +75 -0
  426. package/dist/spiral/relevance.js.map +1 -0
  427. package/dist/storage/database.d.ts +11 -0
  428. package/dist/storage/database.d.ts.map +1 -0
  429. package/dist/storage/database.js +141 -0
  430. package/dist/storage/database.js.map +1 -0
  431. package/dist/storage/edges.d.ts +25 -0
  432. package/dist/storage/edges.d.ts.map +1 -0
  433. package/dist/storage/edges.js +69 -0
  434. package/dist/storage/edges.js.map +1 -0
  435. package/dist/storage/nodes.d.ts +45 -0
  436. package/dist/storage/nodes.d.ts.map +1 -0
  437. package/dist/storage/nodes.js +124 -0
  438. package/dist/storage/nodes.js.map +1 -0
  439. package/dist/storage/vectors.d.ts +25 -0
  440. package/dist/storage/vectors.d.ts.map +1 -0
  441. package/dist/storage/vectors.js +110 -0
  442. package/dist/storage/vectors.js.map +1 -0
  443. package/dist/tools/spiral-compact.d.ts +14 -0
  444. package/dist/tools/spiral-compact.d.ts.map +1 -0
  445. package/dist/tools/spiral-compact.js +14 -0
  446. package/dist/tools/spiral-compact.js.map +1 -0
  447. package/dist/tools/spiral-query.d.ts +18 -0
  448. package/dist/tools/spiral-query.d.ts.map +1 -0
  449. package/dist/tools/spiral-query.js +16 -0
  450. package/dist/tools/spiral-query.js.map +1 -0
  451. package/dist/tools/spiral-relate.d.ts +21 -0
  452. package/dist/tools/spiral-relate.d.ts.map +1 -0
  453. package/dist/tools/spiral-relate.js +21 -0
  454. package/dist/tools/spiral-relate.js.map +1 -0
  455. package/dist/tools/spiral-status.d.ts +8 -0
  456. package/dist/tools/spiral-status.d.ts.map +1 -0
  457. package/dist/tools/spiral-status.js +10 -0
  458. package/dist/tools/spiral-status.js.map +1 -0
  459. package/dist/tools/spiral-store.d.ts +41 -0
  460. package/dist/tools/spiral-store.d.ts.map +1 -0
  461. package/dist/tools/spiral-store.js +22 -0
  462. package/dist/tools/spiral-store.js.map +1 -0
  463. package/dist/types.d.ts +92 -0
  464. package/dist/types.d.ts.map +1 -0
  465. package/dist/types.js +9 -0
  466. package/dist/types.js.map +1 -0
  467. package/dist/utils/config.d.ts +14 -0
  468. package/dist/utils/config.d.ts.map +1 -0
  469. package/dist/utils/config.js +44 -0
  470. package/dist/utils/config.js.map +1 -0
  471. package/dist/utils/logger.d.ts +10 -0
  472. package/dist/utils/logger.d.ts.map +1 -0
  473. package/dist/utils/logger.js +40 -0
  474. package/dist/utils/logger.js.map +1 -0
  475. package/dist/utils/tokens.d.ts +21 -0
  476. package/dist/utils/tokens.d.ts.map +1 -0
  477. package/dist/utils/tokens.js +33 -0
  478. package/dist/utils/tokens.js.map +1 -0
  479. package/package.json +90 -0
@@ -0,0 +1,48 @@
1
+ import { readFileSync, writeFileSync, existsSync } from 'node:fs';
2
+ export class UndoStack {
3
+ stack = [];
4
+ maxSize = 50;
5
+ push(entry) {
6
+ this.stack.push(entry);
7
+ if (this.stack.length > this.maxSize) {
8
+ this.stack.shift();
9
+ }
10
+ }
11
+ /**
12
+ * Undo the last n changes. Returns the number of changes undone.
13
+ */
14
+ undo(count = 1) {
15
+ const entries = [];
16
+ const toUndo = Math.min(count, this.stack.length);
17
+ for (let i = 0; i < toUndo; i++) {
18
+ const entry = this.stack.pop();
19
+ if (entry.originalContent === null) {
20
+ // File was created — we can't delete it (too dangerous), just note it
21
+ entries.push(entry);
22
+ }
23
+ else {
24
+ writeFileSync(entry.path, entry.originalContent, 'utf-8');
25
+ entries.push(entry);
26
+ }
27
+ }
28
+ return { undone: entries.length, entries };
29
+ }
30
+ /**
31
+ * Get all undo-able entries (most recent first).
32
+ */
33
+ list() {
34
+ return [...this.stack].reverse();
35
+ }
36
+ /**
37
+ * Capture the current state of a file before modification.
38
+ */
39
+ static captureState(path) {
40
+ if (!existsSync(path))
41
+ return null;
42
+ return readFileSync(path, 'utf-8');
43
+ }
44
+ get size() {
45
+ return this.stack.length;
46
+ }
47
+ }
48
+ //# sourceMappingURL=undo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"undo.js","sourceRoot":"","sources":["../../../src/cli/agent/undo.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAWlE,MAAM,OAAO,SAAS;IACZ,KAAK,GAAgB,EAAE,CAAC;IACxB,OAAO,GAAG,EAAE,CAAC;IAErB,IAAI,CAAC,KAAgB;QACnB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YACrC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACrB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,IAAI,CAAC,QAAgB,CAAC;QACpB,MAAM,OAAO,GAAgB,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QAElD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAG,CAAC;YAChC,IAAI,KAAK,CAAC,eAAe,KAAK,IAAI,EAAE,CAAC;gBACnC,sEAAsE;gBACtE,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;iBAAM,CAAC;gBACN,aAAa,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,OAAO,CAAC,CAAC;gBAC1D,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtB,CAAC;QACH,CAAC;QAED,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7C,CAAC;IAED;;OAEG;IACH,IAAI;QACF,OAAO,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC;IACnC,CAAC;IAED;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,IAAY;QAC9B,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;YAAE,OAAO,IAAI,CAAC;QACnC,OAAO,YAAY,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;IAC3B,CAAC;CACF"}
@@ -0,0 +1,15 @@
1
+ export interface CallbackResult {
2
+ apiKey: string;
3
+ state: string;
4
+ userId?: string;
5
+ email?: string;
6
+ plan?: string;
7
+ }
8
+ export interface CallbackServer {
9
+ port: number;
10
+ state: string;
11
+ waitForCallback(): Promise<CallbackResult>;
12
+ close(): void;
13
+ }
14
+ export declare function startCallbackServer(timeoutMs?: number): Promise<CallbackServer>;
15
+ //# sourceMappingURL=callback-server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/callback-server.ts"],"names":[],"mappings":"AAQA,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,eAAe,IAAI,OAAO,CAAC,cAAc,CAAC,CAAC;IAC3C,KAAK,IAAI,IAAI,CAAC;CACf;AAsED,wBAAgB,mBAAmB,CAAC,SAAS,SAAU,GAAG,OAAO,CAAC,cAAc,CAAC,CAwGhF"}
@@ -0,0 +1,168 @@
1
+ /**
2
+ * Temporary localhost HTTP server for CLI login callback.
3
+ * Receives the API key from the webapp after user authorization.
4
+ */
5
+ import { createServer } from 'node:http';
6
+ import { randomBytes } from 'node:crypto';
7
+ import { URL } from 'node:url';
8
+ const SUCCESS_HTML = `<!DOCTYPE html>
9
+ <html lang="en">
10
+ <head>
11
+ <meta charset="utf-8">
12
+ <meta name="viewport" content="width=device-width, initial-scale=1">
13
+ <title>HelixMind CLI — Authorized</title>
14
+ <style>
15
+ * { margin: 0; padding: 0; box-sizing: border-box; }
16
+ body {
17
+ background: #050510;
18
+ color: #e0e0e0;
19
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ min-height: 100vh;
24
+ }
25
+ .card {
26
+ text-align: center;
27
+ padding: 3rem;
28
+ border: 1px solid rgba(0, 212, 255, 0.2);
29
+ border-radius: 16px;
30
+ background: rgba(0, 212, 255, 0.03);
31
+ max-width: 420px;
32
+ }
33
+ .icon { font-size: 3rem; margin-bottom: 1rem; }
34
+ h1 { color: #00d4ff; font-size: 1.5rem; margin-bottom: 0.5rem; }
35
+ p { color: #888; font-size: 0.95rem; line-height: 1.5; }
36
+ .hint { margin-top: 1.5rem; font-size: 0.8rem; color: #555; }
37
+ </style>
38
+ </head>
39
+ <body>
40
+ <div class="card">
41
+ <div class="icon">&#x2713;</div>
42
+ <h1>CLI Authorized</h1>
43
+ <p>HelixMind CLI has been connected to your account.<br>You can close this tab and return to your terminal.</p>
44
+ <p class="hint">This tab will close automatically in 3 seconds.</p>
45
+ </div>
46
+ <script>setTimeout(() => window.close(), 3000);</script>
47
+ </body>
48
+ </html>`;
49
+ const CANCEL_HTML = `<!DOCTYPE html>
50
+ <html lang="en">
51
+ <head>
52
+ <meta charset="utf-8">
53
+ <title>HelixMind CLI — Cancelled</title>
54
+ <style>
55
+ * { margin: 0; padding: 0; box-sizing: border-box; }
56
+ body {
57
+ background: #050510; color: #e0e0e0;
58
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', sans-serif;
59
+ display: flex; align-items: center; justify-content: center; min-height: 100vh;
60
+ }
61
+ .card { text-align: center; padding: 3rem; border: 1px solid rgba(255,100,100,0.2); border-radius: 16px; max-width: 420px; }
62
+ h1 { color: #ff6464; font-size: 1.5rem; margin-bottom: 0.5rem; }
63
+ p { color: #888; }
64
+ </style>
65
+ </head>
66
+ <body>
67
+ <div class="card">
68
+ <h1>Authorization Cancelled</h1>
69
+ <p>You can close this tab.</p>
70
+ </div>
71
+ <script>setTimeout(() => window.close(), 2000);</script>
72
+ </body>
73
+ </html>`;
74
+ export function startCallbackServer(timeoutMs = 120_000) {
75
+ return new Promise((resolveServer, rejectServer) => {
76
+ const state = randomBytes(32).toString('hex');
77
+ let callbackResolve = null;
78
+ let callbackReject = null;
79
+ let settled = false;
80
+ let timer = null;
81
+ const server = createServer((req, res) => {
82
+ const url = new URL(req.url ?? '/', `http://127.0.0.1`);
83
+ const pathname = url.pathname;
84
+ // CORS headers for localhost
85
+ res.setHeader('Access-Control-Allow-Origin', '*');
86
+ res.setHeader('Content-Type', 'text/html; charset=utf-8');
87
+ if (pathname === '/callback' && req.method === 'GET') {
88
+ const returnedState = url.searchParams.get('state');
89
+ const key = url.searchParams.get('key');
90
+ if (returnedState !== state) {
91
+ res.writeHead(403);
92
+ res.end('<h1>Invalid state — possible CSRF attack</h1>');
93
+ return;
94
+ }
95
+ if (!key) {
96
+ res.writeHead(400);
97
+ res.end('<h1>Missing API key</h1>');
98
+ return;
99
+ }
100
+ res.writeHead(200);
101
+ res.end(SUCCESS_HTML);
102
+ if (!settled && callbackResolve) {
103
+ settled = true;
104
+ if (timer)
105
+ clearTimeout(timer);
106
+ callbackResolve({
107
+ apiKey: key,
108
+ state: returnedState,
109
+ userId: url.searchParams.get('userId') ?? undefined,
110
+ email: url.searchParams.get('email') ?? undefined,
111
+ plan: url.searchParams.get('plan') ?? undefined,
112
+ });
113
+ // Close server after a short delay to finish sending the response
114
+ setTimeout(() => server.close(), 500);
115
+ }
116
+ return;
117
+ }
118
+ if (pathname === '/cancel' && req.method === 'GET') {
119
+ res.writeHead(200);
120
+ res.end(CANCEL_HTML);
121
+ if (!settled && callbackReject) {
122
+ settled = true;
123
+ if (timer)
124
+ clearTimeout(timer);
125
+ callbackReject(new Error('Authorization cancelled by user'));
126
+ setTimeout(() => server.close(), 500);
127
+ }
128
+ return;
129
+ }
130
+ // Any other request
131
+ res.writeHead(404);
132
+ res.end('Not found');
133
+ });
134
+ server.listen(0, '127.0.0.1', () => {
135
+ const addr = server.address();
136
+ if (!addr || typeof addr === 'string') {
137
+ rejectServer(new Error('Failed to start callback server'));
138
+ return;
139
+ }
140
+ resolveServer({
141
+ port: addr.port,
142
+ state,
143
+ waitForCallback() {
144
+ return new Promise((resolve, reject) => {
145
+ callbackResolve = resolve;
146
+ callbackReject = reject;
147
+ timer = setTimeout(() => {
148
+ if (!settled) {
149
+ settled = true;
150
+ server.close();
151
+ reject(new Error(`Authorization timed out after ${timeoutMs / 1000}s`));
152
+ }
153
+ }, timeoutMs);
154
+ });
155
+ },
156
+ close() {
157
+ if (timer)
158
+ clearTimeout(timer);
159
+ server.close();
160
+ },
161
+ });
162
+ });
163
+ server.on('error', (err) => {
164
+ rejectServer(err);
165
+ });
166
+ });
167
+ }
168
+ //# sourceMappingURL=callback-server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callback-server.js","sourceRoot":"","sources":["../../../src/cli/auth/callback-server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Feature gating based on subscription plan.
3
+ * Checks whether a feature is available for the user's current plan.
4
+ */
5
+ import type { ConfigStore } from '../config/store.js';
6
+ export type Feature = 'cloud_sync' | 'team_sessions' | 'advanced_spiral' | 'priority_support';
7
+ export declare function isFeatureAvailable(store: ConfigStore, feature: Feature): boolean;
8
+ export declare function requireFeature(store: ConfigStore, feature: Feature): void;
9
+ export declare class FeatureGateError extends Error {
10
+ readonly feature: Feature;
11
+ readonly requiredPlan: string;
12
+ constructor(feature: Feature, requiredPlan: string);
13
+ }
14
+ /**
15
+ * Refresh plan info from the web platform.
16
+ * Updates cached plan in config. Returns the plan string or null on failure.
17
+ */
18
+ export declare function refreshPlanInfo(store: ConfigStore): Promise<string | null>;
19
+ //# sourceMappingURL=feature-gate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-gate.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/feature-gate.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAEtD,MAAM,MAAM,OAAO,GACf,YAAY,GACZ,eAAe,GACf,iBAAiB,GACjB,kBAAkB,CAAC;AAmBvB,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAIhF;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAKzE;AAED,qBAAa,gBAAiB,SAAQ,KAAK;aAEvB,OAAO,EAAE,OAAO;aAChB,YAAY,EAAE,MAAM;gBADpB,OAAO,EAAE,OAAO,EAChB,YAAY,EAAE,MAAM;CAQvC;AAED;;;GAGG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAwChF"}
@@ -0,0 +1,74 @@
1
+ // Web enricher is FREE for all — it's the core intelligence of HelixMind.
2
+ // Gated features are cloud/team/enterprise add-ons.
3
+ const PLAN_HIERARCHY = {
4
+ FREE: 0,
5
+ PRO: 1,
6
+ TEAM: 2,
7
+ ENTERPRISE: 3,
8
+ };
9
+ const FEATURE_MIN_PLAN = {
10
+ cloud_sync: 'PRO',
11
+ advanced_spiral: 'PRO',
12
+ team_sessions: 'TEAM',
13
+ priority_support: 'PRO',
14
+ };
15
+ export function isFeatureAvailable(store, feature) {
16
+ const plan = store.get('relay.plan') ?? 'FREE';
17
+ const minPlan = FEATURE_MIN_PLAN[feature];
18
+ return (PLAN_HIERARCHY[plan] ?? 0) >= (PLAN_HIERARCHY[minPlan] ?? 0);
19
+ }
20
+ export function requireFeature(store, feature) {
21
+ if (!isFeatureAvailable(store, feature)) {
22
+ const minPlan = FEATURE_MIN_PLAN[feature];
23
+ throw new FeatureGateError(feature, minPlan);
24
+ }
25
+ }
26
+ export class FeatureGateError extends Error {
27
+ feature;
28
+ requiredPlan;
29
+ constructor(feature, requiredPlan) {
30
+ super(`Feature "${feature}" requires ${requiredPlan} plan or higher. ` +
31
+ 'Run `helixmind login` to authenticate or upgrade at your dashboard.');
32
+ this.feature = feature;
33
+ this.requiredPlan = requiredPlan;
34
+ this.name = 'FeatureGateError';
35
+ }
36
+ }
37
+ /**
38
+ * Refresh plan info from the web platform.
39
+ * Updates cached plan in config. Returns the plan string or null on failure.
40
+ */
41
+ export async function refreshPlanInfo(store) {
42
+ const auth = store.getAuthInfo();
43
+ if (!auth?.apiKey || !auth.url)
44
+ return null;
45
+ try {
46
+ const url = auth.url.replace(/\/+$/, '');
47
+ const res = await fetch(`${url}/api/auth/cli/verify`, {
48
+ headers: { Authorization: `Bearer ${auth.apiKey}` },
49
+ signal: AbortSignal.timeout(5000),
50
+ });
51
+ if (!res.ok) {
52
+ // Key might be revoked/expired
53
+ if (res.status === 401) {
54
+ store.set('relay.plan', 'FREE');
55
+ }
56
+ return null;
57
+ }
58
+ const data = (await res.json());
59
+ if (data.plan) {
60
+ store.set('relay.plan', data.plan);
61
+ }
62
+ if (data.email) {
63
+ store.set('relay.userEmail', data.email);
64
+ }
65
+ if (data.userId) {
66
+ store.set('relay.userId', data.userId);
67
+ }
68
+ return data.plan ?? null;
69
+ }
70
+ catch {
71
+ return null;
72
+ }
73
+ }
74
+ //# sourceMappingURL=feature-gate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"feature-gate.js","sourceRoot":"","sources":["../../../src/cli/auth/feature-gate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { ConfigStore } from '../config/store.js';
2
+ /**
3
+ * Check if user is logged in. If not, run login flow.
4
+ * Returns the ConfigStore (always authenticated after this call).
5
+ * Exits process if login fails/cancelled.
6
+ *
7
+ * Commands that are exempt from auth: login, logout, whoami, --help, --version
8
+ */
9
+ export declare function requireAuth(): Promise<ConfigStore>;
10
+ //# sourceMappingURL=guard.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/guard.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAGjD;;;;;;GAMG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,WAAW,CAAC,CA8BxD"}
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Auth guard — ensures user is logged in before using any CLI command.
3
+ *
4
+ * After first login, credentials are cached locally in ~/.helixmind/config.json.
5
+ * Works offline with cached auth. When online, token validity is checked
6
+ * in the background (non-blocking).
7
+ */
8
+ import chalk from 'chalk';
9
+ import { homedir } from 'node:os';
10
+ import { join } from 'node:path';
11
+ import { ConfigStore } from '../config/store.js';
12
+ import { theme } from '../ui/theme.js';
13
+ /**
14
+ * Check if user is logged in. If not, run login flow.
15
+ * Returns the ConfigStore (always authenticated after this call).
16
+ * Exits process if login fails/cancelled.
17
+ *
18
+ * Commands that are exempt from auth: login, logout, whoami, --help, --version
19
+ */
20
+ export async function requireAuth() {
21
+ const configDir = join(homedir(), '.helixmind');
22
+ const store = new ConfigStore(configDir);
23
+ if (store.isLoggedIn()) {
24
+ // Already authenticated (cached locally). Verify in background when online.
25
+ import('../auth/feature-gate.js')
26
+ .then(({ refreshPlanInfo }) => refreshPlanInfo(store))
27
+ .catch(() => { });
28
+ return store;
29
+ }
30
+ // Not logged in — show gate and start login flow
31
+ process.stdout.write('\n');
32
+ process.stdout.write(chalk.dim(' \u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E') + '\n');
33
+ process.stdout.write(chalk.dim(' \u2502 ') + theme.primary('\uD83D\uDD10 Login required') + chalk.dim(' \u2502') + '\n');
34
+ process.stdout.write(chalk.dim(' \u2502 ') + 'HelixMind requires a free account to use.'.padEnd(46) + chalk.dim(' \u2502') + '\n');
35
+ process.stdout.write(chalk.dim(' \u2502 ') + chalk.dim('One-time setup \u2014 works offline afterwards.'.padEnd(46)) + chalk.dim(' \u2502') + '\n');
36
+ process.stdout.write(chalk.dim(' \u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F') + '\n\n');
37
+ const { loginFlow } = await import('../auth/login.js');
38
+ const loggedIn = await loginFlow(store, {});
39
+ if (!loggedIn) {
40
+ process.stdout.write(chalk.red('\n Login required to use HelixMind.\n'));
41
+ process.stdout.write(chalk.dim(' Run `helixmind login` to try again.\n\n'));
42
+ process.exit(1);
43
+ }
44
+ return store;
45
+ }
46
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../../src/cli/auth/guard.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,KAAK,EAAE,MAAM,gBAAgB,CAAC;AAEvC;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW;IAC/B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,YAAY,CAAC,CAAC;IAChD,MAAM,KAAK,GAAG,IAAI,WAAW,CAAC,SAAS,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,UAAU,EAAE,EAAE,CAAC;QACvB,4EAA4E;QAC5E,MAAM,CAAC,yBAAyB,CAAC;aAC9B,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;aACrD,KAAK,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QACnB,OAAO,KAAK,CAAC;IACf,CAAC;IAED,iDAAiD;IACjD,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC3B,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4TAA4T,CAAC,GAAG,IAAI,CAAC,CAAC;IACrW,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,6BAA6B,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,GAAG,IAAI,CAAC,CAAC;IAC1J,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,2CAA2C,CAAC,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;IACtI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,YAAY,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,iDAAiD,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,GAAG,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,IAAI,CAAC,CAAC;IACvJ,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,4TAA4T,CAAC,GAAG,MAAM,CAAC,CAAC;IAEvW,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,kBAAkB,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,MAAM,SAAS,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;IAE5C,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,wCAAwC,CAAC,CAAC,CAAC;QAC1E,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,2CAA2C,CAAC,CAAC,CAAC;QAC7E,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,22 @@
1
+ import { ConfigStore } from '../config/store.js';
2
+ export interface LoginOptions {
3
+ apiKey?: string;
4
+ url?: string;
5
+ force?: boolean;
6
+ }
7
+ export interface AuthStatus {
8
+ loggedIn: boolean;
9
+ email?: string;
10
+ plan?: string;
11
+ userId?: string;
12
+ webappUrl?: string;
13
+ }
14
+ /**
15
+ * Full login flow: check existing auth, then either manual key or browser flow.
16
+ */
17
+ export declare function loginFlow(store: ConfigStore, options: LoginOptions): Promise<boolean>;
18
+ /**
19
+ * Check if the stored API key is still valid. Returns auth status.
20
+ */
21
+ export declare function checkAuthStatus(store: ConfigStore): Promise<AuthStatus>;
22
+ //# sourceMappingURL=login.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"login.d.ts","sourceRoot":"","sources":["../../../src/cli/auth/login.ts"],"names":[],"mappings":"AASA,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AAKjD,MAAM,WAAW,YAAY;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;CACjB;AAED,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;GAEG;AACH,wBAAsB,SAAS,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,CAyB3F;AA+HD;;GAEG;AACH,wBAAsB,eAAe,CAAC,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC,CAwC7E"}
@@ -0,0 +1,194 @@
1
+ /**
2
+ * CLI login orchestrator — browser-based callback flow.
3
+ * Opens the webapp in the browser, waits for the user to authorize,
4
+ * then stores the API key in the local config.
5
+ */
6
+ import { platform, hostname, release } from 'node:os';
7
+ import { exec } from 'node:child_process';
8
+ import chalk from 'chalk';
9
+ import { theme } from '../ui/theme.js';
10
+ import { ConfigStore } from '../config/store.js';
11
+ import { startCallbackServer } from './callback-server.js';
12
+ const DEFAULT_WEBAPP_URL = 'https://helix-mind.ai';
13
+ /**
14
+ * Full login flow: check existing auth, then either manual key or browser flow.
15
+ */
16
+ export async function loginFlow(store, options) {
17
+ const webappUrl = (options.url ?? store.get('relay.url') ?? DEFAULT_WEBAPP_URL).replace(/\/+$/, '');
18
+ // Check if already logged in (unless --force)
19
+ if (!options.force && store.isLoggedIn()) {
20
+ const status = await checkAuthStatus(store);
21
+ if (status.loggedIn) {
22
+ process.stdout.write('\n');
23
+ process.stdout.write(chalk.dim('\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E') + '\n');
24
+ process.stdout.write(chalk.dim('\u2502 ') + theme.primary('\u{1F517} Already logged in') + chalk.dim(' \u2502') + '\n');
25
+ process.stdout.write(chalk.dim('\u2502 ') + `Account: ${status.email ?? 'unknown'}`.padEnd(46) + chalk.dim('\u2502') + '\n');
26
+ process.stdout.write(chalk.dim('\u2502 ') + `Plan: ${status.plan ?? 'FREE'}`.padEnd(46) + chalk.dim('\u2502') + '\n');
27
+ process.stdout.write(chalk.dim('\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F') + '\n');
28
+ process.stdout.write(chalk.dim(' Use --force to re-authenticate.\n\n'));
29
+ return true;
30
+ }
31
+ }
32
+ // Manual key entry (--api-key flag)
33
+ if (options.apiKey) {
34
+ return manualKeyLogin(store, options.apiKey, webappUrl);
35
+ }
36
+ // Browser callback flow
37
+ return browserLogin(store, webappUrl);
38
+ }
39
+ async function manualKeyLogin(store, apiKey, webappUrl) {
40
+ if (!apiKey.startsWith('hm_')) {
41
+ process.stdout.write(chalk.red(' Invalid API key format. Keys start with "hm_".\n'));
42
+ return false;
43
+ }
44
+ process.stdout.write(chalk.dim(' Validating API key...\n'));
45
+ try {
46
+ const res = await fetch(`${webappUrl}/api/auth/cli/verify`, {
47
+ headers: { Authorization: `Bearer ${apiKey}` },
48
+ signal: AbortSignal.timeout(10_000),
49
+ });
50
+ if (!res.ok) {
51
+ process.stdout.write(chalk.red(' Invalid or expired API key.\n'));
52
+ return false;
53
+ }
54
+ const data = (await res.json());
55
+ store.set('relay.apiKey', apiKey);
56
+ store.set('relay.url', webappUrl);
57
+ if (data.email)
58
+ store.set('relay.userEmail', data.email);
59
+ if (data.plan)
60
+ store.set('relay.plan', data.plan);
61
+ if (data.userId)
62
+ store.set('relay.userId', data.userId);
63
+ store.set('relay.loginAt', new Date().toISOString());
64
+ store.set('relay.autoConnect', true);
65
+ showSuccessBox(data.email, data.plan, apiKey);
66
+ return true;
67
+ }
68
+ catch (err) {
69
+ process.stdout.write(chalk.red(` Could not reach ${webappUrl}. Check your connection.\n`));
70
+ return false;
71
+ }
72
+ }
73
+ async function browserLogin(store, webappUrl) {
74
+ process.stdout.write('\n');
75
+ process.stdout.write(theme.primary(' \u{1F300} HelixMind Login\n'));
76
+ process.stdout.write(chalk.dim(' Opening browser for authorization...\n\n'));
77
+ let server;
78
+ try {
79
+ server = await startCallbackServer();
80
+ }
81
+ catch (err) {
82
+ process.stdout.write(chalk.red(' Failed to start local callback server.\n'));
83
+ return false;
84
+ }
85
+ const deviceName = hostname();
86
+ const deviceOs = `${platform()} ${release()}`;
87
+ const authUrl = `${webappUrl}/auth/cli` +
88
+ `?callback_port=${server.port}` +
89
+ `&state=${server.state}` +
90
+ `&device_name=${encodeURIComponent(deviceName)}` +
91
+ `&device_os=${encodeURIComponent(deviceOs)}`;
92
+ // Open browser
93
+ const opened = await openBrowser(authUrl);
94
+ if (!opened) {
95
+ process.stdout.write(chalk.yellow(' Could not open browser automatically.\n'));
96
+ process.stdout.write(chalk.dim(' Open this URL manually:\n\n'));
97
+ process.stdout.write(` ${theme.primary(authUrl)}\n\n`);
98
+ }
99
+ process.stdout.write(chalk.dim(' Waiting for authorization in browser... (timeout: 120s)\n'));
100
+ process.stdout.write(chalk.dim(' Press Ctrl+C to cancel.\n\n'));
101
+ try {
102
+ const result = await server.waitForCallback();
103
+ // Store auth data
104
+ store.set('relay.apiKey', result.apiKey);
105
+ store.set('relay.url', webappUrl);
106
+ if (result.email)
107
+ store.set('relay.userEmail', result.email);
108
+ if (result.plan)
109
+ store.set('relay.plan', result.plan);
110
+ if (result.userId)
111
+ store.set('relay.userId', result.userId);
112
+ store.set('relay.loginAt', new Date().toISOString());
113
+ store.set('relay.autoConnect', true);
114
+ showSuccessBox(result.email, result.plan, result.apiKey);
115
+ return true;
116
+ }
117
+ catch (err) {
118
+ server.close();
119
+ const msg = err instanceof Error ? err.message : String(err);
120
+ if (msg.includes('cancelled')) {
121
+ process.stdout.write(chalk.yellow(' Authorization cancelled.\n\n'));
122
+ }
123
+ else if (msg.includes('timed out')) {
124
+ process.stdout.write(chalk.yellow(' Authorization timed out.\n'));
125
+ process.stdout.write(chalk.dim(' Try: helixmind login --api-key <key>\n\n'));
126
+ }
127
+ else {
128
+ process.stdout.write(chalk.red(` Login failed: ${msg}\n\n`));
129
+ }
130
+ return false;
131
+ }
132
+ }
133
+ function showSuccessBox(email, plan, apiKey) {
134
+ const masked = apiKey ? ConfigStore.maskKey(apiKey) : '***';
135
+ process.stdout.write('\n');
136
+ process.stdout.write(chalk.dim('\u256D\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256E') + '\n');
137
+ process.stdout.write(chalk.dim('\u2502 ') + chalk.green('\u2713 HelixMind \u2014 Logged In') + chalk.dim(' \u2502') + '\n');
138
+ process.stdout.write(chalk.dim('\u2502 ') + `Account: ${email ?? 'connected'}`.padEnd(46) + chalk.dim('\u2502') + '\n');
139
+ process.stdout.write(chalk.dim('\u2502 ') + `Plan: ${plan ?? 'FREE'}`.padEnd(46) + chalk.dim('\u2502') + '\n');
140
+ process.stdout.write(chalk.dim('\u2502 ') + `API Key: ${masked}`.padEnd(46) + chalk.dim('\u2502') + '\n');
141
+ process.stdout.write(chalk.dim('\u2570\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u256F') + '\n\n');
142
+ }
143
+ function openBrowser(url) {
144
+ return new Promise((resolve) => {
145
+ const plat = platform();
146
+ const cmd = plat === 'win32' ? `start "" "${url}"`
147
+ : plat === 'darwin' ? `open "${url}"`
148
+ : `xdg-open "${url}"`;
149
+ exec(cmd, (err) => resolve(!err));
150
+ });
151
+ }
152
+ /**
153
+ * Check if the stored API key is still valid. Returns auth status.
154
+ */
155
+ export async function checkAuthStatus(store) {
156
+ const auth = store.getAuthInfo();
157
+ if (!auth?.apiKey || !auth.url) {
158
+ return { loggedIn: false };
159
+ }
160
+ try {
161
+ const url = auth.url.replace(/\/+$/, '');
162
+ const res = await fetch(`${url}/api/auth/cli/verify`, {
163
+ headers: { Authorization: `Bearer ${auth.apiKey}` },
164
+ signal: AbortSignal.timeout(5000),
165
+ });
166
+ if (!res.ok) {
167
+ return { loggedIn: false, webappUrl: auth.url };
168
+ }
169
+ const data = (await res.json());
170
+ // Update cached values
171
+ if (data.email)
172
+ store.set('relay.userEmail', data.email);
173
+ if (data.plan)
174
+ store.set('relay.plan', data.plan);
175
+ return {
176
+ loggedIn: true,
177
+ email: data.email ?? auth.email,
178
+ plan: data.plan ?? auth.plan,
179
+ userId: data.userId ?? auth.userId,
180
+ webappUrl: auth.url,
181
+ };
182
+ }
183
+ catch {
184
+ // Network error — use cached data
185
+ return {
186
+ loggedIn: true,
187
+ email: auth.email,
188
+ plan: auth.plan,
189
+ userId: auth.userId,
190
+ webappUrl: auth.url,
191
+ };
192
+ }
193
+ }
194
+ //# sourceMappingURL=login.js.map