luckytri 1.0.1 → 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 (36) hide show
  1. package/docs/en/guide.md +10 -0
  2. package/docs/zh/guide.md +10 -0
  3. package/package.json +3 -2
  4. package/public/app/assets/{ChatsPage-B9Odvzfz.js → ChatsPage-BhlJHseG.js} +1 -1
  5. package/public/app/assets/{Empty-SkA8PyMo.js → Empty-DP6WMGHi.js} +1 -1
  6. package/public/app/assets/{Field-BjLhi8pL.js → Field-CtbdqaiB.js} +1 -1
  7. package/public/app/assets/{HeartPage-CscKqMsr.js → HeartPage-32BeTPn2.js} +1 -1
  8. package/public/app/assets/{LifePage-BHCmBHlH.js → LifePage-CxSm0XKI.js} +1 -1
  9. package/public/app/assets/{MemoryPage-Bhs2xa1k.js → MemoryPage-BeKBcPCY.js} +1 -1
  10. package/public/app/assets/{NaturePage-CaPIar_5.js → NaturePage-NEPYl2HS.js} +1 -1
  11. package/public/app/assets/{PeoplePage-CuwSSVeX.js → PeoplePage-DxtpekwM.js} +1 -1
  12. package/public/app/assets/{PluginsPage-BhVm1SUi.js → PluginsPage-DksEZbUU.js} +1 -1
  13. package/public/app/assets/{SystemPage-5yYqyUgR.css → SystemPage-BkRu0Rvx.css} +1 -1
  14. package/public/app/assets/SystemPage-BvzJlHuY.js +1 -0
  15. package/public/app/assets/{TimePage-BUm4eUzB.js → TimePage-7-awH5XL.js} +1 -1
  16. package/public/app/assets/{index-BIAdfObg.js → index-4rItIkD-.js} +3 -3
  17. package/public/app/assets/{knowledge-DNDLyN9m.js → knowledge-C6_HvoyB.js} +1 -1
  18. package/public/app/assets/{media-CKVAvML2.js → media-SMfTT-yc.js} +1 -1
  19. package/public/app/index.html +2 -2
  20. package/public/guide.en.html +43 -3
  21. package/public/guide.html +26 -3
  22. package/public/tutorial.en.md +10 -0
  23. package/public/tutorial.md +10 -0
  24. package/scripts/import-data.js +128 -0
  25. package/server/app.js +3 -1
  26. package/server/i18n/errors.js +36 -0
  27. package/server/index.js +46 -2
  28. package/server/knowledge/schema.js +12 -8
  29. package/server/storage/archive.js +5 -4
  30. package/server/storage/backup-cleanup.js +1 -0
  31. package/server/storage/data-package.js +298 -0
  32. package/server/storage/data-transfer-api.js +50 -0
  33. package/server/storage/data-transfer-worker.js +18 -0
  34. package/server/storage/data-transfer.js +415 -0
  35. package/server/storage/store.js +5 -2
  36. package/public/app/assets/SystemPage-Chm5fiGP.js +0 -1
