upfynai-code 0.1.0 → 2.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (340) hide show
  1. package/client/dist/api-docs.html +879 -0
  2. package/client/dist/assets/AppContent-CTSHQdyq.js +513 -0
  3. package/client/dist/assets/CanvasPanel-Cig0Mo9s.js +6 -0
  4. package/client/dist/assets/CanvasPanel-q4HEqNtV.css +1 -0
  5. package/client/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  6. package/client/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  7. package/client/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  8. package/client/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  9. package/client/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  10. package/client/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  11. package/client/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  12. package/client/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  13. package/client/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  14. package/client/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  15. package/client/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  16. package/client/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  17. package/client/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  18. package/client/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  19. package/client/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  20. package/client/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  21. package/client/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  22. package/client/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  23. package/client/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  24. package/client/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  25. package/client/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  26. package/client/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  27. package/client/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  28. package/client/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  29. package/client/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  30. package/client/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  31. package/client/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  32. package/client/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  33. package/client/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  34. package/client/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  35. package/client/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  36. package/client/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  37. package/client/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  38. package/client/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  39. package/client/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  40. package/client/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  41. package/client/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  42. package/client/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  43. package/client/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  44. package/client/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  45. package/client/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  46. package/client/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  47. package/client/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  48. package/client/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  49. package/client/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  50. package/client/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  51. package/client/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  52. package/client/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  53. package/client/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  54. package/client/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  55. package/client/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  56. package/client/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  57. package/client/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  58. package/client/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  59. package/client/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  60. package/client/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  61. package/client/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  62. package/client/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  63. package/client/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  64. package/client/dist/assets/LoginModal-silya-zP.js +11 -0
  65. package/client/dist/assets/MarkdownPreview-B3c7OEj6.js +1 -0
  66. package/client/dist/assets/Onboarding-Coxo6mFA.js +1 -0
  67. package/client/dist/assets/SetupForm-BzYOsbji.js +1 -0
  68. package/client/dist/assets/Tableau10-B-NsZVaP.js +1 -0
  69. package/client/dist/assets/_commonjs-dynamic-modules-TDtrdbi3.js +1 -0
  70. package/client/dist/assets/ar-SA-G6X2FPQ2-Bmw2-hDt.js +10 -0
  71. package/client/dist/assets/arc-BMqY7_Ci.js +1 -0
  72. package/client/dist/assets/array-BKyUJesY.js +1 -0
  73. package/client/dist/assets/az-AZ-76LH7QW2-Dh1le_qs.js +1 -0
  74. package/client/dist/assets/bg-BG-XCXSNQG7-Cbav8Z9z.js +5 -0
  75. package/client/dist/assets/blockDiagram-38ab4fdb-ChHJxsXw.js +118 -0
  76. package/client/dist/assets/bn-BD-2XOGV67Q-DCNjOaWz.js +5 -0
  77. package/client/dist/assets/c4Diagram-3d4e48cf-b8Xue4Z6.js +10 -0
  78. package/client/dist/assets/ca-ES-6MX7JW3Y-Dl_vM7NS.js +8 -0
  79. package/client/dist/assets/channel-CSnvHe_M.js +1 -0
  80. package/client/dist/assets/classDiagram-70f12bd4-BheP7Ggo.js +2 -0
  81. package/client/dist/assets/classDiagram-v2-f2320105-xtym7GEZ.js +2 -0
  82. package/client/dist/assets/clone-B75abXxS.js +1 -0
  83. package/client/dist/assets/createText-2e5e7dd3-_n4jI_fO.js +5 -0
  84. package/client/dist/assets/cs-CZ-2BRQDIVT-ftsKDdz4.js +11 -0
  85. package/client/dist/assets/da-DK-5WZEPLOC-DAjdwGRO.js +5 -0
  86. package/client/dist/assets/de-DE-XR44H4JA-BJXczHGT.js +8 -0
  87. package/client/dist/assets/directory-open-01563666-DWU9wJ6I.js +1 -0
  88. package/client/dist/assets/directory-open-4ed118d0-CunoC1EB.js +1 -0
  89. package/client/dist/assets/edges-e0da2a9e-CfPZr4YM.js +4 -0
  90. package/client/dist/assets/el-GR-BZB4AONW-DW2p_uy7.js +10 -0
  91. package/client/dist/assets/erDiagram-9861fffd-CF33V-Of.js +51 -0
  92. package/client/dist/assets/es-ES-U4NZUMDT-DLOIGnrl.js +9 -0
  93. package/client/dist/assets/eu-ES-A7QVB2H4-LJXbf89m.js +11 -0
  94. package/client/dist/assets/fa-IR-HGAKTJCU-Dvx65fgW.js +8 -0
  95. package/client/dist/assets/fi-FI-Z5N7JZ37-EoL65BQh.js +6 -0
  96. package/client/dist/assets/file-open-002ab408-DIuFHtCF.js +1 -0
  97. package/client/dist/assets/file-open-7c801643-684qeFg4.js +1 -0
  98. package/client/dist/assets/file-save-3189631c-C1wFhQhH.js +1 -0
  99. package/client/dist/assets/file-save-745eba88-Bb9F9Kg7.js +1 -0
  100. package/client/dist/assets/flowDb-956e92f1-HgoXVy2H.js +10 -0
  101. package/client/dist/assets/flowDiagram-66a62f08-tffoET0H.js +4 -0
  102. package/client/dist/assets/flowDiagram-v2-96b9c2cf-Byc3JCHh.js +1 -0
  103. package/client/dist/assets/flowchart-elk-definition-4a651766-DJbI2dpv.js +139 -0
  104. package/client/dist/assets/fr-FR-RHASNOE6-DNk_jdDs.js +9 -0
  105. package/client/dist/assets/ganttDiagram-c361ad54-2XX670FU.js +257 -0
  106. package/client/dist/assets/gitGraphDiagram-72cf32ee-CcUfruAo.js +70 -0
  107. package/client/dist/assets/gl-ES-HMX3MZ6V-dxzFjZlG.js +10 -0
  108. package/client/dist/assets/graph-BSbiMSBC.js +1 -0
  109. package/client/dist/assets/he-IL-6SHJWFNN-Cogsfdt1.js +10 -0
  110. package/client/dist/assets/hi-IN-IWLTKZ5I-L6wbgi4F.js +4 -0
  111. package/client/dist/assets/hu-HU-A5ZG7DT2-DSA6ZDsH.js +7 -0
  112. package/client/dist/assets/id-ID-SAP4L64H-BK_vGGS6.js +10 -0
  113. package/client/dist/assets/image-blob-reduce.esm-BLtmMM_J.js +2 -0
  114. package/client/dist/assets/index-3862675e-Bv32HUgT.js +1 -0
  115. package/client/dist/assets/index-B8wwD_Xo.css +1 -0
  116. package/client/dist/assets/index-BPwf8Fw3.js +27 -0
  117. package/client/dist/assets/index-D1urGMYu.js +95 -0
  118. package/client/dist/assets/infoDiagram-f8f76790-w4mR4pxn.js +7 -0
  119. package/client/dist/assets/init-Gi6I4Gst.js +1 -0
  120. package/client/dist/assets/it-IT-JPQ66NNP-BLdHYMhn.js +11 -0
  121. package/client/dist/assets/ja-JP-DBVTYXUO-B_vmexl_.js +8 -0
  122. package/client/dist/assets/journeyDiagram-49397b02-D9nmO17e.js +139 -0
  123. package/client/dist/assets/kaa-6HZHGXH3-5s-3jl6F.js +1 -0
  124. package/client/dist/assets/kab-KAB-ZGHBKWFO-2QaVDuSf.js +8 -0
  125. package/client/dist/assets/kk-KZ-P5N5QNE5-CTC52Vbi.js +1 -0
  126. package/client/dist/assets/km-KH-HSX4SM5Z-DxawH8UZ.js +11 -0
  127. package/client/dist/assets/ko-KR-MTYHY66A-CmosEM8_.js +9 -0
  128. package/client/dist/assets/ku-TR-6OUDTVRD-DbiLen4y.js +9 -0
  129. package/client/dist/assets/layout-jmt3H9tA.js +1 -0
  130. package/client/dist/assets/line-JTlRayUJ.js +1 -0
  131. package/client/dist/assets/linear-DJeB5p7x.js +1 -0
  132. package/client/dist/assets/lt-LT-XHIRWOB4-CH15wrjA.js +3 -0
  133. package/client/dist/assets/lv-LV-5QDEKY6T-dhgfPuCQ.js +7 -0
  134. package/client/dist/assets/mindmap-definition-fc14e90a-BOOrexmz.js +415 -0
  135. package/client/dist/assets/mr-IN-CRQNXWMA-3Gi6iq7A.js +13 -0
  136. package/client/dist/assets/my-MM-5M5IBNSE-CpH4rdJj.js +1 -0
  137. package/client/dist/assets/nb-NO-T6EIAALU-Du6iiGql.js +10 -0
  138. package/client/dist/assets/nl-NL-IS3SIHDZ-BGvsd1MT.js +8 -0
  139. package/client/dist/assets/nn-NO-6E72VCQL-B-odvJZW.js +8 -0
  140. package/client/dist/assets/oc-FR-POXYY2M6-COC8xNjo.js +8 -0
  141. package/client/dist/assets/ordinal-Cboi1Yqb.js +1 -0
  142. package/client/dist/assets/pa-IN-N4M65BXN-CE21PUQH.js +4 -0
  143. package/client/dist/assets/path-CbwjOpE9.js +1 -0
  144. package/client/dist/assets/pdf-TYrZqVzP.js +12 -0
  145. package/client/dist/assets/pdf.worker-BA9kU3Pw.mjs +61080 -0
  146. package/client/dist/assets/percentages-BXMCSKIN-C9GT0OD3.js +199 -0
  147. package/client/dist/assets/pica-VkdyTzi8.js +2 -0
  148. package/client/dist/assets/pieDiagram-8a3498a8-Cvfh7Qr5.js +35 -0
  149. package/client/dist/assets/pl-PL-T2D74RX3-D4xFVSoT.js +9 -0
  150. package/client/dist/assets/pt-BR-5N22H2LF-CCq257gA.js +9 -0
  151. package/client/dist/assets/pt-PT-UZXXM6DQ-1l8gt5vA.js +9 -0
  152. package/client/dist/assets/quadrantDiagram-120e2f19-BA0js1aD.js +7 -0
  153. package/client/dist/assets/requirementDiagram-deff3bca-B0QNFfIn.js +52 -0
  154. package/client/dist/assets/ro-RO-JPDTUUEW-yosBW01E.js +11 -0
  155. package/client/dist/assets/roundRect-mAH3dD0p.js +1 -0
  156. package/client/dist/assets/ru-RU-B4JR7IUQ-8LkEJUix.js +9 -0
  157. package/client/dist/assets/sankeyDiagram-04a897e0-D4T9eCXn.js +8 -0
  158. package/client/dist/assets/sequenceDiagram-704730f1-CfBUTCrO.js +122 -0
  159. package/client/dist/assets/si-LK-N5RQ5JYF-D8rjbqtd.js +1 -0
  160. package/client/dist/assets/sk-SK-C5VTKIMK-Bg14sAzN.js +6 -0
  161. package/client/dist/assets/sl-SI-NN7IZMDC-CMTib6Zs.js +6 -0
  162. package/client/dist/assets/stateDiagram-587899a1-BGgvmVSZ.js +1 -0
  163. package/client/dist/assets/stateDiagram-v2-d93cdb3a-Qn3DpYuO.js +1 -0
  164. package/client/dist/assets/styles-6aaf32cf-IdVZLPrD.js +207 -0
  165. package/client/dist/assets/styles-9a916d00-BAC3L45X.js +160 -0
  166. package/client/dist/assets/styles-c10674c1-COhXxX8c.js +116 -0
  167. package/client/dist/assets/subset-shared.chunk-BWHnFai4.js +22 -0
  168. package/client/dist/assets/subset-worker.chunk-C8QUSruZ.js +1 -0
  169. package/client/dist/assets/sv-SE-XGPEYMSR-C1425rOF.js +10 -0
  170. package/client/dist/assets/svgDrawCommon-08f97a94-Cfk-fgnN.js +1 -0
  171. package/client/dist/assets/ta-IN-2NMHFXQM-BHHo1zpF.js +9 -0
  172. package/client/dist/assets/th-TH-HPSO5L25-CZVzm_WT.js +2 -0
  173. package/client/dist/assets/timeline-definition-85554ec2-VAvuJith.js +61 -0
  174. package/client/dist/assets/tr-TR-DEFEU3FU-DE1lclCq.js +7 -0
  175. package/client/dist/assets/uk-UA-QMV73CPH-D4lJZ85O.js +6 -0
  176. package/client/dist/assets/vendor-codemirror-BARtJV1V.js +16 -0
  177. package/client/dist/assets/vendor-codemirror-langs-52_y1wip.js +20 -0
  178. package/client/dist/assets/vendor-i18n-ByAl-gdx.js +1 -0
  179. package/client/dist/assets/vendor-icons-D33IkSIf.js +1 -0
  180. package/client/dist/assets/vendor-markdown-CIVH08vJ.js +298 -0
  181. package/client/dist/assets/vendor-react-CHoMc7ka.js +8 -0
  182. package/client/dist/assets/vendor-syntax-Djb62v3a.js +9 -0
  183. package/client/dist/assets/vendor-xterm-DBb3RXlu.js +66 -0
  184. package/client/dist/assets/vendor-xterm-DrlLKa8f.css +1 -0
  185. package/client/dist/assets/vi-VN-M7AON7JQ-Dgc_SShk.js +5 -0
  186. package/client/dist/assets/xychartDiagram-e933f94c-BeyVBJhb.js +7 -0
  187. package/client/dist/assets/zh-CN-LNUGB5OW-MH4Yh8in.js +10 -0
  188. package/client/dist/assets/zh-HK-E62DVLB3-D4XHehjx.js +1 -0
  189. package/client/dist/assets/zh-TW-RAJ6MFWO--efj3evj.js +9 -0
  190. package/client/dist/clear-cache.html +85 -0
  191. package/client/dist/convert-icons.md +53 -0
  192. package/client/dist/favicon.png +0 -0
  193. package/client/dist/favicon.svg +9 -0
  194. package/client/dist/generate-icons.js +49 -0
  195. package/client/dist/icons/claude-ai-icon.svg +1 -0
  196. package/client/dist/icons/codex-white.svg +3 -0
  197. package/client/dist/icons/codex.svg +3 -0
  198. package/client/dist/icons/cursor-white.svg +12 -0
  199. package/client/dist/icons/cursor.svg +1 -0
  200. package/client/dist/icons/icon-128x128.png +0 -0
  201. package/client/dist/icons/icon-128x128.svg +12 -0
  202. package/client/dist/icons/icon-144x144.png +0 -0
  203. package/client/dist/icons/icon-144x144.svg +12 -0
  204. package/client/dist/icons/icon-152x152.png +0 -0
  205. package/client/dist/icons/icon-152x152.svg +12 -0
  206. package/client/dist/icons/icon-192x192.png +0 -0
  207. package/client/dist/icons/icon-192x192.svg +12 -0
  208. package/client/dist/icons/icon-384x384.png +0 -0
  209. package/client/dist/icons/icon-384x384.svg +12 -0
  210. package/client/dist/icons/icon-512x512.png +0 -0
  211. package/client/dist/icons/icon-512x512.svg +12 -0
  212. package/client/dist/icons/icon-72x72.png +0 -0
  213. package/client/dist/icons/icon-72x72.svg +12 -0
  214. package/client/dist/icons/icon-96x96.png +0 -0
  215. package/client/dist/icons/icon-96x96.svg +12 -0
  216. package/client/dist/icons/icon-template.svg +12 -0
  217. package/client/dist/index.html +128 -0
  218. package/client/dist/logo-128.png +0 -0
  219. package/client/dist/logo-256.png +0 -0
  220. package/client/dist/logo-32.png +0 -0
  221. package/client/dist/logo-512.png +0 -0
  222. package/client/dist/logo-64.png +0 -0
  223. package/client/dist/logo.svg +17 -0
  224. package/client/dist/manifest.json +61 -0
  225. package/client/dist/mcp-docs.html +119 -0
  226. package/client/dist/screenshots/cli-selection.png +0 -0
  227. package/client/dist/screenshots/desktop-main.png +0 -0
  228. package/client/dist/screenshots/mobile-chat.png +0 -0
  229. package/client/dist/screenshots/tools-modal.png +0 -0
  230. package/client/dist/sw.js +19 -0
  231. package/commands/upfynai-connect.md +46 -0
  232. package/commands/upfynai-disconnect.md +31 -0
  233. package/commands/upfynai-doctor.md +99 -0
  234. package/commands/upfynai-export.md +49 -0
  235. package/commands/upfynai-local.md +82 -0
  236. package/commands/upfynai-status.md +75 -0
  237. package/commands/upfynai-stop.md +49 -0
  238. package/commands/upfynai-uninstall.md +58 -0
  239. package/commands/upfynai.md +50 -0
  240. package/package.json +106 -47
  241. package/scripts/build-client.js +17 -0
  242. package/scripts/fix-node-pty.js +67 -0
  243. package/scripts/install-commands.js +78 -0
  244. package/server/claude-sdk.js +714 -0
  245. package/server/cli.js +419 -0
  246. package/server/constants/config.js +5 -0
  247. package/server/cursor-cli.js +270 -0
  248. package/server/database/auth.db +0 -0
  249. package/server/database/db.js +606 -0
  250. package/server/database/init.sql +70 -0
  251. package/server/index.js +2269 -0
  252. package/server/load-env.js +26 -0
  253. package/server/mcp-server.js +620 -0
  254. package/server/middleware/auth.js +158 -0
  255. package/server/openai-codex.js +403 -0
  256. package/server/projects.js +1849 -0
  257. package/server/relay-client.js +314 -0
  258. package/server/routes/agent.js +1231 -0
  259. package/server/routes/auth.js +220 -0
  260. package/server/routes/cli-auth.js +263 -0
  261. package/server/routes/codex.js +344 -0
  262. package/server/routes/commands.js +601 -0
  263. package/server/routes/cursor.js +808 -0
  264. package/server/routes/git.js +1165 -0
  265. package/server/routes/mcp-utils.js +48 -0
  266. package/server/routes/mcp.js +552 -0
  267. package/server/routes/payments.js +172 -0
  268. package/server/routes/projects.js +549 -0
  269. package/server/routes/settings.js +178 -0
  270. package/server/routes/taskmaster.js +1964 -0
  271. package/server/routes/user.js +106 -0
  272. package/server/utils/commandParser.js +303 -0
  273. package/server/utils/gitConfig.js +24 -0
  274. package/server/utils/mcp-detector.js +198 -0
  275. package/server/utils/taskmaster-websocket.js +129 -0
  276. package/shared/modelConstants.js +67 -0
  277. package/LICENSE +0 -22
  278. package/bin/cli.js +0 -86
  279. package/dist/assets/CanvasPanel-B48gAKVY.js +0 -538
  280. package/dist/assets/CanvasPanel-B48gAKVY.js.map +0 -1
  281. package/dist/assets/CanvasPanel-BsOG3EVs.css +0 -1
  282. package/dist/assets/index-CEhTwG68.css +0 -1
  283. package/dist/assets/index-GqAGWpJI.js +0 -70
  284. package/dist/assets/index-GqAGWpJI.js.map +0 -1
  285. package/dist/index.html +0 -18
  286. package/index.html +0 -17
  287. package/src/App.tsx +0 -226
  288. package/src/components/canvas/CanvasPanel.tsx +0 -62
  289. package/src/components/canvas/layout/graph-builder.ts +0 -136
  290. package/src/components/canvas/shapes/CompactionNodeShape.tsx +0 -76
  291. package/src/components/canvas/shapes/SessionNodeShape.tsx +0 -93
  292. package/src/components/canvas/shapes/StatuslineWidgetShape.tsx +0 -125
  293. package/src/components/canvas/shapes/TextResponseNodeShape.tsx +0 -86
  294. package/src/components/canvas/shapes/ToolCallNodeShape.tsx +0 -107
  295. package/src/components/canvas/shapes/ToolResultNodeShape.tsx +0 -87
  296. package/src/components/canvas/shapes/shared-styles.ts +0 -35
  297. package/src/components/chat/ChatPanel.tsx +0 -96
  298. package/src/components/chat/InputBar.tsx +0 -81
  299. package/src/components/chat/MessageList.tsx +0 -130
  300. package/src/components/chat/PermissionDialog.tsx +0 -70
  301. package/src/components/layout/FolderSelector.tsx +0 -152
  302. package/src/components/layout/ModelSelector.tsx +0 -65
  303. package/src/components/layout/SessionManager.tsx +0 -115
  304. package/src/components/statusline/StatuslineBar.tsx +0 -114
  305. package/src/main.tsx +0 -10
  306. package/src/server/claude-session.ts +0 -156
  307. package/src/server/index.ts +0 -149
  308. package/src/services/stream-consumer.ts +0 -330
  309. package/src/statusline-core/bin/statusline.sh +0 -121
  310. package/src/statusline-core/commands/sls-config.md +0 -42
  311. package/src/statusline-core/commands/sls-doctor.md +0 -35
  312. package/src/statusline-core/commands/sls-help.md +0 -48
  313. package/src/statusline-core/commands/sls-layout.md +0 -38
  314. package/src/statusline-core/commands/sls-preview.md +0 -34
  315. package/src/statusline-core/commands/sls-theme.md +0 -40
  316. package/src/statusline-core/installer.js +0 -228
  317. package/src/statusline-core/layouts/compact.sh +0 -21
  318. package/src/statusline-core/layouts/full.sh +0 -62
  319. package/src/statusline-core/layouts/standard.sh +0 -39
  320. package/src/statusline-core/lib/core.sh +0 -389
  321. package/src/statusline-core/lib/helpers.sh +0 -81
  322. package/src/statusline-core/lib/json-parser.sh +0 -71
  323. package/src/statusline-core/themes/catppuccin.sh +0 -32
  324. package/src/statusline-core/themes/default.sh +0 -37
  325. package/src/statusline-core/themes/gruvbox.sh +0 -32
  326. package/src/statusline-core/themes/nord.sh +0 -32
  327. package/src/statusline-core/themes/tokyo-night.sh +0 -32
  328. package/src/store/canvas-store.ts +0 -50
  329. package/src/store/chat-store.ts +0 -60
  330. package/src/store/permission-store.ts +0 -29
  331. package/src/store/session-store.ts +0 -52
  332. package/src/store/statusline-store.ts +0 -160
  333. package/src/styles/global.css +0 -117
  334. package/src/themes/index.ts +0 -149
  335. package/src/types/canvas-graph.ts +0 -24
  336. package/src/types/sdk-messages.ts +0 -156
  337. package/src/types/statusline-fields.ts +0 -67
  338. package/src/vite-env.d.ts +0 -1
  339. package/tsconfig.json +0 -26
  340. package/vite.config.ts +0 -24
