TUI 骨架可运行: 主菜单+上传/任务/配置三视图, 桥接 Python 管线 (tarball 依赖修复 catalog 协议)

This commit is contained in:
lou
2026-08-09 23:41:08 +08:00
parent 1ea998f880
commit 75f932d13e
10 changed files with 1312 additions and 12 deletions
+2 -2
View File
@@ -11,12 +11,12 @@
"preview": "pnpm run build && node dist/main.mjs"
},
"dependencies": {
"@vue-tui/runtime": "file:/home/lou/桌面/vue-tui/packages/runtime",
"@vue-tui/runtime": "file:./vendor/vue-tui-runtime-0.3.0.tgz",
"vue": "^3.5.0"
},
"devDependencies": {
"@types/node": "^22.18.0",
"@vue-tui/vite": "file:/home/lou/桌面/vue-tui/packages/vite",
"@vue-tui/vite": "file:./vendor/vue-tui-vite-0.3.1.tgz",
"typescript": "^6.0.3",
"unplugin-vue": "^7.2.0",
"vite": "8.2.1",
+998
View File
@@ -0,0 +1,998 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
'@vue-tui/runtime':
specifier: file:./vendor/vue-tui-runtime-0.3.0.tgz
version: file:vendor/vue-tui-runtime-0.3.0.tgz(vue@3.5.41(typescript@6.0.3))
vue:
specifier: ^3.5.0
version: 3.5.41(typescript@6.0.3)
devDependencies:
'@types/node':
specifier: ^22.18.0
version: 22.20.1
'@vue-tui/vite':
specifier: file:./vendor/vue-tui-vite-0.3.1.tgz
version: file:vendor/vue-tui-vite-0.3.1.tgz(@vue-tui/runtime@file:vendor/vue-tui-runtime-0.3.0.tgz(vue@3.5.41(typescript@6.0.3)))(unplugin-vue@7.2.0(@types/node@22.20.1)(rolldown@1.2.3)(vue@3.5.41(typescript@6.0.3)))(vite@8.2.1(@types/node@22.20.1))
typescript:
specifier: ^6.0.3
version: 6.0.3
unplugin-vue:
specifier: ^7.2.0
version: 7.2.0(@types/node@22.20.1)(rolldown@1.2.3)(vue@3.5.41(typescript@6.0.3))
vite:
specifier: 8.2.1
version: 8.2.1(@types/node@22.20.1)
vue-tsc:
specifier: ^3.3.4
version: 3.3.9(typescript@6.0.3)
packages:
'@alcalzone/ansi-tokenize@0.3.0':
resolution: {integrity: sha512-p+CMKJ93HFmLkjXKlXiVGlMQEuRb6H0MokBSwUsX+S6BRX8eV5naFZpQJFfJHjRZY0Hmnqy1/r6UWl3x+19zYA==}
engines: {node: '>=18'}
'@babel/helper-string-parser@7.29.7':
resolution: {integrity: sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==}
engines: {node: '>=6.9.0'}
'@babel/helper-validator-identifier@7.29.7':
resolution: {integrity: sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==}
engines: {node: '>=6.9.0'}
'@babel/parser@7.29.8':
resolution: {integrity: sha512-E8lTAYNB1KW+FH+VGJuZM1ioAx2E6oVlvQFRrf5P8ZZmsiJXYAD9vTFV7yyEURNzgh1dFqMZuO6tUwcARbqFCA==}
engines: {node: '>=6.0.0'}
hasBin: true
'@babel/types@7.29.8':
resolution: {integrity: sha512-Vj1jF3cPfxg7OAfoI7QnVKLoILlm2JF9pnVHrX8qx7AHMiYWT+NDAA7jChlNgRS4WTLc/fD1lXLmPixluj+3Gg==}
engines: {node: '>=6.9.0'}
'@jridgewell/gen-mapping@0.3.13':
resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==}
'@jridgewell/remapping@2.3.5':
resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==}
'@jridgewell/resolve-uri@3.1.2':
resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==}
engines: {node: '>=6.0.0'}
'@jridgewell/sourcemap-codec@1.4.14':
resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==}
'@jridgewell/sourcemap-codec@1.5.0':
resolution: {integrity: sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==}
'@jridgewell/sourcemap-codec@1.5.5':
resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==}
'@jridgewell/trace-mapping@0.3.31':
resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==}
'@oxc-project/types@0.143.0':
resolution: {integrity: sha512-u6JZdLBTLotrNC9Vd6vPssINdzcCzleKAH6EJKImQb7GtYvX5keN2dxkoK44stCc4tffE6QQRtZTXVSzsLUlWA==}
'@rolldown/binding-android-arm64@1.2.3':
resolution: {integrity: sha512-zrJtHDcaZJ1Fp7xf4hNl+7seH9Cn/N5TwLYkhgXREtBwAd/jaqW3uqeHxpDugJLVICWg4eW44kOQEGJ1r6jCGw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [android]
'@rolldown/binding-darwin-arm64@1.2.3':
resolution: {integrity: sha512-ieIiibVCp0tX7TLu2cafoNPv8wJyYi01ekXpbf8q2j7F4rGAhhXb/eQh7ge9DRBY78GwmRQtvjZDux7EDbA8kA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [darwin]
'@rolldown/binding-darwin-x64@1.2.3':
resolution: {integrity: sha512-Zh9tCon19eDXJoihx0rqKhMUlMYqzwj3aPsSuHmI4RWZh62dWUL+DJN4C5YQya5TcQBJU/Fe8+rY0jhXTQITqA==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [darwin]
'@rolldown/binding-freebsd-x64@1.2.3':
resolution: {integrity: sha512-nGbJWewA1wrXXZiQhjAT5rhibGfns5ZNkDVqxsO6zJ3f3YvpoDNNmGMSbbhLuXKjNScaBJVOAboztAWVespQMg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [freebsd]
'@rolldown/binding-linux-arm-gnueabihf@1.2.3':
resolution: {integrity: sha512-QNniJr5Kml0kDEB98jiDOJjXNroxIIi0IXIbdYzY26Xt1pVbeP62+KnoIZLwirOymX/0jDk/2gI/bNUv7A7OIw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm]
os: [linux]
'@rolldown/binding-linux-arm64-gnu@1.2.3':
resolution: {integrity: sha512-TkqEAcmmvH3I/q4114NB4RVt6241Dao48pF45uLcFGrwAaIn0iITgTAKP/dLjbN0R4buJjGb91+UHSoFmpgIWw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@rolldown/binding-linux-arm64-musl@1.2.3':
resolution: {integrity: sha512-NHqjnxpsndf4MPymxteFAWHHfkTL8HjWh1KB7z23ofZ6QO2euONuxDXjat69dKZRALnGypg8k8SsK8vZJoXv1Q==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [linux]
libc: [musl]
'@rolldown/binding-linux-ppc64-gnu@1.2.3':
resolution: {integrity: sha512-6tbrbwfz5GB9DQ4Jwo6hy9v+vR31xZlvzZ6n5Xut6Hhx5PvrA9q/HsK8KMaYQp063iqZGXwNvZtYNLD7EM/x0w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [ppc64]
os: [linux]
libc: [glibc]
'@rolldown/binding-linux-s390x-gnu@1.2.3':
resolution: {integrity: sha512-oyuXxXmoZHjXC917IAPFAAv4wWAa0cM9afk8nx1+9/jNNOX1uPf8yDA6p7G0RypOfw/X0PQt5IfoquY1um+zSg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [s390x]
os: [linux]
libc: [glibc]
'@rolldown/binding-linux-x64-gnu@1.2.3':
resolution: {integrity: sha512-TytMwF2KVGqP2tgd0I1OY0PAv78dZRAYcF5ssDzjM34SUXCED3uXvSd5+lHoC0bTD6eEdFz7LdQNCO1y0oVk9w==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [glibc]
'@rolldown/binding-linux-x64-musl@1.2.3':
resolution: {integrity: sha512-/E9m3qstrJFVPoULV25mVQblSNExY2+kBsYe4sy0Tn0yOOgJ8wZbZt3KnRbF/XeU2Gl1STKUQnDNTqhIE5MD4A==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [linux]
libc: [musl]
'@rolldown/binding-openharmony-arm64@1.2.3':
resolution: {integrity: sha512-Kr0OcsoQI816i6HOl3vFHpd1K0eZyh76zgfj4c1nTyaTsd5r2Mj1lwM4R90y/qaCfmTn9eHy0SKwi98eitRxug==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [openharmony]
'@rolldown/binding-win32-arm64-msvc@1.2.3':
resolution: {integrity: sha512-hOtMwTqnME+/gJcH/PCZ0wn0zPUjiWOgkHpxbSJpfGKMezHltx1S7/k1SitzVa7Ww2cqrDDaFbZEhcJZO8o+Jw==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [arm64]
os: [win32]
'@rolldown/binding-win32-x64-msvc@1.2.3':
resolution: {integrity: sha512-ekcqMMkI2PlhYnfzQnB/cEdYUVVJViWvoUyLrbzgDoi3Snfc1mVBwdnc306ufA5ejy8JSPjT2RlW1nQSjW7efg==}
engines: {node: ^20.19.0 || >=22.12.0}
cpu: [x64]
os: [win32]
'@rolldown/pluginutils@1.0.1':
resolution: {integrity: sha512-2j9bGt5Jh8hj+vPtgzPtl72j0yRxHAyumoo6TNfAjsLB04UtpSvPbPcDcBMxz7n+9CYB0c1GxQFxYRg2jimqGw==}
'@types/node@22.20.1':
resolution: {integrity: sha512-EANqOCF9QFyra+4pfxUcX9STKJpCLjMbObVzljIJomAWSnuSIEAvyzEU53GaajbXJEgdh0iEcPL+DGvpUd4k1Q==}
'@volar/language-core@2.4.28':
resolution: {integrity: sha512-w4qhIJ8ZSitgLAkVay6AbcnC7gP3glYM3fYwKV3srj8m494E3xtrCv6E+bWviiK/8hs6e6t1ij1s2Endql7vzQ==}
'@volar/source-map@2.4.28':
resolution: {integrity: sha512-yX2BDBqJkRXfKw8my8VarTyjv48QwxdJtvRgUpNE5erCsgEUdI2DsLbpa+rOQVAJYshY99szEcRDmyHbF10ggQ==}
'@volar/typescript@2.4.28':
resolution: {integrity: sha512-Ja6yvWrbis2QtN4ClAKreeUZPVYMARDYZl9LMEv1iQ1QdepB6wn0jTRxA9MftYmYa4DQ4k/DaSZpFPUfxl8giw==}
'@vue-tui/runtime@file:vendor/vue-tui-runtime-0.3.0.tgz':
resolution: {integrity: sha512-4aDEQ3J5gcMVOT7YDZ4FwucLCnW5OTYb6/zcvnv6brCtJ/uR7JPi1979O00rJgZkj19iejm4KsBo7NaLF9oGtw==, tarball: file:vendor/vue-tui-runtime-0.3.0.tgz}
version: 0.3.0
engines: {node: '>=22.18.0'}
peerDependencies:
vue: ^3.5.0
'@vue-tui/vite@file:vendor/vue-tui-vite-0.3.1.tgz':
resolution: {integrity: sha512-pjZpiVoG7pb9a+NkOa0jOyLgYhte+zHG25jJJp7GOJv6tI1MyTEMYiCClmJBJuLrmeejmJEFAeyWL+QflMs0Jg==, tarball: file:vendor/vue-tui-vite-0.3.1.tgz}
version: 0.3.1
peerDependencies:
'@vitejs/plugin-vue-jsx': 5.1.5
'@vue-tui/runtime': 0.3.0
unplugin-vue: 7.2.0
vite: 8.2.1
peerDependenciesMeta:
'@vitejs/plugin-vue-jsx':
optional: true
unplugin-vue:
optional: true
vite:
optional: true
'@vue/compiler-core@3.5.41':
resolution: {integrity: sha512-q0Xtv/F9w2YO/7htQhtiL+Ev2WCJbe5N2hc+XfgyKkEKqWpSxknmT8QOuGdEKNdjPq0c3F7rNpFkTo3Kfrm7pg==}
'@vue/compiler-dom@3.5.41':
resolution: {integrity: sha512-oKacVfNglLvGjnS6BXOlGL7EyG2h8X03pqXCjzotRZUaXGjbrTJUnVAQjrCqUnS+lyu31nwQjZY/d817GmCnfw==}
'@vue/compiler-sfc@3.5.41':
resolution: {integrity: sha512-XJhip7R2wy6vX3knCxdZN4KracFaZUef58s1KYewqluedHIJaPIVfXoYT7MF1F8nCvv6k8bWWxDC8opMkg1VTQ==}
'@vue/compiler-ssr@3.5.41':
resolution: {integrity: sha512-U3v5OejKEGqOI0Wy0+Sz7hGuIFZHA4LSXzrNM3IMIeDyJEBBfTpX26n3SDgToRpP2bLc9FfI2j/kSgcJ8Emq5A==}
'@vue/language-core@3.3.9':
resolution: {integrity: sha512-in/68oAa4BCtVY6n/nkuhLIkV8DHYd2UivedJ6cMZ6UYtlq9jaoaSNUBHYCVO44z3nKg7MdE5OBoHKt5SxeBKQ==}
'@vue/reactivity@3.5.41':
resolution: {integrity: sha512-rznsqKM0np0x18EjzF8x88MpEhdNsffbvFbckLL5+oUKz1BxAImEmO7J1ArRYSyo6aQaVoBDp7jEkT91OOxydA==}
'@vue/runtime-core@3.5.41':
resolution: {integrity: sha512-Vcry58hiAKwGen9Z1jUZE0feFsNArPCMOImYI8el48A9Idf6DuQYD0U05zZIF2Iad1hGhPSvcbBbAOhNr55fhg==}
'@vue/runtime-dom@3.5.41':
resolution: {integrity: sha512-3vVBahVBS9+U6cmXBLyb8nE6/yYo4J/CGI9eVFs3KiMc0YHuudwKyShTD65jtJy/L9PUUxNAFu4cj4LiJ0UFbw==}
'@vue/server-renderer@3.5.41':
resolution: {integrity: sha512-n6hx/pNFfbD6SuyeuMVkvqox8bwf/ET9JlA/kAz/imw8sw++wkqKe2mHX5KutjPpbKE4Z56yTHszoOjGMI9igQ==}
'@vue/shared@3.5.41':
resolution: {integrity: sha512-IOnwSCma8j+9xJT6b8H0dEYidC80NsYmNMlZxRsukYcSoGaDBohog5hDxzeUXdFeGWFA++vWvxqOmrr96VlqMA==}
alien-signals@3.2.1:
resolution: {integrity: sha512-I8FjmltrfnDFoZedi5CG8DghVYNhzb/Ijluz7tCSJH0xpd0484Kowhbb1XDYOxfJpU1p5wnM2X54dA+IfGyD1g==}
ansi-escapes@7.3.0:
resolution: {integrity: sha512-BvU8nYgGQBxcmMuEeUEmNTvrMVjJNSH7RgW24vXexN4Ven6qCvy4TntnvlnwnMLTVlcRQQdbRY8NKnaIoeWDNg==}
engines: {node: '>=18'}
ansi-regex@6.2.2:
resolution: {integrity: sha512-Bq3SmSpyFHaWjPk8If9yc6svM8c56dB5BAtW4Qbw5jHTwwXXcTLoRMkpDJp6VL0XzlWaCHTXrkFURMYmD0sLqg==}
engines: {node: '>=12'}
ansi-styles@6.2.1:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
ansi-styles@6.2.3:
resolution: {integrity: sha512-4Dj6M28JB+oAH8kFkTLUo+a2jwOFkuqb3yucU0CANcRRUbxS0cP0nZYCGjcc3BNXwRIsUVmDGgzawme7zvJHvg==}
engines: {node: '>=12'}
chalk@5.3.0:
resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==}
engines: {node: ^12.17.0 || ^14.13 || >=16.0.0}
cli-boxes@3.0.0:
resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==}
engines: {node: '>=10'}
cli-truncate@6.1.1:
resolution: {integrity: sha512-06p9vyLahLa4zkGcgsGxU6iEkSOiuI4fhCH6Emhe2lPAcoUv73n72DnODsnHA+5wwXGnV0n9M9/qOQJSjYhFhw==}
engines: {node: '>=22'}
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
detect-libc@2.1.2:
resolution: {integrity: sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==}
engines: {node: '>=8'}
entities@7.0.1:
resolution: {integrity: sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==}
engines: {node: '>=0.12'}
environment@1.1.0:
resolution: {integrity: sha512-xUtoPkMggbz0MPyPiIWr1Kp4aeWJjDZ6SMvURhimjdZgsRuDplF5/s9hcgGhyXMhs+6vpnuoiZ2kFiu3FMnS8Q==}
engines: {node: '>=18'}
estree-walker@2.0.2:
resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
fdir@6.5.0:
resolution: {integrity: sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==}
engines: {node: '>=12.0.0'}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
os: [darwin]
get-east-asian-width@1.6.0:
resolution: {integrity: sha512-QRbvDIbx6YklUe6RxeTeleMR0yv3cYH6PsPZHcnVn7xv7zO1BHN8r0XETu8n6Ye3Q+ahtSarc3WgtNWmehIBfA==}
engines: {node: '>=18'}
is-fullwidth-code-point@5.1.0:
resolution: {integrity: sha512-5XHYaSyiqADb4RnZ1Bdad6cPp8Toise4TzEjcOYDHZkTCbKgiUl7WTUCpNWHuxmDt91wnsZBc9xinNzopv3JMQ==}
engines: {node: '>=18'}
lightningcss-android-arm64@1.33.0:
resolution: {integrity: sha512-gEpRTalKdosp4Bb8qWtc2iOgE5SeIHlpS1up9bFq2wAyYhl1UdTObYiHe98zEM9SQvSoqQZ1IQD0JNpg3Ml5pg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [android]
lightningcss-darwin-arm64@1.33.0:
resolution: {integrity: sha512-Sciaz8eenNTKn9b3t7+xr0ipTp9YxKQY4npwQ3mrRuL0BAVHBLyZxofhaKBAVtzmtRZ/zTyo0/to4B1uWG/Djg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [darwin]
lightningcss-darwin-x64@1.33.0:
resolution: {integrity: sha512-Z5UPAxzrjlWNNyGy6i65cJzzvgJ5D3T6wMvs+gWpY9d7qRhANrxqAp6LhxIgZhWEw18RfJTGcRxjuLIBr+m8XQ==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [darwin]
lightningcss-freebsd-x64@1.33.0:
resolution: {integrity: sha512-QQM/Ti/hQajJwCY+RiWuCZ9sdtI/XQk7nDK5vC8kkdwixezOlDgvDx7+RT+QjK6FcFT4MpsuoBnHIo/O3StRRg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [freebsd]
lightningcss-linux-arm-gnueabihf@1.33.0:
resolution: {integrity: sha512-N7FVBe6iS24MlM6R/4RBTxGhQheZGs7tiQ9U32UtF75NzP5Q7xWPRqLBCKxlRQRk3rY1jCIPLzx7WzOhuUIRLQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm]
os: [linux]
lightningcss-linux-arm64-gnu@1.33.0:
resolution: {integrity: sha512-j2v/itmy4HlNxlc6voKXYgBqNi0Ng2LShg4z7GufpEgs05P+2suBVyi9I6YHq5uoVFx9ETin3eCEhLVyXGQnKg==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [glibc]
lightningcss-linux-arm64-musl@1.33.0:
resolution: {integrity: sha512-yiO5ROMuYQgXbC60yjZU5CYSFZGKXL0HFATXt9mHJn1+zW55oCtMI9NfcVhYLMFDL7gV7oBPon/EmMMGg2OvtQ==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [linux]
libc: [musl]
lightningcss-linux-x64-gnu@1.33.0:
resolution: {integrity: sha512-ar+Ju7LmcN0Jo4FpL4hpFybwNG9/3A/Br5KW2n2jyODg3MEZXaDYADdemoNS+BDNfMgKvylJLj4S5tyRActuAg==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [glibc]
lightningcss-linux-x64-musl@1.33.0:
resolution: {integrity: sha512-RYiYbkokw0trfKqqzfF55lginwEPrD3OJDfTuJzFs1MK6iFnDenaz1fqLLtX4ITG3OktJQXOeTaw1awrBAlZPw==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [linux]
libc: [musl]
lightningcss-win32-arm64-msvc@1.33.0:
resolution: {integrity: sha512-1K+MPfLSFVpphzpdbfkhlWk6wBrTObBzS2T6db10PNOZgR9GoVsAWzwNyuhUYYbTp23j+4RrncfujZ4uAzXvwA==}
engines: {node: '>= 12.0.0'}
cpu: [arm64]
os: [win32]
lightningcss-win32-x64-msvc@1.33.0:
resolution: {integrity: sha512-OlEICDx/Xl0FqSp4bry8zFnCvGpig3Gl4gCquvYwHuqJKEC1+n9NgDniFvqHGmMv1ZkqDJrDqKKSykTDX+ehuA==}
engines: {node: '>= 12.0.0'}
cpu: [x64]
os: [win32]
lightningcss@1.33.0:
resolution: {integrity: sha512-WkUDrojuJs0xkgGf2udWxa3yGBRxPtxUkB79i6aCZLRgc7PM8fZe9TosfPDcvEpQZbuFASnHYmRLBLUbmLOIIA==}
engines: {node: '>= 12.0.0'}
magic-string@0.30.21:
resolution: {integrity: sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==}
muggle-string@0.4.1:
resolution: {integrity: sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==}
nanoid@3.3.18:
resolution: {integrity: sha512-DTg4MJbGMWkfi6VZFdNt2/caMbQy4Ou+Op/hJQvGEWcnVfoA1QA+xzRKAzw9jD6+GVOOeYr/mIcuDSdug6F6+w==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
hasBin: true
obug@2.1.4:
resolution: {integrity: sha512-4a+OsYv9UktOJKE+l1A4OufDgdRF9PifWj+tJnHURo/P+WOxpG4GzUFL9qCalmWauao6ogiG+QvnCovwPoyAWA==}
engines: {node: '>=12.20.0'}
patch-console@2.0.0:
resolution: {integrity: sha512-0YNdUceMdaQwoKce1gatDScmMo5pu/tfABfnzEqeG0gtTmd7mh/WcwgUjtAeOU7N8nFFlbQBnFK2gXW5fGvmMA==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
path-browserify@1.0.1:
resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==}
picocolors@1.1.1:
resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==}
picomatch@4.0.5:
resolution: {integrity: sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==}
engines: {node: '>=12'}
postcss@8.5.26:
resolution: {integrity: sha512-u82N74LFzG8ca+dD8puPnplTXoGH4fTPpVGuIbt36G3qvNlkvfD0lEAZSxaly3KX8TS/L1A1gsCEmvKmBcVbkQ==}
engines: {node: ^10 || ^12 || >=14}
rolldown@1.2.3:
resolution: {integrity: sha512-rn9wpmxplLf7NLNyCk9FyWh3FM43DbY8jOzCdEPzH7uflhTftRbCEpqi6Ly2osgoU8OwObtmavMbWLaWy4LX7A==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
signal-exit@4.1.0:
resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==}
engines: {node: '>=14'}
slice-ansi@9.0.0:
resolution: {integrity: sha512-SO/3iYL5S3W57LLEniscOGPZgOqZUPCx6d3dB+52B80yJ0XstzsC/eV8gnA4tM3MHDrKz+OCFSLNjswdSC+/bA==}
engines: {node: '>=22'}
source-map-js@1.2.1:
resolution: {integrity: sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==}
engines: {node: '>=0.10.0'}
string-width@8.2.2:
resolution: {integrity: sha512-GaPUh5gfdrYzqeVNZvUfT23vYYxXzKYidUcnMtJg/3rxRV63EFZy3k6xfKlmfeJD0176lnUV/Usr3XcwSvFzpg==}
engines: {node: '>=20'}
strip-ansi@7.2.0:
resolution: {integrity: sha512-yDPMNjp4WyfYBkHnjIRLfca1i6KMyGCtsVgoKe/z1+6vukgaENdgGBZt+ZmKPc4gavvEZ5OgHfHdrazhgNyG7w==}
engines: {node: '>=12'}
tinyglobby@0.2.17:
resolution: {integrity: sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==}
engines: {node: '>=12.0.0'}
typescript@6.0.3:
resolution: {integrity: sha512-y2TvuxSZPDyQakkFRPZHKFm+KKVqIisdg9/CZwm9ftvKXLP8NRWj38/ODjNbr43SsoXqNuAisEf1GdCxqWcdBw==}
engines: {node: '>=14.17'}
hasBin: true
undici-types@6.21.0:
resolution: {integrity: sha512-iwDZqg0QAGrg9Rav5H4n0M64c3mkR59cJ6wQp+7C4nI0gsmExaedaYLNO44eT4AtBBwjbTiGPMlt2Md0T9H9JQ==}
unplugin-vue@7.2.0:
resolution: {integrity: sha512-6JHWcRbLO3bySOsipQSW9n2VRoPqsx9GLSWBfp7QLPCvpUr/edeAXR7pSl44EEJ+FIp9bG8Zm+xm5dnM/yir4Q==}
engines: {node: '>=20.19.0'}
peerDependencies:
vue: ^3.2.25
unplugin@3.3.0:
resolution: {integrity: sha512-qa66K+crbfyE6JK10GjvbJeRrOsuC/JpbnHctfyp/i4oBTxWOzJfRZyDiOk1PtErMFRu8JhsU/wPvOdBNWe5Rg==}
engines: {node: ^20.19.0 || >=22.12.0}
peerDependencies:
'@farmfe/core': '*'
'@rspack/core': '*'
bun-types-no-globals: '*'
esbuild: '*'
rolldown: '*'
rollup: '*'
unloader: '*'
vite: '*'
webpack: '*'
peerDependenciesMeta:
'@farmfe/core':
optional: true
'@rspack/core':
optional: true
bun-types-no-globals:
optional: true
esbuild:
optional: true
rolldown:
optional: true
rollup:
optional: true
unloader:
optional: true
vite:
optional: true
webpack:
optional: true
vite@8.2.1:
resolution: {integrity: sha512-EU/eS7BH3XROHh2YnBefjM6DBKA6ZeMZEYQbj7NLWg5wHYlhB8B/Mayd5XsgWq+NFYccDOTemRpdETWR6Ka/lw==}
engines: {node: ^20.19.0 || >=22.12.0}
hasBin: true
peerDependencies:
'@types/node': ^20.19.0 || >=22.12.0
'@vitejs/devtools': ^0.4.0
esbuild: ^0.27.0 || ^0.28.0
jiti: '>=1.21.0'
less: ^4.0.0
sass: ^1.70.0
sass-embedded: ^1.70.0
stylus: '>=0.54.8'
sugarss: ^5.0.0
terser: ^5.16.0
tsx: ^4.8.1
yaml: ^2.4.2
peerDependenciesMeta:
'@types/node':
optional: true
'@vitejs/devtools':
optional: true
esbuild:
optional: true
jiti:
optional: true
less:
optional: true
sass:
optional: true
sass-embedded:
optional: true
stylus:
optional: true
sugarss:
optional: true
terser:
optional: true
tsx:
optional: true
yaml:
optional: true
vscode-uri@3.1.0:
resolution: {integrity: sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==}
vue-tsc@3.3.9:
resolution: {integrity: sha512-TS3Y1ux/IRoE8OCP2PpACAeOseuIs0UvWrcr7u+w3PmfY+SlCfEf8zjrBgnQksHUgLpthi5vHlffcQTQTdPBZA==}
hasBin: true
peerDependencies:
typescript: '>=5.0.0'
vue@3.5.41:
resolution: {integrity: sha512-2laE0p+aK+/AOPG/XL/WepOs/GlK755LJ1XECi9kDUrz1FKNw8rb2Xzlw9JS1rqEV55nb0ttsKxVlTCcd+R5cg==}
peerDependencies:
typescript: '*'
peerDependenciesMeta:
typescript:
optional: true
webpack-virtual-modules@0.6.2:
resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
wrap-ansi@10.0.0:
resolution: {integrity: sha512-SGcvg80f0wUy2/fXES19feHMz8E0JoXv2uNgHOu4Dgi2OrCy1lqwFYEJz1BLbDI0exjPMe/ZdzZ/YpGECBG/aQ==}
engines: {node: '>=20'}
yoga-layout@3.2.1:
resolution: {integrity: sha512-0LPOt3AxKqMdFBZA3HBAt/t/8vIKq7VaQYbuA8WxCgung+p9TVyKRYdpvCb80HcdTN2NkbIKbhNwKUfm3tQywQ==}
snapshots:
'@alcalzone/ansi-tokenize@0.3.0':
dependencies:
ansi-styles: 6.2.1
is-fullwidth-code-point: 5.1.0
'@babel/helper-string-parser@7.29.7': {}
'@babel/helper-validator-identifier@7.29.7': {}
'@babel/parser@7.29.8':
dependencies:
'@babel/types': 7.29.8
'@babel/types@7.29.8':
dependencies:
'@babel/helper-string-parser': 7.29.7
'@babel/helper-validator-identifier': 7.29.7
'@jridgewell/gen-mapping@0.3.13':
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
'@jridgewell/trace-mapping': 0.3.31
'@jridgewell/remapping@2.3.5':
dependencies:
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
'@jridgewell/resolve-uri@3.1.2': {}
'@jridgewell/sourcemap-codec@1.4.14': {}
'@jridgewell/sourcemap-codec@1.5.0': {}
'@jridgewell/sourcemap-codec@1.5.5': {}
'@jridgewell/trace-mapping@0.3.31':
dependencies:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.4.14
'@oxc-project/types@0.143.0': {}
'@rolldown/binding-android-arm64@1.2.3':
optional: true
'@rolldown/binding-darwin-arm64@1.2.3':
optional: true
'@rolldown/binding-darwin-x64@1.2.3':
optional: true
'@rolldown/binding-freebsd-x64@1.2.3':
optional: true
'@rolldown/binding-linux-arm-gnueabihf@1.2.3':
optional: true
'@rolldown/binding-linux-arm64-gnu@1.2.3':
optional: true
'@rolldown/binding-linux-arm64-musl@1.2.3':
optional: true
'@rolldown/binding-linux-ppc64-gnu@1.2.3':
optional: true
'@rolldown/binding-linux-s390x-gnu@1.2.3':
optional: true
'@rolldown/binding-linux-x64-gnu@1.2.3':
optional: true
'@rolldown/binding-linux-x64-musl@1.2.3':
optional: true
'@rolldown/binding-openharmony-arm64@1.2.3':
optional: true
'@rolldown/binding-win32-arm64-msvc@1.2.3':
optional: true
'@rolldown/binding-win32-x64-msvc@1.2.3':
optional: true
'@rolldown/pluginutils@1.0.1': {}
'@types/node@22.20.1':
dependencies:
undici-types: 6.21.0
'@volar/language-core@2.4.28':
dependencies:
'@volar/source-map': 2.4.28
'@volar/source-map@2.4.28': {}
'@volar/typescript@2.4.28':
dependencies:
'@volar/language-core': 2.4.28
path-browserify: 1.0.1
vscode-uri: 3.1.0
'@vue-tui/runtime@file:vendor/vue-tui-runtime-0.3.0.tgz(vue@3.5.41(typescript@6.0.3))':
dependencies:
'@alcalzone/ansi-tokenize': 0.3.0
ansi-escapes: 7.3.0
chalk: 5.3.0
cli-boxes: 3.0.0
cli-truncate: 6.1.1
patch-console: 2.0.0
signal-exit: 4.1.0
slice-ansi: 9.0.0
string-width: 8.2.2
vue: 3.5.41(typescript@6.0.3)
wrap-ansi: 10.0.0
yoga-layout: 3.2.1
'@vue-tui/vite@file:vendor/vue-tui-vite-0.3.1.tgz(@vue-tui/runtime@file:vendor/vue-tui-runtime-0.3.0.tgz(vue@3.5.41(typescript@6.0.3)))(unplugin-vue@7.2.0(@types/node@22.20.1)(rolldown@1.2.3)(vue@3.5.41(typescript@6.0.3)))(vite@8.2.1(@types/node@22.20.1))':
dependencies:
'@vue-tui/runtime': file:vendor/vue-tui-runtime-0.3.0.tgz(vue@3.5.41(typescript@6.0.3))
optionalDependencies:
unplugin-vue: 7.2.0(@types/node@22.20.1)(rolldown@1.2.3)(vue@3.5.41(typescript@6.0.3))
vite: 8.2.1(@types/node@22.20.1)
'@vue/compiler-core@3.5.41':
dependencies:
'@babel/parser': 7.29.8
'@vue/shared': 3.5.41
entities: 7.0.1
estree-walker: 2.0.2
source-map-js: 1.2.1
'@vue/compiler-dom@3.5.41':
dependencies:
'@vue/compiler-core': 3.5.41
'@vue/shared': 3.5.41
'@vue/compiler-sfc@3.5.41':
dependencies:
'@babel/parser': 7.29.8
'@vue/compiler-core': 3.5.41
'@vue/compiler-dom': 3.5.41
'@vue/compiler-ssr': 3.5.41
'@vue/shared': 3.5.41
estree-walker: 2.0.2
magic-string: 0.30.21
postcss: 8.5.26
source-map-js: 1.2.1
'@vue/compiler-ssr@3.5.41':
dependencies:
'@vue/compiler-dom': 3.5.41
'@vue/shared': 3.5.41
'@vue/language-core@3.3.9':
dependencies:
'@volar/language-core': 2.4.28
'@vue/compiler-dom': 3.5.41
'@vue/shared': 3.5.41
alien-signals: 3.2.1
muggle-string: 0.4.1
path-browserify: 1.0.1
picomatch: 4.0.5
'@vue/reactivity@3.5.41':
dependencies:
'@vue/shared': 3.5.41
'@vue/runtime-core@3.5.41':
dependencies:
'@vue/reactivity': 3.5.41
'@vue/shared': 3.5.41
'@vue/runtime-dom@3.5.41':
dependencies:
'@vue/reactivity': 3.5.41
'@vue/runtime-core': 3.5.41
'@vue/shared': 3.5.41
csstype: 3.2.3
'@vue/server-renderer@3.5.41':
dependencies:
'@vue/compiler-ssr': 3.5.41
'@vue/runtime-dom': 3.5.41
'@vue/shared': 3.5.41
'@vue/shared@3.5.41': {}
alien-signals@3.2.1: {}
ansi-escapes@7.3.0:
dependencies:
environment: 1.1.0
ansi-regex@6.2.2: {}
ansi-styles@6.2.1: {}
ansi-styles@6.2.3: {}
chalk@5.3.0: {}
cli-boxes@3.0.0: {}
cli-truncate@6.1.1:
dependencies:
slice-ansi: 9.0.0
string-width: 8.2.2
csstype@3.2.3: {}
detect-libc@2.1.2: {}
entities@7.0.1: {}
environment@1.1.0: {}
estree-walker@2.0.2: {}
fdir@6.5.0(picomatch@4.0.5):
optionalDependencies:
picomatch: 4.0.5
fsevents@2.3.3:
optional: true
get-east-asian-width@1.6.0: {}
is-fullwidth-code-point@5.1.0:
dependencies:
get-east-asian-width: 1.6.0
lightningcss-android-arm64@1.33.0:
optional: true
lightningcss-darwin-arm64@1.33.0:
optional: true
lightningcss-darwin-x64@1.33.0:
optional: true
lightningcss-freebsd-x64@1.33.0:
optional: true
lightningcss-linux-arm-gnueabihf@1.33.0:
optional: true
lightningcss-linux-arm64-gnu@1.33.0:
optional: true
lightningcss-linux-arm64-musl@1.33.0:
optional: true
lightningcss-linux-x64-gnu@1.33.0:
optional: true
lightningcss-linux-x64-musl@1.33.0:
optional: true
lightningcss-win32-arm64-msvc@1.33.0:
optional: true
lightningcss-win32-x64-msvc@1.33.0:
optional: true
lightningcss@1.33.0:
dependencies:
detect-libc: 2.1.2
optionalDependencies:
lightningcss-android-arm64: 1.33.0
lightningcss-darwin-arm64: 1.33.0
lightningcss-darwin-x64: 1.33.0
lightningcss-freebsd-x64: 1.33.0
lightningcss-linux-arm-gnueabihf: 1.33.0
lightningcss-linux-arm64-gnu: 1.33.0
lightningcss-linux-arm64-musl: 1.33.0
lightningcss-linux-x64-gnu: 1.33.0
lightningcss-linux-x64-musl: 1.33.0
lightningcss-win32-arm64-msvc: 1.33.0
lightningcss-win32-x64-msvc: 1.33.0
magic-string@0.30.21:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.5
muggle-string@0.4.1: {}
nanoid@3.3.18: {}
obug@2.1.4: {}
patch-console@2.0.0: {}
path-browserify@1.0.1: {}
picocolors@1.1.1: {}
picomatch@4.0.5: {}
postcss@8.5.26:
dependencies:
nanoid: 3.3.18
picocolors: 1.1.1
source-map-js: 1.2.1
rolldown@1.2.3:
dependencies:
'@oxc-project/types': 0.143.0
'@rolldown/pluginutils': 1.0.1
optionalDependencies:
'@rolldown/binding-android-arm64': 1.2.3
'@rolldown/binding-darwin-arm64': 1.2.3
'@rolldown/binding-darwin-x64': 1.2.3
'@rolldown/binding-freebsd-x64': 1.2.3
'@rolldown/binding-linux-arm-gnueabihf': 1.2.3
'@rolldown/binding-linux-arm64-gnu': 1.2.3
'@rolldown/binding-linux-arm64-musl': 1.2.3
'@rolldown/binding-linux-ppc64-gnu': 1.2.3
'@rolldown/binding-linux-s390x-gnu': 1.2.3
'@rolldown/binding-linux-x64-gnu': 1.2.3
'@rolldown/binding-linux-x64-musl': 1.2.3
'@rolldown/binding-openharmony-arm64': 1.2.3
'@rolldown/binding-win32-arm64-msvc': 1.2.3
'@rolldown/binding-win32-x64-msvc': 1.2.3
signal-exit@4.1.0: {}
slice-ansi@9.0.0:
dependencies:
ansi-styles: 6.2.3
is-fullwidth-code-point: 5.1.0
source-map-js@1.2.1: {}
string-width@8.2.2:
dependencies:
get-east-asian-width: 1.6.0
strip-ansi: 7.2.0
strip-ansi@7.2.0:
dependencies:
ansi-regex: 6.2.2
tinyglobby@0.2.17:
dependencies:
fdir: 6.5.0(picomatch@4.0.5)
picomatch: 4.0.5
typescript@6.0.3: {}
undici-types@6.21.0: {}
unplugin-vue@7.2.0(@types/node@22.20.1)(rolldown@1.2.3)(vue@3.5.41(typescript@6.0.3)):
dependencies:
'@jridgewell/gen-mapping': 0.3.13
'@jridgewell/trace-mapping': 0.3.31
'@vue/reactivity': 3.5.41
obug: 2.1.4
unplugin: 3.3.0(rolldown@1.2.3)(vite@8.2.1(@types/node@22.20.1))
vite: 8.2.1(@types/node@22.20.1)
vue: 3.5.41(typescript@6.0.3)
transitivePeerDependencies:
- '@farmfe/core'
- '@rspack/core'
- '@types/node'
- '@vitejs/devtools'
- bun-types-no-globals
- esbuild
- jiti
- less
- rolldown
- rollup
- sass
- sass-embedded
- stylus
- sugarss
- terser
- tsx
- unloader
- webpack
- yaml
unplugin@3.3.0(rolldown@1.2.3)(vite@8.2.1(@types/node@22.20.1)):
dependencies:
'@jridgewell/remapping': 2.3.5
picomatch: 4.0.5
webpack-virtual-modules: 0.6.2
optionalDependencies:
rolldown: 1.2.3
vite: 8.2.1(@types/node@22.20.1)
vite@8.2.1(@types/node@22.20.1):
dependencies:
lightningcss: 1.33.0
picomatch: 4.0.5
postcss: 8.5.26
rolldown: 1.2.3
tinyglobby: 0.2.17
optionalDependencies:
'@types/node': 22.20.1
fsevents: 2.3.3
vscode-uri@3.1.0: {}
vue-tsc@3.3.9(typescript@6.0.3):
dependencies:
'@volar/typescript': 2.4.28
'@vue/language-core': 3.3.9
typescript: 6.0.3
vue@3.5.41(typescript@6.0.3):
dependencies:
'@vue/compiler-dom': 3.5.41
'@vue/compiler-sfc': 3.5.41
'@vue/runtime-dom': 3.5.41
'@vue/server-renderer': 3.5.41
'@vue/shared': 3.5.41
optionalDependencies:
typescript: 6.0.3
webpack-virtual-modules@0.6.2: {}
wrap-ansi@10.0.0:
dependencies:
ansi-styles: 6.2.3
string-width: 8.2.2
strip-ansi: 7.2.0
yoga-layout@3.2.1: {}
+21
View File
@@ -0,0 +1,21 @@
"""TUI 辅助: 中文输入收集
vue-tui 的 useInput 在 raw mode 下不支持 IME, 中文输入必须走 Python cooked-mode input()。
用法: python ask.py <提示词> [默认值] -> 最后一行输出 JSON {"answer": "..."}
"""
import json
import sys
prompt = sys.argv[1] if len(sys.argv) > 1 else "输入"
default = sys.argv[2] if len(sys.argv) > 2 else ""
sys.stdout.write(f"{prompt} [{default}]: ")
sys.stdout.flush()
try:
answer = input()
except EOFError:
answer = ""
if not answer:
answer = default
print()
print(json.dumps({"answer": answer}, ensure_ascii=False))
+19 -10
View File
@@ -1,6 +1,9 @@
<script setup lang="ts">
import { shallowRef } from "vue";
import { Box, Text, useInput } from "@vue-tui/runtime";
import Upload from "./views/upload.vue";
import Tasks from "./views/tasks.vue";
import Config from "./views/config.vue";
type View = "menu" | "upload" | "tasks" | "config";
const view = shallowRef<View>("menu");
@@ -19,15 +22,21 @@ useInput((input) => {
<template>
<Box flexDirection="column" :paddingX="1" :paddingY="1">
<Text bold color="cyan">7z-encrypt 客户端</Text>
<Text dimColor>安全文件传输 · 加密 / 分卷 / 上传</Text>
<Box height="1" />
<Text bold>主菜单</Text>
<Text> 1. 上传文件</Text>
<Text> 2. 任务续传</Text>
<Text> 3. 配置</Text>
<Text> q. 退出</Text>
<Box height="1" />
<Text dimColor>输入数字选择, q 返回/退出</Text>
<template v-if="view === 'menu'">
<Text bold color="cyan">7z-encrypt 客户端</Text>
<Text dimColor>安全文件传输 · 加密 / 分卷 / 上传</Text>
<Box :height="1" />
<Text bold>主菜单</Text>
<Text> 1. 上传文件</Text>
<Text> 2. 任务续传</Text>
<Text> 3. 配置</Text>
<Text> q. 退出</Text>
<Box :height="1" />
<Text dimColor>输入数字选择, q 返回/退出</Text>
</template>
<Upload v-else-if="view === 'upload'" />
<Tasks v-else-if="view === 'tasks'" />
<Config v-else-if="view === 'config'" />
</Box>
</template>
+79
View File
@@ -0,0 +1,79 @@
// 与 7z-encrypt Python 管线之间的桥 (spawn 子进程, 逐行回传输出)
import { spawn } from "node:child_process";
const CLIENT_DIR = "/home/lou/文档/7z-encrypt";
const PYTHON = `${CLIENT_DIR}/.venv/bin/python`;
export interface RunResult {
code: number;
lines: string[];
}
/** 运行 Python CLI, 逐行回调 stdout (剥掉 \r 进度行尾), 返回退出码 + 全行 */
export function runPython(
args: string[],
onLine?: (line: string) => void,
): Promise<RunResult> {
return new Promise((resolve, reject) => {
const child = spawn(PYTHON, args, {
cwd: CLIENT_DIR,
env: { ...process.env, PYTHONIOENCODING: "utf-8" },
});
const lines: string[] = [];
child.stdout.on("data", (buf: Buffer) => {
for (const line of buf.toString().split("\n")) {
const l = line.replace(/\r$/, "");
if (!l) continue;
lines.push(l);
onLine?.(l);
}
});
child.stderr.on("data", (buf: Buffer) => {
for (const line of buf.toString().split("\n")) {
const l = line.trim();
if (!l) continue;
lines.push(`[stderr] ${l}`);
}
});
child.on("close", (code) => resolve({ code: code ?? -1, lines }));
child.on("error", reject);
});
}
/** 中文输入 (Python cooked-mode input, 支持 IME) */
export async function ask(prompt: string, fallback = ""): Promise<string> {
const r = await runPython(["scripts/ask.py", prompt, fallback]);
for (const line of [...r.lines].reverse()) {
try {
const obj = JSON.parse(line) as { answer: string };
return obj.answer;
} catch {
// 非 JSON 行 (提示文本) 跳过
}
}
return "";
}
export interface UploadProgress {
done: number;
total: number;
pct: number;
}
const PROG_RE = /上传进度: (\d+)\/(\d+) 卷 \((\d+)%\)/;
/** 解析 transfer.py 的进度行 "[传输] 上传进度: 3/6 卷 (50%)" */
export function parseProgress(line: string): UploadProgress | null {
const m = PROG_RE.exec(line);
if (!m) return null;
return { done: Number(m[1]), total: Number(m[2]), pct: Number(m[3]) };
}
/** 产物路径规则 (与 metadata.py 一致): <src>.enc / <src>_manifest.json / <src>.init.json */
export function deriveArtifacts(src: string) {
return {
enc: `${src}.enc`,
manifest: `${src}_manifest.json`,
init: `${src}.init.json`,
};
}
+38
View File
@@ -0,0 +1,38 @@
<script setup lang="ts">
import { shallowRef, onMounted } from "vue";
import { Box, Text, useInput } from "@vue-tui/runtime";
import { runPython, ask } from "../lib/pipeline";
const content = shallowRef("(读取中)");
async function show() {
const r = await runPython(["config.py"], (l) => {
if (!l.startsWith("===")) content.value = l;
});
if (r.code !== 0) content.value = r.lines.join("\n");
}
async function edit() {
const url = await ask("服务器地址", "http://192.168.10.133:8000");
if (!url) return;
await runPython(["config.py", "--path", "/home/lou/文档/7z-encrypt/config/config.json", "--set-server", url]);
await show();
}
onMounted(() => void show());
useInput((input) => {
if (input === "e") void edit();
});
</script>
<template>
<Box flexDirection="column">
<Text bold color="cyan">配置</Text>
<Text dimColor>e 修改服务器地址</Text>
<Box :height="1" />
<Text v-for="(l, i) in content.split('\n')" :key="i" dimColor>{{ l }}</Text>
<Box :height="1" />
<Text dimColor>q 返回菜单</Text>
</Box>
</template>
+35
View File
@@ -0,0 +1,35 @@
<script setup lang="ts">
import { shallowRef, onMounted } from "vue";
import { Box, Text, useInput } from "@vue-tui/runtime";
import { runPython } from "../lib/pipeline";
const lines = shallowRef<string[]>([]);
const message = shallowRef("查询中...");
async function refresh() {
message.value = "查询中...";
lines.value = [];
const r = await runPython(["state.py", "pending"], (l) => lines.value = [...lines.value, l]);
message.value = r.code === 0 ? `未完成任务 ${lines.value.length}` : `查询失败 (退出码 ${r.code})`;
}
onMounted(() => void refresh());
useInput((input) => {
if (input === "r") void refresh();
});
</script>
<template>
<Box flexDirection="column">
<Text bold color="cyan">任务续传</Text>
<Text dimColor>r 刷新 | 续传功能开发中</Text>
<Box :height="1" />
<Text>{{ message }}</Text>
<Box flexDirection="column">
<Text v-for="(l, i) in lines" :key="i">{{ l }}</Text>
</Box>
<Box :height="1" />
<Text dimColor>q 返回菜单</Text>
</Box>
</template>
+120
View File
@@ -0,0 +1,120 @@
<script setup lang="ts">
import { shallowRef } from "vue";
import { Box, Text, useInput } from "@vue-tui/runtime";
import { ask, deriveArtifacts, parseProgress, runPython } from "../lib/pipeline";
type Phase =
| "idle"
| "ask_file"
| "ask_server"
| "pipelining"
| "uploading"
| "done"
| "error";
const phase = shallowRef<Phase>("idle");
const filePath = shallowRef("");
const server = shallowRef("");
const progress = shallowRef({ done: 0, total: 0, pct: 0 });
const log = shallowRef<string[]>([]);
const message = shallowRef("");
const pushLog = (line: string) => {
const next = [...log.value, line];
if (next.length > 24) next.shift();
log.value = next;
};
useInput((input) => {
if (input !== "1" || phase.value !== "idle") return;
void startFlow();
});
async function startFlow() {
phase.value = "ask_file";
filePath.value = await ask("文件路径", "/tmp/demo.bin");
phase.value = "ask_server";
server.value = await ask("服务器", "http://192.168.10.133:8000");
if (!filePath.value || !server.value) {
phase.value = "error";
message.value = "输入为空, 取消";
return;
}
phase.value = "pipelining";
log.value = [];
await upload();
}
async function upload() {
const { manifest, init } = deriveArtifacts(filePath.value);
pushLog(`[tui] 文件: ${filePath.value}`);
pushLog(`[tui] 服务器: ${server.value}`);
const meta = await runPython(["metadata.py", filePath.value, "--chunk-size", "10"], (l) => {
pushLog(l);
});
if (meta.code !== 0) {
phase.value = "error";
message.value = `加密/分卷失败 (退出码 ${meta.code})`;
return;
}
phase.value = "uploading";
const up = await runPython(
["transfer.py", "--server", server.value, "--init", init, "--manifest", manifest],
(l) => {
pushLog(l);
const p = parseProgress(l);
if (p) progress.value = p;
},
);
if (up.code !== 0) {
phase.value = "error";
message.value = `上传失败 (退出码 ${up.code})`;
return;
}
phase.value = "done";
const receipt = up.lines.find((l) => l.includes("完成")) ?? "";
message.value = receipt.replace(/^\[传输\] /, "");
}
</script>
<template>
<Box flexDirection="column">
<Text bold color="cyan">上传文件</Text>
<Box :height="1" />
<template v-if="phase === 'idle'">
<Text dimColor> 1 开始上传流程</Text>
</template>
<template v-else-if="phase === 'ask_file' || phase === 'ask_server'">
<Text color="yellow">{{ phase === "ask_file" ? "输入文件路径..." : "输入服务器地址..." }}</Text>
</template>
<template v-else-if="phase === 'pipelining'">
<Text color="yellow">加密 + 分卷中...</Text>
</template>
<template v-else-if="phase === 'uploading'">
<Text>上传进度: {{ progress.done }}/{{ progress.total }} </Text>
<Text color="green">{{ "=".repeat(Math.floor(progress.pct / 5)) }}{{ "-".repeat(20 - Math.floor(progress.pct / 5)) }} {{ progress.pct }}%</Text>
</template>
<template v-else-if="phase === 'done'">
<Text bold color="green">完成: {{ message }}</Text>
</template>
<template v-else-if="phase === 'error'">
<Text bold color="red">失败: {{ message }}</Text>
</template>
<Box :height="1" />
<Text dimColor>--- 管线输出 (原生) ---</Text>
<Box flexDirection="column">
<Text v-for="(l, i) in log" :key="i" dimColor>{{ l }}</Text>
</Box>
<Box :height="1" />
<Text dimColor>q 返回菜单</Text>
</Box>
</template>
Binary file not shown.
BIN
View File
Binary file not shown.