upfynai-code 2.5.1 → 2.6.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 (293) hide show
  1. package/README.md +123 -88
  2. package/bin/cli.js +63 -0
  3. package/package.json +48 -112
  4. package/src/auth.js +115 -0
  5. package/src/config.js +33 -0
  6. package/src/connect.js +314 -0
  7. package/src/launch.js +54 -0
  8. package/src/mcp.js +57 -0
  9. package/src/server.js +54 -0
  10. package/client/dist/api-docs.html +0 -879
  11. package/client/dist/assets/AppContent-C0CyP3g5.js +0 -513
  12. package/client/dist/assets/CanvasPanel-0u9QR7U-.js +0 -34
  13. package/client/dist/assets/CanvasPanel-WhZulBJw.css +0 -1
  14. package/client/dist/assets/DashboardPanel-Dgqw1yZk.js +0 -1
  15. package/client/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  16. package/client/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  17. package/client/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  18. package/client/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  19. package/client/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  20. package/client/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  21. package/client/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  22. package/client/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  23. package/client/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  24. package/client/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  25. package/client/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  26. package/client/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  27. package/client/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  28. package/client/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  29. package/client/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  30. package/client/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  31. package/client/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  32. package/client/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  33. package/client/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  34. package/client/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  35. package/client/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  36. package/client/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  37. package/client/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  38. package/client/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  39. package/client/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  40. package/client/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  41. package/client/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  42. package/client/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  43. package/client/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  44. package/client/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  45. package/client/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  46. package/client/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  47. package/client/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  48. package/client/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  49. package/client/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  50. package/client/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  51. package/client/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  52. package/client/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  53. package/client/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  54. package/client/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  55. package/client/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  56. package/client/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  57. package/client/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  58. package/client/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  59. package/client/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  60. package/client/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  61. package/client/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  62. package/client/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  63. package/client/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  64. package/client/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  65. package/client/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  66. package/client/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  67. package/client/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  68. package/client/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  69. package/client/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  70. package/client/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  71. package/client/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  72. package/client/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  73. package/client/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  74. package/client/dist/assets/LoginModal-CZDEzqjK.js +0 -19
  75. package/client/dist/assets/MarkdownPreview-CYdvwJaV.js +0 -1
  76. package/client/dist/assets/Onboarding-DR6NZ4Vz.js +0 -1
  77. package/client/dist/assets/SetupForm-D49gtWY4.js +0 -1
  78. package/client/dist/assets/Tableau10-B-NsZVaP.js +0 -1
  79. package/client/dist/assets/WorkflowsPanel-CqlbEJA_.js +0 -1
  80. package/client/dist/assets/_commonjs-dynamic-modules-TDtrdbi3.js +0 -1
  81. package/client/dist/assets/ar-SA-G6X2FPQ2-BWqa1yBH.js +0 -10
  82. package/client/dist/assets/arc-BegSKqEW.js +0 -1
  83. package/client/dist/assets/array-BKyUJesY.js +0 -1
  84. package/client/dist/assets/az-AZ-76LH7QW2-DrVlbZDP.js +0 -1
  85. package/client/dist/assets/bg-BG-XCXSNQG7-DdunjBgT.js +0 -5
  86. package/client/dist/assets/blockDiagram-38ab4fdb-BKMbwGHu.js +0 -118
  87. package/client/dist/assets/bn-BD-2XOGV67Q-_7DtmvwO.js +0 -5
  88. package/client/dist/assets/c4Diagram-3d4e48cf-hJuiHhSn.js +0 -10
  89. package/client/dist/assets/ca-ES-6MX7JW3Y-BFIrmojG.js +0 -8
  90. package/client/dist/assets/channel-Bur-rRTp.js +0 -1
  91. package/client/dist/assets/classDiagram-70f12bd4-BjiAf9cM.js +0 -2
  92. package/client/dist/assets/classDiagram-v2-f2320105-pwBewejc.js +0 -2
  93. package/client/dist/assets/clone-BtqXeoBJ.js +0 -1
  94. package/client/dist/assets/createText-2e5e7dd3-Dq_acOWe.js +0 -5
  95. package/client/dist/assets/cs-CZ-2BRQDIVT-B-x4F6TJ.js +0 -11
  96. package/client/dist/assets/da-DK-5WZEPLOC-Btlc8Dgn.js +0 -5
  97. package/client/dist/assets/de-DE-XR44H4JA-BVu3ZIoD.js +0 -8
  98. package/client/dist/assets/directory-open-01563666-DWU9wJ6I.js +0 -1
  99. package/client/dist/assets/directory-open-4ed118d0-CunoC1EB.js +0 -1
  100. package/client/dist/assets/edges-e0da2a9e-DH0wVTXR.js +0 -4
  101. package/client/dist/assets/el-GR-BZB4AONW-h2ll8_ZC.js +0 -10
  102. package/client/dist/assets/erDiagram-9861fffd-BYezLIR7.js +0 -51
  103. package/client/dist/assets/es-ES-U4NZUMDT-Cveiulwt.js +0 -9
  104. package/client/dist/assets/eu-ES-A7QVB2H4-DQluL2PY.js +0 -11
  105. package/client/dist/assets/fa-IR-HGAKTJCU-BJtcMBSv.js +0 -8
  106. package/client/dist/assets/fi-FI-Z5N7JZ37-D8NfbVXV.js +0 -6
  107. package/client/dist/assets/file-open-002ab408-DIuFHtCF.js +0 -1
  108. package/client/dist/assets/file-open-7c801643-684qeFg4.js +0 -1
  109. package/client/dist/assets/file-save-3189631c-C1wFhQhH.js +0 -1
  110. package/client/dist/assets/file-save-745eba88-Bb9F9Kg7.js +0 -1
  111. package/client/dist/assets/flowDb-956e92f1-scnUykhM.js +0 -10
  112. package/client/dist/assets/flowDiagram-66a62f08-jVyWsfyU.js +0 -4
  113. package/client/dist/assets/flowDiagram-v2-96b9c2cf-N6xgi25h.js +0 -1
  114. package/client/dist/assets/flowchart-elk-definition-4a651766-gKGX3HqR.js +0 -139
  115. package/client/dist/assets/fr-FR-RHASNOE6-vdj42kC6.js +0 -9
  116. package/client/dist/assets/ganttDiagram-c361ad54-C2CiWFUP.js +0 -257
  117. package/client/dist/assets/gitGraphDiagram-72cf32ee-C59Yz2LK.js +0 -70
  118. package/client/dist/assets/gl-ES-HMX3MZ6V-DQo0TzoP.js +0 -10
  119. package/client/dist/assets/graph-Dx_H43Kv.js +0 -1
  120. package/client/dist/assets/he-IL-6SHJWFNN-DKXK5e33.js +0 -10
  121. package/client/dist/assets/hi-IN-IWLTKZ5I-C2Qgqc0R.js +0 -4
  122. package/client/dist/assets/hu-HU-A5ZG7DT2-Ss-6vX0m.js +0 -7
  123. package/client/dist/assets/id-ID-SAP4L64H-D7Wsg1S2.js +0 -10
  124. package/client/dist/assets/image-blob-reduce.esm-D6s-rqMO.js +0 -7
  125. package/client/dist/assets/index-3862675e-u8Nv7hHC.js +0 -1
  126. package/client/dist/assets/index-BVowJdZF.js +0 -97
  127. package/client/dist/assets/index-ce18TYkg.js +0 -27
  128. package/client/dist/assets/index-kQoJx-bc.css +0 -1
  129. package/client/dist/assets/infoDiagram-f8f76790-LmoJYsxo.js +0 -7
  130. package/client/dist/assets/init-Gi6I4Gst.js +0 -1
  131. package/client/dist/assets/it-IT-JPQ66NNP-CAPTVl7M.js +0 -11
  132. package/client/dist/assets/ja-JP-DBVTYXUO-eNVPawR2.js +0 -8
  133. package/client/dist/assets/journeyDiagram-49397b02-BaJqehpR.js +0 -139
  134. package/client/dist/assets/kaa-6HZHGXH3-tpuNkKhS.js +0 -1
  135. package/client/dist/assets/kab-KAB-ZGHBKWFO-Dp83kx4x.js +0 -8
  136. package/client/dist/assets/kk-KZ-P5N5QNE5-B9IlC6YN.js +0 -1
  137. package/client/dist/assets/km-KH-HSX4SM5Z-B_KMYaMj.js +0 -11
  138. package/client/dist/assets/ko-KR-MTYHY66A-yebnUNdb.js +0 -9
  139. package/client/dist/assets/ku-TR-6OUDTVRD-BR6fh6-5.js +0 -9
  140. package/client/dist/assets/layout-DLl5Jwcl.js +0 -1
  141. package/client/dist/assets/line-FpB7omSK.js +0 -1
  142. package/client/dist/assets/linear-CkXqUFJ8.js +0 -1
  143. package/client/dist/assets/lt-LT-XHIRWOB4-SutZSWtR.js +0 -3
  144. package/client/dist/assets/lv-LV-5QDEKY6T-DuAxdcZL.js +0 -7
  145. package/client/dist/assets/mindmap-definition-fc14e90a-DyxXOExh.js +0 -425
  146. package/client/dist/assets/mr-IN-CRQNXWMA-DqDUWM_8.js +0 -13
  147. package/client/dist/assets/my-MM-5M5IBNSE-C40kMFMR.js +0 -1
  148. package/client/dist/assets/nb-NO-T6EIAALU-DVij32Ju.js +0 -10
  149. package/client/dist/assets/nl-NL-IS3SIHDZ-rT84mDYq.js +0 -8
  150. package/client/dist/assets/nn-NO-6E72VCQL-BBZXBW8V.js +0 -8
  151. package/client/dist/assets/oc-FR-POXYY2M6-DzjOugOf.js +0 -8
  152. package/client/dist/assets/ordinal-Cboi1Yqb.js +0 -1
  153. package/client/dist/assets/pa-IN-N4M65BXN-DD1iU8_F.js +0 -4
  154. package/client/dist/assets/path-CbwjOpE9.js +0 -1
  155. package/client/dist/assets/pdf-CE_K4jFx.js +0 -12
  156. package/client/dist/assets/pdf.worker-BA9kU3Pw.mjs +0 -61080
  157. package/client/dist/assets/percentages-BXMCSKIN-WVlHS4wx.js +0 -207
  158. package/client/dist/assets/pica-CQIY57Tf.js +0 -7
  159. package/client/dist/assets/pieDiagram-8a3498a8-Dd_85qBH.js +0 -35
  160. package/client/dist/assets/pl-PL-T2D74RX3-ukVXa48G.js +0 -9
  161. package/client/dist/assets/pt-BR-5N22H2LF-BibawarT.js +0 -9
  162. package/client/dist/assets/pt-PT-UZXXM6DQ-So3i9l9w.js +0 -9
  163. package/client/dist/assets/quadrantDiagram-120e2f19-C4dFVDEx.js +0 -7
  164. package/client/dist/assets/requirementDiagram-deff3bca-DrTO7yFl.js +0 -52
  165. package/client/dist/assets/ro-RO-JPDTUUEW-DY0Xq_Hd.js +0 -11
  166. package/client/dist/assets/roundRect-0PYZxl1G.js +0 -1
  167. package/client/dist/assets/ru-RU-B4JR7IUQ-B7u_Zvkd.js +0 -9
  168. package/client/dist/assets/sankeyDiagram-04a897e0-D24gfzuS.js +0 -8
  169. package/client/dist/assets/sequenceDiagram-704730f1-Dgji2XLQ.js +0 -122
  170. package/client/dist/assets/si-LK-N5RQ5JYF-OejsLzQ_.js +0 -1
  171. package/client/dist/assets/sk-SK-C5VTKIMK-_vy2Bt-M.js +0 -6
  172. package/client/dist/assets/sl-SI-NN7IZMDC-DKOl_u2M.js +0 -6
  173. package/client/dist/assets/stateDiagram-587899a1-CJ8eBaiU.js +0 -1
  174. package/client/dist/assets/stateDiagram-v2-d93cdb3a-C5K3l-Nt.js +0 -1
  175. package/client/dist/assets/styles-6aaf32cf-DAKE0jbx.js +0 -207
  176. package/client/dist/assets/styles-9a916d00-LFAJCgEy.js +0 -160
  177. package/client/dist/assets/styles-c10674c1-CllKO8NG.js +0 -116
  178. package/client/dist/assets/subset-shared.chunk-Uy-J87FQ.js +0 -84
  179. package/client/dist/assets/subset-worker.chunk-dvgDvqt9.js +0 -1
  180. package/client/dist/assets/sv-SE-XGPEYMSR-CDCB2ZV5.js +0 -10
  181. package/client/dist/assets/svgDrawCommon-08f97a94-CObOzbFQ.js +0 -1
  182. package/client/dist/assets/ta-IN-2NMHFXQM-DHUNdO69.js +0 -9
  183. package/client/dist/assets/th-TH-HPSO5L25-zI2hnBq3.js +0 -2
  184. package/client/dist/assets/timeline-definition-85554ec2-C2XHRmxK.js +0 -61
  185. package/client/dist/assets/tr-TR-DEFEU3FU-l-6Hu4-D.js +0 -7
  186. package/client/dist/assets/uk-UA-QMV73CPH-CqSOwrl7.js +0 -6
  187. package/client/dist/assets/vendor-codemirror-D_s0aGBu.js +0 -35
  188. package/client/dist/assets/vendor-i18n-DCFGyhQR.js +0 -1
  189. package/client/dist/assets/vendor-icons-Lb69KSFJ.js +0 -646
  190. package/client/dist/assets/vendor-markdown-BXEi_H3G.js +0 -298
  191. package/client/dist/assets/vendor-react-9mUTKBHH.js +0 -67
  192. package/client/dist/assets/vendor-syntax-DnmwQQJF.js +0 -16
  193. package/client/dist/assets/vendor-xterm-CZq1hqo1.js +0 -66
  194. package/client/dist/assets/vendor-xterm-qxJ8_QYu.css +0 -32
  195. package/client/dist/assets/vi-VN-M7AON7JQ-CUL8-mBZ.js +0 -5
  196. package/client/dist/assets/xychartDiagram-e933f94c-1fmf6slj.js +0 -7
  197. package/client/dist/assets/zh-CN-LNUGB5OW-CB5y5VVU.js +0 -10
  198. package/client/dist/assets/zh-HK-E62DVLB3-BHcrrEeJ.js +0 -1
  199. package/client/dist/assets/zh-TW-RAJ6MFWO-DoDUdkaJ.js +0 -9
  200. package/client/dist/clear-cache.html +0 -85
  201. package/client/dist/convert-icons.md +0 -53
  202. package/client/dist/favicon.png +0 -0
  203. package/client/dist/favicon.svg +0 -9
  204. package/client/dist/generate-icons.js +0 -49
  205. package/client/dist/icons/claude-ai-icon.svg +0 -1
  206. package/client/dist/icons/codex-white.svg +0 -3
  207. package/client/dist/icons/codex.svg +0 -3
  208. package/client/dist/icons/cursor-white.svg +0 -12
  209. package/client/dist/icons/cursor.svg +0 -1
  210. package/client/dist/icons/icon-128x128.png +0 -0
  211. package/client/dist/icons/icon-128x128.svg +0 -12
  212. package/client/dist/icons/icon-144x144.png +0 -0
  213. package/client/dist/icons/icon-144x144.svg +0 -12
  214. package/client/dist/icons/icon-152x152.png +0 -0
  215. package/client/dist/icons/icon-152x152.svg +0 -12
  216. package/client/dist/icons/icon-192x192.png +0 -0
  217. package/client/dist/icons/icon-192x192.svg +0 -12
  218. package/client/dist/icons/icon-384x384.png +0 -0
  219. package/client/dist/icons/icon-384x384.svg +0 -12
  220. package/client/dist/icons/icon-512x512.png +0 -0
  221. package/client/dist/icons/icon-512x512.svg +0 -12
  222. package/client/dist/icons/icon-72x72.png +0 -0
  223. package/client/dist/icons/icon-72x72.svg +0 -12
  224. package/client/dist/icons/icon-96x96.png +0 -0
  225. package/client/dist/icons/icon-96x96.svg +0 -12
  226. package/client/dist/icons/icon-template.svg +0 -12
  227. package/client/dist/index.html +0 -128
  228. package/client/dist/logo-128.png +0 -0
  229. package/client/dist/logo-256.png +0 -0
  230. package/client/dist/logo-32.png +0 -0
  231. package/client/dist/logo-512.png +0 -0
  232. package/client/dist/logo-64.png +0 -0
  233. package/client/dist/logo.svg +0 -17
  234. package/client/dist/manifest.json +0 -61
  235. package/client/dist/mcp-docs.html +0 -119
  236. package/client/dist/screenshots/cli-selection.png +0 -0
  237. package/client/dist/screenshots/desktop-main.png +0 -0
  238. package/client/dist/screenshots/mobile-chat.png +0 -0
  239. package/client/dist/screenshots/tools-modal.png +0 -0
  240. package/client/dist/sw.js +0 -19
  241. package/commands/upfynai-connect.md +0 -59
  242. package/commands/upfynai-disconnect.md +0 -31
  243. package/commands/upfynai-doctor.md +0 -99
  244. package/commands/upfynai-export.md +0 -49
  245. package/commands/upfynai-local.md +0 -82
  246. package/commands/upfynai-status.md +0 -75
  247. package/commands/upfynai-stop.md +0 -49
  248. package/commands/upfynai-uninstall.md +0 -58
  249. package/commands/upfynai.md +0 -69
  250. package/scripts/build-client.js +0 -17
  251. package/scripts/fix-node-pty.js +0 -67
  252. package/scripts/install-commands.js +0 -78
  253. package/server/claude-sdk.js +0 -714
  254. package/server/cli-ui.js +0 -785
  255. package/server/cli.js +0 -596
  256. package/server/constants/config.js +0 -31
  257. package/server/cursor-cli.js +0 -270
  258. package/server/database/auth.db +0 -0
  259. package/server/database/db.js +0 -808
  260. package/server/database/init.sql +0 -70
  261. package/server/index.js +0 -2621
  262. package/server/load-env.js +0 -26
  263. package/server/mcp-server.js +0 -621
  264. package/server/middleware/auth.js +0 -173
  265. package/server/openai-codex.js +0 -403
  266. package/server/openrouter.js +0 -137
  267. package/server/projects.js +0 -1742
  268. package/server/relay-client.js +0 -619
  269. package/server/routes/agent.js +0 -1266
  270. package/server/routes/auth.js +0 -263
  271. package/server/routes/cli-auth.js +0 -263
  272. package/server/routes/codex.js +0 -344
  273. package/server/routes/commands.js +0 -601
  274. package/server/routes/cursor.js +0 -808
  275. package/server/routes/dashboard.js +0 -52
  276. package/server/routes/git.js +0 -1165
  277. package/server/routes/mcp-utils.js +0 -48
  278. package/server/routes/mcp.js +0 -552
  279. package/server/routes/payments.js +0 -172
  280. package/server/routes/projects.js +0 -552
  281. package/server/routes/settings.js +0 -269
  282. package/server/routes/taskmaster.js +0 -1964
  283. package/server/routes/user.js +0 -106
  284. package/server/routes/voice.js +0 -198
  285. package/server/routes/webhooks.js +0 -166
  286. package/server/routes/workflows.js +0 -118
  287. package/server/services/whisperService.js +0 -84
  288. package/server/services/workflowScheduler.js +0 -186
  289. package/server/utils/commandParser.js +0 -303
  290. package/server/utils/gitConfig.js +0 -24
  291. package/server/utils/mcp-detector.js +0 -198
  292. package/server/utils/taskmaster-websocket.js +0 -129
  293. package/shared/modelConstants.js +0 -96