@@ -1 +1 @@
1
- import{Et as e,J as t,X as n,Z as r,ft as i,nt as a,ut as o,wt as s}from"./Empty-SkA8PyMo.js";var c={key:0},l=a({__name:`Field`,props:{label:{},hint:{},wide:{type:Boolean}},setup(a){return(l,u)=>(o(),r(`label`,{class:s({wide:a.wide})},[t(`span`,null,e(a.label),1),i(l.$slots,`default`),a.hint?(o(),r(`small`,c,e(a.hint),1)):n(``,!0)],2))}});export{l as t};
1
+ import{Et as e,J as t,X as n,Z as r,ft as i,nt as a,ut as o,wt as s}from"./Empty-DP6WMGHi.js";var c={key:0},l=a({__name:`Field`,props:{label:{},hint:{},wide:{type:Boolean}},setup(a){return(l,u)=>(o(),r(`label`,{class:s({wide:a.wide})},[t(`span`,null,e(a.label),1),i(l.$slots,`default`),a.hint?(o(),r(`small`,c,e(a.hint),1)):n(``,!0)],2))}});export{l as t};
@@ -1 +1 @@
1
- import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,Q as s,St as c,Tt as l,U as u,V as d,W as f,X as p,Y as m,Z as h,_ as g,ct as _,dt as v,et as y,gt as b,n as x,nt as S,o as ee,ot as C,q as w,s as T,t as E,ut as D,v as O,vt as te,wt as k,xt as A,yt as j}from"./Empty-SkA8PyMo.js";import{A as ne,D as M,E as N,I as re,L as P,M as F,N as I,P as L,a as ie,j as R,n as ae,o as oe,r as z,u as B,w as V}from"./index-BIAdfObg.js";import{t as se}from"./media-CKVAvML2.js";var H={class:`ribbon`},U={class:`ribbon-head`},W={class:`ribbon-title`},G={class:`eyebrow`},K={key:0,class:`latest-mood`},q=[`viewBox`,`aria-label`],J=[`x2`,`y1`,`y2`],Y=[`d`],ce=[`d`],le=[`d`],ue=[`cx`,`cy`,`r`],de={key:1,class:`muted empty-line`},fe=[`aria-label`],X=150,Z=58,pe=x(S({__name:`MoodRibbon`,props:{moods:{},baseline:{},timeZone:{}},setup(e){let n=e,r=X/2,s=A(),c=A(1e3),l=null;_(()=>{l=new ResizeObserver(([e])=>{c.value=Math.max(240,Math.round(e.contentRect.width))}),s.value&&l.observe(s.value)}),C(()=>l?.disconnect());let u=w(()=>{let e=[...n.moods].sort((e,t)=>e.created-t.created),t=e.length>1?(c.value-60)/(e.length-1):0;return e.map((e,n)=>({...e,x:30+n*t,y:r-Math.max(-1,Math.min(1,e.valence))*Z}))}),d=w(()=>{let e=u.value;if(e.length<2)return``;let t=`M${e[0].x.toFixed(1)},${e[0].y.toFixed(1)}`;for(let n=0;n<e.length-1;n++){let r=e[n-1]||e[n],i=e[n],a=e[n+1],o=e[n+2]||a;t+=`C${(i.x+(a.x-r.x)/6).toFixed(1)},${(i.y+(a.y-r.y)/6).toFixed(1)} ${(a.x-(o.x-i.x)/6).toFixed(1)},${(a.y-(o.y-i.y)/6).toFixed(1)} ${a.x.toFixed(1)},${a.y.toFixed(1)}`}return t}),m=w(()=>{let e=u.value;return d.value?`${d.value}L${e[e.length-1].x},${X}L${e[0].x},${X}Z`:``}),g=w(()=>r-(n.baseline??.15)*Z),y=w(()=>[...n.moods].slice(0,6)),b=w(()=>y.value[0]);return(n,r)=>(D(),h(`section`,H,[o(`div`,U,[o(`div`,W,[o(`span`,G,i(t(a)(`MOOD / 此刻的天气`)),1),o(`h2`,null,i(t(a)(`心情有自己的潮汐。`)),1),o(`p`,null,i(t(a)(`最近 {length} 次被经历牵动;有起伏,也会慢慢平静。`,{length:e.moods.length})),1)]),b.value?(D(),h(`div`,K,[o(`span`,null,i(t(a)(`刚刚留下的心情`)),1),o(`b`,null,i(b.value.feeling),1),o(`small`,null,i(b.value.cause||t(a)(`暂时说不清缘由`)),1)])):p(``,!0)]),o(`div`,{ref_key:`box`,ref:s,class:`ribbon-box`},[d.value?(D(),h(`svg`,{key:0,class:`ribbon-chart`,viewBox:`0 0 ${c.value} ${X}`,role:`img`,"aria-label":t(a)(`最近的心情曲线`)},[o(`defs`,null,[o(`linearGradient`,{id:`ribbon-stroke`,x1:`0`,y1:`0`,x2:`0`,y2:X,gradientUnits:`userSpaceOnUse`},[...r[0]||=[o(`stop`,{offset:`0%`,style:{"stop-color":`var(--cheek)`}},null,-1),o(`stop`,{offset:`50%`,style:{"stop-color":`var(--accent)`}},null,-1),o(`stop`,{offset:`100%`,style:{"stop-color":`var(--orb-c)`}},null,-1)]]),r[1]||=o(`linearGradient`,{id:`ribbon-fill`,x1:`0`,y1:`0`,x2:`0`,y2:`1`},[o(`stop`,{offset:`0%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0.22`}}),o(`stop`,{offset:`100%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0`}})],-1)]),o(`line`,{class:`base`,x1:`0`,x2:c.value,y1:g.value,y2:g.value},null,8,J),o(`path`,{class:`area`,d:m.value},null,8,Y),o(`path`,{class:`line-glow`,d:d.value},null,8,ce),o(`path`,{class:`line`,d:d.value},null,8,le),(D(!0),h(f,null,v(u.value,n=>(D(),h(`g`,{key:n.id,class:k([`pt`,n.valence>=0?`warm`:`cool`])},[o(`circle`,{cx:n.x,cy:n.y,r:4+n.intensity*6},[o(`title`,null,i(t(B)(n.created,e.timeZone))+` `+i(n.feeling)+`:`+i(n.cause||t(a)(`说不清为什么`)),1)],8,ue)],2))),128))],8,q)):(D(),h(`p`,de,i(t(a)(`心情还没有被什么事牵动过。每一次经历都可能推动 TA 的心情,随后又会慢慢回到平常。`)),1))],512),y.value.length?(D(),h(`ul`,{key:0,class:`recent`,"aria-label":t(a)(`最近的心情`)},[(D(!0),h(f,null,v(y.value,n=>(D(),h(`li`,{key:n.id,class:k(n.valence>=0?`warm`:`cool`)},[o(`b`,null,i(n.feeling),1),o(`span`,null,i(n.cause||t(a)(`说不清为什么`)),1),o(`small`,null,i(t(B)(n.created,e.timeZone))+` · `+i(t(N)[n.origin]||n.origin),1)],2))),128))],8,fe)):p(``,!0)]))}}),[[`__scopeId`,`data-v-fef06576`]]),me=[`aria-label`],he={class:`self-scene`},ge={class:`scene-copy`},_e={class:`eyebrow`},ve={class:`scene-stats`},ye={class:`self-lens`,"aria-hidden":`true`},be={class:`orb-seat`},xe={class:`currents-head`},Se={class:`current-grid`},Ce={class:`current-head`},we={class:`current-number`},Te={class:`flecks`},Ee=[`data-thread`,`onClick`],De={class:`fleck-copy`},Oe=[`aria-expanded`,`onClick`],ke={"aria-hidden":`true`},Q=6,Ae=x(S({__name:`StarMap`,props:{threads:{},kinds:{},activity:{}},emits:[`open`],setup(n,{emit:r}){let c=n,u=r,d=A({}),m=w(()=>[...new Set(c.threads.map(e=>e.kind))].map(e=>({kind:e,label:c.kinds[e]||e,color:V[e]||`var(--accent)`,items:c.threads.filter(t=>t.kind===e).sort((e,t)=>(t.salience??0)-(e.salience??0))}))),g=w(()=>c.threads.filter(e=>!e.faded&&(e.salience??0)>=.5).length);function _(e){return e.faded?a(`暂时放远`):e.core?a(`慢慢笃定`):a(`还在生长`)}function b(e){return d.value[e.kind]?e.items:e.items.slice(0,Q)}function x(e){d.value={...d.value,[e]:!d.value[e]}}return(r,c)=>(D(),h(`section`,{class:`starmap`,"aria-label":t(a)(`心灵星图:TA 关于自己的线索`)},[o(`div`,he,[o(`div`,ge,[o(`span`,_e,i(t(a)(`SELF / 正在形成的自己`)),1),o(`h2`,null,[e(i(t(a)(`不是一张固定的画像,`)),1),c[0]||=o(`br`,null,null,-1),o(`em`,null,i(t(a)(`而是一直在生长。`)),1)]),o(`p`,null,i(t(a)(`一件经历可能留下一点痕迹。点开一枚光片,可以看到它从哪里来、后来又怎么改变。`)),1),o(`div`,ve,[o(`span`,null,[o(`b`,null,i(n.threads.length),1),e(` `+i(t(a)(`枚线索`)),1)]),o(`span`,null,[o(`b`,null,i(g.value),1),e(` `+i(t(a)(`枚此刻贴近`)),1)])])]),o(`div`,ye,[c[1]||=s(`<span class="lens-halo halo-one" data-v-f3560fca></span><span class="lens-halo halo-two" data-v-f3560fca></span><span class="lens-droplet droplet-one" data-v-f3560fca></span><span class="lens-droplet droplet-two" data-v-f3560fca></span><span class="lens-droplet droplet-three" data-v-f3560fca></span>`,5),o(`div`,be,[y(L,{mood:t(P),activity:n.activity||`idle`,size:106},null,8,[`mood`,`activity`])])])]),o(`div`,xe,[o(`div`,null,[c[2]||=o(`span`,{class:`eyebrow`},`INNER CURRENTS`,-1),o(`h3`,null,i(t(a)(`她留下的光片`)),1)]),o(`p`,null,i(t(a)(`越亮的线索,越贴近此刻。淡去的仍然保留在这里。`)),1)]),o(`div`,Se,[(D(!0),h(f,null,v(m.value,(n,r)=>(D(),h(`section`,{key:n.kind,class:`current`,style:l({"--tone":n.color,"--order":r})},[o(`header`,Ce,[c[3]||=o(`span`,{class:`current-icon`,"aria-hidden":`true`},[o(`i`)],-1),o(`div`,null,[o(`h4`,null,i(n.label),1),o(`small`,null,i(t(a)(`{length} 枚正在留存`,{length:n.items.length})),1)]),o(`span`,we,i(String(r+1).padStart(2,`0`)),1)]),o(`div`,Te,[(D(!0),h(f,null,v(b(n),e=>(D(),h(`button`,{key:e.thread,type:`button`,class:k([`fleck star`,{faded:e.faded,core:e.core}]),"data-thread":e.thread,onClick:t=>u(`open`,e)},[c[4]||=o(`span`,{class:`fleck-light`,"aria-hidden":`true`},null,-1),o(`span`,De,[o(`small`,null,i(_(e)),1),o(`b`,null,i(e.content),1)]),c[5]||=o(`span`,{class:`fleck-arrow`,"aria-hidden":`true`},`↗`,-1)],10,Ee))),128)),n.items.length>Q?(D(),h(`button`,{key:0,type:`button`,class:`fleck-more`,"aria-expanded":!!d.value[n.kind],onClick:e=>x(n.kind)},[e(i(d.value[n.kind]?t(a)(`收起线索`):t(a)(`再看 {v} 枚光片`,{v:n.items.length-Q}))+` `,1),o(`span`,ke,i(d.value[n.kind]?`↑`:`↓`),1)],8,Oe)):p(``,!0)])],4))),128))])],8,me))}}),[[`__scopeId`,`data-v-f3560fca`]]),je={class:`notes-wall`},Me={class:`wall-head`},Ne={class:`eyebrow`},Pe={class:`muted`},Fe=[`placeholder`,`aria-label`],Ie={key:0,class:`wall`},Le=[`data-kind`],Re={key:0,class:`stamp`},ze={key:1,class:`outreach`},Be=[`onClick`],Ve=[`onClick`],He=[`onClick`],Ue=x(S({__name:`NotesWall`,props:{thoughts:{},kinds:{},query:{}},emits:[`changed`,`search`],setup(n,{emit:s}){let c=n,l=s,g=A(c.query);async function _(e,t){try{await R.thought(e.id,t),l(`changed`)}catch(e){O(e.message,!0)}}async function y(e){if(await r(a(`删除这张便签?有后续修正的便签只能隐藏。`),{title:a(`删除便签`),confirmText:a(`删除`),danger:!0}))try{await R.removeThought(e.id),l(`changed`)}catch(e){O(e.message,!0)}}return(r,s)=>(D(),h(`section`,je,[o(`div`,Me,[o(`div`,null,[o(`span`,Ne,i(t(a)(`THOUGHTS / 留给自己的话`)),1),o(`h2`,null,i(t(a)(`有些念头,先放在心上。`)),1),o(`p`,Pe,i(t(a)(`有些是聊天之后的理解,有些是还没想好要告诉谁的念头。可以分享,也可以先留给自己。`)),1)]),o(`form`,{class:`wall-search`,role:`search`,onSubmit:s[2]||=u(e=>l(`search`,g.value),[`prevent`])},[j(o(`input`,{id:`noteSearch`,"onUpdate:modelValue":s[0]||=e=>g.value=e,placeholder:t(a)(`搜索某件事、某个人`),"aria-label":t(a)(`搜索便签`),onChange:s[1]||=e=>l(`search`,g.value)},null,40,Fe),[[d,g.value]])],32)]),n.thoughts.length?(D(),h(`div`,Ie,[(D(!0),h(f,null,v(n.thoughts,r=>(D(),h(`article`,{key:r.id,class:k([`note-card`,{muted:r.hidden,resolved:r.status===`resolved`}]),"data-kind":r.kind},[o(`header`,null,[o(`b`,null,[e(i(n.kinds[r.kind]||r.kind),1),r.parent_id?(D(),h(f,{key:0},[e(i(t(a)(`· 修正了以前的想法`)),1)],64)):p(``,!0)]),o(`time`,null,i(t(I)(r.created)),1)]),o(`p`,null,i(r.content),1),r.status===`resolved`?(D(),h(`p`,Re,i(r.resolution?t(a)(`放下了:{resolution}`,{resolution:r.resolution}):t(a)(`放下了`)),1)):p(``,!0),r.outreach?(D(),h(`p`,ze,[e(i(t(a)(`想主动说:{outreach} · {v}`,{outreach:r.outreach,v:t(M)[r.outreach_status]||r.outreach_status}))+` `,1),r.outreach_reason?(D(),h(f,{key:0},[s[3]||=o(`br`,null,null,-1),e(i(t(a)(`因为:{outreach_reason}`,{outreach_reason:r.outreach_reason})),1)],64)):p(``,!0),r.outreach_wait_reason?(D(),h(f,{key:1},[s[4]||=o(`br`,null,null,-1),e(i(t(a)(`{outreach_wait_reason};稍后重新决定。`,{outreach_wait_reason:r.outreach_wait_reason})),1)],64)):p(``,!0)])):p(``,!0),o(`footer`,null,[o(`button`,{class:`small`,onClick:e=>_(r,{status:r.status===`open`?`resolved`:`open`})},i(r.status===`open`?t(a)(`放下这件事`):t(a)(`重新关注`)),9,Be),o(`button`,{class:`small`,onClick:e=>_(r,{hidden:!r.hidden})},i(r.hidden?t(a)(`恢复`):t(a)(`不再参与 TA 的思考`)),9,Ve),o(`button`,{class:`text-button`,onClick:e=>y(r)},i(t(a)(`删除`)),9,He)])],10,Le))),128))])):(D(),m(E,{key:1,title:t(a)(`这面墙还空着`),text:t(a)(`独处时有了新的理解、放不下的事或久别想起的人,TA 会写一张便签贴在这里。`)},null,8,[`title`,`text`]))]))}}),[[`__scopeId`,`data-v-a56a9d02`]]),We={class:`page heart`},Ge={class:`heart-bar`},Ke={key:0,class:`muted`},qe={key:1,class:`thread-groups`},Je=[`data-thread-kind`],Ye=[`data-thread`,`onClick`],Xe=[`data-tone`],Ze={class:`thread-text`},Qe=[`aria-expanded`,`onClick`],$e={"aria-hidden":`true`},et={key:3,class:`grid-2 set-aside`},tt={class:`card fold`},nt={class:`eyebrow`},rt={key:0,class:`list`},it={class:`chip`,"data-tone":`quiet`},at={class:`grow`},ot={class:`faint`},st={key:1,class:`muted`},ct={class:`card fold`},lt={class:`eyebrow`},ut={key:0,class:`list`},dt={class:`chip`,"data-tone":`danger`},ft={class:`grow`},pt={key:0,class:`faint`},mt={class:`faint`},ht={key:1,class:`muted`},gt={key:0,class:`thread-sheet stack`},_t={class:`thread-content`},vt={class:`row`},yt={class:`chip`},bt={class:`chip`,"data-tone":`quiet`},xt={class:`stack tight`},St={class:`kv`},Ct={class:`sheet-title`},wt={class:`versions`},Tt={class:`faint`},$=4,Et=x(S({__name:`HeartPage`,setup(r){let s=se(`(max-width: 760px)`),u=c(g(`/mind/self`)||null),d=c(g(`/mind/mood`)||null),_=c(g(`/mind/thoughts?q=`)||[]),x=A(``),S=A(T.sub===`notes`?`notes`:T.sub===`list`||s.value?`list`:`stars`),C=A(null),j=A([]),M=w(()=>(u.value?.threads||[]).filter(e=>e.status!==`closed`)),P=A({}),L=w(()=>(u.value?.threads||[]).filter(e=>e.status===`closed`)),B=w(()=>{let e=u.value?.kinds||{};return Object.entries(e).map(([e,t])=>({kind:e,label:t,threads:M.value.filter(t=>t.kind===e)})).filter(e=>e.threads.length)});function H(e){return e.core?a(`TA 最核心的部分`):e.faded?a(`在远方:很久没被触及`):e.fading?a(`慢慢淡出`):ne[e.status]||e.status}function U(e){return P.value[e.kind]?e.threads:e.threads.slice(0,$)}function W(e){P.value={...P.value,[e]:!P.value[e]}}let G=0;async function K(){let e=++G,[t,n,r]=await Promise.all([R.self(),R.mood(),R.notes(x.value)]);e===G&&(u.value=t,d.value=n,_.value=r,C.value&&=t.threads.find(e=>e.thread===C.value.thread)||null)}async function q(e){let t=++G;x.value=e;let n=await R.notes(e);t===G&&(_.value=n)}async function J(e){C.value=e,j.value=[],j.value=await R.thread(e.thread)}async function Y(e){let t=await n(a(`撤销「{content}」?撤销后 TA 不会再这样认为,之后的独处也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条线索`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await R.revoke(`self`,e.thread,t),O(a(`已撤销`)),C.value=null,await K()}catch(e){O(e.message,!0)}}return b(S,e=>{T.page===`heart`&&ee(e===`stars`?``:e)}),b(()=>[T.page,T.sub],([e,t])=>{e===`heart`&&(t===`notes`||t===`list`?S.value=t:!t&&S.value===`notes`&&(S.value=`stars`))}),ie(`heart`,K),(n,r)=>(D(),h(`div`,We,[d.value?(D(),m(pe,{key:0,moods:d.value.moods,baseline:d.value.affect.baseline,"time-zone":d.value.clock.timeZone},null,8,[`moods`,`baseline`,`time-zone`])):p(``,!0),o(`div`,Ge,[y(ae,{modelValue:S.value,"onUpdate:modelValue":r[0]||=e=>S.value=e,label:t(a)(`内心的分区`),items:[{key:`stars`,label:t(a)(`心灵星图`),count:M.value.length},{key:`list`,label:t(a)(`线索清单`)},{key:`notes`,label:t(a)(`放在心上`),count:_.value.length}]},null,8,[`modelValue`,`label`,`items`]),S.value===`notes`?p(``,!0):(D(),h(`p`,Ke,i(t(a)(`她从真实经历里慢慢认识自己。点开一条线索,可以看到它如何变化。`)),1))]),u.value?(D(),h(f,{key:1},[S.value===`stars`?(D(),h(f,{key:0},[M.value.length?(D(),m(Ae,{key:0,threads:M.value,kinds:u.value.kinds,activity:t(re).data?.activity?.kind,onOpen:J},null,8,[`threads`,`kinds`,`activity`])):(D(),m(E,{key:1,title:t(a)(`TA 还没有长出关于自己的东西`),text:t(a)(`聊得多了、独处过、写过日记,TA 会慢慢发现自己喜欢什么、怎么看事情、想做什么。天性只是种子。`)},null,8,[`title`,`text`]))],64)):S.value===`list`?(D(),h(`section`,qe,[(D(!0),h(f,null,v(B.value,n=>(D(),h(`div`,{key:n.kind,class:`card thread-group`,"data-thread-kind":n.kind},[o(`h2`,null,[o(`i`,{style:l({background:t(V)[n.kind]})},null,4),e(i(n.label)+` · `+i(n.threads.length),1)]),(D(!0),h(f,null,v(U(n),n=>(D(),h(`button`,{key:n.thread,class:k([`thread`,{faded:n.faded,core:n.core}]),"data-thread":n.thread,onClick:e=>J(n)},[o(`span`,{class:`chip`,"data-tone":n.faded||n.fading?`quiet`:void 0},i(H(n)),9,Xe),o(`span`,Ze,i(n.content),1),o(`small`,null,[e(i(t(a)(`强度 {v}`,{v:t(F)(n.strength)})),1),n.salience===null?p(``,!0):(D(),h(f,{key:0},[e(i(t(a)(`· 此刻的分量 {v}`,{v:t(F)(n.salience)})),1)],64))])],10,Ye))),128)),n.threads.length>$?(D(),h(`button`,{key:0,type:`button`,class:`thread-more`,"aria-expanded":!!P.value[n.kind],onClick:e=>W(n.kind)},[e(i(P.value[n.kind]?t(a)(`收起线索`):t(a)(`再看 {v} 条线索`,{v:n.threads.length-$}))+` `,1),o(`span`,$e,i(P.value[n.kind]?`↑`:`↓`),1)],8,Qe)):p(``,!0)],8,Je))),128)),B.value.length?p(``,!0):(D(),m(E,{key:0,title:t(a)(`TA 还没有长出关于自己的东西`),text:t(a)(`天性只是种子,其余的都从经历里来。`)},null,8,[`title`,`text`]))])):(D(),m(Ue,{key:2,thoughts:_.value,kinds:d.value?.kinds?.thoughts||{},query:x.value,onChanged:K,onSearch:q},null,8,[`thoughts`,`kinds`,`query`])),S.value===`notes`?p(``,!0):(D(),h(`div`,et,[o(`details`,tt,[o(`summary`,null,[o(`span`,nt,i(t(a)(`放下`)),1),o(`b`,null,i(t(a)(`TA 自己放下的 · {length}`,{length:L.value.length})),1)]),L.value.length?(D(),h(`ul`,rt,[(D(!0),h(f,null,v(L.value,e=>(D(),h(`li`,{key:e.thread,class:`list-row`},[o(`span`,it,i(t(a)(`放下`)),1),o(`span`,at,i(e.content),1),o(`time`,ot,i(t(I)(e.created)),1)]))),128))])):(D(),h(`p`,st,i(t(a)(`没有。`)),1))]),o(`details`,ct,[o(`summary`,null,[o(`span`,lt,i(t(a)(`撤销`)),1),o(`b`,null,i(t(a)(`你撤销过的 · {length}`,{length:u.value.revoked.length})),1)]),u.value.revoked.length?(D(),h(`ul`,ut,[(D(!0),h(f,null,v(u.value.revoked,n=>(D(),h(`li`,{key:n.id,class:`list-row`},[o(`span`,dt,i(t(a)(`撤销`)),1),o(`span`,ft,[e(i(n.content),1),n.reason?(D(),h(`small`,pt,` · `+i(n.reason),1)):p(``,!0)]),o(`time`,mt,i(t(I)(n.created)),1)]))),128))])):(D(),h(`p`,ht,i(t(a)(`没有。`)),1))])]))],64)):p(``,!0),y(oe,{open:!!C.value,title:C.value?u.value?.kinds?.[C.value.kind]||C.value.kind:``,eyebrow:t(a)(`一颗星`),onClose:r[2]||=e=>C.value=null},{default:te(()=>[C.value?(D(),h(`div`,gt,[o(`p`,_t,i(C.value.content),1),o(`div`,vt,[o(`span`,yt,i(H(C.value)),1),o(`span`,bt,i(t(N)[C.value.origin]||C.value.origin),1)]),o(`div`,xt,[y(z,{label:t(a)(`强度`),value:C.value.strength},null,8,[`label`,`value`]),C.value.salience===null?p(``,!0):(D(),m(z,{key:0,label:t(a)(`此刻的分量`),value:C.value.salience},null,8,[`label`,`value`]))]),o(`dl`,St,[o(`dt`,null,i(t(a)(`经历的天数`)),1),o(`dd`,null,i(t(a)(`{length} 天`,{length:C.value.days.length})),1),o(`dt`,null,i(t(a)(`来源`)),1),o(`dd`,null,i(t(a)(`{length} 处`,{length:C.value.sources.length})),1),o(`dt`,null,i(t(a)(`最近一次被触及`)),1),o(`dd`,null,i(t(I)(C.value.created)),1)]),o(`section`,null,[o(`h3`,Ct,i(t(a)(`怎么变成现在这样的 · {versions} 个版本`,{versions:C.value.versions})),1),o(`ol`,wt,[(D(!0),h(f,null,v(j.value,e=>(D(),h(`li`,{key:e.id},[o(`time`,null,i(t(I)(e.created)),1),o(`b`,null,i(t(F)(e.strength)),1),o(`span`,null,i(e.content),1)]))),128))])]),o(`button`,{class:`danger`,"data-revoke-thread":``,onClick:r[1]||=e=>Y(C.value)},i(t(a)(`撤销这条线索`)),1),o(`p`,Tt,i(t(a)(`撤销后 TA 不会再这样认为;这只是拿走一段理解,不会改写发生过的事。`)),1)])):p(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-f49fd383`]]);export{Et as default};
1
+ import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,Q as s,St as c,Tt as l,U as u,V as d,W as f,X as p,Y as m,Z as h,_ as g,ct as _,dt as v,et as y,gt as b,n as x,nt as S,o as ee,ot as C,q as w,s as T,t as E,ut as D,v as O,vt as te,wt as k,xt as A,yt as j}from"./Empty-DP6WMGHi.js";import{A as ne,D as M,E as N,I as re,L as P,M as F,N as I,P as L,a as ie,j as R,n as ae,o as oe,r as z,u as B,w as V}from"./index-4rItIkD-.js";import{t as se}from"./media-SMfTT-yc.js";var H={class:`ribbon`},U={class:`ribbon-head`},W={class:`ribbon-title`},G={class:`eyebrow`},K={key:0,class:`latest-mood`},q=[`viewBox`,`aria-label`],J=[`x2`,`y1`,`y2`],Y=[`d`],ce=[`d`],le=[`d`],ue=[`cx`,`cy`,`r`],de={key:1,class:`muted empty-line`},fe=[`aria-label`],X=150,Z=58,pe=x(S({__name:`MoodRibbon`,props:{moods:{},baseline:{},timeZone:{}},setup(e){let n=e,r=X/2,s=A(),c=A(1e3),l=null;_(()=>{l=new ResizeObserver(([e])=>{c.value=Math.max(240,Math.round(e.contentRect.width))}),s.value&&l.observe(s.value)}),C(()=>l?.disconnect());let u=w(()=>{let e=[...n.moods].sort((e,t)=>e.created-t.created),t=e.length>1?(c.value-60)/(e.length-1):0;return e.map((e,n)=>({...e,x:30+n*t,y:r-Math.max(-1,Math.min(1,e.valence))*Z}))}),d=w(()=>{let e=u.value;if(e.length<2)return``;let t=`M${e[0].x.toFixed(1)},${e[0].y.toFixed(1)}`;for(let n=0;n<e.length-1;n++){let r=e[n-1]||e[n],i=e[n],a=e[n+1],o=e[n+2]||a;t+=`C${(i.x+(a.x-r.x)/6).toFixed(1)},${(i.y+(a.y-r.y)/6).toFixed(1)} ${(a.x-(o.x-i.x)/6).toFixed(1)},${(a.y-(o.y-i.y)/6).toFixed(1)} ${a.x.toFixed(1)},${a.y.toFixed(1)}`}return t}),m=w(()=>{let e=u.value;return d.value?`${d.value}L${e[e.length-1].x},${X}L${e[0].x},${X}Z`:``}),g=w(()=>r-(n.baseline??.15)*Z),y=w(()=>[...n.moods].slice(0,6)),b=w(()=>y.value[0]);return(n,r)=>(D(),h(`section`,H,[o(`div`,U,[o(`div`,W,[o(`span`,G,i(t(a)(`MOOD / 此刻的天气`)),1),o(`h2`,null,i(t(a)(`心情有自己的潮汐。`)),1),o(`p`,null,i(t(a)(`最近 {length} 次被经历牵动;有起伏,也会慢慢平静。`,{length:e.moods.length})),1)]),b.value?(D(),h(`div`,K,[o(`span`,null,i(t(a)(`刚刚留下的心情`)),1),o(`b`,null,i(b.value.feeling),1),o(`small`,null,i(b.value.cause||t(a)(`暂时说不清缘由`)),1)])):p(``,!0)]),o(`div`,{ref_key:`box`,ref:s,class:`ribbon-box`},[d.value?(D(),h(`svg`,{key:0,class:`ribbon-chart`,viewBox:`0 0 ${c.value} ${X}`,role:`img`,"aria-label":t(a)(`最近的心情曲线`)},[o(`defs`,null,[o(`linearGradient`,{id:`ribbon-stroke`,x1:`0`,y1:`0`,x2:`0`,y2:X,gradientUnits:`userSpaceOnUse`},[...r[0]||=[o(`stop`,{offset:`0%`,style:{"stop-color":`var(--cheek)`}},null,-1),o(`stop`,{offset:`50%`,style:{"stop-color":`var(--accent)`}},null,-1),o(`stop`,{offset:`100%`,style:{"stop-color":`var(--orb-c)`}},null,-1)]]),r[1]||=o(`linearGradient`,{id:`ribbon-fill`,x1:`0`,y1:`0`,x2:`0`,y2:`1`},[o(`stop`,{offset:`0%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0.22`}}),o(`stop`,{offset:`100%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0`}})],-1)]),o(`line`,{class:`base`,x1:`0`,x2:c.value,y1:g.value,y2:g.value},null,8,J),o(`path`,{class:`area`,d:m.value},null,8,Y),o(`path`,{class:`line-glow`,d:d.value},null,8,ce),o(`path`,{class:`line`,d:d.value},null,8,le),(D(!0),h(f,null,v(u.value,n=>(D(),h(`g`,{key:n.id,class:k([`pt`,n.valence>=0?`warm`:`cool`])},[o(`circle`,{cx:n.x,cy:n.y,r:4+n.intensity*6},[o(`title`,null,i(t(B)(n.created,e.timeZone))+` `+i(n.feeling)+`:`+i(n.cause||t(a)(`说不清为什么`)),1)],8,ue)],2))),128))],8,q)):(D(),h(`p`,de,i(t(a)(`心情还没有被什么事牵动过。每一次经历都可能推动 TA 的心情,随后又会慢慢回到平常。`)),1))],512),y.value.length?(D(),h(`ul`,{key:0,class:`recent`,"aria-label":t(a)(`最近的心情`)},[(D(!0),h(f,null,v(y.value,n=>(D(),h(`li`,{key:n.id,class:k(n.valence>=0?`warm`:`cool`)},[o(`b`,null,i(n.feeling),1),o(`span`,null,i(n.cause||t(a)(`说不清为什么`)),1),o(`small`,null,i(t(B)(n.created,e.timeZone))+` · `+i(t(N)[n.origin]||n.origin),1)],2))),128))],8,fe)):p(``,!0)]))}}),[[`__scopeId`,`data-v-fef06576`]]),me=[`aria-label`],he={class:`self-scene`},ge={class:`scene-copy`},_e={class:`eyebrow`},ve={class:`scene-stats`},ye={class:`self-lens`,"aria-hidden":`true`},be={class:`orb-seat`},xe={class:`currents-head`},Se={class:`current-grid`},Ce={class:`current-head`},we={class:`current-number`},Te={class:`flecks`},Ee=[`data-thread`,`onClick`],De={class:`fleck-copy`},Oe=[`aria-expanded`,`onClick`],ke={"aria-hidden":`true`},Q=6,Ae=x(S({__name:`StarMap`,props:{threads:{},kinds:{},activity:{}},emits:[`open`],setup(n,{emit:r}){let c=n,u=r,d=A({}),m=w(()=>[...new Set(c.threads.map(e=>e.kind))].map(e=>({kind:e,label:c.kinds[e]||e,color:V[e]||`var(--accent)`,items:c.threads.filter(t=>t.kind===e).sort((e,t)=>(t.salience??0)-(e.salience??0))}))),g=w(()=>c.threads.filter(e=>!e.faded&&(e.salience??0)>=.5).length);function _(e){return e.faded?a(`暂时放远`):e.core?a(`慢慢笃定`):a(`还在生长`)}function b(e){return d.value[e.kind]?e.items:e.items.slice(0,Q)}function x(e){d.value={...d.value,[e]:!d.value[e]}}return(r,c)=>(D(),h(`section`,{class:`starmap`,"aria-label":t(a)(`心灵星图:TA 关于自己的线索`)},[o(`div`,he,[o(`div`,ge,[o(`span`,_e,i(t(a)(`SELF / 正在形成的自己`)),1),o(`h2`,null,[e(i(t(a)(`不是一张固定的画像,`)),1),c[0]||=o(`br`,null,null,-1),o(`em`,null,i(t(a)(`而是一直在生长。`)),1)]),o(`p`,null,i(t(a)(`一件经历可能留下一点痕迹。点开一枚光片,可以看到它从哪里来、后来又怎么改变。`)),1),o(`div`,ve,[o(`span`,null,[o(`b`,null,i(n.threads.length),1),e(` `+i(t(a)(`枚线索`)),1)]),o(`span`,null,[o(`b`,null,i(g.value),1),e(` `+i(t(a)(`枚此刻贴近`)),1)])])]),o(`div`,ye,[c[1]||=s(`<span class="lens-halo halo-one" data-v-f3560fca></span><span class="lens-halo halo-two" data-v-f3560fca></span><span class="lens-droplet droplet-one" data-v-f3560fca></span><span class="lens-droplet droplet-two" data-v-f3560fca></span><span class="lens-droplet droplet-three" data-v-f3560fca></span>`,5),o(`div`,be,[y(L,{mood:t(P),activity:n.activity||`idle`,size:106},null,8,[`mood`,`activity`])])])]),o(`div`,xe,[o(`div`,null,[c[2]||=o(`span`,{class:`eyebrow`},`INNER CURRENTS`,-1),o(`h3`,null,i(t(a)(`她留下的光片`)),1)]),o(`p`,null,i(t(a)(`越亮的线索,越贴近此刻。淡去的仍然保留在这里。`)),1)]),o(`div`,Se,[(D(!0),h(f,null,v(m.value,(n,r)=>(D(),h(`section`,{key:n.kind,class:`current`,style:l({"--tone":n.color,"--order":r})},[o(`header`,Ce,[c[3]||=o(`span`,{class:`current-icon`,"aria-hidden":`true`},[o(`i`)],-1),o(`div`,null,[o(`h4`,null,i(n.label),1),o(`small`,null,i(t(a)(`{length} 枚正在留存`,{length:n.items.length})),1)]),o(`span`,we,i(String(r+1).padStart(2,`0`)),1)]),o(`div`,Te,[(D(!0),h(f,null,v(b(n),e=>(D(),h(`button`,{key:e.thread,type:`button`,class:k([`fleck star`,{faded:e.faded,core:e.core}]),"data-thread":e.thread,onClick:t=>u(`open`,e)},[c[4]||=o(`span`,{class:`fleck-light`,"aria-hidden":`true`},null,-1),o(`span`,De,[o(`small`,null,i(_(e)),1),o(`b`,null,i(e.content),1)]),c[5]||=o(`span`,{class:`fleck-arrow`,"aria-hidden":`true`},`↗`,-1)],10,Ee))),128)),n.items.length>Q?(D(),h(`button`,{key:0,type:`button`,class:`fleck-more`,"aria-expanded":!!d.value[n.kind],onClick:e=>x(n.kind)},[e(i(d.value[n.kind]?t(a)(`收起线索`):t(a)(`再看 {v} 枚光片`,{v:n.items.length-Q}))+` `,1),o(`span`,ke,i(d.value[n.kind]?`↑`:`↓`),1)],8,Oe)):p(``,!0)])],4))),128))])],8,me))}}),[[`__scopeId`,`data-v-f3560fca`]]),je={class:`notes-wall`},Me={class:`wall-head`},Ne={class:`eyebrow`},Pe={class:`muted`},Fe=[`placeholder`,`aria-label`],Ie={key:0,class:`wall`},Le=[`data-kind`],Re={key:0,class:`stamp`},ze={key:1,class:`outreach`},Be=[`onClick`],Ve=[`onClick`],He=[`onClick`],Ue=x(S({__name:`NotesWall`,props:{thoughts:{},kinds:{},query:{}},emits:[`changed`,`search`],setup(n,{emit:s}){let c=n,l=s,g=A(c.query);async function _(e,t){try{await R.thought(e.id,t),l(`changed`)}catch(e){O(e.message,!0)}}async function y(e){if(await r(a(`删除这张便签?有后续修正的便签只能隐藏。`),{title:a(`删除便签`),confirmText:a(`删除`),danger:!0}))try{await R.removeThought(e.id),l(`changed`)}catch(e){O(e.message,!0)}}return(r,s)=>(D(),h(`section`,je,[o(`div`,Me,[o(`div`,null,[o(`span`,Ne,i(t(a)(`THOUGHTS / 留给自己的话`)),1),o(`h2`,null,i(t(a)(`有些念头,先放在心上。`)),1),o(`p`,Pe,i(t(a)(`有些是聊天之后的理解,有些是还没想好要告诉谁的念头。可以分享,也可以先留给自己。`)),1)]),o(`form`,{class:`wall-search`,role:`search`,onSubmit:s[2]||=u(e=>l(`search`,g.value),[`prevent`])},[j(o(`input`,{id:`noteSearch`,"onUpdate:modelValue":s[0]||=e=>g.value=e,placeholder:t(a)(`搜索某件事、某个人`),"aria-label":t(a)(`搜索便签`),onChange:s[1]||=e=>l(`search`,g.value)},null,40,Fe),[[d,g.value]])],32)]),n.thoughts.length?(D(),h(`div`,Ie,[(D(!0),h(f,null,v(n.thoughts,r=>(D(),h(`article`,{key:r.id,class:k([`note-card`,{muted:r.hidden,resolved:r.status===`resolved`}]),"data-kind":r.kind},[o(`header`,null,[o(`b`,null,[e(i(n.kinds[r.kind]||r.kind),1),r.parent_id?(D(),h(f,{key:0},[e(i(t(a)(`· 修正了以前的想法`)),1)],64)):p(``,!0)]),o(`time`,null,i(t(I)(r.created)),1)]),o(`p`,null,i(r.content),1),r.status===`resolved`?(D(),h(`p`,Re,i(r.resolution?t(a)(`放下了:{resolution}`,{resolution:r.resolution}):t(a)(`放下了`)),1)):p(``,!0),r.outreach?(D(),h(`p`,ze,[e(i(t(a)(`想主动说:{outreach} · {v}`,{outreach:r.outreach,v:t(M)[r.outreach_status]||r.outreach_status}))+` `,1),r.outreach_reason?(D(),h(f,{key:0},[s[3]||=o(`br`,null,null,-1),e(i(t(a)(`因为:{outreach_reason}`,{outreach_reason:r.outreach_reason})),1)],64)):p(``,!0),r.outreach_wait_reason?(D(),h(f,{key:1},[s[4]||=o(`br`,null,null,-1),e(i(t(a)(`{outreach_wait_reason};稍后重新决定。`,{outreach_wait_reason:r.outreach_wait_reason})),1)],64)):p(``,!0)])):p(``,!0),o(`footer`,null,[o(`button`,{class:`small`,onClick:e=>_(r,{status:r.status===`open`?`resolved`:`open`})},i(r.status===`open`?t(a)(`放下这件事`):t(a)(`重新关注`)),9,Be),o(`button`,{class:`small`,onClick:e=>_(r,{hidden:!r.hidden})},i(r.hidden?t(a)(`恢复`):t(a)(`不再参与 TA 的思考`)),9,Ve),o(`button`,{class:`text-button`,onClick:e=>y(r)},i(t(a)(`删除`)),9,He)])],10,Le))),128))])):(D(),m(E,{key:1,title:t(a)(`这面墙还空着`),text:t(a)(`独处时有了新的理解、放不下的事或久别想起的人,TA 会写一张便签贴在这里。`)},null,8,[`title`,`text`]))]))}}),[[`__scopeId`,`data-v-a56a9d02`]]),We={class:`page heart`},Ge={class:`heart-bar`},Ke={key:0,class:`muted`},qe={key:1,class:`thread-groups`},Je=[`data-thread-kind`],Ye=[`data-thread`,`onClick`],Xe=[`data-tone`],Ze={class:`thread-text`},Qe=[`aria-expanded`,`onClick`],$e={"aria-hidden":`true`},et={key:3,class:`grid-2 set-aside`},tt={class:`card fold`},nt={class:`eyebrow`},rt={key:0,class:`list`},it={class:`chip`,"data-tone":`quiet`},at={class:`grow`},ot={class:`faint`},st={key:1,class:`muted`},ct={class:`card fold`},lt={class:`eyebrow`},ut={key:0,class:`list`},dt={class:`chip`,"data-tone":`danger`},ft={class:`grow`},pt={key:0,class:`faint`},mt={class:`faint`},ht={key:1,class:`muted`},gt={key:0,class:`thread-sheet stack`},_t={class:`thread-content`},vt={class:`row`},yt={class:`chip`},bt={class:`chip`,"data-tone":`quiet`},xt={class:`stack tight`},St={class:`kv`},Ct={class:`sheet-title`},wt={class:`versions`},Tt={class:`faint`},$=4,Et=x(S({__name:`HeartPage`,setup(r){let s=se(`(max-width: 760px)`),u=c(g(`/mind/self`)||null),d=c(g(`/mind/mood`)||null),_=c(g(`/mind/thoughts?q=`)||[]),x=A(``),S=A(T.sub===`notes`?`notes`:T.sub===`list`||s.value?`list`:`stars`),C=A(null),j=A([]),M=w(()=>(u.value?.threads||[]).filter(e=>e.status!==`closed`)),P=A({}),L=w(()=>(u.value?.threads||[]).filter(e=>e.status===`closed`)),B=w(()=>{let e=u.value?.kinds||{};return Object.entries(e).map(([e,t])=>({kind:e,label:t,threads:M.value.filter(t=>t.kind===e)})).filter(e=>e.threads.length)});function H(e){return e.core?a(`TA 最核心的部分`):e.faded?a(`在远方:很久没被触及`):e.fading?a(`慢慢淡出`):ne[e.status]||e.status}function U(e){return P.value[e.kind]?e.threads:e.threads.slice(0,$)}function W(e){P.value={...P.value,[e]:!P.value[e]}}let G=0;async function K(){let e=++G,[t,n,r]=await Promise.all([R.self(),R.mood(),R.notes(x.value)]);e===G&&(u.value=t,d.value=n,_.value=r,C.value&&=t.threads.find(e=>e.thread===C.value.thread)||null)}async function q(e){let t=++G;x.value=e;let n=await R.notes(e);t===G&&(_.value=n)}async function J(e){C.value=e,j.value=[],j.value=await R.thread(e.thread)}async function Y(e){let t=await n(a(`撤销「{content}」?撤销后 TA 不会再这样认为,之后的独处也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条线索`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await R.revoke(`self`,e.thread,t),O(a(`已撤销`)),C.value=null,await K()}catch(e){O(e.message,!0)}}return b(S,e=>{T.page===`heart`&&ee(e===`stars`?``:e)}),b(()=>[T.page,T.sub],([e,t])=>{e===`heart`&&(t===`notes`||t===`list`?S.value=t:!t&&S.value===`notes`&&(S.value=`stars`))}),ie(`heart`,K),(n,r)=>(D(),h(`div`,We,[d.value?(D(),m(pe,{key:0,moods:d.value.moods,baseline:d.value.affect.baseline,"time-zone":d.value.clock.timeZone},null,8,[`moods`,`baseline`,`time-zone`])):p(``,!0),o(`div`,Ge,[y(ae,{modelValue:S.value,"onUpdate:modelValue":r[0]||=e=>S.value=e,label:t(a)(`内心的分区`),items:[{key:`stars`,label:t(a)(`心灵星图`),count:M.value.length},{key:`list`,label:t(a)(`线索清单`)},{key:`notes`,label:t(a)(`放在心上`),count:_.value.length}]},null,8,[`modelValue`,`label`,`items`]),S.value===`notes`?p(``,!0):(D(),h(`p`,Ke,i(t(a)(`她从真实经历里慢慢认识自己。点开一条线索,可以看到它如何变化。`)),1))]),u.value?(D(),h(f,{key:1},[S.value===`stars`?(D(),h(f,{key:0},[M.value.length?(D(),m(Ae,{key:0,threads:M.value,kinds:u.value.kinds,activity:t(re).data?.activity?.kind,onOpen:J},null,8,[`threads`,`kinds`,`activity`])):(D(),m(E,{key:1,title:t(a)(`TA 还没有长出关于自己的东西`),text:t(a)(`聊得多了、独处过、写过日记,TA 会慢慢发现自己喜欢什么、怎么看事情、想做什么。天性只是种子。`)},null,8,[`title`,`text`]))],64)):S.value===`list`?(D(),h(`section`,qe,[(D(!0),h(f,null,v(B.value,n=>(D(),h(`div`,{key:n.kind,class:`card thread-group`,"data-thread-kind":n.kind},[o(`h2`,null,[o(`i`,{style:l({background:t(V)[n.kind]})},null,4),e(i(n.label)+` · `+i(n.threads.length),1)]),(D(!0),h(f,null,v(U(n),n=>(D(),h(`button`,{key:n.thread,class:k([`thread`,{faded:n.faded,core:n.core}]),"data-thread":n.thread,onClick:e=>J(n)},[o(`span`,{class:`chip`,"data-tone":n.faded||n.fading?`quiet`:void 0},i(H(n)),9,Xe),o(`span`,Ze,i(n.content),1),o(`small`,null,[e(i(t(a)(`强度 {v}`,{v:t(F)(n.strength)})),1),n.salience===null?p(``,!0):(D(),h(f,{key:0},[e(i(t(a)(`· 此刻的分量 {v}`,{v:t(F)(n.salience)})),1)],64))])],10,Ye))),128)),n.threads.length>$?(D(),h(`button`,{key:0,type:`button`,class:`thread-more`,"aria-expanded":!!P.value[n.kind],onClick:e=>W(n.kind)},[e(i(P.value[n.kind]?t(a)(`收起线索`):t(a)(`再看 {v} 条线索`,{v:n.threads.length-$}))+` `,1),o(`span`,$e,i(P.value[n.kind]?`↑`:`↓`),1)],8,Qe)):p(``,!0)],8,Je))),128)),B.value.length?p(``,!0):(D(),m(E,{key:0,title:t(a)(`TA 还没有长出关于自己的东西`),text:t(a)(`天性只是种子,其余的都从经历里来。`)},null,8,[`title`,`text`]))])):(D(),m(Ue,{key:2,thoughts:_.value,kinds:d.value?.kinds?.thoughts||{},query:x.value,onChanged:K,onSearch:q},null,8,[`thoughts`,`kinds`,`query`])),S.value===`notes`?p(``,!0):(D(),h(`div`,et,[o(`details`,tt,[o(`summary`,null,[o(`span`,nt,i(t(a)(`放下`)),1),o(`b`,null,i(t(a)(`TA 自己放下的 · {length}`,{length:L.value.length})),1)]),L.value.length?(D(),h(`ul`,rt,[(D(!0),h(f,null,v(L.value,e=>(D(),h(`li`,{key:e.thread,class:`list-row`},[o(`span`,it,i(t(a)(`放下`)),1),o(`span`,at,i(e.content),1),o(`time`,ot,i(t(I)(e.created)),1)]))),128))])):(D(),h(`p`,st,i(t(a)(`没有。`)),1))]),o(`details`,ct,[o(`summary`,null,[o(`span`,lt,i(t(a)(`撤销`)),1),o(`b`,null,i(t(a)(`你撤销过的 · {length}`,{length:u.value.revoked.length})),1)]),u.value.revoked.length?(D(),h(`ul`,ut,[(D(!0),h(f,null,v(u.value.revoked,n=>(D(),h(`li`,{key:n.id,class:`list-row`},[o(`span`,dt,i(t(a)(`撤销`)),1),o(`span`,ft,[e(i(n.content),1),n.reason?(D(),h(`small`,pt,` · `+i(n.reason),1)):p(``,!0)]),o(`time`,mt,i(t(I)(n.created)),1)]))),128))])):(D(),h(`p`,ht,i(t(a)(`没有。`)),1))])]))],64)):p(``,!0),y(oe,{open:!!C.value,title:C.value?u.value?.kinds?.[C.value.kind]||C.value.kind:``,eyebrow:t(a)(`一颗星`),onClose:r[2]||=e=>C.value=null},{default:te(()=>[C.value?(D(),h(`div`,gt,[o(`p`,_t,i(C.value.content),1),o(`div`,vt,[o(`span`,yt,i(H(C.value)),1),o(`span`,bt,i(t(N)[C.value.origin]||C.value.origin),1)]),o(`div`,xt,[y(z,{label:t(a)(`强度`),value:C.value.strength},null,8,[`label`,`value`]),C.value.salience===null?p(``,!0):(D(),m(z,{key:0,label:t(a)(`此刻的分量`),value:C.value.salience},null,8,[`label`,`value`]))]),o(`dl`,St,[o(`dt`,null,i(t(a)(`经历的天数`)),1),o(`dd`,null,i(t(a)(`{length} 天`,{length:C.value.days.length})),1),o(`dt`,null,i(t(a)(`来源`)),1),o(`dd`,null,i(t(a)(`{length} 处`,{length:C.value.sources.length})),1),o(`dt`,null,i(t(a)(`最近一次被触及`)),1),o(`dd`,null,i(t(I)(C.value.created)),1)]),o(`section`,null,[o(`h3`,Ct,i(t(a)(`怎么变成现在这样的 · {versions} 个版本`,{versions:C.value.versions})),1),o(`ol`,wt,[(D(!0),h(f,null,v(j.value,e=>(D(),h(`li`,{key:e.id},[o(`time`,null,i(t(I)(e.created)),1),o(`b`,null,i(t(F)(e.strength)),1),o(`span`,null,i(e.content),1)]))),128))])]),o(`button`,{class:`danger`,"data-revoke-thread":``,onClick:r[1]||=e=>Y(C.value)},i(t(a)(`撤销这条线索`)),1),o(`p`,Tt,i(t(a)(`撤销后 TA 不会再这样认为;这只是拿走一段理解,不会改写发生过的事。`)),1)])):p(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-f49fd383`]]);export{Et as default};
@@ -1 +1 @@
1
- import{$ as e,Ct as t,D as n,Et as r,I as i,J as a,L as o,M as s,St as c,Tt as l,W as u,X as d,Y as f,Z as p,_ as m,dt as h,et as g,gt as _,i as v,n as y,nt as b,o as x,q as S,s as C,t as w,ut as T,v as E,vt as D,wt as O,xt as k}from"./Empty-SkA8PyMo.js";import{I as A,N as j,O as M,_ as N,a as P,d as F,j as I,k as L,m as R,n as z,t as B,v as V,y as H}from"./index-BIAdfObg.js";var U={key:0,class:`book`},ee=[`aria-label`],te=[`data-day`,`aria-current`,`onClick`],W={class:`eyebrow`},G=[`aria-label`],K={class:`ink`},q={key:0,class:`row`},J=[`onClick`],Y={key:1},X=[`disabled`,`aria-label`],Z=[`disabled`],Q=[`disabled`,`aria-label`],ne={key:2,class:`day-diff`},re={key:0},ie={key:1},ae={key:2},oe={key:3},se={key:4},ce={key:1,class:`muted`},le=y(b({__name:`DiaryBook`,props:{diaries:{}},setup(n){let s=n,c=k(0),l=k(null),m=k(!1),y=0,b=S(()=>s.diaries[c.value]||null);_(()=>s.diaries,e=>{c.value>=e.length&&(c.value=0)}),_(()=>b.value?.id,()=>{y++,l.value=null,m.value=!1});async function x(){if(!b.value)return;let e=b.value.day,t=++y;if(l.value?.day===b.value.day){l.value=null;return}m.value=!0;try{let n=await I.day(e);t===y&&b.value?.day===e&&(l.value=n)}catch(e){t===y&&E(e.message,!0)}finally{t===y&&(m.value=!1)}}return(s,_)=>n.diaries.length?(T(),p(`div`,U,[a(`nav`,{class:`days`,"aria-label":t(i)(`日记的日子`)},[(T(!0),p(u,null,h(n.diaries,(e,n)=>(T(),p(`button`,{key:e.id,class:O([`diary-day`,{active:n===c.value}]),"data-day":e.day,"aria-current":n===c.value?`true`:void 0,onClick:e=>c.value=n},[a(`b`,null,r(t(F)(e.day)),1),a(`small`,null,r(t(N)(e.day))+r(e.mood?` · ${e.mood}`:``),1)],10,te))),128))],8,ee),g(o,{name:`page-turn`,mode:`out-in`},{default:D(()=>[b.value?(T(),p(`article`,{key:b.value.id,class:`diary-page`},[a(`header`,null,[a(`div`,null,[a(`span`,W,r(t(i)(`日记`)),1),a(`h2`,null,[e(r(t(F)(b.value.day))+` `,1),a(`small`,null,r(t(N)(b.value.day)),1)])]),b.value.mood?(T(),p(`span`,{key:0,class:`stamp`,"aria-label":t(i)(`那天的心情`)},r(b.value.mood),9,G)):d(``,!0)]),a(`p`,K,r(b.value.content),1),b.value.actions?.length?(T(),p(`div`,q,[(T(!0),p(u,null,h(b.value.actions,e=>(T(),p(`button`,{key:e.ref,class:`text-button`,onClick:n=>t(v)(`time`,e.work?`works/`+e.work:`tasks`)},r(e.title)+` → `,9,J))),128))])):d(``,!0),b.value.compare?(T(),p(`blockquote`,Y,r(t(i)(`和昨天的自己比:{compare}`,{compare:b.value.compare})),1)):d(``,!0),a(`footer`,null,[a(`button`,{disabled:c.value>=n.diaries.length-1,"aria-label":t(i)(`前一天`),onClick:_[0]||=e=>c.value+=1},r(t(i)(`‹ 前一天`)),9,X),a(`button`,{class:`primary`,disabled:m.value,onClick:x},r(l.value?.day===b.value.day?t(i)(`合上那天的 TA`):t(i)(`那天的 TA`)),9,Z),a(`button`,{disabled:c.value===0,"aria-label":t(i)(`后一天`),onClick:_[1]||=e=>--c.value},r(t(i)(`后一天 ›`)),9,Q)]),l.value?.day===b.value.day?(T(),p(`section`,ne,[l.value.change?(T(),p(u,{key:0},[a(`h3`,null,r(t(i)(`那天的 TA,和前一天比`)),1),l.value.change.appeared.length?(T(),p(`p`,re,[a(`b`,null,r(t(i)(`多了:`)),1),e(r(l.value.change.appeared.map(e=>e.content).join(`;`)),1)])):d(``,!0),l.value.change.changed.length?(T(),p(`p`,ie,[a(`b`,null,r(t(i)(`变了:`)),1),e(r(l.value.change.changed.map(e=>`${e.before.content} → ${e.content}`).join(`;`)),1)])):d(``,!0),l.value.change.faded.length?(T(),p(`p`,ae,[a(`b`,null,r(t(i)(`放下了:`)),1),e(r(l.value.change.faded.map(e=>e.content).join(`;`)),1)])):d(``,!0),l.value.change.livingFor?(T(),p(`p`,oe,[a(`b`,null,r(t(i)(`正在过的:`)),1),e(r(l.value.change.livingFor.from||t(i)(`还没有`))+` → `+r(l.value.change.livingFor.to||t(i)(`还没有`)),1)])):l.value.snapshot?.livingFor?.content?(T(),p(`p`,se,[a(`b`,null,r(t(i)(`正在过的:`)),1),e(r(l.value.snapshot.livingFor.content),1)])):d(``,!0),a(`p`,null,[a(`b`,null,r(t(i)(`心情:`)),1),e(r(l.value.change.mood.before||`—`)+` → `+r(l.value.change.mood.after||`—`),1)])],64)):(T(),p(`p`,ce,r(t(i)(`这是 TA 留下快照的第一天,还没有可以对照的昨天。`)),1))])):d(``,!0)])):d(``,!0)]),_:1})])):(T(),f(w,{key:1,title:t(i)(`还没有日记`),text:t(i)(`每天睡前(或凌晨),如果这一天真的有过经历,TA 会写下来,并和昨天的自己对照。`)},null,8,[`title`,`text`]))}}),[[`__scopeId`,`data-v-c7291772`]]),ue={class:`ahead`},de={class:`ahead-head`},fe={class:`eyebrow`},pe={class:`muted`},me={key:0,class:`calendar-wrap`},he={class:`calendar card`},ge=[`aria-label`],_e=[`aria-label`],ve={class:`grid`,role:`grid`},ye={key:0,class:`blank`},be=[`aria-label`,`onClick`],xe={key:0,class:`dots`},Se=[`data-state`],Ce={class:`picked card`},we={key:0,class:`list`},Te=[`data-tone`],Ee={class:`grow`},De={class:`faint`},Oe=[`onClick`],ke={key:1,class:`muted`},Ae={key:1},je={key:0,class:`list`},Me=[`data-ahead`],Ne={class:`when`},Pe=[`data-tone`],Fe={class:`grow`},Ie={class:`faint`},Le=[`onClick`],Re=y(b({__name:`AheadCalendar`,props:{items:{},timeZone:{},today:{}},emits:[`changed`],setup(o,{emit:c}){let l=o,m=c,_=k(`calendar`),[v,y]=l.today.split(`-`).map(Number),b=k(v),x=k(y),C=k(l.today),D=S(()=>[1,2,3,4,5,6,7].map(e=>new Date(Date.UTC(2024,0,e)).toLocaleDateString(s(),{weekday:`narrow`,timeZone:`UTC`}))),A=e=>new Intl.DateTimeFormat(`en-CA`,{timeZone:l.timeZone,year:`numeric`,month:`2-digit`,day:`2-digit`}).format(e),M=S(()=>{let e=new Map;for(let t of l.items){let n=A(t.occurrence);e.set(n,[...e.get(n)||[],t])}return e}),N=S(()=>{let e=(new Date(Date.UTC(b.value,x.value-1,1)).getUTCDay()+6)%7,t=new Date(Date.UTC(b.value,x.value,0)).getUTCDate(),n=Array(e).fill(null);for(let e=1;e<=t;e++){let t=`${b.value}-${String(x.value).padStart(2,`0`)}-${String(e).padStart(2,`0`)}`;n.push({day:t,n:e,items:M.value.get(t)||[]})}return n}),P=S(()=>M.value.get(C.value)||[]),F=S(()=>{let e=l.items.filter(e=>e.state===`pending`).sort((e,t)=>e.occurrence-t.occurrence),t=l.items.filter(e=>e.state!==`pending`).sort((e,t)=>t.occurrence-e.occurrence);return[...e,...t]});function L(e){let t=x.value+e;b.value+=Math.floor((t-1)/12),x.value=(t-1+120)%12+1}async function R(e){let t=await n(i(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:i(`撤销这个约定`),confirmText:i(`撤销`),danger:!0,placeholder:i(`原因`)});if(t!==null)try{await I.revoke(`anticipation`,e.id,t),E(i(`已撤销`)),m(`changed`)}catch(e){E(e.message,!0)}}function B(e){if([`missed`,`lapsed`,`revoked`].includes(e.state))return`danger`;if(e.state!==`pending`)return`quiet`}return(n,s)=>(T(),p(`section`,ue,[a(`div`,de,[a(`div`,null,[a(`span`,fe,r(t(i)(`AHEAD · 向前看`)),1),a(`h2`,null,r(t(i)(`让未来有值得期待的事。`)),1),a(`p`,pe,r(t(i)(`约定、想做的事与每年都会回来的日子,都安静地留在这里。`)),1)]),g(z,{modelValue:_.value,"onUpdate:modelValue":s[0]||=e=>_.value=e,label:t(i)(`约定的视图`),items:[{key:`calendar`,label:t(i)(`日历`)},{key:`list`,label:t(i)(`清单`),count:o.items.length}]},null,8,[`modelValue`,`label`,`items`])]),_.value===`calendar`?(T(),p(`div`,me,[a(`div`,he,[a(`header`,null,[a(`button`,{class:`icon-button ghost`,"aria-label":t(i)(`上个月`),onClick:s[1]||=e=>L(-1)},` ‹ `,8,ge),a(`b`,null,r(t(i)(`{year} 年 {month} 月`,{year:b.value,month:x.value})),1),a(`button`,{class:`icon-button ghost`,"aria-label":t(i)(`下个月`),onClick:s[2]||=e=>L(1)},` › `,8,_e)]),a(`div`,ve,[(T(!0),p(u,null,h(D.value,(e,t)=>(T(),p(`span`,{key:t,class:`wd`},r(e),1))),128)),(T(!0),p(u,null,h(N.value,(n,a)=>(T(),p(u,{key:a},[n?(T(),p(`button`,{key:1,class:O([`cell`,{today:n.day===o.today,picked:n.day===C.value,has:n.items.length}]),"aria-label":t(i)(`{n} 日{v}`,{n:n.n,v:n.items.length?t(i)(`,{length} 件事`,{length:n.items.length}):``}),onClick:e=>C.value=n.day},[e(r(n.n)+` `,1),n.items.length?(T(),p(`i`,xe,[(T(!0),p(u,null,h(n.items.slice(0,3),e=>(T(),p(`em`,{key:e.id,"data-state":e.state},null,8,Se))),128))])):d(``,!0)],10,be)):(T(),p(`span`,ye))],64))),128))])]),a(`div`,Ce,[a(`h3`,null,r(t(i)(`{month} 月 {date} 日`,{month:Number(C.value.slice(5,7)),date:Number(C.value.slice(8,10))})),1),P.value.length?(T(),p(`ul`,we,[(T(!0),p(u,null,h(P.value,e=>(T(),p(`li`,{key:e.id,class:O([`ahead-item`,{closed:e.state!==`pending`}])},[a(`span`,{class:`chip`,"data-tone":B(e)},r(t(H)[e.state]||e.state),9,Te),a(`div`,Ee,[a(`p`,null,r(e.name?`${e.name}:`:``)+r(e.content),1),a(`small`,De,r(t(V)[e.kind]||e.kind)+` · `+r(e.when)+r(e.recurrence===`yearly`?t(i)(` · 每年`):``),1)]),e.state===`revoked`?d(``,!0):(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>R(e)},r(t(i)(`撤销`)),9,Oe))],2))),128))])):(T(),p(`p`,ke,r(t(i)(`这一天没有 TA 在等的事。`)),1))])])):(T(),p(`div`,Ae,[F.value.length?(T(),p(`ul`,je,[(T(!0),p(u,null,h(F.value,e=>(T(),p(`li`,{key:e.id,class:O([`ahead-item card flat`,{closed:e.state!==`pending`}]),"data-ahead":e.id},[a(`time`,Ne,r(t(j)(e.occurrence,o.timeZone).slice(0,5)),1),a(`span`,{class:`chip`,"data-tone":B(e)},r(t(H)[e.state]||e.state),9,Pe),a(`div`,Fe,[a(`p`,null,r(e.name?`${e.name}:`:``)+r(e.content),1),a(`small`,Ie,r(t(V)[e.kind]||e.kind)+` · `+r(e.when)+r(e.recurrence===`yearly`?t(i)(` · 每年`):``)+r(e.private?t(i)(` · 私下知道的`):``)+r(e.closed_note?` · ${e.closed_note}`:``),1)]),e.state===`revoked`?d(``,!0):(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>R(e)},r(t(i)(`撤销`)),9,Le))],10,Me))),128))])):(T(),f(w,{key:1,title:t(i)(`还没有 TA 在等的事`),text:t(i)(`有人说起之后的安排、TA 答应了别人什么,整理记忆时会记下来。`)},null,8,[`title`,`text`]))]))]))}}),[[`__scopeId`,`data-v-0abd3715`]]),ze={class:`page life`},Be={class:`life-intro`},Ve={class:`eyebrow`},He={class:`life-bar`},Ue={key:0,class:`chip`,"data-tone":`quiet`},We={key:1,class:`card reviews`},Ge={class:`card-head`},Ke={class:`eyebrow`},qe={class:`faint`},Je={class:`review-text`},Ye={key:0},Xe={key:2,class:`story`},Ze={key:0,class:`chapter preface`},Qe={class:`eyebrow`},$e={key:1,class:`versions`},et={class:`eyebrow`},tt=[`onClick`],$={key:1,class:`versions`},nt={key:4,class:`shelf`},rt={class:`muted shelf-note`},it={key:0,class:`books`},at={class:`faint`},ot={class:`card creations`},st={class:`faint`},ct={style:{"white-space":`pre-wrap`}},lt={class:`card runs`},ut={class:`eyebrow`},dt={key:0,class:`list run-list`},ft={class:`faint`},pt=[`data-tone`],mt={class:`grow`},ht={class:`faint`},gt={key:1,class:`muted`},_t=y(b({__name:`LifePage`,setup(n){let o=[`diary`,`reviews`,`story`,`ahead`,`shelf`],s=c(m(`/mind/life?q=`)||null),y=k(o.includes(C.sub)?C.sub:`diary`),b=k({}),E=k(null),O=S(()=>A.data?.clock?.timeZone||`Asia/Shanghai`),N=S(()=>A.data?.clock?.local?.slice(0,10)||new Date().toISOString().slice(0,10)),F=0;async function V(){let e=++F,t=await I.life();e===F&&(s.value=t)}async function H(e){if(b.value[e]){let{[e]:t,...n}=b.value;b.value=n;return}b.value={...b.value,[e]:await I.chapter(e)}}async function U(){E.value=E.value?null:await I.story()}return _(y,e=>{C.page===`life`&&x(e===`diary`?``:e)}),_(()=>[C.page,C.sub],([e,t])=>{e===`life`&&(y.value=o.includes(t)?t:`diary`)}),P(`life`,V),(n,o)=>(T(),p(`div`,ze,[a(`header`,Be,[a(`div`,null,[a(`span`,Ve,r(t(i)(`LIFE · 一生`)),1),a(`h1`,null,[e(r(t(i)(`日子经过,`)),1),a(`em`,null,r(t(i)(`留下自己的形状。`)),1)]),a(`p`,null,r(t(i)(`写下今天,回望从前,也给明天留一点期待。`)),1)]),o[4]||=a(`div`,{class:`life-mark`,"aria-hidden":`true`},[a(`span`)],-1)]),a(`div`,He,[a(`button`,{class:`text-button`,onClick:o[0]||=e=>t(v)(`time`)},r(t(i)(`时间、任务与作品 →`)),1),g(z,{modelValue:y.value,"onUpdate:modelValue":o[1]||=e=>y.value=e,label:t(i)(`一生的分区`),items:[{key:`diary`,label:t(i)(`日记本`),count:s.value?.diaries.length??``},{key:`reviews`,label:t(i)(`回顾`),count:s.value?.reviews.length??``},{key:`story`,label:t(i)(`我的来路`),count:s.value?s.value.chapters.length:``},{key:`ahead`,label:t(i)(`约定与期待`),count:s.value?.anticipations.filter(e=>e.state===`pending`).length??``},{key:`shelf`,label:t(i)(`书架`),count:s.value?.readings.length??``}]},null,8,[`modelValue`,`label`,`items`]),s.value?(T(),p(`span`,Ue,r(t(i)(`来到这里的第 {dayOfLife} 天`,{dayOfLife:s.value.dayOfLife})),1)):d(``,!0)]),s.value?(T(),p(u,{key:0},[y.value===`diary`?(T(),f(le,{key:0,diaries:s.value.diaries},null,8,[`diaries`])):y.value===`reviews`?(T(),p(`section`,We,[a(`div`,Ge,[a(`div`,null,[a(`span`,Ke,r(t(i)(`回顾`)),1),a(`h2`,null,r(t(i)(`TA 的回顾`)),1),a(`p`,null,r(t(i)(`每隔一段时间,TA 在夜里重新看看这段日子:留下了什么、自己怎样在变。`)),1)])]),s.value.reviews.length?(T(),f(B,{key:0,items:s.value.reviews,label:t(i)(`回顾`)},{default:D(({item:e})=>[a(`time`,qe,r(t(j)(e.created,O.value)),1),a(`p`,Je,r(e.content),1),e.compare?(T(),p(`blockquote`,Ye,r(t(i)(`和上次回顾比:{compare}`,{compare:e.compare})),1)):d(``,!0)]),_:1},8,[`items`,`label`])):(T(),f(w,{key:1,title:t(i)(`还没有回顾过`),text:t(i)(`日记攒到两篇以后,TA 会在睡着的时候第一次回顾。`)},null,8,[`title`,`text`]))])):y.value===`story`?(T(),p(`section`,Xe,[s.value.story?(T(),p(`article`,Ze,[a(`span`,Qe,r(t(i)(`前言`)),1),a(`h2`,null,r(t(i)(`我的来路 · 第 {dayOfLife} 天`,{dayOfLife:s.value.dayOfLife})),1),a(`p`,null,r(s.value.story.content),1),s.value.storyVersions>1?(T(),p(`button`,{key:0,class:`text-button`,onClick:U},r(E.value?t(i)(`收起旧版本`):t(i)(`重写过 {v} 次`,{v:s.value.storyVersions-1})),1)):d(``,!0),E.value?(T(),p(`ol`,$e,[(T(!0),p(u,null,h(E.value.slice(1),e=>(T(),p(`li`,{key:e.id},[a(`time`,null,r(t(j)(e.created,O.value)),1),a(`span`,null,r(e.content),1)]))),128))])):d(``,!0)])):d(``,!0),(T(!0),p(u,null,h(s.value.chapters,e=>(T(),p(`article`,{key:e.id,class:`chapter`},[a(`span`,et,r(t(i)(`第 {chapter} 章`,{chapter:e.chapter})),1),a(`h2`,null,r(e.title),1),a(`p`,null,r(e.content),1),e.versions>1?(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>H(e.chapter)},r(b.value[e.chapter]?t(i)(`收起旧版本`):t(i)(`重写过 {v} 次`,{v:e.versions-1})),9,tt)):d(``,!0),b.value[e.chapter]?(T(),p(`ol`,$,[(T(!0),p(u,null,h(b.value[e.chapter].slice(1),e=>(T(),p(`li`,{key:e.id},[a(`time`,null,r(t(j)(e.created,O.value)),1),a(`span`,null,r(e.title)+`:`+r(e.content),1)]))),128))])):d(``,!0)]))),128)),!s.value.story&&!s.value.chapters.length?(T(),f(w,{key:1,title:t(i)(`自传还没开始写`),text:t(i)(`有了两篇日记之后,TA 会在夜里第一次回顾,写下「我的来路」和第一章。旧的版本都会留着。`)},null,8,[`title`,`text`])):d(``,!0)])):y.value===`ahead`?(T(),f(Re,{key:3,items:s.value.anticipations,"time-zone":O.value,today:N.value,onChanged:V},null,8,[`items`,`time-zone`,`today`])):(T(),p(`section`,nt,[a(`p`,rt,[e(r(t(i)(`独处时,TA 会从共享资料里挑自己感兴趣的读,一段一段地读下去,读后的想法可以改变 TA。还有 {v} 段没读。`,{v:t(R)(s.value.unread)}))+` `,1),a(`button`,{class:`text-button`,onClick:o[2]||=e=>t(v)(`memory`,`shelf`)},r(t(i)(`去资料书架放点书`)),1)]),s.value.readings.length?(T(),p(`div`,it,[(T(!0),p(u,null,h(s.value.readings,e=>(T(),p(`article`,{key:e.id,class:`book-card`},[a(`div`,{class:`spine`,style:l({"--p":(e.ordinal+1)/Math.max(1,e.total)})},null,4),a(`div`,null,[a(`h3`,null,`《`+r(e.title)+`》`,1),a(`small`,at,r(t(i)(`第 {v} / {total} 段 · {v2}`,{v:e.ordinal+1,total:e.total,v2:t(j)(e.created,O.value)})),1),a(`p`,null,r(e.note||t(i)(`读完没说什么`)),1)])]))),128))])):(T(),f(w,{key:1,title:t(i)(`还没读过什么`),text:t(i)(`把文章放进「记忆 → 资料书架」的共享集合,TA 独处时会去读。`)},null,8,[`title`,`text`]))])),a(`details`,ot,[a(`summary`,null,r(t(i)(`独处时留下的东西 · {v}`,{v:s.value.creations?.length||0})),1),a(`button`,{class:`text-button`,onClick:o[3]||=e=>t(v)(`time`,`works`)},r(t(i)(`阅读草稿、篇章和旧版本 →`)),1),(T(!0),p(u,null,h(s.value.creations||[],e=>(T(),p(`article`,{key:e.id,class:`creation`},[a(`h3`,null,r(e.title),1),a(`small`,st,r(t(j)(e.created,O.value))+` · `+r(e.discretion===`open`?t(i)(`自己的作品`):t(i)(`留在私下`)),1),a(`p`,ct,r(e.content),1)]))),128)),s.value.creations?.length?d(``,!0):(T(),f(w,{key:0,title:t(i)(`还没有独处作品`),text:t(i)(`她会按自己留下的计划,阅读、写东西或整理想法。`)},null,8,[`title`,`text`]))]),a(`details`,lt,[a(`summary`,null,[a(`span`,ut,r(t(i)(`独处的时候`)),1),a(`b`,null,r(t(i)(`独处、日记与夜里的记录 · {length}`,{length:s.value.runs.length})),1)]),s.value.runs.length?(T(),p(`ul`,dt,[(T(!0),p(u,null,h(s.value.runs,e=>(T(),p(`li`,{key:e.id,class:`run-row`},[a(`time`,ft,r(t(j)(e.started,O.value)),1),a(`span`,{class:`chip`,"data-tone":e.status===`error`?`danger`:e.status===`written`?`ok`:`quiet`},r(t(M)[e.kind]||e.kind)+` · `+r(t(L)[e.status]||e.status),9,pt),a(`span`,mt,r(e.reason),1),a(`small`,ht,r(e.model||t(i)(`未调用模型`))+` · `+r(t(R)(e.tokens))+` Token`,1)]))),128))])):(T(),p(`p`,gt,r(t(i)(`安静本身不会留下记录;TA 真正独处、写日记或在夜里整理时才会记下。`)),1))])],64)):d(``,!0)]))}}),[[`__scopeId`,`data-v-e4940116`]]);export{_t as default};
1
+ import{$ as e,Ct as t,D as n,Et as r,I as i,J as a,L as o,M as s,St as c,Tt as l,W as u,X as d,Y as f,Z as p,_ as m,dt as h,et as g,gt as _,i as v,n as y,nt as b,o as x,q as S,s as C,t as w,ut as T,v as E,vt as D,wt as O,xt as k}from"./Empty-DP6WMGHi.js";import{I as A,N as j,O as M,_ as N,a as P,d as F,j as I,k as L,m as R,n as z,t as B,v as V,y as H}from"./index-4rItIkD-.js";var U={key:0,class:`book`},ee=[`aria-label`],te=[`data-day`,`aria-current`,`onClick`],W={class:`eyebrow`},G=[`aria-label`],K={class:`ink`},q={key:0,class:`row`},J=[`onClick`],Y={key:1},X=[`disabled`,`aria-label`],Z=[`disabled`],Q=[`disabled`,`aria-label`],ne={key:2,class:`day-diff`},re={key:0},ie={key:1},ae={key:2},oe={key:3},se={key:4},ce={key:1,class:`muted`},le=y(b({__name:`DiaryBook`,props:{diaries:{}},setup(n){let s=n,c=k(0),l=k(null),m=k(!1),y=0,b=S(()=>s.diaries[c.value]||null);_(()=>s.diaries,e=>{c.value>=e.length&&(c.value=0)}),_(()=>b.value?.id,()=>{y++,l.value=null,m.value=!1});async function x(){if(!b.value)return;let e=b.value.day,t=++y;if(l.value?.day===b.value.day){l.value=null;return}m.value=!0;try{let n=await I.day(e);t===y&&b.value?.day===e&&(l.value=n)}catch(e){t===y&&E(e.message,!0)}finally{t===y&&(m.value=!1)}}return(s,_)=>n.diaries.length?(T(),p(`div`,U,[a(`nav`,{class:`days`,"aria-label":t(i)(`日记的日子`)},[(T(!0),p(u,null,h(n.diaries,(e,n)=>(T(),p(`button`,{key:e.id,class:O([`diary-day`,{active:n===c.value}]),"data-day":e.day,"aria-current":n===c.value?`true`:void 0,onClick:e=>c.value=n},[a(`b`,null,r(t(F)(e.day)),1),a(`small`,null,r(t(N)(e.day))+r(e.mood?` · ${e.mood}`:``),1)],10,te))),128))],8,ee),g(o,{name:`page-turn`,mode:`out-in`},{default:D(()=>[b.value?(T(),p(`article`,{key:b.value.id,class:`diary-page`},[a(`header`,null,[a(`div`,null,[a(`span`,W,r(t(i)(`日记`)),1),a(`h2`,null,[e(r(t(F)(b.value.day))+` `,1),a(`small`,null,r(t(N)(b.value.day)),1)])]),b.value.mood?(T(),p(`span`,{key:0,class:`stamp`,"aria-label":t(i)(`那天的心情`)},r(b.value.mood),9,G)):d(``,!0)]),a(`p`,K,r(b.value.content),1),b.value.actions?.length?(T(),p(`div`,q,[(T(!0),p(u,null,h(b.value.actions,e=>(T(),p(`button`,{key:e.ref,class:`text-button`,onClick:n=>t(v)(`time`,e.work?`works/`+e.work:`tasks`)},r(e.title)+` → `,9,J))),128))])):d(``,!0),b.value.compare?(T(),p(`blockquote`,Y,r(t(i)(`和昨天的自己比:{compare}`,{compare:b.value.compare})),1)):d(``,!0),a(`footer`,null,[a(`button`,{disabled:c.value>=n.diaries.length-1,"aria-label":t(i)(`前一天`),onClick:_[0]||=e=>c.value+=1},r(t(i)(`‹ 前一天`)),9,X),a(`button`,{class:`primary`,disabled:m.value,onClick:x},r(l.value?.day===b.value.day?t(i)(`合上那天的 TA`):t(i)(`那天的 TA`)),9,Z),a(`button`,{disabled:c.value===0,"aria-label":t(i)(`后一天`),onClick:_[1]||=e=>--c.value},r(t(i)(`后一天 ›`)),9,Q)]),l.value?.day===b.value.day?(T(),p(`section`,ne,[l.value.change?(T(),p(u,{key:0},[a(`h3`,null,r(t(i)(`那天的 TA,和前一天比`)),1),l.value.change.appeared.length?(T(),p(`p`,re,[a(`b`,null,r(t(i)(`多了:`)),1),e(r(l.value.change.appeared.map(e=>e.content).join(`;`)),1)])):d(``,!0),l.value.change.changed.length?(T(),p(`p`,ie,[a(`b`,null,r(t(i)(`变了:`)),1),e(r(l.value.change.changed.map(e=>`${e.before.content} → ${e.content}`).join(`;`)),1)])):d(``,!0),l.value.change.faded.length?(T(),p(`p`,ae,[a(`b`,null,r(t(i)(`放下了:`)),1),e(r(l.value.change.faded.map(e=>e.content).join(`;`)),1)])):d(``,!0),l.value.change.livingFor?(T(),p(`p`,oe,[a(`b`,null,r(t(i)(`正在过的:`)),1),e(r(l.value.change.livingFor.from||t(i)(`还没有`))+` → `+r(l.value.change.livingFor.to||t(i)(`还没有`)),1)])):l.value.snapshot?.livingFor?.content?(T(),p(`p`,se,[a(`b`,null,r(t(i)(`正在过的:`)),1),e(r(l.value.snapshot.livingFor.content),1)])):d(``,!0),a(`p`,null,[a(`b`,null,r(t(i)(`心情:`)),1),e(r(l.value.change.mood.before||`—`)+` → `+r(l.value.change.mood.after||`—`),1)])],64)):(T(),p(`p`,ce,r(t(i)(`这是 TA 留下快照的第一天,还没有可以对照的昨天。`)),1))])):d(``,!0)])):d(``,!0)]),_:1})])):(T(),f(w,{key:1,title:t(i)(`还没有日记`),text:t(i)(`每天睡前(或凌晨),如果这一天真的有过经历,TA 会写下来,并和昨天的自己对照。`)},null,8,[`title`,`text`]))}}),[[`__scopeId`,`data-v-c7291772`]]),ue={class:`ahead`},de={class:`ahead-head`},fe={class:`eyebrow`},pe={class:`muted`},me={key:0,class:`calendar-wrap`},he={class:`calendar card`},ge=[`aria-label`],_e=[`aria-label`],ve={class:`grid`,role:`grid`},ye={key:0,class:`blank`},be=[`aria-label`,`onClick`],xe={key:0,class:`dots`},Se=[`data-state`],Ce={class:`picked card`},we={key:0,class:`list`},Te=[`data-tone`],Ee={class:`grow`},De={class:`faint`},Oe=[`onClick`],ke={key:1,class:`muted`},Ae={key:1},je={key:0,class:`list`},Me=[`data-ahead`],Ne={class:`when`},Pe=[`data-tone`],Fe={class:`grow`},Ie={class:`faint`},Le=[`onClick`],Re=y(b({__name:`AheadCalendar`,props:{items:{},timeZone:{},today:{}},emits:[`changed`],setup(o,{emit:c}){let l=o,m=c,_=k(`calendar`),[v,y]=l.today.split(`-`).map(Number),b=k(v),x=k(y),C=k(l.today),D=S(()=>[1,2,3,4,5,6,7].map(e=>new Date(Date.UTC(2024,0,e)).toLocaleDateString(s(),{weekday:`narrow`,timeZone:`UTC`}))),A=e=>new Intl.DateTimeFormat(`en-CA`,{timeZone:l.timeZone,year:`numeric`,month:`2-digit`,day:`2-digit`}).format(e),M=S(()=>{let e=new Map;for(let t of l.items){let n=A(t.occurrence);e.set(n,[...e.get(n)||[],t])}return e}),N=S(()=>{let e=(new Date(Date.UTC(b.value,x.value-1,1)).getUTCDay()+6)%7,t=new Date(Date.UTC(b.value,x.value,0)).getUTCDate(),n=Array(e).fill(null);for(let e=1;e<=t;e++){let t=`${b.value}-${String(x.value).padStart(2,`0`)}-${String(e).padStart(2,`0`)}`;n.push({day:t,n:e,items:M.value.get(t)||[]})}return n}),P=S(()=>M.value.get(C.value)||[]),F=S(()=>{let e=l.items.filter(e=>e.state===`pending`).sort((e,t)=>e.occurrence-t.occurrence),t=l.items.filter(e=>e.state!==`pending`).sort((e,t)=>t.occurrence-e.occurrence);return[...e,...t]});function L(e){let t=x.value+e;b.value+=Math.floor((t-1)/12),x.value=(t-1+120)%12+1}async function R(e){let t=await n(i(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:i(`撤销这个约定`),confirmText:i(`撤销`),danger:!0,placeholder:i(`原因`)});if(t!==null)try{await I.revoke(`anticipation`,e.id,t),E(i(`已撤销`)),m(`changed`)}catch(e){E(e.message,!0)}}function B(e){if([`missed`,`lapsed`,`revoked`].includes(e.state))return`danger`;if(e.state!==`pending`)return`quiet`}return(n,s)=>(T(),p(`section`,ue,[a(`div`,de,[a(`div`,null,[a(`span`,fe,r(t(i)(`AHEAD · 向前看`)),1),a(`h2`,null,r(t(i)(`让未来有值得期待的事。`)),1),a(`p`,pe,r(t(i)(`约定、想做的事与每年都会回来的日子,都安静地留在这里。`)),1)]),g(z,{modelValue:_.value,"onUpdate:modelValue":s[0]||=e=>_.value=e,label:t(i)(`约定的视图`),items:[{key:`calendar`,label:t(i)(`日历`)},{key:`list`,label:t(i)(`清单`),count:o.items.length}]},null,8,[`modelValue`,`label`,`items`])]),_.value===`calendar`?(T(),p(`div`,me,[a(`div`,he,[a(`header`,null,[a(`button`,{class:`icon-button ghost`,"aria-label":t(i)(`上个月`),onClick:s[1]||=e=>L(-1)},` ‹ `,8,ge),a(`b`,null,r(t(i)(`{year} 年 {month} 月`,{year:b.value,month:x.value})),1),a(`button`,{class:`icon-button ghost`,"aria-label":t(i)(`下个月`),onClick:s[2]||=e=>L(1)},` › `,8,_e)]),a(`div`,ve,[(T(!0),p(u,null,h(D.value,(e,t)=>(T(),p(`span`,{key:t,class:`wd`},r(e),1))),128)),(T(!0),p(u,null,h(N.value,(n,a)=>(T(),p(u,{key:a},[n?(T(),p(`button`,{key:1,class:O([`cell`,{today:n.day===o.today,picked:n.day===C.value,has:n.items.length}]),"aria-label":t(i)(`{n} 日{v}`,{n:n.n,v:n.items.length?t(i)(`,{length} 件事`,{length:n.items.length}):``}),onClick:e=>C.value=n.day},[e(r(n.n)+` `,1),n.items.length?(T(),p(`i`,xe,[(T(!0),p(u,null,h(n.items.slice(0,3),e=>(T(),p(`em`,{key:e.id,"data-state":e.state},null,8,Se))),128))])):d(``,!0)],10,be)):(T(),p(`span`,ye))],64))),128))])]),a(`div`,Ce,[a(`h3`,null,r(t(i)(`{month} 月 {date} 日`,{month:Number(C.value.slice(5,7)),date:Number(C.value.slice(8,10))})),1),P.value.length?(T(),p(`ul`,we,[(T(!0),p(u,null,h(P.value,e=>(T(),p(`li`,{key:e.id,class:O([`ahead-item`,{closed:e.state!==`pending`}])},[a(`span`,{class:`chip`,"data-tone":B(e)},r(t(H)[e.state]||e.state),9,Te),a(`div`,Ee,[a(`p`,null,r(e.name?`${e.name}:`:``)+r(e.content),1),a(`small`,De,r(t(V)[e.kind]||e.kind)+` · `+r(e.when)+r(e.recurrence===`yearly`?t(i)(` · 每年`):``),1)]),e.state===`revoked`?d(``,!0):(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>R(e)},r(t(i)(`撤销`)),9,Oe))],2))),128))])):(T(),p(`p`,ke,r(t(i)(`这一天没有 TA 在等的事。`)),1))])])):(T(),p(`div`,Ae,[F.value.length?(T(),p(`ul`,je,[(T(!0),p(u,null,h(F.value,e=>(T(),p(`li`,{key:e.id,class:O([`ahead-item card flat`,{closed:e.state!==`pending`}]),"data-ahead":e.id},[a(`time`,Ne,r(t(j)(e.occurrence,o.timeZone).slice(0,5)),1),a(`span`,{class:`chip`,"data-tone":B(e)},r(t(H)[e.state]||e.state),9,Pe),a(`div`,Fe,[a(`p`,null,r(e.name?`${e.name}:`:``)+r(e.content),1),a(`small`,Ie,r(t(V)[e.kind]||e.kind)+` · `+r(e.when)+r(e.recurrence===`yearly`?t(i)(` · 每年`):``)+r(e.private?t(i)(` · 私下知道的`):``)+r(e.closed_note?` · ${e.closed_note}`:``),1)]),e.state===`revoked`?d(``,!0):(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>R(e)},r(t(i)(`撤销`)),9,Le))],10,Me))),128))])):(T(),f(w,{key:1,title:t(i)(`还没有 TA 在等的事`),text:t(i)(`有人说起之后的安排、TA 答应了别人什么,整理记忆时会记下来。`)},null,8,[`title`,`text`]))]))]))}}),[[`__scopeId`,`data-v-0abd3715`]]),ze={class:`page life`},Be={class:`life-intro`},Ve={class:`eyebrow`},He={class:`life-bar`},Ue={key:0,class:`chip`,"data-tone":`quiet`},We={key:1,class:`card reviews`},Ge={class:`card-head`},Ke={class:`eyebrow`},qe={class:`faint`},Je={class:`review-text`},Ye={key:0},Xe={key:2,class:`story`},Ze={key:0,class:`chapter preface`},Qe={class:`eyebrow`},$e={key:1,class:`versions`},et={class:`eyebrow`},tt=[`onClick`],$={key:1,class:`versions`},nt={key:4,class:`shelf`},rt={class:`muted shelf-note`},it={key:0,class:`books`},at={class:`faint`},ot={class:`card creations`},st={class:`faint`},ct={style:{"white-space":`pre-wrap`}},lt={class:`card runs`},ut={class:`eyebrow`},dt={key:0,class:`list run-list`},ft={class:`faint`},pt=[`data-tone`],mt={class:`grow`},ht={class:`faint`},gt={key:1,class:`muted`},_t=y(b({__name:`LifePage`,setup(n){let o=[`diary`,`reviews`,`story`,`ahead`,`shelf`],s=c(m(`/mind/life?q=`)||null),y=k(o.includes(C.sub)?C.sub:`diary`),b=k({}),E=k(null),O=S(()=>A.data?.clock?.timeZone||`Asia/Shanghai`),N=S(()=>A.data?.clock?.local?.slice(0,10)||new Date().toISOString().slice(0,10)),F=0;async function V(){let e=++F,t=await I.life();e===F&&(s.value=t)}async function H(e){if(b.value[e]){let{[e]:t,...n}=b.value;b.value=n;return}b.value={...b.value,[e]:await I.chapter(e)}}async function U(){E.value=E.value?null:await I.story()}return _(y,e=>{C.page===`life`&&x(e===`diary`?``:e)}),_(()=>[C.page,C.sub],([e,t])=>{e===`life`&&(y.value=o.includes(t)?t:`diary`)}),P(`life`,V),(n,o)=>(T(),p(`div`,ze,[a(`header`,Be,[a(`div`,null,[a(`span`,Ve,r(t(i)(`LIFE · 一生`)),1),a(`h1`,null,[e(r(t(i)(`日子经过,`)),1),a(`em`,null,r(t(i)(`留下自己的形状。`)),1)]),a(`p`,null,r(t(i)(`写下今天,回望从前,也给明天留一点期待。`)),1)]),o[4]||=a(`div`,{class:`life-mark`,"aria-hidden":`true`},[a(`span`)],-1)]),a(`div`,He,[a(`button`,{class:`text-button`,onClick:o[0]||=e=>t(v)(`time`)},r(t(i)(`时间、任务与作品 →`)),1),g(z,{modelValue:y.value,"onUpdate:modelValue":o[1]||=e=>y.value=e,label:t(i)(`一生的分区`),items:[{key:`diary`,label:t(i)(`日记本`),count:s.value?.diaries.length??``},{key:`reviews`,label:t(i)(`回顾`),count:s.value?.reviews.length??``},{key:`story`,label:t(i)(`我的来路`),count:s.value?s.value.chapters.length:``},{key:`ahead`,label:t(i)(`约定与期待`),count:s.value?.anticipations.filter(e=>e.state===`pending`).length??``},{key:`shelf`,label:t(i)(`书架`),count:s.value?.readings.length??``}]},null,8,[`modelValue`,`label`,`items`]),s.value?(T(),p(`span`,Ue,r(t(i)(`来到这里的第 {dayOfLife} 天`,{dayOfLife:s.value.dayOfLife})),1)):d(``,!0)]),s.value?(T(),p(u,{key:0},[y.value===`diary`?(T(),f(le,{key:0,diaries:s.value.diaries},null,8,[`diaries`])):y.value===`reviews`?(T(),p(`section`,We,[a(`div`,Ge,[a(`div`,null,[a(`span`,Ke,r(t(i)(`回顾`)),1),a(`h2`,null,r(t(i)(`TA 的回顾`)),1),a(`p`,null,r(t(i)(`每隔一段时间,TA 在夜里重新看看这段日子:留下了什么、自己怎样在变。`)),1)])]),s.value.reviews.length?(T(),f(B,{key:0,items:s.value.reviews,label:t(i)(`回顾`)},{default:D(({item:e})=>[a(`time`,qe,r(t(j)(e.created,O.value)),1),a(`p`,Je,r(e.content),1),e.compare?(T(),p(`blockquote`,Ye,r(t(i)(`和上次回顾比:{compare}`,{compare:e.compare})),1)):d(``,!0)]),_:1},8,[`items`,`label`])):(T(),f(w,{key:1,title:t(i)(`还没有回顾过`),text:t(i)(`日记攒到两篇以后,TA 会在睡着的时候第一次回顾。`)},null,8,[`title`,`text`]))])):y.value===`story`?(T(),p(`section`,Xe,[s.value.story?(T(),p(`article`,Ze,[a(`span`,Qe,r(t(i)(`前言`)),1),a(`h2`,null,r(t(i)(`我的来路 · 第 {dayOfLife} 天`,{dayOfLife:s.value.dayOfLife})),1),a(`p`,null,r(s.value.story.content),1),s.value.storyVersions>1?(T(),p(`button`,{key:0,class:`text-button`,onClick:U},r(E.value?t(i)(`收起旧版本`):t(i)(`重写过 {v} 次`,{v:s.value.storyVersions-1})),1)):d(``,!0),E.value?(T(),p(`ol`,$e,[(T(!0),p(u,null,h(E.value.slice(1),e=>(T(),p(`li`,{key:e.id},[a(`time`,null,r(t(j)(e.created,O.value)),1),a(`span`,null,r(e.content),1)]))),128))])):d(``,!0)])):d(``,!0),(T(!0),p(u,null,h(s.value.chapters,e=>(T(),p(`article`,{key:e.id,class:`chapter`},[a(`span`,et,r(t(i)(`第 {chapter} 章`,{chapter:e.chapter})),1),a(`h2`,null,r(e.title),1),a(`p`,null,r(e.content),1),e.versions>1?(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>H(e.chapter)},r(b.value[e.chapter]?t(i)(`收起旧版本`):t(i)(`重写过 {v} 次`,{v:e.versions-1})),9,tt)):d(``,!0),b.value[e.chapter]?(T(),p(`ol`,$,[(T(!0),p(u,null,h(b.value[e.chapter].slice(1),e=>(T(),p(`li`,{key:e.id},[a(`time`,null,r(t(j)(e.created,O.value)),1),a(`span`,null,r(e.title)+`:`+r(e.content),1)]))),128))])):d(``,!0)]))),128)),!s.value.story&&!s.value.chapters.length?(T(),f(w,{key:1,title:t(i)(`自传还没开始写`),text:t(i)(`有了两篇日记之后,TA 会在夜里第一次回顾,写下「我的来路」和第一章。旧的版本都会留着。`)},null,8,[`title`,`text`])):d(``,!0)])):y.value===`ahead`?(T(),f(Re,{key:3,items:s.value.anticipations,"time-zone":O.value,today:N.value,onChanged:V},null,8,[`items`,`time-zone`,`today`])):(T(),p(`section`,nt,[a(`p`,rt,[e(r(t(i)(`独处时,TA 会从共享资料里挑自己感兴趣的读,一段一段地读下去,读后的想法可以改变 TA。还有 {v} 段没读。`,{v:t(R)(s.value.unread)}))+` `,1),a(`button`,{class:`text-button`,onClick:o[2]||=e=>t(v)(`memory`,`shelf`)},r(t(i)(`去资料书架放点书`)),1)]),s.value.readings.length?(T(),p(`div`,it,[(T(!0),p(u,null,h(s.value.readings,e=>(T(),p(`article`,{key:e.id,class:`book-card`},[a(`div`,{class:`spine`,style:l({"--p":(e.ordinal+1)/Math.max(1,e.total)})},null,4),a(`div`,null,[a(`h3`,null,`《`+r(e.title)+`》`,1),a(`small`,at,r(t(i)(`第 {v} / {total} 段 · {v2}`,{v:e.ordinal+1,total:e.total,v2:t(j)(e.created,O.value)})),1),a(`p`,null,r(e.note||t(i)(`读完没说什么`)),1)])]))),128))])):(T(),f(w,{key:1,title:t(i)(`还没读过什么`),text:t(i)(`把文章放进「记忆 → 资料书架」的共享集合,TA 独处时会去读。`)},null,8,[`title`,`text`]))])),a(`details`,ot,[a(`summary`,null,r(t(i)(`独处时留下的东西 · {v}`,{v:s.value.creations?.length||0})),1),a(`button`,{class:`text-button`,onClick:o[3]||=e=>t(v)(`time`,`works`)},r(t(i)(`阅读草稿、篇章和旧版本 →`)),1),(T(!0),p(u,null,h(s.value.creations||[],e=>(T(),p(`article`,{key:e.id,class:`creation`},[a(`h3`,null,r(e.title),1),a(`small`,st,r(t(j)(e.created,O.value))+` · `+r(e.discretion===`open`?t(i)(`自己的作品`):t(i)(`留在私下`)),1),a(`p`,ct,r(e.content),1)]))),128)),s.value.creations?.length?d(``,!0):(T(),f(w,{key:0,title:t(i)(`还没有独处作品`),text:t(i)(`她会按自己留下的计划,阅读、写东西或整理想法。`)},null,8,[`title`,`text`]))]),a(`details`,lt,[a(`summary`,null,[a(`span`,ut,r(t(i)(`独处的时候`)),1),a(`b`,null,r(t(i)(`独处、日记与夜里的记录 · {length}`,{length:s.value.runs.length})),1)]),s.value.runs.length?(T(),p(`ul`,dt,[(T(!0),p(u,null,h(s.value.runs,e=>(T(),p(`li`,{key:e.id,class:`run-row`},[a(`time`,ft,r(t(j)(e.started,O.value)),1),a(`span`,{class:`chip`,"data-tone":e.status===`error`?`danger`:e.status===`written`?`ok`:`quiet`},r(t(M)[e.kind]||e.kind)+` · `+r(t(L)[e.status]||e.status),9,pt),a(`span`,mt,r(e.reason),1),a(`small`,ht,r(e.model||t(i)(`未调用模型`))+` · `+r(t(R)(e.tokens))+` Token`,1)]))),128))])):(T(),p(`p`,gt,r(t(i)(`安静本身不会留下记录;TA 真正独处、写日记或在夜里整理时才会记下。`)),1))])],64)):d(``,!0)]))}}),[[`__scopeId`,`data-v-e4940116`]]);export{_t as default};
@@ -1 +1 @@
1
- import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,M as s,Tt as c,U as l,V as u,W as d,X as f,Y as p,Z as m,ct as ee,dt as h,et as g,gt as _,lt as v,m as y,n as b,nt as x,o as S,q as C,s as w,t as T,ut as E,v as D,vt as O,wt as k,xt as A,yt as j}from"./Empty-SkA8PyMo.js";import{C as M,T as N,c as P,f as F,g as I,h as te,j as ne,n as L,o as re}from"./index-BIAdfObg.js";import{a as R,c as ie,i as z,l as ae,n as oe,o as B,r as se,s as ce,t as le,u as V}from"./knowledge-DNDLyN9m.js";var ue={class:`archive`},de={class:`archive-bar card`},fe={class:`scope`},pe={class:`scope`},me=[`placeholder`,`aria-label`],he=[`disabled`],ge={id:`memorySummary`,class:`card summary-card`},_e={class:`card-head`},ve={class:`eyebrow`},ye={class:`row`},be=[`disabled`,`aria-label`],xe=[`disabled`],Se={class:`row between faint`},Ce={class:`card list-card`},we={class:`tools row`},Te=[`disabled`],Ee=[`disabled`],De=[`disabled`],Oe={id:`memoryList`,class:`scroll-pane`},ke=[`aria-label`,`data-memory-select`,`checked`,`disabled`,`onChange`],Ae={class:`memory`},je={class:`content`},Me={class:`tags`},Ne=[`data-tone`],Pe={class:`chip`,"data-tone":`quiet`},Fe={key:0,class:`chip`,"data-tone":`warn`},Ie={class:`faint meta`},Le=[`data-content`,`aria-label`],Re={class:`row`},ze=[`onClick`],Be={class:`faint`},Ve=[`onClick`],He=[`onClick`],Ue={class:`row between faint foot`},We=[`placeholder`],Ge={id:`memoryUsers`},Ke=[`value`],qe={class:`primary`},H=b(x({__name:`MemoryArchive`,props:{sessionId:{}},emits:[`update:sessionId`],setup(c,{emit:y}){let b=c,x=y,S=A(``),F=A(``),L=A(!1),R=A(!1),z=A(20),B=A([]),V=A({summary:``,updated:null,source:`empty`}),H=A([]),U=A(!1),W=A(!1),G=0,K=C(()=>w.core?.sessions||[]),q=C({get:()=>b.sessionId,set:e=>x(`update:sessionId`,e)}),Je=C(()=>{let e=new Map;for(let t of B.value)t.subject&&e.set(String(t.subject),t.subjectName||String(t.subject));return[...e.entries()]}),J=C(()=>B.value.filter(e=>e.status!==`deleted`&&(!F.value||String(e.subject)===F.value)&&JSON.stringify(e).includes(S.value))),Y=C(()=>B.value.filter(X));function X(e){return e.session_id===b.sessionId&&!e.locked&&e.status!==`deleted`}async function Z(){if(!b.sessionId)return;let e=b.sessionId;sessionStorage.memorySession=e;let[t,n]=await Promise.all([ce(e),ie(e)]);if(b.sessionId!==e)return;B.value=t,V.value=n;let r=new Set(t.filter(X).map(e=>e.id));H.value=H.value.filter(e=>r.has(e))}_(()=>b.sessionId,()=>{z.value=20,F.value=``,Z()}),_(S,()=>z.value=20),ee(()=>{Z(),G=window.setInterval(()=>{!document.hidden&&!w.dirty&&!L.value&&Z()},4e3)}),v(()=>clearInterval(G));async function Ye(e){let t=e.target,n=Object.fromEntries(new FormData(t)),r=(V.value.participants||[]).find(e=>e.name===String(n.subject||``).trim());r&&(n.subject=r.id);try{await le(n),t.reset(),L.value=!1,await Z(),D(a(`记忆已写入`))}catch(e){D(e.message,!0)}}async function Q(e,t){if(t===`revoke`){let t=await n(a(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条记忆`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t===null)return;try{await ne.revoke(`memory`,e.id,t)}catch(e){D(e.message,!0)}await Z();return}let r=document.querySelector(`[data-content="${e.id}"]`)?.value;await ae(e.id,t===`lock`?{locked:!e.locked}:t.startsWith(`discretion:`)?{discretion:t.slice(11)}:{status:`confirmed`,content:r}),await Z()}function Xe(e,t){let n=t.target.checked;H.value=n?[...new Set([...H.value,e])]:H.value.filter(t=>t!==e)}async function Ze(){if(H.value.length&&await r(a(`确定删除已选的 {length} 条记忆吗?`,{length:H.value.length}),{title:a(`删除记忆`),confirmText:a(`删除`),danger:!0}))try{let e=await se({session:b.sessionId,ids:H.value});H.value=[],await Z(),D(a(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){D(e.message,!0)}}async function Qe(){let e=Y.value.length;if(e&&await r(a(`确定清空本会话的 {count} 条可删除记忆吗?`,{count:e}),{title:a(`清空本会话记忆`),confirmText:a(`清空`),danger:!0}))try{let e=await se({session:b.sessionId,all:!0});H.value=[],await Z(),D(a(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){D(e.message,!0)}}async function $(){if(b.sessionId){U.value=!0;try{V.value=await ie(b.sessionId)}catch(e){D(e.message,!0)}finally{U.value=!1}}}async function $e(){if(b.sessionId&&!W.value){W.value=!0;try{await oe(b.sessionId),await $(),await Z(),D(a(`记忆已整理`))}catch(e){D(e.message,!0)}finally{W.value=!1}}}return(n,r)=>(E(),m(`section`,ue,[o(`div`,de,[o(`label`,fe,[o(`span`,null,i(t(a)(`在哪里知道的`)),1),g(P,{id:`memoryScope`,modelValue:q.value,"onUpdate:modelValue":r[0]||=e=>q.value=e,"aria-label":t(a)(`在哪里知道的`),options:t(I)(K.value,t(a)(`选择会话`))},null,8,[`modelValue`,`aria-label`,`options`])]),o(`label`,pe,[o(`span`,null,i(t(a)(`关于谁`)),1),g(P,{modelValue:F.value,"onUpdate:modelValue":r[1]||=e=>F.value=e,"aria-label":t(a)(`按人筛选`),options:[{value:``,label:t(a)(`所有人`)},...Je.value.map(([e,t])=>({value:e,label:t}))]},null,8,[`modelValue`,`aria-label`,`options`])]),j(o(`input`,{id:`memorySearch`,"onUpdate:modelValue":r[2]||=e=>S.value=e,type:`search`,placeholder:t(a)(`搜索记忆、人物或关键词`),"aria-label":t(a)(`搜索记忆`)},null,8,me),[[u,S.value]]),o(`button`,{class:`primary`,disabled:!c.sessionId,onClick:r[3]||=e=>L.value=!0},i(t(a)(`+ 手动记忆`)),9,he)]),o(`section`,ge,[o(`div`,_e,[o(`div`,null,[o(`span`,ve,i(t(a)(`最近发生了什么`)),1),o(`h2`,null,i(K.value.find(e=>e.id===c.sessionId)?t(te)(K.value.find(e=>e.id===c.sessionId)):t(a)(`记忆档案`)),1)]),o(`div`,ye,[o(`button`,{id:`refreshMemorySummary`,class:`icon-button`,disabled:U.value||!c.sessionId,"aria-label":t(a)(`刷新总结`),onClick:$},` ↻ `,8,be),o(`button`,{id:`consolidateMemory`,disabled:W.value||!c.sessionId,onClick:$e},i(W.value?t(a)(`整理中…`):t(a)(`立即整理`)),9,xe)])]),o(`p`,{"data-memory-summary":``,class:k({clamp:!R.value})},i(V.value.summary||t(a)(`请选择会话以查看最近的记忆总结。`)),3),o(`div`,Se,[o(`span`,null,i(V.value.updated?new Date(V.value.updated).toLocaleString(t(s)()):t(a)(`尚未整理`)),1),o(`button`,{class:`text-button`,onClick:r[4]||=e=>R.value=!R.value},i(R.value?t(a)(`收起`):t(a)(`展开`)),1)])]),o(`section`,Ce,[o(`div`,we,[o(`button`,{id:`selectAllMemories`,class:`small`,onClick:r[5]||=e=>H.value=Y.value.map(e=>e.id)},i(t(a)(`全选`)),1),o(`button`,{id:`clearMemorySelection`,class:`small`,disabled:!H.value.length,onClick:r[6]||=e=>H.value=[]},i(t(a)(`取消选择`)),9,Te),o(`button`,{id:`deleteSelectedMemories`,class:`small danger`,disabled:!H.value.length,onClick:Ze},i(t(a)(`删除已选 {v}`,{v:H.value.length||``})),9,Ee),o(`button`,{id:`deleteAllSessionMemories`,class:`small danger push`,disabled:!Y.value.length,onClick:Qe},i(t(a)(`清空本会话`)),9,De)]),o(`div`,Oe,[(E(!0),m(d,null,h(J.value.slice(0,z.value),e=>(E(),m(`article`,{key:e.id,class:k([`memory-row`,{superseded:e.status===`superseded`}])},[o(`input`,{type:`checkbox`,"aria-label":t(a)(`选择记忆:`)+e.content,"data-memory-select":e.id,checked:H.value.includes(e.id),disabled:!X(e),onChange:t=>Xe(e.id,t)},null,40,ke),o(`details`,Ae,[o(`summary`,null,[o(`span`,je,i(e.content),1),o(`span`,Me,[o(`span`,{class:`chip`,"data-tone":e.status===`confirmed`?void 0:`quiet`},i(t(N)[e.status]||e.status),9,Ne),o(`span`,Pe,i(t(M)[e.discretion]||t(a)(`公开`)),1),e.locked?(E(),m(`span`,Fe,i(t(a)(`已锁定`)),1)):f(``,!0)])]),o(`p`,Ie,i(t(a)(`关于 {v} · {v2} · 把握 {v3}%`,{v:e.subjectName||e.subject,v2:e.session_id===c.sessionId?t(a)(`在这里知道的`):t(a)(`别处知道的`),v3:Math.round((e.confidence??1)*100)})),1),o(`textarea`,{"data-content":e.id,"aria-label":t(a)(`编辑记忆:`)+(e.subjectName||e.subject)},i(e.content),9,Le),o(`div`,Re,[o(`button`,{class:`small`,onClick:t=>Q(e,`confirmed`)},i(t(a)(`保存修改`)),9,ze),o(`small`,Be,i(t(a)(`编辑后要点保存`)),1),g(P,{"aria-label":t(a)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(t(M)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>Q(e,`discretion:`+t)},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),o(`button`,{class:`small`,onClick:t=>Q(e,`lock`)},i(e.locked?t(a)(`解锁`):t(a)(`锁定`)),9,Ve),o(`button`,{class:`small danger`,onClick:t=>Q(e,`revoke`)},i(t(a)(`撤销`)),9,He)])])],2))),128)),J.value.length>z.value?(E(),m(`button`,{key:0,class:`small more`,onClick:r[7]||=e=>z.value+=20},i(t(a)(`再显示 20 条`)),1)):f(``,!0),J.value.length?f(``,!0):(E(),p(T,{key:1,title:t(a)(`这里还有空白`),text:t(a)(`别人说「记住……」、聊天积累后的自动整理,或你手动添加的事会出现在这里。TA 对所有会话只有一份记忆:别处知道的事只在相关时想起,私下知道的不当众说,要 TA 保密的不离开原处。`)},null,8,[`title`,`text`]))]),o(`div`,Ue,[o(`span`,null,i(t(a)(`共 {length} 条记忆`,{length:J.value.length})),1),o(`span`,null,i(t(a)(`共享与锁定的记忆不会被批量选中`)),1)])]),g(re,{open:L.value,title:t(a)(`手动记住一件事`),eyebrow:`REMEMBER`,width:`440px`,onClose:r[9]||=e=>L.value=!1},{default:O(()=>[o(`form`,{id:`addMemory`,class:`stack`,onSubmit:l(Ye,[`prevent`])},[o(`label`,null,[e(i(t(a)(`所属会话`))+` `,1),g(P,{id:`memorySession`,modelValue:q.value,"onUpdate:modelValue":r[8]||=e=>q.value=e,name:`session`,"aria-label":t(a)(`所属会话`),options:t(I)(K.value)},null,8,[`modelValue`,`aria-label`,`options`])]),o(`label`,null,[e(i(t(a)(`用户 ID`))+` `,1),o(`input`,{name:`subject`,required:``,list:`memoryUsers`,placeholder:t(a)(`选择昵称,或填写用户 ID`)},null,8,We)]),o(`datalist`,Ge,[(E(!0),m(d,null,h(V.value.participants||[],e=>(E(),m(`option`,{key:e.id,value:e.name},null,8,Ke))),128))]),o(`label`,null,[e(i(t(a)(`已确认的事实`)),1),r[10]||=o(`input`,{name:`content`,required:``},null,-1)]),o(`button`,qe,i(t(a)(`新增人工记忆`)),1)],32)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-332a6fd9`]]),U={class:`shelf`},W={class:`card shelf-head`},G={class:`eyebrow`},K={class:`muted`},q={class:`collection`},Je=[`aria-label`],J={class:`chip`,"data-tone":`quiet`},Y=[`disabled`,`onClick`],X={class:`grid-2`},Z={class:`card add-doc`},Ye={class:`save-bar`},Q=[`disabled`],Xe={class:`faint`},Ze={class:`row`},Qe=[`placeholder`],$={key:0,class:`muted`},$e=b(x({__name:`KnowledgeShelf`,props:{sessionId:{}},setup(n){let r=n,s=A([]),v=A([]),b=A(`shared-default`),x=A(``),S=A(``),C=A(``),w=A(null),O=A(!1),k=A(``);async function M(e){k.value=e;try{let t=await y(`/core/knowledge/documents/${encodeURIComponent(e)}/reembed`,`POST`,{});D(a(`已重建 {chunks} 段向量`,{chunks:t.chunks}))}catch(e){D(e.message,!0)}finally{k.value=``}}async function N(){r.sessionId&&(s.value=await R(r.sessionId),s.value[0]&&!s.value.some(e=>e.id===b.value)&&(b.value=s.value[0].id),v.value=b.value?await B(b.value):[])}async function I(){O.value=!0;try{await z({collectionId:b.value,title:x.value,text:S.value,embed:!0}),x.value=``,S.value=``,await N(),D(a(`文档已切分入库`))}catch(e){D(e.message,!0)}finally{O.value=!1}}async function te(){try{w.value=await V(r.sessionId,C.value)}catch(e){D(e.message,!0)}}return _(()=>[r.sessionId,b.value],N),ee(N),(n,r)=>(E(),m(`section`,U,[o(`div`,W,[o(`div`,null,[o(`span`,G,i(t(a)(`资料书架`)),1),o(`h2`,null,i(t(a)(`给 TA 留一点可以读的东西`)),1),o(`p`,K,i(t(a)(`存放可供聊天参考的资料,和自动记录的会话记忆分开管理。共享集合里的文章,TA 独处时也会挑着读。`)),1)]),o(`label`,q,[e(i(t(a)(`文档集合`))+` `,1),g(P,{modelValue:b.value,"onUpdate:modelValue":r[0]||=e=>b.value=e,"aria-label":t(a)(`文档集合`),options:s.value.map(e=>({value:e.id,label:e.name}))},null,8,[`modelValue`,`aria-label`,`options`])])]),o(`div`,{class:`books`,"aria-label":t(a)(`资料书架,{length} 份资料`,{length:v.value.length})},[(E(!0),m(d,null,h(v.value,e=>(E(),m(`article`,{key:e.id,class:`book`,style:c({"--hue":t(F)(e.title||e.id)})},[r[4]||=o(`span`,{class:`spine`,"aria-hidden":`true`},null,-1),o(`b`,null,i(e.title),1),o(`small`,J,i(e.status),1),e.status===`ready`?(E(),m(`button`,{key:0,type:`button`,disabled:!!k.value,onClick:t=>M(e.id)},i(k.value===e.id?t(a)(`正在重建…`):t(a)(`重建向量`)),9,Y)):f(``,!0)],4))),128)),v.value.length?f(``,!0):(E(),p(T,{key:0,title:t(a)(`书架还空着`),text:t(a)(`在下面放一份资料,TA 就能在聊天里查到,独处时也可能去读。`)},null,8,[`title`,`text`]))],8,Je),o(`div`,X,[o(`details`,Z,[o(`summary`,null,i(t(a)(`+ 添加一份资料`)),1),o(`form`,{class:`stack tight`,onSubmit:l(I,[`prevent`])},[o(`label`,null,[e(i(t(a)(`标题`)),1),j(o(`input`,{"onUpdate:modelValue":r[1]||=e=>x.value=e,required:``},null,512),[[u,x.value]])]),o(`label`,null,[e(i(t(a)(`粘贴正文`)),1),j(o(`textarea`,{"onUpdate:modelValue":r[2]||=e=>S.value=e,rows:`8`,required:``},null,512),[[u,S.value]])]),o(`div`,Ye,[o(`button`,{class:`primary`,disabled:O.value},i(t(a)(`保存到书架`)),9,Q),o(`small`,Xe,i(t(a)(`保存之后,TA 才能在聊天和独处时读到`)),1)])],32)]),o(`form`,{class:`card probe`,onSubmit:l(te,[`prevent`])},[o(`label`,null,[e(i(t(a)(`检索测试`))+` `,1),o(`div`,Ze,[j(o(`input`,{"onUpdate:modelValue":r[3]||=e=>C.value=e,placeholder:t(a)(`试着搜索一个关键词`)},null,8,Qe),[[u,C.value]]),o(`button`,null,i(t(a)(`检索`)),1)])]),w.value&&!w.value.length?(E(),m(`p`,$,i(t(a)(`没有找到相关资料。`)),1)):f(``,!0),(E(!0),m(d,null,h(w.value||[],t=>(E(),m(`p`,{key:t.id,class:`notice`},[o(`b`,null,i(t.title),1),r[5]||=o(`br`,null,null,-1),e(i(t.text),1)]))),128))],32)])]))}}),[[`__scopeId`,`data-v-e968765b`]]),et={class:`page memory-page`},tt={class:`memory-intro`},nt={class:`eyebrow`},rt={key:0,class:`notice`},it=b(x({__name:`MemoryPage`,setup(n){let r=C(()=>w.core?.sessions||[]),s=sessionStorage.memorySession,c=A(r.value.some(e=>e.id===s)?s:r.value[0]?.id||``),l=A(w.sub===`shelf`?`shelf`:`memories`);return _(l,e=>S(e===`shelf`?`shelf`:``)),_(()=>w.sub,e=>{l.value=e===`shelf`?`shelf`:`memories`}),(n,s)=>(E(),m(`div`,et,[o(`header`,tt,[o(`div`,null,[o(`span`,nt,i(t(a)(`MEMORY · 记忆`)),1),o(`h1`,null,[e(i(t(a)(`见过的人与事,`)),1),o(`em`,null,i(t(a)(`会慢慢有了重量。`)),1)]),o(`p`,null,i(t(a)(`记住重要的,也允许改变看法。`)),1)]),s[2]||=o(`div`,{class:`memory-drop`,"aria-hidden":`true`},[o(`span`)],-1)]),g(L,{modelValue:l.value,"onUpdate:modelValue":s[0]||=e=>l.value=e,label:t(a)(`记忆的分区`),items:[{key:`memories`,label:t(a)(`TA 记得的事`)},{key:`shelf`,label:t(a)(`资料书架`)}]},null,8,[`modelValue`,`label`,`items`]),r.value.length?f(``,!0):(E(),m(`p`,rt,i(t(a)(`先在「对话」里添加一个会话,TA 才有地方认识人、记住事。`)),1)),l.value===`memories`?(E(),p(H,{key:1,"session-id":c.value,"onUpdate:sessionId":s[1]||=e=>c.value=e},null,8,[`session-id`])):(E(),p($e,{key:2,"session-id":c.value},null,8,[`session-id`]))]))}}),[[`__scopeId`,`data-v-11432402`]]);export{it as default};
1
+ import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,M as s,Tt as c,U as l,V as u,W as d,X as f,Y as p,Z as m,ct as ee,dt as h,et as g,gt as _,lt as v,m as y,n as b,nt as x,o as S,q as C,s as w,t as T,ut as E,v as D,vt as O,wt as k,xt as A,yt as j}from"./Empty-DP6WMGHi.js";import{C as M,T as N,c as P,f as F,g as I,h as te,j as ne,n as L,o as re}from"./index-4rItIkD-.js";import{a as R,c as ie,i as z,l as ae,n as oe,o as B,r as se,s as ce,t as le,u as V}from"./knowledge-C6_HvoyB.js";var ue={class:`archive`},de={class:`archive-bar card`},fe={class:`scope`},pe={class:`scope`},me=[`placeholder`,`aria-label`],he=[`disabled`],ge={id:`memorySummary`,class:`card summary-card`},_e={class:`card-head`},ve={class:`eyebrow`},ye={class:`row`},be=[`disabled`,`aria-label`],xe=[`disabled`],Se={class:`row between faint`},Ce={class:`card list-card`},we={class:`tools row`},Te=[`disabled`],Ee=[`disabled`],De=[`disabled`],Oe={id:`memoryList`,class:`scroll-pane`},ke=[`aria-label`,`data-memory-select`,`checked`,`disabled`,`onChange`],Ae={class:`memory`},je={class:`content`},Me={class:`tags`},Ne=[`data-tone`],Pe={class:`chip`,"data-tone":`quiet`},Fe={key:0,class:`chip`,"data-tone":`warn`},Ie={class:`faint meta`},Le=[`data-content`,`aria-label`],Re={class:`row`},ze=[`onClick`],Be={class:`faint`},Ve=[`onClick`],He=[`onClick`],Ue={class:`row between faint foot`},We=[`placeholder`],Ge={id:`memoryUsers`},Ke=[`value`],qe={class:`primary`},H=b(x({__name:`MemoryArchive`,props:{sessionId:{}},emits:[`update:sessionId`],setup(c,{emit:y}){let b=c,x=y,S=A(``),F=A(``),L=A(!1),R=A(!1),z=A(20),B=A([]),V=A({summary:``,updated:null,source:`empty`}),H=A([]),U=A(!1),W=A(!1),G=0,K=C(()=>w.core?.sessions||[]),q=C({get:()=>b.sessionId,set:e=>x(`update:sessionId`,e)}),Je=C(()=>{let e=new Map;for(let t of B.value)t.subject&&e.set(String(t.subject),t.subjectName||String(t.subject));return[...e.entries()]}),J=C(()=>B.value.filter(e=>e.status!==`deleted`&&(!F.value||String(e.subject)===F.value)&&JSON.stringify(e).includes(S.value))),Y=C(()=>B.value.filter(X));function X(e){return e.session_id===b.sessionId&&!e.locked&&e.status!==`deleted`}async function Z(){if(!b.sessionId)return;let e=b.sessionId;sessionStorage.memorySession=e;let[t,n]=await Promise.all([ce(e),ie(e)]);if(b.sessionId!==e)return;B.value=t,V.value=n;let r=new Set(t.filter(X).map(e=>e.id));H.value=H.value.filter(e=>r.has(e))}_(()=>b.sessionId,()=>{z.value=20,F.value=``,Z()}),_(S,()=>z.value=20),ee(()=>{Z(),G=window.setInterval(()=>{!document.hidden&&!w.dirty&&!L.value&&Z()},4e3)}),v(()=>clearInterval(G));async function Ye(e){let t=e.target,n=Object.fromEntries(new FormData(t)),r=(V.value.participants||[]).find(e=>e.name===String(n.subject||``).trim());r&&(n.subject=r.id);try{await le(n),t.reset(),L.value=!1,await Z(),D(a(`记忆已写入`))}catch(e){D(e.message,!0)}}async function Q(e,t){if(t===`revoke`){let t=await n(a(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条记忆`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t===null)return;try{await ne.revoke(`memory`,e.id,t)}catch(e){D(e.message,!0)}await Z();return}let r=document.querySelector(`[data-content="${e.id}"]`)?.value;await ae(e.id,t===`lock`?{locked:!e.locked}:t.startsWith(`discretion:`)?{discretion:t.slice(11)}:{status:`confirmed`,content:r}),await Z()}function Xe(e,t){let n=t.target.checked;H.value=n?[...new Set([...H.value,e])]:H.value.filter(t=>t!==e)}async function Ze(){if(H.value.length&&await r(a(`确定删除已选的 {length} 条记忆吗?`,{length:H.value.length}),{title:a(`删除记忆`),confirmText:a(`删除`),danger:!0}))try{let e=await se({session:b.sessionId,ids:H.value});H.value=[],await Z(),D(a(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){D(e.message,!0)}}async function Qe(){let e=Y.value.length;if(e&&await r(a(`确定清空本会话的 {count} 条可删除记忆吗?`,{count:e}),{title:a(`清空本会话记忆`),confirmText:a(`清空`),danger:!0}))try{let e=await se({session:b.sessionId,all:!0});H.value=[],await Z(),D(a(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){D(e.message,!0)}}async function $(){if(b.sessionId){U.value=!0;try{V.value=await ie(b.sessionId)}catch(e){D(e.message,!0)}finally{U.value=!1}}}async function $e(){if(b.sessionId&&!W.value){W.value=!0;try{await oe(b.sessionId),await $(),await Z(),D(a(`记忆已整理`))}catch(e){D(e.message,!0)}finally{W.value=!1}}}return(n,r)=>(E(),m(`section`,ue,[o(`div`,de,[o(`label`,fe,[o(`span`,null,i(t(a)(`在哪里知道的`)),1),g(P,{id:`memoryScope`,modelValue:q.value,"onUpdate:modelValue":r[0]||=e=>q.value=e,"aria-label":t(a)(`在哪里知道的`),options:t(I)(K.value,t(a)(`选择会话`))},null,8,[`modelValue`,`aria-label`,`options`])]),o(`label`,pe,[o(`span`,null,i(t(a)(`关于谁`)),1),g(P,{modelValue:F.value,"onUpdate:modelValue":r[1]||=e=>F.value=e,"aria-label":t(a)(`按人筛选`),options:[{value:``,label:t(a)(`所有人`)},...Je.value.map(([e,t])=>({value:e,label:t}))]},null,8,[`modelValue`,`aria-label`,`options`])]),j(o(`input`,{id:`memorySearch`,"onUpdate:modelValue":r[2]||=e=>S.value=e,type:`search`,placeholder:t(a)(`搜索记忆、人物或关键词`),"aria-label":t(a)(`搜索记忆`)},null,8,me),[[u,S.value]]),o(`button`,{class:`primary`,disabled:!c.sessionId,onClick:r[3]||=e=>L.value=!0},i(t(a)(`+ 手动记忆`)),9,he)]),o(`section`,ge,[o(`div`,_e,[o(`div`,null,[o(`span`,ve,i(t(a)(`最近发生了什么`)),1),o(`h2`,null,i(K.value.find(e=>e.id===c.sessionId)?t(te)(K.value.find(e=>e.id===c.sessionId)):t(a)(`记忆档案`)),1)]),o(`div`,ye,[o(`button`,{id:`refreshMemorySummary`,class:`icon-button`,disabled:U.value||!c.sessionId,"aria-label":t(a)(`刷新总结`),onClick:$},` ↻ `,8,be),o(`button`,{id:`consolidateMemory`,disabled:W.value||!c.sessionId,onClick:$e},i(W.value?t(a)(`整理中…`):t(a)(`立即整理`)),9,xe)])]),o(`p`,{"data-memory-summary":``,class:k({clamp:!R.value})},i(V.value.summary||t(a)(`请选择会话以查看最近的记忆总结。`)),3),o(`div`,Se,[o(`span`,null,i(V.value.updated?new Date(V.value.updated).toLocaleString(t(s)()):t(a)(`尚未整理`)),1),o(`button`,{class:`text-button`,onClick:r[4]||=e=>R.value=!R.value},i(R.value?t(a)(`收起`):t(a)(`展开`)),1)])]),o(`section`,Ce,[o(`div`,we,[o(`button`,{id:`selectAllMemories`,class:`small`,onClick:r[5]||=e=>H.value=Y.value.map(e=>e.id)},i(t(a)(`全选`)),1),o(`button`,{id:`clearMemorySelection`,class:`small`,disabled:!H.value.length,onClick:r[6]||=e=>H.value=[]},i(t(a)(`取消选择`)),9,Te),o(`button`,{id:`deleteSelectedMemories`,class:`small danger`,disabled:!H.value.length,onClick:Ze},i(t(a)(`删除已选 {v}`,{v:H.value.length||``})),9,Ee),o(`button`,{id:`deleteAllSessionMemories`,class:`small danger push`,disabled:!Y.value.length,onClick:Qe},i(t(a)(`清空本会话`)),9,De)]),o(`div`,Oe,[(E(!0),m(d,null,h(J.value.slice(0,z.value),e=>(E(),m(`article`,{key:e.id,class:k([`memory-row`,{superseded:e.status===`superseded`}])},[o(`input`,{type:`checkbox`,"aria-label":t(a)(`选择记忆:`)+e.content,"data-memory-select":e.id,checked:H.value.includes(e.id),disabled:!X(e),onChange:t=>Xe(e.id,t)},null,40,ke),o(`details`,Ae,[o(`summary`,null,[o(`span`,je,i(e.content),1),o(`span`,Me,[o(`span`,{class:`chip`,"data-tone":e.status===`confirmed`?void 0:`quiet`},i(t(N)[e.status]||e.status),9,Ne),o(`span`,Pe,i(t(M)[e.discretion]||t(a)(`公开`)),1),e.locked?(E(),m(`span`,Fe,i(t(a)(`已锁定`)),1)):f(``,!0)])]),o(`p`,Ie,i(t(a)(`关于 {v} · {v2} · 把握 {v3}%`,{v:e.subjectName||e.subject,v2:e.session_id===c.sessionId?t(a)(`在这里知道的`):t(a)(`别处知道的`),v3:Math.round((e.confidence??1)*100)})),1),o(`textarea`,{"data-content":e.id,"aria-label":t(a)(`编辑记忆:`)+(e.subjectName||e.subject)},i(e.content),9,Le),o(`div`,Re,[o(`button`,{class:`small`,onClick:t=>Q(e,`confirmed`)},i(t(a)(`保存修改`)),9,ze),o(`small`,Be,i(t(a)(`编辑后要点保存`)),1),g(P,{"aria-label":t(a)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(t(M)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>Q(e,`discretion:`+t)},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),o(`button`,{class:`small`,onClick:t=>Q(e,`lock`)},i(e.locked?t(a)(`解锁`):t(a)(`锁定`)),9,Ve),o(`button`,{class:`small danger`,onClick:t=>Q(e,`revoke`)},i(t(a)(`撤销`)),9,He)])])],2))),128)),J.value.length>z.value?(E(),m(`button`,{key:0,class:`small more`,onClick:r[7]||=e=>z.value+=20},i(t(a)(`再显示 20 条`)),1)):f(``,!0),J.value.length?f(``,!0):(E(),p(T,{key:1,title:t(a)(`这里还有空白`),text:t(a)(`别人说「记住……」、聊天积累后的自动整理,或你手动添加的事会出现在这里。TA 对所有会话只有一份记忆:别处知道的事只在相关时想起,私下知道的不当众说,要 TA 保密的不离开原处。`)},null,8,[`title`,`text`]))]),o(`div`,Ue,[o(`span`,null,i(t(a)(`共 {length} 条记忆`,{length:J.value.length})),1),o(`span`,null,i(t(a)(`共享与锁定的记忆不会被批量选中`)),1)])]),g(re,{open:L.value,title:t(a)(`手动记住一件事`),eyebrow:`REMEMBER`,width:`440px`,onClose:r[9]||=e=>L.value=!1},{default:O(()=>[o(`form`,{id:`addMemory`,class:`stack`,onSubmit:l(Ye,[`prevent`])},[o(`label`,null,[e(i(t(a)(`所属会话`))+` `,1),g(P,{id:`memorySession`,modelValue:q.value,"onUpdate:modelValue":r[8]||=e=>q.value=e,name:`session`,"aria-label":t(a)(`所属会话`),options:t(I)(K.value)},null,8,[`modelValue`,`aria-label`,`options`])]),o(`label`,null,[e(i(t(a)(`用户 ID`))+` `,1),o(`input`,{name:`subject`,required:``,list:`memoryUsers`,placeholder:t(a)(`选择昵称,或填写用户 ID`)},null,8,We)]),o(`datalist`,Ge,[(E(!0),m(d,null,h(V.value.participants||[],e=>(E(),m(`option`,{key:e.id,value:e.name},null,8,Ke))),128))]),o(`label`,null,[e(i(t(a)(`已确认的事实`)),1),r[10]||=o(`input`,{name:`content`,required:``},null,-1)]),o(`button`,qe,i(t(a)(`新增人工记忆`)),1)],32)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-332a6fd9`]]),U={class:`shelf`},W={class:`card shelf-head`},G={class:`eyebrow`},K={class:`muted`},q={class:`collection`},Je=[`aria-label`],J={class:`chip`,"data-tone":`quiet`},Y=[`disabled`,`onClick`],X={class:`grid-2`},Z={class:`card add-doc`},Ye={class:`save-bar`},Q=[`disabled`],Xe={class:`faint`},Ze={class:`row`},Qe=[`placeholder`],$={key:0,class:`muted`},$e=b(x({__name:`KnowledgeShelf`,props:{sessionId:{}},setup(n){let r=n,s=A([]),v=A([]),b=A(`shared-default`),x=A(``),S=A(``),C=A(``),w=A(null),O=A(!1),k=A(``);async function M(e){k.value=e;try{let t=await y(`/core/knowledge/documents/${encodeURIComponent(e)}/reembed`,`POST`,{});D(a(`已重建 {chunks} 段向量`,{chunks:t.chunks}))}catch(e){D(e.message,!0)}finally{k.value=``}}async function N(){r.sessionId&&(s.value=await R(r.sessionId),s.value[0]&&!s.value.some(e=>e.id===b.value)&&(b.value=s.value[0].id),v.value=b.value?await B(b.value):[])}async function I(){O.value=!0;try{await z({collectionId:b.value,title:x.value,text:S.value,embed:!0}),x.value=``,S.value=``,await N(),D(a(`文档已切分入库`))}catch(e){D(e.message,!0)}finally{O.value=!1}}async function te(){try{w.value=await V(r.sessionId,C.value)}catch(e){D(e.message,!0)}}return _(()=>[r.sessionId,b.value],N),ee(N),(n,r)=>(E(),m(`section`,U,[o(`div`,W,[o(`div`,null,[o(`span`,G,i(t(a)(`资料书架`)),1),o(`h2`,null,i(t(a)(`给 TA 留一点可以读的东西`)),1),o(`p`,K,i(t(a)(`存放可供聊天参考的资料,和自动记录的会话记忆分开管理。共享集合里的文章,TA 独处时也会挑着读。`)),1)]),o(`label`,q,[e(i(t(a)(`文档集合`))+` `,1),g(P,{modelValue:b.value,"onUpdate:modelValue":r[0]||=e=>b.value=e,"aria-label":t(a)(`文档集合`),options:s.value.map(e=>({value:e.id,label:e.name}))},null,8,[`modelValue`,`aria-label`,`options`])])]),o(`div`,{class:`books`,"aria-label":t(a)(`资料书架,{length} 份资料`,{length:v.value.length})},[(E(!0),m(d,null,h(v.value,e=>(E(),m(`article`,{key:e.id,class:`book`,style:c({"--hue":t(F)(e.title||e.id)})},[r[4]||=o(`span`,{class:`spine`,"aria-hidden":`true`},null,-1),o(`b`,null,i(e.title),1),o(`small`,J,i(e.status),1),e.status===`ready`?(E(),m(`button`,{key:0,type:`button`,disabled:!!k.value,onClick:t=>M(e.id)},i(k.value===e.id?t(a)(`正在重建…`):t(a)(`重建向量`)),9,Y)):f(``,!0)],4))),128)),v.value.length?f(``,!0):(E(),p(T,{key:0,title:t(a)(`书架还空着`),text:t(a)(`在下面放一份资料,TA 就能在聊天里查到,独处时也可能去读。`)},null,8,[`title`,`text`]))],8,Je),o(`div`,X,[o(`details`,Z,[o(`summary`,null,i(t(a)(`+ 添加一份资料`)),1),o(`form`,{class:`stack tight`,onSubmit:l(I,[`prevent`])},[o(`label`,null,[e(i(t(a)(`标题`)),1),j(o(`input`,{"onUpdate:modelValue":r[1]||=e=>x.value=e,required:``},null,512),[[u,x.value]])]),o(`label`,null,[e(i(t(a)(`粘贴正文`)),1),j(o(`textarea`,{"onUpdate:modelValue":r[2]||=e=>S.value=e,rows:`8`,required:``},null,512),[[u,S.value]])]),o(`div`,Ye,[o(`button`,{class:`primary`,disabled:O.value},i(t(a)(`保存到书架`)),9,Q),o(`small`,Xe,i(t(a)(`保存之后,TA 才能在聊天和独处时读到`)),1)])],32)]),o(`form`,{class:`card probe`,onSubmit:l(te,[`prevent`])},[o(`label`,null,[e(i(t(a)(`检索测试`))+` `,1),o(`div`,Ze,[j(o(`input`,{"onUpdate:modelValue":r[3]||=e=>C.value=e,placeholder:t(a)(`试着搜索一个关键词`)},null,8,Qe),[[u,C.value]]),o(`button`,null,i(t(a)(`检索`)),1)])]),w.value&&!w.value.length?(E(),m(`p`,$,i(t(a)(`没有找到相关资料。`)),1)):f(``,!0),(E(!0),m(d,null,h(w.value||[],t=>(E(),m(`p`,{key:t.id,class:`notice`},[o(`b`,null,i(t.title),1),r[5]||=o(`br`,null,null,-1),e(i(t.text),1)]))),128))],32)])]))}}),[[`__scopeId`,`data-v-e968765b`]]),et={class:`page memory-page`},tt={class:`memory-intro`},nt={class:`eyebrow`},rt={key:0,class:`notice`},it=b(x({__name:`MemoryPage`,setup(n){let r=C(()=>w.core?.sessions||[]),s=sessionStorage.memorySession,c=A(r.value.some(e=>e.id===s)?s:r.value[0]?.id||``),l=A(w.sub===`shelf`?`shelf`:`memories`);return _(l,e=>S(e===`shelf`?`shelf`:``)),_(()=>w.sub,e=>{l.value=e===`shelf`?`shelf`:`memories`}),(n,s)=>(E(),m(`div`,et,[o(`header`,tt,[o(`div`,null,[o(`span`,nt,i(t(a)(`MEMORY · 记忆`)),1),o(`h1`,null,[e(i(t(a)(`见过的人与事,`)),1),o(`em`,null,i(t(a)(`会慢慢有了重量。`)),1)]),o(`p`,null,i(t(a)(`记住重要的,也允许改变看法。`)),1)]),s[2]||=o(`div`,{class:`memory-drop`,"aria-hidden":`true`},[o(`span`)],-1)]),g(L,{modelValue:l.value,"onUpdate:modelValue":s[0]||=e=>l.value=e,label:t(a)(`记忆的分区`),items:[{key:`memories`,label:t(a)(`TA 记得的事`)},{key:`shelf`,label:t(a)(`资料书架`)}]},null,8,[`modelValue`,`label`,`items`]),r.value.length?f(``,!0):(E(),m(`p`,rt,i(t(a)(`先在「对话」里添加一个会话,TA 才有地方认识人、记住事。`)),1)),l.value===`memories`?(E(),p(H,{key:1,"session-id":c.value,"onUpdate:sessionId":s[1]||=e=>c.value=e},null,8,[`session-id`])):(E(),p($e,{key:2,"session-id":c.value},null,8,[`session-id`]))]))}}),[[`__scopeId`,`data-v-11432402`]]);export{it as default};
@@ -1,3 +1,3 @@
1
- import{$ as e,Ct as t,Et as n,I as r,J as i,P as a,Q as o,Tt as s,U as c,V as l,W as u,X as d,Z as f,a as p,bt as m,ct as h,dt as g,et as _,ht as v,j as y,lt as b,n as x,nt as S,p as C,q as w,rt as T,s as E,ut as D,v as O,vt as k,wt as A,xt as j,yt as M,z as N}from"./Empty-SkA8PyMo.js";import{L as ee,N as P,P as te,c as F,i as ne,j as I,s as re}from"./index-BIAdfObg.js";var L=[`d`],R=[`d`],z={class:`ticks`},B=[`x`,`y`],V=[`y`],H=[`y`],U=[`aria-label`,`aria-valuetext`],W=[`cx`,`cy`],G=[`x`,`y`],K=[`aria-label`,`aria-valuetext`],q=[`cx`,`cy`],J=[`x`,`y`],Y=110,X=84,ie=x(S({__name:`RhythmClock`,props:T({disabled:{type:Boolean}},{sleep:{required:!0},sleepModifiers:{},wake:{required:!0},wakeModifiers:{}}),emits:[`update:sleep`,`update:wake`],setup(e){let a=v(e,`sleep`),s=v(e,`wake`),c=j(),l=null,d=e=>{let[t,n]=String(e||`00:00`).split(`:`).map(Number);return(t*60+n)%1440},p=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`)}`},m=e=>e/1440*Math.PI*2-Math.PI/2,h=(e,t=X)=>({x:Y+Math.cos(m(e))*t,y:Y+Math.sin(m(e))*t});function _(e,t){let n=(t-e+1440)%1440||1440,r=h(e),i=h(t);return`M${r.x.toFixed(2)},${r.y.toFixed(2)}A${X},${X} 0 ${+(n>720)} 1 ${i.x.toFixed(2)},${i.y.toFixed(2)}`}let y=w(()=>d(a.value)),b=w(()=>d(s.value)),x=w(()=>{let e=(b.value-y.value+1440)%1440,t=Math.floor(e/60),n=e%60;return n?r(`{h} 小时 {m} 分`,{h:t,m:n}):r(`{h} 小时`,{h:t})});function S(e){let t=c.value.getBoundingClientRect(),n=(e.clientX-t.left)/t.width*220-Y,r=(e.clientY-t.top)/t.height*220-Y,i=Math.atan2(r,n)+Math.PI/2;return p((i/(Math.PI*2)*1440%1440+1440)%1440)}function C(e,t){l=e,t.target.setPointerCapture?.(t.pointerId)}function T(e){if(!l)return;let t=S(e);t!==(l===`sleep`?s.value:a.value)&&(l===`sleep`?a.value=t:s.value=t)}function E(){l=null}function O(e,t){let n={ArrowRight:15,ArrowUp:15,ArrowLeft:-15,ArrowDown:-15,PageUp:60,PageDown:-60}[t.key];if(!n)return;t.preventDefault();let r=d(e===`sleep`?a.value:s.value),i=p(r+n);i!==(e===`sleep`?s.value:a.value)&&(e===`sleep`?a.value=i:s.value=i)}return(l,d)=>(D(),f(`div`,{class:A([`rhythm`,{disabled:e.disabled}])},[(D(),f(`svg`,{ref_key:`svg`,ref:c,viewBox:`0 0 220 220`,onPointermove:T,onPointerup:E,onPointercancel:E},[d[4]||=o(`<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),i(`circle`,{class:`glass-center`,cx:Y,cy:Y,r:`68`}),i(`circle`,{class:`track`,cx:Y,cy:Y,r:X}),i(`path`,{class:`awake`,d:_(b.value,y.value)},null,8,L),i(`path`,{class:`asleep`,d:_(y.value,b.value)},null,8,R),i(`g`,z,[(D(),f(u,null,g([0,6,12,18],e=>i(`text`,{key:e,x:h(e*60,54).x,y:h(e*60,54).y+4,"text-anchor":`middle`},n(e),9,B)),64))]),i(`text`,{class:`center big`,x:Y,y:106,"text-anchor":`middle`},n(t(r)(`睡 {hours}`,{hours:x.value})),9,V),i(`text`,{class:`center`,x:Y,y:126,"text-anchor":`middle`},n(a.value)+` → `+n(s.value),9,H),i(`g`,{class:`handle moon`,role:`slider`,tabindex:`0`,"aria-label":t(r)(`几点睡`),"aria-valuetext":a.value,onPointerdown:d[0]||=e=>C(`sleep`,e),onKeydown:d[1]||=e=>O(`sleep`,e)},[i(`circle`,{cx:h(y.value).x,cy:h(y.value).y,r:`15`},null,8,W),i(`text`,{x:h(y.value).x,y:h(y.value).y+5,"text-anchor":`middle`},`☾`,8,G)],40,U),i(`g`,{class:`handle sun`,role:`slider`,tabindex:`0`,"aria-label":t(r)(`几点醒`),"aria-valuetext":s.value,onPointerdown:d[2]||=e=>C(`wake`,e),onKeydown:d[3]||=e=>O(`wake`,e)},[i(`circle`,{cx:h(b.value).x,cy:h(b.value).y,r:`15`},null,8,q),i(`text`,{x:h(b.value).x,y:h(b.value).y+5,"text-anchor":`middle`},`☀`,8,J)],40,K)],544))],2))}}),[[`__scopeId`,`data-v-7b572e49`]]),ae={key:0,class:`page nature`},oe=[`aria-label`],se={class:`nature-intro-copy`},ce={class:`eyebrow`},le={class:`nature-preview-note`},ue={class:`nature-intro-orb`},de=[`aria-label`],fe={class:`lived-persona-head`},pe={class:`eyebrow`},me={class:`lived-persona-grid`},he={class:`lived-trait-track`},ge={class:`lived-persona-story`},_e={class:`eyebrow`},ve={key:0},ye={key:0,class:`lived-trait-history`},be={key:1,class:`faint`},xe={class:`greenhouse`},Se={class:`card editor`},Ce={class:`faint`,role:`status`},we={class:`editor-head`},Te={class:`eyebrow`},Ee={class:`muted`},De=[`disabled`],Oe={class:`form-grid`},ke=[`placeholder`],Ae={class:`wide`},je=[`placeholder`],Me={class:`traits`},Ne={class:`trait-head`},Pe={class:`muted`},Fe=[`onUpdate:modelValue`,`data-trait`,`aria-label`],Ie=[`onUpdate:modelValue`,`name`,`aria-label`],Le={class:`rhythm-set`},Re={class:`switch`},ze={class:`rhythm-row`},Be={class:`stack tight times`},Ve={class:`faint`},He={class:`stack tight`},Ue=[`placeholder`],We={class:`faint`},Ge={class:`versions`},Ke={class:`chip`,"data-tone":`quiet`},qe={class:`faint`},Je={class:`save-bar`},Ye=[`disabled`],Xe={class:`faint`,role:`status`},Ze={class:`side`},Qe={class:`card orb-card`},$e={class:`eyebrow`},et={class:`effects`},tt={class:`check`},nt={class:`card`},rt={class:`card-head`},it={class:`eyebrow`},at={class:`toggles`},ot={class:`switch`},st={class:`switch`},ct={class:`switch`},lt={class:`switch`},ut={class:`switch`},dt={class:`form-grid`},ft={class:`faint wide`},pt={class:`faint wide`},mt={class:`card`},ht={class:`card-head`},gt={class:`eyebrow`},_t={class:`form-grid`},vt={class:`wide`},yt={class:`faint budget-note`},bt={class:`save-bar`},xt={class:`primary`,type:`submit`},St={class:`faint`,role:`status`},Ct={class:`card prompts`},wt={class:`eyebrow`},Tt={class:`save-bar`},Et={class:`primary`},Dt={class:`faint`,role:`status`},Z=x(S({__name:`NaturePage`,setup(o){let v=a([{key:`warmth`,label:y(`温柔`),low:y(`颜色偏冷,表情淡淡的`),high:y(`颜色更暖,嘴角上扬`)},{key:`sarcasm`,label:y(`毒舌`),low:y(`不挖苦人`),high:y(`嘴角一歪,会吐槽`)},{key:`humor`,label:y(`幽默`),low:y(`认真`),high:y(`眯眼笑,爱开玩笑`)},{key:`activity`,label:y(`活泼`),low:y(`安安静静`),high:y(`跳得更快`)},{key:`initiative`,label:y(`主动`),low:y(`更喜欢独处`),high:y(`更愿意分享`)}]),x=a({system:y(`系统指令`),turn:y(`看见与开口`),expression:y(`自己的念头`),initiative:y(`分享与发起`),generation:y(`重新措辞`),validation:y(`回复检查`),memory:y(`记忆整理`),vision:y(`图片理解`),summary:y(`上下文压缩`),summaryMerge:y(`摘要合并`),reflection:y(`独处`),daily:y(`日记`)}),S=j(null),T=j(String(E.health.settings.aliases||``)),A=j([]),L=j({}),R=j([]),z=j(``),B=j([]),V=m({life:null,budget:null}),H=m({...E.core.prompts}),U=j(`turn`),W=j(!1),G=m({nature:!1,days:!1,prompts:!1});function K(e){G[e]=!1,E.dirty=Object.values(G).some(Boolean)}let q=j(!0),J=w(()=>{let e=A.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}}),Y=w(()=>S.value?Object.fromEntries(v.map(e=>[e.key,Number(S.value[e.key])||0])):null),X=e=>Array.isArray(e)?e.map(String):String(e||``).split(/[,,\n]/).map(e=>e.trim()).filter(Boolean);function Z(){let{version:e,...t}=S.value;return{...t,gender:t.gender||`female`,interests:X(t.interests),forbidden:X(t.forbidden),bottomLines:X(t.bottomLines)}}let Ot=w(()=>q.value&&S.value?Z():null);function kt(e){return(Number(S.value?.[e.key])||0)>=50?e.high:e.low}async function At(){let[e,t]=await Promise.all([I.nature(),I.overview()]);S.value={...e.nature,gender:e.nature.gender||`female`,interests:e.nature.interests.join(`,`),forbidden:e.nature.forbidden.join(`
1
+ import{$ as e,Ct as t,Et as n,I as r,J as i,P as a,Q as o,Tt as s,U as c,V as l,W as u,X as d,Z as f,a as p,bt as m,ct as h,dt as g,et as _,ht as v,j as y,lt as b,n as x,nt as S,p as C,q as w,rt as T,s as E,ut as D,v as O,vt as k,wt as A,xt as j,yt as M,z as N}from"./Empty-DP6WMGHi.js";import{L as ee,N as P,P as te,c as F,i as ne,j as I,s as re}from"./index-4rItIkD-.js";var L=[`d`],R=[`d`],z={class:`ticks`},B=[`x`,`y`],V=[`y`],H=[`y`],U=[`aria-label`,`aria-valuetext`],W=[`cx`,`cy`],G=[`x`,`y`],K=[`aria-label`,`aria-valuetext`],q=[`cx`,`cy`],J=[`x`,`y`],Y=110,X=84,ie=x(S({__name:`RhythmClock`,props:T({disabled:{type:Boolean}},{sleep:{required:!0},sleepModifiers:{},wake:{required:!0},wakeModifiers:{}}),emits:[`update:sleep`,`update:wake`],setup(e){let a=v(e,`sleep`),s=v(e,`wake`),c=j(),l=null,d=e=>{let[t,n]=String(e||`00:00`).split(`:`).map(Number);return(t*60+n)%1440},p=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`)}`},m=e=>e/1440*Math.PI*2-Math.PI/2,h=(e,t=X)=>({x:Y+Math.cos(m(e))*t,y:Y+Math.sin(m(e))*t});function _(e,t){let n=(t-e+1440)%1440||1440,r=h(e),i=h(t);return`M${r.x.toFixed(2)},${r.y.toFixed(2)}A${X},${X} 0 ${+(n>720)} 1 ${i.x.toFixed(2)},${i.y.toFixed(2)}`}let y=w(()=>d(a.value)),b=w(()=>d(s.value)),x=w(()=>{let e=(b.value-y.value+1440)%1440,t=Math.floor(e/60),n=e%60;return n?r(`{h} 小时 {m} 分`,{h:t,m:n}):r(`{h} 小时`,{h:t})});function S(e){let t=c.value.getBoundingClientRect(),n=(e.clientX-t.left)/t.width*220-Y,r=(e.clientY-t.top)/t.height*220-Y,i=Math.atan2(r,n)+Math.PI/2;return p((i/(Math.PI*2)*1440%1440+1440)%1440)}function C(e,t){l=e,t.target.setPointerCapture?.(t.pointerId)}function T(e){if(!l)return;let t=S(e);t!==(l===`sleep`?s.value:a.value)&&(l===`sleep`?a.value=t:s.value=t)}function E(){l=null}function O(e,t){let n={ArrowRight:15,ArrowUp:15,ArrowLeft:-15,ArrowDown:-15,PageUp:60,PageDown:-60}[t.key];if(!n)return;t.preventDefault();let r=d(e===`sleep`?a.value:s.value),i=p(r+n);i!==(e===`sleep`?s.value:a.value)&&(e===`sleep`?a.value=i:s.value=i)}return(l,d)=>(D(),f(`div`,{class:A([`rhythm`,{disabled:e.disabled}])},[(D(),f(`svg`,{ref_key:`svg`,ref:c,viewBox:`0 0 220 220`,onPointermove:T,onPointerup:E,onPointercancel:E},[d[4]||=o(`<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),i(`circle`,{class:`glass-center`,cx:Y,cy:Y,r:`68`}),i(`circle`,{class:`track`,cx:Y,cy:Y,r:X}),i(`path`,{class:`awake`,d:_(b.value,y.value)},null,8,L),i(`path`,{class:`asleep`,d:_(y.value,b.value)},null,8,R),i(`g`,z,[(D(),f(u,null,g([0,6,12,18],e=>i(`text`,{key:e,x:h(e*60,54).x,y:h(e*60,54).y+4,"text-anchor":`middle`},n(e),9,B)),64))]),i(`text`,{class:`center big`,x:Y,y:106,"text-anchor":`middle`},n(t(r)(`睡 {hours}`,{hours:x.value})),9,V),i(`text`,{class:`center`,x:Y,y:126,"text-anchor":`middle`},n(a.value)+` → `+n(s.value),9,H),i(`g`,{class:`handle moon`,role:`slider`,tabindex:`0`,"aria-label":t(r)(`几点睡`),"aria-valuetext":a.value,onPointerdown:d[0]||=e=>C(`sleep`,e),onKeydown:d[1]||=e=>O(`sleep`,e)},[i(`circle`,{cx:h(y.value).x,cy:h(y.value).y,r:`15`},null,8,W),i(`text`,{x:h(y.value).x,y:h(y.value).y+5,"text-anchor":`middle`},`☾`,8,G)],40,U),i(`g`,{class:`handle sun`,role:`slider`,tabindex:`0`,"aria-label":t(r)(`几点醒`),"aria-valuetext":s.value,onPointerdown:d[2]||=e=>C(`wake`,e),onKeydown:d[3]||=e=>O(`wake`,e)},[i(`circle`,{cx:h(b.value).x,cy:h(b.value).y,r:`15`},null,8,q),i(`text`,{x:h(b.value).x,y:h(b.value).y+5,"text-anchor":`middle`},`☀`,8,J)],40,K)],544))],2))}}),[[`__scopeId`,`data-v-7b572e49`]]),ae={key:0,class:`page nature`},oe=[`aria-label`],se={class:`nature-intro-copy`},ce={class:`eyebrow`},le={class:`nature-preview-note`},ue={class:`nature-intro-orb`},de=[`aria-label`],fe={class:`lived-persona-head`},pe={class:`eyebrow`},me={class:`lived-persona-grid`},he={class:`lived-trait-track`},ge={class:`lived-persona-story`},_e={class:`eyebrow`},ve={key:0},ye={key:0,class:`lived-trait-history`},be={key:1,class:`faint`},xe={class:`greenhouse`},Se={class:`card editor`},Ce={class:`faint`,role:`status`},we={class:`editor-head`},Te={class:`eyebrow`},Ee={class:`muted`},De=[`disabled`],Oe={class:`form-grid`},ke=[`placeholder`],Ae={class:`wide`},je=[`placeholder`],Me={class:`traits`},Ne={class:`trait-head`},Pe={class:`muted`},Fe=[`onUpdate:modelValue`,`data-trait`,`aria-label`],Ie=[`onUpdate:modelValue`,`name`,`aria-label`],Le={class:`rhythm-set`},Re={class:`switch`},ze={class:`rhythm-row`},Be={class:`stack tight times`},Ve={class:`faint`},He={class:`stack tight`},Ue=[`placeholder`],We={class:`faint`},Ge={class:`versions`},Ke={class:`chip`,"data-tone":`quiet`},qe={class:`faint`},Je={class:`save-bar`},Ye=[`disabled`],Xe={class:`faint`,role:`status`},Ze={class:`side`},Qe={class:`card orb-card`},$e={class:`eyebrow`},et={class:`effects`},tt={class:`check`},nt={class:`card`},rt={class:`card-head`},it={class:`eyebrow`},at={class:`toggles`},ot={class:`switch`},st={class:`switch`},ct={class:`switch`},lt={class:`switch`},ut={class:`switch`},dt={class:`form-grid`},ft={class:`faint wide`},pt={class:`faint wide`},mt={class:`card`},ht={class:`card-head`},gt={class:`eyebrow`},_t={class:`form-grid`},vt={class:`wide`},yt={class:`faint budget-note`},bt={class:`save-bar`},xt={class:`primary`,type:`submit`},St={class:`faint`,role:`status`},Ct={class:`card prompts`},wt={class:`eyebrow`},Tt={class:`save-bar`},Et={class:`primary`},Dt={class:`faint`,role:`status`},Z=x(S({__name:`NaturePage`,setup(o){let v=a([{key:`warmth`,label:y(`温柔`),low:y(`颜色偏冷,表情淡淡的`),high:y(`颜色更暖,嘴角上扬`)},{key:`sarcasm`,label:y(`毒舌`),low:y(`不挖苦人`),high:y(`嘴角一歪,会吐槽`)},{key:`humor`,label:y(`幽默`),low:y(`认真`),high:y(`眯眼笑,爱开玩笑`)},{key:`activity`,label:y(`活泼`),low:y(`安安静静`),high:y(`跳得更快`)},{key:`initiative`,label:y(`主动`),low:y(`更喜欢独处`),high:y(`更愿意分享`)}]),x=a({system:y(`系统指令`),turn:y(`看见与开口`),expression:y(`自己的念头`),initiative:y(`分享与发起`),generation:y(`重新措辞`),validation:y(`回复检查`),memory:y(`记忆整理`),vision:y(`图片理解`),summary:y(`上下文压缩`),summaryMerge:y(`摘要合并`),reflection:y(`独处`),daily:y(`日记`)}),S=j(null),T=j(String(E.health.settings.aliases||``)),A=j([]),L=j({}),R=j([]),z=j(``),B=j([]),V=m({life:null,budget:null}),H=m({...E.core.prompts}),U=j(`turn`),W=j(!1),G=m({nature:!1,days:!1,prompts:!1});function K(e){G[e]=!1,E.dirty=Object.values(G).some(Boolean)}let q=j(!0),J=w(()=>{let e=A.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}}),Y=w(()=>S.value?Object.fromEntries(v.map(e=>[e.key,Number(S.value[e.key])||0])):null),X=e=>Array.isArray(e)?e.map(String):String(e||``).split(/[,,\n]/).map(e=>e.trim()).filter(Boolean);function Z(){let{version:e,...t}=S.value;return{...t,gender:t.gender||`female`,interests:X(t.interests),forbidden:X(t.forbidden),bottomLines:X(t.bottomLines)}}let Ot=w(()=>q.value&&S.value?Z():null);function kt(e){return(Number(S.value?.[e.key])||0)>=50?e.high:e.low}async function At(){let[e,t]=await Promise.all([I.nature(),I.overview()]);S.value={...e.nature,gender:e.nature.gender||`female`,interests:e.nature.interests.join(`,`),forbidden:e.nature.forbidden.join(`
2
2
  `),bottomLines:e.nature.bottomLines.join(`
3
3
  `)},A.value=e.versions,L.value=e.livedTraits||{},R.value=e.traitHistory||[],z.value=e.livedPersona||``,B.value=e.personaHistory||[],V.life={...t.life},V.budget={...t.budget.settings}}function Q(e=`nature`){G[e]=!0,E.dirty=!0}async function jt(){if(!W.value){W.value=!0;try{await I.saveNature(Z()),T.value!==E.health.settings.aliases&&await C({aliases:T.value}),K(`nature`),await p();let e=await I.nature();A.value=e.versions,L.value=e.livedTraits||{},R.value=e.traitHistory||[],z.value=e.livedPersona||``,B.value=e.personaHistory||[],O(r(`天性已保存,下一次开口时生效`))}catch(e){O(e.message,!0)}finally{W.value=!1}}}async function Mt(){try{let e=await I.saveSettings({life:V.life,budget:{dailyTokens:Number(V.budget.dailyTokens)||0,innerShare:Number(V.budget.innerShare),upkeepShare:Number(V.budget.upkeepShare)}});V.life={...e.life},V.budget={...e.budget},K(`days`),O(r(`TA 的日子已按新设置安排`))}catch(e){O(e.message,!0)}}async function Nt(){try{await I.savePrompts({...H}),K(`prompts`),await p(),O(r(`指令已保存,下一轮生效`))}catch(e){O(e.message,!0)}}let $;return h(()=>{At(),$=setInterval(async()=>{if(!document.hidden)try{let e=await I.nature();L.value=e.livedTraits||{},R.value=e.traitHistory||[],z.value=e.livedPersona||``,B.value=e.personaHistory||[]}catch{}},3e4)}),b(()=>{$&&clearInterval($)}),(a,o)=>S.value?(D(),f(`div`,ae,[i(`section`,{class:`nature-intro`,"aria-label":t(r)(`天性预览`)},[i(`div`,se,[i(`span`,ce,n(t(r)(`THE WAY SHE GROWS · 天性`)),1),i(`h1`,null,[e(n(t(r)(`她的底色,`)),1),o[38]||=i(`br`,null,null,-1),i(`em`,null,n(t(r)(`慢慢长成她自己。`)),1)]),i(`p`,null,n(t(r)(`一些与生俱来的倾向,会在每一次相遇里长出新的模样。`)),1),i(`span`,le,[o[39]||=i(`i`,null,null,-1),e(` `+n(t(r)(`调节刻度,看看此刻的她`)),1)])]),i(`div`,ue,[_(te,{class:`preview-orb`,mood:t(ee),traits:Y.value,size:170,interactive:``},null,8,[`mood`,`traits`])])],8,oe),i(`section`,{class:`lived-persona`,"aria-label":t(r)(`成长中的性格`)},[i(`div`,fe,[i(`span`,pe,n(t(r)(`BECOMING · 正在成为`)),1),i(`h2`,null,n(t(r)(`此刻的她`)),1),i(`p`,null,n(t(r)(`天性是起点。下方是她从真实经历里长出的刻度,下一次对话会使用这些值。`)),1)]),i(`div`,me,[(D(!0),f(u,null,g(t(v),e=>(D(),f(`div`,{key:e.key,class:`lived-trait`},[i(`span`,null,n(e.label),1),i(`strong`,null,n(L.value[e.key]??S.value[e.key]),1),i(`small`,null,n(t(r)(`起点 {v}`,{v:S.value[e.key]})),1),i(`div`,he,[i(`i`,{style:s({width:`${L.value[e.key]??S.value[e.key]}%`})},null,4)])]))),128))]),i(`div`,ge,[i(`span`,_e,n(t(r)(`INNER VOICE · 自己的样子`)),1),i(`p`,null,n(z.value||t(r)(`她还没有为现在的自己留下一段新的描述。底色和已有的自我线索仍会陪着她。`)),1),B.value.length?(D(),f(`details`,ve,[i(`summary`,null,n(t(r)(`看看她怎么走到这里 · {length} 版`,{length:B.value.length})),1),i(`ol`,null,[(D(!0),f(u,null,g(B.value,e=>(D(),f(`li`,{key:e.id},[i(`span`,null,n(e.content),1),i(`time`,null,n(t(P)(e.created)),1)]))),128))])])):d(``,!0)]),R.value.length?(D(),f(`details`,ye,[i(`summary`,null,n(t(r)(`看看她为何改变 · {length} 次`,{length:R.value.length})),1),i(`ol`,null,[(D(!0),f(u,null,g(R.value,e=>(D(),f(`li`,{key:e.id},[i(`b`,null,n(t(v).find(t=>t.key===e.trait)?.label||e.trait)+` `+n(e.delta>0?`+`:``)+n(e.delta),1),i(`span`,null,n(e.reason),1),i(`time`,null,n(t(P)(e.created)),1)]))),128))])])):(D(),f(`p`,be,n(t(r)(`她还没有从经历里改变这些刻度。独处或日记里形成了有来源的新选择后,会留在这里。`)),1))],8,de),i(`div`,xe,[i(`section`,Se,[i(`form`,{id:`natureForm`,onSubmit:c(jt,[`prevent`]),onInput:o[16]||=e=>Q()},[i(`p`,Ce,n(J.value.locked?t(r)(`两次更改已经用完。之后的性格、兴趣和样子,由 TA 自己从经历里生长。`):t(r)(`天性还可以改 {left} 次,包括性格刻度。用完后由她自己生长。`,{left:J.value.left})),1),i(`header`,we,[i(`span`,Te,n(t(r)(`塑造 TA`)),1),i(`h2`,null,n(t(r)(`TA 生来是什么样的?`)),1),i(`p`,Ee,n(t(r)(`天性是种子:性格、兴趣和底线。TA 的自我、在各群的样子、对每个人的感觉都会从经历里长出来——你能看到、能撤销,但不在这里改写。`)),1)]),i(`fieldset`,{class:`nature-fields`,disabled:J.value.locked},[i(`div`,Oe,[i(`label`,null,[e(n(t(r)(`名字`)),1),M(i(`input`,{"onUpdate:modelValue":o[0]||=e=>S.value.name=e,name:`name`,required:``,maxlength:`40`},null,512),[[l,S.value.name]])]),i(`label`,null,[e(n(t(r)(`性别`))+` `,1),_(F,{modelValue:S.value.gender,"onUpdate:modelValue":o[1]||=e=>S.value.gender=e,name:`gender`,"aria-label":t(r)(`性别`),options:[{value:`female`,label:t(r)(`女`)},{value:`male`,label:t(r)(`男`)},{value:`unspecified`,label:t(r)(`不指定`)}]},null,8,[`modelValue`,`aria-label`,`options`]),i(`small`,null,n(t(r)(`人称会进入 TA 对自己的理解。女是「她」,男是「他」。`)),1)]),i(`label`,null,[e(n(t(r)(`别人会怎么叫 TA`))+` `,1),M(i(`input`,{"onUpdate:modelValue":o[2]||=e=>T.value=e,name:`aliases`,placeholder:t(r)(`用逗号分隔`)},null,8,ke),[[l,T.value]]),i(`small`,null,n(t(r)(`群友叫 TA 的称呼,保存时一并写进全局设置`)),1)]),i(`label`,Ae,[e(n(t(r)(`天性`))+` `,1),M(i(`textarea`,{"onUpdate:modelValue":o[3]||=e=>S.value.base=e,name:`base`,rows:`6`,placeholder:t(r)(`TA 的背景、性格、兴趣和社交方式…`)},null,8,je),[[l,S.value.base]])])]),i(`fieldset`,Me,[i(`legend`,null,n(t(r)(`性格刻度`)),1),(D(!0),f(u,null,g(t(v),e=>(D(),f(`div`,{key:e.key,class:`trait`},[i(`div`,Ne,[i(`b`,null,n(e.label),1),i(`small`,Pe,n(kt(e)),1)]),M(i(`input`,{"onUpdate:modelValue":t=>S.value[e.key]=t,type:`range`,min:`0`,max:`100`,"data-trait":e.key,"aria-label":t(r)(`{label}刻度`,{label:e.label})},null,8,Fe),[[l,S.value[e.key],void 0,{number:!0}]]),M(i(`input`,{"onUpdate:modelValue":t=>S.value[e.key]=t,name:e.key,type:`number`,min:`0`,max:`100`,class:`trait-number`,"aria-label":e.label},null,8,Ie),[[l,S.value[e.key],void 0,{number:!0}]])]))),128)),i(`label`,null,[e(n(t(r)(`说话长度`)),1),M(i(`input`,{"onUpdate:modelValue":o[4]||=e=>S.value.length=e,name:`length`},null,512),[[l,S.value.length]])])]),i(`fieldset`,Le,[i(`legend`,null,n(t(r)(`作息`)),1),i(`label`,Re,[M(i(`input`,{"onUpdate:modelValue":o[5]||=e=>S.value.rhythm.enabled=e,type:`checkbox`,name:`rhythmEnabled`},null,512),[[N,S.value.rhythm.enabled]]),i(`span`,null,n(t(r)(`TA 会睡觉:睡着时不看群,被私聊或 @ 会等醒来再看(危机消息除外)`)),1)]),i(`div`,ze,[_(ie,{sleep:S.value.rhythm.sleep,"onUpdate:sleep":[o[6]||=e=>S.value.rhythm.sleep=e,o[8]||=e=>Q()],wake:S.value.rhythm.wake,"onUpdate:wake":[o[7]||=e=>S.value.rhythm.wake=e,o[9]||=e=>Q()],disabled:!S.value.rhythm.enabled},null,8,[`sleep`,`wake`,`disabled`]),i(`div`,Be,[i(`label`,null,[e(n(t(r)(`几点睡`)),1),M(i(`input`,{"onUpdate:modelValue":o[10]||=e=>S.value.rhythm.sleep=e,type:`time`,name:`sleep`,step:`900`},null,512),[[l,S.value.rhythm.sleep]])]),i(`label`,null,[e(n(t(r)(`几点醒`)),1),M(i(`input`,{"onUpdate:modelValue":o[11]||=e=>S.value.rhythm.wake=e,type:`time`,name:`wake`,step:`900`},null,512),[[l,S.value.rhythm.wake]])]),i(`small`,Ve,n(t(r)(`拖动月亮和太阳,或直接输入时间。`)),1)])])]),i(`fieldset`,null,[i(`legend`,null,n(t(r)(`兴趣、边界与底线`)),1),i(`div`,He,[i(`label`,null,[e(n(t(r)(`兴趣`)),1),M(i(`input`,{"onUpdate:modelValue":o[12]||=e=>S.value.interests=e,name:`interests`,placeholder:t(r)(`用逗号分隔`)},null,8,Ue),[[l,S.value.interests]])]),i(`label`,null,[e(n(t(r)(`社交边界`)),1),M(i(`input`,{"onUpdate:modelValue":o[13]||=e=>S.value.boundaries=e,name:`boundaries`},null,512),[[l,S.value.boundaries]])]),i(`label`,null,[e(n(t(r)(`底线(每行一条)`)),1),M(i(`textarea`,{"onUpdate:modelValue":o[14]||=e=>S.value.bottomLines=e,name:`bottomLines`,rows:`4`},null,512),[[l,S.value.bottomLines]])]),i(`label`,null,[e(n(t(r)(`不想用的说法(每行一个)`)),1),M(i(`textarea`,{"onUpdate:modelValue":o[15]||=e=>S.value.forbidden=e,name:`forbidden`,rows:`3`},null,512),[[l,S.value.forbidden]])]),i(`small`,We,n(t(r)(`凭据(密码、密钥、验证码)永远不会进入 TA 的心智,这一条写死在代码里。`)),1)])])],8,De),i(`details`,Ge,[i(`summary`,null,n(t(r)(`天性的版本 · {length}`,{length:A.value.length})),1),i(`ol`,null,[(D(!0),f(u,null,g(A.value,e=>(D(),f(`li`,{key:e.version},[i(`span`,Ke,n(t(r)(`第 {version} 版`,{version:e.version})),1),i(`span`,null,n(e.note||t(r)(`修改`)),1),i(`time`,qe,n(t(P)(e.created)),1)]))),128))])]),i(`div`,Je,[i(`button`,{class:`primary`,disabled:W.value||J.value.locked},n(J.value.locked?t(r)(`已交给 TA`):W.value?t(r)(`保存中…`):t(r)(`保存天性`)),9,Ye),i(`span`,Xe,n(J.value.locked?t(r)(`更改次数已用完`):G.nature?t(r)(`天性有未保存的修改`):t(r)(`还可以改 {left} 次`,{left:J.value.left})),1)])],32)]),i(`aside`,Ze,[i(`div`,Qe,[i(`span`,$e,n(t(r)(`调色盘 · 即时反馈`)),1),i(`h3`,null,n(t(r)(`微小的倾向,也会改变表达`)),1),i(`ul`,et,[(D(!0),f(u,null,g(t(v),e=>(D(),f(`li`,{key:e.key},[i(`b`,null,n(e.label)+` `+n(S.value[e.key]),1),i(`span`,null,n(kt(e)),1)]))),128))])]),_(ne,{class:`chat-card`,title:t(r)(`用草稿天性试聊`),eyebrow:`TALK TO TA`},{default:k(()=>[_(re,{anchored:``,sessions:t(E).core.sessions,nature:Ot.value,starter:t(r)(`今天真的好累啊`)},{options:k(()=>[i(`label`,tt,[M(i(`input`,{"onUpdate:modelValue":o[17]||=e=>q.value=e,type:`checkbox`},null,512),[[N,q.value]]),e(n(t(r)(`用左边还没保存的天性`)),1)])]),_:1},8,[`sessions`,`nature`,`starter`])]),_:1},8,[`title`])])]),V.life?(D(),f(`form`,{key:0,class:`days`,onSubmit:c(Mt,[`prevent`]),onInput:o[33]||=e=>Q(`days`),onChange:o[34]||=e=>Q(`days`)},[i(`section`,nt,[i(`div`,rt,[i(`div`,null,[i(`span`,it,n(t(r)(`TA 的日子`)),1),i(`h2`,null,n(t(r)(`TA 怎样度过没人说话的时间`)),1)])]),i(`div`,at,[i(`label`,ot,[M(i(`input`,{"onUpdate:modelValue":o[18]||=e=>V.life.solitude=e,type:`checkbox`},null,512),[[N,V.life.solitude]]),i(`span`,null,[i(`b`,null,n(t(r)(`独处`)),1),i(`small`,null,n(t(r)(`聊天安静下来后,TA 会重新看看最近的事,改变对自己、对人的理解。`)),1)])]),i(`label`,st,[M(i(`input`,{"onUpdate:modelValue":o[19]||=e=>V.life.reading=e,type:`checkbox`},null,512),[[N,V.life.reading]]),i(`span`,null,[i(`b`,null,n(t(r)(`独处时读资料`)),1),i(`small`,null,n(t(r)(`从共享资料里按自己的兴趣挑着读,一段一段读下去;读过的内容聊天时可以自然提起。`)),1)])]),i(`label`,ct,[M(i(`input`,{"onUpdate:modelValue":o[20]||=e=>V.life.diary=e,type:`checkbox`},null,512),[[N,V.life.diary]]),i(`span`,null,[i(`b`,null,n(t(r)(`睡前写日记`)),1),i(`small`,null,n(t(r)(`一天结束时写下这一天,和昨天的自己对照;隔一段时间在夜里回顾,改写自传、翻开新的一章。`)),1)])]),i(`label`,lt,[M(i(`input`,{"onUpdate:modelValue":o[21]||=e=>V.life.night=e,type:`checkbox`},null,512),[[N,V.life.night]]),i(`span`,null,[i(`b`,null,n(t(r)(`夜里整理`)),1),i(`small`,null,n(t(r)(`睡着以后,把白天没整理的聊天记进记忆和约定里,再按回顾间隔回顾这段日子。`)),1)])]),i(`label`,ut,[M(i(`input`,{"onUpdate:modelValue":o[22]||=e=>V.life.proactive=e,type:`checkbox`},null,512),[[N,V.life.proactive]]),i(`span`,null,[i(`b`,null,n(t(r)(`允许 TA 主动说话`)),1),i(`small`,null,n(t(r)(`安静的时候,也能从自己的兴趣、念头和对人的感觉决定要不要先开口。不必等人提问,不催同一句话;对方没回应,也不等于以后不能分享新的事。关掉后停止主动联系。`)),1),o[40]||=e(` >`,-1)])])]),i(`div`,dt,[i(`label`,null,[e(n(t(r)(`安静多久才独处(分钟)`)),1),M(i(`input`,{"onUpdate:modelValue":o[23]||=e=>V.life.idleMinutes=e,type:`number`,min:`0`},null,512),[[l,V.life.idleMinutes,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`两次独处至少间隔(分钟)`)),1),M(i(`input`,{"onUpdate:modelValue":o[24]||=e=>V.life.intervalMinutes=e,type:`number`,min:`10`},null,512),[[l,V.life.intervalMinutes,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`攒够多少条新消息(条)`)),1),M(i(`input`,{"onUpdate:modelValue":o[25]||=e=>V.life.minMessages=e,type:`number`,min:`0`},null,512),[[l,V.life.minMessages,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`回顾间隔(天)`)),1),M(i(`input`,{"onUpdate:modelValue":o[26]||=e=>V.life.chapterDays=e,type:`number`,min:`1`},null,512),[[l,V.life.chapterDays,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`安静时多久看看想不想聊(分钟)`)),1),M(i(`input`,{"onUpdate:modelValue":o[27]||=e=>V.life.initiativeIntervalMinutes=e,type:`number`,min:`1`},null,512),[[l,V.life.initiativeIntervalMinutes,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`两次主动联系至少间隔(小时)`)),1),M(i(`input`,{"onUpdate:modelValue":o[28]||=e=>V.life.proactiveIntervalHours=e,type:`number`,min:`0`,step:`0.1`},null,512),[[l,V.life.proactiveIntervalHours,void 0,{number:!0}]])]),i(`p`,ft,n(t(r)(`主动联系间隔只在实际发出后计算,可设为 0;沉默不会占用发送间隔。想说的话会保留,临时忙碌后重新决定。没有新消息时也可独处,不需要攒够消息才能产生念头。`)),1),i(`p`,pt,n(t(r)(`独处、日记和夜里整理也使用模型库里的默认模型,不再单独指定。`)),1),i(`label`,null,[e(n(t(r)(`时区`)),1),M(i(`input`,{"onUpdate:modelValue":o[29]||=e=>V.life.timeZone=e,placeholder:`Asia/Shanghai`},null,512),[[l,V.life.timeZone]])])])]),i(`section`,mt,[i(`div`,ht,[i(`div`,null,[i(`span`,gt,n(t(r)(`每日注意力`)),1),i(`h2`,null,n(t(r)(`TA 一天能花多少 Token`)),1)])]),i(`div`,_t,[i(`label`,vt,[e(n(t(r)(`每日 Token 上限(0 = 不限)`))+` `,1),M(i(`input`,{"onUpdate:modelValue":o[30]||=e=>V.budget.dailyTokens=e,type:`number`,min:`0`},null,512),[[l,V.budget.dailyTokens,void 0,{number:!0}]]),i(`small`,null,n(t(r)(`滚动 24 小时计算。快用完时,TA 在群里只在被叫到时细看;用完后后台独处和整理暂停。`)),1)]),i(`label`,null,[e(n(t(r)(`独处与日记最多占`)),1),M(i(`input`,{"onUpdate:modelValue":o[31]||=e=>V.budget.innerShare=e,type:`number`,min:`0`,max:`0.9`,step:`0.05`},null,512),[[l,V.budget.innerShare,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`记忆整理与压缩最多占`)),1),M(i(`input`,{"onUpdate:modelValue":o[32]||=e=>V.budget.upkeepShare=e,type:`number`,min:`0`,max:`0.9`,step:`0.05`},null,512),[[l,V.budget.upkeepShare,void 0,{number:!0}]])])]),i(`p`,yt,n(t(r)(`扫一眼群聊不花 Token;TA 细看时一次调用同时完成理解、心情和回复。私聊和 @ 永远优先。`)),1),i(`div`,bt,[i(`button`,xt,n(t(r)(`保存 TA 的日子`)),1),i(`span`,St,n(G.days?t(r)(`日常安排有未保存的修改`):t(r)(`日常安排已保存`)),1)])])],32)):d(``,!0),i(`details`,Ct,[i(`summary`,null,[i(`span`,wt,n(t(r)(`高级`)),1),i(`b`,null,n(t(r)(`指令(Prompt)`)),1)]),i(`form`,{id:`promptsForm`,class:`stack tight`,onSubmit:c(Nt,[`prevent`]),onInput:o[37]||=e=>Q(`prompts`)},[i(`label`,null,[e(n(t(r)(`要编辑的指令`))+` `,1),_(F,{modelValue:U.value,"onUpdate:modelValue":o[35]||=e=>U.value=e,"aria-label":t(r)(`要编辑的指令`),options:Object.keys(H).map(e=>({value:e,label:t(x)[e]||e}))},null,8,[`modelValue`,`aria-label`,`options`])]),i(`label`,null,[e(n(t(r)(`指令正文`)),1),M(i(`textarea`,{"onUpdate:modelValue":o[36]||=e=>H[U.value]=e,rows:`14`,class:`mono`},null,512),[[l,H[U.value]]])]),i(`div`,Tt,[i(`button`,Et,n(t(r)(`保存指令`)),1),i(`span`,Dt,n(G.prompts?t(r)(`指令有未保存的修改`):t(r)(`指令已保存`)),1)])],32)])])):d(``,!0)}}),[[`__scopeId`,`data-v-9b449c5e`]]);export{Z as default};
@@ -1 +1 @@
1
- import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,Q as s,St as c,Tt as l,V as u,W as d,X as f,Y as p,Z as m,_ as h,dt as g,et as _,gt as v,n as y,nt as b,o as x,q as S,s as C,t as w,ut as T,v as E,vt as D,wt as O,xt as k,yt as A}from"./Empty-SkA8PyMo.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-BIAdfObg.js";import{l as Z}from"./knowledge-DNDLyN9m.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=y(b({__name:`Galaxy`,props:{people:{},activity:{}},emits:[`open`,`list`],setup(n,{emit:r}){let c=n,u=r,p=S(()=>[...c.people].sort((e,t)=>(t.familiarity??0)-(e.familiarity??0))),h=S(()=>p.value.slice(0,12)),v=S(()=>Math.max(0,p.value.length-h.value.length));return(r,c)=>(T(),m(`section`,{class:`galaxy`,"aria-label":t(a)(`相遇之间:TA 认识的人`)},[o(`div`,ne,[o(`div`,re,[o(`span`,ie,i(t(a)(`PEOPLE / 相遇之间`)),1),o(`h2`,null,[e(i(t(a)(`每一次相遇,`)),1),c[1]||=o(`br`,null,null,-1),o(`em`,null,i(t(a)(`都留下一点温度。`)),1)]),o(`p`,null,i(t(a)(`越熟悉离 TA 越近。这里先放着最近亲近的 {length} 个人,其他人也仍然在名单里。`,{length:h.value.length})),1),o(`div`,ae,[o(`b`,null,i(n.people.length),1),o(`span`,null,i(t(a)(`个相遇过的人`)),1)])]),o(`div`,oe,[c[2]||=s(`<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),o(`div`,se,[_(F,{mood:t(N),activity:n.activity||`idle`,size:100},null,8,[`mood`,`activity`])])])]),o(`div`,ce,[o(`div`,null,[c[3]||=o(`span`,{class:`eyebrow`},`CLOSER TO HER`,-1),o(`h3`,null,i(t(a)(`最近靠近的人`)),1)]),o(`span`,null,i(t(a)(`点开一张光片,看看她记得什么`)),1)]),o(`div`,le,[(T(!0),m(d,null,g(h.value,(e,n)=>(T(),m(`button`,{key:e.userId,type:`button`,class:O([`person-node`,{away:(e.awayDays??0)>=14,tense:e.tension>=.3}]),"data-person":e.userId,style:l({"--hue":t(V)(e.name||e.userId),"--order":n}),"aria-label":`${e.name}:${e.feel||t(a)(`还在慢慢认识`)}`,onClick:t=>u(`open`,e.userId)},[o(`span`,de,[o(`span`,fe,i(t(K)(e.name)),1)]),o(`span`,pe,[o(`b`,null,i(e.name),1),o(`small`,null,`QQ `+i(e.userId),1),o(`small`,null,i(e.feel||t(a)(`还在慢慢认识`)),1)]),c[5]||=o(`span`,{class:`person-arrow`,"aria-hidden":`true`},`↗`,-1),o(`span`,{class:`familiarity`,style:l({"--amount":Math.round(Math.max(0,Math.min(1,e.familiarity??0))*100)+`%`}),"aria-hidden":`true`},[...c[4]||=[o(`i`,null,null,-1)]],4)],14,ue))),128))]),v.value?(T(),m(`button`,{key:0,type:`button`,class:`more-people`,onClick:c[0]||=e=>u(`list`)},[e(i(t(a)(`在名单里看看另外 {hidden} 个人`,{hidden:v.value}))+` `,1),c[6]||=o(`span`,{"aria-hidden":`true`},`↗`,-1)])):f(``,!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=y(b({__name:`Ring`,props:{value:{},label:{},caption:{default:``},signed:{type:Boolean,default:!1},size:{default:64}},setup(e){let t=e,n=2*Math.PI*18,r=S(()=>{let e=Number(t.value)||0;return t.signed?Math.max(-1,Math.min(1,e)):Math.max(0,Math.min(1,e))}),a=S(()=>Math.abs(r.value)*n),s=S(()=>r.value<0);return(t,c)=>(T(),m(`figure`,{class:`ring`,style:l({width:e.size+`px`})},[(T(),m(`svg`,{width:e.size,height:e.size,viewBox:`0 0 44 44`,"aria-hidden":`true`},[c[0]||=o(`circle`,{class:`track`,cx:`22`,cy:`22`,r:`18`},null,-1),o(`circle`,{class:O([`arc`,{negative:s.value}]),cx:`22`,cy:`22`,r:`18`,"stroke-dasharray":`${a.value.toFixed(2)} ${n.toFixed(2)}`,transform:s.value?`translate(44 0) scale(-1 1) rotate(-90 22 22)`:`rotate(-90 22 22)`},null,10,ge),o(`text`,_e,i(Math.round(r.value*100)),1)],8,he)),o(`figcaption`,null,[o(`b`,null,i(e.label),1),e.caption?(T(),m(`small`,ve,i(e.caption),1)):f(``,!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=y(b({__name:`PersonSheet`,props:{id:{},now:{}},emits:[`close`,`changed`],setup(e,{emit:s}){let c=e,u=s,y=k(null),b=k(``),x=S(()=>y.value?.person),C=S(()=>{let e=x.value?.firstMetAt;return e?a(`认识 {v} 天`,{v:Math.max(1,Math.round(((c.now||Date.now())-e)/864e5))}):``});async function w(){if(!c.id)return;let e=c.id;y.value?.person?.userId!==e&&(y.value=h(`/mind/people/`+encodeURIComponent(e))||null),b.value=``;try{let t=await U.person(e);c.id===e&&(y.value=t)}catch(t){if(c.id!==e)return;y.value=null,b.value=t.message}}async function A(e){if(await r(a(`撤销这次「{v}」?TA 对这个人的感觉会重新计算。`,{v:z[e.change]||e.change}),{title:a(`撤销一次关系变化`),confirmText:a(`撤销`),danger:!0}))try{await U.revoke(`bond`,e.id),E(a(`已撤销`)),await w(),u(`changed`)}catch(e){E(e.message,!0)}}async function M(e){let t=await n(a(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条记忆`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await U.revoke(`memory`,e.id,t),E(a(`已撤销`)),await w()}catch(e){E(e.message,!0)}}async function N(e,t){try{await Z(e.id,t),await w()}catch(e){E(e.message,!0)}}async function F(e){if(await r(a(`撤销这次相遇留下的意思?「{meant}」之后不会再回到 TA 心里,也不会再被当成变化的来源。`,{meant:e.meant}),{title:a(`撤销这次相遇`),confirmText:a(`撤销`),danger:!0}))try{await U.revoke(`meeting`,e.id),E(a(`已撤销`)),await w(),u(`changed`)}catch(e){E(e.message,!0)}}async function R(e){let t=await n(a(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这个约定`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await U.revoke(`anticipation`,e.id,t),E(a(`已撤销`)),await w()}catch(e){E(e.message,!0)}}return v(()=>c.id,e=>{y.value=null,e&&w()},{immediate:!0}),(n,r)=>(T(),p(G,{open:!!e.id,title:x.value?.name||t(a)(`正在想起…`),eyebrow:t(a)(`TA 认识的人`),width:`560px`,onClose:r[0]||=e=>u(`close`)},{default:D(()=>[b.value?(T(),m(`p`,be,i(b.value),1)):x.value?(T(),m(`div`,xe,[o(`header`,Se,[o(`span`,{class:`avatar`,style:l({"--hue":t(V)(x.value.name||x.value.userId)})},i(t(K)(x.value.name)),5),o(`div`,null,[o(`p`,Ce,i(x.value.feel),1),o(`small`,we,`QQ `+i(x.value.userId),1),o(`small`,Te,i([C.value,x.value.lastTalkedAt?t(a)(`上次说上话 {v}`,{v:t(W)(x.value.lastTalkedAt,e.now)}):t(a)(`还没说上过话`),x.value.seenAt?t(a)(`上次见到 {v}`,{v:t(W)(x.value.seenAt,e.now)}):``].filter(Boolean).join(` · `)),1)])]),o(`div`,Ee,[(T(!0),m(d,null,g(t(I),([e,t])=>(T(),p(ye,{key:e,value:x.value[e],label:t},null,8,[`value`,`label`]))),128))]),x.value.impression?(T(),m(`p`,De,i(t(a)(`印象:{impression}`,{impression:x.value.impression})),1)):f(``,!0),x.value.places?.length?(T(),m(`div`,Oe,[o(`span`,ke,i(t(a)(`在这些地方见过:`)),1),(T(!0),m(d,null,g(x.value.places,e=>(T(),m(`span`,{key:e.id,class:`chip`,"data-tone":`quiet`},i(e.name),1))),128))])):f(``,!0),o(`section`,null,[o(`h3`,Ae,i(t(a)(`这份感觉是怎么来的`)),1),y.value.changes.length?(T(),m(`ul`,je,[(T(!0),m(d,null,g(y.value.changes,e=>(T(),m(`li`,{key:e.id,class:O([`change`,{done:e.revoked}])},[o(`span`,{class:`chip`,"data-tone":e.revoked?`quiet`:t(Y).has(e.change)?`danger`:void 0},i(t(z)[e.change]||e.change),9,Me),o(`div`,Ne,[o(`p`,null,i(e.note||t(a)(`没有写原因`)),1),o(`small`,Pe,i(t(a)(`{v} · {v2} · {length} 处来源`,{v:t(P)(e.created),v2:t(ee)[e.origin]||t(a)(`写日记时`),length:e.sources.length})),1)]),e.revoked?(T(),m(`span`,Fe,i(t(a)(`已撤销`)),1)):(T(),m(`button`,{key:1,class:`text-button`,"data-revoke-change":``,onClick:t=>A(e)},i(t(a)(`撤销`)),9,Ie))],2))),128))])):(T(),m(`p`,Le,i(t(a)(`只是一起聊过天,还没有特别的变化。`)),1))]),y.value.meetings?.length?(T(),m(`section`,Re,[o(`h3`,ze,i(t(a)(`和{name}的相遇留下了什么`,{name:x.value.name})),1),o(`ul`,Be,[(T(!0),m(d,null,g(y.value.meetings,e=>(T(),m(`li`,{key:e.id,class:`change`},[o(`span`,{class:`chip`,"data-tone":e.private?`quiet`:void 0},i(e.private?t(a)(`私下`):e.choice===`silent`?t(a)(`没出声`):t(a)(`出了声`)),9,Ve),o(`div`,He,[o(`p`,null,i(e.meant),1),e.why?(T(),m(`small`,Ue,i(t(a)(`当时:{why}`,{why:e.why})),1)):f(``,!0),o(`small`,We,i(e.when)+` · `+i(e.sessionName),1)]),o(`button`,{class:`text-button`,"data-revoke-meeting":``,onClick:t=>F(e)},i(t(a)(`撤销`)),9,Ge)]))),128))])])):f(``,!0),o(`section`,null,[o(`h3`,Ke,i(t(a)(`TA 记得关于{name}的事`,{name:x.value.name})),1),y.value.memories.length?(T(),m(`ul`,qe,[(T(!0),m(d,null,g(y.value.memories,e=>(T(),m(`li`,{key:e.id,class:O([`memory-item`,{superseded:e.status===`superseded`}])},[o(`p`,null,i(e.content),1),o(`small`,Je,i(t(a)(`{v} · 在「{v2}」知道的 · {when}`,{v:t(L)[e.status]||e.status,v2:t(H)({name:e.sessionName,id:e.session_id||e.sessionId}),when:e.when})),1),e.status===`confirmed`?(T(),m(`div`,Ye,[o(`span`,Xe,i(t(a)(`改完即生效`)),1),_(B,{"aria-label":t(a)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(t(j)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>N(e,{discretion:t})},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),o(`button`,{class:`small`,onClick:t=>N(e,{locked:!e.locked})},i(e.locked?t(a)(`解锁`):t(a)(`锁定`)),9,Ze),o(`button`,{class:`small danger`,onClick:t=>M(e)},i(t(a)(`撤销`)),9,Qe)])):f(``,!0)],2))),128))])):(T(),m(`p`,$e,i(t(a)(`还没有记住关于这个人的事。`)),1))]),o(`section`,null,[o(`h3`,et,i(t(a)(`和{name}有关的约定`,{name:x.value.name})),1),y.value.anticipations.length?(T(),m(`ul`,tt,[(T(!0),m(d,null,g(y.value.anticipations,e=>(T(),m(`li`,{key:e.id,class:O([`change`,{done:e.state!==`pending`}])},[o(`span`,{class:`chip`,"data-tone":e.state===`pending`?void 0:`quiet`},i(t(X)[e.state]||e.state),9,nt),o(`div`,rt,[o(`p`,null,i(e.content),1),o(`small`,it,i(t(J)[e.kind]||e.kind)+` · `+i(e.when),1)]),e.status===`revoked`?f(``,!0):(T(),m(`button`,{key:0,class:`text-button`,onClick:t=>R(e)},i(t(a)(`撤销`)),9,at))],2))),128))])):(T(),m(`p`,ot,i(t(a)(`没有和这个人有关的约定。`)),1))])])):f(``,!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`},$=y(b({__name:`GroupFaces`,props:{groups:{}},emits:[`changed`],setup(n,{emit:s}){let c=s,u=k(null),p=k({});async function h(e){p.value[e]||(p.value={...p.value,[e]:await U.faces(e)})}async function v(e,t){if(await r(a(`撤销这一版面貌?TA 在这里会回到上一版的样子。`),{title:a(`撤销面貌`),confirmText:a(`撤销`),danger:!0}))try{await U.revoke(`face`,t),p.value={...p.value,[e]:await U.faces(e)},E(a(`已撤销`)),c(`changed`)}catch(e){E(e.message,!0)}}return(r,s)=>(T(),m(`section`,ct,[o(`div`,lt,[o(`span`,ut,i(t(a)(`群像`)),1),o(`h2`,null,i(t(a)(`在不同的地方,她有不同的相处方式。`)),1),o(`p`,dt,i(t(a)(`面貌由 TA 在独处和写日记时自己修正;每一版都有来源。这个地方的说话节奏不会写成 TA 的样子。`)),1)]),o(`div`,ft,[(T(!0),m(d,null,g(n.groups,e=>(T(),m(`article`,{key:e.session,class:`card face-card`,style:l({"--hue":t(V)(e.session)})},[o(`header`,null,[o(`span`,pt,i(e.kind===`private`?t(a)(`私`):t(a)(`群`)),1),o(`div`,null,[o(`h3`,null,i(t(H)({id:e.session,name:e.name,kind:e.kind})),1),e.kind===`private`?(T(),m(`small`,mt,`QQ `+i(String(e.session||``).split(`:`).pop()),1)):f(``,!0),o(`small`,ht,i(e.kind===`private`?t(a)(`私聊`):t(a)(`群聊`))+i(e.bond?` · ${e.bond.feel}`:``),1)])]),e.face?(T(),m(`dl`,gt,[o(`dt`,null,i(t(a)(`角色`)),1),o(`dd`,null,i(e.face.role||`—`),1),o(`dt`,null,i(t(a)(`说话`)),1),o(`dd`,null,i(e.face.tone||`—`),1),o(`dt`,null,i(t(a)(`想成为`)),1),o(`dd`,null,i(e.face.aspiration||`—`),1),e.face.content?(T(),m(d,{key:0},[o(`dt`,null,i(t(a)(`自己的话`)),1),o(`dd`,_t,i(e.face.content),1)],64)):f(``,!0)])):(T(),m(`p`,vt,i(t(a)(`还没有形成在这里的样子。`)),1)),o(`button`,{class:`text-button`,onClick:t=>{u.value=e,h(e.session)}},i(t(a)(`查看完整面貌与变化 ↗`)),9,yt)],4))),128))]),_(G,{open:!!u.value,title:u.value?.name||t(a)(`面貌`),eyebrow:t(a)(`FACES / 在这里的样子`),width:`680px`,onClose:s[0]||=e=>u.value=null},{default:D(()=>[u.value?(T(),m(`div`,bt,[o(`p`,xt,i(u.value.face?.content||t(a)(`还没有形成在这里的样子。`)),1),o(`h3`,null,i(t(a)(`变化历史`)),1),p.value[u.value.session]?(T(),m(`ol`,St,[(T(!0),m(d,null,g(p.value[u.value.session],n=>(T(),m(`li`,{key:n.id,class:O({revoked:n.revoked})},[o(`time`,null,i(t(P)(n.created)),1),o(`span`,null,[n.revoked?(T(),m(`b`,Ct,i(t(a)(`已撤销 ·`)),1)):n.origin===`migration`?(T(),m(`b`,wt,i(t(a)(`旧版 ·`)),1)):f(``,!0),e(i([n.role,n.tone,n.aspiration].filter(Boolean).join(` · `)||n.content),1)]),n.revoked?f(``,!0):(T(),m(`button`,{key:0,class:`text-button`,onClick:e=>v(u.value.session,n.id)},i(t(a)(`撤销`)),9,Tt))],2))),128)),p.value[u.value.session].length?f(``,!0):(T(),m(`li`,Et,i(t(a)(`没有记录。`)),1))])):f(``,!0)])):f(``,!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=y(b({__name:`PeoplePage`,setup(e){let n=c(h(`/mind/bonds`)||null),r=k(`galaxy`),s=k(``),y=k(C.sub&&C.sub!==`list`?C.sub:null);C.sub===`list`&&(r.value=`list`);let b=S(()=>{let e=s.value.trim(),t=n.value?.people||[];return e?t.filter(t=>`${t.name}${t.userId}${t.impression||``}`.includes(e)):t}),E=0;async function D(){let e=++E,t=await U.bonds();e===E&&(n.value=t)}function O(e){y.value=e,x(e)}function j(){y.value=null,x(r.value===`list`?`list`:``)}return v(r,e=>{C.page===`people`&&(y.value||x(e===`list`?`list`:``))}),v(()=>[C.page,C.sub],([e,t])=>{e===`people`&&(t===`list`&&(r.value=`list`),y.value=t&&t!==`list`?t:null)}),R(`people`,D),(e,c)=>(T(),m(`div`,Dt,[o(`div`,Ot,[_(te,{modelValue:r.value,"onUpdate:modelValue":c[0]||=e=>r.value=e,label:t(a)(`人际的视图`),items:[{key:`galaxy`,label:t(a)(`相遇之间`),count:n.value?.people.length??``},{key:`list`,label:t(a)(`列表`)}]},null,8,[`modelValue`,`label`,`items`]),A(o(`input`,{"onUpdate:modelValue":c[1]||=e=>s.value=e,class:`people-search`,type:`search`,placeholder:t(a)(`找一个人`),"aria-label":t(a)(`找一个人`)},null,8,kt),[[u,s.value]]),o(`p`,At,i(t(a)(`她记得相遇,也记得关系会随着时间改变。`)),1)]),n.value?(T(),m(d,{key:0},[b.value.length?(T(),m(d,{key:0},[r.value===`galaxy`?(T(),p(me,{key:0,people:b.value,activity:t(M).data?.activity?.kind,onOpen:O,onList:c[2]||=e=>r.value=`list`},null,8,[`people`,`activity`])):(T(),m(`div`,jt,[(T(!0),m(d,null,g(b.value,e=>(T(),m(`button`,{key:e.userId,class:`card person-card`,"data-person":e.userId,onClick:t=>O(e.userId)},[o(`header`,null,[o(`span`,{class:`avatar`,style:l({"--hue":t(V)(e.name||e.userId)})},i(t(K)(e.name)),5),o(`div`,null,[o(`h3`,null,i(e.name),1),o(`small`,Nt,`QQ `+i(e.userId),1),o(`small`,Pt,i(e.feel),1)])]),o(`div`,Ft,[(T(!0),m(d,null,g(t(I),([t,n])=>(T(),p(q,{key:t,label:n,value:e[t],warn:t===`tension`},null,8,[`label`,`value`,`warn`]))),128))]),o(`small`,It,i(t(a)(`在 {length} 个地方见过 · 上次说上话 {v}`,{length:e.sessions.length,v:e.lastTalkedAt?t(W)(e.lastTalkedAt,t(M).data?.now):t(a)(`还没有`)})),1)],8,Mt))),128))]))],64)):(T(),p(w,{key:1,title:t(a)(`TA 还没有认识谁`),text:t(a)(`有人和 TA 说话、TA 细看过群聊之后,这里会出现 TA 对每个人的感觉。`)},null,8,[`title`,`text`])),_($,{groups:n.value.groups,onChanged:D},null,8,[`groups`])],64)):f(``,!0),_(st,{id:y.value,now:t(M).data?.now,onClose:j,onChanged:D},null,8,[`id`,`now`])]))}}),[[`__scopeId`,`data-v-45f19e60`]]);export{Lt as default};
1
+ import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,Q as s,St as c,Tt as l,V as u,W as d,X as f,Y as p,Z as m,_ as h,dt as g,et as _,gt as v,n as y,nt as b,o as x,q as S,s as C,t as w,ut as T,v as E,vt as D,wt as O,xt as k,yt as A}from"./Empty-DP6WMGHi.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-4rItIkD-.js";import{l as Z}from"./knowledge-C6_HvoyB.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=y(b({__name:`Galaxy`,props:{people:{},activity:{}},emits:[`open`,`list`],setup(n,{emit:r}){let c=n,u=r,p=S(()=>[...c.people].sort((e,t)=>(t.familiarity??0)-(e.familiarity??0))),h=S(()=>p.value.slice(0,12)),v=S(()=>Math.max(0,p.value.length-h.value.length));return(r,c)=>(T(),m(`section`,{class:`galaxy`,"aria-label":t(a)(`相遇之间:TA 认识的人`)},[o(`div`,ne,[o(`div`,re,[o(`span`,ie,i(t(a)(`PEOPLE / 相遇之间`)),1),o(`h2`,null,[e(i(t(a)(`每一次相遇,`)),1),c[1]||=o(`br`,null,null,-1),o(`em`,null,i(t(a)(`都留下一点温度。`)),1)]),o(`p`,null,i(t(a)(`越熟悉离 TA 越近。这里先放着最近亲近的 {length} 个人,其他人也仍然在名单里。`,{length:h.value.length})),1),o(`div`,ae,[o(`b`,null,i(n.people.length),1),o(`span`,null,i(t(a)(`个相遇过的人`)),1)])]),o(`div`,oe,[c[2]||=s(`<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),o(`div`,se,[_(F,{mood:t(N),activity:n.activity||`idle`,size:100},null,8,[`mood`,`activity`])])])]),o(`div`,ce,[o(`div`,null,[c[3]||=o(`span`,{class:`eyebrow`},`CLOSER TO HER`,-1),o(`h3`,null,i(t(a)(`最近靠近的人`)),1)]),o(`span`,null,i(t(a)(`点开一张光片,看看她记得什么`)),1)]),o(`div`,le,[(T(!0),m(d,null,g(h.value,(e,n)=>(T(),m(`button`,{key:e.userId,type:`button`,class:O([`person-node`,{away:(e.awayDays??0)>=14,tense:e.tension>=.3}]),"data-person":e.userId,style:l({"--hue":t(V)(e.name||e.userId),"--order":n}),"aria-label":`${e.name}:${e.feel||t(a)(`还在慢慢认识`)}`,onClick:t=>u(`open`,e.userId)},[o(`span`,de,[o(`span`,fe,i(t(K)(e.name)),1)]),o(`span`,pe,[o(`b`,null,i(e.name),1),o(`small`,null,`QQ `+i(e.userId),1),o(`small`,null,i(e.feel||t(a)(`还在慢慢认识`)),1)]),c[5]||=o(`span`,{class:`person-arrow`,"aria-hidden":`true`},`↗`,-1),o(`span`,{class:`familiarity`,style:l({"--amount":Math.round(Math.max(0,Math.min(1,e.familiarity??0))*100)+`%`}),"aria-hidden":`true`},[...c[4]||=[o(`i`,null,null,-1)]],4)],14,ue))),128))]),v.value?(T(),m(`button`,{key:0,type:`button`,class:`more-people`,onClick:c[0]||=e=>u(`list`)},[e(i(t(a)(`在名单里看看另外 {hidden} 个人`,{hidden:v.value}))+` `,1),c[6]||=o(`span`,{"aria-hidden":`true`},`↗`,-1)])):f(``,!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=y(b({__name:`Ring`,props:{value:{},label:{},caption:{default:``},signed:{type:Boolean,default:!1},size:{default:64}},setup(e){let t=e,n=2*Math.PI*18,r=S(()=>{let e=Number(t.value)||0;return t.signed?Math.max(-1,Math.min(1,e)):Math.max(0,Math.min(1,e))}),a=S(()=>Math.abs(r.value)*n),s=S(()=>r.value<0);return(t,c)=>(T(),m(`figure`,{class:`ring`,style:l({width:e.size+`px`})},[(T(),m(`svg`,{width:e.size,height:e.size,viewBox:`0 0 44 44`,"aria-hidden":`true`},[c[0]||=o(`circle`,{class:`track`,cx:`22`,cy:`22`,r:`18`},null,-1),o(`circle`,{class:O([`arc`,{negative:s.value}]),cx:`22`,cy:`22`,r:`18`,"stroke-dasharray":`${a.value.toFixed(2)} ${n.toFixed(2)}`,transform:s.value?`translate(44 0) scale(-1 1) rotate(-90 22 22)`:`rotate(-90 22 22)`},null,10,ge),o(`text`,_e,i(Math.round(r.value*100)),1)],8,he)),o(`figcaption`,null,[o(`b`,null,i(e.label),1),e.caption?(T(),m(`small`,ve,i(e.caption),1)):f(``,!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=y(b({__name:`PersonSheet`,props:{id:{},now:{}},emits:[`close`,`changed`],setup(e,{emit:s}){let c=e,u=s,y=k(null),b=k(``),x=S(()=>y.value?.person),C=S(()=>{let e=x.value?.firstMetAt;return e?a(`认识 {v} 天`,{v:Math.max(1,Math.round(((c.now||Date.now())-e)/864e5))}):``});async function w(){if(!c.id)return;let e=c.id;y.value?.person?.userId!==e&&(y.value=h(`/mind/people/`+encodeURIComponent(e))||null),b.value=``;try{let t=await U.person(e);c.id===e&&(y.value=t)}catch(t){if(c.id!==e)return;y.value=null,b.value=t.message}}async function A(e){if(await r(a(`撤销这次「{v}」?TA 对这个人的感觉会重新计算。`,{v:z[e.change]||e.change}),{title:a(`撤销一次关系变化`),confirmText:a(`撤销`),danger:!0}))try{await U.revoke(`bond`,e.id),E(a(`已撤销`)),await w(),u(`changed`)}catch(e){E(e.message,!0)}}async function M(e){let t=await n(a(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条记忆`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await U.revoke(`memory`,e.id,t),E(a(`已撤销`)),await w()}catch(e){E(e.message,!0)}}async function N(e,t){try{await Z(e.id,t),await w()}catch(e){E(e.message,!0)}}async function F(e){if(await r(a(`撤销这次相遇留下的意思?「{meant}」之后不会再回到 TA 心里,也不会再被当成变化的来源。`,{meant:e.meant}),{title:a(`撤销这次相遇`),confirmText:a(`撤销`),danger:!0}))try{await U.revoke(`meeting`,e.id),E(a(`已撤销`)),await w(),u(`changed`)}catch(e){E(e.message,!0)}}async function R(e){let t=await n(a(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这个约定`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await U.revoke(`anticipation`,e.id,t),E(a(`已撤销`)),await w()}catch(e){E(e.message,!0)}}return v(()=>c.id,e=>{y.value=null,e&&w()},{immediate:!0}),(n,r)=>(T(),p(G,{open:!!e.id,title:x.value?.name||t(a)(`正在想起…`),eyebrow:t(a)(`TA 认识的人`),width:`560px`,onClose:r[0]||=e=>u(`close`)},{default:D(()=>[b.value?(T(),m(`p`,be,i(b.value),1)):x.value?(T(),m(`div`,xe,[o(`header`,Se,[o(`span`,{class:`avatar`,style:l({"--hue":t(V)(x.value.name||x.value.userId)})},i(t(K)(x.value.name)),5),o(`div`,null,[o(`p`,Ce,i(x.value.feel),1),o(`small`,we,`QQ `+i(x.value.userId),1),o(`small`,Te,i([C.value,x.value.lastTalkedAt?t(a)(`上次说上话 {v}`,{v:t(W)(x.value.lastTalkedAt,e.now)}):t(a)(`还没说上过话`),x.value.seenAt?t(a)(`上次见到 {v}`,{v:t(W)(x.value.seenAt,e.now)}):``].filter(Boolean).join(` · `)),1)])]),o(`div`,Ee,[(T(!0),m(d,null,g(t(I),([e,t])=>(T(),p(ye,{key:e,value:x.value[e],label:t},null,8,[`value`,`label`]))),128))]),x.value.impression?(T(),m(`p`,De,i(t(a)(`印象:{impression}`,{impression:x.value.impression})),1)):f(``,!0),x.value.places?.length?(T(),m(`div`,Oe,[o(`span`,ke,i(t(a)(`在这些地方见过:`)),1),(T(!0),m(d,null,g(x.value.places,e=>(T(),m(`span`,{key:e.id,class:`chip`,"data-tone":`quiet`},i(e.name),1))),128))])):f(``,!0),o(`section`,null,[o(`h3`,Ae,i(t(a)(`这份感觉是怎么来的`)),1),y.value.changes.length?(T(),m(`ul`,je,[(T(!0),m(d,null,g(y.value.changes,e=>(T(),m(`li`,{key:e.id,class:O([`change`,{done:e.revoked}])},[o(`span`,{class:`chip`,"data-tone":e.revoked?`quiet`:t(Y).has(e.change)?`danger`:void 0},i(t(z)[e.change]||e.change),9,Me),o(`div`,Ne,[o(`p`,null,i(e.note||t(a)(`没有写原因`)),1),o(`small`,Pe,i(t(a)(`{v} · {v2} · {length} 处来源`,{v:t(P)(e.created),v2:t(ee)[e.origin]||t(a)(`写日记时`),length:e.sources.length})),1)]),e.revoked?(T(),m(`span`,Fe,i(t(a)(`已撤销`)),1)):(T(),m(`button`,{key:1,class:`text-button`,"data-revoke-change":``,onClick:t=>A(e)},i(t(a)(`撤销`)),9,Ie))],2))),128))])):(T(),m(`p`,Le,i(t(a)(`只是一起聊过天,还没有特别的变化。`)),1))]),y.value.meetings?.length?(T(),m(`section`,Re,[o(`h3`,ze,i(t(a)(`和{name}的相遇留下了什么`,{name:x.value.name})),1),o(`ul`,Be,[(T(!0),m(d,null,g(y.value.meetings,e=>(T(),m(`li`,{key:e.id,class:`change`},[o(`span`,{class:`chip`,"data-tone":e.private?`quiet`:void 0},i(e.private?t(a)(`私下`):e.choice===`silent`?t(a)(`没出声`):t(a)(`出了声`)),9,Ve),o(`div`,He,[o(`p`,null,i(e.meant),1),e.why?(T(),m(`small`,Ue,i(t(a)(`当时:{why}`,{why:e.why})),1)):f(``,!0),o(`small`,We,i(e.when)+` · `+i(e.sessionName),1)]),o(`button`,{class:`text-button`,"data-revoke-meeting":``,onClick:t=>F(e)},i(t(a)(`撤销`)),9,Ge)]))),128))])])):f(``,!0),o(`section`,null,[o(`h3`,Ke,i(t(a)(`TA 记得关于{name}的事`,{name:x.value.name})),1),y.value.memories.length?(T(),m(`ul`,qe,[(T(!0),m(d,null,g(y.value.memories,e=>(T(),m(`li`,{key:e.id,class:O([`memory-item`,{superseded:e.status===`superseded`}])},[o(`p`,null,i(e.content),1),o(`small`,Je,i(t(a)(`{v} · 在「{v2}」知道的 · {when}`,{v:t(L)[e.status]||e.status,v2:t(H)({name:e.sessionName,id:e.session_id||e.sessionId}),when:e.when})),1),e.status===`confirmed`?(T(),m(`div`,Ye,[o(`span`,Xe,i(t(a)(`改完即生效`)),1),_(B,{"aria-label":t(a)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(t(j)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>N(e,{discretion:t})},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),o(`button`,{class:`small`,onClick:t=>N(e,{locked:!e.locked})},i(e.locked?t(a)(`解锁`):t(a)(`锁定`)),9,Ze),o(`button`,{class:`small danger`,onClick:t=>M(e)},i(t(a)(`撤销`)),9,Qe)])):f(``,!0)],2))),128))])):(T(),m(`p`,$e,i(t(a)(`还没有记住关于这个人的事。`)),1))]),o(`section`,null,[o(`h3`,et,i(t(a)(`和{name}有关的约定`,{name:x.value.name})),1),y.value.anticipations.length?(T(),m(`ul`,tt,[(T(!0),m(d,null,g(y.value.anticipations,e=>(T(),m(`li`,{key:e.id,class:O([`change`,{done:e.state!==`pending`}])},[o(`span`,{class:`chip`,"data-tone":e.state===`pending`?void 0:`quiet`},i(t(X)[e.state]||e.state),9,nt),o(`div`,rt,[o(`p`,null,i(e.content),1),o(`small`,it,i(t(J)[e.kind]||e.kind)+` · `+i(e.when),1)]),e.status===`revoked`?f(``,!0):(T(),m(`button`,{key:0,class:`text-button`,onClick:t=>R(e)},i(t(a)(`撤销`)),9,at))],2))),128))])):(T(),m(`p`,ot,i(t(a)(`没有和这个人有关的约定。`)),1))])])):f(``,!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`},$=y(b({__name:`GroupFaces`,props:{groups:{}},emits:[`changed`],setup(n,{emit:s}){let c=s,u=k(null),p=k({});async function h(e){p.value[e]||(p.value={...p.value,[e]:await U.faces(e)})}async function v(e,t){if(await r(a(`撤销这一版面貌?TA 在这里会回到上一版的样子。`),{title:a(`撤销面貌`),confirmText:a(`撤销`),danger:!0}))try{await U.revoke(`face`,t),p.value={...p.value,[e]:await U.faces(e)},E(a(`已撤销`)),c(`changed`)}catch(e){E(e.message,!0)}}return(r,s)=>(T(),m(`section`,ct,[o(`div`,lt,[o(`span`,ut,i(t(a)(`群像`)),1),o(`h2`,null,i(t(a)(`在不同的地方,她有不同的相处方式。`)),1),o(`p`,dt,i(t(a)(`面貌由 TA 在独处和写日记时自己修正;每一版都有来源。这个地方的说话节奏不会写成 TA 的样子。`)),1)]),o(`div`,ft,[(T(!0),m(d,null,g(n.groups,e=>(T(),m(`article`,{key:e.session,class:`card face-card`,style:l({"--hue":t(V)(e.session)})},[o(`header`,null,[o(`span`,pt,i(e.kind===`private`?t(a)(`私`):t(a)(`群`)),1),o(`div`,null,[o(`h3`,null,i(t(H)({id:e.session,name:e.name,kind:e.kind})),1),e.kind===`private`?(T(),m(`small`,mt,`QQ `+i(String(e.session||``).split(`:`).pop()),1)):f(``,!0),o(`small`,ht,i(e.kind===`private`?t(a)(`私聊`):t(a)(`群聊`))+i(e.bond?` · ${e.bond.feel}`:``),1)])]),e.face?(T(),m(`dl`,gt,[o(`dt`,null,i(t(a)(`角色`)),1),o(`dd`,null,i(e.face.role||`—`),1),o(`dt`,null,i(t(a)(`说话`)),1),o(`dd`,null,i(e.face.tone||`—`),1),o(`dt`,null,i(t(a)(`想成为`)),1),o(`dd`,null,i(e.face.aspiration||`—`),1),e.face.content?(T(),m(d,{key:0},[o(`dt`,null,i(t(a)(`自己的话`)),1),o(`dd`,_t,i(e.face.content),1)],64)):f(``,!0)])):(T(),m(`p`,vt,i(t(a)(`还没有形成在这里的样子。`)),1)),o(`button`,{class:`text-button`,onClick:t=>{u.value=e,h(e.session)}},i(t(a)(`查看完整面貌与变化 ↗`)),9,yt)],4))),128))]),_(G,{open:!!u.value,title:u.value?.name||t(a)(`面貌`),eyebrow:t(a)(`FACES / 在这里的样子`),width:`680px`,onClose:s[0]||=e=>u.value=null},{default:D(()=>[u.value?(T(),m(`div`,bt,[o(`p`,xt,i(u.value.face?.content||t(a)(`还没有形成在这里的样子。`)),1),o(`h3`,null,i(t(a)(`变化历史`)),1),p.value[u.value.session]?(T(),m(`ol`,St,[(T(!0),m(d,null,g(p.value[u.value.session],n=>(T(),m(`li`,{key:n.id,class:O({revoked:n.revoked})},[o(`time`,null,i(t(P)(n.created)),1),o(`span`,null,[n.revoked?(T(),m(`b`,Ct,i(t(a)(`已撤销 ·`)),1)):n.origin===`migration`?(T(),m(`b`,wt,i(t(a)(`旧版 ·`)),1)):f(``,!0),e(i([n.role,n.tone,n.aspiration].filter(Boolean).join(` · `)||n.content),1)]),n.revoked?f(``,!0):(T(),m(`button`,{key:0,class:`text-button`,onClick:e=>v(u.value.session,n.id)},i(t(a)(`撤销`)),9,Tt))],2))),128)),p.value[u.value.session].length?f(``,!0):(T(),m(`li`,Et,i(t(a)(`没有记录。`)),1))])):f(``,!0)])):f(``,!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=y(b({__name:`PeoplePage`,setup(e){let n=c(h(`/mind/bonds`)||null),r=k(`galaxy`),s=k(``),y=k(C.sub&&C.sub!==`list`?C.sub:null);C.sub===`list`&&(r.value=`list`);let b=S(()=>{let e=s.value.trim(),t=n.value?.people||[];return e?t.filter(t=>`${t.name}${t.userId}${t.impression||``}`.includes(e)):t}),E=0;async function D(){let e=++E,t=await U.bonds();e===E&&(n.value=t)}function O(e){y.value=e,x(e)}function j(){y.value=null,x(r.value===`list`?`list`:``)}return v(r,e=>{C.page===`people`&&(y.value||x(e===`list`?`list`:``))}),v(()=>[C.page,C.sub],([e,t])=>{e===`people`&&(t===`list`&&(r.value=`list`),y.value=t&&t!==`list`?t:null)}),R(`people`,D),(e,c)=>(T(),m(`div`,Dt,[o(`div`,Ot,[_(te,{modelValue:r.value,"onUpdate:modelValue":c[0]||=e=>r.value=e,label:t(a)(`人际的视图`),items:[{key:`galaxy`,label:t(a)(`相遇之间`),count:n.value?.people.length??``},{key:`list`,label:t(a)(`列表`)}]},null,8,[`modelValue`,`label`,`items`]),A(o(`input`,{"onUpdate:modelValue":c[1]||=e=>s.value=e,class:`people-search`,type:`search`,placeholder:t(a)(`找一个人`),"aria-label":t(a)(`找一个人`)},null,8,kt),[[u,s.value]]),o(`p`,At,i(t(a)(`她记得相遇,也记得关系会随着时间改变。`)),1)]),n.value?(T(),m(d,{key:0},[b.value.length?(T(),m(d,{key:0},[r.value===`galaxy`?(T(),p(me,{key:0,people:b.value,activity:t(M).data?.activity?.kind,onOpen:O,onList:c[2]||=e=>r.value=`list`},null,8,[`people`,`activity`])):(T(),m(`div`,jt,[(T(!0),m(d,null,g(b.value,e=>(T(),m(`button`,{key:e.userId,class:`card person-card`,"data-person":e.userId,onClick:t=>O(e.userId)},[o(`header`,null,[o(`span`,{class:`avatar`,style:l({"--hue":t(V)(e.name||e.userId)})},i(t(K)(e.name)),5),o(`div`,null,[o(`h3`,null,i(e.name),1),o(`small`,Nt,`QQ `+i(e.userId),1),o(`small`,Pt,i(e.feel),1)])]),o(`div`,Ft,[(T(!0),m(d,null,g(t(I),([t,n])=>(T(),p(q,{key:t,label:n,value:e[t],warn:t===`tension`},null,8,[`label`,`value`,`warn`]))),128))]),o(`small`,It,i(t(a)(`在 {length} 个地方见过 · 上次说上话 {v}`,{length:e.sessions.length,v:e.lastTalkedAt?t(W)(e.lastTalkedAt,t(M).data?.now):t(a)(`还没有`)})),1)],8,Mt))),128))]))],64)):(T(),p(w,{key:1,title:t(a)(`TA 还没有认识谁`),text:t(a)(`有人和 TA 说话、TA 细看过群聊之后,这里会出现 TA 对每个人的感觉。`)},null,8,[`title`,`text`])),_($,{groups:n.value.groups,onChanged:D},null,8,[`groups`])],64)):f(``,!0),_(st,{id:y.value,now:t(M).data?.now,onClose:j,onChanged:D},null,8,[`id`,`now`])]))}}),[[`__scopeId`,`data-v-45f19e60`]]);export{Lt as default};
@@ -1,2 +1,2 @@
1
- import{$ as e,Ct as t,Et as n,I as r,J as i,U as a,V as o,W as s,X as c,Y as l,Z as u,ct as d,dt as f,et as p,gt as m,lt as ee,m as h,n as te,nt as g,o as ne,q as re,s as _,t as v,ut as y,vt as b,xt as x,yt as S,z as ie}from"./Empty-SkA8PyMo.js";import{i as C,n as ae,o as oe}from"./index-BIAdfObg.js";import{t as w}from"./Field-BjLhi8pL.js";var se={class:`page plugins`},ce={class:`plugins-intro`},le={class:`eyebrow`},ue={key:0,class:`warn-text`,role:`alert`},de={key:1,class:`stack`},fe={class:`lead`},pe={class:`grid`},me={class:`muted`},he={key:0},ge={class:`row`},_e=[`onClick`],ve=[`onClick`],ye=[`onClick`],be={key:2,class:`grid`},T=[`onClick`],E={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=te(g({__name:`PluginsPage`,setup(te){let g=[`installed`,`market`,`actions`,`import`],P=x(g.includes(_.sub)?_.sub:`installed`),F=x([]),I=x([]),L=x(!1),R=x(!1),z=x([]),B=x(``),V=x(``),H=x(null),U=x({}),W=x({url:``,sha256:``}),G=x(``),K=x(``),q=x(``),J=x(null),Y=re(()=>F.value.find(e=>e.id===V.value));async function X(){F.value=(await h(`/plugins`)).plugins||[];try{z.value=(await h(`/plugins/actions/pending`)).actions||[]}catch{z.value=[]}}function Z(){R.value=!0,h(`/plugins/market`).then(e=>{I.value=e.plugins||[],L.value=!!e.unavailable}).catch(()=>{I.value=[],L.value=!0}).finally(()=>{R.value=!1})}m(P,e=>{ne(e),e===`market`&&Z()}),m(()=>_.sub,e=>{g.includes(e)&&(P.value=e)}),m(V,async e=>{if(!e)return;let t=await h(`/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(`
1
+ import{$ as e,Ct as t,Et as n,I as r,J as i,U as a,V as o,W as s,X as c,Y as l,Z as u,ct as d,dt as f,et as p,gt as m,lt as ee,m as h,n as te,nt as g,o as ne,q as re,s as _,t as v,ut as y,vt as b,xt as x,yt as S,z as ie}from"./Empty-DP6WMGHi.js";import{i as C,n as ae,o as oe}from"./index-4rItIkD-.js";import{t as w}from"./Field-CtbdqaiB.js";var se={class:`page plugins`},ce={class:`plugins-intro`},le={class:`eyebrow`},ue={key:0,class:`warn-text`,role:`alert`},de={key:1,class:`stack`},fe={class:`lead`},pe={class:`grid`},me={class:`muted`},he={key:0},ge={class:`row`},_e=[`onClick`],ve=[`onClick`],ye=[`onClick`],be={key:2,class:`grid`},T=[`onClick`],E={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=te(g({__name:`PluginsPage`,setup(te){let g=[`installed`,`market`,`actions`,`import`],P=x(g.includes(_.sub)?_.sub:`installed`),F=x([]),I=x([]),L=x(!1),R=x(!1),z=x([]),B=x(``),V=x(``),H=x(null),U=x({}),W=x({url:``,sha256:``}),G=x(``),K=x(``),q=x(``),J=x(null),Y=re(()=>F.value.find(e=>e.id===V.value));async function X(){F.value=(await h(`/plugins`)).plugins||[];try{z.value=(await h(`/plugins/actions/pending`)).actions||[]}catch{z.value=[]}}function Z(){R.value=!0,h(`/plugins/market`).then(e=>{I.value=e.plugins||[],L.value=!!e.unavailable}).catch(()=>{I.value=[],L.value=!0}).finally(()=>{R.value=!1})}m(P,e=>{ne(e),e===`market`&&Z()}),m(()=>_.sub,e=>{g.includes(e)&&(P.value=e)}),m(V,async e=>{if(!e)return;let t=await h(`/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
2
  `):r??``:n[e.key]=r??``}U.value=n});async function De(){Y.value&&(B.value=``,await h(`/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 h(`/plugins/${e.id}/settings`,{method:`PUT`,body:JSON.stringify({values:U.value})}),await h(`/plugins/${e.id}/grant`,{method:`POST`,body:JSON.stringify({permissions:e.permissions})}),await h(`/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 h(e,{method:`POST`,body:JSON.stringify(t)})}catch(e){B.value=e.message}}async function ke(){if(!H.value)return;await h(`/plugins/import/commit`,{method:`POST`,body:JSON.stringify({token:H.value.token})});let e=H.value;H.value=null,await h(`/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(`/`)&&h(`/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))}d(()=>{X().catch(e=>B.value=e.message),P.value===`market`&&Z(),window.addEventListener(`message`,$)}),ee(()=>window.removeEventListener(`message`,$));function Ae(e){return r(e===`high`?`高风险`:e===`medium`?`中风险`:`低风险`)}function je(e){return e.running?r(`运行中`):e.state===`error`?r(`出错`):e.enabled?r(`正在启动`):e.source===`builtin`?r(`内置,未启用`):r(`已安装,未启用`)}return(d,m)=>(y(),u(`div`,se,[i(`header`,ce,[i(`span`,le,n(t(r)(`THE WORLD SHE CAN TOUCH · 插件`)),1),i(`h1`,null,[e(n(t(r)(`核心是她。`)),1),i(`em`,null,n(t(r)(`插件是世界。`)),1)]),i(`p`,null,n(t(r)(`插件只能经她同意接触世界。它们读不到她的数据库,也不能替她开口。`)),1)]),B.value?(y(),u(`p`,ue,n(B.value),1)):c(``,!0),p(ae,{"model-value":P.value,"onUpdate:modelValue":m[0]||=e=>P.value=e,label:t(r)(`插件的分区`),items:[{key:`installed`,label:t(r)(`插件列表`)},{key:`market`,label:t(r)(`插件市场`)},{key:`actions`,label:t(r)(`她想做的事`),count:z.value.length},{key:`import`,label:t(r)(`导入与开发`)}]},null,8,[`model-value`,`label`,`items`]),P.value===`installed`?(y(),u(`section`,de,[i(`p`,fe,n(t(r)(`天气随 LuckyTri 附带,默认关闭。启用前会先列出它要的权限。`)),1),i(`div`,pe,[F.value.length?c(``,!0):(y(),l(v,{key:0,title:t(r)(`还没有接上插件`),text:t(r)(`内置的天气可以在这里启用,也可以从市场安装。`)},null,8,[`title`,`text`])),(y(!0),u(s,null,f(F.value,a=>(y(),l(C,{key:a.id,title:a.manifest.name||a.id},{default:b(()=>[i(`p`,null,n(a.manifest.description),1),i(`p`,me,[e(n(a.version)+` · `+n(je(a))+` `,1),a.status?.text?(y(),u(`span`,he,` · `+n(a.status.text),1)):c(``,!0)]),i(`div`,ge,[a.enabled?(y(),u(`button`,{key:1,class:`ghost`,onClick:e=>t(h)(`/plugins/${a.id}/disable`,{method:`POST`,body:`{}`}).then(X)},n(t(r)(`停用`)),9,ve)):(y(),u(`button`,{key:0,class:`primary`,onClick:e=>V.value=a.id},n(t(r)(`查看权限并启用`)),9,_e)),i(`button`,{class:`ghost`,onClick:e=>V.value=a.id},n(t(r)(`详情`)),9,ye)])]),_:2},1032,[`title`]))),128))])])):P.value===`market`?(y(),u(`section`,be,[R.value?(y(),l(v,{key:0,title:t(r)(`正在查看市场`),text:t(r)(`连不上的话,这里会说明,不会再显示一串英文错误。`)},null,8,[`title`,`text`])):I.value.length?c(``,!0):(y(),l(v,{key:1,title:t(r)(`市场暂时没有条目`),text:L.value?t(r)(`插件市场的索引还没有发布,或现在连不上。随程序附带的插件在「插件列表」里,默认关闭。`):t(r)(`索引仓库还是空的,或者现在连不上。你仍然可以导入一个插件包。`)},null,8,[`title`,`text`])),R.value?c(``,!0):(y(!0),u(s,{key:2},f(I.value,e=>(y(),l(C,{key:e.id||e.source,title:e.name||e.id},{default:b(()=>[i(`p`,null,n(e.description),1),e.latest?(y(),u(`button`,{key:0,class:`primary`,onClick:t=>Q(`/plugins/market/stage`,{url:e.latest.url,sha256:e.latest.sha256,id:e.id})},n(t(r)(`安装`))+` `+n(e.latest.version),9,T)):c(``,!0)]),_:2},1032,[`title`]))),128))])):P.value===`actions`?(y(),u(`section`,E,[z.value.length?c(``,!0):(y(),l(v,{key:0,title:t(r)(`没有等待同意的事`),text:t(r)(`高风险的行动会先停在这里,等你点头。过一天就不再算数。`)},null,8,[`title`,`text`])),(y(!0),u(s,null,f(z.value,e=>(y(),l(C,{key:e.id,title:e.label},{default:b(()=>[i(`p`,null,n(e.reason),1),i(`div`,D,[i(`button`,{class:`primary`,onClick:n=>t(h)(`/plugins/actions/${e.id}/approve`,{method:`POST`,body:`{}`}).then(X)},n(t(r)(`同意`)),9,O),i(`button`,{class:`ghost`,onClick:n=>t(h)(`/plugins/actions/${e.id}/reject`,{method:`POST`,body:`{}`}).then(X)},n(t(r)(`拒绝`)),9,k)])]),_:2},1032,[`title`]))),128))])):(y(),u(`section`,A,[p(C,{title:t(r)(`从链接导入`)},{default:b(()=>[p(w,{label:t(r)(`插件包地址`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[1]||=e=>W.value.url=e},null,512),[[o,W.value.url]])]),_:1},8,[`label`]),p(w,{label:t(r)(`校验值,可留空`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[2]||=e=>W.value.sha256=e},null,512),[[o,W.value.sha256]])]),_:1},8,[`label`]),i(`button`,{class:`primary`,onClick:m[3]||=e=>Q(`/plugins/import/url`,W.value)},n(t(r)(`检查这个包`)),1)]),_:1},8,[`title`]),p(C,{title:t(r)(`从 GitHub 导入`)},{default:b(()=>[p(w,{label:t(r)(`仓库地址`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[4]||=e=>G.value=e,placeholder:`https://github.com/owner/name`},null,512),[[o,G.value]])]),_:1},8,[`label`]),i(`button`,{class:`primary`,onClick:m[5]||=e=>Q(`/plugins/import/github`,{repository:G.value})},n(t(r)(`检查这个仓库`)),1)]),_:1},8,[`title`]),p(C,{title:t(r)(`本机目录(开发)`)},{default:b(()=>[p(w,{label:t(r)(`目录`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[6]||=e=>K.value=e},null,512),[[o,K.value]])]),_:1},8,[`label`]),i(`button`,{class:`ghost`,onClick:m[7]||=e=>Q(`/plugins/import/dir`,{dir:K.value})},n(t(r)(`按开发插件接上`)),1)]),_:1},8,[`title`]),p(C,{title:t(r)(`索引源`)},{default:b(()=>[p(w,{label:t(r)(`索引地址`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[8]||=e=>q.value=e},null,512),[[o,q.value]])]),_:1},8,[`label`]),i(`button`,{class:`ghost`,onClick:m[9]||=e=>t(h)(`/plugins/sources`,{method:`POST`,body:JSON.stringify({url:q.value})})},n(t(r)(`添加索引`)),1)]),_:1},8,[`title`])])),H.value?(y(),l(C,{key:5,title:t(r)(`先看清它要什么`)},{default:b(()=>[i(`p`,null,n(H.value.manifest?.name)+` `+n(H.value.manifest?.version)+` · `+n(H.value.trusted?t(r)(`校验通过`):t(r)(`未登记来源`)),1),i(`ul`,null,[(y(!0),u(s,null,f(H.value.permissions,e=>(y(),u(`li`,{key:e},n(e),1))),128))]),i(`button`,{class:`primary`,onClick:ke},n(t(r)(`同意这些权限并安装`)),1)]),_:1},8,[`title`])):c(``,!0),p(oe,{open:!!Y.value,title:Y.value?.manifest.name||``,onClose:m[13]||=e=>V.value=``},{default:b(()=>[Y.value?(y(),u(s,{key:0},[i(`p`,null,n(Y.value.manifest.description),1),i(`ul`,null,[(y(!0),u(s,null,f(Y.value.risk,e=>(y(),u(`li`,{key:e.name},n(Ae(e.risk))+` · `+n(e.label),1))),128))]),i(`form`,{class:`settings`,onSubmit:m[11]||=a(e=>De().catch(e=>B.value.value=e.message),[`prevent`])},[(y(!0),u(s,null,f(Y.value.manifest.settings||[],e=>(y(),u(s,{key:e.key},[e.type===`boolean`?(y(),u(`label`,j,[i(`span`,null,n(e.label),1),S(i(`input`,{"onUpdate:modelValue":t=>U.value[e.key]=t,type:`checkbox`},null,8,M),[[ie,U.value[e.key]]])])):(y(),l(w,{key:1,label:e.label},{default:b(()=>[e.type===`secret`?S((y(),u(`input`,{key:0,type:`password`,"onUpdate:modelValue":t=>U.value[e.key]=t,placeholder:t(r)(`已保存的不会回显`)},null,8,N)),[[o,U.value[e.key]]]):e.type===`textarea`||e.type===`urls`?S((y(),u(`textarea`,{key:1,"onUpdate:modelValue":t=>U.value[e.key]=t,rows:`4`,placeholder:e.type===`urls`?t(r)(`一行一个地址`):void 0},null,8,xe)),[[o,U.value[e.key]]]):S((y(),u(`input`,{key:2,"onUpdate:modelValue":t=>U.value[e.key]=t},null,8,Se)),[[o,U.value[e.key]]])]),_:2},1032,[`label`]))],64))),128)),i(`div`,Ce,[i(`button`,we,n(t(r)(`保存设置`)),1),Y.value.enabled?c(``,!0):(y(),u(`button`,{key:0,class:`primary`,type:`button`,onClick:m[10]||=e=>Oe(Y.value)},n(t(r)(`同意这些权限并启用`)),1))])],32),Y.value.enabled&&Y.value.manifest.contributes?.page?(y(),u(`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)):c(``,!0),Y.value.source===`builtin`?c(``,!0):(y(),u(`div`,Ee,[i(`button`,{class:`ghost`,onClick:m[12]||=e=>{t(h)(`/plugins/${Y.value.id}`,{method:`DELETE`,body:`{}`}).then(()=>{V.value=``,X()})}},n(t(r)(`卸载`)),1)]))],64)):c(``,!0)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-042ad318`]]);export{P as default};
@@ -1 +1 @@
1
- .connect[data-v-6f4553ed]{gap:var(--gap);grid-template-columns:minmax(0,1.25fr) minmax(290px,.9fr);align-items:start;display:grid}.connection[data-v-6f4553ed]{gap:20px;display:grid}.connection-details[data-v-6f4553ed]{gap:10px;display:grid}.detail[data-v-6f4553ed]{border:1px solid var(--line);background:color-mix(in srgb, var(--surface-strong) 70%, transparent);border-radius:14px;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;padding:13px 16px;display:flex}.detail code[data-v-6f4553ed]{overflow-wrap:anywhere}.warn-text[data-v-6f4553ed]{color:var(--warn);overflow-wrap:anywhere}.instructions[data-v-6f4553ed]{gap:11px;margin:0;padding-left:22px;line-height:1.65;display:grid}.notes[data-v-6f4553ed]{gap:8px;margin:0;padding-left:20px;font-size:13px;line-height:1.6;display:grid}.note[data-v-6f4553ed]{margin:-8px 0 0;font-size:12px}.checks[data-v-6f4553ed]{gap:8px;margin:0;padding:0;list-style:none;display:grid}.checks li[data-v-6f4553ed]{background:color-mix(in srgb, var(--surface-strong) 70%, transparent);border:1px solid var(--line);border-radius:14px;align-items:center;gap:12px;padding:10px 12px;display:flex}.checks li>div[data-v-6f4553ed]{flex:1;min-width:0;display:grid}.checks small[data-v-6f4553ed]{font-size:12px}.mark[data-v-6f4553ed]{border:2px solid var(--line);border-radius:50%;flex:none;place-items:center;width:22px;height:22px;font-size:11px;font-weight:700;display:grid}.done .mark[data-v-6f4553ed]{border-color:var(--ok);background:var(--ok);color:var(--accent-ink)}@media (width<=1000px){.connect[data-v-6f4553ed]{grid-template-columns:minmax(0,1fr)}}.embedding-profile[data-v-6873efbb]{min-width:0}.fields[data-v-6873efbb]{grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:14px;margin:16px 0;display:grid}.save-bar[data-v-6873efbb]{position:relative;bottom:auto}.library[data-v-59f18516]{gap:var(--gap);grid-template-columns:minmax(0,1fr);display:grid}.model-workspace[data-v-59f18516]{gap:var(--gap);grid-template-columns:minmax(260px,.32fr) minmax(0,1fr);align-items:start;display:grid}.shelf[data-v-59f18516]{background:radial-gradient(ellipse at 0 0, color-mix(in srgb, var(--glow-a) 23%, transparent), transparent 56%), var(--surface);gap:15px;display:grid;position:sticky;top:14px}.detail[data-v-59f18516]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-b) 16%, transparent), transparent 47%), var(--surface)}.usage-panel[data-v-59f18516]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 25%, transparent), transparent 42%), radial-gradient(ellipse at 0 100%, color-mix(in srgb, var(--glow-b) 20%, transparent), transparent 46%), var(--surface);grid-column:1/-1;gap:18px;display:grid;overflow:hidden}.usage-intro[data-v-59f18516]{justify-content:space-between;align-items:end;gap:20px;display:flex}.usage-intro h2[data-v-59f18516]{letter-spacing:-.04em;margin:5px 0 4px;font-size:22px}.usage-intro p[data-v-59f18516],.usage-foot small[data-v-59f18516]{color:var(--ink-soft);font-size:12px}.usage-total[data-v-59f18516]{flex:none;justify-items:end;display:grid}.usage-total strong[data-v-59f18516]{color:var(--accent);font:700 clamp(28px, 4vw, 42px) var(--font-display);letter-spacing:-.055em;font-variant-numeric:tabular-nums;line-height:1.05}.usage-total span[data-v-59f18516]{color:var(--ink-soft);font-size:12px}.usage-detail[data-v-59f18516]{grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;display:grid}.usage-stat[data-v-59f18516]{background:#ffffff5c;border:1px solid #ffffffc7;border-radius:18px;gap:5px;min-width:0;padding:14px 16px;display:grid;box-shadow:inset 0 1px #fff}.usage-stat span[data-v-59f18516]{color:var(--ink-soft);font-size:12px}.usage-stat span small[data-v-59f18516]{font-size:10px}.usage-stat b[data-v-59f18516]{font-variant-numeric:tabular-nums;text-overflow:ellipsis;font-size:19px;overflow:hidden}.usage-foot[data-v-59f18516]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}.usage-error[data-v-59f18516]{color:var(--danger)!important}.usage-refresh[data-v-59f18516]{color:var(--accent);font-size:12px}.shelf-head[data-v-59f18516]{justify-content:space-between;align-items:center;gap:8px;display:flex}.shelf-head h2[data-v-59f18516]{letter-spacing:-.04em;font-size:21px}.shelf-head small[data-v-59f18516]{color:var(--ink-soft);font-size:12px}.rows[data-v-59f18516]{gap:8px;max-height:520px;display:grid;overflow:auto}.saved-vendor[data-v-59f18516]{background:#fff3;border:1px solid #ffffffad;border-radius:17px;overflow:hidden;box-shadow:inset 0 1px #ffffffb8}.saved-vendor>summary[data-v-59f18516]{color:var(--ink);cursor:pointer;justify-content:space-between;align-items:center;gap:8px;padding:11px 13px;font-size:12px;font-weight:700;list-style:none;display:flex}.saved-vendor>summary[data-v-59f18516]::-webkit-details-marker{display:none}.vendor-summary[data-v-59f18516]::-webkit-details-marker{display:none}.saved-vendor>summary[data-v-59f18516]:after{color:var(--accent);content:"⌄";transition:transform .24s var(--spring);font-size:15px}.saved-vendor[open]>summary[data-v-59f18516]{background:#ffffff40;border-bottom:1px solid #fff9}.saved-vendor[open]>summary[data-v-59f18516]:after{transform:rotate(180deg)}.saved-vendor>summary small[data-v-59f18516]{color:var(--ink-soft);margin-left:auto;font-size:10px;font-weight:500}.vendor-models[data-v-59f18516]{gap:6px;padding:7px;display:grid}.entity-row[data-v-59f18516]{text-align:left;-webkit-backdrop-filter:blur(16px)saturate(1.5);backdrop-filter:blur(16px)saturate(1.5);width:100%;transition:transform .32s var(--spring), background-color .2s, box-shadow .25s;background:#ffffff5c;border:1px solid #ffffffbf;border-radius:18px;align-items:center;gap:10px;padding:11px 12px;display:flex;box-shadow:inset 0 1px #fff}.entity-row[data-v-59f18516]:hover:not(:disabled){box-shadow:0 12px 22px -19px var(--accent);background:#ffffffa8;transform:translate(4px)scale(1.01)}.entity-row.selected[data-v-59f18516]{border-color:color-mix(in srgb, var(--accent) 22%, white);background:linear-gradient(115deg, white, color-mix(in srgb, var(--accent-soft) 60%, white));box-shadow:inset 0 1px 0 white, 0 13px 23px -20px var(--accent)}.badge[data-v-59f18516]{background:linear-gradient(145deg, white, hsl(var(--hue) 70% 88%));width:36px;height:36px;color:hsl(var(--hue) 45% 25%);box-shadow:inset 0 1px 0 white, 0 5px 13px -10px hsl(var(--hue) 45% 32%);border-radius:14px;flex:none;place-items:center;font-weight:700;display:grid}.who[data-v-59f18516]{min-width:0;line-height:1.35;display:grid}.who b[data-v-59f18516]{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;overflow:hidden}.who small[data-v-59f18516]{color:var(--ink-soft);font-size:11.5px;font-weight:500}fieldset[data-v-59f18516]{background:linear-gradient(142deg, #ffffffa1, #ffffff47), var(--surface);box-shadow:inset 0 1px 0 white, 0 14px 30px -27px var(--accent);-webkit-backdrop-filter:blur(20px)saturate(1.6);backdrop-filter:blur(20px)saturate(1.6);border:1px solid #ffffffcf;border-radius:24px;gap:10px;margin:0;padding:20px;display:grid}legend[data-v-59f18516]{padding:0 8px;font-size:13px;font-weight:700}.advanced summary[data-v-59f18516]{color:var(--accent);transition:transform .3s var(--spring), background-color .2s;background:#ffffff6b;border:1px solid #fffc;border-radius:14px;padding:12px 15px;font-weight:600;box-shadow:inset 0 1px #fff}.advanced summary[data-v-59f18516]:hover{background:#ffffffa6;transform:translate(3px)}.advanced[open] summary[data-v-59f18516]{margin-bottom:12px}.caps[data-v-59f18516]{flex-wrap:wrap;gap:8px 18px;margin-top:10px;display:flex}.actions[data-v-59f18516]{flex-wrap:wrap;gap:8px;display:flex}.actions .push[data-v-59f18516]{margin-left:auto}.model-picker[data-v-59f18516]{gap:16px;display:grid}.catalog-search[data-v-59f18516]{color:var(--ink-soft);gap:6px;font-size:12px;font-weight:600;display:grid}.catalog-search input[data-v-59f18516]{width:100%;min-height:42px;color:var(--ink);-webkit-backdrop-filter:blur(14px)saturate(1.4);backdrop-filter:blur(14px)saturate(1.4);background:#ffffff9e;border:1px solid #ffffffd9;border-radius:14px;outline:none;padding:0 13px;box-shadow:inset 0 1px #fff}.catalog-search input[data-v-59f18516]:focus{border-color:color-mix(in srgb, var(--accent) 42%, white);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 10%, transparent)}.vendor[data-v-59f18516]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 13%, transparent), transparent 48%), #ffffff3b;-webkit-backdrop-filter:blur(18px)saturate(1.35);backdrop-filter:blur(18px)saturate(1.35);border:1px solid #ffffffb8;border-radius:21px;overflow:hidden;box-shadow:inset 0 1px #ffffffc7}.vendor-summary[data-v-59f18516]{cursor:pointer;justify-content:space-between;align-items:center;gap:12px;min-height:62px;padding:12px 17px;list-style:none;transition:background-color .2s;display:flex}.vendor-summary[data-v-59f18516]:hover{background:#ffffff57}.vendor-name[data-v-59f18516]{align-items:center;gap:10px;min-width:0;display:flex}.vendor-name b[data-v-59f18516]{font-size:13px}.vendor-name small[data-v-59f18516]{color:var(--ink-soft);font-size:10px}.vendor-chevron[data-v-59f18516]{color:var(--accent);transition:transform .28s var(--spring);font-size:20px;line-height:1}.vendor[open] .vendor-chevron[data-v-59f18516]{transform:rotate(180deg)}.vendor[open] .presets[data-v-59f18516]{animation:vendor-reveal-59f18516 .24s var(--spring) both}@keyframes vendor-reveal-59f18516{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.search-empty[data-v-59f18516]{margin:0}.presets[data-v-59f18516]{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;padding:0 12px 12px;display:grid}.preset-card[data-v-59f18516]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 22%, transparent), transparent 55%), #ffffff80;box-shadow:inset 0 1px 0 white, 0 12px 22px -20px var(--accent);text-align:left;-webkit-backdrop-filter:blur(16px)saturate(1.5);backdrop-filter:blur(16px)saturate(1.5);transition:transform .42s var(--spring), box-shadow .25s;border:1px solid #ffffffd1;border-radius:21px;justify-items:start;gap:3px;padding:17px;font-weight:500;display:grid}.preset-card[data-v-59f18516]:hover:not(:disabled){box-shadow:inset 0 1px 0 white, 0 22px 33px -22px var(--accent);transform:translateY(-6px)rotate(-.5deg)scale(1.025)}.preset-card small[data-v-59f18516]{color:var(--ink-soft);font-size:11.5px}@media (width<=900px){.model-workspace[data-v-59f18516]{grid-template-columns:minmax(0,1fr)}.usage-panel[data-v-59f18516]{grid-column:auto}.shelf[data-v-59f18516]{position:static}}@media (width<=620px){.usage-intro[data-v-59f18516]{flex-direction:column;align-items:start}.usage-total[data-v-59f18516]{justify-items:start}.usage-detail[data-v-59f18516]{grid-template-columns:repeat(2,minmax(0,1fr))}}.runtime-grid[data-v-1f197523]{gap:var(--gap);grid-template-columns:minmax(0,1.55fr) minmax(260px,.8fr);align-items:start;display:grid}.runtime-grid>.card[data-v-1f197523]{background:radial-gradient(ellipse at 90% 0, color-mix(in srgb, var(--glow-a) 20%, transparent), transparent 55%), var(--surface)}.runtime-grid .card-head h2[data-v-1f197523]{letter-spacing:-.035em;margin-top:5px;font-size:23px}.switches[data-v-1f197523]{gap:12px;margin-bottom:20px;display:grid}.switches[data-v-1f197523] .switch{box-shadow:inset 0 1px 0 white, 0 10px 22px -23px var(--accent);-webkit-backdrop-filter:blur(18px)saturate(1.5);backdrop-filter:blur(18px)saturate(1.5);transition:transform .35s var(--spring), background-color .2s;background:#ffffff69;border:1px solid #ffffffc7;border-radius:22px;align-items:flex-start;padding:18px}.switches[data-v-1f197523] .switch:hover{background:#ffffffa3;transform:translateY(-3px)scale(1.008)}.switches[data-v-1f197523] .switch>span{gap:2px;display:grid}.switches small[data-v-1f197523]{color:var(--ink-soft);font-size:12.5px;font-weight:400}.numbers[data-v-1f197523]{gap:12px;display:grid}.numbers button[data-v-1f197523],.numbers .stat[data-v-1f197523]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-b) 24%, transparent), transparent 63%), #ffffff70;box-shadow:inset 0 1px 0 white, 0 12px 26px -24px var(--accent);text-align:left;-webkit-backdrop-filter:blur(18px)saturate(1.55);backdrop-filter:blur(18px)saturate(1.55);transition:transform .38s var(--spring), box-shadow .23s;border:1px solid #ffffffd4;border-radius:22px;justify-items:start;gap:2px;padding:20px 21px;display:grid}.numbers button[data-v-1f197523]:hover:not(:disabled){box-shadow:inset 0 1px 0 white, 0 18px 28px -22px var(--accent);transform:translate(5px)scale(1.018)}.numbers b[data-v-1f197523]{font:750 29px var(--font-display);color:var(--accent)}.numbers .stat.warn b[data-v-1f197523]{color:var(--warn)}.numbers .stat.danger b[data-v-1f197523]{color:var(--danger)}.numbers span[data-v-1f197523]{color:var(--ink-soft);font-size:12.5px;font-weight:500}@media (width<=900px){.runtime-grid[data-v-1f197523]{grid-template-columns:minmax(0,1fr)}}.search-profile[data-v-e874d8b6]{gap:16px;min-width:0;display:grid}.search-profile form[data-v-e874d8b6]{gap:18px;display:grid}.search-fields[data-v-e874d8b6]{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.search-fields label[data-v-e874d8b6]{gap:8px;min-width:0;display:grid}.search-fields input[data-v-e874d8b6],.search-fields .menu-select[data-v-e874d8b6]{width:100%;min-width:0}.search-usage[data-v-e874d8b6]{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.search-result[data-v-e874d8b6]{border:1px solid var(--line);background:var(--surface);overflow-wrap:anywhere;border-radius:16px;padding:14px 16px}.search-result.failed[data-v-e874d8b6]{border-color:color-mix(in srgb, var(--warn) 40%, var(--line))}@media (width<=620px){.search-fields[data-v-e874d8b6]{grid-template-columns:minmax(0,1fr)}}.storage-page[data-v-79fb7512]{gap:var(--gap);display:grid}.storage-page>.card[data-v-79fb7512],.storage-grid>.card[data-v-79fb7512]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 20%, transparent), transparent 60%), var(--surface)}.storage-overview h2[data-v-79fb7512]{margin:8px 0;font-size:clamp(24px,3vw,36px)}.storage-overview p[data-v-79fb7512],.storage-note[data-v-79fb7512]{color:var(--ink-soft);font-size:13px;line-height:1.65}.storage-metrics[data-v-79fb7512]{flex-wrap:wrap;gap:12px;margin-top:22px;display:flex}.storage-metrics>div[data-v-79fb7512]{background:#ffffff6b;border:1px solid #fffc;border-radius:18px;gap:3px;min-width:150px;padding:15px 20px;display:grid}.storage-metrics b[data-v-79fb7512]{color:var(--accent);font-size:23px}.storage-metrics span[data-v-79fb7512]{color:var(--ink-soft);font-size:12px}.storage-grid[data-v-79fb7512]{gap:var(--gap);grid-template-columns:minmax(270px,.8fr) minmax(0,1.5fr);align-items:start;display:grid}.storage-grid .card-head h2[data-v-79fb7512]{margin:4px 0 16px;font-size:23px}.storage-check[data-v-79fb7512]{align-items:center;gap:9px;margin-bottom:16px;display:flex}.storage-fields[data-v-79fb7512]{gap:13px;display:grid}.storage-fields label[data-v-79fb7512]{color:var(--ink-soft);gap:6px;font-size:12px;font-weight:700;display:grid}.storage-fields input[data-v-79fb7512]{border:1px solid color-mix(in srgb, var(--accent) 25%, white);width:100%;min-width:0;color:var(--ink);background:#ffffffb3;border-radius:15px;padding:11px 13px}.storage-policy .primary[data-v-79fb7512]{margin-top:14px}.storage-actions[data-v-79fb7512]{flex-wrap:wrap;gap:8px;margin:16px 0;display:flex}.storage-actions button[data-v-79fb7512]{background:#ffffffa6;border-radius:999px;padding:8px 12px}.storage-scroll[data-v-79fb7512]{gap:7px;max-height:520px;padding:2px;display:grid;overflow:auto}.storage-row[data-v-79fb7512]{cursor:pointer;background:#ffffff7a;border:1px solid #ffffffbf;border-radius:16px;align-items:center;gap:12px;min-width:0;padding:10px 12px;display:flex}.storage-row.protected[data-v-79fb7512]{opacity:.7;cursor:default}.storage-item[data-v-79fb7512]{flex:1;gap:3px;min-width:0;display:grid}.storage-item strong[data-v-79fb7512]{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.storage-item small[data-v-79fb7512]{color:var(--ink-soft);font-size:11px}.storage-row>b[data-v-79fb7512]{white-space:nowrap;color:var(--accent);font-size:12px}.storage-footer[data-v-79fb7512]{color:var(--ink-soft);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;padding-top:18px;font-size:12px;display:flex}.storage-error[data-v-79fb7512]{color:var(--danger);overflow-wrap:anywhere}@media (width<=900px){.storage-grid[data-v-79fb7512]{grid-template-columns:minmax(0,1fr)}}@media (width<=560px){.storage-row[data-v-79fb7512]{flex-wrap:wrap;align-items:flex-start}.storage-row>b[data-v-79fb7512]{margin-left:26px}.storage-metrics>div[data-v-79fb7512]{flex:1;min-width:130px}}.password-settings[data-v-36cd9f70]{margin-top:24px}form[data-v-36cd9f70]{gap:16px;max-width:520px;display:grid}label[data-v-36cd9f70]{gap:8px;display:grid}input[data-v-36cd9f70]{box-sizing:border-box;width:100%}.system[data-v-0f629207]{gap:var(--gap);display:grid}.system-intro[data-v-0f629207]{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;flex-wrap:wrap;justify-content:space-between;align-items:end;gap:20px;padding:32px clamp(26px,5vw,60px);display:flex;position:relative;overflow:hidden}.system-intro[data-v-0f629207]: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%;animation:10s ease-in-out infinite alternate system-bob-0f629207;position:absolute;top:-85%;right:13%}.system-intro h1[data-v-0f629207]{letter-spacing:-.055em;margin:10px 0 7px;font-size:clamp(28px,3.25vw,42px)}.system-intro h1 em[data-v-0f629207]{color:var(--accent);font-style:normal}.system-intro p[data-v-0f629207]{max-width:560px;color:var(--ink-soft);font-size:13.5px;position:relative}.system-status[data-v-0f629207]{z-index:1;box-shadow:inset 0 1px 0 white, 0 7px 19px -15px var(--accent);white-space:nowrap;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background:#ffffff87;border:1px solid #fff;border-radius:999px;align-items:center;gap:9px;padding:10px 16px;font-size:12.5px;font-weight:700;display:inline-flex}.system-status i[data-v-0f629207]{background:var(--ok);width:9px;height:9px;box-shadow:0 0 0 4px color-mix(in srgb, var(--ok) 18%, transparent);border-radius:50%;animation:2.6s ease-in-out infinite pulse-soft}.system-status i.off[data-v-0f629207]{background:var(--ink-faint);box-shadow:0 0 0 4px color-mix(in srgb, var(--ink-faint) 14%, transparent);animation:none}.system>.tabs[data-v-0f629207]{box-shadow:inset 0 1px 0 white, 0 10px 30px -24px var(--accent);-webkit-backdrop-filter:blur(22px)saturate(1.7);backdrop-filter:blur(22px)saturate(1.7);border:1px solid #fffc;justify-self:start;padding:5px}.system[data-v-0f629207]>.tabs button{transition:transform .35s var(--spring), background-color .2s, box-shadow .2s;border-radius:999px;padding:9px 18px}.system[data-v-0f629207]>.tabs button:hover{transform:translateY(-2px)scale(1.03)}.system[data-v-0f629207] .connect .step,.system[data-v-0f629207] .connect .checks li{background:linear-gradient(145deg, #ffffffad, #ffffff47), var(--surface);box-shadow:inset 0 1px 0 white, 0 12px 24px -24px var(--accent);-webkit-backdrop-filter:blur(18px)saturate(1.55);backdrop-filter:blur(18px)saturate(1.55);transition:transform .35s var(--spring), box-shadow .25s;border:1px solid #ffffffd9;border-radius:22px}.system[data-v-0f629207] .connect .step:hover,.system[data-v-0f629207] .connect .checks li:hover{box-shadow:inset 0 1px 0 white, 0 16px 28px -21px var(--accent);transform:translateY(-3px)}.system[data-v-0f629207] .connect .num{background:linear-gradient(145deg, white, color-mix(in srgb, var(--glow-a) 75%, white));box-shadow:inset 0 1px 0 white, 0 5px 14px -9px var(--accent);color:var(--accent);border:1px solid #fff}@keyframes system-bob-0f629207{to{transform:translateY(22px)scale(1.08)}}@media (width<=760px){.system-intro[data-v-0f629207]{min-height:0;padding:27px 23px}}
1
+ .connect[data-v-6f4553ed]{gap:var(--gap);grid-template-columns:minmax(0,1.25fr) minmax(290px,.9fr);align-items:start;display:grid}.connection[data-v-6f4553ed]{gap:20px;display:grid}.connection-details[data-v-6f4553ed]{gap:10px;display:grid}.detail[data-v-6f4553ed]{border:1px solid var(--line);background:color-mix(in srgb, var(--surface-strong) 70%, transparent);border-radius:14px;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;padding:13px 16px;display:flex}.detail code[data-v-6f4553ed]{overflow-wrap:anywhere}.warn-text[data-v-6f4553ed]{color:var(--warn);overflow-wrap:anywhere}.instructions[data-v-6f4553ed]{gap:11px;margin:0;padding-left:22px;line-height:1.65;display:grid}.notes[data-v-6f4553ed]{gap:8px;margin:0;padding-left:20px;font-size:13px;line-height:1.6;display:grid}.note[data-v-6f4553ed]{margin:-8px 0 0;font-size:12px}.checks[data-v-6f4553ed]{gap:8px;margin:0;padding:0;list-style:none;display:grid}.checks li[data-v-6f4553ed]{background:color-mix(in srgb, var(--surface-strong) 70%, transparent);border:1px solid var(--line);border-radius:14px;align-items:center;gap:12px;padding:10px 12px;display:flex}.checks li>div[data-v-6f4553ed]{flex:1;min-width:0;display:grid}.checks small[data-v-6f4553ed]{font-size:12px}.mark[data-v-6f4553ed]{border:2px solid var(--line);border-radius:50%;flex:none;place-items:center;width:22px;height:22px;font-size:11px;font-weight:700;display:grid}.done .mark[data-v-6f4553ed]{border-color:var(--ok);background:var(--ok);color:var(--accent-ink)}@media (width<=1000px){.connect[data-v-6f4553ed]{grid-template-columns:minmax(0,1fr)}}.embedding-profile[data-v-6873efbb]{min-width:0}.fields[data-v-6873efbb]{grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:14px;margin:16px 0;display:grid}.save-bar[data-v-6873efbb]{position:relative;bottom:auto}.library[data-v-59f18516]{gap:var(--gap);grid-template-columns:minmax(0,1fr);display:grid}.model-workspace[data-v-59f18516]{gap:var(--gap);grid-template-columns:minmax(260px,.32fr) minmax(0,1fr);align-items:start;display:grid}.shelf[data-v-59f18516]{background:radial-gradient(ellipse at 0 0, color-mix(in srgb, var(--glow-a) 23%, transparent), transparent 56%), var(--surface);gap:15px;display:grid;position:sticky;top:14px}.detail[data-v-59f18516]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-b) 16%, transparent), transparent 47%), var(--surface)}.usage-panel[data-v-59f18516]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 25%, transparent), transparent 42%), radial-gradient(ellipse at 0 100%, color-mix(in srgb, var(--glow-b) 20%, transparent), transparent 46%), var(--surface);grid-column:1/-1;gap:18px;display:grid;overflow:hidden}.usage-intro[data-v-59f18516]{justify-content:space-between;align-items:end;gap:20px;display:flex}.usage-intro h2[data-v-59f18516]{letter-spacing:-.04em;margin:5px 0 4px;font-size:22px}.usage-intro p[data-v-59f18516],.usage-foot small[data-v-59f18516]{color:var(--ink-soft);font-size:12px}.usage-total[data-v-59f18516]{flex:none;justify-items:end;display:grid}.usage-total strong[data-v-59f18516]{color:var(--accent);font:700 clamp(28px, 4vw, 42px) var(--font-display);letter-spacing:-.055em;font-variant-numeric:tabular-nums;line-height:1.05}.usage-total span[data-v-59f18516]{color:var(--ink-soft);font-size:12px}.usage-detail[data-v-59f18516]{grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;display:grid}.usage-stat[data-v-59f18516]{background:#ffffff5c;border:1px solid #ffffffc7;border-radius:18px;gap:5px;min-width:0;padding:14px 16px;display:grid;box-shadow:inset 0 1px #fff}.usage-stat span[data-v-59f18516]{color:var(--ink-soft);font-size:12px}.usage-stat span small[data-v-59f18516]{font-size:10px}.usage-stat b[data-v-59f18516]{font-variant-numeric:tabular-nums;text-overflow:ellipsis;font-size:19px;overflow:hidden}.usage-foot[data-v-59f18516]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}.usage-error[data-v-59f18516]{color:var(--danger)!important}.usage-refresh[data-v-59f18516]{color:var(--accent);font-size:12px}.shelf-head[data-v-59f18516]{justify-content:space-between;align-items:center;gap:8px;display:flex}.shelf-head h2[data-v-59f18516]{letter-spacing:-.04em;font-size:21px}.shelf-head small[data-v-59f18516]{color:var(--ink-soft);font-size:12px}.rows[data-v-59f18516]{gap:8px;max-height:520px;display:grid;overflow:auto}.saved-vendor[data-v-59f18516]{background:#fff3;border:1px solid #ffffffad;border-radius:17px;overflow:hidden;box-shadow:inset 0 1px #ffffffb8}.saved-vendor>summary[data-v-59f18516]{color:var(--ink);cursor:pointer;justify-content:space-between;align-items:center;gap:8px;padding:11px 13px;font-size:12px;font-weight:700;list-style:none;display:flex}.saved-vendor>summary[data-v-59f18516]::-webkit-details-marker{display:none}.vendor-summary[data-v-59f18516]::-webkit-details-marker{display:none}.saved-vendor>summary[data-v-59f18516]:after{color:var(--accent);content:"⌄";transition:transform .24s var(--spring);font-size:15px}.saved-vendor[open]>summary[data-v-59f18516]{background:#ffffff40;border-bottom:1px solid #fff9}.saved-vendor[open]>summary[data-v-59f18516]:after{transform:rotate(180deg)}.saved-vendor>summary small[data-v-59f18516]{color:var(--ink-soft);margin-left:auto;font-size:10px;font-weight:500}.vendor-models[data-v-59f18516]{gap:6px;padding:7px;display:grid}.entity-row[data-v-59f18516]{text-align:left;-webkit-backdrop-filter:blur(16px)saturate(1.5);backdrop-filter:blur(16px)saturate(1.5);width:100%;transition:transform .32s var(--spring), background-color .2s, box-shadow .25s;background:#ffffff5c;border:1px solid #ffffffbf;border-radius:18px;align-items:center;gap:10px;padding:11px 12px;display:flex;box-shadow:inset 0 1px #fff}.entity-row[data-v-59f18516]:hover:not(:disabled){box-shadow:0 12px 22px -19px var(--accent);background:#ffffffa8;transform:translate(4px)scale(1.01)}.entity-row.selected[data-v-59f18516]{border-color:color-mix(in srgb, var(--accent) 22%, white);background:linear-gradient(115deg, white, color-mix(in srgb, var(--accent-soft) 60%, white));box-shadow:inset 0 1px 0 white, 0 13px 23px -20px var(--accent)}.badge[data-v-59f18516]{background:linear-gradient(145deg, white, hsl(var(--hue) 70% 88%));width:36px;height:36px;color:hsl(var(--hue) 45% 25%);box-shadow:inset 0 1px 0 white, 0 5px 13px -10px hsl(var(--hue) 45% 32%);border-radius:14px;flex:none;place-items:center;font-weight:700;display:grid}.who[data-v-59f18516]{min-width:0;line-height:1.35;display:grid}.who b[data-v-59f18516]{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;overflow:hidden}.who small[data-v-59f18516]{color:var(--ink-soft);font-size:11.5px;font-weight:500}fieldset[data-v-59f18516]{background:linear-gradient(142deg, #ffffffa1, #ffffff47), var(--surface);box-shadow:inset 0 1px 0 white, 0 14px 30px -27px var(--accent);-webkit-backdrop-filter:blur(20px)saturate(1.6);backdrop-filter:blur(20px)saturate(1.6);border:1px solid #ffffffcf;border-radius:24px;gap:10px;margin:0;padding:20px;display:grid}legend[data-v-59f18516]{padding:0 8px;font-size:13px;font-weight:700}.advanced summary[data-v-59f18516]{color:var(--accent);transition:transform .3s var(--spring), background-color .2s;background:#ffffff6b;border:1px solid #fffc;border-radius:14px;padding:12px 15px;font-weight:600;box-shadow:inset 0 1px #fff}.advanced summary[data-v-59f18516]:hover{background:#ffffffa6;transform:translate(3px)}.advanced[open] summary[data-v-59f18516]{margin-bottom:12px}.caps[data-v-59f18516]{flex-wrap:wrap;gap:8px 18px;margin-top:10px;display:flex}.actions[data-v-59f18516]{flex-wrap:wrap;gap:8px;display:flex}.actions .push[data-v-59f18516]{margin-left:auto}.model-picker[data-v-59f18516]{gap:16px;display:grid}.catalog-search[data-v-59f18516]{color:var(--ink-soft);gap:6px;font-size:12px;font-weight:600;display:grid}.catalog-search input[data-v-59f18516]{width:100%;min-height:42px;color:var(--ink);-webkit-backdrop-filter:blur(14px)saturate(1.4);backdrop-filter:blur(14px)saturate(1.4);background:#ffffff9e;border:1px solid #ffffffd9;border-radius:14px;outline:none;padding:0 13px;box-shadow:inset 0 1px #fff}.catalog-search input[data-v-59f18516]:focus{border-color:color-mix(in srgb, var(--accent) 42%, white);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 10%, transparent)}.vendor[data-v-59f18516]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 13%, transparent), transparent 48%), #ffffff3b;-webkit-backdrop-filter:blur(18px)saturate(1.35);backdrop-filter:blur(18px)saturate(1.35);border:1px solid #ffffffb8;border-radius:21px;overflow:hidden;box-shadow:inset 0 1px #ffffffc7}.vendor-summary[data-v-59f18516]{cursor:pointer;justify-content:space-between;align-items:center;gap:12px;min-height:62px;padding:12px 17px;list-style:none;transition:background-color .2s;display:flex}.vendor-summary[data-v-59f18516]:hover{background:#ffffff57}.vendor-name[data-v-59f18516]{align-items:center;gap:10px;min-width:0;display:flex}.vendor-name b[data-v-59f18516]{font-size:13px}.vendor-name small[data-v-59f18516]{color:var(--ink-soft);font-size:10px}.vendor-chevron[data-v-59f18516]{color:var(--accent);transition:transform .28s var(--spring);font-size:20px;line-height:1}.vendor[open] .vendor-chevron[data-v-59f18516]{transform:rotate(180deg)}.vendor[open] .presets[data-v-59f18516]{animation:vendor-reveal-59f18516 .24s var(--spring) both}@keyframes vendor-reveal-59f18516{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.search-empty[data-v-59f18516]{margin:0}.presets[data-v-59f18516]{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;padding:0 12px 12px;display:grid}.preset-card[data-v-59f18516]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 22%, transparent), transparent 55%), #ffffff80;box-shadow:inset 0 1px 0 white, 0 12px 22px -20px var(--accent);text-align:left;-webkit-backdrop-filter:blur(16px)saturate(1.5);backdrop-filter:blur(16px)saturate(1.5);transition:transform .42s var(--spring), box-shadow .25s;border:1px solid #ffffffd1;border-radius:21px;justify-items:start;gap:3px;padding:17px;font-weight:500;display:grid}.preset-card[data-v-59f18516]:hover:not(:disabled){box-shadow:inset 0 1px 0 white, 0 22px 33px -22px var(--accent);transform:translateY(-6px)rotate(-.5deg)scale(1.025)}.preset-card small[data-v-59f18516]{color:var(--ink-soft);font-size:11.5px}@media (width<=900px){.model-workspace[data-v-59f18516]{grid-template-columns:minmax(0,1fr)}.usage-panel[data-v-59f18516]{grid-column:auto}.shelf[data-v-59f18516]{position:static}}@media (width<=620px){.usage-intro[data-v-59f18516]{flex-direction:column;align-items:start}.usage-total[data-v-59f18516]{justify-items:start}.usage-detail[data-v-59f18516]{grid-template-columns:repeat(2,minmax(0,1fr))}}.runtime-grid[data-v-1f197523]{gap:var(--gap);grid-template-columns:minmax(0,1.55fr) minmax(260px,.8fr);align-items:start;display:grid}.runtime-grid>.card[data-v-1f197523]{background:radial-gradient(ellipse at 90% 0, color-mix(in srgb, var(--glow-a) 20%, transparent), transparent 55%), var(--surface)}.runtime-grid .card-head h2[data-v-1f197523]{letter-spacing:-.035em;margin-top:5px;font-size:23px}.switches[data-v-1f197523]{gap:12px;margin-bottom:20px;display:grid}.switches[data-v-1f197523] .switch{box-shadow:inset 0 1px 0 white, 0 10px 22px -23px var(--accent);-webkit-backdrop-filter:blur(18px)saturate(1.5);backdrop-filter:blur(18px)saturate(1.5);transition:transform .35s var(--spring), background-color .2s;background:#ffffff69;border:1px solid #ffffffc7;border-radius:22px;align-items:flex-start;padding:18px}.switches[data-v-1f197523] .switch:hover{background:#ffffffa3;transform:translateY(-3px)scale(1.008)}.switches[data-v-1f197523] .switch>span{gap:2px;display:grid}.switches small[data-v-1f197523]{color:var(--ink-soft);font-size:12.5px;font-weight:400}.numbers[data-v-1f197523]{gap:12px;display:grid}.numbers button[data-v-1f197523],.numbers .stat[data-v-1f197523]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-b) 24%, transparent), transparent 63%), #ffffff70;box-shadow:inset 0 1px 0 white, 0 12px 26px -24px var(--accent);text-align:left;-webkit-backdrop-filter:blur(18px)saturate(1.55);backdrop-filter:blur(18px)saturate(1.55);transition:transform .38s var(--spring), box-shadow .23s;border:1px solid #ffffffd4;border-radius:22px;justify-items:start;gap:2px;padding:20px 21px;display:grid}.numbers button[data-v-1f197523]:hover:not(:disabled){box-shadow:inset 0 1px 0 white, 0 18px 28px -22px var(--accent);transform:translate(5px)scale(1.018)}.numbers b[data-v-1f197523]{font:750 29px var(--font-display);color:var(--accent)}.numbers .stat.warn b[data-v-1f197523]{color:var(--warn)}.numbers .stat.danger b[data-v-1f197523]{color:var(--danger)}.numbers span[data-v-1f197523]{color:var(--ink-soft);font-size:12.5px;font-weight:500}@media (width<=900px){.runtime-grid[data-v-1f197523]{grid-template-columns:minmax(0,1fr)}}.search-profile[data-v-e874d8b6]{gap:16px;min-width:0;display:grid}.search-profile form[data-v-e874d8b6]{gap:18px;display:grid}.search-fields[data-v-e874d8b6]{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.search-fields label[data-v-e874d8b6]{gap:8px;min-width:0;display:grid}.search-fields input[data-v-e874d8b6],.search-fields .menu-select[data-v-e874d8b6]{width:100%;min-width:0}.search-usage[data-v-e874d8b6]{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.search-result[data-v-e874d8b6]{border:1px solid var(--line);background:var(--surface);overflow-wrap:anywhere;border-radius:16px;padding:14px 16px}.search-result.failed[data-v-e874d8b6]{border-color:color-mix(in srgb, var(--warn) 40%, var(--line))}@media (width<=620px){.search-fields[data-v-e874d8b6]{grid-template-columns:minmax(0,1fr)}}.data-transfer[data-v-ea16c0c1]{min-width:0}.data-transfer h2[data-v-ea16c0c1]{margin:8px 0 14px;font-size:clamp(23px,3vw,32px)}.transfer-note[data-v-ea16c0c1]{color:var(--ink-soft);overflow-wrap:anywhere;font-size:13px;line-height:1.7}.transfer-actions[data-v-ea16c0c1]{flex-wrap:wrap;gap:10px;margin:18px 0;display:flex}.transfer-actions button[data-v-ea16c0c1]{border-radius:16px;padding:11px 17px}.transfer-actions button[data-v-ea16c0c1]:not(.primary){background:#ffffffb8}.transfer-file[data-v-ea16c0c1]{display:none}.transfer-preview[data-v-ea16c0c1]{overflow-wrap:anywhere;background:#fff6;border:1px solid #ffffffd9;border-radius:22px;margin-top:20px;padding:20px}.transfer-preview h3[data-v-ea16c0c1]{margin:8px 0}.transfer-counts[data-v-ea16c0c1]{flex-wrap:wrap;gap:10px;display:flex}.transfer-counts>div[data-v-ea16c0c1]{background:#ffffffa6;border-radius:14px;gap:4px;min-width:70px;padding:12px;display:grid}.transfer-counts b[data-v-ea16c0c1],.transfer-progress[data-v-ea16c0c1]{color:var(--accent)}.transfer-counts span[data-v-ea16c0c1]{color:var(--ink-soft);font-size:12px}.transfer-error[data-v-ea16c0c1]{color:var(--danger);overflow-wrap:anywhere}.storage-page[data-v-4593780e]{gap:var(--gap);display:grid}.storage-page>.card[data-v-4593780e],.storage-grid>.card[data-v-4593780e]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 20%, transparent), transparent 60%), var(--surface)}.storage-overview h2[data-v-4593780e]{margin:8px 0;font-size:clamp(24px,3vw,36px)}.storage-overview p[data-v-4593780e],.storage-note[data-v-4593780e]{color:var(--ink-soft);font-size:13px;line-height:1.65}.storage-metrics[data-v-4593780e]{flex-wrap:wrap;gap:12px;margin-top:22px;display:flex}.storage-metrics>div[data-v-4593780e]{background:#ffffff6b;border:1px solid #fffc;border-radius:18px;gap:3px;min-width:150px;padding:15px 20px;display:grid}.storage-metrics b[data-v-4593780e]{color:var(--accent);font-size:23px}.storage-metrics span[data-v-4593780e]{color:var(--ink-soft);font-size:12px}.storage-grid[data-v-4593780e]{gap:var(--gap);grid-template-columns:minmax(270px,.8fr) minmax(0,1.5fr);align-items:start;display:grid}.storage-grid .card-head h2[data-v-4593780e]{margin:4px 0 16px;font-size:23px}.storage-check[data-v-4593780e]{align-items:center;gap:9px;margin-bottom:16px;display:flex}.storage-fields[data-v-4593780e]{gap:13px;display:grid}.storage-fields label[data-v-4593780e]{color:var(--ink-soft);gap:6px;font-size:12px;font-weight:700;display:grid}.storage-fields input[data-v-4593780e]{border:1px solid color-mix(in srgb, var(--accent) 25%, white);width:100%;min-width:0;color:var(--ink);background:#ffffffb3;border-radius:15px;padding:11px 13px}.storage-policy .primary[data-v-4593780e]{margin-top:14px}.storage-actions[data-v-4593780e]{flex-wrap:wrap;gap:8px;margin:16px 0;display:flex}.storage-actions button[data-v-4593780e]{background:#ffffffa6;border-radius:999px;padding:8px 12px}.storage-scroll[data-v-4593780e]{gap:7px;max-height:520px;padding:2px;display:grid;overflow:auto}.storage-row[data-v-4593780e]{cursor:pointer;background:#ffffff7a;border:1px solid #ffffffbf;border-radius:16px;align-items:center;gap:12px;min-width:0;padding:10px 12px;display:flex}.storage-row.protected[data-v-4593780e]{opacity:.7;cursor:default}.storage-item[data-v-4593780e]{flex:1;gap:3px;min-width:0;display:grid}.storage-item strong[data-v-4593780e]{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.storage-item small[data-v-4593780e]{color:var(--ink-soft);font-size:11px}.storage-row>b[data-v-4593780e]{white-space:nowrap;color:var(--accent);font-size:12px}.storage-footer[data-v-4593780e]{color:var(--ink-soft);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;padding-top:18px;font-size:12px;display:flex}.storage-error[data-v-4593780e]{color:var(--danger);overflow-wrap:anywhere}@media (width<=900px){.storage-grid[data-v-4593780e]{grid-template-columns:minmax(0,1fr)}}@media (width<=560px){.storage-row[data-v-4593780e]{flex-wrap:wrap;align-items:flex-start}.storage-row>b[data-v-4593780e]{margin-left:26px}.storage-metrics>div[data-v-4593780e]{flex:1;min-width:130px}}.password-settings[data-v-36cd9f70]{margin-top:24px}form[data-v-36cd9f70]{gap:16px;max-width:520px;display:grid}label[data-v-36cd9f70]{gap:8px;display:grid}input[data-v-36cd9f70]{box-sizing:border-box;width:100%}.system[data-v-0f629207]{gap:var(--gap);display:grid}.system-intro[data-v-0f629207]{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;flex-wrap:wrap;justify-content:space-between;align-items:end;gap:20px;padding:32px clamp(26px,5vw,60px);display:flex;position:relative;overflow:hidden}.system-intro[data-v-0f629207]: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%;animation:10s ease-in-out infinite alternate system-bob-0f629207;position:absolute;top:-85%;right:13%}.system-intro h1[data-v-0f629207]{letter-spacing:-.055em;margin:10px 0 7px;font-size:clamp(28px,3.25vw,42px)}.system-intro h1 em[data-v-0f629207]{color:var(--accent);font-style:normal}.system-intro p[data-v-0f629207]{max-width:560px;color:var(--ink-soft);font-size:13.5px;position:relative}.system-status[data-v-0f629207]{z-index:1;box-shadow:inset 0 1px 0 white, 0 7px 19px -15px var(--accent);white-space:nowrap;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background:#ffffff87;border:1px solid #fff;border-radius:999px;align-items:center;gap:9px;padding:10px 16px;font-size:12.5px;font-weight:700;display:inline-flex}.system-status i[data-v-0f629207]{background:var(--ok);width:9px;height:9px;box-shadow:0 0 0 4px color-mix(in srgb, var(--ok) 18%, transparent);border-radius:50%;animation:2.6s ease-in-out infinite pulse-soft}.system-status i.off[data-v-0f629207]{background:var(--ink-faint);box-shadow:0 0 0 4px color-mix(in srgb, var(--ink-faint) 14%, transparent);animation:none}.system>.tabs[data-v-0f629207]{box-shadow:inset 0 1px 0 white, 0 10px 30px -24px var(--accent);-webkit-backdrop-filter:blur(22px)saturate(1.7);backdrop-filter:blur(22px)saturate(1.7);border:1px solid #fffc;justify-self:start;padding:5px}.system[data-v-0f629207]>.tabs button{transition:transform .35s var(--spring), background-color .2s, box-shadow .2s;border-radius:999px;padding:9px 18px}.system[data-v-0f629207]>.tabs button:hover{transform:translateY(-2px)scale(1.03)}.system[data-v-0f629207] .connect .step,.system[data-v-0f629207] .connect .checks li{background:linear-gradient(145deg, #ffffffad, #ffffff47), var(--surface);box-shadow:inset 0 1px 0 white, 0 12px 24px -24px var(--accent);-webkit-backdrop-filter:blur(18px)saturate(1.55);backdrop-filter:blur(18px)saturate(1.55);transition:transform .35s var(--spring), box-shadow .25s;border:1px solid #ffffffd9;border-radius:22px}.system[data-v-0f629207] .connect .step:hover,.system[data-v-0f629207] .connect .checks li:hover{box-shadow:inset 0 1px 0 white, 0 16px 28px -21px var(--accent);transform:translateY(-3px)}.system[data-v-0f629207] .connect .num{background:linear-gradient(145deg, white, color-mix(in srgb, var(--glow-a) 75%, white));box-shadow:inset 0 1px 0 white, 0 5px 14px -9px var(--accent);color:var(--accent);border:1px solid #fff}@keyframes system-bob-0f629207{to{transform:translateY(22px)scale(1.08)}}@media (width<=760px){.system-intro[data-v-0f629207]{min-height:0;padding:27px 23px}}