pisper 0.5.21-linux-x64.0 → 0.5.21
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/README.en.md +53 -0
- package/README.md +46 -46
- package/bin/pisper.mjs +48 -0
- package/lib/install.mjs +392 -0
- package/lib/npm-platform.mjs +41 -0
- package/lib/npm-update.mjs +165 -0
- package/lib/platform.mjs +43 -0
- package/lib/postinstall.mjs +3 -0
- package/package.json +36 -14
- package/updater.pubkey +1 -0
- package/web/.vite/manifest.json +2249 -0
- package/web/assets/AnimatedContent-BiVNqD3m.js +1 -0
- package/web/assets/AnimatedList-CJTx-B8I.js +1 -0
- package/web/assets/AppOverlays-C_v-1VL6.js +1 -0
- package/web/assets/AppSelect-g6etLk2g.js +1 -0
- package/web/assets/AssetsPage-Dt5ST6Ej.js +1 -0
- package/web/assets/ChannelsPage-C9dO2yLN.js +1 -0
- package/web/assets/ChatHistoryPage-ZvSTAtXB.js +1 -0
- package/web/assets/ChatPage-BD3WkozH.js +9 -0
- package/web/assets/ClickSpark-BhxL8WOQ.js +1 -0
- package/web/assets/ConfigPage-ifZdPO01.js +1 -0
- package/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/web/assets/MarkdownMessage-CMr3WuAI.js +1 -0
- package/web/assets/MemoryPage-D5Hjoc5p.js +1 -0
- package/web/assets/PageHeader-BKfO_vPe.js +1 -0
- package/web/assets/PluginsPage-DhkVJf05.js +1 -0
- package/web/assets/PreviewPages-mRjRmA0i.js +1 -0
- package/web/assets/SchedulesPage-DNe-Y6o5.js +1 -0
- package/web/assets/ShinyText-fuaKxKqJ.js +1 -0
- package/web/assets/SkillsPage-PguSYt8I.js +1 -0
- package/web/assets/StarOrbit-BlI6MhVr.js +1 -0
- package/web/assets/TerminalPanel-BrP-ENHg.css +1 -0
- package/web/assets/TerminalPanel-DrnfpA8m.js +18 -0
- package/web/assets/Threads-DskDSsK6.js +1 -0
- package/web/assets/WelcomeEffects-Bf8Z6qHU.js +1 -0
- package/web/assets/WorkflowsPage-C6sGl2oG.js +1 -0
- package/web/assets/WorkspacePicker-Cu2Z5jid.js +1 -0
- package/web/assets/alert-B7D8joCd.js +1 -0
- package/web/assets/alert-dialog-D5F_JQyX.js +1 -0
- package/web/assets/andromeeda-vGVdxbeo.js +1 -0
- package/web/assets/angular-html-17rlCfBS.js +1 -0
- package/web/assets/angular-ts-it3MaXWH.js +1 -0
- package/web/assets/astro-BEVDzCov.js +1 -0
- package/web/assets/aurora-x-CDeNXAV0.js +1 -0
- package/web/assets/ayu-dark-DluEY0Gj.js +1 -0
- package/web/assets/ayu-light-C3h-C4tm.js +1 -0
- package/web/assets/ayu-mirage-Bqwy1Gya.js +1 -0
- package/web/assets/blade-B3yUZIOx.js +1 -0
- package/web/assets/brand-CFOXmGdd.js +1 -0
- package/web/assets/button-DzlQCSNK.js +1 -0
- package/web/assets/c-aGSZMVdM.js +1 -0
- package/web/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
- package/web/assets/catppuccin-latte-CtsyrtPq.js +1 -0
- package/web/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
- package/web/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
- package/web/assets/chevron-down-DXmj1gMQ.js +1 -0
- package/web/assets/circle-dot-CbGG7s_7.js +1 -0
- package/web/assets/coffee-ouOQ86EC.js +1 -0
- package/web/assets/copy-DO0sQBgx.js +1 -0
- package/web/assets/cpp-Bm3vm43L.js +1 -0
- package/web/assets/css-CWcS1xXm.js +1 -0
- package/web/assets/csv-Dx-8-gkx.js +1 -0
- package/web/assets/dark-plus-Cs2F2srj.js +1 -0
- package/web/assets/dist-BaCXUSxG.js +1 -0
- package/web/assets/dist-Bv5OI2pf.js +1 -0
- package/web/assets/dracula-BHWKrbxM.js +1 -0
- package/web/assets/dracula-soft-5eyTD99u.js +1 -0
- package/web/assets/earth-D-KiHvdO.js +1 -0
- package/web/assets/es2015-CfKlxLgF.js +41 -0
- package/web/assets/everforest-dark-sB-x3p7T.js +1 -0
- package/web/assets/everforest-light-Df2xbC6M.js +1 -0
- package/web/assets/field-CCo2X7MX.js +1 -0
- package/web/assets/file-B6GksU4A.js +1 -0
- package/web/assets/file-code-corner-3gopYCm4.js +1 -0
- package/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
- package/web/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
- package/web/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
- package/web/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
- package/web/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
- package/web/assets/github-dark-C-LZuMrd.js +1 -0
- package/web/assets/github-dark-default-DXG-b-1a.js +1 -0
- package/web/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
- package/web/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
- package/web/assets/github-light-EUqPIrTm.js +1 -0
- package/web/assets/github-light-default-BXViO-2h.js +1 -0
- package/web/assets/github-light-high-contrast-B68TUdTA.js +1 -0
- package/web/assets/glsl-TOBAB6bO.js +1 -0
- package/web/assets/graphql-BEmIBNve.js +1 -0
- package/web/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
- package/web/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
- package/web/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
- package/web/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
- package/web/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
- package/web/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
- package/web/assets/haml-CDWtFtU9.js +1 -0
- package/web/assets/handlebars-BNtjo3pL.js +1 -0
- package/web/assets/horizon-CE9ld1lL.js +1 -0
- package/web/assets/horizon-bright-DSNQnXHK.js +1 -0
- package/web/assets/houston-CsvMBhTu.js +1 -0
- package/web/assets/html-BVyvp26C.js +1 -0
- package/web/assets/html-derivative-BseLpURQ.js +1 -0
- package/web/assets/http-CkCfSMV9.js +1 -0
- package/web/assets/hurl-syYMt6Rn.js +1 -0
- package/web/assets/image-Bu_a9jz0.js +1 -0
- package/web/assets/imba-DsUTQ-LC.js +1 -0
- package/web/assets/index-BIQcwjFR.js +41 -0
- package/web/assets/index-Btu6aNk7.css +2 -0
- package/web/assets/java-duG_UTKe.js +1 -0
- package/web/assets/javascript-DWVbOe4X.js +1 -0
- package/web/assets/jinja-Boj4niAz.js +1 -0
- package/web/assets/jison-CHwnC1Pv.js +1 -0
- package/web/assets/json-qhed-kSA.js +1 -0
- package/web/assets/json5-BR5RXkoi.js +1 -0
- package/web/assets/jsonc-CYpm1nAK.js +1 -0
- package/web/assets/jsonl-CmCQp5Yx.js +1 -0
- package/web/assets/jsx-fcCEM_-L.js +1 -0
- package/web/assets/julia-VoF7UKfw.js +1 -0
- package/web/assets/kanagawa-dragon-Bozd7klA.js +1 -0
- package/web/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
- package/web/assets/kanagawa-wave-BML5mF2J.js +1 -0
- package/web/assets/laserwave-C_8bwKvT.js +1 -0
- package/web/assets/less-DVTAwKKz.js +1 -0
- package/web/assets/light-plus-DVQuIRkW.js +1 -0
- package/web/assets/link-2-SOWAopyR.js +1 -0
- package/web/assets/loader-circle-i0WYlBWu.js +1 -0
- package/web/assets/markdown-BYOwaDjH.js +1 -0
- package/web/assets/marko-Cupn1xhw.js +1 -0
- package/web/assets/material-theme-Bm3Qr25_.js +1 -0
- package/web/assets/material-theme-darker-2IIEA8gg.js +1 -0
- package/web/assets/material-theme-lighter-uhdI0v04.js +1 -0
- package/web/assets/material-theme-ocean-CHQ94UKr.js +1 -0
- package/web/assets/material-theme-palenight-B5W6OYN7.js +1 -0
- package/web/assets/mdc-4FfK5iWR.js +1 -0
- package/web/assets/mdx-DQZ5AkYe.js +1 -0
- package/web/assets/message-circle-C3tSGsW0.js +1 -0
- package/web/assets/min-dark-BSWPekZh.js +1 -0
- package/web/assets/min-light-DDpmG2fV.js +1 -0
- package/web/assets/monokai-B_bV9PQ9.js +1 -0
- package/web/assets/network-zt1ahOiz.js +1 -0
- package/web/assets/night-owl-DhmEMT88.js +1 -0
- package/web/assets/night-owl-light-eJ-hLW7d.js +1 -0
- package/web/assets/nord-Cb4Vim4T.js +1 -0
- package/web/assets/one-dark-pro-CLwyXe_n.js +1 -0
- package/web/assets/one-light-D7Lr4KcI.js +1 -0
- package/web/assets/panel-top-DYcS-wiY.js +1 -0
- package/web/assets/paperclip-t0nP1kBQ.js +1 -0
- package/web/assets/pencil-BOb7CieI.js +1 -0
- package/web/assets/php-CUREQQ7f.js +1 -0
- package/web/assets/pick-system-directory-BnIFt85A.js +1 -0
- package/web/assets/plastic-DQwYfKfQ.js +1 -0
- package/web/assets/play-V5zloi0R.js +1 -0
- package/web/assets/poimandres-DRFjx7u4.js +1 -0
- package/web/assets/postcss-BXeXVLqQ.js +1 -0
- package/web/assets/progress-DWkHIRCG.js +6 -0
- package/web/assets/pug-CQyGKZpv.js +1 -0
- package/web/assets/python-gzcpVVnB.js +1 -0
- package/web/assets/r-C5FwQflr.js +1 -0
- package/web/assets/react-bits-DQli9s7O.css +1 -0
- package/web/assets/red-DX1BQOs8.js +1 -0
- package/web/assets/regexp--aR2_iz7.js +1 -0
- package/web/assets/rolldown-runtime-B0Z9INg1.js +1 -0
- package/web/assets/rose-pine-aMsaMD1D.js +1 -0
- package/web/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
- package/web/assets/rose-pine-moon-DO-qXg-I.js +1 -0
- package/web/assets/sass-DXrisJhu.js +1 -0
- package/web/assets/save-CTsP04bb.js +1 -0
- package/web/assets/scss-Davl4E3T.js +1 -0
- package/web/assets/search-Chj7BjSz.js +1 -0
- package/web/assets/shellscript-CLZ0U2zV.js +1 -0
- package/web/assets/shield-check-By9gGYwr.js +1 -0
- package/web/assets/slack-dark-DnToyrRv.js +1 -0
- package/web/assets/slack-ochin-B2OO5cIa.js +1 -0
- package/web/assets/smithy-Dgaz7aur.js +1 -0
- package/web/assets/snazzy-light-4G7pJPwS.js +1 -0
- package/web/assets/solarized-dark-UdsmMDCL.js +1 -0
- package/web/assets/solarized-light-C1IUL_tW.js +1 -0
- package/web/assets/sql-b92rrcVl.js +1 -0
- package/web/assets/square-DQQwOv3-.js +1 -0
- package/web/assets/square-terminal-ByK0g_OZ.js +1 -0
- package/web/assets/stylus-B6D30XZt.js +1 -0
- package/web/assets/sun-CiCuEpCg.js +1 -0
- package/web/assets/svelte-BfstjgUc.js +1 -0
- package/web/assets/synthwave-84-nFMaYfgc.js +1 -0
- package/web/assets/tag-B0fT5ThM.js +1 -0
- package/web/assets/tokyo-night-oM2G3aXe.js +1 -0
- package/web/assets/trash-2-2GzVxk5J.js +1 -0
- package/web/assets/ts-tags-Cckpt1jI.js +1 -0
- package/web/assets/tsx-JMDX3aQ7.js +1 -0
- package/web/assets/typescript-BAz-bF8J.js +1 -0
- package/web/assets/use-i18n-DmLwOjO5.js +1 -0
- package/web/assets/usePagePrimaryAction-Bw0OFTDZ.js +1 -0
- package/web/assets/utils-C8uzG5AZ.js +1 -0
- package/web/assets/vendor-dockview-D5adAaCg.css +1 -0
- package/web/assets/vendor-dockview-yY5mBM3U.js +1 -0
- package/web/assets/vendor-markdown-CWK5AVhB.js +130 -0
- package/web/assets/vendor-markdown-plugins-DCl4I7Pz.js +263 -0
- package/web/assets/vendor-motion-XxgxfZSY.js +9 -0
- package/web/assets/vendor-react-CHuvPdJE.js +9 -0
- package/web/assets/vendor-router-Bw2aAdMs.js +4 -0
- package/web/assets/vendor-shiki-runtime-CxE5QolQ.js +153 -0
- package/web/assets/vendor-state-DE1O_s6m.js +1 -0
- package/web/assets/vendor-ui-DvrYggeS.js +1 -0
- package/web/assets/vendor-xyflow-CnjXtcyK.js +7 -0
- package/web/assets/vendor-xyflow-DLioOiRN.css +1 -0
- package/web/assets/vesper-DdrHHSXu.js +1 -0
- package/web/assets/vitesse-black-fwtXNY1n.js +1 -0
- package/web/assets/vitesse-dark-BZCL-v6S.js +1 -0
- package/web/assets/vitesse-light-VbXTXTou.js +1 -0
- package/web/assets/vue-3H7P6ncC.js +1 -0
- package/web/assets/vue-html-DZGW9MGR.js +1 -0
- package/web/assets/vue-vine-BECt67gq.js +1 -0
- package/web/assets/wasm-BnjxR4X6.js +1 -0
- package/web/assets/wasm-ByWQv1Qj.js +1 -0
- package/web/assets/wgsl-BsKzXJz4.js +1 -0
- package/web/assets/wit-DdvCle-K.js +1 -0
- package/web/assets/wrench-DkHcVlxK.js +1 -0
- package/web/assets/xml-CNfvW5JP.js +1 -0
- package/web/assets/yaml-rwi0_p6S.js +1 -0
- package/web/assets/zap-CRNpJWAy.js +1 -0
- package/web/favicon.svg +25 -0
- package/web/icons.svg +24 -0
- package/web/index.html +72 -0
- package/web/memory-galaxy-background.webp +0 -0
- package/web/mobile-startup.html +316 -0
- package/web/notification-sw.js +13 -0
- package/web/tauri-pet.css +117 -0
- package/web/tauri-pet.html +16 -0
- package/web/tauri-pet.js +117 -0
- package/components/runtime/Pisper_Runtime_Node_0.5.20_linux_x86_64.tar.gz +0 -0
- package/components/runtime/Pisper_Runtime_Node_0.5.20_linux_x86_64.tar.gz.sig +0 -1
- package/components/tui/Pisper_TUI_Component_0.5.12_linux_x86_64.tar.gz +0 -0
- package/components/tui/Pisper_TUI_Component_0.5.12_linux_x86_64.tar.gz.sig +0 -1
|
@@ -0,0 +1,316 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1, viewport-fit=cover" />
|
|
6
|
+
<meta name="color-scheme" content="light dark" />
|
|
7
|
+
<title>Pisper</title>
|
|
8
|
+
<style>
|
|
9
|
+
:root {
|
|
10
|
+
font-family:
|
|
11
|
+
Inter, "Noto Sans SC", system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif;
|
|
12
|
+
color: #17191c;
|
|
13
|
+
background: #f7f8fa;
|
|
14
|
+
}
|
|
15
|
+
* {
|
|
16
|
+
box-sizing: border-box;
|
|
17
|
+
}
|
|
18
|
+
body {
|
|
19
|
+
margin: 0;
|
|
20
|
+
min-height: 100vh;
|
|
21
|
+
min-height: 100dvh;
|
|
22
|
+
overflow: hidden;
|
|
23
|
+
background: #f7f8fa;
|
|
24
|
+
}
|
|
25
|
+
main {
|
|
26
|
+
width: min(100%, 32rem);
|
|
27
|
+
min-height: 100vh;
|
|
28
|
+
min-height: 100dvh;
|
|
29
|
+
margin: 0 auto;
|
|
30
|
+
padding: max(3rem, env(safe-area-inset-top)) 1.75rem
|
|
31
|
+
max(2rem, env(safe-area-inset-bottom));
|
|
32
|
+
display: flex;
|
|
33
|
+
flex-direction: column;
|
|
34
|
+
justify-content: center;
|
|
35
|
+
}
|
|
36
|
+
.identity {
|
|
37
|
+
display: flex;
|
|
38
|
+
align-items: center;
|
|
39
|
+
gap: 0.8rem;
|
|
40
|
+
margin-bottom: 2.25rem;
|
|
41
|
+
}
|
|
42
|
+
.mark {
|
|
43
|
+
width: 3rem;
|
|
44
|
+
height: 3rem;
|
|
45
|
+
border-radius: 10px;
|
|
46
|
+
box-shadow: 0 12px 28px -18px rgba(17, 24, 39, 0.65);
|
|
47
|
+
animation: mark-breathe 1.8s ease-in-out infinite;
|
|
48
|
+
}
|
|
49
|
+
.brand {
|
|
50
|
+
margin: 0;
|
|
51
|
+
font-size: 1.3rem;
|
|
52
|
+
font-weight: 750;
|
|
53
|
+
}
|
|
54
|
+
h1 {
|
|
55
|
+
margin: 0;
|
|
56
|
+
max-width: 20rem;
|
|
57
|
+
font-size: 1.75rem;
|
|
58
|
+
line-height: 1.25;
|
|
59
|
+
letter-spacing: 0;
|
|
60
|
+
}
|
|
61
|
+
.summary {
|
|
62
|
+
min-height: 3.2rem;
|
|
63
|
+
margin: 0.8rem 0 0;
|
|
64
|
+
color: #606873;
|
|
65
|
+
font-size: 0.95rem;
|
|
66
|
+
line-height: 1.65;
|
|
67
|
+
}
|
|
68
|
+
.progress {
|
|
69
|
+
position: relative;
|
|
70
|
+
width: 100%;
|
|
71
|
+
height: 3px;
|
|
72
|
+
margin-top: 2rem;
|
|
73
|
+
overflow: hidden;
|
|
74
|
+
background: #dfe3e8;
|
|
75
|
+
}
|
|
76
|
+
.progress::after {
|
|
77
|
+
position: absolute;
|
|
78
|
+
inset: 0 auto 0 0;
|
|
79
|
+
width: 42%;
|
|
80
|
+
background: #16181b;
|
|
81
|
+
content: "";
|
|
82
|
+
animation: runtime-progress 1.15s cubic-bezier(0.4, 0, 0.2, 1) infinite;
|
|
83
|
+
}
|
|
84
|
+
.status {
|
|
85
|
+
margin: 1.75rem 0 0;
|
|
86
|
+
padding: 1rem 0;
|
|
87
|
+
border-top: 1px solid #dfe2e7;
|
|
88
|
+
border-bottom: 1px solid #dfe2e7;
|
|
89
|
+
color: #4b5563;
|
|
90
|
+
font-family: inherit;
|
|
91
|
+
font-size: 0.88rem;
|
|
92
|
+
line-height: 1.55;
|
|
93
|
+
white-space: pre-wrap;
|
|
94
|
+
overflow-wrap: anywhere;
|
|
95
|
+
}
|
|
96
|
+
.actions {
|
|
97
|
+
display: flex;
|
|
98
|
+
gap: 0.75rem;
|
|
99
|
+
margin-top: 1.5rem;
|
|
100
|
+
}
|
|
101
|
+
button {
|
|
102
|
+
min-height: 3rem;
|
|
103
|
+
border: 1px solid #202124;
|
|
104
|
+
border-radius: 6px;
|
|
105
|
+
padding: 0 1.25rem;
|
|
106
|
+
font: inherit;
|
|
107
|
+
font-weight: 650;
|
|
108
|
+
color: #fff;
|
|
109
|
+
background: #202124;
|
|
110
|
+
}
|
|
111
|
+
button.secondary {
|
|
112
|
+
color: #202124;
|
|
113
|
+
background: transparent;
|
|
114
|
+
}
|
|
115
|
+
button:disabled {
|
|
116
|
+
cursor: wait;
|
|
117
|
+
opacity: 0.55;
|
|
118
|
+
}
|
|
119
|
+
[hidden] {
|
|
120
|
+
display: none !important;
|
|
121
|
+
}
|
|
122
|
+
body[data-phase="error"] .mark {
|
|
123
|
+
animation: none;
|
|
124
|
+
}
|
|
125
|
+
@keyframes runtime-progress {
|
|
126
|
+
from {
|
|
127
|
+
transform: translateX(-115%);
|
|
128
|
+
}
|
|
129
|
+
to {
|
|
130
|
+
transform: translateX(340%);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
@keyframes mark-breathe {
|
|
134
|
+
0%,
|
|
135
|
+
100% {
|
|
136
|
+
transform: scale(1);
|
|
137
|
+
opacity: 0.86;
|
|
138
|
+
}
|
|
139
|
+
50% {
|
|
140
|
+
transform: scale(1.045);
|
|
141
|
+
opacity: 1;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
@media (prefers-reduced-motion: reduce) {
|
|
145
|
+
.mark,
|
|
146
|
+
.progress::after {
|
|
147
|
+
animation-duration: 2.8s;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
@media (prefers-color-scheme: dark) {
|
|
151
|
+
:root,
|
|
152
|
+
body {
|
|
153
|
+
color: #f3f4f6;
|
|
154
|
+
background: #121416;
|
|
155
|
+
}
|
|
156
|
+
.summary,
|
|
157
|
+
.status {
|
|
158
|
+
color: #b8bec7;
|
|
159
|
+
}
|
|
160
|
+
.progress,
|
|
161
|
+
.status {
|
|
162
|
+
border-color: #343940;
|
|
163
|
+
}
|
|
164
|
+
.progress {
|
|
165
|
+
background: #343940;
|
|
166
|
+
}
|
|
167
|
+
.progress::after {
|
|
168
|
+
background: #f3f4f6;
|
|
169
|
+
}
|
|
170
|
+
button {
|
|
171
|
+
border-color: #f3f4f6;
|
|
172
|
+
color: #121416;
|
|
173
|
+
background: #f3f4f6;
|
|
174
|
+
}
|
|
175
|
+
button.secondary {
|
|
176
|
+
color: #f3f4f6;
|
|
177
|
+
background: transparent;
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
</style>
|
|
181
|
+
</head>
|
|
182
|
+
<body data-phase="starting">
|
|
183
|
+
<main>
|
|
184
|
+
<div class="identity">
|
|
185
|
+
<img class="mark" src="favicon.svg" alt="" />
|
|
186
|
+
<p class="brand">Pisper</p>
|
|
187
|
+
</div>
|
|
188
|
+
<h1 id="title">正在启动 Pisper</h1>
|
|
189
|
+
<p class="summary" id="summary">正在准备本机 Runtime 和工作区…</p>
|
|
190
|
+
<div class="progress" id="progress" role="progressbar" aria-label="正在启动"></div>
|
|
191
|
+
<pre class="status" id="status" role="status" hidden></pre>
|
|
192
|
+
<div class="actions" id="actions" hidden>
|
|
193
|
+
<button id="retry" type="button">重试</button>
|
|
194
|
+
<button id="remote" class="secondary" type="button" hidden>桌面服务器</button>
|
|
195
|
+
</div>
|
|
196
|
+
</main>
|
|
197
|
+
<script>
|
|
198
|
+
(() => {
|
|
199
|
+
const english = !navigator.language.toLowerCase().startsWith('zh')
|
|
200
|
+
const text = english
|
|
201
|
+
? {
|
|
202
|
+
startingTitle: 'Starting Pisper',
|
|
203
|
+
startingSummary: 'Preparing the local Runtime and workspace...',
|
|
204
|
+
errorTitle: 'Local Runtime is not ready',
|
|
205
|
+
errorSummary:
|
|
206
|
+
'The application UI has not been loaded. Retry startup or use a paired desktop server.',
|
|
207
|
+
retry: 'Retry',
|
|
208
|
+
retrying: 'Starting Runtime...',
|
|
209
|
+
remote: 'Desktop server',
|
|
210
|
+
bridge: 'The native Pisper bridge is unavailable.',
|
|
211
|
+
invalid: 'The Runtime returned an invalid startup address.',
|
|
212
|
+
progress: 'Starting',
|
|
213
|
+
}
|
|
214
|
+
: {
|
|
215
|
+
startingTitle: '正在启动 Pisper',
|
|
216
|
+
startingSummary: '正在准备本机 Runtime 和工作区…',
|
|
217
|
+
errorTitle: '本机 Runtime 未能就绪',
|
|
218
|
+
errorSummary: '业务界面尚未加载。请重试启动,或改用已配对的桌面服务器。',
|
|
219
|
+
retry: '重试',
|
|
220
|
+
retrying: '正在启动 Runtime…',
|
|
221
|
+
remote: '桌面服务器',
|
|
222
|
+
bridge: 'Pisper 原生桥不可用。',
|
|
223
|
+
invalid: 'Runtime 返回了无效的启动地址。',
|
|
224
|
+
progress: '正在启动',
|
|
225
|
+
}
|
|
226
|
+
const title = document.querySelector('#title')
|
|
227
|
+
const summary = document.querySelector('#summary')
|
|
228
|
+
const progress = document.querySelector('#progress')
|
|
229
|
+
const status = document.querySelector('#status')
|
|
230
|
+
const actions = document.querySelector('#actions')
|
|
231
|
+
const retry = document.querySelector('#retry')
|
|
232
|
+
const remote = document.querySelector('#remote')
|
|
233
|
+
retry.textContent = text.retry
|
|
234
|
+
remote.textContent = text.remote
|
|
235
|
+
progress.setAttribute('aria-label', text.progress)
|
|
236
|
+
|
|
237
|
+
const invoke = window.__TAURI__?.core?.invoke ?? window.__TAURI_INTERNALS__?.invoke
|
|
238
|
+
const trustedLoopback = (value) => /^http:\/\/127\.0\.0\.1:\d+\//.test(String(value || ''))
|
|
239
|
+
let pollTimer = 0
|
|
240
|
+
|
|
241
|
+
const renderStarting = (state) => {
|
|
242
|
+
document.body.dataset.phase = 'starting'
|
|
243
|
+
title.textContent = text.startingTitle
|
|
244
|
+
summary.textContent = state?.onDevice?.message || text.startingSummary
|
|
245
|
+
progress.hidden = false
|
|
246
|
+
status.hidden = true
|
|
247
|
+
retry.hidden = true
|
|
248
|
+
retry.disabled = false
|
|
249
|
+
remote.hidden = !state?.paired
|
|
250
|
+
actions.hidden = !state?.paired
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
const renderError = (state, fallback) => {
|
|
254
|
+
document.body.dataset.phase = 'error'
|
|
255
|
+
title.textContent = text.errorTitle
|
|
256
|
+
summary.textContent = text.errorSummary
|
|
257
|
+
progress.hidden = true
|
|
258
|
+
status.hidden = false
|
|
259
|
+
status.textContent = state?.startupError || state?.onDevice?.message || fallback
|
|
260
|
+
retry.hidden = false
|
|
261
|
+
retry.disabled = false
|
|
262
|
+
remote.hidden = !state?.paired
|
|
263
|
+
remote.disabled = false
|
|
264
|
+
actions.hidden = false
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
const loadState = async () => {
|
|
268
|
+
if (!invoke) {
|
|
269
|
+
renderError(null, text.bridge)
|
|
270
|
+
return
|
|
271
|
+
}
|
|
272
|
+
try {
|
|
273
|
+
const state = await invoke('mobile_state')
|
|
274
|
+
const failed = state?.startupError || state?.onDevice?.state === 'error'
|
|
275
|
+
if (failed) {
|
|
276
|
+
renderError(state, text.errorSummary)
|
|
277
|
+
return
|
|
278
|
+
}
|
|
279
|
+
renderStarting(state)
|
|
280
|
+
pollTimer = window.setTimeout(loadState, 300)
|
|
281
|
+
} catch (error) {
|
|
282
|
+
renderError(null, String(error?.message || error))
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
retry.addEventListener('click', async () => {
|
|
287
|
+
window.clearTimeout(pollTimer)
|
|
288
|
+
retry.disabled = true
|
|
289
|
+
remote.disabled = true
|
|
290
|
+
renderStarting()
|
|
291
|
+
summary.textContent = text.retrying
|
|
292
|
+
try {
|
|
293
|
+
await invoke('mobile_retry_local_startup')
|
|
294
|
+
} catch (error) {
|
|
295
|
+
renderError(null, String(error?.message || error))
|
|
296
|
+
}
|
|
297
|
+
})
|
|
298
|
+
|
|
299
|
+
remote.addEventListener('click', async () => {
|
|
300
|
+
window.clearTimeout(pollTimer)
|
|
301
|
+
retry.disabled = true
|
|
302
|
+
remote.disabled = true
|
|
303
|
+
try {
|
|
304
|
+
const state = await invoke('mobile_leave_local')
|
|
305
|
+
if (!trustedLoopback(state?.proxyUrl)) throw new Error(text.invalid)
|
|
306
|
+
window.location.replace(state.proxyUrl)
|
|
307
|
+
} catch (error) {
|
|
308
|
+
renderError(null, String(error?.message || error))
|
|
309
|
+
}
|
|
310
|
+
})
|
|
311
|
+
|
|
312
|
+
loadState()
|
|
313
|
+
})()
|
|
314
|
+
</script>
|
|
315
|
+
</body>
|
|
316
|
+
</html>
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
self.addEventListener('notificationclick', (event) => {
|
|
2
|
+
event.notification.close()
|
|
3
|
+
const targetUrl = new URL(event.notification.data?.url || '/', self.location.origin).href
|
|
4
|
+
event.waitUntil((async () => {
|
|
5
|
+
const windows = await self.clients.matchAll({ type: 'window', includeUncontrolled: true })
|
|
6
|
+
const existing = windows.find((client) => new URL(client.url).origin === self.location.origin)
|
|
7
|
+
if (existing) {
|
|
8
|
+
if ('navigate' in existing && existing.url !== targetUrl) await existing.navigate(targetUrl)
|
|
9
|
+
return existing.focus()
|
|
10
|
+
}
|
|
11
|
+
return self.clients.openWindow(targetUrl)
|
|
12
|
+
})())
|
|
13
|
+
})
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
:root {
|
|
2
|
+
color-scheme: light dark;
|
|
3
|
+
font-family: "Microsoft YaHei UI", "PingFang SC", system-ui, sans-serif;
|
|
4
|
+
background: transparent;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
* {
|
|
8
|
+
box-sizing: border-box;
|
|
9
|
+
user-select: none;
|
|
10
|
+
-webkit-user-select: none;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
html,
|
|
14
|
+
body {
|
|
15
|
+
width: 192px;
|
|
16
|
+
height: 288px;
|
|
17
|
+
margin: 0;
|
|
18
|
+
overflow: hidden;
|
|
19
|
+
background: transparent;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
body {
|
|
23
|
+
cursor: grab;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
body.dragging {
|
|
27
|
+
cursor: grabbing;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
#pet {
|
|
31
|
+
position: relative;
|
|
32
|
+
width: 192px;
|
|
33
|
+
height: 288px;
|
|
34
|
+
opacity: 0;
|
|
35
|
+
transition: opacity 120ms ease;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
#pet.visible {
|
|
39
|
+
opacity: var(--pet-opacity, 1);
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
#sprite {
|
|
43
|
+
position: absolute;
|
|
44
|
+
right: 0;
|
|
45
|
+
bottom: 0;
|
|
46
|
+
width: 192px;
|
|
47
|
+
height: 208px;
|
|
48
|
+
background-image: var(--pet-sprite-url);
|
|
49
|
+
background-repeat: no-repeat;
|
|
50
|
+
background-size: var(--pet-sheet-width) var(--pet-sheet-height);
|
|
51
|
+
background-position-y: calc(var(--pet-row) * -208px);
|
|
52
|
+
image-rendering: pixelated;
|
|
53
|
+
filter: drop-shadow(0 8px 9px rgb(0 0 0 / 0.2));
|
|
54
|
+
animation: pet-frames var(--pet-duration) steps(var(--pet-frames)) infinite;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
#bubble {
|
|
58
|
+
position: absolute;
|
|
59
|
+
top: 11px;
|
|
60
|
+
right: 8px;
|
|
61
|
+
z-index: 2;
|
|
62
|
+
max-width: 172px;
|
|
63
|
+
min-height: 32px;
|
|
64
|
+
padding: 7px 10px;
|
|
65
|
+
border: 1px solid rgb(120 120 130 / 0.24);
|
|
66
|
+
border-radius: 7px;
|
|
67
|
+
background: rgb(255 255 255 / 0.94);
|
|
68
|
+
color: #18181b;
|
|
69
|
+
font-size: 12px;
|
|
70
|
+
line-height: 1.35;
|
|
71
|
+
opacity: 0;
|
|
72
|
+
transform: translateY(3px);
|
|
73
|
+
transition:
|
|
74
|
+
opacity 140ms ease,
|
|
75
|
+
transform 140ms ease;
|
|
76
|
+
box-shadow: 0 5px 16px rgb(0 0 0 / 0.14);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
#bubble.visible {
|
|
80
|
+
opacity: 1;
|
|
81
|
+
transform: translateY(0);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
#bubble::after {
|
|
85
|
+
position: absolute;
|
|
86
|
+
right: 23px;
|
|
87
|
+
bottom: -6px;
|
|
88
|
+
width: 10px;
|
|
89
|
+
height: 10px;
|
|
90
|
+
border-right: 1px solid rgb(120 120 130 / 0.24);
|
|
91
|
+
border-bottom: 1px solid rgb(120 120 130 / 0.24);
|
|
92
|
+
background: inherit;
|
|
93
|
+
content: "";
|
|
94
|
+
transform: rotate(45deg);
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
@media (prefers-color-scheme: dark) {
|
|
98
|
+
#bubble {
|
|
99
|
+
border-color: rgb(255 255 255 / 0.14);
|
|
100
|
+
background: rgb(24 24 27 / 0.94);
|
|
101
|
+
color: #fafafa;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
#bubble::after {
|
|
105
|
+
border-color: rgb(255 255 255 / 0.14);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
@keyframes pet-frames {
|
|
110
|
+
from {
|
|
111
|
+
background-position-x: 0;
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
to {
|
|
115
|
+
background-position-x: calc(var(--pet-frames) * -192px);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
<!doctype html>
|
|
2
|
+
<html lang="zh-CN">
|
|
3
|
+
<head>
|
|
4
|
+
<meta charset="UTF-8" />
|
|
5
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
|
+
<title>Pisper Pet</title>
|
|
7
|
+
<link rel="stylesheet" href="/tauri-pet.css" />
|
|
8
|
+
</head>
|
|
9
|
+
<body>
|
|
10
|
+
<main id="pet" aria-label="Pisper Pet">
|
|
11
|
+
<div id="bubble" role="status"></div>
|
|
12
|
+
<div id="sprite" role="img"></div>
|
|
13
|
+
</main>
|
|
14
|
+
<script src="/tauri-pet.js"></script>
|
|
15
|
+
</body>
|
|
16
|
+
</html>
|
package/web/tauri-pet.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
(() => {
|
|
2
|
+
const STATES = {
|
|
3
|
+
idle: { row: 0, frames: 6, durationMs: 1100 },
|
|
4
|
+
waving: { row: 3, frames: 4, durationMs: 700 },
|
|
5
|
+
jumping: { row: 4, frames: 5, durationMs: 840 },
|
|
6
|
+
failed: { row: 5, frames: 8, durationMs: 1220 },
|
|
7
|
+
waiting: { row: 6, frames: 6, durationMs: 1010 },
|
|
8
|
+
running: { row: 7, frames: 6, durationMs: 820 },
|
|
9
|
+
review: { row: 8, frames: 6, durationMs: 1030 },
|
|
10
|
+
}
|
|
11
|
+
const BUBBLES = {
|
|
12
|
+
'zh-CN': {
|
|
13
|
+
review: '正在思考...',
|
|
14
|
+
running: '正在工作...',
|
|
15
|
+
waiting: '正在组织回复...',
|
|
16
|
+
waving: '完成了',
|
|
17
|
+
failed: '需要看一下',
|
|
18
|
+
jumping: '你好',
|
|
19
|
+
},
|
|
20
|
+
'en-US': {
|
|
21
|
+
review: 'Thinking...',
|
|
22
|
+
running: 'Working...',
|
|
23
|
+
waiting: 'Preparing a reply...',
|
|
24
|
+
waving: 'Done',
|
|
25
|
+
failed: 'Needs attention',
|
|
26
|
+
jumping: 'Hello',
|
|
27
|
+
},
|
|
28
|
+
}
|
|
29
|
+
const pet = document.querySelector('#pet')
|
|
30
|
+
const sprite = document.querySelector('#sprite')
|
|
31
|
+
const bubble = document.querySelector('#bubble')
|
|
32
|
+
let status = null
|
|
33
|
+
let interaction = ''
|
|
34
|
+
let interactionTimer = 0
|
|
35
|
+
|
|
36
|
+
const invoke = (command, args) => window.__TAURI_INTERNALS__?.invoke(command, args)
|
|
37
|
+
const language = () => localStorage.getItem('pisper-language') || 'zh-CN'
|
|
38
|
+
const stateName = () => (interaction && STATES[interaction] ? interaction : STATES[status?.state] ? status.state : 'idle')
|
|
39
|
+
|
|
40
|
+
function render() {
|
|
41
|
+
const running = Boolean(status?.running && status?.spriteUrl)
|
|
42
|
+
void invoke('desktop_pet_set_visible', { visible: running })
|
|
43
|
+
if (!running) {
|
|
44
|
+
pet.classList.remove('visible')
|
|
45
|
+
return
|
|
46
|
+
}
|
|
47
|
+
const name = stateName()
|
|
48
|
+
const animation = STATES[name]
|
|
49
|
+
const message = BUBBLES[language()]?.[name] || BUBBLES['zh-CN'][name] || ''
|
|
50
|
+
pet.style.setProperty('--pet-opacity', String(status.opacity ?? 1))
|
|
51
|
+
sprite.style.setProperty('--pet-sprite-url', `url("${status.spriteUrl}")`)
|
|
52
|
+
sprite.style.setProperty('--pet-sheet-width', `${status.sheetWidth || 1536}px`)
|
|
53
|
+
sprite.style.setProperty('--pet-sheet-height', `${status.sheetHeight || 1872}px`)
|
|
54
|
+
sprite.style.setProperty('--pet-row', String(animation.row))
|
|
55
|
+
sprite.style.setProperty('--pet-frames', String(animation.frames))
|
|
56
|
+
sprite.style.setProperty('--pet-duration', `${animation.durationMs}ms`)
|
|
57
|
+
bubble.textContent = message
|
|
58
|
+
bubble.classList.toggle('visible', Boolean(message))
|
|
59
|
+
pet.setAttribute('aria-label', status.selectedName || status.selectedSlug || 'Pisper Pet')
|
|
60
|
+
pet.classList.add('visible')
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
async function setEnabled(enabled) {
|
|
64
|
+
try {
|
|
65
|
+
const response = await fetch('/api/desktop-pet/enabled', {
|
|
66
|
+
method: 'POST',
|
|
67
|
+
headers: { 'content-type': 'application/json' },
|
|
68
|
+
body: JSON.stringify({ enabled }),
|
|
69
|
+
})
|
|
70
|
+
if (!response.ok) return
|
|
71
|
+
status = await response.json()
|
|
72
|
+
await invoke('desktop_pet_sync_menu', { enabled: Boolean(status?.enabled) })
|
|
73
|
+
await invoke('desktop_pet_apply_enabled', { enabled: Boolean(status?.running) })
|
|
74
|
+
render()
|
|
75
|
+
} catch {
|
|
76
|
+
// A failed preference update leaves the last durable desktop-pet state in place.
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
async function refresh() {
|
|
81
|
+
try {
|
|
82
|
+
const response = await fetch('/api/desktop-pet', { cache: 'no-store' })
|
|
83
|
+
if (!response.ok) return
|
|
84
|
+
status = await response.json()
|
|
85
|
+
await invoke('desktop_pet_sync_menu', { enabled: Boolean(status?.enabled) })
|
|
86
|
+
render()
|
|
87
|
+
} catch {
|
|
88
|
+
// The sidecar owns retry and lifecycle; a transient poll failure only hides stale state.
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
window.__PISPER_DESKTOP_PET_SET_ENABLED = (enabled) => void setEnabled(Boolean(enabled))
|
|
93
|
+
|
|
94
|
+
document.addEventListener('pointerdown', (event) => {
|
|
95
|
+
if (event.button !== 0) return
|
|
96
|
+
document.body.classList.add('dragging')
|
|
97
|
+
void invoke('desktop_pet_start_dragging')
|
|
98
|
+
})
|
|
99
|
+
document.addEventListener('pointerup', () => document.body.classList.remove('dragging'))
|
|
100
|
+
document.addEventListener('dblclick', () => void invoke('desktop_show_main_window'))
|
|
101
|
+
document.addEventListener('contextmenu', (event) => {
|
|
102
|
+
event.preventDefault()
|
|
103
|
+
void invoke('desktop_pet_show_context_menu')
|
|
104
|
+
})
|
|
105
|
+
document.addEventListener('click', () => {
|
|
106
|
+
interaction = 'jumping'
|
|
107
|
+
window.clearTimeout(interactionTimer)
|
|
108
|
+
interactionTimer = window.setTimeout(() => {
|
|
109
|
+
interaction = ''
|
|
110
|
+
render()
|
|
111
|
+
}, 900)
|
|
112
|
+
render()
|
|
113
|
+
})
|
|
114
|
+
|
|
115
|
+
void refresh()
|
|
116
|
+
window.setInterval(refresh, 1200)
|
|
117
|
+
})()
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVTa3p5NWdvVExsOExqMnNzdFVtL2kxc0YrVEdzZ1NlWTRGL3Nrb2hES1Z0S1VzODVTU0YvbTVZMmFJRmJmVDJhWEdFVjVVZkVWaG5DSTN2Znc3czlZRzJxSUJPUVgwdVFBPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3NzQ2MjU5CWZpbGU6UGlzcGVyX1J1bnRpbWVfTm9kZV8wLjUuMjBfbGludXhfeDg2XzY0LnRhci5negozODNycUQ1YzRJMkFvYU9kb2ZsREhFL2c2ZHR2L1BuTnN0clV0Q2FJcHBSZ3hZMW83UTdJOS8xaU9ONkpjdG94OEVMUTUvaGZqKzZkNGRMaVB4Y2REQT09Cg==
|
|
Binary file
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
dW50cnVzdGVkIGNvbW1lbnQ6IHNpZ25hdHVyZSBmcm9tIHRhdXJpIHNlY3JldCBrZXkKUlVTa3p5NWdvVExsOE02QkRyWlJhRVhmZG1ON1ZIdy9pd0t6N2g1R2VUTlByaTdXejNqWnl6ai9DajMvUTZMQkwvYk5wYkZITE5sMTVnRlJMUmtJY3d5blZXNjJ0czB6U0FJPQp0cnVzdGVkIGNvbW1lbnQ6IHRpbWVzdGFtcDoxNzg3NzA3Mzc4CWZpbGU6UGlzcGVyX1RVSV9Db21wb25lbnRfMC41LjEyX2xpbnV4X3g4Nl82NC50YXIuZ3oKUmxOd3piY1RZMFRxeXNjeEVkWlFoUVNLcUFNMEYvbHV3VmpTbWFnMGNPNlZFbjJFcTRXb2tTWGlNcDZmU0FGYWZLSkV5SCtqc1MyaC8yMGlkVkxHREE9PQo=
|