@@ -1,263 +0,0 @@
1
- import express from 'express';
2
- import bcrypt from 'bcryptjs';
3
- import { db, userDb, subscriptionDb, relayTokensDb, apiKeysDb } from '../database/db.js';
4
- import { generateToken, authenticateToken, setSessionCookie, clearSessionCookie } from '../middleware/auth.js';
5
-
6
- const router = express.Router();
7
-
8
- // Check auth status and setup requirements
9
- router.get('/status', async (req, res) => {
10
- try {
11
- const hasUsers = await userDb.hasUsers();
12
- res.json({
13
- needsSetup: !hasUsers,
14
- isAuthenticated: false
15
- });
16
- } catch (error) {
17
- // auth status error
18
- res.status(500).json({ error: 'Internal server error' });
19
- }
20
- });
21
-
22
- // User registration — allows multiple users (rate limited)
23
- router.post('/register', (req, res, next) => {
24
- const rl = req.app.locals.authRateLimit;
25
- if (rl) return rl(req, res, next);
26
- next();
27
- }, async (req, res) => {
28
- try {
29
- const { username, password, email, phone, firstName, lastName } = req.body;
30
-
31
- // Validate input
32
- if (!password) {
33
- return res.status(400).json({ error: 'Password is required' });
34
- }
35
- if (password.length < 8) {
36
- return res.status(400).json({ error: 'Password must be at least 8 characters' });
37
- }
38
- if (password.length > 128) {
39
- return res.status(400).json({ error: 'Password is too long' });
40
- }
41
-
42
- // Sanitize and validate name/phone inputs
43
- const fName = (firstName || '').trim().slice(0, 50);
44
- const lName = (lastName || '').trim().slice(0, 50);
45
- const displayName = username || [fName, lName].filter(Boolean).join(' ') || 'User';
46
-
47
- if (displayName.length < 2) {
48
- return res.status(400).json({ error: 'Name must be at least 2 characters' });
49
- }
50
-
51
- // Check if email is already registered
52
- if (email) {
53
- const existingUser = await userDb.getUserByUsername(email);
54
- if (existingUser) {
55
- return res.status(409).json({ error: 'An account with this email already exists. Please sign in.' });
56
- }
57
- }
58
-
59
- // Hash password
60
- const passwordHash = await bcrypt.hash(password, 12);
61
-
62
- // Create user
63
- const user = await userDb.createUser(displayName, passwordHash, email || null, phone || null, fName || null, lName || null);
64
-
65
- // Auto-create default relay token + API key for the new user
66
- let connectToken = null;
67
- try {
68
- const relayToken = await relayTokensDb.createToken(user.id, 'default');
69
- connectToken = relayToken.token;
70
- await apiKeysDb.createApiKey(user.id, 'default');
71
- } catch { /* non-critical — user can create manually later */ }
72
-
73
- // Generate token + set cookie
74
- const token = generateToken(user);
75
- setSessionCookie(res, token);
76
- await userDb.updateLastLogin(user.id);
77
-
78
- // New user — no subscription yet
79
- res.json({
80
- success: true,
81
- user: { id: user.user_code || `upc-${String(user.id).padStart(3, '0')}`, username: user.username, first_name: user.first_name, last_name: user.last_name, email: email || null, phone: phone || null, access_override: user.access_override || null, subscription: null },
82
- token, // still returned for backward compat / API clients
83
- connectToken // relay token for CLI connection
84
- });
85
-
86
- } catch (error) {
87
- // registration error
88
- if (error.message?.includes('UNIQUE')) {
89
- res.status(409).json({ error: 'An account with this name already exists. Try a different name or sign in.' });
90
- } else {
91
- res.status(500).json({ error: 'Internal server error' });
92
- }
93
- }
94
- });
95
-
96
- // User login (rate limited)
97
- router.post('/login', (req, res, next) => {
98
- const rl = req.app.locals.authRateLimit;
99
- if (rl) return rl(req, res, next);
100
- next();
101
- }, async (req, res) => {
102
- try {
103
- const { username, password, firstName, lastName, phone } = req.body;
104
-
105
- if (!username || !password) {
106
- return res.status(400).json({ error: 'Email and password are required' });
107
- }
108
-
109
- const user = await userDb.getUserByUsername(username.trim());
110
- if (!user) {
111
- return res.status(401).json({ error: 'Invalid email or password' });
112
- }
113
-
114
- const isValidPassword = await bcrypt.compare(password, user.password_hash);
115
- if (!isValidPassword) {
116
- return res.status(401).json({ error: 'Invalid email or password' });
117
- }
118
-
119
- // Update name/phone if provided and different from stored values
120
- const fName = (firstName || '').trim().slice(0, 50);
121
- const lName = (lastName || '').trim().slice(0, 50);
122
- const ph = (phone || '').trim().slice(0, 20);
123
- const updates = [];
124
- const args = [];
125
- if (fName && fName !== user.first_name) { updates.push('first_name = ?'); args.push(fName); }
126
- if (lName && lName !== user.last_name) { updates.push('last_name = ?'); args.push(lName); }
127
- if (ph && ph !== user.phone) { updates.push('phone = ?'); args.push(ph); }
128
- if (fName && lName && `${fName} ${lName}` !== user.username) {
129
- updates.push('username = ?');
130
- args.push(`${fName} ${lName}`);
131
- } else if (fName && !lName && fName !== user.username && !user.last_name) {
132
- updates.push('username = ?');
133
- args.push(fName);
134
- }
135
- if (updates.length > 0) {
136
- try {
137
- args.push(user.id);
138
- await db.execute({ sql: `UPDATE users SET ${updates.join(', ')} WHERE id = ?`, args });
139
- } catch { /* non-critical profile update */ }
140
- }
141
-
142
- // Re-fetch user to get updated fields
143
- const updatedUser = updates.length > 0 ? (await userDb.getUserById(user.id)) || user : user;
144
-
145
- // Generate token + set cookie
146
- const token = generateToken(updatedUser);
147
- setSessionCookie(res, token);
148
- await userDb.updateLastLogin(updatedUser.id);
149
-
150
- // Backfill relay token + API key if missing (for users created before auto-provisioning)
151
- try {
152
- const existingTokens = await relayTokensDb.getTokens(updatedUser.id);
153
- if (existingTokens.length === 0) {
154
- await relayTokensDb.createToken(updatedUser.id, 'default');
155
- }
156
- const existingKeys = await apiKeysDb.getApiKeys(updatedUser.id);
157
- if (existingKeys.length === 0) {
158
- await apiKeysDb.createApiKey(updatedUser.id, 'default');
159
- }
160
- } catch { /* non-critical backfill */ }
161
-
162
- // Include active subscription if any
163
- let subscription = null;
164
- try {
165
- await subscriptionDb.expireOverdue();
166
- const sub = await subscriptionDb.getActiveSub(updatedUser.id);
167
- if (sub) {
168
- subscription = { id: sub.id, planId: sub.plan_id, status: sub.status, startsAt: sub.starts_at, expiresAt: sub.expires_at };
169
- }
170
- } catch { /* non-critical */ }
171
-
172
- res.json({
173
- success: true,
174
- user: { id: updatedUser.user_code || `upc-${String(updatedUser.id).padStart(3, '0')}`, username: updatedUser.username, first_name: updatedUser.first_name, last_name: updatedUser.last_name, email: updatedUser.email, phone: updatedUser.phone, access_override: updatedUser.access_override || null, subscription },
175
- token // backward compat
176
- });
177
-
178
- } catch (error) {
179
- // login error
180
- res.status(500).json({ error: 'Internal server error' });
181
- }
182
- });
183
-
184
- // Get current user (protected route) — includes active subscription
185
- router.get('/user', authenticateToken, async (req, res) => {
186
- try {
187
- // Expire overdue subs, then fetch active
188
- await subscriptionDb.expireOverdue();
189
- const sub = await subscriptionDb.getActiveSub(req.user.id);
190
-
191
- // Map internal id → user_code for frontend, include all user details
192
- const user = {
193
- id: req.user.user_code || `upc-${String(req.user.id).padStart(3, '0')}`,
194
- username: req.user.username,
195
- first_name: req.user.first_name,
196
- last_name: req.user.last_name,
197
- email: req.user.email,
198
- phone: req.user.phone,
199
- access_override: req.user.access_override || null,
200
- created_at: req.user.created_at,
201
- };
202
-
203
- if (sub) {
204
- user.subscription = {
205
- id: sub.id,
206
- planId: sub.plan_id,
207
- status: sub.status,
208
- startsAt: sub.starts_at,
209
- expiresAt: sub.expires_at,
210
- };
211
- } else {
212
- user.subscription = null;
213
- }
214
-
215
- res.json({ user });
216
- } catch (error) {
217
- // user fetch error
218
- const u = req.user;
219
- res.json({ user: { id: u.user_code || `upc-${String(u.id).padStart(3, '0')}`, username: u.username, first_name: u.first_name, last_name: u.last_name, email: u.email, phone: u.phone } });
220
- }
221
- });
222
-
223
- // Get a fresh JWT for the current session (used by frontend to pass to iframe)
224
- router.get('/token', authenticateToken, (req, res) => {
225
- const token = generateToken(req.user);
226
- res.json({ token });
227
- });
228
-
229
- // Get user's tokens — relay token (for Connect + MCP) and API key
230
- router.get('/connect-token', authenticateToken, async (req, res) => {
231
- try {
232
- // Relay token — used for both CLI connect and MCP auth
233
- const tokens = await relayTokensDb.getTokens(req.user.id);
234
- let active = tokens.find(t => t.is_active);
235
- if (!active) {
236
- // Auto-create if none exists (backfill for existing users)
237
- active = await relayTokensDb.createToken(req.user.id, 'default');
238
- }
239
-
240
- // API key — also available if user needs it
241
- const keys = await apiKeysDb.getApiKeys(req.user.id);
242
- let activeKey = keys.find(k => k.is_active);
243
- if (!activeKey) {
244
- activeKey = await apiKeysDb.createApiKey(req.user.id, 'default');
245
- }
246
-
247
- res.json({
248
- token: active.token, // relay token — works for Connect + MCP
249
- apiKey: activeKey.api_key, // API key — alternative auth method
250
- userCode: req.user.user_code || null,
251
- });
252
- } catch (error) {
253
- res.status(500).json({ error: 'Could not fetch connect token' });
254
- }
255
- });
256
-
257
- // Logout — clear the session cookie
258
- router.post('/logout', authenticateToken, (req, res) => {
259
- clearSessionCookie(res);
260
- res.json({ success: true, message: 'Logged out successfully' });
261
- });
262
-
263
- export default router;
@@ -1,263 +0,0 @@
1
- import express from 'express';
2
- import { spawn } from 'child_process';
3
- import fs from 'fs/promises';
4
- import path from 'path';
5
- import os from 'os';
6
-
7
- const router = express.Router();
8
-
9
- router.get('/claude/status', async (req, res) => {
10
- try {
11
- const credentialsResult = await checkClaudeCredentials();
12
-
13
- if (credentialsResult.authenticated) {
14
- return res.json({
15
- authenticated: true,
16
- email: credentialsResult.email || 'Authenticated',
17
- method: 'credentials_file'
18
- });
19
- }
20
-
21
- return res.json({
22
- authenticated: false,
23
- email: null,
24
- error: credentialsResult.error || 'Not authenticated'
25
- });
26
-
27
- } catch (error) {
28
- // auth status error
29
- res.status(500).json({
30
- authenticated: false,
31
- email: null,
32
- error: 'An error occurred'
33
- });
34
- }
35
- });
36
-
37
- router.get('/cursor/status', async (req, res) => {
38
- try {
39
- const result = await checkCursorStatus();
40
-
41
- res.json({
42
- authenticated: result.authenticated,
43
- email: result.email,
44
- error: result.error
45
- });
46
-
47
- } catch (error) {
48
- // auth status error
49
- res.status(500).json({
50
- authenticated: false,
51
- email: null,
52
- error: 'An error occurred'
53
- });
54
- }
55
- });
56
-
57
- router.get('/codex/status', async (req, res) => {
58
- try {
59
- const result = await checkCodexCredentials();
60
-
61
- res.json({
62
- authenticated: result.authenticated,
63
- email: result.email,
64
- error: result.error
65
- });
66
-
67
- } catch (error) {
68
- // auth status error
69
- res.status(500).json({
70
- authenticated: false,
71
- email: null,
72
- error: 'An error occurred'
73
- });
74
- }
75
- });
76
-
77
- async function checkClaudeCredentials() {
78
- try {
79
- const credPath = path.join(os.homedir(), '.claude', '.credentials.json');
80
- const content = await fs.readFile(credPath, 'utf8');
81
- const creds = JSON.parse(content);
82
-
83
- const oauth = creds.claudeAiOauth;
84
- if (oauth && oauth.accessToken) {
85
- const isExpired = oauth.expiresAt && Date.now() >= oauth.expiresAt;
86
-
87
- if (!isExpired) {
88
- return {
89
- authenticated: true,
90
- email: creds.email || creds.user || null
91
- };
92
- }
93
- }
94
-
95
- return {
96
- authenticated: false,
97
- email: null
98
- };
99
- } catch (error) {
100
- return {
101
- authenticated: false,
102
- email: null
103
- };
104
- }
105
- }
106
-
107
- function checkCursorStatus() {
108
- return new Promise((resolve) => {
109
- let processCompleted = false;
110
-
111
- const timeout = setTimeout(() => {
112
- if (!processCompleted) {
113
- processCompleted = true;
114
- if (childProcess) {
115
- childProcess.kill();
116
- }
117
- resolve({
118
- authenticated: false,
119
- email: null,
120
- error: 'Command timeout'
121
- });
122
- }
123
- }, 5000);
124
-
125
- let childProcess;
126
- try {
127
- childProcess = spawn('cursor-agent', ['status']);
128
- } catch (err) {
129
- clearTimeout(timeout);
130
- processCompleted = true;
131
- resolve({
132
- authenticated: false,
133
- email: null,
134
- error: 'Cursor CLI not found or not installed'
135
- });
136
- return;
137
- }
138
-
139
- let stdout = '';
140
- let stderr = '';
141
-
142
- childProcess.stdout.on('data', (data) => {
143
- stdout += data.toString();
144
- });
145
-
146
- childProcess.stderr.on('data', (data) => {
147
- stderr += data.toString();
148
- });
149
-
150
- childProcess.on('close', (code) => {
151
- if (processCompleted) return;
152
- processCompleted = true;
153
- clearTimeout(timeout);
154
-
155
- if (code === 0) {
156
- const emailMatch = stdout.match(/Logged in as ([a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,})/i);
157
-
158
- if (emailMatch) {
159
- resolve({
160
- authenticated: true,
161
- email: emailMatch[1],
162
- output: stdout
163
- });
164
- } else if (stdout.includes('Logged in')) {
165
- resolve({
166
- authenticated: true,
167
- email: 'Logged in',
168
- output: stdout
169
- });
170
- } else {
171
- resolve({
172
- authenticated: false,
173
- email: null,
174
- error: 'Not logged in'
175
- });
176
- }
177
- } else {
178
- resolve({
179
- authenticated: false,
180
- email: null,
181
- error: stderr || 'Not logged in'
182
- });
183
- }
184
- });
185
-
186
- childProcess.on('error', (err) => {
187
- if (processCompleted) return;
188
- processCompleted = true;
189
- clearTimeout(timeout);
190
-
191
- resolve({
192
- authenticated: false,
193
- email: null,
194
- error: 'Cursor CLI not found or not installed'
195
- });
196
- });
197
- });
198
- }
199
-
200
- async function checkCodexCredentials() {
201
- try {
202
- const authPath = path.join(os.homedir(), '.codex', 'auth.json');
203
- const content = await fs.readFile(authPath, 'utf8');
204
- const auth = JSON.parse(content);
205
-
206
- // Tokens are nested under 'tokens' key
207
- const tokens = auth.tokens || {};
208
-
209
- // Check for valid tokens (id_token or access_token)
210
- if (tokens.id_token || tokens.access_token) {
211
- // Try to extract email from id_token JWT payload
212
- let email = 'Authenticated';
213
- if (tokens.id_token) {
214
- try {
215
- // JWT is base64url encoded: header.payload.signature
216
- const parts = tokens.id_token.split('.');
217
- if (parts.length >= 2) {
218
- // Decode the payload (second part)
219
- const payload = JSON.parse(Buffer.from(parts[1], 'base64url').toString('utf8'));
220
- email = payload.email || payload.user || 'Authenticated';
221
- }
222
- } catch {
223
- // If JWT decoding fails, use fallback
224
- email = 'Authenticated';
225
- }
226
- }
227
-
228
- return {
229
- authenticated: true,
230
- email
231
- };
232
- }
233
-
234
- // Also check for OPENAI_API_KEY as fallback auth method
235
- if (auth.OPENAI_API_KEY) {
236
- return {
237
- authenticated: true,
238
- email: 'API Key Auth'
239
- };
240
- }
241
-
242
- return {
243
- authenticated: false,
244
- email: null,
245
- error: 'No valid tokens found'
246
- };
247
- } catch (error) {
248
- if (error.code === 'ENOENT') {
249
- return {
250
- authenticated: false,
251
- email: null,
252
- error: 'Codex not configured'
253
- };
254
- }
255
- return {
256
- authenticated: false,
257
- email: null,
258
- error: 'An error occurred'
259
- };
260
- }
261
- }
262
-
263
- export default router;