luckytri 1.0.0 → 1.0.2

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 (139) hide show
  1. package/.github/SECURITY.md +4 -4
  2. package/README.en.md +252 -250
  3. package/README.md +252 -250
  4. package/bin/luckytri.js +5 -1
  5. package/docs/en/CHANGELOG.md +8 -0
  6. package/docs/en/connect.md +18 -18
  7. package/docs/en/guide.md +202 -216
  8. package/docs/en/npm-release.md +25 -25
  9. package/docs/zh/CHANGELOG.md +8 -0
  10. package/docs/zh/connect.md +17 -17
  11. package/docs/zh/guide.md +202 -216
  12. package/docs/zh/npm-release.md +33 -33
  13. package/package.json +110 -108
  14. package/plugins/sdk/index.d.ts +155 -155
  15. package/plugins/sdk/testing.js +58 -58
  16. package/plugins/weather/index.js +82 -82
  17. package/plugins/weather/luckytri-plugin.json +29 -29
  18. package/public/app/assets/ChatsPage-BhlJHseG.js +3 -0
  19. package/public/app/assets/Empty-DP6WMGHi.js +2 -0
  20. package/public/app/assets/Field-CtbdqaiB.js +1 -0
  21. package/public/app/assets/HeartPage-32BeTPn2.js +1 -0
  22. package/public/app/assets/LifePage-CxSm0XKI.js +1 -0
  23. package/public/app/assets/MemoryPage-BeKBcPCY.js +1 -0
  24. package/public/app/assets/NaturePage-NEPYl2HS.js +3 -0
  25. package/public/app/assets/PeoplePage-DxtpekwM.js +1 -0
  26. package/public/app/assets/PluginsPage-CVVQwEBI.css +1 -0
  27. package/public/app/assets/PluginsPage-DksEZbUU.js +2 -0
  28. package/public/app/assets/{SystemPage-CAMPoYqM.css → SystemPage-BkRu0Rvx.css} +1 -1
  29. package/public/app/assets/SystemPage-BvzJlHuY.js +1 -0
  30. package/public/app/assets/TimePage-7-awH5XL.js +3 -0
  31. package/public/app/assets/index-4rItIkD-.js +4 -0
  32. package/public/app/assets/{index-YDz1ree1.css → index-DY4e15Kh.css} +1 -1
  33. package/public/app/assets/{knowledge-DG0e0uKw.js → knowledge-C6_HvoyB.js} +1 -1
  34. package/public/app/assets/media-SMfTT-yc.js +1 -0
  35. package/public/app/index.html +3 -3
  36. package/public/guide.en.html +72 -99
  37. package/public/guide.html +44 -86
  38. package/public/tutorial.en.md +25 -39
  39. package/public/tutorial.md +25 -39
  40. package/scripts/backup.js +311 -311
  41. package/scripts/browser.js +41 -41
  42. package/scripts/import-data.js +128 -0
  43. package/scripts/launch.js +101 -94
  44. package/scripts/plugin.js +150 -150
  45. package/scripts/reset-password.js +22 -0
  46. package/scripts/runtime.js +25 -25
  47. package/scripts/service.js +56 -47
  48. package/scripts/setup.js +50 -50
  49. package/scripts/start-server.js +41 -41
  50. package/scripts/stop.js +36 -36
  51. package/server/app.js +112 -96
  52. package/server/auth.js +217 -0
  53. package/server/channels/contract.js +57 -57
  54. package/server/channels/hub.js +165 -165
  55. package/server/channels/index.js +28 -25
  56. package/server/channels/onebot/index.js +335 -336
  57. package/server/channels/onebot/token.js +22 -3
  58. package/server/core/capabilities.js +208 -208
  59. package/server/core/events.js +64 -60
  60. package/server/core/image-preprocessor.js +208 -208
  61. package/server/core/model-manager.js +1213 -1213
  62. package/server/core/net-guard.js +49 -49
  63. package/server/core/orchestrator.js +569 -569
  64. package/server/core/perceivers.js +91 -91
  65. package/server/core/persona-manager.js +243 -243
  66. package/server/core/repository.js +293 -293
  67. package/server/core/response-validator.js +508 -508
  68. package/server/core/turn-processor.js +630 -630
  69. package/server/core/turn.js +236 -236
  70. package/server/core/vision-manager.js +633 -633
  71. package/server/i18n/errors.js +548 -497
  72. package/server/i18n/labels.js +649 -653
  73. package/server/index.js +151 -102
  74. package/server/knowledge/manager.js +386 -386
  75. package/server/knowledge/schema.js +12 -8
  76. package/server/local-access.js +32 -0
  77. package/server/mind/anticipations.js +507 -507
  78. package/server/mind/api.js +703 -703
  79. package/server/mind/budget.js +152 -152
  80. package/server/mind/context-selection.js +61 -61
  81. package/server/mind/day-planner.js +324 -324
  82. package/server/mind/evidence.js +148 -148
  83. package/server/mind/index.js +445 -445
  84. package/server/mind/life/diary.js +786 -786
  85. package/server/mind/life/index.js +1049 -1049
  86. package/server/mind/observations.js +84 -84
  87. package/server/mind/own-day.js +324 -324
  88. package/server/mind/own-voice.js +318 -318
  89. package/server/mind/senses.js +53 -53
  90. package/server/mind/time/activity-clock.js +196 -196
  91. package/server/mind/time/availability.js +69 -69
  92. package/server/mind/time/commitment-review.js +198 -198
  93. package/server/mind/time/executor.js +512 -512
  94. package/server/mind/time/experiences.js +128 -128
  95. package/server/mind/time/games.js +562 -562
  96. package/server/mind/time/index.js +739 -739
  97. package/server/mind/time/intent.js +166 -166
  98. package/server/mind/time/kinds.js +171 -171
  99. package/server/mind/time/plugin-activity.js +207 -207
  100. package/server/mind/time/tasks.js +587 -587
  101. package/server/mind/util.js +110 -110
  102. package/server/mind/view.js +273 -273
  103. package/server/paths.js +102 -102
  104. package/server/plugins/api.js +204 -204
  105. package/server/plugins/host.js +967 -967
  106. package/server/plugins/install.js +295 -295
  107. package/server/plugins/manifest.js +201 -201
  108. package/server/plugins/permissions.js +42 -42
  109. package/server/plugins/runner/guard.mjs +36 -36
  110. package/server/plugins/runner/worker.mjs +250 -250
  111. package/server/plugins/schema.js +91 -91
  112. package/server/plugins/zip.js +112 -112
  113. package/server/startup-lock.js +118 -118
  114. package/server/storage/archive.js +242 -241
  115. package/server/storage/backup-cleanup-worker.js +8 -8
  116. package/server/storage/backup-cleanup.js +415 -414
  117. package/server/storage/backup-lock.js +76 -76
  118. package/server/storage/backup-scheduler.js +131 -131
  119. package/server/storage/data-package.js +298 -0
  120. package/server/storage/data-transfer-api.js +50 -0
  121. package/server/storage/data-transfer-worker.js +18 -0
  122. package/server/storage/data-transfer.js +415 -0
  123. package/server/storage/store.js +202 -199
  124. package/server/studio/readiness.js +181 -190
  125. package/server/studio/settings.js +236 -236
  126. package/public/app/assets/ChatsPage-C-FcRapR.js +0 -3
  127. package/public/app/assets/Empty-CpP5kQHH.js +0 -2
  128. package/public/app/assets/Field-D4gY-INU.js +0 -1
  129. package/public/app/assets/HeartPage-CPy_thQd.js +0 -1
  130. package/public/app/assets/LifePage-CxWvwmSf.js +0 -1
  131. package/public/app/assets/MemoryPage-DC4rhQ68.js +0 -1
  132. package/public/app/assets/NaturePage-IvYw04Zq.js +0 -3
  133. package/public/app/assets/PeoplePage-Cqefm9-q.js +0 -1
  134. package/public/app/assets/PluginsPage-DKSaKvXb.js +0 -2
  135. package/public/app/assets/PluginsPage-HyBe5D8w.css +0 -1
  136. package/public/app/assets/SystemPage-CJmtJkrK.js +0 -1
  137. package/public/app/assets/TimePage-Cw44inM4.js +0 -3
  138. package/public/app/assets/index-BheRW-1t.js +0 -4
  139. package/public/app/assets/media-BzPDBm7e.js +0 -1
