luckytri 1.1.1 → 1.1.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.
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/docs/en/CHANGELOG.md +4 -0
- package/docs/zh/CHANGELOG.md +4 -0
- package/package.json +1 -1
- package/public/app/assets/{ChatsPage-OQgvV8YR.js → ChatsPage-IfBgNdaD.js} +1 -1
- package/public/app/assets/{Empty-DjvoHpAi.js → Empty-DK9nQPCf.js} +1 -1
- package/public/app/assets/{Field-BECf8Ykc.js → Field-BzKFhuFd.js} +1 -1
- package/public/app/assets/{HeartPage-6s6prdTE.js → HeartPage-CKxrbfFQ.js} +1 -1
- package/public/app/assets/{LifePage-g-8hiKC6.js → LifePage-CtxPEi6E.js} +1 -1
- package/public/app/assets/{MemoryPage-efIhloIp.js → MemoryPage-B8FLXzLi.js} +1 -1
- package/public/app/assets/{NaturePage-cjgIe6wY.js → NaturePage-C7i607ul.js} +1 -1
- package/public/app/assets/{PeoplePage-DQZ0uevM.js → PeoplePage-D3yn0HV0.js} +1 -1
- package/public/app/assets/{PluginsPage-DZQFEyxq.js → PluginsPage-ojv8zawj.js} +1 -1
- package/public/app/assets/{SystemPage-BHHcZb1h.css → SystemPage-CGVTvNZw.css} +1 -1
- package/public/app/assets/SystemPage-Cv3rFvyT.js +1 -0
- package/public/app/assets/{TimePage-B3oncGqb.js → TimePage-Dyd-FFbq.js} +1 -1
- package/public/app/assets/{index-CqRx6L9a.js → index-BJfzfgnm.js} +3 -3
- package/public/app/assets/{knowledge-Dj6hHClj.js → knowledge-C-bND0Ub.js} +1 -1
- package/public/app/assets/{media-B1i_W5FC.js → media-D7G3Nco6.js} +1 -1
- package/public/app/assets/{mind-BY8WSI7v.js → mind-ec-G6iNZ.js} +1 -1
- package/public/app/index.html +3 -3
- package/public/guide.en.html +3 -3
- package/public/guide.html +3 -3
- package/server/knowledge/api.js +2 -1
- package/server/knowledge/embedding-profile.js +5 -4
- package/public/app/assets/SystemPage-DjYS33Sv.js +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Dt as e,Q as t,Tt as n,Y as r,Z as i,dt as a,pt as o,rt as s}from"./Empty-
|
|
1
|
+
import{Dt as e,Q as t,Tt as n,Y as r,Z as i,dt as a,pt as o,rt as s}from"./Empty-DK9nQPCf.js";var c={key:0},l=s({__name:`Field`,props:{label:{},hint:{},wide:{type:Boolean}},setup(s){return(l,u)=>(a(),t(`label`,{class:n({wide:s.wide})},[r(`span`,null,e(s.label),1),o(l.$slots,`default`),s.hint?(a(),t(`small`,c,e(s.hint),1)):i(``,!0)],2))}});export{l as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,Ct as t,D as n,Dt as r,E as i,Et as a,G as o,H as s,I as c,J as l,Q as u,St as d,Tt as f,W as p,X as m,Y as h,Z as g,_,_t as v,bt as y,dt as b,et as x,ft as S,lt as C,n as w,o as ee,rt as T,s as E,st as D,t as O,tt as k,v as A,wt as j,yt as te}from"./Empty-DjvoHpAi.js";import{_ as M,c as N,d as P,g as F,h as ne,u as I,v as L}from"./mind-BY8WSI7v.js";import{a as re,b as ie,n as ae,o as oe,r as R,u as z,v as B,x as V}from"./index-CqRx6L9a.js";import{t as se}from"./media-B1i_W5FC.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=w(T({__name:`MoodRibbon`,props:{moods:{},baseline:{},timeZone:{}},setup(e){let t=e,n=X/2,i=d(),a=d(1e3),s=null;C(()=>{s=new ResizeObserver(([e])=>{a.value=Math.max(240,Math.round(e.contentRect.width))}),i.value&&s.observe(i.value)}),D(()=>s?.disconnect());let p=l(()=>{let e=[...t.moods].sort((e,t)=>e.created-t.created),r=e.length>1?(a.value-60)/(e.length-1):0;return e.map((e,t)=>({...e,x:30+t*r,y:n-Math.max(-1,Math.min(1,e.valence))*Z}))}),m=l(()=>{let e=p.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}),_=l(()=>{let e=p.value;return m.value?`${m.value}L${e[e.length-1].x},${X}L${e[0].x},${X}Z`:``}),v=l(()=>n-(t.baseline??.15)*Z),y=l(()=>[...t.moods].slice(0,6)),x=l(()=>y.value[0]);return(t,n)=>(b(),u(`section`,H,[h(`div`,U,[h(`div`,W,[h(`span`,G,r(j(c)(`MOOD / 此刻的天气`)),1),h(`h2`,null,r(j(c)(`心情有自己的潮汐。`)),1),h(`p`,null,r(j(c)(`最近 {length} 次被经历牵动;有起伏,也会慢慢平静。`,{length:e.moods.length})),1)]),x.value?(b(),u(`div`,K,[h(`span`,null,r(j(c)(`刚刚留下的心情`)),1),h(`b`,null,r(x.value.feeling),1),h(`small`,null,r(x.value.cause||j(c)(`暂时说不清缘由`)),1)])):g(``,!0)]),h(`div`,{ref_key:`box`,ref:i,class:`ribbon-box`},[m.value?(b(),u(`svg`,{key:0,class:`ribbon-chart`,viewBox:`0 0 ${a.value} ${X}`,role:`img`,"aria-label":j(c)(`最近的心情曲线`)},[h(`defs`,null,[h(`linearGradient`,{id:`ribbon-stroke`,x1:`0`,y1:`0`,x2:`0`,y2:X,gradientUnits:`userSpaceOnUse`},[...n[0]||=[h(`stop`,{offset:`0%`,style:{"stop-color":`var(--cheek)`}},null,-1),h(`stop`,{offset:`50%`,style:{"stop-color":`var(--accent)`}},null,-1),h(`stop`,{offset:`100%`,style:{"stop-color":`var(--orb-c)`}},null,-1)]]),n[1]||=h(`linearGradient`,{id:`ribbon-fill`,x1:`0`,y1:`0`,x2:`0`,y2:`1`},[h(`stop`,{offset:`0%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0.22`}}),h(`stop`,{offset:`100%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0`}})],-1)]),h(`line`,{class:`base`,x1:`0`,x2:a.value,y1:v.value,y2:v.value},null,8,J),h(`path`,{class:`area`,d:_.value},null,8,Y),h(`path`,{class:`line-glow`,d:m.value},null,8,ce),h(`path`,{class:`line`,d:m.value},null,8,le),(b(!0),u(o,null,S(p.value,t=>(b(),u(`g`,{key:t.id,class:f([`pt`,t.valence>=0?`warm`:`cool`])},[h(`circle`,{cx:t.x,cy:t.y,r:4+t.intensity*6},[h(`title`,null,r(j(z)(t.created,e.timeZone))+` `+r(t.feeling)+`:`+r(t.cause||j(c)(`说不清为什么`)),1)],8,ue)],2))),128))],8,q)):(b(),u(`p`,de,r(j(c)(`心情还没有被什么事牵动过。每一次经历都可能推动 TA 的心情,随后又会慢慢回到平常。`)),1))],512),y.value.length?(b(),u(`ul`,{key:0,class:`recent`,"aria-label":j(c)(`最近的心情`)},[(b(!0),u(o,null,S(y.value,t=>(b(),u(`li`,{key:t.id,class:f(t.valence>=0?`warm`:`cool`)},[h(`b`,null,r(t.feeling),1),h(`span`,null,r(t.cause||j(c)(`说不清为什么`)),1),h(`small`,null,r(j(z)(t.created,e.timeZone))+` · `+r(j(I)[t.origin]||t.origin),1)],2))),128))],8,fe)):g(``,!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=w(T({__name:`StarMap`,props:{threads:{},kinds:{},activity:{}},emits:[`open`],setup(t,{emit:n}){let i=t,s=n,p=d({}),m=l(()=>[...new Set(i.threads.map(e=>e.kind))].map(e=>({kind:e,label:i.kinds[e]||e,color:N[e]||`var(--accent)`,items:i.threads.filter(t=>t.kind===e).sort((e,t)=>(t.salience??0)-(e.salience??0))}))),_=l(()=>i.threads.filter(e=>!e.faded&&(e.salience??0)>=.5).length);function v(e){return e.faded?c(`暂时放远`):e.core?c(`慢慢笃定`):c(`还在生长`)}function y(e){return p.value[e.kind]?e.items:e.items.slice(0,Q)}function C(e){p.value={...p.value,[e]:!p.value[e]}}return(n,i)=>(b(),u(`section`,{class:`starmap`,"aria-label":j(c)(`心灵星图:TA 关于自己的线索`)},[h(`div`,he,[h(`div`,ge,[h(`span`,_e,r(j(c)(`SELF / 正在形成的自己`)),1),h(`h2`,null,[x(r(j(c)(`不是一张固定的画像,`)),1),i[0]||=h(`br`,null,null,-1),h(`em`,null,r(j(c)(`而是一直在生长。`)),1)]),h(`p`,null,r(j(c)(`一件经历可能留下一点痕迹。点开一枚光片,可以看到它从哪里来、后来又怎么改变。`)),1),h(`div`,ve,[h(`span`,null,[h(`b`,null,r(t.threads.length),1),x(` `+r(j(c)(`枚线索`)),1)]),h(`span`,null,[h(`b`,null,r(_.value),1),x(` `+r(j(c)(`枚此刻贴近`)),1)])])]),h(`div`,ye,[i[1]||=e(`<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),h(`div`,be,[k(B,{mood:j(V),activity:t.activity||`idle`,size:106},null,8,[`mood`,`activity`])])])]),h(`div`,xe,[h(`div`,null,[i[2]||=h(`span`,{class:`eyebrow`},`INNER CURRENTS`,-1),h(`h3`,null,r(j(c)(`她留下的光片`)),1)]),h(`p`,null,r(j(c)(`越亮的线索,越贴近此刻。淡去的仍然保留在这里。`)),1)]),h(`div`,Se,[(b(!0),u(o,null,S(m.value,(e,t)=>(b(),u(`section`,{key:e.kind,class:`current`,style:a({"--tone":e.color,"--order":t})},[h(`header`,Ce,[i[3]||=h(`span`,{class:`current-icon`,"aria-hidden":`true`},[h(`i`)],-1),h(`div`,null,[h(`h4`,null,r(e.label),1),h(`small`,null,r(j(c)(`{length} 枚正在留存`,{length:e.items.length})),1)]),h(`span`,we,r(String(t+1).padStart(2,`0`)),1)]),h(`div`,Te,[(b(!0),u(o,null,S(y(e),e=>(b(),u(`button`,{key:e.thread,type:`button`,class:f([`fleck star`,{faded:e.faded,core:e.core}]),"data-thread":e.thread,onClick:t=>s(`open`,e)},[i[4]||=h(`span`,{class:`fleck-light`,"aria-hidden":`true`},null,-1),h(`span`,De,[h(`small`,null,r(v(e)),1),h(`b`,null,r(e.content),1)]),i[5]||=h(`span`,{class:`fleck-arrow`,"aria-hidden":`true`},`↗`,-1)],10,Ee))),128)),e.items.length>Q?(b(),u(`button`,{key:0,type:`button`,class:`fleck-more`,"aria-expanded":!!p.value[e.kind],onClick:t=>C(e.kind)},[x(r(p.value[e.kind]?j(c)(`收起线索`):j(c)(`再看 {v} 枚光片`,{v:e.items.length-Q}))+` `,1),h(`span`,ke,r(p.value[e.kind]?`↑`:`↓`),1)],8,Oe)):g(``,!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=w(T({__name:`NotesWall`,props:{thoughts:{},kinds:{},query:{}},emits:[`changed`,`search`],setup(e,{emit:t}){let n=e,a=t,l=d(n.query);async function _(e,t){try{await F.thought(e.id,t),a(`changed`)}catch(e){A(e.message,!0)}}async function v(e){if(await i(c(`删除这张便签?有后续修正的便签只能隐藏。`),{title:c(`删除便签`),confirmText:c(`删除`),danger:!0}))try{await F.removeThought(e.id),a(`changed`)}catch(e){A(e.message,!0)}}return(t,n)=>(b(),u(`section`,je,[h(`div`,Me,[h(`div`,null,[h(`span`,Ne,r(j(c)(`THOUGHTS / 留给自己的话`)),1),h(`h2`,null,r(j(c)(`有些念头,先放在心上。`)),1),h(`p`,Pe,r(j(c)(`有些是聊天之后的理解,有些是还没想好要告诉谁的念头。可以分享,也可以先留给自己。`)),1)]),h(`form`,{class:`wall-search`,role:`search`,onSubmit:n[2]||=p(e=>a(`search`,l.value),[`prevent`])},[y(h(`input`,{id:`noteSearch`,"onUpdate:modelValue":n[0]||=e=>l.value=e,placeholder:j(c)(`搜索某件事、某个人`),"aria-label":j(c)(`搜索便签`),onChange:n[1]||=e=>a(`search`,l.value)},null,40,Fe),[[s,l.value]])],32)]),e.thoughts.length?(b(),u(`div`,Ie,[(b(!0),u(o,null,S(e.thoughts,t=>(b(),u(`article`,{key:t.id,class:f([`note-card`,{muted:t.hidden,resolved:t.status===`resolved`}]),"data-kind":t.kind},[h(`header`,null,[h(`b`,null,[x(r(e.kinds[t.kind]||t.kind),1),t.parent_id?(b(),u(o,{key:0},[x(r(j(c)(`· 修正了以前的想法`)),1)],64)):g(``,!0)]),h(`time`,null,r(j(L)(t.created)),1)]),h(`p`,null,r(t.content),1),t.status===`resolved`?(b(),u(`p`,Re,r(t.resolution?j(c)(`放下了:{resolution}`,{resolution:t.resolution}):j(c)(`放下了`)),1)):g(``,!0),t.outreach?(b(),u(`p`,ze,[x(r(j(c)(`想主动说:{outreach} · {v}`,{outreach:t.outreach,v:j(P)[t.outreach_status]||t.outreach_status}))+` `,1),t.outreach_reason?(b(),u(o,{key:0},[n[3]||=h(`br`,null,null,-1),x(r(j(c)(`因为:{outreach_reason}`,{outreach_reason:t.outreach_reason})),1)],64)):g(``,!0),t.outreach_wait_reason?(b(),u(o,{key:1},[n[4]||=h(`br`,null,null,-1),x(r(j(c)(`{outreach_wait_reason};稍后重新决定。`,{outreach_wait_reason:t.outreach_wait_reason})),1)],64)):g(``,!0)])):g(``,!0),h(`footer`,null,[h(`button`,{class:`small`,onClick:e=>_(t,{status:t.status===`open`?`resolved`:`open`})},r(t.status===`open`?j(c)(`放下这件事`):j(c)(`重新关注`)),9,Be),h(`button`,{class:`small`,onClick:e=>_(t,{hidden:!t.hidden})},r(t.hidden?j(c)(`恢复`):j(c)(`不再参与 TA 的思考`)),9,Ve),h(`button`,{class:`text-button`,onClick:e=>v(t)},r(j(c)(`删除`)),9,He)])],10,Le))),128))])):(b(),m(O,{key:1,title:j(c)(`这面墙还空着`),text:j(c)(`独处时有了新的理解、放不下的事或久别想起的人,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=w(T({__name:`HeartPage`,setup(e){let i=se(`(max-width: 760px)`),s=t(_(`/mind/self`)||null),p=t(_(`/mind/mood`)||null),y=t(_(`/mind/thoughts?q=`)||[]),C=d(``),w=d(E.sub===`notes`?`notes`:E.sub===`list`||i.value?`list`:`stars`),T=d(null),D=d([]),P=l(()=>(s.value?.threads||[]).filter(e=>e.status!==`closed`)),z=d({}),B=l(()=>(s.value?.threads||[]).filter(e=>e.status===`closed`)),V=l(()=>{let e=s.value?.kinds||{};return Object.entries(e).map(([e,t])=>({kind:e,label:t,threads:P.value.filter(t=>t.kind===e)})).filter(e=>e.threads.length)});function H(e){return e.core?c(`TA 最核心的部分`):e.faded?c(`在远方:很久没被触及`):e.fading?c(`慢慢淡出`):ne[e.status]||e.status}function U(e){return z.value[e.kind]?e.threads:e.threads.slice(0,$)}function W(e){z.value={...z.value,[e]:!z.value[e]}}let G=0;async function K(){let e=++G,[t,n,r]=await Promise.all([F.self(),F.mood(),F.notes(C.value)]);e===G&&(s.value=t,p.value=n,y.value=r,T.value&&=t.threads.find(e=>e.thread===T.value.thread)||null)}async function q(e){let t=++G;C.value=e;let n=await F.notes(e);t===G&&(y.value=n)}async function J(e){T.value=e,D.value=[],D.value=await F.thread(e.thread)}async function Y(e){let t=await n(c(`撤销「{content}」?撤销后 TA 不会再这样认为,之后的独处也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:c(`撤销这条线索`),confirmText:c(`撤销`),danger:!0,placeholder:c(`原因`)});if(t!==null)try{await F.revoke(`self`,e.thread,t),A(c(`已撤销`)),T.value=null,await K()}catch(e){A(e.message,!0)}}return v(w,e=>{E.page===`heart`&&ee(e===`stars`?``:e)}),v(()=>[E.page,E.sub],([e,t])=>{e===`heart`&&(t===`notes`||t===`list`?w.value=t:!t&&w.value===`notes`&&(w.value=`stars`))}),re(`heart`,K),(e,t)=>(b(),u(`div`,We,[p.value?(b(),m(pe,{key:0,moods:p.value.moods,baseline:p.value.affect.baseline,"time-zone":p.value.clock.timeZone},null,8,[`moods`,`baseline`,`time-zone`])):g(``,!0),h(`div`,Ge,[k(ae,{modelValue:w.value,"onUpdate:modelValue":t[0]||=e=>w.value=e,label:j(c)(`内心的分区`),items:[{key:`stars`,label:j(c)(`心灵星图`),count:P.value.length},{key:`list`,label:j(c)(`线索清单`)},{key:`notes`,label:j(c)(`放在心上`),count:y.value.length}]},null,8,[`modelValue`,`label`,`items`]),w.value===`notes`?g(``,!0):(b(),u(`p`,Ke,r(j(c)(`她从真实经历里慢慢认识自己。点开一条线索,可以看到它如何变化。`)),1))]),s.value?(b(),u(o,{key:1},[w.value===`stars`?(b(),u(o,{key:0},[P.value.length?(b(),m(Ae,{key:0,threads:P.value,kinds:s.value.kinds,activity:j(ie).data?.activity?.kind,onOpen:J},null,8,[`threads`,`kinds`,`activity`])):(b(),m(O,{key:1,title:j(c)(`TA 还没有长出关于自己的东西`),text:j(c)(`聊得多了、独处过、写过日记,TA 会慢慢发现自己喜欢什么、怎么看事情、想做什么。天性只是种子。`)},null,8,[`title`,`text`]))],64)):w.value===`list`?(b(),u(`section`,qe,[(b(!0),u(o,null,S(V.value,e=>(b(),u(`div`,{key:e.kind,class:`card thread-group`,"data-thread-kind":e.kind},[h(`h2`,null,[h(`i`,{style:a({background:j(N)[e.kind]})},null,4),x(r(e.label)+` · `+r(e.threads.length),1)]),(b(!0),u(o,null,S(U(e),e=>(b(),u(`button`,{key:e.thread,class:f([`thread`,{faded:e.faded,core:e.core}]),"data-thread":e.thread,onClick:t=>J(e)},[h(`span`,{class:`chip`,"data-tone":e.faded||e.fading?`quiet`:void 0},r(H(e)),9,Xe),h(`span`,Ze,r(e.content),1),h(`small`,null,[x(r(j(c)(`强度 {v}`,{v:j(M)(e.strength)})),1),e.salience===null?g(``,!0):(b(),u(o,{key:0},[x(r(j(c)(`· 此刻的分量 {v}`,{v:j(M)(e.salience)})),1)],64))])],10,Ye))),128)),e.threads.length>$?(b(),u(`button`,{key:0,type:`button`,class:`thread-more`,"aria-expanded":!!z.value[e.kind],onClick:t=>W(e.kind)},[x(r(z.value[e.kind]?j(c)(`收起线索`):j(c)(`再看 {v} 条线索`,{v:e.threads.length-$}))+` `,1),h(`span`,$e,r(z.value[e.kind]?`↑`:`↓`),1)],8,Qe)):g(``,!0)],8,Je))),128)),V.value.length?g(``,!0):(b(),m(O,{key:0,title:j(c)(`TA 还没有长出关于自己的东西`),text:j(c)(`天性只是种子,其余的都从经历里来。`)},null,8,[`title`,`text`]))])):(b(),m(Ue,{key:2,thoughts:y.value,kinds:p.value?.kinds?.thoughts||{},query:C.value,onChanged:K,onSearch:q},null,8,[`thoughts`,`kinds`,`query`])),w.value===`notes`?g(``,!0):(b(),u(`div`,et,[h(`details`,tt,[h(`summary`,null,[h(`span`,nt,r(j(c)(`放下`)),1),h(`b`,null,r(j(c)(`TA 自己放下的 · {length}`,{length:B.value.length})),1)]),B.value.length?(b(),u(`ul`,rt,[(b(!0),u(o,null,S(B.value,e=>(b(),u(`li`,{key:e.thread,class:`list-row`},[h(`span`,it,r(j(c)(`放下`)),1),h(`span`,at,r(e.content),1),h(`time`,ot,r(j(L)(e.created)),1)]))),128))])):(b(),u(`p`,st,r(j(c)(`没有。`)),1))]),h(`details`,ct,[h(`summary`,null,[h(`span`,lt,r(j(c)(`撤销`)),1),h(`b`,null,r(j(c)(`你撤销过的 · {length}`,{length:s.value.revoked.length})),1)]),s.value.revoked.length?(b(),u(`ul`,ut,[(b(!0),u(o,null,S(s.value.revoked,e=>(b(),u(`li`,{key:e.id,class:`list-row`},[h(`span`,dt,r(j(c)(`撤销`)),1),h(`span`,ft,[x(r(e.content),1),e.reason?(b(),u(`small`,pt,` · `+r(e.reason),1)):g(``,!0)]),h(`time`,mt,r(j(L)(e.created)),1)]))),128))])):(b(),u(`p`,ht,r(j(c)(`没有。`)),1))])]))],64)):g(``,!0),k(oe,{open:!!T.value,title:T.value?s.value?.kinds?.[T.value.kind]||T.value.kind:``,eyebrow:j(c)(`一颗星`),onClose:t[2]||=e=>T.value=null},{default:te(()=>[T.value?(b(),u(`div`,gt,[h(`p`,_t,r(T.value.content),1),h(`div`,vt,[h(`span`,yt,r(H(T.value)),1),h(`span`,bt,r(j(I)[T.value.origin]||T.value.origin),1)]),h(`div`,xt,[k(R,{label:j(c)(`强度`),value:T.value.strength},null,8,[`label`,`value`]),T.value.salience===null?g(``,!0):(b(),m(R,{key:0,label:j(c)(`此刻的分量`),value:T.value.salience},null,8,[`label`,`value`]))]),h(`dl`,St,[h(`dt`,null,r(j(c)(`经历的天数`)),1),h(`dd`,null,r(j(c)(`{length} 天`,{length:T.value.days.length})),1),h(`dt`,null,r(j(c)(`来源`)),1),h(`dd`,null,r(j(c)(`{length} 处`,{length:T.value.sources.length})),1),h(`dt`,null,r(j(c)(`最近一次被触及`)),1),h(`dd`,null,r(j(L)(T.value.created)),1)]),h(`section`,null,[h(`h3`,Ct,r(j(c)(`怎么变成现在这样的 · {versions} 个版本`,{versions:T.value.versions})),1),h(`ol`,wt,[(b(!0),u(o,null,S(D.value,e=>(b(),u(`li`,{key:e.id},[h(`time`,null,r(j(L)(e.created)),1),h(`b`,null,r(j(M)(e.strength)),1),h(`span`,null,r(e.content),1)]))),128))])]),h(`button`,{class:`danger`,"data-revoke-thread":``,onClick:t[1]||=e=>Y(T.value)},r(j(c)(`撤销这条线索`)),1),h(`p`,Tt,r(j(c)(`撤销后 TA 不会再这样认为;这只是拿走一段理解,不会改写发生过的事。`)),1)])):g(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-f49fd383`]]);export{Et as default};
|
|
1
|
+
import{$ as e,Ct as t,D as n,Dt as r,E as i,Et as a,G as o,H as s,I as c,J as l,Q as u,St as d,Tt as f,W as p,X as m,Y as h,Z as g,_,_t as v,bt as y,dt as b,et as x,ft as S,lt as C,n as w,o as ee,rt as T,s as E,st as D,t as O,tt as k,v as A,wt as j,yt as te}from"./Empty-DK9nQPCf.js";import{_ as M,c as N,d as P,g as F,h as ne,u as I,v as L}from"./mind-ec-G6iNZ.js";import{a as re,b as ie,n as ae,o as oe,r as R,u as z,v as B,x as V}from"./index-BJfzfgnm.js";import{t as se}from"./media-D7G3Nco6.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=w(T({__name:`MoodRibbon`,props:{moods:{},baseline:{},timeZone:{}},setup(e){let t=e,n=X/2,i=d(),a=d(1e3),s=null;C(()=>{s=new ResizeObserver(([e])=>{a.value=Math.max(240,Math.round(e.contentRect.width))}),i.value&&s.observe(i.value)}),D(()=>s?.disconnect());let p=l(()=>{let e=[...t.moods].sort((e,t)=>e.created-t.created),r=e.length>1?(a.value-60)/(e.length-1):0;return e.map((e,t)=>({...e,x:30+t*r,y:n-Math.max(-1,Math.min(1,e.valence))*Z}))}),m=l(()=>{let e=p.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}),_=l(()=>{let e=p.value;return m.value?`${m.value}L${e[e.length-1].x},${X}L${e[0].x},${X}Z`:``}),v=l(()=>n-(t.baseline??.15)*Z),y=l(()=>[...t.moods].slice(0,6)),x=l(()=>y.value[0]);return(t,n)=>(b(),u(`section`,H,[h(`div`,U,[h(`div`,W,[h(`span`,G,r(j(c)(`MOOD / 此刻的天气`)),1),h(`h2`,null,r(j(c)(`心情有自己的潮汐。`)),1),h(`p`,null,r(j(c)(`最近 {length} 次被经历牵动;有起伏,也会慢慢平静。`,{length:e.moods.length})),1)]),x.value?(b(),u(`div`,K,[h(`span`,null,r(j(c)(`刚刚留下的心情`)),1),h(`b`,null,r(x.value.feeling),1),h(`small`,null,r(x.value.cause||j(c)(`暂时说不清缘由`)),1)])):g(``,!0)]),h(`div`,{ref_key:`box`,ref:i,class:`ribbon-box`},[m.value?(b(),u(`svg`,{key:0,class:`ribbon-chart`,viewBox:`0 0 ${a.value} ${X}`,role:`img`,"aria-label":j(c)(`最近的心情曲线`)},[h(`defs`,null,[h(`linearGradient`,{id:`ribbon-stroke`,x1:`0`,y1:`0`,x2:`0`,y2:X,gradientUnits:`userSpaceOnUse`},[...n[0]||=[h(`stop`,{offset:`0%`,style:{"stop-color":`var(--cheek)`}},null,-1),h(`stop`,{offset:`50%`,style:{"stop-color":`var(--accent)`}},null,-1),h(`stop`,{offset:`100%`,style:{"stop-color":`var(--orb-c)`}},null,-1)]]),n[1]||=h(`linearGradient`,{id:`ribbon-fill`,x1:`0`,y1:`0`,x2:`0`,y2:`1`},[h(`stop`,{offset:`0%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0.22`}}),h(`stop`,{offset:`100%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0`}})],-1)]),h(`line`,{class:`base`,x1:`0`,x2:a.value,y1:v.value,y2:v.value},null,8,J),h(`path`,{class:`area`,d:_.value},null,8,Y),h(`path`,{class:`line-glow`,d:m.value},null,8,ce),h(`path`,{class:`line`,d:m.value},null,8,le),(b(!0),u(o,null,S(p.value,t=>(b(),u(`g`,{key:t.id,class:f([`pt`,t.valence>=0?`warm`:`cool`])},[h(`circle`,{cx:t.x,cy:t.y,r:4+t.intensity*6},[h(`title`,null,r(j(z)(t.created,e.timeZone))+` `+r(t.feeling)+`:`+r(t.cause||j(c)(`说不清为什么`)),1)],8,ue)],2))),128))],8,q)):(b(),u(`p`,de,r(j(c)(`心情还没有被什么事牵动过。每一次经历都可能推动 TA 的心情,随后又会慢慢回到平常。`)),1))],512),y.value.length?(b(),u(`ul`,{key:0,class:`recent`,"aria-label":j(c)(`最近的心情`)},[(b(!0),u(o,null,S(y.value,t=>(b(),u(`li`,{key:t.id,class:f(t.valence>=0?`warm`:`cool`)},[h(`b`,null,r(t.feeling),1),h(`span`,null,r(t.cause||j(c)(`说不清为什么`)),1),h(`small`,null,r(j(z)(t.created,e.timeZone))+` · `+r(j(I)[t.origin]||t.origin),1)],2))),128))],8,fe)):g(``,!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=w(T({__name:`StarMap`,props:{threads:{},kinds:{},activity:{}},emits:[`open`],setup(t,{emit:n}){let i=t,s=n,p=d({}),m=l(()=>[...new Set(i.threads.map(e=>e.kind))].map(e=>({kind:e,label:i.kinds[e]||e,color:N[e]||`var(--accent)`,items:i.threads.filter(t=>t.kind===e).sort((e,t)=>(t.salience??0)-(e.salience??0))}))),_=l(()=>i.threads.filter(e=>!e.faded&&(e.salience??0)>=.5).length);function v(e){return e.faded?c(`暂时放远`):e.core?c(`慢慢笃定`):c(`还在生长`)}function y(e){return p.value[e.kind]?e.items:e.items.slice(0,Q)}function C(e){p.value={...p.value,[e]:!p.value[e]}}return(n,i)=>(b(),u(`section`,{class:`starmap`,"aria-label":j(c)(`心灵星图:TA 关于自己的线索`)},[h(`div`,he,[h(`div`,ge,[h(`span`,_e,r(j(c)(`SELF / 正在形成的自己`)),1),h(`h2`,null,[x(r(j(c)(`不是一张固定的画像,`)),1),i[0]||=h(`br`,null,null,-1),h(`em`,null,r(j(c)(`而是一直在生长。`)),1)]),h(`p`,null,r(j(c)(`一件经历可能留下一点痕迹。点开一枚光片,可以看到它从哪里来、后来又怎么改变。`)),1),h(`div`,ve,[h(`span`,null,[h(`b`,null,r(t.threads.length),1),x(` `+r(j(c)(`枚线索`)),1)]),h(`span`,null,[h(`b`,null,r(_.value),1),x(` `+r(j(c)(`枚此刻贴近`)),1)])])]),h(`div`,ye,[i[1]||=e(`<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),h(`div`,be,[k(B,{mood:j(V),activity:t.activity||`idle`,size:106},null,8,[`mood`,`activity`])])])]),h(`div`,xe,[h(`div`,null,[i[2]||=h(`span`,{class:`eyebrow`},`INNER CURRENTS`,-1),h(`h3`,null,r(j(c)(`她留下的光片`)),1)]),h(`p`,null,r(j(c)(`越亮的线索,越贴近此刻。淡去的仍然保留在这里。`)),1)]),h(`div`,Se,[(b(!0),u(o,null,S(m.value,(e,t)=>(b(),u(`section`,{key:e.kind,class:`current`,style:a({"--tone":e.color,"--order":t})},[h(`header`,Ce,[i[3]||=h(`span`,{class:`current-icon`,"aria-hidden":`true`},[h(`i`)],-1),h(`div`,null,[h(`h4`,null,r(e.label),1),h(`small`,null,r(j(c)(`{length} 枚正在留存`,{length:e.items.length})),1)]),h(`span`,we,r(String(t+1).padStart(2,`0`)),1)]),h(`div`,Te,[(b(!0),u(o,null,S(y(e),e=>(b(),u(`button`,{key:e.thread,type:`button`,class:f([`fleck star`,{faded:e.faded,core:e.core}]),"data-thread":e.thread,onClick:t=>s(`open`,e)},[i[4]||=h(`span`,{class:`fleck-light`,"aria-hidden":`true`},null,-1),h(`span`,De,[h(`small`,null,r(v(e)),1),h(`b`,null,r(e.content),1)]),i[5]||=h(`span`,{class:`fleck-arrow`,"aria-hidden":`true`},`↗`,-1)],10,Ee))),128)),e.items.length>Q?(b(),u(`button`,{key:0,type:`button`,class:`fleck-more`,"aria-expanded":!!p.value[e.kind],onClick:t=>C(e.kind)},[x(r(p.value[e.kind]?j(c)(`收起线索`):j(c)(`再看 {v} 枚光片`,{v:e.items.length-Q}))+` `,1),h(`span`,ke,r(p.value[e.kind]?`↑`:`↓`),1)],8,Oe)):g(``,!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=w(T({__name:`NotesWall`,props:{thoughts:{},kinds:{},query:{}},emits:[`changed`,`search`],setup(e,{emit:t}){let n=e,a=t,l=d(n.query);async function _(e,t){try{await F.thought(e.id,t),a(`changed`)}catch(e){A(e.message,!0)}}async function v(e){if(await i(c(`删除这张便签?有后续修正的便签只能隐藏。`),{title:c(`删除便签`),confirmText:c(`删除`),danger:!0}))try{await F.removeThought(e.id),a(`changed`)}catch(e){A(e.message,!0)}}return(t,n)=>(b(),u(`section`,je,[h(`div`,Me,[h(`div`,null,[h(`span`,Ne,r(j(c)(`THOUGHTS / 留给自己的话`)),1),h(`h2`,null,r(j(c)(`有些念头,先放在心上。`)),1),h(`p`,Pe,r(j(c)(`有些是聊天之后的理解,有些是还没想好要告诉谁的念头。可以分享,也可以先留给自己。`)),1)]),h(`form`,{class:`wall-search`,role:`search`,onSubmit:n[2]||=p(e=>a(`search`,l.value),[`prevent`])},[y(h(`input`,{id:`noteSearch`,"onUpdate:modelValue":n[0]||=e=>l.value=e,placeholder:j(c)(`搜索某件事、某个人`),"aria-label":j(c)(`搜索便签`),onChange:n[1]||=e=>a(`search`,l.value)},null,40,Fe),[[s,l.value]])],32)]),e.thoughts.length?(b(),u(`div`,Ie,[(b(!0),u(o,null,S(e.thoughts,t=>(b(),u(`article`,{key:t.id,class:f([`note-card`,{muted:t.hidden,resolved:t.status===`resolved`}]),"data-kind":t.kind},[h(`header`,null,[h(`b`,null,[x(r(e.kinds[t.kind]||t.kind),1),t.parent_id?(b(),u(o,{key:0},[x(r(j(c)(`· 修正了以前的想法`)),1)],64)):g(``,!0)]),h(`time`,null,r(j(L)(t.created)),1)]),h(`p`,null,r(t.content),1),t.status===`resolved`?(b(),u(`p`,Re,r(t.resolution?j(c)(`放下了:{resolution}`,{resolution:t.resolution}):j(c)(`放下了`)),1)):g(``,!0),t.outreach?(b(),u(`p`,ze,[x(r(j(c)(`想主动说:{outreach} · {v}`,{outreach:t.outreach,v:j(P)[t.outreach_status]||t.outreach_status}))+` `,1),t.outreach_reason?(b(),u(o,{key:0},[n[3]||=h(`br`,null,null,-1),x(r(j(c)(`因为:{outreach_reason}`,{outreach_reason:t.outreach_reason})),1)],64)):g(``,!0),t.outreach_wait_reason?(b(),u(o,{key:1},[n[4]||=h(`br`,null,null,-1),x(r(j(c)(`{outreach_wait_reason};稍后重新决定。`,{outreach_wait_reason:t.outreach_wait_reason})),1)],64)):g(``,!0)])):g(``,!0),h(`footer`,null,[h(`button`,{class:`small`,onClick:e=>_(t,{status:t.status===`open`?`resolved`:`open`})},r(t.status===`open`?j(c)(`放下这件事`):j(c)(`重新关注`)),9,Be),h(`button`,{class:`small`,onClick:e=>_(t,{hidden:!t.hidden})},r(t.hidden?j(c)(`恢复`):j(c)(`不再参与 TA 的思考`)),9,Ve),h(`button`,{class:`text-button`,onClick:e=>v(t)},r(j(c)(`删除`)),9,He)])],10,Le))),128))])):(b(),m(O,{key:1,title:j(c)(`这面墙还空着`),text:j(c)(`独处时有了新的理解、放不下的事或久别想起的人,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=w(T({__name:`HeartPage`,setup(e){let i=se(`(max-width: 760px)`),s=t(_(`/mind/self`)||null),p=t(_(`/mind/mood`)||null),y=t(_(`/mind/thoughts?q=`)||[]),C=d(``),w=d(E.sub===`notes`?`notes`:E.sub===`list`||i.value?`list`:`stars`),T=d(null),D=d([]),P=l(()=>(s.value?.threads||[]).filter(e=>e.status!==`closed`)),z=d({}),B=l(()=>(s.value?.threads||[]).filter(e=>e.status===`closed`)),V=l(()=>{let e=s.value?.kinds||{};return Object.entries(e).map(([e,t])=>({kind:e,label:t,threads:P.value.filter(t=>t.kind===e)})).filter(e=>e.threads.length)});function H(e){return e.core?c(`TA 最核心的部分`):e.faded?c(`在远方:很久没被触及`):e.fading?c(`慢慢淡出`):ne[e.status]||e.status}function U(e){return z.value[e.kind]?e.threads:e.threads.slice(0,$)}function W(e){z.value={...z.value,[e]:!z.value[e]}}let G=0;async function K(){let e=++G,[t,n,r]=await Promise.all([F.self(),F.mood(),F.notes(C.value)]);e===G&&(s.value=t,p.value=n,y.value=r,T.value&&=t.threads.find(e=>e.thread===T.value.thread)||null)}async function q(e){let t=++G;C.value=e;let n=await F.notes(e);t===G&&(y.value=n)}async function J(e){T.value=e,D.value=[],D.value=await F.thread(e.thread)}async function Y(e){let t=await n(c(`撤销「{content}」?撤销后 TA 不会再这样认为,之后的独处也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:c(`撤销这条线索`),confirmText:c(`撤销`),danger:!0,placeholder:c(`原因`)});if(t!==null)try{await F.revoke(`self`,e.thread,t),A(c(`已撤销`)),T.value=null,await K()}catch(e){A(e.message,!0)}}return v(w,e=>{E.page===`heart`&&ee(e===`stars`?``:e)}),v(()=>[E.page,E.sub],([e,t])=>{e===`heart`&&(t===`notes`||t===`list`?w.value=t:!t&&w.value===`notes`&&(w.value=`stars`))}),re(`heart`,K),(e,t)=>(b(),u(`div`,We,[p.value?(b(),m(pe,{key:0,moods:p.value.moods,baseline:p.value.affect.baseline,"time-zone":p.value.clock.timeZone},null,8,[`moods`,`baseline`,`time-zone`])):g(``,!0),h(`div`,Ge,[k(ae,{modelValue:w.value,"onUpdate:modelValue":t[0]||=e=>w.value=e,label:j(c)(`内心的分区`),items:[{key:`stars`,label:j(c)(`心灵星图`),count:P.value.length},{key:`list`,label:j(c)(`线索清单`)},{key:`notes`,label:j(c)(`放在心上`),count:y.value.length}]},null,8,[`modelValue`,`label`,`items`]),w.value===`notes`?g(``,!0):(b(),u(`p`,Ke,r(j(c)(`她从真实经历里慢慢认识自己。点开一条线索,可以看到它如何变化。`)),1))]),s.value?(b(),u(o,{key:1},[w.value===`stars`?(b(),u(o,{key:0},[P.value.length?(b(),m(Ae,{key:0,threads:P.value,kinds:s.value.kinds,activity:j(ie).data?.activity?.kind,onOpen:J},null,8,[`threads`,`kinds`,`activity`])):(b(),m(O,{key:1,title:j(c)(`TA 还没有长出关于自己的东西`),text:j(c)(`聊得多了、独处过、写过日记,TA 会慢慢发现自己喜欢什么、怎么看事情、想做什么。天性只是种子。`)},null,8,[`title`,`text`]))],64)):w.value===`list`?(b(),u(`section`,qe,[(b(!0),u(o,null,S(V.value,e=>(b(),u(`div`,{key:e.kind,class:`card thread-group`,"data-thread-kind":e.kind},[h(`h2`,null,[h(`i`,{style:a({background:j(N)[e.kind]})},null,4),x(r(e.label)+` · `+r(e.threads.length),1)]),(b(!0),u(o,null,S(U(e),e=>(b(),u(`button`,{key:e.thread,class:f([`thread`,{faded:e.faded,core:e.core}]),"data-thread":e.thread,onClick:t=>J(e)},[h(`span`,{class:`chip`,"data-tone":e.faded||e.fading?`quiet`:void 0},r(H(e)),9,Xe),h(`span`,Ze,r(e.content),1),h(`small`,null,[x(r(j(c)(`强度 {v}`,{v:j(M)(e.strength)})),1),e.salience===null?g(``,!0):(b(),u(o,{key:0},[x(r(j(c)(`· 此刻的分量 {v}`,{v:j(M)(e.salience)})),1)],64))])],10,Ye))),128)),e.threads.length>$?(b(),u(`button`,{key:0,type:`button`,class:`thread-more`,"aria-expanded":!!z.value[e.kind],onClick:t=>W(e.kind)},[x(r(z.value[e.kind]?j(c)(`收起线索`):j(c)(`再看 {v} 条线索`,{v:e.threads.length-$}))+` `,1),h(`span`,$e,r(z.value[e.kind]?`↑`:`↓`),1)],8,Qe)):g(``,!0)],8,Je))),128)),V.value.length?g(``,!0):(b(),m(O,{key:0,title:j(c)(`TA 还没有长出关于自己的东西`),text:j(c)(`天性只是种子,其余的都从经历里来。`)},null,8,[`title`,`text`]))])):(b(),m(Ue,{key:2,thoughts:y.value,kinds:p.value?.kinds?.thoughts||{},query:C.value,onChanged:K,onSearch:q},null,8,[`thoughts`,`kinds`,`query`])),w.value===`notes`?g(``,!0):(b(),u(`div`,et,[h(`details`,tt,[h(`summary`,null,[h(`span`,nt,r(j(c)(`放下`)),1),h(`b`,null,r(j(c)(`TA 自己放下的 · {length}`,{length:B.value.length})),1)]),B.value.length?(b(),u(`ul`,rt,[(b(!0),u(o,null,S(B.value,e=>(b(),u(`li`,{key:e.thread,class:`list-row`},[h(`span`,it,r(j(c)(`放下`)),1),h(`span`,at,r(e.content),1),h(`time`,ot,r(j(L)(e.created)),1)]))),128))])):(b(),u(`p`,st,r(j(c)(`没有。`)),1))]),h(`details`,ct,[h(`summary`,null,[h(`span`,lt,r(j(c)(`撤销`)),1),h(`b`,null,r(j(c)(`你撤销过的 · {length}`,{length:s.value.revoked.length})),1)]),s.value.revoked.length?(b(),u(`ul`,ut,[(b(!0),u(o,null,S(s.value.revoked,e=>(b(),u(`li`,{key:e.id,class:`list-row`},[h(`span`,dt,r(j(c)(`撤销`)),1),h(`span`,ft,[x(r(e.content),1),e.reason?(b(),u(`small`,pt,` · `+r(e.reason),1)):g(``,!0)]),h(`time`,mt,r(j(L)(e.created)),1)]))),128))])):(b(),u(`p`,ht,r(j(c)(`没有。`)),1))])]))],64)):g(``,!0),k(oe,{open:!!T.value,title:T.value?s.value?.kinds?.[T.value.kind]||T.value.kind:``,eyebrow:j(c)(`一颗星`),onClose:t[2]||=e=>T.value=null},{default:te(()=>[T.value?(b(),u(`div`,gt,[h(`p`,_t,r(T.value.content),1),h(`div`,vt,[h(`span`,yt,r(H(T.value)),1),h(`span`,bt,r(j(I)[T.value.origin]||T.value.origin),1)]),h(`div`,xt,[k(R,{label:j(c)(`强度`),value:T.value.strength},null,8,[`label`,`value`]),T.value.salience===null?g(``,!0):(b(),m(R,{key:0,label:j(c)(`此刻的分量`),value:T.value.salience},null,8,[`label`,`value`]))]),h(`dl`,St,[h(`dt`,null,r(j(c)(`经历的天数`)),1),h(`dd`,null,r(j(c)(`{length} 天`,{length:T.value.days.length})),1),h(`dt`,null,r(j(c)(`来源`)),1),h(`dd`,null,r(j(c)(`{length} 处`,{length:T.value.sources.length})),1),h(`dt`,null,r(j(c)(`最近一次被触及`)),1),h(`dd`,null,r(j(L)(T.value.created)),1)]),h(`section`,null,[h(`h3`,Ct,r(j(c)(`怎么变成现在这样的 · {versions} 个版本`,{versions:T.value.versions})),1),h(`ol`,wt,[(b(!0),u(o,null,S(D.value,e=>(b(),u(`li`,{key:e.id},[h(`time`,null,r(j(L)(e.created)),1),h(`b`,null,r(j(M)(e.strength)),1),h(`span`,null,r(e.content),1)]))),128))])]),h(`button`,{class:`danger`,"data-revoke-thread":``,onClick:t[1]||=e=>Y(T.value)},r(j(c)(`撤销这条线索`)),1),h(`p`,Tt,r(j(c)(`撤销后 TA 不会再这样认为;这只是拿走一段理解,不会改写发生过的事。`)),1)])):g(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-f49fd383`]]);export{Et as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{Ct as e,D as t,Dt as n,Et as r,G as i,I as a,J as o,L as s,M as c,Q as l,St as u,Tt as d,X as f,Y as p,Z as m,_ as h,_t as g,dt as _,et as v,ft as y,i as b,n as x,o as S,rt as C,s as w,t as T,tt as E,v as D,wt as O,yt as k}from"./Empty-DjvoHpAi.js";import{g as A,m as j,n as M,p as N,t as P,v as F}from"./mind-BY8WSI7v.js";import{_ as I,a as L,b as R,d as z,m as B,n as V,t as H}from"./index-CqRx6L9a.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=x(C({__name:`DiaryBook`,props:{diaries:{}},setup(e){let t=e,r=u(0),c=u(null),h=u(!1),x=0,S=o(()=>t.diaries[r.value]||null);g(()=>t.diaries,e=>{r.value>=e.length&&(r.value=0)}),g(()=>S.value?.id,()=>{x++,c.value=null,h.value=!1});async function C(){if(!S.value)return;let e=S.value.day,t=++x;if(c.value?.day===S.value.day){c.value=null;return}h.value=!0;try{let n=await A.day(e);t===x&&S.value?.day===e&&(c.value=n)}catch(e){t===x&&D(e.message,!0)}finally{t===x&&(h.value=!1)}}return(t,o)=>e.diaries.length?(_(),l(`div`,U,[p(`nav`,{class:`days`,"aria-label":O(a)(`日记的日子`)},[(_(!0),l(i,null,y(e.diaries,(e,t)=>(_(),l(`button`,{key:e.id,class:d([`diary-day`,{active:t===r.value}]),"data-day":e.day,"aria-current":t===r.value?`true`:void 0,onClick:e=>r.value=t},[p(`b`,null,n(O(z)(e.day)),1),p(`small`,null,n(O(I)(e.day))+n(e.mood?` · ${e.mood}`:``),1)],10,te))),128))],8,ee),E(s,{name:`page-turn`,mode:`out-in`},{default:k(()=>[S.value?(_(),l(`article`,{key:S.value.id,class:`diary-page`},[p(`header`,null,[p(`div`,null,[p(`span`,W,n(O(a)(`日记`)),1),p(`h2`,null,[v(n(O(z)(S.value.day))+` `,1),p(`small`,null,n(O(I)(S.value.day)),1)])]),S.value.mood?(_(),l(`span`,{key:0,class:`stamp`,"aria-label":O(a)(`那天的心情`)},n(S.value.mood),9,G)):m(``,!0)]),p(`p`,K,n(S.value.content),1),S.value.actions?.length?(_(),l(`div`,q,[(_(!0),l(i,null,y(S.value.actions,e=>(_(),l(`button`,{key:e.ref,class:`text-button`,onClick:t=>O(b)(`time`,e.work?`works/`+e.work:`tasks`)},n(e.title)+` → `,9,J))),128))])):m(``,!0),S.value.compare?(_(),l(`blockquote`,Y,n(O(a)(`和昨天的自己比:{compare}`,{compare:S.value.compare})),1)):m(``,!0),p(`footer`,null,[p(`button`,{disabled:r.value>=e.diaries.length-1,"aria-label":O(a)(`前一天`),onClick:o[0]||=e=>r.value+=1},n(O(a)(`‹ 前一天`)),9,X),p(`button`,{class:`primary`,disabled:h.value,onClick:C},n(c.value?.day===S.value.day?O(a)(`合上那天的 TA`):O(a)(`那天的 TA`)),9,Z),p(`button`,{disabled:r.value===0,"aria-label":O(a)(`后一天`),onClick:o[1]||=e=>--r.value},n(O(a)(`后一天 ›`)),9,Q)]),c.value?.day===S.value.day?(_(),l(`section`,ne,[c.value.change?(_(),l(i,{key:0},[p(`h3`,null,n(O(a)(`那天的 TA,和前一天比`)),1),c.value.change.appeared.length?(_(),l(`p`,re,[p(`b`,null,n(O(a)(`多了:`)),1),v(n(c.value.change.appeared.map(e=>e.content).join(`;`)),1)])):m(``,!0),c.value.change.changed.length?(_(),l(`p`,ie,[p(`b`,null,n(O(a)(`变了:`)),1),v(n(c.value.change.changed.map(e=>`${e.before.content} → ${e.content}`).join(`;`)),1)])):m(``,!0),c.value.change.faded.length?(_(),l(`p`,ae,[p(`b`,null,n(O(a)(`放下了:`)),1),v(n(c.value.change.faded.map(e=>e.content).join(`;`)),1)])):m(``,!0),c.value.change.livingFor?(_(),l(`p`,oe,[p(`b`,null,n(O(a)(`正在过的:`)),1),v(n(c.value.change.livingFor.from||O(a)(`还没有`))+` → `+n(c.value.change.livingFor.to||O(a)(`还没有`)),1)])):c.value.snapshot?.livingFor?.content?(_(),l(`p`,se,[p(`b`,null,n(O(a)(`正在过的:`)),1),v(n(c.value.snapshot.livingFor.content),1)])):m(``,!0),p(`p`,null,[p(`b`,null,n(O(a)(`心情:`)),1),v(n(c.value.change.mood.before||`—`)+` → `+n(c.value.change.mood.after||`—`),1)])],64)):(_(),l(`p`,ce,n(O(a)(`这是 TA 留下快照的第一天,还没有可以对照的昨天。`)),1))])):m(``,!0)])):m(``,!0)]),_:1})])):(_(),f(T,{key:1,title:O(a)(`还没有日记`),text:O(a)(`每天睡前(或凌晨),如果这一天真的有过经历,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=x(C({__name:`AheadCalendar`,props:{items:{},timeZone:{},today:{}},emits:[`changed`],setup(e,{emit:r}){let s=e,h=r,g=u(`calendar`),[b,x]=s.today.split(`-`).map(Number),S=u(b),C=u(x),w=u(s.today),k=o(()=>[1,2,3,4,5,6,7].map(e=>new Date(Date.UTC(2024,0,e)).toLocaleDateString(c(),{weekday:`narrow`,timeZone:`UTC`}))),j=e=>new Intl.DateTimeFormat(`en-CA`,{timeZone:s.timeZone,year:`numeric`,month:`2-digit`,day:`2-digit`}).format(e),N=o(()=>{let e=new Map;for(let t of s.items){let n=j(t.occurrence);e.set(n,[...e.get(n)||[],t])}return e}),I=o(()=>{let e=(new Date(Date.UTC(S.value,C.value-1,1)).getUTCDay()+6)%7,t=new Date(Date.UTC(S.value,C.value,0)).getUTCDate(),n=Array(e).fill(null);for(let e=1;e<=t;e++){let t=`${S.value}-${String(C.value).padStart(2,`0`)}-${String(e).padStart(2,`0`)}`;n.push({day:t,n:e,items:N.value.get(t)||[]})}return n}),L=o(()=>N.value.get(w.value)||[]),R=o(()=>{let e=s.items.filter(e=>e.state===`pending`).sort((e,t)=>e.occurrence-t.occurrence),t=s.items.filter(e=>e.state!==`pending`).sort((e,t)=>t.occurrence-e.occurrence);return[...e,...t]});function z(e){let t=C.value+e;S.value+=Math.floor((t-1)/12),C.value=(t-1+120)%12+1}async function B(e){let n=await t(a(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这个约定`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(n!==null)try{await A.revoke(`anticipation`,e.id,n),D(a(`已撤销`)),h(`changed`)}catch(e){D(e.message,!0)}}function H(e){if([`missed`,`lapsed`,`revoked`].includes(e.state))return`danger`;if(e.state!==`pending`)return`quiet`}return(t,r)=>(_(),l(`section`,ue,[p(`div`,de,[p(`div`,null,[p(`span`,fe,n(O(a)(`AHEAD · 向前看`)),1),p(`h2`,null,n(O(a)(`让未来有值得期待的事。`)),1),p(`p`,pe,n(O(a)(`约定、想做的事与每年都会回来的日子,都安静地留在这里。`)),1)]),E(V,{modelValue:g.value,"onUpdate:modelValue":r[0]||=e=>g.value=e,label:O(a)(`约定的视图`),items:[{key:`calendar`,label:O(a)(`日历`)},{key:`list`,label:O(a)(`清单`),count:e.items.length}]},null,8,[`modelValue`,`label`,`items`])]),g.value===`calendar`?(_(),l(`div`,me,[p(`div`,he,[p(`header`,null,[p(`button`,{class:`icon-button ghost`,"aria-label":O(a)(`上个月`),onClick:r[1]||=e=>z(-1)},` ‹ `,8,ge),p(`b`,null,n(O(a)(`{year} 年 {month} 月`,{year:S.value,month:C.value})),1),p(`button`,{class:`icon-button ghost`,"aria-label":O(a)(`下个月`),onClick:r[2]||=e=>z(1)},` › `,8,_e)]),p(`div`,ve,[(_(!0),l(i,null,y(k.value,(e,t)=>(_(),l(`span`,{key:t,class:`wd`},n(e),1))),128)),(_(!0),l(i,null,y(I.value,(t,r)=>(_(),l(i,{key:r},[t?(_(),l(`button`,{key:1,class:d([`cell`,{today:t.day===e.today,picked:t.day===w.value,has:t.items.length}]),"aria-label":O(a)(`{n} 日{v}`,{n:t.n,v:t.items.length?O(a)(`,{length} 件事`,{length:t.items.length}):``}),onClick:e=>w.value=t.day},[v(n(t.n)+` `,1),t.items.length?(_(),l(`i`,xe,[(_(!0),l(i,null,y(t.items.slice(0,3),e=>(_(),l(`em`,{key:e.id,"data-state":e.state},null,8,Se))),128))])):m(``,!0)],10,be)):(_(),l(`span`,ye))],64))),128))])]),p(`div`,Ce,[p(`h3`,null,n(O(a)(`{month} 月 {date} 日`,{month:Number(w.value.slice(5,7)),date:Number(w.value.slice(8,10))})),1),L.value.length?(_(),l(`ul`,we,[(_(!0),l(i,null,y(L.value,e=>(_(),l(`li`,{key:e.id,class:d([`ahead-item`,{closed:e.state!==`pending`}])},[p(`span`,{class:`chip`,"data-tone":H(e)},n(O(M)[e.state]||e.state),9,Te),p(`div`,Ee,[p(`p`,null,n(e.name?`${e.name}:`:``)+n(e.content),1),p(`small`,De,n(O(P)[e.kind]||e.kind)+` · `+n(e.when)+n(e.recurrence===`yearly`?O(a)(` · 每年`):``),1)]),e.state===`revoked`?m(``,!0):(_(),l(`button`,{key:0,class:`text-button`,onClick:t=>B(e)},n(O(a)(`撤销`)),9,Oe))],2))),128))])):(_(),l(`p`,ke,n(O(a)(`这一天没有 TA 在等的事。`)),1))])])):(_(),l(`div`,Ae,[R.value.length?(_(),l(`ul`,je,[(_(!0),l(i,null,y(R.value,t=>(_(),l(`li`,{key:t.id,class:d([`ahead-item card flat`,{closed:t.state!==`pending`}]),"data-ahead":t.id},[p(`time`,Ne,n(O(F)(t.occurrence,e.timeZone).slice(0,5)),1),p(`span`,{class:`chip`,"data-tone":H(t)},n(O(M)[t.state]||t.state),9,Pe),p(`div`,Fe,[p(`p`,null,n(t.name?`${t.name}:`:``)+n(t.content),1),p(`small`,Ie,n(O(P)[t.kind]||t.kind)+` · `+n(t.when)+n(t.recurrence===`yearly`?O(a)(` · 每年`):``)+n(t.private?O(a)(` · 私下知道的`):``)+n(t.closed_note?` · ${t.closed_note}`:``),1)]),t.state===`revoked`?m(``,!0):(_(),l(`button`,{key:0,class:`text-button`,onClick:e=>B(t)},n(O(a)(`撤销`)),9,Le))],10,Me))),128))])):(_(),f(T,{key:1,title:O(a)(`还没有 TA 在等的事`),text:O(a)(`有人说起之后的安排、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=x(C({__name:`LifePage`,setup(t){let s=[`diary`,`reviews`,`story`,`ahead`,`shelf`],c=e(h(`/mind/life?q=`)||null),d=u(s.includes(w.sub)?w.sub:`diary`),x=u({}),C=u(null),D=o(()=>R.data?.clock?.timeZone||`Asia/Shanghai`),M=o(()=>R.data?.clock?.local?.slice(0,10)||new Date().toISOString().slice(0,10)),P=0;async function I(){let e=++P,t=await A.life();e===P&&(c.value=t)}async function z(e){if(x.value[e]){let{[e]:t,...n}=x.value;x.value=n;return}x.value={...x.value,[e]:await A.chapter(e)}}async function U(){C.value=C.value?null:await A.story()}return g(d,e=>{w.page===`life`&&S(e===`diary`?``:e)}),g(()=>[w.page,w.sub],([e,t])=>{e===`life`&&(d.value=s.includes(t)?t:`diary`)}),L(`life`,I),(e,t)=>(_(),l(`div`,ze,[p(`header`,Be,[p(`div`,null,[p(`span`,Ve,n(O(a)(`LIFE · 一生`)),1),p(`h1`,null,[v(n(O(a)(`日子经过,`)),1),p(`em`,null,n(O(a)(`留下自己的形状。`)),1)]),p(`p`,null,n(O(a)(`写下今天,回望从前,也给明天留一点期待。`)),1)]),t[4]||=p(`div`,{class:`life-mark`,"aria-hidden":`true`},[p(`span`)],-1)]),p(`div`,He,[p(`button`,{class:`text-button`,onClick:t[0]||=e=>O(b)(`time`)},n(O(a)(`时间、任务与作品 →`)),1),E(V,{modelValue:d.value,"onUpdate:modelValue":t[1]||=e=>d.value=e,label:O(a)(`一生的分区`),items:[{key:`diary`,label:O(a)(`日记本`),count:c.value?.diaries.length??``},{key:`reviews`,label:O(a)(`回顾`),count:c.value?.reviews.length??``},{key:`story`,label:O(a)(`我的来路`),count:c.value?c.value.chapters.length:``},{key:`ahead`,label:O(a)(`约定与期待`),count:c.value?.anticipations.filter(e=>e.state===`pending`).length??``},{key:`shelf`,label:O(a)(`书架`),count:c.value?.readings.length??``}]},null,8,[`modelValue`,`label`,`items`]),c.value?(_(),l(`span`,Ue,n(O(a)(`来到这里的第 {dayOfLife} 天`,{dayOfLife:c.value.dayOfLife})),1)):m(``,!0)]),c.value?(_(),l(i,{key:0},[d.value===`diary`?(_(),f(le,{key:0,diaries:c.value.diaries},null,8,[`diaries`])):d.value===`reviews`?(_(),l(`section`,We,[p(`div`,Ge,[p(`div`,null,[p(`span`,Ke,n(O(a)(`回顾`)),1),p(`h2`,null,n(O(a)(`TA 的回顾`)),1),p(`p`,null,n(O(a)(`每隔一段时间,TA 在夜里重新看看这段日子:留下了什么、自己怎样在变。`)),1)])]),c.value.reviews.length?(_(),f(H,{key:0,items:c.value.reviews,label:O(a)(`回顾`)},{default:k(({item:e})=>[p(`time`,qe,n(O(F)(e.created,D.value)),1),p(`p`,Je,n(e.content),1),e.compare?(_(),l(`blockquote`,Ye,n(O(a)(`和上次回顾比:{compare}`,{compare:e.compare})),1)):m(``,!0)]),_:1},8,[`items`,`label`])):(_(),f(T,{key:1,title:O(a)(`还没有回顾过`),text:O(a)(`日记攒到两篇以后,TA 会在睡着的时候第一次回顾。`)},null,8,[`title`,`text`]))])):d.value===`story`?(_(),l(`section`,Xe,[c.value.story?(_(),l(`article`,Ze,[p(`span`,Qe,n(O(a)(`前言`)),1),p(`h2`,null,n(O(a)(`我的来路 · 第 {dayOfLife} 天`,{dayOfLife:c.value.dayOfLife})),1),p(`p`,null,n(c.value.story.content),1),c.value.storyVersions>1?(_(),l(`button`,{key:0,class:`text-button`,onClick:U},n(C.value?O(a)(`收起旧版本`):O(a)(`重写过 {v} 次`,{v:c.value.storyVersions-1})),1)):m(``,!0),C.value?(_(),l(`ol`,$e,[(_(!0),l(i,null,y(C.value.slice(1),e=>(_(),l(`li`,{key:e.id},[p(`time`,null,n(O(F)(e.created,D.value)),1),p(`span`,null,n(e.content),1)]))),128))])):m(``,!0)])):m(``,!0),(_(!0),l(i,null,y(c.value.chapters,e=>(_(),l(`article`,{key:e.id,class:`chapter`},[p(`span`,et,n(O(a)(`第 {chapter} 章`,{chapter:e.chapter})),1),p(`h2`,null,n(e.title),1),p(`p`,null,n(e.content),1),e.versions>1?(_(),l(`button`,{key:0,class:`text-button`,onClick:t=>z(e.chapter)},n(x.value[e.chapter]?O(a)(`收起旧版本`):O(a)(`重写过 {v} 次`,{v:e.versions-1})),9,tt)):m(``,!0),x.value[e.chapter]?(_(),l(`ol`,$,[(_(!0),l(i,null,y(x.value[e.chapter].slice(1),e=>(_(),l(`li`,{key:e.id},[p(`time`,null,n(O(F)(e.created,D.value)),1),p(`span`,null,n(e.title)+`:`+n(e.content),1)]))),128))])):m(``,!0)]))),128)),!c.value.story&&!c.value.chapters.length?(_(),f(T,{key:1,title:O(a)(`自传还没开始写`),text:O(a)(`有了两篇日记之后,TA 会在夜里第一次回顾,写下「我的来路」和第一章。旧的版本都会留着。`)},null,8,[`title`,`text`])):m(``,!0)])):d.value===`ahead`?(_(),f(Re,{key:3,items:c.value.anticipations,"time-zone":D.value,today:M.value,onChanged:I},null,8,[`items`,`time-zone`,`today`])):(_(),l(`section`,nt,[p(`p`,rt,[v(n(O(a)(`独处时,TA 会从共享资料里挑自己感兴趣的读,一段一段地读下去,读后的想法可以改变 TA。还有 {v} 段没读。`,{v:O(B)(c.value.unread)}))+` `,1),p(`button`,{class:`text-button`,onClick:t[2]||=e=>O(b)(`memory`,`shelf`)},n(O(a)(`去资料书架放点书`)),1)]),c.value.readings.length?(_(),l(`div`,it,[(_(!0),l(i,null,y(c.value.readings,e=>(_(),l(`article`,{key:e.id,class:`book-card`},[p(`div`,{class:`spine`,style:r({"--p":(e.ordinal+1)/Math.max(1,e.total)})},null,4),p(`div`,null,[p(`h3`,null,`《`+n(e.title)+`》`,1),p(`small`,at,n(O(a)(`第 {v} / {total} 段 · {v2}`,{v:e.ordinal+1,total:e.total,v2:O(F)(e.created,D.value)})),1),p(`p`,null,n(e.note||O(a)(`读完没说什么`)),1)])]))),128))])):(_(),f(T,{key:1,title:O(a)(`还没读过什么`),text:O(a)(`把文章放进「记忆 → 资料书架」的共享集合,TA 独处时会去读。`)},null,8,[`title`,`text`]))])),p(`details`,ot,[p(`summary`,null,n(O(a)(`独处时留下的东西 · {v}`,{v:c.value.creations?.length||0})),1),p(`button`,{class:`text-button`,onClick:t[3]||=e=>O(b)(`time`,`works`)},n(O(a)(`阅读草稿、篇章和旧版本 →`)),1),(_(!0),l(i,null,y(c.value.creations||[],e=>(_(),l(`article`,{key:e.id,class:`creation`},[p(`h3`,null,n(e.title),1),p(`small`,st,n(O(F)(e.created,D.value))+` · `+n(e.discretion===`open`?O(a)(`自己的作品`):O(a)(`留在私下`)),1),p(`p`,ct,n(e.content),1)]))),128)),c.value.creations?.length?m(``,!0):(_(),f(T,{key:0,title:O(a)(`还没有独处作品`),text:O(a)(`她会按自己留下的计划,阅读、写东西或整理想法。`)},null,8,[`title`,`text`]))]),p(`details`,lt,[p(`summary`,null,[p(`span`,ut,n(O(a)(`独处的时候`)),1),p(`b`,null,n(O(a)(`独处、日记与夜里的记录 · {length}`,{length:c.value.runs.length})),1)]),c.value.runs.length?(_(),l(`ul`,dt,[(_(!0),l(i,null,y(c.value.runs,e=>(_(),l(`li`,{key:e.id,class:`run-row`},[p(`time`,ft,n(O(F)(e.started,D.value)),1),p(`span`,{class:`chip`,"data-tone":e.status===`error`?`danger`:e.status===`written`?`ok`:`quiet`},n(O(N)[e.kind]||e.kind)+` · `+n(O(j)[e.status]||e.status),9,pt),p(`span`,mt,n(e.reason),1),p(`small`,ht,n(e.model||O(a)(`未调用模型`))+` · `+n(O(B)(e.tokens))+` Token`,1)]))),128))])):(_(),l(`p`,gt,n(O(a)(`安静本身不会留下记录;TA 真正独处、写日记或在夜里整理时才会记下。`)),1))])],64)):m(``,!0)]))}}),[[`__scopeId`,`data-v-e4940116`]]);export{_t as default};
|
|
1
|
+
import{Ct as e,D as t,Dt as n,Et as r,G as i,I as a,J as o,L as s,M as c,Q as l,St as u,Tt as d,X as f,Y as p,Z as m,_ as h,_t as g,dt as _,et as v,ft as y,i as b,n as x,o as S,rt as C,s as w,t as T,tt as E,v as D,wt as O,yt as k}from"./Empty-DK9nQPCf.js";import{g as A,m as j,n as M,p as N,t as P,v as F}from"./mind-ec-G6iNZ.js";import{_ as I,a as L,b as R,d as z,m as B,n as V,t as H}from"./index-BJfzfgnm.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=x(C({__name:`DiaryBook`,props:{diaries:{}},setup(e){let t=e,r=u(0),c=u(null),h=u(!1),x=0,S=o(()=>t.diaries[r.value]||null);g(()=>t.diaries,e=>{r.value>=e.length&&(r.value=0)}),g(()=>S.value?.id,()=>{x++,c.value=null,h.value=!1});async function C(){if(!S.value)return;let e=S.value.day,t=++x;if(c.value?.day===S.value.day){c.value=null;return}h.value=!0;try{let n=await A.day(e);t===x&&S.value?.day===e&&(c.value=n)}catch(e){t===x&&D(e.message,!0)}finally{t===x&&(h.value=!1)}}return(t,o)=>e.diaries.length?(_(),l(`div`,U,[p(`nav`,{class:`days`,"aria-label":O(a)(`日记的日子`)},[(_(!0),l(i,null,y(e.diaries,(e,t)=>(_(),l(`button`,{key:e.id,class:d([`diary-day`,{active:t===r.value}]),"data-day":e.day,"aria-current":t===r.value?`true`:void 0,onClick:e=>r.value=t},[p(`b`,null,n(O(z)(e.day)),1),p(`small`,null,n(O(I)(e.day))+n(e.mood?` · ${e.mood}`:``),1)],10,te))),128))],8,ee),E(s,{name:`page-turn`,mode:`out-in`},{default:k(()=>[S.value?(_(),l(`article`,{key:S.value.id,class:`diary-page`},[p(`header`,null,[p(`div`,null,[p(`span`,W,n(O(a)(`日记`)),1),p(`h2`,null,[v(n(O(z)(S.value.day))+` `,1),p(`small`,null,n(O(I)(S.value.day)),1)])]),S.value.mood?(_(),l(`span`,{key:0,class:`stamp`,"aria-label":O(a)(`那天的心情`)},n(S.value.mood),9,G)):m(``,!0)]),p(`p`,K,n(S.value.content),1),S.value.actions?.length?(_(),l(`div`,q,[(_(!0),l(i,null,y(S.value.actions,e=>(_(),l(`button`,{key:e.ref,class:`text-button`,onClick:t=>O(b)(`time`,e.work?`works/`+e.work:`tasks`)},n(e.title)+` → `,9,J))),128))])):m(``,!0),S.value.compare?(_(),l(`blockquote`,Y,n(O(a)(`和昨天的自己比:{compare}`,{compare:S.value.compare})),1)):m(``,!0),p(`footer`,null,[p(`button`,{disabled:r.value>=e.diaries.length-1,"aria-label":O(a)(`前一天`),onClick:o[0]||=e=>r.value+=1},n(O(a)(`‹ 前一天`)),9,X),p(`button`,{class:`primary`,disabled:h.value,onClick:C},n(c.value?.day===S.value.day?O(a)(`合上那天的 TA`):O(a)(`那天的 TA`)),9,Z),p(`button`,{disabled:r.value===0,"aria-label":O(a)(`后一天`),onClick:o[1]||=e=>--r.value},n(O(a)(`后一天 ›`)),9,Q)]),c.value?.day===S.value.day?(_(),l(`section`,ne,[c.value.change?(_(),l(i,{key:0},[p(`h3`,null,n(O(a)(`那天的 TA,和前一天比`)),1),c.value.change.appeared.length?(_(),l(`p`,re,[p(`b`,null,n(O(a)(`多了:`)),1),v(n(c.value.change.appeared.map(e=>e.content).join(`;`)),1)])):m(``,!0),c.value.change.changed.length?(_(),l(`p`,ie,[p(`b`,null,n(O(a)(`变了:`)),1),v(n(c.value.change.changed.map(e=>`${e.before.content} → ${e.content}`).join(`;`)),1)])):m(``,!0),c.value.change.faded.length?(_(),l(`p`,ae,[p(`b`,null,n(O(a)(`放下了:`)),1),v(n(c.value.change.faded.map(e=>e.content).join(`;`)),1)])):m(``,!0),c.value.change.livingFor?(_(),l(`p`,oe,[p(`b`,null,n(O(a)(`正在过的:`)),1),v(n(c.value.change.livingFor.from||O(a)(`还没有`))+` → `+n(c.value.change.livingFor.to||O(a)(`还没有`)),1)])):c.value.snapshot?.livingFor?.content?(_(),l(`p`,se,[p(`b`,null,n(O(a)(`正在过的:`)),1),v(n(c.value.snapshot.livingFor.content),1)])):m(``,!0),p(`p`,null,[p(`b`,null,n(O(a)(`心情:`)),1),v(n(c.value.change.mood.before||`—`)+` → `+n(c.value.change.mood.after||`—`),1)])],64)):(_(),l(`p`,ce,n(O(a)(`这是 TA 留下快照的第一天,还没有可以对照的昨天。`)),1))])):m(``,!0)])):m(``,!0)]),_:1})])):(_(),f(T,{key:1,title:O(a)(`还没有日记`),text:O(a)(`每天睡前(或凌晨),如果这一天真的有过经历,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=x(C({__name:`AheadCalendar`,props:{items:{},timeZone:{},today:{}},emits:[`changed`],setup(e,{emit:r}){let s=e,h=r,g=u(`calendar`),[b,x]=s.today.split(`-`).map(Number),S=u(b),C=u(x),w=u(s.today),k=o(()=>[1,2,3,4,5,6,7].map(e=>new Date(Date.UTC(2024,0,e)).toLocaleDateString(c(),{weekday:`narrow`,timeZone:`UTC`}))),j=e=>new Intl.DateTimeFormat(`en-CA`,{timeZone:s.timeZone,year:`numeric`,month:`2-digit`,day:`2-digit`}).format(e),N=o(()=>{let e=new Map;for(let t of s.items){let n=j(t.occurrence);e.set(n,[...e.get(n)||[],t])}return e}),I=o(()=>{let e=(new Date(Date.UTC(S.value,C.value-1,1)).getUTCDay()+6)%7,t=new Date(Date.UTC(S.value,C.value,0)).getUTCDate(),n=Array(e).fill(null);for(let e=1;e<=t;e++){let t=`${S.value}-${String(C.value).padStart(2,`0`)}-${String(e).padStart(2,`0`)}`;n.push({day:t,n:e,items:N.value.get(t)||[]})}return n}),L=o(()=>N.value.get(w.value)||[]),R=o(()=>{let e=s.items.filter(e=>e.state===`pending`).sort((e,t)=>e.occurrence-t.occurrence),t=s.items.filter(e=>e.state!==`pending`).sort((e,t)=>t.occurrence-e.occurrence);return[...e,...t]});function z(e){let t=C.value+e;S.value+=Math.floor((t-1)/12),C.value=(t-1+120)%12+1}async function B(e){let n=await t(a(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这个约定`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(n!==null)try{await A.revoke(`anticipation`,e.id,n),D(a(`已撤销`)),h(`changed`)}catch(e){D(e.message,!0)}}function H(e){if([`missed`,`lapsed`,`revoked`].includes(e.state))return`danger`;if(e.state!==`pending`)return`quiet`}return(t,r)=>(_(),l(`section`,ue,[p(`div`,de,[p(`div`,null,[p(`span`,fe,n(O(a)(`AHEAD · 向前看`)),1),p(`h2`,null,n(O(a)(`让未来有值得期待的事。`)),1),p(`p`,pe,n(O(a)(`约定、想做的事与每年都会回来的日子,都安静地留在这里。`)),1)]),E(V,{modelValue:g.value,"onUpdate:modelValue":r[0]||=e=>g.value=e,label:O(a)(`约定的视图`),items:[{key:`calendar`,label:O(a)(`日历`)},{key:`list`,label:O(a)(`清单`),count:e.items.length}]},null,8,[`modelValue`,`label`,`items`])]),g.value===`calendar`?(_(),l(`div`,me,[p(`div`,he,[p(`header`,null,[p(`button`,{class:`icon-button ghost`,"aria-label":O(a)(`上个月`),onClick:r[1]||=e=>z(-1)},` ‹ `,8,ge),p(`b`,null,n(O(a)(`{year} 年 {month} 月`,{year:S.value,month:C.value})),1),p(`button`,{class:`icon-button ghost`,"aria-label":O(a)(`下个月`),onClick:r[2]||=e=>z(1)},` › `,8,_e)]),p(`div`,ve,[(_(!0),l(i,null,y(k.value,(e,t)=>(_(),l(`span`,{key:t,class:`wd`},n(e),1))),128)),(_(!0),l(i,null,y(I.value,(t,r)=>(_(),l(i,{key:r},[t?(_(),l(`button`,{key:1,class:d([`cell`,{today:t.day===e.today,picked:t.day===w.value,has:t.items.length}]),"aria-label":O(a)(`{n} 日{v}`,{n:t.n,v:t.items.length?O(a)(`,{length} 件事`,{length:t.items.length}):``}),onClick:e=>w.value=t.day},[v(n(t.n)+` `,1),t.items.length?(_(),l(`i`,xe,[(_(!0),l(i,null,y(t.items.slice(0,3),e=>(_(),l(`em`,{key:e.id,"data-state":e.state},null,8,Se))),128))])):m(``,!0)],10,be)):(_(),l(`span`,ye))],64))),128))])]),p(`div`,Ce,[p(`h3`,null,n(O(a)(`{month} 月 {date} 日`,{month:Number(w.value.slice(5,7)),date:Number(w.value.slice(8,10))})),1),L.value.length?(_(),l(`ul`,we,[(_(!0),l(i,null,y(L.value,e=>(_(),l(`li`,{key:e.id,class:d([`ahead-item`,{closed:e.state!==`pending`}])},[p(`span`,{class:`chip`,"data-tone":H(e)},n(O(M)[e.state]||e.state),9,Te),p(`div`,Ee,[p(`p`,null,n(e.name?`${e.name}:`:``)+n(e.content),1),p(`small`,De,n(O(P)[e.kind]||e.kind)+` · `+n(e.when)+n(e.recurrence===`yearly`?O(a)(` · 每年`):``),1)]),e.state===`revoked`?m(``,!0):(_(),l(`button`,{key:0,class:`text-button`,onClick:t=>B(e)},n(O(a)(`撤销`)),9,Oe))],2))),128))])):(_(),l(`p`,ke,n(O(a)(`这一天没有 TA 在等的事。`)),1))])])):(_(),l(`div`,Ae,[R.value.length?(_(),l(`ul`,je,[(_(!0),l(i,null,y(R.value,t=>(_(),l(`li`,{key:t.id,class:d([`ahead-item card flat`,{closed:t.state!==`pending`}]),"data-ahead":t.id},[p(`time`,Ne,n(O(F)(t.occurrence,e.timeZone).slice(0,5)),1),p(`span`,{class:`chip`,"data-tone":H(t)},n(O(M)[t.state]||t.state),9,Pe),p(`div`,Fe,[p(`p`,null,n(t.name?`${t.name}:`:``)+n(t.content),1),p(`small`,Ie,n(O(P)[t.kind]||t.kind)+` · `+n(t.when)+n(t.recurrence===`yearly`?O(a)(` · 每年`):``)+n(t.private?O(a)(` · 私下知道的`):``)+n(t.closed_note?` · ${t.closed_note}`:``),1)]),t.state===`revoked`?m(``,!0):(_(),l(`button`,{key:0,class:`text-button`,onClick:e=>B(t)},n(O(a)(`撤销`)),9,Le))],10,Me))),128))])):(_(),f(T,{key:1,title:O(a)(`还没有 TA 在等的事`),text:O(a)(`有人说起之后的安排、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=x(C({__name:`LifePage`,setup(t){let s=[`diary`,`reviews`,`story`,`ahead`,`shelf`],c=e(h(`/mind/life?q=`)||null),d=u(s.includes(w.sub)?w.sub:`diary`),x=u({}),C=u(null),D=o(()=>R.data?.clock?.timeZone||`Asia/Shanghai`),M=o(()=>R.data?.clock?.local?.slice(0,10)||new Date().toISOString().slice(0,10)),P=0;async function I(){let e=++P,t=await A.life();e===P&&(c.value=t)}async function z(e){if(x.value[e]){let{[e]:t,...n}=x.value;x.value=n;return}x.value={...x.value,[e]:await A.chapter(e)}}async function U(){C.value=C.value?null:await A.story()}return g(d,e=>{w.page===`life`&&S(e===`diary`?``:e)}),g(()=>[w.page,w.sub],([e,t])=>{e===`life`&&(d.value=s.includes(t)?t:`diary`)}),L(`life`,I),(e,t)=>(_(),l(`div`,ze,[p(`header`,Be,[p(`div`,null,[p(`span`,Ve,n(O(a)(`LIFE · 一生`)),1),p(`h1`,null,[v(n(O(a)(`日子经过,`)),1),p(`em`,null,n(O(a)(`留下自己的形状。`)),1)]),p(`p`,null,n(O(a)(`写下今天,回望从前,也给明天留一点期待。`)),1)]),t[4]||=p(`div`,{class:`life-mark`,"aria-hidden":`true`},[p(`span`)],-1)]),p(`div`,He,[p(`button`,{class:`text-button`,onClick:t[0]||=e=>O(b)(`time`)},n(O(a)(`时间、任务与作品 →`)),1),E(V,{modelValue:d.value,"onUpdate:modelValue":t[1]||=e=>d.value=e,label:O(a)(`一生的分区`),items:[{key:`diary`,label:O(a)(`日记本`),count:c.value?.diaries.length??``},{key:`reviews`,label:O(a)(`回顾`),count:c.value?.reviews.length??``},{key:`story`,label:O(a)(`我的来路`),count:c.value?c.value.chapters.length:``},{key:`ahead`,label:O(a)(`约定与期待`),count:c.value?.anticipations.filter(e=>e.state===`pending`).length??``},{key:`shelf`,label:O(a)(`书架`),count:c.value?.readings.length??``}]},null,8,[`modelValue`,`label`,`items`]),c.value?(_(),l(`span`,Ue,n(O(a)(`来到这里的第 {dayOfLife} 天`,{dayOfLife:c.value.dayOfLife})),1)):m(``,!0)]),c.value?(_(),l(i,{key:0},[d.value===`diary`?(_(),f(le,{key:0,diaries:c.value.diaries},null,8,[`diaries`])):d.value===`reviews`?(_(),l(`section`,We,[p(`div`,Ge,[p(`div`,null,[p(`span`,Ke,n(O(a)(`回顾`)),1),p(`h2`,null,n(O(a)(`TA 的回顾`)),1),p(`p`,null,n(O(a)(`每隔一段时间,TA 在夜里重新看看这段日子:留下了什么、自己怎样在变。`)),1)])]),c.value.reviews.length?(_(),f(H,{key:0,items:c.value.reviews,label:O(a)(`回顾`)},{default:k(({item:e})=>[p(`time`,qe,n(O(F)(e.created,D.value)),1),p(`p`,Je,n(e.content),1),e.compare?(_(),l(`blockquote`,Ye,n(O(a)(`和上次回顾比:{compare}`,{compare:e.compare})),1)):m(``,!0)]),_:1},8,[`items`,`label`])):(_(),f(T,{key:1,title:O(a)(`还没有回顾过`),text:O(a)(`日记攒到两篇以后,TA 会在睡着的时候第一次回顾。`)},null,8,[`title`,`text`]))])):d.value===`story`?(_(),l(`section`,Xe,[c.value.story?(_(),l(`article`,Ze,[p(`span`,Qe,n(O(a)(`前言`)),1),p(`h2`,null,n(O(a)(`我的来路 · 第 {dayOfLife} 天`,{dayOfLife:c.value.dayOfLife})),1),p(`p`,null,n(c.value.story.content),1),c.value.storyVersions>1?(_(),l(`button`,{key:0,class:`text-button`,onClick:U},n(C.value?O(a)(`收起旧版本`):O(a)(`重写过 {v} 次`,{v:c.value.storyVersions-1})),1)):m(``,!0),C.value?(_(),l(`ol`,$e,[(_(!0),l(i,null,y(C.value.slice(1),e=>(_(),l(`li`,{key:e.id},[p(`time`,null,n(O(F)(e.created,D.value)),1),p(`span`,null,n(e.content),1)]))),128))])):m(``,!0)])):m(``,!0),(_(!0),l(i,null,y(c.value.chapters,e=>(_(),l(`article`,{key:e.id,class:`chapter`},[p(`span`,et,n(O(a)(`第 {chapter} 章`,{chapter:e.chapter})),1),p(`h2`,null,n(e.title),1),p(`p`,null,n(e.content),1),e.versions>1?(_(),l(`button`,{key:0,class:`text-button`,onClick:t=>z(e.chapter)},n(x.value[e.chapter]?O(a)(`收起旧版本`):O(a)(`重写过 {v} 次`,{v:e.versions-1})),9,tt)):m(``,!0),x.value[e.chapter]?(_(),l(`ol`,$,[(_(!0),l(i,null,y(x.value[e.chapter].slice(1),e=>(_(),l(`li`,{key:e.id},[p(`time`,null,n(O(F)(e.created,D.value)),1),p(`span`,null,n(e.title)+`:`+n(e.content),1)]))),128))])):m(``,!0)]))),128)),!c.value.story&&!c.value.chapters.length?(_(),f(T,{key:1,title:O(a)(`自传还没开始写`),text:O(a)(`有了两篇日记之后,TA 会在夜里第一次回顾,写下「我的来路」和第一章。旧的版本都会留着。`)},null,8,[`title`,`text`])):m(``,!0)])):d.value===`ahead`?(_(),f(Re,{key:3,items:c.value.anticipations,"time-zone":D.value,today:M.value,onChanged:I},null,8,[`items`,`time-zone`,`today`])):(_(),l(`section`,nt,[p(`p`,rt,[v(n(O(a)(`独处时,TA 会从共享资料里挑自己感兴趣的读,一段一段地读下去,读后的想法可以改变 TA。还有 {v} 段没读。`,{v:O(B)(c.value.unread)}))+` `,1),p(`button`,{class:`text-button`,onClick:t[2]||=e=>O(b)(`memory`,`shelf`)},n(O(a)(`去资料书架放点书`)),1)]),c.value.readings.length?(_(),l(`div`,it,[(_(!0),l(i,null,y(c.value.readings,e=>(_(),l(`article`,{key:e.id,class:`book-card`},[p(`div`,{class:`spine`,style:r({"--p":(e.ordinal+1)/Math.max(1,e.total)})},null,4),p(`div`,null,[p(`h3`,null,`《`+n(e.title)+`》`,1),p(`small`,at,n(O(a)(`第 {v} / {total} 段 · {v2}`,{v:e.ordinal+1,total:e.total,v2:O(F)(e.created,D.value)})),1),p(`p`,null,n(e.note||O(a)(`读完没说什么`)),1)])]))),128))])):(_(),f(T,{key:1,title:O(a)(`还没读过什么`),text:O(a)(`把文章放进「记忆 → 资料书架」的共享集合,TA 独处时会去读。`)},null,8,[`title`,`text`]))])),p(`details`,ot,[p(`summary`,null,n(O(a)(`独处时留下的东西 · {v}`,{v:c.value.creations?.length||0})),1),p(`button`,{class:`text-button`,onClick:t[3]||=e=>O(b)(`time`,`works`)},n(O(a)(`阅读草稿、篇章和旧版本 →`)),1),(_(!0),l(i,null,y(c.value.creations||[],e=>(_(),l(`article`,{key:e.id,class:`creation`},[p(`h3`,null,n(e.title),1),p(`small`,st,n(O(F)(e.created,D.value))+` · `+n(e.discretion===`open`?O(a)(`自己的作品`):O(a)(`留在私下`)),1),p(`p`,ct,n(e.content),1)]))),128)),c.value.creations?.length?m(``,!0):(_(),f(T,{key:0,title:O(a)(`还没有独处作品`),text:O(a)(`她会按自己留下的计划,阅读、写东西或整理想法。`)},null,8,[`title`,`text`]))]),p(`details`,lt,[p(`summary`,null,[p(`span`,ut,n(O(a)(`独处的时候`)),1),p(`b`,null,n(O(a)(`独处、日记与夜里的记录 · {length}`,{length:c.value.runs.length})),1)]),c.value.runs.length?(_(),l(`ul`,dt,[(_(!0),l(i,null,y(c.value.runs,e=>(_(),l(`li`,{key:e.id,class:`run-row`},[p(`time`,ft,n(O(F)(e.started,D.value)),1),p(`span`,{class:`chip`,"data-tone":e.status===`error`?`danger`:e.status===`written`?`ok`:`quiet`},n(O(N)[e.kind]||e.kind)+` · `+n(O(j)[e.status]||e.status),9,pt),p(`span`,mt,n(e.reason),1),p(`small`,ht,n(e.model||O(a)(`未调用模型`))+` · `+n(O(B)(e.tokens))+` Token`,1)]))),128))])):(_(),l(`p`,gt,n(O(a)(`安静本身不会留下记录;TA 真正独处、写日记或在夜里整理时才会记下。`)),1))])],64)):m(``,!0)]))}}),[[`__scopeId`,`data-v-e4940116`]]);export{_t as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{D as e,Dt as t,E as n,Et as r,G as i,H as a,I as o,J as s,M as c,Q as l,St as u,Tt as d,W as f,X as p,Y as m,Z as h,_t as g,bt as _,dt as v,et as y,ft as b,lt as ee,m as x,n as S,o as C,rt as w,s as T,t as te,tt as E,ut as D,v as O,wt as k,yt as A}from"./Empty-DjvoHpAi.js";import{g as ne,l as j,s as M}from"./mind-BY8WSI7v.js";import{c as N,f as P,g as F,h as re,n as I,o as ie}from"./index-CqRx6L9a.js";import{a as L,c as ae,i as R,l as oe,n as se,o as z,r as ce,s as le,t as ue,u as B}from"./knowledge-Dj6hHClj.js";var de={class:`archive`},fe={class:`archive-bar card`},pe={class:`scope`},me={class:`scope`},he=[`placeholder`,`aria-label`],ge=[`disabled`],_e={id:`memorySummary`,class:`card summary-card`},ve={class:`card-head`},ye={class:`eyebrow`},be={class:`row`},xe=[`disabled`,`aria-label`],Se=[`disabled`],Ce={class:`row between faint`},we={class:`card list-card`},Te={class:`tools row`},Ee=[`disabled`],De=[`disabled`],Oe=[`disabled`],ke={id:`memoryList`,class:`scroll-pane`},Ae=[`aria-label`,`data-memory-select`,`checked`,`disabled`,`onChange`],je={class:`memory`},Me={class:`content`},Ne={class:`tags`},Pe=[`data-tone`],Fe={class:`chip`,"data-tone":`quiet`},Ie={key:0,class:`chip`,"data-tone":`warn`},Le={class:`faint meta`},Re=[`data-content`,`aria-label`],ze={class:`row`},Be=[`onClick`],Ve={class:`faint`},He=[`onClick`],Ue=[`onClick`],We={class:`row between faint foot`},Ge=[`placeholder`],Ke={id:`memoryUsers`},qe=[`value`],Je={class:`primary`},V=S(w({__name:`MemoryArchive`,props:{sessionId:{}},emits:[`update:sessionId`],setup(r,{emit:x}){let S=r,C=x,w=u(``),P=u(``),I=u(!1),L=u(!1),R=u(20),z=u([]),B=u({summary:``,updated:null,source:`empty`}),V=u([]),H=u(!1),U=u(!1),W=0,G=s(()=>T.core?.sessions||[]),K=s({get:()=>S.sessionId,set:e=>C(`update:sessionId`,e)}),Ye=s(()=>{let e=new Map;for(let t of z.value)t.subject&&e.set(String(t.subject),t.subjectName||String(t.subject));return[...e.entries()]}),q=s(()=>z.value.filter(e=>e.status!==`deleted`&&(!P.value||String(e.subject)===P.value)&&JSON.stringify(e).includes(w.value))),J=s(()=>z.value.filter(Y));function Y(e){return e.session_id===S.sessionId&&!e.locked&&e.status!==`deleted`}async function X(){if(!S.sessionId)return;let e=S.sessionId;sessionStorage.memorySession=e;let[t,n]=await Promise.all([le(e),ae(e)]);if(S.sessionId!==e)return;z.value=t,B.value=n;let r=new Set(t.filter(Y).map(e=>e.id));V.value=V.value.filter(e=>r.has(e))}g(()=>S.sessionId,()=>{R.value=20,P.value=``,X()}),g(w,()=>R.value=20),ee(()=>{X(),W=window.setInterval(()=>{!document.hidden&&!T.dirty&&!I.value&&X()},4e3)}),D(()=>clearInterval(W));async function Xe(e){let t=e.target,n=Object.fromEntries(new FormData(t)),r=(B.value.participants||[]).find(e=>e.name===String(n.subject||``).trim());r&&(n.subject=r.id);try{await ue(n),t.reset(),I.value=!1,await X(),O(o(`记忆已写入`))}catch(e){O(e.message,!0)}}async function Z(t,n){if(n===`revoke`){let n=await e(o(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:t.content}),{title:o(`撤销这条记忆`),confirmText:o(`撤销`),danger:!0,placeholder:o(`原因`)});if(n===null)return;try{await ne.revoke(`memory`,t.id,n)}catch(e){O(e.message,!0)}await X();return}let r=document.querySelector(`[data-content="${t.id}"]`)?.value;await oe(t.id,n===`lock`?{locked:!t.locked}:n.startsWith(`discretion:`)?{discretion:n.slice(11)}:{status:`confirmed`,content:r}),await X()}function Ze(e,t){let n=t.target.checked;V.value=n?[...new Set([...V.value,e])]:V.value.filter(t=>t!==e)}async function Qe(){if(V.value.length&&await n(o(`确定删除已选的 {length} 条记忆吗?`,{length:V.value.length}),{title:o(`删除记忆`),confirmText:o(`删除`),danger:!0}))try{let e=await ce({session:S.sessionId,ids:V.value});V.value=[],await X(),O(o(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){O(e.message,!0)}}async function $e(){let e=J.value.length;if(e&&await n(o(`确定清空本会话的 {count} 条可删除记忆吗?`,{count:e}),{title:o(`清空本会话记忆`),confirmText:o(`清空`),danger:!0}))try{let e=await ce({session:S.sessionId,all:!0});V.value=[],await X(),O(o(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){O(e.message,!0)}}async function Q(){if(S.sessionId){H.value=!0;try{B.value=await ae(S.sessionId)}catch(e){O(e.message,!0)}finally{H.value=!1}}}async function $(){if(S.sessionId&&!U.value){U.value=!0;try{await se(S.sessionId),await Q(),await X(),O(o(`记忆已整理`))}catch(e){O(e.message,!0)}finally{U.value=!1}}}return(e,n)=>(v(),l(`section`,de,[m(`div`,fe,[m(`label`,pe,[m(`span`,null,t(k(o)(`在哪里知道的`)),1),E(N,{id:`memoryScope`,modelValue:K.value,"onUpdate:modelValue":n[0]||=e=>K.value=e,"aria-label":k(o)(`在哪里知道的`),options:k(F)(G.value,k(o)(`选择会话`))},null,8,[`modelValue`,`aria-label`,`options`])]),m(`label`,me,[m(`span`,null,t(k(o)(`关于谁`)),1),E(N,{modelValue:P.value,"onUpdate:modelValue":n[1]||=e=>P.value=e,"aria-label":k(o)(`按人筛选`),options:[{value:``,label:k(o)(`所有人`)},...Ye.value.map(([e,t])=>({value:e,label:t}))]},null,8,[`modelValue`,`aria-label`,`options`])]),_(m(`input`,{id:`memorySearch`,"onUpdate:modelValue":n[2]||=e=>w.value=e,type:`search`,placeholder:k(o)(`搜索记忆、人物或关键词`),"aria-label":k(o)(`搜索记忆`)},null,8,he),[[a,w.value]]),m(`button`,{class:`primary`,disabled:!r.sessionId,onClick:n[3]||=e=>I.value=!0},t(k(o)(`+ 手动记忆`)),9,ge)]),m(`section`,_e,[m(`div`,ve,[m(`div`,null,[m(`span`,ye,t(k(o)(`最近发生了什么`)),1),m(`h2`,null,t(G.value.find(e=>e.id===r.sessionId)?k(re)(G.value.find(e=>e.id===r.sessionId)):k(o)(`记忆档案`)),1)]),m(`div`,be,[m(`button`,{id:`refreshMemorySummary`,class:`icon-button`,disabled:H.value||!r.sessionId,"aria-label":k(o)(`刷新总结`),onClick:Q},` ↻ `,8,xe),m(`button`,{id:`consolidateMemory`,disabled:U.value||!r.sessionId,onClick:$},t(U.value?k(o)(`整理中…`):k(o)(`立即整理`)),9,Se)])]),m(`p`,{"data-memory-summary":``,class:d({clamp:!L.value})},t(B.value.summary||k(o)(`请选择会话以查看最近的记忆总结。`)),3),m(`div`,Ce,[m(`span`,null,t(B.value.updated?new Date(B.value.updated).toLocaleString(k(c)()):k(o)(`尚未整理`)),1),m(`button`,{class:`text-button`,onClick:n[4]||=e=>L.value=!L.value},t(L.value?k(o)(`收起`):k(o)(`展开`)),1)])]),m(`section`,we,[m(`div`,Te,[m(`button`,{id:`selectAllMemories`,class:`small`,onClick:n[5]||=e=>V.value=J.value.map(e=>e.id)},t(k(o)(`全选`)),1),m(`button`,{id:`clearMemorySelection`,class:`small`,disabled:!V.value.length,onClick:n[6]||=e=>V.value=[]},t(k(o)(`取消选择`)),9,Ee),m(`button`,{id:`deleteSelectedMemories`,class:`small danger`,disabled:!V.value.length,onClick:Qe},t(k(o)(`删除已选 {v}`,{v:V.value.length||``})),9,De),m(`button`,{id:`deleteAllSessionMemories`,class:`small danger push`,disabled:!J.value.length,onClick:$e},t(k(o)(`清空本会话`)),9,Oe)]),m(`div`,ke,[(v(!0),l(i,null,b(q.value.slice(0,R.value),e=>(v(),l(`article`,{key:e.id,class:d([`memory-row`,{superseded:e.status===`superseded`}])},[m(`input`,{type:`checkbox`,"aria-label":k(o)(`选择记忆:`)+e.content,"data-memory-select":e.id,checked:V.value.includes(e.id),disabled:!Y(e),onChange:t=>Ze(e.id,t)},null,40,Ae),m(`details`,je,[m(`summary`,null,[m(`span`,Me,t(e.content),1),m(`span`,Ne,[m(`span`,{class:`chip`,"data-tone":e.status===`confirmed`?void 0:`quiet`},t(k(j)[e.status]||e.status),9,Pe),m(`span`,Fe,t(k(M)[e.discretion]||k(o)(`公开`)),1),e.locked?(v(),l(`span`,Ie,t(k(o)(`已锁定`)),1)):h(``,!0)])]),m(`p`,Le,t(k(o)(`关于 {v} · {v2} · 把握 {v3}%`,{v:e.subjectName||e.subject,v2:e.session_id===r.sessionId?k(o)(`在这里知道的`):k(o)(`别处知道的`),v3:Math.round((e.confidence??1)*100)})),1),m(`textarea`,{"data-content":e.id,"aria-label":k(o)(`编辑记忆:`)+(e.subjectName||e.subject)},t(e.content),9,Re),m(`div`,ze,[m(`button`,{class:`small`,onClick:t=>Z(e,`confirmed`)},t(k(o)(`保存修改`)),9,Be),m(`small`,Ve,t(k(o)(`编辑后要点保存`)),1),E(N,{"aria-label":k(o)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(k(M)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>Z(e,`discretion:`+t)},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),m(`button`,{class:`small`,onClick:t=>Z(e,`lock`)},t(e.locked?k(o)(`解锁`):k(o)(`锁定`)),9,He),m(`button`,{class:`small danger`,onClick:t=>Z(e,`revoke`)},t(k(o)(`撤销`)),9,Ue)])])],2))),128)),q.value.length>R.value?(v(),l(`button`,{key:0,class:`small more`,onClick:n[7]||=e=>R.value+=20},t(k(o)(`再显示 20 条`)),1)):h(``,!0),q.value.length?h(``,!0):(v(),p(te,{key:1,title:k(o)(`这里还有空白`),text:k(o)(`别人说「记住……」、聊天积累后的自动整理,或你手动添加的事会出现在这里。TA 对所有会话只有一份记忆:别处知道的事只在相关时想起,私下知道的不当众说,要 TA 保密的不离开原处。`)},null,8,[`title`,`text`]))]),m(`div`,We,[m(`span`,null,t(k(o)(`共 {length} 条记忆`,{length:q.value.length})),1),m(`span`,null,t(k(o)(`共享与锁定的记忆不会被批量选中`)),1)])]),E(ie,{open:I.value,title:k(o)(`手动记住一件事`),eyebrow:`REMEMBER`,width:`440px`,onClose:n[9]||=e=>I.value=!1},{default:A(()=>[m(`form`,{id:`addMemory`,class:`stack`,onSubmit:f(Xe,[`prevent`])},[m(`label`,null,[y(t(k(o)(`所属会话`))+` `,1),E(N,{id:`memorySession`,modelValue:K.value,"onUpdate:modelValue":n[8]||=e=>K.value=e,name:`session`,"aria-label":k(o)(`所属会话`),options:k(F)(G.value)},null,8,[`modelValue`,`aria-label`,`options`])]),m(`label`,null,[y(t(k(o)(`用户 ID`))+` `,1),m(`input`,{name:`subject`,required:``,list:`memoryUsers`,placeholder:k(o)(`选择昵称,或填写用户 ID`)},null,8,Ge)]),m(`datalist`,Ke,[(v(!0),l(i,null,b(B.value.participants||[],e=>(v(),l(`option`,{key:e.id,value:e.name},null,8,qe))),128))]),m(`label`,null,[y(t(k(o)(`已确认的事实`)),1),n[10]||=m(`input`,{name:`content`,required:``},null,-1)]),m(`button`,Je,t(k(o)(`新增人工记忆`)),1)],32)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-332a6fd9`]]),H={class:`shelf`},U={class:`card shelf-head`},W={class:`eyebrow`},G={class:`muted`},K={class:`collection`},Ye=[`aria-label`],q={class:`chip`,"data-tone":`quiet`},J=[`disabled`,`onClick`],Y={class:`grid-2`},X={class:`card add-doc`},Xe={class:`save-bar`},Z=[`disabled`],Ze={class:`faint`},Qe={class:`row`},$e=[`placeholder`],Q={key:0,class:`muted`},$=S(w({__name:`KnowledgeShelf`,props:{sessionId:{}},setup(e){let n=e,s=u([]),c=u([]),d=u(`shared-default`),S=u(``),C=u(``),w=u(``),T=u(null),D=u(!1),A=u(``);async function ne(e){A.value=e;try{let t=await x(`/core/knowledge/documents/${encodeURIComponent(e)}/reembed`,`POST`,{});O(o(`已重建 {chunks} 段向量`,{chunks:t.chunks}))}catch(e){O(e.message,!0)}finally{A.value=``}}async function j(){n.sessionId&&(s.value=await L(n.sessionId),s.value[0]&&!s.value.some(e=>e.id===d.value)&&(d.value=s.value[0].id),c.value=d.value?await z(d.value):[])}async function M(){D.value=!0;try{await R({collectionId:d.value,title:S.value,text:C.value,embed:!0}),S.value=``,C.value=``,await j(),O(o(`文档已切分入库`))}catch(e){O(e.message,!0)}finally{D.value=!1}}async function F(){try{T.value=await B(n.sessionId,w.value)}catch(e){O(e.message,!0)}}return g(()=>[n.sessionId,d.value],j),ee(j),(e,n)=>(v(),l(`section`,H,[m(`div`,U,[m(`div`,null,[m(`span`,W,t(k(o)(`资料书架`)),1),m(`h2`,null,t(k(o)(`给 TA 留一点可以读的东西`)),1),m(`p`,G,t(k(o)(`存放可供聊天参考的资料,和自动记录的会话记忆分开管理。共享集合里的文章,TA 独处时也会挑着读。`)),1)]),m(`label`,K,[y(t(k(o)(`文档集合`))+` `,1),E(N,{modelValue:d.value,"onUpdate:modelValue":n[0]||=e=>d.value=e,"aria-label":k(o)(`文档集合`),options:s.value.map(e=>({value:e.id,label:e.name}))},null,8,[`modelValue`,`aria-label`,`options`])])]),m(`div`,{class:`books`,"aria-label":k(o)(`资料书架,{length} 份资料`,{length:c.value.length})},[(v(!0),l(i,null,b(c.value,e=>(v(),l(`article`,{key:e.id,class:`book`,style:r({"--hue":k(P)(e.title||e.id)})},[n[4]||=m(`span`,{class:`spine`,"aria-hidden":`true`},null,-1),m(`b`,null,t(e.title),1),m(`small`,q,t(e.status),1),e.status===`ready`?(v(),l(`button`,{key:0,type:`button`,disabled:!!A.value,onClick:t=>ne(e.id)},t(A.value===e.id?k(o)(`正在重建…`):k(o)(`重建向量`)),9,J)):h(``,!0)],4))),128)),c.value.length?h(``,!0):(v(),p(te,{key:0,title:k(o)(`书架还空着`),text:k(o)(`在下面放一份资料,TA 就能在聊天里查到,独处时也可能去读。`)},null,8,[`title`,`text`]))],8,Ye),m(`div`,Y,[m(`details`,X,[m(`summary`,null,t(k(o)(`+ 添加一份资料`)),1),m(`form`,{class:`stack tight`,onSubmit:f(M,[`prevent`])},[m(`label`,null,[y(t(k(o)(`标题`)),1),_(m(`input`,{"onUpdate:modelValue":n[1]||=e=>S.value=e,required:``},null,512),[[a,S.value]])]),m(`label`,null,[y(t(k(o)(`粘贴正文`)),1),_(m(`textarea`,{"onUpdate:modelValue":n[2]||=e=>C.value=e,rows:`8`,required:``},null,512),[[a,C.value]])]),m(`div`,Xe,[m(`button`,{class:`primary`,disabled:D.value},t(k(o)(`保存到书架`)),9,Z),m(`small`,Ze,t(k(o)(`保存之后,TA 才能在聊天和独处时读到`)),1)])],32)]),m(`form`,{class:`card probe`,onSubmit:f(F,[`prevent`])},[m(`label`,null,[y(t(k(o)(`检索测试`))+` `,1),m(`div`,Qe,[_(m(`input`,{"onUpdate:modelValue":n[3]||=e=>w.value=e,placeholder:k(o)(`试着搜索一个关键词`)},null,8,$e),[[a,w.value]]),m(`button`,null,t(k(o)(`检索`)),1)])]),T.value&&!T.value.length?(v(),l(`p`,Q,t(k(o)(`没有找到相关资料。`)),1)):h(``,!0),(v(!0),l(i,null,b(T.value||[],e=>(v(),l(`p`,{key:e.id,class:`notice`},[m(`b`,null,t(e.title),1),n[5]||=m(`br`,null,null,-1),y(t(e.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=S(w({__name:`MemoryPage`,setup(e){let n=s(()=>T.core?.sessions||[]),r=sessionStorage.memorySession,i=u(n.value.some(e=>e.id===r)?r:n.value[0]?.id||``),a=u(T.sub===`shelf`?`shelf`:`memories`);return g(a,e=>C(e===`shelf`?`shelf`:``)),g(()=>T.sub,e=>{a.value=e===`shelf`?`shelf`:`memories`}),(e,r)=>(v(),l(`div`,et,[m(`header`,tt,[m(`div`,null,[m(`span`,nt,t(k(o)(`MEMORY · 记忆`)),1),m(`h1`,null,[y(t(k(o)(`见过的人与事,`)),1),m(`em`,null,t(k(o)(`会慢慢有了重量。`)),1)]),m(`p`,null,t(k(o)(`记住重要的,也允许改变看法。`)),1)]),r[2]||=m(`div`,{class:`memory-drop`,"aria-hidden":`true`},[m(`span`)],-1)]),E(I,{modelValue:a.value,"onUpdate:modelValue":r[0]||=e=>a.value=e,label:k(o)(`记忆的分区`),items:[{key:`memories`,label:k(o)(`TA 记得的事`)},{key:`shelf`,label:k(o)(`资料书架`)}]},null,8,[`modelValue`,`label`,`items`]),n.value.length?h(``,!0):(v(),l(`p`,rt,t(k(o)(`先在「对话」里添加一个会话,TA 才有地方认识人、记住事。`)),1)),a.value===`memories`?(v(),p(V,{key:1,"session-id":i.value,"onUpdate:sessionId":r[1]||=e=>i.value=e},null,8,[`session-id`])):(v(),p($,{key:2,"session-id":i.value},null,8,[`session-id`]))]))}}),[[`__scopeId`,`data-v-11432402`]]);export{it as default};
|
|
1
|
+
import{D as e,Dt as t,E as n,Et as r,G as i,H as a,I as o,J as s,M as c,Q as l,St as u,Tt as d,W as f,X as p,Y as m,Z as h,_t as g,bt as _,dt as v,et as y,ft as b,lt as ee,m as x,n as S,o as C,rt as w,s as T,t as te,tt as E,ut as D,v as O,wt as k,yt as A}from"./Empty-DK9nQPCf.js";import{g as ne,l as j,s as M}from"./mind-ec-G6iNZ.js";import{c as N,f as P,g as F,h as re,n as I,o as ie}from"./index-BJfzfgnm.js";import{a as L,c as ae,i as R,l as oe,n as se,o as z,r as ce,s as le,t as ue,u as B}from"./knowledge-C-bND0Ub.js";var de={class:`archive`},fe={class:`archive-bar card`},pe={class:`scope`},me={class:`scope`},he=[`placeholder`,`aria-label`],ge=[`disabled`],_e={id:`memorySummary`,class:`card summary-card`},ve={class:`card-head`},ye={class:`eyebrow`},be={class:`row`},xe=[`disabled`,`aria-label`],Se=[`disabled`],Ce={class:`row between faint`},we={class:`card list-card`},Te={class:`tools row`},Ee=[`disabled`],De=[`disabled`],Oe=[`disabled`],ke={id:`memoryList`,class:`scroll-pane`},Ae=[`aria-label`,`data-memory-select`,`checked`,`disabled`,`onChange`],je={class:`memory`},Me={class:`content`},Ne={class:`tags`},Pe=[`data-tone`],Fe={class:`chip`,"data-tone":`quiet`},Ie={key:0,class:`chip`,"data-tone":`warn`},Le={class:`faint meta`},Re=[`data-content`,`aria-label`],ze={class:`row`},Be=[`onClick`],Ve={class:`faint`},He=[`onClick`],Ue=[`onClick`],We={class:`row between faint foot`},Ge=[`placeholder`],Ke={id:`memoryUsers`},qe=[`value`],Je={class:`primary`},V=S(w({__name:`MemoryArchive`,props:{sessionId:{}},emits:[`update:sessionId`],setup(r,{emit:x}){let S=r,C=x,w=u(``),P=u(``),I=u(!1),L=u(!1),R=u(20),z=u([]),B=u({summary:``,updated:null,source:`empty`}),V=u([]),H=u(!1),U=u(!1),W=0,G=s(()=>T.core?.sessions||[]),K=s({get:()=>S.sessionId,set:e=>C(`update:sessionId`,e)}),Ye=s(()=>{let e=new Map;for(let t of z.value)t.subject&&e.set(String(t.subject),t.subjectName||String(t.subject));return[...e.entries()]}),q=s(()=>z.value.filter(e=>e.status!==`deleted`&&(!P.value||String(e.subject)===P.value)&&JSON.stringify(e).includes(w.value))),J=s(()=>z.value.filter(Y));function Y(e){return e.session_id===S.sessionId&&!e.locked&&e.status!==`deleted`}async function X(){if(!S.sessionId)return;let e=S.sessionId;sessionStorage.memorySession=e;let[t,n]=await Promise.all([le(e),ae(e)]);if(S.sessionId!==e)return;z.value=t,B.value=n;let r=new Set(t.filter(Y).map(e=>e.id));V.value=V.value.filter(e=>r.has(e))}g(()=>S.sessionId,()=>{R.value=20,P.value=``,X()}),g(w,()=>R.value=20),ee(()=>{X(),W=window.setInterval(()=>{!document.hidden&&!T.dirty&&!I.value&&X()},4e3)}),D(()=>clearInterval(W));async function Xe(e){let t=e.target,n=Object.fromEntries(new FormData(t)),r=(B.value.participants||[]).find(e=>e.name===String(n.subject||``).trim());r&&(n.subject=r.id);try{await ue(n),t.reset(),I.value=!1,await X(),O(o(`记忆已写入`))}catch(e){O(e.message,!0)}}async function Z(t,n){if(n===`revoke`){let n=await e(o(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:t.content}),{title:o(`撤销这条记忆`),confirmText:o(`撤销`),danger:!0,placeholder:o(`原因`)});if(n===null)return;try{await ne.revoke(`memory`,t.id,n)}catch(e){O(e.message,!0)}await X();return}let r=document.querySelector(`[data-content="${t.id}"]`)?.value;await oe(t.id,n===`lock`?{locked:!t.locked}:n.startsWith(`discretion:`)?{discretion:n.slice(11)}:{status:`confirmed`,content:r}),await X()}function Ze(e,t){let n=t.target.checked;V.value=n?[...new Set([...V.value,e])]:V.value.filter(t=>t!==e)}async function Qe(){if(V.value.length&&await n(o(`确定删除已选的 {length} 条记忆吗?`,{length:V.value.length}),{title:o(`删除记忆`),confirmText:o(`删除`),danger:!0}))try{let e=await ce({session:S.sessionId,ids:V.value});V.value=[],await X(),O(o(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){O(e.message,!0)}}async function $e(){let e=J.value.length;if(e&&await n(o(`确定清空本会话的 {count} 条可删除记忆吗?`,{count:e}),{title:o(`清空本会话记忆`),confirmText:o(`清空`),danger:!0}))try{let e=await ce({session:S.sessionId,all:!0});V.value=[],await X(),O(o(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){O(e.message,!0)}}async function Q(){if(S.sessionId){H.value=!0;try{B.value=await ae(S.sessionId)}catch(e){O(e.message,!0)}finally{H.value=!1}}}async function $(){if(S.sessionId&&!U.value){U.value=!0;try{await se(S.sessionId),await Q(),await X(),O(o(`记忆已整理`))}catch(e){O(e.message,!0)}finally{U.value=!1}}}return(e,n)=>(v(),l(`section`,de,[m(`div`,fe,[m(`label`,pe,[m(`span`,null,t(k(o)(`在哪里知道的`)),1),E(N,{id:`memoryScope`,modelValue:K.value,"onUpdate:modelValue":n[0]||=e=>K.value=e,"aria-label":k(o)(`在哪里知道的`),options:k(F)(G.value,k(o)(`选择会话`))},null,8,[`modelValue`,`aria-label`,`options`])]),m(`label`,me,[m(`span`,null,t(k(o)(`关于谁`)),1),E(N,{modelValue:P.value,"onUpdate:modelValue":n[1]||=e=>P.value=e,"aria-label":k(o)(`按人筛选`),options:[{value:``,label:k(o)(`所有人`)},...Ye.value.map(([e,t])=>({value:e,label:t}))]},null,8,[`modelValue`,`aria-label`,`options`])]),_(m(`input`,{id:`memorySearch`,"onUpdate:modelValue":n[2]||=e=>w.value=e,type:`search`,placeholder:k(o)(`搜索记忆、人物或关键词`),"aria-label":k(o)(`搜索记忆`)},null,8,he),[[a,w.value]]),m(`button`,{class:`primary`,disabled:!r.sessionId,onClick:n[3]||=e=>I.value=!0},t(k(o)(`+ 手动记忆`)),9,ge)]),m(`section`,_e,[m(`div`,ve,[m(`div`,null,[m(`span`,ye,t(k(o)(`最近发生了什么`)),1),m(`h2`,null,t(G.value.find(e=>e.id===r.sessionId)?k(re)(G.value.find(e=>e.id===r.sessionId)):k(o)(`记忆档案`)),1)]),m(`div`,be,[m(`button`,{id:`refreshMemorySummary`,class:`icon-button`,disabled:H.value||!r.sessionId,"aria-label":k(o)(`刷新总结`),onClick:Q},` ↻ `,8,xe),m(`button`,{id:`consolidateMemory`,disabled:U.value||!r.sessionId,onClick:$},t(U.value?k(o)(`整理中…`):k(o)(`立即整理`)),9,Se)])]),m(`p`,{"data-memory-summary":``,class:d({clamp:!L.value})},t(B.value.summary||k(o)(`请选择会话以查看最近的记忆总结。`)),3),m(`div`,Ce,[m(`span`,null,t(B.value.updated?new Date(B.value.updated).toLocaleString(k(c)()):k(o)(`尚未整理`)),1),m(`button`,{class:`text-button`,onClick:n[4]||=e=>L.value=!L.value},t(L.value?k(o)(`收起`):k(o)(`展开`)),1)])]),m(`section`,we,[m(`div`,Te,[m(`button`,{id:`selectAllMemories`,class:`small`,onClick:n[5]||=e=>V.value=J.value.map(e=>e.id)},t(k(o)(`全选`)),1),m(`button`,{id:`clearMemorySelection`,class:`small`,disabled:!V.value.length,onClick:n[6]||=e=>V.value=[]},t(k(o)(`取消选择`)),9,Ee),m(`button`,{id:`deleteSelectedMemories`,class:`small danger`,disabled:!V.value.length,onClick:Qe},t(k(o)(`删除已选 {v}`,{v:V.value.length||``})),9,De),m(`button`,{id:`deleteAllSessionMemories`,class:`small danger push`,disabled:!J.value.length,onClick:$e},t(k(o)(`清空本会话`)),9,Oe)]),m(`div`,ke,[(v(!0),l(i,null,b(q.value.slice(0,R.value),e=>(v(),l(`article`,{key:e.id,class:d([`memory-row`,{superseded:e.status===`superseded`}])},[m(`input`,{type:`checkbox`,"aria-label":k(o)(`选择记忆:`)+e.content,"data-memory-select":e.id,checked:V.value.includes(e.id),disabled:!Y(e),onChange:t=>Ze(e.id,t)},null,40,Ae),m(`details`,je,[m(`summary`,null,[m(`span`,Me,t(e.content),1),m(`span`,Ne,[m(`span`,{class:`chip`,"data-tone":e.status===`confirmed`?void 0:`quiet`},t(k(j)[e.status]||e.status),9,Pe),m(`span`,Fe,t(k(M)[e.discretion]||k(o)(`公开`)),1),e.locked?(v(),l(`span`,Ie,t(k(o)(`已锁定`)),1)):h(``,!0)])]),m(`p`,Le,t(k(o)(`关于 {v} · {v2} · 把握 {v3}%`,{v:e.subjectName||e.subject,v2:e.session_id===r.sessionId?k(o)(`在这里知道的`):k(o)(`别处知道的`),v3:Math.round((e.confidence??1)*100)})),1),m(`textarea`,{"data-content":e.id,"aria-label":k(o)(`编辑记忆:`)+(e.subjectName||e.subject)},t(e.content),9,Re),m(`div`,ze,[m(`button`,{class:`small`,onClick:t=>Z(e,`confirmed`)},t(k(o)(`保存修改`)),9,Be),m(`small`,Ve,t(k(o)(`编辑后要点保存`)),1),E(N,{"aria-label":k(o)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(k(M)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>Z(e,`discretion:`+t)},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),m(`button`,{class:`small`,onClick:t=>Z(e,`lock`)},t(e.locked?k(o)(`解锁`):k(o)(`锁定`)),9,He),m(`button`,{class:`small danger`,onClick:t=>Z(e,`revoke`)},t(k(o)(`撤销`)),9,Ue)])])],2))),128)),q.value.length>R.value?(v(),l(`button`,{key:0,class:`small more`,onClick:n[7]||=e=>R.value+=20},t(k(o)(`再显示 20 条`)),1)):h(``,!0),q.value.length?h(``,!0):(v(),p(te,{key:1,title:k(o)(`这里还有空白`),text:k(o)(`别人说「记住……」、聊天积累后的自动整理,或你手动添加的事会出现在这里。TA 对所有会话只有一份记忆:别处知道的事只在相关时想起,私下知道的不当众说,要 TA 保密的不离开原处。`)},null,8,[`title`,`text`]))]),m(`div`,We,[m(`span`,null,t(k(o)(`共 {length} 条记忆`,{length:q.value.length})),1),m(`span`,null,t(k(o)(`共享与锁定的记忆不会被批量选中`)),1)])]),E(ie,{open:I.value,title:k(o)(`手动记住一件事`),eyebrow:`REMEMBER`,width:`440px`,onClose:n[9]||=e=>I.value=!1},{default:A(()=>[m(`form`,{id:`addMemory`,class:`stack`,onSubmit:f(Xe,[`prevent`])},[m(`label`,null,[y(t(k(o)(`所属会话`))+` `,1),E(N,{id:`memorySession`,modelValue:K.value,"onUpdate:modelValue":n[8]||=e=>K.value=e,name:`session`,"aria-label":k(o)(`所属会话`),options:k(F)(G.value)},null,8,[`modelValue`,`aria-label`,`options`])]),m(`label`,null,[y(t(k(o)(`用户 ID`))+` `,1),m(`input`,{name:`subject`,required:``,list:`memoryUsers`,placeholder:k(o)(`选择昵称,或填写用户 ID`)},null,8,Ge)]),m(`datalist`,Ke,[(v(!0),l(i,null,b(B.value.participants||[],e=>(v(),l(`option`,{key:e.id,value:e.name},null,8,qe))),128))]),m(`label`,null,[y(t(k(o)(`已确认的事实`)),1),n[10]||=m(`input`,{name:`content`,required:``},null,-1)]),m(`button`,Je,t(k(o)(`新增人工记忆`)),1)],32)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-332a6fd9`]]),H={class:`shelf`},U={class:`card shelf-head`},W={class:`eyebrow`},G={class:`muted`},K={class:`collection`},Ye=[`aria-label`],q={class:`chip`,"data-tone":`quiet`},J=[`disabled`,`onClick`],Y={class:`grid-2`},X={class:`card add-doc`},Xe={class:`save-bar`},Z=[`disabled`],Ze={class:`faint`},Qe={class:`row`},$e=[`placeholder`],Q={key:0,class:`muted`},$=S(w({__name:`KnowledgeShelf`,props:{sessionId:{}},setup(e){let n=e,s=u([]),c=u([]),d=u(`shared-default`),S=u(``),C=u(``),w=u(``),T=u(null),D=u(!1),A=u(``);async function ne(e){A.value=e;try{let t=await x(`/core/knowledge/documents/${encodeURIComponent(e)}/reembed`,`POST`,{});O(o(`已重建 {chunks} 段向量`,{chunks:t.chunks}))}catch(e){O(e.message,!0)}finally{A.value=``}}async function j(){n.sessionId&&(s.value=await L(n.sessionId),s.value[0]&&!s.value.some(e=>e.id===d.value)&&(d.value=s.value[0].id),c.value=d.value?await z(d.value):[])}async function M(){D.value=!0;try{await R({collectionId:d.value,title:S.value,text:C.value,embed:!0}),S.value=``,C.value=``,await j(),O(o(`文档已切分入库`))}catch(e){O(e.message,!0)}finally{D.value=!1}}async function F(){try{T.value=await B(n.sessionId,w.value)}catch(e){O(e.message,!0)}}return g(()=>[n.sessionId,d.value],j),ee(j),(e,n)=>(v(),l(`section`,H,[m(`div`,U,[m(`div`,null,[m(`span`,W,t(k(o)(`资料书架`)),1),m(`h2`,null,t(k(o)(`给 TA 留一点可以读的东西`)),1),m(`p`,G,t(k(o)(`存放可供聊天参考的资料,和自动记录的会话记忆分开管理。共享集合里的文章,TA 独处时也会挑着读。`)),1)]),m(`label`,K,[y(t(k(o)(`文档集合`))+` `,1),E(N,{modelValue:d.value,"onUpdate:modelValue":n[0]||=e=>d.value=e,"aria-label":k(o)(`文档集合`),options:s.value.map(e=>({value:e.id,label:e.name}))},null,8,[`modelValue`,`aria-label`,`options`])])]),m(`div`,{class:`books`,"aria-label":k(o)(`资料书架,{length} 份资料`,{length:c.value.length})},[(v(!0),l(i,null,b(c.value,e=>(v(),l(`article`,{key:e.id,class:`book`,style:r({"--hue":k(P)(e.title||e.id)})},[n[4]||=m(`span`,{class:`spine`,"aria-hidden":`true`},null,-1),m(`b`,null,t(e.title),1),m(`small`,q,t(e.status),1),e.status===`ready`?(v(),l(`button`,{key:0,type:`button`,disabled:!!A.value,onClick:t=>ne(e.id)},t(A.value===e.id?k(o)(`正在重建…`):k(o)(`重建向量`)),9,J)):h(``,!0)],4))),128)),c.value.length?h(``,!0):(v(),p(te,{key:0,title:k(o)(`书架还空着`),text:k(o)(`在下面放一份资料,TA 就能在聊天里查到,独处时也可能去读。`)},null,8,[`title`,`text`]))],8,Ye),m(`div`,Y,[m(`details`,X,[m(`summary`,null,t(k(o)(`+ 添加一份资料`)),1),m(`form`,{class:`stack tight`,onSubmit:f(M,[`prevent`])},[m(`label`,null,[y(t(k(o)(`标题`)),1),_(m(`input`,{"onUpdate:modelValue":n[1]||=e=>S.value=e,required:``},null,512),[[a,S.value]])]),m(`label`,null,[y(t(k(o)(`粘贴正文`)),1),_(m(`textarea`,{"onUpdate:modelValue":n[2]||=e=>C.value=e,rows:`8`,required:``},null,512),[[a,C.value]])]),m(`div`,Xe,[m(`button`,{class:`primary`,disabled:D.value},t(k(o)(`保存到书架`)),9,Z),m(`small`,Ze,t(k(o)(`保存之后,TA 才能在聊天和独处时读到`)),1)])],32)]),m(`form`,{class:`card probe`,onSubmit:f(F,[`prevent`])},[m(`label`,null,[y(t(k(o)(`检索测试`))+` `,1),m(`div`,Qe,[_(m(`input`,{"onUpdate:modelValue":n[3]||=e=>w.value=e,placeholder:k(o)(`试着搜索一个关键词`)},null,8,$e),[[a,w.value]]),m(`button`,null,t(k(o)(`检索`)),1)])]),T.value&&!T.value.length?(v(),l(`p`,Q,t(k(o)(`没有找到相关资料。`)),1)):h(``,!0),(v(!0),l(i,null,b(T.value||[],e=>(v(),l(`p`,{key:e.id,class:`notice`},[m(`b`,null,t(e.title),1),n[5]||=m(`br`,null,null,-1),y(t(e.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=S(w({__name:`MemoryPage`,setup(e){let n=s(()=>T.core?.sessions||[]),r=sessionStorage.memorySession,i=u(n.value.some(e=>e.id===r)?r:n.value[0]?.id||``),a=u(T.sub===`shelf`?`shelf`:`memories`);return g(a,e=>C(e===`shelf`?`shelf`:``)),g(()=>T.sub,e=>{a.value=e===`shelf`?`shelf`:`memories`}),(e,r)=>(v(),l(`div`,et,[m(`header`,tt,[m(`div`,null,[m(`span`,nt,t(k(o)(`MEMORY · 记忆`)),1),m(`h1`,null,[y(t(k(o)(`见过的人与事,`)),1),m(`em`,null,t(k(o)(`会慢慢有了重量。`)),1)]),m(`p`,null,t(k(o)(`记住重要的,也允许改变看法。`)),1)]),r[2]||=m(`div`,{class:`memory-drop`,"aria-hidden":`true`},[m(`span`)],-1)]),E(I,{modelValue:a.value,"onUpdate:modelValue":r[0]||=e=>a.value=e,label:k(o)(`记忆的分区`),items:[{key:`memories`,label:k(o)(`TA 记得的事`)},{key:`shelf`,label:k(o)(`资料书架`)}]},null,8,[`modelValue`,`label`,`items`]),n.value.length?h(``,!0):(v(),l(`p`,rt,t(k(o)(`先在「对话」里添加一个会话,TA 才有地方认识人、记住事。`)),1)),a.value===`memories`?(v(),p(V,{key:1,"session-id":i.value,"onUpdate:sessionId":r[1]||=e=>i.value=e},null,8,[`session-id`])):(v(),p($,{key:2,"session-id":i.value},null,8,[`session-id`]))]))}}),[[`__scopeId`,`data-v-11432402`]]);export{it as default};
|
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import{$ as e,Dt as t,Et as n,G as r,H as i,I as a,J as o,P as s,Q as c,St as l,Tt as u,W as d,Y as f,Z as p,a as m,bt as h,dt as g,et as _,ft as v,gt as y,it as b,j as x,lt as S,n as C,p as w,rt as T,s as E,tt as D,ut as O,v as k,wt as A,xt as j,yt as M,z as N}from"./Empty-
|
|
1
|
+
import{$ as e,Dt as t,Et as n,G as r,H as i,I as a,J as o,P as s,Q as c,St as l,Tt as u,W as d,Y as f,Z as p,a as m,bt as h,dt as g,et as _,ft as v,gt as y,it as b,j as x,lt as S,n as C,p as w,rt as T,s as E,tt as D,ut as O,v as k,wt as A,xt as j,yt as M,z as N}from"./Empty-DK9nQPCf.js";import{g as P,v as F}from"./mind-ec-G6iNZ.js";import{c as I,i as ee,s as te,v as ne,x as re}from"./index-BJfzfgnm.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=C(T({__name:`RhythmClock`,props:b({disabled:{type:Boolean}},{sleep:{required:!0},sleepModifiers:{},wake:{required:!0},wakeModifiers:{}}),emits:[`update:sleep`,`update:wake`],setup(n){let i=y(n,`sleep`),s=y(n,`wake`),d=l(),p=null,m=e=>{let[t,n]=String(e||`00:00`).split(`:`).map(Number);return(t*60+n)%1440},h=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`)}`},_=e=>e/1440*Math.PI*2-Math.PI/2,b=(e,t=X)=>({x:Y+Math.cos(_(e))*t,y:Y+Math.sin(_(e))*t});function x(e,t){let n=(t-e+1440)%1440||1440,r=b(e),i=b(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 S=o(()=>m(i.value)),C=o(()=>m(s.value)),w=o(()=>{let e=(C.value-S.value+1440)%1440,t=Math.floor(e/60),n=e%60;return n?a(`{h} 小时 {m} 分`,{h:t,m:n}):a(`{h} 小时`,{h:t})});function T(e){let t=d.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 h((i/(Math.PI*2)*1440%1440+1440)%1440)}function E(e,t){p=e,t.target.setPointerCapture?.(t.pointerId)}function D(e){if(!p)return;let t=T(e);t!==(p===`sleep`?s.value:i.value)&&(p===`sleep`?i.value=t:s.value=t)}function O(){p=null}function k(e,t){let n={ArrowRight:15,ArrowUp:15,ArrowLeft:-15,ArrowDown:-15,PageUp:60,PageDown:-60}[t.key];if(!n)return;t.preventDefault();let r=m(e===`sleep`?i.value:s.value),a=h(r+n);a!==(e===`sleep`?s.value:i.value)&&(e===`sleep`?i.value=a:s.value=a)}return(o,l)=>(g(),c(`div`,{class:u([`rhythm`,{disabled:n.disabled}])},[(g(),c(`svg`,{ref_key:`svg`,ref:d,viewBox:`0 0 220 220`,onPointermove:D,onPointerup:O,onPointercancel:O},[l[4]||=e(`<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),f(`circle`,{class:`glass-center`,cx:Y,cy:Y,r:`68`}),f(`circle`,{class:`track`,cx:Y,cy:Y,r:X}),f(`path`,{class:`awake`,d:x(C.value,S.value)},null,8,L),f(`path`,{class:`asleep`,d:x(S.value,C.value)},null,8,R),f(`g`,z,[(g(),c(r,null,v([0,6,12,18],e=>f(`text`,{key:e,x:b(e*60,54).x,y:b(e*60,54).y+4,"text-anchor":`middle`},t(e),9,B)),64))]),f(`text`,{class:`center big`,x:Y,y:106,"text-anchor":`middle`},t(A(a)(`睡 {hours}`,{hours:w.value})),9,V),f(`text`,{class:`center`,x:Y,y:126,"text-anchor":`middle`},t(i.value)+` → `+t(s.value),9,H),f(`g`,{class:`handle moon`,role:`slider`,tabindex:`0`,"aria-label":A(a)(`几点睡`),"aria-valuetext":i.value,onPointerdown:l[0]||=e=>E(`sleep`,e),onKeydown:l[1]||=e=>k(`sleep`,e)},[f(`circle`,{cx:b(S.value).x,cy:b(S.value).y,r:`15`},null,8,W),f(`text`,{x:b(S.value).x,y:b(S.value).y+5,"text-anchor":`middle`},`☾`,8,G)],40,U),f(`g`,{class:`handle sun`,role:`slider`,tabindex:`0`,"aria-label":A(a)(`几点醒`),"aria-valuetext":s.value,onPointerdown:l[2]||=e=>E(`wake`,e),onKeydown:l[3]||=e=>k(`wake`,e)},[f(`circle`,{cx:b(C.value).x,cy:b(C.value).y,r:`15`},null,8,q),f(`text`,{x:b(C.value).x,y:b(C.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=C(T({__name:`NaturePage`,setup(e){let u=s([{key:`warmth`,label:x(`温柔`),low:x(`颜色偏冷,表情淡淡的`),high:x(`颜色更暖,嘴角上扬`)},{key:`sarcasm`,label:x(`毒舌`),low:x(`不挖苦人`),high:x(`嘴角一歪,会吐槽`)},{key:`humor`,label:x(`幽默`),low:x(`认真`),high:x(`眯眼笑,爱开玩笑`)},{key:`activity`,label:x(`活泼`),low:x(`安安静静`),high:x(`跳得更快`)},{key:`initiative`,label:x(`主动`),low:x(`更喜欢独处`),high:x(`更愿意分享`)}]),y=s({system:x(`系统指令`),turn:x(`看见与开口`),expression:x(`自己的念头`),initiative:x(`分享与发起`),generation:x(`重新措辞`),validation:x(`回复检查`),memory:x(`记忆整理`),vision:x(`图片理解`),summary:x(`上下文压缩`),summaryMerge:x(`摘要合并`),reflection:x(`独处`),daily:x(`日记`)}),b=l(null),C=l(String(E.health.settings.aliases||``)),T=l([]),L=l(null),R=l({}),z=l([]),B=l(``),V=l([]),H=j({life:null,budget:null}),U=j({...E.core.prompts}),W=l(`turn`),G=l(!1),K=j({nature:!1,days:!1,prompts:!1});function q(e){K[e]=!1,E.dirty=Object.values(K).some(Boolean)}let J=l(!0),Y=o(()=>{if(L.value)return L.value;let e=T.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}}),X=o(()=>b.value?Object.fromEntries(u.map(e=>[e.key,Number(b.value[e.key])||0])):null),Z=e=>Array.isArray(e)?e.map(String):String(e||``).split(/[,,\n]/).map(e=>e.trim()).filter(Boolean);function Ot(){let{version:e,...t}=b.value;return{...t,gender:t.gender||`female`,interests:Z(t.interests),forbidden:Z(t.forbidden),bottomLines:Z(t.bottomLines)}}let kt=o(()=>J.value&&b.value?Ot():null);function At(e){return(Number(b.value?.[e.key])||0)>=50?e.high:e.low}async function jt(){let[e,t]=await Promise.all([P.nature(),P.overview()]);b.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
|
`)},T.value=e.versions,L.value=e.edits,R.value=e.livedTraits||{},z.value=e.traitHistory||[],B.value=e.livedPersona||``,V.value=e.personaHistory||[],H.life={...t.life},H.budget={...t.budget.settings}}function Q(e=`nature`){K[e]=!0,E.dirty=!0}async function Mt(){if(!G.value){G.value=!0;try{await P.saveNature(Ot()),C.value!==E.health.settings.aliases&&await w({aliases:C.value}),q(`nature`),await m();let e=await P.nature();T.value=e.versions,L.value=e.edits,R.value=e.livedTraits||{},z.value=e.traitHistory||[],B.value=e.livedPersona||``,V.value=e.personaHistory||[],k(a(`天性已保存,下一次开口时生效`))}catch(e){k(e.message,!0)}finally{G.value=!1}}}async function Nt(){try{let e=await P.saveSettings({life:H.life,budget:{dailyTokens:Number(H.budget.dailyTokens)||0,innerShare:Number(H.budget.innerShare),upkeepShare:Number(H.budget.upkeepShare)}});H.life={...e.life},H.budget={...e.budget},q(`days`),k(a(`TA 的日子已按新设置安排`))}catch(e){k(e.message,!0)}}async function Pt(){try{await P.savePrompts({...U}),q(`prompts`),await m(),k(a(`指令已保存,下一轮生效`))}catch(e){k(e.message,!0)}}let $;return S(()=>{jt(),$=setInterval(async()=>{if(!document.hidden)try{let e=await P.nature();L.value=e.edits,R.value=e.livedTraits||{},z.value=e.traitHistory||[],B.value=e.livedPersona||``,V.value=e.personaHistory||[]}catch{}},3e4)}),O(()=>{$&&clearInterval($)}),(e,o)=>b.value?(g(),c(`div`,ae,[f(`section`,{class:`nature-intro`,"aria-label":A(a)(`天性预览`)},[f(`div`,se,[f(`span`,ce,t(A(a)(`THE WAY SHE GROWS · 天性`)),1),f(`h1`,null,[_(t(A(a)(`她的底色,`)),1),o[38]||=f(`br`,null,null,-1),f(`em`,null,t(A(a)(`慢慢长成她自己。`)),1)]),f(`p`,null,t(A(a)(`一些与生俱来的倾向,会在每一次相遇里长出新的模样。`)),1),f(`span`,le,[o[39]||=f(`i`,null,null,-1),_(` `+t(A(a)(`调节刻度,看看此刻的她`)),1)])]),f(`div`,ue,[D(ne,{class:`preview-orb`,mood:A(re),traits:X.value,size:170,interactive:``},null,8,[`mood`,`traits`])])],8,oe),f(`section`,{class:`lived-persona`,"aria-label":A(a)(`成长中的性格`)},[f(`div`,fe,[f(`span`,pe,t(A(a)(`BECOMING · 正在成为`)),1),f(`h2`,null,t(A(a)(`此刻的她`)),1),f(`p`,null,t(A(a)(`天性是起点。下方是她从真实经历里长出的刻度,下一次对话会使用这些值。`)),1)]),f(`div`,me,[(g(!0),c(r,null,v(A(u),e=>(g(),c(`div`,{key:e.key,class:`lived-trait`},[f(`span`,null,t(e.label),1),f(`strong`,null,t(R.value[e.key]??b.value[e.key]),1),f(`small`,null,t(A(a)(`起点 {v}`,{v:b.value[e.key]})),1),f(`div`,he,[f(`i`,{style:n({width:`${R.value[e.key]??b.value[e.key]}%`})},null,4)])]))),128))]),f(`div`,ge,[f(`span`,_e,t(A(a)(`INNER VOICE · 自己的样子`)),1),f(`p`,null,t(B.value||A(a)(`她还没有为现在的自己留下一段新的描述。底色和已有的自我线索仍会陪着她。`)),1),V.value.length?(g(),c(`details`,ve,[f(`summary`,null,t(A(a)(`看看她怎么走到这里 · {length} 版`,{length:V.value.length})),1),f(`ol`,null,[(g(!0),c(r,null,v(V.value,e=>(g(),c(`li`,{key:e.id},[f(`span`,null,t(e.content),1),f(`time`,null,t(A(F)(e.created)),1)]))),128))])])):p(``,!0)]),z.value.length?(g(),c(`details`,ye,[f(`summary`,null,t(A(a)(`看看她为何改变 · {length} 次`,{length:z.value.length})),1),f(`ol`,null,[(g(!0),c(r,null,v(z.value,e=>(g(),c(`li`,{key:e.id},[f(`b`,null,t(A(u).find(t=>t.key===e.trait)?.label||e.trait)+` `+t(e.delta>0?`+`:``)+t(e.delta),1),f(`span`,null,t(e.reason),1),f(`time`,null,t(A(F)(e.created)),1)]))),128))])])):(g(),c(`p`,be,t(A(a)(`她还没有从经历里改变这些刻度。独处或日记里形成了有来源的新选择后,会留在这里。`)),1))],8,de),f(`div`,xe,[f(`section`,Se,[f(`form`,{id:`natureForm`,onSubmit:d(Mt,[`prevent`]),onInput:o[16]||=e=>Q()},[f(`p`,Ce,t(Y.value.locked?A(a)(`可用更改次数已用完。之后的性格、兴趣和想法,由 TA 自己从经历里生长。`):A(a)(`天性还可以改 {left} 次,包括性格刻度。用完后由她自己生长。`,{left:Y.value.left})),1),f(`header`,we,[f(`span`,Te,t(A(a)(`塑造 TA`)),1),f(`h2`,null,t(A(a)(`TA 生来是什么样的?`)),1),f(`p`,Ee,t(A(a)(`天性是种子:性格、兴趣和底线。TA 的自我、在各群的样子、对每个人的感觉都会从经历里长出来——你能看到、能撤销,但不在这里改写。`)),1)]),f(`fieldset`,{class:`nature-fields`,disabled:Y.value.locked},[f(`div`,Oe,[f(`label`,null,[_(t(A(a)(`名字`)),1),h(f(`input`,{"onUpdate:modelValue":o[0]||=e=>b.value.name=e,name:`name`,required:``,maxlength:`40`},null,512),[[i,b.value.name]])]),f(`label`,null,[_(t(A(a)(`性别`))+` `,1),D(I,{modelValue:b.value.gender,"onUpdate:modelValue":o[1]||=e=>b.value.gender=e,name:`gender`,"aria-label":A(a)(`性别`),options:[{value:`female`,label:A(a)(`女`)},{value:`male`,label:A(a)(`男`)},{value:`unspecified`,label:A(a)(`不指定`)}]},null,8,[`modelValue`,`aria-label`,`options`]),f(`small`,null,t(A(a)(`人称会进入 TA 对自己的理解。女是「她」,男是「他」。`)),1)]),f(`label`,null,[_(t(A(a)(`别人会怎么叫 TA`))+` `,1),h(f(`input`,{"onUpdate:modelValue":o[2]||=e=>C.value=e,name:`aliases`,placeholder:A(a)(`用逗号分隔`)},null,8,ke),[[i,C.value]]),f(`small`,null,t(A(a)(`群友叫 TA 的称呼,保存时一并写进全局设置`)),1)]),f(`label`,Ae,[_(t(A(a)(`天性`))+` `,1),h(f(`textarea`,{"onUpdate:modelValue":o[3]||=e=>b.value.base=e,name:`base`,rows:`6`,placeholder:A(a)(`TA 的背景、性格、兴趣和社交方式…`)},null,8,je),[[i,b.value.base]])])]),f(`fieldset`,Me,[f(`legend`,null,t(A(a)(`性格刻度`)),1),(g(!0),c(r,null,v(A(u),e=>(g(),c(`div`,{key:e.key,class:`trait`},[f(`div`,Ne,[f(`b`,null,t(e.label),1),f(`small`,Pe,t(At(e)),1)]),h(f(`input`,{"onUpdate:modelValue":t=>b.value[e.key]=t,type:`range`,min:`0`,max:`100`,"data-trait":e.key,"aria-label":A(a)(`{label}刻度`,{label:e.label})},null,8,Fe),[[i,b.value[e.key],void 0,{number:!0}]]),h(f(`input`,{"onUpdate:modelValue":t=>b.value[e.key]=t,name:e.key,type:`number`,min:`0`,max:`100`,class:`trait-number`,"aria-label":e.label},null,8,Ie),[[i,b.value[e.key],void 0,{number:!0}]])]))),128)),f(`label`,null,[_(t(A(a)(`说话长度`)),1),h(f(`input`,{"onUpdate:modelValue":o[4]||=e=>b.value.length=e,name:`length`},null,512),[[i,b.value.length]])])]),f(`fieldset`,Le,[f(`legend`,null,t(A(a)(`作息`)),1),f(`label`,Re,[h(f(`input`,{"onUpdate:modelValue":o[5]||=e=>b.value.rhythm.enabled=e,type:`checkbox`,name:`rhythmEnabled`},null,512),[[N,b.value.rhythm.enabled]]),f(`span`,null,t(A(a)(`TA 会睡觉:睡着时不看群,被私聊或 @ 会等醒来再看(危机消息除外)`)),1)]),f(`div`,ze,[D(ie,{sleep:b.value.rhythm.sleep,"onUpdate:sleep":[o[6]||=e=>b.value.rhythm.sleep=e,o[8]||=e=>Q()],wake:b.value.rhythm.wake,"onUpdate:wake":[o[7]||=e=>b.value.rhythm.wake=e,o[9]||=e=>Q()],disabled:!b.value.rhythm.enabled},null,8,[`sleep`,`wake`,`disabled`]),f(`div`,Be,[f(`label`,null,[_(t(A(a)(`几点睡`)),1),h(f(`input`,{"onUpdate:modelValue":o[10]||=e=>b.value.rhythm.sleep=e,type:`time`,name:`sleep`,step:`900`},null,512),[[i,b.value.rhythm.sleep]])]),f(`label`,null,[_(t(A(a)(`几点醒`)),1),h(f(`input`,{"onUpdate:modelValue":o[11]||=e=>b.value.rhythm.wake=e,type:`time`,name:`wake`,step:`900`},null,512),[[i,b.value.rhythm.wake]])]),f(`small`,Ve,t(A(a)(`拖动月亮和太阳,或直接输入时间。`)),1)])])]),f(`fieldset`,null,[f(`legend`,null,t(A(a)(`兴趣、边界与底线`)),1),f(`div`,He,[f(`label`,null,[_(t(A(a)(`兴趣`)),1),h(f(`input`,{"onUpdate:modelValue":o[12]||=e=>b.value.interests=e,name:`interests`,placeholder:A(a)(`用逗号分隔`)},null,8,Ue),[[i,b.value.interests]])]),f(`label`,null,[_(t(A(a)(`社交边界`)),1),h(f(`input`,{"onUpdate:modelValue":o[13]||=e=>b.value.boundaries=e,name:`boundaries`},null,512),[[i,b.value.boundaries]])]),f(`label`,null,[_(t(A(a)(`底线(每行一条)`)),1),h(f(`textarea`,{"onUpdate:modelValue":o[14]||=e=>b.value.bottomLines=e,name:`bottomLines`,rows:`4`},null,512),[[i,b.value.bottomLines]])]),f(`label`,null,[_(t(A(a)(`不想用的说法(每行一个)`)),1),h(f(`textarea`,{"onUpdate:modelValue":o[15]||=e=>b.value.forbidden=e,name:`forbidden`,rows:`3`},null,512),[[i,b.value.forbidden]])]),f(`small`,We,t(A(a)(`凭据(密码、密钥、验证码)永远不会进入 TA 的心智,这一条写死在代码里。`)),1)])])],8,De),f(`details`,Ge,[f(`summary`,null,t(A(a)(`天性的版本 · {length}`,{length:T.value.length})),1),f(`ol`,null,[(g(!0),c(r,null,v(T.value,e=>(g(),c(`li`,{key:e.version},[f(`span`,Ke,t(A(a)(`第 {version} 版`,{version:e.version})),1),f(`span`,null,t(e.note||A(a)(`修改`)),1),f(`time`,qe,t(A(F)(e.created)),1)]))),128))])]),f(`div`,Je,[f(`button`,{class:`primary`,disabled:G.value||Y.value.locked},t(Y.value.locked?A(a)(`已交给 TA`):G.value?A(a)(`保存中…`):A(a)(`保存天性`)),9,Ye),f(`span`,Xe,t(Y.value.locked?A(a)(`更改次数已用完`):K.nature?A(a)(`天性有未保存的修改`):A(a)(`还可以改 {left} 次`,{left:Y.value.left})),1)])],32)]),f(`aside`,Ze,[f(`div`,Qe,[f(`span`,$e,t(A(a)(`调色盘 · 即时反馈`)),1),f(`h3`,null,t(A(a)(`微小的倾向,也会改变表达`)),1),f(`ul`,et,[(g(!0),c(r,null,v(A(u),e=>(g(),c(`li`,{key:e.key},[f(`b`,null,t(e.label)+` `+t(b.value[e.key]),1),f(`span`,null,t(At(e)),1)]))),128))])]),D(ee,{class:`chat-card`,title:A(a)(`用草稿天性试聊`),eyebrow:`TALK TO TA`},{default:M(()=>[D(te,{anchored:``,sessions:A(E).core.sessions,nature:kt.value,starter:A(a)(`今天真的好累啊`)},{options:M(()=>[f(`label`,tt,[h(f(`input`,{"onUpdate:modelValue":o[17]||=e=>J.value=e,type:`checkbox`},null,512),[[N,J.value]]),_(t(A(a)(`用左边还没保存的天性`)),1)])]),_:1},8,[`sessions`,`nature`,`starter`])]),_:1},8,[`title`])])]),H.life?(g(),c(`form`,{key:0,class:`days`,onSubmit:d(Nt,[`prevent`]),onInput:o[33]||=e=>Q(`days`),onChange:o[34]||=e=>Q(`days`)},[f(`section`,nt,[f(`div`,rt,[f(`div`,null,[f(`span`,it,t(A(a)(`TA 的日子`)),1),f(`h2`,null,t(A(a)(`TA 怎样度过没人说话的时间`)),1)])]),f(`div`,at,[f(`label`,ot,[h(f(`input`,{"onUpdate:modelValue":o[18]||=e=>H.life.solitude=e,type:`checkbox`},null,512),[[N,H.life.solitude]]),f(`span`,null,[f(`b`,null,t(A(a)(`独处`)),1),f(`small`,null,t(A(a)(`聊天安静下来后,TA 会重新看看最近的事,改变对自己、对人的理解。`)),1)])]),f(`label`,st,[h(f(`input`,{"onUpdate:modelValue":o[19]||=e=>H.life.reading=e,type:`checkbox`},null,512),[[N,H.life.reading]]),f(`span`,null,[f(`b`,null,t(A(a)(`独处时读资料`)),1),f(`small`,null,t(A(a)(`从共享资料里按自己的兴趣挑着读,一段一段读下去;读过的内容聊天时可以自然提起。`)),1)])]),f(`label`,ct,[h(f(`input`,{"onUpdate:modelValue":o[20]||=e=>H.life.diary=e,type:`checkbox`},null,512),[[N,H.life.diary]]),f(`span`,null,[f(`b`,null,t(A(a)(`睡前写日记`)),1),f(`small`,null,t(A(a)(`一天结束时写下这一天,和昨天的自己对照;隔一段时间在夜里回顾,改写自传、翻开新的一章。`)),1)])]),f(`label`,lt,[h(f(`input`,{"onUpdate:modelValue":o[21]||=e=>H.life.night=e,type:`checkbox`},null,512),[[N,H.life.night]]),f(`span`,null,[f(`b`,null,t(A(a)(`夜里整理`)),1),f(`small`,null,t(A(a)(`睡着以后,把白天没整理的聊天记进记忆和约定里,再按回顾间隔回顾这段日子。`)),1)])]),f(`label`,ut,[h(f(`input`,{"onUpdate:modelValue":o[22]||=e=>H.life.proactive=e,type:`checkbox`},null,512),[[N,H.life.proactive]]),f(`span`,null,[f(`b`,null,t(A(a)(`允许 TA 主动说话`)),1),f(`small`,null,t(A(a)(`安静的时候,也能从自己的兴趣、念头和对人的感觉决定要不要先开口。不必等人提问,不催同一句话;对方没回应,也不等于以后不能分享新的事。关掉后停止主动联系。`)),1),o[40]||=_(` >`,-1)])])]),f(`div`,dt,[f(`label`,null,[_(t(A(a)(`安静多久才独处(分钟)`)),1),h(f(`input`,{"onUpdate:modelValue":o[23]||=e=>H.life.idleMinutes=e,type:`number`,min:`0`},null,512),[[i,H.life.idleMinutes,void 0,{number:!0}]])]),f(`label`,null,[_(t(A(a)(`两次独处至少间隔(分钟)`)),1),h(f(`input`,{"onUpdate:modelValue":o[24]||=e=>H.life.intervalMinutes=e,type:`number`,min:`10`},null,512),[[i,H.life.intervalMinutes,void 0,{number:!0}]])]),f(`label`,null,[_(t(A(a)(`攒够多少条新消息(条)`)),1),h(f(`input`,{"onUpdate:modelValue":o[25]||=e=>H.life.minMessages=e,type:`number`,min:`0`},null,512),[[i,H.life.minMessages,void 0,{number:!0}]])]),f(`label`,null,[_(t(A(a)(`回顾间隔(天)`)),1),h(f(`input`,{"onUpdate:modelValue":o[26]||=e=>H.life.chapterDays=e,type:`number`,min:`1`},null,512),[[i,H.life.chapterDays,void 0,{number:!0}]])]),f(`label`,null,[_(t(A(a)(`安静时多久看看想不想聊(分钟)`)),1),h(f(`input`,{"onUpdate:modelValue":o[27]||=e=>H.life.initiativeIntervalMinutes=e,type:`number`,min:`1`},null,512),[[i,H.life.initiativeIntervalMinutes,void 0,{number:!0}]])]),f(`label`,null,[_(t(A(a)(`两次主动联系至少间隔(小时)`)),1),h(f(`input`,{"onUpdate:modelValue":o[28]||=e=>H.life.proactiveIntervalHours=e,type:`number`,min:`0`,step:`0.1`},null,512),[[i,H.life.proactiveIntervalHours,void 0,{number:!0}]])]),f(`p`,ft,t(A(a)(`主动联系间隔只在实际发出后计算,可设为 0;沉默不会占用发送间隔。想说的话会保留,临时忙碌后重新决定。没有新消息时也可独处,不需要攒够消息才能产生念头。`)),1),f(`p`,pt,t(A(a)(`独处、日记和夜里整理也使用模型库里的默认模型,不再单独指定。`)),1),f(`label`,null,[_(t(A(a)(`时区`)),1),h(f(`input`,{"onUpdate:modelValue":o[29]||=e=>H.life.timeZone=e,placeholder:`Asia/Shanghai`},null,512),[[i,H.life.timeZone]])])])]),f(`section`,mt,[f(`div`,ht,[f(`div`,null,[f(`span`,gt,t(A(a)(`每日注意力`)),1),f(`h2`,null,t(A(a)(`TA 一天能花多少 Token`)),1)])]),f(`div`,_t,[f(`label`,vt,[_(t(A(a)(`每日 Token 上限(0 = 不限)`))+` `,1),h(f(`input`,{"onUpdate:modelValue":o[30]||=e=>H.budget.dailyTokens=e,type:`number`,min:`0`},null,512),[[i,H.budget.dailyTokens,void 0,{number:!0}]]),f(`small`,null,t(A(a)(`滚动 24 小时计算。快用完时,TA 在群里只在被叫到时细看;用完后后台独处和整理暂停。`)),1)]),f(`label`,null,[_(t(A(a)(`独处与日记最多占`)),1),h(f(`input`,{"onUpdate:modelValue":o[31]||=e=>H.budget.innerShare=e,type:`number`,min:`0`,max:`0.9`,step:`0.05`},null,512),[[i,H.budget.innerShare,void 0,{number:!0}]])]),f(`label`,null,[_(t(A(a)(`记忆整理与压缩最多占`)),1),h(f(`input`,{"onUpdate:modelValue":o[32]||=e=>H.budget.upkeepShare=e,type:`number`,min:`0`,max:`0.9`,step:`0.05`},null,512),[[i,H.budget.upkeepShare,void 0,{number:!0}]])])]),f(`p`,yt,t(A(a)(`扫一眼群聊不花 Token;TA 细看时一次调用同时完成理解、心情和回复。私聊和 @ 永远优先。`)),1),f(`div`,bt,[f(`button`,xt,t(A(a)(`保存 TA 的日子`)),1),f(`span`,St,t(K.days?A(a)(`日常安排有未保存的修改`):A(a)(`日常安排已保存`)),1)])])],32)):p(``,!0),f(`details`,Ct,[f(`summary`,null,[f(`span`,wt,t(A(a)(`高级`)),1),f(`b`,null,t(A(a)(`指令(Prompt)`)),1)]),f(`form`,{id:`promptsForm`,class:`stack tight`,onSubmit:d(Pt,[`prevent`]),onInput:o[37]||=e=>Q(`prompts`)},[f(`label`,null,[_(t(A(a)(`要编辑的指令`))+` `,1),D(I,{modelValue:W.value,"onUpdate:modelValue":o[35]||=e=>W.value=e,"aria-label":A(a)(`要编辑的指令`),options:Object.keys(U).map(e=>({value:e,label:A(y)[e]||e}))},null,8,[`modelValue`,`aria-label`,`options`])]),f(`label`,null,[_(t(A(a)(`指令正文`)),1),h(f(`textarea`,{"onUpdate:modelValue":o[36]||=e=>U[W.value]=e,rows:`14`,class:`mono`},null,512),[[i,U[W.value]]])]),f(`div`,Tt,[f(`button`,Et,t(A(a)(`保存指令`)),1),f(`span`,Dt,t(K.prompts?A(a)(`指令有未保存的修改`):A(a)(`指令已保存`)),1)])],32)])])):p(``,!0)}}),[[`__scopeId`,`data-v-8b63c7ac`]]);export{Z as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{$ as e,Ct as t,D as n,Dt as r,E as i,Et as a,G as o,H as s,I as c,J as l,P as u,Q as d,St as f,Tt as p,W as m,X as h,Y as g,Z as _,_ as v,_t as y,bt as b,dt as x,et as S,ft as C,j as w,lt as T,n as E,o as D,rt as O,s as k,t as A,tt as j,v as M,wt as N,yt as P}from"./Empty-DjvoHpAi.js";import{a as F,f as I,g as L,l as R,n as ee,o as z,r as B,s as V,t as te,u as H,v as U}from"./mind-BY8WSI7v.js";import{a as W,b as G,c as K,f as q,h as J,l as Y,n as X,o as Z,p as Q,r as ne,v as re,x as ie}from"./index-CqRx6L9a.js";import{l as ae}from"./knowledge-Dj6hHClj.js";var oe=[`aria-label`],se={class:`encounter-hero`},ce={class:`encounter-copy`},le={class:`eyebrow`},ue={class:`encounter-count`},de={class:`encounter-lens`,"aria-hidden":`true`},fe={class:`orb`},pe={class:`people-heading`},me={class:`encounter-grid`},he=[`data-person`,`aria-label`,`onClick`],ge={class:`avatar-wrap`},_e={class:`avatar`},ve={class:`person-copy`},ye=E(O({__name:`Galaxy`,props:{people:{},activity:{}},emits:[`open`,`list`],setup(t,{emit:n}){let i=t,s=n,u=l(()=>[...i.people].sort((e,t)=>(t.familiarity??0)-(e.familiarity??0))),f=l(()=>u.value.slice(0,12)),m=l(()=>Math.max(0,u.value.length-f.value.length));return(n,i)=>(x(),d(`section`,{class:`galaxy`,"aria-label":N(c)(`相遇之间:TA 认识的人`)},[g(`div`,se,[g(`div`,ce,[g(`span`,le,r(N(c)(`PEOPLE / 相遇之间`)),1),g(`h2`,null,[S(r(N(c)(`每一次相遇,`)),1),i[1]||=g(`br`,null,null,-1),g(`em`,null,r(N(c)(`都留下一点温度。`)),1)]),g(`p`,null,r(N(c)(`越熟悉离 TA 越近。这里先放着最近亲近的 {length} 个人,其他人也仍然在名单里。`,{length:f.value.length})),1),g(`div`,ue,[g(`b`,null,r(t.people.length),1),g(`span`,null,r(N(c)(`个相遇过的人`)),1)])]),g(`div`,de,[i[2]||=e(`<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),g(`div`,fe,[j(re,{mood:N(ie),activity:t.activity||`idle`,size:100},null,8,[`mood`,`activity`])])])]),g(`div`,pe,[g(`div`,null,[i[3]||=g(`span`,{class:`eyebrow`},`CLOSER TO HER`,-1),g(`h3`,null,r(N(c)(`最近靠近的人`)),1)]),g(`span`,null,r(N(c)(`点开一张光片,看看她记得什么`)),1)]),g(`div`,me,[(x(!0),d(o,null,C(f.value,(e,t)=>(x(),d(`button`,{key:e.userId,type:`button`,class:p([`person-node`,{away:(e.awayDays??0)>=14,tense:e.tension>=.3}]),"data-person":e.userId,style:a({"--hue":N(q)(e.name||e.userId),"--order":t}),"aria-label":`${e.name}:${e.feel||N(c)(`还在慢慢认识`)}`,onClick:t=>s(`open`,e.userId)},[g(`span`,ge,[g(`span`,_e,r(N(Q)(e.name)),1)]),g(`span`,ve,[g(`b`,null,r(e.name),1),g(`small`,null,`QQ `+r(e.userId),1),g(`small`,null,r(e.feel||N(c)(`还在慢慢认识`)),1)]),i[5]||=g(`span`,{class:`person-arrow`,"aria-hidden":`true`},`↗`,-1),g(`span`,{class:`familiarity`,style:a({"--amount":Math.round(Math.max(0,Math.min(1,e.familiarity??0))*100)+`%`}),"aria-hidden":`true`},[...i[4]||=[g(`i`,null,null,-1)]],4)],14,he))),128))]),m.value?(x(),d(`button`,{key:0,type:`button`,class:`more-people`,onClick:i[0]||=e=>s(`list`)},[S(r(N(c)(`在名单里看看另外 {hidden} 个人`,{hidden:m.value}))+` `,1),i[6]||=g(`span`,{"aria-hidden":`true`},`↗`,-1)])):_(``,!0)],8,oe))}}),[[`__scopeId`,`data-v-c60042d4`]]),be=[`width`,`height`],xe=[`stroke-dasharray`,`transform`],Se={x:`22`,y:`25.5`,"text-anchor":`middle`},Ce={key:0},we=E(O({__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,i=l(()=>{let e=Number(t.value)||0;return t.signed?Math.max(-1,Math.min(1,e)):Math.max(0,Math.min(1,e))}),o=l(()=>Math.abs(i.value)*n),s=l(()=>i.value<0);return(t,c)=>(x(),d(`figure`,{class:`ring`,style:a({width:e.size+`px`})},[(x(),d(`svg`,{width:e.size,height:e.size,viewBox:`0 0 44 44`,"aria-hidden":`true`},[c[0]||=g(`circle`,{class:`track`,cx:`22`,cy:`22`,r:`18`},null,-1),g(`circle`,{class:p([`arc`,{negative:s.value}]),cx:`22`,cy:`22`,r:`18`,"stroke-dasharray":`${o.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,xe),g(`text`,Se,r(Math.round(i.value*100)),1)],8,be)),g(`figcaption`,null,[g(`b`,null,r(e.label),1),e.caption?(x(),d(`small`,Ce,r(e.caption),1)):_(``,!0)])],4))}}),[[`__scopeId`,`data-v-bbca6071`]]),Te={key:0,class:`error-text`},Ee={key:1,class:`person-sheet stack`},De={class:`who`},Oe={class:`feel`},ke={class:`qq`},Ae={class:`muted`},je={class:`rings`},Me={class:`stack tight`},Ne={class:`row`},Pe={class:`sheet-title`},Fe={key:0},Ie={key:1},Le={class:`list`},Re={class:`faint`},ze={key:0,class:`impression`},Be={key:1,class:`row`},Ve={class:`faint`},He={class:`sheet-title`},Ue={key:0,class:`list`},We=[`data-tone`],Ge={class:`grow`},Ke={class:`faint`},qe={key:0,class:`chip`,"data-tone":`quiet`},Je=[`onClick`],Ye={key:1,class:`muted`},Xe={key:2},Ze={class:`sheet-title`},Qe={class:`list`},$e=[`data-tone`],et={class:`grow`},tt={key:0,class:`faint`},nt={class:`faint`},rt=[`onClick`],it={class:`sheet-title`},at={key:0,class:`list`},ot={class:`faint`},st={key:0,class:`instant`},ct={class:`faint`},lt=[`onClick`],ut=[`onClick`],dt={key:1,class:`muted`},ft={class:`sheet-title`},pt={key:0,class:`list`},mt=[`data-tone`],ht={class:`grow`},gt={class:`faint`},_t=[`onClick`],vt={key:1,class:`muted`},yt=E(O({__name:`PersonSheet`,props:{id:{},now:{}},emits:[`close`,`changed`,`relationship`],setup(e,{emit:t}){let s=e,u=t,m=f(null),b=f(``),S=l(()=>m.value?.person),w=l(()=>{let e=S.value?.firstMetAt;return e?c(`认识 {v} 天`,{v:Math.max(1,Math.round(((s.now||Date.now())-e)/864e5))}):``});async function T(){if(!s.id)return;let e=s.id;m.value?.person?.userId!==e&&(m.value=v(`/mind/people/`+encodeURIComponent(e))||null),b.value=``;try{let t=await L.person(e);s.id===e&&(m.value=t)}catch(t){if(s.id!==e)return;m.value=null,b.value=t.message}}async function E(e){if(await i(c(`撤销这次「{v}」?TA 对这个人的感觉会重新计算。`,{v:B[e.change]||e.change}),{title:c(`撤销一次关系变化`),confirmText:c(`撤销`),danger:!0}))try{await L.revoke(`bond`,e.id),M(c(`已撤销`)),await T(),u(`changed`)}catch(e){M(e.message,!0)}}async function D(e){let t=await n(c(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:c(`撤销这条记忆`),confirmText:c(`撤销`),danger:!0,placeholder:c(`原因`)});if(t!==null)try{await L.revoke(`memory`,e.id,t),M(c(`已撤销`)),await T()}catch(e){M(e.message,!0)}}async function O(e,t){try{await ae(e.id,t),await T()}catch(e){M(e.message,!0)}}async function k(e){if(await i(c(`撤销这次相遇留下的意思?「{meant}」之后不会再回到 TA 心里,也不会再被当成变化的来源。`,{meant:e.meant}),{title:c(`撤销这次相遇`),confirmText:c(`撤销`),danger:!0}))try{await L.revoke(`meeting`,e.id),M(c(`已撤销`)),await T(),u(`changed`)}catch(e){M(e.message,!0)}}async function A(e){let t=await n(c(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:c(`撤销这个约定`),confirmText:c(`撤销`),danger:!0,placeholder:c(`原因`)});if(t!==null)try{await L.revoke(`anticipation`,e.id,t),M(c(`已撤销`)),await T()}catch(e){M(e.message,!0)}}return y(()=>s.id,e=>{m.value=null,e&&T()},{immediate:!0}),(t,n)=>(x(),h(Z,{open:!!e.id,title:S.value?.name||N(c)(`正在想起…`),eyebrow:N(c)(`TA 认识的人`),width:`560px`,onClose:n[1]||=e=>u(`close`)},{default:P(()=>[b.value?(x(),d(`p`,Te,r(b.value),1)):S.value?(x(),d(`div`,Ee,[g(`header`,De,[g(`span`,{class:`avatar`,style:a({"--hue":N(q)(S.value.name||S.value.userId)})},r(N(Q)(S.value.name)),5),g(`div`,null,[g(`p`,Oe,r(S.value.feel),1),g(`small`,ke,`QQ `+r(S.value.userId),1),g(`small`,Ae,r([w.value,S.value.lastTalkedAt?N(c)(`上次说上话 {v}`,{v:N(Y)(S.value.lastTalkedAt,e.now)}):N(c)(`还没说上过话`),S.value.seenAt?N(c)(`上次见到 {v}`,{v:N(Y)(S.value.seenAt,e.now)}):``].filter(Boolean).join(` · `)),1)])]),g(`div`,je,[(x(!0),d(o,null,C(N(z),([e,t])=>(x(),h(we,{key:e,value:S.value[e],label:t},null,8,[`value`,`label`]))),128))]),g(`section`,Me,[g(`div`,Ne,[g(`h3`,Pe,r(N(c)(`彼此的关系`)),1),g(`button`,{class:`small`,onClick:n[0]||=e=>u(`relationship`,S.value.relationship,S.value.userId)},r(S.value.relationship?N(c)(`修改关系`):N(c)(`绑定关系`)),1)]),S.value.relationship?(x(),d(`p`,Fe,r(N(c)(`对方是我的 {peer},我是对方的 {self}`,{peer:N(I)[S.value.relationship.peerRole]||S.value.relationship.peerRole,self:N(I)[S.value.relationship.selfRole]||S.value.relationship.selfRole})),1)):_(``,!0),m.value.relationshipHistory?.length?(x(),d(`details`,Ie,[g(`summary`,null,r(N(c)(`关系变化记录`)),1),g(`ul`,Le,[(x(!0),d(o,null,C(m.value.relationshipHistory,e=>(x(),d(`li`,{key:e.id},[g(`small`,Re,r(N(U)(e.created))+` · `+r(e.status===`active`?N(c)(`设置关系`):N(c)(`解除关系`)),1),g(`p`,null,r(e.peer_role)+` · `+r(e.note),1)]))),128))])])):_(``,!0)]),S.value.impression?(x(),d(`p`,ze,r(N(c)(`印象:{impression}`,{impression:S.value.impression})),1)):_(``,!0),S.value.places?.length?(x(),d(`div`,Be,[g(`span`,Ve,r(N(c)(`在这些地方见过:`)),1),(x(!0),d(o,null,C(S.value.places,e=>(x(),d(`span`,{key:e.id,class:`chip`,"data-tone":`quiet`},r(e.name),1))),128))])):_(``,!0),g(`section`,null,[g(`h3`,He,r(N(c)(`这份感觉是怎么来的`)),1),m.value.changes.length?(x(),d(`ul`,Ue,[(x(!0),d(o,null,C(m.value.changes,e=>(x(),d(`li`,{key:e.id,class:p([`change`,{done:e.revoked}])},[g(`span`,{class:`chip`,"data-tone":e.revoked?`quiet`:N(F).has(e.change)?`danger`:void 0},r(N(B)[e.change]||e.change),9,We),g(`div`,Ge,[g(`p`,null,r(e.note||N(c)(`没有写原因`)),1),g(`small`,Ke,r(N(c)(`{v} · {v2} · {length} 处来源`,{v:N(U)(e.created),v2:N(H)[e.origin]||N(c)(`写日记时`),length:e.sources.length})),1)]),e.revoked?(x(),d(`span`,qe,r(N(c)(`已撤销`)),1)):(x(),d(`button`,{key:1,class:`text-button`,"data-revoke-change":``,onClick:t=>E(e)},r(N(c)(`撤销`)),9,Je))],2))),128))])):(x(),d(`p`,Ye,r(N(c)(`只是一起聊过天,还没有特别的变化。`)),1))]),m.value.meetings?.length?(x(),d(`section`,Xe,[g(`h3`,Ze,r(N(c)(`和{name}的相遇留下了什么`,{name:S.value.name})),1),g(`ul`,Qe,[(x(!0),d(o,null,C(m.value.meetings,e=>(x(),d(`li`,{key:e.id,class:`change`},[g(`span`,{class:`chip`,"data-tone":e.private?`quiet`:void 0},r(e.private?N(c)(`私下`):e.choice===`silent`?N(c)(`没出声`):N(c)(`出了声`)),9,$e),g(`div`,et,[g(`p`,null,r(e.meant),1),e.why?(x(),d(`small`,tt,r(N(c)(`当时:{why}`,{why:e.why})),1)):_(``,!0),g(`small`,nt,r(e.when)+` · `+r(e.sessionName),1)]),g(`button`,{class:`text-button`,"data-revoke-meeting":``,onClick:t=>k(e)},r(N(c)(`撤销`)),9,rt)]))),128))])])):_(``,!0),g(`section`,null,[g(`h3`,it,r(N(c)(`TA 记得关于{name}的事`,{name:S.value.name})),1),m.value.memories.length?(x(),d(`ul`,at,[(x(!0),d(o,null,C(m.value.memories,e=>(x(),d(`li`,{key:e.id,class:p([`memory-item`,{superseded:e.status===`superseded`}])},[g(`p`,null,r(e.content),1),g(`small`,ot,r(N(c)(`{v} · 在「{v2}」知道的 · {when}`,{v:N(R)[e.status]||e.status,v2:N(J)({name:e.sessionName,id:e.session_id||e.sessionId}),when:e.when})),1),e.status===`confirmed`?(x(),d(`div`,st,[g(`span`,ct,r(N(c)(`改完即生效`)),1),j(K,{"aria-label":N(c)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(N(V)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>O(e,{discretion:t})},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),g(`button`,{class:`small`,onClick:t=>O(e,{locked:!e.locked})},r(e.locked?N(c)(`解锁`):N(c)(`锁定`)),9,lt),g(`button`,{class:`small danger`,onClick:t=>D(e)},r(N(c)(`撤销`)),9,ut)])):_(``,!0)],2))),128))])):(x(),d(`p`,dt,r(N(c)(`还没有记住关于这个人的事。`)),1))]),g(`section`,null,[g(`h3`,ft,r(N(c)(`和{name}有关的约定`,{name:S.value.name})),1),m.value.anticipations.length?(x(),d(`ul`,pt,[(x(!0),d(o,null,C(m.value.anticipations,e=>(x(),d(`li`,{key:e.id,class:p([`change`,{done:e.state!==`pending`}])},[g(`span`,{class:`chip`,"data-tone":e.state===`pending`?void 0:`quiet`},r(N(ee)[e.state]||e.state),9,mt),g(`div`,ht,[g(`p`,null,r(e.content),1),g(`small`,gt,r(N(te)[e.kind]||e.kind)+` · `+r(e.when),1)]),e.status===`revoked`?_(``,!0):(x(),d(`button`,{key:0,class:`text-button`,onClick:t=>A(e)},r(N(c)(`撤销`)),9,_t))],2))),128))])):(x(),d(`p`,vt,r(N(c)(`没有和这个人有关的约定。`)),1))])])):_(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`]))}}),[[`__scopeId`,`data-v-9ffb5e88`]]),bt={class:`faces`},xt={class:`faces-head`},St={class:`eyebrow`},Ct={class:`muted`},wt={class:`face-grid`},Tt={class:`badge`},Et={key:0,class:`qq`},Dt={class:`muted`},Ot={key:0,class:`place-notes compact`},kt={class:`face-excerpt`},At={key:1,class:`muted small-text`},jt=[`onClick`],Mt={key:0,class:`stack`},Nt={key:0,class:`place-notes`},Pt={key:0,class:`muted small-text`},Ft={class:`faint`},It={key:1,class:`muted`},Lt={key:2,class:`versions`},Rt={key:0},zt={key:1},Bt={key:0,class:`change-why`},Vt={key:4,class:`legacy-face`},Ht={class:`face-full`},Ut=[`onClick`],Wt={key:0,class:`muted`},Gt=E(O({__name:`GroupFaces`,props:{groups:{}},emits:[`changed`],setup(e,{emit:t}){let n=e,s=t,l=f(null),m=f({}),h=u({impression:w(`印象`),wish:w(`想做的事`),preference:w(`偏好`),question:w(`还在想的问题`),boundary:w(`相处的分寸`)}),v=u({add:w(`新增`),revise:w(`修改`),remove:w(`放下`)});y(()=>n.groups,e=>{l.value&&=e.find(e=>e.session===l.value.session)||null});async function b(e){if(!(m.value[e]&&m.value[e]?.[0]?.id===n.groups.find(t=>t.session===e)?.face?.id))try{m.value={...m.value,[e]:await L.faces(e)}}catch(e){M(e.message,!0)}}async function T(e,t){if(await i(c(`撤销这次想法更新?会恢复上一次保留的想法。`),{title:c(`撤销想法更新`),confirmText:c(`撤销`),danger:!0}))try{await L.revoke(`face`,t),m.value={...m.value,[e]:await L.faces(e)},M(c(`已撤销`)),s(`changed`)}catch(e){M(e.message,!0)}}return(t,n)=>(x(),d(`section`,bt,[g(`div`,xt,[g(`span`,St,r(N(c)(`在这里的想法`)),1),g(`h2`,null,r(N(c)(`同一个她,在不同的地方留下自己的想法。`)),1),g(`p`,Ct,r(N(c)(`她根据相处留下印象、愿望或疑问,选择什么时候新增、修改或放下。每次更新保留理由和来源。`)),1)]),g(`div`,wt,[(x(!0),d(o,null,C(e.groups,e=>(x(),d(`article`,{key:e.session,class:`card face-card`,style:a({"--hue":N(q)(e.session)})},[g(`header`,null,[g(`span`,Tt,r(e.kind===`private`?N(c)(`私`):N(c)(`群`)),1),g(`div`,null,[g(`h3`,null,r(N(J)({id:e.session,name:e.name,kind:e.kind})),1),e.kind===`private`?(x(),d(`small`,Et,`QQ `+r(String(e.session||``).split(`:`).pop()),1)):_(``,!0),g(`small`,Dt,r(e.kind===`private`?N(c)(`私聊`):N(c)(`群聊`))+r(e.bond?` · ${e.bond.feel}`:``),1)])]),e.face?.notes?.length?(x(),d(`ul`,Ot,[(x(!0),d(o,null,C(e.face.notes.slice(0,3),e=>(x(),d(`li`,{key:e.id},[g(`small`,null,r(N(h)[e.kind]||N(c)(`想法`)),1),g(`p`,kt,r(e.content),1)]))),128))])):(x(),d(`p`,At,r(N(c)(`还没有特别想留在这里的想法,之后由她自己选择。`)),1)),g(`button`,{class:`text-button`,onClick:t=>{l.value=e,b(e.session)}},r(N(c)(`查看想法与变化 ↗`)),9,jt)],4))),128))]),j(Z,{open:!!l.value,title:l.value?.name||N(c)(`在这里的想法`),eyebrow:N(c)(`PLACE NOTES / 在这里的想法`),width:`680px`,onClose:n[0]||=e=>l.value=null},{default:P(()=>[l.value?(x(),d(`div`,Mt,[l.value.face?.notes?.length?(x(),d(`ul`,Nt,[(x(!0),d(o,null,C(l.value.face.notes,e=>(x(),d(`li`,{key:e.id,class:`face-full`},[g(`small`,null,r(N(h)[e.kind]||N(c)(`想法`)),1),g(`p`,null,r(e.content),1),e.why?(x(),d(`p`,Pt,r(e.why),1)):_(``,!0),g(`small`,Ft,r(N(c)(`{n} 处来源`,{n:e.sources?.length||0})),1)]))),128))])):(x(),d(`p`,It,r(N(c)(`还没有特别想留在这里的想法,之后由她自己选择。`)),1)),g(`h3`,null,r(N(c)(`变化历史`)),1),m.value[l.value.session]?(x(),d(`ol`,Lt,[(x(!0),d(o,null,C(m.value[l.value.session],e=>(x(),d(`li`,{key:e.id,class:p({revoked:e.revoked})},[g(`time`,null,r(N(U)(e.created)),1),g(`span`,null,[e.revoked?(x(),d(`b`,Rt,r(N(c)(`已撤销 ·`)),1)):e.origin===`migration`?(x(),d(`b`,zt,r(N(c)(`旧版 ·`)),1)):_(``,!0),e.changes?.length?(x(!0),d(o,{key:2},C(e.changes,(e,t)=>(x(),d(`p`,{key:t},[g(`b`,null,r(N(v)[e.action])+` · `,1),S(r(e.content)+` `,1),e.why?(x(),d(`small`,Bt,r(e.why),1)):_(``,!0)]))),128)):e.notes?.length?(x(),d(o,{key:3},[S(r(e.notes.map(e=>e.content).join(`;`)),1)],64)):(x(),d(`details`,Vt,[g(`summary`,null,r(N(c)(`旧人格记录,仅保留历史`)),1),g(`p`,Ht,r(e.content||[e.role,e.tone,e.aspiration].filter(Boolean).join(`;`)),1)]))]),e.revoked?_(``,!0):(x(),d(`button`,{key:0,class:`text-button`,onClick:t=>T(l.value.session,e.id)},r(N(c)(`撤销`)),9,Ut))],2))),128)),m.value[l.value.session].length?_(``,!0):(x(),d(`li`,Wt,r(N(c)(`没有记录。`)),1))])):_(``,!0)])):_(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-a6532d0c`]]),Kt={class:`card relationships`},qt={class:`row`},Jt={class:`grow`},Yt={class:`muted`},Xt={key:0,class:`relationship-list`},Zt={class:`grow`},Qt=[`onClick`],$t={class:`chip`},en={class:`muted`},tn={key:0},nn={class:`faint`},rn={class:`row`},an=[`onClick`],on=[`onClick`],sn={key:1,class:`faint`},cn={class:`fields`},$=[`readonly`,`placeholder`],ln=[`placeholder`],un=[`placeholder`],dn={key:0},fn={key:1},pn=[`readonly`],mn=[`placeholder`],hn={class:`faint`},gn=[`disabled`],_n=E(O({__name:`RelationshipsPanel`,emits:[`changed`,`open`],setup(e,{expose:t,emit:n}){let a=n,l=f([]),p=f(!1),h=f(!1),v=f({}),y=u({妹妹:w(`妹妹`),姐姐:w(`姐姐`),弟弟:w(`弟弟`),哥哥:w(`哥哥`),朋友:w(`朋友`),伙伴:w(`伙伴`),custom:w(`其他关系`)}),E=f(`妹妹`);async function D(){l.value=(await L.relationships()).items}T(()=>D().catch(e=>M(e.message,!0)));function O(e,t=``){v.value=e?{...e,expectedId:e.id}:{subjectId:t,channel:`onebot`,accountId:`_`,kind:`human`,name:``,peerRole:`妹妹`,selfRole:``,note:``,discretion:`open`,expectedId:null},E.value=Object.hasOwn(y,v.value.peerRole)?v.value.peerRole:`custom`,p.value=!0}t({edit:O});async function k(){if(!h.value){h.value=!0;try{await L.saveRelationship({...v.value,peerRole:E.value===`custom`?v.value.peerRole:E.value}),p.value=!1,await D(),a(`changed`),M(c(`关系已保存`))}catch(e){M(e.message,!0)}finally{h.value=!1}}}async function A(e){if(await i(c(`解除这份关系?相处留下的记忆和感受仍会保留。`),{title:c(`解除关系`),confirmText:c(`解除`),danger:!0}))try{await L.endRelationship(e.subjectId,{channel:e.channel,accountId:e.accountId,expectedId:e.id}),await D(),a(`changed`)}catch(e){M(e.message,!0)}}return(e,t)=>(x(),d(o,null,[g(`section`,Kt,[g(`header`,qt,[g(`div`,Jt,[t[12]||=g(`span`,{class:`eyebrow`},`RELATIONSHIPS`,-1),g(`h2`,null,r(N(c)(`彼此的关系`)),1)]),g(`button`,{onClick:t[0]||=e=>O()},r(N(c)(`绑定关系`)),1)]),g(`p`,Yt,r(N(c)(`按账号认出人或另一位机器人;关系融入关心、打算与交流,感情仍随着相处生长。`)),1),l.value.length?(x(),d(`div`,Xt,[(x(!0),d(o,null,C(l.value,e=>(x(),d(`article`,{key:e.id,class:`relation`},[g(`div`,Zt,[g(`button`,{class:`text-button`,onClick:t=>a(`open`,e.subjectId)},r(e.name||e.subjectId),9,Qt),g(`span`,$t,r(N(y)[e.peerRole]||e.peerRole),1),g(`small`,en,r(e.kind===`bot`?N(c)(`另一位机器人`):N(c)(`人`))+` · `+r(e.subjectId),1),e.note?(x(),d(`p`,tn,r(e.note),1)):_(``,!0),g(`small`,nn,r(N(U)(e.created))+` · `+r(N(V)[e.discretion]),1)]),g(`div`,rn,[g(`button`,{class:`small`,onClick:t=>O(e)},r(N(c)(`修改`)),9,an),g(`button`,{class:`text-button`,onClick:t=>A(e)},r(N(c)(`解除`)),9,on)])]))),128))])):(x(),d(`p`,sn,r(N(c)(`还没有绑定关系,可以从一个准确的账号开始。`)),1))]),j(Z,{open:p.value,title:N(c)(`绑定关系`),eyebrow:N(c)(`彼此的关系`),width:`560px`,onClose:t[11]||=e=>p.value=!1},{default:P(()=>[g(`form`,{class:`stack`,onSubmit:m(k,[`prevent`])},[g(`div`,cn,[g(`label`,null,[S(r(N(c)(`平台`)),1),j(K,{modelValue:v.value.channel,"onUpdate:modelValue":t[1]||=e=>v.value.channel=e,disabled:!!v.value.id,options:[{value:`onebot`,label:`QQ / OneBot`},{value:`qqbot`,label:N(c)(`QQ 官方机器人`)}]},null,8,[`modelValue`,`disabled`,`options`])]),g(`label`,null,[S(r(N(c)(`对方账号`)),1),b(g(`input`,{"onUpdate:modelValue":t[2]||=e=>v.value.subjectId=e,required:``,readonly:!!v.value.id,maxlength:`128`,placeholder:N(c)(`QQ 号或平台用户 ID`)},null,8,$),[[s,v.value.subjectId]])]),g(`label`,null,[S(r(N(c)(`对象类型`)),1),j(K,{modelValue:v.value.kind,"onUpdate:modelValue":t[3]||=e=>v.value.kind=e,options:[{value:`human`,label:N(c)(`人`)},{value:`bot`,label:N(c)(`另一位机器人`)}]},null,8,[`modelValue`,`options`])]),g(`label`,null,[S(r(N(c)(`对方名字`)),1),b(g(`input`,{"onUpdate:modelValue":t[4]||=e=>v.value.name=e,maxlength:`40`,placeholder:N(c)(`可选,未填写时使用已认识的名字`)},null,8,ln),[[s,v.value.name]])]),g(`label`,null,[S(r(N(c)(`对方是我的`)),1),j(K,{modelValue:E.value,"onUpdate:modelValue":t[5]||=e=>E.value=e,options:Object.entries(N(y)).map(([e,t])=>({value:e,label:t}))},null,8,[`modelValue`,`options`])]),g(`label`,null,[S(r(N(c)(`我是对方的`)),1),b(g(`input`,{"onUpdate:modelValue":t[6]||=e=>v.value.selfRole=e,maxlength:`24`,placeholder:N(c)(`留空时按当前身份生成对应称呼`)},null,8,un),[[s,v.value.selfRole]])])]),E.value===`custom`?(x(),d(`label`,dn,[S(r(N(c)(`关系称呼`)),1),b(g(`input`,{"onUpdate:modelValue":t[7]||=e=>v.value.peerRole=e,required:``,maxlength:`24`},null,512),[[s,v.value.peerRole]])])):_(``,!0),v.value.channel===`qqbot`?(x(),d(`label`,fn,[S(r(N(c)(`应用账号`)),1),b(g(`input`,{"onUpdate:modelValue":t[8]||=e=>v.value.accountId=e,readonly:!!v.value.id,required:``,maxlength:`128`},null,8,pn),[[s,v.value.accountId]])])):_(``,!0),g(`label`,null,[S(r(N(c)(`关系公开范围`)),1),j(K,{modelValue:v.value.discretion,"onUpdate:modelValue":t[9]||=e=>v.value.discretion=e,options:Object.entries(N(V)).map(([e,t])=>({value:e,label:t}))},null,8,[`modelValue`,`options`])]),g(`label`,null,[S(r(N(c)(`这份关系的缘由`)),1),b(g(`textarea`,{"onUpdate:modelValue":t[10]||=e=>v.value.note=e,rows:`3`,maxlength:`300`,placeholder:N(c)(`可选,写下真实的安排或缘由`)},null,8,mn),[[s,v.value.note]])]),g(`p`,hn,r(N(c)(`绑定称呼不会凭空增加相处经历、信任或对方的同意。私下关系只在与对方的私聊中使用。`)),1),g(`button`,{class:`primary`,type:`submit`,disabled:h.value},r(h.value?N(c)(`正在保存…`):N(c)(`保存关系`)),9,gn)],32)]),_:1},8,[`open`,`title`,`eyebrow`])],64))}}),[[`__scopeId`,`data-v-a3d7a181`]]),vn={class:`page people`},yn={class:`people-bar`},bn=[`placeholder`,`aria-label`],xn={class:`muted`},Sn={key:1,class:`people-list`},Cn=[`data-person`,`onClick`],wn={class:`qq`},Tn={class:`muted`},En={class:`stack tight`},Dn={class:`faint`},On=E(O({__name:`PeoplePage`,setup(e){let n=f(null),i=t(v(`/mind/bonds`)||null),u=f(`galaxy`),p=f(``),m=f(k.sub&&k.sub!==`list`?k.sub:null);k.sub===`list`&&(u.value=`list`);let S=l(()=>{let e=p.value.trim(),t=i.value?.people||[];return e?t.filter(t=>`${t.name}${t.userId}${t.impression||``}`.includes(e)):t}),w=0;async function T(){let e=++w,t=await L.bonds();e===w&&(i.value=t)}function E(e){m.value=e,D(e)}function O(){m.value=null,D(u.value===`list`?`list`:``)}return y(u,e=>{k.page===`people`&&(m.value||D(e===`list`?`list`:``))}),y(()=>[k.page,k.sub],([e,t])=>{e===`people`&&(t===`list`&&(u.value=`list`),m.value=t&&t!==`list`?t:null)}),W(`people`,T),(e,t)=>(x(),d(`div`,vn,[g(`div`,yn,[j(X,{modelValue:u.value,"onUpdate:modelValue":t[0]||=e=>u.value=e,label:N(c)(`人际的视图`),items:[{key:`galaxy`,label:N(c)(`相遇之间`),count:i.value?.people.length??``},{key:`list`,label:N(c)(`列表`)}]},null,8,[`modelValue`,`label`,`items`]),b(g(`input`,{"onUpdate:modelValue":t[1]||=e=>p.value=e,class:`people-search`,type:`search`,placeholder:N(c)(`找一个人`),"aria-label":N(c)(`找一个人`)},null,8,bn),[[s,p.value]]),g(`p`,xn,r(N(c)(`她记得相遇,也记得关系会随着时间改变。`)),1)]),i.value?(x(),d(o,{key:0},[j(_n,{ref_key:`relations`,ref:n,onChanged:T,onOpen:E},null,512),S.value.length?(x(),d(o,{key:0},[u.value===`galaxy`?(x(),h(ye,{key:0,people:S.value,activity:N(G).data?.activity?.kind,onOpen:E,onList:t[2]||=e=>u.value=`list`},null,8,[`people`,`activity`])):(x(),d(`div`,Sn,[(x(!0),d(o,null,C(S.value,e=>(x(),d(`button`,{key:e.userId,class:`card person-card`,"data-person":e.userId,onClick:t=>E(e.userId)},[g(`header`,null,[g(`span`,{class:`avatar`,style:a({"--hue":N(q)(e.name||e.userId)})},r(N(Q)(e.name)),5),g(`div`,null,[g(`h3`,null,r(e.name),1),g(`small`,wn,`QQ `+r(e.userId),1),g(`small`,Tn,r(e.feel),1)])]),g(`div`,En,[(x(!0),d(o,null,C(N(z),([t,n])=>(x(),h(ne,{key:t,label:n,value:e[t],warn:t===`tension`},null,8,[`label`,`value`,`warn`]))),128))]),g(`small`,Dn,r(N(c)(`在 {length} 个地方见过 · 上次说上话 {v}`,{length:e.sessions.length,v:e.lastTalkedAt?N(Y)(e.lastTalkedAt,N(G).data?.now):N(c)(`还没有`)})),1)],8,Cn))),128))]))],64)):(x(),h(A,{key:1,title:N(c)(`TA 还没有认识谁`),text:N(c)(`有人和 TA 说话、TA 细看过群聊之后,这里会出现 TA 对每个人的感觉。`)},null,8,[`title`,`text`])),j(Gt,{groups:i.value.groups,onChanged:T},null,8,[`groups`])],64)):_(``,!0),j(yt,{id:m.value,now:N(G).data?.now,onClose:O,onChanged:T,onRelationship:t[3]||=(e,t)=>{O(),n.value?.edit(e,t)}},null,8,[`id`,`now`])]))}}),[[`__scopeId`,`data-v-4c6f1adb`]]);export{On as default};
|
|
1
|
+
import{$ as e,Ct as t,D as n,Dt as r,E as i,Et as a,G as o,H as s,I as c,J as l,P as u,Q as d,St as f,Tt as p,W as m,X as h,Y as g,Z as _,_ as v,_t as y,bt as b,dt as x,et as S,ft as C,j as w,lt as T,n as E,o as D,rt as O,s as k,t as A,tt as j,v as M,wt as N,yt as P}from"./Empty-DK9nQPCf.js";import{a as F,f as I,g as L,l as R,n as ee,o as z,r as B,s as V,t as te,u as H,v as U}from"./mind-ec-G6iNZ.js";import{a as W,b as G,c as K,f as q,h as J,l as Y,n as X,o as Z,p as Q,r as ne,v as re,x as ie}from"./index-BJfzfgnm.js";import{l as ae}from"./knowledge-C-bND0Ub.js";var oe=[`aria-label`],se={class:`encounter-hero`},ce={class:`encounter-copy`},le={class:`eyebrow`},ue={class:`encounter-count`},de={class:`encounter-lens`,"aria-hidden":`true`},fe={class:`orb`},pe={class:`people-heading`},me={class:`encounter-grid`},he=[`data-person`,`aria-label`,`onClick`],ge={class:`avatar-wrap`},_e={class:`avatar`},ve={class:`person-copy`},ye=E(O({__name:`Galaxy`,props:{people:{},activity:{}},emits:[`open`,`list`],setup(t,{emit:n}){let i=t,s=n,u=l(()=>[...i.people].sort((e,t)=>(t.familiarity??0)-(e.familiarity??0))),f=l(()=>u.value.slice(0,12)),m=l(()=>Math.max(0,u.value.length-f.value.length));return(n,i)=>(x(),d(`section`,{class:`galaxy`,"aria-label":N(c)(`相遇之间:TA 认识的人`)},[g(`div`,se,[g(`div`,ce,[g(`span`,le,r(N(c)(`PEOPLE / 相遇之间`)),1),g(`h2`,null,[S(r(N(c)(`每一次相遇,`)),1),i[1]||=g(`br`,null,null,-1),g(`em`,null,r(N(c)(`都留下一点温度。`)),1)]),g(`p`,null,r(N(c)(`越熟悉离 TA 越近。这里先放着最近亲近的 {length} 个人,其他人也仍然在名单里。`,{length:f.value.length})),1),g(`div`,ue,[g(`b`,null,r(t.people.length),1),g(`span`,null,r(N(c)(`个相遇过的人`)),1)])]),g(`div`,de,[i[2]||=e(`<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),g(`div`,fe,[j(re,{mood:N(ie),activity:t.activity||`idle`,size:100},null,8,[`mood`,`activity`])])])]),g(`div`,pe,[g(`div`,null,[i[3]||=g(`span`,{class:`eyebrow`},`CLOSER TO HER`,-1),g(`h3`,null,r(N(c)(`最近靠近的人`)),1)]),g(`span`,null,r(N(c)(`点开一张光片,看看她记得什么`)),1)]),g(`div`,me,[(x(!0),d(o,null,C(f.value,(e,t)=>(x(),d(`button`,{key:e.userId,type:`button`,class:p([`person-node`,{away:(e.awayDays??0)>=14,tense:e.tension>=.3}]),"data-person":e.userId,style:a({"--hue":N(q)(e.name||e.userId),"--order":t}),"aria-label":`${e.name}:${e.feel||N(c)(`还在慢慢认识`)}`,onClick:t=>s(`open`,e.userId)},[g(`span`,ge,[g(`span`,_e,r(N(Q)(e.name)),1)]),g(`span`,ve,[g(`b`,null,r(e.name),1),g(`small`,null,`QQ `+r(e.userId),1),g(`small`,null,r(e.feel||N(c)(`还在慢慢认识`)),1)]),i[5]||=g(`span`,{class:`person-arrow`,"aria-hidden":`true`},`↗`,-1),g(`span`,{class:`familiarity`,style:a({"--amount":Math.round(Math.max(0,Math.min(1,e.familiarity??0))*100)+`%`}),"aria-hidden":`true`},[...i[4]||=[g(`i`,null,null,-1)]],4)],14,he))),128))]),m.value?(x(),d(`button`,{key:0,type:`button`,class:`more-people`,onClick:i[0]||=e=>s(`list`)},[S(r(N(c)(`在名单里看看另外 {hidden} 个人`,{hidden:m.value}))+` `,1),i[6]||=g(`span`,{"aria-hidden":`true`},`↗`,-1)])):_(``,!0)],8,oe))}}),[[`__scopeId`,`data-v-c60042d4`]]),be=[`width`,`height`],xe=[`stroke-dasharray`,`transform`],Se={x:`22`,y:`25.5`,"text-anchor":`middle`},Ce={key:0},we=E(O({__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,i=l(()=>{let e=Number(t.value)||0;return t.signed?Math.max(-1,Math.min(1,e)):Math.max(0,Math.min(1,e))}),o=l(()=>Math.abs(i.value)*n),s=l(()=>i.value<0);return(t,c)=>(x(),d(`figure`,{class:`ring`,style:a({width:e.size+`px`})},[(x(),d(`svg`,{width:e.size,height:e.size,viewBox:`0 0 44 44`,"aria-hidden":`true`},[c[0]||=g(`circle`,{class:`track`,cx:`22`,cy:`22`,r:`18`},null,-1),g(`circle`,{class:p([`arc`,{negative:s.value}]),cx:`22`,cy:`22`,r:`18`,"stroke-dasharray":`${o.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,xe),g(`text`,Se,r(Math.round(i.value*100)),1)],8,be)),g(`figcaption`,null,[g(`b`,null,r(e.label),1),e.caption?(x(),d(`small`,Ce,r(e.caption),1)):_(``,!0)])],4))}}),[[`__scopeId`,`data-v-bbca6071`]]),Te={key:0,class:`error-text`},Ee={key:1,class:`person-sheet stack`},De={class:`who`},Oe={class:`feel`},ke={class:`qq`},Ae={class:`muted`},je={class:`rings`},Me={class:`stack tight`},Ne={class:`row`},Pe={class:`sheet-title`},Fe={key:0},Ie={key:1},Le={class:`list`},Re={class:`faint`},ze={key:0,class:`impression`},Be={key:1,class:`row`},Ve={class:`faint`},He={class:`sheet-title`},Ue={key:0,class:`list`},We=[`data-tone`],Ge={class:`grow`},Ke={class:`faint`},qe={key:0,class:`chip`,"data-tone":`quiet`},Je=[`onClick`],Ye={key:1,class:`muted`},Xe={key:2},Ze={class:`sheet-title`},Qe={class:`list`},$e=[`data-tone`],et={class:`grow`},tt={key:0,class:`faint`},nt={class:`faint`},rt=[`onClick`],it={class:`sheet-title`},at={key:0,class:`list`},ot={class:`faint`},st={key:0,class:`instant`},ct={class:`faint`},lt=[`onClick`],ut=[`onClick`],dt={key:1,class:`muted`},ft={class:`sheet-title`},pt={key:0,class:`list`},mt=[`data-tone`],ht={class:`grow`},gt={class:`faint`},_t=[`onClick`],vt={key:1,class:`muted`},yt=E(O({__name:`PersonSheet`,props:{id:{},now:{}},emits:[`close`,`changed`,`relationship`],setup(e,{emit:t}){let s=e,u=t,m=f(null),b=f(``),S=l(()=>m.value?.person),w=l(()=>{let e=S.value?.firstMetAt;return e?c(`认识 {v} 天`,{v:Math.max(1,Math.round(((s.now||Date.now())-e)/864e5))}):``});async function T(){if(!s.id)return;let e=s.id;m.value?.person?.userId!==e&&(m.value=v(`/mind/people/`+encodeURIComponent(e))||null),b.value=``;try{let t=await L.person(e);s.id===e&&(m.value=t)}catch(t){if(s.id!==e)return;m.value=null,b.value=t.message}}async function E(e){if(await i(c(`撤销这次「{v}」?TA 对这个人的感觉会重新计算。`,{v:B[e.change]||e.change}),{title:c(`撤销一次关系变化`),confirmText:c(`撤销`),danger:!0}))try{await L.revoke(`bond`,e.id),M(c(`已撤销`)),await T(),u(`changed`)}catch(e){M(e.message,!0)}}async function D(e){let t=await n(c(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:c(`撤销这条记忆`),confirmText:c(`撤销`),danger:!0,placeholder:c(`原因`)});if(t!==null)try{await L.revoke(`memory`,e.id,t),M(c(`已撤销`)),await T()}catch(e){M(e.message,!0)}}async function O(e,t){try{await ae(e.id,t),await T()}catch(e){M(e.message,!0)}}async function k(e){if(await i(c(`撤销这次相遇留下的意思?「{meant}」之后不会再回到 TA 心里,也不会再被当成变化的来源。`,{meant:e.meant}),{title:c(`撤销这次相遇`),confirmText:c(`撤销`),danger:!0}))try{await L.revoke(`meeting`,e.id),M(c(`已撤销`)),await T(),u(`changed`)}catch(e){M(e.message,!0)}}async function A(e){let t=await n(c(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:c(`撤销这个约定`),confirmText:c(`撤销`),danger:!0,placeholder:c(`原因`)});if(t!==null)try{await L.revoke(`anticipation`,e.id,t),M(c(`已撤销`)),await T()}catch(e){M(e.message,!0)}}return y(()=>s.id,e=>{m.value=null,e&&T()},{immediate:!0}),(t,n)=>(x(),h(Z,{open:!!e.id,title:S.value?.name||N(c)(`正在想起…`),eyebrow:N(c)(`TA 认识的人`),width:`560px`,onClose:n[1]||=e=>u(`close`)},{default:P(()=>[b.value?(x(),d(`p`,Te,r(b.value),1)):S.value?(x(),d(`div`,Ee,[g(`header`,De,[g(`span`,{class:`avatar`,style:a({"--hue":N(q)(S.value.name||S.value.userId)})},r(N(Q)(S.value.name)),5),g(`div`,null,[g(`p`,Oe,r(S.value.feel),1),g(`small`,ke,`QQ `+r(S.value.userId),1),g(`small`,Ae,r([w.value,S.value.lastTalkedAt?N(c)(`上次说上话 {v}`,{v:N(Y)(S.value.lastTalkedAt,e.now)}):N(c)(`还没说上过话`),S.value.seenAt?N(c)(`上次见到 {v}`,{v:N(Y)(S.value.seenAt,e.now)}):``].filter(Boolean).join(` · `)),1)])]),g(`div`,je,[(x(!0),d(o,null,C(N(z),([e,t])=>(x(),h(we,{key:e,value:S.value[e],label:t},null,8,[`value`,`label`]))),128))]),g(`section`,Me,[g(`div`,Ne,[g(`h3`,Pe,r(N(c)(`彼此的关系`)),1),g(`button`,{class:`small`,onClick:n[0]||=e=>u(`relationship`,S.value.relationship,S.value.userId)},r(S.value.relationship?N(c)(`修改关系`):N(c)(`绑定关系`)),1)]),S.value.relationship?(x(),d(`p`,Fe,r(N(c)(`对方是我的 {peer},我是对方的 {self}`,{peer:N(I)[S.value.relationship.peerRole]||S.value.relationship.peerRole,self:N(I)[S.value.relationship.selfRole]||S.value.relationship.selfRole})),1)):_(``,!0),m.value.relationshipHistory?.length?(x(),d(`details`,Ie,[g(`summary`,null,r(N(c)(`关系变化记录`)),1),g(`ul`,Le,[(x(!0),d(o,null,C(m.value.relationshipHistory,e=>(x(),d(`li`,{key:e.id},[g(`small`,Re,r(N(U)(e.created))+` · `+r(e.status===`active`?N(c)(`设置关系`):N(c)(`解除关系`)),1),g(`p`,null,r(e.peer_role)+` · `+r(e.note),1)]))),128))])])):_(``,!0)]),S.value.impression?(x(),d(`p`,ze,r(N(c)(`印象:{impression}`,{impression:S.value.impression})),1)):_(``,!0),S.value.places?.length?(x(),d(`div`,Be,[g(`span`,Ve,r(N(c)(`在这些地方见过:`)),1),(x(!0),d(o,null,C(S.value.places,e=>(x(),d(`span`,{key:e.id,class:`chip`,"data-tone":`quiet`},r(e.name),1))),128))])):_(``,!0),g(`section`,null,[g(`h3`,He,r(N(c)(`这份感觉是怎么来的`)),1),m.value.changes.length?(x(),d(`ul`,Ue,[(x(!0),d(o,null,C(m.value.changes,e=>(x(),d(`li`,{key:e.id,class:p([`change`,{done:e.revoked}])},[g(`span`,{class:`chip`,"data-tone":e.revoked?`quiet`:N(F).has(e.change)?`danger`:void 0},r(N(B)[e.change]||e.change),9,We),g(`div`,Ge,[g(`p`,null,r(e.note||N(c)(`没有写原因`)),1),g(`small`,Ke,r(N(c)(`{v} · {v2} · {length} 处来源`,{v:N(U)(e.created),v2:N(H)[e.origin]||N(c)(`写日记时`),length:e.sources.length})),1)]),e.revoked?(x(),d(`span`,qe,r(N(c)(`已撤销`)),1)):(x(),d(`button`,{key:1,class:`text-button`,"data-revoke-change":``,onClick:t=>E(e)},r(N(c)(`撤销`)),9,Je))],2))),128))])):(x(),d(`p`,Ye,r(N(c)(`只是一起聊过天,还没有特别的变化。`)),1))]),m.value.meetings?.length?(x(),d(`section`,Xe,[g(`h3`,Ze,r(N(c)(`和{name}的相遇留下了什么`,{name:S.value.name})),1),g(`ul`,Qe,[(x(!0),d(o,null,C(m.value.meetings,e=>(x(),d(`li`,{key:e.id,class:`change`},[g(`span`,{class:`chip`,"data-tone":e.private?`quiet`:void 0},r(e.private?N(c)(`私下`):e.choice===`silent`?N(c)(`没出声`):N(c)(`出了声`)),9,$e),g(`div`,et,[g(`p`,null,r(e.meant),1),e.why?(x(),d(`small`,tt,r(N(c)(`当时:{why}`,{why:e.why})),1)):_(``,!0),g(`small`,nt,r(e.when)+` · `+r(e.sessionName),1)]),g(`button`,{class:`text-button`,"data-revoke-meeting":``,onClick:t=>k(e)},r(N(c)(`撤销`)),9,rt)]))),128))])])):_(``,!0),g(`section`,null,[g(`h3`,it,r(N(c)(`TA 记得关于{name}的事`,{name:S.value.name})),1),m.value.memories.length?(x(),d(`ul`,at,[(x(!0),d(o,null,C(m.value.memories,e=>(x(),d(`li`,{key:e.id,class:p([`memory-item`,{superseded:e.status===`superseded`}])},[g(`p`,null,r(e.content),1),g(`small`,ot,r(N(c)(`{v} · 在「{v2}」知道的 · {when}`,{v:N(R)[e.status]||e.status,v2:N(J)({name:e.sessionName,id:e.session_id||e.sessionId}),when:e.when})),1),e.status===`confirmed`?(x(),d(`div`,st,[g(`span`,ct,r(N(c)(`改完即生效`)),1),j(K,{"aria-label":N(c)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(N(V)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>O(e,{discretion:t})},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),g(`button`,{class:`small`,onClick:t=>O(e,{locked:!e.locked})},r(e.locked?N(c)(`解锁`):N(c)(`锁定`)),9,lt),g(`button`,{class:`small danger`,onClick:t=>D(e)},r(N(c)(`撤销`)),9,ut)])):_(``,!0)],2))),128))])):(x(),d(`p`,dt,r(N(c)(`还没有记住关于这个人的事。`)),1))]),g(`section`,null,[g(`h3`,ft,r(N(c)(`和{name}有关的约定`,{name:S.value.name})),1),m.value.anticipations.length?(x(),d(`ul`,pt,[(x(!0),d(o,null,C(m.value.anticipations,e=>(x(),d(`li`,{key:e.id,class:p([`change`,{done:e.state!==`pending`}])},[g(`span`,{class:`chip`,"data-tone":e.state===`pending`?void 0:`quiet`},r(N(ee)[e.state]||e.state),9,mt),g(`div`,ht,[g(`p`,null,r(e.content),1),g(`small`,gt,r(N(te)[e.kind]||e.kind)+` · `+r(e.when),1)]),e.status===`revoked`?_(``,!0):(x(),d(`button`,{key:0,class:`text-button`,onClick:t=>A(e)},r(N(c)(`撤销`)),9,_t))],2))),128))])):(x(),d(`p`,vt,r(N(c)(`没有和这个人有关的约定。`)),1))])])):_(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`]))}}),[[`__scopeId`,`data-v-9ffb5e88`]]),bt={class:`faces`},xt={class:`faces-head`},St={class:`eyebrow`},Ct={class:`muted`},wt={class:`face-grid`},Tt={class:`badge`},Et={key:0,class:`qq`},Dt={class:`muted`},Ot={key:0,class:`place-notes compact`},kt={class:`face-excerpt`},At={key:1,class:`muted small-text`},jt=[`onClick`],Mt={key:0,class:`stack`},Nt={key:0,class:`place-notes`},Pt={key:0,class:`muted small-text`},Ft={class:`faint`},It={key:1,class:`muted`},Lt={key:2,class:`versions`},Rt={key:0},zt={key:1},Bt={key:0,class:`change-why`},Vt={key:4,class:`legacy-face`},Ht={class:`face-full`},Ut=[`onClick`],Wt={key:0,class:`muted`},Gt=E(O({__name:`GroupFaces`,props:{groups:{}},emits:[`changed`],setup(e,{emit:t}){let n=e,s=t,l=f(null),m=f({}),h=u({impression:w(`印象`),wish:w(`想做的事`),preference:w(`偏好`),question:w(`还在想的问题`),boundary:w(`相处的分寸`)}),v=u({add:w(`新增`),revise:w(`修改`),remove:w(`放下`)});y(()=>n.groups,e=>{l.value&&=e.find(e=>e.session===l.value.session)||null});async function b(e){if(!(m.value[e]&&m.value[e]?.[0]?.id===n.groups.find(t=>t.session===e)?.face?.id))try{m.value={...m.value,[e]:await L.faces(e)}}catch(e){M(e.message,!0)}}async function T(e,t){if(await i(c(`撤销这次想法更新?会恢复上一次保留的想法。`),{title:c(`撤销想法更新`),confirmText:c(`撤销`),danger:!0}))try{await L.revoke(`face`,t),m.value={...m.value,[e]:await L.faces(e)},M(c(`已撤销`)),s(`changed`)}catch(e){M(e.message,!0)}}return(t,n)=>(x(),d(`section`,bt,[g(`div`,xt,[g(`span`,St,r(N(c)(`在这里的想法`)),1),g(`h2`,null,r(N(c)(`同一个她,在不同的地方留下自己的想法。`)),1),g(`p`,Ct,r(N(c)(`她根据相处留下印象、愿望或疑问,选择什么时候新增、修改或放下。每次更新保留理由和来源。`)),1)]),g(`div`,wt,[(x(!0),d(o,null,C(e.groups,e=>(x(),d(`article`,{key:e.session,class:`card face-card`,style:a({"--hue":N(q)(e.session)})},[g(`header`,null,[g(`span`,Tt,r(e.kind===`private`?N(c)(`私`):N(c)(`群`)),1),g(`div`,null,[g(`h3`,null,r(N(J)({id:e.session,name:e.name,kind:e.kind})),1),e.kind===`private`?(x(),d(`small`,Et,`QQ `+r(String(e.session||``).split(`:`).pop()),1)):_(``,!0),g(`small`,Dt,r(e.kind===`private`?N(c)(`私聊`):N(c)(`群聊`))+r(e.bond?` · ${e.bond.feel}`:``),1)])]),e.face?.notes?.length?(x(),d(`ul`,Ot,[(x(!0),d(o,null,C(e.face.notes.slice(0,3),e=>(x(),d(`li`,{key:e.id},[g(`small`,null,r(N(h)[e.kind]||N(c)(`想法`)),1),g(`p`,kt,r(e.content),1)]))),128))])):(x(),d(`p`,At,r(N(c)(`还没有特别想留在这里的想法,之后由她自己选择。`)),1)),g(`button`,{class:`text-button`,onClick:t=>{l.value=e,b(e.session)}},r(N(c)(`查看想法与变化 ↗`)),9,jt)],4))),128))]),j(Z,{open:!!l.value,title:l.value?.name||N(c)(`在这里的想法`),eyebrow:N(c)(`PLACE NOTES / 在这里的想法`),width:`680px`,onClose:n[0]||=e=>l.value=null},{default:P(()=>[l.value?(x(),d(`div`,Mt,[l.value.face?.notes?.length?(x(),d(`ul`,Nt,[(x(!0),d(o,null,C(l.value.face.notes,e=>(x(),d(`li`,{key:e.id,class:`face-full`},[g(`small`,null,r(N(h)[e.kind]||N(c)(`想法`)),1),g(`p`,null,r(e.content),1),e.why?(x(),d(`p`,Pt,r(e.why),1)):_(``,!0),g(`small`,Ft,r(N(c)(`{n} 处来源`,{n:e.sources?.length||0})),1)]))),128))])):(x(),d(`p`,It,r(N(c)(`还没有特别想留在这里的想法,之后由她自己选择。`)),1)),g(`h3`,null,r(N(c)(`变化历史`)),1),m.value[l.value.session]?(x(),d(`ol`,Lt,[(x(!0),d(o,null,C(m.value[l.value.session],e=>(x(),d(`li`,{key:e.id,class:p({revoked:e.revoked})},[g(`time`,null,r(N(U)(e.created)),1),g(`span`,null,[e.revoked?(x(),d(`b`,Rt,r(N(c)(`已撤销 ·`)),1)):e.origin===`migration`?(x(),d(`b`,zt,r(N(c)(`旧版 ·`)),1)):_(``,!0),e.changes?.length?(x(!0),d(o,{key:2},C(e.changes,(e,t)=>(x(),d(`p`,{key:t},[g(`b`,null,r(N(v)[e.action])+` · `,1),S(r(e.content)+` `,1),e.why?(x(),d(`small`,Bt,r(e.why),1)):_(``,!0)]))),128)):e.notes?.length?(x(),d(o,{key:3},[S(r(e.notes.map(e=>e.content).join(`;`)),1)],64)):(x(),d(`details`,Vt,[g(`summary`,null,r(N(c)(`旧人格记录,仅保留历史`)),1),g(`p`,Ht,r(e.content||[e.role,e.tone,e.aspiration].filter(Boolean).join(`;`)),1)]))]),e.revoked?_(``,!0):(x(),d(`button`,{key:0,class:`text-button`,onClick:t=>T(l.value.session,e.id)},r(N(c)(`撤销`)),9,Ut))],2))),128)),m.value[l.value.session].length?_(``,!0):(x(),d(`li`,Wt,r(N(c)(`没有记录。`)),1))])):_(``,!0)])):_(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-a6532d0c`]]),Kt={class:`card relationships`},qt={class:`row`},Jt={class:`grow`},Yt={class:`muted`},Xt={key:0,class:`relationship-list`},Zt={class:`grow`},Qt=[`onClick`],$t={class:`chip`},en={class:`muted`},tn={key:0},nn={class:`faint`},rn={class:`row`},an=[`onClick`],on=[`onClick`],sn={key:1,class:`faint`},cn={class:`fields`},$=[`readonly`,`placeholder`],ln=[`placeholder`],un=[`placeholder`],dn={key:0},fn={key:1},pn=[`readonly`],mn=[`placeholder`],hn={class:`faint`},gn=[`disabled`],_n=E(O({__name:`RelationshipsPanel`,emits:[`changed`,`open`],setup(e,{expose:t,emit:n}){let a=n,l=f([]),p=f(!1),h=f(!1),v=f({}),y=u({妹妹:w(`妹妹`),姐姐:w(`姐姐`),弟弟:w(`弟弟`),哥哥:w(`哥哥`),朋友:w(`朋友`),伙伴:w(`伙伴`),custom:w(`其他关系`)}),E=f(`妹妹`);async function D(){l.value=(await L.relationships()).items}T(()=>D().catch(e=>M(e.message,!0)));function O(e,t=``){v.value=e?{...e,expectedId:e.id}:{subjectId:t,channel:`onebot`,accountId:`_`,kind:`human`,name:``,peerRole:`妹妹`,selfRole:``,note:``,discretion:`open`,expectedId:null},E.value=Object.hasOwn(y,v.value.peerRole)?v.value.peerRole:`custom`,p.value=!0}t({edit:O});async function k(){if(!h.value){h.value=!0;try{await L.saveRelationship({...v.value,peerRole:E.value===`custom`?v.value.peerRole:E.value}),p.value=!1,await D(),a(`changed`),M(c(`关系已保存`))}catch(e){M(e.message,!0)}finally{h.value=!1}}}async function A(e){if(await i(c(`解除这份关系?相处留下的记忆和感受仍会保留。`),{title:c(`解除关系`),confirmText:c(`解除`),danger:!0}))try{await L.endRelationship(e.subjectId,{channel:e.channel,accountId:e.accountId,expectedId:e.id}),await D(),a(`changed`)}catch(e){M(e.message,!0)}}return(e,t)=>(x(),d(o,null,[g(`section`,Kt,[g(`header`,qt,[g(`div`,Jt,[t[12]||=g(`span`,{class:`eyebrow`},`RELATIONSHIPS`,-1),g(`h2`,null,r(N(c)(`彼此的关系`)),1)]),g(`button`,{onClick:t[0]||=e=>O()},r(N(c)(`绑定关系`)),1)]),g(`p`,Yt,r(N(c)(`按账号认出人或另一位机器人;关系融入关心、打算与交流,感情仍随着相处生长。`)),1),l.value.length?(x(),d(`div`,Xt,[(x(!0),d(o,null,C(l.value,e=>(x(),d(`article`,{key:e.id,class:`relation`},[g(`div`,Zt,[g(`button`,{class:`text-button`,onClick:t=>a(`open`,e.subjectId)},r(e.name||e.subjectId),9,Qt),g(`span`,$t,r(N(y)[e.peerRole]||e.peerRole),1),g(`small`,en,r(e.kind===`bot`?N(c)(`另一位机器人`):N(c)(`人`))+` · `+r(e.subjectId),1),e.note?(x(),d(`p`,tn,r(e.note),1)):_(``,!0),g(`small`,nn,r(N(U)(e.created))+` · `+r(N(V)[e.discretion]),1)]),g(`div`,rn,[g(`button`,{class:`small`,onClick:t=>O(e)},r(N(c)(`修改`)),9,an),g(`button`,{class:`text-button`,onClick:t=>A(e)},r(N(c)(`解除`)),9,on)])]))),128))])):(x(),d(`p`,sn,r(N(c)(`还没有绑定关系,可以从一个准确的账号开始。`)),1))]),j(Z,{open:p.value,title:N(c)(`绑定关系`),eyebrow:N(c)(`彼此的关系`),width:`560px`,onClose:t[11]||=e=>p.value=!1},{default:P(()=>[g(`form`,{class:`stack`,onSubmit:m(k,[`prevent`])},[g(`div`,cn,[g(`label`,null,[S(r(N(c)(`平台`)),1),j(K,{modelValue:v.value.channel,"onUpdate:modelValue":t[1]||=e=>v.value.channel=e,disabled:!!v.value.id,options:[{value:`onebot`,label:`QQ / OneBot`},{value:`qqbot`,label:N(c)(`QQ 官方机器人`)}]},null,8,[`modelValue`,`disabled`,`options`])]),g(`label`,null,[S(r(N(c)(`对方账号`)),1),b(g(`input`,{"onUpdate:modelValue":t[2]||=e=>v.value.subjectId=e,required:``,readonly:!!v.value.id,maxlength:`128`,placeholder:N(c)(`QQ 号或平台用户 ID`)},null,8,$),[[s,v.value.subjectId]])]),g(`label`,null,[S(r(N(c)(`对象类型`)),1),j(K,{modelValue:v.value.kind,"onUpdate:modelValue":t[3]||=e=>v.value.kind=e,options:[{value:`human`,label:N(c)(`人`)},{value:`bot`,label:N(c)(`另一位机器人`)}]},null,8,[`modelValue`,`options`])]),g(`label`,null,[S(r(N(c)(`对方名字`)),1),b(g(`input`,{"onUpdate:modelValue":t[4]||=e=>v.value.name=e,maxlength:`40`,placeholder:N(c)(`可选,未填写时使用已认识的名字`)},null,8,ln),[[s,v.value.name]])]),g(`label`,null,[S(r(N(c)(`对方是我的`)),1),j(K,{modelValue:E.value,"onUpdate:modelValue":t[5]||=e=>E.value=e,options:Object.entries(N(y)).map(([e,t])=>({value:e,label:t}))},null,8,[`modelValue`,`options`])]),g(`label`,null,[S(r(N(c)(`我是对方的`)),1),b(g(`input`,{"onUpdate:modelValue":t[6]||=e=>v.value.selfRole=e,maxlength:`24`,placeholder:N(c)(`留空时按当前身份生成对应称呼`)},null,8,un),[[s,v.value.selfRole]])])]),E.value===`custom`?(x(),d(`label`,dn,[S(r(N(c)(`关系称呼`)),1),b(g(`input`,{"onUpdate:modelValue":t[7]||=e=>v.value.peerRole=e,required:``,maxlength:`24`},null,512),[[s,v.value.peerRole]])])):_(``,!0),v.value.channel===`qqbot`?(x(),d(`label`,fn,[S(r(N(c)(`应用账号`)),1),b(g(`input`,{"onUpdate:modelValue":t[8]||=e=>v.value.accountId=e,readonly:!!v.value.id,required:``,maxlength:`128`},null,8,pn),[[s,v.value.accountId]])])):_(``,!0),g(`label`,null,[S(r(N(c)(`关系公开范围`)),1),j(K,{modelValue:v.value.discretion,"onUpdate:modelValue":t[9]||=e=>v.value.discretion=e,options:Object.entries(N(V)).map(([e,t])=>({value:e,label:t}))},null,8,[`modelValue`,`options`])]),g(`label`,null,[S(r(N(c)(`这份关系的缘由`)),1),b(g(`textarea`,{"onUpdate:modelValue":t[10]||=e=>v.value.note=e,rows:`3`,maxlength:`300`,placeholder:N(c)(`可选,写下真实的安排或缘由`)},null,8,mn),[[s,v.value.note]])]),g(`p`,hn,r(N(c)(`绑定称呼不会凭空增加相处经历、信任或对方的同意。私下关系只在与对方的私聊中使用。`)),1),g(`button`,{class:`primary`,type:`submit`,disabled:h.value},r(h.value?N(c)(`正在保存…`):N(c)(`保存关系`)),9,gn)],32)]),_:1},8,[`open`,`title`,`eyebrow`])],64))}}),[[`__scopeId`,`data-v-a3d7a181`]]),vn={class:`page people`},yn={class:`people-bar`},bn=[`placeholder`,`aria-label`],xn={class:`muted`},Sn={key:1,class:`people-list`},Cn=[`data-person`,`onClick`],wn={class:`qq`},Tn={class:`muted`},En={class:`stack tight`},Dn={class:`faint`},On=E(O({__name:`PeoplePage`,setup(e){let n=f(null),i=t(v(`/mind/bonds`)||null),u=f(`galaxy`),p=f(``),m=f(k.sub&&k.sub!==`list`?k.sub:null);k.sub===`list`&&(u.value=`list`);let S=l(()=>{let e=p.value.trim(),t=i.value?.people||[];return e?t.filter(t=>`${t.name}${t.userId}${t.impression||``}`.includes(e)):t}),w=0;async function T(){let e=++w,t=await L.bonds();e===w&&(i.value=t)}function E(e){m.value=e,D(e)}function O(){m.value=null,D(u.value===`list`?`list`:``)}return y(u,e=>{k.page===`people`&&(m.value||D(e===`list`?`list`:``))}),y(()=>[k.page,k.sub],([e,t])=>{e===`people`&&(t===`list`&&(u.value=`list`),m.value=t&&t!==`list`?t:null)}),W(`people`,T),(e,t)=>(x(),d(`div`,vn,[g(`div`,yn,[j(X,{modelValue:u.value,"onUpdate:modelValue":t[0]||=e=>u.value=e,label:N(c)(`人际的视图`),items:[{key:`galaxy`,label:N(c)(`相遇之间`),count:i.value?.people.length??``},{key:`list`,label:N(c)(`列表`)}]},null,8,[`modelValue`,`label`,`items`]),b(g(`input`,{"onUpdate:modelValue":t[1]||=e=>p.value=e,class:`people-search`,type:`search`,placeholder:N(c)(`找一个人`),"aria-label":N(c)(`找一个人`)},null,8,bn),[[s,p.value]]),g(`p`,xn,r(N(c)(`她记得相遇,也记得关系会随着时间改变。`)),1)]),i.value?(x(),d(o,{key:0},[j(_n,{ref_key:`relations`,ref:n,onChanged:T,onOpen:E},null,512),S.value.length?(x(),d(o,{key:0},[u.value===`galaxy`?(x(),h(ye,{key:0,people:S.value,activity:N(G).data?.activity?.kind,onOpen:E,onList:t[2]||=e=>u.value=`list`},null,8,[`people`,`activity`])):(x(),d(`div`,Sn,[(x(!0),d(o,null,C(S.value,e=>(x(),d(`button`,{key:e.userId,class:`card person-card`,"data-person":e.userId,onClick:t=>E(e.userId)},[g(`header`,null,[g(`span`,{class:`avatar`,style:a({"--hue":N(q)(e.name||e.userId)})},r(N(Q)(e.name)),5),g(`div`,null,[g(`h3`,null,r(e.name),1),g(`small`,wn,`QQ `+r(e.userId),1),g(`small`,Tn,r(e.feel),1)])]),g(`div`,En,[(x(!0),d(o,null,C(N(z),([t,n])=>(x(),h(ne,{key:t,label:n,value:e[t],warn:t===`tension`},null,8,[`label`,`value`,`warn`]))),128))]),g(`small`,Dn,r(N(c)(`在 {length} 个地方见过 · 上次说上话 {v}`,{length:e.sessions.length,v:e.lastTalkedAt?N(Y)(e.lastTalkedAt,N(G).data?.now):N(c)(`还没有`)})),1)],8,Cn))),128))]))],64)):(x(),h(A,{key:1,title:N(c)(`TA 还没有认识谁`),text:N(c)(`有人和 TA 说话、TA 细看过群聊之后,这里会出现 TA 对每个人的感觉。`)},null,8,[`title`,`text`])),j(Gt,{groups:i.value.groups,onChanged:T},null,8,[`groups`])],64)):_(``,!0),j(yt,{id:m.value,now:N(G).data?.now,onClose:O,onChanged:T,onRelationship:t[3]||=(e,t)=>{O(),n.value?.edit(e,t)}},null,8,[`id`,`now`])]))}}),[[`__scopeId`,`data-v-4c6f1adb`]]);export{On as default};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{Dt as e,G as t,H as n,I as r,J as i,Q as a,St as o,W as ee,X as s,Y as c,Z as l,_t as u,bt as d,dt as f,et as p,ft as m,lt as te,m as h,n as ne,o as re,rt as g,s as _,t as v,tt as y,ut as ie,wt as b,yt as x,z as ae}from"./Empty-
|
|
1
|
+
import{Dt as e,G as t,H as n,I as r,J as i,Q as a,St as o,W as ee,X as s,Y as c,Z as l,_t as u,bt as d,dt as f,et as p,ft as m,lt as te,m as h,n as ne,o as re,rt as g,s as _,t as v,tt as y,ut as ie,wt as b,yt as x,z as ae}from"./Empty-DK9nQPCf.js";import{i as S,n as oe,o as se}from"./index-BJfzfgnm.js";import{t as C}from"./Field-BzKFhuFd.js";var ce={class:`page plugins`},le={class:`plugins-intro`},ue={class:`eyebrow`},de={key:0,class:`warn-text`,role:`alert`},fe={key:1,class:`stack`},pe={class:`lead`},me={class:`grid`},he={class:`muted`},ge={key:0},_e={class:`row`},ve=[`onClick`],ye=[`onClick`],be=[`onClick`],xe={key:2,class:`grid`},w=[`onClick`],T={key:3,class:`grid`},E={class:`row`},D=[`onClick`],O=[`onClick`],k={key:4,class:`grid`},A={key:0,class:`switch`},j=[`onUpdate:modelValue`],M=[`onUpdate:modelValue`,`placeholder`],Se=[`onUpdate:modelValue`,`placeholder`],Ce=[`onUpdate:modelValue`],we={class:`row`},Te={class:`ghost`,type:`submit`},N=[`src`],Ee={key:1,class:`row`},P=ne(g({__name:`PluginsPage`,setup(ne){let g=[`installed`,`market`,`actions`,`import`],P=o(g.includes(_.sub)?_.sub:`installed`),F=o([]),I=o([]),L=o(!1),R=o(!1),z=o([]),B=o(``),V=o(``),H=o(null),U=o({}),W=o({url:``,sha256:``}),G=o(``),K=o(``),q=o(``),J=o(null),Y=i(()=>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})}u(P,e=>{re(e),e===`market`&&Z()}),u(()=>_.sub,e=>{g.includes(e)&&(P.value=e)}),u(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))}te(()=>{X().catch(e=>B.value=e.message),P.value===`market`&&Z(),window.addEventListener(`message`,$)}),ie(()=>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(i,o)=>(f(),a(`div`,ce,[c(`header`,le,[c(`span`,ue,e(b(r)(`THE WORLD SHE CAN TOUCH · 插件`)),1),c(`h1`,null,[p(e(b(r)(`核心是她。`)),1),c(`em`,null,e(b(r)(`插件是世界。`)),1)]),c(`p`,null,e(b(r)(`插件只能经她同意接触世界。它们读不到她的数据库,也不能替她开口。`)),1)]),B.value?(f(),a(`p`,de,e(B.value),1)):l(``,!0),y(oe,{"model-value":P.value,"onUpdate:modelValue":o[0]||=e=>P.value=e,label:b(r)(`插件的分区`),items:[{key:`installed`,label:b(r)(`插件列表`)},{key:`market`,label:b(r)(`插件市场`)},{key:`actions`,label:b(r)(`她想做的事`),count:z.value.length},{key:`import`,label:b(r)(`导入与开发`)}]},null,8,[`model-value`,`label`,`items`]),P.value===`installed`?(f(),a(`section`,fe,[c(`p`,pe,e(b(r)(`天气随 LuckyTri 附带,默认关闭。启用前会先列出它要的权限。`)),1),c(`div`,me,[F.value.length?l(``,!0):(f(),s(v,{key:0,title:b(r)(`还没有接上插件`),text:b(r)(`内置的天气可以在这里启用,也可以从市场安装。`)},null,8,[`title`,`text`])),(f(!0),a(t,null,m(F.value,t=>(f(),s(S,{key:t.id,title:t.manifest.name||t.id},{default:x(()=>[c(`p`,null,e(t.manifest.description),1),c(`p`,he,[p(e(t.version)+` · `+e(je(t))+` `,1),t.status?.text?(f(),a(`span`,ge,` · `+e(t.status.text),1)):l(``,!0)]),c(`div`,_e,[t.enabled?(f(),a(`button`,{key:1,class:`ghost`,onClick:e=>b(h)(`/plugins/${t.id}/disable`,{method:`POST`,body:`{}`}).then(X)},e(b(r)(`停用`)),9,ye)):(f(),a(`button`,{key:0,class:`primary`,onClick:e=>V.value=t.id},e(b(r)(`查看权限并启用`)),9,ve)),c(`button`,{class:`ghost`,onClick:e=>V.value=t.id},e(b(r)(`详情`)),9,be)])]),_:2},1032,[`title`]))),128))])])):P.value===`market`?(f(),a(`section`,xe,[R.value?(f(),s(v,{key:0,title:b(r)(`正在查看市场`),text:b(r)(`连不上的话,这里会说明,不会再显示一串英文错误。`)},null,8,[`title`,`text`])):I.value.length?l(``,!0):(f(),s(v,{key:1,title:b(r)(`市场暂时没有条目`),text:L.value?b(r)(`插件市场的索引还没有发布,或现在连不上。随程序附带的插件在「插件列表」里,默认关闭。`):b(r)(`索引仓库还是空的,或者现在连不上。你仍然可以导入一个插件包。`)},null,8,[`title`,`text`])),R.value?l(``,!0):(f(!0),a(t,{key:2},m(I.value,t=>(f(),s(S,{key:t.id||t.source,title:t.name||t.id},{default:x(()=>[c(`p`,null,e(t.description),1),t.latest?(f(),a(`button`,{key:0,class:`primary`,onClick:e=>Q(`/plugins/market/stage`,{url:t.latest.url,sha256:t.latest.sha256,id:t.id})},e(b(r)(`安装`))+` `+e(t.latest.version),9,w)):l(``,!0)]),_:2},1032,[`title`]))),128))])):P.value===`actions`?(f(),a(`section`,T,[z.value.length?l(``,!0):(f(),s(v,{key:0,title:b(r)(`没有等待同意的事`),text:b(r)(`高风险的行动会先停在这里,等你点头。过一天就不再算数。`)},null,8,[`title`,`text`])),(f(!0),a(t,null,m(z.value,t=>(f(),s(S,{key:t.id,title:t.label},{default:x(()=>[c(`p`,null,e(t.reason),1),c(`div`,E,[c(`button`,{class:`primary`,onClick:e=>b(h)(`/plugins/actions/${t.id}/approve`,{method:`POST`,body:`{}`}).then(X)},e(b(r)(`同意`)),9,D),c(`button`,{class:`ghost`,onClick:e=>b(h)(`/plugins/actions/${t.id}/reject`,{method:`POST`,body:`{}`}).then(X)},e(b(r)(`拒绝`)),9,O)])]),_:2},1032,[`title`]))),128))])):(f(),a(`section`,k,[y(S,{title:b(r)(`从链接导入`)},{default:x(()=>[y(C,{label:b(r)(`插件包地址`)},{default:x(()=>[d(c(`input`,{"onUpdate:modelValue":o[1]||=e=>W.value.url=e},null,512),[[n,W.value.url]])]),_:1},8,[`label`]),y(C,{label:b(r)(`校验值,可留空`)},{default:x(()=>[d(c(`input`,{"onUpdate:modelValue":o[2]||=e=>W.value.sha256=e},null,512),[[n,W.value.sha256]])]),_:1},8,[`label`]),c(`button`,{class:`primary`,onClick:o[3]||=e=>Q(`/plugins/import/url`,W.value)},e(b(r)(`检查这个包`)),1)]),_:1},8,[`title`]),y(S,{title:b(r)(`从 GitHub 导入`)},{default:x(()=>[y(C,{label:b(r)(`仓库地址`)},{default:x(()=>[d(c(`input`,{"onUpdate:modelValue":o[4]||=e=>G.value=e,placeholder:`https://github.com/owner/name`},null,512),[[n,G.value]])]),_:1},8,[`label`]),c(`button`,{class:`primary`,onClick:o[5]||=e=>Q(`/plugins/import/github`,{repository:G.value})},e(b(r)(`检查这个仓库`)),1)]),_:1},8,[`title`]),y(S,{title:b(r)(`本机目录(开发)`)},{default:x(()=>[y(C,{label:b(r)(`目录`)},{default:x(()=>[d(c(`input`,{"onUpdate:modelValue":o[6]||=e=>K.value=e},null,512),[[n,K.value]])]),_:1},8,[`label`]),c(`button`,{class:`ghost`,onClick:o[7]||=e=>Q(`/plugins/import/dir`,{dir:K.value})},e(b(r)(`按开发插件接上`)),1)]),_:1},8,[`title`]),y(S,{title:b(r)(`索引源`)},{default:x(()=>[y(C,{label:b(r)(`索引地址`)},{default:x(()=>[d(c(`input`,{"onUpdate:modelValue":o[8]||=e=>q.value=e},null,512),[[n,q.value]])]),_:1},8,[`label`]),c(`button`,{class:`ghost`,onClick:o[9]||=e=>b(h)(`/plugins/sources`,{method:`POST`,body:JSON.stringify({url:q.value})})},e(b(r)(`添加索引`)),1)]),_:1},8,[`title`])])),H.value?(f(),s(S,{key:5,title:b(r)(`先看清它要什么`)},{default:x(()=>[c(`p`,null,e(H.value.manifest?.name)+` `+e(H.value.manifest?.version)+` · `+e(H.value.trusted?b(r)(`校验通过`):b(r)(`未登记来源`)),1),c(`ul`,null,[(f(!0),a(t,null,m(H.value.permissions,t=>(f(),a(`li`,{key:t},e(t),1))),128))]),c(`button`,{class:`primary`,onClick:ke},e(b(r)(`同意这些权限并安装`)),1)]),_:1},8,[`title`])):l(``,!0),y(se,{open:!!Y.value,title:Y.value?.manifest.name||``,onClose:o[13]||=e=>V.value=``},{default:x(()=>[Y.value?(f(),a(t,{key:0},[c(`p`,null,e(Y.value.manifest.description),1),c(`ul`,null,[(f(!0),a(t,null,m(Y.value.risk,t=>(f(),a(`li`,{key:t.name},e(Ae(t.risk))+` · `+e(t.label),1))),128))]),c(`form`,{class:`settings`,onSubmit:o[11]||=ee(e=>De().catch(e=>B.value.value=e.message),[`prevent`])},[(f(!0),a(t,null,m(Y.value.manifest.settings||[],i=>(f(),a(t,{key:i.key},[i.type===`boolean`?(f(),a(`label`,A,[c(`span`,null,e(i.label),1),d(c(`input`,{"onUpdate:modelValue":e=>U.value[i.key]=e,type:`checkbox`},null,8,j),[[ae,U.value[i.key]]])])):(f(),s(C,{key:1,label:i.label},{default:x(()=>[i.type===`secret`?d((f(),a(`input`,{key:0,type:`password`,"onUpdate:modelValue":e=>U.value[i.key]=e,placeholder:b(r)(`已保存的不会回显`)},null,8,M)),[[n,U.value[i.key]]]):i.type===`textarea`||i.type===`urls`?d((f(),a(`textarea`,{key:1,"onUpdate:modelValue":e=>U.value[i.key]=e,rows:`4`,placeholder:i.type===`urls`?b(r)(`一行一个地址`):void 0},null,8,Se)),[[n,U.value[i.key]]]):d((f(),a(`input`,{key:2,"onUpdate:modelValue":e=>U.value[i.key]=e},null,8,Ce)),[[n,U.value[i.key]]])]),_:2},1032,[`label`]))],64))),128)),c(`div`,we,[c(`button`,Te,e(b(r)(`保存设置`)),1),Y.value.enabled?l(``,!0):(f(),a(`button`,{key:0,class:`primary`,type:`button`,onClick:o[10]||=e=>Oe(Y.value)},e(b(r)(`同意这些权限并启用`)),1))])],32),Y.value.enabled&&Y.value.manifest.contributes?.page?(f(),a(`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,N)):l(``,!0),Y.value.source===`builtin`?l(``,!0):(f(),a(`div`,Ee,[c(`button`,{class:`ghost`,onClick:o[12]||=e=>{b(h)(`/plugins/${Y.value.id}`,{method:`DELETE`,body:`{}`}).then(()=>{V.value=``,X()})}},e(b(r)(`卸载`)),1)]))],64)):l(``,!0)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-042ad318`]]);export{P as default};
|