upfynai-code 2.6.0 → 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 (295) hide show
  1. package/README.md +123 -88
  2. package/bin/cli.js +63 -0
  3. package/package.json +48 -106
  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 -822
  260. package/server/database/init.sql +0 -70
  261. package/server/index.js +0 -2738
  262. package/server/load-env.js +0 -26
  263. package/server/mcp-server.js +0 -621
  264. package/server/middleware/auth.js +0 -181
  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 -672
  269. package/server/routes/agent.js +0 -1226
  270. package/server/routes/auth.js +0 -266
  271. package/server/routes/cli-auth.js +0 -263
  272. package/server/routes/codex.js +0 -344
  273. package/server/routes/commands.js +0 -598
  274. package/server/routes/cursor.js +0 -807
  275. package/server/routes/dashboard.js +0 -205
  276. package/server/routes/git.js +0 -1151
  277. package/server/routes/mcp-utils.js +0 -48
  278. package/server/routes/mcp.js +0 -535
  279. package/server/routes/payments.js +0 -172
  280. package/server/routes/projects.js +0 -552
  281. package/server/routes/settings.js +0 -261
  282. package/server/routes/taskmaster.js +0 -1928
  283. package/server/routes/user.js +0 -106
  284. package/server/routes/vapi-chat.js +0 -94
  285. package/server/routes/voice.js +0 -194
  286. package/server/routes/webhooks.js +0 -166
  287. package/server/routes/workflows.js +0 -118
  288. package/server/sandbox.js +0 -120
  289. package/server/services/whisperService.js +0 -84
  290. package/server/services/workflowScheduler.js +0 -186
  291. package/server/utils/commandParser.js +0 -303
  292. package/server/utils/gitConfig.js +0 -24
  293. package/server/utils/mcp-detector.js +0 -198
  294. package/server/utils/taskmaster-websocket.js +0 -129
  295. package/shared/modelConstants.js +0 -96
