luckytri 1.0.8 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +1 -1
- package/README.md +1 -1
- package/docs/en/CHANGELOG.md +44 -24
- package/docs/en/architecture.md +4 -0
- package/docs/en/cognition.md +34 -0
- package/docs/en/guide.md +8 -6
- package/docs/zh/CHANGELOG.md +44 -24
- package/docs/zh/architecture.md +4 -0
- package/docs/zh/cognition.md +34 -0
- package/docs/zh/guide.md +8 -6
- package/package.json +112 -112
- package/public/app/assets/ChatsPage-DH4ZPRXB.js +3 -0
- package/public/app/assets/{Empty-C7yzOBzy.js → Empty-DRsHeX-L.js} +1 -1
- package/public/app/assets/Field-BfIUcaNa.js +1 -0
- package/public/app/assets/HeartPage-BxgSUJJ_.js +1 -0
- package/public/app/assets/LifePage-CAKr8h_q.js +1 -0
- package/public/app/assets/MemoryPage-CFq8L_TC.js +1 -0
- package/public/app/assets/NaturePage-BU1iDno3.js +3 -0
- package/public/app/assets/PeoplePage-C6i_nAfr.js +1 -0
- package/public/app/assets/PluginsPage-DRV8lzk3.js +2 -0
- package/public/app/assets/SystemPage-21AlQBiC.js +1 -0
- package/public/app/assets/SystemPage-CMcuUdLm.css +1 -0
- package/public/app/assets/TimePage-DUzjLnZV.js +3 -0
- package/public/app/assets/index-WAvrlAcO.js +4 -0
- package/public/app/assets/{knowledge-BJOIyuJo.js → knowledge-V_blbx9R.js} +1 -1
- package/public/app/assets/media-C7j5HqxK.js +1 -0
- package/public/app/assets/{mind-DtTVrW6Z.js → mind-BBAstMqH.js} +1 -1
- package/public/app/index.html +3 -3
- package/public/guide.en.html +13 -5
- package/public/guide.html +12 -5
- package/public/tutorial.en.md +3 -1
- package/public/tutorial.md +3 -1
- package/server/core/backoff.js +123 -0
- package/server/core/context-builder.js +307 -288
- package/server/core/contribution-check.js +50 -0
- package/server/core/conversation-cues.js +377 -385
- package/server/core/conversation-grounding.js +547 -304
- package/server/core/dialogue-context.js +247 -244
- package/server/core/dialogue-contract.js +33 -9
- package/server/core/embedding.js +246 -0
- package/server/core/expression-strategy.js +90 -0
- package/server/core/initiative-context.js +88 -68
- package/server/core/model-json.js +223 -190
- package/server/core/model-manager.js +256 -56
- package/server/core/model-presets.js +1045 -900
- package/server/core/orchestrator.js +41 -3
- package/server/core/persona-manager.js +364 -359
- package/server/core/reader-check.js +166 -62
- package/server/core/reply-delivery.js +688 -537
- package/server/core/repository.js +36 -0
- package/server/core/response-generator.js +101 -92
- package/server/core/response-validator.js +18 -3
- package/server/core/retired-prompts.js +53 -51
- package/server/core/time-expressions.js +143 -0
- package/server/core/turn-processor.js +175 -5
- package/server/core/turn.js +299 -44
- package/server/core/understanding.js +85 -0
- package/server/core/working-memory.js +149 -0
- package/server/i18n/decisions.js +225 -209
- package/server/i18n/errors.js +14 -0
- package/server/i18n/models.js +120 -111
- package/server/knowledge/api.js +362 -342
- package/server/knowledge/embedding-profile.js +158 -114
- package/server/knowledge/manager.js +6 -1
- package/server/mind/api.js +68 -0
- package/server/mind/continuity.js +634 -562
- package/server/mind/day-planner.js +52 -3
- package/server/mind/episodes.js +242 -0
- package/server/mind/expression-grounding.js +24 -21
- package/server/mind/index.js +13 -2
- package/server/mind/initiative.js +356 -338
- package/server/mind/life/index.js +6 -0
- package/server/mind/meetings.js +1112 -1069
- package/server/mind/memory.js +1091 -888
- package/server/mind/recall/index.js +776 -0
- package/server/mind/recall/schema.js +132 -0
- package/server/mind/recall/sources.js +220 -0
- package/server/mind/recall/store.js +368 -0
- package/server/mind/salience.js +202 -201
- package/server/mind/schema.js +568 -567
- package/server/mind/self.js +537 -496
- package/server/mind/time/activity-recall.js +65 -0
- package/server/mind/time/index.js +6 -2
- package/server/mind/time/tasks.js +36 -10
- package/server/mind/time/works.js +528 -527
- package/server/mind/view.js +63 -17
- package/server/storage/archive.js +1 -1
- package/public/app/assets/ChatsPage-CshdtTzV.js +0 -3
- package/public/app/assets/Field-BjFv4Rfn.js +0 -1
- package/public/app/assets/HeartPage-eqo6ru16.js +0 -1
- package/public/app/assets/LifePage-CN8GE5NK.js +0 -1
- package/public/app/assets/MemoryPage-CCpMN4Wg.js +0 -1
- package/public/app/assets/NaturePage-C0JqdBTR.js +0 -3
- package/public/app/assets/PeoplePage-BXGBbO4u.js +0 -1
- package/public/app/assets/PluginsPage-Dksp5AV5.js +0 -2
- package/public/app/assets/SystemPage-BenIyTvk.css +0 -1
- package/public/app/assets/SystemPage-Cd7aa8eE.js +0 -1
- package/public/app/assets/TimePage-Bs_zImb4.js +0 -3
- package/public/app/assets/index-CyRtYxP3.js +0 -4
- package/public/app/assets/media-Bwtx8blz.js +0 -1
|
@@ -0,0 +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-DRsHeX-L.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};
|
|
@@ -0,0 +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-DRsHeX-L.js";import{_ as M,c as N,d as P,g as F,h as ne,u as I,v as L}from"./mind-BBAstMqH.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-WAvrlAcO.js";import{t as se}from"./media-C7j5HqxK.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};
|
|
@@ -0,0 +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-DRsHeX-L.js";import{g as A,m as j,n as M,p as N,t as P,v as F}from"./mind-BBAstMqH.js";import{_ as I,a as L,b as R,d as z,m as B,n as V,t as H}from"./index-WAvrlAcO.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};
|
|
@@ -0,0 +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-DRsHeX-L.js";import{g as ne,l as j,s as M}from"./mind-BBAstMqH.js";import{c as N,f as P,g as F,h as re,n as I,o as ie}from"./index-WAvrlAcO.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-V_blbx9R.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};
|
|
@@ -0,0 +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-DRsHeX-L.js";import{g as P,v as F}from"./mind-BBAstMqH.js";import{c as I,i as ee,s as te,v as ne,x as re}from"./index-WAvrlAcO.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
|
+
`),bottomLines:e.nature.bottomLines.join(`
|
|
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};
|
|
@@ -0,0 +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-DRsHeX-L.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-BBAstMqH.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-WAvrlAcO.js";import{l as ae}from"./knowledge-V_blbx9R.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};
|
|
@@ -0,0 +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-DRsHeX-L.js";import{i as S,n as oe,o as se}from"./index-WAvrlAcO.js";import{t as C}from"./Field-BfIUcaNa.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
|
+
`):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};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Dt as e,E as t,Et as n,G as r,H as i,I as a,J as o,M as s,N as c,P as l,Q as u,S as d,St as f,T as p,Tt as m,V as h,W as g,X as _,Y as v,Z as y,_t as b,a as x,b as S,bt as C,dt as w,et as T,f as E,ft as D,gt as O,h as k,i as A,it as j,j as M,lt as N,m as P,n as F,o as I,p as L,pt as R,rt as z,s as B,st as V,t as ee,tt as H,ut as U,v as W,w as G,wt as K,xt as te,yt as q,z as J}from"./Empty-DRsHeX-L.js";import{v as ne}from"./mind-BBAstMqH.js";import{c as Y,f as re,l as X,n as ie,o as ae}from"./index-WAvrlAcO.js";var oe={class:`connect`},Z={class:`card connection`},Q={class:`card-head`},se={class:`eyebrow`},ce={class:`pill`},le={key:0,class:`notice`,role:`note`},ue={class:`muted`},de={class:`connection-details`},fe={class:`detail`},pe={class:`instructions`},me={class:`muted`},$={class:`muted note`},he={key:0,class:`row`},ge=[`disabled`],_e={class:`muted`},ve=[`disabled`,`placeholder`],ye={key:0,class:`faint`},be=[`disabled`,`placeholder`],xe={key:0,class:`faint`},Se={class:`row`},Ce=[`disabled`],we={key:0,class:`faint`},Te={key:0,class:`connection-details`},Ee={class:`detail`},De={"data-state":``},Oe={key:0,class:`detail`},ke={class:`warn-text`},Ae={key:1,class:`detail`},je={class:`detail`},Me={class:`detail`},Ne={key:1,class:`notice`,role:`note`},Pe={class:`instructions`},Fe={class:`muted notes`},Ie={class:`card checklist`},Le={class:`card-head`},Re={class:`eyebrow`},ze={class:`chip`},Be={class:`checks`},Ve={class:`mark`,"aria-hidden":`true`},He={class:`muted`},Ue=[`data-fix`,`onClick`],We=F(z({__name:`ConnectQQ`,emits:[`open`],setup(n,{emit:s}){let c=s,d=o(()=>B.health.connection||{}),p=o(()=>d.value.channel===`qqbot`?`qqbot`:`onebot`),h=o(()=>!!d.value.locked),_=o(()=>!!d.value.online);o(()=>d.value.onebot||{});let S=o(()=>d.value.qqbot||{}),E=o(()=>String(B.health.settings.qqbotAppId||``)),O=o(()=>!!B.health.settings.hasQqbotSecret),k=f(p.value);b(p,e=>k.value=e);let j=o(()=>`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/onebot/v11/ws`),N=o(()=>[{key:`onebot`,label:a(`OneBot 11`),count:p.value===`onebot`?a(`使用中`):``},{key:`qqbot`,label:a(`QQ 官方机器人`),count:p.value===`qqbot`?a(`使用中`):``}]),F=te({appId:E.value,secret:``}),I=f(!1),L=o(()=>F.appId.trim()!==E.value||!!F.secret.trim());b(L,e=>{B.dirty=e}),b(E,e=>{L.value||(F.appId=e)}),U(()=>{B.dirty=!1});let R=o(()=>!!F.appId.trim()&&(O.value||!!F.secret.trim())),z=l({idle:M(`未启用`),unconfigured:M(`尚未填写 AppID 与 AppSecret`),connecting:M(`正在连接开放平台`),ready:M(`已连接`),closed:M(`连接已断开,正在重连`),error:M(`连接出错`)}),V=l({all:M(`全部群消息`),mentions:M(`只有 @ 她的消息`),unknown:M(`尚未收到群消息`)}),ee=o(()=>z[S.value.state||`idle`]??z.idle),G=o(()=>V[S.value.groupMessages||`unknown`]??V.unknown),q=o(()=>p.value===`qqbot`&&S.value.groupMessages===`mentions`);async function J(e){if(I.value||h.value||e===p.value)return;let n=a(e===`qqbot`?`QQ 官方机器人`:`OneBot 11`);if(!_.value||await t(a(`切换后会断开当前连接。原来方式下的会话仍可查看,但不能再向它们发送消息。`),{title:a(`切换连接方式`),confirmText:a(`切换`),cancelText:a(`先不切换`)})){I.value=!0;try{await P(`/settings`,`PATCH`,{channel:e}),await x(),W(a(`已切换为 {name}`,{name:n}))}catch(e){W(e.message,!0)}finally{I.value=!1}}}async function ne(){if(!I.value){if(!R.value){W(a(`请填写 AppID 和 AppSecret`),!0);return}I.value=!0;try{let e={qqbotAppId:F.appId.trim()};F.secret.trim()&&(e.qqbotSecret=F.secret.trim()),p.value!==`qqbot`&&!h.value&&(e.channel=`qqbot`),await P(`/settings`,`PATCH`,e),F.secret=``,await x(),W(a(`已保存`))}catch(e){W(e.message,!0)}finally{I.value=!1}}}let Y={token:[``,`connect`],credentials:[``,`connect`],qq:[``,`connect`],model:[``,`models`],mode:[``,`runtime`],session:[`chats`,``],persona:[`nature`,``]};function re(e){let[t,n]=Y[e]||[``,`connect`];t?A(t):c(`open`,n)}return(t,n)=>(w(),u(`div`,oe,[v(`section`,Z,[v(`div`,Q,[v(`div`,null,[v(`span`,se,e(K(a)(`QQ`)),1),v(`h2`,null,e(K(a)(`连接 QQ`)),1),v(`p`,null,e(K(a)(`两种连接方式二选一,同一时间只使用一种。她的记忆、心情和行为完全一致,区别只在消息怎么到达。`)),1)]),v(`span`,ce,[v(`span`,{class:m([`dot`,{off:!_.value}])},null,2),T(` `+e(_.value?K(a)(`QQ 已连接`):K(a)(`等待连接`)),1)])]),H(ie,{modelValue:k.value,"onUpdate:modelValue":n[0]||=e=>k.value=e,label:K(a)(`连接方式`),items:N.value},null,8,[`modelValue`,`label`,`items`]),h.value?(w(),u(`p`,le,e(K(a)(`连接方式由环境变量 LUCKYTRI_CHANNEL 指定,在这里不能更改。去掉该变量后即可在此选择。`)),1)):y(``,!0),k.value===`onebot`?(w(),u(r,{key:1},[v(`p`,ue,e(K(a)(`自备接入端,通过反向 WebSocket 连接。能看到全部群消息。`)),1),v(`div`,de,[v(`div`,fe,[v(`span`,null,e(K(a)(`反向 WebSocket 地址`)),1),v(`code`,null,e(j.value),1)])]),v(`ol`,pe,[v(`li`,null,e(K(a)(`同一台电脑上的接入端无需单独配置连接令牌。`)),1),v(`li`,null,e(K(a)(`在接入端启用反向 WebSocket 客户端,填写上方地址,消息格式选择数组。已有的地址配置可以继续使用。`)),1),v(`li`,null,e(K(a)(`在接入端完成 QQ 登录。连接成功后,本页状态会更新;新会话仍需在「对话」中开启参与。`)),1)]),v(`p`,me,e(K(a)(`远程接入时,连接密码使用管理密码;已有的远程连接令牌仍兼容。`)),1),v(`p`,$,e(K(a)(`LuckyTri 只负责接收,不提供、不安装也不管理接入端。`)),1),p.value===`onebot`?y(``,!0):(w(),u(`div`,he,[v(`button`,{class:`primary`,"data-use":`onebot`,disabled:I.value||h.value,onClick:n[1]||=e=>J(`onebot`)},e(K(a)(`改用这种方式`)),9,ge)]))],64)):(w(),u(r,{key:2},[v(`p`,_e,e(K(a)(`只需 AppID 与 AppSecret,无需额外软件。群里默认只收到 @ 她的消息。`)),1),v(`form`,{class:`stack tight`,onSubmit:g(ne,[`prevent`])},[v(`label`,null,[T(e(K(a)(`AppID`))+` `,1),C(v(`input`,{"onUpdate:modelValue":n[2]||=e=>F.appId=e,name:`qqbotAppId`,autocomplete:`off`,inputmode:`numeric`,maxlength:`40`,disabled:I.value||S.value.appIdFromEnv,placeholder:K(a)(`机器人的 AppID`)},null,8,ve),[[i,F.appId]]),S.value.appIdFromEnv?(w(),u(`small`,ye,e(K(a)(`由环境变量指定,在这里不能修改`)),1)):y(``,!0)]),v(`label`,null,[T(e(K(a)(`AppSecret`))+` `,1),C(v(`input`,{"onUpdate:modelValue":n[3]||=e=>F.secret=e,name:`qqbotSecret`,type:`password`,autocomplete:`new-password`,maxlength:`200`,disabled:I.value||S.value.secretFromEnv,placeholder:O.value||S.value.secretFromEnv?K(a)(`已保存,留空保留`):K(a)(`机器人的 AppSecret`)},null,8,be),[[i,F.secret]]),S.value.secretFromEnv?(w(),u(`small`,xe,e(K(a)(`由环境变量指定,在这里不能修改`)),1)):y(``,!0)]),v(`div`,Se,[v(`button`,{class:`primary`,"data-save":`qqbot`,disabled:I.value||S.value.appIdFromEnv&&S.value.secretFromEnv},e(p.value===`qqbot`||h.value?K(a)(`保存`):K(a)(`保存并使用`)),9,Ce),L.value?(w(),u(`span`,we,e(K(a)(`有尚未保存的修改`)),1)):y(``,!0)])],32),p.value===`qqbot`?(w(),u(`div`,Te,[v(`div`,Ee,[v(`span`,null,e(K(a)(`连接状态`)),1),v(`strong`,De,e(ee.value),1)]),S.value.error?(w(),u(`div`,Oe,[n[4]||=v(`span`,null,null,-1),v(`small`,ke,e(S.value.error),1)])):y(``,!0),S.value.botName?(w(),u(`div`,Ae,[v(`span`,null,e(K(a)(`机器人`)),1),v(`strong`,null,e(S.value.botName),1)])):y(``,!0),v(`div`,je,[v(`span`,null,e(K(a)(`最近收到消息`)),1),v(`strong`,null,e(S.value.lastEventAt?K(X)(S.value.lastEventAt):K(a)(`还没有`)),1)]),v(`div`,Me,[v(`span`,null,e(K(a)(`群消息范围`)),1),v(`strong`,null,e(G.value),1)])])):y(``,!0),q.value?(w(),u(`p`,Ne,e(K(a)(`目前只收到 @ 她的群消息。想让她看到群里的全部消息,请在开放平台的机器人设置里开启「接收所有消息」。`)),1)):y(``,!0),v(`ol`,Pe,[v(`li`,null,e(K(a)(`在 QQ 开放平台创建机器人,取得 AppID 与 AppSecret。`)),1),v(`li`,null,e(K(a)(`把运行 LuckyTri 的这台机器的出口 IP 加入机器人的 IP 白名单。`)),1),v(`li`,null,e(K(a)(`可选:开启「接收所有消息」,她才能看到群里没有 @ 她的话;不开启时只会收到 @ 她的消息。`)),1),v(`li`,null,e(K(a)(`填写上方的 AppID 与 AppSecret 并保存。状态变为「已连接」后,在群里 @ 她或私聊她,新会话会出现在「对话」中。`)),1)]),v(`ul`,Fe,[v(`li`,null,e(K(a)(`官方平台不提供群名称:新会话以占位名出现,可以在「对话」中为它改名。`)),1),v(`li`,null,e(K(a)(`官方平台上,同一个人在不同的群里标识不同。像只在不同的房间见过对方一样,平台给出统一身份之前,她不会把两处的人当成同一个人。`)),1),v(`li`,null,e(K(a)(`对方关闭了机器人的主动消息时,她不会去打扰,会等对方来找她。`)),1)])],64))]),v(`section`,Ie,[v(`div`,Le,[v(`div`,null,[v(`span`,Re,e(K(a)(`就绪检查`)),1),v(`h2`,null,e(K(a)(`还差哪一步`)),1)]),v(`span`,ze,e(K(B).health.readiness?.completed??0)+` / `+e(K(B).health.readiness?.total??0),1)]),v(`ol`,Be,[(w(!0),u(r,null,D(K(B).health.readiness?.checks||[],t=>(w(),u(`li`,{key:t.id,class:m({done:t.done})},[v(`span`,Ve,e(t.done?`✓`:``),1),v(`div`,null,[v(`b`,null,e(t.name),1),v(`small`,He,e(t.detail),1)]),v(`button`,{class:`small`,"data-fix":t.id,onClick:e=>re(t.id)},e(t.done?K(a)(`查看`):K(a)(`去处理`)),9,Ue)],2))),128))])])]))}}),[[`__scopeId`,`data-v-6f4553ed`]]);async function Ge(e){return P(`/core/models`,`PUT`,{models:e})}async function Ke(e){return P(`/core/models/`+encodeURIComponent(e),`DELETE`,{})}async function qe(e){return P(`/model/test`,`POST`,{modelId:e})}var Je={class:`card embedding-profile`,"aria-labelledby":`embedding-title`},Ye={id:`embedding-title`},Xe={class:`muted`},Ze={key:0,class:`faint`},Qe={class:`check`},$e={class:`fields`},et=[`placeholder`],tt={class:`fields`},nt={value:`openai`},rt={value:`multimodal`},it={class:`save-bar`},at=[`disabled`],ot=[`disabled`],st={class:`faint`},ct={key:2,role:`status`},lt=F(z({__name:`EmbeddingProfile`,setup(t){let n=te({enabled:!1,label:a(`知识向量`),baseUrl:``,model:``,apiKey:``,dimensions:1024,batchSize:10,timeoutMs:9e4,protocol:`openai`}),r=f(!1),o=f(!1),s=f(!1),c=f(``);async function l(){try{Object.assign(n,await P(`/core/knowledge/embedding`),{apiKey:``}),s.value=!0}catch(e){c.value=e.message}}async function d(){r.value=!0;try{Object.assign(n,await P(`/core/knowledge/embedding`,`PATCH`,n),{apiKey:``}),o.value=!1,W(a(`知识向量模型已保存`))}catch(e){W(e.message,!0)}finally{r.value=!1}}async function p(){r.value=!0;try{let e=await P(`/core/knowledge/embedding/test`,`POST`,{});c.value=a(`连接成功,向量维度 {dimensions}`,{dimensions:e.dimensions})}catch(e){c.value=e.message}finally{r.value=!1}}return N(l),(t,l)=>(w(),u(`section`,Je,[v(`h2`,Ye,e(K(a)(`知识向量模型`)),1),v(`p`,Xe,e(K(a)(`只需要填写向量服务的密钥。地址、模型和维度会按对话服务自动选择。不启用或没有密钥时,对话和关键词回忆照常进行,只是没有按意思检索。`)),1),s.value&&!n.configured?(w(),u(`p`,Ze,e(K(a)(`当前兼容旧配置,跟随默认模型。保存后改用独立配置。`)),1)):y(``,!0),s.value?(w(),u(`form`,{key:1,onSubmit:g(d,[`prevent`]),onInput:l[7]||=e=>o.value=!0,onChange:l[8]||=e=>o.value=!0},[v(`label`,Qe,[C(v(`input`,{"onUpdate:modelValue":l[0]||=e=>n.enabled=e,type:`checkbox`,name:`embeddingEnabled`},null,512),[[J,n.enabled]]),T(e(K(a)(`启用知识向量`)),1)]),v(`div`,$e,[v(`label`,null,[T(e(K(a)(`向量服务密钥`)),1),C(v(`input`,{"onUpdate:modelValue":l[1]||=e=>n.apiKey=e,name:`embeddingApiKey`,type:`password`,autocomplete:`new-password`,placeholder:n.hasApiKey?K(a)(`已保存,留空保留`):K(a)(`填写向量服务密钥`)},null,8,et),[[i,n.apiKey]])])]),v(`details`,null,[v(`summary`,null,e(K(a)(`自动选择的细节`)),1),v(`div`,tt,[v(`label`,null,[T(e(K(a)(`API 地址`)),1),C(v(`input`,{"onUpdate:modelValue":l[2]||=e=>n.baseUrl=e,name:`embeddingBaseUrl`,type:`url`,placeholder:`https://example.com/v1`},null,512),[[i,n.baseUrl]])]),v(`label`,null,[T(e(K(a)(`模型名称`)),1),C(v(`input`,{"onUpdate:modelValue":l[3]||=e=>n.model=e,name:`embeddingModelName`},null,512),[[i,n.model]])]),v(`label`,null,[T(e(K(a)(`向量维度(0 表示自动)`)),1),C(v(`input`,{"onUpdate:modelValue":l[4]||=e=>n.dimensions=e,name:`embeddingDimensions`,type:`number`,min:`0`,max:`65536`},null,512),[[i,n.dimensions,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`每批段落数`)),1),C(v(`input`,{"onUpdate:modelValue":l[5]||=e=>n.batchSize=e,name:`embeddingBatchSize`,type:`number`,min:`1`,max:`128`},null,512),[[i,n.batchSize,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`请求格式`)),1),C(v(`select`,{"onUpdate:modelValue":l[6]||=e=>n.protocol=e,name:`embeddingProtocol`},[v(`option`,nt,e(K(a)(`OpenAI 兼容(可批量)`)),1),v(`option`,rt,e(K(a)(`多模态接口(逐条)`)),1)],512),[[h,n.protocol]])])])]),v(`div`,it,[v(`button`,{class:`primary`,disabled:r.value},e(K(a)(`保存向量模型`)),9,at),v(`button`,{type:`button`,disabled:r.value||o.value||!n.enabled||!n.configured,onClick:p},e(K(a)(`测试向量连接`)),9,ot),v(`small`,st,e(o.value?K(a)(`有未保存的修改`):K(a)(`配置已载入`)),1)])],32)):y(``,!0),c.value?(w(),u(`p`,ct,e(c.value),1)):y(``,!0)]))}}),[[`__scopeId`,`data-v-81d1c15e`]]),ut={class:`card recall-panel`,"aria-labelledby":`recall-title`},dt={id:`recall-title`},ft={class:`muted`},pt={key:0,class:`stats`},mt={key:0,class:`pill strong`},ht={key:1,class:`pill`},gt={key:2,class:`pill warn`},_t={key:1,class:`waiting`},vt={key:2,class:`waiting`},yt={value:``,disabled:``},bt=[`value`],xt=[`placeholder`],St=[`disabled`],Ct={key:3,role:`status`},wt={key:4,class:`result`},Tt={class:`faint`},Et={class:`faint`},Dt={key:0,class:`faint`},Ot=F(z({__name:`RecallPanel`,setup(t){let n=f(null),s=f(``),c=o(()=>B.core?.sessions||[]),l=f(``),d=f(``),p=f(null),m=f(!1),_={fact:a(`事实`),episode:a(`情景`),meeting:a(`相遇`),self:a(`自我线索`),thought:a(`念头`),diary:a(`日记`),period:a(`回顾`),anticipation:a(`约定`),message:a(`原话`)},b={meaning:a(`意思相关`),words:a(`说到了`),person:a(`关于这个人`)},x=o(()=>{let e=n.value?.coverage;return e?.total?`${e.embedded||0} / ${e.total}`:``});async function S(){try{n.value=await P(`/mind/recall`),s.value=``}catch(e){s.value=e.message}}async function E(){if(l.value&&d.value.trim()){m.value=!0;try{p.value=await P(`/mind/recall/probe`,`POST`,{session:l.value,text:d.value}),s.value=``}catch(e){s.value=e.message}finally{m.value=!1}}}return N(S),(t,o)=>(w(),u(`section`,ut,[v(`h2`,dt,e(K(a)(`回忆索引`)),1),v(`p`,ft,e(K(a)(`她的事实、情景、自我线索和近一个月的原话都在同一个索引里,按意思、字词和相关的人一起检索。向量还没覆盖的部分先按字词找。`)),1),n.value?(w(),u(`div`,pt,[(w(!0),u(r,null,D(n.value.items,t=>(w(),u(`span`,{key:t.kind,class:`pill`},e(_[t.kind]||t.kind)+` `+e(t.n),1))),128)),x.value?(w(),u(`span`,mt,e(K(a)(`已有向量`))+` `+e(x.value),1)):y(``,!0),n.value.embedding?.latencyMs?(w(),u(`span`,ht,e(K(a)(`向量延迟`))+` `+e(n.value.embedding.latencyMs.p50)+` ms`,1)):y(``,!0),n.value.embedding?.lastError?(w(),u(`span`,gt,e(n.value.embedding.lastError),1)):y(``,!0)])):y(``,!0),n.value?.waiting?.length?(w(),u(`ul`,_t,[(w(!0),u(r,null,D(n.value.waiting,t=>(w(),u(`li`,{key:t.key},e(K(a)(`等待重试`))+` `+e(t.key)+` × `+e(t.failures)+`:`+e(t.lastError),1))),128))])):y(``,!0),n.value?.unavailableModels?.length?(w(),u(`ul`,vt,[(w(!0),u(r,null,D(n.value.unavailableModels,t=>(w(),u(`li`,{key:t.key},e(K(a)(`暂时停用的备用模型`))+` `+e(t.label)+`:`+e(t.reason),1))),128))])):y(``,!0),v(`form`,{class:`probe`,onSubmit:g(E,[`prevent`])},[C(v(`select`,{"onUpdate:modelValue":o[0]||=e=>l.value=e,name:`recallSession`,required:``},[v(`option`,yt,e(K(a)(`选择会话`)),1),(w(!0),u(r,null,D(c.value,t=>(w(),u(`option`,{key:t.id,value:t.id},e(t.name||t.id),9,bt))),128))],512),[[h,l.value]]),C(v(`input`,{"onUpdate:modelValue":o[1]||=e=>d.value=e,name:`recallText`,maxlength:`500`,placeholder:K(a)(`输入一句话,看她会想起什么`)},null,8,xt),[[i,d.value]]),v(`button`,{disabled:m.value||!l.value||!d.value.trim()},e(K(a)(`试试回忆`)),9,St)],32),s.value?(w(),u(`p`,Ct,e(s.value),1)):y(``,!0),p.value?(w(),u(`div`,wt,[v(`p`,Tt,e(p.value.mode===`hybrid`?K(a)(`意思与字词一起`):K(a)(`仅字词`))+` · `+e(K(a)(`候选`))+` `+e(p.value.candidates),1),v(`ol`,null,[(w(!0),u(r,null,D(p.value.items,t=>(w(),u(`li`,{key:t.id},[v(`strong`,null,e(_[t.kind]||t.kind),1),T(` `+e(t.text)+` `,1),v(`small`,Et,[T(e(b[t.why])+` `,1),t.standsOut===null?y(``,!0):(w(),u(r,{key:0},[T(` · `+e(K(a)(`突出度`))+` `+e(t.standsOut),1)],64)),T(` · `+e(K(a)(`共有字词`))+` `+e(t.sharedWords),1)])]))),128))]),p.value.items.length?y(``,!0):(w(),u(`p`,Dt,e(K(a)(`没有想起什么`)),1))])):y(``,!0)]))}}),[[`__scopeId`,`data-v-cdde3f37`]]),kt={class:`library`},At={class:`model-workspace`},jt={class:`card shelf`},Mt={class:`shelf-head`},Nt={class:`faint`},Pt={class:`rows`},Ft={key:0,class:`muted`},It=[`open`,`data-saved-vendor`,`onToggle`],Lt={class:`vendor-models`},Rt=[`onClick`],zt={class:`who`},Bt={key:0,class:`card detail`},Vt={class:`card-head`},Ht={class:`eyebrow`},Ut=[`data-tone`],Wt={class:`form-grid`},Gt={key:0},Kt=[`placeholder`],qt={class:`wide`},Jt=[`placeholder`],Yt={class:`faint`},Xt={class:`form-grid`},Zt={key:0},Qt={key:1},$t={class:`advanced`},en={class:`form-grid`},tn=[`placeholder`],nn={class:`faint`},rn={class:`caps`},an=[`onUpdate:modelValue`,`name`],on={key:0,id:`modelTestResult`,class:`notice`,role:`status`},sn={class:`actions`},cn=[`disabled`],ln={class:`faint`},un={key:0,class:`check`},dn=[`checked`],fn=[`disabled`],pn={key:1,class:`card detail`},mn={class:`card usage-panel`,"aria-labelledby":`token-usage-title`},hn={class:`usage-intro`},gn={class:`eyebrow`},_n={id:`token-usage-title`},vn={class:`usage-total`},yn={class:`usage-detail`},bn={class:`usage-stat`},xn={class:`usage-stat`},Sn={class:`usage-stat cache-stat`},Cn={class:`usage-stat`},wn={class:`usage-foot`},Tn={key:0},En={key:1,class:`usage-error`},Dn={key:2},On=[`disabled`],kn={class:`model-picker`},An={class:`muted`},jn={class:`catalog-search`},Mn=[`placeholder`],Nn=[`data-vendor`],Pn={class:`vendor-summary`},Fn={class:`vendor-name`},In={class:`presets`},Ln=[`data-preset`,`onClick`],Rn={key:0,class:`muted search-empty`},zn=F(z({__name:`ModelLibrary`,setup(c){let l=o(()=>B.health?.modelCatalog||[]),d=o(()=>B.health?.effortLabels||{none:a(`关闭`),minimal:a(`极低`),low:a(`低`),medium:a(`中`),high:a(`高`),xhigh:a(`极高`),max:a(`最深`)}),p=f(B.core.models.map(e=>({...e}))),h=f(p.value.length?0:-1),_=f(p.value.length?Q(p.value[0]):``),S=f(!1),E=f(!1),O=f(!1),k=f(``),A=f(``),j=f(null),M=f(!1),F=f(``),I=te(Z());p.value[0]&&Object.assign(I,p.value[0],{apiKey:``});let L=o(()=>h.value>=0&&!!I.id),R=o(()=>{let e=[];for(let t of l.value){if(t.id===`custom`)continue;let n=e.find(e=>e.vendor===t.vendor);n||(n={vendor:t.vendor,models:[]},e.push(n)),n.models.push(t)}return e}),z=o(()=>{let e=k.value.trim().toLocaleLowerCase();return e?R.value.map(t=>({...t,models:t.models.filter(n=>[t.vendor,n.label,n.model,n.summary].filter(Boolean).join(` `).toLocaleLowerCase().includes(e))})).filter(e=>e.models.length):R.value}),V=o(()=>{let e=[];return p.value.forEach((t,n)=>{let r=Q(t),i=e.find(e=>e.vendor===r);i||(i={vendor:r,models:[]},e.push(i)),i.models.push({model:t,index:n})}),e}),U=o(()=>l.value.find(e=>e.id===`custom`)),G=o(()=>l.value.filter(e=>e.vendor&&e.vendor===I.vendor)),ne=o(()=>l.value.find(e=>e.id===I.presetId)||l.value.find(e=>e.model&&e.model===I.model&&e.baseUrl===I.baseUrl)),X=o(()=>{let e=ne.value?.contextWindows||[];if(e.length<2)return[];let t=Number(I.contextWindow);return e.some(e=>e.contextWindow===t)?e:[...e,{label:a(`已保存 {value}`,{value:fe(t)}),contextWindow:t,maxInputTokens:Number(I.maxInputTokens),maxOutputTokens:Number(I.maxOutputTokens)}]}),ie=o(()=>{let e=Array.isArray(I.reasoningEfforts)&&I.reasoningEfforts.length?[...I.reasoningEfforts]:[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];return I.reasoningEffort&&!e.includes(I.reasoningEffort)&&e.unshift(I.reasoningEffort),e}),oe=o(()=>B.core.models.some(e=>e.id===I.id));function Z(){return{id:``,presetId:``,label:``,provider:``,vendor:``,baseUrl:``,model:``,apiKey:``,hasApiKey:!1,contextWindow:128e3,maxInputTokens:119808,maxOutputTokens:8192,vision:!1,system:!0,json:!0,tools:!1,embedding:!1,embeddingModel:``,reasoningEffort:`none`,reasoningEfforts:[`none`,`low`,`medium`,`high`],thinkingStyle:`openai`,tokenField:`max_tokens`,omitSampling:!1,temperature:.85,topP:1,timeoutMs:9e4,isDefault:!1,enabled:!0}}function Q(e){let t={"volcengine-coding-plan":a(`火山方舟 Coding Plan`),"opencode-go":`OpenCode Go`,"opencode-zen":`OpenCode Zen`,deepseek:`DeepSeek`,openai:`OpenAI`,bedrock:a(`亚马逊 Bedrock`),qwen:a(`通义千问`),moonshot:`Kimi`,kimi:`Kimi`,zhipu:a(`智谱 GLM`),glm:a(`智谱 GLM`),mimo:a(`小米 MiMo`),siliconflow:`SiliconFlow`,openrouter:`OpenRouter`};return String(e?.vendor||``).trim()||t[String(e?.provider||``).toLowerCase()]||String(e?.provider||a(`自定义供应商`))}function se(e,t){let n=t.currentTarget;_.value=n.open?e:``}function ce(e){let{summary:t,contextWindows:n,...r}=e;return{...r,presetId:e.id}}function le(e){let{contextWindows:t,...n}=e;return n}function ue(e){let t=Number(e.contextWindow),n=Number(e.maxOutputTokens),r=Number(e.maxInputTokens);return(!Number.isFinite(t)||t<2)&&(t=2),(!Number.isFinite(n)||n<1)&&(n=1),n>=t&&(n=t-1),(!Number.isFinite(r)||r<1)&&(r=t-n),r+n>t&&(r=t-n),{contextWindow:t,maxInputTokens:r,maxOutputTokens:n}}function de(e){let t=Number(e.target.value),n=X.value.find(e=>e.contextWindow===t);n&&(I.contextWindow=n.contextWindow,I.maxInputTokens=n.maxInputTokens,I.maxOutputTokens=n.maxOutputTokens,B.dirty=!0)}function fe(e){let t=Number(e)||0;return t>=1e6?(t%1048576==0?t/1048576:Number((t/1e6).toFixed(2)))+`M`:t>=1e3?(t%1e3==0?t/1e3:t%1024==0?t/1024:Math.round(t/1e3))+`K`:String(t)}function pe(e){if(e.id===`openrouter`)return a(`按所选模型填写上下文和输出参数`);if(!e.model)return a(`填写模型 ID 和对应参数`);let t=e.contextWindows||[],n=t.length?t.map(e=>e.label).join(` / `):fe(e.contextWindow);return a(`上下文 {context} · 输出 {v}`,{context:n,v:fe(e.maxOutputTokens)})}function me(e){return[`mimo`,`qwen`,`kimi-toggle`].includes(I.thinkingStyle)?a(e===`none`?`关闭`:`开启`):`${d.value[e]||e} / ${e}`}function $(e){return new Intl.NumberFormat(s()).format(Number(e)||0)}async function he(){if(!M.value){M.value=!0;try{j.value=await P(`/core/usage`),F.value=``}catch(e){F.value=e.message}finally{M.value=!1}}}N(()=>void he()),b(()=>B.tick,()=>void he());async function ge(){return B.dirty?await t(a(`放弃当前模型草稿?`),{title:a(`草稿还没保存`),confirmText:a(`放弃`),cancelText:a(`留下`)})?(B.dirty=!1,!0):!1:!0}async function _e(e){let t=p.value[e];t&&t.id!==I.id&&await ge()&&(p.value=p.value.filter(e=>e.id===t.id||B.core.models.some(t=>t.id===e.id)),h.value=p.value.findIndex(e=>e.id===t.id),_.value=Q(t),Object.assign(I,Z(),t,{apiKey:``}),A.value=``)}async function ve(){if(!await ge())return;p.value=B.core.models.map(e=>({...e})),p.value.length?p.value.some(e=>e.id===I.id)||(h.value=0,Object.assign(I,Z(),p.value[0],{apiKey:``})):(h.value=-1,Object.assign(I,Z()));let e=p.value[h.value]||p.value[0];_.value=e?Q(e):``,k.value=``,O.value=!0}function ye(e){p.value=B.core.models.map(e=>({...e}));let t={...Z(),...ce(e),id:`model-`+Date.now(),apiKey:``,hasApiKey:!1,isDefault:p.value.length===0};p.value.push(t),h.value=p.value.length-1,_.value=Q(t),Object.assign(I,t),A.value=``,O.value=!1,B.dirty=!0}function be(e){let t=e.target.value,n=l.value.find(e=>e.id===t);if(!n)return;Object.assign(I,Z(),ce(n),{id:I.id,apiKey:I.apiKey,hasApiKey:I.hasApiKey,isDefault:I.isDefault});let r=p.value[h.value];r&&(r.label=I.label),B.dirty=!0}function xe(){for(let e of p.value)e.isDefault=e.id===I.id;I.isDefault=!0,B.dirty=!0}async function Se(){let e=ue(I),t=p.value.map((t,n)=>le(n===h.value?{...I,...e,isDefault:!!I.isDefault,enabled:I.isDefault?!0:I.enabled!==!1,timeoutMs:Number(I.timeoutMs),temperature:Number(I.temperature),topP:Number(I.topP)}:{...t,isDefault:!!t.isDefault&&t.id!==I.id}));if(!t.some(e=>e.isDefault)&&t.length&&(t[0].isDefault=!0),!S.value){S.value=!0;try{await Ge(t),B.dirty=!1,await x(),p.value=B.core.models.map(e=>({...e})),Object.assign(I,Z(),p.value[h.value],{apiKey:``}),W(a(`已保存并应用`))}catch(e){W(e.message,!0)}finally{S.value=!1}}}async function Ce(){if(await t(a(`确定删除这个模型?`),{title:a(`删除模型`),confirmText:a(`删除`),danger:!0})){if(B.core.models.some(e=>e.id===I.id)&&await Ke(I.id),B.dirty=!1,await x(),p.value=B.core.models.map(e=>({...e})),A.value=``,!p.value.length){h.value=-1,_.value=``,Object.assign(I,Z());return}h.value=0,_.value=Q(p.value[0]),Object.assign(I,Z(),p.value[0],{apiKey:``})}}async function we(){if(!(!oe.value||B.dirty||E.value)){E.value=!0,A.value=a(`正在测试「{v}」…`,{v:I.label||I.model});try{let e=await qe(I.id);A.value=a(`✓ {v} 连接成功 · {latency} ms`,{v:I.label||e.model,latency:e.latency}),await x()}catch(e){A.value=e.message}finally{E.value=!1}}}return(t,o)=>(w(),u(`div`,kt,[v(`div`,At,[v(`aside`,jt,[v(`div`,Mt,[v(`h2`,null,[T(e(K(a)(`模型库`))+` `,1),v(`small`,null,e(p.value.length),1)]),v(`button`,{id:`addModel`,class:`small primary`,onClick:ve},e(K(a)(`+ 新增模型`)),1)]),v(`p`,Nt,e(K(a)(`群聊、私聊和独处都使用默认模型。其余已启用的模型按这里的顺序作为备用。关掉的模型不会被调用。`)),1),v(`div`,Pt,[p.value.length?y(``,!0):(w(),u(`p`,Ft,e(K(a)(`还没有模型。`)),1)),(w(!0),u(r,null,D(V.value,t=>(w(),u(`details`,{key:t.vendor,class:`saved-vendor`,open:_.value===t.vendor,"data-saved-vendor":t.vendor,onToggle:e=>se(t.vendor,e)},[v(`summary`,null,[v(`span`,null,e(t.vendor),1),v(`small`,null,e(K(a)(`{length} 个模型`,{length:t.models.length})),1)]),v(`div`,Lt,[(w(!0),u(r,null,D(t.models,t=>(w(),u(`button`,{key:t.model.id,class:m([`entity-row`,{selected:h.value===t.index}]),onClick:e=>_e(t.index)},[v(`span`,{class:`badge`,style:n({"--hue":K(re)(t.model.label||t.model.model||t.model.id)})},e(String(t.model.label||t.model.model||`?`).slice(0,1).toUpperCase()),5),v(`span`,zt,[v(`b`,null,e(t.model.label||t.model.model),1),v(`small`,null,e(t.model.enabled===!1?K(a)(`已关闭`):t.model.isDefault?K(a)(`默认模型`):K(a)(`备用模型`)),1)])],10,Rt))),128))])],40,It))),128))])]),L.value?(w(),u(`section`,Bt,[v(`div`,Vt,[v(`div`,null,[v(`span`,Ht,e(K(a)(`模型档案`)),1),v(`h2`,null,e(I.label||K(a)(`新模型`)),1)]),v(`span`,{class:`chip`,"data-tone":I.hasApiKey?`ok`:`warn`},e((I.isDefault?K(a)(`默认模型 · `):``)+(I.hasApiKey?K(a)(`密钥已保存`):K(a)(`待填写密钥`))),9,Ut)]),v(`form`,{id:`modelForm`,class:`stack`,onSubmit:g(Se,[`prevent`]),onInput:o[14]||=e=>K(B).dirty=!0},[v(`fieldset`,null,[v(`legend`,null,e(K(a)(`连接`)),1),v(`div`,Wt,[G.value.length>1?(w(),u(`label`,Gt,[T(e(K(a)(`同厂商模型`))+` `,1),H(Y,{"model-value":I.presetId,"aria-label":K(a)(`同厂商模型`),options:G.value.map(e=>({value:e.id,label:e.label})),onChange:be},null,8,[`model-value`,`aria-label`,`options`])])):y(``,!0),v(`label`,null,[T(e(K(a)(`显示名称`)),1),C(v(`input`,{"onUpdate:modelValue":o[0]||=e=>I.label=e,name:`label`,required:``},null,512),[[i,I.label]])]),v(`label`,null,[T(e(K(a)(`供应商`)),1),C(v(`input`,{"onUpdate:modelValue":o[1]||=e=>I.provider=e,name:`provider`,placeholder:K(a)(`例如 deepseek、openai`)},null,8,Kt),[[i,I.provider]])]),v(`label`,null,[T(e(K(a)(`API 地址`)),1),C(v(`input`,{"onUpdate:modelValue":o[2]||=e=>I.baseUrl=e,name:`baseUrl`,type:`url`,required:``},null,512),[[i,I.baseUrl]])]),v(`label`,null,[T(e(K(a)(`模型名称`)),1),C(v(`input`,{"onUpdate:modelValue":o[3]||=e=>I.model=e,name:`model`,required:``},null,512),[[i,I.model]])]),v(`label`,qt,[o[18]||=T(` API Key `,-1),C(v(`input`,{"onUpdate:modelValue":o[4]||=e=>I.apiKey=e,name:`apiKey`,type:`password`,autocomplete:`new-password`,placeholder:I.hasApiKey?K(a)(`已保存,留空则保留`):K(a)(`填写供应商提供的密钥`)},null,8,Jt),[[i,I.apiKey]])])])]),v(`fieldset`,null,[v(`legend`,null,e(K(a)(`容量与思考`)),1),v(`p`,Yt,e(K(a)(`官方按输入长度分档计价的模型可以在标准和百万之间切换;输出上限默认是官方最大值,思考强度只列出这个模型支持的档位。`)),1),v(`div`,Xt,[X.value.length?(w(),u(`label`,Zt,[T(e(K(a)(`上下文容量`))+` `,1),H(Y,{name:`contextWindow`,"model-value":I.contextWindow,options:X.value.map(e=>({value:e.contextWindow,label:e.label})),onChange:de},null,8,[`model-value`,`options`])])):(w(),u(`label`,Qt,[T(e(K(a)(`上下文容量`)),1),C(v(`input`,{"onUpdate:modelValue":o[5]||=e=>I.contextWindow=e,name:`contextWindow`,type:`number`},null,512),[[i,I.contextWindow,void 0,{number:!0}]])])),v(`label`,null,[T(e(K(a)(`最大输入 Token`)),1),C(v(`input`,{"onUpdate:modelValue":o[6]||=e=>I.maxInputTokens=e,name:`maxInputTokens`,type:`number`},null,512),[[i,I.maxInputTokens,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`最大输出 Token`)),1),C(v(`input`,{"onUpdate:modelValue":o[7]||=e=>I.maxOutputTokens=e,name:`maxOutputTokens`,type:`number`},null,512),[[i,I.maxOutputTokens,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`思考强度`))+` `,1),H(Y,{modelValue:I.reasoningEffort,"onUpdate:modelValue":o[8]||=e=>I.reasoningEffort=e,name:`reasoningEffort`,"aria-label":K(a)(`思考强度`),options:ie.value.map(e=>({value:e,label:me(e)}))},null,8,[`modelValue`,`aria-label`,`options`])])])]),v(`details`,$t,[v(`summary`,null,e(K(a)(`高级参数与模型能力`)),1),v(`div`,en,[v(`label`,null,[T(e(K(a)(`随机程度 Temperature`)),1),C(v(`input`,{"onUpdate:modelValue":o[9]||=e=>I.temperature=e,name:`temperature`,type:`number`,step:`0.05`},null,512),[[i,I.temperature,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`采样范围 Top P`)),1),C(v(`input`,{"onUpdate:modelValue":o[10]||=e=>I.topP=e,name:`topP`,type:`number`,step:`0.05`},null,512),[[i,I.topP,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`超时(毫秒)`)),1),C(v(`input`,{"onUpdate:modelValue":o[11]||=e=>I.timeoutMs=e,name:`timeoutMs`,type:`number`},null,512),[[i,I.timeoutMs,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`知识检索模型`)),1),C(v(`input`,{"onUpdate:modelValue":o[12]||=e=>I.embeddingModel=e,name:`embeddingModel`,placeholder:K(a)(`留空跟随对话模型`)},null,8,tn),[[i,I.embeddingModel]])])]),v(`p`,nn,e(K(a)(`打开图片理解后,聊天里的图片会先在本机读取,再连同画面交给这个模型。主模型不能看图时,到会话设置另选一个打开了图片理解的视觉兼容模型。`)),1),v(`div`,rn,[(w(!0),u(r,null,D({vision:K(a)(`图片理解`),system:`System Prompt`,json:K(a)(`JSON 输出`),tools:K(a)(`工具调用`),embedding:K(a)(`知识向量`)},(t,n)=>(w(),u(`label`,{key:n,class:`check`},[C(v(`input`,{"onUpdate:modelValue":e=>I[n]=e,name:n,type:`checkbox`},null,8,an),[[J,I[n]]]),T(e(t),1)]))),128))])]),A.value?(w(),u(`div`,on,e(A.value),1)):y(``,!0),v(`div`,sn,[v(`button`,{class:`primary`,disabled:S.value},e(S.value?K(a)(`正在保存…`):K(a)(`保存模型`)),9,cn),v(`small`,ln,e(K(B).dirty?K(a)(`有未保存的修改`):K(a)(`已保存的模型才会用来测试和回复`)),1),I.isDefault?y(``,!0):(w(),u(`label`,un,[v(`input`,{type:`checkbox`,checked:I.enabled!==!1,onChange:o[13]||=e=>{I.enabled=e.target.checked,K(B).dirty=!0}},null,40,dn),T(e(K(a)(`启用这个备用模型`)),1)])),I.isDefault?y(``,!0):(w(),u(`button`,{key:1,id:`setDefaultModel`,type:`button`,onClick:xe},e(K(a)(`设为默认模型`)),1)),oe.value?(w(),u(`button`,{key:2,id:`testModel`,type:`button`,disabled:S.value||E.value||K(B).dirty,onClick:we},e(E.value?K(a)(`正在测试…`):K(B).dirty?K(a)(`保存后测试此模型`):K(a)(`测试此模型连接`)),9,fn)):y(``,!0),v(`button`,{id:`deleteModel`,type:`button`,class:`danger push`,onClick:Ce},e(K(a)(`删除模型`)),1)])],32)])):(w(),u(`section`,pn,[H(ee,{title:K(a)(`还没有模型`),text:K(a)(`常见厂商会预填模型参数;OpenRouter 可选 GPT-6 预设,也可用自选模型手动填写模型 ID 和参数。`)},{default:q(()=>[v(`button`,{class:`primary`,onClick:ve},e(K(a)(`+ 新增模型`)),1)]),_:1},8,[`title`,`text`])]))]),H(lt),H(Ot),v(`section`,mn,[v(`div`,hn,[v(`div`,null,[v(`span`,gn,e(K(a)(`TOKEN LEDGER · 累计用量`)),1),v(`h2`,_n,e(K(a)(`一路聊到现在`)),1),v(`p`,null,e(K(a)(`统计本机账本记录的模型调用;缓存 Token 已包含在输入量里。`)),1)]),v(`div`,vn,[v(`strong`,null,e($(j.value?.total)),1),v(`span`,null,e(K(a)(`累计 Token`)),1)])]),v(`div`,yn,[v(`div`,bn,[v(`span`,null,e(K(a)(`输入`)),1),v(`b`,null,e($(j.value?.input)),1)]),v(`div`,xn,[v(`span`,null,e(K(a)(`输出`)),1),v(`b`,null,e($(j.value?.output)),1)]),v(`div`,Sn,[v(`span`,null,[T(e(K(a)(`缓存命中`))+` `,1),v(`small`,null,e(K(a)(`(输入子项)`)),1)]),v(`b`,null,e($(j.value?.cached)),1)]),v(`div`,Cn,[v(`span`,null,e(K(a)(`调用次数`)),1),v(`b`,null,e($(j.value?.calls)),1)])]),v(`div`,wn,[j.value?.since?(w(),u(`small`,Tn,[T(e(K(a)(`从 {v} 开始记录 · {v2} 为模型返回用量`,{v:new Date(j.value.since).toLocaleDateString(K(s)()),v2:$(j.value.reportedTokens)}))+` `,1),j.value.estimatedCalls?(w(),u(r,{key:0},[T(e(K(a)(`· {v} 次调用按文本估算`,{v:$(j.value.estimatedCalls)})),1)],64)):y(``,!0)])):F.value?(w(),u(`small`,En,e(F.value),1)):(w(),u(`small`,Dn,e(K(a)(`还没有模型调用记录。`)),1)),v(`button`,{type:`button`,class:`usage-refresh`,disabled:M.value,onClick:he},e(M.value?K(a)(`更新中…`):K(a)(`刷新统计 ↻`)),9,On)])]),H(ae,{open:O.value,title:K(a)(`选择模型`),eyebrow:`MODELS`,width:`880px`,onClose:o[17]||=e=>O.value=!1},{default:q(()=>[v(`div`,kn,[v(`p`,An,e(K(a)(`先选供应商,再挑具体模型;支持搜索。火山方舟 Coding Plan 已预填套餐专用接口与型号参数,请勿换成普通推理 API 地址。`)),1),v(`label`,jn,[v(`span`,null,e(K(a)(`搜索模型或供应商`)),1),C(v(`input`,{"onUpdate:modelValue":o[15]||=e=>k.value=e,type:`search`,placeholder:K(a)(`例如:火山方舟、Kimi K3、DeepSeek`)},null,8,Mn),[[i,k.value]])]),(w(!0),u(r,null,D(z.value,t=>(w(),u(`details`,{key:t.vendor,class:`vendor`,"data-vendor":t.vendor},[v(`summary`,Pn,[v(`span`,Fn,[v(`b`,null,e(t.vendor),1),v(`small`,null,e(K(a)(`{length} 个预设`,{length:t.models.length})),1)]),o[19]||=v(`span`,{class:`vendor-chevron`,"aria-hidden":`true`},`⌄`,-1)]),v(`div`,In,[(w(!0),u(r,null,D(t.models,t=>(w(),u(`button`,{key:t.id,type:`button`,class:`preset-card`,"data-preset":t.id,onClick:e=>ye(t)},[v(`b`,null,e(t.label),1),v(`small`,null,e(t.model||K(a)(`填写你在 OpenRouter 选择的模型 ID`)),1),v(`small`,null,e(pe(t)),1),v(`small`,null,e(t.summary),1)],8,Ln))),128))])],8,Nn))),128)),z.value.length?y(``,!0):(w(),u(`p`,Rn,e(K(a)(`没有找到匹配的模型预设。`)),1)),U.value?(w(),u(`button`,{key:1,type:`button`,class:`preset-card custom`,"data-preset":`custom`,onClick:o[16]||=e=>ye(U.value)},[v(`b`,null,e(U.value.label),1),v(`small`,null,e(U.value.summary),1)])):y(``,!0)])]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-8a9bd858`]]),Bn={class:`switch`},Vn=[`name`,`disabled`],Hn=z({__name:`Toggle`,props:j({name:{},disabled:{type:Boolean}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=O(e,`modelValue`);return(n,r)=>(w(),u(`label`,Bn,[C(v(`input`,{"onUpdate:modelValue":r[0]||=e=>t.value=e,type:`checkbox`,name:e.name,disabled:e.disabled},null,8,Vn),[[J,t.value]]),v(`span`,null,[R(n.$slots,`default`)])]))}}),Un={class:`runtime-grid`},Wn={class:`card-head`},Gn={class:`eyebrow`},Kn={class:`switches`},qn={class:`save-bar`},Jn={class:`primary`,type:`submit`},Yn={class:`faint`},Xn={class:`card numbers`},Zn=[`title`],Qn=F(z({__name:`Runtime`,setup(t){let n=f(!!B.health.settings.enabled),r=f(!!B.health.settings.demo),i=o(()=>(B.core.sessions||[]).filter(e=>e.enabled&&!e.archived).length),s=o(()=>{let e=B.health.backup;if(!e)return null;if(!e.enabled)return{value:a(`已关闭`),caption:a(`自动备份`),tone:`warn`,title:``};if(e.lastError)return{value:a(`失败`),caption:a(`自动备份出错,稍后重试`),tone:`danger`,title:e.lastError.message};if(!e.latest)return{value:a(`还没有`),caption:a(`自动备份,运行一阵后会做第一份`),tone:``,title:``};let t=Math.max(1,Math.round(e.latest.bytes/1048576));return{value:X(e.latest.at),caption:a(`上次自动备份 · {mb} MB · 已留 {count}/{keep} 份`,{mb:t,count:e.count,keep:e.keep}),tone:``,title:e.latest.name}});async function c(){try{await L({enabled:n.value,demo:r.value}),B.dirty=!1,B.health=await E(),W(a(`已保存并应用`))}catch(e){W(e.message,!0)}}return(t,o)=>(w(),u(`div`,Un,[v(`form`,{id:`runtime`,class:`card`,onSubmit:g(c,[`prevent`]),onChange:o[2]||=e=>K(B).dirty=!0},[v(`div`,Wn,[v(`div`,null,[v(`span`,Gn,e(K(a)(`运行开关`)),1),v(`h2`,null,e(K(a)(`TA 现在可以说话吗`)),1)])]),v(`div`,Kn,[H(Hn,{modelValue:n.value,"onUpdate:modelValue":o[0]||=e=>n.value=e,name:`enabled`},{default:q(()=>[v(`b`,null,e(K(a)(`允许参与聊天`)),1),v(`small`,null,e(K(a)(`总开关。关掉后 TA 不看也不回任何会话,心智照常保存。`)),1)]),_:1},8,[`modelValue`]),H(Hn,{modelValue:r.value,"onUpdate:modelValue":o[1]||=e=>r.value=e,name:`demo`},{default:q(()=>[v(`b`,null,e(K(a)(`仅模拟运行,不向 QQ 发送`)),1),v(`small`,null,e(K(a)(`模拟模式下,「对话」里可以发模拟消息走完整流程;它们写进模拟会话,不进入真实记忆。`)),1)]),_:1},8,[`modelValue`])]),v(`div`,qn,[v(`button`,Jn,e(K(a)(`保存运行状态`)),1),v(`small`,Yn,e(K(B).dirty?K(a)(`有未保存的修改`):K(a)(`已保存,立刻生效`)),1)])],32),v(`section`,Xn,[v(`button`,{onClick:o[3]||=e=>K(A)(`chats`)},[v(`b`,null,e(i.value),1),v(`span`,null,e(K(a)(`参与中的会话`)),1)]),v(`button`,{onClick:o[4]||=e=>K(A)(`system`,`models`)},[v(`b`,null,e(K(B).core.models.length),1),v(`span`,null,e(K(a)(`可用模型`)),1)]),v(`button`,{onClick:o[5]||=e=>K(A)(`system`,`connect`)},[v(`b`,null,e(K(B).health.connection?.online?K(a)(`在线`):K(a)(`离线`)),1),v(`span`,null,e(K(a)(`QQ 连接`)),1)]),s.value?(w(),u(`button`,{key:0,class:m([`stat`,s.value.tone]),title:s.value.title,"data-testid":`backup-status`,type:`button`,onClick:o[6]||=e=>K(A)(`system`,`storage`)},[v(`b`,null,e(s.value.value),1),v(`span`,null,e(s.value.caption),1)],10,Zn)):y(``,!0)])]))}}),[[`__scopeId`,`data-v-1f197523`]]),$n={class:`card search-profile`},er={class:`eyebrow`},tr={class:`muted`},nr={key:0,class:`faint`},rr={class:`check`},ir=[`disabled`],ar={class:`search-fields`},or=[`disabled`],sr=[`disabled`,`placeholder`],cr=[`disabled`],lr=[`disabled`],ur=[`disabled`],dr={class:`faint`},fr={class:`search-usage`,role:`status`},pr={class:`chip`},mr={class:`faint`},hr={class:`faint`},gr={class:`row`},_r=[`disabled`],vr=[`disabled`],yr={key:0,class:`faint`},br=[`role`],xr=F(z({__name:`SearchProfile`,setup(t){let n=[`provider`,`enabled`,`baseUrl`,`timeoutMs`,`maxResults`,`dailyLimit`],r=te({provider:`tavily`,enabled:!0,baseUrl:``,apiKey:``,timeoutMs:2e4,maxResults:5,dailyLimit:12}),s=f(null),c=f(!1),l=f(!1),d=f(``),p=f(!1),h=new Map,_=`tavily`,x=o(()=>l.value&&(!!r.apiKey.trim()||n.some(e=>r[e]!==s.value?.[e]))),S=e=>e===`brave`?`Brave`:`Tavily`,E=o(()=>s.value?.dailyLimit===0?a(`不限`):s.value?.dailyLimit??12);b(x,e=>{B.dirty=e}),b(()=>[B.tick,B.pulse],()=>{l.value&&!c.value&&B.page===`system`&&B.sub===`search`&&D().catch(()=>{})});async function D(){s.value=await P(`/mind/time/search`)}async function O(){try{await D(),Object.assign(r,s.value,{apiKey:``}),_=r.provider,l.value=!0}catch(e){W(e.message,!0)}}async function k(){if(c.value)return;c.value=!0;let e=r.provider;h.set(_,{...r,provider:_});try{Object.assign(r,h.get(e)||{...await P(`/mind/time/search?provider=`+e),apiKey:``}),_=e,d.value=``}catch(e){r.provider=_,W(e.message,!0)}finally{c.value=!1}}function A(){return Object.fromEntries([...n,`apiKey`].map(e=>[e,r[e]]))}async function j(){if(!c.value){c.value=!0;try{let e=await P(`/mind/time/search`,`PATCH`,A());s.value=e,Object.assign(r,e,{apiKey:``}),h.set(r.provider,{...r}),_=r.provider,W(a(`搜索配置已保存并生效`))}catch(e){W(e.message,!0)}finally{c.value=!1}}}async function M(){if(!c.value){c.value=!0,d.value=``,p.value=!1;try{let e=await P(`/mind/time/search/test`,`POST`,A()),t={source:e.profile.mode===`web`?a(`{provider} 联网检索`,{provider:S(e.profile.provider)}):e.profile.materialLabel,count:e.results.length};d.value=x.value?a(`{source}测试通过,返回 {count} 条资料。测试不占用每日查询额度;当前填写的配置尚未保存。`,t):a(`{source}测试通过,返回 {count} 条资料。测试不占用每日查询额度。`,t)}catch(e){p.value=!0,d.value=a(`{error}。本次测试不占用每日查询额度。`,{error:e.message})}finally{try{await D()}catch{}c.value=!1}}}return N(O),U(()=>{B.dirty=!1}),(t,n)=>(w(),u(`section`,$n,[v(`span`,er,e(K(a)(`SEARCH · 独立搜索`)),1),v(`h2`,null,e(K(a)(`接触世界的资料`)),1),v(`p`,tr,e(K(a)(`配置后优先联网检索。未配置密钥或关闭独立搜索时,使用当前模型整理已有知识。`)),1),l.value?(w(),u(`p`,nr,e(K(a)(`当前生效:{v}。表单修改保存后生效。`,{v:s.value.mode===`web`?K(a)(`{provider} · 联网检索资料`,{provider:S(s.value.provider)}):s.value.materialLabel})),1)):y(``,!0),l.value?(w(),u(`form`,{key:1,onSubmit:g(j,[`prevent`])},[v(`label`,rr,[C(v(`input`,{"onUpdate:modelValue":n[0]||=e=>r.enabled=e,type:`checkbox`,disabled:c.value},null,8,ir),[[J,r.enabled]]),T(e(K(a)(`启用独立搜索`)),1)]),v(`div`,ar,[v(`label`,null,[T(e(K(a)(`提供方`)),1),H(Y,{modelValue:r.provider,"onUpdate:modelValue":n[1]||=e=>r.provider=e,"aria-label":K(a)(`搜索提供方`),disabled:c.value,options:[{value:`tavily`,label:`Tavily`},{value:`brave`,label:`Brave`}],onChange:k},null,8,[`modelValue`,`aria-label`,`disabled`])]),v(`label`,null,[T(e(K(a)(`搜索地址`)),1),C(v(`input`,{"onUpdate:modelValue":n[2]||=e=>r.baseUrl=e,type:`url`,required:``,name:`searchUrl`,disabled:c.value},null,8,or),[[i,r.baseUrl]])]),v(`label`,null,[T(e(K(a)(`独立密钥`)),1),C(v(`input`,{"onUpdate:modelValue":n[3]||=e=>r.apiKey=e,type:`password`,autocomplete:`new-password`,name:`searchKey`,disabled:c.value,placeholder:r.hasApiKey?K(a)(`已保存,留空保留`):K(a)(`填写该提供方的搜索密钥`)},null,8,sr),[[i,r.apiKey]])]),v(`label`,null,[T(e(K(a)(`超时(毫秒)`)),1),C(v(`input`,{"onUpdate:modelValue":n[4]||=e=>r.timeoutMs=e,type:`number`,min:`1000`,max:`120000`,disabled:c.value},null,8,cr),[[i,r.timeoutMs,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`每次结果数`)),1),C(v(`input`,{"onUpdate:modelValue":n[5]||=e=>r.maxResults=e,type:`number`,min:`1`,max:`20`,disabled:c.value},null,8,lr),[[i,r.maxResults,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`每日查询上限`)),1),C(v(`input`,{"onUpdate:modelValue":n[6]||=e=>r.dailyLimit=e,name:`searchDailyLimit`,type:`number`,min:`0`,max:`100000`,disabled:c.value},null,8,ur),[[i,r.dailyLimit,void 0,{number:!0}]]),v(`small`,dr,e(K(a)(`可手动调整;0 表示不限。保存后立即生效。`)),1)])]),v(`div`,fr,[v(`span`,pr,e(K(a)(`今日有效查询 {v} / {limitLabel}`,{v:s.value.used||0,limitLabel:E.value})),1),v(`small`,mr,e(K(a)(`{v} 次进行中 · {v2} 次失败 · {v3} 次测试`,{v:s.value.usage?.running||0,v2:s.value.usage?.failed||0,v3:s.value.usage?.diagnostics||0})),1)]),v(`p`,hr,e(K(a)(`测试当前填写的配置,不会自动保存。失败与连接测试不占本地每日额度;提供方的账户额度由提供方管理。`)),1),v(`div`,gr,[v(`button`,{class:`primary`,disabled:c.value},e(K(a)(`保存搜索`)),9,_r),v(`button`,{type:`button`,disabled:c.value,onClick:M},e(c.value?K(a)(`处理中…`):K(a)(`测试连接`)),9,vr),x.value?(w(),u(`span`,yr,e(K(a)(`有尚未保存的修改`)),1)):y(``,!0)]),d.value?(w(),u(`p`,{key:0,role:p.value?`alert`:`status`,class:m([`search-result`,{failed:p.value}])},e(d.value),11,br)):y(``,!0)],32)):y(``,!0)]))}}),[[`__scopeId`,`data-v-e874d8b6`]]),Sr={key:0,class:`card data-transfer`,"aria-labelledby":`data-transfer-title`},Cr={class:`eyebrow`},wr={id:`data-transfer-title`},Tr={class:`transfer-note`},Er={class:`transfer-note`},Dr={class:`transfer-actions`},Or=[`disabled`],kr=[`disabled`],Ar=[`aria-label`],jr={class:`transfer-note`},Mr={key:0,class:`transfer-progress`,role:`status`},Nr={key:1,class:`transfer-error`,role:`alert`},Pr={key:2,class:`transfer-note`},Fr={key:3,class:`transfer-preview`},Ir={class:`eyebrow`},Lr={class:`transfer-note`},Rr={class:`transfer-counts`},zr={class:`transfer-actions`},Br=[`disabled`],Vr=[`disabled`],Hr=F(z({__name:`DataTransfer`,setup(n){let i=f(null),s=f(null),l=f(),m=f(``),h=f(``),g=!0,_=null,b=o(()=>!!m.value),x=o(()=>m.value===`restarting`?a(`正在保留快照并重启加载,请等待…`):m.value===`uploading`?a(`正在上传数据文件…`):m.value===`exporting`?a(`正在生成完整数据包…`):a(`正在校验数据文件…`)),S=o(()=>{let e=s.value?.summary?.tables||{};return[[a(`聊天记录`),e.core_events||e.messages||0],[a(`记忆`),e.core_memories||e.memories||0],[a(`待办`),e.mind_time_tasks||0],[a(`作品`),e.mind_time_works||0],[a(`日记`),e.mind_diary||0]]}),C=()=>new Promise(e=>setTimeout(e,800));async function T(e,t=!1){for(let n=0;n<4500&&g;n++){try{let n=await P(`/storage/transfer/jobs/`+e);if(n.status===`error`)throw Error(n.error||a(`数据处理失败`));if(n.status===(t?`done`:`ready`))return n;if(n.status===`expired`)throw Error(a(`数据文件已过期,请重新选择`))}catch(e){if(!t||!(e instanceof TypeError)&&e.message!==a(`请求失败`))throw e}await C()}throw Error(a(`等待数据处理超时,请检查实例运行状态`))}async function E(){if(!b.value){m.value=`exporting`,h.value=``;try{let e=await P(`/storage/transfer/export`,`POST`,{});if(await T(e.id),!g)return;let t=document.createElement(`a`);t.href=`/api/storage/transfer/download/`+e.id,t.download=``,document.body.appendChild(t),t.click(),t.remove(),W(a(`数据包已生成,浏览器将开始下载`))}catch(e){g&&(h.value=e.message)}finally{g&&(m.value=``)}}}async function O(e){let t=e.target,n=t.files?.[0];if(t.value=``,n&&!b.value){if(h.value=``,s.value=null,n.size>(i.value?.maxBytes||0)){h.value=a(`数据文件超过导入大小限制`);return}m.value=`uploading`,_=new AbortController;try{await p();let e=await fetch(`/api/storage/transfer/upload`,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/octet-stream`,"X-LuckyTri-Filename":encodeURIComponent(n.name),"X-LuckyTri-Locale":c.value},body:n,signal:_.signal});if(e.status===401)throw d(),Error(a(`请先登录管理台`));let t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||a(`数据上传失败`));m.value=`checking`;let r=await T(t.id);g&&(s.value=r)}catch(e){g&&(h.value=e.message)}finally{_=null,g&&(m.value=``)}}}async function A(){if(s.value&&!b.value)try{await P(`/storage/transfer/jobs/`+s.value.id,`DELETE`),s.value=null}catch(e){h.value=e.message}}async function j(){if(!s.value||b.value||!await t(a(`用这份数据替换当前数据,并保留导入前快照。实例将重启,导入后自动回复关闭。本机管理密码与 QQ 连接配置保持不变。`),{title:a(`确认导入数据`),confirmText:a(`导入并重启`),danger:!0}))return;m.value=`restarting`,h.value=``;let e=s.value.id;try{if(await P(`/storage/transfer/import`,`POST`,{id:e}),await T(e,!0),!g)return;k(),location.reload()}catch(e){g&&(h.value=e.message)}finally{g&&(m.value=``)}}return N(async()=>{try{i.value=await P(`/storage/transfer`)}catch(e){g&&(h.value=e.message)}}),V(()=>{g=!1,_?.abort()}),(t,n)=>i.value?.available?(w(),u(`section`,Sr,[v(`span`,Cr,e(K(a)(`DATA · 导入与导出`)),1),v(`h2`,wr,e(K(a)(`带上记忆,继续生活。`)),1),v(`p`,Tr,e(K(a)(`导出数据库内的聊天、记忆、待办、作品、知识与设置。插件文件、知识库原始文件和本机 .env 不在数据包中。`)),1),v(`p`,Er,e(K(a)(`数据包包含私聊内容和模型设置中的密钥,请存放在你信任的位置。导入前会校验,确认后才替换当前数据。`)),1),v(`div`,Dr,[v(`button`,{class:`primary`,type:`button`,disabled:b.value,onClick:E},e(K(a)(`导出数据包`)),9,Or),v(`button`,{type:`button`,disabled:b.value,onClick:n[0]||=e=>l.value?.click()},e(K(a)(`选择导入文件`)),9,kr),v(`input`,{ref_key:`input`,ref:l,class:`transfer-file`,type:`file`,accept:`.luckytri,.db,.sqlite,.sqlite3`,"aria-label":K(a)(`导入数据文件`),onChange:O},null,40,Ar)]),v(`p`,jr,e(K(a)(`支持 .luckytri 数据包和已有 SQLite 备份,单个文件最多 {size} GiB。`,{size:(i.value.maxBytes/1073741824).toFixed(0)})),1),b.value?(w(),u(`p`,Mr,e(x.value),1)):y(``,!0),h.value?(w(),u(`p`,Nr,e(h.value),1)):y(``,!0),i.value.lastImport?.status===`done`?(w(),u(`p`,Pr,e(K(a)(`上次数据导入已完成,自动回复在导入时关闭。请检查连接、模型和待办后再开启;插件需重新安装或确认权限。`)),1)):y(``,!0),s.value?(w(),u(`div`,Fr,[v(`span`,Ir,e(K(a)(`校验通过 · 尚未导入`)),1),v(`h3`,null,e(s.value.summary?.name),1),v(`p`,Lr,e(s.value.name)+` · `+e(K(a)(`数据库版本 {from} → {to}`,{from:s.value.originalVersion,to:s.value.summary?.schemaVersion})),1),v(`div`,Rr,[(w(!0),u(r,null,D(S.value,([t,n])=>(w(),u(`div`,{key:t},[v(`b`,null,e(n),1),v(`span`,null,e(t),1)]))),128))]),v(`div`,zr,[v(`button`,{class:`primary`,type:`button`,disabled:b.value,onClick:j},e(K(a)(`导入并重启`)),9,Br),v(`button`,{type:`button`,disabled:b.value,onClick:A},e(K(a)(`取消导入`)),9,Vr)])])):y(``,!0)])):y(``,!0)}}),[[`__scopeId`,`data-v-ea16c0c1`]]),Ur={class:`storage-page`},Wr={class:`card storage-overview`},Gr={class:`eyebrow`},Kr={key:0,class:`storage-metrics`},qr={key:0,class:`storage-error`,role:`alert`},Jr={key:1,class:`storage-grid`},Yr={class:`card-head`},Xr={class:`eyebrow`},Zr={class:`storage-check`},Qr={class:`storage-fields`},$r=[`aria-label`],ei=[`aria-label`],ti=[`aria-label`],ni={class:`storage-note`},ri={key:0,class:`storage-note`},ii={key:1,class:`storage-error`},ai=[`disabled`],oi={class:`card storage-list`},si={class:`card-head`},ci={class:`eyebrow`},li={class:`storage-note`},ui={class:`storage-actions`},di=[`disabled`],fi=[`disabled`],pi=[`disabled`],mi={class:`storage-scroll`},hi=[`checked`,`disabled`,`aria-label`,`onChange`],gi={class:`storage-item`},_i={key:0,class:`storage-error`,role:`alert`},vi={class:`storage-footer`},yi=[`disabled`],bi=F(z({__name:`BackupManager`,setup(n){let c=f(null),l=f({enabled:!0,time:`04:30`,retainDays:14,keepFull:2}),d=f([]),p=f(!1),h=f(``),_=f([]),b=!0,x=e=>`${e.scope}:${e.name}`,S=o(()=>c.value?.entries.filter(e=>d.value.includes(x(e)))||[]),E=o(()=>S.value.reduce((e,t)=>e+t.bytes,0)),O=e=>e===0?`0 B`:e>=1073741824?`${(e/1073741824).toFixed(2)} GiB`:`${Math.max(.01,e/1048576).toFixed(2)} MiB`,k=e=>new Date(e).toLocaleString(s()),A=e=>({auto:a(`自动备份`),full:a(`完整备份`),migration:a(`迁移快照`),legacy:a(`旧版本备份`),snapshot:a(`升级前快照`),import:a(`导入前快照`)})[e];async function j(e=!1){try{h.value=``;let t=await P(`/storage/cleanup`);if(!b)return;if(c.value=t,e)l.value={...c.value.policy},d.value=[],B.dirty=!1;else{let e=new Set(c.value.entries.filter(e=>!e.protected).map(x));d.value=d.value.filter(t=>e.has(t))}}catch(e){b&&(h.value=e.message)}}function M(){B.dirty=!0}function F(e){let t=x(e);d.value=d.value.includes(t)?d.value.filter(e=>e!==t):[...d.value,t]}function I(){d.value=(c.value?.plan.items||[]).map(x)}function L(){d.value=(c.value?.entries||[]).filter(e=>e.kind===`full`&&!e.protected).map(x)}async function R(){if(!p.value){p.value=!0;try{let e=await P(`/storage/cleanup`,`PATCH`,{enabled:l.value.enabled,time:l.value.time,retainDays:Number(l.value.retainDays),keepFull:Number(l.value.keepFull)});c.value=e,l.value={...e.policy},B.dirty=!1,W(a(`备份整理规则已保存`))}catch(e){W(e.message,!0)}finally{p.value=!1}}}async function z(){if(!S.value.length||p.value)return;let e=S.value.map(({scope:e,name:t,bytes:n,modified:r})=>({scope:e,name:t,bytes:n,modified:r}));if(await t(a(`将清理选中的 {count} 份备份,释放约 {size}。这些历史恢复点清理后无法从本机找回。`,{count:e.length,size:O(E.value)}),{title:a(`清理所选备份`),confirmText:a(`清理所选`),danger:!0})){p.value=!0;try{let t=await P(`/storage/cleanup/manual`,`POST`,{items:e});_.value=t.failures||[];let n=new Set((t.failures||[]).map(e=>`${e.scope}:${e.name}`));d.value=d.value.filter(e=>n.has(e)),await j(),W(a(`已清理 {count} 份备份,释放 {size}`,{count:t.removed.length,size:O(t.bytes)})+(_.value.length?a(`;部分未清理,详情见列表`):``),_.value.length>0)}catch(e){W(e.message,!0),await j()}finally{p.value=!1}}}return N(()=>j(!0)),V(()=>{b=!1}),(t,n)=>(w(),u(`div`,Ur,[v(`section`,Wr,[v(`span`,Gr,e(K(a)(`DATA · 数据与备份`)),1),v(`h2`,null,e(K(a)(`留住重要的,整理重复的。`)),1),v(`p`,null,e(K(a)(`这里管理历史备份。聊天、记忆和作品仍在正在运行的数据库里,不会被列入清理。`)),1),c.value?(w(),u(`div`,Kr,[v(`div`,null,[v(`b`,null,e(O(c.value.totalBytes)),1),v(`span`,null,e(K(a)(`可管理的历史备份`)),1)]),v(`div`,null,[v(`b`,null,e(c.value.entries.length),1),v(`span`,null,e(K(a)(`份数据库副本`)),1)]),v(`div`,null,[v(`b`,null,e(O(c.value.plan.bytes)),1),v(`span`,null,e(K(a)(`按当前规则可定时整理`)),1)])])):y(``,!0)]),h.value?(w(),u(`p`,qr,e(h.value),1)):y(``,!0),H(Hr),c.value?(w(),u(`div`,Jr,[v(`form`,{class:`card storage-policy`,onSubmit:g(R,[`prevent`])},[v(`div`,Yr,[v(`div`,null,[v(`span`,Xr,e(K(a)(`定时整理`)),1),v(`h2`,null,e(K(a)(`每天给备份留一点空间`)),1)])]),v(`label`,Zr,[C(v(`input`,{"onUpdate:modelValue":n[0]||=e=>l.value.enabled=e,type:`checkbox`,onChange:M},null,544),[[J,l.value.enabled]]),T(e(K(a)(`启用定时整理`)),1)]),v(`div`,Qr,[v(`label`,null,[T(e(K(a)(`每天执行时间`)),1),C(v(`input`,{"onUpdate:modelValue":n[1]||=e=>l.value.time=e,type:`text`,inputmode:`numeric`,maxlength:`5`,placeholder:`04:30`,"aria-label":K(a)(`每天执行时间`),onInput:M},null,40,$r),[[i,l.value.time]])]),v(`label`,null,[T(e(K(a)(`完整备份保留天数`)),1),C(v(`input`,{"onUpdate:modelValue":n[2]||=e=>l.value.retainDays=e,type:`number`,min:`1`,max:`3650`,"aria-label":K(a)(`完整备份保留天数`),onInput:M},null,40,ei),[[i,l.value.retainDays,void 0,{number:!0}]])]),v(`label`,null,[T(e(K(a)(`完整备份最多保留份数`)),1),C(v(`input`,{"onUpdate:modelValue":n[3]||=e=>l.value.keepFull=e,type:`number`,min:`0`,max:`100`,"aria-label":K(a)(`完整备份最多保留份数`),onInput:M},null,40,ti),[[i,l.value.keepFull,void 0,{number:!0}]])])]),v(`p`,ni,e(K(a)(`时间按服务器本地时区 {zone}。完整备份超过保留天数或数量上限便会定时整理;数量填 0 表示不保留完整备份。手动清理可选择完整备份和迁移快照,执行前会校验同一实例的近期自动恢复点。`,{zone:c.value.serverTimeZone})),1),c.value.last?(w(),u(`p`,ri,e(c.value.last.error&&c.value.last.removed===0?K(a)(`上次整理未执行:{error}`,{error:c.value.last.error}):K(a)(`上次整理:{time} · {count} 份 · {size}`,{time:k(c.value.last.at),count:c.value.last.removed,size:O(c.value.last.bytes)})),1)):y(``,!0),c.value.last?.error&&c.value.last.removed>0?(w(),u(`p`,ii,e(c.value.last.error),1)):y(``,!0),v(`button`,{class:`primary`,type:`submit`,disabled:p.value},e(p.value?K(a)(`处理中…`):K(a)(`保存整理规则`)),9,ai)],32),v(`section`,oi,[v(`div`,si,[v(`div`,null,[v(`span`,ci,e(K(a)(`手动整理`)),1),v(`h2`,null,e(K(a)(`挑选历史恢复点`)),1)])]),v(`p`,li,e(K(a)(`自动备份已有自己的轮换规则。迁移、旧版本和升级前快照只由你手动挑选;清理前会再次核对文件和恢复点。`)),1),v(`div`,ui,[v(`button`,{type:`button`,disabled:p.value||!c.value.plan.items.length,onClick:I},e(K(a)(`选中规则建议`)),9,di),v(`button`,{type:`button`,disabled:p.value,onClick:L},e(K(a)(`选中完整备份`)),9,fi),v(`button`,{type:`button`,disabled:p.value||!d.value.length,onClick:n[4]||=e=>d.value=[]},e(K(a)(`取消选择`)),9,pi)]),v(`div`,mi,[(w(!0),u(r,null,D(c.value.entries,t=>(w(),u(`label`,{key:x(t),class:m([`storage-row`,{protected:t.protected}])},[v(`input`,{type:`checkbox`,checked:d.value.includes(x(t)),disabled:p.value||t.protected||c.value.running,"aria-label":t.name,onChange:e=>F(t)},null,40,hi),v(`span`,gi,[v(`strong`,null,e(t.name),1),v(`small`,null,e(A(t.kind))+` · `+e(k(t.at))+` · `+e(t.manifest?K(a)(`有校验清单`):K(a)(`旧备份无清单`))+e(t.protected?` · `+(t.protectionReason||K(a)(`保留恢复点`)):``),1)]),v(`b`,null,e(O(t.bytes)),1)],2))),128))]),_.value.length?(w(),u(`div`,_i,[v(`p`,null,e(K(a)(`部分备份未清理,请刷新列表后重试`)),1),(w(!0),u(r,null,D(_.value,t=>(w(),u(`p`,{key:t.name},e(t.name)+` · `+e(t.error),1))),128))])):y(``,!0),v(`div`,vi,[v(`span`,null,e(K(a)(`已选 {count} 份 · 约 {size}`,{count:S.value.length,size:O(E.value)})),1),v(`button`,{class:`primary`,type:`button`,disabled:p.value||c.value.running||!S.value.length,onClick:z},e(K(a)(`清理所选`)),9,yi)])])])):y(``,!0)]))}}),[[`__scopeId`,`data-v-4593780e`]]),xi={class:`card password-settings`},Si={class:`row`},Ci=[`disabled`],wi=F(z({__name:`PasswordSettings`,setup(t){let n=f(``),r=f(``),o=f(``),s=f(!1);async function c(){if(!s.value){if(r.value!==o.value){W(a(`两次输入的密码不一致`),!0);return}s.value=!0;try{await S(`password`,{currentPassword:n.value,password:r.value}),n.value=r.value=o.value=``,W(a(`管理密码已更新`))}catch(e){W(e.message,!0)}finally{s.value=!1}}}return(t,l)=>(w(),u(`section`,xi,[v(`h2`,null,e(K(a)(`管理密码`)),1),v(`p`,null,e(K(a)(`一个密码管理这个小世界。修改后,其他浏览器需要重新登录。`)),1),v(`form`,{onSubmit:g(c,[`prevent`])},[v(`label`,null,[T(e(K(a)(`当前密码`)),1),C(v(`input`,{"onUpdate:modelValue":l[0]||=e=>n.value=e,name:`currentPassword`,type:`password`,autocomplete:`current-password`,required:``},null,512),[[i,n.value]])]),v(`label`,null,[T(e(K(a)(`新密码`)),1),C(v(`input`,{"onUpdate:modelValue":l[1]||=e=>r.value=e,name:`newPassword`,type:`password`,autocomplete:`new-password`,minlength:`8`,maxlength:`256`,required:``},null,512),[[i,r.value]])]),v(`label`,null,[T(e(K(a)(`确认密码`)),1),C(v(`input`,{"onUpdate:modelValue":l[2]||=e=>o.value=e,name:`confirmNewPassword`,type:`password`,autocomplete:`new-password`,minlength:`8`,maxlength:`256`,required:``},null,512),[[i,o.value]])]),v(`div`,Si,[v(`button`,{class:`primary`,disabled:s.value},e(K(a)(`修改密码`)),9,Ci),v(`button`,{type:`button`,onClick:l[3]||=(...e)=>K(G)&&K(G)(...e)},e(K(a)(`退出登录`)),1)])],32)]))}}),[[`__scopeId`,`data-v-36cd9f70`]]),Ti={class:`card update-settings`,"aria-labelledby":`update-title`},Ei={id:`update-title`},Di=[`disabled`],Oi={class:`kv`},ki={key:0,class:`muted`,role:`alert`},Ai={class:`muted small-text`},ji={key:1,class:`update-how stack tight`},Mi=[`disabled`],Ni={key:1,role:`status`},Pi={key:2,class:`error-text`,role:`alert`},Fi={key:3,class:`muted`},Ii={class:`update-links`},Li=[`href`],Ri=[`href`],zi=F(z({__name:`UpdateSettings`,setup(n){let i=f(null),o=f(!1),s=f(!1),c,d=!1,p=l({queued:M(`更新已开始`),downloading:M(`正在下载新版本…`),checking:M(`正在检查新程序…`),stopping:M(`正在保存当下并停止实例…`),backup:M(`正在保留更新前的校验备份…`),restarting:M(`正在切换版本并重启…`),verifying:M(`正在确认新实例就绪…`),restoring:M(`正在恢复原版本和数据…`),done:M(`更新与重启已完成`),error:M(`更新未完成`)});function h(e){return e&&![`done`,`error`].includes(e.status)}async function g(){if(!d){try{let e=await P(`/system/update`);if(i.value=e,e.operation?.status===`done`){s.value=!1,location.reload();return}s.value=!!h(e.operation)}catch{}s.value&&!d&&(c=setTimeout(g,1800))}}U(()=>{d=!0,clearTimeout(c)});let _=l({unchecked:M(`尚未检查更新`),available:M(`有新版本可用`),current:M(`已是最新发布版本`),ahead:M(`当前版本领先于 npm 发布版本`),unavailable:M(`暂时无法检查更新`)});N(async()=>{try{i.value=await P(`/system/update`),s.value=!!h(i.value.operation),s.value&&(c=setTimeout(g,1800))}catch(e){W(e.message,!0)}});async function b(){if(!o.value){o.value=!0;try{i.value=await P(`/system/update/check`,`POST`,{})}catch(e){W(e.message,!0)}finally{o.value=!1}}}async function x(){if(!(s.value||o.value||i.value?.status!==`available`)&&await t(a(`更新到 {version} 并重启当前实例?先下载校验,再保留数据恢复点;启动失败时尝试恢复原版本。`,{version:i.value.latest}),{title:a(`更新并重启`),confirmText:a(`开始更新`)})){s.value=!0;try{i.value.operation=await P(`/system/update/install`,`POST`,{version:i.value.latest}),c=setTimeout(g,800)}catch(e){s.value=!1,W(e.message,!0)}}}return(t,n)=>(w(),u(`section`,Ti,[v(`header`,null,[v(`div`,null,[n[0]||=v(`span`,{class:`eyebrow`},`LUCKYTRI / VERSION`,-1),v(`h2`,Ei,e(K(a)(`版本与更新`)),1)]),v(`button`,{disabled:o.value||s.value||!i.value,onClick:b},e(o.value?K(a)(`正在检查…`):K(a)(`检查更新`)),9,Di)]),i.value?(w(),u(r,{key:0},[v(`p`,{class:m([`version-state`,{available:i.value.status===`available`}]),role:`status`},e(K(_)[i.value.status]||K(_).unchecked),3),v(`dl`,Oi,[v(`dt`,null,e(K(a)(`当前版本`)),1),v(`dd`,null,e(i.value.current),1),v(`dt`,null,e(K(a)(`npm 最新版本`)),1),v(`dd`,null,e(i.value.latest||`—`),1),v(`dt`,null,e(K(a)(`上次成功检查`)),1),v(`dd`,null,e(i.value.checkedAt?K(ne)(i.value.checkedAt):`—`),1)]),i.value.error?(w(),u(`p`,ki,e(K(a)(`暂时无法连接 npm 或读取版本信息,请稍后重试。`)),1)):y(``,!0),v(`p`,Ai,e(K(a)(`点击时才检查,五分钟内复用结果。检查更新不会自动安装或重启。`)),1),i.value.status===`available`||i.value.operation?(w(),u(`div`,ji,[v(`p`,null,e(K(a)(`下载期间继续运行,切换前保留数据恢复点。更新完成后此页面会自动重新连接。`)),1),i.value.status===`available`?(w(),u(`button`,{key:0,class:`primary`,disabled:s.value||o.value,onClick:x},e(s.value?K(a)(`正在更新…`):K(a)(`更新并重启`)),9,Mi)):y(``,!0),i.value.operation?(w(),u(`p`,Ni,e(K(p)[i.value.operation.status])+` · `+e(i.value.operation.version),1)):y(``,!0),i.value.operation?.error?(w(),u(`p`,Pi,e(i.value.operation.error),1)):y(``,!0),i.value.operation?.restored?(w(),u(`p`,Fi,e(K(a)(`已恢复原版本和更新前的数据。`)),1)):y(``,!0)])):y(``,!0),v(`nav`,Ii,[v(`a`,{href:i.value.npmUrl,target:`_blank`,rel:`noopener noreferrer`},`npm`,8,Li),v(`a`,{href:i.value.releaseUrl,target:`_blank`,rel:`noopener noreferrer`},e(K(a)(`发布说明`))+` ↗`,9,Ri)])],64)):y(``,!0)]))}}),[[`__scopeId`,`data-v-0df58391`]]),Bi={class:`page system`},Vi={class:`system-intro`},Hi={class:`eyebrow`},Ui={class:`system-status`},Wi=F(z({__name:`SystemPage`,setup(n){let i=[`connect`,`models`,`search`,`runtime`,`storage`],o=f(i.includes(B.sub)?B.sub:`connect`);async function s(e){e!==o.value&&(!B.dirty||await t(a(`当前设置还没保存,离开这个分区吗?`),{title:a(`未保存的修改`),confirmText:a(`放弃修改`),cancelText:a(`继续编辑`)}))&&(B.dirty=!1,o.value=e)}return b(o,e=>I(e)),b(()=>B.sub,e=>{i.includes(e)&&(o.value=e)}),(t,n)=>(w(),u(`div`,Bi,[v(`header`,Vi,[v(`div`,null,[v(`span`,Hi,e(K(a)(`THE WORLD AROUND HER · 系统`)),1),v(`h1`,null,[T(e(K(a)(`让她与世界,`)),1),v(`em`,null,e(K(a)(`温柔相连。`)),1)]),v(`p`,null,e(K(a)(`连接、模型与运行方式都在这里。每一处改变,都可以看见结果。`)),1)]),v(`span`,Ui,[v(`i`,{class:m({off:!K(B).health.connection?.online})},null,2),T(` `+e(K(B).health.connection?.online?K(a)(`正在与 QQ 相连`):K(a)(`等待 QQ 连接`)),1)])]),H(ie,{"model-value":o.value,"onUpdate:modelValue":s,label:K(a)(`系统的分区`),items:[{key:`connect`,label:K(a)(`连接 QQ`)},{key:`models`,label:K(a)(`模型库`)},{key:`search`,label:K(a)(`独立搜索`)},{key:`runtime`,label:K(a)(`运行开关`)},{key:`storage`,label:K(a)(`数据与备份`)}]},null,8,[`model-value`,`label`,`items`]),o.value===`connect`?(w(),_(We,{key:0,onOpen:s})):o.value===`models`?(w(),_(zn,{key:1})):o.value===`search`?(w(),_(xr,{key:2})):o.value===`runtime`?(w(),u(r,{key:3},[H(Qn),H(zi),H(wi)],64)):(w(),_(bi,{key:4}))]))}}),[[`__scopeId`,`data-v-a12a372e`]]);export{Wi as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.connect[data-v-6f4553ed]{gap:var(--gap);grid-template-columns:minmax(0,1.25fr) minmax(290px,.9fr);align-items:start;display:grid}.connection[data-v-6f4553ed]{gap:20px;display:grid}.connection-details[data-v-6f4553ed]{gap:10px;display:grid}.detail[data-v-6f4553ed]{border:1px solid var(--line);background:color-mix(in srgb, var(--surface-strong) 70%, transparent);border-radius:14px;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px 16px;padding:13px 16px;display:flex}.detail code[data-v-6f4553ed]{overflow-wrap:anywhere}.warn-text[data-v-6f4553ed]{color:var(--warn);overflow-wrap:anywhere}.instructions[data-v-6f4553ed]{gap:11px;margin:0;padding-left:22px;line-height:1.65;display:grid}.notes[data-v-6f4553ed]{gap:8px;margin:0;padding-left:20px;font-size:13px;line-height:1.6;display:grid}.note[data-v-6f4553ed]{margin:-8px 0 0;font-size:12px}.checks[data-v-6f4553ed]{gap:8px;margin:0;padding:0;list-style:none;display:grid}.checks li[data-v-6f4553ed]{background:color-mix(in srgb, var(--surface-strong) 70%, transparent);border:1px solid var(--line);border-radius:14px;align-items:center;gap:12px;padding:10px 12px;display:flex}.checks li>div[data-v-6f4553ed]{flex:1;min-width:0;display:grid}.checks small[data-v-6f4553ed]{font-size:12px}.mark[data-v-6f4553ed]{border:2px solid var(--line);border-radius:50%;flex:none;place-items:center;width:22px;height:22px;font-size:11px;font-weight:700;display:grid}.done .mark[data-v-6f4553ed]{border-color:var(--ok);background:var(--ok);color:var(--accent-ink)}@media (width<=1000px){.connect[data-v-6f4553ed]{grid-template-columns:minmax(0,1fr)}}.embedding-profile[data-v-81d1c15e]{min-width:0}.fields[data-v-81d1c15e]{grid-template-columns:repeat(auto-fit,minmax(min(220px,100%),1fr));gap:14px;margin:16px 0;display:grid}.save-bar[data-v-81d1c15e]{position:relative;bottom:auto}.stats[data-v-cdde3f37]{flex-wrap:wrap;gap:8px;margin:12px 0;display:flex}.pill[data-v-cdde3f37]{background:var(--surface-2,#7f7f7f1f);border-radius:999px;padding:2px 10px;font-size:.85em}.pill.strong[data-v-cdde3f37]{font-weight:600}.pill.warn[data-v-cdde3f37]{color:var(--danger,#c0392b)}.waiting[data-v-cdde3f37]{margin:8px 0;padding-left:18px;font-size:.85em}.probe[data-v-cdde3f37]{grid-template-columns:minmax(140px,1fr) minmax(200px,3fr) auto;gap:8px;margin-top:12px;display:grid}.result ol[data-v-cdde3f37]{padding-left:20px}.result li[data-v-cdde3f37]{margin:6px 0}.library[data-v-8a9bd858]{gap:var(--gap);grid-template-columns:minmax(0,1fr);display:grid}.model-workspace[data-v-8a9bd858]{gap:var(--gap);grid-template-columns:minmax(260px,.32fr) minmax(0,1fr);align-items:start;display:grid}.shelf[data-v-8a9bd858]{background:radial-gradient(ellipse at 0 0, color-mix(in srgb, var(--glow-a) 23%, transparent), transparent 56%), var(--surface);gap:15px;display:grid;position:sticky;top:14px}.detail[data-v-8a9bd858]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-b) 16%, transparent), transparent 47%), var(--surface)}.usage-panel[data-v-8a9bd858]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 25%, transparent), transparent 42%), radial-gradient(ellipse at 0 100%, color-mix(in srgb, var(--glow-b) 20%, transparent), transparent 46%), var(--surface);grid-column:1/-1;gap:18px;display:grid;overflow:hidden}.usage-intro[data-v-8a9bd858]{justify-content:space-between;align-items:end;gap:20px;display:flex}.usage-intro h2[data-v-8a9bd858]{letter-spacing:-.04em;margin:5px 0 4px;font-size:22px}.usage-intro p[data-v-8a9bd858],.usage-foot small[data-v-8a9bd858]{color:var(--ink-soft);font-size:12px}.usage-total[data-v-8a9bd858]{flex:none;justify-items:end;display:grid}.usage-total strong[data-v-8a9bd858]{color:var(--accent);font:700 clamp(28px, 4vw, 42px) var(--font-display);letter-spacing:-.055em;font-variant-numeric:tabular-nums;line-height:1.05}.usage-total span[data-v-8a9bd858]{color:var(--ink-soft);font-size:12px}.usage-detail[data-v-8a9bd858]{grid-template-columns:repeat(4,minmax(0,1fr));gap:10px;display:grid}.usage-stat[data-v-8a9bd858]{background:#ffffff5c;border:1px solid #ffffffc7;border-radius:18px;gap:5px;min-width:0;padding:14px 16px;display:grid;box-shadow:inset 0 1px #fff}.usage-stat span[data-v-8a9bd858]{color:var(--ink-soft);font-size:12px}.usage-stat span small[data-v-8a9bd858]{font-size:10px}.usage-stat b[data-v-8a9bd858]{font-variant-numeric:tabular-nums;text-overflow:ellipsis;font-size:19px;overflow:hidden}.usage-foot[data-v-8a9bd858]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;display:flex}.usage-error[data-v-8a9bd858]{color:var(--danger)!important}.usage-refresh[data-v-8a9bd858]{color:var(--accent);font-size:12px}.shelf-head[data-v-8a9bd858]{justify-content:space-between;align-items:center;gap:8px;display:flex}.shelf-head h2[data-v-8a9bd858]{letter-spacing:-.04em;font-size:21px}.shelf-head small[data-v-8a9bd858]{color:var(--ink-soft);font-size:12px}.rows[data-v-8a9bd858]{gap:8px;max-height:520px;display:grid;overflow:auto}.saved-vendor[data-v-8a9bd858]{background:#fff3;border:1px solid #ffffffad;border-radius:17px;overflow:hidden;box-shadow:inset 0 1px #ffffffb8}.saved-vendor>summary[data-v-8a9bd858]{color:var(--ink);cursor:pointer;justify-content:space-between;align-items:center;gap:8px;padding:11px 13px;font-size:12px;font-weight:700;list-style:none;display:flex}.saved-vendor>summary[data-v-8a9bd858]::-webkit-details-marker{display:none}.vendor-summary[data-v-8a9bd858]::-webkit-details-marker{display:none}.saved-vendor>summary[data-v-8a9bd858]:after{color:var(--accent);content:"⌄";transition:transform .24s var(--spring);font-size:15px}.saved-vendor[open]>summary[data-v-8a9bd858]{background:#ffffff40;border-bottom:1px solid #fff9}.saved-vendor[open]>summary[data-v-8a9bd858]:after{transform:rotate(180deg)}.saved-vendor>summary small[data-v-8a9bd858]{color:var(--ink-soft);margin-left:auto;font-size:10px;font-weight:500}.vendor-models[data-v-8a9bd858]{gap:6px;padding:7px;display:grid}.entity-row[data-v-8a9bd858]{text-align:left;-webkit-backdrop-filter:blur(16px)saturate(1.5);backdrop-filter:blur(16px)saturate(1.5);width:100%;transition:transform .32s var(--spring), background-color .2s, box-shadow .25s;background:#ffffff5c;border:1px solid #ffffffbf;border-radius:18px;align-items:center;gap:10px;padding:11px 12px;display:flex;box-shadow:inset 0 1px #fff}.entity-row[data-v-8a9bd858]:hover:not(:disabled){box-shadow:0 12px 22px -19px var(--accent);background:#ffffffa8;transform:translate(4px)scale(1.01)}.entity-row.selected[data-v-8a9bd858]{border-color:color-mix(in srgb, var(--accent) 22%, white);background:linear-gradient(115deg, white, color-mix(in srgb, var(--accent-soft) 60%, white));box-shadow:inset 0 1px 0 white, 0 13px 23px -20px var(--accent)}.badge[data-v-8a9bd858]{background:linear-gradient(145deg, white, hsl(var(--hue) 70% 88%));width:36px;height:36px;color:hsl(var(--hue) 45% 25%);box-shadow:inset 0 1px 0 white, 0 5px 13px -10px hsl(var(--hue) 45% 32%);border-radius:14px;flex:none;place-items:center;font-weight:700;display:grid}.who[data-v-8a9bd858]{min-width:0;line-height:1.35;display:grid}.who b[data-v-8a9bd858]{text-overflow:ellipsis;white-space:nowrap;font-size:13.5px;overflow:hidden}.who small[data-v-8a9bd858]{color:var(--ink-soft);font-size:11.5px;font-weight:500}fieldset[data-v-8a9bd858]{background:linear-gradient(142deg, #ffffffa1, #ffffff47), var(--surface);box-shadow:inset 0 1px 0 white, 0 14px 30px -27px var(--accent);-webkit-backdrop-filter:blur(20px)saturate(1.6);backdrop-filter:blur(20px)saturate(1.6);border:1px solid #ffffffcf;border-radius:24px;gap:10px;margin:0;padding:20px;display:grid}legend[data-v-8a9bd858]{padding:0 8px;font-size:13px;font-weight:700}.advanced summary[data-v-8a9bd858]{color:var(--accent);transition:transform .3s var(--spring), background-color .2s;background:#ffffff6b;border:1px solid #fffc;border-radius:14px;padding:12px 15px;font-weight:600;box-shadow:inset 0 1px #fff}.advanced summary[data-v-8a9bd858]:hover{background:#ffffffa6;transform:translate(3px)}.advanced[open] summary[data-v-8a9bd858]{margin-bottom:12px}.caps[data-v-8a9bd858]{flex-wrap:wrap;gap:8px 18px;margin-top:10px;display:flex}.actions[data-v-8a9bd858]{flex-wrap:wrap;gap:8px;display:flex}.actions .push[data-v-8a9bd858]{margin-left:auto}.model-picker[data-v-8a9bd858]{gap:16px;display:grid}.catalog-search[data-v-8a9bd858]{color:var(--ink-soft);gap:6px;font-size:12px;font-weight:600;display:grid}.catalog-search input[data-v-8a9bd858]{width:100%;min-height:42px;color:var(--ink);-webkit-backdrop-filter:blur(14px)saturate(1.4);backdrop-filter:blur(14px)saturate(1.4);background:#ffffff9e;border:1px solid #ffffffd9;border-radius:14px;outline:none;padding:0 13px;box-shadow:inset 0 1px #fff}.catalog-search input[data-v-8a9bd858]:focus{border-color:color-mix(in srgb, var(--accent) 42%, white);box-shadow:0 0 0 3px color-mix(in srgb, var(--accent) 10%, transparent)}.vendor[data-v-8a9bd858]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 13%, transparent), transparent 48%), #ffffff3b;-webkit-backdrop-filter:blur(18px)saturate(1.35);backdrop-filter:blur(18px)saturate(1.35);border:1px solid #ffffffb8;border-radius:21px;overflow:hidden;box-shadow:inset 0 1px #ffffffc7}.vendor-summary[data-v-8a9bd858]{cursor:pointer;justify-content:space-between;align-items:center;gap:12px;min-height:62px;padding:12px 17px;list-style:none;transition:background-color .2s;display:flex}.vendor-summary[data-v-8a9bd858]:hover{background:#ffffff57}.vendor-name[data-v-8a9bd858]{align-items:center;gap:10px;min-width:0;display:flex}.vendor-name b[data-v-8a9bd858]{font-size:13px}.vendor-name small[data-v-8a9bd858]{color:var(--ink-soft);font-size:10px}.vendor-chevron[data-v-8a9bd858]{color:var(--accent);transition:transform .28s var(--spring);font-size:20px;line-height:1}.vendor[open] .vendor-chevron[data-v-8a9bd858]{transform:rotate(180deg)}.vendor[open] .presets[data-v-8a9bd858]{animation:vendor-reveal-8a9bd858 .24s var(--spring) both}@keyframes vendor-reveal-8a9bd858{0%{opacity:0;transform:translateY(-5px)}to{opacity:1;transform:translateY(0)}}.search-empty[data-v-8a9bd858]{margin:0}.presets[data-v-8a9bd858]{grid-template-columns:repeat(auto-fill,minmax(220px,1fr));gap:8px;padding:0 12px 12px;display:grid}.preset-card[data-v-8a9bd858]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 22%, transparent), transparent 55%), #ffffff80;box-shadow:inset 0 1px 0 white, 0 12px 22px -20px var(--accent);text-align:left;-webkit-backdrop-filter:blur(16px)saturate(1.5);backdrop-filter:blur(16px)saturate(1.5);transition:transform .42s var(--spring), box-shadow .25s;border:1px solid #ffffffd1;border-radius:21px;justify-items:start;gap:3px;padding:17px;font-weight:500;display:grid}.preset-card[data-v-8a9bd858]:hover:not(:disabled){box-shadow:inset 0 1px 0 white, 0 22px 33px -22px var(--accent);transform:translateY(-6px)rotate(-.5deg)scale(1.025)}.preset-card small[data-v-8a9bd858]{color:var(--ink-soft);font-size:11.5px}@media (width<=900px){.model-workspace[data-v-8a9bd858]{grid-template-columns:minmax(0,1fr)}.usage-panel[data-v-8a9bd858]{grid-column:auto}.shelf[data-v-8a9bd858]{position:static}}@media (width<=620px){.usage-intro[data-v-8a9bd858]{flex-direction:column;align-items:start}.usage-total[data-v-8a9bd858]{justify-items:start}.usage-detail[data-v-8a9bd858]{grid-template-columns:repeat(2,minmax(0,1fr))}}.runtime-grid[data-v-1f197523]{gap:var(--gap);grid-template-columns:minmax(0,1.55fr) minmax(260px,.8fr);align-items:start;display:grid}.runtime-grid>.card[data-v-1f197523]{background:radial-gradient(ellipse at 90% 0, color-mix(in srgb, var(--glow-a) 20%, transparent), transparent 55%), var(--surface)}.runtime-grid .card-head h2[data-v-1f197523]{letter-spacing:-.035em;margin-top:5px;font-size:23px}.switches[data-v-1f197523]{gap:12px;margin-bottom:20px;display:grid}.switches[data-v-1f197523] .switch{box-shadow:inset 0 1px 0 white, 0 10px 22px -23px var(--accent);-webkit-backdrop-filter:blur(18px)saturate(1.5);backdrop-filter:blur(18px)saturate(1.5);transition:transform .35s var(--spring), background-color .2s;background:#ffffff69;border:1px solid #ffffffc7;border-radius:22px;align-items:flex-start;padding:18px}.switches[data-v-1f197523] .switch:hover{background:#ffffffa3;transform:translateY(-3px)scale(1.008)}.switches[data-v-1f197523] .switch>span{gap:2px;display:grid}.switches small[data-v-1f197523]{color:var(--ink-soft);font-size:12.5px;font-weight:400}.numbers[data-v-1f197523]{gap:12px;display:grid}.numbers button[data-v-1f197523],.numbers .stat[data-v-1f197523]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-b) 24%, transparent), transparent 63%), #ffffff70;box-shadow:inset 0 1px 0 white, 0 12px 26px -24px var(--accent);text-align:left;-webkit-backdrop-filter:blur(18px)saturate(1.55);backdrop-filter:blur(18px)saturate(1.55);transition:transform .38s var(--spring), box-shadow .23s;border:1px solid #ffffffd4;border-radius:22px;justify-items:start;gap:2px;padding:20px 21px;display:grid}.numbers button[data-v-1f197523]:hover:not(:disabled){box-shadow:inset 0 1px 0 white, 0 18px 28px -22px var(--accent);transform:translate(5px)scale(1.018)}.numbers b[data-v-1f197523]{font:750 29px var(--font-display);color:var(--accent)}.numbers .stat.warn b[data-v-1f197523]{color:var(--warn)}.numbers .stat.danger b[data-v-1f197523]{color:var(--danger)}.numbers span[data-v-1f197523]{color:var(--ink-soft);font-size:12.5px;font-weight:500}@media (width<=900px){.runtime-grid[data-v-1f197523]{grid-template-columns:minmax(0,1fr)}}.search-profile[data-v-e874d8b6]{gap:16px;min-width:0;display:grid}.search-profile form[data-v-e874d8b6]{gap:18px;display:grid}.search-fields[data-v-e874d8b6]{grid-template-columns:repeat(2,minmax(0,1fr));gap:16px;display:grid}.search-fields label[data-v-e874d8b6]{gap:8px;min-width:0;display:grid}.search-fields input[data-v-e874d8b6],.search-fields .menu-select[data-v-e874d8b6]{width:100%;min-width:0}.search-usage[data-v-e874d8b6]{flex-wrap:wrap;align-items:center;gap:12px;display:flex}.search-result[data-v-e874d8b6]{border:1px solid var(--line);background:var(--surface);overflow-wrap:anywhere;border-radius:16px;padding:14px 16px}.search-result.failed[data-v-e874d8b6]{border-color:color-mix(in srgb, var(--warn) 40%, var(--line))}@media (width<=620px){.search-fields[data-v-e874d8b6]{grid-template-columns:minmax(0,1fr)}}.data-transfer[data-v-ea16c0c1]{min-width:0}.data-transfer h2[data-v-ea16c0c1]{margin:8px 0 14px;font-size:clamp(23px,3vw,32px)}.transfer-note[data-v-ea16c0c1]{color:var(--ink-soft);overflow-wrap:anywhere;font-size:13px;line-height:1.7}.transfer-actions[data-v-ea16c0c1]{flex-wrap:wrap;gap:10px;margin:18px 0;display:flex}.transfer-actions button[data-v-ea16c0c1]{border-radius:16px;padding:11px 17px}.transfer-actions button[data-v-ea16c0c1]:not(.primary){background:#ffffffb8}.transfer-file[data-v-ea16c0c1]{display:none}.transfer-preview[data-v-ea16c0c1]{overflow-wrap:anywhere;background:#fff6;border:1px solid #ffffffd9;border-radius:22px;margin-top:20px;padding:20px}.transfer-preview h3[data-v-ea16c0c1]{margin:8px 0}.transfer-counts[data-v-ea16c0c1]{flex-wrap:wrap;gap:10px;display:flex}.transfer-counts>div[data-v-ea16c0c1]{background:#ffffffa6;border-radius:14px;gap:4px;min-width:70px;padding:12px;display:grid}.transfer-counts b[data-v-ea16c0c1],.transfer-progress[data-v-ea16c0c1]{color:var(--accent)}.transfer-counts span[data-v-ea16c0c1]{color:var(--ink-soft);font-size:12px}.transfer-error[data-v-ea16c0c1]{color:var(--danger);overflow-wrap:anywhere}.storage-page[data-v-4593780e]{gap:var(--gap);display:grid}.storage-page>.card[data-v-4593780e],.storage-grid>.card[data-v-4593780e]{background:radial-gradient(ellipse at 100% 0, color-mix(in srgb, var(--glow-a) 20%, transparent), transparent 60%), var(--surface)}.storage-overview h2[data-v-4593780e]{margin:8px 0;font-size:clamp(24px,3vw,36px)}.storage-overview p[data-v-4593780e],.storage-note[data-v-4593780e]{color:var(--ink-soft);font-size:13px;line-height:1.65}.storage-metrics[data-v-4593780e]{flex-wrap:wrap;gap:12px;margin-top:22px;display:flex}.storage-metrics>div[data-v-4593780e]{background:#ffffff6b;border:1px solid #fffc;border-radius:18px;gap:3px;min-width:150px;padding:15px 20px;display:grid}.storage-metrics b[data-v-4593780e]{color:var(--accent);font-size:23px}.storage-metrics span[data-v-4593780e]{color:var(--ink-soft);font-size:12px}.storage-grid[data-v-4593780e]{gap:var(--gap);grid-template-columns:minmax(270px,.8fr) minmax(0,1.5fr);align-items:start;display:grid}.storage-grid .card-head h2[data-v-4593780e]{margin:4px 0 16px;font-size:23px}.storage-check[data-v-4593780e]{align-items:center;gap:9px;margin-bottom:16px;display:flex}.storage-fields[data-v-4593780e]{gap:13px;display:grid}.storage-fields label[data-v-4593780e]{color:var(--ink-soft);gap:6px;font-size:12px;font-weight:700;display:grid}.storage-fields input[data-v-4593780e]{border:1px solid color-mix(in srgb, var(--accent) 25%, white);width:100%;min-width:0;color:var(--ink);background:#ffffffb3;border-radius:15px;padding:11px 13px}.storage-policy .primary[data-v-4593780e]{margin-top:14px}.storage-actions[data-v-4593780e]{flex-wrap:wrap;gap:8px;margin:16px 0;display:flex}.storage-actions button[data-v-4593780e]{background:#ffffffa6;border-radius:999px;padding:8px 12px}.storage-scroll[data-v-4593780e]{gap:7px;max-height:520px;padding:2px;display:grid;overflow:auto}.storage-row[data-v-4593780e]{cursor:pointer;background:#ffffff7a;border:1px solid #ffffffbf;border-radius:16px;align-items:center;gap:12px;min-width:0;padding:10px 12px;display:flex}.storage-row.protected[data-v-4593780e]{opacity:.7;cursor:default}.storage-item[data-v-4593780e]{flex:1;gap:3px;min-width:0;display:grid}.storage-item strong[data-v-4593780e]{text-overflow:ellipsis;white-space:nowrap;font-size:12px;overflow:hidden}.storage-item small[data-v-4593780e]{color:var(--ink-soft);font-size:11px}.storage-row>b[data-v-4593780e]{white-space:nowrap;color:var(--accent);font-size:12px}.storage-footer[data-v-4593780e]{color:var(--ink-soft);flex-wrap:wrap;justify-content:space-between;align-items:center;gap:10px;padding-top:18px;font-size:12px;display:flex}.storage-error[data-v-4593780e]{color:var(--danger);overflow-wrap:anywhere}@media (width<=900px){.storage-grid[data-v-4593780e]{grid-template-columns:minmax(0,1fr)}}@media (width<=560px){.storage-row[data-v-4593780e]{flex-wrap:wrap;align-items:flex-start}.storage-row>b[data-v-4593780e]{margin-left:26px}.storage-metrics>div[data-v-4593780e]{flex:1;min-width:130px}}.password-settings[data-v-36cd9f70]{margin-top:24px}form[data-v-36cd9f70]{gap:16px;max-width:520px;display:grid}label[data-v-36cd9f70]{gap:8px;display:grid}input[data-v-36cd9f70]{box-sizing:border-box;width:100%}.update-settings[data-v-0df58391]{gap:14px;display:grid}header[data-v-0df58391]{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:14px;display:flex}h2[data-v-0df58391]{margin-top:5px}.version-state[data-v-0df58391]{font-weight:700}.version-state.available[data-v-0df58391]{color:var(--accent)}.small-text[data-v-0df58391]{font-size:12px}.update-how[data-v-0df58391]{border:1px solid var(--line);background:var(--surface);border-radius:18px;padding:14px}code[data-v-0df58391]{white-space:pre-wrap;overflow-wrap:anywhere;margin-top:9px;display:block}.update-links[data-v-0df58391]{gap:18px;font-size:13px;display:flex}.system[data-v-a12a372e]{gap:var(--gap);display:grid}.system-intro[data-v-a12a372e]{background:radial-gradient(ellipse at 90% 7%, color-mix(in srgb, var(--glow-a) 48%, transparent), transparent 51%), radial-gradient(ellipse at 62% 115%, color-mix(in srgb, var(--glow-b) 38%, transparent), transparent 55%), linear-gradient(115deg, #fffc, #ffffff4d);min-height:190px;box-shadow:inset 0 2px 0 white, 0 25px 54px -35px color-mix(in srgb, var(--accent) 43%, transparent);-webkit-backdrop-filter:blur(28px)saturate(1.8);backdrop-filter:blur(28px)saturate(1.8);border:1px solid #ffffffd9;border-radius:36px;flex-wrap:wrap;justify-content:space-between;align-items:end;gap:20px;padding:32px clamp(26px,5vw,60px);display:flex;position:relative;overflow:hidden}.system-intro[data-v-a12a372e]:before{content:"";width:350px;height:350px;box-shadow:0 0 0 29px #ffffff21, 0 0 0 58px color-mix(in srgb, var(--glow-b) 12%, transparent);pointer-events:none;border:1px solid #ffffffb8;border-radius:50%;animation:10s ease-in-out infinite alternate system-bob-a12a372e;position:absolute;top:-85%;right:13%}.system-intro h1[data-v-a12a372e]{letter-spacing:-.055em;margin:10px 0 7px;font-size:clamp(28px,3.25vw,42px)}.system-intro h1 em[data-v-a12a372e]{color:var(--accent);font-style:normal}.system-intro p[data-v-a12a372e]{max-width:560px;color:var(--ink-soft);font-size:13.5px;position:relative}.system-status[data-v-a12a372e]{z-index:1;box-shadow:inset 0 1px 0 white, 0 7px 19px -15px var(--accent);white-space:nowrap;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px);background:#ffffff87;border:1px solid #fff;border-radius:999px;align-items:center;gap:9px;padding:10px 16px;font-size:12.5px;font-weight:700;display:inline-flex}.system-status i[data-v-a12a372e]{background:var(--ok);width:9px;height:9px;box-shadow:0 0 0 4px color-mix(in srgb, var(--ok) 18%, transparent);border-radius:50%;animation:2.6s ease-in-out infinite pulse-soft}.system-status i.off[data-v-a12a372e]{background:var(--ink-faint);box-shadow:0 0 0 4px color-mix(in srgb, var(--ink-faint) 14%, transparent);animation:none}.system>.tabs[data-v-a12a372e]{box-shadow:inset 0 1px 0 white, 0 10px 30px -24px var(--accent);-webkit-backdrop-filter:blur(22px)saturate(1.7);backdrop-filter:blur(22px)saturate(1.7);border:1px solid #fffc;justify-self:start;padding:5px}.system[data-v-a12a372e]>.tabs button{transition:transform .35s var(--spring), background-color .2s, box-shadow .2s;border-radius:999px;padding:9px 18px}.system[data-v-a12a372e]>.tabs button:hover{transform:translateY(-2px)scale(1.03)}.system[data-v-a12a372e] .connect .step,.system[data-v-a12a372e] .connect .checks li{background:linear-gradient(145deg, #ffffffad, #ffffff47), var(--surface);box-shadow:inset 0 1px 0 white, 0 12px 24px -24px var(--accent);-webkit-backdrop-filter:blur(18px)saturate(1.55);backdrop-filter:blur(18px)saturate(1.55);transition:transform .35s var(--spring), box-shadow .25s;border:1px solid #ffffffd9;border-radius:22px}.system[data-v-a12a372e] .connect .step:hover,.system[data-v-a12a372e] .connect .checks li:hover{box-shadow:inset 0 1px 0 white, 0 16px 28px -21px var(--accent);transform:translateY(-3px)}.system[data-v-a12a372e] .connect .num{background:linear-gradient(145deg, white, color-mix(in srgb, var(--glow-a) 75%, white));box-shadow:inset 0 1px 0 white, 0 5px 14px -9px var(--accent);color:var(--accent);border:1px solid #fff}@keyframes system-bob-a12a372e{to{transform:translateY(22px)scale(1.08)}}@media (width<=760px){.system-intro[data-v-a12a372e]{min-height:0;padding:27px 23px}}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{Ct as e,D as t,Dt as n,Et as r,G as i,H as a,I as o,J as s,M as c,P 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,i as C,j as w,lt as ee,m as T,n as E,o as te,rt as D,s as O,t as ne,tt as k,ut as re,v as A,wt as j,yt as ie}from"./Empty-DRsHeX-L.js";import{v as M,y as N}from"./mind-BBAstMqH.js";import{a as ae,b as oe,c as se,n as ce,o as le}from"./index-WAvrlAcO.js";var P=[`aria-label`],F={class:`agenda-heading`},I={class:`eyebrow`},L=[`aria-label`],R=[`aria-pressed`],z=[`aria-pressed`],B={class:`muted`},V={class:`agenda-legend`},ue={class:`legend-actual`},de={class:`legend-plan`},H={class:`legend-free`},U={class:`legend-point`},W={class:`agenda-chart`},G={class:`agenda-axis`},fe={class:`agenda-lane`},pe={class:`lane-label`},me={class:`lane-track`},he=[`title`,`aria-label`,`onClick`],ge=[`title`],K={class:`agenda-lane`},q={class:`lane-label`},J={class:`lane-track`},_e=[`title`,`aria-label`,`onClick`],Y=[`title`],X={key:0,class:`agenda-history`},Z={class:`agenda-itinerary`},ve=[`onClick`],Q={key:1,class:`faint`},$={key:2,class:`faint`},ye={class:`agenda-itinerary`},be=[`data-kind`],xe=[`onClick`],Se={key:0,class:`muted`},Ce={key:2,class:`faint`},we={key:3,class:`faint`},Te={key:4,class:`agenda-waiting`,open:``},Ee=[`onClick`],De={class:`muted`},Oe={key:5,class:`agenda-waiting`,open:``},ke=[`onClick`],Ae={class:`muted`},je={key:6,class:`agenda-waiting`,open:``},Me=[`onClick`],Ne={class:`muted`},Pe=E(D({__name:`DayAgenda`,props:{agenda:{}},emits:[`task`],setup(e,{emit:t}){let a=e,l=t,p=d(!0),m=s(()=>{let e=a.agenda;if(!p.value)return[e.start,e.end];let t=Math.max(e.start,Math.min(e.end-216e5,Math.floor((e.now-e.start)/36e5)*36e5+e.start-36e5));return[t,Math.min(e.end,t+216e5)]}),_=e=>e===a.agenda.end?`24:00`:N(c(),{timeZone:a.agenda.zone,hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`}).format(new Date(e)),v=e=>(e-m.value[0])/(m.value[1]-m.value[0])*100,y=e=>(e.chartEnd??e.end)>e.start&&(e.chartEnd??e.end)>m.value[0]&&e.start<m.value[1],C=e=>({left:Math.max(0,v(e.start))+`%`,width:Math.max(.3,Math.min(100,v(e.chartEnd??e.end))-Math.max(0,v(e.start)))+`%`}),w=s(()=>Array.from({length:7},(e,t)=>m.value[0]+(m.value[1]-m.value[0])*t/6)),ee=s(()=>a.agenda.planned.filter(e=>e.kind!==`sleep`).slice(0,18)),T=e=>`${_(e.start)} — ${_(e.end)} · ${e.title} · ${e.label||{rest:o(`休息建议`),free:o(`自由安排`),sleep:o(`作息安排`)}[e.kind]||o(`已发生`)}`,E=e=>e.engagedMs===null?o(`此前时长未单独记录`):o(`实际投入 {v} 分钟`,{v:Math.floor(e.engagedMs/6e4)});return(t,a)=>(b(),u(`section`,{class:`card day-agenda`,"aria-label":j(o)(`今日时间表`)},[h(`div`,F,[h(`div`,null,[h(`span`,I,n(e.agenda.date),1),h(`h2`,null,n(j(o)(`今日时间表`)),1)]),h(`div`,{class:`agenda-range`,role:`group`,"aria-label":j(o)(`时间表显示范围`)},[h(`button`,{"aria-pressed":p.value,onClick:a[0]||=e=>p.value=!0},n(j(o)(`此刻附近`)),9,R),h(`button`,{"aria-pressed":!p.value,onClick:a[1]||=e=>p.value=!1},n(j(o)(`全天`)),9,z)],8,L)]),h(`p`,B,n(e.agenda.note),1),h(`div`,V,[h(`span`,ue,n(j(o)(`实际时段`)),1),h(`span`,de,n(j(o)(`选定的安排`)),1),h(`span`,H,n(j(o)(`作息 / 空白`)),1),h(`span`,U,n(j(o)(`● 伴随交流`)),1)]),h(`div`,W,[h(`div`,G,[(b(!0),u(i,null,S(w.value,(e,t)=>(b(),u(`time`,{key:e,style:r({left:t*100/6+`%`})},n(_(e)),5))),128))]),h(`div`,fe,[h(`span`,pe,n(j(o)(`已发生`)),1),h(`div`,me,[(b(!0),u(i,null,S(w.value.slice(0,-1),(e,t)=>(b(),u(`i`,{key:e,class:`gridline`,style:r({left:t*100/6+`%`})},null,4))),128)),(b(!0),u(i,null,S(e.agenda.actual.filter(y),e=>(b(),u(`button`,{key:e.id,class:f([`agenda-block actual`,{ongoing:e.ongoing}]),style:r(C(e)),title:T(e)+` · `+E(e),"aria-label":T(e),onClick:t=>l(`task`,e.taskId)},null,14,he))),128)),(b(!0),u(i,null,S(e.agenda.interactions.filter(e=>e.at>=m.value[0]&&e.at<m.value[1]),e=>(b(),u(`span`,{key:e.id,class:`agenda-interaction`,style:r({left:v(e.at)+`%`}),title:_(e.at)+j(o)(` · 伴随交流`)},null,12,ge))),128)),v(e.agenda.now)>=0&&v(e.agenda.now)<=100?(b(),u(`span`,{key:0,class:`agenda-now`,style:r({left:v(e.agenda.now)+`%`})},[h(`small`,null,n(j(o)(`现在`)),1)],4)):g(``,!0)])]),h(`div`,K,[h(`span`,q,n(j(o)(`接下来`)),1),h(`div`,J,[(b(!0),u(i,null,S(w.value.slice(0,-1),(e,t)=>(b(),u(`i`,{key:e,class:`gridline`,style:r({left:t*100/6+`%`})},null,4))),128)),(b(!0),u(i,null,S(e.agenda.planned.filter(y),e=>(b(),u(i,{key:e.id},[e.taskId?(b(),u(`button`,{key:0,class:`agenda-block plan`,style:r(C(e)),title:T(e),"aria-label":T(e),onClick:t=>l(`task`,e.taskId)},null,12,_e)):(b(),u(`span`,{key:1,class:f([`agenda-block`,e.kind]),style:r(C(e)),title:T(e)},null,14,Y))],64))),128))])])]),e.agenda.actual.length?(b(),u(`details`,X,[h(`summary`,null,n(j(o)(`已经走过的时段 · {length} 段`,{length:e.agenda.actual.length})),1),h(`ol`,Z,[(b(!0),u(i,null,S(e.agenda.actual,e=>(b(),u(`li`,{key:e.id},[h(`time`,null,[x(n(_(e.start)),1),a[2]||=h(`br`,null,null,-1),x(n(_(e.end)),1)]),h(`div`,null,[h(`button`,{class:`text-button`,onClick:t=>l(`task`,e.taskId)},n(e.title),9,ve),h(`small`,null,n(e.label)+` · `+n(E(e)),1)])]))),128))])])):(b(),u(`p`,Q,n(j(o)(`今天还没有活动记录,实际开始后会显示在上方。`)),1)),h(`h3`,null,n(j(o)(`她定下的安排`)),1),ee.value.length?g(``,!0):(b(),u(`p`,$,n(j(o)(`还没有选定活动时间,留白由她再决定,不按待办队列填满。`)),1)),h(`ol`,ye,[(b(!0),u(i,null,S(ee.value,e=>(b(),u(`li`,{key:e.id,"data-kind":e.kind},[h(`time`,null,[x(n(_(e.start)),1),a[3]||=h(`br`,null,null,-1),x(n(_(e.end)),1)]),h(`div`,null,[e.taskId?(b(),u(i,{key:0},[h(`button`,{class:`text-button`,onClick:t=>l(`task`,e.taskId)},n(e.title),9,xe),h(`small`,null,n(j(o)(`{label} · {v} · {durationMinutes} 分钟 · {scope}`,{label:e.label,v:e.kindOfTask===`plan`?j(o)(`自己的安排`):e.kindOfTask===`promise`?j(o)(`答应的事`):j(o)(`外部建议`),durationMinutes:e.durationMinutes,scope:e.scope})),1),e.why?(b(),u(`p`,Se,n(e.why),1)):g(``,!0)],64)):(b(),u(i,{key:1},[h(`b`,null,n(e.title),1),h(`small`,null,n(e.kind===`free`?j(o)(`可以想自己的事,也可以歇着;不算已做过`):j(o)(`预计,做完眼前这段再调整`)),1)],64)),e.interruptedAt?(b(),u(`p`,Ce,n(_(e.interruptedAt))+` `+n(e.interruption===`sleep`?j(o)(`进入睡眠安排,醒来后再选择续接时间。`):j(o)(`有更高优先级安排,届时先让位,之后再选续接时间。`)),1)):g(``,!0)])],8,be))),128))]),e.agenda.planned.some(e=>e.kind===`sleep`)?(b(),u(`p`,we,n(j(o)(`睡眠安排:{v}`,{v:e.agenda.planned.filter(e=>e.kind===`sleep`).map(e=>_(e.start)+` — `+_(e.end)).join(`、`)})),1)):g(``,!0),e.agenda.unarranged?.length?(b(),u(`details`,Te,[h(`summary`,null,n(j(o)(`已记下,还没选时间 · {length} 件`,{length:e.agenda.unarranged.length})),1),h(`ul`,null,[(b(!0),u(i,null,S(e.agenda.unarranged,e=>(b(),u(`li`,{key:e.id},[h(`button`,{class:`text-button`,onClick:t=>l(`task`,e.id)},n(e.title),9,Ee),h(`p`,De,n(e.reason),1)]))),128))])])):g(``,!0),e.agenda.paused?.length?(b(),u(`details`,Oe,[h(`summary`,null,n(j(o)(`暂时停下来,进度保留 · {length} 件`,{length:e.agenda.paused.length})),1),h(`ul`,null,[(b(!0),u(i,null,S(e.agenda.paused,e=>(b(),u(`li`,{key:e.id},[h(`button`,{class:`text-button`,onClick:t=>l(`task`,e.id)},n(e.title),9,ke),h(`p`,Ae,n(e.reason),1)]))),128))])])):g(``,!0),e.agenda.waiting.length?(b(),u(`details`,je,[h(`summary`,null,n(j(o)(`需要条件或调整约定 · {length} 件`,{length:e.agenda.waiting.length})),1),h(`ul`,null,[(b(!0),u(i,null,S(e.agenda.waiting,e=>(b(),u(`li`,{key:e.id},[h(`button`,{class:`text-button`,onClick:t=>l(`task`,e.id)},n(e.title),9,Me),h(`p`,Ne,n(e.reason),1)]))),128))])])):g(``,!0)],8,P))}}),[[`__scopeId`,`data-v-10b48f6c`]]),Fe=[`aria-label`],Ie={class:`experience-intro`},Le={class:`eyebrow`},Re={class:`experience-date`},ze={class:`experience-timeline`},Be=[`data-experience`],Ve=[`datetime`],He={class:`card experience-card`},Ue={class:`experience-meta`},We={class:`experience-kind`},Ge={key:0,class:`faint`},Ke={key:0,class:`experience-summary`},qe={key:1,class:`faint experience-missing`},Je={key:2,class:`experience-project faint`},Ye={key:3,class:`experience-actions`},Xe=[`onClick`],Ze=[`onClick`],Qe={key:4,class:`experience-materials`},$e=[`onClick`],et={class:`experience-capability`},tt={class:`faint`},nt={class:`muted`},rt=E(D({__name:`ExperienceLog`,props:{rows:{},zone:{},loading:{type:Boolean}},emits:[`work`,`project`,`source`],setup(e,{emit:t}){let r=e,a=t,l=s(()=>{let e=N(c(),{timeZone:r.zone,year:`numeric`,month:`long`,day:`numeric`,weekday:`short`}),t=[];for(let n of r.rows){let r=e.format(n.created);t.at(-1)?.date!==r&&t.push({date:r,rows:[]}),t.at(-1).rows.push(n)}return t});function d(e){return N(c(),{timeZone:r.zone,hour:`2-digit`,minute:`2-digit`,hourCycle:`h23`}).format(e)}return(t,r)=>(b(),u(`section`,{class:`experience-log`,"aria-label":j(o)(`体验记录`)},[h(`header`,Ie,[h(`div`,null,[h(`span`,Le,n(j(o)(`EXPERIENCES · 留下的经历`)),1),h(`h1`,null,n(j(o)(`最近做过的事`)),1)]),h(`p`,null,n(j(o)(`故事写到哪里,玩过什么,又留下了哪些想法。`)),1)]),(b(!0),u(i,null,S(l.value,e=>(b(),u(`section`,{key:e.date,class:`experience-day`},[h(`h2`,Re,n(e.date),1),h(`div`,ze,[(b(!0),u(i,null,S(e.rows,e=>(b(),u(`article`,{key:e.id,class:`experience-entry`,"data-experience":e.id},[h(`time`,{class:`experience-clock`,datetime:new Date(e.created).toISOString()},n(d(e.created)),9,Ve),h(`div`,He,[h(`div`,Ue,[h(`span`,We,n(j(o)(`{label}记录`,{label:e.label})),1),e.work?(b(),u(`span`,Ge,n(j(o)(`{v} · {characters} 字 · 版本 {version}`,{v:e.work.state===`complete`?j(o)(`已保存成果`):j(o)(`已保存草稿`),characters:e.work.characters,version:e.work.version})),1)):g(``,!0)]),h(`h3`,null,n(e.title),1),e.summary?(b(),u(`p`,Ke,n(e.summary),1)):(b(),u(`p`,qe,n(j(o)(`这条旧记录没有保存摘要。`)),1)),e.project?.title&&e.project.title!==e.title?(b(),u(`p`,Je,n(j(o)(`来自 {title}`,{title:e.project.title})),1)):g(``,!0),e.work||e.project?(b(),u(`div`,Ye,[e.work?(b(),u(`button`,{key:0,onClick:t=>a(`work`,e.work.id,e.work.version)},[x(n(e.activity===`write`?j(o)(`阅读这一稿`):j(o)(`阅读完整记录`)),1),r[0]||=h(`span`,{"aria-hidden":`true`},` →`,-1)],8,Xe)):g(``,!0),e.project?(b(),u(`button`,{key:1,class:`text-button`,onClick:t=>a(`project`,e.project.id)},n(j(o)(`查看项目`)),9,Ze)):g(``,!0)])):g(``,!0),e.materials?.length?(b(),u(`details`,Qe,[h(`summary`,null,n(j(o)(`接触的内容 · {length} 份`,{length:e.materials.length})),1),h(`ul`,null,[(b(!0),u(i,null,S(e.materials,e=>(b(),u(`li`,{key:e.id},[h(`button`,{class:`text-button`,onClick:t=>a(`source`,e.id)},n(e.title||j(o)(`未命名资料`)),9,$e)]))),128))])])):g(``,!0)])],8,Be))),128))])]))),128)),!e.loading&&!e.rows.length?(b(),m(ne,{key:0,title:j(o)(`这里还没有经历记录`),text:j(o)(`做过的事与保存的成果,会逐渐出现在这里。`)},null,8,[`title`,`text`])):g(``,!0),h(`details`,et,[h(`summary`,null,[x(n(j(o)(`游戏客户端连接`))+` `,1),h(`span`,tt,n(j(o)(`开发中`)),1)]),h(`p`,nt,n(j(o)(`客户端控制尚未接入。已有的游玩记录可以在上方阅读。`)),1)])],8,Fe))}}),[[`__scopeId`,`data-v-400cba84`]]),it={class:`page time-page`},at={class:`time-intro`},ot={class:`eyebrow`},st={class:`time-clock`,"aria-hidden":`true`},ct={key:0,class:`card`,role:`alert`},lt={key:1,class:`muted`,role:`status`},ut={class:`time-today`},dt={class:`card main-activity`},ft={class:`eyebrow`},pt={class:`chip`},mt={key:0,class:`faint`},ht={key:1,class:`faint`},gt={class:`muted`},_t={class:`muted`},vt={key:0,class:`faint`},yt={class:`card day-balance`},bt={class:`eyebrow`},xt={class:`muted`},St={key:1,class:`card own-care`},Ct={class:`eyebrow`},wt={key:0,class:`muted`},Tt={key:1,class:`faint`},Et=[`disabled`],Dt={class:`card time-settings`},Ot=[`disabled`],kt={key:1},At={class:`sr-only`},jt=[`placeholder`],Mt={key:2},Nt={key:0,class:`time-cards`},Pt=[`data-task`],Ft={class:`row task-meta`},It=[`data-tone`],Lt={class:`faint`},Rt={class:`task-priority`},zt={key:0,class:`muted`},Bt={class:`faint`},Vt={key:1,class:`muted`},Ht={key:2,class:`share-status`},Ut={key:3,class:`muted`},Wt={class:`task-sources`},Gt={key:0,class:`faint`},Kt={class:`faint`},qt={key:1,class:`muted`},Jt={class:`row`},Yt=[`onClick`],Xt=[`onClick`],Zt=[`onClick`],Qt=[`onClick`],$t=[`onClick`],en=[`onClick`],tn={key:1,class:`time-cards work-grid`},nn=[`data-work`,`onClick`],rn={class:`eyebrow`},an={class:`faint`},on={key:2,class:`time-cards work-grid`},sn={class:`eyebrow`},cn={class:`muted`},ln=[`onClick`],un={class:`row time-pagination`},dn=[`disabled`],fn=[`disabled`],pn={class:`row`},mn={class:`chip`},hn={class:`work-body`},gn={class:`muted`},_n={key:0},vn={class:`row`},yn={class:`list`},bn=[`onClick`],xn={key:1},Sn={class:`list`},Cn=[`onClick`],wn=[`href`],Tn={key:1,class:`muted`},En={class:`faint`},Dn={class:`work-body`},On=E(D({__name:`TimePage`,setup(r){let c=[`today`,`tasks`,`works`,`projects`,`experiences`],f=d(c.includes(O.sub.split(`/`)[0])?O.sub.split(`/`)[0]:`today`),E=e(_(`/mind/time`)),D=e([]),N=d(!1),P=d(``),F=d(0),I=d(``),L=d(``),R=d(O.sub.split(`/`)[0]===`tasks`&&O.sub.split(`/`)[1]||``),z=e(null),B=e(null),V=e(null),ue=d(!1),de=d(!1),H=d(!1),U=d(!1),W=d({focusMinutes:25,breakMinutes:5,stepMinutes:5,paceSpeed:1.25,ownPlanMinutes:45,commitmentReviewMinutes:30}),G=s(()=>oe.data?.clock?.timeZone||`Asia/Shanghai`),fe=l({todo:w(`ToDo · 待办`),scheduled:w(`Scheduled · 已安排`),doing:w(`Doing · 正在做`),paused:w(`Paused · 暂停`),waiting:w(`Waiting · 等待`),done:w(`Done · 已完成`),abandoned:w(`Abandoned · 已放下`)}),pe=l({none:``,waiting:w(`完成,尚未交付`),deferred:w(`暂缓交付`),declined:w(`暂不分享`),pending:w(`待继续交付`),sent:w(`已完整交付`),reported:w(`已整理并汇报`),uncertain:w(`送达不确定,等待核对`),sending:w(`正在交付`)}),me=l({0:w(`低`),1:w(`普通`),2:w(`高`),3:w(`最高`)});function he(e){return e.state===`waiting`?e.waitKind===`adjust`?o(`需要调整约定`):e.waitKind===`specify`?o(`待想具体`):o(`Waiting · 等条件`):e.state===`todo`&&!e.schedule?.chosenAt?o(`ToDo · 待选时间`):e.state===`scheduled`?o(`Scheduled · 已选时间`):e.state===`paused`?o(`Paused · 进度保留`):fe[e.state]}async function ge(e,t){try{await T(`/mind/time/tasks/`+e.id+`/control`,`POST`,{action:`priority`,priority:t}),await Y()}catch(e){A(e.message,!0)}}let K=e=>o(`{v} 分钟`,{v:Math.floor((e||0)/6e4)}),q=e=>o(`{v} 分钟`,{v:Math.ceil((e||0)/6e4)}),J=0;function _e(){let e=new URLSearchParams({limit:`24`,offset:String(F.value)});return I.value&&e.set(`q`,I.value),f.value===`tasks`&&L.value&&e.set(`state`,L.value),f.value===`tasks`&&R.value&&e.set(`id`,R.value),`/mind/time/`+f.value+`?`+e}async function Y(){let e=++J,t=f.value===`today`?`/mind/time`:_e(),n=_(t);n&&(f.value===`today`?E.value=n:D.value=n),N.value=!n,P.value=``;try{let n=await T(t);if(e!==J)return;f.value===`today`?(E.value=n,H.value||(W.value={...n.settings})):(D.value=n,de.value=n.length===24)}catch(t){e===J&&(P.value=t.message)}finally{e===J&&(N.value=!1)}}async function X(e,t){ue.value=!0;try{z.value=await T(`/mind/time/works/`+encodeURIComponent(e)+(t?`?version=`+t:``)),B.value=null,V.value=null}catch(e){A(e.message,!0)}finally{ue.value=!1}}async function Z(e){try{let t=await T(`/mind/time/projects/`+e),[n,r]=await Promise.all([T(`/mind/time/works?project=`+e),T(`/mind/time/projects/`+e+`/sources`)]);B.value={...t,works:n,sources:r},z.value=null,V.value=null}catch(e){A(e.message,!0)}}async function ve(e){try{V.value=await T(`/mind/time/sources/`+e)}catch(e){A(e.message,!0)}}async function Q(e,n){let r,i;if(n===`schedule`){let n=await t(o(`最早开始时间(YYYY-MM-DD HH:mm)。截止时间保留原安排。`),{title:o(`安排时间`),confirmText:o(`继续`),placeholder:`2026-10-02 14:30`});if(n===null)return;r=n;let a=await t(o(`这次安排投入多少分钟(5 至 240)?`),{title:o(`投入时间`),confirmText:o(`继续`),placeholder:String(e.schedule?.durationMinutes||25)});if(a===null)return;i=Number(a)}let a=await t(o(n===`abandon`?`留下放下这件事的原因。`:`留下这次调整的原因。`),{title:o(`调整安排`),confirmText:o(`保存`),placeholder:o(`管理台调整`)});if(a!==null)try{await T(`/mind/time/tasks/`+e.id+`/control`,`POST`,{action:n,...r?{readyAt:r}:{},...i===void 0?{}:{durationMinutes:i},reason:a||o(`管理台调整`)}),await Y()}catch(e){A(e.message,!0)}}async function $(e){if(!B.value)return;let n=await t(o(`提出选题、续写方向或修改想法。她会自行决定是否采纳。`),{title:o(`给她一个建议`),confirmText:o(`留下建议`)});if(n!==null)try{let t=await T(`/mind/time/projects/`+B.value.id+`/suggest`,`POST`,{action:e,idea:n});A(t.duplicate?o(`这个项目已有待处理事项`):o(`建议已保存,等待她的选择`)),await Y()}catch(e){A(e.message,!0)}}async function ye(){if(!z.value)return;let e=z.value,t=new Blob([e.title+`
|
|
2
|
+
|
|
3
|
+
`+e.content],{type:`text/plain;charset=utf-8`}),n=URL.createObjectURL(t),r=document.createElement(`a`);r.href=n,r.download=e.title.replace(/[\\/:*?"<>|]/g,`_`)+`-v`+e.version+`.txt`,r.click(),URL.revokeObjectURL(n)}async function be(){if(!U.value){U.value=!0,J++;try{let e=await T(`/mind/time/settings`,`PUT`,{...W.value});J++,W.value=e,H.value=!1,A(o(`专注安排已保存`)),await Y()}catch(e){A(e.message,!0)}finally{U.value=!1}}}function xe(e){R.value=e,f.value===`tasks`?Y():f.value=`tasks`,te(`tasks/`+e)}async function Se(){try{await T(`/mind/time/care`,`POST`,{}),A(o(`已记下,空下来时回看说过的话`)),await Y()}catch(e){A(e.message,!0)}}async function Ce(){try{await T(`/mind/time/plan`,`POST`,{}),A(o(`已记下,让她重新想具体时间与投入时长`)),await Y()}catch(e){A(e.message,!0)}}function we(){F.value=0,Y()}v(f,e=>{O.page===`time`&&(F.value=0,D.value=[],I.value=``,L.value=``,e!==`tasks`&&(R.value=``),te(e===`today`?``:e===`tasks`&&R.value?`tasks/`+R.value:e===`works`&&O.sub.startsWith(`works/`)?O.sub:e),Y())}),v(()=>[O.page,O.sub],([e,t])=>{if(e!==`time`)return;let n=t.split(`/`)[0]||`today`;if(n===`tasks`){let e=t.split(`/`)[1]||``;R.value!==e&&(R.value=e,f.value===`tasks`&&Y())}c.includes(n)&&(f.value=n),n===`works`&&t.split(`/`)[1]&&z.value?.id!==t.split(`/`)[1]&&X(t.split(`/`)[1])});let Te=ae(`time`,Y),Ee=0;return ee(()=>{Ee=window.setInterval(()=>{Te.value&&f.value===`today`&&!document.hidden&&Y()},5e3);let e=O.sub.split(`/`)[1];e&&f.value===`works`&&X(e)}),re(()=>{clearInterval(Ee),J++}),(e,t)=>(b(),u(`div`,it,[h(`header`,at,[h(`div`,null,[h(`span`,ot,n(j(o)(`TIME · 时间`)),1),h(`h1`,null,[x(n(j(o)(`日子在走,`)),1),h(`em`,null,n(j(o)(`我也有自己的事。`)),1)]),h(`p`,null,n(j(o)(`想做的事,正在留下的作品,与世界相遇的每一段。`)),1)]),h(`div`,st,[t[24]||=h(`span`,null,`25`,-1),h(`small`,null,n(j(o)(`留一点时间给自己`)),1)])]),k(ce,{modelValue:f.value,"onUpdate:modelValue":t[0]||=e=>f.value=e,label:j(o)(`时间的分区`),items:[{key:`today`,label:j(o)(`今日`)},{key:`tasks`,label:j(o)(`待办`)},{key:`works`,label:j(o)(`作品库`)},{key:`projects`,label:j(o)(`持续项目`)},{key:`experiences`,label:j(o)(`体验记录`)}]},null,8,[`modelValue`,`label`,`items`]),P.value?(b(),u(`p`,ct,[x(n(P.value)+` `,1),h(`button`,{onClick:Y},n(j(o)(`重试`)),1)])):g(``,!0),N.value?(b(),u(`p`,lt,n(j(o)(`正在取回这段生活…`)),1)):g(``,!0),f.value===`today`&&E.value?(b(),u(i,{key:2},[h(`section`,ut,[h(`article`,dt,[h(`span`,ft,n(j(o)(`此刻的主活动`)),1),E.value.current?(b(),u(i,{key:0},[h(`h2`,null,n(E.value.current.title||E.value.current.label),1),h(`span`,pt,n(E.value.current.label)+` · `+n(E.value.current.timing?.phase===`preparing`?j(o)(`正在准备`):(E.value.current.sessionElapsedMs??E.value.current.elapsedMs)<6e4?j(o)(`刚开始这一段`):j(o)(`本次已投入 `)+K(E.value.current.sessionElapsedMs??E.value.current.elapsedMs)),1),E.value.current.schedule?.chosenAt?(b(),u(`p`,mt,n(j(o)(`她安排 {v} 开始,这次想投入 {durationMinutes} 分钟。`,{v:j(M)(E.value.current.schedule.proposedAt,G.value),durationMinutes:E.value.current.schedule.durationMinutes})),1)):g(``,!0),E.value.current.timing?.plannedMs?(b(),u(`p`,ht,n(j(o)(`本段预计 {v} · 还需约 {v2}`,{v:q(E.value.current.timing.plannedMs),v2:q(E.value.current.timing.remainingMs)})),1)):g(``,!0),h(`p`,null,n(E.value.current.why||j(o)(`从自己的打算接着做。`)),1),h(`p`,gt,n(E.value.current.checkpoint?.next||j(o)(`正在推进当前步骤。`)),1),h(`button`,{class:`text-button`,onClick:t[1]||=e=>f.value=`tasks`},n(j(o)(`查看安排 →`)),1)],64)):(b(),u(i,{key:1},[h(`h2`,null,n(E.value.agenda?.idle?.title||j(o)(`这会儿没有主活动`)),1),h(`p`,_t,n(E.value.agenda?.idle?.reason||j(o)(`自己选择接下来做什么,也可以歇着。`)),1),E.value.agenda?.idle?.next?(b(),u(`p`,vt,n(j(o)(`下一项:{title} · {v} 开始 · {durationMinutes} 分钟`,{title:E.value.agenda.idle.next.title,v:j(M)(E.value.agenda.idle.next.chosenStart,G.value),durationMinutes:E.value.agenda.idle.next.durationMinutes})),1)):g(``,!0),h(`button`,{class:`text-button`,onClick:Ce},n(j(o)(`让她重新想想安排`)),1)],64))]),h(`article`,yt,[h(`span`,bt,n(j(o)(`今天`)),1),h(`h2`,null,n(K(E.value.today?.activeMs)),1),h(`p`,null,n(j(o)(`实际活动投入 · {energyLabel} · {mood}`,{energyLabel:E.value.affect?.energyLabel,mood:E.value.affect?.mood})),1),h(`p`,xt,n(j(o)(`普通交流可以伴随进行,短消息不会自动暂停。`)),1),h(`button`,{class:`text-button`,onClick:t[2]||=e=>j(C)(`life`)},n(j(o)(`翻开日记 →`)),1)])]),E.value.agenda?(b(),m(Pe,{key:0,agenda:E.value.agenda,onTask:xe},null,8,[`agenda`])):g(``,!0),E.value.care?(b(),u(`section`,St,[h(`span`,Ct,n(j(o)(`独处时理一理`)),1),h(`h2`,null,n(j(o)(`自己的打算,说过的约定`)),1),h(`p`,null,n(j(o)(`空下来时,她会想一件自己愿意做的小事,也会回看有没有漏下答应别人的事。可以选择歇着。`)),1),E.value.care.last?(b(),u(`p`,wt,[x(n(j(o)(`最近:{reason}`,{reason:E.value.care.last.reason})),1),E.value.care.last.finished?(b(),u(i,{key:0},[x(` · `+n(j(M)(E.value.care.last.finished,G.value)),1)],64)):g(``,!0)])):g(``,!0),E.value.care.pendingReplies?(b(),u(`p`,Tt,n(j(o)(`还有 {pendingReplies} 条已说过的话等着分批回看。`,{pendingReplies:E.value.care.pendingReplies})),1)):g(``,!0),h(`button`,{disabled:E.value.care.queued||!!E.value.care.working,onClick:Se},n(E.value.care.working?j(o)(`正在整理自己的生活`):E.value.care.queued?j(o)(`已记下,空下来时整理`):j(o)(`空下来整理一下约定`)),9,Et)])):g(``,!0),h(`details`,Dt,[h(`summary`,null,n(j(o)(`专注与休息安排`)),1),h(`form`,{onSubmit:p(be,[`prevent`]),onInput:t[9]||=e=>H.value=!0,onChange:t[10]||=e=>H.value=!0},[h(`label`,null,[x(n(j(o)(`默认专注段(分钟)`)),1),y(h(`input`,{"onUpdate:modelValue":t[3]||=e=>W.value.focusMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[a,W.value.focusMinutes,void 0,{number:!0}]]),h(`small`,null,n(j(o)(`没有另行选择时使用;她自己的安排优先。`)),1)]),h(`label`,null,[x(n(j(o)(`休息建议(分钟)`)),1),y(h(`input`,{"onUpdate:modelValue":t[4]||=e=>W.value.breakMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[a,W.value.breakMinutes,void 0,{number:!0}]])]),h(`label`,null,[x(n(j(o)(`保存步骤间隔(分钟)`)),1),y(h(`input`,{"onUpdate:modelValue":t[5]||=e=>W.value.stepMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[a,W.value.stepMinutes,void 0,{number:!0}]])]),h(`label`,null,[x(n(j(o)(`活动节奏`)),1),y(h(`input`,{"onUpdate:modelValue":t[6]||=e=>W.value.paceSpeed=e,type:`number`,min:`1`,max:`2`,step:`0.05`},null,512),[[a,W.value.paceSpeed,void 0,{number:!0}]]),h(`small`,null,n(j(o)(`默认 1.25 倍,所有活动按现实时间逐段推进。`)),1)]),h(`label`,null,[x(n(j(o)(`想自己的安排(间隔分钟)`)),1),y(h(`input`,{"onUpdate:modelValue":t[7]||=e=>W.value.ownPlanMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[a,W.value.ownPlanMinutes,void 0,{number:!0}]]),h(`small`,null,n(j(o)(`有空才考虑,可以决定休息。`)),1)]),h(`label`,null,[x(n(j(o)(`回看说过的话(间隔分钟)`)),1),y(h(`input`,{"onUpdate:modelValue":t[8]||=e=>W.value.commitmentReviewMinutes=e,type:`number`,min:`1`,max:`120`},null,512),[[a,W.value.commitmentReviewMinutes,void 0,{number:!0}]]),h(`small`,null,n(j(o)(`分批整理约定,保留去重与原来的选择。`)),1)]),h(`button`,{class:`primary`,disabled:U.value},n(U.value?j(o)(`正在保存`):j(o)(`保存安排`)),9,Ot)],32)])],64)):f.value===`today`?g(``,!0):(b(),u(i,{key:3},[h(`form`,{class:`time-filter`,onSubmit:p(we,[`prevent`])},[f.value===`tasks`&&R.value?(b(),u(`button`,{key:0,type:`button`,onClick:t[11]||=e=>{R.value=``,j(te)(`tasks`),Y()}},n(j(o)(`查看全部待办`)),1)):g(``,!0),[`works`,`projects`,`experiences`].includes(f.value)?(b(),u(`label`,kt,[h(`span`,At,n(j(o)(`搜索标题`)),1),y(h(`input`,{"onUpdate:modelValue":t[12]||=e=>I.value=e,placeholder:j(o)(`搜索标题或项目`)},null,8,jt),[[a,I.value]]),h(`button`,null,n(j(o)(`搜索`)),1)])):g(``,!0),f.value===`tasks`?(b(),u(`label`,Mt,[x(n(j(o)(`任务状态`)),1),k(se,{modelValue:L.value,"onUpdate:modelValue":t[13]||=e=>L.value=e,"aria-label":j(o)(`任务状态`),options:[{value:``,label:j(o)(`全部`)},...Object.entries(j(fe)).map(([e,t])=>({value:e,label:t}))],onChange:we},null,8,[`modelValue`,`aria-label`,`options`])])):g(``,!0)],32),f.value===`tasks`?(b(),u(`div`,Nt,[(b(!0),u(i,null,S(D.value,e=>(b(),u(`article`,{key:e.id,class:`card time-task`,"data-task":e.id},[h(`div`,Ft,[h(`span`,{class:`chip`,"data-tone":e.state===`done`?`ok`:`quiet`},n(he(e)),9,It),h(`span`,Lt,n(e.kind===`promise`?j(o)(`答应的事`):e.kind===`suggestion`?j(o)(`外部建议`):j(o)(`自己的计划`))+n(e.person?` · `+e.person:``),1),h(`label`,Rt,[h(`span`,null,n(j(o)(`优先级`)),1),k(se,{"model-value":e.priority,"aria-label":j(o)(`优先级:`)+e.title,options:Object.entries(j(me)).map(([e,t])=>({value:e,label:t})),disabled:!!e.checkpoint?.mergedInto,"onUpdate:modelValue":t=>ge(e,Number(t))},null,8,[`model-value`,`aria-label`,`options`,`disabled`,`onUpdate:modelValue`])])]),h(`h2`,null,n(e.title),1),h(`p`,null,n(e.why),1),e.wait_reason?(b(),u(`p`,zt,n(e.wait_reason),1)):g(``,!0),h(`p`,Bt,[e.schedule?.chosenAt&&!e.checkpoint?.reschedule?(b(),u(i,{key:0},[x(n(j(o)(`{v} {v2} — {v3} · 这次 {durationMinutes} 分钟`,{v:e.schedule.chosenBy===`admin`?j(o)(`管理台安排`):j(o)(`她选定`),v2:j(M)(e.schedule.proposedAt,G.value),v3:j(M)(e.schedule.proposedEnd,G.value),durationMinutes:e.schedule.durationMinutes})),1)],64)):e.schedule?.startedAt?(b(),u(i,{key:1},[x(n(j(o)(`本段开始 {v}`,{v:j(M)(e.schedule.startedAt,G.value)})),1)],64)):e.schedule?.proposedAt?(b(),u(i,{key:2},[x(n(e.schedule.conditional?j(o)(`条件满足后建议`):j(o)(`已安排`))+` `+n(j(M)(e.schedule.proposedAt,G.value))+` — `+n(j(M)(e.schedule.proposedEnd,G.value)),1)],64)):(b(),u(i,{key:3},[x(n(e.state===`waiting`?j(o)(`需要解决上面的条件,再选择时间`):e.state===`paused`?j(o)(`进度已保存,之后再安排续接时间`):j(o)(`已记下,等她选择具体时间`)),1)],64)),e.timing?.plannedMs?(b(),u(i,{key:4},[x(n(j(o)(`· 本段预计 {v} · 本段已投入 {v2}`,{v:q(e.timing.plannedMs),v2:K(e.timing.stepMs)})),1),e.timing.phase===`engaged`?(b(),u(i,{key:0},[x(n(j(o)(`· 还需约 {v}`,{v:q(e.timing.remainingMs)})),1)],64)):g(``,!0)],64)):e.timing?.phase===`legacy`?(b(),u(i,{key:5},[x(n(j(o)(`· 此前时长未单独记录`)),1)],64)):(b(),u(i,{key:6},[x(` · `+n(e.state===`doing`?j(o)(`正在准备这一段`):j(o)(`尚未开始本段投入`)),1)],64))]),e.schedule?.outcome?(b(),u(`p`,Vt,n(j(o)(`本段目标:{outcome}`,{outcome:e.schedule.outcome})),1)):g(``,!0),j(pe)[e.share_state]?(b(),u(`p`,Ht,n(j(pe)[e.share_state])+` `+n(e.share_reason),1)):g(``,!0),e.checkpoint?.next?(b(),u(`p`,Ut,n(j(o)(`下一步:{next}`,{next:e.checkpoint.next})),1)):g(``,!0),h(`details`,Wt,[h(`summary`,null,n(j(o)(`来源与原安排 · {length} 条`,{length:e.sources.length})),1),e.due_at?(b(),u(`p`,Gt,n(j(o)(`原话日期参考 {v},不作为逾期判断。`,{v:j(M)(e.due_at,G.value)})),1)):g(``,!0),h(`small`,Kt,n(e.sources.join(` · `)),1),e.checkpoint?.mergedInto?(b(),u(`p`,qt,n(j(o)(`已合并到唯一事项,保留这条原记录。`)),1)):g(``,!0)]),h(`div`,Jt,[e.work_id?(b(),u(`button`,{key:0,onClick:t=>X(e.work_id)},n(j(o)(`阅读已有正文`)),9,Yt)):g(``,!0),e.project_id?(b(),u(`button`,{key:1,onClick:t=>Z(e.project_id)},n(j(o)(`持续项目`)),9,Xt)):g(``,!0),[`done`,`abandoned`].includes(e.state)?g(``,!0):(b(),u(i,{key:2},[e.state===`doing`?(b(),u(`button`,{key:0,onClick:t=>Q(e,`pause`)},n(j(o)(`暂停`)),9,Zt)):(b(),u(`button`,{key:1,onClick:t=>Q(e,`resume`)},n(j(o)(`重新安排`)),9,Qt)),h(`button`,{onClick:t=>Q(e,`schedule`)},n(j(o)(`安排时间`)),9,$t),h(`button`,{class:`text-button`,onClick:t=>Q(e,`abandon`)},n(j(o)(`放下`)),9,en)],64))])],8,Pt))),128))])):f.value===`works`?(b(),u(`div`,tn,[(b(!0),u(i,null,S(D.value,e=>(b(),u(`button`,{key:e.id,class:`card work-card`,"data-work":e.id,onClick:t=>X(e.id)},[h(`span`,rn,n(j(o)(`{v} · 第 {ordinal} 篇`,{v:e.state===`complete`?j(o)(`完成稿`):j(o)(`草稿`),ordinal:e.ordinal})),1),h(`h2`,null,n(e.title),1),h(`p`,null,n(e.summary),1),h(`small`,null,n(j(o)(`{characters} 字 · 版本 {version}`,{characters:e.characters,version:e.version})),1),h(`span`,an,n(e.project_title||j(o)(`独处留下的东西`)),1)],8,nn))),128))])):f.value===`projects`?(b(),u(`div`,on,[(b(!0),u(i,null,S(D.value,e=>(b(),u(`article`,{key:e.id,class:`card`},[h(`span`,sn,n(e.kind===`game`?j(o)(`游戏`):e.serial?j(o)(`连载`):j(o)(`持续项目`))+` · `+n(e.state===`active`?j(o)(`在继续`):e.state===`complete`?j(o)(`已完结`):j(o)(`暂时放下`)),1),h(`h2`,null,n(e.title),1),h(`p`,null,n(e.why),1),h(`p`,cn,n(e.summary),1),h(`button`,{onClick:t=>Z(e.id)},n(j(o)(`打开项目`)),9,ln)]))),128))])):(b(),m(rt,{key:3,rows:D.value,zone:G.value,loading:N.value,onWork:X,onProject:Z,onSource:ve},null,8,[`rows`,`zone`,`loading`])),f.value!==`experiences`&&!N.value&&!D.value.length?(b(),m(ne,{key:4,title:f.value===`works`?j(o)(`作品还在等待第一笔`):j(o)(`这里还没有记录`),text:j(o)(`实际发生并保存之后,这里才会出现内容。`)},null,8,[`title`,`text`])):g(``,!0),h(`div`,un,[h(`button`,{disabled:F.value===0,onClick:t[14]||=e=>{F.value=Math.max(0,F.value-24),Y()}},n(j(o)(`上一页`)),9,dn),h(`span`,null,n(F.value/24+1),1),h(`button`,{disabled:!de.value,onClick:t[15]||=e=>{F.value+=24,Y()}},n(j(o)(`下一页`)),9,fn)])],64)),k(le,{open:!!z.value,title:z.value?.title||j(o)(`作品`),eyebrow:j(o)(`她留下的正文`),width:`780px`,onClose:t[18]||=e=>z.value=null},{default:ie(()=>[z.value?(b(),u(i,{key:0},[h(`div`,pn,[h(`span`,mn,n(j(o)(`{v} · {length} 字`,{v:z.value.state===`complete`?j(o)(`完成稿`):j(o)(`草稿`),length:z.value.content.length})),1),h(`label`,null,[x(n(j(o)(`版本`)),1),k(se,{"model-value":z.value.version,"aria-label":j(o)(`作品版本`),options:z.value.versions.map(e=>({value:e.version,label:e.version+` · `+j(M)(e.created,G.value)})),"onUpdate:modelValue":t[16]||=e=>X(z.value.id,Number(e))},null,8,[`model-value`,`aria-label`,`options`])]),h(`button`,{onClick:ye},n(j(o)(`导出正文`)),1)]),h(`p`,hn,n(z.value.content),1),z.value.project_id?(b(),u(`button`,{key:0,onClick:t[17]||=e=>Z(z.value.project_id)},n(j(o)(`查看项目与设定`)),1)):g(``,!0)],64)):g(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`]),k(le,{open:!!B.value,title:B.value?.title||j(o)(`持续项目`),eyebrow:j(o)(`她自己的方向`),width:`740px`,onClose:t[22]||=e=>B.value=null},{default:ie(()=>[B.value?(b(),u(i,{key:0},[h(`p`,null,n(B.value.why),1),h(`p`,gn,n(B.value.summary),1),Object.keys(B.value.bible||{}).length?(b(),u(`details`,_n,[h(`summary`,null,n(j(o)(`设定与未解决线索`)),1),h(`dl`,null,[(b(!0),u(i,null,S(B.value.bible,(e,t)=>(b(),u(i,{key:t},[h(`dt`,null,n({characters:j(o)(`人物`),world:j(o)(`世界`),threads:j(o)(`未解决线索`),topic:j(o)(`资料主题`),mode:j(o)(`模式`)}[t]||t),1),h(`dd`,null,n(e),1)],64))),128))])])):g(``,!0),h(`div`,vn,[h(`button`,{onClick:t[19]||=e=>$(`continue`)},n(j(o)(`建议续写`)),1),h(`button`,{onClick:t[20]||=e=>$(`revise`)},n(j(o)(`建议修改`)),1),h(`button`,{onClick:t[21]||=e=>$(`direction`)},n(j(o)(`建议方向`)),1)]),h(`h3`,null,n(j(o)(`已经留下的篇章`)),1),h(`ul`,yn,[(b(!0),u(i,null,S(B.value.works,e=>(b(),u(`li`,{key:e.id},[h(`button`,{class:`text-button`,onClick:t=>X(e.id)},n(j(o)(`第 {ordinal} 篇 · {title}`,{ordinal:e.ordinal,title:e.title})),9,bn),h(`small`,null,n(e.state===`draft`?j(o)(`草稿`):j(o)(`完成稿`)),1)]))),128))]),B.value.sources.length?(b(),u(`h3`,xn,n(j(o)(`接触的资料`)),1)):g(``,!0),h(`ul`,Sn,[(b(!0),u(i,null,S(B.value.sources,e=>(b(),u(`li`,{key:e.id},[h(`button`,{class:`text-button`,onClick:t=>ve(e.id)},n(e.title),9,Cn)]))),128))])],64)):g(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`]),k(le,{open:!!V.value,title:V.value?.title||j(o)(`资料`),eyebrow:V.value?.kind===`model`?j(o)(`模型知识整理 · 未经联网核验`):j(o)(`实际返回的摘录`),width:`740px`,onClose:t[23]||=e=>V.value=null},{default:ie(()=>[V.value?(b(),u(i,{key:0},[V.value.url?(b(),u(`a`,{key:0,href:V.value.url,target:`_blank`,rel:`noopener noreferrer`},n(j(o)(`打开来源`)),9,wn)):g(``,!0),V.value.kind===`model`?(b(),u(`p`,Tn,n(V.value.uncertainty||j(o)(`基于模型已有知识,具体剧情与章节仍需核验。`)),1)):g(``,!0),h(`p`,En,n(j(M)(V.value.created,G.value)),1),h(`p`,Dn,n(V.value.content),1)],64)):g(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-6804b51c`]]);export{On as default};
|