@@ -1,3 +0,0 @@
1
- import{B as e,D as t,G as n,I as r,K as i,L as a,M as o,P as s,U as c,V as l,W as u,X as d,Y as f,_t as p,a as m,ct as h,dt as g,ft as _,gt as v,it as y,k as b,mt as x,n as S,nt as C,p as w,pt as T,q as E,rt as D,s as O,tt as k,v as A,vt as ee,w as j,yt as M}from"./Empty-CpP5kQHH.js";import{L as te,N,P as ne,c as P,i as re,j as F,s as ie}from"./index-BheRW-1t.js";var I=[`d`],L=[`d`],R={class:`ticks`},z=[`x`,`y`],B=[`y`],V=[`y`],H=[`aria-label`,`aria-valuetext`],U=[`cx`,`cy`],W=[`x`,`y`],G=[`aria-label`,`aria-valuetext`],K=[`cx`,`cy`],q=[`x`,`y`],J=110,Y=84,ae=S(f({__name:`RhythmClock`,props:d({disabled:{type:Boolean}},{sleep:{required:!0},sleepModifiers:{},wake:{required:!0},wakeModifiers:{}}),emits:[`update:sleep`,`update:wake`],setup(t){let r=h(t,`sleep`),i=h(t,`wake`),o=x(),s=null,c=e=>{let[t,n]=String(e||`00:00`).split(`:`).map(Number);return(t*60+n)%1440},d=e=>{let t=(Math.round(e/15)*15%1440+1440)%1440;return`${String(Math.floor(t/60)).padStart(2,`0`)}:${String(t%60).padStart(2,`0`)}`},f=e=>e/1440*Math.PI*2-Math.PI/2,m=(e,t=Y)=>({x:J+Math.cos(f(e))*t,y:J+Math.sin(f(e))*t});function g(e,t){let n=(t-e+1440)%1440||1440,r=m(e),i=m(t);return`M${r.x.toFixed(2)},${r.y.toFixed(2)}A${Y},${Y} 0 ${+(n>720)} 1 ${i.x.toFixed(2)},${i.y.toFixed(2)}`}let _=e(()=>c(r.value)),S=e(()=>c(i.value)),C=e(()=>{let e=(S.value-_.value+1440)%1440,t=Math.floor(e/60),n=e%60;return n?b(`{h} 小时 {m} 分`,{h:t,m:n}):b(`{h} 小时`,{h:t})});function w(e){let t=o.value.getBoundingClientRect(),n=(e.clientX-t.left)/t.width*220-J,r=(e.clientY-t.top)/t.height*220-J,i=Math.atan2(r,n)+Math.PI/2;return d((i/(Math.PI*2)*1440%1440+1440)%1440)}function T(e,t){s=e,t.target.setPointerCapture?.(t.pointerId)}function E(e){if(!s)return;let t=w(e);t!==(s===`sleep`?i.value:r.value)&&(s===`sleep`?r.value=t:i.value=t)}function O(){s=null}function k(e,t){let n={ArrowRight:15,ArrowUp:15,ArrowLeft:-15,ArrowDown:-15,PageUp:60,PageDown:-60}[t.key];if(!n)return;t.preventDefault();let a=c(e===`sleep`?r.value:i.value),o=d(a+n);o!==(e===`sleep`?i.value:r.value)&&(e===`sleep`?r.value=o:i.value=o)}return(e,s)=>(D(),u(`div`,{class:p([`rhythm`,{disabled:t.disabled}])},[(D(),u(`svg`,{ref_key:`svg`,ref:o,viewBox:`0 0 220 220`,onPointermove:E,onPointerup:O,onPointercancel:O},[s[4]||=n(`<defs data-v-7b572e49><linearGradient id="clock-awake" x1="0" y1="0" x2="1" y2="1" data-v-7b572e49><stop offset="0" stop-color="#fff1b8" data-v-7b572e49></stop><stop offset=".48" stop-color="#ffd8b8" data-v-7b572e49></stop><stop offset="1" stop-color="#b8e8ff" data-v-7b572e49></stop></linearGradient><linearGradient id="clock-asleep" x1="0" y1="0" x2="1" y2="1" data-v-7b572e49><stop offset="0" stop-color="#a6bfff" data-v-7b572e49></stop><stop offset=".55" stop-color="#b9b5f1" data-v-7b572e49></stop><stop offset="1" stop-color="#d6c5ff" data-v-7b572e49></stop></linearGradient><radialGradient id="clock-center" data-v-7b572e49><stop offset="0" stop-color="white" stop-opacity=".82" data-v-7b572e49></stop><stop offset=".7" stop-color="white" stop-opacity=".35" data-v-7b572e49></stop><stop offset="1" stop-color="white" stop-opacity=".04" data-v-7b572e49></stop></radialGradient></defs>`,1),l(`circle`,{class:`glass-center`,cx:J,cy:J,r:`68`}),l(`circle`,{class:`track`,cx:J,cy:J,r:Y}),l(`path`,{class:`awake`,d:g(S.value,_.value)},null,8,I),l(`path`,{class:`asleep`,d:g(_.value,S.value)},null,8,L),l(`g`,R,[(D(),u(a,null,y([0,6,12,18],e=>l(`text`,{key:e,x:m(e*60,54).x,y:m(e*60,54).y+4,"text-anchor":`middle`},M(e),9,z)),64))]),l(`text`,{class:`center big`,x:J,y:106,"text-anchor":`middle`},M(v(b)(`睡 {hours}`,{hours:C.value})),9,B),l(`text`,{class:`center`,x:J,y:126,"text-anchor":`middle`},M(r.value)+` → `+M(i.value),9,V),l(`g`,{class:`handle moon`,role:`slider`,tabindex:`0`,"aria-label":v(b)(`几点睡`),"aria-valuetext":r.value,onPointerdown:s[0]||=e=>T(`sleep`,e),onKeydown:s[1]||=e=>k(`sleep`,e)},[l(`circle`,{cx:m(_.value).x,cy:m(_.value).y,r:`15`},null,8,U),l(`text`,{x:m(_.value).x,y:m(_.value).y+5,"text-anchor":`middle`},`☾`,8,W)],40,H),l(`g`,{class:`handle sun`,role:`slider`,tabindex:`0`,"aria-label":v(b)(`几点醒`),"aria-valuetext":i.value,onPointerdown:s[2]||=e=>T(`wake`,e),onKeydown:s[3]||=e=>k(`wake`,e)},[l(`circle`,{cx:m(S.value).x,cy:m(S.value).y,r:`15`},null,8,K),l(`text`,{x:m(S.value).x,y:m(S.value).y+5,"text-anchor":`middle`},`☀`,8,q)],40,G)],544))],2))}}),[[`__scopeId`,`data-v-7b572e49`]]),oe={key:0,class:`page nature`},se=[`aria-label`],ce={class:`nature-intro-copy`},le={class:`eyebrow`},ue={class:`nature-preview-note`},de={class:`nature-intro-orb`},fe=[`aria-label`],pe={class:`lived-persona-head`},me={class:`eyebrow`},he={class:`lived-persona-grid`},ge={class:`lived-trait-track`},_e={class:`lived-persona-story`},ve={class:`eyebrow`},ye={key:0},be={key:0,class:`lived-trait-history`},xe={key:1,class:`faint`},Se={class:`greenhouse`},Ce={class:`card editor`},we={class:`faint`,role:`status`},Te={class:`editor-head`},Ee={class:`eyebrow`},De={class:`muted`},Oe=[`disabled`],ke={class:`form-grid`},Ae=[`placeholder`],je={class:`wide`},Me=[`placeholder`],Ne={class:`traits`},Pe={class:`trait-head`},Fe={class:`muted`},Ie=[`onUpdate:modelValue`,`data-trait`,`aria-label`],Le=[`onUpdate:modelValue`,`name`,`aria-label`],Re={class:`rhythm-set`},ze={class:`switch`},Be={class:`rhythm-row`},Ve={class:`stack tight times`},He={class:`faint`},Ue={class:`stack tight`},We=[`placeholder`],Ge={class:`faint`},Ke={class:`versions`},qe={class:`chip`,"data-tone":`quiet`},Je={class:`faint`},Ye={class:`save-bar`},Xe=[`disabled`],Ze={class:`faint`,role:`status`},Qe={class:`side`},$e={class:`card orb-card`},et={class:`eyebrow`},tt={class:`effects`},nt={class:`check`},rt={class:`card`},it={class:`card-head`},at={class:`eyebrow`},ot={class:`toggles`},st={class:`switch`},ct={class:`switch`},lt={class:`switch`},ut={class:`switch`},dt={class:`switch`},ft={class:`form-grid`},pt={class:`faint wide`},mt={class:`faint wide`},ht={class:`card`},gt={class:`card-head`},_t={class:`eyebrow`},vt={class:`form-grid`},yt={class:`wide`},bt={class:`faint budget-note`},xt={class:`save-bar`},St={class:`primary`,type:`submit`},Ct={class:`faint`,role:`status`},wt={class:`card prompts`},Tt={class:`eyebrow`},Et={class:`save-bar`},Dt={class:`primary`},Ot={class:`faint`,role:`status`},X=S(f({__name:`NaturePage`,setup(n){let d=t([{key:`warmth`,label:j(`温柔`),low:j(`颜色偏冷,表情淡淡的`),high:j(`颜色更暖,嘴角上扬`)},{key:`sarcasm`,label:j(`毒舌`),low:j(`不挖苦人`),high:j(`嘴角一歪,会吐槽`)},{key:`humor`,label:j(`幽默`),low:j(`认真`),high:j(`眯眼笑,爱开玩笑`)},{key:`activity`,label:j(`活泼`),low:j(`安安静静`),high:j(`跳得更快`)},{key:`initiative`,label:j(`主动`),low:j(`更喜欢独处`),high:j(`更愿意分享`)}]),f=t({system:j(`系统指令`),turn:j(`看见与开口`),expression:j(`自己的念头`),initiative:j(`分享与发起`),generation:j(`重新措辞`),validation:j(`回复检查`),memory:j(`记忆整理`),vision:j(`图片理解`),summary:j(`上下文压缩`),summaryMerge:j(`摘要合并`),reflection:j(`独处`),daily:j(`日记`)}),p=x(null),h=x(String(O.health.settings.aliases||``)),S=x([]),I=x({}),L=x([]),R=x(``),z=x([]),B=T({life:null,budget:null}),V=T({...O.core.prompts}),H=x(`turn`),U=x(!1),W=T({nature:!1,days:!1,prompts:!1});function G(e){W[e]=!1,O.dirty=Object.values(W).some(Boolean)}let K=x(!0),q=e(()=>{let e=S.value.reduce((e,t)=>Math.max(e,Number(t.version)||0),0),t=e<=1?0:e-1;return{used:t,left:Math.max(0,2-t),locked:t>=2}}),J=e(()=>p.value?Object.fromEntries(d.map(e=>[e.key,Number(p.value[e.key])||0])):null),Y=e=>Array.isArray(e)?e.map(String):String(e||``).split(/[,,\n]/).map(e=>e.trim()).filter(Boolean);function X(){let{version:e,...t}=p.value;return{...t,gender:t.gender||`female`,interests:Y(t.interests),forbidden:Y(t.forbidden),bottomLines:Y(t.bottomLines)}}let kt=e(()=>K.value&&p.value?X():null);function Z(e){return(Number(p.value?.[e.key])||0)>=50?e.high:e.low}async function At(){let[e,t]=await Promise.all([F.nature(),F.overview()]);p.value={...e.nature,gender:e.nature.gender||`female`,interests:e.nature.interests.join(`,`),forbidden:e.nature.forbidden.join(`
2
- `),bottomLines:e.nature.bottomLines.join(`
3
- `)},S.value=e.versions,I.value=e.livedTraits||{},L.value=e.traitHistory||[],R.value=e.livedPersona||``,z.value=e.personaHistory||[],B.life={...t.life},B.budget={...t.budget.settings}}function Q(e=`nature`){W[e]=!0,O.dirty=!0}async function jt(){if(!U.value){U.value=!0;try{await F.saveNature(X()),h.value!==O.health.settings.aliases&&await w({aliases:h.value}),G(`nature`),await m();let e=await F.nature();S.value=e.versions,I.value=e.livedTraits||{},L.value=e.traitHistory||[],R.value=e.livedPersona||``,z.value=e.personaHistory||[],A(b(`天性已保存,下一次开口时生效`))}catch(e){A(e.message,!0)}finally{U.value=!1}}}async function Mt(){try{let e=await F.saveSettings({life:B.life,budget:{dailyTokens:Number(B.budget.dailyTokens)||0,innerShare:Number(B.budget.innerShare),upkeepShare:Number(B.budget.upkeepShare)}});B.life={...e.life},B.budget={...e.budget},G(`days`),A(b(`TA 的日子已按新设置安排`))}catch(e){A(e.message,!0)}}async function Nt(){try{await F.savePrompts({...V}),G(`prompts`),await m(),A(b(`指令已保存,下一轮生效`))}catch(e){A(e.message,!0)}}let $;return k(()=>{At(),$=setInterval(async()=>{if(!document.hidden)try{let e=await F.nature();I.value=e.livedTraits||{},L.value=e.traitHistory||[],R.value=e.livedPersona||``,z.value=e.personaHistory||[]}catch{}},3e4)}),C(()=>{$&&clearInterval($)}),(e,t)=>p.value?(D(),u(`div`,oe,[l(`section`,{class:`nature-intro`,"aria-label":v(b)(`天性预览`)},[l(`div`,ce,[l(`span`,le,M(v(b)(`THE WAY SHE GROWS · 天性`)),1),l(`h1`,null,[i(M(v(b)(`她的底色,`)),1),t[38]||=l(`br`,null,null,-1),l(`em`,null,M(v(b)(`慢慢长成她自己。`)),1)]),l(`p`,null,M(v(b)(`一些与生俱来的倾向,会在每一次相遇里长出新的模样。`)),1),l(`span`,ue,[t[39]||=l(`i`,null,null,-1),i(` `+M(v(b)(`调节刻度,看看此刻的她`)),1)])]),l(`div`,de,[E(ne,{class:`preview-orb`,mood:v(te),traits:J.value,size:170,interactive:``},null,8,[`mood`,`traits`])])],8,se),l(`section`,{class:`lived-persona`,"aria-label":v(b)(`成长中的性格`)},[l(`div`,pe,[l(`span`,me,M(v(b)(`BECOMING · 正在成为`)),1),l(`h2`,null,M(v(b)(`此刻的她`)),1),l(`p`,null,M(v(b)(`天性是起点。下方是她从真实经历里长出的刻度,下一次对话会使用这些值。`)),1)]),l(`div`,he,[(D(!0),u(a,null,y(v(d),e=>(D(),u(`div`,{key:e.key,class:`lived-trait`},[l(`span`,null,M(e.label),1),l(`strong`,null,M(I.value[e.key]??p.value[e.key]),1),l(`small`,null,M(v(b)(`起点 {v}`,{v:p.value[e.key]})),1),l(`div`,ge,[l(`i`,{style:ee({width:`${I.value[e.key]??p.value[e.key]}%`})},null,4)])]))),128))]),l(`div`,_e,[l(`span`,ve,M(v(b)(`INNER VOICE · 自己的样子`)),1),l(`p`,null,M(R.value||v(b)(`她还没有为现在的自己留下一段新的描述。底色和已有的自我线索仍会陪着她。`)),1),z.value.length?(D(),u(`details`,ye,[l(`summary`,null,M(v(b)(`看看她怎么走到这里 · {length} 版`,{length:z.value.length})),1),l(`ol`,null,[(D(!0),u(a,null,y(z.value,e=>(D(),u(`li`,{key:e.id},[l(`span`,null,M(e.content),1),l(`time`,null,M(v(N)(e.created)),1)]))),128))])])):c(``,!0)]),L.value.length?(D(),u(`details`,be,[l(`summary`,null,M(v(b)(`看看她为何改变 · {length} 次`,{length:L.value.length})),1),l(`ol`,null,[(D(!0),u(a,null,y(L.value,e=>(D(),u(`li`,{key:e.id},[l(`b`,null,M(v(d).find(t=>t.key===e.trait)?.label||e.trait)+` `+M(e.delta>0?`+`:``)+M(e.delta),1),l(`span`,null,M(e.reason),1),l(`time`,null,M(v(N)(e.created)),1)]))),128))])])):(D(),u(`p`,xe,M(v(b)(`她还没有从经历里改变这些刻度。独处或日记里形成了有来源的新选择后,会留在这里。`)),1))],8,fe),l(`div`,Se,[l(`section`,Ce,[l(`form`,{id:`natureForm`,onSubmit:r(jt,[`prevent`]),onInput:t[16]||=e=>Q()},[l(`p`,we,M(q.value.locked?v(b)(`两次更改已经用完。之后的性格、兴趣和样子,由 TA 自己从经历里生长。`):v(b)(`天性还可以改 {left} 次,包括性格刻度。用完后由她自己生长。`,{left:q.value.left})),1),l(`header`,Te,[l(`span`,Ee,M(v(b)(`塑造 TA`)),1),l(`h2`,null,M(v(b)(`TA 生来是什么样的?`)),1),l(`p`,De,M(v(b)(`天性是种子:性格、兴趣和底线。TA 的自我、在各群的样子、对每个人的感觉都会从经历里长出来——你能看到、能撤销,但不在这里改写。`)),1)]),l(`fieldset`,{class:`nature-fields`,disabled:q.value.locked},[l(`div`,ke,[l(`label`,null,[i(M(v(b)(`名字`)),1),_(l(`input`,{"onUpdate:modelValue":t[0]||=e=>p.value.name=e,name:`name`,required:``,maxlength:`40`},null,512),[[s,p.value.name]])]),l(`label`,null,[i(M(v(b)(`性别`))+` `,1),E(P,{modelValue:p.value.gender,"onUpdate:modelValue":t[1]||=e=>p.value.gender=e,name:`gender`,"aria-label":v(b)(`性别`),options:[{value:`female`,label:v(b)(`女`)},{value:`male`,label:v(b)(`男`)},{value:`unspecified`,label:v(b)(`不指定`)}]},null,8,[`modelValue`,`aria-label`,`options`]),l(`small`,null,M(v(b)(`人称会进入 TA 对自己的理解。女是「她」,男是「他」。`)),1)]),l(`label`,null,[i(M(v(b)(`别人会怎么叫 TA`))+` `,1),_(l(`input`,{"onUpdate:modelValue":t[2]||=e=>h.value=e,name:`aliases`,placeholder:v(b)(`用逗号分隔`)},null,8,Ae),[[s,h.value]]),l(`small`,null,M(v(b)(`群友叫 TA 的称呼,保存时一并写进全局设置`)),1)]),l(`label`,je,[i(M(v(b)(`天性`))+` `,1),_(l(`textarea`,{"onUpdate:modelValue":t[3]||=e=>p.value.base=e,name:`base`,rows:`6`,placeholder:v(b)(`TA 的背景、性格、兴趣和社交方式…`)},null,8,Me),[[s,p.value.base]])])]),l(`fieldset`,Ne,[l(`legend`,null,M(v(b)(`性格刻度`)),1),(D(!0),u(a,null,y(v(d),e=>(D(),u(`div`,{key:e.key,class:`trait`},[l(`div`,Pe,[l(`b`,null,M(e.label),1),l(`small`,Fe,M(Z(e)),1)]),_(l(`input`,{"onUpdate:modelValue":t=>p.value[e.key]=t,type:`range`,min:`0`,max:`100`,"data-trait":e.key,"aria-label":v(b)(`{label}刻度`,{label:e.label})},null,8,Ie),[[s,p.value[e.key],void 0,{number:!0}]]),_(l(`input`,{"onUpdate:modelValue":t=>p.value[e.key]=t,name:e.key,type:`number`,min:`0`,max:`100`,class:`trait-number`,"aria-label":e.label},null,8,Le),[[s,p.value[e.key],void 0,{number:!0}]])]))),128)),l(`label`,null,[i(M(v(b)(`说话长度`)),1),_(l(`input`,{"onUpdate:modelValue":t[4]||=e=>p.value.length=e,name:`length`},null,512),[[s,p.value.length]])])]),l(`fieldset`,Re,[l(`legend`,null,M(v(b)(`作息`)),1),l(`label`,ze,[_(l(`input`,{"onUpdate:modelValue":t[5]||=e=>p.value.rhythm.enabled=e,type:`checkbox`,name:`rhythmEnabled`},null,512),[[o,p.value.rhythm.enabled]]),l(`span`,null,M(v(b)(`TA 会睡觉:睡着时不看群,被私聊或 @ 会等醒来再看(危机消息除外)`)),1)]),l(`div`,Be,[E(ae,{sleep:p.value.rhythm.sleep,"onUpdate:sleep":[t[6]||=e=>p.value.rhythm.sleep=e,t[8]||=e=>Q()],wake:p.value.rhythm.wake,"onUpdate:wake":[t[7]||=e=>p.value.rhythm.wake=e,t[9]||=e=>Q()],disabled:!p.value.rhythm.enabled},null,8,[`sleep`,`wake`,`disabled`]),l(`div`,Ve,[l(`label`,null,[i(M(v(b)(`几点睡`)),1),_(l(`input`,{"onUpdate:modelValue":t[10]||=e=>p.value.rhythm.sleep=e,type:`time`,name:`sleep`,step:`900`},null,512),[[s,p.value.rhythm.sleep]])]),l(`label`,null,[i(M(v(b)(`几点醒`)),1),_(l(`input`,{"onUpdate:modelValue":t[11]||=e=>p.value.rhythm.wake=e,type:`time`,name:`wake`,step:`900`},null,512),[[s,p.value.rhythm.wake]])]),l(`small`,He,M(v(b)(`拖动月亮和太阳,或直接输入时间。`)),1)])])]),l(`fieldset`,null,[l(`legend`,null,M(v(b)(`兴趣、边界与底线`)),1),l(`div`,Ue,[l(`label`,null,[i(M(v(b)(`兴趣`)),1),_(l(`input`,{"onUpdate:modelValue":t[12]||=e=>p.value.interests=e,name:`interests`,placeholder:v(b)(`用逗号分隔`)},null,8,We),[[s,p.value.interests]])]),l(`label`,null,[i(M(v(b)(`社交边界`)),1),_(l(`input`,{"onUpdate:modelValue":t[13]||=e=>p.value.boundaries=e,name:`boundaries`},null,512),[[s,p.value.boundaries]])]),l(`label`,null,[i(M(v(b)(`底线(每行一条)`)),1),_(l(`textarea`,{"onUpdate:modelValue":t[14]||=e=>p.value.bottomLines=e,name:`bottomLines`,rows:`4`},null,512),[[s,p.value.bottomLines]])]),l(`label`,null,[i(M(v(b)(`不想用的说法(每行一个)`)),1),_(l(`textarea`,{"onUpdate:modelValue":t[15]||=e=>p.value.forbidden=e,name:`forbidden`,rows:`3`},null,512),[[s,p.value.forbidden]])]),l(`small`,Ge,M(v(b)(`凭据(密码、密钥、验证码)永远不会进入 TA 的心智,这一条写死在代码里。`)),1)])])],8,Oe),l(`details`,Ke,[l(`summary`,null,M(v(b)(`天性的版本 · {length}`,{length:S.value.length})),1),l(`ol`,null,[(D(!0),u(a,null,y(S.value,e=>(D(),u(`li`,{key:e.version},[l(`span`,qe,M(v(b)(`第 {version} 版`,{version:e.version})),1),l(`span`,null,M(e.note||v(b)(`修改`)),1),l(`time`,Je,M(v(N)(e.created)),1)]))),128))])]),l(`div`,Ye,[l(`button`,{class:`primary`,disabled:U.value||q.value.locked},M(q.value.locked?v(b)(`已交给 TA`):U.value?v(b)(`保存中…`):v(b)(`保存天性`)),9,Xe),l(`span`,Ze,M(q.value.locked?v(b)(`更改次数已用完`):W.nature?v(b)(`天性有未保存的修改`):v(b)(`还可以改 {left} 次`,{left:q.value.left})),1)])],32)]),l(`aside`,Qe,[l(`div`,$e,[l(`span`,et,M(v(b)(`调色盘 · 即时反馈`)),1),l(`h3`,null,M(v(b)(`微小的倾向,也会改变表达`)),1),l(`ul`,tt,[(D(!0),u(a,null,y(v(d),e=>(D(),u(`li`,{key:e.key},[l(`b`,null,M(e.label)+` `+M(p.value[e.key]),1),l(`span`,null,M(Z(e)),1)]))),128))])]),E(re,{class:`chat-card`,title:v(b)(`用草稿天性试聊`),eyebrow:`TALK TO TA`},{default:g(()=>[E(ie,{anchored:``,sessions:v(O).core.sessions,nature:kt.value,starter:v(b)(`今天真的好累啊`)},{options:g(()=>[l(`label`,nt,[_(l(`input`,{"onUpdate:modelValue":t[17]||=e=>K.value=e,type:`checkbox`},null,512),[[o,K.value]]),i(M(v(b)(`用左边还没保存的天性`)),1)])]),_:1},8,[`sessions`,`nature`,`starter`])]),_:1},8,[`title`])])]),B.life?(D(),u(`form`,{key:0,class:`days`,onSubmit:r(Mt,[`prevent`]),onInput:t[33]||=e=>Q(`days`),onChange:t[34]||=e=>Q(`days`)},[l(`section`,rt,[l(`div`,it,[l(`div`,null,[l(`span`,at,M(v(b)(`TA 的日子`)),1),l(`h2`,null,M(v(b)(`TA 怎样度过没人说话的时间`)),1)])]),l(`div`,ot,[l(`label`,st,[_(l(`input`,{"onUpdate:modelValue":t[18]||=e=>B.life.solitude=e,type:`checkbox`},null,512),[[o,B.life.solitude]]),l(`span`,null,[l(`b`,null,M(v(b)(`独处`)),1),l(`small`,null,M(v(b)(`聊天安静下来后,TA 会重新看看最近的事,改变对自己、对人的理解。`)),1)])]),l(`label`,ct,[_(l(`input`,{"onUpdate:modelValue":t[19]||=e=>B.life.reading=e,type:`checkbox`},null,512),[[o,B.life.reading]]),l(`span`,null,[l(`b`,null,M(v(b)(`独处时读资料`)),1),l(`small`,null,M(v(b)(`从共享资料里按自己的兴趣挑着读,一段一段读下去;读过的内容聊天时可以自然提起。`)),1)])]),l(`label`,lt,[_(l(`input`,{"onUpdate:modelValue":t[20]||=e=>B.life.diary=e,type:`checkbox`},null,512),[[o,B.life.diary]]),l(`span`,null,[l(`b`,null,M(v(b)(`睡前写日记`)),1),l(`small`,null,M(v(b)(`一天结束时写下这一天,和昨天的自己对照;隔一段时间在夜里回顾,改写自传、翻开新的一章。`)),1)])]),l(`label`,ut,[_(l(`input`,{"onUpdate:modelValue":t[21]||=e=>B.life.night=e,type:`checkbox`},null,512),[[o,B.life.night]]),l(`span`,null,[l(`b`,null,M(v(b)(`夜里整理`)),1),l(`small`,null,M(v(b)(`睡着以后,把白天没整理的聊天记进记忆和约定里,再按回顾间隔回顾这段日子。`)),1)])]),l(`label`,dt,[_(l(`input`,{"onUpdate:modelValue":t[22]||=e=>B.life.proactive=e,type:`checkbox`},null,512),[[o,B.life.proactive]]),l(`span`,null,[l(`b`,null,M(v(b)(`允许 TA 主动说话`)),1),l(`small`,null,M(v(b)(`安静的时候,也能从自己的兴趣、念头和对人的感觉决定要不要先开口。不必等人提问,不催同一句话;对方没回应,也不等于以后不能分享新的事。关掉后停止主动联系。`)),1),t[40]||=i(` >`,-1)])])]),l(`div`,ft,[l(`label`,null,[i(M(v(b)(`安静多久才独处(分钟)`)),1),_(l(`input`,{"onUpdate:modelValue":t[23]||=e=>B.life.idleMinutes=e,type:`number`,min:`0`},null,512),[[s,B.life.idleMinutes,void 0,{number:!0}]])]),l(`label`,null,[i(M(v(b)(`两次独处至少间隔(分钟)`)),1),_(l(`input`,{"onUpdate:modelValue":t[24]||=e=>B.life.intervalMinutes=e,type:`number`,min:`10`},null,512),[[s,B.life.intervalMinutes,void 0,{number:!0}]])]),l(`label`,null,[i(M(v(b)(`攒够多少条新消息(条)`)),1),_(l(`input`,{"onUpdate:modelValue":t[25]||=e=>B.life.minMessages=e,type:`number`,min:`0`},null,512),[[s,B.life.minMessages,void 0,{number:!0}]])]),l(`label`,null,[i(M(v(b)(`回顾间隔(天)`)),1),_(l(`input`,{"onUpdate:modelValue":t[26]||=e=>B.life.chapterDays=e,type:`number`,min:`1`},null,512),[[s,B.life.chapterDays,void 0,{number:!0}]])]),l(`label`,null,[i(M(v(b)(`安静时多久看看想不想聊(分钟)`)),1),_(l(`input`,{"onUpdate:modelValue":t[27]||=e=>B.life.initiativeIntervalMinutes=e,type:`number`,min:`1`},null,512),[[s,B.life.initiativeIntervalMinutes,void 0,{number:!0}]])]),l(`label`,null,[i(M(v(b)(`两次主动联系至少间隔(小时)`)),1),_(l(`input`,{"onUpdate:modelValue":t[28]||=e=>B.life.proactiveIntervalHours=e,type:`number`,min:`0`,step:`0.1`},null,512),[[s,B.life.proactiveIntervalHours,void 0,{number:!0}]])]),l(`p`,pt,M(v(b)(`主动联系间隔只在实际发出后计算,可设为 0;沉默不会占用发送间隔。想说的话会保留,临时忙碌后重新决定。没有新消息时也可独处,不需要攒够消息才能产生念头。`)),1),l(`p`,mt,M(v(b)(`独处、日记和夜里整理也使用模型库里的默认模型,不再单独指定。`)),1),l(`label`,null,[i(M(v(b)(`时区`)),1),_(l(`input`,{"onUpdate:modelValue":t[29]||=e=>B.life.timeZone=e,placeholder:`Asia/Shanghai`},null,512),[[s,B.life.timeZone]])])])]),l(`section`,ht,[l(`div`,gt,[l(`div`,null,[l(`span`,_t,M(v(b)(`每日注意力`)),1),l(`h2`,null,M(v(b)(`TA 一天能花多少 Token`)),1)])]),l(`div`,vt,[l(`label`,yt,[i(M(v(b)(`每日 Token 上限(0 = 不限)`))+` `,1),_(l(`input`,{"onUpdate:modelValue":t[30]||=e=>B.budget.dailyTokens=e,type:`number`,min:`0`},null,512),[[s,B.budget.dailyTokens,void 0,{number:!0}]]),l(`small`,null,M(v(b)(`滚动 24 小时计算。快用完时,TA 在群里只在被叫到时细看;用完后后台独处和整理暂停。`)),1)]),l(`label`,null,[i(M(v(b)(`独处与日记最多占`)),1),_(l(`input`,{"onUpdate:modelValue":t[31]||=e=>B.budget.innerShare=e,type:`number`,min:`0`,max:`0.9`,step:`0.05`},null,512),[[s,B.budget.innerShare,void 0,{number:!0}]])]),l(`label`,null,[i(M(v(b)(`记忆整理与压缩最多占`)),1),_(l(`input`,{"onUpdate:modelValue":t[32]||=e=>B.budget.upkeepShare=e,type:`number`,min:`0`,max:`0.9`,step:`0.05`},null,512),[[s,B.budget.upkeepShare,void 0,{number:!0}]])])]),l(`p`,bt,M(v(b)(`扫一眼群聊不花 Token;TA 细看时一次调用同时完成理解、心情和回复。私聊和 @ 永远优先。`)),1),l(`div`,xt,[l(`button`,St,M(v(b)(`保存 TA 的日子`)),1),l(`span`,Ct,M(W.days?v(b)(`日常安排有未保存的修改`):v(b)(`日常安排已保存`)),1)])])],32)):c(``,!0),l(`details`,wt,[l(`summary`,null,[l(`span`,Tt,M(v(b)(`高级`)),1),l(`b`,null,M(v(b)(`指令(Prompt)`)),1)]),l(`form`,{id:`promptsForm`,class:`stack tight`,onSubmit:r(Nt,[`prevent`]),onInput:t[37]||=e=>Q(`prompts`)},[l(`label`,null,[i(M(v(b)(`要编辑的指令`))+` `,1),E(P,{modelValue:H.value,"onUpdate:modelValue":t[35]||=e=>H.value=e,"aria-label":v(b)(`要编辑的指令`),options:Object.keys(V).map(e=>({value:e,label:v(f)[e]||e}))},null,8,[`modelValue`,`aria-label`,`options`])]),l(`label`,null,[i(M(v(b)(`指令正文`)),1),_(l(`textarea`,{"onUpdate:modelValue":t[36]||=e=>V[H.value]=e,rows:`14`,class:`mono`},null,512),[[s,V[H.value]]])]),l(`div`,Et,[l(`button`,Dt,M(v(b)(`保存指令`)),1),l(`span`,Ot,M(W.prompts?v(b)(`指令有未保存的修改`):v(b)(`指令已保存`)),1)])],32)])])):c(``,!0)}}),[[`__scopeId`,`data-v-9b449c5e`]]);export{X as default};
@@ -1 +0,0 @@
1
- import{B as e,G as t,H as n,K as r,L as i,P as a,U as o,V as s,W as c,Y as l,_ as u,_t as d,b as f,dt as p,ft as m,gt as h,ht as g,it as _,k as v,lt as y,mt as b,n as x,o as S,q as C,rt as w,s as T,t as E,v as D,vt as O,y as k,yt as A}from"./Empty-CpP5kQHH.js";import{C as j,E as ee,I as M,L as N,N as P,P as F,S as I,T as L,a as R,b as z,c as B,f as V,h as H,j as U,l as W,n as te,o as G,p as K,r as q,v as J,x as Y,y as X}from"./index-BheRW-1t.js";import{l as Z}from"./knowledge-DG0e0uKw.js";var Q=[`aria-label`],ne={class:`encounter-hero`},re={class:`encounter-copy`},ie={class:`eyebrow`},ae={class:`encounter-count`},oe={class:`encounter-lens`,"aria-hidden":`true`},se={class:`orb`},ce={class:`people-heading`},le={class:`encounter-grid`},ue=[`data-person`,`aria-label`,`onClick`],de={class:`avatar-wrap`},fe={class:`avatar`},pe={class:`person-copy`},me=x(l({__name:`Galaxy`,props:{people:{},activity:{}},emits:[`open`,`list`],setup(n,{emit:a}){let l=n,u=a,f=e(()=>[...l.people].sort((e,t)=>(t.familiarity??0)-(e.familiarity??0))),p=e(()=>f.value.slice(0,12)),m=e(()=>Math.max(0,f.value.length-p.value.length));return(e,a)=>(w(),c(`section`,{class:`galaxy`,"aria-label":h(v)(`相遇之间:TA 认识的人`)},[s(`div`,ne,[s(`div`,re,[s(`span`,ie,A(h(v)(`PEOPLE / 相遇之间`)),1),s(`h2`,null,[r(A(h(v)(`每一次相遇,`)),1),a[1]||=s(`br`,null,null,-1),s(`em`,null,A(h(v)(`都留下一点温度。`)),1)]),s(`p`,null,A(h(v)(`越熟悉离 TA 越近。这里先放着最近亲近的 {length} 个人,其他人也仍然在名单里。`,{length:p.value.length})),1),s(`div`,ae,[s(`b`,null,A(n.people.length),1),s(`span`,null,A(h(v)(`个相遇过的人`)),1)])]),s(`div`,oe,[a[2]||=t(`<div class="lens-ring ring-a" data-v-c60042d4></div><div class="lens-ring ring-b" data-v-c60042d4></div><span class="lens-dot dot-a" data-v-c60042d4></span><span class="lens-dot dot-b" data-v-c60042d4></span><span class="lens-dot dot-c" data-v-c60042d4></span>`,5),s(`div`,se,[C(F,{mood:h(N),activity:n.activity||`idle`,size:100},null,8,[`mood`,`activity`])])])]),s(`div`,ce,[s(`div`,null,[a[3]||=s(`span`,{class:`eyebrow`},`CLOSER TO HER`,-1),s(`h3`,null,A(h(v)(`最近靠近的人`)),1)]),s(`span`,null,A(h(v)(`点开一张光片,看看她记得什么`)),1)]),s(`div`,le,[(w(!0),c(i,null,_(p.value,(e,t)=>(w(),c(`button`,{key:e.userId,type:`button`,class:d([`person-node`,{away:(e.awayDays??0)>=14,tense:e.tension>=.3}]),"data-person":e.userId,style:O({"--hue":h(V)(e.name||e.userId),"--order":t}),"aria-label":`${e.name}:${e.feel||h(v)(`还在慢慢认识`)}`,onClick:t=>u(`open`,e.userId)},[s(`span`,de,[s(`span`,fe,A(h(K)(e.name)),1)]),s(`span`,pe,[s(`b`,null,A(e.name),1),s(`small`,null,`QQ `+A(e.userId),1),s(`small`,null,A(e.feel||h(v)(`还在慢慢认识`)),1)]),a[5]||=s(`span`,{class:`person-arrow`,"aria-hidden":`true`},`↗`,-1),s(`span`,{class:`familiarity`,style:O({"--amount":Math.round(Math.max(0,Math.min(1,e.familiarity??0))*100)+`%`}),"aria-hidden":`true`},[...a[4]||=[s(`i`,null,null,-1)]],4)],14,ue))),128))]),m.value?(w(),c(`button`,{key:0,type:`button`,class:`more-people`,onClick:a[0]||=e=>u(`list`)},[r(A(h(v)(`在名单里看看另外 {hidden} 个人`,{hidden:m.value}))+` `,1),a[6]||=s(`span`,{"aria-hidden":`true`},`↗`,-1)])):o(``,!0)],8,Q))}}),[[`__scopeId`,`data-v-c60042d4`]]),he=[`width`,`height`],ge=[`stroke-dasharray`,`transform`],_e={x:`22`,y:`25.5`,"text-anchor":`middle`},ve={key:0},ye=x(l({__name:`Ring`,props:{value:{},label:{},caption:{default:``},signed:{type:Boolean,default:!1},size:{default:64}},setup(t){let n=t,r=2*Math.PI*18,i=e(()=>{let e=Number(n.value)||0;return n.signed?Math.max(-1,Math.min(1,e)):Math.max(0,Math.min(1,e))}),a=e(()=>Math.abs(i.value)*r),l=e(()=>i.value<0);return(e,n)=>(w(),c(`figure`,{class:`ring`,style:O({width:t.size+`px`})},[(w(),c(`svg`,{width:t.size,height:t.size,viewBox:`0 0 44 44`,"aria-hidden":`true`},[n[0]||=s(`circle`,{class:`track`,cx:`22`,cy:`22`,r:`18`},null,-1),s(`circle`,{class:d([`arc`,{negative:l.value}]),cx:`22`,cy:`22`,r:`18`,"stroke-dasharray":`${a.value.toFixed(2)} ${r.toFixed(2)}`,transform:l.value?`translate(44 0) scale(-1 1) rotate(-90 22 22)`:`rotate(-90 22 22)`},null,10,ge),s(`text`,_e,A(Math.round(i.value*100)),1)],8,he)),s(`figcaption`,null,[s(`b`,null,A(t.label),1),t.caption?(w(),c(`small`,ve,A(t.caption),1)):o(``,!0)])],4))}}),[[`__scopeId`,`data-v-bbca6071`]]),be={key:0,class:`error-text`},xe={key:1,class:`person-sheet stack`},Se={class:`who`},Ce={class:`feel`},we={class:`qq`},Te={class:`muted`},Ee={class:`rings`},De={key:0,class:`impression`},Oe={key:1,class:`row`},ke={class:`faint`},Ae={class:`sheet-title`},je={key:0,class:`list`},Me=[`data-tone`],Ne={class:`grow`},Pe={class:`faint`},Fe={key:0,class:`chip`,"data-tone":`quiet`},Ie=[`onClick`],Le={key:1,class:`muted`},Re={key:2},ze={class:`sheet-title`},Be={class:`list`},Ve=[`data-tone`],He={class:`grow`},Ue={key:0,class:`faint`},We={class:`faint`},Ge=[`onClick`],Ke={class:`sheet-title`},qe={key:0,class:`list`},Je={class:`faint`},Ye={key:0,class:`instant`},Xe={class:`faint`},Ze=[`onClick`],Qe=[`onClick`],$e={key:1,class:`muted`},et={class:`sheet-title`},tt={key:0,class:`list`},nt=[`data-tone`],rt={class:`grow`},it={class:`faint`},at=[`onClick`],ot={key:1,class:`muted`},st=x(l({__name:`PersonSheet`,props:{id:{},now:{}},emits:[`close`,`changed`],setup(t,{emit:r}){let a=t,l=r,m=b(null),g=b(``),x=e(()=>m.value?.person),S=e(()=>{let e=x.value?.firstMetAt;return e?v(`认识 {v} 天`,{v:Math.max(1,Math.round(((a.now||Date.now())-e)/864e5))}):``});async function T(){if(!a.id)return;let e=a.id;m.value?.person?.userId!==e&&(m.value=u(`/mind/people/`+encodeURIComponent(e))||null),g.value=``;try{let t=await U.person(e);a.id===e&&(m.value=t)}catch(t){if(a.id!==e)return;m.value=null,g.value=t.message}}async function E(e){if(await k(v(`撤销这次「{v}」?TA 对这个人的感觉会重新计算。`,{v:z[e.change]||e.change}),{title:v(`撤销一次关系变化`),confirmText:v(`撤销`),danger:!0}))try{await U.revoke(`bond`,e.id),D(v(`已撤销`)),await T(),l(`changed`)}catch(e){D(e.message,!0)}}async function M(e){let t=await f(v(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:v(`撤销这条记忆`),confirmText:v(`撤销`),danger:!0,placeholder:v(`原因`)});if(t!==null)try{await U.revoke(`memory`,e.id,t),D(v(`已撤销`)),await T()}catch(e){D(e.message,!0)}}async function N(e,t){try{await Z(e.id,t),await T()}catch(e){D(e.message,!0)}}async function F(e){if(await k(v(`撤销这次相遇留下的意思?「{meant}」之后不会再回到 TA 心里,也不会再被当成变化的来源。`,{meant:e.meant}),{title:v(`撤销这次相遇`),confirmText:v(`撤销`),danger:!0}))try{await U.revoke(`meeting`,e.id),D(v(`已撤销`)),await T(),l(`changed`)}catch(e){D(e.message,!0)}}async function R(e){let t=await f(v(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:v(`撤销这个约定`),confirmText:v(`撤销`),danger:!0,placeholder:v(`原因`)});if(t!==null)try{await U.revoke(`anticipation`,e.id,t),D(v(`已撤销`)),await T()}catch(e){D(e.message,!0)}}return y(()=>a.id,e=>{m.value=null,e&&T()},{immediate:!0}),(e,r)=>(w(),n(G,{open:!!t.id,title:x.value?.name||h(v)(`正在想起…`),eyebrow:h(v)(`TA 认识的人`),width:`560px`,onClose:r[0]||=e=>l(`close`)},{default:p(()=>[g.value?(w(),c(`p`,be,A(g.value),1)):x.value?(w(),c(`div`,xe,[s(`header`,Se,[s(`span`,{class:`avatar`,style:O({"--hue":h(V)(x.value.name||x.value.userId)})},A(h(K)(x.value.name)),5),s(`div`,null,[s(`p`,Ce,A(x.value.feel),1),s(`small`,we,`QQ `+A(x.value.userId),1),s(`small`,Te,A([S.value,x.value.lastTalkedAt?h(v)(`上次说上话 {v}`,{v:h(W)(x.value.lastTalkedAt,t.now)}):h(v)(`还没说上过话`),x.value.seenAt?h(v)(`上次见到 {v}`,{v:h(W)(x.value.seenAt,t.now)}):``].filter(Boolean).join(` · `)),1)])]),s(`div`,Ee,[(w(!0),c(i,null,_(h(I),([e,t])=>(w(),n(ye,{key:e,value:x.value[e],label:t},null,8,[`value`,`label`]))),128))]),x.value.impression?(w(),c(`p`,De,A(h(v)(`印象:{impression}`,{impression:x.value.impression})),1)):o(``,!0),x.value.places?.length?(w(),c(`div`,Oe,[s(`span`,ke,A(h(v)(`在这些地方见过:`)),1),(w(!0),c(i,null,_(x.value.places,e=>(w(),c(`span`,{key:e.id,class:`chip`,"data-tone":`quiet`},A(e.name),1))),128))])):o(``,!0),s(`section`,null,[s(`h3`,Ae,A(h(v)(`这份感觉是怎么来的`)),1),m.value.changes.length?(w(),c(`ul`,je,[(w(!0),c(i,null,_(m.value.changes,e=>(w(),c(`li`,{key:e.id,class:d([`change`,{done:e.revoked}])},[s(`span`,{class:`chip`,"data-tone":e.revoked?`quiet`:h(Y).has(e.change)?`danger`:void 0},A(h(z)[e.change]||e.change),9,Me),s(`div`,Ne,[s(`p`,null,A(e.note||h(v)(`没有写原因`)),1),s(`small`,Pe,A(h(v)(`{v} · {v2} · {length} 处来源`,{v:h(P)(e.created),v2:h(ee)[e.origin]||h(v)(`写日记时`),length:e.sources.length})),1)]),e.revoked?(w(),c(`span`,Fe,A(h(v)(`已撤销`)),1)):(w(),c(`button`,{key:1,class:`text-button`,"data-revoke-change":``,onClick:t=>E(e)},A(h(v)(`撤销`)),9,Ie))],2))),128))])):(w(),c(`p`,Le,A(h(v)(`只是一起聊过天,还没有特别的变化。`)),1))]),m.value.meetings?.length?(w(),c(`section`,Re,[s(`h3`,ze,A(h(v)(`和{name}的相遇留下了什么`,{name:x.value.name})),1),s(`ul`,Be,[(w(!0),c(i,null,_(m.value.meetings,e=>(w(),c(`li`,{key:e.id,class:`change`},[s(`span`,{class:`chip`,"data-tone":e.private?`quiet`:void 0},A(e.private?h(v)(`私下`):e.choice===`silent`?h(v)(`没出声`):h(v)(`出了声`)),9,Ve),s(`div`,He,[s(`p`,null,A(e.meant),1),e.why?(w(),c(`small`,Ue,A(h(v)(`当时:{why}`,{why:e.why})),1)):o(``,!0),s(`small`,We,A(e.when)+` · `+A(e.sessionName),1)]),s(`button`,{class:`text-button`,"data-revoke-meeting":``,onClick:t=>F(e)},A(h(v)(`撤销`)),9,Ge)]))),128))])])):o(``,!0),s(`section`,null,[s(`h3`,Ke,A(h(v)(`TA 记得关于{name}的事`,{name:x.value.name})),1),m.value.memories.length?(w(),c(`ul`,qe,[(w(!0),c(i,null,_(m.value.memories,e=>(w(),c(`li`,{key:e.id,class:d([`memory-item`,{superseded:e.status===`superseded`}])},[s(`p`,null,A(e.content),1),s(`small`,Je,A(h(v)(`{v} · 在「{v2}」知道的 · {when}`,{v:h(L)[e.status]||e.status,v2:h(H)({name:e.sessionName,id:e.session_id||e.sessionId}),when:e.when})),1),e.status===`confirmed`?(w(),c(`div`,Ye,[s(`span`,Xe,A(h(v)(`改完即生效`)),1),C(B,{"aria-label":h(v)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(h(j)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>N(e,{discretion:t})},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),s(`button`,{class:`small`,onClick:t=>N(e,{locked:!e.locked})},A(e.locked?h(v)(`解锁`):h(v)(`锁定`)),9,Ze),s(`button`,{class:`small danger`,onClick:t=>M(e)},A(h(v)(`撤销`)),9,Qe)])):o(``,!0)],2))),128))])):(w(),c(`p`,$e,A(h(v)(`还没有记住关于这个人的事。`)),1))]),s(`section`,null,[s(`h3`,et,A(h(v)(`和{name}有关的约定`,{name:x.value.name})),1),m.value.anticipations.length?(w(),c(`ul`,tt,[(w(!0),c(i,null,_(m.value.anticipations,e=>(w(),c(`li`,{key:e.id,class:d([`change`,{done:e.state!==`pending`}])},[s(`span`,{class:`chip`,"data-tone":e.state===`pending`?void 0:`quiet`},A(h(X)[e.state]||e.state),9,nt),s(`div`,rt,[s(`p`,null,A(e.content),1),s(`small`,it,A(h(J)[e.kind]||e.kind)+` · `+A(e.when),1)]),e.status===`revoked`?o(``,!0):(w(),c(`button`,{key:0,class:`text-button`,onClick:t=>R(e)},A(h(v)(`撤销`)),9,at))],2))),128))])):(w(),c(`p`,ot,A(h(v)(`没有和这个人有关的约定。`)),1))])])):o(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`]))}}),[[`__scopeId`,`data-v-5645edbd`]]),ct={class:`faces`},lt={class:`faces-head`},ut={class:`eyebrow`},dt={class:`muted`},ft={class:`face-grid`},pt={class:`badge`},mt={key:0,class:`qq`},ht={class:`muted`},gt={key:0,class:`kv`},_t={class:`face-excerpt`},vt={key:1,class:`muted small-text`},yt=[`onClick`],bt={key:0,class:`stack`},xt={class:`face-full`},St={key:0,class:`versions`},Ct={key:0},wt={key:1},Tt=[`onClick`],Et={key:0,class:`muted`},$=x(l({__name:`GroupFaces`,props:{groups:{}},emits:[`changed`],setup(e,{emit:t}){let n=t,a=b(null),l=b({});async function u(e){l.value[e]||(l.value={...l.value,[e]:await U.faces(e)})}async function f(e,t){if(await k(v(`撤销这一版面貌?TA 在这里会回到上一版的样子。`),{title:v(`撤销面貌`),confirmText:v(`撤销`),danger:!0}))try{await U.revoke(`face`,t),l.value={...l.value,[e]:await U.faces(e)},D(v(`已撤销`)),n(`changed`)}catch(e){D(e.message,!0)}}return(t,n)=>(w(),c(`section`,ct,[s(`div`,lt,[s(`span`,ut,A(h(v)(`群像`)),1),s(`h2`,null,A(h(v)(`在不同的地方,她有不同的相处方式。`)),1),s(`p`,dt,A(h(v)(`面貌由 TA 在独处和写日记时自己修正;每一版都有来源。这个地方的说话节奏不会写成 TA 的样子。`)),1)]),s(`div`,ft,[(w(!0),c(i,null,_(e.groups,e=>(w(),c(`article`,{key:e.session,class:`card face-card`,style:O({"--hue":h(V)(e.session)})},[s(`header`,null,[s(`span`,pt,A(e.kind===`private`?h(v)(`私`):h(v)(`群`)),1),s(`div`,null,[s(`h3`,null,A(h(H)({id:e.session,name:e.name,kind:e.kind})),1),e.kind===`private`?(w(),c(`small`,mt,`QQ `+A(String(e.session||``).split(`:`).pop()),1)):o(``,!0),s(`small`,ht,A(e.kind===`private`?h(v)(`私聊`):h(v)(`群聊`))+A(e.bond?` · ${e.bond.feel}`:``),1)])]),e.face?(w(),c(`dl`,gt,[s(`dt`,null,A(h(v)(`角色`)),1),s(`dd`,null,A(e.face.role||`—`),1),s(`dt`,null,A(h(v)(`说话`)),1),s(`dd`,null,A(e.face.tone||`—`),1),s(`dt`,null,A(h(v)(`想成为`)),1),s(`dd`,null,A(e.face.aspiration||`—`),1),e.face.content?(w(),c(i,{key:0},[s(`dt`,null,A(h(v)(`自己的话`)),1),s(`dd`,_t,A(e.face.content),1)],64)):o(``,!0)])):(w(),c(`p`,vt,A(h(v)(`还没有形成在这里的样子。`)),1)),s(`button`,{class:`text-button`,onClick:t=>{a.value=e,u(e.session)}},A(h(v)(`查看完整面貌与变化 ↗`)),9,yt)],4))),128))]),C(G,{open:!!a.value,title:a.value?.name||h(v)(`面貌`),eyebrow:h(v)(`FACES / 在这里的样子`),width:`680px`,onClose:n[0]||=e=>a.value=null},{default:p(()=>[a.value?(w(),c(`div`,bt,[s(`p`,xt,A(a.value.face?.content||h(v)(`还没有形成在这里的样子。`)),1),s(`h3`,null,A(h(v)(`变化历史`)),1),l.value[a.value.session]?(w(),c(`ol`,St,[(w(!0),c(i,null,_(l.value[a.value.session],e=>(w(),c(`li`,{key:e.id,class:d({revoked:e.revoked})},[s(`time`,null,A(h(P)(e.created)),1),s(`span`,null,[e.revoked?(w(),c(`b`,Ct,A(h(v)(`已撤销 ·`)),1)):e.origin===`migration`?(w(),c(`b`,wt,A(h(v)(`旧版 ·`)),1)):o(``,!0),r(A([e.role,e.tone,e.aspiration].filter(Boolean).join(` · `)||e.content),1)]),e.revoked?o(``,!0):(w(),c(`button`,{key:0,class:`text-button`,onClick:t=>f(a.value.session,e.id)},A(h(v)(`撤销`)),9,Tt))],2))),128)),l.value[a.value.session].length?o(``,!0):(w(),c(`li`,Et,A(h(v)(`没有记录。`)),1))])):o(``,!0)])):o(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-c7aa703d`]]),Dt={class:`page people`},Ot={class:`people-bar`},kt=[`placeholder`,`aria-label`],At={class:`muted`},jt={key:1,class:`people-list`},Mt=[`data-person`,`onClick`],Nt={class:`qq`},Pt={class:`muted`},Ft={class:`stack tight`},It={class:`faint`},Lt=x(l({__name:`PeoplePage`,setup(t){let r=g(u(`/mind/bonds`)||null),l=b(`galaxy`),d=b(``),f=b(T.sub&&T.sub!==`list`?T.sub:null);T.sub===`list`&&(l.value=`list`);let p=e(()=>{let e=d.value.trim(),t=r.value?.people||[];return e?t.filter(t=>`${t.name}${t.userId}${t.impression||``}`.includes(e)):t}),x=0;async function D(){let e=++x,t=await U.bonds();e===x&&(r.value=t)}function k(e){f.value=e,S(e)}function j(){f.value=null,S(l.value===`list`?`list`:``)}return y(l,e=>{T.page===`people`&&(f.value||S(e===`list`?`list`:``))}),y(()=>[T.page,T.sub],([e,t])=>{e===`people`&&(t===`list`&&(l.value=`list`),f.value=t&&t!==`list`?t:null)}),R(`people`,D),(e,t)=>(w(),c(`div`,Dt,[s(`div`,Ot,[C(te,{modelValue:l.value,"onUpdate:modelValue":t[0]||=e=>l.value=e,label:h(v)(`人际的视图`),items:[{key:`galaxy`,label:h(v)(`相遇之间`),count:r.value?.people.length??``},{key:`list`,label:h(v)(`列表`)}]},null,8,[`modelValue`,`label`,`items`]),m(s(`input`,{"onUpdate:modelValue":t[1]||=e=>d.value=e,class:`people-search`,type:`search`,placeholder:h(v)(`找一个人`),"aria-label":h(v)(`找一个人`)},null,8,kt),[[a,d.value]]),s(`p`,At,A(h(v)(`她记得相遇,也记得关系会随着时间改变。`)),1)]),r.value?(w(),c(i,{key:0},[p.value.length?(w(),c(i,{key:0},[l.value===`galaxy`?(w(),n(me,{key:0,people:p.value,activity:h(M).data?.activity?.kind,onOpen:k,onList:t[2]||=e=>l.value=`list`},null,8,[`people`,`activity`])):(w(),c(`div`,jt,[(w(!0),c(i,null,_(p.value,e=>(w(),c(`button`,{key:e.userId,class:`card person-card`,"data-person":e.userId,onClick:t=>k(e.userId)},[s(`header`,null,[s(`span`,{class:`avatar`,style:O({"--hue":h(V)(e.name||e.userId)})},A(h(K)(e.name)),5),s(`div`,null,[s(`h3`,null,A(e.name),1),s(`small`,Nt,`QQ `+A(e.userId),1),s(`small`,Pt,A(e.feel),1)])]),s(`div`,Ft,[(w(!0),c(i,null,_(h(I),([t,r])=>(w(),n(q,{key:t,label:r,value:e[t],warn:t===`tension`},null,8,[`label`,`value`,`warn`]))),128))]),s(`small`,It,A(h(v)(`在 {length} 个地方见过 · 上次说上话 {v}`,{length:e.sessions.length,v:e.lastTalkedAt?h(W)(e.lastTalkedAt,h(M).data?.now):h(v)(`还没有`)})),1)],8,Mt))),128))]))],64)):(w(),n(E,{key:1,title:h(v)(`TA 还没有认识谁`),text:h(v)(`有人和 TA 说话、TA 细看过群聊之后,这里会出现 TA 对每个人的感觉。`)},null,8,[`title`,`text`])),C($,{groups:r.value.groups,onChanged:D},null,8,[`groups`])],64)):o(``,!0),C(st,{id:f.value,now:h(M).data?.now,onClose:j,onChanged:D},null,8,[`id`,`now`])]))}}),[[`__scopeId`,`data-v-45f19e60`]]);export{Lt as default};
@@ -1,2 +0,0 @@
1
- import{B as e,H as t,I as n,K as r,L as i,M as ee,P as a,U as o,V as s,W as c,Y as l,dt as u,ft as d,gt as f,it as p,k as m,lt as h,m as g,mt as _,n as v,nt as te,o as ne,q as y,rt as b,s as x,t as S,tt as re,yt as C}from"./Empty-CpP5kQHH.js";import{i as w,n as T,o as ie}from"./index-BheRW-1t.js";import{t as E}from"./Field-D4gY-INU.js";var ae={class:`page plugins`},oe={class:`plugins-intro`},se={class:`eyebrow`},ce={key:0,class:`warn-text`,role:`alert`},le={key:1,class:`stack`},ue={class:`lead`},de={class:`grid`},fe={class:`muted`},pe={key:0},me={class:`row`},he=[`onClick`],ge=[`onClick`],_e=[`onClick`],ve={key:2,class:`grid`},ye=[`onClick`],be={key:3,class:`grid`},D={class:`row`},O=[`onClick`],k=[`onClick`],A={key:4,class:`grid`},j={key:0,class:`switch`},M=[`onUpdate:modelValue`],N=[`onUpdate:modelValue`,`placeholder`],xe=[`onUpdate:modelValue`,`placeholder`],Se=[`onUpdate:modelValue`],Ce={class:`row`},we={class:`ghost`,type:`submit`},Te=[`src`],Ee={key:1,class:`row`},P=v(l({__name:`PluginsPage`,setup(l){let v=[`installed`,`market`,`actions`,`import`],P=_(v.includes(x.sub)?x.sub:`installed`),F=_([]),I=_([]),L=_(!1),R=_(!1),z=_([]),B=_(``),V=_(``),H=_(null),U=_({}),W=_({url:``,sha256:``}),G=_(``),K=_(``),q=_(``),J=_(null),Y=e(()=>F.value.find(e=>e.id===V.value));async function X(){F.value=(await g(`/plugins`)).plugins||[];try{z.value=(await g(`/plugins/actions/pending`)).actions||[]}catch{z.value=[]}}function Z(){R.value=!0,g(`/plugins/market`).then(e=>{I.value=e.plugins||[],L.value=!!e.unavailable}).catch(()=>{I.value=[],L.value=!0}).finally(()=>{R.value=!1})}h(P,e=>{ne(e),e===`market`&&Z()}),h(()=>x.sub,e=>{v.includes(e)&&(P.value=e)}),h(V,async e=>{if(!e)return;let t=await g(`/plugins/${e}/settings`),n={};for(let e of t.fields||[]){let r=t.values?.[e.key]??e.default;e.type===`boolean`?n[e.key]=r===!0:e.type===`urls`?n[e.key]=Array.isArray(r)?r.join(`
2
- `):r??``:n[e.key]=r??``}U.value=n});async function De(){Y.value&&(B.value=``,await g(`/plugins/${Y.value.id}/settings`,{method:`PUT`,body:JSON.stringify({values:U.value})}))}async function Oe(e){B.value=``;try{V.value===e.id&&await g(`/plugins/${e.id}/settings`,{method:`PUT`,body:JSON.stringify({values:U.value})}),await g(`/plugins/${e.id}/grant`,{method:`POST`,body:JSON.stringify({permissions:e.permissions})}),await g(`/plugins/${e.id}/enable`,{method:`POST`,body:`{}`}),await X()}catch(e){B.value=e.message}}async function Q(e,t){B.value=``;try{H.value=await g(e,{method:`POST`,body:JSON.stringify(t)})}catch(e){B.value=e.message}}async function ke(){if(!H.value)return;await g(`/plugins/import/commit`,{method:`POST`,body:JSON.stringify({token:H.value.token})});let e=H.value;H.value=null,await g(`/plugins/${e.manifest.id}/grant`,{method:`POST`,body:JSON.stringify({permissions:e.permissions})}),P.value=`installed`,await X()}function $(e){let t=e.data||{};if(t.luckytri!==1||!Y.value||e.source!==J.value?.contentWindow)return;let n=String(t.path||`/`);n.startsWith(`/`)&&g(`/plugins/${Y.value.id}/x${n}`,{method:t.method||`GET`,body:t.body?JSON.stringify(t.body):void 0}).then(e=>J.value?.contentWindow?.postMessage({id:t.id,ok:!0,result:e},location.origin)).catch(e=>J.value?.contentWindow?.postMessage({id:t.id,ok:!1,error:e.message},location.origin))}re(()=>{X().catch(e=>B.value=e.message),P.value===`market`&&Z(),window.addEventListener(`message`,$)}),te(()=>window.removeEventListener(`message`,$));function Ae(e){return m(e===`high`?`高风险`:e===`medium`?`中风险`:`低风险`)}function je(e){return e.running?m(`运行中`):e.state===`error`?m(`出错`):e.enabled?m(`正在启动`):e.source===`builtin`?m(`内置,未启用`):m(`已安装,未启用`)}return(e,l)=>(b(),c(`div`,ae,[s(`header`,oe,[s(`span`,se,C(f(m)(`THE WORLD SHE CAN TOUCH · 插件`)),1),s(`h1`,null,[r(C(f(m)(`核心是她。`)),1),s(`em`,null,C(f(m)(`插件是世界。`)),1)]),s(`p`,null,C(f(m)(`插件只能经她同意接触世界。它们读不到她的数据库,也不能替她开口。`)),1)]),B.value?(b(),c(`p`,ce,C(B.value),1)):o(``,!0),y(T,{"model-value":P.value,"onUpdate:modelValue":l[0]||=e=>P.value=e,label:f(m)(`插件的分区`),items:[{key:`installed`,label:f(m)(`插件列表`)},{key:`market`,label:f(m)(`插件市场`)},{key:`actions`,label:f(m)(`她想做的事`),count:z.value.length},{key:`import`,label:f(m)(`导入与开发`)}]},null,8,[`model-value`,`label`,`items`]),P.value===`installed`?(b(),c(`section`,le,[s(`p`,ue,C(f(m)(`天气随 LuckyTri 附带,默认关闭。启用前会先列出它要的权限。`)),1),s(`div`,de,[F.value.length?o(``,!0):(b(),t(S,{key:0,title:f(m)(`还没有接上插件`),text:f(m)(`内置的天气可以在这里启用,也可以从市场安装。`)},null,8,[`title`,`text`])),(b(!0),c(i,null,p(F.value,e=>(b(),t(w,{key:e.id,title:e.manifest.name||e.id},{default:u(()=>[s(`p`,null,C(e.manifest.description),1),s(`p`,fe,[r(C(e.version)+` · `+C(je(e))+` `,1),e.status?.text?(b(),c(`span`,pe,` · `+C(e.status.text),1)):o(``,!0)]),s(`div`,me,[e.enabled?(b(),c(`button`,{key:1,class:`ghost`,onClick:t=>f(g)(`/plugins/${e.id}/disable`,{method:`POST`,body:`{}`}).then(X)},C(f(m)(`停用`)),9,ge)):(b(),c(`button`,{key:0,class:`primary`,onClick:t=>V.value=e.id},C(f(m)(`查看权限并启用`)),9,he)),s(`button`,{class:`ghost`,onClick:t=>V.value=e.id},C(f(m)(`详情`)),9,_e)])]),_:2},1032,[`title`]))),128))])])):P.value===`market`?(b(),c(`section`,ve,[R.value?(b(),t(S,{key:0,title:f(m)(`正在查看市场`),text:f(m)(`连不上的话,这里会说明,不会再显示一串英文错误。`)},null,8,[`title`,`text`])):I.value.length?o(``,!0):(b(),t(S,{key:1,title:f(m)(`市场暂时没有条目`),text:L.value?f(m)(`插件市场的索引还没有发布,或现在连不上。随程序附带的插件在「插件列表」里,默认关闭。`):f(m)(`索引仓库还是空的,或者现在连不上。你仍然可以导入一个插件包。`)},null,8,[`title`,`text`])),R.value?o(``,!0):(b(!0),c(i,{key:2},p(I.value,e=>(b(),t(w,{key:e.id||e.source,title:e.name||e.id},{default:u(()=>[s(`p`,null,C(e.description),1),e.latest?(b(),c(`button`,{key:0,class:`primary`,onClick:t=>Q(`/plugins/market/stage`,{url:e.latest.url,sha256:e.latest.sha256,id:e.id})},C(f(m)(`安装`))+` `+C(e.latest.version),9,ye)):o(``,!0)]),_:2},1032,[`title`]))),128))])):P.value===`actions`?(b(),c(`section`,be,[z.value.length?o(``,!0):(b(),t(S,{key:0,title:f(m)(`没有等待同意的事`),text:f(m)(`高风险的行动会先停在这里,等你点头。过一天就不再算数。`)},null,8,[`title`,`text`])),(b(!0),c(i,null,p(z.value,e=>(b(),t(w,{key:e.id,title:e.label},{default:u(()=>[s(`p`,null,C(e.reason),1),s(`div`,D,[s(`button`,{class:`primary`,onClick:t=>f(g)(`/plugins/actions/${e.id}/approve`,{method:`POST`,body:`{}`}).then(X)},C(f(m)(`同意`)),9,O),s(`button`,{class:`ghost`,onClick:t=>f(g)(`/plugins/actions/${e.id}/reject`,{method:`POST`,body:`{}`}).then(X)},C(f(m)(`拒绝`)),9,k)])]),_:2},1032,[`title`]))),128))])):(b(),c(`section`,A,[y(w,{title:f(m)(`从链接导入`)},{default:u(()=>[y(E,{label:f(m)(`插件包地址`)},{default:u(()=>[d(s(`input`,{"onUpdate:modelValue":l[1]||=e=>W.value.url=e},null,512),[[a,W.value.url]])]),_:1},8,[`label`]),y(E,{label:f(m)(`校验值,可留空`)},{default:u(()=>[d(s(`input`,{"onUpdate:modelValue":l[2]||=e=>W.value.sha256=e},null,512),[[a,W.value.sha256]])]),_:1},8,[`label`]),s(`button`,{class:`primary`,onClick:l[3]||=e=>Q(`/plugins/import/url`,W.value)},C(f(m)(`检查这个包`)),1)]),_:1},8,[`title`]),y(w,{title:f(m)(`从 GitHub 导入`)},{default:u(()=>[y(E,{label:f(m)(`仓库地址`)},{default:u(()=>[d(s(`input`,{"onUpdate:modelValue":l[4]||=e=>G.value=e,placeholder:`https://github.com/owner/name`},null,512),[[a,G.value]])]),_:1},8,[`label`]),s(`button`,{class:`primary`,onClick:l[5]||=e=>Q(`/plugins/import/github`,{repository:G.value})},C(f(m)(`检查这个仓库`)),1)]),_:1},8,[`title`]),y(w,{title:f(m)(`本机目录(开发)`)},{default:u(()=>[y(E,{label:f(m)(`目录`)},{default:u(()=>[d(s(`input`,{"onUpdate:modelValue":l[6]||=e=>K.value=e},null,512),[[a,K.value]])]),_:1},8,[`label`]),s(`button`,{class:`ghost`,onClick:l[7]||=e=>Q(`/plugins/import/dir`,{dir:K.value})},C(f(m)(`按开发插件接上`)),1)]),_:1},8,[`title`]),y(w,{title:f(m)(`索引源`)},{default:u(()=>[y(E,{label:f(m)(`索引地址`)},{default:u(()=>[d(s(`input`,{"onUpdate:modelValue":l[8]||=e=>q.value=e},null,512),[[a,q.value]])]),_:1},8,[`label`]),s(`button`,{class:`ghost`,onClick:l[9]||=e=>f(g)(`/plugins/sources`,{method:`POST`,body:JSON.stringify({url:q.value})})},C(f(m)(`添加索引`)),1)]),_:1},8,[`title`])])),H.value?(b(),t(w,{key:5,title:f(m)(`先看清它要什么`)},{default:u(()=>[s(`p`,null,C(H.value.manifest?.name)+` `+C(H.value.manifest?.version)+` · `+C(H.value.trusted?f(m)(`校验通过`):f(m)(`未登记来源`)),1),s(`ul`,null,[(b(!0),c(i,null,p(H.value.permissions,e=>(b(),c(`li`,{key:e},C(e),1))),128))]),s(`button`,{class:`primary`,onClick:ke},C(f(m)(`同意这些权限并安装`)),1)]),_:1},8,[`title`])):o(``,!0),y(ie,{open:!!Y.value,title:Y.value?.manifest.name||``,onClose:l[13]||=e=>V.value=``},{default:u(()=>[Y.value?(b(),c(i,{key:0},[s(`p`,null,C(Y.value.manifest.description),1),s(`ul`,null,[(b(!0),c(i,null,p(Y.value.risk,e=>(b(),c(`li`,{key:e.name},C(Ae(e.risk))+` · `+C(e.label),1))),128))]),s(`form`,{class:`settings`,onSubmit:l[11]||=n(e=>De().catch(e=>B.value.value=e.message),[`prevent`])},[(b(!0),c(i,null,p(Y.value.manifest.settings||[],e=>(b(),c(i,{key:e.key},[e.type===`boolean`?(b(),c(`label`,j,[s(`span`,null,C(e.label),1),d(s(`input`,{"onUpdate:modelValue":t=>U.value[e.key]=t,type:`checkbox`},null,8,M),[[ee,U.value[e.key]]])])):(b(),t(E,{key:1,label:e.label},{default:u(()=>[e.type===`secret`?d((b(),c(`input`,{key:0,type:`password`,"onUpdate:modelValue":t=>U.value[e.key]=t,placeholder:f(m)(`已保存的不会回显`)},null,8,N)),[[a,U.value[e.key]]]):e.type===`textarea`||e.type===`urls`?d((b(),c(`textarea`,{key:1,"onUpdate:modelValue":t=>U.value[e.key]=t,rows:`4`,placeholder:e.type===`urls`?f(m)(`一行一个地址`):void 0},null,8,xe)),[[a,U.value[e.key]]]):d((b(),c(`input`,{key:2,"onUpdate:modelValue":t=>U.value[e.key]=t},null,8,Se)),[[a,U.value[e.key]]])]),_:2},1032,[`label`]))],64))),128)),s(`div`,Ce,[s(`button`,we,C(f(m)(`保存设置`)),1),Y.value.enabled?o(``,!0):(b(),c(`button`,{key:0,class:`primary`,type:`button`,onClick:l[10]||=e=>Oe(Y.value)},C(f(m)(`同意这些权限并启用`)),1))])],32),Y.value.enabled&&Y.value.manifest.contributes?.page?(b(),c(`iframe`,{key:0,ref_key:`frame`,ref:J,class:`plugin-frame`,sandbox:`allow-scripts allow-forms`,src:`/plugin-ui/${Y.value.id}/index.html`},null,8,Te)):o(``,!0),Y.value.source===`builtin`?o(``,!0):(b(),c(`div`,Ee,[s(`button`,{class:`ghost`,onClick:l[12]||=e=>{f(g)(`/plugins/${Y.value.id}`,{method:`DELETE`,body:`{}`}).then(()=>{V.value=``,X()})}},C(f(m)(`卸载`)),1)]))],64)):o(``,!0)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-88f9bc22`]]);export{P as default};
@@ -1 +0,0 @@
1
- .plugins[data-v-88f9bc22]{gap:var(--gap);display:grid}.plugins-intro[data-v-88f9bc22]{background:radial-gradient(ellipse at 90% 7%, color-mix(in srgb, var(--glow-a) 48%, transparent), transparent 51%), radial-gradient(ellipse at 62% 115%, color-mix(in srgb, var(--glow-b) 38%, transparent), transparent 55%), linear-gradient(115deg, #fffc, #ffffff4d);min-height:190px;box-shadow:inset 0 2px 0 white, 0 25px 54px -35px color-mix(in srgb, var(--accent) 43%, transparent);-webkit-backdrop-filter:blur(28px)saturate(1.8);backdrop-filter:blur(28px)saturate(1.8);border:1px solid #ffffffd9;border-radius:36px;padding:32px clamp(26px,5vw,60px);position:relative;overflow:hidden}.plugins-intro[data-v-88f9bc22]:before{content:"";width:350px;height:350px;box-shadow:0 0 0 29px #ffffff21, 0 0 0 58px color-mix(in srgb, var(--glow-b) 12%, transparent);pointer-events:none;border:1px solid #ffffffb8;border-radius:50%;position:absolute;top:-85%;right:13%}.plugins-intro h1[data-v-88f9bc22],.plugins-intro p[data-v-88f9bc22],.plugins-intro .eyebrow[data-v-88f9bc22]{position:relative}.plugins-intro h1[data-v-88f9bc22]{letter-spacing:-.055em;margin:10px 0 7px;font-size:clamp(28px,3.25vw,42px)}.plugins-intro h1 em[data-v-88f9bc22]{color:var(--accent);font-style:normal}.plugins-intro p[data-v-88f9bc22]{max-width:560px;color:var(--ink-soft);font-size:13.5px}.stack[data-v-88f9bc22]{gap:14px;display:grid}.lead[data-v-88f9bc22]{color:var(--ink-soft);margin:0;font-size:13.5px}@media (width<=760px){.plugins-intro[data-v-88f9bc22]{min-height:0;padding:27px 23px}}.grid[data-v-88f9bc22]{gap:var(--gap);grid-template-columns:repeat(auto-fill,minmax(280px,420px));justify-content:start;display:grid}.muted[data-v-88f9bc22]{color:var(--ink-soft);font-size:13px}.warn-text[data-v-88f9bc22]{color:var(--warn)}.settings[data-v-88f9bc22]{gap:14px;margin-top:16px;display:grid}.settings .switch[data-v-88f9bc22]{color:var(--ink);background:#ffffff6b;border:1px solid #ffffffc7;border-radius:18px;justify-content:space-between;align-items:center;gap:12px;padding:12px 14px;font-size:13.5px;font-weight:650;display:flex;box-shadow:inset 0 1px #fff}.settings .switch input[data-v-88f9bc22]{box-shadow:none;border:none;padding:0}.row[data-v-88f9bc22]{flex-wrap:wrap;gap:8px;display:flex}.plugin-frame[data-v-88f9bc22]{border:0;border-radius:16px;width:100%;min-height:280px}
@@ -1 +0,0 @@
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};
@@ -1,3 +0,0 @@
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};
@@ -1,4 +0,0 @@
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};
@@ -1 +0,0 @@
1
- import{$ as e,mt as t}from"./Empty-CpP5kQHH.js";function n(n){let r=matchMedia(n),i=t(r.matches),a=e=>i.value=e.matches;return r.addEventListener(`change`,a),e(()=>r.removeEventListener(`change`,a)),i}export{n as t};