@@ -0,0 +1,48 @@
1
+ /**
2
+ * MCP UTILITIES API ROUTES
3
+ * ========================
4
+ *
5
+ * API endpoints for MCP server detection and configuration utilities.
6
+ * These endpoints expose centralized MCP detection functionality.
7
+ */
8
+
9
+ import express from 'express';
10
+ import { detectTaskMasterMCPServer, getAllMCPServers } from '../utils/mcp-detector.js';
11
+
12
+ const router = express.Router();
13
+
14
+ /**
15
+ * GET /api/mcp-utils/taskmaster-server
16
+ * Check if TaskMaster MCP server is configured
17
+ */
18
+ router.get('/taskmaster-server', async (req, res) => {
19
+ try {
20
+ const result = await detectTaskMasterMCPServer();
21
+ res.json(result);
22
+ } catch (error) {
23
+ // MCP detection error
24
+ res.status(500).json({
25
+ error: 'Failed to detect TaskMaster MCP server',
26
+ message: 'An error occurred'
27
+ });
28
+ }
29
+ });
30
+
31
+ /**
32
+ * GET /api/mcp-utils/all-servers
33
+ * Get all configured MCP servers
34
+ */
35
+ router.get('/all-servers', async (req, res) => {
36
+ try {
37
+ const result = await getAllMCPServers();
38
+ res.json(result);
39
+ } catch (error) {
40
+ // MCP servers detection error
41
+ res.status(500).json({
42
+ error: 'Failed to get MCP servers',
43
+ message: 'An error occurred'
44
+ });
45
+ }
46
+ });
47
+
48
+ export default router;
@@ -0,0 +1,552 @@
1
+ import express from 'express';
2
+ import { promises as fs } from 'fs';
3
+ import path from 'path';
4
+ import os from 'os';
5
+ import { fileURLToPath } from 'url';
6
+ import { dirname } from 'path';
7
+ import { spawn } from 'child_process';
8
+
9
+ const router = express.Router();
10
+ const __filename = fileURLToPath(import.meta.url);
11
+ const __dirname = dirname(__filename);
12
+
13
+ // Claude CLI command routes
14
+
15
+ // GET /api/mcp/cli/list - List MCP servers using Claude CLI
16
+ router.get('/cli/list', async (req, res) => {
17
+ try {
18
+ console.log('📋 Listing MCP servers using Claude CLI');
19
+
20
+ const { spawn } = await import('child_process');
21
+ const { promisify } = await import('util');
22
+ const exec = promisify(spawn);
23
+
24
+ const process = spawn('claude', ['mcp', 'list'], {
25
+ stdio: ['pipe', 'pipe', 'pipe']
26
+ });
27
+
28
+ let stdout = '';
29
+ let stderr = '';
30
+
31
+ process.stdout.on('data', (data) => {
32
+ stdout += data.toString();
33
+ });
34
+
35
+ process.stderr.on('data', (data) => {
36
+ stderr += data.toString();
37
+ });
38
+
39
+ process.on('close', (code) => {
40
+ if (code === 0) {
41
+ res.json({ success: true, output: stdout, servers: parseClaudeListOutput(stdout) });
42
+ } else {
43
+ // CLI error
44
+ res.status(500).json({ error: 'Claude CLI command failed', details: stderr });
45
+ }
46
+ });
47
+
48
+ process.on('error', (error) => {
49
+ // CLI run error
50
+ res.status(500).json({ error: 'Failed to run Claude CLI', details: 'An error occurred' });
51
+ });
52
+ } catch (error) {
53
+ // MCP list error
54
+ res.status(500).json({ error: 'Failed to list MCP servers', details: 'An error occurred' });
55
+ }
56
+ });
57
+
58
+ // POST /api/mcp/cli/add - Add MCP server using Claude CLI
59
+ router.post('/cli/add', async (req, res) => {
60
+ try {
61
+ const { name, type = 'stdio', command, args = [], url, headers = {}, env = {}, scope = 'user', projectPath } = req.body;
62
+
63
+ console.log(`➕ Adding MCP server using Claude CLI (${scope} scope):`, name);
64
+
65
+ const { spawn } = await import('child_process');
66
+
67
+ let cliArgs = ['mcp', 'add'];
68
+
69
+ // Add scope flag
70
+ cliArgs.push('--scope', scope);
71
+
72
+ if (type === 'http') {
73
+ cliArgs.push('--transport', 'http', name, url);
74
+ // Add headers if provided
75
+ Object.entries(headers).forEach(([key, value]) => {
76
+ cliArgs.push('--header', `${key}: ${value}`);
77
+ });
78
+ } else if (type === 'sse') {
79
+ cliArgs.push('--transport', 'sse', name, url);
80
+ // Add headers if provided
81
+ Object.entries(headers).forEach(([key, value]) => {
82
+ cliArgs.push('--header', `${key}: ${value}`);
83
+ });
84
+ } else {
85
+ // stdio (default): claude mcp add --scope user <name> <command> [args...]
86
+ cliArgs.push(name);
87
+ // Add environment variables
88
+ Object.entries(env).forEach(([key, value]) => {
89
+ cliArgs.push('-e', `${key}=${value}`);
90
+ });
91
+ cliArgs.push(command);
92
+ if (args && args.length > 0) {
93
+ cliArgs.push(...args);
94
+ }
95
+ }
96
+
97
+ console.log('🔧 Running Claude CLI command:', 'claude', cliArgs.join(' '));
98
+
99
+ // For local scope, we need to run the command in the project directory
100
+ const spawnOptions = {
101
+ stdio: ['pipe', 'pipe', 'pipe']
102
+ };
103
+
104
+ if (scope === 'local' && projectPath) {
105
+ spawnOptions.cwd = projectPath;
106
+ console.log('📁 Running in project directory:', projectPath);
107
+ }
108
+
109
+ const process = spawn('claude', cliArgs, spawnOptions);
110
+
111
+ let stdout = '';
112
+ let stderr = '';
113
+
114
+ process.stdout.on('data', (data) => {
115
+ stdout += data.toString();
116
+ });
117
+
118
+ process.stderr.on('data', (data) => {
119
+ stderr += data.toString();
120
+ });
121
+
122
+ process.on('close', (code) => {
123
+ if (code === 0) {
124
+ res.json({ success: true, output: stdout, message: `MCP server "${name}" added successfully` });
125
+ } else {
126
+ // CLI error
127
+ res.status(400).json({ error: 'Claude CLI command failed', details: stderr });
128
+ }
129
+ });
130
+
131
+ process.on('error', (error) => {
132
+ // CLI run error
133
+ res.status(500).json({ error: 'Failed to run Claude CLI', details: 'An error occurred' });
134
+ });
135
+ } catch (error) {
136
+ // MCP add error
137
+ res.status(500).json({ error: 'Failed to add MCP server', details: 'An error occurred' });
138
+ }
139
+ });
140
+
141
+ // POST /api/mcp/cli/add-json - Add MCP server using JSON format
142
+ router.post('/cli/add-json', async (req, res) => {
143
+ try {
144
+ const { name, jsonConfig, scope = 'user', projectPath } = req.body;
145
+
146
+ console.log('➕ Adding MCP server using JSON format:', name);
147
+
148
+ // Validate and parse JSON config
149
+ let parsedConfig;
150
+ try {
151
+ parsedConfig = typeof jsonConfig === 'string' ? JSON.parse(jsonConfig) : jsonConfig;
152
+ } catch (parseError) {
153
+ return res.status(400).json({
154
+ error: 'Invalid JSON configuration',
155
+ details: parseError.message
156
+ });
157
+ }
158
+
159
+ // Validate required fields
160
+ if (!parsedConfig.type) {
161
+ return res.status(400).json({
162
+ error: 'Invalid configuration',
163
+ details: 'Missing required field: type'
164
+ });
165
+ }
166
+
167
+ if (parsedConfig.type === 'stdio' && !parsedConfig.command) {
168
+ return res.status(400).json({
169
+ error: 'Invalid configuration',
170
+ details: 'stdio type requires a command field'
171
+ });
172
+ }
173
+
174
+ if ((parsedConfig.type === 'http' || parsedConfig.type === 'sse') && !parsedConfig.url) {
175
+ return res.status(400).json({
176
+ error: 'Invalid configuration',
177
+ details: `${parsedConfig.type} type requires a url field`
178
+ });
179
+ }
180
+
181
+ const { spawn } = await import('child_process');
182
+
183
+ // Build the command: claude mcp add-json --scope <scope> <name> '<json>'
184
+ const cliArgs = ['mcp', 'add-json', '--scope', scope, name];
185
+
186
+ // Add the JSON config as a properly formatted string
187
+ const jsonString = JSON.stringify(parsedConfig);
188
+ cliArgs.push(jsonString);
189
+
190
+ console.log('🔧 Running Claude CLI command:', 'claude', cliArgs[0], cliArgs[1], cliArgs[2], cliArgs[3], cliArgs[4], jsonString);
191
+
192
+ // For local scope, we need to run the command in the project directory
193
+ const spawnOptions = {
194
+ stdio: ['pipe', 'pipe', 'pipe']
195
+ };
196
+
197
+ if (scope === 'local' && projectPath) {
198
+ spawnOptions.cwd = projectPath;
199
+ console.log('📁 Running in project directory:', projectPath);
200
+ }
201
+
202
+ const process = spawn('claude', cliArgs, spawnOptions);
203
+
204
+ let stdout = '';
205
+ let stderr = '';
206
+
207
+ process.stdout.on('data', (data) => {
208
+ stdout += data.toString();
209
+ });
210
+
211
+ process.stderr.on('data', (data) => {
212
+ stderr += data.toString();
213
+ });
214
+
215
+ process.on('close', (code) => {
216
+ if (code === 0) {
217
+ res.json({ success: true, output: stdout, message: `MCP server "${name}" added successfully via JSON` });
218
+ } else {
219
+ // CLI error
220
+ res.status(400).json({ error: 'Claude CLI command failed', details: stderr });
221
+ }
222
+ });
223
+
224
+ process.on('error', (error) => {
225
+ // CLI run error
226
+ res.status(500).json({ error: 'Failed to run Claude CLI', details: 'An error occurred' });
227
+ });
228
+ } catch (error) {
229
+ // MCP JSON add error
230
+ res.status(500).json({ error: 'Failed to add MCP server', details: 'An error occurred' });
231
+ }
232
+ });
233
+
234
+ // DELETE /api/mcp/cli/remove/:name - Remove MCP server using Claude CLI
235
+ router.delete('/cli/remove/:name', async (req, res) => {
236
+ try {
237
+ const { name } = req.params;
238
+ const { scope } = req.query; // Get scope from query params
239
+
240
+ // Handle the ID format (remove scope prefix if present)
241
+ let actualName = name;
242
+ let actualScope = scope;
243
+
244
+ // If the name includes a scope prefix like "local:test", extract it
245
+ if (name.includes(':')) {
246
+ const [prefix, serverName] = name.split(':');
247
+ actualName = serverName;
248
+ actualScope = actualScope || prefix; // Use prefix as scope if not provided in query
249
+ }
250
+
251
+ console.log('🗑️ Removing MCP server using Claude CLI:', actualName, 'scope:', actualScope);
252
+
253
+ const { spawn } = await import('child_process');
254
+
255
+ // Build command args based on scope
256
+ let cliArgs = ['mcp', 'remove'];
257
+
258
+ // Add scope flag if it's local scope
259
+ if (actualScope === 'local') {
260
+ cliArgs.push('--scope', 'local');
261
+ } else if (actualScope === 'user' || !actualScope) {
262
+ // User scope is default, but we can be explicit
263
+ cliArgs.push('--scope', 'user');
264
+ }
265
+
266
+ cliArgs.push(actualName);
267
+
268
+ console.log('🔧 Running Claude CLI command:', 'claude', cliArgs.join(' '));
269
+
270
+ const process = spawn('claude', cliArgs, {
271
+ stdio: ['pipe', 'pipe', 'pipe']
272
+ });
273
+
274
+ let stdout = '';
275
+ let stderr = '';
276
+
277
+ process.stdout.on('data', (data) => {
278
+ stdout += data.toString();
279
+ });
280
+
281
+ process.stderr.on('data', (data) => {
282
+ stderr += data.toString();
283
+ });
284
+
285
+ process.on('close', (code) => {
286
+ if (code === 0) {
287
+ res.json({ success: true, output: stdout, message: `MCP server "${name}" removed successfully` });
288
+ } else {
289
+ // CLI error
290
+ res.status(400).json({ error: 'Claude CLI command failed', details: stderr });
291
+ }
292
+ });
293
+
294
+ process.on('error', (error) => {
295
+ // CLI run error
296
+ res.status(500).json({ error: 'Failed to run Claude CLI', details: 'An error occurred' });
297
+ });
298
+ } catch (error) {
299
+ // MCP remove error
300
+ res.status(500).json({ error: 'Failed to remove MCP server', details: 'An error occurred' });
301
+ }
302
+ });
303
+
304
+ // GET /api/mcp/cli/get/:name - Get MCP server details using Claude CLI
305
+ router.get('/cli/get/:name', async (req, res) => {
306
+ try {
307
+ const { name } = req.params;
308
+
309
+ // getting MCP server details
310
+
311
+ const { spawn } = await import('child_process');
312
+
313
+ const process = spawn('claude', ['mcp', 'get', name], {
314
+ stdio: ['pipe', 'pipe', 'pipe']
315
+ });
316
+
317
+ let stdout = '';
318
+ let stderr = '';
319
+
320
+ process.stdout.on('data', (data) => {
321
+ stdout += data.toString();
322
+ });
323
+
324
+ process.stderr.on('data', (data) => {
325
+ stderr += data.toString();
326
+ });
327
+
328
+ process.on('close', (code) => {
329
+ if (code === 0) {
330
+ res.json({ success: true, output: stdout, server: parseClaudeGetOutput(stdout) });
331
+ } else {
332
+ // CLI error
333
+ res.status(404).json({ error: 'Claude CLI command failed', details: stderr });
334
+ }
335
+ });
336
+
337
+ process.on('error', (error) => {
338
+ // CLI run error
339
+ res.status(500).json({ error: 'Failed to run Claude CLI', details: 'An error occurred' });
340
+ });
341
+ } catch (error) {
342
+ // MCP CLI details error
343
+ res.status(500).json({ error: 'Failed to get MCP server details', details: 'An error occurred' });
344
+ }
345
+ });
346
+
347
+ // GET /api/mcp/config/read - Read MCP servers directly from Claude config files
348
+ router.get('/config/read', async (req, res) => {
349
+ try {
350
+ console.log('📖 Reading MCP servers from Claude config files');
351
+
352
+ const homeDir = os.homedir();
353
+ const configPaths = [
354
+ path.join(homeDir, '.claude.json'),
355
+ path.join(homeDir, '.claude', 'settings.json')
356
+ ];
357
+
358
+ let configData = null;
359
+ let configPath = null;
360
+
361
+ // Try to read from either config file
362
+ for (const filepath of configPaths) {
363
+ try {
364
+ const fileContent = await fs.readFile(filepath, 'utf8');
365
+ configData = JSON.parse(fileContent);
366
+ configPath = filepath;
367
+ console.log(`✅ Found Claude config at: ${filepath}`);
368
+ break;
369
+ } catch (error) {
370
+ // File doesn't exist or is not valid JSON, try next
371
+ console.log(`ℹ️ Config not found or invalid at: ${filepath}`);
372
+ }
373
+ }
374
+
375
+ if (!configData) {
376
+ return res.json({
377
+ success: false,
378
+ message: 'No Claude configuration file found',
379
+ servers: []
380
+ });
381
+ }
382
+
383
+ // Extract MCP servers from the config
384
+ const servers = [];
385
+
386
+ // Check for user-scoped MCP servers (at root level)
387
+ if (configData.mcpServers && typeof configData.mcpServers === 'object' && Object.keys(configData.mcpServers).length > 0) {
388
+ console.log('🔍 Found user-scoped MCP servers:', Object.keys(configData.mcpServers));
389
+ for (const [name, config] of Object.entries(configData.mcpServers)) {
390
+ const server = {
391
+ id: name,
392
+ name: name,
393
+ type: 'stdio', // Default type
394
+ scope: 'user', // User scope - available across all projects
395
+ config: {},
396
+ raw: config // Include raw config for full details
397
+ };
398
+
399
+ // Determine transport type and extract config
400
+ if (config.command) {
401
+ server.type = 'stdio';
402
+ server.config.command = config.command;
403
+ server.config.args = config.args || [];
404
+ server.config.env = config.env || {};
405
+ } else if (config.url) {
406
+ server.type = config.transport || 'http';
407
+ server.config.url = config.url;
408
+ server.config.headers = config.headers || {};
409
+ }
410
+
411
+ servers.push(server);
412
+ }
413
+ }
414
+
415
+ // Check for local-scoped MCP servers (project-specific)
416
+ const currentProjectPath = process.cwd();
417
+
418
+ // Check under 'projects' key
419
+ if (configData.projects && configData.projects[currentProjectPath]) {
420
+ const projectConfig = configData.projects[currentProjectPath];
421
+ if (projectConfig.mcpServers && typeof projectConfig.mcpServers === 'object' && Object.keys(projectConfig.mcpServers).length > 0) {
422
+ console.log(`🔍 Found local-scoped MCP servers for ${currentProjectPath}:`, Object.keys(projectConfig.mcpServers));
423
+ for (const [name, config] of Object.entries(projectConfig.mcpServers)) {
424
+ const server = {
425
+ id: `local:${name}`, // Prefix with scope for uniqueness
426
+ name: name, // Keep original name
427
+ type: 'stdio', // Default type
428
+ scope: 'local', // Local scope - only for this project
429
+ projectPath: currentProjectPath,
430
+ config: {},
431
+ raw: config // Include raw config for full details
432
+ };
433
+
434
+ // Determine transport type and extract config
435
+ if (config.command) {
436
+ server.type = 'stdio';
437
+ server.config.command = config.command;
438
+ server.config.args = config.args || [];
439
+ server.config.env = config.env || {};
440
+ } else if (config.url) {
441
+ server.type = config.transport || 'http';
442
+ server.config.url = config.url;
443
+ server.config.headers = config.headers || {};
444
+ }
445
+
446
+ servers.push(server);
447
+ }
448
+ }
449
+ }
450
+
451
+ console.log(`📋 Found ${servers.length} MCP servers in config`);
452
+
453
+ res.json({
454
+ success: true,
455
+ configPath: configPath,
456
+ servers: servers
457
+ });
458
+ } catch (error) {
459
+ console.error('Error reading Claude config:', error);
460
+ res.status(500).json({
461
+ error: 'Failed to read Claude configuration',
462
+ details: 'An error occurred'
463
+ });
464
+ }
465
+ });
466
+
467
+ // Helper functions to parse Claude CLI output
468
+ function parseClaudeListOutput(output) {
469
+ const servers = [];
470
+ const lines = output.split('\n').filter(line => line.trim());
471
+
472
+ for (const line of lines) {
473
+ // Skip the header line
474
+ if (line.includes('Checking MCP server health')) continue;
475
+
476
+ // Parse lines like "test: test test - ✗ Failed to connect"
477
+ // or "server-name: command or description - ✓ Connected"
478
+ if (line.includes(':')) {
479
+ const colonIndex = line.indexOf(':');
480
+ const name = line.substring(0, colonIndex).trim();
481
+
482
+ // Skip empty names
483
+ if (!name) continue;
484
+
485
+ // Extract the rest after the name
486
+ const rest = line.substring(colonIndex + 1).trim();
487
+
488
+ // Try to extract description and status
489
+ let description = rest;
490
+ let status = 'unknown';
491
+ let type = 'stdio'; // default type
492
+
493
+ // Check for status indicators
494
+ if (rest.includes('✓') || rest.includes('✗')) {
495
+ const statusMatch = rest.match(/(.*?)\s*-\s*([✓✗].*)$/);
496
+ if (statusMatch) {
497
+ description = statusMatch[1].trim();
498
+ status = statusMatch[2].includes('✓') ? 'connected' : 'failed';
499
+ }
500
+ }
501
+
502
+ // Try to determine type from description
503
+ if (description.startsWith('http://') || description.startsWith('https://')) {
504
+ type = 'http';
505
+ }
506
+
507
+ servers.push({
508
+ name,
509
+ type,
510
+ status: status || 'active',
511
+ description
512
+ });
513
+ }
514
+ }
515
+
516
+ console.log('🔍 Parsed Claude CLI servers:', servers);
517
+ return servers;
518
+ }
519
+
520
+ function parseClaudeGetOutput(output) {
521
+ // Parse the output from 'claude mcp get <name>' command
522
+ // This is a simple parser - might need adjustment based on actual output format
523
+ try {
524
+ // Try to extract JSON if present
525
+ const jsonMatch = output.match(/\{[\s\S]*\}/);
526
+ if (jsonMatch) {
527
+ return JSON.parse(jsonMatch[0]);
528
+ }
529
+
530
+ // Otherwise, parse as text
531
+ const server = { raw_output: output };
532
+ const lines = output.split('\n');
533
+
534
+ for (const line of lines) {
535
+ if (line.includes('Name:')) {
536
+ server.name = line.split(':')[1]?.trim();
537
+ } else if (line.includes('Type:')) {
538
+ server.type = line.split(':')[1]?.trim();
539
+ } else if (line.includes('Command:')) {
540
+ server.command = line.split(':')[1]?.trim();
541
+ } else if (line.includes('URL:')) {
542
+ server.url = line.split(':')[1]?.trim();
543
+ }
544
+ }
545
+
546
+ return server;
547
+ } catch (error) {
548
+ return { raw_output: output, parse_error: error.message };
549
+ }
550
+ }
551
+
552
+ export default router;