luckytri 1.0.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 (235) hide show
  1. package/.github/SECURITY.md +71 -0
  2. package/LICENSE +21 -0
  3. package/README.en.md +250 -0
  4. package/README.md +250 -0
  5. package/bin/luckytri.js +107 -0
  6. package/docs/brand/banner.png +0 -0
  7. package/docs/brand/palette.png +0 -0
  8. package/docs/brand/portrait.png +0 -0
  9. package/docs/en/CHANGELOG.md +113 -0
  10. package/docs/en/architecture.md +152 -0
  11. package/docs/en/chat-style.md +62 -0
  12. package/docs/en/connect.md +63 -0
  13. package/docs/en/guide.md +216 -0
  14. package/docs/en/her-life.md +189 -0
  15. package/docs/en/npm-release.md +25 -0
  16. package/docs/en/plugins.md +82 -0
  17. package/docs/en/recovery.md +28 -0
  18. package/docs/en/time.md +71 -0
  19. package/docs/en/webui.md +73 -0
  20. package/docs/zh/CHANGELOG.md +113 -0
  21. package/docs/zh/architecture.md +152 -0
  22. package/docs/zh/chat-style.md +62 -0
  23. package/docs/zh/connect.md +63 -0
  24. package/docs/zh/guide.md +216 -0
  25. package/docs/zh/her-life.md +189 -0
  26. package/docs/zh/npm-release.md +33 -0
  27. package/docs/zh/plugins.md +82 -0
  28. package/docs/zh/recovery.md +28 -0
  29. package/docs/zh/time.md +71 -0
  30. package/docs/zh/webui.md +73 -0
  31. package/package.json +108 -0
  32. package/plugins/sdk/index.d.ts +155 -0
  33. package/plugins/sdk/testing.js +58 -0
  34. package/plugins/weather/index.js +82 -0
  35. package/plugins/weather/luckytri-plugin.json +29 -0
  36. package/public/app/assets/ChatsPage-C-FcRapR.js +3 -0
  37. package/public/app/assets/ChatsPage-DfyPCS9N.css +1 -0
  38. package/public/app/assets/Empty-CpP5kQHH.js +2 -0
  39. package/public/app/assets/Empty-DmUB2-Bk.css +1 -0
  40. package/public/app/assets/Field-D4gY-INU.js +1 -0
  41. package/public/app/assets/HeartPage-Bft9wZp5.css +1 -0
  42. package/public/app/assets/HeartPage-CPy_thQd.js +1 -0
  43. package/public/app/assets/LifePage-BUi5euBF.css +1 -0
  44. package/public/app/assets/LifePage-CxWvwmSf.js +1 -0
  45. package/public/app/assets/MemoryPage-DC4rhQ68.js +1 -0
  46. package/public/app/assets/MemoryPage-cZvXfkXb.css +1 -0
  47. package/public/app/assets/NaturePage-CTXHCE2D.css +1 -0
  48. package/public/app/assets/NaturePage-IvYw04Zq.js +3 -0
  49. package/public/app/assets/PeoplePage-BmUxkrOU.css +1 -0
  50. package/public/app/assets/PeoplePage-Cqefm9-q.js +1 -0
  51. package/public/app/assets/PluginsPage-DKSaKvXb.js +2 -0
  52. package/public/app/assets/PluginsPage-HyBe5D8w.css +1 -0
  53. package/public/app/assets/SystemPage-CAMPoYqM.css +1 -0
  54. package/public/app/assets/SystemPage-CJmtJkrK.js +1 -0
  55. package/public/app/assets/TimePage-BOms_n4I.css +1 -0
  56. package/public/app/assets/TimePage-Cw44inM4.js +3 -0
  57. package/public/app/assets/formatters-ZmW_xFHw.js +1 -0
  58. package/public/app/assets/index-BheRW-1t.js +4 -0
  59. package/public/app/assets/index-YDz1ree1.css +1 -0
  60. package/public/app/assets/knowledge-DG0e0uKw.js +1 -0
  61. package/public/app/assets/liquid-garden-IMoHBwzc.png +0 -0
  62. package/public/app/assets/luckytri-home-95QKeMtc.png +0 -0
  63. package/public/app/assets/media-BzPDBm7e.js +1 -0
  64. package/public/app/index.html +27 -0
  65. package/public/guide.en.html +1053 -0
  66. package/public/guide.html +893 -0
  67. package/public/plugin-kit/v1/bridge.js +30 -0
  68. package/public/plugin-kit/v1/kit.css +14 -0
  69. package/public/tutorial.en.md +214 -0
  70. package/public/tutorial.md +214 -0
  71. package/scripts/backup.js +311 -0
  72. package/scripts/browser.js +41 -0
  73. package/scripts/launch.js +94 -0
  74. package/scripts/plugin.js +150 -0
  75. package/scripts/proxy-config.js +167 -0
  76. package/scripts/recover.js +26 -0
  77. package/scripts/runtime.js +25 -0
  78. package/scripts/service.js +47 -0
  79. package/scripts/setup.js +50 -0
  80. package/scripts/start-server.js +41 -0
  81. package/scripts/stop.js +36 -0
  82. package/server/app.js +96 -0
  83. package/server/channels/adapters.js +27 -0
  84. package/server/channels/contract.js +57 -0
  85. package/server/channels/hub.js +165 -0
  86. package/server/channels/index.js +25 -0
  87. package/server/channels/onebot/adapter.js +288 -0
  88. package/server/channels/onebot/index.js +336 -0
  89. package/server/channels/onebot/token.js +3 -0
  90. package/server/channels/qqbot/adapter.js +253 -0
  91. package/server/channels/qqbot/api.js +199 -0
  92. package/server/channels/qqbot/credentials.js +11 -0
  93. package/server/channels/qqbot/gateway.js +274 -0
  94. package/server/channels/qqbot/index.js +389 -0
  95. package/server/channels/segments.js +40 -0
  96. package/server/channels/session-key.js +153 -0
  97. package/server/channels/state.js +42 -0
  98. package/server/core/api.js +564 -0
  99. package/server/core/capabilities.js +208 -0
  100. package/server/core/context-builder.js +288 -0
  101. package/server/core/context-compactor.js +454 -0
  102. package/server/core/conversation-cues.js +325 -0
  103. package/server/core/conversation-manager.js +87 -0
  104. package/server/core/events.js +60 -0
  105. package/server/core/feedback.js +8 -0
  106. package/server/core/group-style.js +72 -0
  107. package/server/core/image-preprocessor.js +208 -0
  108. package/server/core/initiative-context.js +66 -0
  109. package/server/core/input-budget.js +32 -0
  110. package/server/core/local-demo.js +98 -0
  111. package/server/core/message-manager.js +118 -0
  112. package/server/core/message-scheduler.js +78 -0
  113. package/server/core/model-json.js +190 -0
  114. package/server/core/model-manager.js +1213 -0
  115. package/server/core/model-presets.js +900 -0
  116. package/server/core/name-call.js +29 -0
  117. package/server/core/net-guard.js +49 -0
  118. package/server/core/network.js +157 -0
  119. package/server/core/orchestrator.js +569 -0
  120. package/server/core/perceivers.js +91 -0
  121. package/server/core/person-name.js +22 -0
  122. package/server/core/persona-manager.js +243 -0
  123. package/server/core/reply-delivery.js +393 -0
  124. package/server/core/reply-target-resolver.js +50 -0
  125. package/server/core/repository.js +293 -0
  126. package/server/core/response-generator.js +50 -0
  127. package/server/core/response-validator.js +508 -0
  128. package/server/core/retired-prompts.js +51 -0
  129. package/server/core/sessions.js +109 -0
  130. package/server/core/speaker-names.js +92 -0
  131. package/server/core/topic-tracker.js +65 -0
  132. package/server/core/turn-processor.js +630 -0
  133. package/server/core/turn.js +236 -0
  134. package/server/core/vision-manager.js +633 -0
  135. package/server/http.js +18 -0
  136. package/server/i18n/decisions.js +206 -0
  137. package/server/i18n/errors.js +497 -0
  138. package/server/i18n/index.js +144 -0
  139. package/server/i18n/labels.js +653 -0
  140. package/server/i18n/models.js +111 -0
  141. package/server/index.js +102 -0
  142. package/server/knowledge/api.js +342 -0
  143. package/server/knowledge/embedding-profile.js +114 -0
  144. package/server/knowledge/index.js +13 -0
  145. package/server/knowledge/manager.js +386 -0
  146. package/server/knowledge/retrieval.js +93 -0
  147. package/server/knowledge/schema.js +154 -0
  148. package/server/knowledge/vector-index.js +90 -0
  149. package/server/mind/affect.js +265 -0
  150. package/server/mind/anticipations.js +507 -0
  151. package/server/mind/api.js +703 -0
  152. package/server/mind/attention.js +200 -0
  153. package/server/mind/bonds.js +558 -0
  154. package/server/mind/budget.js +152 -0
  155. package/server/mind/clock.js +83 -0
  156. package/server/mind/context-selection.js +61 -0
  157. package/server/mind/continuity.js +562 -0
  158. package/server/mind/conversation-origin.js +175 -0
  159. package/server/mind/day-planner.js +324 -0
  160. package/server/mind/days.js +210 -0
  161. package/server/mind/evidence-read.js +45 -0
  162. package/server/mind/evidence.js +148 -0
  163. package/server/mind/faces.js +138 -0
  164. package/server/mind/guard.js +60 -0
  165. package/server/mind/index.js +445 -0
  166. package/server/mind/initiative.js +333 -0
  167. package/server/mind/life/activities.js +21 -0
  168. package/server/mind/life/context.js +309 -0
  169. package/server/mind/life/diary.js +786 -0
  170. package/server/mind/life/growth.js +252 -0
  171. package/server/mind/life/index.js +1049 -0
  172. package/server/mind/life/presence.js +305 -0
  173. package/server/mind/meetings.js +1069 -0
  174. package/server/mind/memory-policy.js +48 -0
  175. package/server/mind/memory.js +888 -0
  176. package/server/mind/nature.js +262 -0
  177. package/server/mind/novelty.js +19 -0
  178. package/server/mind/observations.js +84 -0
  179. package/server/mind/own-day.js +324 -0
  180. package/server/mind/own-voice.js +318 -0
  181. package/server/mind/periods.js +118 -0
  182. package/server/mind/reading.js +120 -0
  183. package/server/mind/salience.js +201 -0
  184. package/server/mind/schema.js +562 -0
  185. package/server/mind/self.js +484 -0
  186. package/server/mind/senses.js +53 -0
  187. package/server/mind/thoughts.js +274 -0
  188. package/server/mind/time/activity-clock.js +196 -0
  189. package/server/mind/time/agenda.js +242 -0
  190. package/server/mind/time/api.js +200 -0
  191. package/server/mind/time/attention.js +34 -0
  192. package/server/mind/time/availability.js +69 -0
  193. package/server/mind/time/commitment-review.js +198 -0
  194. package/server/mind/time/delivery-links.js +130 -0
  195. package/server/mind/time/executor.js +512 -0
  196. package/server/mind/time/experiences.js +128 -0
  197. package/server/mind/time/games.js +562 -0
  198. package/server/mind/time/index.js +739 -0
  199. package/server/mind/time/intent.js +166 -0
  200. package/server/mind/time/kinds.js +171 -0
  201. package/server/mind/time/model-material.js +77 -0
  202. package/server/mind/time/plugin-activity.js +207 -0
  203. package/server/mind/time/presentation.js +51 -0
  204. package/server/mind/time/schedule.js +83 -0
  205. package/server/mind/time/schema.js +84 -0
  206. package/server/mind/time/search.js +383 -0
  207. package/server/mind/time/sharing.js +472 -0
  208. package/server/mind/time/task-links.js +311 -0
  209. package/server/mind/time/tasks.js +587 -0
  210. package/server/mind/time/works.js +432 -0
  211. package/server/mind/traits.js +191 -0
  212. package/server/mind/util.js +110 -0
  213. package/server/mind/view.js +273 -0
  214. package/server/paths.js +102 -0
  215. package/server/plugins/api.js +204 -0
  216. package/server/plugins/host.js +967 -0
  217. package/server/plugins/install.js +295 -0
  218. package/server/plugins/manifest.js +201 -0
  219. package/server/plugins/permissions.js +42 -0
  220. package/server/plugins/runner/guard.mjs +36 -0
  221. package/server/plugins/runner/worker.mjs +250 -0
  222. package/server/plugins/schema.js +91 -0
  223. package/server/plugins/zip.js +112 -0
  224. package/server/startup-lock.js +118 -0
  225. package/server/storage/archive.js +241 -0
  226. package/server/storage/backup-cleanup-worker.js +8 -0
  227. package/server/storage/backup-cleanup.js +414 -0
  228. package/server/storage/backup-lock.js +76 -0
  229. package/server/storage/backup-scheduler.js +131 -0
  230. package/server/storage/store.js +199 -0
  231. package/server/studio/display-names.js +138 -0
  232. package/server/studio/management.js +102 -0
  233. package/server/studio/readiness.js +190 -0
  234. package/server/studio/settings.js +236 -0
  235. package/server/version.js +10 -0
