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.
- package/client/dist/api-docs.html +879 -0
- package/client/dist/assets/AppContent-CTSHQdyq.js +513 -0
- package/client/dist/assets/CanvasPanel-Cig0Mo9s.js +6 -0
- package/client/dist/assets/CanvasPanel-q4HEqNtV.css +1 -0
- package/client/dist/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/client/dist/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/client/dist/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/client/dist/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/client/dist/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/client/dist/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/client/dist/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/client/dist/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/client/dist/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/client/dist/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/client/dist/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/client/dist/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/client/dist/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/client/dist/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/client/dist/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/client/dist/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/client/dist/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/client/dist/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/client/dist/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/client/dist/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/client/dist/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/client/dist/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/client/dist/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/client/dist/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/client/dist/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/client/dist/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/client/dist/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/client/dist/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/client/dist/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/client/dist/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/client/dist/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/client/dist/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/client/dist/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/client/dist/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/client/dist/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/client/dist/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/client/dist/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/client/dist/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/client/dist/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/client/dist/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/client/dist/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/client/dist/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/client/dist/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/client/dist/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/client/dist/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/client/dist/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/client/dist/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/client/dist/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/client/dist/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/client/dist/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/client/dist/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/client/dist/assets/LoginModal-silya-zP.js +11 -0
- package/client/dist/assets/MarkdownPreview-B3c7OEj6.js +1 -0
- package/client/dist/assets/Onboarding-Coxo6mFA.js +1 -0
- package/client/dist/assets/SetupForm-BzYOsbji.js +1 -0
- package/client/dist/assets/Tableau10-B-NsZVaP.js +1 -0
- package/client/dist/assets/_commonjs-dynamic-modules-TDtrdbi3.js +1 -0
- package/client/dist/assets/ar-SA-G6X2FPQ2-Bmw2-hDt.js +10 -0
- package/client/dist/assets/arc-BMqY7_Ci.js +1 -0
- package/client/dist/assets/array-BKyUJesY.js +1 -0
- package/client/dist/assets/az-AZ-76LH7QW2-Dh1le_qs.js +1 -0
- package/client/dist/assets/bg-BG-XCXSNQG7-Cbav8Z9z.js +5 -0
- package/client/dist/assets/blockDiagram-38ab4fdb-ChHJxsXw.js +118 -0
- package/client/dist/assets/bn-BD-2XOGV67Q-DCNjOaWz.js +5 -0
- package/client/dist/assets/c4Diagram-3d4e48cf-b8Xue4Z6.js +10 -0
- package/client/dist/assets/ca-ES-6MX7JW3Y-Dl_vM7NS.js +8 -0
- package/client/dist/assets/channel-CSnvHe_M.js +1 -0
- package/client/dist/assets/classDiagram-70f12bd4-BheP7Ggo.js +2 -0
- package/client/dist/assets/classDiagram-v2-f2320105-xtym7GEZ.js +2 -0
- package/client/dist/assets/clone-B75abXxS.js +1 -0
- package/client/dist/assets/createText-2e5e7dd3-_n4jI_fO.js +5 -0
- package/client/dist/assets/cs-CZ-2BRQDIVT-ftsKDdz4.js +11 -0
- package/client/dist/assets/da-DK-5WZEPLOC-DAjdwGRO.js +5 -0
- package/client/dist/assets/de-DE-XR44H4JA-BJXczHGT.js +8 -0
- package/client/dist/assets/directory-open-01563666-DWU9wJ6I.js +1 -0
- package/client/dist/assets/directory-open-4ed118d0-CunoC1EB.js +1 -0
- package/client/dist/assets/edges-e0da2a9e-CfPZr4YM.js +4 -0
- package/client/dist/assets/el-GR-BZB4AONW-DW2p_uy7.js +10 -0
- package/client/dist/assets/erDiagram-9861fffd-CF33V-Of.js +51 -0
- package/client/dist/assets/es-ES-U4NZUMDT-DLOIGnrl.js +9 -0
- package/client/dist/assets/eu-ES-A7QVB2H4-LJXbf89m.js +11 -0
- package/client/dist/assets/fa-IR-HGAKTJCU-Dvx65fgW.js +8 -0
- package/client/dist/assets/fi-FI-Z5N7JZ37-EoL65BQh.js +6 -0
- package/client/dist/assets/file-open-002ab408-DIuFHtCF.js +1 -0
- package/client/dist/assets/file-open-7c801643-684qeFg4.js +1 -0
- package/client/dist/assets/file-save-3189631c-C1wFhQhH.js +1 -0
- package/client/dist/assets/file-save-745eba88-Bb9F9Kg7.js +1 -0
- package/client/dist/assets/flowDb-956e92f1-HgoXVy2H.js +10 -0
- package/client/dist/assets/flowDiagram-66a62f08-tffoET0H.js +4 -0
- package/client/dist/assets/flowDiagram-v2-96b9c2cf-Byc3JCHh.js +1 -0
- package/client/dist/assets/flowchart-elk-definition-4a651766-DJbI2dpv.js +139 -0
- package/client/dist/assets/fr-FR-RHASNOE6-DNk_jdDs.js +9 -0
- package/client/dist/assets/ganttDiagram-c361ad54-2XX670FU.js +257 -0
- package/client/dist/assets/gitGraphDiagram-72cf32ee-CcUfruAo.js +70 -0
- package/client/dist/assets/gl-ES-HMX3MZ6V-dxzFjZlG.js +10 -0
- package/client/dist/assets/graph-BSbiMSBC.js +1 -0
- package/client/dist/assets/he-IL-6SHJWFNN-Cogsfdt1.js +10 -0
- package/client/dist/assets/hi-IN-IWLTKZ5I-L6wbgi4F.js +4 -0
- package/client/dist/assets/hu-HU-A5ZG7DT2-DSA6ZDsH.js +7 -0
- package/client/dist/assets/id-ID-SAP4L64H-BK_vGGS6.js +10 -0
- package/client/dist/assets/image-blob-reduce.esm-BLtmMM_J.js +2 -0
- package/client/dist/assets/index-3862675e-Bv32HUgT.js +1 -0
- package/client/dist/assets/index-B8wwD_Xo.css +1 -0
- package/client/dist/assets/index-BPwf8Fw3.js +27 -0
- package/client/dist/assets/index-D1urGMYu.js +95 -0
- package/client/dist/assets/infoDiagram-f8f76790-w4mR4pxn.js +7 -0
- package/client/dist/assets/init-Gi6I4Gst.js +1 -0
- package/client/dist/assets/it-IT-JPQ66NNP-BLdHYMhn.js +11 -0
- package/client/dist/assets/ja-JP-DBVTYXUO-B_vmexl_.js +8 -0
- package/client/dist/assets/journeyDiagram-49397b02-D9nmO17e.js +139 -0
- package/client/dist/assets/kaa-6HZHGXH3-5s-3jl6F.js +1 -0
- package/client/dist/assets/kab-KAB-ZGHBKWFO-2QaVDuSf.js +8 -0
- package/client/dist/assets/kk-KZ-P5N5QNE5-CTC52Vbi.js +1 -0
- package/client/dist/assets/km-KH-HSX4SM5Z-DxawH8UZ.js +11 -0
- package/client/dist/assets/ko-KR-MTYHY66A-CmosEM8_.js +9 -0
- package/client/dist/assets/ku-TR-6OUDTVRD-DbiLen4y.js +9 -0
- package/client/dist/assets/layout-jmt3H9tA.js +1 -0
- package/client/dist/assets/line-JTlRayUJ.js +1 -0
- package/client/dist/assets/linear-DJeB5p7x.js +1 -0
- package/client/dist/assets/lt-LT-XHIRWOB4-CH15wrjA.js +3 -0
- package/client/dist/assets/lv-LV-5QDEKY6T-dhgfPuCQ.js +7 -0
- package/client/dist/assets/mindmap-definition-fc14e90a-BOOrexmz.js +415 -0
- package/client/dist/assets/mr-IN-CRQNXWMA-3Gi6iq7A.js +13 -0
- package/client/dist/assets/my-MM-5M5IBNSE-CpH4rdJj.js +1 -0
- package/client/dist/assets/nb-NO-T6EIAALU-Du6iiGql.js +10 -0
- package/client/dist/assets/nl-NL-IS3SIHDZ-BGvsd1MT.js +8 -0
- package/client/dist/assets/nn-NO-6E72VCQL-B-odvJZW.js +8 -0
- package/client/dist/assets/oc-FR-POXYY2M6-COC8xNjo.js +8 -0
- package/client/dist/assets/ordinal-Cboi1Yqb.js +1 -0
- package/client/dist/assets/pa-IN-N4M65BXN-CE21PUQH.js +4 -0
- package/client/dist/assets/path-CbwjOpE9.js +1 -0
- package/client/dist/assets/pdf-TYrZqVzP.js +12 -0
- package/client/dist/assets/pdf.worker-BA9kU3Pw.mjs +61080 -0
- package/client/dist/assets/percentages-BXMCSKIN-C9GT0OD3.js +199 -0
- package/client/dist/assets/pica-VkdyTzi8.js +2 -0
- package/client/dist/assets/pieDiagram-8a3498a8-Cvfh7Qr5.js +35 -0
- package/client/dist/assets/pl-PL-T2D74RX3-D4xFVSoT.js +9 -0
- package/client/dist/assets/pt-BR-5N22H2LF-CCq257gA.js +9 -0
- package/client/dist/assets/pt-PT-UZXXM6DQ-1l8gt5vA.js +9 -0
- package/client/dist/assets/quadrantDiagram-120e2f19-BA0js1aD.js +7 -0
- package/client/dist/assets/requirementDiagram-deff3bca-B0QNFfIn.js +52 -0
- package/client/dist/assets/ro-RO-JPDTUUEW-yosBW01E.js +11 -0
- package/client/dist/assets/roundRect-mAH3dD0p.js +1 -0
- package/client/dist/assets/ru-RU-B4JR7IUQ-8LkEJUix.js +9 -0
- package/client/dist/assets/sankeyDiagram-04a897e0-D4T9eCXn.js +8 -0
- package/client/dist/assets/sequenceDiagram-704730f1-CfBUTCrO.js +122 -0
- package/client/dist/assets/si-LK-N5RQ5JYF-D8rjbqtd.js +1 -0
- package/client/dist/assets/sk-SK-C5VTKIMK-Bg14sAzN.js +6 -0
- package/client/dist/assets/sl-SI-NN7IZMDC-CMTib6Zs.js +6 -0
- package/client/dist/assets/stateDiagram-587899a1-BGgvmVSZ.js +1 -0
- package/client/dist/assets/stateDiagram-v2-d93cdb3a-Qn3DpYuO.js +1 -0
- package/client/dist/assets/styles-6aaf32cf-IdVZLPrD.js +207 -0
- package/client/dist/assets/styles-9a916d00-BAC3L45X.js +160 -0
- package/client/dist/assets/styles-c10674c1-COhXxX8c.js +116 -0
- package/client/dist/assets/subset-shared.chunk-BWHnFai4.js +22 -0
- package/client/dist/assets/subset-worker.chunk-C8QUSruZ.js +1 -0
- package/client/dist/assets/sv-SE-XGPEYMSR-C1425rOF.js +10 -0
- package/client/dist/assets/svgDrawCommon-08f97a94-Cfk-fgnN.js +1 -0
- package/client/dist/assets/ta-IN-2NMHFXQM-BHHo1zpF.js +9 -0
- package/client/dist/assets/th-TH-HPSO5L25-CZVzm_WT.js +2 -0
- package/client/dist/assets/timeline-definition-85554ec2-VAvuJith.js +61 -0
- package/client/dist/assets/tr-TR-DEFEU3FU-DE1lclCq.js +7 -0
- package/client/dist/assets/uk-UA-QMV73CPH-D4lJZ85O.js +6 -0
- package/client/dist/assets/vendor-codemirror-BARtJV1V.js +16 -0
- package/client/dist/assets/vendor-codemirror-langs-52_y1wip.js +20 -0
- package/client/dist/assets/vendor-i18n-ByAl-gdx.js +1 -0
- package/client/dist/assets/vendor-icons-D33IkSIf.js +1 -0
- package/client/dist/assets/vendor-markdown-CIVH08vJ.js +298 -0
- package/client/dist/assets/vendor-react-CHoMc7ka.js +8 -0
- package/client/dist/assets/vendor-syntax-Djb62v3a.js +9 -0
- package/client/dist/assets/vendor-xterm-DBb3RXlu.js +66 -0
- package/client/dist/assets/vendor-xterm-DrlLKa8f.css +1 -0
- package/client/dist/assets/vi-VN-M7AON7JQ-Dgc_SShk.js +5 -0
- package/client/dist/assets/xychartDiagram-e933f94c-BeyVBJhb.js +7 -0
- package/client/dist/assets/zh-CN-LNUGB5OW-MH4Yh8in.js +10 -0
- package/client/dist/assets/zh-HK-E62DVLB3-D4XHehjx.js +1 -0
- package/client/dist/assets/zh-TW-RAJ6MFWO--efj3evj.js +9 -0
- package/client/dist/clear-cache.html +85 -0
- package/client/dist/convert-icons.md +53 -0
- package/client/dist/favicon.png +0 -0
- package/client/dist/favicon.svg +9 -0
- package/client/dist/generate-icons.js +49 -0
- package/client/dist/icons/claude-ai-icon.svg +1 -0
- package/client/dist/icons/codex-white.svg +3 -0
- package/client/dist/icons/codex.svg +3 -0
- package/client/dist/icons/cursor-white.svg +12 -0
- package/client/dist/icons/cursor.svg +1 -0
- package/client/dist/icons/icon-128x128.png +0 -0
- package/client/dist/icons/icon-128x128.svg +12 -0
- package/client/dist/icons/icon-144x144.png +0 -0
- package/client/dist/icons/icon-144x144.svg +12 -0
- package/client/dist/icons/icon-152x152.png +0 -0
- package/client/dist/icons/icon-152x152.svg +12 -0
- package/client/dist/icons/icon-192x192.png +0 -0
- package/client/dist/icons/icon-192x192.svg +12 -0
- package/client/dist/icons/icon-384x384.png +0 -0
- package/client/dist/icons/icon-384x384.svg +12 -0
- package/client/dist/icons/icon-512x512.png +0 -0
- package/client/dist/icons/icon-512x512.svg +12 -0
- package/client/dist/icons/icon-72x72.png +0 -0
- package/client/dist/icons/icon-72x72.svg +12 -0
- package/client/dist/icons/icon-96x96.png +0 -0
- package/client/dist/icons/icon-96x96.svg +12 -0
- package/client/dist/icons/icon-template.svg +12 -0
- package/client/dist/index.html +128 -0
- package/client/dist/logo-128.png +0 -0
- package/client/dist/logo-256.png +0 -0
- package/client/dist/logo-32.png +0 -0
- package/client/dist/logo-512.png +0 -0
- package/client/dist/logo-64.png +0 -0
- package/client/dist/logo.svg +17 -0
- package/client/dist/manifest.json +61 -0
- package/client/dist/mcp-docs.html +119 -0
- package/client/dist/screenshots/cli-selection.png +0 -0
- package/client/dist/screenshots/desktop-main.png +0 -0
- package/client/dist/screenshots/mobile-chat.png +0 -0
- package/client/dist/screenshots/tools-modal.png +0 -0
- package/client/dist/sw.js +19 -0
- package/commands/upfynai-connect.md +46 -0
- package/commands/upfynai-disconnect.md +31 -0
- package/commands/upfynai-doctor.md +99 -0
- package/commands/upfynai-export.md +49 -0
- package/commands/upfynai-local.md +82 -0
- package/commands/upfynai-status.md +75 -0
- package/commands/upfynai-stop.md +49 -0
- package/commands/upfynai-uninstall.md +58 -0
- package/commands/upfynai.md +50 -0
- package/package.json +106 -47
- package/scripts/build-client.js +17 -0
- package/scripts/fix-node-pty.js +67 -0
- package/scripts/install-commands.js +78 -0
- package/server/claude-sdk.js +714 -0
- package/server/cli.js +419 -0
- package/server/constants/config.js +5 -0
- package/server/cursor-cli.js +270 -0
- package/server/database/auth.db +0 -0
- package/server/database/db.js +606 -0
- package/server/database/init.sql +70 -0
- package/server/index.js +2269 -0
- package/server/load-env.js +26 -0
- package/server/mcp-server.js +620 -0
- package/server/middleware/auth.js +158 -0
- package/server/openai-codex.js +403 -0
- package/server/projects.js +1849 -0
- package/server/relay-client.js +314 -0
- package/server/routes/agent.js +1231 -0
- package/server/routes/auth.js +220 -0
- package/server/routes/cli-auth.js +263 -0
- package/server/routes/codex.js +344 -0
- package/server/routes/commands.js +601 -0
- package/server/routes/cursor.js +808 -0
- package/server/routes/git.js +1165 -0
- package/server/routes/mcp-utils.js +48 -0
- package/server/routes/mcp.js +552 -0
- package/server/routes/payments.js +172 -0
- package/server/routes/projects.js +549 -0
- package/server/routes/settings.js +178 -0
- package/server/routes/taskmaster.js +1964 -0
- package/server/routes/user.js +106 -0
- package/server/utils/commandParser.js +303 -0
- package/server/utils/gitConfig.js +24 -0
- package/server/utils/mcp-detector.js +198 -0
- package/server/utils/taskmaster-websocket.js +129 -0
- package/shared/modelConstants.js +67 -0
- package/LICENSE +0 -22
- package/bin/cli.js +0 -86
- package/dist/assets/CanvasPanel-B48gAKVY.js +0 -538
- package/dist/assets/CanvasPanel-B48gAKVY.js.map +0 -1
- package/dist/assets/CanvasPanel-BsOG3EVs.css +0 -1
- package/dist/assets/index-CEhTwG68.css +0 -1
- package/dist/assets/index-GqAGWpJI.js +0 -70
- package/dist/assets/index-GqAGWpJI.js.map +0 -1
- package/dist/index.html +0 -18
- package/index.html +0 -17
- package/src/App.tsx +0 -226
- package/src/components/canvas/CanvasPanel.tsx +0 -62
- package/src/components/canvas/layout/graph-builder.ts +0 -136
- package/src/components/canvas/shapes/CompactionNodeShape.tsx +0 -76
- package/src/components/canvas/shapes/SessionNodeShape.tsx +0 -93
- package/src/components/canvas/shapes/StatuslineWidgetShape.tsx +0 -125
- package/src/components/canvas/shapes/TextResponseNodeShape.tsx +0 -86
- package/src/components/canvas/shapes/ToolCallNodeShape.tsx +0 -107
- package/src/components/canvas/shapes/ToolResultNodeShape.tsx +0 -87
- package/src/components/canvas/shapes/shared-styles.ts +0 -35
- package/src/components/chat/ChatPanel.tsx +0 -96
- package/src/components/chat/InputBar.tsx +0 -81
- package/src/components/chat/MessageList.tsx +0 -130
- package/src/components/chat/PermissionDialog.tsx +0 -70
- package/src/components/layout/FolderSelector.tsx +0 -152
- package/src/components/layout/ModelSelector.tsx +0 -65
- package/src/components/layout/SessionManager.tsx +0 -115
- package/src/components/statusline/StatuslineBar.tsx +0 -114
- package/src/main.tsx +0 -10
- package/src/server/claude-session.ts +0 -156
- package/src/server/index.ts +0 -149
- package/src/services/stream-consumer.ts +0 -330
- package/src/statusline-core/bin/statusline.sh +0 -121
- package/src/statusline-core/commands/sls-config.md +0 -42
- package/src/statusline-core/commands/sls-doctor.md +0 -35
- package/src/statusline-core/commands/sls-help.md +0 -48
- package/src/statusline-core/commands/sls-layout.md +0 -38
- package/src/statusline-core/commands/sls-preview.md +0 -34
- package/src/statusline-core/commands/sls-theme.md +0 -40
- package/src/statusline-core/installer.js +0 -228
- package/src/statusline-core/layouts/compact.sh +0 -21
- package/src/statusline-core/layouts/full.sh +0 -62
- package/src/statusline-core/layouts/standard.sh +0 -39
- package/src/statusline-core/lib/core.sh +0 -389
- package/src/statusline-core/lib/helpers.sh +0 -81
- package/src/statusline-core/lib/json-parser.sh +0 -71
- package/src/statusline-core/themes/catppuccin.sh +0 -32
- package/src/statusline-core/themes/default.sh +0 -37
- package/src/statusline-core/themes/gruvbox.sh +0 -32
- package/src/statusline-core/themes/nord.sh +0 -32
- package/src/statusline-core/themes/tokyo-night.sh +0 -32
- package/src/store/canvas-store.ts +0 -50
- package/src/store/chat-store.ts +0 -60
- package/src/store/permission-store.ts +0 -29
- package/src/store/session-store.ts +0 -52
- package/src/store/statusline-store.ts +0 -160
- package/src/styles/global.css +0 -117
- package/src/themes/index.ts +0 -149
- package/src/types/canvas-graph.ts +0 -24
- package/src/types/sdk-messages.ts +0 -156
- package/src/types/statusline-fields.ts +0 -67
- package/src/vite-env.d.ts +0 -1
- package/tsconfig.json +0 -26
- package/vite.config.ts +0 -24
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
import express from 'express';
|
|
2
|
+
import bcrypt from 'bcryptjs';
|
|
3
|
+
import { 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
|
|
23
|
+
router.post('/register', async (req, res) => {
|
|
24
|
+
try {
|
|
25
|
+
const { username, password, email, phone, firstName, lastName } = req.body;
|
|
26
|
+
|
|
27
|
+
// Validate input
|
|
28
|
+
if (!password) {
|
|
29
|
+
return res.status(400).json({ error: 'Password is required' });
|
|
30
|
+
}
|
|
31
|
+
if (password.length < 6) {
|
|
32
|
+
return res.status(400).json({ error: 'Password must be at least 6 characters' });
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
// Derive display username from firstName + lastName if no username provided
|
|
36
|
+
const fName = (firstName || '').trim();
|
|
37
|
+
const lName = (lastName || '').trim();
|
|
38
|
+
const displayName = username || [fName, lName].filter(Boolean).join(' ') || 'User';
|
|
39
|
+
|
|
40
|
+
if (displayName.length < 2) {
|
|
41
|
+
return res.status(400).json({ error: 'Name must be at least 2 characters' });
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// Check if email is already registered
|
|
45
|
+
if (email) {
|
|
46
|
+
const existingUser = await userDb.getUserByUsername(email);
|
|
47
|
+
if (existingUser) {
|
|
48
|
+
return res.status(409).json({ error: 'An account with this email already exists. Please sign in.' });
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Hash password
|
|
53
|
+
const passwordHash = await bcrypt.hash(password, 12);
|
|
54
|
+
|
|
55
|
+
// Create user
|
|
56
|
+
const user = await userDb.createUser(displayName, passwordHash, email || null, phone || null, fName || null, lName || null);
|
|
57
|
+
|
|
58
|
+
// Auto-create default relay token + API key for the new user
|
|
59
|
+
let connectToken = null;
|
|
60
|
+
try {
|
|
61
|
+
const relayToken = await relayTokensDb.createToken(user.id, 'default');
|
|
62
|
+
connectToken = relayToken.token;
|
|
63
|
+
await apiKeysDb.createApiKey(user.id, 'default');
|
|
64
|
+
} catch { /* non-critical — user can create manually later */ }
|
|
65
|
+
|
|
66
|
+
// Generate token + set cookie
|
|
67
|
+
const token = generateToken(user);
|
|
68
|
+
setSessionCookie(res, token);
|
|
69
|
+
await userDb.updateLastLogin(user.id);
|
|
70
|
+
|
|
71
|
+
// New user — no subscription yet
|
|
72
|
+
res.json({
|
|
73
|
+
success: true,
|
|
74
|
+
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 },
|
|
75
|
+
token, // still returned for backward compat / API clients
|
|
76
|
+
connectToken // relay token for CLI connection
|
|
77
|
+
});
|
|
78
|
+
|
|
79
|
+
} catch (error) {
|
|
80
|
+
// registration error
|
|
81
|
+
if (error.message?.includes('UNIQUE')) {
|
|
82
|
+
res.status(409).json({ error: 'An account with this name already exists. Try a different name or sign in.' });
|
|
83
|
+
} else {
|
|
84
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
// User login
|
|
90
|
+
router.post('/login', async (req, res) => {
|
|
91
|
+
try {
|
|
92
|
+
const { username, password } = req.body;
|
|
93
|
+
|
|
94
|
+
if (!username || !password) {
|
|
95
|
+
return res.status(400).json({ error: 'Username and password are required' });
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
const user = await userDb.getUserByUsername(username.trim());
|
|
99
|
+
if (!user) {
|
|
100
|
+
return res.status(401).json({ error: 'Invalid username or password' });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const isValidPassword = await bcrypt.compare(password, user.password_hash);
|
|
104
|
+
if (!isValidPassword) {
|
|
105
|
+
return res.status(401).json({ error: 'Invalid username or password' });
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
// Generate token + set cookie
|
|
109
|
+
const token = generateToken(user);
|
|
110
|
+
setSessionCookie(res, token);
|
|
111
|
+
await userDb.updateLastLogin(user.id);
|
|
112
|
+
|
|
113
|
+
// Backfill relay token + API key if missing (for users created before auto-provisioning)
|
|
114
|
+
try {
|
|
115
|
+
const existingTokens = await relayTokensDb.getTokens(user.id);
|
|
116
|
+
if (existingTokens.length === 0) {
|
|
117
|
+
await relayTokensDb.createToken(user.id, 'default');
|
|
118
|
+
}
|
|
119
|
+
const existingKeys = await apiKeysDb.getApiKeys(user.id);
|
|
120
|
+
if (existingKeys.length === 0) {
|
|
121
|
+
await apiKeysDb.createApiKey(user.id, 'default');
|
|
122
|
+
}
|
|
123
|
+
} catch { /* non-critical backfill */ }
|
|
124
|
+
|
|
125
|
+
// Include active subscription if any
|
|
126
|
+
let subscription = null;
|
|
127
|
+
try {
|
|
128
|
+
await subscriptionDb.expireOverdue();
|
|
129
|
+
const sub = await subscriptionDb.getActiveSub(user.id);
|
|
130
|
+
if (sub) {
|
|
131
|
+
subscription = { id: sub.id, planId: sub.plan_id, status: sub.status, startsAt: sub.starts_at, expiresAt: sub.expires_at };
|
|
132
|
+
}
|
|
133
|
+
} catch { /* non-critical */ }
|
|
134
|
+
|
|
135
|
+
res.json({
|
|
136
|
+
success: true,
|
|
137
|
+
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: user.email, phone: user.phone, access_override: user.access_override || null, subscription },
|
|
138
|
+
token // backward compat
|
|
139
|
+
});
|
|
140
|
+
|
|
141
|
+
} catch (error) {
|
|
142
|
+
// login error
|
|
143
|
+
res.status(500).json({ error: 'Internal server error' });
|
|
144
|
+
}
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Get current user (protected route) — includes active subscription
|
|
148
|
+
router.get('/user', authenticateToken, async (req, res) => {
|
|
149
|
+
try {
|
|
150
|
+
// Expire overdue subs, then fetch active
|
|
151
|
+
await subscriptionDb.expireOverdue();
|
|
152
|
+
const sub = await subscriptionDb.getActiveSub(req.user.id);
|
|
153
|
+
|
|
154
|
+
// Map internal id → user_code for frontend, include all user details
|
|
155
|
+
const user = {
|
|
156
|
+
id: req.user.user_code || `upc-${String(req.user.id).padStart(3, '0')}`,
|
|
157
|
+
username: req.user.username,
|
|
158
|
+
first_name: req.user.first_name,
|
|
159
|
+
last_name: req.user.last_name,
|
|
160
|
+
email: req.user.email,
|
|
161
|
+
phone: req.user.phone,
|
|
162
|
+
access_override: req.user.access_override || null,
|
|
163
|
+
created_at: req.user.created_at,
|
|
164
|
+
};
|
|
165
|
+
|
|
166
|
+
if (sub) {
|
|
167
|
+
user.subscription = {
|
|
168
|
+
id: sub.id,
|
|
169
|
+
planId: sub.plan_id,
|
|
170
|
+
status: sub.status,
|
|
171
|
+
startsAt: sub.starts_at,
|
|
172
|
+
expiresAt: sub.expires_at,
|
|
173
|
+
};
|
|
174
|
+
} else {
|
|
175
|
+
user.subscription = null;
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
res.json({ user });
|
|
179
|
+
} catch (error) {
|
|
180
|
+
// user fetch error
|
|
181
|
+
const u = req.user;
|
|
182
|
+
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 } });
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// Get user's tokens — relay token (for Connect + MCP) and API key
|
|
187
|
+
router.get('/connect-token', authenticateToken, async (req, res) => {
|
|
188
|
+
try {
|
|
189
|
+
// Relay token — used for both CLI connect and MCP auth
|
|
190
|
+
const tokens = await relayTokensDb.getTokens(req.user.id);
|
|
191
|
+
let active = tokens.find(t => t.is_active);
|
|
192
|
+
if (!active) {
|
|
193
|
+
// Auto-create if none exists (backfill for existing users)
|
|
194
|
+
active = await relayTokensDb.createToken(req.user.id, 'default');
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// API key — also available if user needs it
|
|
198
|
+
const keys = await apiKeysDb.getApiKeys(req.user.id);
|
|
199
|
+
let activeKey = keys.find(k => k.is_active);
|
|
200
|
+
if (!activeKey) {
|
|
201
|
+
activeKey = await apiKeysDb.createApiKey(req.user.id, 'default');
|
|
202
|
+
}
|
|
203
|
+
|
|
204
|
+
res.json({
|
|
205
|
+
token: active.token, // relay token — works for Connect + MCP
|
|
206
|
+
apiKey: activeKey.api_key, // API key — alternative auth method
|
|
207
|
+
userCode: req.user.user_code || null,
|
|
208
|
+
});
|
|
209
|
+
} catch (error) {
|
|
210
|
+
res.status(500).json({ error: 'Could not fetch connect token' });
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
|
|
214
|
+
// Logout — clear the session cookie
|
|
215
|
+
router.post('/logout', authenticateToken, (req, res) => {
|
|
216
|
+
clearSessionCookie(res);
|
|
217
|
+
res.json({ success: true, message: 'Logged out successfully' });
|
|
218
|
+
});
|
|
219
|
+
|
|
220
|
+
export default router;
|
|
@@ -0,0 +1,263 @@
|
|
|
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;
|