@@ -1,266 +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 } = req.body;
104
-
105
- if (!username || !password) {
106
- return res.status(400).json({ error: 'Identifier 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 credentials' });
112
- }
113
-
114
- const isValidPassword = await bcrypt.compare(password, user.password_hash);
115
- if (!isValidPassword) {
116
- return res.status(401).json({ error: 'Invalid credentials' });
117
- }
118
-
119
- const updatedUser = user;
120
-
121
- // Generate token + set cookie
122
- const token = generateToken(updatedUser);
123
- setSessionCookie(res, token);
124
- await userDb.updateLastLogin(updatedUser.id);
125
-
126
- // Backfill relay token + API key if missing (for users created before auto-provisioning)
127
- try {
128
- const existingTokens = await relayTokensDb.getTokens(updatedUser.id);
129
- if (existingTokens.length === 0) {
130
- await relayTokensDb.createToken(updatedUser.id, 'default');
131
- }
132
- const existingKeys = await apiKeysDb.getApiKeys(updatedUser.id);
133
- if (existingKeys.length === 0) {
134
- await apiKeysDb.createApiKey(updatedUser.id, 'default');
135
- }
136
- } catch { /* non-critical backfill */ }
137
-
138
- // Include active subscription if any
139
- let subscription = null;
140
- try {
141
- await subscriptionDb.expireOverdue();
142
- const sub = await subscriptionDb.getActiveSub(updatedUser.id);
143
- if (sub) {
144
- subscription = { id: sub.id, planId: sub.plan_id, status: sub.status, startsAt: sub.starts_at, expiresAt: sub.expires_at };
145
- }
146
- } catch { /* non-critical */ }
147
-
148
- res.json({
149
- success: true,
150
- 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 },
151
- token // backward compat
152
- });
153
-
154
- } catch (error) {
155
- // login error
156
- res.status(500).json({ error: 'Internal server error' });
157
- }
158
- });
159
-
160
- // Get current user (protected route) — includes active subscription
161
- router.get('/user', authenticateToken, async (req, res) => {
162
- try {
163
- // Expire overdue subs, then fetch active
164
- await subscriptionDb.expireOverdue();
165
- const sub = await subscriptionDb.getActiveSub(req.user.id);
166
-
167
- // Map internal id → user_code for frontend, include all user details
168
- const user = {
169
- id: req.user.user_code || `upc-${String(req.user.id).padStart(3, '0')}`,
170
- username: req.user.username,
171
- first_name: req.user.first_name,
172
- last_name: req.user.last_name,
173
- email: req.user.email,
174
- phone: req.user.phone,
175
- access_override: req.user.access_override || null,
176
- created_at: req.user.created_at,
177
- };
178
-
179
- if (sub) {
180
- user.subscription = {
181
- id: sub.id,
182
- planId: sub.plan_id,
183
- status: sub.status,
184
- startsAt: sub.starts_at,
185
- expiresAt: sub.expires_at,
186
- };
187
- } else {
188
- user.subscription = null;
189
- }
190
-
191
- res.json({ user });
192
- } catch (error) {
193
- // user fetch error
194
- const u = req.user;
195
- 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 } });
196
- }
197
- });
198
-
199
- // Get a fresh JWT for the current session (used by frontend to pass to iframe)
200
- router.get('/token', authenticateToken, (req, res) => {
201
- const token = generateToken(req.user);
202
- res.json({ token });
203
- });
204
-
205
- // Get user's tokens — relay token (for Connect + MCP) and API key
206
- router.get('/connect-token', authenticateToken, async (req, res) => {
207
- try {
208
- // Relay token — used for both CLI connect and MCP auth
209
- const tokens = await relayTokensDb.getTokens(req.user.id);
210
- let active = tokens.find(t => t.is_active);
211
- if (!active) {
212
- // Auto-create if none exists (backfill for existing users)
213
- active = await relayTokensDb.createToken(req.user.id, 'default');
214
- }
215
-
216
- // API key — also available if user needs it
217
- const keys = await apiKeysDb.getApiKeys(req.user.id);
218
- let activeKey = keys.find(k => k.is_active);
219
- if (!activeKey) {
220
- activeKey = await apiKeysDb.createApiKey(req.user.id, 'default');
221
- }
222
-
223
- res.json({
224
- token: active.token, // relay token — works for Connect + MCP
225
- apiKey: activeKey.api_key, // API key — alternative auth method
226
- userCode: req.user.user_code || null,
227
- });
228
- } catch (error) {
229
- res.status(500).json({ error: 'Could not fetch connect token' });
230
- }
231
- });
232
-
233
- // Update profile — phone only (email and other sensitive fields are read-only)
234
- router.patch('/profile', authenticateToken, async (req, res) => {
235
- try {
236
- const userId = req.user.id;
237
- const { phone } = req.body;
238
-
239
- if (phone === undefined) {
240
- return res.status(400).json({ error: 'No fields to update' });
241
- }
242
-
243
- const trimmed = (phone || '').trim().slice(0, 20);
244
- if (trimmed && !/^[+]?[\d\s()-]{7,20}$/.test(trimmed)) {
245
- return res.status(400).json({ error: 'Invalid phone format' });
246
- }
247
-
248
- await db.execute({ sql: 'UPDATE users SET phone = ? WHERE id = ?', args: [trimmed || null, userId] });
249
-
250
- const updated = await userDb.getUserById(userId);
251
- res.json({
252
- success: true,
253
- user: { phone: updated?.phone || null }
254
- });
255
- } catch (error) {
256
- res.status(500).json({ error: 'Failed to update profile' });
257
- }
258
- });
259
-
260
- // Logout — clear the session cookie
261
- router.post('/logout', authenticateToken, (req, res) => {
262
- clearSessionCookie(res);
263
- res.json({ success: true, message: 'Logged out successfully' });
264
- });
265
-
266
- 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;