@@ -0,0 +1 @@
1
+ import{$ as e,B as t,D as n,H as r,I as i,K as a,L as o,M as s,P as c,T as l,U as u,V as d,W as f,X as p,Y as m,_t as h,a as g,at as _,ct as v,dt as y,f as b,ft as x,gt as S,i as C,it as w,k as T,lt as E,m as D,mt as O,n as k,nt as A,o as j,p as M,pt as N,q as P,rt as F,s as I,t as L,tt as R,v as z,vt as B,w as V,y as H,yt as U}from"./Empty-CpP5kQHH.js";import{c as W,f as ee,l as G,n as te,o as ne}from"./index-BheRW-1t.js";var K={class:`connect`},re={class:`card connection`},ie={class:`card-head`},q={class:`eyebrow`},ae={class:`pill`},oe={key:0,class:`notice`,role:`note`},J={class:`muted`},se={class:`connection-details`},ce={class:`detail`},Y={class:`detail`},X={class:`instructions`},le={class:`muted note`},ue={key:0,class:`row`},de=[`disabled`],fe={class:`muted`},pe=[`disabled`,`placeholder`],Z={key:0,class:`faint`},me=[`disabled`,`placeholder`],he={key:0,class:`faint`},Q={class:`row`},$=[`disabled`],ge={key:0,class:`faint`},_e={key:0,class:`connection-details`},ve={class:`detail`},ye={"data-state":``},be={key:0,class:`detail`},xe={class:`warn-text`},Se={key:1,class:`detail`},Ce={class:`detail`},we={class:`detail`},Te={key:1,class:`notice`,role:`note`},Ee={class:`instructions`},De={class:`muted notes`},Oe={class:`card checklist`},ke={class:`card-head`},Ae={class:`eyebrow`},je={class:`chip`},Me={class:`checks`},Ne={class:`mark`,"aria-hidden":`true`},Pe={class:`muted`},Fe=[`data-fix`,`onClick`],Ie=k(m({__name:`ConnectQQ`,emits:[`open`],setup(e,{emit:r}){let s=r,l=t(()=>I.health.connection||{}),p=t(()=>l.value.channel===`qqbot`?`qqbot`:`onebot`),m=t(()=>!!l.value.locked),_=t(()=>!!l.value.online),v=t(()=>l.value.onebot||{}),y=t(()=>l.value.qqbot||{}),b=t(()=>String(I.health.settings.qqbotAppId||``)),k=t(()=>!!I.health.settings.hasQqbotSecret),j=O(p.value);E(p,e=>j.value=e);let M=t(()=>`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/onebot/v11/ws`),L=t(()=>[{key:`onebot`,label:T(`OneBot 11`),count:p.value===`onebot`?T(`使用中`):``},{key:`qqbot`,label:T(`QQ 官方机器人`),count:p.value===`qqbot`?T(`使用中`):``}]),R=N({appId:b.value,secret:``}),B=O(!1),W=t(()=>R.appId.trim()!==b.value||!!R.secret.trim());E(W,e=>{I.dirty=e}),E(b,e=>{W.value||(R.appId=e)}),A(()=>{I.dirty=!1});let ee=t(()=>!!R.appId.trim()&&(k.value||!!R.secret.trim())),ne=n({idle:V(`未启用`),unconfigured:V(`尚未填写 AppID 与 AppSecret`),connecting:V(`正在连接开放平台`),ready:V(`已连接`),closed:V(`连接已断开,正在重连`),error:V(`连接出错`)}),Ie=n({all:V(`全部群消息`),mentions:V(`只有 @ 她的消息`),unknown:V(`尚未收到群消息`)}),Le=t(()=>ne[y.value.state||`idle`]??ne.idle),Re=t(()=>Ie[y.value.groupMessages||`unknown`]??Ie.unknown),ze=t(()=>p.value===`qqbot`&&y.value.groupMessages===`mentions`);async function Be(e){if(B.value||m.value||e===p.value)return;let t=T(e===`qqbot`?`QQ 官方机器人`:`OneBot 11`);if(!_.value||await H(T(`切换后会断开当前连接。原来方式下的会话仍可查看,但不能再向它们发送消息。`),{title:T(`切换连接方式`),confirmText:T(`切换`),cancelText:T(`先不切换`)})){B.value=!0;try{await D(`/settings`,`PATCH`,{channel:e}),await g(),z(T(`已切换为 {name}`,{name:t}))}catch(e){z(e.message,!0)}finally{B.value=!1}}}async function Ve(){if(!B.value){if(!ee.value){z(T(`请填写 AppID 和 AppSecret`),!0);return}B.value=!0;try{let e={qqbotAppId:R.appId.trim()};R.secret.trim()&&(e.qqbotSecret=R.secret.trim()),p.value!==`qqbot`&&!m.value&&(e.channel=`qqbot`),await D(`/settings`,`PATCH`,e),R.secret=``,await g(),z(T(`已保存`))}catch(e){z(e.message,!0)}finally{B.value=!1}}}let He={token:[``,`connect`],credentials:[``,`connect`],qq:[``,`connect`],model:[``,`models`],mode:[``,`runtime`],session:[`chats`,``],persona:[`nature`,``]};function Ue(e){let[t,n]=He[e]||[``,`connect`];t?C(t):s(`open`,n)}return(e,t)=>(F(),f(`div`,K,[d(`section`,re,[d(`div`,ie,[d(`div`,null,[d(`span`,q,U(S(T)(`QQ`)),1),d(`h2`,null,U(S(T)(`连接 QQ`)),1),d(`p`,null,U(S(T)(`两种连接方式二选一,同一时间只使用一种。她的记忆、心情和行为完全一致,区别只在消息怎么到达。`)),1)]),d(`span`,ae,[d(`span`,{class:h([`dot`,{off:!_.value}])},null,2),a(` `+U(_.value?S(T)(`QQ 已连接`):S(T)(`等待连接`)),1)])]),P(te,{modelValue:j.value,"onUpdate:modelValue":t[0]||=e=>j.value=e,label:S(T)(`连接方式`),items:L.value},null,8,[`modelValue`,`label`,`items`]),m.value?(F(),f(`p`,oe,U(S(T)(`连接方式由环境变量 LUCKYTRI_CHANNEL 指定,在这里不能更改。去掉该变量后即可在此选择。`)),1)):u(``,!0),j.value===`onebot`?(F(),f(o,{key:1},[d(`p`,J,U(S(T)(`自备接入端,通过反向 WebSocket 连接。能看到全部群消息。`)),1),d(`div`,se,[d(`div`,ce,[d(`span`,null,U(S(T)(`反向 WebSocket 地址`)),1),d(`code`,null,U(M.value),1)]),d(`div`,Y,[d(`span`,null,U(S(T)(`连接令牌`)),1),d(`strong`,null,U(v.value.tokenConfigured?S(T)(`已配置`):S(T)(`尚未配置`)),1)])]),d(`ol`,X,[d(`li`,null,U(S(T)(`在本机 .env 中设置 ONEBOT_TOKEN,修改后重启 LuckyTri。`)),1),d(`li`,null,U(S(T)(`在你使用的 OneBot 11 接入端里启用反向 WebSocket 客户端,填写上方地址和相同令牌,消息格式选择数组。`)),1),d(`li`,null,U(S(T)(`在接入端完成 QQ 登录。连接成功后,本页状态会更新;新会话仍需在「对话」中开启参与。`)),1)]),d(`p`,le,U(S(T)(`LuckyTri 只负责接收,不提供、不安装也不管理接入端。`)),1),p.value===`onebot`?u(``,!0):(F(),f(`div`,ue,[d(`button`,{class:`primary`,"data-use":`onebot`,disabled:B.value||m.value,onClick:t[1]||=e=>Be(`onebot`)},U(S(T)(`改用这种方式`)),9,de)]))],64)):(F(),f(o,{key:2},[d(`p`,fe,U(S(T)(`只需 AppID 与 AppSecret,无需额外软件。群里默认只收到 @ 她的消息。`)),1),d(`form`,{class:`stack tight`,onSubmit:i(Ve,[`prevent`])},[d(`label`,null,[a(U(S(T)(`AppID`))+` `,1),x(d(`input`,{"onUpdate:modelValue":t[2]||=e=>R.appId=e,name:`qqbotAppId`,autocomplete:`off`,inputmode:`numeric`,maxlength:`40`,disabled:B.value||y.value.appIdFromEnv,placeholder:S(T)(`机器人的 AppID`)},null,8,pe),[[c,R.appId]]),y.value.appIdFromEnv?(F(),f(`small`,Z,U(S(T)(`由环境变量指定,在这里不能修改`)),1)):u(``,!0)]),d(`label`,null,[a(U(S(T)(`AppSecret`))+` `,1),x(d(`input`,{"onUpdate:modelValue":t[3]||=e=>R.secret=e,name:`qqbotSecret`,type:`password`,autocomplete:`new-password`,maxlength:`200`,disabled:B.value||y.value.secretFromEnv,placeholder:k.value||y.value.secretFromEnv?S(T)(`已保存,留空保留`):S(T)(`机器人的 AppSecret`)},null,8,me),[[c,R.secret]]),y.value.secretFromEnv?(F(),f(`small`,he,U(S(T)(`由环境变量指定,在这里不能修改`)),1)):u(``,!0)]),d(`div`,Q,[d(`button`,{class:`primary`,"data-save":`qqbot`,disabled:B.value||y.value.appIdFromEnv&&y.value.secretFromEnv},U(p.value===`qqbot`||m.value?S(T)(`保存`):S(T)(`保存并使用`)),9,$),W.value?(F(),f(`span`,ge,U(S(T)(`有尚未保存的修改`)),1)):u(``,!0)])],32),p.value===`qqbot`?(F(),f(`div`,_e,[d(`div`,ve,[d(`span`,null,U(S(T)(`连接状态`)),1),d(`strong`,ye,U(Le.value),1)]),y.value.error?(F(),f(`div`,be,[t[4]||=d(`span`,null,null,-1),d(`small`,xe,U(y.value.error),1)])):u(``,!0),y.value.botName?(F(),f(`div`,Se,[d(`span`,null,U(S(T)(`机器人`)),1),d(`strong`,null,U(y.value.botName),1)])):u(``,!0),d(`div`,Ce,[d(`span`,null,U(S(T)(`最近收到消息`)),1),d(`strong`,null,U(y.value.lastEventAt?S(G)(y.value.lastEventAt):S(T)(`还没有`)),1)]),d(`div`,we,[d(`span`,null,U(S(T)(`群消息范围`)),1),d(`strong`,null,U(Re.value),1)])])):u(``,!0),ze.value?(F(),f(`p`,Te,U(S(T)(`目前只收到 @ 她的群消息。想让她看到群里的全部消息,请在开放平台的机器人设置里开启「接收所有消息」。`)),1)):u(``,!0),d(`ol`,Ee,[d(`li`,null,U(S(T)(`在 QQ 开放平台创建机器人,取得 AppID 与 AppSecret。`)),1),d(`li`,null,U(S(T)(`把运行 LuckyTri 的这台机器的出口 IP 加入机器人的 IP 白名单。`)),1),d(`li`,null,U(S(T)(`可选:开启「接收所有消息」,她才能看到群里没有 @ 她的话;不开启时只会收到 @ 她的消息。`)),1),d(`li`,null,U(S(T)(`填写上方的 AppID 与 AppSecret 并保存。状态变为「已连接」后,在群里 @ 她或私聊她,新会话会出现在「对话」中。`)),1)]),d(`ul`,De,[d(`li`,null,U(S(T)(`官方平台不提供群名称:新会话以占位名出现,可以在「对话」中为它改名。`)),1),d(`li`,null,U(S(T)(`官方平台上,同一个人在不同的群里标识不同。像只在不同的房间见过对方一样,平台给出统一身份之前,她不会把两处的人当成同一个人。`)),1),d(`li`,null,U(S(T)(`对方关闭了机器人的主动消息时,她不会去打扰,会等对方来找她。`)),1)])],64))]),d(`section`,Oe,[d(`div`,ke,[d(`div`,null,[d(`span`,Ae,U(S(T)(`就绪检查`)),1),d(`h2`,null,U(S(T)(`还差哪一步`)),1)]),d(`span`,je,U(S(I).health.readiness?.completed??0)+` / `+U(S(I).health.readiness?.total??0),1)]),d(`ol`,Me,[(F(!0),f(o,null,w(S(I).health.readiness?.checks||[],e=>(F(),f(`li`,{key:e.id,class:h({done:e.done})},[d(`span`,Ne,U(e.done?`✓`:``),1),d(`div`,null,[d(`b`,null,U(e.name),1),d(`small`,Pe,U(e.detail),1)]),d(`button`,{class:`small`,"data-fix":e.id,onClick:t=>Ue(e.id)},U(e.done?S(T)(`查看`):S(T)(`去处理`)),9,Fe)],2))),128))])])]))}}),[[`__scopeId`,`data-v-f0d7c649`]]);async function Le(e){return D(`/core/models`,`PUT`,{models:e})}async function Re(e){return D(`/core/models/`+encodeURIComponent(e),`DELETE`,{})}async function ze(e){return D(`/model/test`,`POST`,{modelId:e})}var Be={class:`card embedding-profile`,"aria-labelledby":`embedding-title`},Ve={id:`embedding-title`},He={class:`muted`},Ue={key:0,class:`faint`},We={class:`check`},Ge={class:`fields`},Ke=[`required`],qe=[`required`],Je=[`placeholder`],Ye={class:`save-bar`},Xe=[`disabled`],Ze=[`disabled`],Qe={class:`faint`},$e={key:2,role:`status`},et=k(m({__name:`EmbeddingProfile`,setup(e){let t=N({enabled:!1,label:T(`知识向量`),baseUrl:``,model:``,apiKey:``,dimensions:0,batchSize:32,timeoutMs:9e4}),n=O(!1),r=O(!1),o=O(!1),l=O(``);async function p(){try{Object.assign(t,await D(`/core/knowledge/embedding`),{apiKey:``}),o.value=!0}catch(e){l.value=e.message}}async function m(){n.value=!0;try{Object.assign(t,await D(`/core/knowledge/embedding`,`PATCH`,t),{apiKey:``}),r.value=!1,z(T(`知识向量模型已保存`))}catch(e){z(e.message,!0)}finally{n.value=!1}}async function h(){n.value=!0;try{let e=await D(`/core/knowledge/embedding/test`,`POST`,{});l.value=T(`连接成功,向量维度 {dimensions}`,{dimensions:e.dimensions})}catch(e){l.value=e.message}finally{n.value=!1}}return R(p),(e,p)=>(F(),f(`section`,Be,[d(`h2`,Ve,U(S(T)(`知识向量模型`)),1),d(`p`,He,U(S(T)(`单独配置资料检索使用的模型。更换对话模型后仍使用这里的配置。更换向量模型后,可在资料书架逐份重建向量;原文仍能通过关键词检索。`)),1),o.value&&!t.configured?(F(),f(`p`,Ue,U(S(T)(`当前兼容旧配置,跟随默认模型。保存后改用独立配置。`)),1)):u(``,!0),o.value?(F(),f(`form`,{key:1,onSubmit:i(m,[`prevent`]),onInput:p[6]||=e=>r.value=!0,onChange:p[7]||=e=>r.value=!0},[d(`label`,We,[x(d(`input`,{"onUpdate:modelValue":p[0]||=e=>t.enabled=e,type:`checkbox`,name:`embeddingEnabled`},null,512),[[s,t.enabled]]),a(U(S(T)(`启用知识向量`)),1)]),d(`div`,Ge,[d(`label`,null,[a(U(S(T)(`API 地址`)),1),x(d(`input`,{"onUpdate:modelValue":p[1]||=e=>t.baseUrl=e,name:`embeddingBaseUrl`,type:`url`,required:t.enabled,placeholder:`https://example.com/v1`},null,8,Ke),[[c,t.baseUrl]])]),d(`label`,null,[a(U(S(T)(`模型名称`)),1),x(d(`input`,{"onUpdate:modelValue":p[2]||=e=>t.model=e,name:`embeddingModelName`,required:t.enabled},null,8,qe),[[c,t.model]])]),d(`label`,null,[a(U(S(T)(`独立 API Key`)),1),x(d(`input`,{"onUpdate:modelValue":p[3]||=e=>t.apiKey=e,name:`embeddingApiKey`,type:`password`,autocomplete:`new-password`,placeholder:t.hasApiKey?S(T)(`已保存,留空保留`):S(T)(`填写向量服务密钥`)},null,8,Je),[[c,t.apiKey]])]),d(`label`,null,[a(U(S(T)(`向量维度(0 表示自动)`)),1),x(d(`input`,{"onUpdate:modelValue":p[4]||=e=>t.dimensions=e,name:`embeddingDimensions`,type:`number`,min:`0`,max:`65536`},null,512),[[c,t.dimensions,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`每批段落数`)),1),x(d(`input`,{"onUpdate:modelValue":p[5]||=e=>t.batchSize=e,name:`embeddingBatchSize`,type:`number`,min:`1`,max:`128`},null,512),[[c,t.batchSize,void 0,{number:!0}]])])]),d(`div`,Ye,[d(`button`,{class:`primary`,disabled:n.value},U(S(T)(`保存向量模型`)),9,Xe),d(`button`,{type:`button`,disabled:n.value||r.value||!t.enabled||!t.configured,onClick:h},U(S(T)(`测试向量连接`)),9,Ze),d(`small`,Qe,U(r.value?S(T)(`有未保存的修改`):S(T)(`配置已载入`)),1)])],32)):u(``,!0),l.value?(F(),f(`p`,$e,U(l.value),1)):u(``,!0)]))}}),[[`__scopeId`,`data-v-6873efbb`]]),tt={class:`library`},nt={class:`model-workspace`},rt={class:`card shelf`},it={class:`shelf-head`},at={class:`faint`},ot={class:`rows`},st={key:0,class:`muted`},ct=[`open`,`data-saved-vendor`,`onToggle`],lt={class:`vendor-models`},ut=[`onClick`],dt={class:`who`},ft={key:0,class:`card detail`},pt={class:`card-head`},mt={class:`eyebrow`},ht=[`data-tone`],gt={class:`form-grid`},_t={key:0},vt=[`placeholder`],yt={class:`wide`},bt=[`placeholder`],xt={class:`faint`},St={class:`form-grid`},Ct={key:0},wt={key:1},Tt={class:`advanced`},Et={class:`form-grid`},Dt=[`placeholder`],Ot={class:`faint`},kt={class:`caps`},At=[`onUpdate:modelValue`,`name`],jt={key:0,id:`modelTestResult`,class:`notice`,role:`status`},Mt={class:`actions`},Nt=[`disabled`],Pt={class:`faint`},Ft={key:0,class:`check`},It=[`checked`],Lt=[`disabled`],Rt={key:1,class:`card detail`},zt={class:`card usage-panel`,"aria-labelledby":`token-usage-title`},Bt={class:`usage-intro`},Vt={class:`eyebrow`},Ht={id:`token-usage-title`},Ut={class:`usage-total`},Wt={class:`usage-detail`},Gt={class:`usage-stat`},Kt={class:`usage-stat`},qt={class:`usage-stat cache-stat`},Jt={class:`usage-stat`},Yt={class:`usage-foot`},Xt={key:0},Zt={key:1,class:`usage-error`},Qt={key:2},$t=[`disabled`],en={class:`model-picker`},tn={class:`muted`},nn={class:`catalog-search`},rn=[`placeholder`],an=[`data-vendor`],on={class:`vendor-summary`},sn={class:`vendor-name`},cn={class:`presets`},ln=[`data-preset`,`onClick`],un={key:0,class:`muted search-empty`},dn=k(m({__name:`ModelLibrary`,setup(e){let n=t(()=>I.health?.modelCatalog||[]),r=t(()=>I.health?.effortLabels||{none:T(`关闭`),minimal:T(`极低`),low:T(`低`),medium:T(`中`),high:T(`高`),xhigh:T(`极高`),max:T(`最深`)}),p=O(I.core.models.map(e=>({...e}))),m=O(p.value.length?0:-1),_=O(p.value.length?X(p.value[0]):``),v=O(!1),b=O(!1),C=O(!1),k=O(``),A=O(``),j=O(null),M=O(!1),V=O(``),G=N(Y());p.value[0]&&Object.assign(G,p.value[0],{apiKey:``});let te=t(()=>m.value>=0&&!!G.id),K=t(()=>{let e=[];for(let t of n.value){if(t.id===`custom`)continue;let n=e.find(e=>e.vendor===t.vendor);n||(n={vendor:t.vendor,models:[]},e.push(n)),n.models.push(t)}return e}),re=t(()=>{let e=k.value.trim().toLocaleLowerCase();return e?K.value.map(t=>({...t,models:t.models.filter(n=>[t.vendor,n.label,n.model,n.summary].filter(Boolean).join(` `).toLocaleLowerCase().includes(e))})).filter(e=>e.models.length):K.value}),ie=t(()=>{let e=[];return p.value.forEach((t,n)=>{let r=X(t),i=e.find(e=>e.vendor===r);i||(i={vendor:r,models:[]},e.push(i)),i.models.push({model:t,index:n})}),e}),q=t(()=>n.value.find(e=>e.id===`custom`)),ae=t(()=>n.value.filter(e=>e.vendor&&e.vendor===G.vendor)),oe=t(()=>n.value.find(e=>e.id===G.presetId)||n.value.find(e=>e.model&&e.model===G.model&&e.baseUrl===G.baseUrl)),J=t(()=>{let e=oe.value?.contextWindows||[];if(e.length<2)return[];let t=Number(G.contextWindow);return e.some(e=>e.contextWindow===t)?e:[...e,{label:T(`已保存 {value}`,{value:Z(t)}),contextWindow:t,maxInputTokens:Number(G.maxInputTokens),maxOutputTokens:Number(G.maxOutputTokens)}]}),se=t(()=>{let e=Array.isArray(G.reasoningEfforts)&&G.reasoningEfforts.length?[...G.reasoningEfforts]:[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];return G.reasoningEffort&&!e.includes(G.reasoningEffort)&&e.unshift(G.reasoningEffort),e}),ce=t(()=>I.core.models.some(e=>e.id===G.id));function Y(){return{id:``,presetId:``,label:``,provider:``,vendor:``,baseUrl:``,model:``,apiKey:``,hasApiKey:!1,contextWindow:128e3,maxInputTokens:119808,maxOutputTokens:8192,vision:!1,system:!0,json:!0,tools:!1,embedding:!1,embeddingModel:``,reasoningEffort:`none`,reasoningEfforts:[`none`,`low`,`medium`,`high`],thinkingStyle:`openai`,tokenField:`max_tokens`,omitSampling:!1,temperature:.85,topP:1,timeoutMs:9e4,isDefault:!1,enabled:!0}}function X(e){let t={"volcengine-coding-plan":T(`火山方舟 Coding Plan`),"opencode-go":`OpenCode Go`,"opencode-zen":`OpenCode Zen`,deepseek:`DeepSeek`,openai:`OpenAI`,bedrock:T(`亚马逊 Bedrock`),qwen:T(`通义千问`),moonshot:`Kimi`,kimi:`Kimi`,zhipu:T(`智谱 GLM`),glm:T(`智谱 GLM`),mimo:T(`小米 MiMo`),siliconflow:`SiliconFlow`,openrouter:`OpenRouter`};return String(e?.vendor||``).trim()||t[String(e?.provider||``).toLowerCase()]||String(e?.provider||T(`自定义供应商`))}function le(e,t){let n=t.currentTarget;_.value=n.open?e:``}function ue(e){let{summary:t,contextWindows:n,...r}=e;return{...r,presetId:e.id}}function de(e){let{contextWindows:t,...n}=e;return n}function fe(e){let t=Number(e.contextWindow),n=Number(e.maxOutputTokens),r=Number(e.maxInputTokens);return(!Number.isFinite(t)||t<2)&&(t=2),(!Number.isFinite(n)||n<1)&&(n=1),n>=t&&(n=t-1),(!Number.isFinite(r)||r<1)&&(r=t-n),r+n>t&&(r=t-n),{contextWindow:t,maxInputTokens:r,maxOutputTokens:n}}function pe(e){let t=Number(e.target.value),n=J.value.find(e=>e.contextWindow===t);n&&(G.contextWindow=n.contextWindow,G.maxInputTokens=n.maxInputTokens,G.maxOutputTokens=n.maxOutputTokens,I.dirty=!0)}function Z(e){let t=Number(e)||0;return t>=1e6?(t%1048576==0?t/1048576:Number((t/1e6).toFixed(2)))+`M`:t>=1e3?(t%1e3==0?t/1e3:t%1024==0?t/1024:Math.round(t/1e3))+`K`:String(t)}function me(e){if(e.id===`openrouter`)return T(`按所选模型填写上下文和输出参数`);if(!e.model)return T(`填写模型 ID 和对应参数`);let t=e.contextWindows||[],n=t.length?t.map(e=>e.label).join(` / `):Z(e.contextWindow);return T(`上下文 {context} · 输出 {v}`,{context:n,v:Z(e.maxOutputTokens)})}function he(e){return[`mimo`,`qwen`,`kimi-toggle`].includes(G.thinkingStyle)?T(e===`none`?`关闭`:`开启`):`${r.value[e]||e} / ${e}`}function Q(e){return new Intl.NumberFormat(l()).format(Number(e)||0)}async function $(){if(!M.value){M.value=!0;try{j.value=await D(`/core/usage`),V.value=``}catch(e){V.value=e.message}finally{M.value=!1}}}R(()=>void $()),E(()=>I.tick,()=>void $());async function ge(){return I.dirty?await H(T(`放弃当前模型草稿?`),{title:T(`草稿还没保存`),confirmText:T(`放弃`),cancelText:T(`留下`)})?(I.dirty=!1,!0):!1:!0}async function _e(e){let t=p.value[e];t&&t.id!==G.id&&await ge()&&(p.value=p.value.filter(e=>e.id===t.id||I.core.models.some(t=>t.id===e.id)),m.value=p.value.findIndex(e=>e.id===t.id),_.value=X(t),Object.assign(G,Y(),t,{apiKey:``}),A.value=``)}async function ve(){if(!await ge())return;p.value=I.core.models.map(e=>({...e})),p.value.length?p.value.some(e=>e.id===G.id)||(m.value=0,Object.assign(G,Y(),p.value[0],{apiKey:``})):(m.value=-1,Object.assign(G,Y()));let e=p.value[m.value]||p.value[0];_.value=e?X(e):``,k.value=``,C.value=!0}function ye(e){p.value=I.core.models.map(e=>({...e}));let t={...Y(),...ue(e),id:`model-`+Date.now(),apiKey:``,hasApiKey:!1,isDefault:p.value.length===0};p.value.push(t),m.value=p.value.length-1,_.value=X(t),Object.assign(G,t),A.value=``,C.value=!1,I.dirty=!0}function be(e){let t=e.target.value,r=n.value.find(e=>e.id===t);if(!r)return;Object.assign(G,Y(),ue(r),{id:G.id,apiKey:G.apiKey,hasApiKey:G.hasApiKey,isDefault:G.isDefault});let i=p.value[m.value];i&&(i.label=G.label),I.dirty=!0}function xe(){for(let e of p.value)e.isDefault=e.id===G.id;G.isDefault=!0,I.dirty=!0}async function Se(){let e=fe(G),t=p.value.map((t,n)=>de(n===m.value?{...G,...e,isDefault:!!G.isDefault,enabled:G.isDefault?!0:G.enabled!==!1,timeoutMs:Number(G.timeoutMs),temperature:Number(G.temperature),topP:Number(G.topP)}:{...t,isDefault:!!t.isDefault&&t.id!==G.id}));if(!t.some(e=>e.isDefault)&&t.length&&(t[0].isDefault=!0),!v.value){v.value=!0;try{await Le(t),I.dirty=!1,await g(),p.value=I.core.models.map(e=>({...e})),Object.assign(G,Y(),p.value[m.value],{apiKey:``}),z(T(`已保存并应用`))}catch(e){z(e.message,!0)}finally{v.value=!1}}}async function Ce(){if(await H(T(`确定删除这个模型?`),{title:T(`删除模型`),confirmText:T(`删除`),danger:!0})){if(I.core.models.some(e=>e.id===G.id)&&await Re(G.id),I.dirty=!1,await g(),p.value=I.core.models.map(e=>({...e})),A.value=``,!p.value.length){m.value=-1,_.value=``,Object.assign(G,Y());return}m.value=0,_.value=X(p.value[0]),Object.assign(G,Y(),p.value[0],{apiKey:``})}}async function we(){if(!(!ce.value||I.dirty||b.value)){b.value=!0,A.value=T(`正在测试「{v}」…`,{v:G.label||G.model});try{let e=await ze(G.id);A.value=T(`✓ {v} 连接成功 · {latency} ms`,{v:G.label||e.model,latency:e.latency}),await g()}catch(e){A.value=e.message}finally{b.value=!1}}}return(e,t)=>(F(),f(`div`,tt,[d(`div`,nt,[d(`aside`,rt,[d(`div`,it,[d(`h2`,null,[a(U(S(T)(`模型库`))+` `,1),d(`small`,null,U(p.value.length),1)]),d(`button`,{id:`addModel`,class:`small primary`,onClick:ve},U(S(T)(`+ 新增模型`)),1)]),d(`p`,at,U(S(T)(`群聊、私聊和独处都使用默认模型。其余已启用的模型按这里的顺序作为备用。关掉的模型不会被调用。`)),1),d(`div`,ot,[p.value.length?u(``,!0):(F(),f(`p`,st,U(S(T)(`还没有模型。`)),1)),(F(!0),f(o,null,w(ie.value,e=>(F(),f(`details`,{key:e.vendor,class:`saved-vendor`,open:_.value===e.vendor,"data-saved-vendor":e.vendor,onToggle:t=>le(e.vendor,t)},[d(`summary`,null,[d(`span`,null,U(e.vendor),1),d(`small`,null,U(S(T)(`{length} 个模型`,{length:e.models.length})),1)]),d(`div`,lt,[(F(!0),f(o,null,w(e.models,e=>(F(),f(`button`,{key:e.model.id,class:h([`entity-row`,{selected:m.value===e.index}]),onClick:t=>_e(e.index)},[d(`span`,{class:`badge`,style:B({"--hue":S(ee)(e.model.label||e.model.model||e.model.id)})},U(String(e.model.label||e.model.model||`?`).slice(0,1).toUpperCase()),5),d(`span`,dt,[d(`b`,null,U(e.model.label||e.model.model),1),d(`small`,null,U(e.model.enabled===!1?S(T)(`已关闭`):e.model.isDefault?S(T)(`默认模型`):S(T)(`备用模型`)),1)])],10,ut))),128))])],40,ct))),128))])]),te.value?(F(),f(`section`,ft,[d(`div`,pt,[d(`div`,null,[d(`span`,mt,U(S(T)(`模型档案`)),1),d(`h2`,null,U(G.label||S(T)(`新模型`)),1)]),d(`span`,{class:`chip`,"data-tone":G.hasApiKey?`ok`:`warn`},U((G.isDefault?S(T)(`默认模型 · `):``)+(G.hasApiKey?S(T)(`密钥已保存`):S(T)(`待填写密钥`))),9,ht)]),d(`form`,{id:`modelForm`,class:`stack`,onSubmit:i(Se,[`prevent`]),onInput:t[14]||=e=>S(I).dirty=!0},[d(`fieldset`,null,[d(`legend`,null,U(S(T)(`连接`)),1),d(`div`,gt,[ae.value.length>1?(F(),f(`label`,_t,[a(U(S(T)(`同厂商模型`))+` `,1),P(W,{"model-value":G.presetId,"aria-label":S(T)(`同厂商模型`),options:ae.value.map(e=>({value:e.id,label:e.label})),onChange:be},null,8,[`model-value`,`aria-label`,`options`])])):u(``,!0),d(`label`,null,[a(U(S(T)(`显示名称`)),1),x(d(`input`,{"onUpdate:modelValue":t[0]||=e=>G.label=e,name:`label`,required:``},null,512),[[c,G.label]])]),d(`label`,null,[a(U(S(T)(`供应商`)),1),x(d(`input`,{"onUpdate:modelValue":t[1]||=e=>G.provider=e,name:`provider`,placeholder:S(T)(`例如 deepseek、openai`)},null,8,vt),[[c,G.provider]])]),d(`label`,null,[a(U(S(T)(`API 地址`)),1),x(d(`input`,{"onUpdate:modelValue":t[2]||=e=>G.baseUrl=e,name:`baseUrl`,type:`url`,required:``},null,512),[[c,G.baseUrl]])]),d(`label`,null,[a(U(S(T)(`模型名称`)),1),x(d(`input`,{"onUpdate:modelValue":t[3]||=e=>G.model=e,name:`model`,required:``},null,512),[[c,G.model]])]),d(`label`,yt,[t[18]||=a(` API Key `,-1),x(d(`input`,{"onUpdate:modelValue":t[4]||=e=>G.apiKey=e,name:`apiKey`,type:`password`,autocomplete:`new-password`,placeholder:G.hasApiKey?S(T)(`已保存,留空则保留`):S(T)(`填写供应商提供的密钥`)},null,8,bt),[[c,G.apiKey]])])])]),d(`fieldset`,null,[d(`legend`,null,U(S(T)(`容量与思考`)),1),d(`p`,xt,U(S(T)(`官方按输入长度分档计价的模型可以在标准和百万之间切换;输出上限默认是官方最大值,思考强度只列出这个模型支持的档位。`)),1),d(`div`,St,[J.value.length?(F(),f(`label`,Ct,[a(U(S(T)(`上下文容量`))+` `,1),P(W,{name:`contextWindow`,"model-value":G.contextWindow,options:J.value.map(e=>({value:e.contextWindow,label:e.label})),onChange:pe},null,8,[`model-value`,`options`])])):(F(),f(`label`,wt,[a(U(S(T)(`上下文容量`)),1),x(d(`input`,{"onUpdate:modelValue":t[5]||=e=>G.contextWindow=e,name:`contextWindow`,type:`number`},null,512),[[c,G.contextWindow,void 0,{number:!0}]])])),d(`label`,null,[a(U(S(T)(`最大输入 Token`)),1),x(d(`input`,{"onUpdate:modelValue":t[6]||=e=>G.maxInputTokens=e,name:`maxInputTokens`,type:`number`},null,512),[[c,G.maxInputTokens,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`最大输出 Token`)),1),x(d(`input`,{"onUpdate:modelValue":t[7]||=e=>G.maxOutputTokens=e,name:`maxOutputTokens`,type:`number`},null,512),[[c,G.maxOutputTokens,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`思考强度`))+` `,1),P(W,{modelValue:G.reasoningEffort,"onUpdate:modelValue":t[8]||=e=>G.reasoningEffort=e,name:`reasoningEffort`,"aria-label":S(T)(`思考强度`),options:se.value.map(e=>({value:e,label:he(e)}))},null,8,[`modelValue`,`aria-label`,`options`])])])]),d(`details`,Tt,[d(`summary`,null,U(S(T)(`高级参数与模型能力`)),1),d(`div`,Et,[d(`label`,null,[a(U(S(T)(`随机程度 Temperature`)),1),x(d(`input`,{"onUpdate:modelValue":t[9]||=e=>G.temperature=e,name:`temperature`,type:`number`,step:`0.05`},null,512),[[c,G.temperature,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`采样范围 Top P`)),1),x(d(`input`,{"onUpdate:modelValue":t[10]||=e=>G.topP=e,name:`topP`,type:`number`,step:`0.05`},null,512),[[c,G.topP,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`超时(毫秒)`)),1),x(d(`input`,{"onUpdate:modelValue":t[11]||=e=>G.timeoutMs=e,name:`timeoutMs`,type:`number`},null,512),[[c,G.timeoutMs,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`知识检索模型`)),1),x(d(`input`,{"onUpdate:modelValue":t[12]||=e=>G.embeddingModel=e,name:`embeddingModel`,placeholder:S(T)(`留空跟随对话模型`)},null,8,Dt),[[c,G.embeddingModel]])])]),d(`p`,Ot,U(S(T)(`打开图片理解后,聊天里的图片会先在本机读取,再连同画面交给这个模型。主模型不能看图时,到会话设置另选一个打开了图片理解的视觉兼容模型。`)),1),d(`div`,kt,[(F(!0),f(o,null,w({vision:S(T)(`图片理解`),system:`System Prompt`,json:S(T)(`JSON 输出`),tools:S(T)(`工具调用`),embedding:S(T)(`知识向量`)},(e,t)=>(F(),f(`label`,{key:t,class:`check`},[x(d(`input`,{"onUpdate:modelValue":e=>G[t]=e,name:t,type:`checkbox`},null,8,At),[[s,G[t]]]),a(U(e),1)]))),128))])]),A.value?(F(),f(`div`,jt,U(A.value),1)):u(``,!0),d(`div`,Mt,[d(`button`,{class:`primary`,disabled:v.value},U(v.value?S(T)(`正在保存…`):S(T)(`保存模型`)),9,Nt),d(`small`,Pt,U(S(I).dirty?S(T)(`有未保存的修改`):S(T)(`已保存的模型才会用来测试和回复`)),1),G.isDefault?u(``,!0):(F(),f(`label`,Ft,[d(`input`,{type:`checkbox`,checked:G.enabled!==!1,onChange:t[13]||=e=>{G.enabled=e.target.checked,S(I).dirty=!0}},null,40,It),a(U(S(T)(`启用这个备用模型`)),1)])),G.isDefault?u(``,!0):(F(),f(`button`,{key:1,id:`setDefaultModel`,type:`button`,onClick:xe},U(S(T)(`设为默认模型`)),1)),ce.value?(F(),f(`button`,{key:2,id:`testModel`,type:`button`,disabled:v.value||b.value||S(I).dirty,onClick:we},U(b.value?S(T)(`正在测试…`):S(I).dirty?S(T)(`保存后测试此模型`):S(T)(`测试此模型连接`)),9,Lt)):u(``,!0),d(`button`,{id:`deleteModel`,type:`button`,class:`danger push`,onClick:Ce},U(S(T)(`删除模型`)),1)])],32)])):(F(),f(`section`,Rt,[P(L,{title:S(T)(`还没有模型`),text:S(T)(`常见厂商会预填模型参数;OpenRouter 可选 GPT-6 预设,也可用自选模型手动填写模型 ID 和参数。`)},{default:y(()=>[d(`button`,{class:`primary`,onClick:ve},U(S(T)(`+ 新增模型`)),1)]),_:1},8,[`title`,`text`])]))]),P(et),d(`section`,zt,[d(`div`,Bt,[d(`div`,null,[d(`span`,Vt,U(S(T)(`TOKEN LEDGER · 累计用量`)),1),d(`h2`,Ht,U(S(T)(`一路聊到现在`)),1),d(`p`,null,U(S(T)(`统计本机账本记录的模型调用;缓存 Token 已包含在输入量里。`)),1)]),d(`div`,Ut,[d(`strong`,null,U(Q(j.value?.total)),1),d(`span`,null,U(S(T)(`累计 Token`)),1)])]),d(`div`,Wt,[d(`div`,Gt,[d(`span`,null,U(S(T)(`输入`)),1),d(`b`,null,U(Q(j.value?.input)),1)]),d(`div`,Kt,[d(`span`,null,U(S(T)(`输出`)),1),d(`b`,null,U(Q(j.value?.output)),1)]),d(`div`,qt,[d(`span`,null,[a(U(S(T)(`缓存命中`))+` `,1),d(`small`,null,U(S(T)(`(输入子项)`)),1)]),d(`b`,null,U(Q(j.value?.cached)),1)]),d(`div`,Jt,[d(`span`,null,U(S(T)(`调用次数`)),1),d(`b`,null,U(Q(j.value?.calls)),1)])]),d(`div`,Yt,[j.value?.since?(F(),f(`small`,Xt,[a(U(S(T)(`从 {v} 开始记录 · {v2} 为模型返回用量`,{v:new Date(j.value.since).toLocaleDateString(S(l)()),v2:Q(j.value.reportedTokens)}))+` `,1),j.value.estimatedCalls?(F(),f(o,{key:0},[a(U(S(T)(`· {v} 次调用按文本估算`,{v:Q(j.value.estimatedCalls)})),1)],64)):u(``,!0)])):V.value?(F(),f(`small`,Zt,U(V.value),1)):(F(),f(`small`,Qt,U(S(T)(`还没有模型调用记录。`)),1)),d(`button`,{type:`button`,class:`usage-refresh`,disabled:M.value,onClick:$},U(M.value?S(T)(`更新中…`):S(T)(`刷新统计 ↻`)),9,$t)])]),P(ne,{open:C.value,title:S(T)(`选择模型`),eyebrow:`MODELS`,width:`880px`,onClose:t[17]||=e=>C.value=!1},{default:y(()=>[d(`div`,en,[d(`p`,tn,U(S(T)(`先选供应商,再挑具体模型;支持搜索。火山方舟 Coding Plan 已预填套餐专用接口与型号参数,请勿换成普通推理 API 地址。`)),1),d(`label`,nn,[d(`span`,null,U(S(T)(`搜索模型或供应商`)),1),x(d(`input`,{"onUpdate:modelValue":t[15]||=e=>k.value=e,type:`search`,placeholder:S(T)(`例如:火山方舟、Kimi K3、DeepSeek`)},null,8,rn),[[c,k.value]])]),(F(!0),f(o,null,w(re.value,e=>(F(),f(`details`,{key:e.vendor,class:`vendor`,"data-vendor":e.vendor},[d(`summary`,on,[d(`span`,sn,[d(`b`,null,U(e.vendor),1),d(`small`,null,U(S(T)(`{length} 个预设`,{length:e.models.length})),1)]),t[19]||=d(`span`,{class:`vendor-chevron`,"aria-hidden":`true`},`⌄`,-1)]),d(`div`,cn,[(F(!0),f(o,null,w(e.models,e=>(F(),f(`button`,{key:e.id,type:`button`,class:`preset-card`,"data-preset":e.id,onClick:t=>ye(e)},[d(`b`,null,U(e.label),1),d(`small`,null,U(e.model||S(T)(`填写你在 OpenRouter 选择的模型 ID`)),1),d(`small`,null,U(me(e)),1),d(`small`,null,U(e.summary),1)],8,ln))),128))])],8,an))),128)),re.value.length?u(``,!0):(F(),f(`p`,un,U(S(T)(`没有找到匹配的模型预设。`)),1)),q.value?(F(),f(`button`,{key:1,type:`button`,class:`preset-card custom`,"data-preset":`custom`,onClick:t[16]||=e=>ye(q.value)},[d(`b`,null,U(q.value.label),1),d(`small`,null,U(q.value.summary),1)])):u(``,!0)])]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-59f18516`]]),fn={class:`switch`},pn=[`name`,`disabled`],mn=m({__name:`Toggle`,props:p({name:{},disabled:{type:Boolean}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=v(e,`modelValue`);return(n,r)=>(F(),f(`label`,fn,[x(d(`input`,{"onUpdate:modelValue":r[0]||=e=>t.value=e,type:`checkbox`,name:e.name,disabled:e.disabled},null,8,pn),[[s,t.value]]),d(`span`,null,[_(n.$slots,`default`)])]))}}),hn={class:`runtime-grid`},gn={class:`card-head`},_n={class:`eyebrow`},vn={class:`switches`},yn={class:`save-bar`},bn={class:`primary`,type:`submit`},xn={class:`faint`},Sn={class:`card numbers`},Cn=[`title`],wn=k(m({__name:`Runtime`,setup(e){let n=O(!!I.health.settings.enabled),r=O(!!I.health.settings.demo),a=t(()=>(I.core.sessions||[]).filter(e=>e.enabled&&!e.archived).length),o=t(()=>{let e=I.health.backup;if(!e)return null;if(!e.enabled)return{value:T(`已关闭`),caption:T(`自动备份`),tone:`warn`,title:``};if(e.lastError)return{value:T(`失败`),caption:T(`自动备份出错,稍后重试`),tone:`danger`,title:e.lastError.message};if(!e.latest)return{value:T(`还没有`),caption:T(`自动备份,运行一阵后会做第一份`),tone:``,title:``};let t=Math.max(1,Math.round(e.latest.bytes/1048576));return{value:G(e.latest.at),caption:T(`上次自动备份 · {mb} MB · 已留 {count}/{keep} 份`,{mb:t,count:e.count,keep:e.keep}),tone:``,title:e.latest.name}});async function s(){try{await M({enabled:n.value,demo:r.value}),I.dirty=!1,I.health=await b(),z(T(`已保存并应用`))}catch(e){z(e.message,!0)}}return(e,t)=>(F(),f(`div`,hn,[d(`form`,{id:`runtime`,class:`card`,onSubmit:i(s,[`prevent`]),onChange:t[2]||=e=>S(I).dirty=!0},[d(`div`,gn,[d(`div`,null,[d(`span`,_n,U(S(T)(`运行开关`)),1),d(`h2`,null,U(S(T)(`TA 现在可以说话吗`)),1)])]),d(`div`,vn,[P(mn,{modelValue:n.value,"onUpdate:modelValue":t[0]||=e=>n.value=e,name:`enabled`},{default:y(()=>[d(`b`,null,U(S(T)(`允许参与聊天`)),1),d(`small`,null,U(S(T)(`总开关。关掉后 TA 不看也不回任何会话,心智照常保存。`)),1)]),_:1},8,[`modelValue`]),P(mn,{modelValue:r.value,"onUpdate:modelValue":t[1]||=e=>r.value=e,name:`demo`},{default:y(()=>[d(`b`,null,U(S(T)(`仅模拟运行,不向 QQ 发送`)),1),d(`small`,null,U(S(T)(`模拟模式下,「对话」里可以发模拟消息走完整流程;它们写进模拟会话,不进入真实记忆。`)),1)]),_:1},8,[`modelValue`])]),d(`div`,yn,[d(`button`,bn,U(S(T)(`保存运行状态`)),1),d(`small`,xn,U(S(I).dirty?S(T)(`有未保存的修改`):S(T)(`已保存,立刻生效`)),1)])],32),d(`section`,Sn,[d(`button`,{onClick:t[3]||=e=>S(C)(`chats`)},[d(`b`,null,U(a.value),1),d(`span`,null,U(S(T)(`参与中的会话`)),1)]),d(`button`,{onClick:t[4]||=e=>S(C)(`system`,`models`)},[d(`b`,null,U(S(I).core.models.length),1),d(`span`,null,U(S(T)(`可用模型`)),1)]),d(`button`,{onClick:t[5]||=e=>S(C)(`system`,`connect`)},[d(`b`,null,U(S(I).health.connection?.online?S(T)(`在线`):S(T)(`离线`)),1),d(`span`,null,U(S(T)(`QQ 连接`)),1)]),o.value?(F(),f(`button`,{key:0,class:h([`stat`,o.value.tone]),title:o.value.title,"data-testid":`backup-status`,type:`button`,onClick:t[6]||=e=>S(C)(`system`,`storage`)},[d(`b`,null,U(o.value.value),1),d(`span`,null,U(o.value.caption),1)],10,Cn)):u(``,!0)])]))}}),[[`__scopeId`,`data-v-af9bded1`]]),Tn={class:`card search-profile`},En={class:`eyebrow`},Dn={class:`muted`},On={key:0,class:`faint`},kn={class:`check`},An=[`disabled`],jn={class:`search-fields`},Mn=[`disabled`],Nn=[`disabled`,`placeholder`],Pn=[`disabled`],Fn=[`disabled`],In=[`disabled`],Ln={class:`faint`},Rn={class:`search-usage`,role:`status`},zn={class:`chip`},Bn={class:`faint`},Vn={class:`faint`},Hn={class:`row`},Un=[`disabled`],Wn=[`disabled`],Gn={key:0,class:`faint`},Kn=[`role`],qn=k(m({__name:`SearchProfile`,setup(e){let n=[`provider`,`enabled`,`baseUrl`,`timeoutMs`,`maxResults`,`dailyLimit`],r=N({provider:`tavily`,enabled:!0,baseUrl:``,apiKey:``,timeoutMs:2e4,maxResults:5,dailyLimit:12}),o=O(null),l=O(!1),p=O(!1),m=O(``),g=O(!1),_=new Map,v=`tavily`,y=t(()=>p.value&&(!!r.apiKey.trim()||n.some(e=>r[e]!==o.value?.[e]))),b=e=>e===`brave`?`Brave`:`Tavily`,C=t(()=>o.value?.dailyLimit===0?T(`不限`):o.value?.dailyLimit??12);E(y,e=>{I.dirty=e}),E(()=>[I.tick,I.pulse],()=>{p.value&&!l.value&&I.page===`system`&&I.sub===`search`&&w().catch(()=>{})});async function w(){o.value=await D(`/mind/time/search`)}async function k(){try{await w(),Object.assign(r,o.value,{apiKey:``}),v=r.provider,p.value=!0}catch(e){z(e.message,!0)}}async function j(){if(l.value)return;l.value=!0;let e=r.provider;_.set(v,{...r,provider:v});try{Object.assign(r,_.get(e)||{...await D(`/mind/time/search?provider=`+e),apiKey:``}),v=e,m.value=``}catch(e){r.provider=v,z(e.message,!0)}finally{l.value=!1}}function M(){return Object.fromEntries([...n,`apiKey`].map(e=>[e,r[e]]))}async function L(){if(!l.value){l.value=!0;try{let e=await D(`/mind/time/search`,`PATCH`,M());o.value=e,Object.assign(r,e,{apiKey:``}),_.set(r.provider,{...r}),v=r.provider,z(T(`搜索配置已保存并生效`))}catch(e){z(e.message,!0)}finally{l.value=!1}}}async function B(){if(!l.value){l.value=!0,m.value=``,g.value=!1;try{let e=await D(`/mind/time/search/test`,`POST`,M()),t={source:e.profile.mode===`web`?T(`{provider} 联网检索`,{provider:b(e.profile.provider)}):e.profile.materialLabel,count:e.results.length};m.value=y.value?T(`{source}测试通过,返回 {count} 条资料。测试不占用每日查询额度;当前填写的配置尚未保存。`,t):T(`{source}测试通过,返回 {count} 条资料。测试不占用每日查询额度。`,t)}catch(e){g.value=!0,m.value=T(`{error}。本次测试不占用每日查询额度。`,{error:e.message})}finally{try{await w()}catch{}l.value=!1}}}return R(k),A(()=>{I.dirty=!1}),(e,t)=>(F(),f(`section`,Tn,[d(`span`,En,U(S(T)(`SEARCH · 独立搜索`)),1),d(`h2`,null,U(S(T)(`接触世界的资料`)),1),d(`p`,Dn,U(S(T)(`配置后优先联网检索。未配置密钥或关闭独立搜索时,使用当前模型整理已有知识。`)),1),p.value?(F(),f(`p`,On,U(S(T)(`当前生效:{v}。表单修改保存后生效。`,{v:o.value.mode===`web`?S(T)(`{provider} · 联网检索资料`,{provider:b(o.value.provider)}):o.value.materialLabel})),1)):u(``,!0),p.value?(F(),f(`form`,{key:1,onSubmit:i(L,[`prevent`])},[d(`label`,kn,[x(d(`input`,{"onUpdate:modelValue":t[0]||=e=>r.enabled=e,type:`checkbox`,disabled:l.value},null,8,An),[[s,r.enabled]]),a(U(S(T)(`启用独立搜索`)),1)]),d(`div`,jn,[d(`label`,null,[a(U(S(T)(`提供方`)),1),P(W,{modelValue:r.provider,"onUpdate:modelValue":t[1]||=e=>r.provider=e,"aria-label":S(T)(`搜索提供方`),disabled:l.value,options:[{value:`tavily`,label:`Tavily`},{value:`brave`,label:`Brave`}],onChange:j},null,8,[`modelValue`,`aria-label`,`disabled`])]),d(`label`,null,[a(U(S(T)(`搜索地址`)),1),x(d(`input`,{"onUpdate:modelValue":t[2]||=e=>r.baseUrl=e,type:`url`,required:``,name:`searchUrl`,disabled:l.value},null,8,Mn),[[c,r.baseUrl]])]),d(`label`,null,[a(U(S(T)(`独立密钥`)),1),x(d(`input`,{"onUpdate:modelValue":t[3]||=e=>r.apiKey=e,type:`password`,autocomplete:`new-password`,name:`searchKey`,disabled:l.value,placeholder:r.hasApiKey?S(T)(`已保存,留空保留`):S(T)(`填写该提供方的搜索密钥`)},null,8,Nn),[[c,r.apiKey]])]),d(`label`,null,[a(U(S(T)(`超时(毫秒)`)),1),x(d(`input`,{"onUpdate:modelValue":t[4]||=e=>r.timeoutMs=e,type:`number`,min:`1000`,max:`120000`,disabled:l.value},null,8,Pn),[[c,r.timeoutMs,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`每次结果数`)),1),x(d(`input`,{"onUpdate:modelValue":t[5]||=e=>r.maxResults=e,type:`number`,min:`1`,max:`20`,disabled:l.value},null,8,Fn),[[c,r.maxResults,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`每日查询上限`)),1),x(d(`input`,{"onUpdate:modelValue":t[6]||=e=>r.dailyLimit=e,name:`searchDailyLimit`,type:`number`,min:`0`,max:`100000`,disabled:l.value},null,8,In),[[c,r.dailyLimit,void 0,{number:!0}]]),d(`small`,Ln,U(S(T)(`可手动调整;0 表示不限。保存后立即生效。`)),1)])]),d(`div`,Rn,[d(`span`,zn,U(S(T)(`今日有效查询 {v} / {limitLabel}`,{v:o.value.used||0,limitLabel:C.value})),1),d(`small`,Bn,U(S(T)(`{v} 次进行中 · {v2} 次失败 · {v3} 次测试`,{v:o.value.usage?.running||0,v2:o.value.usage?.failed||0,v3:o.value.usage?.diagnostics||0})),1)]),d(`p`,Vn,U(S(T)(`测试当前填写的配置,不会自动保存。失败与连接测试不占本地每日额度;提供方的账户额度由提供方管理。`)),1),d(`div`,Hn,[d(`button`,{class:`primary`,disabled:l.value},U(S(T)(`保存搜索`)),9,Un),d(`button`,{type:`button`,disabled:l.value,onClick:B},U(l.value?S(T)(`处理中…`):S(T)(`测试连接`)),9,Wn),y.value?(F(),f(`span`,Gn,U(S(T)(`有尚未保存的修改`)),1)):u(``,!0)]),m.value?(F(),f(`p`,{key:0,role:g.value?`alert`:`status`,class:h([`search-result`,{failed:g.value}])},U(m.value),11,Kn)):u(``,!0)],32)):u(``,!0)]))}}),[[`__scopeId`,`data-v-e874d8b6`]]),Jn={class:`storage-page`},Yn={class:`card storage-overview`},Xn={class:`eyebrow`},Zn={key:0,class:`storage-metrics`},Qn={key:0,class:`storage-error`,role:`alert`},$n={key:1,class:`storage-grid`},er={class:`card-head`},tr={class:`eyebrow`},nr={class:`storage-check`},rr={class:`storage-fields`},ir=[`aria-label`],ar=[`aria-label`],or=[`aria-label`],sr={class:`storage-note`},cr={key:0,class:`storage-note`},lr={key:1,class:`storage-error`},ur=[`disabled`],dr={class:`card storage-list`},fr={class:`card-head`},pr={class:`eyebrow`},mr={class:`storage-note`},hr={class:`storage-actions`},gr=[`disabled`],_r=[`disabled`],vr=[`disabled`],yr={class:`storage-scroll`},br=[`checked`,`disabled`,`aria-label`,`onChange`],xr={class:`storage-item`},Sr={key:0,class:`storage-error`,role:`alert`},Cr={class:`storage-footer`},wr=[`disabled`],Tr=k(m({__name:`BackupManager`,setup(n){let r=O(null),p=O({enabled:!0,time:`04:30`,retainDays:14,keepFull:2}),m=O([]),g=O(!1),_=O(``),v=O([]),y=!0,b=e=>`${e.scope}:${e.name}`,C=t(()=>r.value?.entries.filter(e=>m.value.includes(b(e)))||[]),E=t(()=>C.value.reduce((e,t)=>e+t.bytes,0)),k=e=>e===0?`0 B`:e>=1073741824?`${(e/1073741824).toFixed(2)} GiB`:`${Math.max(.01,e/1048576).toFixed(2)} MiB`,A=e=>new Date(e).toLocaleString(l()),j=e=>({auto:T(`自动备份`),full:T(`完整备份`),migration:T(`迁移快照`),legacy:T(`旧版本备份`),snapshot:T(`升级前快照`)})[e];async function M(e=!1){try{_.value=``;let t=await D(`/storage/cleanup`);if(!y)return;if(r.value=t,e)p.value={...r.value.policy},m.value=[],I.dirty=!1;else{let e=new Set(r.value.entries.filter(e=>!e.protected).map(b));m.value=m.value.filter(t=>e.has(t))}}catch(e){y&&(_.value=e.message)}}function N(){I.dirty=!0}function P(e){let t=b(e);m.value=m.value.includes(t)?m.value.filter(e=>e!==t):[...m.value,t]}function L(){m.value=(r.value?.plan.items||[]).map(b)}function B(){m.value=(r.value?.entries||[]).filter(e=>e.kind===`full`&&!e.protected).map(b)}async function V(){if(!g.value){g.value=!0;try{let e=await D(`/storage/cleanup`,`PATCH`,{enabled:p.value.enabled,time:p.value.time,retainDays:Number(p.value.retainDays),keepFull:Number(p.value.keepFull)});r.value=e,p.value={...e.policy},I.dirty=!1,z(T(`备份整理规则已保存`))}catch(e){z(e.message,!0)}finally{g.value=!1}}}async function W(){if(!C.value.length||g.value)return;let e=C.value.map(({scope:e,name:t,bytes:n,modified:r})=>({scope:e,name:t,bytes:n,modified:r}));if(await H(T(`将清理选中的 {count} 份备份,释放约 {size}。这些历史恢复点清理后无法从本机找回。`,{count:e.length,size:k(E.value)}),{title:T(`清理所选备份`),confirmText:T(`清理所选`),danger:!0})){g.value=!0;try{let t=await D(`/storage/cleanup/manual`,`POST`,{items:e});v.value=t.failures||[];let n=new Set((t.failures||[]).map(e=>`${e.scope}:${e.name}`));m.value=m.value.filter(e=>n.has(e)),await M(),z(T(`已清理 {count} 份备份,释放 {size}`,{count:t.removed.length,size:k(t.bytes)})+(v.value.length?T(`;部分未清理,详情见列表`):``),v.value.length>0)}catch(e){z(e.message,!0),await M()}finally{g.value=!1}}}return R(()=>M(!0)),e(()=>{y=!1}),(e,t)=>(F(),f(`div`,Jn,[d(`section`,Yn,[d(`span`,Xn,U(S(T)(`DATA · 数据与备份`)),1),d(`h2`,null,U(S(T)(`留住重要的,整理重复的。`)),1),d(`p`,null,U(S(T)(`这里管理历史备份。聊天、记忆和作品仍在正在运行的数据库里,不会被列入清理。`)),1),r.value?(F(),f(`div`,Zn,[d(`div`,null,[d(`b`,null,U(k(r.value.totalBytes)),1),d(`span`,null,U(S(T)(`可管理的历史备份`)),1)]),d(`div`,null,[d(`b`,null,U(r.value.entries.length),1),d(`span`,null,U(S(T)(`份数据库副本`)),1)]),d(`div`,null,[d(`b`,null,U(k(r.value.plan.bytes)),1),d(`span`,null,U(S(T)(`按当前规则可定时整理`)),1)])])):u(``,!0)]),_.value?(F(),f(`p`,Qn,U(_.value),1)):u(``,!0),r.value?(F(),f(`div`,$n,[d(`form`,{class:`card storage-policy`,onSubmit:i(V,[`prevent`])},[d(`div`,er,[d(`div`,null,[d(`span`,tr,U(S(T)(`定时整理`)),1),d(`h2`,null,U(S(T)(`每天给备份留一点空间`)),1)])]),d(`label`,nr,[x(d(`input`,{"onUpdate:modelValue":t[0]||=e=>p.value.enabled=e,type:`checkbox`,onChange:N},null,544),[[s,p.value.enabled]]),a(U(S(T)(`启用定时整理`)),1)]),d(`div`,rr,[d(`label`,null,[a(U(S(T)(`每天执行时间`)),1),x(d(`input`,{"onUpdate:modelValue":t[1]||=e=>p.value.time=e,type:`text`,inputmode:`numeric`,maxlength:`5`,placeholder:`04:30`,"aria-label":S(T)(`每天执行时间`),onInput:N},null,40,ir),[[c,p.value.time]])]),d(`label`,null,[a(U(S(T)(`完整备份保留天数`)),1),x(d(`input`,{"onUpdate:modelValue":t[2]||=e=>p.value.retainDays=e,type:`number`,min:`1`,max:`3650`,"aria-label":S(T)(`完整备份保留天数`),onInput:N},null,40,ar),[[c,p.value.retainDays,void 0,{number:!0}]])]),d(`label`,null,[a(U(S(T)(`完整备份最多保留份数`)),1),x(d(`input`,{"onUpdate:modelValue":t[3]||=e=>p.value.keepFull=e,type:`number`,min:`0`,max:`100`,"aria-label":S(T)(`完整备份最多保留份数`),onInput:N},null,40,or),[[c,p.value.keepFull,void 0,{number:!0}]])])]),d(`p`,sr,U(S(T)(`时间按服务器本地时区 {zone}。完整备份超过保留天数或数量上限便会定时整理;数量填 0 表示不保留完整备份。手动清理可选择完整备份和迁移快照,执行前会校验同一实例的近期自动恢复点。`,{zone:r.value.serverTimeZone})),1),r.value.last?(F(),f(`p`,cr,U(r.value.last.error&&r.value.last.removed===0?S(T)(`上次整理未执行:{error}`,{error:r.value.last.error}):S(T)(`上次整理:{time} · {count} 份 · {size}`,{time:A(r.value.last.at),count:r.value.last.removed,size:k(r.value.last.bytes)})),1)):u(``,!0),r.value.last?.error&&r.value.last.removed>0?(F(),f(`p`,lr,U(r.value.last.error),1)):u(``,!0),d(`button`,{class:`primary`,type:`submit`,disabled:g.value},U(g.value?S(T)(`处理中…`):S(T)(`保存整理规则`)),9,ur)],32),d(`section`,dr,[d(`div`,fr,[d(`div`,null,[d(`span`,pr,U(S(T)(`手动整理`)),1),d(`h2`,null,U(S(T)(`挑选历史恢复点`)),1)])]),d(`p`,mr,U(S(T)(`自动备份已有自己的轮换规则。迁移、旧版本和升级前快照只由你手动挑选;清理前会再次核对文件和恢复点。`)),1),d(`div`,hr,[d(`button`,{type:`button`,disabled:g.value||!r.value.plan.items.length,onClick:L},U(S(T)(`选中规则建议`)),9,gr),d(`button`,{type:`button`,disabled:g.value,onClick:B},U(S(T)(`选中完整备份`)),9,_r),d(`button`,{type:`button`,disabled:g.value||!m.value.length,onClick:t[4]||=e=>m.value=[]},U(S(T)(`取消选择`)),9,vr)]),d(`div`,yr,[(F(!0),f(o,null,w(r.value.entries,e=>(F(),f(`label`,{key:b(e),class:h([`storage-row`,{protected:e.protected}])},[d(`input`,{type:`checkbox`,checked:m.value.includes(b(e)),disabled:g.value||e.protected||r.value.running,"aria-label":e.name,onChange:t=>P(e)},null,40,br),d(`span`,xr,[d(`strong`,null,U(e.name),1),d(`small`,null,U(j(e.kind))+` · `+U(A(e.at))+` · `+U(e.manifest?S(T)(`有校验清单`):S(T)(`旧备份无清单`))+U(e.protected?` · `+(e.protectionReason||S(T)(`保留恢复点`)):``),1)]),d(`b`,null,U(k(e.bytes)),1)],2))),128))]),v.value.length?(F(),f(`div`,Sr,[d(`p`,null,U(S(T)(`部分备份未清理,请刷新列表后重试`)),1),(F(!0),f(o,null,w(v.value,e=>(F(),f(`p`,{key:e.name},U(e.name)+` · `+U(e.error),1))),128))])):u(``,!0),d(`div`,Cr,[d(`span`,null,U(S(T)(`已选 {count} 份 · 约 {size}`,{count:C.value.length,size:k(E.value)})),1),d(`button`,{class:`primary`,type:`button`,disabled:g.value||r.value.running||!C.value.length,onClick:W},U(S(T)(`清理所选`)),9,wr)])])])):u(``,!0)]))}}),[[`__scopeId`,`data-v-6248710c`]]),Er={class:`page system`},Dr={class:`system-intro`},Or={class:`eyebrow`},kr={class:`system-status`},Ar=k(m({__name:`SystemPage`,setup(e){let t=[`connect`,`models`,`search`,`runtime`,`storage`],n=O(t.includes(I.sub)?I.sub:`connect`);async function i(e){e!==n.value&&(!I.dirty||await H(T(`当前设置还没保存,离开这个分区吗?`),{title:T(`未保存的修改`),confirmText:T(`放弃修改`),cancelText:T(`继续编辑`)}))&&(I.dirty=!1,n.value=e)}return E(n,e=>j(e)),E(()=>I.sub,e=>{t.includes(e)&&(n.value=e)}),(e,t)=>(F(),f(`div`,Er,[d(`header`,Dr,[d(`div`,null,[d(`span`,Or,U(S(T)(`THE WORLD AROUND HER · 系统`)),1),d(`h1`,null,[a(U(S(T)(`让她与世界,`)),1),d(`em`,null,U(S(T)(`温柔相连。`)),1)]),d(`p`,null,U(S(T)(`连接、模型与运行方式都在这里。每一处改变,都可以看见结果。`)),1)]),d(`span`,kr,[d(`i`,{class:h({off:!S(I).health.connection?.online})},null,2),a(` `+U(S(I).health.connection?.online?S(T)(`正在与 QQ 相连`):S(T)(`等待 QQ 连接`)),1)])]),P(te,{"model-value":n.value,"onUpdate:modelValue":i,label:S(T)(`系统的分区`),items:[{key:`connect`,label:S(T)(`连接 QQ`)},{key:`models`,label:S(T)(`模型库`)},{key:`search`,label:S(T)(`独立搜索`)},{key:`runtime`,label:S(T)(`运行开关`)},{key:`storage`,label:S(T)(`数据与备份`)}]},null,8,[`model-value`,`label`,`items`]),n.value===`connect`?(F(),r(Ie,{key:0,onOpen:i})):n.value===`models`?(F(),r(dn,{key:1})):n.value===`search`?(F(),r(qn,{key:2})):n.value===`runtime`?(F(),r(wn,{key:3})):(F(),r(Tr,{key:4}))]))}}),[[`__scopeId`,`data-v-ed17d7d1`]]);export{Ar as default};
@@ -0,0 +1 @@
1
+ .day-agenda[data-v-10b48f6c]{gap:18px;min-width:0;display:grid}.agenda-heading[data-v-10b48f6c]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;display:flex}h2[data-v-10b48f6c]{margin:6px 0 0;font-size:24px}h3[data-v-10b48f6c]{font-size:16px}p[data-v-10b48f6c]{overflow-wrap:anywhere;line-height:1.7}.agenda-range[data-v-10b48f6c]{gap:6px;display:flex}.agenda-range button[data-v-10b48f6c]{padding:8px 12px;font-size:12px}.agenda-range button[aria-pressed=true][data-v-10b48f6c]{background:var(--accent);color:#fff}.agenda-legend[data-v-10b48f6c]{color:var(--muted);flex-wrap:wrap;gap:16px;font-size:12px;display:flex}.agenda-legend span[data-v-10b48f6c]:before{content:"";border-radius:3px;width:16px;height:8px;margin-right:6px;display:inline-block}.legend-actual[data-v-10b48f6c]:before{background:var(--accent)}.legend-plan[data-v-10b48f6c]:before{border:1px dashed var(--accent);background:var(--glow-b)}.legend-free[data-v-10b48f6c]:before{background:#7d789526}.legend-point[data-v-10b48f6c]{color:var(--accent)}.legend-point[data-v-10b48f6c]:before{display:none!important}.agenda-chart[data-v-10b48f6c]{min-width:0;padding:18px 0 0}.agenda-axis[data-v-10b48f6c]{height:28px;color:var(--muted);margin-left:60px;margin-right:12px;font-size:11px;position:relative}.agenda-axis time[data-v-10b48f6c]{white-space:nowrap;position:absolute;transform:translate(-50%)}.agenda-axis time[data-v-10b48f6c]:first-child{transform:none}.agenda-axis time[data-v-10b48f6c]:last-child{transform:translate(-100%)}.agenda-lane[data-v-10b48f6c]{grid-template-columns:60px minmax(0,1fr);align-items:center;gap:0;margin-bottom:14px;margin-right:12px;display:grid}.lane-label[data-v-10b48f6c]{color:var(--muted);font-size:11px}.lane-track[data-v-10b48f6c]{background:#8580950f;border-radius:8px;height:40px;position:relative}.gridline[data-v-10b48f6c]{pointer-events:none;border-left:1px solid #7d789526;position:absolute;top:0;bottom:0}.agenda-block[data-v-10b48f6c]{min-width:1px;height:26px;box-shadow:none;border-radius:5px;padding:0;position:absolute;top:7px}.actual[data-v-10b48f6c]{background:linear-gradient(100deg, var(--accent), var(--orb-b));border:none}.ongoing[data-v-10b48f6c]{outline:2px solid var(--accent);outline-offset:2px}.plan[data-v-10b48f6c]{border:1px dashed var(--accent);background:var(--glow-b)}.rest[data-v-10b48f6c],.free[data-v-10b48f6c]{background:#7d78951f}.free[data-v-10b48f6c]{background:repeating-linear-gradient(135deg,#0000,#0000 5px,#7d789514 5px 8px)}.sleep[data-v-10b48f6c]{background:#7274a140}.agenda-now[data-v-10b48f6c]{background:var(--accent);pointer-events:none;width:1px;position:absolute;top:-4px;bottom:-4px}.agenda-now small[data-v-10b48f6c]{color:var(--accent);white-space:nowrap;font-size:10px;position:absolute;top:-18px;transform:translate(-50%)}.agenda-interaction[data-v-10b48f6c]{background:var(--accent);border-radius:50%;width:5px;height:5px;position:absolute;bottom:0;transform:translate(-50%)}.agenda-itinerary[data-v-10b48f6c]{gap:0;margin:0;padding:0;list-style:none;display:grid}.agenda-itinerary li[data-v-10b48f6c]{border-bottom:1px solid #7d78951f;grid-template-columns:72px minmax(0,1fr);gap:18px;padding:14px 0;display:grid}.agenda-itinerary time[data-v-10b48f6c]{color:var(--muted);font-variant-numeric:tabular-nums;font-size:12px;line-height:1.9}.agenda-itinerary li>div[data-v-10b48f6c]{align-content:start;gap:5px;min-width:0;display:grid}.agenda-itinerary button[data-v-10b48f6c]{text-align:left;overflow-wrap:anywhere;white-space:normal;justify-self:start;line-height:1.6}.agenda-itinerary small[data-v-10b48f6c]{color:var(--muted);font-size:12px;line-height:1.8}.agenda-itinerary b[data-v-10b48f6c]{font-size:14px}.agenda-itinerary p[data-v-10b48f6c]{font-size:13px}.agenda-itinerary [data-kind=free][data-v-10b48f6c],.agenda-itinerary [data-kind=rest][data-v-10b48f6c]{color:var(--muted)}summary[data-v-10b48f6c]{color:var(--muted);cursor:pointer;font-size:13px}.agenda-history ol[data-v-10b48f6c],.agenda-waiting ul[data-v-10b48f6c]{margin-top:15px}.agenda-waiting ul[data-v-10b48f6c]{gap:16px;padding:0;list-style:none;display:grid}@media (width<=440px){.agenda-axis time[data-v-10b48f6c]:nth-child(2n){display:none}.agenda-axis[data-v-10b48f6c]{margin-left:46px}.agenda-lane[data-v-10b48f6c]{grid-template-columns:46px minmax(0,1fr)}.agenda-axis time[data-v-10b48f6c]{font-size:9px}.agenda-itinerary li[data-v-10b48f6c]{grid-template-columns:54px minmax(0,1fr);gap:12px}.agenda-heading h2[data-v-10b48f6c]{font-size:21px}.agenda-legend[data-v-10b48f6c]{gap:10px}}.experience-log[data-v-400cba84]{gap:28px;min-width:0;display:grid}.experience-intro[data-v-400cba84]{justify-content:space-between;align-items:end;gap:20px;padding:4px 4px 0;display:flex}.experience-intro h1[data-v-400cba84]{letter-spacing:-.03em;margin-top:8px;font-size:clamp(25px,2.4vw,32px)}.experience-intro p[data-v-400cba84]{max-width:330px;color:var(--muted);font-size:14px;line-height:1.7}.experience-day[data-v-400cba84]{gap:14px;min-width:0;display:grid}.experience-date[data-v-400cba84]{color:var(--muted);padding-left:4px;font-size:13px;font-weight:600}.experience-timeline[data-v-400cba84]{gap:18px;min-width:0;display:grid}.experience-entry[data-v-400cba84]{grid-template-columns:58px minmax(0,1fr);gap:18px;display:grid;position:relative}.experience-entry[data-v-400cba84]:before{content:"";background:var(--line);width:1px;position:absolute;top:48px;bottom:-18px;left:29px}.experience-entry[data-v-400cba84]:last-child:before{bottom:0}.experience-clock[data-v-400cba84]{font-variant-numeric:tabular-nums;text-align:center;color:var(--muted);padding-top:25px;font-size:13px}.experience-card.card[data-v-400cba84]{border-radius:24px;gap:12px;min-width:0;padding:24px 28px;display:grid}.experience-meta[data-v-400cba84]{flex-wrap:wrap;align-items:center;gap:8px 14px;font-size:12px;display:flex}.experience-kind[data-v-400cba84]{color:var(--accent);font-weight:600}.experience-card h3[data-v-400cba84]{overflow-wrap:anywhere;font-size:21px;line-height:1.45}.experience-summary[data-v-400cba84]{-webkit-line-clamp:4;white-space:normal;overflow-wrap:anywhere;-webkit-box-orient:vertical;font-size:14px;line-height:1.85;display:-webkit-box;overflow:hidden}.experience-project[data-v-400cba84],.experience-missing[data-v-400cba84]{overflow-wrap:anywhere;font-size:12px;line-height:1.7}.experience-actions[data-v-400cba84]{flex-wrap:wrap;align-items:center;gap:10px 20px;display:flex}.experience-actions button[data-v-400cba84]{font-size:13px}.experience-materials[data-v-400cba84]{border-top:1px solid var(--line);min-width:0;padding-top:12px}.experience-materials summary[data-v-400cba84]{color:var(--muted);cursor:pointer;font-size:12px}.experience-materials ul[data-v-400cba84]{gap:6px;margin:10px 0 0;padding-left:18px;display:grid}.experience-materials button[data-v-400cba84]{text-align:left;white-space:normal;overflow-wrap:anywhere;font-size:13px;line-height:1.7}.experience-capability[data-v-400cba84]{border:1px solid var(--line);border-radius:18px;margin-left:76px;padding:16px 20px;font-size:12px}.experience-capability summary[data-v-400cba84]{cursor:pointer}.experience-capability summary span[data-v-400cba84]{margin-left:12px}.experience-capability p[data-v-400cba84]{margin-top:12px;line-height:1.75}@media (width<=760px){.experience-intro[data-v-400cba84]{gap:10px;display:grid}.experience-intro p[data-v-400cba84]{max-width:none}.experience-entry[data-v-400cba84]{grid-template-columns:minmax(0,1fr);gap:8px}.experience-entry[data-v-400cba84]:before{display:none}.experience-clock[data-v-400cba84]{text-align:left;padding:0 4px}.experience-card.card[data-v-400cba84]{padding:20px}.experience-card h3[data-v-400cba84]{font-size:19px}.experience-capability[data-v-400cba84]{margin-left:0}}.time-page[data-v-6804b51c]{gap:var(--gap);min-width:0;display:grid}.time-intro[data-v-6804b51c]{background:linear-gradient(120deg, #ffffffd9, var(--glow-b));border:1px solid #fffc;border-radius:32px;justify-content:space-between;align-items:center;gap:24px;padding:32px clamp(24px,4vw,48px);display:flex}.time-intro h1[data-v-6804b51c]{letter-spacing:-.03em;font-size:clamp(25px,2.6vw,38px);line-height:1.35}.time-intro em[data-v-6804b51c]{color:var(--accent);font-style:normal}.time-intro p[data-v-6804b51c]{color:var(--muted);margin-top:14px}.time-clock[data-v-6804b51c]{text-align:center;background:linear-gradient(150deg, white, var(--orb-b));border:1px solid #fff;border-radius:50%;flex:none;place-content:center;width:140px;height:140px;display:grid;box-shadow:inset 0 0 0 9px #ffffff47}.time-clock span[data-v-6804b51c]{font-size:44px;font-weight:650}.time-clock small[data-v-6804b51c]{color:var(--muted);font-size:10px}.time-today[data-v-6804b51c],.work-grid[data-v-6804b51c]{gap:var(--gap);grid-template-columns:repeat(2,minmax(0,1fr));display:grid}.time-page .card[data-v-6804b51c]{align-content:start;gap:14px;min-width:0;display:grid}.time-page h2[data-v-6804b51c]{overflow-wrap:anywhere;font-size:22px;line-height:1.4}.time-page p[data-v-6804b51c],.time-page small[data-v-6804b51c]{overflow-wrap:anywhere;line-height:1.75}.time-cards[data-v-6804b51c]{gap:16px;display:grid}.time-page .time-task[data-v-6804b51c]{gap:12px}.time-filter[data-v-6804b51c]{flex-wrap:wrap;gap:12px;min-width:0;display:flex}.time-filter label[data-v-6804b51c]{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.time-filter input[data-v-6804b51c]{min-width:0;max-width:100%}.work-card[data-v-6804b51c]{text-align:left;cursor:pointer;font:inherit;color:inherit;border:1px solid #ffffffe6;transition:transform .18s}.work-card[data-v-6804b51c]:hover{transform:translateY(-2px)}.time-settings form[data-v-6804b51c]{grid-template-columns:repeat(2,minmax(0,1fr));gap:15px;margin-top:18px;display:grid}.time-settings label[data-v-6804b51c]{gap:8px;min-width:0;display:grid}.time-settings input[data-v-6804b51c]{width:100%}.time-settings button[data-v-6804b51c]{justify-self:start}.time-pagination[data-v-6804b51c]{justify-content:center}.work-body[data-v-6804b51c]{white-space:pre-wrap;overflow-wrap:anywhere;padding:20px 0;font-size:16px;line-height:1.95}.share-status[data-v-6804b51c]{color:var(--accent)}.task-meta .task-priority[data-v-6804b51c]{color:var(--muted);white-space:nowrap;flex:none;align-items:center;gap:8px;font-size:12px;display:flex}.task-meta .task-priority span[data-v-6804b51c]{flex:none}.task-meta .task-priority .menu-select[data-v-6804b51c]{flex:none;width:100px;min-width:70px}.task-meta .task-priority[data-v-6804b51c] .menu-face{min-height:34px;padding:6px 10px}.task-sources summary[data-v-6804b51c]{color:var(--muted);font-size:12px}.time-page .list li[data-v-6804b51c]{overflow-wrap:anywhere;flex-wrap:wrap;align-items:center;gap:12px;display:flex}.time-page dl[data-v-6804b51c]{gap:12px;display:grid}.time-page dd[data-v-6804b51c]{overflow-wrap:anywhere;margin:0}@media (width<=760px){.time-today[data-v-6804b51c],.work-grid[data-v-6804b51c]{grid-template-columns:minmax(0,1fr)}.time-clock[data-v-6804b51c]{display:none}.time-intro[data-v-6804b51c]{padding:26px 22px}.time-settings form[data-v-6804b51c]{grid-template-columns:minmax(0,1fr)}}@media (width<=440px){.time-page .row[data-v-6804b51c]{gap:9px}.time-page h2[data-v-6804b51c]{font-size:20px}}
@@ -0,0 +1,3 @@
1
+ import{B as e,D as t,H as n,I as r,K as i,L as a,P as o,T as ee,U as s,V as c,W as l,Y as u,_ as d,_t as f,b as p,dt as m,ft as h,gt as g,ht as _,i as v,it as y,k as b,lt as x,m as S,mt as C,n as w,nt as te,o as ne,q as T,rt as E,s as D,t as re,tt as ie,v as O,vt as k,w as A,yt as j}from"./Empty-CpP5kQHH.js";import{t as M}from"./formatters-ZmW_xFHw.js";import{I as ae,N,a as oe,c as se,n as ce,o as le}from"./index-BheRW-1t.js";var P=[`aria-label`],F={class:`agenda-heading`},I={class:`eyebrow`},L=[`aria-label`],R=[`aria-pressed`],z=[`aria-pressed`],B={class:`muted`},V={class:`agenda-legend`},ue={class:`legend-actual`},de={class:`legend-plan`},H={class:`legend-free`},U={class:`legend-point`},W={class:`agenda-chart`},G={class:`agenda-axis`},fe={class:`agenda-lane`},pe={class:`lane-label`},me={class:`lane-track`},he=[`title`,`aria-label`,`onClick`],ge=[`title`],K={class:`agenda-lane`},q={class:`lane-label`},J={class:`lane-track`},_e=[`title`,`aria-label`,`onClick`],Y=[`title`],X={key:0,class:`agenda-history`},Z={class:`agenda-itinerary`},ve=[`onClick`],Q={key:1,class:`faint`},$={key:2,class:`faint`},ye={class:`agenda-itinerary`},be=[`data-kind`],xe=[`onClick`],Se={key:0,class:`muted`},Ce={key:2,class:`faint`},we={key:3,class:`faint`},Te={key:4,class:`agenda-waiting`,open:``},Ee=[`onClick`],De={class:`muted`},Oe={key:5,class:`agenda-waiting`,open:``},ke=[`onClick`],Ae={class:`muted`},je={key:6,class:`agenda-waiting`,open:``},Me=[`onClick`],Ne={class:`muted`},Pe=w(u({__name:`DayAgenda`,props:{agenda:{}},emits:[`task`],setup(t,{emit:n}){let r=t,o=n,u=C(!0),d=e(()=>{let e=r.agenda;if(!u.value)return[e.start,e.end];let t=Math.max(e.start,Math.min(e.end-216e5,Math.floor((e.now-e.start)/36e5)*36e5+e.start-36e5));return[t,Math.min(e.end,t+216e5)]}),p=e=>e===r.agenda.end?`24:00`:M(ee(),{timeZone:r.agenda.zone,hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`}).format(new Date(e)),m=e=>(e-d.value[0])/(d.value[1]-d.value[0])*100,h=e=>(e.chartEnd??e.end)>e.start&&(e.chartEnd??e.end)>d.value[0]&&e.start<d.value[1],_=e=>({left:Math.max(0,m(e.start))+`%`,width:Math.max(.3,Math.min(100,m(e.chartEnd??e.end))-Math.max(0,m(e.start)))+`%`}),v=e(()=>Array.from({length:7},(e,t)=>d.value[0]+(d.value[1]-d.value[0])*t/6)),x=e(()=>r.agenda.planned.filter(e=>e.kind!==`sleep`).slice(0,18)),S=e=>`${p(e.start)} — ${p(e.end)} · ${e.title} · ${e.label||{rest:b(`休息建议`),free:b(`自由安排`),sleep:b(`作息安排`)}[e.kind]||b(`已发生`)}`,w=e=>e.engagedMs===null?b(`此前时长未单独记录`):b(`实际投入 {v} 分钟`,{v:Math.floor(e.engagedMs/6e4)});return(e,n)=>(E(),l(`section`,{class:`card day-agenda`,"aria-label":g(b)(`今日时间表`)},[c(`div`,F,[c(`div`,null,[c(`span`,I,j(t.agenda.date),1),c(`h2`,null,j(g(b)(`今日时间表`)),1)]),c(`div`,{class:`agenda-range`,role:`group`,"aria-label":g(b)(`时间表显示范围`)},[c(`button`,{"aria-pressed":u.value,onClick:n[0]||=e=>u.value=!0},j(g(b)(`此刻附近`)),9,R),c(`button`,{"aria-pressed":!u.value,onClick:n[1]||=e=>u.value=!1},j(g(b)(`全天`)),9,z)],8,L)]),c(`p`,B,j(t.agenda.note),1),c(`div`,V,[c(`span`,ue,j(g(b)(`实际时段`)),1),c(`span`,de,j(g(b)(`选定的安排`)),1),c(`span`,H,j(g(b)(`作息 / 空白`)),1),c(`span`,U,j(g(b)(`● 伴随交流`)),1)]),c(`div`,W,[c(`div`,G,[(E(!0),l(a,null,y(v.value,(e,t)=>(E(),l(`time`,{key:e,style:k({left:t*100/6+`%`})},j(p(e)),5))),128))]),c(`div`,fe,[c(`span`,pe,j(g(b)(`已发生`)),1),c(`div`,me,[(E(!0),l(a,null,y(v.value.slice(0,-1),(e,t)=>(E(),l(`i`,{key:e,class:`gridline`,style:k({left:t*100/6+`%`})},null,4))),128)),(E(!0),l(a,null,y(t.agenda.actual.filter(h),e=>(E(),l(`button`,{key:e.id,class:f([`agenda-block actual`,{ongoing:e.ongoing}]),style:k(_(e)),title:S(e)+` · `+w(e),"aria-label":S(e),onClick:t=>o(`task`,e.taskId)},null,14,he))),128)),(E(!0),l(a,null,y(t.agenda.interactions.filter(e=>e.at>=d.value[0]&&e.at<d.value[1]),e=>(E(),l(`span`,{key:e.id,class:`agenda-interaction`,style:k({left:m(e.at)+`%`}),title:p(e.at)+g(b)(` · 伴随交流`)},null,12,ge))),128)),m(t.agenda.now)>=0&&m(t.agenda.now)<=100?(E(),l(`span`,{key:0,class:`agenda-now`,style:k({left:m(t.agenda.now)+`%`})},[c(`small`,null,j(g(b)(`现在`)),1)],4)):s(``,!0)])]),c(`div`,K,[c(`span`,q,j(g(b)(`接下来`)),1),c(`div`,J,[(E(!0),l(a,null,y(v.value.slice(0,-1),(e,t)=>(E(),l(`i`,{key:e,class:`gridline`,style:k({left:t*100/6+`%`})},null,4))),128)),(E(!0),l(a,null,y(t.agenda.planned.filter(h),e=>(E(),l(a,{key:e.id},[e.taskId?(E(),l(`button`,{key:0,class:`agenda-block plan`,style:k(_(e)),title:S(e),"aria-label":S(e),onClick:t=>o(`task`,e.taskId)},null,12,_e)):(E(),l(`span`,{key:1,class:f([`agenda-block`,e.kind]),style:k(_(e)),title:S(e)},null,14,Y))],64))),128))])])]),t.agenda.actual.length?(E(),l(`details`,X,[c(`summary`,null,j(g(b)(`已经走过的时段 · {length} 段`,{length:t.agenda.actual.length})),1),c(`ol`,Z,[(E(!0),l(a,null,y(t.agenda.actual,e=>(E(),l(`li`,{key:e.id},[c(`time`,null,[i(j(p(e.start)),1),n[2]||=c(`br`,null,null,-1),i(j(p(e.end)),1)]),c(`div`,null,[c(`button`,{class:`text-button`,onClick:t=>o(`task`,e.taskId)},j(e.title),9,ve),c(`small`,null,j(e.label)+` · `+j(w(e)),1)])]))),128))])])):(E(),l(`p`,Q,j(g(b)(`今天还没有活动记录,实际开始后会显示在上方。`)),1)),c(`h3`,null,j(g(b)(`她定下的安排`)),1),x.value.length?s(``,!0):(E(),l(`p`,$,j(g(b)(`还没有选定活动时间,留白由她再决定,不按待办队列填满。`)),1)),c(`ol`,ye,[(E(!0),l(a,null,y(x.value,e=>(E(),l(`li`,{key:e.id,"data-kind":e.kind},[c(`time`,null,[i(j(p(e.start)),1),n[3]||=c(`br`,null,null,-1),i(j(p(e.end)),1)]),c(`div`,null,[e.taskId?(E(),l(a,{key:0},[c(`button`,{class:`text-button`,onClick:t=>o(`task`,e.taskId)},j(e.title),9,xe),c(`small`,null,j(g(b)(`{label} · {v} · {durationMinutes} 分钟 · {scope}`,{label:e.label,v:e.kindOfTask===`plan`?g(b)(`自己的安排`):e.kindOfTask===`promise`?g(b)(`答应的事`):g(b)(`外部建议`),durationMinutes:e.durationMinutes,scope:e.scope})),1),e.why?(E(),l(`p`,Se,j(e.why),1)):s(``,!0)],64)):(E(),l(a,{key:1},[c(`b`,null,j(e.title),1),c(`small`,null,j(e.kind===`free`?g(b)(`可以想自己的事,也可以歇着;不算已做过`):g(b)(`预计,做完眼前这段再调整`)),1)],64)),e.interruptedAt?(E(),l(`p`,Ce,j(p(e.interruptedAt))+` `+j(e.interruption===`sleep`?g(b)(`进入睡眠安排,醒来后再选择续接时间。`):g(b)(`有更高优先级安排,届时先让位,之后再选续接时间。`)),1)):s(``,!0)])],8,be))),128))]),t.agenda.planned.some(e=>e.kind===`sleep`)?(E(),l(`p`,we,j(g(b)(`睡眠安排:{v}`,{v:t.agenda.planned.filter(e=>e.kind===`sleep`).map(e=>p(e.start)+` — `+p(e.end)).join(`、`)})),1)):s(``,!0),t.agenda.unarranged?.length?(E(),l(`details`,Te,[c(`summary`,null,j(g(b)(`已记下,还没选时间 · {length} 件`,{length:t.agenda.unarranged.length})),1),c(`ul`,null,[(E(!0),l(a,null,y(t.agenda.unarranged,e=>(E(),l(`li`,{key:e.id},[c(`button`,{class:`text-button`,onClick:t=>o(`task`,e.id)},j(e.title),9,Ee),c(`p`,De,j(e.reason),1)]))),128))])])):s(``,!0),t.agenda.paused?.length?(E(),l(`details`,Oe,[c(`summary`,null,j(g(b)(`暂时停下来,进度保留 · {length} 件`,{length:t.agenda.paused.length})),1),c(`ul`,null,[(E(!0),l(a,null,y(t.agenda.paused,e=>(E(),l(`li`,{key:e.id},[c(`button`,{class:`text-button`,onClick:t=>o(`task`,e.id)},j(e.title),9,ke),c(`p`,Ae,j(e.reason),1)]))),128))])])):s(``,!0),t.agenda.waiting.length?(E(),l(`details`,je,[c(`summary`,null,j(g(b)(`需要条件或调整约定 · {length} 件`,{length:t.agenda.waiting.length})),1),c(`ul`,null,[(E(!0),l(a,null,y(t.agenda.waiting,e=>(E(),l(`li`,{key:e.id},[c(`button`,{class:`text-button`,onClick:t=>o(`task`,e.id)},j(e.title),9,Me),c(`p`,Ne,j(e.reason),1)]))),128))])])):s(``,!0)],8,P))}}),[[`__scopeId`,`data-v-10b48f6c`]]),Fe=[`aria-label`],Ie={class:`experience-intro`},Le={class:`eyebrow`},Re={class:`experience-date`},ze={class:`experience-timeline`},Be=[`data-experience`],Ve=[`datetime`],He={class:`card experience-card`},Ue={class:`experience-meta`},We={class:`experience-kind`},Ge={key:0,class:`faint`},Ke={key:0,class:`experience-summary`},qe={key:1,class:`faint experience-missing`},Je={key:2,class:`experience-project faint`},Ye={key:3,class:`experience-actions`},Xe=[`onClick`],Ze=[`onClick`],Qe={key:4,class:`experience-materials`},$e=[`onClick`],et={class:`experience-capability`},tt={class:`faint`},nt={class:`muted`},rt=w(u({__name:`ExperienceLog`,props:{rows:{},zone:{},loading:{type:Boolean}},emits:[`work`,`project`,`source`],setup(t,{emit:r}){let o=t,u=r,d=e(()=>{let e=M(ee(),{timeZone:o.zone,year:`numeric`,month:`long`,day:`numeric`,weekday:`short`}),t=[];for(let n of o.rows){let r=e.format(n.created);t.at(-1)?.date!==r&&t.push({date:r,rows:[]}),t.at(-1).rows.push(n)}return t});function f(e){return M(ee(),{timeZone:o.zone,hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`}).format(e)}return(e,r)=>(E(),l(`section`,{class:`experience-log`,"aria-label":g(b)(`体验记录`)},[c(`header`,Ie,[c(`div`,null,[c(`span`,Le,j(g(b)(`EXPERIENCES · 留下的经历`)),1),c(`h1`,null,j(g(b)(`最近做过的事`)),1)]),c(`p`,null,j(g(b)(`故事写到哪里,玩过什么,又留下了哪些想法。`)),1)]),(E(!0),l(a,null,y(d.value,e=>(E(),l(`section`,{key:e.date,class:`experience-day`},[c(`h2`,Re,j(e.date),1),c(`div`,ze,[(E(!0),l(a,null,y(e.rows,e=>(E(),l(`article`,{key:e.id,class:`experience-entry`,"data-experience":e.id},[c(`time`,{class:`experience-clock`,datetime:new Date(e.created).toISOString()},j(f(e.created)),9,Ve),c(`div`,He,[c(`div`,Ue,[c(`span`,We,j(g(b)(`{label}记录`,{label:e.label})),1),e.work?(E(),l(`span`,Ge,j(g(b)(`{v} · {characters} 字 · 版本 {version}`,{v:e.work.state===`complete`?g(b)(`已保存成果`):g(b)(`已保存草稿`),characters:e.work.characters,version:e.work.version})),1)):s(``,!0)]),c(`h3`,null,j(e.title),1),e.summary?(E(),l(`p`,Ke,j(e.summary),1)):(E(),l(`p`,qe,j(g(b)(`这条旧记录没有保存摘要。`)),1)),e.project?.title&&e.project.title!==e.title?(E(),l(`p`,Je,j(g(b)(`来自 {title}`,{title:e.project.title})),1)):s(``,!0),e.work||e.project?(E(),l(`div`,Ye,[e.work?(E(),l(`button`,{key:0,onClick:t=>u(`work`,e.work.id,e.work.version)},[i(j(e.activity===`write`?g(b)(`阅读这一稿`):g(b)(`阅读完整记录`)),1),r[0]||=c(`span`,{"aria-hidden":`true`},` →`,-1)],8,Xe)):s(``,!0),e.project?(E(),l(`button`,{key:1,class:`text-button`,onClick:t=>u(`project`,e.project.id)},j(g(b)(`查看项目`)),9,Ze)):s(``,!0)])):s(``,!0),e.materials?.length?(E(),l(`details`,Qe,[c(`summary`,null,j(g(b)(`接触的内容 · {length} 份`,{length:e.materials.length})),1),c(`ul`,null,[(E(!0),l(a,null,y(e.materials,e=>(E(),l(`li`,{key:e.id},[c(`button`,{class:`text-button`,onClick:t=>u(`source`,e.id)},j(e.title||g(b)(`未命名资料`)),9,$e)]))),128))])])):s(``,!0)])],8,Be))),128))])]))),128)),!t.loading&&!t.rows.length?(E(),n(re,{key:0,title:g(b)(`这里还没有经历记录`),text:g(b)(`做过的事与保存的成果,会逐渐出现在这里。`)},null,8,[`title`,`text`])):s(``,!0),c(`details`,et,[c(`summary`,null,[i(j(g(b)(`游戏客户端连接`))+` `,1),c(`span`,tt,j(g(b)(`开发中`)),1)]),c(`p`,nt,j(g(b)(`客户端控制尚未接入。已有的游玩记录可以在上方阅读。`)),1)])],8,Fe))}}),[[`__scopeId`,`data-v-400cba84`]]),it={class:`page time-page`},at={class:`time-intro`},ot={class:`eyebrow`},st={class:`time-clock`,"aria-hidden":`true`},ct={key:0,class:`card`,role:`alert`},lt={key:1,class:`muted`,role:`status`},ut={class:`time-today`},dt={class:`card main-activity`},ft={class:`eyebrow`},pt={class:`chip`},mt={key:0,class:`faint`},ht={key:1,class:`faint`},gt={class:`muted`},_t={class:`muted`},vt={key:0,class:`faint`},yt={class:`card day-balance`},bt={class:`eyebrow`},xt={class:`muted`},St={key:1,class:`card own-care`},Ct={class:`eyebrow`},wt={key:0,class:`muted`},Tt={key:1,class:`faint`},Et=[`disabled`],Dt={class:`card time-settings`},Ot=[`disabled`],kt={key:1},At={class:`sr-only`},jt=[`placeholder`],Mt={key:2},Nt={key:0,class:`time-cards`},Pt=[`data-task`],Ft={class:`row task-meta`},It=[`data-tone`],Lt={class:`faint`},Rt={class:`task-priority`},zt={key:0,class:`muted`},Bt={class:`faint`},Vt={key:1,class:`muted`},Ht={key:2,class:`share-status`},Ut={key:3,class:`muted`},Wt={class:`task-sources`},Gt={key:0,class:`faint`},Kt={class:`faint`},qt={key:1,class:`muted`},Jt={class:`row`},Yt=[`onClick`],Xt=[`onClick`],Zt=[`onClick`],Qt=[`onClick`],$t=[`onClick`],en=[`onClick`],tn={key:1,class:`time-cards work-grid`},nn=[`data-work`,`onClick`],rn={class:`eyebrow`},an={class:`faint`},on={key:2,class:`time-cards work-grid`},sn={class:`eyebrow`},cn={class:`muted`},ln=[`onClick`],un={class:`row time-pagination`},dn=[`disabled`],fn=[`disabled`],pn={class:`row`},mn={class:`chip`},hn={class:`work-body`},gn={class:`muted`},_n={key:0},vn={class:`row`},yn={class:`list`},bn=[`onClick`],xn={key:1},Sn={class:`list`},Cn=[`onClick`],wn=[`href`],Tn={key:1,class:`muted`},En={class:`faint`},Dn={class:`work-body`},On=w(u({__name:`TimePage`,setup(ee){let u=[`today`,`tasks`,`works`,`projects`,`experiences`],f=C(u.includes(D.sub.split(`/`)[0])?D.sub.split(`/`)[0]:`today`),w=_(d(`/mind/time`)),k=_([]),M=C(!1),P=C(``),F=C(0),I=C(``),L=C(``),R=C(D.sub.split(`/`)[0]===`tasks`&&D.sub.split(`/`)[1]||``),z=_(null),B=_(null),V=_(null),ue=C(!1),de=C(!1),H=C(!1),U=C(!1),W=C({focusMinutes:25,breakMinutes:5,stepMinutes:5,paceSpeed:1.25,ownPlanMinutes:45,commitmentReviewMinutes:30}),G=e(()=>ae.data?.clock?.timeZone||`Asia/Shanghai`),fe=t({todo:A(`ToDo · 待办`),scheduled:A(`Scheduled · 已安排`),doing:A(`Doing · 正在做`),paused:A(`Paused · 暂停`),waiting:A(`Waiting · 等待`),done:A(`Done · 已完成`),abandoned:A(`Abandoned · 已放下`)}),pe=t({none:``,waiting:A(`完成,尚未交付`),deferred:A(`暂缓交付`),declined:A(`暂不分享`),pending:A(`待继续交付`),sent:A(`已完整交付`),reported:A(`已整理并汇报`),uncertain:A(`送达不确定,等待核对`),sending:A(`正在交付`)}),me=t({0:A(`低`),1:A(`普通`),2:A(`高`),3:A(`最高`)});function he(e){return e.state===`waiting`?e.waitKind===`adjust`?b(`需要调整约定`):e.waitKind===`specify`?b(`待想具体`):b(`Waiting · 等条件`):e.state===`todo`&&!e.schedule?.chosenAt?b(`ToDo · 待选时间`):e.state===`scheduled`?b(`Scheduled · 已选时间`):e.state===`paused`?b(`Paused · 进度保留`):fe[e.state]}async function ge(e,t){try{await S(`/mind/time/tasks/`+e.id+`/control`,`POST`,{action:`priority`,priority:t}),await Y()}catch(e){O(e.message,!0)}}let K=e=>b(`{v} 分钟`,{v:Math.floor((e||0)/6e4)}),q=e=>b(`{v} 分钟`,{v:Math.ceil((e||0)/6e4)}),J=0;function _e(){let e=new URLSearchParams({limit:`24`,offset:String(F.value)});return I.value&&e.set(`q`,I.value),f.value===`tasks`&&L.value&&e.set(`state`,L.value),f.value===`tasks`&&R.value&&e.set(`id`,R.value),`/mind/time/`+f.value+`?`+e}async function Y(){let e=++J,t=f.value===`today`?`/mind/time`:_e(),n=d(t);n&&(f.value===`today`?w.value=n:k.value=n),M.value=!n,P.value=``;try{let n=await S(t);if(e!==J)return;f.value===`today`?(w.value=n,H.value||(W.value={...n.settings})):(k.value=n,de.value=n.length===24)}catch(t){e===J&&(P.value=t.message)}finally{e===J&&(M.value=!1)}}async function X(e,t){ue.value=!0;try{z.value=await S(`/mind/time/works/`+encodeURIComponent(e)+(t?`?version=`+t:``)),B.value=null,V.value=null}catch(e){O(e.message,!0)}finally{ue.value=!1}}async function Z(e){try{let t=await S(`/mind/time/projects/`+e),[n,r]=await Promise.all([S(`/mind/time/works?project=`+e),S(`/mind/time/projects/`+e+`/sources`)]);B.value={...t,works:n,sources:r},z.value=null,V.value=null}catch(e){O(e.message,!0)}}async function ve(e){try{V.value=await S(`/mind/time/sources/`+e)}catch(e){O(e.message,!0)}}async function Q(e,t){let n,r;if(t===`schedule`){let t=await p(b(`最早开始时间(YYYY-MM-DD HH:mm)。截止时间保留原安排。`),{title:b(`安排时间`),confirmText:b(`继续`),placeholder:`2026-10-02 14:30`});if(t===null)return;n=t;let i=await p(b(`这次安排投入多少分钟(5 至 240)?`),{title:b(`投入时间`),confirmText:b(`继续`),placeholder:String(e.schedule?.durationMinutes||25)});if(i===null)return;r=Number(i)}let i=await p(b(t===`abandon`?`留下放下这件事的原因。`:`留下这次调整的原因。`),{title:b(`调整安排`),confirmText:b(`保存`),placeholder:b(`管理台调整`)});if(i!==null)try{await S(`/mind/time/tasks/`+e.id+`/control`,`POST`,{action:t,...n?{readyAt:n}:{},...r===void 0?{}:{durationMinutes:r},reason:i||b(`管理台调整`)}),await Y()}catch(e){O(e.message,!0)}}async function $(e){if(!B.value)return;let t=await p(b(`提出选题、续写方向或修改想法。她会自行决定是否采纳。`),{title:b(`给她一个建议`),confirmText:b(`留下建议`)});if(t!==null)try{let n=await S(`/mind/time/projects/`+B.value.id+`/suggest`,`POST`,{action:e,idea:t});O(n.duplicate?b(`这个项目已有待处理事项`):b(`建议已保存,等待她的选择`)),await Y()}catch(e){O(e.message,!0)}}async function ye(){if(!z.value)return;let e=z.value,t=new Blob([e.title+`
2
+
3
+ `+e.content],{type:`text/plain;charset=utf-8`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e.title.replace(/[\\/:*?"<>|]/g,`_`)+`-v`+e.version+`.txt`,r.click(),URL.revokeObjectURL(n)}async function be(){if(!U.value){U.value=!0,J++;try{let e=await S(`/mind/time/settings`,`PUT`,{...W.value});J++,W.value=e,H.value=!1,O(b(`专注安排已保存`)),await Y()}catch(e){O(e.message,!0)}finally{U.value=!1}}}function xe(e){R.value=e,f.value===`tasks`?Y():f.value=`tasks`,ne(`tasks/`+e)}async function Se(){try{await S(`/mind/time/care`,`POST`,{}),O(b(`已记下,空下来时回看说过的话`)),await Y()}catch(e){O(e.message,!0)}}async function Ce(){try{await S(`/mind/time/plan`,`POST`,{}),O(b(`已记下,让她重新想具体时间与投入时长`)),await Y()}catch(e){O(e.message,!0)}}function we(){F.value=0,Y()}x(f,e=>{D.page===`time`&&(F.value=0,k.value=[],I.value=``,L.value=``,e!==`tasks`&&(R.value=``),ne(e===`today`?``:e===`tasks`&&R.value?`tasks/`+R.value:e===`works`&&D.sub.startsWith(`works/`)?D.sub:e),Y())}),x(()=>[D.page,D.sub],([e,t])=>{if(e!==`time`)return;let n=t.split(`/`)[0]||`today`;if(n===`tasks`){let e=t.split(`/`)[1]||``;R.value!==e&&(R.value=e,f.value===`tasks`&&Y())}u.includes(n)&&(f.value=n),n===`works`&&t.split(`/`)[1]&&z.value?.id!==t.split(`/`)[1]&&X(t.split(`/`)[1])});let Te=oe(`time`,Y),Ee=0;return ie(()=>{Ee=window.setInterval(()=>{Te.value&&f.value===`today`&&!document.hidden&&Y()},5e3);let e=D.sub.split(`/`)[1];e&&f.value===`works`&&X(e)}),te(()=>{clearInterval(Ee),J++}),(e,t)=>(E(),l(`div`,it,[c(`header`,at,[c(`div`,null,[c(`span`,ot,j(g(b)(`TIME · 时间`)),1),c(`h1`,null,[i(j(g(b)(`日子在走,`)),1),c(`em`,null,j(g(b)(`我也有自己的事。`)),1)]),c(`p`,null,j(g(b)(`想做的事,正在留下的作品,与世界相遇的每一段。`)),1)]),c(`div`,st,[t[24]||=c(`span`,null,`25`,-1),c(`small`,null,j(g(b)(`留一点时间给自己`)),1)])]),T(ce,{modelValue:f.value,"onUpdate:modelValue":t[0]||=e=>f.value=e,label:g(b)(`时间的分区`),items:[{key:`today`,label:g(b)(`今日`)},{key:`tasks`,label:g(b)(`待办`)},{key:`works`,label:g(b)(`作品库`)},{key:`projects`,label:g(b)(`持续项目`)},{key:`experiences`,label:g(b)(`体验记录`)}]},null,8,[`modelValue`,`label`,`items`]),P.value?(E(),l(`p`,ct,[i(j(P.value)+` `,1),c(`button`,{onClick:Y},j(g(b)(`重试`)),1)])):s(``,!0),M.value?(E(),l(`p`,lt,j(g(b)(`正在取回这段生活…`)),1)):s(``,!0),f.value===`today`&&w.value?(E(),l(a,{key:2},[c(`section`,ut,[c(`article`,dt,[c(`span`,ft,j(g(b)(`此刻的主活动`)),1),w.value.current?(E(),l(a,{key:0},[c(`h2`,null,j(w.value.current.title||w.value.current.label),1),c(`span`,pt,j(w.value.current.label)+` · `+j(w.value.current.timing?.phase===`preparing`?g(b)(`正在准备`):(w.value.current.sessionElapsedMs??w.value.current.elapsedMs)<6e4?g(b)(`刚开始这一段`):g(b)(`本次已投入 `)+K(w.value.current.sessionElapsedMs??w.value.current.elapsedMs)),1),w.value.current.schedule?.chosenAt?(E(),l(`p`,mt,j(g(b)(`她安排 {v} 开始,这次想投入 {durationMinutes} 分钟。`,{v:g(N)(w.value.current.schedule.proposedAt,G.value),durationMinutes:w.value.current.schedule.durationMinutes})),1)):s(``,!0),w.value.current.timing?.plannedMs?(E(),l(`p`,ht,j(g(b)(`本段预计 {v} · 还需约 {v2}`,{v:q(w.value.current.timing.plannedMs),v2:q(w.value.current.timing.remainingMs)})),1)):s(``,!0),c(`p`,null,j(w.value.current.why||g(b)(`从自己的打算接着做。`)),1),c(`p`,gt,j(w.value.current.checkpoint?.next||g(b)(`正在推进当前步骤。`)),1),c(`button`,{class:`text-button`,onClick:t[1]||=e=>f.value=`tasks`},j(g(b)(`查看安排 →`)),1)],64)):(E(),l(a,{key:1},[c(`h2`,null,j(w.value.agenda?.idle?.title||g(b)(`这会儿没有主活动`)),1),c(`p`,_t,j(w.value.agenda?.idle?.reason||g(b)(`自己选择接下来做什么,也可以歇着。`)),1),w.value.agenda?.idle?.next?(E(),l(`p`,vt,j(g(b)(`下一项:{title} · {v} 开始 · {durationMinutes} 分钟`,{title:w.value.agenda.idle.next.title,v:g(N)(w.value.agenda.idle.next.chosenStart,G.value),durationMinutes:w.value.agenda.idle.next.durationMinutes})),1)):s(``,!0),c(`button`,{class:`text-button`,onClick:Ce},j(g(b)(`让她重新想想安排`)),1)],64))]),c(`article`,yt,[c(`span`,bt,j(g(b)(`今天`)),1),c(`h2`,null,j(K(w.value.today?.activeMs)),1),c(`p`,null,j(g(b)(`实际活动投入 · {energyLabel} · {mood}`,{energyLabel:w.value.affect?.energyLabel,mood:w.value.affect?.mood})),1),c(`p`,xt,j(g(b)(`普通交流可以伴随进行,短消息不会自动暂停。`)),1),c(`button`,{class:`text-button`,onClick:t[2]||=e=>g(v)(`life`)},j(g(b)(`翻开日记 →`)),1)])]),w.value.agenda?(E(),n(Pe,{key:0,agenda:w.value.agenda,onTask:xe},null,8,[`agenda`])):s(``,!0),w.value.care?(E(),l(`section`,St,[c(`span`,Ct,j(g(b)(`独处时理一理`)),1),c(`h2`,null,j(g(b)(`自己的打算,说过的约定`)),1),c(`p`,null,j(g(b)(`空下来时,她会想一件自己愿意做的小事,也会回看有没有漏下答应别人的事。可以选择歇着。`)),1),w.value.care.last?(E(),l(`p`,wt,[i(j(g(b)(`最近:{reason}`,{reason:w.value.care.last.reason})),1),w.value.care.last.finished?(E(),l(a,{key:0},[i(` · `+j(g(N)(w.value.care.last.finished,G.value)),1)],64)):s(``,!0)])):s(``,!0),w.value.care.pendingReplies?(E(),l(`p`,Tt,j(g(b)(`还有 {pendingReplies} 条已说过的话等着分批回看。`,{pendingReplies:w.value.care.pendingReplies})),1)):s(``,!0),c(`button`,{disabled:w.value.care.queued||!!w.value.care.working,onClick:Se},j(w.value.care.working?g(b)(`正在整理自己的生活`):w.value.care.queued?g(b)(`已记下,空下来时整理`):g(b)(`空下来整理一下约定`)),9,Et)])):s(``,!0),c(`details`,Dt,[c(`summary`,null,j(g(b)(`专注与休息安排`)),1),c(`form`,{onSubmit:r(be,[`prevent`]),onInput:t[9]||=e=>H.value=!0,onChange:t[10]||=e=>H.value=!0},[c(`label`,null,[i(j(g(b)(`默认专注段(分钟)`)),1),h(c(`input`,{"onUpdate:modelValue":t[3]||=e=>W.value.focusMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[o,W.value.focusMinutes,void 0,{number:!0}]]),c(`small`,null,j(g(b)(`没有另行选择时使用;她自己的安排优先。`)),1)]),c(`label`,null,[i(j(g(b)(`休息建议(分钟)`)),1),h(c(`input`,{"onUpdate:modelValue":t[4]||=e=>W.value.breakMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[o,W.value.breakMinutes,void 0,{number:!0}]])]),c(`label`,null,[i(j(g(b)(`保存步骤间隔(分钟)`)),1),h(c(`input`,{"onUpdate:modelValue":t[5]||=e=>W.value.stepMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[o,W.value.stepMinutes,void 0,{number:!0}]])]),c(`label`,null,[i(j(g(b)(`活动节奏`)),1),h(c(`input`,{"onUpdate:modelValue":t[6]||=e=>W.value.paceSpeed=e,type:`number`,min:`1`,max:`2`,step:`0.05`},null,512),[[o,W.value.paceSpeed,void 0,{number:!0}]]),c(`small`,null,j(g(b)(`默认 1.25 倍,所有活动按现实时间逐段推进。`)),1)]),c(`label`,null,[i(j(g(b)(`想自己的安排(间隔分钟)`)),1),h(c(`input`,{"onUpdate:modelValue":t[7]||=e=>W.value.ownPlanMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[o,W.value.ownPlanMinutes,void 0,{number:!0}]]),c(`small`,null,j(g(b)(`有空才考虑,可以决定休息。`)),1)]),c(`label`,null,[i(j(g(b)(`回看说过的话(间隔分钟)`)),1),h(c(`input`,{"onUpdate:modelValue":t[8]||=e=>W.value.commitmentReviewMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[o,W.value.commitmentReviewMinutes,void 0,{number:!0}]]),c(`small`,null,j(g(b)(`分批整理约定,保留去重与原来的选择。`)),1)]),c(`button`,{class:`primary`,disabled:U.value},j(U.value?g(b)(`正在保存`):g(b)(`保存安排`)),9,Ot)],32)])],64)):f.value===`today`?s(``,!0):(E(),l(a,{key:3},[c(`form`,{class:`time-filter`,onSubmit:r(we,[`prevent`])},[f.value===`tasks`&&R.value?(E(),l(`button`,{key:0,type:`button`,onClick:t[11]||=e=>{R.value=``,g(ne)(`tasks`),Y()}},j(g(b)(`查看全部待办`)),1)):s(``,!0),[`works`,`projects`,`experiences`].includes(f.value)?(E(),l(`label`,kt,[c(`span`,At,j(g(b)(`搜索标题`)),1),h(c(`input`,{"onUpdate:modelValue":t[12]||=e=>I.value=e,placeholder:g(b)(`搜索标题或项目`)},null,8,jt),[[o,I.value]]),c(`button`,null,j(g(b)(`搜索`)),1)])):s(``,!0),f.value===`tasks`?(E(),l(`label`,Mt,[i(j(g(b)(`任务状态`)),1),T(se,{modelValue:L.value,"onUpdate:modelValue":t[13]||=e=>L.value=e,"aria-label":g(b)(`任务状态`),options:[{value:``,label:g(b)(`全部`)},...Object.entries(g(fe)).map(([e,t])=>({value:e,label:t}))],onChange:we},null,8,[`modelValue`,`aria-label`,`options`])])):s(``,!0)],32),f.value===`tasks`?(E(),l(`div`,Nt,[(E(!0),l(a,null,y(k.value,e=>(E(),l(`article`,{key:e.id,class:`card time-task`,"data-task":e.id},[c(`div`,Ft,[c(`span`,{class:`chip`,"data-tone":e.state===`done`?`ok`:`quiet`},j(he(e)),9,It),c(`span`,Lt,j(e.kind===`promise`?g(b)(`答应的事`):e.kind===`suggestion`?g(b)(`外部建议`):g(b)(`自己的计划`))+j(e.person?` · `+e.person:``),1),c(`label`,Rt,[c(`span`,null,j(g(b)(`优先级`)),1),T(se,{"model-value":e.priority,"aria-label":g(b)(`优先级:`)+e.title,options:Object.entries(g(me)).map(([e,t])=>({value:e,label:t})),disabled:!!e.checkpoint?.mergedInto,"onUpdate:modelValue":t=>ge(e,Number(t))},null,8,[`model-value`,`aria-label`,`options`,`disabled`,`onUpdate:modelValue`])])]),c(`h2`,null,j(e.title),1),c(`p`,null,j(e.why),1),e.wait_reason?(E(),l(`p`,zt,j(e.wait_reason),1)):s(``,!0),c(`p`,Bt,[e.schedule?.chosenAt&&!e.checkpoint?.reschedule?(E(),l(a,{key:0},[i(j(g(b)(`{v} {v2} — {v3} · 这次 {durationMinutes} 分钟`,{v:e.schedule.chosenBy===`admin`?g(b)(`管理台安排`):g(b)(`她选定`),v2:g(N)(e.schedule.proposedAt,G.value),v3:g(N)(e.schedule.proposedEnd,G.value),durationMinutes:e.schedule.durationMinutes})),1)],64)):e.schedule?.startedAt?(E(),l(a,{key:1},[i(j(g(b)(`本段开始 {v}`,{v:g(N)(e.schedule.startedAt,G.value)})),1)],64)):e.schedule?.proposedAt?(E(),l(a,{key:2},[i(j(e.schedule.conditional?g(b)(`条件满足后建议`):g(b)(`已安排`))+` `+j(g(N)(e.schedule.proposedAt,G.value))+` — `+j(g(N)(e.schedule.proposedEnd,G.value)),1)],64)):(E(),l(a,{key:3},[i(j(e.state===`waiting`?g(b)(`需要解决上面的条件,再选择时间`):e.state===`paused`?g(b)(`进度已保存,之后再安排续接时间`):g(b)(`已记下,等她选择具体时间`)),1)],64)),e.timing?.plannedMs?(E(),l(a,{key:4},[i(j(g(b)(`· 本段预计 {v} · 本段已投入 {v2}`,{v:q(e.timing.plannedMs),v2:K(e.timing.stepMs)})),1),e.timing.phase===`engaged`?(E(),l(a,{key:0},[i(j(g(b)(`· 还需约 {v}`,{v:q(e.timing.remainingMs)})),1)],64)):s(``,!0)],64)):e.timing?.phase===`legacy`?(E(),l(a,{key:5},[i(j(g(b)(`· 此前时长未单独记录`)),1)],64)):(E(),l(a,{key:6},[i(` · `+j(e.state===`doing`?g(b)(`正在准备这一段`):g(b)(`尚未开始本段投入`)),1)],64))]),e.schedule?.outcome?(E(),l(`p`,Vt,j(g(b)(`本段目标:{outcome}`,{outcome:e.schedule.outcome})),1)):s(``,!0),g(pe)[e.share_state]?(E(),l(`p`,Ht,j(g(pe)[e.share_state])+` `+j(e.share_reason),1)):s(``,!0),e.checkpoint?.next?(E(),l(`p`,Ut,j(g(b)(`下一步:{next}`,{next:e.checkpoint.next})),1)):s(``,!0),c(`details`,Wt,[c(`summary`,null,j(g(b)(`来源与原安排 · {length} 条`,{length:e.sources.length})),1),e.due_at?(E(),l(`p`,Gt,j(g(b)(`原话日期参考 {v},不作为逾期判断。`,{v:g(N)(e.due_at,G.value)})),1)):s(``,!0),c(`small`,Kt,j(e.sources.join(` · `)),1),e.checkpoint?.mergedInto?(E(),l(`p`,qt,j(g(b)(`已合并到唯一事项,保留这条原记录。`)),1)):s(``,!0)]),c(`div`,Jt,[e.work_id?(E(),l(`button`,{key:0,onClick:t=>X(e.work_id)},j(g(b)(`阅读已有正文`)),9,Yt)):s(``,!0),e.project_id?(E(),l(`button`,{key:1,onClick:t=>Z(e.project_id)},j(g(b)(`持续项目`)),9,Xt)):s(``,!0),[`done`,`abandoned`].includes(e.state)?s(``,!0):(E(),l(a,{key:2},[e.state===`doing`?(E(),l(`button`,{key:0,onClick:t=>Q(e,`pause`)},j(g(b)(`暂停`)),9,Zt)):(E(),l(`button`,{key:1,onClick:t=>Q(e,`resume`)},j(g(b)(`重新安排`)),9,Qt)),c(`button`,{onClick:t=>Q(e,`schedule`)},j(g(b)(`安排时间`)),9,$t),c(`button`,{class:`text-button`,onClick:t=>Q(e,`abandon`)},j(g(b)(`放下`)),9,en)],64))])],8,Pt))),128))])):f.value===`works`?(E(),l(`div`,tn,[(E(!0),l(a,null,y(k.value,e=>(E(),l(`button`,{key:e.id,class:`card work-card`,"data-work":e.id,onClick:t=>X(e.id)},[c(`span`,rn,j(g(b)(`{v} · 第 {ordinal} 篇`,{v:e.state===`complete`?g(b)(`完成稿`):g(b)(`草稿`),ordinal:e.ordinal})),1),c(`h2`,null,j(e.title),1),c(`p`,null,j(e.summary),1),c(`small`,null,j(g(b)(`{characters} 字 · 版本 {version}`,{characters:e.characters,version:e.version})),1),c(`span`,an,j(e.project_title||g(b)(`独处留下的东西`)),1)],8,nn))),128))])):f.value===`projects`?(E(),l(`div`,on,[(E(!0),l(a,null,y(k.value,e=>(E(),l(`article`,{key:e.id,class:`card`},[c(`span`,sn,j(e.kind===`game`?g(b)(`游戏`):e.serial?g(b)(`连载`):g(b)(`持续项目`))+` · `+j(e.state===`active`?g(b)(`在继续`):e.state===`complete`?g(b)(`已完结`):g(b)(`暂时放下`)),1),c(`h2`,null,j(e.title),1),c(`p`,null,j(e.why),1),c(`p`,cn,j(e.summary),1),c(`button`,{onClick:t=>Z(e.id)},j(g(b)(`打开项目`)),9,ln)]))),128))])):(E(),n(rt,{key:3,rows:k.value,zone:G.value,loading:M.value,onWork:X,onProject:Z,onSource:ve},null,8,[`rows`,`zone`,`loading`])),f.value!==`experiences`&&!M.value&&!k.value.length?(E(),n(re,{key:4,title:f.value===`works`?g(b)(`作品还在等待第一笔`):g(b)(`这里还没有记录`),text:g(b)(`实际发生并保存之后,这里才会出现内容。`)},null,8,[`title`,`text`])):s(``,!0),c(`div`,un,[c(`button`,{disabled:F.value===0,onClick:t[14]||=e=>{F.value=Math.max(0,F.value-24),Y()}},j(g(b)(`上一页`)),9,dn),c(`span`,null,j(F.value/24+1),1),c(`button`,{disabled:!de.value,onClick:t[15]||=e=>{F.value+=24,Y()}},j(g(b)(`下一页`)),9,fn)])],64)),T(le,{open:!!z.value,title:z.value?.title||g(b)(`作品`),eyebrow:g(b)(`她留下的正文`),width:`780px`,onClose:t[18]||=e=>z.value=null},{default:m(()=>[z.value?(E(),l(a,{key:0},[c(`div`,pn,[c(`span`,mn,j(g(b)(`{v} · {length} 字`,{v:z.value.state===`complete`?g(b)(`完成稿`):g(b)(`草稿`),length:z.value.content.length})),1),c(`label`,null,[i(j(g(b)(`版本`)),1),T(se,{"model-value":z.value.version,"aria-label":g(b)(`作品版本`),options:z.value.versions.map(e=>({value:e.version,label:e.version+` · `+g(N)(e.created,G.value)})),"onUpdate:modelValue":t[16]||=e=>X(z.value.id,Number(e))},null,8,[`model-value`,`aria-label`,`options`])]),c(`button`,{onClick:ye},j(g(b)(`导出正文`)),1)]),c(`p`,hn,j(z.value.content),1),z.value.project_id?(E(),l(`button`,{key:0,onClick:t[17]||=e=>Z(z.value.project_id)},j(g(b)(`查看项目与设定`)),1)):s(``,!0)],64)):s(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`]),T(le,{open:!!B.value,title:B.value?.title||g(b)(`持续项目`),eyebrow:g(b)(`她自己的方向`),width:`740px`,onClose:t[22]||=e=>B.value=null},{default:m(()=>[B.value?(E(),l(a,{key:0},[c(`p`,null,j(B.value.why),1),c(`p`,gn,j(B.value.summary),1),Object.keys(B.value.bible||{}).length?(E(),l(`details`,_n,[c(`summary`,null,j(g(b)(`设定与未解决线索`)),1),c(`dl`,null,[(E(!0),l(a,null,y(B.value.bible,(e,t)=>(E(),l(a,{key:t},[c(`dt`,null,j({characters:g(b)(`人物`),world:g(b)(`世界`),threads:g(b)(`未解决线索`),topic:g(b)(`资料主题`),mode:g(b)(`模式`)}[t]||t),1),c(`dd`,null,j(e),1)],64))),128))])])):s(``,!0),c(`div`,vn,[c(`button`,{onClick:t[19]||=e=>$(`continue`)},j(g(b)(`建议续写`)),1),c(`button`,{onClick:t[20]||=e=>$(`revise`)},j(g(b)(`建议修改`)),1),c(`button`,{onClick:t[21]||=e=>$(`direction`)},j(g(b)(`建议方向`)),1)]),c(`h3`,null,j(g(b)(`已经留下的篇章`)),1),c(`ul`,yn,[(E(!0),l(a,null,y(B.value.works,e=>(E(),l(`li`,{key:e.id},[c(`button`,{class:`text-button`,onClick:t=>X(e.id)},j(g(b)(`第 {ordinal} 篇 · {title}`,{ordinal:e.ordinal,title:e.title})),9,bn),c(`small`,null,j(e.state===`draft`?g(b)(`草稿`):g(b)(`完成稿`)),1)]))),128))]),B.value.sources.length?(E(),l(`h3`,xn,j(g(b)(`接触的资料`)),1)):s(``,!0),c(`ul`,Sn,[(E(!0),l(a,null,y(B.value.sources,e=>(E(),l(`li`,{key:e.id},[c(`button`,{class:`text-button`,onClick:t=>ve(e.id)},j(e.title),9,Cn)]))),128))])],64)):s(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`]),T(le,{open:!!V.value,title:V.value?.title||g(b)(`资料`),eyebrow:V.value?.kind===`model`?g(b)(`模型知识整理 · 未经联网核验`):g(b)(`实际返回的摘录`),width:`740px`,onClose:t[23]||=e=>V.value=null},{default:m(()=>[V.value?(E(),l(a,{key:0},[V.value.url?(E(),l(`a`,{key:0,href:V.value.url,target:`_blank`,rel:`noopener noreferrer`},j(g(b)(`打开来源`)),9,wn)):s(``,!0),V.value.kind===`model`?(E(),l(`p`,Tn,j(V.value.uncertainty||g(b)(`基于模型已有知识,具体剧情与章节仍需核验。`)),1)):s(``,!0),c(`p`,En,j(g(N)(V.value.created,G.value)),1),c(`p`,Dn,j(V.value.content),1)],64)):s(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-6804b51c`]]);export{On as default};
@@ -0,0 +1 @@
1
+ var e=new Map;function t(t,n){let r=JSON.stringify([t,n]),i=e.get(r);return i||(i=new Intl.DateTimeFormat(t,n),e.set(r,i),e.size>64&&e.delete(e.keys().next().value)),i}export{t};
@@ -0,0 +1,4 @@
1
+ const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/ChatsPage-C-FcRapR.js","assets/Empty-CpP5kQHH.js","assets/Empty-DmUB2-Bk.css","assets/formatters-ZmW_xFHw.js","assets/media-BzPDBm7e.js","assets/Field-D4gY-INU.js","assets/ChatsPage-DfyPCS9N.css","assets/HeartPage-CPy_thQd.js","assets/HeartPage-Bft9wZp5.css","assets/PeoplePage-Cqefm9-q.js","assets/knowledge-DG0e0uKw.js","assets/PeoplePage-BmUxkrOU.css","assets/LifePage-CxWvwmSf.js","assets/LifePage-BUi5euBF.css","assets/TimePage-Cw44inM4.js","assets/TimePage-BOms_n4I.css","assets/MemoryPage-DC4rhQ68.js","assets/MemoryPage-cZvXfkXb.css","assets/NaturePage-IvYw04Zq.js","assets/NaturePage-CTXHCE2D.css","assets/SystemPage-CJmtJkrK.js","assets/SystemPage-CAMPoYqM.css","assets/PluginsPage-DKSaKvXb.js","assets/PluginsPage-HyBe5D8w.css"])))=>i.map(i=>d[i]);
2
+ import{$ as e,A as t,B as n,C as r,D as i,E as a,F as o,G as s,H as c,I as l,J as u,K as d,L as f,N as p,O as m,P as h,Q as g,R as _,S as v,T as y,U as b,V as x,W as S,X as ee,Y as C,Z as w,_ as te,_t as T,a as ne,at as E,c as D,ct as O,d as k,dt as A,et as re,ft as ie,g as ae,gt as j,h as oe,ht as se,i as M,it as N,j as ce,k as P,l as le,lt as F,m as I,mt as L,n as R,nt as ue,ot as de,pt as fe,q as z,r as B,rt as V,s as H,st as pe,t as me,tt as he,u as ge,ut as _e,v as U,vt as W,w as G,x as ve,yt as K,z as ye}from"./Empty-CpP5kQHH.js";import{t as be}from"./formatters-ZmW_xFHw.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var q=i({calm:{key:`calm`,label:G(`平静`),feel:G(`像一杯温水`),particle:`mote`,tempo:1},sweet:{key:`sweet`,label:G(`甜甜`),feel:G(`心里软软的`),particle:`bubble`,tempo:1.05},bright:{key:`bright`,label:G(`雀跃`),feel:G(`想蹦起来`),particle:`sparkle`,tempo:1.45},blue:{key:`blue`,label:G(`低落`),feel:G(`有点灰灰的`),particle:`rain`,tempo:.7},stormy:{key:`stormy`,label:G(`烦躁`),feel:G(`心里起风了`),particle:`fluff`,tempo:1.25},drowsy:{key:`drowsy`,label:G(`困倦`),feel:G(`眼皮在打架`),particle:`dust`,tempo:.6},night:{key:`night`,label:G(`夜晚`),feel:G(`睡着了`),particle:`star`,tempo:.45}}),xe=Object.keys(q);function J(e){return typeof e==`string`&&e in q}function Se(e){if(!e)return`calm`;let t=e.valence??0,n=e.arousal??.35;return e.phase===`asleep`?`night`:e.phase===`sleepy`||e.phase===`waking`||(e.energy??1)<.25?`drowsy`:t>.45?n>.5?`bright`:`sweet`:t>.22?`sweet`:t>-.12?`calm`:n>.5?`stormy`:`blue`}function Ce(e){if(!e)return .45;if(e.phase===`asleep`)return .6;let t=.25+Math.abs(e.valence??0)*.5+(e.arousal??.35)*.35;return Math.min(1,Math.max(.2,t))}var we=`luckyTheme`,Te=`luckyQuietMotion`;function Ee(e){try{return localStorage.getItem(e)}catch{return null}}function De(e,t){try{t===null?localStorage.removeItem(e):localStorage.setItem(e,t)}catch{}}var Oe=typeof matchMedia==`function`?matchMedia(`(prefers-reduced-motion: reduce)`):null,ke=Ee(we),Y=fe({affect:null,pinned:J(ke)?ke:null,quiet:Ee(Te)===`true`,reduced:!!Oe?.matches});Oe?.addEventListener?.(`change`,e=>{Y.reduced=e.matches});var X=n(()=>Se(Y.affect)),Ae=n(()=>Y.pinned??X.value),Z=n(()=>!Y.quiet&&!Y.reduced),je=n(()=>Y.pinned?.6:Ce(Y.affect));function Me(e){Y.affect=e}function Ne(e){Y.pinned=e,De(we,e)}function Pe(e){Y.quiet=e,De(Te,String(e))}function Fe(){_e(()=>{let e=document.documentElement,t=Ae.value,n=Y.affect?.phase||`awake`,r=Z.value?`full`:`quiet`;e.dataset.mood!==t&&(e.dataset.mood=t),e.dataset.phase!==n&&(e.dataset.phase=n),e.dataset.motion!==r&&(e.dataset.motion=r);let i=String(q[t].tempo),a=je.value.toFixed(2);e.style.getPropertyValue(`--tempo`)!==i&&e.style.setProperty(`--tempo`,i),e.style.getPropertyValue(`--intensity`)!==a&&e.style.setProperty(`--intensity`,a)})}var Q=fe({data:null,error:``}),Ie=null,Le=0;function Re(){return Ie??=I(`/mind/presence`).then(e=>{Q.data=e,Q.error=``,Me({...e.affect})}).catch(e=>{Q.error=e.message}).finally(()=>{Ie=null}),Ie}function ze(){Re(),clearInterval(Le),Le=window.setInterval(()=>{document.hidden||Re()},3e4);let e=()=>{document.hidden||Re()};return document.addEventListener(`visibilitychange`,e),()=>{clearInterval(Le),document.removeEventListener(`visibilitychange`,e)}}async function Be(e,t={}){let{session:n=``,signal:r,reconnectMs:i=3e3}=t,a=e=>new Promise(t=>{if(r?.aborted)return t();let n=setTimeout(i,e);function i(){clearTimeout(n),r?.removeEventListener(`abort`,i),t()}r?.addEventListener(`abort`,i,{once:!0})});for(;!r?.aborted;){try{let t=new URL(`/api/core/stream`,location.origin);n&&t.searchParams.set(`session`,n);let i=await fetch(t,{headers:{Authorization:`Bearer `+(sessionStorage.token||``)},signal:r});if(!i.ok)throw Error(`stream unavailable`);let a=i.body.getReader(),o=new TextDecoder,s=``;for(;;){let{value:t,done:n}=await a.read();if(n)break;s+=o.decode(t,{stream:!0});let r;for(;(r=s.indexOf(`
3
+
4
+ `))>=0;){let t=s.slice(0,r);s=s.slice(r+2),t.startsWith(`data: `)&&await e(JSON.parse(t.slice(6)))}}}catch{}r?.aborted||await a(i)}}var Ve=`/app/assets/luckytri-home-95QKeMtc.png`,He=`luckytri-wallpapers`,Ue=`files`,We=`luckytri-sky-opacity-v1`,Ge=.22,Ke=.4,$=fe({hero:Ve,sky:``,skyOpacity:Je()}),qe=null;function Je(){try{let e=Number(localStorage.getItem(We));return Number.isFinite(e)?Ye(e):Ge}catch{return Ge}}function Ye(e){return Math.min(.82,Math.max(.08,e))}function Xe(){return new Promise((e,t)=>{let n=indexedDB.open(He,1);n.onupgradeneeded=()=>{n.result.objectStoreNames.contains(Ue)||n.result.createObjectStore(Ue)},n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}function Ze(e){return Xe().then(t=>new Promise((n,r)=>{let i=t.transaction(Ue).objectStore(Ue).get(e);i.onsuccess=()=>n(i.result||null),i.onerror=()=>r(i.error)}))}function Qe(e,t){return Xe().then(n=>new Promise((r,i)=>{let a=n.transaction(Ue,`readwrite`).objectStore(Ue),o=t?a.put(t,e):a.delete(e);o.onsuccess=()=>r(),o.onerror=()=>i(o.error)}))}function $e(e,t){let n=$[e];n.startsWith(`blob:`)&&URL.revokeObjectURL(n),$[e]=t?URL.createObjectURL(t):e===`hero`?Ve:``}async function et(e,t){if(!e.type.startsWith(`image/`))throw Error(P(`请选择一张图片`));if(e.size>20971520)throw Error(P(`图片太大了,请换一张 20MB 以内的`));try{let n=await createImageBitmap(e),r=Math.min(1,t/Math.max(n.width,n.height)),i=document.createElement(`canvas`);i.width=Math.max(1,Math.round(n.width*r)),i.height=Math.max(1,Math.round(n.height*r));let a=i.getContext(`2d`);if(!a)throw Error(P(`无法处理这张图片`));a.drawImage(n,0,0,i.width,i.height),n.close();let o=await new Promise(e=>i.toBlob(e,`image/jpeg`,.86));if(!o)throw Error(P(`无法处理这张图片`));return o}catch(t){if(t instanceof Error&&t.message!==P(`请选择一张图片`)&&e.size<=6291456)return e;throw t instanceof Error?t:Error(P(`无法处理这张图片`))}}function tt(){return qe??=(async()=>{try{let[e,t]=await Promise.all([Ze(`hero`),Ze(`sky`)]);e&&$e(`hero`,e),t&&$e(`sky`,t)}catch{}})(),qe}async function nt(e){let t=await et(e,1600);await Qe(`hero`,t),$e(`hero`,t)}async function rt(){await Qe(`hero`,null),$e(`hero`,null)}async function it(e){let t=await et(e,1920);await Qe(`sky`,t),$e(`sky`,t);let n=null;try{n=localStorage.getItem(We)}catch{n=null}n||ot(Ke)}async function at(){await Qe(`sky`,null),$e(`sky`,null)}function ot(e){let t=Ye(e);$.skyOpacity=t;try{localStorage.setItem(We,String(t))}catch{}}var st=i({idle:G(`闲着`),speaking:G(`刚说完话`),thinking:G(`在想怎么回`),solitude:G(`在独处`),reading:G(`在读资料`),diary:G(`在写日记`),review:G(`在回顾这段日子`),night:G(`在夜里整理今天`),asleep:G(`睡着了`),busy:G(`在忙自己的事`)});function ct(e){if(!e)return``;if(e.phase===`asleep`)return P(`睡着了,呼吸很轻`);let t=[e.phaseLabel,e.energyLabel,e.mood].filter(Boolean).join(`,`);return e.cause?P(`{line},因为{cause}`,{line:t,cause:e.cause}):t}function lt(e){return e?.lately||``}function ut(e){if(!e)return``;if(e.currentLife?.current)return e.currentLife.current.label+(e.currentLife.current.title?` · `+e.currentLife.current.title:``);let{kind:t,sessionName:n}=e.activity||{kind:`idle`},r=st[t]||st.idle;return(t===`speaking`||t===`thinking`)&&n?`${r} · ${n}`:r}var dt={mote:16,sparkle:12,bubble:10,rain:28,fluff:8,dust:18,star:24},ft=36,pt=class{canvas;ctx;parts=[];kind=`mote`;intensity=.5;colors={particle:`#ffffff`,accent:`#2c8465`,cheek:`#ff9db1`};w=0;h=0;raf=0;last=0;running=!1;shooting=null;nextShot=0;constructor(e){this.canvas=e;let t=e.getContext(`2d`,{alpha:!0,desynchronized:!0});if(!t)throw Error(`canvas unavailable`);this.ctx=t}configure(e,t){let n=e!==this.kind||Math.abs(t-this.intensity)>.15||!this.parts.length;this.kind=e,this.intensity=t,this.readColors(),n&&this.seed()}readColors(){let e=getComputedStyle(document.documentElement),t=(t,n)=>e.getPropertyValue(t).trim()||n;this.colors={particle:t(`--particle`,`#ffffff`),accent:t(`--accent`,`#2c8465`),cheek:t(`--cheek`,`#ff9db1`)}}resize(){let e=this.canvas.getBoundingClientRect();this.w=e.width,this.h=e.height,this.canvas.width=Math.round(e.width*1),this.canvas.height=Math.round(e.height*1),this.ctx.setTransform(1,0,0,1,0,0),this.seed()}start(){if(this.running)return;this.running=!0,this.last=performance.now();let e=t=>{if(!this.running)return;this.raf=requestAnimationFrame(e);let n=t-this.last;n<1e3/60-1||(this.last=t,this.step(Math.min(.05,n/1e3),t/1e3))};this.raf=requestAnimationFrame(e)}stop(){this.running=!1,cancelAnimationFrame(this.raf),this.ctx.clearRect(0,0,this.w,this.h)}count(){let e=Math.min(1.25,Math.max(.4,this.w*this.h/1296e3));return Math.min(ft,Math.round(dt[this.kind]*e*(.55+this.intensity*.9)))}seed(){this.parts=Array.from({length:this.count()},()=>this.spawn(!0))}spawn(e){let t=Math.random,n={x:t()*this.w,y:t()*this.h,vx:0,vy:0,r:2,a:1,phase:t()*Math.PI*2,spin:(t()-.5)*.6,alt:!1};switch(this.kind){case`mote`:Object.assign(n,{r:2+t()*4,vx:(t()-.5)*8,vy:-4-t()*8,a:.25+t()*.45}),e||(n.y=this.h+10);break;case`sparkle`:Object.assign(n,{r:2.5+t()*4.5,vx:(t()-.5)*14,vy:-6-t()*14,a:.5+t()*.5,alt:t()<.35}),e||(n.y=this.h+10);break;case`bubble`:Object.assign(n,{r:3+t()*8,vx:(t()-.5)*10,vy:-10-t()*18,a:.35+t()*.4,alt:t()<.3}),e||(n.y=this.h+14);break;case`rain`:Object.assign(n,{x:t()*(this.w+120),r:10+t()*14,vx:-40,vy:380+t()*180,a:.12+t()*.2}),e||(n.y=-24);break;case`fluff`:Object.assign(n,{r:14+t()*26,vx:(t()-.5)*30,vy:(t()-.5)*18,a:.06+t()*.08});break;case`dust`:Object.assign(n,{r:.8+t()*1.8,vx:(t()-.5)*6,vy:(t()-.5)*6,a:.3+t()*.5});break;case`star`:Object.assign(n,{r:.6+t()*1.6,a:.4+t()*.6,y:t()*this.h*.8})}return n}step(e,t){let{ctx:n,w:r,h:i,colors:a}=this;n.clearRect(0,0,r,i);let o=.6+this.intensity*.8;for(let n=0;n<this.parts.length;n++){let s=this.parts[n];switch(s.phase+=e,s.x+=s.vx*e*o,s.y+=s.vy*e*o,this.kind){case`mote`:case`sparkle`:case`bubble`:s.x+=Math.sin(t*.6+s.phase)*.25,s.y<-24&&(this.parts[n]=this.spawn(!1));break;case`rain`:s.y>i+24&&(this.parts[n]=this.spawn(!1));break;default:this.kind===`fluff`&&(s.vx+=Math.sin(t*.7+s.phase*3)*12*e,s.vy+=Math.cos(t*.5+s.phase*2)*8*e,s.vx=Math.max(-24,Math.min(24,s.vx)),s.vy=Math.max(-16,Math.min(16,s.vy))),s.x<-40&&(s.x=r+40),s.x>r+40&&(s.x=-40),s.y<-40&&(s.y=i+40),s.y>i+40&&(s.y=-40)}this.draw(this.parts[n],t,a)}this.kind===`star`&&this.shoot(e,t),n.globalAlpha=1}draw(e,t,n){let r=this.ctx;switch(this.kind){case`mote`:{let t=e.a*(.7+.3*Math.sin(e.phase*1.3));r.fillStyle=n.particle,r.globalAlpha=t*.25,this.circle(e.x,e.y,e.r*2.4),r.globalAlpha=t,this.circle(e.x,e.y,e.r);break}case`sparkle`:r.fillStyle=e.alt?n.accent:n.particle,r.globalAlpha=e.a*(.35+.65*(.5+.5*Math.sin(e.phase*2.2))),this.star(e.x,e.y,e.r,t*e.spin);break;case`bubble`:r.globalAlpha=e.a,e.alt?(r.fillStyle=n.cheek,this.heart(e.x,e.y,e.r*.8)):(r.strokeStyle=n.particle,r.lineWidth=1.2,r.beginPath(),r.arc(e.x,e.y,e.r,0,Math.PI*2),r.stroke(),r.globalAlpha=e.a*.8,r.beginPath(),r.arc(e.x-e.r*.35,e.y-e.r*.35,e.r*.25,0,Math.PI*2),r.fillStyle=n.particle,r.fill());break;case`rain`:r.strokeStyle=n.particle,r.globalAlpha=e.a,r.lineWidth=1,r.beginPath(),r.moveTo(e.x,e.y),r.lineTo(e.x-e.r*.1,e.y+e.r),r.stroke();break;case`fluff`:{let t=r.createRadialGradient(e.x,e.y,0,e.x,e.y,e.r);t.addColorStop(0,n.particle),t.addColorStop(1,`transparent`),r.fillStyle=t,r.globalAlpha=e.a,this.circle(e.x,e.y,e.r);break}case`dust`:r.fillStyle=n.particle,r.globalAlpha=e.a*(.75+.25*Math.sin(e.phase*.9)),this.circle(e.x,e.y,e.r);break;case`star`:r.fillStyle=n.particle,r.globalAlpha=e.a*(.55+.45*Math.sin(t*(.6+e.spin)+e.phase)),this.circle(e.x,e.y,e.r),e.r>1.8&&(r.globalAlpha*=.35,this.star(e.x,e.y,e.r*3.2,0))}}shoot(e,t){!this.shooting&&t>this.nextShot&&(this.nextShot=t+9+Math.random()*10,this.shooting={x:this.w*(.3+Math.random()*.6),y:this.h*Math.random()*.3,life:0});let n=this.shooting;if(!n)return;n.life+=e;let r=n.life/1.4;if(r>=1){this.shooting=null;return}let i=n.x-r*220,a=n.y+r*110,o=this.ctx,s=o.createLinearGradient(i,a,i+60,a-30);s.addColorStop(0,this.colors.particle),s.addColorStop(1,`transparent`),o.strokeStyle=s,o.globalAlpha=Math.sin(r*Math.PI)*.7,o.lineWidth=1.4,o.beginPath(),o.moveTo(i,a),o.lineTo(i+60,a-30),o.stroke()}circle(e,t,n){this.ctx.beginPath(),this.ctx.arc(e,t,n,0,Math.PI*2),this.ctx.fill()}star(e,t,n,r){let i=this.ctx;i.save(),i.translate(e,t),i.rotate(r),i.beginPath(),i.moveTo(0,-n),i.quadraticCurveTo(0,0,n,0),i.quadraticCurveTo(0,0,0,n),i.quadraticCurveTo(0,0,-n,0),i.quadraticCurveTo(0,0,0,-n),i.fill(),i.restore()}heart(e,t,n){let r=this.ctx;r.beginPath(),r.moveTo(e,t+n*.9),r.bezierCurveTo(e-n*1.6,t-n*.2,e-n*.6,t-n*1.3,e,t-n*.45),r.bezierCurveTo(e+n*.6,t-n*1.3,e+n*1.6,t-n*.2,e,t+n*.9),r.fill()}},mt=[`data-particles`],ht={key:0,class:`moon`},gt=R(C({__name:`MoodSky`,setup(t){let r=L(),i=n(()=>$.sky?{backgroundImage:`url("${$.sky}")`,opacity:String($.skyOpacity)}:void 0),a=n(()=>Z.value?q[Ae.value].particle:`off`),o=null,c=0;function l(){o&&(o.configure(q[Ae.value].particle,je.value),clearTimeout(c),c=window.setTimeout(()=>o?.readColors(),1500),Z.value&&!document.hidden?o.start():o.stop())}function u(){o?.resize()}function d(){o&&(document.hidden?o.stop():Z.value&&o.start())}return he(()=>{if(r.value){try{o=new pt(r.value)}catch{return}o.resize(),l(),window.addEventListener(`resize`,u,{passive:!0}),document.addEventListener(`visibilitychange`,d)}}),F([Ae,je,Z],l),e(()=>{o?.stop(),clearTimeout(c),window.removeEventListener(`resize`,u),document.removeEventListener(`visibilitychange`,d)}),(e,t)=>(V(),S(`div`,{class:`sky`,"aria-hidden":`true`,"data-particles":a.value},[t[0]||=x(`div`,{class:`sky-base`},null,-1),x(`div`,{class:T([`garden`,{custom:!!j($).sky}]),style:W(i.value)},null,6),t[1]||=s(`<div class="glow g1" data-v-d7604463></div><div class="glow g2" data-v-d7604463></div><div class="glow g3" data-v-d7604463></div><div class="glow g4" data-v-d7604463></div><div class="horizon" data-v-d7604463></div><div class="landscape" data-v-d7604463><i data-v-d7604463></i><i data-v-d7604463></i><i data-v-d7604463></i><i data-v-d7604463></i></div><div class="sheen" data-v-d7604463></div>`,7),j(Ae)===`night`?(V(),S(`div`,ht)):b(``,!0),t[2]||=x(`div`,{class:`vignette`},null,-1),x(`canvas`,{ref_key:`canvas`,ref:r,class:T([`particles`,{off:!j(Z)}])},null,2)],8,mt))}}),[[`__scopeId`,`data-v-d7604463`]]),_t=i({calm:[G(`嗯?`),G(`我在这儿。`),G(`有什么事吗?`),G(`戳我做什么呀`)],sweet:[G(`在呢~`),G(`被你发现啦`),G(`嘿嘿,找我呀`),G(`今天心情不错哦`)],bright:[G(`哇!干嘛呀~`),G(`今天超开心的!`),G(`再戳我也还是好开心`),G(`嘿嘿嘿`)],blue:[G(`……嗯`),G(`我没事,就是有点低落`),G(`陪我待一会儿就好`),G(`唔……`)],stormy:[G(`别戳啦!`),G(`我现在有点烦……`),G(`让我静一静嘛`),G(`哼`)],drowsy:[G(`唔……好困`),G(`再让我眯一会儿`),G(`嗯……?`),G(`哈——欠`)],night:[G(`呼……呼……`),G(`(翻了个身)`),`zzz……`,G(`(嘟囔了一句梦话)`)]}),vt=i({calm:[G(`……有点痒`),G(`嗯,这样挺好`),G(`谢谢你`)],sweet:[G(`嘿嘿,好舒服`),G(`再摸一下嘛`),G(`脸要红了……`)],bright:[G(`哈哈哈好痒!`),G(`最喜欢这样了!`),G(`嘿嘿,开心加倍`)],blue:[G(`……谢谢你`),G(`好像好一点了`),G(`嗯,别走开`)],stormy:[G(`……好吧,就一下`),G(`哼,勉强接受`),G(`嗯……好像没那么烦了`)],drowsy:[G(`呼……要睡着了`),G(`好温暖……`),G(`嗯……`)],night:[G(`(在梦里笑了一下)`),G(`(蹭了蹭)`),`zzz……`]}),yt=i({thinking:[G(`等等,我在想怎么回……`),G(`嘘,我在看大家聊什么`)],speaking:[G(`刚刚在说话来着`),G(`你看到我说的了吗`)],solitude:[G(`我在想事情,一会儿就好`),G(`让我安静一下下`)],reading:[G(`我在看书呢`),G(`这一页好有意思`)],diary:[G(`我在写日记,不许偷看`),G(`今天的事,写下来`)],review:[G(`在翻以前的日记呢`),G(`原来那时候我是这样想的`)],night:[G(`在整理今天的事……`),G(`嘘,快整理完了`)]}),bt=0;function xt(e,t,n=`idle`){let r=e===`poke`&&n!==`asleep`&&yt[n]?yt[n]:(e===`pet`?vt:_t)[n===`asleep`?`night`:t]||_t.calm;return bt+=1,r[bt%r.length]}var St=[`role`,`tabindex`,`aria-label`,`data-mood`,`data-activity`,`onKeydown`],Ct=[`id`],wt=[`id`],Tt=[`id`],Et=[`fill`],Dt={key:0,class:`halo`},Ot={class:`squish`},kt=[`d`,`fill`],At=[`d`,`fill`],jt=[`transform`],Mt={key:0,class:`brows`},Nt=[`d`],Pt=[`d`],Ft=[`cx`,`cy`,`ry`],It=[`cx`,`cy`],Lt=[`d`],Rt=[`d`],zt={key:3},Bt=[`d`],Vt=[`d`],Ht={class:`mouth`},Ut=[`d`],Wt={key:1,class:`line`,d:`M94 125Q100 129.5 106 125`},Gt={key:2},Kt={key:3,class:`line`,d:`M89 123Q94.5 129 100 123.5Q105.5 129 111 123`},qt={key:4,class:`line`,d:`M91 130Q100 122.5 109 130`},Jt={key:5,class:`line`,d:`M88 127q3 -3.4 6 0t6 0t6 0t6 0`},Yt={key:6,class:`ink yawn`,cx:`100`,cy:`127`,rx:`4.6`,ry:`5.6`},Xt={key:7,class:`ink`,cx:`100`,cy:`127`,rx:`2.6`,ry:`3`},Zt={key:8,class:`ink talk`,cx:`100`,cy:`126`,rx:`5`,ry:`4.5`},Qt={key:9,class:`line`,d:`M91 127Q102 130 110 121`},$t={key:10,class:`line`,d:`M93 126L107 126`},en={key:0,class:`held`},tn={key:1,class:`held`},nn={key:1,class:`fx`},rn=[`d`],an={key:2,class:`fx`},on=[`d`],sn={key:3,class:`fx rain`},cn={key:4,class:`fx storm`},ln={key:5,class:`fx`},un={key:6,class:`fx`},dn={key:7,class:`fx`},fn={key:8,class:`fx`},pn={key:9,class:`fx think`},mn={key:10,class:`fx talkwaves`},hn=R(C({__name:`TaOrb`,props:{mood:{default:`calm`},activity:{default:`idle`},size:{default:160},interactive:{type:Boolean,default:!1},speech:{default:``},traits:{default:null},bubbleSide:{default:`top`},label:{default:``}},emits:[`open-chat`,`react`],setup(r,{expose:i,emit:a}){let c=r,u=a,d={calm:{wobble:.6,speed:.8,bounce:0,droop:0,jitter:0,eyes:`open`,mouth:`small`,cheeks:.25},sweet:{wobble:.8,speed:1,bounce:1.6,droop:0,jitter:0,eyes:`happy`,mouth:`cat`,cheeks:.8},bright:{wobble:1,speed:1.5,bounce:7,droop:0,jitter:0,eyes:`happy`,mouth:`grin`,cheeks:.55},blue:{wobble:.35,speed:.5,bounce:0,droop:4,jitter:0,eyes:`sad`,mouth:`frown`,cheeks:.1},stormy:{wobble:1.1,speed:1.2,bounce:0,droop:0,jitter:.9,eyes:`cross`,mouth:`wavy`,cheeks:.15},drowsy:{wobble:.45,speed:.45,bounce:0,droop:2,jitter:0,eyes:`sleepy`,mouth:`yawn`,cheeks:.35},night:{wobble:.3,speed:.35,bounce:0,droop:3,jitter:0,eyes:`closed`,mouth:`sleep`,cheeks:.3}},p=new Set([`open`,`sad`,`cross`,`up`,`down`]),m=[{x:28,y:48,r:8,d:0},{x:176,y:36,r:6,d:.8},{x:184,y:128,r:7,d:1.5},{x:18,y:138,r:5,d:2.1}],h=[{x:164,y:70,s:7,d:0},{x:34,y:84,s:5.5,d:1.4},{x:178,y:118,s:4.5,d:2.6}],_=`orb`+Math.random().toString(36).slice(2,8),v={fill:_+`-fill`,aura:_+`-aura`,rim:_+`-rim`},y=`${(Math.random()*3).toFixed(2)}s`,ee=L(),C=L(),w=L(),te=L(),ne=L(),E=L({x:0,y:0}),D=L(``),O=L(``),k=n(()=>{let e={...d[c.mood]},t=c.traits;if(t){let n=t.warmth??65,r=t.activity??40;e.eyes=(t.humor??25)>60?`happy`:`open`,e.mouth=(t.sarcasm??5)>40?`smirk`:n>35?`smile`:`flat`,e.cheeks=Math.max(0,(n-30)/70)*.9,e.bounce=r/100*8,e.speed=.5+r/100*1.2,e.wobble=.4+r/100*.8,e.jitter=0,e.droop=0}switch(c.activity){case`asleep`:Object.assign(e,{eyes:`closed`,mouth:`sleep`,bounce:0,speed:.35,wobble:.3,jitter:0});break;case`solitude`:case`night`:case`review`:Object.assign(e,{eyes:`closed`,mouth:`small`,bounce:0,jitter:0});break;case`diary`:case`reading`:e.eyes=`down`,e.bounce=0,(e.mouth===`grin`||e.mouth===`wavy`)&&(e.mouth=`small`);break;case`thinking`:e.eyes=`up`,e.mouth===`grin`&&(e.mouth=`small`);break;case`speaking`:e.mouth=`talk`}return D.value===`pet`&&e.eyes!==`closed`?Object.assign(e,{eyes:`happy`,mouth:`cat`,cheeks:1}):D.value===`pet`&&(e.cheeks=1),D.value===`poke`&&e.eyes===`happy`&&(e.eyes=`open`),e}),ie=n(()=>c.size<72),ae=n(()=>k.value.eyes===`up`?{x:2,y:-3}:k.value.eyes===`down`?{x:0,y:2.5}:{x:0,y:0}),oe=n(()=>c.traits?.3+(c.traits.warmth??65)/100*1.1:1),se=n(()=>(c.traits?.humor??0)>45),M=n(()=>{let{eyes:e,mouth:t}=k.value;return e===`sad`?[`M70 95 Q78 92 87 90`,`M113 90 Q122 92 130 95`]:e===`cross`?[`M71 90 L87 95.5`,`M113 95.5 L129 90`]:t===`smirk`?[`M71 94 L87 93`,`M113 90 Q121 85.5 129 89`]:null}),ce=n(()=>{let e=c.traits;if(!e)return;let t=((e.warmth??65)-50)/50,n=(e.initiative??25)/100;return{filter:`hue-rotate(${Math.round(-t*28)}deg) saturate(${(1+t*.18).toFixed(2)})`,transform:`scale(${(.92+n*.14).toFixed(3)}) rotate(${((n-.25)*8).toFixed(1)}deg)`}}),le=n(()=>O.value||c.speech),I=n(()=>c.label||(c.interactive?P(`TA:轻触互动,按住摸摸头,双击和 TA 聊聊`):`TA`)),R=n(()=>ie.value?``:c.activity===`asleep`?`night`:c.mood);function ue(e,t,n,r){let i=[];for(let a=0;a<8;a++){let o=a/8*Math.PI*2-Math.PI/2,s=62*(1+(Math.sin(e*1.3+a*1.7)*.6+Math.sin(e*.7+a*2.9)*.4)*.055*t),c=Math.sin(o)>0?.92:1.02;i.push([100+Math.cos(o)*s*n,112+Math.sin(o)*s*r*c])}let a=`M${i[0][0].toFixed(2)},${i[0][1].toFixed(2)}`;for(let e=0;e<8;e++){let t=i[(e-1+8)%8],n=i[e],r=i[(e+1)%8],o=i[(e+2)%8];a+=`C${(n[0]+(r[0]-t[0])/6).toFixed(2)},${(n[1]+(r[1]-t[1])/6).toFixed(2)} ${(r[0]-(o[0]-n[0])/6).toFixed(2)},${(r[1]-(o[1]-n[1])/6).toFixed(2)} ${r[0].toFixed(2)},${r[1].toFixed(2)}`}return a+`Z`}let de=ue(0,0,1,1),fe=performance.now()-Math.random()*1e4,B=0,H=0;function pe(e,t=!1){let n=k.value,r=(e-fe)/1e3,i=r*n.speed,a=t?0:Math.sin(i*1.7)*.022,o=t||!n.bounce?0:Math.max(0,Math.sin(i*2.6))**1.5*n.bounce,s=t||!n.jitter||Math.sin(r*.8)<.55?0:Math.sin(r*38)*n.jitter,c=t?de:ue(i,n.wobble,1+a-o*.004,1-a*.7+o*.006);C.value?.setAttribute(`d`,c),w.value?.setAttribute(`d`,c),te.value?.setAttribute(`transform`,`translate(${s.toFixed(2)} ${(n.droop-o).toFixed(2)})`),ne.value?.setAttribute(`rx`,(46*(1-o/30)).toFixed(2))}function me(e){B=requestAnimationFrame(me),!(e-H<1e3/60-1)&&(H=e,pe(e))}let ge=!0,_e=!0,U=null;function G(){cancelAnimationFrame(B),B=0,Z.value&&ge&&_e&&!document.hidden?B=requestAnimationFrame(me):pe(performance.now(),!0)}let ve=0;function ye(e){ve||=requestAnimationFrame(()=>{ve=0;let t=ee.value;if(!t||k.value.eyes===`closed`){E.value={x:0,y:0};return}let n=t.getBoundingClientRect(),r=e.clientX-(n.left+n.width/2),i=e.clientY-(n.top+n.height/2),a=Math.hypot(r,i)||1,o=Math.min(1,a/360);E.value={x:Math.round(r/a*4*o*10)/10,y:Math.round(i/a*3*o*10)/10}})}function be(e){window.removeEventListener(`pointermove`,ye),e&&ge&&_e&&!document.hidden&&c.size>=56?window.addEventListener(`pointermove`,ye,{passive:!0}):E.value={x:0,y:0}}let q=0,xe=0,J=0;function Se(e){O.value=e,clearTimeout(q),q=window.setTimeout(()=>O.value=``,2800)}function Ce(e){D.value=e,clearTimeout(xe),xe=window.setTimeout(()=>D.value=``,e===`pet`?1500:650),Se(xt(e,c.mood,c.activity)),u(`react`,e)}function we(){c.interactive&&Ce(`poke`)}function Te(){c.interactive&&Ce(`pet`)}function Ee(e){!c.interactive||e.button>0||(D.value=`press`,clearTimeout(J),J=window.setTimeout(()=>{J=0,Ce(`pet`)},520))}function De(){c.interactive&&J&&(clearTimeout(J),J=0,Ce(`poke`))}function Oe(){J&&clearTimeout(J),J=0,D.value===`press`&&(D.value=``)}function ke(e,t,n){return`M${e} ${t-n}Q${e} ${t} ${e+n} ${t}Q${e} ${t} ${e} ${t+n}Q${e} ${t} ${e-n} ${t}Q${e} ${t} ${e} ${t-n}Z`}function Y(e,t,n){return`M${e} ${t+n*.9}C${e-n*1.6} ${t-n*.2} ${e-n*.6} ${t-n*1.3} ${e} ${t-n*.45}C${e+n*.6} ${t-n*1.3} ${e+n*1.6} ${t-n*.2} ${e} ${t+n*.9}Z`}F([k,Z],G),F(Z,be);function X(){G(),be(Z.value)}return g(()=>{_e=!0,X()}),re(()=>{_e=!1,X()}),he(()=>{G(),be(Z.value),ee.value&&`IntersectionObserver`in window&&(U=new IntersectionObserver(e=>{ge=e[0].isIntersecting,X()}),U.observe(ee.value)),document.addEventListener(`visibilitychange`,X)}),e(()=>{cancelAnimationFrame(B),cancelAnimationFrame(ve),window.removeEventListener(`pointermove`,ye),U?.disconnect(),document.removeEventListener(`visibilitychange`,X),clearTimeout(q),clearTimeout(xe),clearTimeout(J)}),i({poke:we,pet:Te,cancel:Oe}),(e,n)=>(V(),S(`div`,{ref_key:`root`,ref:ee,class:T([`ta-orb`,[`mood-${r.mood}`,`act-${r.activity}`,D.value&&`is-${D.value}`,{interactive:r.interactive,small:ie.value}]]),style:W({width:r.size+`px`,height:r.size+`px`,"--blink-delay":y}),role:r.interactive?`button`:`img`,tabindex:r.interactive?0:void 0,"aria-label":I.value,"data-mood":r.mood,"data-activity":r.activity,onPointerdown:Ee,onPointerup:De,onPointerleave:Oe,onPointercancel:Oe,onDblclick:n[0]||=e=>u(`open-chat`),onKeydown:[o(l(we,[`prevent`]),[`enter`]),o(l(Te,[`prevent`]),[`space`])],onContextmenu:n[1]||=l(()=>{},[`prevent`])},[(V(),S(`svg`,{viewBox:`0 0 200 200`,style:W(ce.value),"aria-hidden":`true`},[x(`defs`,null,[x(`radialGradient`,{id:v.fill,cx:`38%`,cy:`30%`,r:`78%`},[...n[2]||=[x(`stop`,{offset:`0%`,style:{"stop-color":`var(--orb-a)`}},null,-1),x(`stop`,{offset:`58%`,style:{"stop-color":`var(--orb-b)`}},null,-1),x(`stop`,{offset:`100%`,style:{"stop-color":`var(--orb-c)`}},null,-1)]],8,Ct),x(`radialGradient`,{id:v.aura},[...n[3]||=[x(`stop`,{offset:`45%`,style:{"stop-color":`var(--orb-b)`,"stop-opacity":`0.5`}},null,-1),x(`stop`,{offset:`100%`,style:{"stop-color":`var(--orb-b)`,"stop-opacity":`0`}},null,-1)]],8,wt),x(`radialGradient`,{id:v.rim,cx:`50%`,cy:`50%`,r:`50%`},[...n[4]||=[x(`stop`,{offset:`72%`,style:{"stop-color":`#ffffff`,"stop-opacity":`0`}},null,-1),x(`stop`,{offset:`100%`,style:{"stop-color":`#ffffff`,"stop-opacity":`0.4`}},null,-1)]],8,Tt)]),x(`circle`,{class:`aura`,cx:`100`,cy:`112`,r:`94`,fill:`url(#${v.aura})`},null,8,Et),r.activity===`solitude`?(V(),S(`g`,Dt,[...n[5]||=[x(`circle`,{cx:`100`,cy:`112`,r:`86`},null,-1),x(`circle`,{class:`halo-soft`,cx:`100`,cy:`112`,r:`76`},null,-1)]])):b(``,!0),x(`ellipse`,{ref_key:`shadow`,ref:ne,class:`shadow`,cx:`100`,cy:`186`,rx:`46`,ry:`6`},null,512),x(`g`,Ot,[x(`g`,{ref_key:`whole`,ref:te},[x(`path`,{ref_key:`body`,ref:C,class:`body`,d:j(de),fill:`url(#${v.fill})`},null,8,kt),x(`path`,{ref_key:`rim`,ref:w,class:`rim`,d:j(de),fill:`url(#${v.rim})`},null,8,At),n[10]||=x(`ellipse`,{class:`shine`,cx:`76`,cy:`80`,rx:`17`,ry:`10`,transform:`rotate(-28 76 80)`},null,-1),n[11]||=x(`ellipse`,{class:`shine dot`,cx:`98`,cy:`68`,rx:`4`,ry:`3`},null,-1),x(`g`,{class:`face`,transform:`translate(${E.value.x} ${E.value.y})`},[M.value?(V(),S(`g`,Mt,[x(`path`,{class:`line thin`,d:M.value[0]},null,8,Nt),x(`path`,{class:`line thin`,d:M.value[1]},null,8,Pt)])):b(``,!0),x(`g`,{class:T([`eyes`,{blinks:j(p).has(k.value.eyes)}])},[(V(),S(f,null,N([80,120],(e,t)=>x(`g`,{key:t,class:T([`eye`,{wink:se.value&&t===1&&j(p).has(k.value.eyes)}])},[j(p).has(k.value.eyes)?(V(),S(f,{key:0},[x(`ellipse`,{class:`ink`,cx:e+ae.value.x,cy:106+ae.value.y,rx:`5.4`,ry:k.value.eyes===`sad`?6:7.2},null,8,Ft),x(`circle`,{class:`glint`,cx:e+ae.value.x+1.8,cy:106+ae.value.y-2.6,r:`1.9`},null,8,It)],64)):k.value.eyes===`happy`?(V(),S(`path`,{key:1,class:`line`,d:`M${e-7} 108Q${e} 98 ${e+7} 108`},null,8,Lt)):k.value.eyes===`closed`?(V(),S(`path`,{key:2,class:`line`,d:`M${e-7} 105Q${e} 111 ${e+7} 105`},null,8,Rt)):(V(),S(`g`,zt,[x(`path`,{class:`ink`,d:`M${e-6} 106A6 5 0 0 0 ${e+6} 106Z`},null,8,Bt),x(`path`,{class:`line thin`,d:`M${e-7.5} 106L${e+7.5} 106`},null,8,Vt)]))],2)),64))],2),x(`g`,{class:`cheeks`,style:W({opacity:k.value.cheeks})},[...n[6]||=[x(`ellipse`,{cx:`70`,cy:`119`,rx:`9`,ry:`5.2`},null,-1),x(`ellipse`,{cx:`130`,cy:`119`,rx:`9`,ry:`5.2`},null,-1)]],4),x(`g`,Ht,[k.value.mouth===`smile`?(V(),S(`path`,{key:0,class:`line`,d:`M89 124Q100 ${(124+9*oe.value).toFixed(1)} 111 124`},null,8,Ut)):k.value.mouth===`small`?(V(),S(`path`,Wt)):k.value.mouth===`grin`?(V(),S(`g`,Gt,[...n[7]||=[x(`path`,{class:`ink`,d:`M87 121Q100 140 113 121Z`},null,-1),x(`path`,{class:`tongue`,d:`M94 129.5Q100 135 106 129.5Q100 127.5 94 129.5Z`},null,-1)]])):k.value.mouth===`cat`?(V(),S(`path`,Kt)):k.value.mouth===`frown`?(V(),S(`path`,qt)):k.value.mouth===`wavy`?(V(),S(`path`,Jt)):k.value.mouth===`yawn`?(V(),S(`ellipse`,Yt)):k.value.mouth===`sleep`?(V(),S(`ellipse`,Xt)):k.value.mouth===`talk`?(V(),S(`ellipse`,Zt)):k.value.mouth===`smirk`?(V(),S(`path`,Qt)):(V(),S(`path`,$t))])],8,jt),r.activity===`reading`?(V(),S(`g`,en,[...n[8]||=[x(`path`,{class:`page`,d:`M100 150L72 142L72 167L100 175Z`},null,-1),x(`path`,{class:`page`,d:`M100 150L128 142L128 167L100 175Z`},null,-1),x(`path`,{class:`line thin`,d:`M100 150L100 175`},null,-1)]])):r.activity===`diary`?(V(),S(`g`,tn,[...n[9]||=[s(`<rect class="page" x="118" y="150" width="50" height="34" rx="5" transform="rotate(-8 143 167)" data-v-3fb60aa5></rect><path class="line hair" d="M126 163L156 159M127 171L150 168" data-v-3fb60aa5></path><g class="pen" transform="rotate(38 152 146)" data-v-3fb60aa5><rect x="148" y="112" width="9" height="40" rx="3.5" data-v-3fb60aa5></rect><path d="M148 152L152.5 163L157 152Z" data-v-3fb60aa5></path></g>`,3)]])):b(``,!0)],512)]),R.value===`bright`?(V(),S(`g`,nn,[(V(),S(f,null,N(m,(e,t)=>x(`path`,{key:t,class:`sparkle`,d:ke(e.x,e.y,e.r),style:W({animationDelay:e.d+`s`})},null,12,rn)),64))])):R.value===`sweet`?(V(),S(`g`,an,[(V(),S(f,null,N(h,(e,t)=>x(`path`,{key:t,class:`heart`,d:Y(e.x,e.y,e.s),style:W({animationDelay:e.d+`s`})},null,12,on)),64))])):R.value===`blue`?(V(),S(`g`,sn,[...n[12]||=[s(`<g class="cloud" data-v-3fb60aa5><circle cx="30" cy="36" r="9" data-v-3fb60aa5></circle><circle cx="42" cy="30" r="11" data-v-3fb60aa5></circle><circle cx="54" cy="36" r="8" data-v-3fb60aa5></circle><rect x="22" y="35" width="40" height="10" rx="5" data-v-3fb60aa5></rect></g><path class="drop" d="M31 50l-1.5 6" data-v-3fb60aa5></path><path class="drop" d="M42 50l-1.5 6" style="animation-delay:0.45s;" data-v-3fb60aa5></path><path class="drop" d="M53 50l-1.5 6" style="animation-delay:0.9s;" data-v-3fb60aa5></path>`,4)]])):R.value===`stormy`?(V(),S(`g`,cn,[...n[13]||=[s(`<g class="cloud" data-v-3fb60aa5><circle cx="156" cy="34" r="9" data-v-3fb60aa5></circle><circle cx="168" cy="28" r="11" data-v-3fb60aa5></circle><circle cx="180" cy="34" r="8" data-v-3fb60aa5></circle><rect x="148" y="33" width="40" height="10" rx="5" data-v-3fb60aa5></rect></g><path class="scribble" d="M154 54q4 -5 8 0t8 0t8 0" data-v-3fb60aa5></path>`,2)]])):R.value===`drowsy`&&r.activity===`idle`?(V(),S(`g`,ln,[...n[14]||=[x(`text`,{class:`zz`,x:`158`,y:`58`},`z`,-1)]])):b(``,!0),R.value===`night`||r.activity===`review`||r.activity===`night`?(V(),S(`g`,un,[...n[15]||=[x(`path`,{class:`moon`,d:`M40 20a18 18 0 1 0 16 28a14 14 0 1 1 -16 -28Z`},null,-1)]])):b(``,!0),r.activity===`asleep`||r.mood===`night`&&r.activity===`idle`?(V(),S(`g`,dn,[...n[16]||=[x(`text`,{class:`zz`,x:`150`,y:`64`},`z`,-1),x(`text`,{class:`zz`,x:`162`,y:`48`,style:{"animation-delay":`1s`,"font-size":`16px`}},` z `,-1),x(`text`,{class:`zz`,x:`174`,y:`30`,style:{"animation-delay":`2s`,"font-size":`20px`}},` Z `,-1)]])):b(``,!0),r.activity===`review`||r.activity===`night`?(V(),S(`g`,fn,[...n[17]||=[x(`g`,{class:`floating-page`},[x(`rect`,{class:`page`,x:`156`,y:`92`,width:`30`,height:`38`,rx:`4`}),x(`path`,{class:`line hair`,d:`M162 103h18M162 111h18M162 119h11`})],-1)]])):b(``,!0),r.activity===`thinking`?(V(),S(`g`,pn,[...n[18]||=[s(`<circle class="puff" cx="146" cy="58" r="3.5" data-v-3fb60aa5></circle><circle class="puff" cx="156" cy="45" r="5" data-v-3fb60aa5></circle><ellipse class="puff" cx="176" cy="24" rx="21" ry="14" data-v-3fb60aa5></ellipse><circle class="dot" cx="167" cy="24" r="2.6" data-v-3fb60aa5></circle><circle class="dot" cx="176" cy="24" r="2.6" style="animation-delay:0.18s;" data-v-3fb60aa5></circle><circle class="dot" cx="185" cy="24" r="2.6" style="animation-delay:0.36s;" data-v-3fb60aa5></circle>`,6)]])):b(``,!0),r.activity===`speaking`&&!ie.value?(V(),S(`g`,mn,[...n[19]||=[x(`path`,{class:`line thin`,d:`M170 94q8 9 0 18`},null,-1),x(`path`,{class:`line thin`,d:`M180 88q13 15 0 30`,style:{"animation-delay":`0.3s`}},null,-1)]])):b(``,!0)],4)),z(t,{name:`orb-say`},{default:A(()=>[le.value?(V(),S(`p`,{key:le.value,class:T([`orb-say`,`say-`+r.bubbleSide]),role:`status`},K(le.value),3)):b(``,!0)]),_:1})],46,St))}}),[[`__scopeId`,`data-v-3fb60aa5`]]),gn={overview:()=>I(`/mind`),mood:()=>I(`/mind/mood`),notes:(e=``)=>I(`/mind/thoughts?q=`+encodeURIComponent(e)),presence:()=>I(`/mind/presence`),today:()=>I(`/mind/today`),person:e=>I(`/mind/people/`+encodeURIComponent(e)),self:()=>I(`/mind/self`),thread:e=>I(`/mind/self/`+encodeURIComponent(e)),bonds:()=>I(`/mind/bonds`),bondChanges:(e,t)=>I(`/mind/bonds/${e}/`+encodeURIComponent(t)),faces:e=>I(`/mind/faces/`+encodeURIComponent(e)),life:(e=``,t)=>I(`/mind/life?q=`+encodeURIComponent(e)+(t?`&before=`+t:``)),day:e=>I(`/mind/day/`+e),chapter:e=>I(`/mind/chapters/`+e),story:()=>I(`/mind/story`),nature:()=>I(`/mind/nature`),saveNature:e=>I(`/mind/nature`,`PUT`,e),saveSettings:e=>I(`/mind/settings`,`PUT`,e),reflect:()=>I(`/mind/reflect`,`POST`,{}),review:()=>I(`/mind/review`,`POST`,{}),revoke:(e,t,n=``)=>I(`/mind/revoke`,`POST`,{kind:e,id:t,reason:n}),thought:(e,t)=>I(`/mind/thoughts/`+encodeURIComponent(e),`PATCH`,t),removeThought:e=>I(`/mind/thoughts/`+encodeURIComponent(e),`DELETE`,{}),preview:e=>I(`/mind/preview`,`POST`,e),savePrompts:e=>I(`/core/prompts`,`PUT`,e)},_n=i({promise:G(`答应的事`),plan:G(`想做的事`),event:G(`别人的安排`),date:G(`每年的日子`)}),vn=i({pending:G(`还在等`),lapsed:G(`悄悄错过了`),done:G(`做到了`),missed:G(`错过了`),let_go:G(`不再惦记`),revoked:G(`已撤销`)}),yn=i({turn:G(`聊天时`),direct:G(`聊天时`),group:G(`聊天时`),solitude:G(`独处时`),daily:G(`写日记时`),weekly:G(`回顾时`),memory:G(`从 TA 说过的话里`),migration:G(`旧版本`)}),bn=i({activity:G(`做自己的事`),solitude:G(`独处`),expression:G(`自己的念头`),daily:G(`写日记`),weekly:G(`回顾这段日子`),night:G(`夜里整理`)}),xn=i({running:G(`进行中`),written:G(`留下了东西`),state:G(`心情变了`),empty:G(`没什么新的`),error:G(`出了点问题`),skipped:G(`跳过了`),cancelled:G(`作废了`),interrupted:G(`重启中断`)}),Sn=i({active:G(`已经是 TA 的一部分`),emerging:G(`刚开始有这种感觉`),closed:G(`已经放下`)}),Cn={interest:`#ffc15f`,view:`#7fc8ff`,trait:`#ff9a8b`,habit:`#b9a4ff`,intention:`#6fe0b8`,care:`#ff8fbf`,curiosity:`#9ef0ff`},wn=i({warmer:G(`更亲近了一点`),closer:G(`走近了`),trust_up:G(`更信任了`),trust_down:G(`有点失望`),friction:G(`有了别扭`),repair:G(`和好了`),distance:G(`疏远了一点`),impression:G(`印象`)}),Tn=new Set([`friction`,`trust_down`,`distance`]),En=i([[`familiarity`,G(`熟悉`)],[`closeness`,G(`亲近`)],[`trust`,G(`信任`)],[`tension`,G(`别扭`)]]),Dn=i({open:G(`公开`),private:G(`私下知道`),secret:G(`要 TA 保密`)}),On=i({confirmed:G(`TA 这样认为`),superseded:G(`已被新的取代`),candidate:G(`旧版待确认`),disputed:G(`有争议`),expired:G(`已过期`),deleted:G(`已撤销`)}),kn=i({planned:G(`等合适的时候`),sending:G(`正在发`),sent:G(`说出口了`),declined:G(`TA 后来决定不说`),skipped:G(`时机不合适`),cancelled:G(`没有发`),uncertain:G(`投递未确认`)}),An=i({speak:G(`开口`),react:G(`简短反应`),decline:G(`说不想聊`),silent:G(`没出声`)});function jn(e,t=`Asia/Shanghai`){return e?be(y(),{timeZone:t,month:`2-digit`,day:`2-digit`,hour:`2-digit`,minute:`2-digit`}).format(e):P(`还没有`)}function Mn(e){return`${Math.round(Math.max(0,Math.min(1,Number(e)||0))*100)}%`}function Nn(e,t=`Asia/Shanghai`){return e?be(y(),{timeZone:t,hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`}).format(e):``}function Pn(e){let[,t,n]=e.split(`-`).map(Number);return t&&n?P(`{month} 月 {date} 日`,{month:t,date:n}):e}function Fn(e){let t=new Date(e+`T12:00:00`);return Number.isNaN(t.getTime())?``:be(y(),{weekday:`short`}).format(t)}function In(e,t=Date.now()){if(!e)return``;let n=Math.round((t-e)/6e4);if(n<1)return P(`刚刚`);if(n<60)return P(`{minutes} 分钟前`,{minutes:n});let r=Math.round(n/60);if(r<24)return P(`{hours} 小时前`,{hours:r});let i=Math.round(r/24);if(i<30)return P(`{days} 天前`,{days:i});let a=Math.round(i/30);return a<12?P(`{months} 个月前`,{months:a}):P(`{v} 年前`,{v:Math.round(a/12)})}function Ln(e){return Number(e||0).toLocaleString(y())}var Rn=/^\d{4,20}$/;function zn(e){let t=String(e||``).split(`:`);return t[t.length-1]||``}function Bn(e){let t=zn(e.id||``),n=String(e.name||``).trim(),r=n.replace(/^(群聊|私聊)\s+/,``),i=e.kind||(String(e.id||``).startsWith(`private:`)?`private`:`group`);return!n||r===t||Rn.test(r)?P(i===`private`?`未命名的人`:`未命名的群`):n}function Vn(e,t=``){let n=e.map(e=>({value:e.id,label:Bn(e)}));return t?[{value:``,label:t,disabled:!0},...n]:n}function Hn(e){let t=String(e||`?`).trim();return/^[\x00-\x7f]/.test(t)?t.slice(0,2).toUpperCase():t.slice(-2)}function Un(e){let t=0;for(let n of String(e))t=(t*31+n.codePointAt(0))%360;return t}var Wn=[`id`,`aria-controls`,`aria-activedescendant`,`aria-label`,`aria-expanded`,`disabled`],Gn=[`id`,`aria-labelledby`],Kn=[`id`,`tabindex`,`aria-selected`,`onClick`],qn={key:0,class:`empty`},Jn=[`id`,`name`,`value`,`disabled`],Yn=[`value`,`disabled`],Xn=R(C({__name:`Select`,props:{modelValue:{default:``},options:{},id:{default:``},name:{default:``},ariaLabel:{default:``},disabled:{type:Boolean,default:!1}},emits:[`update:modelValue`,`change`],setup(t,{emit:r}){let i=t,a=r,o=L(!1),s=L(),u=L(),d=L(),p=L(),m=pe(),h=L(0),g=L({top:0,bottom:0,left:0,width:220,maxHeight:280,upward:!1}),_=n(()=>i.options.filter(e=>!e.disabled)),v=n(()=>i.options.find(e=>String(e.value)===String(i.modelValue))?.label||_.value[0]?.label||P(`请选择`));function y(){let e=u.value?.getBoundingClientRect();if(!e)return;let t=i.options.reduce((e,t)=>Math.max(e,String(t.label||``).length),0),n=Math.min(window.innerWidth-16,Math.max(e.width,Math.min(t*15+32,420),220)),r=Math.max(8,Math.min(e.left,window.innerWidth-n-8)),a=window.innerHeight-e.bottom-6-8,o=e.top-6-8,s=a<220&&o>a;g.value={top:e.bottom+6,bottom:window.innerHeight-e.top+6,left:r,width:n,maxHeight:Math.max(96,Math.min(320,s?o:a)),upward:s}}function ee(){i.disabled||(o.value=!o.value,o.value&&y())}function C(){let e=p.value?.querySelectorAll(`[role="option"]`)[h.value];e?.focus({preventScroll:!0}),e?.scrollIntoView({block:`nearest`})}function te(e){if(e.key===`Tab`){o.value=!1;return}if([`Escape`,`ArrowDown`,`ArrowUp`,`Home`,`End`,`Enter`,` `].includes(e.key)){if(e.preventDefault(),e.stopPropagation(),e.key===`Escape`){o.value=!1,u.value?.focus();return}if(_.value.length){if(e.key===`Enter`||e.key===` `){E(_.value[h.value].value);return}h.value=e.key===`Home`?0:e.key===`End`?_.value.length-1:(h.value+(e.key===`ArrowUp`?-1:1)+_.value.length)%_.value.length,C()}}}function ne(e){[`ArrowDown`,`ArrowUp`].includes(e.key)&&!o.value&&(e.preventDefault(),ee())}function E(e){let t=String(e);if(o.value=!1,!d.value){a(`update:modelValue`,t);return}d.value.value=t;let n=new Event(`change`,{bubbles:!0});d.value.dispatchEvent(n),u.value?.focus()}function D(e){s.value&&!s.value.contains(e.target)&&(o.value=!1)}function O(){o.value&&y()}function k(){document.removeEventListener(`pointerdown`,D),window.removeEventListener(`scroll`,O,!0),window.removeEventListener(`resize`,O),document.removeEventListener(`keydown`,te,!0)}return F(o,async e=>{k(),e&&(h.value=Math.max(0,_.value.findIndex(e=>String(e.value)===String(i.modelValue))),document.addEventListener(`pointerdown`,D),window.addEventListener(`scroll`,O,!0),window.addEventListener(`resize`,O),document.addEventListener(`keydown`,te,!0),await w(),o.value&&C())}),F(()=>i.disabled,e=>{e&&(o.value=!1)}),re(()=>{o.value=!1,k()}),e(k),(e,n)=>(V(),S(`div`,{ref_key:`root`,ref:s,class:T([`menu-select`,{open:o.value,disabled:t.disabled}])},[x(`button`,{ref_key:`face`,ref:u,type:`button`,class:`menu-face`,id:j(m)+`-face`,role:`combobox`,"aria-haspopup":`listbox`,"aria-controls":j(m),"aria-activedescendant":o.value&&_.value.length?j(m)+`-`+h.value:void 0,"aria-label":t.ariaLabel||void 0,"aria-expanded":o.value,disabled:t.disabled,onClick:ee,onKeydown:ne},[x(`span`,null,K(v.value),1),n[2]||=x(`i`,{"aria-hidden":`true`},null,-1)],40,Wn),(V(),c(ye,{to:`body`},[o.value?(V(),S(`ul`,{key:0,ref_key:`menu`,ref:p,id:j(m),class:T([`menu-list`,{up:g.value.upward}]),role:`listbox`,"aria-labelledby":j(m)+`-face`,onPointerdown:n[0]||=l(()=>{},[`stop`]),style:W({top:g.value.upward?`auto`:g.value.top+`px`,bottom:g.value.upward?g.value.bottom+`px`:`auto`,left:g.value.left+`px`,width:g.value.width+`px`,maxHeight:g.value.maxHeight+`px`})},[(V(!0),S(f,null,N(_.value,(e,n)=>(V(),S(`li`,{key:String(e.value)},[x(`button`,{type:`button`,role:`option`,id:j(m)+`-`+n,tabindex:n===h.value?0:-1,"aria-selected":String(e.value)===String(t.modelValue),onClick:t=>E(e.value)},K(e.label),9,Kn)]))),128)),_.value.length?b(``,!0):(V(),S(`li`,qn,K(j(P)(`没有可选项`)),1))],46,Gn)):b(``,!0)])),x(`select`,{ref_key:`native`,ref:d,class:`native`,id:t.id||void 0,name:t.name||void 0,value:t.modelValue,disabled:t.disabled,tabindex:`-1`,"aria-hidden":`true`,onChange:n[1]||=e=>{o.value=!1,a(`update:modelValue`,e.target.value),a(`change`,e)}},[(V(!0),S(f,null,N(t.options,e=>(V(),S(`option`,{key:`n-`+String(e.value),value:e.value,disabled:e.disabled},K(e.label),9,Yn))),128))],40,Jn)],2))}}),[[`__scopeId`,`data-v-41eb8776`]]),Zn=[`id`],Qn={class:`preview-meta`,role:`status`},$n=[`id`],er={key:1},tr={key:2,class:`why`},nr=[`aria-label`],rr=[`id`],ir={class:`ta-chat-options`},ar={class:`where`},or=[`disabled`],sr={class:`composer`},cr=[`placeholder`],lr=[`disabled`],ur=R(C({__name:`TaChat`,props:{sessions:{default:()=>[]},nature:{default:null},anchored:{type:Boolean,default:!1},starter:{default:``}},setup(e){let t=e,n=L([]),r=L(t.starter),i=L(``),a=L(!1),o=L(``),s=L();async function u(){await w(),s.value?.scrollTo({top:s.value.scrollHeight})}async function d(){let e=r.value.trim();if(!a.value&&e){a.value=!0,n.value.push({role:`user`,text:e}),r.value=``,u();try{let r=await gn.preview({text:e,history:n.value.slice(0,-1).slice(-12).map(({role:e,text:t})=>({role:e,text:t})),...t.nature?{nature:t.nature}:{},viewSession:i.value});r.reply?n.value.push({role:`assistant`,text:r.reply,bubbles:r.bubbles?.length?r.bubbles:[r.reply],note:[An[r.choice]||r.choice,r.appraisal].filter(Boolean).join(` · `),why:r.reason}):n.value.push({role:`assistant`,text:P(`(TA 没有出声)`),note:An[r.choice]||P(`没出声`),why:r.reason}),o.value=P(`{v} · 心情{v2} · {latency} ms`,{v:r.mode===`model`?P(`真实模型`):P(`本地样例(没有模型档案)`),v2:r.mood||P(`平静`),latency:r.latency})}catch(t){n.value.pop(),r.value=e,o.value=t.message}finally{a.value=!1,u()}}}function p(){n.value=[]}return(t,u)=>(V(),S(`div`,{class:`ta-chat`,id:e.anchored?`ta-preview`:void 0},[x(`p`,Qn,K(o.value||j(P)(`试聊走真实链路:读取 TA 此刻的心智和记忆,但不写入,也不发 QQ。配置了模型时会消耗 Token。`)),1),x(`div`,{id:e.anchored?`previewMessages`:void 0,ref_key:`log`,ref:s,class:`ta-chat-log scroll-pane`},[!n.value.length&&!a.value?(V(),c(me,{key:0,title:j(P)(`TA 会先理解,再决定说不说`),text:j(P)(`回应会显示 TA 的选择和当时的想法。`)},null,8,[`title`,`text`])):b(``,!0),(V(!0),S(f,null,N(n.value,(e,t)=>(V(),S(`article`,{key:t,class:T([`preview-bubble`,e.role===`assistant`?`bot`:`me`])},[e.bubbles?(V(!0),S(f,{key:0},N(e.bubbles,(e,t)=>(V(),S(`p`,{key:t},K(e),1))),128)):(V(),S(`p`,er,K(e.text),1)),e.note||e.why?(V(),S(`details`,tr,[x(`summary`,null,K(e.note||j(P)(`为什么`)),1),x(`p`,null,K(e.why||j(P)(`没有留下理由。`)),1)])):b(``,!0)],2))),128)),a.value?(V(),S(`div`,{key:1,class:`typing`,"aria-label":j(P)(`TA 在想`)},[...u[2]||=[x(`i`,null,null,-1),x(`i`,null,null,-1),x(`i`,null,null,-1)]],8,nr)):b(``,!0)],8,$n),x(`form`,{id:e.anchored?`previewForm`:void 0,class:`ta-chat-form`,onSubmit:l(d,[`prevent`])},[x(`div`,ir,[x(`label`,ar,[x(`span`,null,K(j(P)(`想象在这里`)),1),z(Xn,{modelValue:i.value,"onUpdate:modelValue":u[0]||=e=>i.value=e,name:`viewSession`,"aria-label":j(P)(`想象在这里`),options:[{value:``,label:j(P)(`一段新的私聊`)},...j(Vn)(e.sessions)]},null,8,[`modelValue`,`aria-label`,`options`])]),E(t.$slots,`options`,{},void 0,!0),x(`button`,{type:`button`,class:`text-button`,disabled:!n.value.length,onClick:p},K(j(P)(`清空`)),9,or)]),x(`div`,sr,[ie(x(`input`,{"onUpdate:modelValue":u[1]||=e=>r.value=e,name:`text`,placeholder:j(P)(`说一句试试…`),required:``,maxlength:`1000`,autocomplete:`off`},null,8,cr),[[h,r.value]]),x(`button`,{class:`primary`,disabled:a.value},K(a.value?j(P)(`TA 在想…`):j(P)(`说`)),9,lr)])],40,rr)],8,Zn))}}),[[`__scopeId`,`data-v-235059b5`]]),dr={class:`companion`},fr=[`aria-label`],pr=[`aria-label`],mr={class:`drawer-head`},hr={class:`drawer-title`},gr={class:`chip`,"data-tone":`quiet`},_r=[`aria-label`],vr={key:0,class:`companion-dock`},yr=[`aria-expanded`],br=R(C({__name:`TaCompanion`,props:{hideOrb:{type:Boolean}},setup(e){let r=L(),i=n(()=>Q.data?.activity?.kind||`idle`),a=n(()=>Q.data?.name||`TA`);return F(()=>H.chatOpen,async e=>{e&&(await w(),r.value?.querySelector(`input[name=text]`)?.focus())}),(n,s)=>(V(),S(`div`,dr,[z(t,{name:`scrim`},{default:A(()=>[j(H).chatOpen?(V(),S(`button`,{key:0,class:`scrim`,type:`button`,"aria-label":j(P)(`收起聊天`),onClick:s[0]||=e=>j(H).chatOpen=!1},null,8,fr)):b(``,!0)]),_:1}),z(t,{name:`drawer`},{default:A(()=>[j(H).chatOpen?(V(),S(`section`,{key:0,ref_key:`drawer`,ref:r,class:`ta-drawer`,role:`dialog`,"aria-modal":`true`,"aria-label":j(P)(`和 {name} 聊聊(试聊)`,{name:a.value}),onKeydown:s[2]||=o(e=>j(H).chatOpen=!1,[`esc`])},[x(`header`,mr,[z(hn,{mood:j(X),activity:i.value,size:42},null,8,[`mood`,`activity`]),x(`div`,hr,[x(`h2`,null,K(j(P)(`和 {name} 聊聊`,{name:a.value})),1),x(`span`,gr,K(j(P)(`试聊 · 什么都不写入`)),1)]),x(`button`,{class:`icon-button ghost`,"aria-label":j(P)(`收起聊天`),onClick:s[1]||=e=>j(H).chatOpen=!1},` ✕ `,8,_r)]),z(ur,{sessions:j(H).core?.sessions||[]},null,8,[`sessions`])],40,pr)):b(``,!0)]),_:1}),!e.hideOrb&&!j(H).chatOpen?(V(),S(`div`,vr,[x(`button`,{class:`companion-talk`,"aria-expanded":j(H).chatOpen,onClick:s[3]||=e=>j(H).chatOpen=!j(H).chatOpen},K(j(H).chatOpen?j(P)(`收起`):j(P)(`聊聊`)),9,yr),z(hn,{mood:j(X),activity:i.value,size:44,interactive:``,"bubble-side":`left`,onOpenChat:s[4]||=e=>j(H).chatOpen=!0},null,8,[`mood`,`activity`])])):b(``,!0)]))}}),[[`__scopeId`,`data-v-038fa72e`]]),xr=[`aria-label`],Sr=[`lang`,`aria-pressed`,`aria-label`,`title`,`data-locale`,`onClick`],Cr=R(C({__name:`LocaleSwitch`,setup(e){return(e,t)=>(V(),S(`div`,{id:`locale`,class:`seg locale-switch`,role:`group`,"aria-label":j(P)(`语言`)},[(V(!0),S(f,null,N(j(r),e=>(V(),S(`button`,{key:e.code,type:`button`,lang:e.code===`zh`?`zh-CN`:`en`,class:T({active:j(a)===e.code}),"aria-pressed":j(a)===e.code,"aria-label":e.label,title:e.label,"data-locale":e.code,onClick:t=>j(m)(e.code)},K(e.short),11,Sr))),128))],8,xr))}}),[[`__scopeId`,`data-v-bc942b38`]]),wr=[`aria-expanded`,`title`],Tr=[`data-mood`],Er={class:`rail-label`},Dr=[`aria-label`],Or=[`aria-checked`],kr=[`data-mood`],Ar=[`data-theme-choice`,`aria-checked`,`onClick`],jr=[`data-mood`],Mr=R(C({__name:`ThemePicker`,props:{inline:{type:Boolean,default:!1}},setup(n){let r=L(!1),i=L();function a(e){Ne(e),r.value=!1}function s(e){r.value&&i.value&&!i.value.contains(e.target)&&!e.target.closest(`.theme-menu`)&&(r.value=!1)}return he(()=>document.addEventListener(`pointerdown`,s)),e(()=>document.removeEventListener(`pointerdown`,s)),(e,s)=>(V(),S(`div`,{ref_key:`root`,ref:i,class:T([`theme-picker`,{inline:n.inline}]),onKeydown:s[2]||=o(e=>r.value=!1,[`esc`])},[n.inline?b(``,!0):(V(),S(`button`,{key:0,class:`theme-toggle`,type:`button`,"aria-expanded":r.value,"aria-haspopup":`true`,title:j(Y).pinned?j(P)(`主题固定为「{v}」`,{v:j(q)[j(Y).pinned].label}):j(P)(`主题跟随 TA 的心情`),onClick:s[0]||=e=>r.value=!r.value},[x(`span`,{class:`swatch`,"data-mood":j(Y).pinned??j(X),"aria-hidden":`true`},null,8,Tr),x(`span`,Er,K(j(Y).pinned?j(P)(`固定:{v}`,{v:j(q)[j(Y).pinned].label}):j(P)(`跟随 TA · {v}`,{v:j(q)[j(X)].label})),1)],8,wr)),(V(),c(ye,{to:`body`,disabled:n.inline},[z(t,{name:`pop`},{default:A(()=>[r.value||n.inline?(V(),S(`div`,{key:0,class:T([`theme-menu`,{"inline-menu":n.inline}]),role:`radiogroup`,"aria-label":j(P)(`界面主题`)},[x(`button`,{type:`button`,role:`radio`,"data-theme-choice":`auto`,"aria-checked":!j(Y).pinned,onClick:s[1]||=e=>a(null)},[x(`span`,{class:`swatch auto`,"data-mood":j(X),"aria-hidden":`true`},null,8,kr),x(`span`,null,[x(`b`,null,K(j(P)(`跟随 TA 的心情`)),1),x(`small`,null,K(j(P)(`现在是「{v}」`,{v:j(q)[j(X)].label})),1)])],8,Or),(V(!0),S(f,null,N(j(xe),e=>(V(),S(`button`,{key:e,type:`button`,role:`radio`,"data-theme-choice":e,"aria-checked":j(Y).pinned===e,onClick:t=>a(e)},[x(`span`,{class:`swatch`,"data-mood":e,"aria-hidden":`true`},null,8,jr),x(`span`,null,[x(`b`,null,K(j(q)[e].label),1),x(`small`,null,K(j(q)[e].feel),1)])],8,Ar))),128))],10,Dr)):b(``,!0)]),_:1})],8,[`disabled`]))],34))}}),[[`__scopeId`,`data-v-4e5670d2`]]),Nr=[`aria-label`],Pr={class:`presence-detail`},Fr={class:`eyebrow`},Ir={class:`mood-word`},Lr={class:`lede`},Rr={class:`row chips`},zr=[`data-activity`],Br={key:0,class:`chip`,"data-tone":`quiet`},Vr={key:1,class:`chip`,"data-tone":`quiet`},Hr={key:2,class:`chip`,"data-tone":`quiet`},Ur={class:`row actions`},Wr=[`disabled`],Gr=[`disabled`],Kr={class:`faint`},qr={key:0,class:`aside-bit`},Jr={class:`eyebrow`},Yr={key:1,class:`aside-bit`},Xr={class:`eyebrow`},Zr={key:0},Qr={key:2,class:`aside-bit`},$r={class:`eyebrow`},ei={key:0},ti=R(C({__name:`NowStatusDock`,setup(e){let t=n(()=>Q.data),r=L(!1),i=n(()=>Q.data),a=n(()=>i.value?.affect||t.value?.affect||{}),o=n(()=>i.value?.activity?.kind||`idle`),s=n(()=>i.value?.expecting?.[0]||null),c=n(()=>r.value||!!t.value?.busy||[`solitude`,`diary`,`review`,`night`].includes(o.value));async function l(e){r.value=!0;try{let t=await gn[e]();U(t.reason||P(`完成了`),t.status===`error`)}catch(e){U(e.message,!0)}finally{r.value=!1,await Re()}}return(e,n)=>(V(),S(`aside`,{class:`presence-dock`,"aria-label":j(P)(`TA 的此刻状态`)},[x(`div`,Pr,[x(`span`,Fr,[d(K(j(P)(`第 {v} 天`,{v:i.value?.dayOfLife??t.value?.dayOfLife??1}))+` `,1),i.value?.clock?(V(),S(f,{key:0},[d(` · `+K(i.value.clock.period)+` `+K(i.value.clock.local.slice(11)),1)],64)):b(``,!0)]),x(`h2`,Ir,K(a.value.mood||j(P)(`平静`)),1),x(`p`,Lr,K(j(ct)(a.value)||j(P)(`没有特别牵动 TA 的事,心情慢慢回到平常。`)),1),x(`div`,Rr,[x(`span`,{class:`chip activity-chip`,"data-activity":o.value},K(j(ut)(i.value)),9,zr),j(lt)(a.value)?(V(),S(`span`,Br,K(j(P)(`这阵子 · {v}`,{v:j(lt)(a.value)})),1)):b(``,!0),a.value.energyLabel?(V(),S(`span`,Vr,K(j(P)(`精力 · {energyLabel}`,{energyLabel:a.value.energyLabel})),1)):b(``,!0),t.value?.nature?.rhythm?.enabled?(V(),S(`span`,Hr,K(j(P)(`{wake} 醒 / {sleep} 睡`,{wake:t.value.nature.rhythm.wake,sleep:t.value.nature.rhythm.sleep})),1)):b(``,!0)]),x(`div`,Ur,[i.value?.currentLife?.current?(V(),S(`button`,{key:0,class:`text-button`,onClick:n[0]||=e=>j(M)(`time`)},K(j(P)(`看看进度`)),1)):b(``,!0),x(`button`,{class:`primary`,onClick:n[1]||=e=>j(H).chatOpen=!0},K(j(P)(`和 TA 聊聊`)),1),x(`button`,{disabled:c.value,onClick:n[2]||=e=>l(`reflect`)},K(c.value?j(P)(`TA 正在想…`):j(P)(`让 TA 独处一会儿`)),9,Wr),x(`button`,{disabled:c.value,onClick:n[3]||=e=>l(`review`)},K(j(P)(`写下今天的日记`)),9,Gr)]),x(`small`,Kr,K(t.value?.reason||j(P)(`安静下来时,TA 会自己独处。`)),1),i.value?.lastWords?(V(),S(`div`,qr,[x(`span`,Jr,K(j(P)(`最近说`)),1),x(`p`,null,`“`+K(i.value.lastWords.text)+`”`,1),x(`small`,null,K(j(Bn)({name:i.value.lastWords.sessionName,id:i.value.lastWords.session}))+` · `+K(j(In)(i.value.lastWords.time,i.value.now)),1)])):b(``,!0),i.value?.thought?(V(),S(`div`,Yr,[x(`span`,Xr,K(j(P)(`放在心上`)),1),x(`p`,null,K(i.value.thought.content),1),i.value.thought.when?(V(),S(`small`,Zr,K(i.value.thought.when),1)):b(``,!0)])):b(``,!0),s.value?(V(),S(`div`,Qr,[x(`span`,$r,K(j(P)(`在等`)),1),x(`p`,null,K(s.value.name?`${s.value.name}:`:``)+K(s.value.content),1),s.value.when?(V(),S(`small`,ei,K(s.value.when),1)):b(``,!0)])):b(``,!0)])],8,Nr))}}),[[`__scopeId`,`data-v-4625711b`]]),ni=[`onKeydown`],ri=[`aria-label`],ii={key:0},ai=[`type`,`placeholder`,`autocomplete`],oi={class:`row end`},si=R(C({__name:`Confirm`,setup(e){let r=n(()=>ve.queue[0]||null),i=L(``),a=L(),s=L(),u=null;F(r,async(e,t)=>{if(e&&!t&&(u=document.activeElement),!e){u?.focus?.(),u=null;return}i.value=e.value,await w(),e.kind===`prompt`?a.value?.focus():s.value?.focus()});function d(){r.value&&v(r.value.kind===`prompt`?i.value.trim():`ok`)}function f(){v(null)}return(e,n)=>(V(),c(ye,{to:`body`},[z(t,{name:`dialog`},{default:A(()=>[r.value?(V(),S(`div`,{key:0,class:`dialog-layer`,onKeydown:o(l(f,[`prevent`]),[`esc`])},[x(`form`,{class:`dialog`,role:`alertdialog`,"aria-modal":`true`,"aria-label":r.value.title,onSubmit:l(d,[`prevent`])},[n[1]||=x(`span`,{class:`dialog-orb`,"aria-hidden":`true`},null,-1),x(`h2`,null,K(r.value.title),1),r.value.message?(V(),S(`p`,ii,K(r.value.message),1)):b(``,!0),r.value.kind===`prompt`?ie((V(),S(`input`,{key:1,ref_key:`input`,ref:a,"onUpdate:modelValue":n[0]||=e=>i.value=e,type:r.value.secret?`password`:`text`,placeholder:r.value.placeholder,autocomplete:r.value.secret?`current-password`:`off`},null,8,ai)),[[p,i.value]]):b(``,!0),x(`div`,oi,[x(`button`,{type:`button`,class:`dialog-cancel ghost`,onClick:f},K(r.value.cancelText),1),x(`button`,{ref_key:`confirmButton`,ref:s,type:`submit`,class:T([`dialog-confirm`,r.value.danger?`danger`:`primary`])},K(r.value.confirmText),3)])],40,ri)],40,ni)):b(``,!0)]),_:1})]))}}),[[`__scopeId`,`data-v-2339e49c`]]),ci={class:`icon`,viewBox:`0 0 24 24`,"aria-hidden":`true`},li={key:6,d:`M4.5 19.5h15M6 19.5V6.5h3v13M10.5 19.5V4.5h3v15M15.2 19.2l-.6-11.8 2.9-.4 1.2 11.8`},ui={key:14,d:`M12 5.5v13M5.5 12h13`},di={key:15,d:`M14.5 6 8.5 12l6 6`},fi={key:19,cx:`12`,cy:`12`,r:`7`},pi=R(C({__name:`Icon`,props:{name:{}},setup(e){return(t,n)=>(V(),S(`svg`,ci,[e.name===`now`?(V(),S(f,{key:0},[n[0]||=x(`path`,{d:`M12 4.5c4.2 0 7 2.9 7 7.2 0 4.6-3 7.8-7 7.8s-7-3.2-7-7.8c0-4.3 2.8-7.2 7-7.2Z`},null,-1),n[1]||=x(`path`,{d:`M9.4 11.4v.6M14.6 11.4v.6M10 15c1.2.9 2.8.9 4 0`},null,-1)],64)):e.name===`time`?(V(),S(f,{key:1},[n[2]||=x(`circle`,{cx:`12`,cy:`12`,r:`8`},null,-1),n[3]||=x(`path`,{d:`M12 7v5l3 2`},null,-1)],64)):e.name===`chats`?(V(),S(f,{key:2},[n[4]||=x(`path`,{d:`M4.5 6.5a2 2 0 0 1 2-2h11a2 2 0 0 1 2 2v7a2 2 0 0 1-2 2H11l-4 3.5v-3.5h-.5a2 2 0 0 1-2-2v-7Z`},null,-1),n[5]||=x(`path`,{d:`M8.5 10h.01M12 10h.01M15.5 10h.01`},null,-1)],64)):e.name===`heart`?(V(),S(f,{key:3},[n[6]||=x(`path`,{d:`M12 3.5l1.6 4.4 4.6.2-3.6 2.9 1.3 4.5L12 12.9l-3.9 2.6 1.3-4.5-3.6-2.9 4.6-.2L12 3.5Z`},null,-1),n[7]||=x(`path`,{d:`M5 19.5h.01M19 18.5h.01M18.5 4.5h.01`},null,-1)],64)):e.name===`people`?(V(),S(f,{key:4},[n[8]||=s(`<circle cx="12" cy="12" r="2.6" data-v-dac01a3b></circle><circle cx="5.2" cy="7.2" r="1.7" data-v-dac01a3b></circle><circle cx="18.6" cy="8.4" r="1.4" data-v-dac01a3b></circle><circle cx="16.8" cy="18" r="1.9" data-v-dac01a3b></circle><path d="M6.6 8.4l3.3 2.1M17.3 9.1l-3 1.7M15.6 16.4l-1.7-2.3" data-v-dac01a3b></path>`,5)],64)):e.name===`life`?(V(),S(f,{key:5},[n[9]||=x(`path`,{d:`M12 6.5c-2-1.4-4.6-1.8-7.5-1.5v12.6c2.9-.3 5.5.1 7.5 1.5 2-1.4 4.6-1.8 7.5-1.5V5c-2.9-.3-5.5.1-7.5 1.5Z`},null,-1),n[10]||=x(`path`,{d:`M12 6.5v12.6`},null,-1)],64)):e.name===`memory`?(V(),S(`path`,li)):e.name===`nature`?(V(),S(f,{key:7},[n[11]||=x(`path`,{d:`M12 20v-7.5`},null,-1),n[12]||=x(`path`,{d:`M12 12.5c0-4 2.6-6.8 6.8-7-.1 4.2-2.8 7-6.8 7Z`},null,-1),n[13]||=x(`path`,{d:`M12 14.5c0-3-2-5.1-5.3-5.2.1 3.1 2.2 5.2 5.3 5.2Z`},null,-1)],64)):e.name===`system`?(V(),S(f,{key:8},[n[14]||=x(`circle`,{cx:`12`,cy:`12`,r:`3`},null,-1),n[15]||=x(`path`,{d:`M12 3.5v2.3M12 18.2v2.3M20.5 12h-2.3M5.8 12H3.5M18 6l-1.6 1.6M7.6 16.4 6 18M18 18l-1.6-1.6M7.6 7.6 6 6`},null,-1)],64)):e.name===`more`?(V(),S(f,{key:9},[n[16]||=x(`circle`,{cx:`6`,cy:`12`,r:`1.3`},null,-1),n[17]||=x(`circle`,{cx:`12`,cy:`12`,r:`1.3`},null,-1),n[18]||=x(`circle`,{cx:`18`,cy:`12`,r:`1.3`},null,-1)],64)):e.name===`refresh`?(V(),S(f,{key:10},[n[19]||=x(`path`,{d:`M19 12a7 7 0 1 1-2.1-5`},null,-1),n[20]||=x(`path`,{d:`M19 4.5V9h-4.5`},null,-1)],64)):e.name===`send`?(V(),S(f,{key:11},[n[21]||=x(`path`,{d:`M4.5 11.8 19.5 5l-4.8 14.5-3.2-6.2-7-1.5Z`},null,-1),n[22]||=x(`path`,{d:`m11.5 13.3 3.4-3.6`},null,-1)],64)):e.name===`palette`?(V(),S(f,{key:12},[n[23]||=x(`path`,{d:`M12 4a8 8 0 1 0 0 16c1.2 0 1.8-.8 1.8-1.6 0-1.3-1.3-1.6-1.3-2.7 0-.9.7-1.5 1.7-1.5H16a4 4 0 0 0 4-4C20 6.9 16.4 4 12 4Z`},null,-1),n[24]||=x(`path`,{d:`M8 11h.01M10 7.8h.01M14 7.8h.01M16.2 11h.01`},null,-1)],64)):e.name===`search`?(V(),S(f,{key:13},[n[25]||=x(`circle`,{cx:`11`,cy:`11`,r:`6`},null,-1),n[26]||=x(`path`,{d:`m20 20-4.5-4.5`},null,-1)],64)):e.name===`plus`?(V(),S(`path`,ui)):e.name===`back`?(V(),S(`path`,di)):e.name===`motion`?(V(),S(f,{key:16},[n[27]||=x(`path`,{d:`M4 14c2.5-4 5.5-4 8 0s5.5 4 8 0`},null,-1),n[28]||=x(`path`,{d:`M4 9c2.5-4 5.5-4 8 0s5.5 4 8 0`},null,-1)],64)):e.name===`plugins`?(V(),S(f,{key:17},[n[29]||=x(`path`,{d:`M8 7h8v4H8zM6 11h12v6H6z`},null,-1),n[30]||=x(`path`,{d:`M9 11V7M15 11V7M12 14v3`},null,-1)],64)):e.name===`guide`?(V(),S(f,{key:18},[n[31]||=x(`circle`,{cx:`12`,cy:`12`,r:`8`},null,-1),n[32]||=x(`path`,{d:`M9.8 9.6a2.3 2.3 0 1 1 3.3 2.1c-.7.3-1.1.9-1.1 1.6v.3M12 16.5h.01`},null,-1)],64)):(V(),S(`circle`,fi))]))}}),[[`__scopeId`,`data-v-dac01a3b`]]),mi=[`aria-label`],hi={class:`sheet-head`},gi={key:0,class:`eyebrow`},_i=[`aria-label`],vi={class:`sheet-body`},yi=R(C({__name:`Sheet`,props:{open:{type:Boolean},title:{},eyebrow:{default:``},width:{default:`520px`}},emits:[`close`],setup(r,{emit:i}){let a=r,o=i,s=L(),u=L(!0),d=n(()=>a.open&&u.value);g(()=>{u.value=!0}),re(()=>{u.value=!1});let f=null;function p(e){e.key===`Escape`&&o(`close`)}return F(d,async e=>{e?(f=document.activeElement,document.addEventListener(`keydown`,p),await w(),s.value?.focus()):(document.removeEventListener(`keydown`,p),f?.focus?.())},{immediate:!0}),e(()=>document.removeEventListener(`keydown`,p)),(e,n)=>(V(),c(ye,{to:`body`},[z(t,{name:`sheet`},{default:A(()=>[d.value?(V(),S(`div`,{key:0,class:`sheet-layer`,onClick:n[1]||=l(e=>o(`close`),[`self`])},[x(`aside`,{ref_key:`panel`,ref:s,class:`sheet`,role:`dialog`,"aria-modal":`true`,"aria-label":r.title,tabindex:`-1`,style:W({"--sheet-w":r.width})},[x(`header`,hi,[x(`div`,null,[r.eyebrow?(V(),S(`span`,gi,K(r.eyebrow),1)):b(``,!0),x(`h2`,null,K(r.title),1)]),x(`button`,{class:`icon-button ghost sheet-close`,"aria-label":j(P)(`关闭`),onClick:n[0]||=e=>o(`close`)},` ✕ `,8,_i)]),x(`div`,vi,[E(e.$slots,`default`,{},void 0,!0)])],12,mi)])):b(``,!0)]),_:3})]))}}),[[`__scopeId`,`data-v-2c804a0d`]]);function bi(e,t){let r=!1,i=!1,a=!1,o=n(()=>H.page===e),s=()=>{if(o.value){if(i){a=!0;return}i=!0,t().catch(e=>U(e.message,!0)).finally(()=>{i=!1,a&&(a=!1,s())})}};return he(s),g(()=>{r&&s(),r=!0}),F(()=>[H.tick,H.pulse],s),o}var xi={class:`card`},Si={key:0,class:`card-head`},Ci={key:0,class:`eyebrow`},wi={key:1},Ti={key:2},Ei={key:0,class:`row`},Di=R(C({__name:`Card`,props:{title:{},eyebrow:{},sub:{}},setup(e){return(t,n)=>(V(),S(`section`,xi,[e.title||e.eyebrow||t.$slots.actions?(V(),S(`header`,Si,[x(`div`,null,[e.eyebrow?(V(),S(`span`,Ci,K(e.eyebrow),1)):b(``,!0),e.title?(V(),S(`h2`,wi,K(e.title),1)):b(``,!0),e.sub?(V(),S(`p`,Ti,K(e.sub),1)):b(``,!0)]),t.$slots.actions?(V(),S(`div`,Ei,[E(t.$slots,`actions`,{},void 0,!0)])):b(``,!0)])):b(``,!0),E(t.$slots,`default`,{},void 0,!0)]))}}),[[`__scopeId`,`data-v-2c88637b`]]),Oi={class:`meter-row`},ki={class:`meter-label`},Ai=[`aria-label`,`aria-valuenow`],ji={class:`meter-value`},Mi=R(C({__name:`Meter`,props:{label:{},value:{},text:{},warn:{type:Boolean}},setup(e){let t=e,r=n(()=>Math.round(Math.max(0,Math.min(1,Number(t.value)||0))*100));return(t,n)=>(V(),S(`div`,Oi,[x(`span`,ki,K(e.label),1),x(`div`,{class:T([`meter`,{warn:e.warn}]),role:`meter`,"aria-label":e.label,"aria-valuemin":`0`,"aria-valuemax":`100`,"aria-valuenow":r.value},[x(`i`,{style:W({width:r.value+`%`})},null,4)],10,Ai),x(`b`,ji,K(e.text??r.value+`%`),1)]))}}),[[`__scopeId`,`data-v-4f51518c`]]),Ni=[`aria-label`],Pi=[`data-tab`,`aria-selected`,`tabindex`,`onClick`],Fi={key:0,class:`count`},Ii=R(C({__name:`Tabs`,props:ee({items:{},label:{}},{modelValue:{required:!0},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=O(e,`modelValue`);function n(e,n){let r=n.findIndex(e=>e.key===t.value),i=e.key===`ArrowRight`?1:e.key===`ArrowLeft`?-1:0;if(!i)return;e.preventDefault();let a=n[(r+i+n.length)%n.length];t.value=a.key;let o=e.currentTarget.closest(`[role="tablist"]`);requestAnimationFrame(()=>o?.querySelector(`[data-tab="${a.key}"]`)?.focus())}return(r,i)=>(V(),S(`div`,{class:`seg tabs`,role:`tablist`,"aria-label":e.label},[(V(!0),S(f,null,N(e.items,r=>(V(),S(`button`,{key:r.key,type:`button`,role:`tab`,"data-tab":r.key,"aria-selected":t.value===r.key,tabindex:t.value===r.key?0:-1,onClick:e=>t.value=r.key,onKeydown:i[0]||=t=>n(t,e.items)},[d(K(r.label),1),r.count!==void 0&&r.count!==``?(V(),S(`small`,Fi,K(r.count),1)):b(``,!0)],40,Pi))),128))],8,Ni))}}),[[`__scopeId`,`data-v-e8e03a3b`]]),Li=[`aria-label`],Ri=[`data-tone`],zi={class:`entry`},Bi=R(C({__name:`Timeline`,props:{items:{},label:{}},setup(e){return(t,n)=>(V(),S(`ol`,{class:`timeline`,"aria-label":e.label},[(V(!0),S(f,null,N(e.items,(e,r)=>(V(),S(`li`,{key:e.id??r,"data-tone":e.tone||void 0},[n[0]||=x(`span`,{class:`stem`,"aria-hidden":`true`},[x(`i`)],-1),x(`div`,zi,[E(t.$slots,`default`,{item:e,index:r},void 0,!0)])],8,Ri))),128))],8,Li))}}),[[`__scopeId`,`data-v-e79d18a9`]]),Vi=[`aria-label`],Hi={class:`choice`},Ui={class:`row`},Wi=[`disabled`],Gi=[`disabled`],Ki={class:`choice`},qi={class:`row`},Ji=[`disabled`],Yi=[`disabled`],Xi={key:0,class:`opacity`},Zi=[`value`,`aria-label`],Qi=R(C({__name:`WallpaperPicker`,props:{open:{type:Boolean}},emits:[`close`],setup(e,{emit:t}){let n=t,r=L(),i=L(),a=L(``);async function o(e,t){let n=t.target,r=n.files?.[0];if(n.value=``,r){a.value=e;try{e===`hero`?await nt(r):await it(r),U(P(e===`hero`?`中间这张已换上`:`后面的壁纸已换上`))}catch(e){U(e.message,!0)}finally{a.value=``}}}async function s(e){a.value=e;try{e===`hero`?await rt():await at(),U(P(`已恢复原来的壁纸`))}catch(e){U(e.message,!0)}finally{a.value=``}}return(t,c)=>e.open?(V(),S(`section`,{key:0,class:`wallpaper-picker`,"aria-label":j(P)(`换壁纸`)},[x(`header`,null,[x(`b`,null,K(j(P)(`换壁纸`)),1),x(`button`,{type:`button`,class:`text-button`,onClick:c[0]||=e=>n(`close`)},K(j(P)(`收起`)),1)]),x(`div`,Hi,[x(`span`,null,K(j(P)(`中间这张`)),1),x(`div`,Ui,[x(`button`,{type:`button`,disabled:!!a.value,onClick:c[1]||=e=>r.value?.click()},K(a.value===`hero`?j(P)(`处理中…`):j(P)(`选择图片`)),9,Wi),x(`button`,{type:`button`,disabled:!!a.value,onClick:c[2]||=e=>s(`hero`)},K(j(P)(`恢复默认`)),9,Gi)])]),x(`div`,Ki,[x(`span`,null,K(j(P)(`后面的大壁纸`)),1),x(`div`,qi,[x(`button`,{type:`button`,disabled:!!a.value,onClick:c[3]||=e=>i.value?.click()},K(a.value===`sky`?j(P)(`处理中…`):j(P)(`选择图片`)),9,Ji),x(`button`,{type:`button`,disabled:!!a.value,onClick:c[4]||=e=>s(`sky`)},K(j(P)(`恢复默认`)),9,Yi)]),j($).sky?(V(),S(`label`,Xi,[x(`span`,null,K(j(P)(`透明度 {v}%`,{v:Math.round(j($).skyOpacity*100)})),1),x(`input`,{type:`range`,min:`0.08`,max:`0.82`,step:`0.02`,value:j($).skyOpacity,"aria-label":j(P)(`后面壁纸的透明度`),onInput:c[5]||=e=>j(ot)(Number(e.target.value))},null,40,Zi),x(`small`,null,K(j(P)(`越透明,心情的颜色越清楚。`)),1)])):b(``,!0)]),x(`input`,{ref_key:`heroInput`,ref:r,"data-wallpaper":`hero`,type:`file`,accept:`image/*`,hidden:``,onChange:c[6]||=e=>o(`hero`,e)},null,544),x(`input`,{ref_key:`skyInput`,ref:i,"data-wallpaper":`sky`,type:`file`,accept:`image/*`,hidden:``,onChange:c[7]||=e=>o(`sky`,e)},null,544)],8,Vi)):b(``,!0)}}),[[`__scopeId`,`data-v-01d9dcb6`]]),$i=`luckytri-home-wallpaper-position-v3`;function ea(e,t){try{let n=JSON.parse(localStorage.getItem(e)||`null`);return!n||!Number.isFinite(n.x)||!Number.isFinite(n.y)?null:{x:Math.min(t.x[1],Math.max(t.x[0],n.x)),y:Math.min(t.y[1],Math.max(t.y[0],n.y))}}catch{return null}}function ta(e,t,n){try{return localStorage.setItem(e,JSON.stringify(t)),!0}catch{return U(n,!0),!1}}function na(){let e=L(!1),t=L(null),r=L(null),i=L(ea($i,{x:[0,100],y:[0,100]})||{x:50,y:50}),a=n(()=>({objectPosition:`${i.value.x}% ${i.value.y}%`})),o=L(null);function s(e){let t=e.currentTarget,n=r.value;if(!n?.naturalWidth||!n.naturalHeight)return;let a=t.getBoundingClientRect(),s=Math.max(a.width/n.naturalWidth,a.height/n.naturalHeight);o.value={pointerId:e.pointerId,startX:e.clientX,startY:e.clientY,startPositionX:i.value.x,startPositionY:i.value.y,overflowX:Math.max(0,n.naturalWidth*s-a.width),overflowY:Math.max(0,n.naturalHeight*s-a.height)},t.setPointerCapture(e.pointerId)}function c(e){let t=o.value;t&&t.pointerId===e.pointerId&&(t.overflowX>0&&(i.value.x=Math.min(100,Math.max(0,t.startPositionX-(e.clientX-t.startX)/t.overflowX*100))),t.overflowY>0&&(i.value.y=Math.min(100,Math.max(0,t.startPositionY-(e.clientY-t.startY)/t.overflowY*100))))}function l(e){o.value?.pointerId===e.pointerId&&(o.value=null)}function u(){i.value={x:50,y:50}}function d(){ta($i,i.value,P(`浏览器没有保存这次构图`))&&(e.value=!1,o.value=null,U(P(`首页壁纸构图已记住`)))}return{adjusting:e,heroRef:t,imageRef:r,pictureStyle:a,beginPictureDrag:s,movePicture:c,endPictureDrag:l,resetPicture:u,finishPicture:d}}var ra={class:`page now`},ia={class:`now-presentation`},aa={class:`wallpaper-layer`,"aria-hidden":`true`},oa=[`src`],sa=[`aria-label`],ca={class:`wallpaper-tip`},la={class:`wallpaper-controls`},ua={class:`wallpaper-tip-inline`},da={class:`notes`},fa={class:`note words`},pa={class:`eyebrow`},ma={key:0,class:`recent-list`},ha={class:`quote`},ga={key:1,class:`muted`},_a={class:`note thought`},va={class:`eyebrow`},ya={key:1,class:`muted`},ba={key:2,class:`will-line`},xa={key:3},Sa={key:4,class:`muted`},Ca={key:5},wa={class:`note ahead`},Ta={class:`eyebrow`},Ea={key:0,class:`list`},Da={key:1,class:`muted`},Oa={class:`now-grid`},ka={class:`today-scroll scroll-pane`},Aa={class:`entry-head`},ja={key:0},Ma={key:1},Na={key:2},Pa={key:3},Fa={key:4},Ia={key:5,class:`chip`,"data-tone":`quiet`},La={key:6,class:`chip`,"data-tone":`quiet`},Ra={key:0},za={key:0},Ba={key:1,class:`muted`},Va={key:2},Ha={key:3,class:`muted`},Ua={key:4},Wa={key:0},Ga={class:`stack side`},Ka={class:`stack tight`},qa={class:`faint ledger-note`},Ja={key:0,class:`list`},Ya={class:`grow`},Xa=[`data-tone`],Za={key:1,class:`muted small-text`},Qa={class:`counts`},$a=R(C({__name:`NowPage`,setup(e){let t=se(te(`/mind`)||null),r=se(te(`/mind/today`)||null),a=L(`all`),o=L(!1),{adjusting:s,heroRef:u,imageRef:p,pictureStyle:m,beginPictureDrag:h,movePicture:g,endPictureDrag:_,resetPicture:v,finishPicture:y}=na(),ee=i([{id:`conversation`,label:G(`对话`)},{id:`inner`,label:G(`独处与日记`)},{id:`upkeep`,label:G(`整理记忆`)}]),C=n(()=>Q.data),w=n(()=>{let e=C.value?.recentWords?.filter(e=>e.text?.trim())||[];return e.length?e.slice(0,3):C.value?.lastWords?[C.value.lastWords]:[]}),ne=n(()=>C.value?.clock?.timeZone||t.value?.clock?.timeZone||`Asia/Shanghai`),E=n(()=>{let e=r.value?.items||[],t=[];for(let[n,r]of e.entries()){let e=r.type===`choice`||r.type===`glance`?`talk`:r.type===`feeling`?`feel`:`inner`;if(a.value!==`all`&&a.value!==e)continue;let i=t[t.length-1];if(r.type===`glance`&&i?.type===`glance`){i.count+=1;let e=Bn({name:r.sessionName,id:r.session});i.places.includes(e)||i.places.push(e);continue}t.push({...r,id:`${r.type}-${r.time}-${n}`,tone:r.type===`glance`||r.type===`choice`&&r.choice===`silent`?`quiet`:r.type===`feeling`?r.valence>=0?`warm`:`night`:r.type===`run`?`night`:`glow`,count:1,places:r.type===`glance`?[Bn({name:r.sessionName,id:r.session})]:[]})}return t}),D=n(()=>{let e=r.value?.items||[];return{all:e.length,talk:e.filter(e=>e.type===`choice`||e.type===`glance`).length,feel:e.filter(e=>e.type===`feeling`).length,inner:e.filter(e=>e.type===`run`||e.type===`ahead`).length}}),O=n(()=>t.value?.budget?.usage||{}),k=n(()=>t.value?.budget?.limits||{}),re=n(()=>(C.value?.expecting||[]).filter(e=>e.content?.trim()).slice(0,5));function ie(e){let t=k.value[e];return t?(O.value[e]||0)/t:O.value.total?(O.value[e]||0)/O.value.total:0}let ae=0;async function oe(){let e=++ae,[n,i]=await Promise.all([gn.overview(),gn.today()]);e===ae&&(t.value=n,r.value=i)}return bi(`now`,oe),(e,n)=>(V(),S(`div`,ra,[x(`div`,ia,[x(`section`,{ref_key:`heroRef`,ref:u,class:T([`now-hero`,{"wallpaper-adjusting":j(s)}])},[x(`div`,aa,[x(`img`,{ref_key:`imageRef`,ref:p,src:j($).hero,style:W(j(m)),alt:``,draggable:`false`},null,12,oa)]),j(s)?(V(),S(`div`,{key:0,class:`wallpaper-drag-layer`,role:`application`,"aria-label":j(P)(`拖动调整首页壁纸构图`),onPointerdown:n[0]||=l((...e)=>j(h)&&j(h)(...e),[`prevent`]),onPointermove:n[1]||=l((...e)=>j(g)&&j(g)(...e),[`prevent`]),onPointerup:n[2]||=(...e)=>j(_)&&j(_)(...e),onPointercancel:n[3]||=(...e)=>j(_)&&j(_)(...e),onLostpointercapture:n[4]||=(...e)=>j(_)&&j(_)(...e)},[x(`span`,ca,K(j(P)(`按住并拖动图片,调整人物位置`)),1)],40,sa)):b(``,!0),x(`div`,la,[j(s)?(V(),S(f,{key:0},[x(`span`,ua,K(j(P)(`拖动背景调整构图`)),1),x(`button`,{type:`button`,onClick:n[5]||=(...e)=>j(v)&&j(v)(...e)},K(j(P)(`恢复默认`)),1),x(`button`,{type:`button`,class:`primary`,onClick:n[6]||=(...e)=>j(y)&&j(y)(...e)},K(j(P)(`完成`)),1)],64)):(V(),S(`button`,{key:1,type:`button`,onClick:n[7]||=e=>s.value=!0},K(j(P)(`调整构图`)),1)),j(s)?b(``,!0):(V(),S(`button`,{key:2,type:`button`,onClick:n[8]||=e=>o.value=!o.value},K(j(P)(`换壁纸`)),1))]),z(Qi,{open:o.value&&!j(s),onClose:n[9]||=e=>o.value=!1},null,8,[`open`])],2)]),x(`section`,da,[x(`article`,fa,[x(`span`,pa,K(j(P)(`TA 最近说`)),1),w.value.length?(V(),S(`ul`,ma,[(V(!0),S(f,null,N(w.value,(e,t)=>(V(),S(`li`,{key:`${e.time}-${t}`},[x(`p`,ha,`“`+K(e.text)+`”`,1),x(`small`,null,K(j(Bn)({name:e.sessionName,id:e.session}))+` · `+K(j(In)(e.time,C.value?.now)),1)]))),128))])):(V(),S(`p`,ga,K(j(P)(`TA 还没在哪里开过口。`)),1))]),x(`article`,_a,[x(`span`,va,K(j(P)(`放在心上`)),1),C.value?.thought?(V(),S(f,{key:0},[x(`p`,null,K(C.value.thought.content),1),x(`small`,null,K(C.value.thought.when),1)],64)):(V(),S(`p`,ya,K(j(P)(`心里暂时没有挂着的事。`)),1)),C.value?.will?(V(),S(`p`,ba,K(j(P)(`正在为自己而活:{content}`,{content:C.value.will.content})),1)):b(``,!0),C.value?.will?.touched?(V(),S(`small`,xa,K(j(P)(`被别人的话碰到过 {touched} 次,上次{v}`,{touched:C.value.will.touched,v:C.value.will.lastSpoke?j(P)(`出了声`):j(P)(`没出声`)})),1)):b(``,!0),C.value?.meaning?(V(),S(`p`,Sa,[d(K(j(P)(`上次相遇:{text}`,{text:C.value.meaning.text})),1),C.value.meaning.spoke?b(``,!0):(V(),S(f,{key:0},[d(K(j(P)(`(没出声)`)),1)],64))])):b(``,!0),C.value?.meaning?.when&&!C.value.meaning.recent?(V(),S(`small`,Ca,K(C.value.meaning.when),1)):b(``,!0),x(`button`,{class:`text-button`,onClick:n[10]||=e=>j(M)(`heart`,`notes`)},K(j(P)(`看看 TA 的便签`)),1)]),x(`article`,wa,[x(`span`,Ta,K(j(P)(`在等的事`)),1),re.value.length?(V(),S(`ul`,Ea,[(V(!0),S(f,null,N(re.value,e=>(V(),S(`li`,{key:e.id},[x(`b`,null,K(e.when),1),x(`span`,null,K(e.name?`${e.name}:`:``)+K(e.content),1),x(`small`,null,K(j(_n)[e.kind]||e.kind),1)]))),128))])):(V(),S(`p`,Da,K(j(P)(`这几天没有 TA 特别在等的事。`)),1)),x(`button`,{class:`text-button`,onClick:n[11]||=e=>j(M)(`life`,`ahead`)},K(j(P)(`约定与期待`)),1)])]),x(`section`,Oa,[z(Di,{class:`today`,title:j(P)(`今天的 TA`),sub:r.value?j(P)(`{v},按时间排在一起`,{v:j(Pn)(r.value.day)}):``},{actions:A(()=>[z(Ii,{modelValue:a.value,"onUpdate:modelValue":n[12]||=e=>a.value=e,label:j(P)(`筛选今天的事`),items:[{key:`all`,label:j(P)(`全部`),count:D.value.all},{key:`talk`,label:j(P)(`开口与沉默`),count:D.value.talk},{key:`feel`,label:j(P)(`心情`),count:D.value.feel},{key:`inner`,label:j(P)(`独处与日记`),count:D.value.inner}]},null,8,[`modelValue`,`label`,`items`])]),default:A(()=>[x(`div`,ka,[E.value.length?(V(),c(Bi,{key:0,items:E.value,label:j(P)(`今天的 TA`)},{default:A(({item:e})=>[x(`div`,Aa,[x(`time`,null,K(j(Nn)(e.time,ne.value)),1),e.type===`choice`?(V(),S(`b`,ja,K(j(An)[e.choice]||e.choice),1)):e.type===`glance`?(V(),S(`b`,Ma,K(e.count>1?j(P)(`扫了 {count} 眼`,{count:e.count}):j(P)(`扫了一眼`)),1)):e.type===`feeling`?(V(),S(`b`,Na,K(j(P)(`心情 · {feeling}`,{feeling:e.feeling})),1)):e.type===`run`?(V(),S(`b`,Pa,K(j(bn)[e.kind]||e.kind)+` · `+K(j(xn)[e.status]||e.status),1)):(V(),S(`b`,Fa,K(j(P)(`约定 · {v}`,{v:j(vn)[e.status]||e.status})),1)),e.type===`choice`?(V(),S(`span`,Ia,K(j(Bn)({name:e.sessionName})),1)):e.type===`glance`?(V(),S(`span`,La,K(e.places.join(`、`)),1)):b(``,!0)]),e.type===`choice`?(V(),S(`p`,Ra,[d(K(e.reason),1),e.appraisal?(V(),S(`small`,za,` · `+K(e.appraisal),1)):b(``,!0)])):e.type===`glance`?(V(),S(`p`,Ba,K(e.reason||j(P)(`没什么需要 TA 细看的`)),1)):e.type===`feeling`?(V(),S(`p`,Va,[d(K(e.cause||j(P)(`说不清为什么`))+` `,1),x(`small`,null,`· `+K(j(yn)[e.origin]||e.origin),1)])):e.type===`run`?(V(),S(`p`,Ha,K(e.reason),1)):(V(),S(`p`,Ua,[d(K(e.content),1),e.note?(V(),S(`small`,Wa,` · `+K(e.note),1)):b(``,!0)]))]),_:1},8,[`items`,`label`])):(V(),c(me,{key:1,title:j(P)(`今天还很安静`),text:j(P)(`TA 扫一眼、开口、没出声、心情变化、独处、写日记,都会按时间排在这里。`)},null,8,[`title`,`text`]))])]),_:1},8,[`title`,`sub`]),x(`div`,Ga,[z(Di,{title:j(P)(`今天的注意力`),eyebrow:j(P)(`这一天`)},{default:A(()=>[x(`div`,Ka,[(V(!0),S(f,null,N(j(ee),e=>(V(),c(Mi,{key:e.id,label:e.label,value:ie(e.id),warn:!!k.value[e.id]&&ie(e.id)>=.8,text:j(Ln)(O.value[e.id])},null,8,[`label`,`value`,`warn`,`text`]))),128))]),x(`p`,qa,K(j(P)(`共 {v} 次调用、{v2} Token,缓存命中 {v3}。 {v4}`,{v:j(Ln)(O.value.calls),v2:j(Ln)(O.value.total),v3:j(Ln)(O.value.cached),v4:k.value.total?j(P)(`每日上限 {v}。`,{v:j(Ln)(k.value.total)}):j(P)(`没有设置每日上限。`)})),1)]),_:1},8,[`title`,`eyebrow`]),z(Di,{title:j(P)(`还没细看的消息`),eyebrow:j(P)(`留意`)},{default:A(()=>[t.value?.attention?.length?(V(),S(`ul`,Ja,[(V(!0),S(f,null,N(t.value.attention,e=>(V(),S(`li`,{key:e.session,class:`list-row`},[x(`span`,Ya,K(e.name),1),x(`span`,{class:`chip`,"data-tone":e.unread?void 0:`quiet`},K(j(P)(`{unread} 条未读`,{unread:e.unread})),9,Xa)]))),128))])):(V(),S(`p`,Za,K(j(P)(`被叫到、聊到 TA 在意的事、熟人说话或攒了不少消息时,TA 才会细看。`)),1))]),_:1},8,[`title`,`eyebrow`]),z(Di,{title:j(P)(`TA 的这一生`),eyebrow:j(P)(`到现在`)},{default:A(()=>[x(`div`,Qa,[x(`button`,{onClick:n[13]||=e=>j(M)(`heart`)},[x(`b`,null,K(t.value?.counts?.self??0),1),x(`span`,null,K(j(P)(`自我线索`)),1)]),x(`button`,{onClick:n[14]||=e=>j(M)(`people`)},[x(`b`,null,K(t.value?.counts?.people??0),1),x(`span`,null,K(j(P)(`认识的人`)),1)]),x(`button`,{onClick:n[15]||=e=>j(M)(`life`)},[x(`b`,null,K(t.value?.counts?.diaries??0),1),x(`span`,null,K(j(P)(`天日记`)),1)]),x(`button`,{onClick:n[16]||=e=>j(M)(`life`,`ahead`)},[x(`b`,null,K(t.value?.counts?.anticipations??0),1),x(`span`,null,K(j(P)(`件在等的事`)),1)])])]),_:1},8,[`title`,`eyebrow`])])])]))}}),[[`__scopeId`,`data-v-663ff302`]]),eo=`modulepreload`,to=function(e){return`/app/`+e},no={},ro=function(e,t,n){let r=Promise.resolve();if(t&&t.length>0){let e=document.getElementsByTagName(`link`),i=document.querySelector(`meta[property=csp-nonce]`),a=i?.nonce||i?.getAttribute(`nonce`);function o(e){return Promise.all(e.map(e=>Promise.resolve(e).then(e=>({status:`fulfilled`,value:e}),e=>({status:`rejected`,reason:e}))))}function s(e){return import.meta.resolve?import.meta.resolve(e):new URL(e,import.meta.url).href}r=o(t.map(t=>{if(t=to(t,n),t=s(t),t in no)return;no[t]=!0;let r=t.endsWith(`.css`);for(let n=e.length-1;n>=0;n--){let i=e[n];if(i.href===t&&(!r||i.rel===`stylesheet`))return}let i=document.createElement(`link`);if(i.rel=r?`stylesheet`:eo,r||(i.as=`script`),i.crossOrigin=``,i.href=t,a&&i.setAttribute(`nonce`,a),document.head.appendChild(i),r)return new Promise((e,n)=>{i.addEventListener(`load`,e),i.addEventListener(`error`,()=>n(Error(`Unable to preload CSS for ${t}`)))})}).filter(e=>e!==void 0))}function i(e){let t=new Event(`vite:preloadError`,{cancelable:!0});if(t.payload=e,window.dispatchEvent(t),!t.defaultPrevented)throw e}return r.then(t=>{for(let e of t||[])e.status===`rejected`&&i(e.reason);return e().catch(i)})},io={chats:()=>ro(()=>import(`./ChatsPage-C-FcRapR.js`),__vite__mapDeps([0,1,2,3,4,5,6])),heart:()=>ro(()=>import(`./HeartPage-CPy_thQd.js`),__vite__mapDeps([7,1,2,4,8])),people:()=>ro(()=>import(`./PeoplePage-Cqefm9-q.js`),__vite__mapDeps([9,1,2,10,11])),life:()=>ro(()=>import(`./LifePage-CxWvwmSf.js`),__vite__mapDeps([12,1,2,13])),time:()=>ro(()=>import(`./TimePage-Cw44inM4.js`),__vite__mapDeps([14,1,2,3,15])),memory:()=>ro(()=>import(`./MemoryPage-DC4rhQ68.js`),__vite__mapDeps([16,1,2,10,17])),nature:()=>ro(()=>import(`./NaturePage-IvYw04Zq.js`),__vite__mapDeps([18,1,2,19])),system:()=>ro(()=>import(`./SystemPage-CJmtJkrK.js`),__vite__mapDeps([20,1,2,21])),plugins:()=>ro(()=>import(`./PluginsPage-DKSaKvXb.js`),__vite__mapDeps([22,1,2,5,23]))},ao=new Map;function oo(e){let t=io[e];return t?(ao.has(e)||ao.set(e,t().catch(t=>{throw ao.delete(e),t})),ao.get(e)):Promise.resolve()}var so=Object.fromEntries([[`now`,$a],...Object.keys(io).map(e=>[e,u(()=>oo(e))])]);function co(){navigator.connection?.saveData||document.hidden||Promise.all(Object.keys(io).map(e=>oo(e).catch(()=>{})))}var lo={key:0,class:`startup`},uo={class:`eyebrow`},fo=[`aria-label`],po=[`aria-current`,`aria-label`],mo={class:`dock-ta-text rail-label`},ho={class:`dock-groups`},go={class:`rail-label`},_o=[`data-page`,`aria-current`,`title`,`onClick`,`onPointerenter`,`onFocus`],vo={class:`rail-label`},yo={class:`dock-foot`},bo=[`aria-pressed`,`title`],xo={class:`rail-label`},So=[`href`,`title`],Co={class:`rail-label`},wo={class:`workspace`},To={id:`main`,tabindex:`-1`},Eo={class:`topbar`},Do={class:`topbar-title`},Oo={key:0,class:`eyebrow`},ko={class:`topbar-actions`},Ao=[`title`],jo=[`aria-label`,`title`,`disabled`],Mo={key:0,class:`draft-banner`,role:`status`},No=[`aria-label`],Po=[`data-page`,`aria-current`,`onClick`],Fo=[`aria-expanded`],Io={class:`more-grid`},Lo=[`data-page`,`onClick`],Ro={class:`more-title`},zo={class:`row more-tools`},Bo=[`aria-pressed`],Vo=[`href`],Ho={key:2,class:`startup`,role:`status`},Uo=ce(R(C({__name:`App`,setup(e){Fe();let t=n(()=>D[H.page]),r=n(()=>!!H.health?.connection?.online),i=n(()=>Q.data?.name||H.core?.nature?.name||`TA`),o=n(()=>Q.data?.activity?.kind||`idle`),s=n(()=>le.includes(H.page)),u=n(()=>a.value===`en`?`/guide.en.html`:`/guide.html`),p=0,m=!1,h=new AbortController,g=()=>{},v=L(!1);function y(e){!m&&(m=!0,e?.revision===H.core?.revision)||(p||=(ae(),window.setTimeout(()=>{p=0,!document.hidden&&(ae(),Re(),!H.dirty&&H.page!==`chats`&&ne().catch(()=>{}),H.pulse+=1)},2e3)))}async function ee(){if(!v.value){if(H.dirty){U(P(`请先保存草稿`));return}v.value=!0;try{oe(),await Promise.all([ne(),Re()]),H.tick+=1}finally{v.value=!1}}}F(a,async()=>{if(oe(),H.core&&!H.dirty)try{await Promise.all([ne(),Re()]),H.tick+=1}catch{}});function C(){document.getElementById(`main`)?.focus()}function w(){window.location.reload()}function te(){document.documentElement.dataset.visibility=document.hidden?`hidden`:`visible`,document.hidden||(ae(),!H.dirty&&H.page!==`chats`&&ne().catch(()=>{}),H.pulse++)}return he(async()=>{tt(),B(),window.addEventListener(`hashchange`,B),window.addEventListener(`popstate`,B),oo(H.page).catch(()=>{}),co();try{await ne()}catch(e){H.error=e.message;return}g=ze(),document.addEventListener(`visibilitychange`,te),Be(y,{signal:h.signal})}),ue(()=>{window.removeEventListener(`hashchange`,B),window.removeEventListener(`popstate`,B),h.abort(),clearTimeout(p),g(),document.removeEventListener(`visibilitychange`,te)}),(e,n)=>(V(),S(f,null,[z(gt),j(H).error?(V(),S(`div`,lo,[z(hn,{mood:`blue`,size:128}),x(`span`,uo,K(j(P)(`暂未连接`)),1),x(`h1`,null,K(j(P)(`TA 在等你回来`)),1),x(`p`,null,K(j(H).error),1),x(`button`,{class:`primary`,onClick:w},K(j(P)(`重新连接`)),1)])):j(H).core&&j(H).health?(V(),S(`div`,{key:1,class:T([`shell`,`at-`+j(H).page])},[x(`a`,{class:`skip-link`,href:`#main`,onClick:l(C,[`prevent`])},K(j(P)(`跳到主要内容`)),1),x(`nav`,{class:`dock primary-nav`,"aria-label":j(P)(`主要功能`)},[x(`button`,{class:T([`dock-ta`,{active:j(H).page===`now`}]),"data-page":`now`,"aria-current":j(H).page===`now`?`page`:void 0,"aria-label":j(P)(`{name}:回到此刻`,{name:i.value}),onClick:n[0]||=e=>j(M)(`now`)},[z(hn,{mood:j(X),activity:o.value,size:50},null,8,[`mood`,`activity`]),x(`span`,mo,[n[6]||=x(`b`,null,`LuckyTri`,-1),x(`small`,null,K(i.value===`LuckyTri`?``:i.value+` · `)+K(j(q)[j(X)].label)+` · `+K(j(st)[o.value]||j(P)(`闲着`)),1)])],10,po),x(`div`,ho,[(V(!0),S(f,null,N(j(k),e=>(V(),S(`section`,{key:e.label,class:`dock-group`},[x(`h2`,go,K(e.label),1),(V(!0),S(f,null,N(e.pages,e=>(V(),S(`button`,{key:e,class:T([`dock-link`,{active:j(H).page===e}]),"data-page":e,"aria-current":j(H).page===e?`page`:void 0,title:j(D)[e].label,onClick:t=>j(M)(e),onPointerenter:t=>j(oo)(e).catch(()=>{}),onFocus:t=>j(oo)(e).catch(()=>{})},[z(pi,{name:e},null,8,[`name`]),x(`span`,vo,K(j(D)[e].label),1)],42,_o))),128))]))),128))]),x(`div`,yo,[z(Mr),x(`button`,{class:`dock-tool`,"aria-pressed":j(Y).quiet,title:j(Y).quiet?j(P)(`开启灵动效果`):j(P)(`减少动画`),onClick:n[1]||=e=>j(Pe)(!j(Y).quiet)},[z(pi,{name:`motion`}),x(`span`,xo,K(j(Y).quiet?j(P)(`开启灵动效果`):j(P)(`减少动画`)),1)],8,bo),x(`a`,{class:`dock-tool`,href:u.value,target:`_blank`,rel:`noopener`,title:j(P)(`使用教程`)},[z(pi,{name:`guide`}),x(`span`,Co,K(j(P)(`使用教程 ↗`)),1)],8,So)])],8,fo),x(`div`,wo,[z(ti),x(`main`,To,[x(`header`,Eo,[x(`div`,Do,[j(a)===`zh`?(V(),S(`span`,Oo,K(t.value.en),1)):b(``,!0),x(`h1`,null,K(t.value.label),1),x(`p`,null,K(t.value.tagline),1)]),x(`div`,ko,[z(Cr),x(`button`,{id:`connection`,class:T([`pill`,{offline:!r.value}]),title:r.value?j(P)(`QQ 已连接`):j(P)(`去连接 QQ`),onClick:n[2]||=e=>r.value||j(M)(`system`,`connect`)},[x(`span`,{class:T([`dot`,{off:!r.value}])},null,2),d(K(r.value?j(P)(`QQ 已连接`):j(P)(`QQ 未连接`)),1)],10,Ao),x(`button`,{id:`refresh`,class:T([`icon-button`,{spinning:v.value}]),"aria-label":j(P)(`刷新当前数据`),title:j(P)(`刷新`),disabled:v.value,onClick:ee},[z(pi,{name:`refresh`})],10,jo)])]),j(H).dirty?(V(),S(`div`,Mo,[n[7]||=x(`span`,{class:`dot warn`},null,-1),d(K(j(P)(`草稿还没保存,保存后才会生效`)),1)])):b(``,!0),x(`div`,{class:T([`view`,`page-`+j(H).page])},[(V(),c(_,{max:5,include:[`NowPage`,`HeartPage`,`PeoplePage`,`LifePage`,`TimePage`]},[(V(),c(de(j(so)[j(H).page]),{key:j(H).page,class:`route-page`}))],1024))],2)])]),x(`nav`,{class:`tabbar`,"aria-label":j(P)(`主要功能`)},[(V(!0),S(f,null,N(j(ge),e=>(V(),S(`button`,{key:e,"data-page":e,class:T({active:j(H).page===e}),"aria-current":j(H).page===e?`page`:void 0,onClick:t=>j(M)(e)},[z(pi,{name:e},null,8,[`name`]),x(`span`,null,K(j(D)[e].label),1)],10,Po))),128)),x(`button`,{class:T([`tabbar-more`,{active:s.value}]),"aria-expanded":j(H).moreOpen,onClick:n[3]||=e=>j(H).moreOpen=!j(H).moreOpen},[z(pi,{name:`more`}),x(`span`,null,K(j(P)(`更多`)),1)],10,Fo)],8,No),z(yi,{open:j(H).moreOpen,title:j(P)(`更多`),eyebrow:j(P)(`更多`),width:`420px`,onClose:n[5]||=e=>j(H).moreOpen=!1},{default:A(()=>[x(`div`,Io,[(V(!0),S(f,null,N(j(le),e=>(V(),S(`button`,{key:e,"data-page":e,class:T({active:j(H).page===e}),onClick:t=>j(M)(e)},[z(pi,{name:e},null,8,[`name`]),x(`b`,null,K(j(D)[e].label),1),x(`small`,null,K(j(D)[e].tagline),1)],10,Lo))),128))]),x(`h3`,Ro,K(j(P)(`界面主题`)),1),z(Mr,{inline:``}),x(`div`,zo,[x(`button`,{"aria-pressed":j(Y).quiet,onClick:n[4]||=e=>j(Pe)(!j(Y).quiet)},K(j(Y).quiet?j(P)(`开启灵动效果`):j(P)(`减少动画`)),9,Bo),x(`a`,{href:u.value,target:`_blank`,rel:`noopener`},K(j(P)(`使用教程 ↗`)),9,Vo)])]),_:1},8,[`open`,`title`,`eyebrow`]),z(br,{"hide-orb":j(H).page===`now`},null,8,[`hide-orb`])],2)):(V(),S(`div`,Ho,[z(hn,{mood:j(X),activity:`idle`,size:128},null,8,[`mood`]),x(`h1`,null,K(j(P)(`正在进入 TA 的小世界`)),1),x(`p`,null,K(j(P)(`连接会话与记忆…`)),1)])),z(si)],64))}}),[[`__scopeId`,`data-v-2ec860f0`]]));Uo.config.errorHandler=e=>{U(e instanceof Error?e.message:P(`操作失败,请重试`),!0)},Uo.mount(`#app`);export{Sn as A,Dn as C,kn as D,yn as E,Be as F,Q as I,X as L,Mn as M,jn as N,bn as O,hn as P,En as S,On as T,Fn as _,bi as a,wn as b,Xn as c,Pn as d,Un as f,Vn as g,Bn as h,Di as i,gn as j,xn as k,In as l,Ln as m,Ii as n,yi as o,Hn as p,Mi as r,ur as s,Bi as t,Nn as u,_n as v,Cn as w,Tn as x,vn as y};