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,598 +0,0 @@
1
- import express from 'express';
2
- import { promises as fs } from 'fs';
3
- import path from 'path';
4
- import { fileURLToPath } from 'url';
5
- import os from 'os';
6
- import matter from 'gray-matter';
7
- import { CLAUDE_MODELS, CURSOR_MODELS, CODEX_MODELS } from '../../shared/modelConstants.js';
8
-
9
- const __filename = fileURLToPath(import.meta.url);
10
- const __dirname = path.dirname(__filename);
11
-
12
- const router = express.Router();
13
-
14
- /**
15
- * Recursively scan directory for command files (.md)
16
- * @param {string} dir - Directory to scan
17
- * @param {string} baseDir - Base directory for relative paths
18
- * @param {string} namespace - Namespace for commands (e.g., 'project', 'user')
19
- * @returns {Promise<Array>} Array of command objects
20
- */
21
- async function scanCommandsDirectory(dir, baseDir, namespace) {
22
- const commands = [];
23
-
24
- try {
25
- // Check if directory exists
26
- await fs.access(dir);
27
-
28
- const entries = await fs.readdir(dir, { withFileTypes: true });
29
-
30
- for (const entry of entries) {
31
- const fullPath = path.join(dir, entry.name);
32
-
33
- if (entry.isDirectory()) {
34
- // Recursively scan subdirectories
35
- const subCommands = await scanCommandsDirectory(fullPath, baseDir, namespace);
36
- commands.push(...subCommands);
37
- } else if (entry.isFile() && entry.name.endsWith('.md')) {
38
- // Parse markdown file for metadata
39
- try {
40
- const content = await fs.readFile(fullPath, 'utf8');
41
- const { data: frontmatter, content: commandContent } = matter(content);
42
-
43
- // Calculate relative path from baseDir for command name
44
- const relativePath = path.relative(baseDir, fullPath);
45
- // Remove .md extension and convert to command name
46
- const commandName = '/' + relativePath.replace(/\.md$/, '').replace(/\\/g, '/');
47
-
48
- // Extract description from frontmatter or first line of content
49
- let description = frontmatter.description || '';
50
- if (!description) {
51
- const firstLine = commandContent.trim().split('\n')[0];
52
- description = firstLine.replace(/^#+\s*/, '').trim();
53
- }
54
-
55
- commands.push({
56
- name: commandName,
57
- path: fullPath,
58
- relativePath,
59
- description,
60
- namespace,
61
- metadata: frontmatter
62
- });
63
- } catch (err) {
64
- }
65
- }
66
- }
67
- } catch (err) {
68
- // Directory doesn't exist or can't be accessed - this is okay
69
- if (err.code !== 'ENOENT' && err.code !== 'EACCES') {
70
- }
71
- }
72
-
73
- return commands;
74
- }
75
-
76
- /**
77
- * Built-in commands that are always available
78
- */
79
- const builtInCommands = [
80
- {
81
- name: '/help',
82
- description: 'Show help documentation for Upfyn-Code',
83
- namespace: 'builtin',
84
- metadata: { type: 'builtin' }
85
- },
86
- {
87
- name: '/clear',
88
- description: 'Clear the conversation history',
89
- namespace: 'builtin',
90
- metadata: { type: 'builtin' }
91
- },
92
- {
93
- name: '/model',
94
- description: 'Switch or view the current AI model',
95
- namespace: 'builtin',
96
- metadata: { type: 'builtin' }
97
- },
98
- {
99
- name: '/cost',
100
- description: 'Display token usage and cost information',
101
- namespace: 'builtin',
102
- metadata: { type: 'builtin' }
103
- },
104
- {
105
- name: '/memory',
106
- description: 'Open CLAUDE.md memory file for editing',
107
- namespace: 'builtin',
108
- metadata: { type: 'builtin' }
109
- },
110
- {
111
- name: '/config',
112
- description: 'Open settings and configuration',
113
- namespace: 'builtin',
114
- metadata: { type: 'builtin' }
115
- },
116
- {
117
- name: '/status',
118
- description: 'Show system status and version information',
119
- namespace: 'builtin',
120
- metadata: { type: 'builtin' }
121
- },
122
- {
123
- name: '/rewind',
124
- description: 'Rewind the conversation to a previous state',
125
- namespace: 'builtin',
126
- metadata: { type: 'builtin' }
127
- }
128
- ];
129
-
130
- /**
131
- * Built-in command handlers
132
- * Each handler returns { type: 'builtin', action: string, data: any }
133
- */
134
- const builtInHandlers = {
135
- '/help': async (args, context) => {
136
- const helpText = `# Upfyn-Code Commands
137
-
138
- ## Built-in Commands
139
-
140
- ${builtInCommands.map(cmd => `### ${cmd.name}
141
- ${cmd.description}
142
- `).join('\n')}
143
-
144
- ## Custom Commands
145
-
146
- Custom commands can be created in:
147
- - Project: \`.claude/commands/\` (project-specific)
148
- - User: \`~/.claude/commands/\` (available in all projects)
149
-
150
- ### Command Syntax
151
-
152
- - **Arguments**: Use \`$ARGUMENTS\` for all args or \`$1\`, \`$2\`, etc. for positional
153
- - **File Includes**: Use \`@filename\` to include file contents
154
- - **Bash Commands**: Use \`!command\` to execute bash commands
155
-
156
- ### Examples
157
-
158
- \`\`\`markdown
159
- /mycommand arg1 arg2
160
- \`\`\`
161
- `;
162
-
163
- return {
164
- type: 'builtin',
165
- action: 'help',
166
- data: {
167
- content: helpText,
168
- format: 'markdown'
169
- }
170
- };
171
- },
172
-
173
- '/clear': async (args, context) => {
174
- return {
175
- type: 'builtin',
176
- action: 'clear',
177
- data: {
178
- message: 'Conversation history cleared'
179
- }
180
- };
181
- },
182
-
183
- '/model': async (args, context) => {
184
- // Read available models from centralized constants
185
- const availableModels = {
186
- claude: CLAUDE_MODELS.OPTIONS.map(o => o.value),
187
- cursor: CURSOR_MODELS.OPTIONS.map(o => o.value),
188
- codex: CODEX_MODELS.OPTIONS.map(o => o.value)
189
- };
190
-
191
- const currentProvider = context?.provider || 'claude';
192
- const currentModel = context?.model || CLAUDE_MODELS.DEFAULT;
193
-
194
- return {
195
- type: 'builtin',
196
- action: 'model',
197
- data: {
198
- current: {
199
- provider: currentProvider,
200
- model: currentModel
201
- },
202
- available: availableModels,
203
- message: args.length > 0
204
- ? `Switching to model: ${args[0]}`
205
- : `Current model: ${currentModel}`
206
- }
207
- };
208
- },
209
-
210
- '/cost': async (args, context) => {
211
- const tokenUsage = context?.tokenUsage || {};
212
- const provider = context?.provider || 'claude';
213
- const model =
214
- context?.model ||
215
- (provider === 'cursor'
216
- ? CURSOR_MODELS.DEFAULT
217
- : provider === 'codex'
218
- ? CODEX_MODELS.DEFAULT
219
- : CLAUDE_MODELS.DEFAULT);
220
-
221
- const used = Number(tokenUsage.used ?? tokenUsage.totalUsed ?? tokenUsage.total_tokens ?? 0) || 0;
222
- const total =
223
- Number(
224
- tokenUsage.total ??
225
- tokenUsage.contextWindow ??
226
- parseInt(process.env.CONTEXT_WINDOW || '160000', 10),
227
- ) || 160000;
228
- const percentage = total > 0 ? Number(((used / total) * 100).toFixed(1)) : 0;
229
-
230
- const inputTokensRaw =
231
- Number(
232
- tokenUsage.inputTokens ??
233
- tokenUsage.input ??
234
- tokenUsage.cumulativeInputTokens ??
235
- tokenUsage.promptTokens ??
236
- 0,
237
- ) || 0;
238
- const outputTokens =
239
- Number(
240
- tokenUsage.outputTokens ??
241
- tokenUsage.output ??
242
- tokenUsage.cumulativeOutputTokens ??
243
- tokenUsage.completionTokens ??
244
- 0,
245
- ) || 0;
246
- const cacheTokens =
247
- Number(
248
- tokenUsage.cacheReadTokens ??
249
- tokenUsage.cacheCreationTokens ??
250
- tokenUsage.cacheTokens ??
251
- tokenUsage.cachedTokens ??
252
- 0,
253
- ) || 0;
254
-
255
- // If we only have total used tokens, treat them as input for display/estimation.
256
- const inputTokens =
257
- inputTokensRaw > 0 || outputTokens > 0 || cacheTokens > 0 ? inputTokensRaw + cacheTokens : used;
258
-
259
- // Rough default rates by provider (USD / 1M tokens).
260
- const pricingByProvider = {
261
- claude: { input: 3, output: 15 },
262
- cursor: { input: 3, output: 15 },
263
- codex: { input: 1.5, output: 6 },
264
- };
265
- const rates = pricingByProvider[provider] || pricingByProvider.claude;
266
-
267
- const inputCost = (inputTokens / 1_000_000) * rates.input;
268
- const outputCost = (outputTokens / 1_000_000) * rates.output;
269
- const totalCost = inputCost + outputCost;
270
-
271
- return {
272
- type: 'builtin',
273
- action: 'cost',
274
- data: {
275
- tokenUsage: {
276
- used,
277
- total,
278
- percentage,
279
- },
280
- cost: {
281
- input: inputCost.toFixed(4),
282
- output: outputCost.toFixed(4),
283
- total: totalCost.toFixed(4),
284
- },
285
- model,
286
- },
287
- };
288
- },
289
-
290
- '/status': async (args, context) => {
291
- // Read version from package.json
292
- const packageJsonPath = path.join(path.dirname(__dirname), '..', 'package.json');
293
- let version = 'unknown';
294
- let packageName = 'upfynai-code';
295
-
296
- try {
297
- const packageJson = JSON.parse(await fs.readFile(packageJsonPath, 'utf8'));
298
- version = packageJson.version;
299
- packageName = packageJson.name;
300
- } catch (err) {
301
- }
302
-
303
- const uptime = process.uptime();
304
- const uptimeMinutes = Math.floor(uptime / 60);
305
- const uptimeHours = Math.floor(uptimeMinutes / 60);
306
- const uptimeFormatted = uptimeHours > 0
307
- ? `${uptimeHours}h ${uptimeMinutes % 60}m`
308
- : `${uptimeMinutes}m`;
309
-
310
- return {
311
- type: 'builtin',
312
- action: 'status',
313
- data: {
314
- version,
315
- packageName,
316
- uptime: uptimeFormatted,
317
- uptimeSeconds: Math.floor(uptime),
318
- model: context?.model || 'claude-sonnet-4.5',
319
- provider: context?.provider || 'claude',
320
- nodeVersion: process.version,
321
- platform: process.platform
322
- }
323
- };
324
- },
325
-
326
- '/memory': async (args, context) => {
327
- const projectPath = context?.projectPath;
328
-
329
- if (!projectPath) {
330
- return {
331
- type: 'builtin',
332
- action: 'memory',
333
- data: {
334
- error: 'No project selected',
335
- message: 'Please select a project to access its CLAUDE.md file'
336
- }
337
- };
338
- }
339
-
340
- const claudeMdPath = path.join(projectPath, 'CLAUDE.md');
341
-
342
- // Check if CLAUDE.md exists
343
- let exists = false;
344
- try {
345
- await fs.access(claudeMdPath);
346
- exists = true;
347
- } catch (err) {
348
- // File doesn't exist
349
- }
350
-
351
- return {
352
- type: 'builtin',
353
- action: 'memory',
354
- data: {
355
- path: claudeMdPath,
356
- exists,
357
- message: exists
358
- ? `Opening CLAUDE.md at ${claudeMdPath}`
359
- : `CLAUDE.md not found at ${claudeMdPath}. Create it to store project-specific instructions.`
360
- }
361
- };
362
- },
363
-
364
- '/config': async (args, context) => {
365
- return {
366
- type: 'builtin',
367
- action: 'config',
368
- data: {
369
- message: 'Opening settings...'
370
- }
371
- };
372
- },
373
-
374
- '/rewind': async (args, context) => {
375
- const steps = args[0] ? parseInt(args[0]) : 1;
376
-
377
- if (isNaN(steps) || steps < 1) {
378
- return {
379
- type: 'builtin',
380
- action: 'rewind',
381
- data: {
382
- error: 'Invalid steps parameter',
383
- message: 'Usage: /rewind [number] - Rewind conversation by N steps (default: 1)'
384
- }
385
- };
386
- }
387
-
388
- return {
389
- type: 'builtin',
390
- action: 'rewind',
391
- data: {
392
- steps,
393
- message: `Rewinding conversation by ${steps} step${steps > 1 ? 's' : ''}...`
394
- }
395
- };
396
- }
397
- };
398
-
399
- /**
400
- * POST /api/commands/list
401
- * List all available commands from project and user directories
402
- */
403
- router.post('/list', async (req, res) => {
404
- try {
405
- const { projectPath } = req.body;
406
- const allCommands = [...builtInCommands];
407
-
408
- // Scan project-level commands (.claude/commands/)
409
- if (projectPath) {
410
- const projectCommandsDir = path.join(projectPath, '.claude', 'commands');
411
- const projectCommands = await scanCommandsDirectory(
412
- projectCommandsDir,
413
- projectCommandsDir,
414
- 'project'
415
- );
416
- allCommands.push(...projectCommands);
417
- }
418
-
419
- // Scan user-level commands (~/.claude/commands/)
420
- const homeDir = os.homedir();
421
- const userCommandsDir = path.join(homeDir, '.claude', 'commands');
422
- const userCommands = await scanCommandsDirectory(
423
- userCommandsDir,
424
- userCommandsDir,
425
- 'user'
426
- );
427
- allCommands.push(...userCommands);
428
-
429
- // Separate built-in and custom commands
430
- const customCommands = allCommands.filter(cmd => cmd.namespace !== 'builtin');
431
-
432
- // Sort commands alphabetically by name
433
- customCommands.sort((a, b) => a.name.localeCompare(b.name));
434
-
435
- res.json({
436
- builtIn: builtInCommands,
437
- custom: customCommands,
438
- count: allCommands.length
439
- });
440
- } catch (error) {
441
- // command list error
442
- res.status(500).json({
443
- error: 'Failed to list commands',
444
- message: 'An error occurred'
445
- });
446
- }
447
- });
448
-
449
- /**
450
- * POST /api/commands/load
451
- * Load a specific command file and return its content and metadata
452
- */
453
- router.post('/load', async (req, res) => {
454
- try {
455
- const { commandPath } = req.body;
456
-
457
- if (!commandPath) {
458
- return res.status(400).json({
459
- error: 'Command path is required'
460
- });
461
- }
462
-
463
- // Security: Prevent path traversal
464
- const resolvedPath = path.resolve(commandPath);
465
- if (!resolvedPath.startsWith(path.resolve(os.homedir())) &&
466
- !resolvedPath.includes('.claude/commands')) {
467
- return res.status(403).json({
468
- error: 'Access denied',
469
- message: 'Command must be in .claude/commands directory'
470
- });
471
- }
472
-
473
- // Read and parse the command file
474
- const content = await fs.readFile(commandPath, 'utf8');
475
- const { data: metadata, content: commandContent } = matter(content);
476
-
477
- res.json({
478
- path: commandPath,
479
- metadata,
480
- content: commandContent
481
- });
482
- } catch (error) {
483
- if (error.code === 'ENOENT') {
484
- return res.status(404).json({
485
- error: 'Command not found',
486
- message: `Command file not found: ${req.body.commandPath}`
487
- });
488
- }
489
-
490
- // command load error
491
- res.status(500).json({
492
- error: 'Failed to load command',
493
- message: 'An error occurred'
494
- });
495
- }
496
- });
497
-
498
- /**
499
- * POST /api/commands/execute
500
- * Execute a command with argument replacement
501
- * This endpoint prepares the command content but doesn't execute bash commands yet
502
- * (that will be handled in the command parser utility)
503
- */
504
- router.post('/execute', async (req, res) => {
505
- try {
506
- const { commandName, commandPath, args = [], context = {} } = req.body;
507
-
508
- if (!commandName) {
509
- return res.status(400).json({
510
- error: 'Command name is required'
511
- });
512
- }
513
-
514
- // Handle built-in commands
515
- const handler = builtInHandlers[commandName];
516
- if (handler) {
517
- try {
518
- const result = await handler(args, context);
519
- return res.json({
520
- ...result,
521
- command: commandName
522
- });
523
- } catch (error) {
524
- // built-in command error
525
- return res.status(500).json({
526
- error: 'Command execution failed',
527
- message: 'An error occurred',
528
- command: commandName
529
- });
530
- }
531
- }
532
-
533
- // Handle custom commands
534
- if (!commandPath) {
535
- return res.status(400).json({
536
- error: 'Command path is required for custom commands'
537
- });
538
- }
539
-
540
- // Load command content
541
- // Security: validate commandPath is within allowed directories
542
- {
543
- const resolvedPath = path.resolve(commandPath);
544
- const userBase = path.resolve(path.join(os.homedir(), '.claude', 'commands'));
545
- const projectBase = context?.projectPath
546
- ? path.resolve(path.join(context.projectPath, '.claude', 'commands'))
547
- : null;
548
- const isUnder = (base) => {
549
- const rel = path.relative(base, resolvedPath);
550
- return rel !== '' && !rel.startsWith('..') && !path.isAbsolute(rel);
551
- };
552
- if (!(isUnder(userBase) || (projectBase && isUnder(projectBase)))) {
553
- return res.status(403).json({
554
- error: 'Access denied',
555
- message: 'Command must be in .claude/commands directory'
556
- });
557
- }
558
- }
559
- const content = await fs.readFile(commandPath, 'utf8');
560
- const { data: metadata, content: commandContent } = matter(content);
561
- // Basic argument replacement (will be enhanced in command parser utility)
562
- let processedContent = commandContent;
563
-
564
- // Replace $ARGUMENTS with all arguments joined
565
- const argsString = args.join(' ');
566
- processedContent = processedContent.replace(/\$ARGUMENTS/g, argsString);
567
-
568
- // Replace $1, $2, etc. with positional arguments
569
- args.forEach((arg, index) => {
570
- const placeholder = `$${index + 1}`;
571
- processedContent = processedContent.replace(new RegExp(`\\${placeholder}\\b`, 'g'), arg);
572
- });
573
-
574
- res.json({
575
- type: 'custom',
576
- command: commandName,
577
- content: processedContent,
578
- metadata,
579
- hasFileIncludes: processedContent.includes('@'),
580
- hasBashCommands: processedContent.includes('!')
581
- });
582
- } catch (error) {
583
- if (error.code === 'ENOENT') {
584
- return res.status(404).json({
585
- error: 'Command not found',
586
- message: `Command file not found: ${req.body.commandPath}`
587
- });
588
- }
589
-
590
- // command execution error
591
- res.status(500).json({
592
- error: 'Failed to execute command',
593
- message: 'An error occurred'
594
- });
595
- }
596
- });
597
-
598
- export default router;