pisper 0.5.21 → 0.5.22-darwin-arm64.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (290) hide show
  1. package/README.md +46 -46
  2. package/components/runtime/Pisper_Runtime_Node_0.5.21_darwin_aarch64.tar.gz +0 -0
  3. package/components/runtime/Pisper_Runtime_Node_0.5.21_darwin_aarch64.tar.gz.sig +1 -0
  4. package/components/tui/Pisper_TUI_Component_0.5.12_darwin_aarch64.tar.gz +0 -0
  5. package/components/tui/Pisper_TUI_Component_0.5.12_darwin_aarch64.tar.gz.sig +1 -0
  6. package/package.json +14 -36
  7. package/README.en.md +0 -53
  8. package/bin/pisper.mjs +0 -48
  9. package/lib/install.mjs +0 -392
  10. package/lib/npm-platform.mjs +0 -41
  11. package/lib/npm-update.mjs +0 -165
  12. package/lib/platform.mjs +0 -43
  13. package/lib/postinstall.mjs +0 -3
  14. package/updater.pubkey +0 -1
  15. package/web/.vite/manifest.json +0 -2249
  16. package/web/assets/AnimatedContent-BiVNqD3m.js +0 -1
  17. package/web/assets/AnimatedList-CJTx-B8I.js +0 -1
  18. package/web/assets/AppOverlays-C_v-1VL6.js +0 -1
  19. package/web/assets/AppSelect-g6etLk2g.js +0 -1
  20. package/web/assets/AssetsPage-Dt5ST6Ej.js +0 -1
  21. package/web/assets/ChannelsPage-C9dO2yLN.js +0 -1
  22. package/web/assets/ChatHistoryPage-ZvSTAtXB.js +0 -1
  23. package/web/assets/ChatPage-BD3WkozH.js +0 -9
  24. package/web/assets/ClickSpark-BhxL8WOQ.js +0 -1
  25. package/web/assets/ConfigPage-ifZdPO01.js +0 -1
  26. package/web/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
  27. package/web/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
  28. package/web/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
  29. package/web/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
  30. package/web/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
  31. package/web/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
  32. package/web/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
  33. package/web/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
  34. package/web/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
  35. package/web/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
  36. package/web/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
  37. package/web/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
  38. package/web/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
  39. package/web/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
  40. package/web/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
  41. package/web/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
  42. package/web/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
  43. package/web/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
  44. package/web/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
  45. package/web/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
  46. package/web/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
  47. package/web/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
  48. package/web/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
  49. package/web/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
  50. package/web/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
  51. package/web/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
  52. package/web/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
  53. package/web/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
  54. package/web/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
  55. package/web/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
  56. package/web/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
  57. package/web/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
  58. package/web/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
  59. package/web/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
  60. package/web/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
  61. package/web/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
  62. package/web/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
  63. package/web/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
  64. package/web/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
  65. package/web/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
  66. package/web/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
  67. package/web/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
  68. package/web/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
  69. package/web/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
  70. package/web/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
  71. package/web/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
  72. package/web/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
  73. package/web/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
  74. package/web/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
  75. package/web/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
  76. package/web/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
  77. package/web/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
  78. package/web/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
  79. package/web/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
  80. package/web/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
  81. package/web/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
  82. package/web/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
  83. package/web/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
  84. package/web/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
  85. package/web/assets/MarkdownMessage-CMr3WuAI.js +0 -1
  86. package/web/assets/MemoryPage-D5Hjoc5p.js +0 -1
  87. package/web/assets/PageHeader-BKfO_vPe.js +0 -1
  88. package/web/assets/PluginsPage-DhkVJf05.js +0 -1
  89. package/web/assets/PreviewPages-mRjRmA0i.js +0 -1
  90. package/web/assets/SchedulesPage-DNe-Y6o5.js +0 -1
  91. package/web/assets/ShinyText-fuaKxKqJ.js +0 -1
  92. package/web/assets/SkillsPage-PguSYt8I.js +0 -1
  93. package/web/assets/StarOrbit-BlI6MhVr.js +0 -1
  94. package/web/assets/TerminalPanel-BrP-ENHg.css +0 -1
  95. package/web/assets/TerminalPanel-DrnfpA8m.js +0 -18
  96. package/web/assets/Threads-DskDSsK6.js +0 -1
  97. package/web/assets/WelcomeEffects-Bf8Z6qHU.js +0 -1
  98. package/web/assets/WorkflowsPage-C6sGl2oG.js +0 -1
  99. package/web/assets/WorkspacePicker-Cu2Z5jid.js +0 -1
  100. package/web/assets/alert-B7D8joCd.js +0 -1
  101. package/web/assets/alert-dialog-D5F_JQyX.js +0 -1
  102. package/web/assets/andromeeda-vGVdxbeo.js +0 -1
  103. package/web/assets/angular-html-17rlCfBS.js +0 -1
  104. package/web/assets/angular-ts-it3MaXWH.js +0 -1
  105. package/web/assets/astro-BEVDzCov.js +0 -1
  106. package/web/assets/aurora-x-CDeNXAV0.js +0 -1
  107. package/web/assets/ayu-dark-DluEY0Gj.js +0 -1
  108. package/web/assets/ayu-light-C3h-C4tm.js +0 -1
  109. package/web/assets/ayu-mirage-Bqwy1Gya.js +0 -1
  110. package/web/assets/blade-B3yUZIOx.js +0 -1
  111. package/web/assets/brand-CFOXmGdd.js +0 -1
  112. package/web/assets/button-DzlQCSNK.js +0 -1
  113. package/web/assets/c-aGSZMVdM.js +0 -1
  114. package/web/assets/catppuccin-frappe-C9Q5zVZY.js +0 -1
  115. package/web/assets/catppuccin-latte-CtsyrtPq.js +0 -1
  116. package/web/assets/catppuccin-macchiato-R8nAf1vR.js +0 -1
  117. package/web/assets/catppuccin-mocha-DjuaAJKi.js +0 -1
  118. package/web/assets/chevron-down-DXmj1gMQ.js +0 -1
  119. package/web/assets/circle-dot-CbGG7s_7.js +0 -1
  120. package/web/assets/coffee-ouOQ86EC.js +0 -1
  121. package/web/assets/copy-DO0sQBgx.js +0 -1
  122. package/web/assets/cpp-Bm3vm43L.js +0 -1
  123. package/web/assets/css-CWcS1xXm.js +0 -1
  124. package/web/assets/csv-Dx-8-gkx.js +0 -1
  125. package/web/assets/dark-plus-Cs2F2srj.js +0 -1
  126. package/web/assets/dist-BaCXUSxG.js +0 -1
  127. package/web/assets/dist-Bv5OI2pf.js +0 -1
  128. package/web/assets/dracula-BHWKrbxM.js +0 -1
  129. package/web/assets/dracula-soft-5eyTD99u.js +0 -1
  130. package/web/assets/earth-D-KiHvdO.js +0 -1
  131. package/web/assets/es2015-CfKlxLgF.js +0 -41
  132. package/web/assets/everforest-dark-sB-x3p7T.js +0 -1
  133. package/web/assets/everforest-light-Df2xbC6M.js +0 -1
  134. package/web/assets/field-CCo2X7MX.js +0 -1
  135. package/web/assets/file-B6GksU4A.js +0 -1
  136. package/web/assets/file-code-corner-3gopYCm4.js +0 -1
  137. package/web/assets/geist-cyrillic-ext-wght-normal-DjL33-gN.woff2 +0 -0
  138. package/web/assets/geist-cyrillic-wght-normal-BEAKL7Jp.woff2 +0 -0
  139. package/web/assets/geist-latin-ext-wght-normal-DC-KSUi6.woff2 +0 -0
  140. package/web/assets/geist-latin-wght-normal-BgDaEnEv.woff2 +0 -0
  141. package/web/assets/geist-vietnamese-wght-normal-6IgcOCM7.woff2 +0 -0
  142. package/web/assets/github-dark-C-LZuMrd.js +0 -1
  143. package/web/assets/github-dark-default-DXG-b-1a.js +0 -1
  144. package/web/assets/github-dark-dimmed-Bx1FflLF.js +0 -1
  145. package/web/assets/github-dark-high-contrast-B_tTalzw.js +0 -1
  146. package/web/assets/github-light-EUqPIrTm.js +0 -1
  147. package/web/assets/github-light-default-BXViO-2h.js +0 -1
  148. package/web/assets/github-light-high-contrast-B68TUdTA.js +0 -1
  149. package/web/assets/glsl-TOBAB6bO.js +0 -1
  150. package/web/assets/graphql-BEmIBNve.js +0 -1
  151. package/web/assets/gruvbox-dark-hard-C820rvS2.js +0 -1
  152. package/web/assets/gruvbox-dark-medium-BPjhmG05.js +0 -1
  153. package/web/assets/gruvbox-dark-soft-MrdJrrXF.js +0 -1
  154. package/web/assets/gruvbox-light-hard-BC_s9l72.js +0 -1
  155. package/web/assets/gruvbox-light-medium-BAWPOn9u.js +0 -1
  156. package/web/assets/gruvbox-light-soft-BSMLrYjP.js +0 -1
  157. package/web/assets/haml-CDWtFtU9.js +0 -1
  158. package/web/assets/handlebars-BNtjo3pL.js +0 -1
  159. package/web/assets/horizon-CE9ld1lL.js +0 -1
  160. package/web/assets/horizon-bright-DSNQnXHK.js +0 -1
  161. package/web/assets/houston-CsvMBhTu.js +0 -1
  162. package/web/assets/html-BVyvp26C.js +0 -1
  163. package/web/assets/html-derivative-BseLpURQ.js +0 -1
  164. package/web/assets/http-CkCfSMV9.js +0 -1
  165. package/web/assets/hurl-syYMt6Rn.js +0 -1
  166. package/web/assets/image-Bu_a9jz0.js +0 -1
  167. package/web/assets/imba-DsUTQ-LC.js +0 -1
  168. package/web/assets/index-BIQcwjFR.js +0 -41
  169. package/web/assets/index-Btu6aNk7.css +0 -2
  170. package/web/assets/java-duG_UTKe.js +0 -1
  171. package/web/assets/javascript-DWVbOe4X.js +0 -1
  172. package/web/assets/jinja-Boj4niAz.js +0 -1
  173. package/web/assets/jison-CHwnC1Pv.js +0 -1
  174. package/web/assets/json-qhed-kSA.js +0 -1
  175. package/web/assets/json5-BR5RXkoi.js +0 -1
  176. package/web/assets/jsonc-CYpm1nAK.js +0 -1
  177. package/web/assets/jsonl-CmCQp5Yx.js +0 -1
  178. package/web/assets/jsx-fcCEM_-L.js +0 -1
  179. package/web/assets/julia-VoF7UKfw.js +0 -1
  180. package/web/assets/kanagawa-dragon-Bozd7klA.js +0 -1
  181. package/web/assets/kanagawa-lotus-BmuOG9ZW.js +0 -1
  182. package/web/assets/kanagawa-wave-BML5mF2J.js +0 -1
  183. package/web/assets/laserwave-C_8bwKvT.js +0 -1
  184. package/web/assets/less-DVTAwKKz.js +0 -1
  185. package/web/assets/light-plus-DVQuIRkW.js +0 -1
  186. package/web/assets/link-2-SOWAopyR.js +0 -1
  187. package/web/assets/loader-circle-i0WYlBWu.js +0 -1
  188. package/web/assets/markdown-BYOwaDjH.js +0 -1
  189. package/web/assets/marko-Cupn1xhw.js +0 -1
  190. package/web/assets/material-theme-Bm3Qr25_.js +0 -1
  191. package/web/assets/material-theme-darker-2IIEA8gg.js +0 -1
  192. package/web/assets/material-theme-lighter-uhdI0v04.js +0 -1
  193. package/web/assets/material-theme-ocean-CHQ94UKr.js +0 -1
  194. package/web/assets/material-theme-palenight-B5W6OYN7.js +0 -1
  195. package/web/assets/mdc-4FfK5iWR.js +0 -1
  196. package/web/assets/mdx-DQZ5AkYe.js +0 -1
  197. package/web/assets/message-circle-C3tSGsW0.js +0 -1
  198. package/web/assets/min-dark-BSWPekZh.js +0 -1
  199. package/web/assets/min-light-DDpmG2fV.js +0 -1
  200. package/web/assets/monokai-B_bV9PQ9.js +0 -1
  201. package/web/assets/network-zt1ahOiz.js +0 -1
  202. package/web/assets/night-owl-DhmEMT88.js +0 -1
  203. package/web/assets/night-owl-light-eJ-hLW7d.js +0 -1
  204. package/web/assets/nord-Cb4Vim4T.js +0 -1
  205. package/web/assets/one-dark-pro-CLwyXe_n.js +0 -1
  206. package/web/assets/one-light-D7Lr4KcI.js +0 -1
  207. package/web/assets/panel-top-DYcS-wiY.js +0 -1
  208. package/web/assets/paperclip-t0nP1kBQ.js +0 -1
  209. package/web/assets/pencil-BOb7CieI.js +0 -1
  210. package/web/assets/php-CUREQQ7f.js +0 -1
  211. package/web/assets/pick-system-directory-BnIFt85A.js +0 -1
  212. package/web/assets/plastic-DQwYfKfQ.js +0 -1
  213. package/web/assets/play-V5zloi0R.js +0 -1
  214. package/web/assets/poimandres-DRFjx7u4.js +0 -1
  215. package/web/assets/postcss-BXeXVLqQ.js +0 -1
  216. package/web/assets/progress-DWkHIRCG.js +0 -6
  217. package/web/assets/pug-CQyGKZpv.js +0 -1
  218. package/web/assets/python-gzcpVVnB.js +0 -1
  219. package/web/assets/r-C5FwQflr.js +0 -1
  220. package/web/assets/react-bits-DQli9s7O.css +0 -1
  221. package/web/assets/red-DX1BQOs8.js +0 -1
  222. package/web/assets/regexp--aR2_iz7.js +0 -1
  223. package/web/assets/rolldown-runtime-B0Z9INg1.js +0 -1
  224. package/web/assets/rose-pine-aMsaMD1D.js +0 -1
  225. package/web/assets/rose-pine-dawn-8PwUyIlP.js +0 -1
  226. package/web/assets/rose-pine-moon-DO-qXg-I.js +0 -1
  227. package/web/assets/sass-DXrisJhu.js +0 -1
  228. package/web/assets/save-CTsP04bb.js +0 -1
  229. package/web/assets/scss-Davl4E3T.js +0 -1
  230. package/web/assets/search-Chj7BjSz.js +0 -1
  231. package/web/assets/shellscript-CLZ0U2zV.js +0 -1
  232. package/web/assets/shield-check-By9gGYwr.js +0 -1
  233. package/web/assets/slack-dark-DnToyrRv.js +0 -1
  234. package/web/assets/slack-ochin-B2OO5cIa.js +0 -1
  235. package/web/assets/smithy-Dgaz7aur.js +0 -1
  236. package/web/assets/snazzy-light-4G7pJPwS.js +0 -1
  237. package/web/assets/solarized-dark-UdsmMDCL.js +0 -1
  238. package/web/assets/solarized-light-C1IUL_tW.js +0 -1
  239. package/web/assets/sql-b92rrcVl.js +0 -1
  240. package/web/assets/square-DQQwOv3-.js +0 -1
  241. package/web/assets/square-terminal-ByK0g_OZ.js +0 -1
  242. package/web/assets/stylus-B6D30XZt.js +0 -1
  243. package/web/assets/sun-CiCuEpCg.js +0 -1
  244. package/web/assets/svelte-BfstjgUc.js +0 -1
  245. package/web/assets/synthwave-84-nFMaYfgc.js +0 -1
  246. package/web/assets/tag-B0fT5ThM.js +0 -1
  247. package/web/assets/tokyo-night-oM2G3aXe.js +0 -1
  248. package/web/assets/trash-2-2GzVxk5J.js +0 -1
  249. package/web/assets/ts-tags-Cckpt1jI.js +0 -1
  250. package/web/assets/tsx-JMDX3aQ7.js +0 -1
  251. package/web/assets/typescript-BAz-bF8J.js +0 -1
  252. package/web/assets/use-i18n-DmLwOjO5.js +0 -1
  253. package/web/assets/usePagePrimaryAction-Bw0OFTDZ.js +0 -1
  254. package/web/assets/utils-C8uzG5AZ.js +0 -1
  255. package/web/assets/vendor-dockview-D5adAaCg.css +0 -1
  256. package/web/assets/vendor-dockview-yY5mBM3U.js +0 -1
  257. package/web/assets/vendor-markdown-CWK5AVhB.js +0 -130
  258. package/web/assets/vendor-markdown-plugins-DCl4I7Pz.js +0 -263
  259. package/web/assets/vendor-motion-XxgxfZSY.js +0 -9
  260. package/web/assets/vendor-react-CHuvPdJE.js +0 -9
  261. package/web/assets/vendor-router-Bw2aAdMs.js +0 -4
  262. package/web/assets/vendor-shiki-runtime-CxE5QolQ.js +0 -153
  263. package/web/assets/vendor-state-DE1O_s6m.js +0 -1
  264. package/web/assets/vendor-ui-DvrYggeS.js +0 -1
  265. package/web/assets/vendor-xyflow-CnjXtcyK.js +0 -7
  266. package/web/assets/vendor-xyflow-DLioOiRN.css +0 -1
  267. package/web/assets/vesper-DdrHHSXu.js +0 -1
  268. package/web/assets/vitesse-black-fwtXNY1n.js +0 -1
  269. package/web/assets/vitesse-dark-BZCL-v6S.js +0 -1
  270. package/web/assets/vitesse-light-VbXTXTou.js +0 -1
  271. package/web/assets/vue-3H7P6ncC.js +0 -1
  272. package/web/assets/vue-html-DZGW9MGR.js +0 -1
  273. package/web/assets/vue-vine-BECt67gq.js +0 -1
  274. package/web/assets/wasm-BnjxR4X6.js +0 -1
  275. package/web/assets/wasm-ByWQv1Qj.js +0 -1
  276. package/web/assets/wgsl-BsKzXJz4.js +0 -1
  277. package/web/assets/wit-DdvCle-K.js +0 -1
  278. package/web/assets/wrench-DkHcVlxK.js +0 -1
  279. package/web/assets/xml-CNfvW5JP.js +0 -1
  280. package/web/assets/yaml-rwi0_p6S.js +0 -1
  281. package/web/assets/zap-CRNpJWAy.js +0 -1
  282. package/web/favicon.svg +0 -25
  283. package/web/icons.svg +0 -24
  284. package/web/index.html +0 -72
  285. package/web/memory-galaxy-background.webp +0 -0
  286. package/web/mobile-startup.html +0 -316
  287. package/web/notification-sw.js +0 -13
  288. package/web/tauri-pet.css +0 -117
  289. package/web/tauri-pet.html +0 -16
  290. package/web/tauri-pet.js +0 -117
@@ -1,316 +0,0 @@
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>
@@ -1,13 +0,0 @@
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
- })
package/web/tauri-pet.css DELETED
@@ -1,117 +0,0 @@
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
- }
@@ -1,16 +0,0 @@
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 DELETED
@@ -1,117 +0,0 @@
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
- })()