luckytri 1.2.4 → 1.3.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 +44 -1
- package/README.md +44 -1
- package/docs/en/CHANGELOG.md +10 -0
- package/docs/zh/CHANGELOG.md +10 -0
- package/package.json +1 -1
- package/public/app/assets/ChatsPage-C5-w410L.js +3 -0
- package/public/app/assets/{Empty-y1vXDIjQ.js → Empty-DSurzLFZ.js} +1 -1
- package/public/app/assets/Field-GuXyA_aS.js +1 -0
- package/public/app/assets/HeartPage-BGmIrxCz.js +1 -0
- package/public/app/assets/LifePage-Dzln-0Y3.js +1 -0
- package/public/app/assets/MemoryPage-QsthmMZ9.js +1 -0
- package/public/app/assets/NaturePage-CIvHjgJa.js +3 -0
- package/public/app/assets/PeoplePage-bIoX24pj.js +1 -0
- package/public/app/assets/PluginsPage-EuJhCovw.js +2 -0
- package/public/app/assets/SystemPage-7t42B-Q3.js +1 -0
- package/public/app/assets/{SystemPage-DNTD2_nj.css → SystemPage-BLMlD1M6.css} +1 -1
- package/public/app/assets/TimePage-CY-SwBq3.js +3 -0
- package/public/app/assets/index-Cn6TppEV.js +4 -0
- package/public/app/assets/{index-cDDC-1dI.css → index-JRbQoSJr.css} +1 -1
- package/public/app/assets/{knowledge-BjD9PkXe.js → knowledge-sUjcjbfI.js} +1 -1
- package/public/app/assets/media-Dh7c41PQ.js +1 -0
- package/public/app/assets/{mind-KkinyNC6.js → mind-BMcoPQNd.js} +1 -1
- package/public/app/index.html +4 -4
- package/public/guide.en.html +3 -3
- package/public/guide.html +3 -3
- package/server/actions/index.js +268 -0
- package/server/app.js +3 -1
- package/server/channels/contract.js +3 -0
- package/server/channels/hub.js +15 -0
- package/server/channels/onebot/adapter.js +162 -21
- package/server/channels/onebot/enrich.js +132 -0
- package/server/channels/onebot/index.js +53 -3
- package/server/channels/onebot/music.js +43 -0
- package/server/core/conversation-grounding.js +1 -1
- package/server/core/dialogue-context.js +165 -15
- package/server/core/dialogue-contract.js +32 -33
- package/server/core/model-manager.js +35 -20
- package/server/core/model-presets.js +154 -1
- package/server/core/orchestrator.js +18 -0
- package/server/core/persona-manager.js +20 -2
- package/server/core/reply-delivery.js +328 -48
- package/server/core/response-generator.js +1 -1
- package/server/core/response-validator.js +85 -17
- package/server/core/turn-processor.js +63 -16
- package/server/core/turn.js +59 -1
- package/server/i18n/errors.js +25 -2
- package/server/index.js +30 -0
- package/server/mind/continuity.js +2 -4
- package/server/mind/discretion.js +16 -5
- package/server/mind/memory.js +7 -2
- package/server/mind/recall/index.js +2 -0
- package/server/plugins/zip-file.js +180 -0
- package/server/stickers/api.js +86 -19
- package/server/stickers/library.js +8 -2
- package/server/stickers/offer.js +4 -1
- package/server/stickers/zip-import.js +62 -2
- package/server/studio/auto-update.js +224 -0
- package/server/studio/updates.js +154 -144
- package/server/voice/index.js +255 -0
- package/server/voice/sauc.js +152 -0
- package/server/web/link-reader.js +379 -0
- package/public/app/assets/ChatsPage-C_gKz4mJ.js +0 -3
- package/public/app/assets/Field-CJG5lERx.js +0 -1
- package/public/app/assets/HeartPage-5y3avjSy.js +0 -1
- package/public/app/assets/LifePage-BtwRMDAM.js +0 -1
- package/public/app/assets/MemoryPage-54noDhWz.js +0 -1
- package/public/app/assets/NaturePage-DHK5X2Qw.js +0 -3
- package/public/app/assets/PeoplePage-ZsA7gyxP.js +0 -1
- package/public/app/assets/PluginsPage-BCRRIAhq.js +0 -2
- package/public/app/assets/SystemPage-DWr1TG49.js +0 -1
- package/public/app/assets/TimePage-6MUmtSOT.js +0 -3
- package/public/app/assets/index-BokqwNXF.js +0 -4
- package/public/app/assets/media-Ciozo_yb.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{Et as e,J as t,X as n,Z as r,ft as i,nt as a,ut as o,wt as s}from"./Empty-DSurzLFZ.js";var c={key:0},l=a({__name:`Field`,props:{label:{},hint:{},wide:{type:Boolean}},setup(a){return(l,u)=>(o(),r(`label`,{class:s({wide:a.wide})},[t(`span`,null,e(a.label),1),i(l.$slots,`default`),a.hint?(o(),r(`small`,c,e(a.hint),1)):n(``,!0)],2))}});export{l as t};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,Q as s,St as c,Tt as l,U as u,V as d,W as f,X as p,Y as m,Z as h,_ as g,ct as _,dt as v,et as y,gt as b,n as x,nt as S,o as ee,ot as C,q as w,s as T,t as E,ut as D,v as O,vt as te,wt as k,xt as A,yt as j}from"./Empty-DSurzLFZ.js";import{_ as M,c as N,d as P,g as F,h as ne,u as I,v as L}from"./mind-BMcoPQNd.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-Cn6TppEV.js";import{t as se}from"./media-Dh7c41PQ.js";var H={class:`ribbon`},U={class:`ribbon-head`},W={class:`ribbon-title`},G={class:`eyebrow`},K={key:0,class:`latest-mood`},q=[`viewBox`,`aria-label`],J=[`x2`,`y1`,`y2`],Y=[`d`],ce=[`d`],le=[`d`],ue=[`cx`,`cy`,`r`],de={key:1,class:`muted empty-line`},fe=[`aria-label`],X=150,Z=58,pe=x(S({__name:`MoodRibbon`,props:{moods:{},baseline:{},timeZone:{}},setup(e){let n=e,r=X/2,s=A(),c=A(1e3),l=null;_(()=>{l=new ResizeObserver(([e])=>{c.value=Math.max(240,Math.round(e.contentRect.width))}),s.value&&l.observe(s.value)}),C(()=>l?.disconnect());let u=w(()=>{let e=[...n.moods].sort((e,t)=>e.created-t.created),t=e.length>1?(c.value-60)/(e.length-1):0;return e.map((e,n)=>({...e,x:30+n*t,y:r-Math.max(-1,Math.min(1,e.valence))*Z}))}),d=w(()=>{let e=u.value;if(e.length<2)return``;let t=`M${e[0].x.toFixed(1)},${e[0].y.toFixed(1)}`;for(let n=0;n<e.length-1;n++){let r=e[n-1]||e[n],i=e[n],a=e[n+1],o=e[n+2]||a;t+=`C${(i.x+(a.x-r.x)/6).toFixed(1)},${(i.y+(a.y-r.y)/6).toFixed(1)} ${(a.x-(o.x-i.x)/6).toFixed(1)},${(a.y-(o.y-i.y)/6).toFixed(1)} ${a.x.toFixed(1)},${a.y.toFixed(1)}`}return t}),m=w(()=>{let e=u.value;return d.value?`${d.value}L${e[e.length-1].x},${X}L${e[0].x},${X}Z`:``}),g=w(()=>r-(n.baseline??.15)*Z),y=w(()=>[...n.moods].slice(0,6)),b=w(()=>y.value[0]);return(n,r)=>(D(),h(`section`,H,[o(`div`,U,[o(`div`,W,[o(`span`,G,i(t(a)(`MOOD / 此刻的天气`)),1),o(`h2`,null,i(t(a)(`心情有自己的潮汐。`)),1),o(`p`,null,i(t(a)(`最近 {length} 次被经历牵动;有起伏,也会慢慢平静。`,{length:e.moods.length})),1)]),b.value?(D(),h(`div`,K,[o(`span`,null,i(t(a)(`刚刚留下的心情`)),1),o(`b`,null,i(b.value.feeling),1),o(`small`,null,i(b.value.cause||t(a)(`暂时说不清缘由`)),1)])):p(``,!0)]),o(`div`,{ref_key:`box`,ref:s,class:`ribbon-box`},[d.value?(D(),h(`svg`,{key:0,class:`ribbon-chart`,viewBox:`0 0 ${c.value} ${X}`,role:`img`,"aria-label":t(a)(`最近的心情曲线`)},[o(`defs`,null,[o(`linearGradient`,{id:`ribbon-stroke`,x1:`0`,y1:`0`,x2:`0`,y2:X,gradientUnits:`userSpaceOnUse`},[...r[0]||=[o(`stop`,{offset:`0%`,style:{"stop-color":`var(--cheek)`}},null,-1),o(`stop`,{offset:`50%`,style:{"stop-color":`var(--accent)`}},null,-1),o(`stop`,{offset:`100%`,style:{"stop-color":`var(--orb-c)`}},null,-1)]]),r[1]||=o(`linearGradient`,{id:`ribbon-fill`,x1:`0`,y1:`0`,x2:`0`,y2:`1`},[o(`stop`,{offset:`0%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0.22`}}),o(`stop`,{offset:`100%`,style:{"stop-color":`var(--accent)`,"stop-opacity":`0`}})],-1)]),o(`line`,{class:`base`,x1:`0`,x2:c.value,y1:g.value,y2:g.value},null,8,J),o(`path`,{class:`area`,d:m.value},null,8,Y),o(`path`,{class:`line-glow`,d:d.value},null,8,ce),o(`path`,{class:`line`,d:d.value},null,8,le),(D(!0),h(f,null,v(u.value,n=>(D(),h(`g`,{key:n.id,class:k([`pt`,n.valence>=0?`warm`:`cool`])},[o(`circle`,{cx:n.x,cy:n.y,r:4+n.intensity*6},[o(`title`,null,i(t(z)(n.created,e.timeZone))+` `+i(n.feeling)+`:`+i(n.cause||t(a)(`说不清为什么`)),1)],8,ue)],2))),128))],8,q)):(D(),h(`p`,de,i(t(a)(`心情还没有被什么事牵动过。每一次经历都可能推动 TA 的心情,随后又会慢慢回到平常。`)),1))],512),y.value.length?(D(),h(`ul`,{key:0,class:`recent`,"aria-label":t(a)(`最近的心情`)},[(D(!0),h(f,null,v(y.value,n=>(D(),h(`li`,{key:n.id,class:k(n.valence>=0?`warm`:`cool`)},[o(`b`,null,i(n.feeling),1),o(`span`,null,i(n.cause||t(a)(`说不清为什么`)),1),o(`small`,null,i(t(z)(n.created,e.timeZone))+` · `+i(t(I)[n.origin]||n.origin),1)],2))),128))],8,fe)):p(``,!0)]))}}),[[`__scopeId`,`data-v-fef06576`]]),me=[`aria-label`],he={class:`self-scene`},ge={class:`scene-copy`},_e={class:`eyebrow`},ve={class:`scene-stats`},ye={class:`self-lens`,"aria-hidden":`true`},be={class:`orb-seat`},xe={class:`currents-head`},Se={class:`current-grid`},Ce={class:`current-head`},we={class:`current-number`},Te={class:`flecks`},Ee=[`data-thread`,`onClick`],De={class:`fleck-copy`},Oe=[`aria-expanded`,`onClick`],ke={"aria-hidden":`true`},Q=6,Ae=x(S({__name:`StarMap`,props:{threads:{},kinds:{},activity:{}},emits:[`open`],setup(n,{emit:r}){let c=n,u=r,d=A({}),m=w(()=>[...new Set(c.threads.map(e=>e.kind))].map(e=>({kind:e,label:c.kinds[e]||e,color:N[e]||`var(--accent)`,items:c.threads.filter(t=>t.kind===e).sort((e,t)=>(t.salience??0)-(e.salience??0))}))),g=w(()=>c.threads.filter(e=>!e.faded&&(e.salience??0)>=.5).length);function _(e){return e.faded?a(`暂时放远`):e.core?a(`慢慢笃定`):a(`还在生长`)}function b(e){return d.value[e.kind]?e.items:e.items.slice(0,Q)}function x(e){d.value={...d.value,[e]:!d.value[e]}}return(r,c)=>(D(),h(`section`,{class:`starmap`,"aria-label":t(a)(`心灵星图:TA 关于自己的线索`)},[o(`div`,he,[o(`div`,ge,[o(`span`,_e,i(t(a)(`SELF / 正在形成的自己`)),1),o(`h2`,null,[e(i(t(a)(`不是一张固定的画像,`)),1),c[0]||=o(`br`,null,null,-1),o(`em`,null,i(t(a)(`而是一直在生长。`)),1)]),o(`p`,null,i(t(a)(`一件经历可能留下一点痕迹。点开一枚光片,可以看到它从哪里来、后来又怎么改变。`)),1),o(`div`,ve,[o(`span`,null,[o(`b`,null,i(n.threads.length),1),e(` `+i(t(a)(`枚线索`)),1)]),o(`span`,null,[o(`b`,null,i(g.value),1),e(` `+i(t(a)(`枚此刻贴近`)),1)])])]),o(`div`,ye,[c[1]||=s(`<span class="lens-halo halo-one" data-v-f3560fca></span><span class="lens-halo halo-two" data-v-f3560fca></span><span class="lens-droplet droplet-one" data-v-f3560fca></span><span class="lens-droplet droplet-two" data-v-f3560fca></span><span class="lens-droplet droplet-three" data-v-f3560fca></span>`,5),o(`div`,be,[y(B,{mood:t(V),activity:n.activity||`idle`,size:106},null,8,[`mood`,`activity`])])])]),o(`div`,xe,[o(`div`,null,[c[2]||=o(`span`,{class:`eyebrow`},`INNER CURRENTS`,-1),o(`h3`,null,i(t(a)(`她留下的光片`)),1)]),o(`p`,null,i(t(a)(`越亮的线索,越贴近此刻。淡去的仍然保留在这里。`)),1)]),o(`div`,Se,[(D(!0),h(f,null,v(m.value,(n,r)=>(D(),h(`section`,{key:n.kind,class:`current`,style:l({"--tone":n.color,"--order":r})},[o(`header`,Ce,[c[3]||=o(`span`,{class:`current-icon`,"aria-hidden":`true`},[o(`i`)],-1),o(`div`,null,[o(`h4`,null,i(n.label),1),o(`small`,null,i(t(a)(`{length} 枚正在留存`,{length:n.items.length})),1)]),o(`span`,we,i(String(r+1).padStart(2,`0`)),1)]),o(`div`,Te,[(D(!0),h(f,null,v(b(n),e=>(D(),h(`button`,{key:e.thread,type:`button`,class:k([`fleck star`,{faded:e.faded,core:e.core}]),"data-thread":e.thread,onClick:t=>u(`open`,e)},[c[4]||=o(`span`,{class:`fleck-light`,"aria-hidden":`true`},null,-1),o(`span`,De,[o(`small`,null,i(_(e)),1),o(`b`,null,i(e.content),1)]),c[5]||=o(`span`,{class:`fleck-arrow`,"aria-hidden":`true`},`↗`,-1)],10,Ee))),128)),n.items.length>Q?(D(),h(`button`,{key:0,type:`button`,class:`fleck-more`,"aria-expanded":!!d.value[n.kind],onClick:e=>x(n.kind)},[e(i(d.value[n.kind]?t(a)(`收起线索`):t(a)(`再看 {v} 枚光片`,{v:n.items.length-Q}))+` `,1),o(`span`,ke,i(d.value[n.kind]?`↑`:`↓`),1)],8,Oe)):p(``,!0)])],4))),128))])],8,me))}}),[[`__scopeId`,`data-v-f3560fca`]]),je={class:`notes-wall`},Me={class:`wall-head`},Ne={class:`eyebrow`},Pe={class:`muted`},Fe=[`placeholder`,`aria-label`],Ie={key:0,class:`wall`},Le=[`data-kind`],Re={key:0,class:`stamp`},ze={key:1,class:`outreach`},Be=[`onClick`],Ve=[`onClick`],He=[`onClick`],Ue=x(S({__name:`NotesWall`,props:{thoughts:{},kinds:{},query:{}},emits:[`changed`,`search`],setup(n,{emit:s}){let c=n,l=s,g=A(c.query);async function _(e,t){try{await F.thought(e.id,t),l(`changed`)}catch(e){O(e.message,!0)}}async function y(e){if(await r(a(`删除这张便签?有后续修正的便签只能隐藏。`),{title:a(`删除便签`),confirmText:a(`删除`),danger:!0}))try{await F.removeThought(e.id),l(`changed`)}catch(e){O(e.message,!0)}}return(r,s)=>(D(),h(`section`,je,[o(`div`,Me,[o(`div`,null,[o(`span`,Ne,i(t(a)(`THOUGHTS / 留给自己的话`)),1),o(`h2`,null,i(t(a)(`有些念头,先放在心上。`)),1),o(`p`,Pe,i(t(a)(`有些是聊天之后的理解,有些是还没想好要告诉谁的念头。可以分享,也可以先留给自己。`)),1)]),o(`form`,{class:`wall-search`,role:`search`,onSubmit:s[2]||=u(e=>l(`search`,g.value),[`prevent`])},[j(o(`input`,{id:`noteSearch`,"onUpdate:modelValue":s[0]||=e=>g.value=e,placeholder:t(a)(`搜索某件事、某个人`),"aria-label":t(a)(`搜索便签`),onChange:s[1]||=e=>l(`search`,g.value)},null,40,Fe),[[d,g.value]])],32)]),n.thoughts.length?(D(),h(`div`,Ie,[(D(!0),h(f,null,v(n.thoughts,r=>(D(),h(`article`,{key:r.id,class:k([`note-card`,{muted:r.hidden,resolved:r.status===`resolved`}]),"data-kind":r.kind},[o(`header`,null,[o(`b`,null,[e(i(n.kinds[r.kind]||r.kind),1),r.parent_id?(D(),h(f,{key:0},[e(i(t(a)(`· 修正了以前的想法`)),1)],64)):p(``,!0)]),o(`time`,null,i(t(L)(r.created)),1)]),o(`p`,null,i(r.content),1),r.status===`resolved`?(D(),h(`p`,Re,i(r.resolution?t(a)(`放下了:{resolution}`,{resolution:r.resolution}):t(a)(`放下了`)),1)):p(``,!0),r.outreach?(D(),h(`p`,ze,[e(i(t(a)(`想主动说:{outreach} · {v}`,{outreach:r.outreach,v:t(P)[r.outreach_status]||r.outreach_status}))+` `,1),r.outreach_reason?(D(),h(f,{key:0},[s[3]||=o(`br`,null,null,-1),e(i(t(a)(`因为:{outreach_reason}`,{outreach_reason:r.outreach_reason})),1)],64)):p(``,!0),r.outreach_wait_reason?(D(),h(f,{key:1},[s[4]||=o(`br`,null,null,-1),e(i(t(a)(`{outreach_wait_reason};稍后重新决定。`,{outreach_wait_reason:r.outreach_wait_reason})),1)],64)):p(``,!0)])):p(``,!0),o(`footer`,null,[o(`button`,{class:`small`,onClick:e=>_(r,{status:r.status===`open`?`resolved`:`open`})},i(r.status===`open`?t(a)(`放下这件事`):t(a)(`重新关注`)),9,Be),o(`button`,{class:`small`,onClick:e=>_(r,{hidden:!r.hidden})},i(r.hidden?t(a)(`恢复`):t(a)(`不再参与 TA 的思考`)),9,Ve),o(`button`,{class:`text-button`,onClick:e=>y(r)},i(t(a)(`删除`)),9,He)])],10,Le))),128))])):(D(),m(E,{key:1,title:t(a)(`这面墙还空着`),text:t(a)(`独处时有了新的理解、放不下的事或久别想起的人,TA 会写一张便签贴在这里。`)},null,8,[`title`,`text`]))]))}}),[[`__scopeId`,`data-v-a56a9d02`]]),We={class:`page heart`},Ge={class:`heart-bar`},Ke={key:0,class:`muted`},qe={key:1,class:`thread-groups`},Je=[`data-thread-kind`],Ye=[`data-thread`,`onClick`],Xe=[`data-tone`],Ze={class:`thread-text`},Qe=[`aria-expanded`,`onClick`],$e={"aria-hidden":`true`},et={key:3,class:`grid-2 set-aside`},tt={class:`card fold`},nt={class:`eyebrow`},rt={key:0,class:`list`},it={class:`chip`,"data-tone":`quiet`},at={class:`grow`},ot={class:`faint`},st={key:1,class:`muted`},ct={class:`card fold`},lt={class:`eyebrow`},ut={key:0,class:`list`},dt={class:`chip`,"data-tone":`danger`},ft={class:`grow`},pt={key:0,class:`faint`},mt={class:`faint`},ht={key:1,class:`muted`},gt={key:0,class:`thread-sheet stack`},_t={class:`thread-content`},vt={class:`row`},yt={class:`chip`},bt={class:`chip`,"data-tone":`quiet`},xt={class:`stack tight`},St={class:`kv`},Ct={class:`sheet-title`},wt={class:`versions`},Tt={class:`faint`},$=4,Et=x(S({__name:`HeartPage`,setup(r){let s=se(`(max-width: 760px)`),u=c(g(`/mind/self`)||null),d=c(g(`/mind/mood`)||null),_=c(g(`/mind/thoughts?q=`)||[]),x=A(``),S=A(T.sub===`notes`?`notes`:T.sub===`list`||s.value?`list`:`stars`),C=A(null),j=A([]),P=w(()=>(u.value?.threads||[]).filter(e=>e.status!==`closed`)),z=A({}),B=w(()=>(u.value?.threads||[]).filter(e=>e.status===`closed`)),V=w(()=>{let e=u.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?a(`TA 最核心的部分`):e.faded?a(`在远方:很久没被触及`):e.fading?a(`慢慢淡出`):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(x.value)]);e===G&&(u.value=t,d.value=n,_.value=r,C.value&&=t.threads.find(e=>e.thread===C.value.thread)||null)}async function q(e){let t=++G;x.value=e;let n=await F.notes(e);t===G&&(_.value=n)}async function J(e){C.value=e,j.value=[],j.value=await F.thread(e.thread)}async function Y(e){let t=await n(a(`撤销「{content}」?撤销后 TA 不会再这样认为,之后的独处也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条线索`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await F.revoke(`self`,e.thread,t),O(a(`已撤销`)),C.value=null,await K()}catch(e){O(e.message,!0)}}return b(S,e=>{T.page===`heart`&&ee(e===`stars`?``:e)}),b(()=>[T.page,T.sub],([e,t])=>{e===`heart`&&(t===`notes`||t===`list`?S.value=t:!t&&S.value===`notes`&&(S.value=`stars`))}),re(`heart`,K),(n,r)=>(D(),h(`div`,We,[d.value?(D(),m(pe,{key:0,moods:d.value.moods,baseline:d.value.affect.baseline,"time-zone":d.value.clock.timeZone},null,8,[`moods`,`baseline`,`time-zone`])):p(``,!0),o(`div`,Ge,[y(ae,{modelValue:S.value,"onUpdate:modelValue":r[0]||=e=>S.value=e,label:t(a)(`内心的分区`),items:[{key:`stars`,label:t(a)(`心灵星图`),count:P.value.length},{key:`list`,label:t(a)(`线索清单`)},{key:`notes`,label:t(a)(`放在心上`),count:_.value.length}]},null,8,[`modelValue`,`label`,`items`]),S.value===`notes`?p(``,!0):(D(),h(`p`,Ke,i(t(a)(`她从真实经历里慢慢认识自己。点开一条线索,可以看到它如何变化。`)),1))]),u.value?(D(),h(f,{key:1},[S.value===`stars`?(D(),h(f,{key:0},[P.value.length?(D(),m(Ae,{key:0,threads:P.value,kinds:u.value.kinds,activity:t(ie).data?.activity?.kind,onOpen:J},null,8,[`threads`,`kinds`,`activity`])):(D(),m(E,{key:1,title:t(a)(`TA 还没有长出关于自己的东西`),text:t(a)(`聊得多了、独处过、写过日记,TA 会慢慢发现自己喜欢什么、怎么看事情、想做什么。天性只是种子。`)},null,8,[`title`,`text`]))],64)):S.value===`list`?(D(),h(`section`,qe,[(D(!0),h(f,null,v(V.value,n=>(D(),h(`div`,{key:n.kind,class:`card thread-group`,"data-thread-kind":n.kind},[o(`h2`,null,[o(`i`,{style:l({background:t(N)[n.kind]})},null,4),e(i(n.label)+` · `+i(n.threads.length),1)]),(D(!0),h(f,null,v(U(n),n=>(D(),h(`button`,{key:n.thread,class:k([`thread`,{faded:n.faded,core:n.core}]),"data-thread":n.thread,onClick:e=>J(n)},[o(`span`,{class:`chip`,"data-tone":n.faded||n.fading?`quiet`:void 0},i(H(n)),9,Xe),o(`span`,Ze,i(n.content),1),o(`small`,null,[e(i(t(a)(`强度 {v}`,{v:t(M)(n.strength)})),1),n.salience===null?p(``,!0):(D(),h(f,{key:0},[e(i(t(a)(`· 此刻的分量 {v}`,{v:t(M)(n.salience)})),1)],64))])],10,Ye))),128)),n.threads.length>$?(D(),h(`button`,{key:0,type:`button`,class:`thread-more`,"aria-expanded":!!z.value[n.kind],onClick:e=>W(n.kind)},[e(i(z.value[n.kind]?t(a)(`收起线索`):t(a)(`再看 {v} 条线索`,{v:n.threads.length-$}))+` `,1),o(`span`,$e,i(z.value[n.kind]?`↑`:`↓`),1)],8,Qe)):p(``,!0)],8,Je))),128)),V.value.length?p(``,!0):(D(),m(E,{key:0,title:t(a)(`TA 还没有长出关于自己的东西`),text:t(a)(`天性只是种子,其余的都从经历里来。`)},null,8,[`title`,`text`]))])):(D(),m(Ue,{key:2,thoughts:_.value,kinds:d.value?.kinds?.thoughts||{},query:x.value,onChanged:K,onSearch:q},null,8,[`thoughts`,`kinds`,`query`])),S.value===`notes`?p(``,!0):(D(),h(`div`,et,[o(`details`,tt,[o(`summary`,null,[o(`span`,nt,i(t(a)(`放下`)),1),o(`b`,null,i(t(a)(`TA 自己放下的 · {length}`,{length:B.value.length})),1)]),B.value.length?(D(),h(`ul`,rt,[(D(!0),h(f,null,v(B.value,e=>(D(),h(`li`,{key:e.thread,class:`list-row`},[o(`span`,it,i(t(a)(`放下`)),1),o(`span`,at,i(e.content),1),o(`time`,ot,i(t(L)(e.created)),1)]))),128))])):(D(),h(`p`,st,i(t(a)(`没有。`)),1))]),o(`details`,ct,[o(`summary`,null,[o(`span`,lt,i(t(a)(`撤销`)),1),o(`b`,null,i(t(a)(`你撤销过的 · {length}`,{length:u.value.revoked.length})),1)]),u.value.revoked.length?(D(),h(`ul`,ut,[(D(!0),h(f,null,v(u.value.revoked,n=>(D(),h(`li`,{key:n.id,class:`list-row`},[o(`span`,dt,i(t(a)(`撤销`)),1),o(`span`,ft,[e(i(n.content),1),n.reason?(D(),h(`small`,pt,` · `+i(n.reason),1)):p(``,!0)]),o(`time`,mt,i(t(L)(n.created)),1)]))),128))])):(D(),h(`p`,ht,i(t(a)(`没有。`)),1))])]))],64)):p(``,!0),y(oe,{open:!!C.value,title:C.value?u.value?.kinds?.[C.value.kind]||C.value.kind:``,eyebrow:t(a)(`一颗星`),onClose:r[2]||=e=>C.value=null},{default:te(()=>[C.value?(D(),h(`div`,gt,[o(`p`,_t,i(C.value.content),1),o(`div`,vt,[o(`span`,yt,i(H(C.value)),1),o(`span`,bt,i(t(I)[C.value.origin]||C.value.origin),1)]),o(`div`,xt,[y(R,{label:t(a)(`强度`),value:C.value.strength},null,8,[`label`,`value`]),C.value.salience===null?p(``,!0):(D(),m(R,{key:0,label:t(a)(`此刻的分量`),value:C.value.salience},null,8,[`label`,`value`]))]),o(`dl`,St,[o(`dt`,null,i(t(a)(`经历的天数`)),1),o(`dd`,null,i(t(a)(`{length} 天`,{length:C.value.days.length})),1),o(`dt`,null,i(t(a)(`来源`)),1),o(`dd`,null,i(t(a)(`{length} 处`,{length:C.value.sources.length})),1),o(`dt`,null,i(t(a)(`最近一次被触及`)),1),o(`dd`,null,i(t(L)(C.value.created)),1)]),o(`section`,null,[o(`h3`,Ct,i(t(a)(`怎么变成现在这样的 · {versions} 个版本`,{versions:C.value.versions})),1),o(`ol`,wt,[(D(!0),h(f,null,v(j.value,e=>(D(),h(`li`,{key:e.id},[o(`time`,null,i(t(L)(e.created)),1),o(`b`,null,i(t(M)(e.strength)),1),o(`span`,null,i(e.content),1)]))),128))])]),o(`button`,{class:`danger`,"data-revoke-thread":``,onClick:r[1]||=e=>Y(C.value)},i(t(a)(`撤销这条线索`)),1),o(`p`,Tt,i(t(a)(`撤销后 TA 不会再这样认为;这只是拿走一段理解,不会改写发生过的事。`)),1)])):p(``,!0)]),_:1},8,[`open`,`title`,`eyebrow`])]))}}),[[`__scopeId`,`data-v-f49fd383`]]);export{Et as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,Ct as t,D as n,Et as r,I as i,J as a,L as o,M as s,St as c,Tt as l,W as u,X as d,Y as f,Z as p,_ as m,dt as h,et as g,gt as _,i as v,n as y,nt as b,o as x,q as S,s as C,t as w,ut as T,v as E,vt as D,wt as O,xt as k}from"./Empty-DSurzLFZ.js";import{g as A,m as j,n as M,p as N,t as P,v as F}from"./mind-BMcoPQNd.js";import{_ as I,a as L,b as R,d as z,m as B,n as V,t as H}from"./index-Cn6TppEV.js";var U={key:0,class:`book`},ee=[`aria-label`],te=[`data-day`,`aria-current`,`onClick`],W={class:`eyebrow`},G=[`aria-label`],K={class:`ink`},q={key:0,class:`row`},J=[`onClick`],Y={key:1},X=[`disabled`,`aria-label`],Z=[`disabled`],Q=[`disabled`,`aria-label`],ne={key:2,class:`day-diff`},re={key:0},ie={key:1},ae={key:2},oe={key:3},se={key:4},ce={key:1,class:`muted`},le=y(b({__name:`DiaryBook`,props:{diaries:{}},setup(n){let s=n,c=k(0),l=k(null),m=k(!1),y=0,b=S(()=>s.diaries[c.value]||null);_(()=>s.diaries,e=>{c.value>=e.length&&(c.value=0)}),_(()=>b.value?.id,()=>{y++,l.value=null,m.value=!1});async function x(){if(!b.value)return;let e=b.value.day,t=++y;if(l.value?.day===b.value.day){l.value=null;return}m.value=!0;try{let n=await A.day(e);t===y&&b.value?.day===e&&(l.value=n)}catch(e){t===y&&E(e.message,!0)}finally{t===y&&(m.value=!1)}}return(s,_)=>n.diaries.length?(T(),p(`div`,U,[a(`nav`,{class:`days`,"aria-label":t(i)(`日记的日子`)},[(T(!0),p(u,null,h(n.diaries,(e,n)=>(T(),p(`button`,{key:e.id,class:O([`diary-day`,{active:n===c.value}]),"data-day":e.day,"aria-current":n===c.value?`true`:void 0,onClick:e=>c.value=n},[a(`b`,null,r(t(z)(e.day)),1),a(`small`,null,r(t(I)(e.day))+r(e.mood?` · ${e.mood}`:``),1)],10,te))),128))],8,ee),g(o,{name:`page-turn`,mode:`out-in`},{default:D(()=>[b.value?(T(),p(`article`,{key:b.value.id,class:`diary-page`},[a(`header`,null,[a(`div`,null,[a(`span`,W,r(t(i)(`日记`)),1),a(`h2`,null,[e(r(t(z)(b.value.day))+` `,1),a(`small`,null,r(t(I)(b.value.day)),1)])]),b.value.mood?(T(),p(`span`,{key:0,class:`stamp`,"aria-label":t(i)(`那天的心情`)},r(b.value.mood),9,G)):d(``,!0)]),a(`p`,K,r(b.value.content),1),b.value.actions?.length?(T(),p(`div`,q,[(T(!0),p(u,null,h(b.value.actions,e=>(T(),p(`button`,{key:e.ref,class:`text-button`,onClick:n=>t(v)(`time`,e.work?`works/`+e.work:`tasks`)},r(e.title)+` → `,9,J))),128))])):d(``,!0),b.value.compare?(T(),p(`blockquote`,Y,r(t(i)(`和昨天的自己比:{compare}`,{compare:b.value.compare})),1)):d(``,!0),a(`footer`,null,[a(`button`,{disabled:c.value>=n.diaries.length-1,"aria-label":t(i)(`前一天`),onClick:_[0]||=e=>c.value+=1},r(t(i)(`‹ 前一天`)),9,X),a(`button`,{class:`primary`,disabled:m.value,onClick:x},r(l.value?.day===b.value.day?t(i)(`合上那天的 TA`):t(i)(`那天的 TA`)),9,Z),a(`button`,{disabled:c.value===0,"aria-label":t(i)(`后一天`),onClick:_[1]||=e=>--c.value},r(t(i)(`后一天 ›`)),9,Q)]),l.value?.day===b.value.day?(T(),p(`section`,ne,[l.value.change?(T(),p(u,{key:0},[a(`h3`,null,r(t(i)(`那天的 TA,和前一天比`)),1),l.value.change.appeared.length?(T(),p(`p`,re,[a(`b`,null,r(t(i)(`多了:`)),1),e(r(l.value.change.appeared.map(e=>e.content).join(`;`)),1)])):d(``,!0),l.value.change.changed.length?(T(),p(`p`,ie,[a(`b`,null,r(t(i)(`变了:`)),1),e(r(l.value.change.changed.map(e=>`${e.before.content} → ${e.content}`).join(`;`)),1)])):d(``,!0),l.value.change.faded.length?(T(),p(`p`,ae,[a(`b`,null,r(t(i)(`放下了:`)),1),e(r(l.value.change.faded.map(e=>e.content).join(`;`)),1)])):d(``,!0),l.value.change.livingFor?(T(),p(`p`,oe,[a(`b`,null,r(t(i)(`正在过的:`)),1),e(r(l.value.change.livingFor.from||t(i)(`还没有`))+` → `+r(l.value.change.livingFor.to||t(i)(`还没有`)),1)])):l.value.snapshot?.livingFor?.content?(T(),p(`p`,se,[a(`b`,null,r(t(i)(`正在过的:`)),1),e(r(l.value.snapshot.livingFor.content),1)])):d(``,!0),a(`p`,null,[a(`b`,null,r(t(i)(`心情:`)),1),e(r(l.value.change.mood.before||`—`)+` → `+r(l.value.change.mood.after||`—`),1)])],64)):(T(),p(`p`,ce,r(t(i)(`这是 TA 留下快照的第一天,还没有可以对照的昨天。`)),1))])):d(``,!0)])):d(``,!0)]),_:1})])):(T(),f(w,{key:1,title:t(i)(`还没有日记`),text:t(i)(`每天睡前(或凌晨),如果这一天真的有过经历,TA 会写下来,并和昨天的自己对照。`)},null,8,[`title`,`text`]))}}),[[`__scopeId`,`data-v-c7291772`]]),ue={class:`ahead`},de={class:`ahead-head`},fe={class:`eyebrow`},pe={class:`muted`},me={key:0,class:`calendar-wrap`},he={class:`calendar card`},ge=[`aria-label`],_e=[`aria-label`],ve={class:`grid`,role:`grid`},ye={key:0,class:`blank`},be=[`aria-label`,`onClick`],xe={key:0,class:`dots`},Se=[`data-state`],Ce={class:`picked card`},we={key:0,class:`list`},Te=[`data-tone`],Ee={class:`grow`},De={class:`faint`},Oe=[`onClick`],ke={key:1,class:`muted`},Ae={key:1},je={key:0,class:`list`},Me=[`data-ahead`],Ne={class:`when`},Pe=[`data-tone`],Fe={class:`grow`},Ie={class:`faint`},Le=[`onClick`],Re=y(b({__name:`AheadCalendar`,props:{items:{},timeZone:{},today:{}},emits:[`changed`],setup(o,{emit:c}){let l=o,m=c,_=k(`calendar`),[v,y]=l.today.split(`-`).map(Number),b=k(v),x=k(y),C=k(l.today),D=S(()=>[1,2,3,4,5,6,7].map(e=>new Date(Date.UTC(2024,0,e)).toLocaleDateString(s(),{weekday:`narrow`,timeZone:`UTC`}))),j=e=>new Intl.DateTimeFormat(`en-CA`,{timeZone:l.timeZone,year:`numeric`,month:`2-digit`,day:`2-digit`}).format(e),N=S(()=>{let e=new Map;for(let t of l.items){let n=j(t.occurrence);e.set(n,[...e.get(n)||[],t])}return e}),I=S(()=>{let e=(new Date(Date.UTC(b.value,x.value-1,1)).getUTCDay()+6)%7,t=new Date(Date.UTC(b.value,x.value,0)).getUTCDate(),n=Array(e).fill(null);for(let e=1;e<=t;e++){let t=`${b.value}-${String(x.value).padStart(2,`0`)}-${String(e).padStart(2,`0`)}`;n.push({day:t,n:e,items:N.value.get(t)||[]})}return n}),L=S(()=>N.value.get(C.value)||[]),R=S(()=>{let e=l.items.filter(e=>e.state===`pending`).sort((e,t)=>e.occurrence-t.occurrence),t=l.items.filter(e=>e.state!==`pending`).sort((e,t)=>t.occurrence-e.occurrence);return[...e,...t]});function z(e){let t=x.value+e;b.value+=Math.floor((t-1)/12),x.value=(t-1+120)%12+1}async function B(e){let t=await n(i(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:i(`撤销这个约定`),confirmText:i(`撤销`),danger:!0,placeholder:i(`原因`)});if(t!==null)try{await A.revoke(`anticipation`,e.id,t),E(i(`已撤销`)),m(`changed`)}catch(e){E(e.message,!0)}}function H(e){if([`missed`,`lapsed`,`revoked`].includes(e.state))return`danger`;if(e.state!==`pending`)return`quiet`}return(n,s)=>(T(),p(`section`,ue,[a(`div`,de,[a(`div`,null,[a(`span`,fe,r(t(i)(`AHEAD · 向前看`)),1),a(`h2`,null,r(t(i)(`让未来有值得期待的事。`)),1),a(`p`,pe,r(t(i)(`约定、想做的事与每年都会回来的日子,都安静地留在这里。`)),1)]),g(V,{modelValue:_.value,"onUpdate:modelValue":s[0]||=e=>_.value=e,label:t(i)(`约定的视图`),items:[{key:`calendar`,label:t(i)(`日历`)},{key:`list`,label:t(i)(`清单`),count:o.items.length}]},null,8,[`modelValue`,`label`,`items`])]),_.value===`calendar`?(T(),p(`div`,me,[a(`div`,he,[a(`header`,null,[a(`button`,{class:`icon-button ghost`,"aria-label":t(i)(`上个月`),onClick:s[1]||=e=>z(-1)},` ‹ `,8,ge),a(`b`,null,r(t(i)(`{year} 年 {month} 月`,{year:b.value,month:x.value})),1),a(`button`,{class:`icon-button ghost`,"aria-label":t(i)(`下个月`),onClick:s[2]||=e=>z(1)},` › `,8,_e)]),a(`div`,ve,[(T(!0),p(u,null,h(D.value,(e,t)=>(T(),p(`span`,{key:t,class:`wd`},r(e),1))),128)),(T(!0),p(u,null,h(I.value,(n,a)=>(T(),p(u,{key:a},[n?(T(),p(`button`,{key:1,class:O([`cell`,{today:n.day===o.today,picked:n.day===C.value,has:n.items.length}]),"aria-label":t(i)(`{n} 日{v}`,{n:n.n,v:n.items.length?t(i)(`,{length} 件事`,{length:n.items.length}):``}),onClick:e=>C.value=n.day},[e(r(n.n)+` `,1),n.items.length?(T(),p(`i`,xe,[(T(!0),p(u,null,h(n.items.slice(0,3),e=>(T(),p(`em`,{key:e.id,"data-state":e.state},null,8,Se))),128))])):d(``,!0)],10,be)):(T(),p(`span`,ye))],64))),128))])]),a(`div`,Ce,[a(`h3`,null,r(t(i)(`{month} 月 {date} 日`,{month:Number(C.value.slice(5,7)),date:Number(C.value.slice(8,10))})),1),L.value.length?(T(),p(`ul`,we,[(T(!0),p(u,null,h(L.value,e=>(T(),p(`li`,{key:e.id,class:O([`ahead-item`,{closed:e.state!==`pending`}])},[a(`span`,{class:`chip`,"data-tone":H(e)},r(t(M)[e.state]||e.state),9,Te),a(`div`,Ee,[a(`p`,null,r(e.name?`${e.name}:`:``)+r(e.content),1),a(`small`,De,r(t(P)[e.kind]||e.kind)+` · `+r(e.when)+r(e.recurrence===`yearly`?t(i)(` · 每年`):``),1)]),e.state===`revoked`?d(``,!0):(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>B(e)},r(t(i)(`撤销`)),9,Oe))],2))),128))])):(T(),p(`p`,ke,r(t(i)(`这一天没有 TA 在等的事。`)),1))])])):(T(),p(`div`,Ae,[R.value.length?(T(),p(`ul`,je,[(T(!0),p(u,null,h(R.value,e=>(T(),p(`li`,{key:e.id,class:O([`ahead-item card flat`,{closed:e.state!==`pending`}]),"data-ahead":e.id},[a(`time`,Ne,r(t(F)(e.occurrence,o.timeZone).slice(0,5)),1),a(`span`,{class:`chip`,"data-tone":H(e)},r(t(M)[e.state]||e.state),9,Pe),a(`div`,Fe,[a(`p`,null,r(e.name?`${e.name}:`:``)+r(e.content),1),a(`small`,Ie,r(t(P)[e.kind]||e.kind)+` · `+r(e.when)+r(e.recurrence===`yearly`?t(i)(` · 每年`):``)+r(e.private?t(i)(` · 私下知道的`):``)+r(e.closed_note?` · ${e.closed_note}`:``),1)]),e.state===`revoked`?d(``,!0):(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>B(e)},r(t(i)(`撤销`)),9,Le))],10,Me))),128))])):(T(),f(w,{key:1,title:t(i)(`还没有 TA 在等的事`),text:t(i)(`有人说起之后的安排、TA 答应了别人什么,整理记忆时会记下来。`)},null,8,[`title`,`text`]))]))]))}}),[[`__scopeId`,`data-v-0abd3715`]]),ze={class:`page life`},Be={class:`life-intro`},Ve={class:`eyebrow`},He={class:`life-bar`},Ue={key:0,class:`chip`,"data-tone":`quiet`},We={key:1,class:`card reviews`},Ge={class:`card-head`},Ke={class:`eyebrow`},qe={class:`faint`},Je={class:`review-text`},Ye={key:0},Xe={key:2,class:`story`},Ze={key:0,class:`chapter preface`},Qe={class:`eyebrow`},$e={key:1,class:`versions`},et={class:`eyebrow`},tt=[`onClick`],$={key:1,class:`versions`},nt={key:4,class:`shelf`},rt={class:`muted shelf-note`},it={key:0,class:`books`},at={class:`faint`},ot={class:`card creations`},st={class:`faint`},ct={style:{"white-space":`pre-wrap`}},lt={class:`card runs`},ut={class:`eyebrow`},dt={key:0,class:`list run-list`},ft={class:`faint`},pt=[`data-tone`],mt={class:`grow`},ht={class:`faint`},gt={key:1,class:`muted`},_t=y(b({__name:`LifePage`,setup(n){let o=[`diary`,`reviews`,`story`,`ahead`,`shelf`],s=c(m(`/mind/life?q=`)||null),y=k(o.includes(C.sub)?C.sub:`diary`),b=k({}),E=k(null),O=S(()=>R.data?.clock?.timeZone||`Asia/Shanghai`),M=S(()=>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&&(s.value=t)}async function z(e){if(b.value[e]){let{[e]:t,...n}=b.value;b.value=n;return}b.value={...b.value,[e]:await A.chapter(e)}}async function U(){E.value=E.value?null:await A.story()}return _(y,e=>{C.page===`life`&&x(e===`diary`?``:e)}),_(()=>[C.page,C.sub],([e,t])=>{e===`life`&&(y.value=o.includes(t)?t:`diary`)}),L(`life`,I),(n,o)=>(T(),p(`div`,ze,[a(`header`,Be,[a(`div`,null,[a(`span`,Ve,r(t(i)(`LIFE · 一生`)),1),a(`h1`,null,[e(r(t(i)(`日子经过,`)),1),a(`em`,null,r(t(i)(`留下自己的形状。`)),1)]),a(`p`,null,r(t(i)(`写下今天,回望从前,也给明天留一点期待。`)),1)]),o[4]||=a(`div`,{class:`life-mark`,"aria-hidden":`true`},[a(`span`)],-1)]),a(`div`,He,[a(`button`,{class:`text-button`,onClick:o[0]||=e=>t(v)(`time`)},r(t(i)(`时间、任务与作品 →`)),1),g(V,{modelValue:y.value,"onUpdate:modelValue":o[1]||=e=>y.value=e,label:t(i)(`一生的分区`),items:[{key:`diary`,label:t(i)(`日记本`),count:s.value?.diaries.length??``},{key:`reviews`,label:t(i)(`回顾`),count:s.value?.reviews.length??``},{key:`story`,label:t(i)(`我的来路`),count:s.value?s.value.chapters.length:``},{key:`ahead`,label:t(i)(`约定与期待`),count:s.value?.anticipations.filter(e=>e.state===`pending`).length??``},{key:`shelf`,label:t(i)(`书架`),count:s.value?.readings.length??``}]},null,8,[`modelValue`,`label`,`items`]),s.value?(T(),p(`span`,Ue,r(t(i)(`来到这里的第 {dayOfLife} 天`,{dayOfLife:s.value.dayOfLife})),1)):d(``,!0)]),s.value?(T(),p(u,{key:0},[y.value===`diary`?(T(),f(le,{key:0,diaries:s.value.diaries},null,8,[`diaries`])):y.value===`reviews`?(T(),p(`section`,We,[a(`div`,Ge,[a(`div`,null,[a(`span`,Ke,r(t(i)(`回顾`)),1),a(`h2`,null,r(t(i)(`TA 的回顾`)),1),a(`p`,null,r(t(i)(`每隔一段时间,TA 在夜里重新看看这段日子:留下了什么、自己怎样在变。`)),1)])]),s.value.reviews.length?(T(),f(H,{key:0,items:s.value.reviews,label:t(i)(`回顾`)},{default:D(({item:e})=>[a(`time`,qe,r(t(F)(e.created,O.value)),1),a(`p`,Je,r(e.content),1),e.compare?(T(),p(`blockquote`,Ye,r(t(i)(`和上次回顾比:{compare}`,{compare:e.compare})),1)):d(``,!0)]),_:1},8,[`items`,`label`])):(T(),f(w,{key:1,title:t(i)(`还没有回顾过`),text:t(i)(`日记攒到两篇以后,TA 会在睡着的时候第一次回顾。`)},null,8,[`title`,`text`]))])):y.value===`story`?(T(),p(`section`,Xe,[s.value.story?(T(),p(`article`,Ze,[a(`span`,Qe,r(t(i)(`前言`)),1),a(`h2`,null,r(t(i)(`我的来路 · 第 {dayOfLife} 天`,{dayOfLife:s.value.dayOfLife})),1),a(`p`,null,r(s.value.story.content),1),s.value.storyVersions>1?(T(),p(`button`,{key:0,class:`text-button`,onClick:U},r(E.value?t(i)(`收起旧版本`):t(i)(`重写过 {v} 次`,{v:s.value.storyVersions-1})),1)):d(``,!0),E.value?(T(),p(`ol`,$e,[(T(!0),p(u,null,h(E.value.slice(1),e=>(T(),p(`li`,{key:e.id},[a(`time`,null,r(t(F)(e.created,O.value)),1),a(`span`,null,r(e.content),1)]))),128))])):d(``,!0)])):d(``,!0),(T(!0),p(u,null,h(s.value.chapters,e=>(T(),p(`article`,{key:e.id,class:`chapter`},[a(`span`,et,r(t(i)(`第 {chapter} 章`,{chapter:e.chapter})),1),a(`h2`,null,r(e.title),1),a(`p`,null,r(e.content),1),e.versions>1?(T(),p(`button`,{key:0,class:`text-button`,onClick:t=>z(e.chapter)},r(b.value[e.chapter]?t(i)(`收起旧版本`):t(i)(`重写过 {v} 次`,{v:e.versions-1})),9,tt)):d(``,!0),b.value[e.chapter]?(T(),p(`ol`,$,[(T(!0),p(u,null,h(b.value[e.chapter].slice(1),e=>(T(),p(`li`,{key:e.id},[a(`time`,null,r(t(F)(e.created,O.value)),1),a(`span`,null,r(e.title)+`:`+r(e.content),1)]))),128))])):d(``,!0)]))),128)),!s.value.story&&!s.value.chapters.length?(T(),f(w,{key:1,title:t(i)(`自传还没开始写`),text:t(i)(`有了两篇日记之后,TA 会在夜里第一次回顾,写下「我的来路」和第一章。旧的版本都会留着。`)},null,8,[`title`,`text`])):d(``,!0)])):y.value===`ahead`?(T(),f(Re,{key:3,items:s.value.anticipations,"time-zone":O.value,today:M.value,onChanged:I},null,8,[`items`,`time-zone`,`today`])):(T(),p(`section`,nt,[a(`p`,rt,[e(r(t(i)(`独处时,TA 会从共享资料里挑自己感兴趣的读,一段一段地读下去,读后的想法可以改变 TA。还有 {v} 段没读。`,{v:t(B)(s.value.unread)}))+` `,1),a(`button`,{class:`text-button`,onClick:o[2]||=e=>t(v)(`memory`,`shelf`)},r(t(i)(`去资料书架放点书`)),1)]),s.value.readings.length?(T(),p(`div`,it,[(T(!0),p(u,null,h(s.value.readings,e=>(T(),p(`article`,{key:e.id,class:`book-card`},[a(`div`,{class:`spine`,style:l({"--p":(e.ordinal+1)/Math.max(1,e.total)})},null,4),a(`div`,null,[a(`h3`,null,`《`+r(e.title)+`》`,1),a(`small`,at,r(t(i)(`第 {v} / {total} 段 · {v2}`,{v:e.ordinal+1,total:e.total,v2:t(F)(e.created,O.value)})),1),a(`p`,null,r(e.note||t(i)(`读完没说什么`)),1)])]))),128))])):(T(),f(w,{key:1,title:t(i)(`还没读过什么`),text:t(i)(`把文章放进「记忆 → 资料书架」的共享集合,TA 独处时会去读。`)},null,8,[`title`,`text`]))])),a(`details`,ot,[a(`summary`,null,r(t(i)(`独处时留下的东西 · {v}`,{v:s.value.creations?.length||0})),1),a(`button`,{class:`text-button`,onClick:o[3]||=e=>t(v)(`time`,`works`)},r(t(i)(`阅读草稿、篇章和旧版本 →`)),1),(T(!0),p(u,null,h(s.value.creations||[],e=>(T(),p(`article`,{key:e.id,class:`creation`},[a(`h3`,null,r(e.title),1),a(`small`,st,r(t(F)(e.created,O.value))+` · `+r(e.discretion===`open`?t(i)(`自己的作品`):t(i)(`留在私下`)),1),a(`p`,ct,r(e.content),1)]))),128)),s.value.creations?.length?d(``,!0):(T(),f(w,{key:0,title:t(i)(`还没有独处作品`),text:t(i)(`她会按自己留下的计划,阅读、写东西或整理想法。`)},null,8,[`title`,`text`]))]),a(`details`,lt,[a(`summary`,null,[a(`span`,ut,r(t(i)(`独处的时候`)),1),a(`b`,null,r(t(i)(`独处、日记与夜里的记录 · {length}`,{length:s.value.runs.length})),1)]),s.value.runs.length?(T(),p(`ul`,dt,[(T(!0),p(u,null,h(s.value.runs,e=>(T(),p(`li`,{key:e.id,class:`run-row`},[a(`time`,ft,r(t(F)(e.started,O.value)),1),a(`span`,{class:`chip`,"data-tone":e.status===`error`?`danger`:e.status===`written`?`ok`:`quiet`},r(t(N)[e.kind]||e.kind)+` · `+r(t(j)[e.status]||e.status),9,pt),a(`span`,mt,r(e.reason),1),a(`small`,ht,r(e.model||t(i)(`未调用模型`))+` · `+r(t(B)(e.tokens))+` Token`,1)]))),128))])):(T(),p(`p`,gt,r(t(i)(`安静本身不会留下记录;TA 真正独处、写日记或在夜里整理时才会记下。`)),1))])],64)):d(``,!0)]))}}),[[`__scopeId`,`data-v-e4940116`]]);export{_t as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,M as s,Tt as c,U as l,V as u,W as d,X as f,Y as p,Z as m,ct as ee,dt as h,et as g,gt as _,lt as v,m as y,n as b,nt as x,o as S,q as C,s as w,t as T,ut as E,v as D,vt as O,wt as k,xt as A,yt as j}from"./Empty-DSurzLFZ.js";import{g as te,l as M,s as N}from"./mind-BMcoPQNd.js";import{c as P,f as F,g as I,h as ne,n as L,o as re}from"./index-Cn6TppEV.js";import{a as R,c as ie,i as z,l as ae,n as oe,o as B,r as se,s as ce,t as le,u as V}from"./knowledge-sUjcjbfI.js";var ue={class:`archive`},de={class:`archive-bar card`},fe={class:`scope`},pe={class:`scope`},me=[`placeholder`,`aria-label`],he=[`disabled`],ge={id:`memorySummary`,class:`card summary-card`},_e={class:`card-head`},ve={class:`eyebrow`},ye={class:`row`},be=[`disabled`,`aria-label`],xe=[`disabled`],Se={class:`row between faint`},Ce={class:`card list-card`},we={class:`tools row`},Te=[`disabled`],Ee=[`disabled`],De=[`disabled`],Oe={id:`memoryList`,class:`scroll-pane`},ke=[`aria-label`,`data-memory-select`,`checked`,`disabled`,`onChange`],Ae={class:`memory`},je={class:`content`},Me={class:`tags`},Ne=[`data-tone`],Pe={class:`chip`,"data-tone":`quiet`},Fe={key:0,class:`chip`,"data-tone":`warn`},Ie={class:`faint meta`},Le=[`data-content`,`aria-label`],Re={class:`row`},ze=[`onClick`],Be={class:`faint`},Ve=[`onClick`],He=[`onClick`],Ue={class:`row between faint foot`},We=[`placeholder`],Ge={id:`memoryUsers`},Ke=[`value`],qe={class:`primary`},H=b(x({__name:`MemoryArchive`,props:{sessionId:{}},emits:[`update:sessionId`],setup(c,{emit:y}){let b=c,x=y,S=A(``),F=A(``),L=A(!1),R=A(!1),z=A(20),B=A([]),V=A({summary:``,updated:null,source:`empty`}),H=A([]),U=A(!1),W=A(!1),G=0,K=C(()=>w.core?.sessions||[]),q=C({get:()=>b.sessionId,set:e=>x(`update:sessionId`,e)}),Je=C(()=>{let e=new Map;for(let t of B.value)t.subject&&e.set(String(t.subject),t.subjectName||String(t.subject));return[...e.entries()]}),J=C(()=>B.value.filter(e=>e.status!==`deleted`&&(!F.value||String(e.subject)===F.value)&&JSON.stringify(e).includes(S.value))),Y=C(()=>B.value.filter(X));function X(e){return e.session_id===b.sessionId&&!e.locked&&e.status!==`deleted`}async function Z(){if(!b.sessionId)return;let e=b.sessionId;sessionStorage.memorySession=e;let[t,n]=await Promise.all([ce(e),ie(e)]);if(b.sessionId!==e)return;B.value=t,V.value=n;let r=new Set(t.filter(X).map(e=>e.id));H.value=H.value.filter(e=>r.has(e))}_(()=>b.sessionId,()=>{z.value=20,F.value=``,Z()}),_(S,()=>z.value=20),ee(()=>{Z(),G=window.setInterval(()=>{!document.hidden&&!w.dirty&&!L.value&&Z()},4e3)}),v(()=>clearInterval(G));async function Ye(e){let t=e.target,n=Object.fromEntries(new FormData(t)),r=(V.value.participants||[]).find(e=>e.name===String(n.subject||``).trim());r&&(n.subject=r.id);try{await le(n),t.reset(),L.value=!1,await Z(),D(a(`记忆已写入`))}catch(e){D(e.message,!0)}}async function Q(e,t){if(t===`revoke`){let t=await n(a(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条记忆`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t===null)return;try{await te.revoke(`memory`,e.id,t)}catch(e){D(e.message,!0)}await Z();return}let r=document.querySelector(`[data-content="${e.id}"]`)?.value;await ae(e.id,t===`lock`?{locked:!e.locked}:t.startsWith(`discretion:`)?{discretion:t.slice(11)}:{status:`confirmed`,content:r}),await Z()}function Xe(e,t){let n=t.target.checked;H.value=n?[...new Set([...H.value,e])]:H.value.filter(t=>t!==e)}async function Ze(){if(H.value.length&&await r(a(`确定删除已选的 {length} 条记忆吗?`,{length:H.value.length}),{title:a(`删除记忆`),confirmText:a(`删除`),danger:!0}))try{let e=await se({session:b.sessionId,ids:H.value});H.value=[],await Z(),D(a(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){D(e.message,!0)}}async function Qe(){let e=Y.value.length;if(e&&await r(a(`确定清空本会话的 {count} 条可删除记忆吗?`,{count:e}),{title:a(`清空本会话记忆`),confirmText:a(`清空`),danger:!0}))try{let e=await se({session:b.sessionId,all:!0});H.value=[],await Z(),D(a(`已删除 {v} 条记忆`,{v:e.deleted||0}))}catch(e){D(e.message,!0)}}async function $(){if(b.sessionId){U.value=!0;try{V.value=await ie(b.sessionId)}catch(e){D(e.message,!0)}finally{U.value=!1}}}async function $e(){if(b.sessionId&&!W.value){W.value=!0;try{await oe(b.sessionId),await $(),await Z(),D(a(`记忆已整理`))}catch(e){D(e.message,!0)}finally{W.value=!1}}}return(n,r)=>(E(),m(`section`,ue,[o(`div`,de,[o(`label`,fe,[o(`span`,null,i(t(a)(`在哪里知道的`)),1),g(P,{id:`memoryScope`,modelValue:q.value,"onUpdate:modelValue":r[0]||=e=>q.value=e,"aria-label":t(a)(`在哪里知道的`),options:t(I)(K.value,t(a)(`选择会话`))},null,8,[`modelValue`,`aria-label`,`options`])]),o(`label`,pe,[o(`span`,null,i(t(a)(`关于谁`)),1),g(P,{modelValue:F.value,"onUpdate:modelValue":r[1]||=e=>F.value=e,"aria-label":t(a)(`按人筛选`),options:[{value:``,label:t(a)(`所有人`)},...Je.value.map(([e,t])=>({value:e,label:t}))]},null,8,[`modelValue`,`aria-label`,`options`])]),j(o(`input`,{id:`memorySearch`,"onUpdate:modelValue":r[2]||=e=>S.value=e,type:`search`,placeholder:t(a)(`搜索记忆、人物或关键词`),"aria-label":t(a)(`搜索记忆`)},null,8,me),[[u,S.value]]),o(`button`,{class:`primary`,disabled:!c.sessionId,onClick:r[3]||=e=>L.value=!0},i(t(a)(`+ 手动记忆`)),9,he)]),o(`section`,ge,[o(`div`,_e,[o(`div`,null,[o(`span`,ve,i(t(a)(`最近发生了什么`)),1),o(`h2`,null,i(K.value.find(e=>e.id===c.sessionId)?t(ne)(K.value.find(e=>e.id===c.sessionId)):t(a)(`记忆档案`)),1)]),o(`div`,ye,[o(`button`,{id:`refreshMemorySummary`,class:`icon-button`,disabled:U.value||!c.sessionId,"aria-label":t(a)(`刷新总结`),onClick:$},` ↻ `,8,be),o(`button`,{id:`consolidateMemory`,disabled:W.value||!c.sessionId,onClick:$e},i(W.value?t(a)(`整理中…`):t(a)(`立即整理`)),9,xe)])]),o(`p`,{"data-memory-summary":``,class:k({clamp:!R.value})},i(V.value.summary||t(a)(`请选择会话以查看最近的记忆总结。`)),3),o(`div`,Se,[o(`span`,null,i(V.value.updated?new Date(V.value.updated).toLocaleString(t(s)()):t(a)(`尚未整理`)),1),o(`button`,{class:`text-button`,onClick:r[4]||=e=>R.value=!R.value},i(R.value?t(a)(`收起`):t(a)(`展开`)),1)])]),o(`section`,Ce,[o(`div`,we,[o(`button`,{id:`selectAllMemories`,class:`small`,onClick:r[5]||=e=>H.value=Y.value.map(e=>e.id)},i(t(a)(`全选`)),1),o(`button`,{id:`clearMemorySelection`,class:`small`,disabled:!H.value.length,onClick:r[6]||=e=>H.value=[]},i(t(a)(`取消选择`)),9,Te),o(`button`,{id:`deleteSelectedMemories`,class:`small danger`,disabled:!H.value.length,onClick:Ze},i(t(a)(`删除已选 {v}`,{v:H.value.length||``})),9,Ee),o(`button`,{id:`deleteAllSessionMemories`,class:`small danger push`,disabled:!Y.value.length,onClick:Qe},i(t(a)(`清空本会话`)),9,De)]),o(`div`,Oe,[(E(!0),m(d,null,h(J.value.slice(0,z.value),e=>(E(),m(`article`,{key:e.id,class:k([`memory-row`,{superseded:e.status===`superseded`}])},[o(`input`,{type:`checkbox`,"aria-label":t(a)(`选择记忆:`)+e.content,"data-memory-select":e.id,checked:H.value.includes(e.id),disabled:!X(e),onChange:t=>Xe(e.id,t)},null,40,ke),o(`details`,Ae,[o(`summary`,null,[o(`span`,je,i(e.content),1),o(`span`,Me,[o(`span`,{class:`chip`,"data-tone":e.status===`confirmed`?void 0:`quiet`},i(t(M)[e.status]||e.status),9,Ne),o(`span`,Pe,i(t(N)[e.discretion]||t(a)(`公开`)),1),e.locked?(E(),m(`span`,Fe,i(t(a)(`已锁定`)),1)):f(``,!0)])]),o(`p`,Ie,i(t(a)(`关于 {v} · {v2} · 把握 {v3}%`,{v:e.subjectName||e.subject,v2:e.session_id===c.sessionId?t(a)(`在这里知道的`):t(a)(`别处知道的`),v3:Math.round((e.confidence??1)*100)})),1),o(`textarea`,{"data-content":e.id,"aria-label":t(a)(`编辑记忆:`)+(e.subjectName||e.subject)},i(e.content),9,Le),o(`div`,Re,[o(`button`,{class:`small`,onClick:t=>Q(e,`confirmed`)},i(t(a)(`保存修改`)),9,ze),o(`small`,Be,i(t(a)(`编辑后要点保存`)),1),g(P,{"aria-label":t(a)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(t(N)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>Q(e,`discretion:`+t)},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),o(`button`,{class:`small`,onClick:t=>Q(e,`lock`)},i(e.locked?t(a)(`解锁`):t(a)(`锁定`)),9,Ve),o(`button`,{class:`small danger`,onClick:t=>Q(e,`revoke`)},i(t(a)(`撤销`)),9,He)])])],2))),128)),J.value.length>z.value?(E(),m(`button`,{key:0,class:`small more`,onClick:r[7]||=e=>z.value+=20},i(t(a)(`再显示 20 条`)),1)):f(``,!0),J.value.length?f(``,!0):(E(),p(T,{key:1,title:t(a)(`这里还有空白`),text:t(a)(`别人说「记住……」、聊天积累后的自动整理,或你手动添加的事会出现在这里。TA 对所有会话只有一份记忆:别处知道的事只在相关时想起,私下知道的不当众说,要 TA 保密的不离开原处。`)},null,8,[`title`,`text`]))]),o(`div`,Ue,[o(`span`,null,i(t(a)(`共 {length} 条记忆`,{length:J.value.length})),1),o(`span`,null,i(t(a)(`共享与锁定的记忆不会被批量选中`)),1)])]),g(re,{open:L.value,title:t(a)(`手动记住一件事`),eyebrow:`REMEMBER`,width:`440px`,onClose:r[9]||=e=>L.value=!1},{default:O(()=>[o(`form`,{id:`addMemory`,class:`stack`,onSubmit:l(Ye,[`prevent`])},[o(`label`,null,[e(i(t(a)(`所属会话`))+` `,1),g(P,{id:`memorySession`,modelValue:q.value,"onUpdate:modelValue":r[8]||=e=>q.value=e,name:`session`,"aria-label":t(a)(`所属会话`),options:t(I)(K.value)},null,8,[`modelValue`,`aria-label`,`options`])]),o(`label`,null,[e(i(t(a)(`用户 ID`))+` `,1),o(`input`,{name:`subject`,required:``,list:`memoryUsers`,placeholder:t(a)(`选择昵称,或填写用户 ID`)},null,8,We)]),o(`datalist`,Ge,[(E(!0),m(d,null,h(V.value.participants||[],e=>(E(),m(`option`,{key:e.id,value:e.name},null,8,Ke))),128))]),o(`label`,null,[e(i(t(a)(`已确认的事实`)),1),r[10]||=o(`input`,{name:`content`,required:``},null,-1)]),o(`button`,qe,i(t(a)(`新增人工记忆`)),1)],32)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-332a6fd9`]]),U={class:`shelf`},W={class:`card shelf-head`},G={class:`eyebrow`},K={class:`muted`},q={class:`collection`},Je=[`aria-label`],J={class:`chip`,"data-tone":`quiet`},Y=[`disabled`,`onClick`],X={class:`grid-2`},Z={class:`card add-doc`},Ye={class:`save-bar`},Q=[`disabled`],Xe={class:`faint`},Ze={class:`row`},Qe=[`placeholder`],$={key:0,class:`muted`},$e=b(x({__name:`KnowledgeShelf`,props:{sessionId:{}},setup(n){let r=n,s=A([]),v=A([]),b=A(`shared-default`),x=A(``),S=A(``),C=A(``),w=A(null),O=A(!1),k=A(``);async function te(e){k.value=e;try{let t=await y(`/core/knowledge/documents/${encodeURIComponent(e)}/reembed`,`POST`,{});D(a(`已重建 {chunks} 段向量`,{chunks:t.chunks}))}catch(e){D(e.message,!0)}finally{k.value=``}}async function M(){r.sessionId&&(s.value=await R(r.sessionId),s.value[0]&&!s.value.some(e=>e.id===b.value)&&(b.value=s.value[0].id),v.value=b.value?await B(b.value):[])}async function N(){O.value=!0;try{await z({collectionId:b.value,title:x.value,text:S.value,embed:!0}),x.value=``,S.value=``,await M(),D(a(`文档已切分入库`))}catch(e){D(e.message,!0)}finally{O.value=!1}}async function I(){try{w.value=await V(r.sessionId,C.value)}catch(e){D(e.message,!0)}}return _(()=>[r.sessionId,b.value],M),ee(M),(n,r)=>(E(),m(`section`,U,[o(`div`,W,[o(`div`,null,[o(`span`,G,i(t(a)(`资料书架`)),1),o(`h2`,null,i(t(a)(`给 TA 留一点可以读的东西`)),1),o(`p`,K,i(t(a)(`存放可供聊天参考的资料,和自动记录的会话记忆分开管理。共享集合里的文章,TA 独处时也会挑着读。`)),1)]),o(`label`,q,[e(i(t(a)(`文档集合`))+` `,1),g(P,{modelValue:b.value,"onUpdate:modelValue":r[0]||=e=>b.value=e,"aria-label":t(a)(`文档集合`),options:s.value.map(e=>({value:e.id,label:e.name}))},null,8,[`modelValue`,`aria-label`,`options`])])]),o(`div`,{class:`books`,"aria-label":t(a)(`资料书架,{length} 份资料`,{length:v.value.length})},[(E(!0),m(d,null,h(v.value,e=>(E(),m(`article`,{key:e.id,class:`book`,style:c({"--hue":t(F)(e.title||e.id)})},[r[4]||=o(`span`,{class:`spine`,"aria-hidden":`true`},null,-1),o(`b`,null,i(e.title),1),o(`small`,J,i(e.status),1),e.status===`ready`?(E(),m(`button`,{key:0,type:`button`,disabled:!!k.value,onClick:t=>te(e.id)},i(k.value===e.id?t(a)(`正在重建…`):t(a)(`重建向量`)),9,Y)):f(``,!0)],4))),128)),v.value.length?f(``,!0):(E(),p(T,{key:0,title:t(a)(`书架还空着`),text:t(a)(`在下面放一份资料,TA 就能在聊天里查到,独处时也可能去读。`)},null,8,[`title`,`text`]))],8,Je),o(`div`,X,[o(`details`,Z,[o(`summary`,null,i(t(a)(`+ 添加一份资料`)),1),o(`form`,{class:`stack tight`,onSubmit:l(N,[`prevent`])},[o(`label`,null,[e(i(t(a)(`标题`)),1),j(o(`input`,{"onUpdate:modelValue":r[1]||=e=>x.value=e,required:``},null,512),[[u,x.value]])]),o(`label`,null,[e(i(t(a)(`粘贴正文`)),1),j(o(`textarea`,{"onUpdate:modelValue":r[2]||=e=>S.value=e,rows:`8`,required:``},null,512),[[u,S.value]])]),o(`div`,Ye,[o(`button`,{class:`primary`,disabled:O.value},i(t(a)(`保存到书架`)),9,Q),o(`small`,Xe,i(t(a)(`保存之后,TA 才能在聊天和独处时读到`)),1)])],32)]),o(`form`,{class:`card probe`,onSubmit:l(I,[`prevent`])},[o(`label`,null,[e(i(t(a)(`检索测试`))+` `,1),o(`div`,Ze,[j(o(`input`,{"onUpdate:modelValue":r[3]||=e=>C.value=e,placeholder:t(a)(`试着搜索一个关键词`)},null,8,Qe),[[u,C.value]]),o(`button`,null,i(t(a)(`检索`)),1)])]),w.value&&!w.value.length?(E(),m(`p`,$,i(t(a)(`没有找到相关资料。`)),1)):f(``,!0),(E(!0),m(d,null,h(w.value||[],t=>(E(),m(`p`,{key:t.id,class:`notice`},[o(`b`,null,i(t.title),1),r[5]||=o(`br`,null,null,-1),e(i(t.text),1)]))),128))],32)])]))}}),[[`__scopeId`,`data-v-e968765b`]]),et={class:`page memory-page`},tt={class:`memory-intro`},nt={class:`eyebrow`},rt={key:0,class:`notice`},it=b(x({__name:`MemoryPage`,setup(n){let r=C(()=>w.core?.sessions||[]),s=sessionStorage.memorySession,c=A(r.value.some(e=>e.id===s)?s:r.value[0]?.id||``),l=A(w.sub===`shelf`?`shelf`:`memories`);return _(l,e=>S(e===`shelf`?`shelf`:``)),_(()=>w.sub,e=>{l.value=e===`shelf`?`shelf`:`memories`}),(n,s)=>(E(),m(`div`,et,[o(`header`,tt,[o(`div`,null,[o(`span`,nt,i(t(a)(`MEMORY · 记忆`)),1),o(`h1`,null,[e(i(t(a)(`见过的人与事,`)),1),o(`em`,null,i(t(a)(`会慢慢有了重量。`)),1)]),o(`p`,null,i(t(a)(`记住重要的,也允许改变看法。`)),1)]),s[2]||=o(`div`,{class:`memory-drop`,"aria-hidden":`true`},[o(`span`)],-1)]),g(L,{modelValue:l.value,"onUpdate:modelValue":s[0]||=e=>l.value=e,label:t(a)(`记忆的分区`),items:[{key:`memories`,label:t(a)(`TA 记得的事`)},{key:`shelf`,label:t(a)(`资料书架`)}]},null,8,[`modelValue`,`label`,`items`]),r.value.length?f(``,!0):(E(),m(`p`,rt,i(t(a)(`先在「对话」里添加一个会话,TA 才有地方认识人、记住事。`)),1)),l.value===`memories`?(E(),p(H,{key:1,"session-id":c.value,"onUpdate:sessionId":s[1]||=e=>c.value=e},null,8,[`session-id`])):(E(),p($e,{key:2,"session-id":c.value},null,8,[`session-id`]))]))}}),[[`__scopeId`,`data-v-11432402`]]);export{it as default};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{$ as e,Ct as t,Et as n,I as r,J as i,P as a,Q as o,Tt as s,U as c,V as l,W as u,X as d,Z as f,a as p,bt as m,ct as h,dt as g,et as _,ht as v,j as y,lt as b,n as x,nt as S,p as C,q as w,rt as T,s as E,ut as D,v as O,vt as k,wt as ee,xt as A,yt as j,z as M}from"./Empty-DSurzLFZ.js";import{g as N,v as P}from"./mind-BMcoPQNd.js";import{c as F,i as te,s as ne,v as re,x as ie}from"./index-Cn6TppEV.js";var I=[`d`],L=[`d`],R={class:`ticks`},z=[`x`,`y`],B=[`y`],V=[`y`],H=[`aria-label`,`aria-valuetext`],U=[`cx`,`cy`],W=[`x`,`y`],G=[`aria-label`,`aria-valuetext`],K=[`cx`,`cy`],q=[`x`,`y`],J=110,Y=84,ae=x(S({__name:`RhythmClock`,props:T({disabled:{type:Boolean}},{sleep:{required:!0},sleepModifiers:{},wake:{required:!0},wakeModifiers:{}}),emits:[`update:sleep`,`update:wake`],setup(e){let a=v(e,`sleep`),s=v(e,`wake`),c=A(),l=null,d=e=>{let[t,n]=String(e||`00:00`).split(`:`).map(Number);return(t*60+n)%1440},p=e=>{let t=(Math.round(e/15)*15%1440+1440)%1440;return`${String(Math.floor(t/60)).padStart(2,`0`)}:${String(t%60).padStart(2,`0`)}`},m=e=>e/1440*Math.PI*2-Math.PI/2,h=(e,t=Y)=>({x:J+Math.cos(m(e))*t,y:J+Math.sin(m(e))*t});function _(e,t){let n=(t-e+1440)%1440||1440,r=h(e),i=h(t);return`M${r.x.toFixed(2)},${r.y.toFixed(2)}A${Y},${Y} 0 ${+(n>720)} 1 ${i.x.toFixed(2)},${i.y.toFixed(2)}`}let y=w(()=>d(a.value)),b=w(()=>d(s.value)),x=w(()=>{let e=(b.value-y.value+1440)%1440,t=Math.floor(e/60),n=e%60;return n?r(`{h} 小时 {m} 分`,{h:t,m:n}):r(`{h} 小时`,{h:t})});function S(e){let t=c.value.getBoundingClientRect(),n=(e.clientX-t.left)/t.width*220-J,r=(e.clientY-t.top)/t.height*220-J,i=Math.atan2(r,n)+Math.PI/2;return p((i/(Math.PI*2)*1440%1440+1440)%1440)}function C(e,t){l=e,t.target.setPointerCapture?.(t.pointerId)}function T(e){if(!l)return;let t=S(e);t!==(l===`sleep`?s.value:a.value)&&(l===`sleep`?a.value=t:s.value=t)}function E(){l=null}function O(e,t){let n={ArrowRight:15,ArrowUp:15,ArrowLeft:-15,ArrowDown:-15,PageUp:60,PageDown:-60}[t.key];if(!n)return;t.preventDefault();let r=d(e===`sleep`?a.value:s.value),i=p(r+n);i!==(e===`sleep`?s.value:a.value)&&(e===`sleep`?a.value=i:s.value=i)}return(l,d)=>(D(),f(`div`,{class:ee([`rhythm`,{disabled:e.disabled}])},[(D(),f(`svg`,{ref_key:`svg`,ref:c,viewBox:`0 0 220 220`,onPointermove:T,onPointerup:E,onPointercancel:E},[d[4]||=o(`<defs data-v-7b572e49><linearGradient id="clock-awake" x1="0" y1="0" x2="1" y2="1" data-v-7b572e49><stop offset="0" stop-color="#fff1b8" data-v-7b572e49></stop><stop offset=".48" stop-color="#ffd8b8" data-v-7b572e49></stop><stop offset="1" stop-color="#b8e8ff" data-v-7b572e49></stop></linearGradient><linearGradient id="clock-asleep" x1="0" y1="0" x2="1" y2="1" data-v-7b572e49><stop offset="0" stop-color="#a6bfff" data-v-7b572e49></stop><stop offset=".55" stop-color="#b9b5f1" data-v-7b572e49></stop><stop offset="1" stop-color="#d6c5ff" data-v-7b572e49></stop></linearGradient><radialGradient id="clock-center" data-v-7b572e49><stop offset="0" stop-color="white" stop-opacity=".82" data-v-7b572e49></stop><stop offset=".7" stop-color="white" stop-opacity=".35" data-v-7b572e49></stop><stop offset="1" stop-color="white" stop-opacity=".04" data-v-7b572e49></stop></radialGradient></defs>`,1),i(`circle`,{class:`glass-center`,cx:J,cy:J,r:`68`}),i(`circle`,{class:`track`,cx:J,cy:J,r:Y}),i(`path`,{class:`awake`,d:_(b.value,y.value)},null,8,I),i(`path`,{class:`asleep`,d:_(y.value,b.value)},null,8,L),i(`g`,R,[(D(),f(u,null,g([0,6,12,18],e=>i(`text`,{key:e,x:h(e*60,54).x,y:h(e*60,54).y+4,"text-anchor":`middle`},n(e),9,z)),64))]),i(`text`,{class:`center big`,x:J,y:106,"text-anchor":`middle`},n(t(r)(`睡 {hours}`,{hours:x.value})),9,B),i(`text`,{class:`center`,x:J,y:126,"text-anchor":`middle`},n(a.value)+` → `+n(s.value),9,V),i(`g`,{class:`handle moon`,role:`slider`,tabindex:`0`,"aria-label":t(r)(`几点睡`),"aria-valuetext":a.value,onPointerdown:d[0]||=e=>C(`sleep`,e),onKeydown:d[1]||=e=>O(`sleep`,e)},[i(`circle`,{cx:h(y.value).x,cy:h(y.value).y,r:`15`},null,8,U),i(`text`,{x:h(y.value).x,y:h(y.value).y+5,"text-anchor":`middle`},`☾`,8,W)],40,H),i(`g`,{class:`handle sun`,role:`slider`,tabindex:`0`,"aria-label":t(r)(`几点醒`),"aria-valuetext":s.value,onPointerdown:d[2]||=e=>C(`wake`,e),onKeydown:d[3]||=e=>O(`wake`,e)},[i(`circle`,{cx:h(b.value).x,cy:h(b.value).y,r:`15`},null,8,K),i(`text`,{x:h(b.value).x,y:h(b.value).y+5,"text-anchor":`middle`},`☀`,8,q)],40,G)],544))],2))}}),[[`__scopeId`,`data-v-7b572e49`]]),oe={key:0,class:`page nature`},se=[`aria-label`],ce={class:`nature-intro-copy`},le={class:`eyebrow`},ue={class:`nature-preview-note`},de={class:`nature-intro-orb`},fe=[`aria-label`],pe={class:`lived-persona-head`},me={class:`eyebrow`},he={class:`lived-persona-grid`},ge={class:`lived-trait-track`},_e={class:`lived-persona-story`},ve={class:`eyebrow`},ye={key:0},be={key:0,class:`lived-trait-history`},xe={key:1,class:`faint`},Se={class:`greenhouse`},Ce={class:`card editor`},we={class:`faint`,role:`status`},Te={class:`editor-head`},Ee={class:`eyebrow`},De={class:`muted`},Oe=[`disabled`],ke={class:`form-grid`},Ae=[`placeholder`],je={class:`wide`},Me=[`placeholder`],Ne={class:`traits`},Pe={class:`trait-head`},Fe={class:`muted`},Ie=[`onUpdate:modelValue`,`data-trait`,`aria-label`],Le=[`onUpdate:modelValue`,`name`,`aria-label`],Re={class:`rhythm-set`},ze={class:`switch`},Be={class:`rhythm-row`},Ve={class:`stack tight times`},He={class:`faint`},Ue={class:`stack tight`},We=[`placeholder`],Ge={class:`faint`},Ke={class:`versions`},qe={class:`chip`,"data-tone":`quiet`},Je={class:`faint`},Ye={class:`save-bar`},Xe=[`disabled`],Ze={class:`faint`,role:`status`},Qe={class:`side`},$e={class:`card orb-card`},et={class:`eyebrow`},tt={class:`effects`},nt={class:`check`},rt={class:`card`},it={class:`card-head`},at={class:`eyebrow`},ot={class:`toggles`},st={class:`switch`},ct={class:`switch`},lt={class:`switch`},ut={class:`switch`},dt={class:`switch`},ft={class:`form-grid`},pt={class:`faint wide`},mt={class:`faint wide`},ht={class:`card`},gt={class:`card-head`},_t={class:`eyebrow`},vt={class:`form-grid`},yt={class:`wide`},bt={class:`faint budget-note`},xt={class:`save-bar`},St={class:`primary`,type:`submit`},Ct={class:`faint`,role:`status`},wt={class:`card prompts`},Tt={class:`eyebrow`},Et={class:`save-bar`},Dt={class:`primary`},Ot={class:`faint`,role:`status`},X=x(S({__name:`NaturePage`,setup(o){let v=a([{key:`warmth`,label:y(`温柔`),low:y(`颜色偏冷,表情淡淡的`),high:y(`颜色更暖,嘴角上扬`)},{key:`sarcasm`,label:y(`毒舌`),low:y(`不挖苦人`),high:y(`嘴角一歪,会吐槽`)},{key:`humor`,label:y(`幽默`),low:y(`认真`),high:y(`眯眼笑,爱开玩笑`)},{key:`activity`,label:y(`活泼`),low:y(`安安静静`),high:y(`跳得更快`)},{key:`initiative`,label:y(`主动`),low:y(`更喜欢独处`),high:y(`更愿意分享`)}]),x=a({system:y(`系统指令`),turn:y(`看见与开口`),expression:y(`自己的念头`),initiative:y(`分享与发起`),generation:y(`重新措辞`),validation:y(`回复检查`),memory:y(`记忆整理`),vision:y(`图片理解`),summary:y(`上下文压缩`),summaryMerge:y(`摘要合并`),reflection:y(`独处`),daily:y(`日记`)}),S=A(null),T=[`短句为主`,`自然`,`允许长段`],ee=w(()=>{let e=[{value:`短句为主`,label:r(`短句优先`)},{value:`自然`,label:r(`自然`)},{value:`允许长段`,label:r(`允许长段`)}],t=String(S.value?.length??``);return t&&!T.includes(t)?[...e,{value:t,label:r(`原来的写法:{v}`,{v:t})}]:e}),I=A(String(E.health.settings.aliases||``)),L=A([]),R=A(null),z=A({}),B=A([]),V=A(``),H=A([]),U=m({life:null,budget:null}),W=m({...E.core.prompts}),G=A(`turn`),K=A(!1),q=m({nature:!1,days:!1,prompts:!1});function J(e){q[e]=!1,E.dirty=Object.values(q).some(Boolean)}let Y=A(!0),X=w(()=>{if(R.value)return R.value;let e=L.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}}),kt=w(()=>S.value?Object.fromEntries(v.map(e=>[e.key,Number(S.value[e.key])||0])):null),Z=e=>Array.isArray(e)?e.map(String):String(e||``).split(/[,,\n]/).map(e=>e.trim()).filter(Boolean);function At(){let{version:e,...t}=S.value;return{...t,gender:t.gender||`female`,interests:Z(t.interests),forbidden:Z(t.forbidden),bottomLines:Z(t.bottomLines)}}let jt=w(()=>Y.value&&S.value?At():null);function Mt(e){return(Number(S.value?.[e.key])||0)>=50?e.high:e.low}async function Nt(){let[e,t]=await Promise.all([N.nature(),N.overview()]);S.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
|
+
`)},L.value=e.versions,R.value=e.edits,z.value=e.livedTraits||{},B.value=e.traitHistory||[],V.value=e.livedPersona||``,H.value=e.personaHistory||[],U.life={...t.life},U.budget={...t.budget.settings}}function Q(e=`nature`){q[e]=!0,E.dirty=!0}async function Pt(){if(!K.value){K.value=!0;try{await N.saveNature(At()),I.value!==E.health.settings.aliases&&await C({aliases:I.value}),J(`nature`),await p();let e=await N.nature();L.value=e.versions,R.value=e.edits,z.value=e.livedTraits||{},B.value=e.traitHistory||[],V.value=e.livedPersona||``,H.value=e.personaHistory||[],O(r(`天性已保存,下一次开口时生效`))}catch(e){O(e.message,!0)}finally{K.value=!1}}}async function Ft(){try{let e=await N.saveSettings({life:U.life,budget:{dailyTokens:Number(U.budget.dailyTokens)||0,innerShare:Number(U.budget.innerShare),upkeepShare:Number(U.budget.upkeepShare)}});U.life={...e.life},U.budget={...e.budget},J(`days`),O(r(`TA 的日子已按新设置安排`))}catch(e){O(e.message,!0)}}async function It(){try{await N.savePrompts({...W}),J(`prompts`),await p(),O(r(`指令已保存,下一轮生效`))}catch(e){O(e.message,!0)}}let $;return h(()=>{Nt(),$=setInterval(async()=>{if(!document.hidden)try{let e=await N.nature();R.value=e.edits,z.value=e.livedTraits||{},B.value=e.traitHistory||[],V.value=e.livedPersona||``,H.value=e.personaHistory||[]}catch{}},3e4)}),b(()=>{$&&clearInterval($)}),(a,o)=>S.value?(D(),f(`div`,oe,[i(`section`,{class:`nature-intro`,"aria-label":t(r)(`天性预览`)},[i(`div`,ce,[i(`span`,le,n(t(r)(`THE WAY SHE GROWS · 天性`)),1),i(`h1`,null,[e(n(t(r)(`她的底色,`)),1),o[38]||=i(`br`,null,null,-1),i(`em`,null,n(t(r)(`慢慢长成她自己。`)),1)]),i(`p`,null,n(t(r)(`一些与生俱来的倾向,会在每一次相遇里长出新的模样。`)),1),i(`span`,ue,[o[39]||=i(`i`,null,null,-1),e(` `+n(t(r)(`调节刻度,看看此刻的她`)),1)])]),i(`div`,de,[_(re,{class:`preview-orb`,mood:t(ie),traits:kt.value,size:170,interactive:``},null,8,[`mood`,`traits`])])],8,se),i(`section`,{class:`lived-persona`,"aria-label":t(r)(`成长中的性格`)},[i(`div`,pe,[i(`span`,me,n(t(r)(`BECOMING · 正在成为`)),1),i(`h2`,null,n(t(r)(`此刻的她`)),1),i(`p`,null,n(t(r)(`天性是起点。下方是她从真实经历里长出的刻度,下一次对话会使用这些值。`)),1)]),i(`div`,he,[(D(!0),f(u,null,g(t(v),e=>(D(),f(`div`,{key:e.key,class:`lived-trait`},[i(`span`,null,n(e.label),1),i(`strong`,null,n(z.value[e.key]??S.value[e.key]),1),i(`small`,null,n(t(r)(`起点 {v}`,{v:S.value[e.key]})),1),i(`div`,ge,[i(`i`,{style:s({width:`${z.value[e.key]??S.value[e.key]}%`})},null,4)])]))),128))]),i(`div`,_e,[i(`span`,ve,n(t(r)(`INNER VOICE · 自己的样子`)),1),i(`p`,null,n(V.value||t(r)(`她还没有为现在的自己留下一段新的描述。底色和已有的自我线索仍会陪着她。`)),1),H.value.length?(D(),f(`details`,ye,[i(`summary`,null,n(t(r)(`看看她怎么走到这里 · {length} 版`,{length:H.value.length})),1),i(`ol`,null,[(D(!0),f(u,null,g(H.value,e=>(D(),f(`li`,{key:e.id},[i(`span`,null,n(e.content),1),i(`time`,null,n(t(P)(e.created)),1)]))),128))])])):d(``,!0)]),B.value.length?(D(),f(`details`,be,[i(`summary`,null,n(t(r)(`看看她为何改变 · {length} 次`,{length:B.value.length})),1),i(`ol`,null,[(D(!0),f(u,null,g(B.value,e=>(D(),f(`li`,{key:e.id},[i(`b`,null,n(t(v).find(t=>t.key===e.trait)?.label||e.trait)+` `+n(e.delta>0?`+`:``)+n(e.delta),1),i(`span`,null,n(e.reason),1),i(`time`,null,n(t(P)(e.created)),1)]))),128))])])):(D(),f(`p`,xe,n(t(r)(`她还没有从经历里改变这些刻度。独处或日记里形成了有来源的新选择后,会留在这里。`)),1))],8,fe),i(`div`,Se,[i(`section`,Ce,[i(`form`,{id:`natureForm`,onSubmit:c(Pt,[`prevent`]),onInput:o[16]||=e=>Q()},[i(`p`,we,n(X.value.locked?t(r)(`可用更改次数已用完。之后的性格、兴趣和想法,由 TA 自己从经历里生长。`):t(r)(`天性还可以改 {left} 次,包括性格刻度。用完后由她自己生长。`,{left:X.value.left})),1),i(`header`,Te,[i(`span`,Ee,n(t(r)(`塑造 TA`)),1),i(`h2`,null,n(t(r)(`TA 生来是什么样的?`)),1),i(`p`,De,n(t(r)(`天性是种子:性格、兴趣和底线。TA 的自我、在各群的样子、对每个人的感觉都会从经历里长出来——你能看到、能撤销,但不在这里改写。`)),1)]),i(`fieldset`,{class:`nature-fields`,disabled:X.value.locked},[i(`div`,ke,[i(`label`,null,[e(n(t(r)(`名字`)),1),j(i(`input`,{"onUpdate:modelValue":o[0]||=e=>S.value.name=e,name:`name`,required:``,maxlength:`40`},null,512),[[l,S.value.name]])]),i(`label`,null,[e(n(t(r)(`性别`))+` `,1),_(F,{modelValue:S.value.gender,"onUpdate:modelValue":o[1]||=e=>S.value.gender=e,name:`gender`,"aria-label":t(r)(`性别`),options:[{value:`female`,label:t(r)(`女`)},{value:`male`,label:t(r)(`男`)},{value:`unspecified`,label:t(r)(`不指定`)}]},null,8,[`modelValue`,`aria-label`,`options`]),i(`small`,null,n(t(r)(`人称会进入 TA 对自己的理解。女是「她」,男是「他」。`)),1)]),i(`label`,null,[e(n(t(r)(`别人会怎么叫 TA`))+` `,1),j(i(`input`,{"onUpdate:modelValue":o[2]||=e=>I.value=e,name:`aliases`,placeholder:t(r)(`用逗号分隔`)},null,8,Ae),[[l,I.value]]),i(`small`,null,n(t(r)(`群友叫 TA 的称呼,保存时一并写进全局设置`)),1)]),i(`label`,je,[e(n(t(r)(`天性`))+` `,1),j(i(`textarea`,{"onUpdate:modelValue":o[3]||=e=>S.value.base=e,name:`base`,rows:`6`,placeholder:t(r)(`TA 的背景、性格、兴趣和社交方式…`)},null,8,Me),[[l,S.value.base]])])]),i(`fieldset`,Ne,[i(`legend`,null,n(t(r)(`性格刻度`)),1),(D(!0),f(u,null,g(t(v),e=>(D(),f(`div`,{key:e.key,class:`trait`},[i(`div`,Pe,[i(`b`,null,n(e.label),1),i(`small`,Fe,n(Mt(e)),1)]),j(i(`input`,{"onUpdate:modelValue":t=>S.value[e.key]=t,type:`range`,min:`0`,max:`100`,"data-trait":e.key,"aria-label":t(r)(`{label}刻度`,{label:e.label})},null,8,Ie),[[l,S.value[e.key],void 0,{number:!0}]]),j(i(`input`,{"onUpdate:modelValue":t=>S.value[e.key]=t,name:e.key,type:`number`,min:`0`,max:`100`,class:`trait-number`,"aria-label":e.label},null,8,Le),[[l,S.value[e.key],void 0,{number:!0}]])]))),128)),i(`label`,null,[e(n(t(r)(`说话长度`))+` `,1),_(F,{modelValue:S.value.length,"onUpdate:modelValue":o[4]||=e=>S.value.length=e,name:`length`,"aria-label":t(r)(`说话长度`),options:ee.value},null,8,[`modelValue`,`aria-label`,`options`]),i(`small`,null,n(t(r)(`只是默认倾向:分几条、每条多长,仍由 TA 按当时的情形决定。`)),1)])]),i(`fieldset`,Re,[i(`legend`,null,n(t(r)(`作息`)),1),i(`label`,ze,[j(i(`input`,{"onUpdate:modelValue":o[5]||=e=>S.value.rhythm.enabled=e,type:`checkbox`,name:`rhythmEnabled`},null,512),[[M,S.value.rhythm.enabled]]),i(`span`,null,n(t(r)(`TA 会睡觉:睡着时不看群,被私聊或 @ 会等醒来再看(危机消息除外)`)),1)]),i(`div`,Be,[_(ae,{sleep:S.value.rhythm.sleep,"onUpdate:sleep":[o[6]||=e=>S.value.rhythm.sleep=e,o[8]||=e=>Q()],wake:S.value.rhythm.wake,"onUpdate:wake":[o[7]||=e=>S.value.rhythm.wake=e,o[9]||=e=>Q()],disabled:!S.value.rhythm.enabled},null,8,[`sleep`,`wake`,`disabled`]),i(`div`,Ve,[i(`label`,null,[e(n(t(r)(`几点睡`)),1),j(i(`input`,{"onUpdate:modelValue":o[10]||=e=>S.value.rhythm.sleep=e,type:`time`,name:`sleep`,step:`900`},null,512),[[l,S.value.rhythm.sleep]])]),i(`label`,null,[e(n(t(r)(`几点醒`)),1),j(i(`input`,{"onUpdate:modelValue":o[11]||=e=>S.value.rhythm.wake=e,type:`time`,name:`wake`,step:`900`},null,512),[[l,S.value.rhythm.wake]])]),i(`small`,He,n(t(r)(`拖动月亮和太阳,或直接输入时间。`)),1)])])]),i(`fieldset`,null,[i(`legend`,null,n(t(r)(`兴趣、边界与底线`)),1),i(`div`,Ue,[i(`label`,null,[e(n(t(r)(`兴趣`)),1),j(i(`input`,{"onUpdate:modelValue":o[12]||=e=>S.value.interests=e,name:`interests`,placeholder:t(r)(`用逗号分隔`)},null,8,We),[[l,S.value.interests]])]),i(`label`,null,[e(n(t(r)(`社交边界`)),1),j(i(`input`,{"onUpdate:modelValue":o[13]||=e=>S.value.boundaries=e,name:`boundaries`},null,512),[[l,S.value.boundaries]])]),i(`label`,null,[e(n(t(r)(`底线(每行一条)`)),1),j(i(`textarea`,{"onUpdate:modelValue":o[14]||=e=>S.value.bottomLines=e,name:`bottomLines`,rows:`4`},null,512),[[l,S.value.bottomLines]])]),i(`label`,null,[e(n(t(r)(`不想用的说法(每行一个)`)),1),j(i(`textarea`,{"onUpdate:modelValue":o[15]||=e=>S.value.forbidden=e,name:`forbidden`,rows:`3`},null,512),[[l,S.value.forbidden]])]),i(`small`,Ge,n(t(r)(`凭据(密码、密钥、验证码)永远不会进入 TA 的心智,这一条写死在代码里。`)),1)])])],8,Oe),i(`details`,Ke,[i(`summary`,null,n(t(r)(`天性的版本 · {length}`,{length:L.value.length})),1),i(`ol`,null,[(D(!0),f(u,null,g(L.value,e=>(D(),f(`li`,{key:e.version},[i(`span`,qe,n(t(r)(`第 {version} 版`,{version:e.version})),1),i(`span`,null,n(e.note||t(r)(`修改`)),1),i(`time`,Je,n(t(P)(e.created)),1)]))),128))])]),i(`div`,Ye,[i(`button`,{class:`primary`,disabled:K.value||X.value.locked},n(X.value.locked?t(r)(`已交给 TA`):K.value?t(r)(`保存中…`):t(r)(`保存天性`)),9,Xe),i(`span`,Ze,n(X.value.locked?t(r)(`更改次数已用完`):q.nature?t(r)(`天性有未保存的修改`):t(r)(`还可以改 {left} 次`,{left:X.value.left})),1)])],32)]),i(`aside`,Qe,[i(`div`,$e,[i(`span`,et,n(t(r)(`调色盘 · 即时反馈`)),1),i(`h3`,null,n(t(r)(`微小的倾向,也会改变表达`)),1),i(`ul`,tt,[(D(!0),f(u,null,g(t(v),e=>(D(),f(`li`,{key:e.key},[i(`b`,null,n(e.label)+` `+n(S.value[e.key]),1),i(`span`,null,n(Mt(e)),1)]))),128))])]),_(te,{class:`chat-card`,title:t(r)(`用草稿天性试聊`),eyebrow:`TALK TO TA`},{default:k(()=>[_(ne,{anchored:``,sessions:t(E).core.sessions,nature:jt.value,starter:t(r)(`今天真的好累啊`)},{options:k(()=>[i(`label`,nt,[j(i(`input`,{"onUpdate:modelValue":o[17]||=e=>Y.value=e,type:`checkbox`},null,512),[[M,Y.value]]),e(n(t(r)(`用左边还没保存的天性`)),1)])]),_:1},8,[`sessions`,`nature`,`starter`])]),_:1},8,[`title`])])]),U.life?(D(),f(`form`,{key:0,class:`days`,onSubmit:c(Ft,[`prevent`]),onInput:o[33]||=e=>Q(`days`),onChange:o[34]||=e=>Q(`days`)},[i(`section`,rt,[i(`div`,it,[i(`div`,null,[i(`span`,at,n(t(r)(`TA 的日子`)),1),i(`h2`,null,n(t(r)(`TA 怎样度过没人说话的时间`)),1)])]),i(`div`,ot,[i(`label`,st,[j(i(`input`,{"onUpdate:modelValue":o[18]||=e=>U.life.solitude=e,type:`checkbox`},null,512),[[M,U.life.solitude]]),i(`span`,null,[i(`b`,null,n(t(r)(`独处`)),1),i(`small`,null,n(t(r)(`聊天安静下来后,TA 会重新看看最近的事,改变对自己、对人的理解。`)),1)])]),i(`label`,ct,[j(i(`input`,{"onUpdate:modelValue":o[19]||=e=>U.life.reading=e,type:`checkbox`},null,512),[[M,U.life.reading]]),i(`span`,null,[i(`b`,null,n(t(r)(`独处时读资料`)),1),i(`small`,null,n(t(r)(`从共享资料里按自己的兴趣挑着读,一段一段读下去;读过的内容聊天时可以自然提起。`)),1)])]),i(`label`,lt,[j(i(`input`,{"onUpdate:modelValue":o[20]||=e=>U.life.diary=e,type:`checkbox`},null,512),[[M,U.life.diary]]),i(`span`,null,[i(`b`,null,n(t(r)(`睡前写日记`)),1),i(`small`,null,n(t(r)(`一天结束时写下这一天,和昨天的自己对照;隔一段时间在夜里回顾,改写自传、翻开新的一章。`)),1)])]),i(`label`,ut,[j(i(`input`,{"onUpdate:modelValue":o[21]||=e=>U.life.night=e,type:`checkbox`},null,512),[[M,U.life.night]]),i(`span`,null,[i(`b`,null,n(t(r)(`夜里整理`)),1),i(`small`,null,n(t(r)(`睡着以后,把白天没整理的聊天记进记忆和约定里,再按回顾间隔回顾这段日子。`)),1)])]),i(`label`,dt,[j(i(`input`,{"onUpdate:modelValue":o[22]||=e=>U.life.proactive=e,type:`checkbox`},null,512),[[M,U.life.proactive]]),i(`span`,null,[i(`b`,null,n(t(r)(`允许 TA 主动说话`)),1),i(`small`,null,n(t(r)(`安静的时候,也能从自己的兴趣、念头和对人的感觉决定要不要先开口。不必等人提问,不催同一句话;对方没回应,也不等于以后不能分享新的事。关掉后停止主动联系。`)),1),o[40]||=e(` >`,-1)])])]),i(`div`,ft,[i(`label`,null,[e(n(t(r)(`安静多久才独处(分钟)`)),1),j(i(`input`,{"onUpdate:modelValue":o[23]||=e=>U.life.idleMinutes=e,type:`number`,min:`0`},null,512),[[l,U.life.idleMinutes,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`两次独处至少间隔(分钟)`)),1),j(i(`input`,{"onUpdate:modelValue":o[24]||=e=>U.life.intervalMinutes=e,type:`number`,min:`10`},null,512),[[l,U.life.intervalMinutes,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`攒够多少条新消息(条)`)),1),j(i(`input`,{"onUpdate:modelValue":o[25]||=e=>U.life.minMessages=e,type:`number`,min:`0`},null,512),[[l,U.life.minMessages,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`回顾间隔(天)`)),1),j(i(`input`,{"onUpdate:modelValue":o[26]||=e=>U.life.chapterDays=e,type:`number`,min:`1`},null,512),[[l,U.life.chapterDays,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`安静时多久看看想不想聊(分钟)`)),1),j(i(`input`,{"onUpdate:modelValue":o[27]||=e=>U.life.initiativeIntervalMinutes=e,type:`number`,min:`1`},null,512),[[l,U.life.initiativeIntervalMinutes,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`两次主动联系至少间隔(小时)`)),1),j(i(`input`,{"onUpdate:modelValue":o[28]||=e=>U.life.proactiveIntervalHours=e,type:`number`,min:`0`,step:`0.1`},null,512),[[l,U.life.proactiveIntervalHours,void 0,{number:!0}]])]),i(`p`,pt,n(t(r)(`主动联系间隔只在实际发出后计算,可设为 0;沉默不会占用发送间隔。想说的话会保留,临时忙碌后重新决定。没有新消息时也可独处,不需要攒够消息才能产生念头。`)),1),i(`p`,mt,n(t(r)(`独处、日记和夜里整理也使用模型库里的默认模型,不再单独指定。`)),1),i(`label`,null,[e(n(t(r)(`时区`)),1),j(i(`input`,{"onUpdate:modelValue":o[29]||=e=>U.life.timeZone=e,placeholder:`Asia/Shanghai`},null,512),[[l,U.life.timeZone]])])])]),i(`section`,ht,[i(`div`,gt,[i(`div`,null,[i(`span`,_t,n(t(r)(`每日注意力`)),1),i(`h2`,null,n(t(r)(`TA 一天能花多少 Token`)),1)])]),i(`div`,vt,[i(`label`,yt,[e(n(t(r)(`每日 Token 上限(0 = 不限)`))+` `,1),j(i(`input`,{"onUpdate:modelValue":o[30]||=e=>U.budget.dailyTokens=e,type:`number`,min:`0`},null,512),[[l,U.budget.dailyTokens,void 0,{number:!0}]]),i(`small`,null,n(t(r)(`滚动 24 小时计算。快用完时,TA 在群里只在被叫到时细看;用完后后台独处和整理暂停。`)),1)]),i(`label`,null,[e(n(t(r)(`独处与日记最多占`)),1),j(i(`input`,{"onUpdate:modelValue":o[31]||=e=>U.budget.innerShare=e,type:`number`,min:`0`,max:`0.9`,step:`0.05`},null,512),[[l,U.budget.innerShare,void 0,{number:!0}]])]),i(`label`,null,[e(n(t(r)(`记忆整理与压缩最多占`)),1),j(i(`input`,{"onUpdate:modelValue":o[32]||=e=>U.budget.upkeepShare=e,type:`number`,min:`0`,max:`0.9`,step:`0.05`},null,512),[[l,U.budget.upkeepShare,void 0,{number:!0}]])])]),i(`p`,bt,n(t(r)(`扫一眼群聊不花 Token;TA 细看时一次调用同时完成理解、心情和回复。私聊和 @ 永远优先。`)),1),i(`div`,xt,[i(`button`,St,n(t(r)(`保存 TA 的日子`)),1),i(`span`,Ct,n(q.days?t(r)(`日常安排有未保存的修改`):t(r)(`日常安排已保存`)),1)])])],32)):d(``,!0),i(`details`,wt,[i(`summary`,null,[i(`span`,Tt,n(t(r)(`高级`)),1),i(`b`,null,n(t(r)(`指令(Prompt)`)),1)]),i(`form`,{id:`promptsForm`,class:`stack tight`,onSubmit:c(It,[`prevent`]),onInput:o[37]||=e=>Q(`prompts`)},[i(`label`,null,[e(n(t(r)(`要编辑的指令`))+` `,1),_(F,{modelValue:G.value,"onUpdate:modelValue":o[35]||=e=>G.value=e,"aria-label":t(r)(`要编辑的指令`),options:Object.keys(W).map(e=>({value:e,label:t(x)[e]||e}))},null,8,[`modelValue`,`aria-label`,`options`])]),i(`label`,null,[e(n(t(r)(`指令正文`)),1),j(i(`textarea`,{"onUpdate:modelValue":o[36]||=e=>W[G.value]=e,rows:`14`,class:`mono`},null,512),[[l,W[G.value]]])]),i(`div`,Et,[i(`button`,Dt,n(t(r)(`保存指令`)),1),i(`span`,Ot,n(q.prompts?t(r)(`指令有未保存的修改`):t(r)(`指令已保存`)),1)])],32)])])):d(``,!0)}}),[[`__scopeId`,`data-v-b5c5f0a7`]]);export{X as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,Ct as t,D as n,E as r,Et as i,I as a,J as o,P as s,Q as c,St as l,Tt as u,U as d,V as f,W as p,X as m,Y as h,Z as g,_,ct as v,dt as y,et as b,gt as x,j as S,n as C,nt as w,o as T,q as E,s as D,t as O,ut as k,v as A,vt as j,wt as M,xt as N,yt as P}from"./Empty-DSurzLFZ.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-BMcoPQNd.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-Cn6TppEV.js";import{l as ae}from"./knowledge-sUjcjbfI.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=C(w({__name:`Galaxy`,props:{people:{},activity:{}},emits:[`open`,`list`],setup(n,{emit:r}){let s=n,l=r,d=E(()=>[...s.people].sort((e,t)=>(t.familiarity??0)-(e.familiarity??0))),f=E(()=>d.value.slice(0,12)),h=E(()=>Math.max(0,d.value.length-f.value.length));return(r,s)=>(k(),g(`section`,{class:`galaxy`,"aria-label":t(a)(`相遇之间:TA 认识的人`)},[o(`div`,se,[o(`div`,ce,[o(`span`,le,i(t(a)(`PEOPLE / 相遇之间`)),1),o(`h2`,null,[e(i(t(a)(`每一次相遇,`)),1),s[1]||=o(`br`,null,null,-1),o(`em`,null,i(t(a)(`都留下一点温度。`)),1)]),o(`p`,null,i(t(a)(`越熟悉离 TA 越近。这里先放着最近亲近的 {length} 个人,其他人也仍然在名单里。`,{length:f.value.length})),1),o(`div`,ue,[o(`b`,null,i(n.people.length),1),o(`span`,null,i(t(a)(`个相遇过的人`)),1)])]),o(`div`,de,[s[2]||=c(`<div class="lens-ring ring-a" data-v-c60042d4></div><div class="lens-ring ring-b" data-v-c60042d4></div><span class="lens-dot dot-a" data-v-c60042d4></span><span class="lens-dot dot-b" data-v-c60042d4></span><span class="lens-dot dot-c" data-v-c60042d4></span>`,5),o(`div`,fe,[b(re,{mood:t(ie),activity:n.activity||`idle`,size:100},null,8,[`mood`,`activity`])])])]),o(`div`,pe,[o(`div`,null,[s[3]||=o(`span`,{class:`eyebrow`},`CLOSER TO HER`,-1),o(`h3`,null,i(t(a)(`最近靠近的人`)),1)]),o(`span`,null,i(t(a)(`点开一张光片,看看她记得什么`)),1)]),o(`div`,me,[(k(!0),g(p,null,y(f.value,(e,n)=>(k(),g(`button`,{key:e.userId,type:`button`,class:M([`person-node`,{away:(e.awayDays??0)>=14,tense:e.tension>=.3}]),"data-person":e.userId,style:u({"--hue":t(q)(e.name||e.userId),"--order":n}),"aria-label":`${e.name}:${e.feel||t(a)(`还在慢慢认识`)}`,onClick:t=>l(`open`,e.userId)},[o(`span`,ge,[o(`span`,_e,i(t(Q)(e.name)),1)]),o(`span`,ve,[o(`b`,null,i(e.name),1),o(`small`,null,`QQ `+i(e.userId),1),o(`small`,null,i(e.feel||t(a)(`还在慢慢认识`)),1)]),s[5]||=o(`span`,{class:`person-arrow`,"aria-hidden":`true`},`↗`,-1),o(`span`,{class:`familiarity`,style:u({"--amount":Math.round(Math.max(0,Math.min(1,e.familiarity??0))*100)+`%`}),"aria-hidden":`true`},[...s[4]||=[o(`i`,null,null,-1)]],4)],14,he))),128))]),h.value?(k(),g(`button`,{key:0,type:`button`,class:`more-people`,onClick:s[0]||=e=>l(`list`)},[e(i(t(a)(`在名单里看看另外 {hidden} 个人`,{hidden:h.value}))+` `,1),s[6]||=o(`span`,{"aria-hidden":`true`},`↗`,-1)])):m(``,!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=C(w({__name:`Ring`,props:{value:{},label:{},caption:{default:``},signed:{type:Boolean,default:!1},size:{default:64}},setup(e){let t=e,n=2*Math.PI*18,r=E(()=>{let e=Number(t.value)||0;return t.signed?Math.max(-1,Math.min(1,e)):Math.max(0,Math.min(1,e))}),a=E(()=>Math.abs(r.value)*n),s=E(()=>r.value<0);return(t,c)=>(k(),g(`figure`,{class:`ring`,style:u({width:e.size+`px`})},[(k(),g(`svg`,{width:e.size,height:e.size,viewBox:`0 0 44 44`,"aria-hidden":`true`},[c[0]||=o(`circle`,{class:`track`,cx:`22`,cy:`22`,r:`18`},null,-1),o(`circle`,{class:M([`arc`,{negative:s.value}]),cx:`22`,cy:`22`,r:`18`,"stroke-dasharray":`${a.value.toFixed(2)} ${n.toFixed(2)}`,transform:s.value?`translate(44 0) scale(-1 1) rotate(-90 22 22)`:`rotate(-90 22 22)`},null,10,xe),o(`text`,Se,i(Math.round(r.value*100)),1)],8,be)),o(`figcaption`,null,[o(`b`,null,i(e.label),1),e.caption?(k(),g(`small`,Ce,i(e.caption),1)):m(``,!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=C(w({__name:`PersonSheet`,props:{id:{},now:{}},emits:[`close`,`changed`,`relationship`],setup(e,{emit:s}){let c=e,l=s,d=N(null),f=N(``),v=E(()=>d.value?.person),S=E(()=>{let e=v.value?.firstMetAt;return e?a(`认识 {v} 天`,{v:Math.max(1,Math.round(((c.now||Date.now())-e)/864e5))}):``});async function C(){if(!c.id)return;let e=c.id;d.value?.person?.userId!==e&&(d.value=_(`/mind/people/`+encodeURIComponent(e))||null),f.value=``;try{let t=await L.person(e);c.id===e&&(d.value=t)}catch(t){if(c.id!==e)return;d.value=null,f.value=t.message}}async function w(e){if(await r(a(`撤销这次「{v}」?TA 对这个人的感觉会重新计算。`,{v:B[e.change]||e.change}),{title:a(`撤销一次关系变化`),confirmText:a(`撤销`),danger:!0}))try{await L.revoke(`bond`,e.id),A(a(`已撤销`)),await C(),l(`changed`)}catch(e){A(e.message,!0)}}async function T(e){let t=await n(a(`撤销「{content}」?TA 之后不会再这样认为,整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这条记忆`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await L.revoke(`memory`,e.id,t),A(a(`已撤销`)),await C()}catch(e){A(e.message,!0)}}async function D(e,t){try{await ae(e.id,t),await C()}catch(e){A(e.message,!0)}}async function O(e){if(await r(a(`撤销这次相遇留下的意思?「{meant}」之后不会再回到 TA 心里,也不会再被当成变化的来源。`,{meant:e.meant}),{title:a(`撤销这次相遇`),confirmText:a(`撤销`),danger:!0}))try{await L.revoke(`meeting`,e.id),A(a(`已撤销`)),await C(),l(`changed`)}catch(e){A(e.message,!0)}}async function P(e){let t=await n(a(`撤销「{content}」?TA 不再惦记这件事,之后整理记忆时也不会把它写回来。可以写下原因(可不填):`,{content:e.content}),{title:a(`撤销这个约定`),confirmText:a(`撤销`),danger:!0,placeholder:a(`原因`)});if(t!==null)try{await L.revoke(`anticipation`,e.id,t),A(a(`已撤销`)),await C()}catch(e){A(e.message,!0)}}return x(()=>c.id,e=>{d.value=null,e&&C()},{immediate:!0}),(n,r)=>(k(),h(Z,{open:!!e.id,title:v.value?.name||t(a)(`正在想起…`),eyebrow:t(a)(`TA 认识的人`),width:`560px`,onClose:r[1]||=e=>l(`close`)},{default:j(()=>[f.value?(k(),g(`p`,Te,i(f.value),1)):v.value?(k(),g(`div`,Ee,[o(`header`,De,[o(`span`,{class:`avatar`,style:u({"--hue":t(q)(v.value.name||v.value.userId)})},i(t(Q)(v.value.name)),5),o(`div`,null,[o(`p`,Oe,i(v.value.feel),1),o(`small`,ke,`QQ `+i(v.value.userId),1),o(`small`,Ae,i([S.value,v.value.lastTalkedAt?t(a)(`上次说上话 {v}`,{v:t(Y)(v.value.lastTalkedAt,e.now)}):t(a)(`还没说上过话`),v.value.seenAt?t(a)(`上次见到 {v}`,{v:t(Y)(v.value.seenAt,e.now)}):``].filter(Boolean).join(` · `)),1)])]),o(`div`,je,[(k(!0),g(p,null,y(t(z),([e,t])=>(k(),h(we,{key:e,value:v.value[e],label:t},null,8,[`value`,`label`]))),128))]),o(`section`,Me,[o(`div`,Ne,[o(`h3`,Pe,i(t(a)(`彼此的关系`)),1),o(`button`,{class:`small`,onClick:r[0]||=e=>l(`relationship`,v.value.relationship,v.value.userId)},i(v.value.relationship?t(a)(`修改关系`):t(a)(`绑定关系`)),1)]),v.value.relationship?(k(),g(`p`,Fe,i(t(a)(`对方是我的 {peer},我是对方的 {self}`,{peer:t(I)[v.value.relationship.peerRole]||v.value.relationship.peerRole,self:t(I)[v.value.relationship.selfRole]||v.value.relationship.selfRole})),1)):m(``,!0),d.value.relationshipHistory?.length?(k(),g(`details`,Ie,[o(`summary`,null,i(t(a)(`关系变化记录`)),1),o(`ul`,Le,[(k(!0),g(p,null,y(d.value.relationshipHistory,e=>(k(),g(`li`,{key:e.id},[o(`small`,Re,i(t(U)(e.created))+` · `+i(e.status===`active`?t(a)(`设置关系`):t(a)(`解除关系`)),1),o(`p`,null,i(e.peer_role)+` · `+i(e.note),1)]))),128))])])):m(``,!0)]),v.value.impression?(k(),g(`p`,ze,i(t(a)(`印象:{impression}`,{impression:v.value.impression})),1)):m(``,!0),v.value.places?.length?(k(),g(`div`,Be,[o(`span`,Ve,i(t(a)(`在这些地方见过:`)),1),(k(!0),g(p,null,y(v.value.places,e=>(k(),g(`span`,{key:e.id,class:`chip`,"data-tone":`quiet`},i(e.name),1))),128))])):m(``,!0),o(`section`,null,[o(`h3`,He,i(t(a)(`这份感觉是怎么来的`)),1),d.value.changes.length?(k(),g(`ul`,Ue,[(k(!0),g(p,null,y(d.value.changes,e=>(k(),g(`li`,{key:e.id,class:M([`change`,{done:e.revoked}])},[o(`span`,{class:`chip`,"data-tone":e.revoked?`quiet`:t(F).has(e.change)?`danger`:void 0},i(t(B)[e.change]||e.change),9,We),o(`div`,Ge,[o(`p`,null,i(e.note||t(a)(`没有写原因`)),1),o(`small`,Ke,i(t(a)(`{v} · {v2} · {length} 处来源`,{v:t(U)(e.created),v2:t(H)[e.origin]||t(a)(`写日记时`),length:e.sources.length})),1)]),e.revoked?(k(),g(`span`,qe,i(t(a)(`已撤销`)),1)):(k(),g(`button`,{key:1,class:`text-button`,"data-revoke-change":``,onClick:t=>w(e)},i(t(a)(`撤销`)),9,Je))],2))),128))])):(k(),g(`p`,Ye,i(t(a)(`只是一起聊过天,还没有特别的变化。`)),1))]),d.value.meetings?.length?(k(),g(`section`,Xe,[o(`h3`,Ze,i(t(a)(`和{name}的相遇留下了什么`,{name:v.value.name})),1),o(`ul`,Qe,[(k(!0),g(p,null,y(d.value.meetings,e=>(k(),g(`li`,{key:e.id,class:`change`},[o(`span`,{class:`chip`,"data-tone":e.private?`quiet`:void 0},i(e.private?t(a)(`私下`):e.choice===`silent`?t(a)(`没出声`):t(a)(`出了声`)),9,$e),o(`div`,et,[o(`p`,null,i(e.meant),1),e.why?(k(),g(`small`,tt,i(t(a)(`当时:{why}`,{why:e.why})),1)):m(``,!0),o(`small`,nt,i(e.when)+` · `+i(e.sessionName),1)]),o(`button`,{class:`text-button`,"data-revoke-meeting":``,onClick:t=>O(e)},i(t(a)(`撤销`)),9,rt)]))),128))])])):m(``,!0),o(`section`,null,[o(`h3`,it,i(t(a)(`TA 记得关于{name}的事`,{name:v.value.name})),1),d.value.memories.length?(k(),g(`ul`,at,[(k(!0),g(p,null,y(d.value.memories,e=>(k(),g(`li`,{key:e.id,class:M([`memory-item`,{superseded:e.status===`superseded`}])},[o(`p`,null,i(e.content),1),o(`small`,ot,i(t(a)(`{v} · 在「{v2}」知道的 · {when}`,{v:t(R)[e.status]||e.status,v2:t(J)({name:e.sessionName,id:e.session_id||e.sessionId}),when:e.when})),1),e.status===`confirmed`?(k(),g(`div`,st,[o(`span`,ct,i(t(a)(`改完即生效`)),1),b(K,{"aria-label":t(a)(`分寸:`)+e.content,"model-value":e.discretion||`open`,options:Object.entries(t(V)).map(([e,t])=>({value:e,label:t})),"onUpdate:modelValue":t=>D(e,{discretion:t})},null,8,[`aria-label`,`model-value`,`options`,`onUpdate:modelValue`]),o(`button`,{class:`small`,onClick:t=>D(e,{locked:!e.locked})},i(e.locked?t(a)(`解锁`):t(a)(`锁定`)),9,lt),o(`button`,{class:`small danger`,onClick:t=>T(e)},i(t(a)(`撤销`)),9,ut)])):m(``,!0)],2))),128))])):(k(),g(`p`,dt,i(t(a)(`还没有记住关于这个人的事。`)),1))]),o(`section`,null,[o(`h3`,ft,i(t(a)(`和{name}有关的约定`,{name:v.value.name})),1),d.value.anticipations.length?(k(),g(`ul`,pt,[(k(!0),g(p,null,y(d.value.anticipations,e=>(k(),g(`li`,{key:e.id,class:M([`change`,{done:e.state!==`pending`}])},[o(`span`,{class:`chip`,"data-tone":e.state===`pending`?void 0:`quiet`},i(t(ee)[e.state]||e.state),9,mt),o(`div`,ht,[o(`p`,null,i(e.content),1),o(`small`,gt,i(t(te)[e.kind]||e.kind)+` · `+i(e.when),1)]),e.status===`revoked`?m(``,!0):(k(),g(`button`,{key:0,class:`text-button`,onClick:t=>P(e)},i(t(a)(`撤销`)),9,_t))],2))),128))])):(k(),g(`p`,vt,i(t(a)(`没有和这个人有关的约定。`)),1))])])):m(``,!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=C(w({__name:`GroupFaces`,props:{groups:{}},emits:[`changed`],setup(n,{emit:c}){let l=n,d=c,f=N(null),h=N({}),_=s({impression:S(`印象`),wish:S(`想做的事`),preference:S(`偏好`),question:S(`还在想的问题`),boundary:S(`相处的分寸`)}),v=s({add:S(`新增`),revise:S(`修改`),remove:S(`放下`)});x(()=>l.groups,e=>{f.value&&=e.find(e=>e.session===f.value.session)||null});async function C(e){if(!(h.value[e]&&h.value[e]?.[0]?.id===l.groups.find(t=>t.session===e)?.face?.id))try{h.value={...h.value,[e]:await L.faces(e)}}catch(e){A(e.message,!0)}}async function w(e,t){if(await r(a(`撤销这次想法更新?会恢复上一次保留的想法。`),{title:a(`撤销想法更新`),confirmText:a(`撤销`),danger:!0}))try{await L.revoke(`face`,t),h.value={...h.value,[e]:await L.faces(e)},A(a(`已撤销`)),d(`changed`)}catch(e){A(e.message,!0)}}return(r,s)=>(k(),g(`section`,bt,[o(`div`,xt,[o(`span`,St,i(t(a)(`在这里的想法`)),1),o(`h2`,null,i(t(a)(`同一个她,在不同的地方留下自己的想法。`)),1),o(`p`,Ct,i(t(a)(`她根据相处留下印象、愿望或疑问,选择什么时候新增、修改或放下。每次更新保留理由和来源。`)),1)]),o(`div`,wt,[(k(!0),g(p,null,y(n.groups,e=>(k(),g(`article`,{key:e.session,class:`card face-card`,style:u({"--hue":t(q)(e.session)})},[o(`header`,null,[o(`span`,Tt,i(e.kind===`private`?t(a)(`私`):t(a)(`群`)),1),o(`div`,null,[o(`h3`,null,i(t(J)({id:e.session,name:e.name,kind:e.kind})),1),e.kind===`private`?(k(),g(`small`,Et,`QQ `+i(String(e.session||``).split(`:`).pop()),1)):m(``,!0),o(`small`,Dt,i(e.kind===`private`?t(a)(`私聊`):t(a)(`群聊`))+i(e.bond?` · ${e.bond.feel}`:``),1)])]),e.face?.notes?.length?(k(),g(`ul`,Ot,[(k(!0),g(p,null,y(e.face.notes.slice(0,3),e=>(k(),g(`li`,{key:e.id},[o(`small`,null,i(t(_)[e.kind]||t(a)(`想法`)),1),o(`p`,kt,i(e.content),1)]))),128))])):(k(),g(`p`,At,i(t(a)(`还没有特别想留在这里的想法,之后由她自己选择。`)),1)),o(`button`,{class:`text-button`,onClick:t=>{f.value=e,C(e.session)}},i(t(a)(`查看想法与变化 ↗`)),9,jt)],4))),128))]),b(Z,{open:!!f.value,title:f.value?.name||t(a)(`在这里的想法`),eyebrow:t(a)(`PLACE NOTES / 在这里的想法`),width:`680px`,onClose:s[0]||=e=>f.value=null},{default:j(()=>[f.value?(k(),g(`div`,Mt,[f.value.face?.notes?.length?(k(),g(`ul`,Nt,[(k(!0),g(p,null,y(f.value.face.notes,e=>(k(),g(`li`,{key:e.id,class:`face-full`},[o(`small`,null,i(t(_)[e.kind]||t(a)(`想法`)),1),o(`p`,null,i(e.content),1),e.why?(k(),g(`p`,Pt,i(e.why),1)):m(``,!0),o(`small`,Ft,i(t(a)(`{n} 处来源`,{n:e.sources?.length||0})),1)]))),128))])):(k(),g(`p`,It,i(t(a)(`还没有特别想留在这里的想法,之后由她自己选择。`)),1)),o(`h3`,null,i(t(a)(`变化历史`)),1),h.value[f.value.session]?(k(),g(`ol`,Lt,[(k(!0),g(p,null,y(h.value[f.value.session],n=>(k(),g(`li`,{key:n.id,class:M({revoked:n.revoked})},[o(`time`,null,i(t(U)(n.created)),1),o(`span`,null,[n.revoked?(k(),g(`b`,Rt,i(t(a)(`已撤销 ·`)),1)):n.origin===`migration`?(k(),g(`b`,zt,i(t(a)(`旧版 ·`)),1)):m(``,!0),n.changes?.length?(k(!0),g(p,{key:2},y(n.changes,(n,r)=>(k(),g(`p`,{key:r},[o(`b`,null,i(t(v)[n.action])+` · `,1),e(i(n.content)+` `,1),n.why?(k(),g(`small`,Bt,i(n.why),1)):m(``,!0)]))),128)):n.notes?.length?(k(),g(p,{key:3},[e(i(n.notes.map(e=>e.content).join(`;`)),1)],64)):(k(),g(`details`,Vt,[o(`summary`,null,i(t(a)(`旧人格记录,仅保留历史`)),1),o(`p`,Ht,i(n.content||[n.role,n.tone,n.aspiration].filter(Boolean).join(`;`)),1)]))]),n.revoked?m(``,!0):(k(),g(`button`,{key:0,class:`text-button`,onClick:e=>w(f.value.session,n.id)},i(t(a)(`撤销`)),9,Ut))],2))),128)),h.value[f.value.session].length?m(``,!0):(k(),g(`li`,Wt,i(t(a)(`没有记录。`)),1))])):m(``,!0)])):m(``,!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=C(w({__name:`RelationshipsPanel`,emits:[`changed`,`open`],setup(n,{expose:c,emit:l}){let u=l,h=N([]),_=N(!1),x=N(!1),C=N({}),w=s({妹妹:S(`妹妹`),姐姐:S(`姐姐`),弟弟:S(`弟弟`),哥哥:S(`哥哥`),朋友:S(`朋友`),伙伴:S(`伙伴`),custom:S(`其他关系`)}),T=N(`妹妹`);async function E(){h.value=(await L.relationships()).items}v(()=>E().catch(e=>A(e.message,!0)));function D(e,t=``){C.value=e?{...e,expectedId:e.id}:{subjectId:t,channel:`onebot`,accountId:`_`,kind:`human`,name:``,peerRole:`妹妹`,selfRole:``,note:``,discretion:`open`,expectedId:null},T.value=Object.hasOwn(w,C.value.peerRole)?C.value.peerRole:`custom`,_.value=!0}c({edit:D});async function O(){if(!x.value){x.value=!0;try{await L.saveRelationship({...C.value,peerRole:T.value===`custom`?C.value.peerRole:T.value}),_.value=!1,await E(),u(`changed`),A(a(`关系已保存`))}catch(e){A(e.message,!0)}finally{x.value=!1}}}async function M(e){if(await r(a(`解除这份关系?相处留下的记忆和感受仍会保留。`),{title:a(`解除关系`),confirmText:a(`解除`),danger:!0}))try{await L.endRelationship(e.subjectId,{channel:e.channel,accountId:e.accountId,expectedId:e.id}),await E(),u(`changed`)}catch(e){A(e.message,!0)}}return(n,r)=>(k(),g(p,null,[o(`section`,Kt,[o(`header`,qt,[o(`div`,Jt,[r[12]||=o(`span`,{class:`eyebrow`},`RELATIONSHIPS`,-1),o(`h2`,null,i(t(a)(`彼此的关系`)),1)]),o(`button`,{onClick:r[0]||=e=>D()},i(t(a)(`绑定关系`)),1)]),o(`p`,Yt,i(t(a)(`按账号认出人或另一位机器人;关系融入关心、打算与交流,感情仍随着相处生长。`)),1),h.value.length?(k(),g(`div`,Xt,[(k(!0),g(p,null,y(h.value,e=>(k(),g(`article`,{key:e.id,class:`relation`},[o(`div`,Zt,[o(`button`,{class:`text-button`,onClick:t=>u(`open`,e.subjectId)},i(e.name||e.subjectId),9,Qt),o(`span`,$t,i(t(w)[e.peerRole]||e.peerRole),1),o(`small`,en,i(e.kind===`bot`?t(a)(`另一位机器人`):t(a)(`人`))+` · `+i(e.subjectId),1),e.note?(k(),g(`p`,tn,i(e.note),1)):m(``,!0),o(`small`,nn,i(t(U)(e.created))+` · `+i(t(V)[e.discretion]),1)]),o(`div`,rn,[o(`button`,{class:`small`,onClick:t=>D(e)},i(t(a)(`修改`)),9,an),o(`button`,{class:`text-button`,onClick:t=>M(e)},i(t(a)(`解除`)),9,on)])]))),128))])):(k(),g(`p`,sn,i(t(a)(`还没有绑定关系,可以从一个准确的账号开始。`)),1))]),b(Z,{open:_.value,title:t(a)(`绑定关系`),eyebrow:t(a)(`彼此的关系`),width:`560px`,onClose:r[11]||=e=>_.value=!1},{default:j(()=>[o(`form`,{class:`stack`,onSubmit:d(O,[`prevent`])},[o(`div`,cn,[o(`label`,null,[e(i(t(a)(`平台`)),1),b(K,{modelValue:C.value.channel,"onUpdate:modelValue":r[1]||=e=>C.value.channel=e,disabled:!!C.value.id,options:[{value:`onebot`,label:`QQ / OneBot`},{value:`qqbot`,label:t(a)(`QQ 官方机器人`)}]},null,8,[`modelValue`,`disabled`,`options`])]),o(`label`,null,[e(i(t(a)(`对方账号`)),1),P(o(`input`,{"onUpdate:modelValue":r[2]||=e=>C.value.subjectId=e,required:``,readonly:!!C.value.id,maxlength:`128`,placeholder:t(a)(`QQ 号或平台用户 ID`)},null,8,$),[[f,C.value.subjectId]])]),o(`label`,null,[e(i(t(a)(`对象类型`)),1),b(K,{modelValue:C.value.kind,"onUpdate:modelValue":r[3]||=e=>C.value.kind=e,options:[{value:`human`,label:t(a)(`人`)},{value:`bot`,label:t(a)(`另一位机器人`)}]},null,8,[`modelValue`,`options`])]),o(`label`,null,[e(i(t(a)(`对方名字`)),1),P(o(`input`,{"onUpdate:modelValue":r[4]||=e=>C.value.name=e,maxlength:`40`,placeholder:t(a)(`可选,未填写时使用已认识的名字`)},null,8,ln),[[f,C.value.name]])]),o(`label`,null,[e(i(t(a)(`对方是我的`)),1),b(K,{modelValue:T.value,"onUpdate:modelValue":r[5]||=e=>T.value=e,options:Object.entries(t(w)).map(([e,t])=>({value:e,label:t}))},null,8,[`modelValue`,`options`])]),o(`label`,null,[e(i(t(a)(`我是对方的`)),1),P(o(`input`,{"onUpdate:modelValue":r[6]||=e=>C.value.selfRole=e,maxlength:`24`,placeholder:t(a)(`留空时按当前身份生成对应称呼`)},null,8,un),[[f,C.value.selfRole]])])]),T.value===`custom`?(k(),g(`label`,dn,[e(i(t(a)(`关系称呼`)),1),P(o(`input`,{"onUpdate:modelValue":r[7]||=e=>C.value.peerRole=e,required:``,maxlength:`24`},null,512),[[f,C.value.peerRole]])])):m(``,!0),C.value.channel===`qqbot`?(k(),g(`label`,fn,[e(i(t(a)(`应用账号`)),1),P(o(`input`,{"onUpdate:modelValue":r[8]||=e=>C.value.accountId=e,readonly:!!C.value.id,required:``,maxlength:`128`},null,8,pn),[[f,C.value.accountId]])])):m(``,!0),o(`label`,null,[e(i(t(a)(`关系公开范围`)),1),b(K,{modelValue:C.value.discretion,"onUpdate:modelValue":r[9]||=e=>C.value.discretion=e,options:Object.entries(t(V)).map(([e,t])=>({value:e,label:t}))},null,8,[`modelValue`,`options`])]),o(`label`,null,[e(i(t(a)(`这份关系的缘由`)),1),P(o(`textarea`,{"onUpdate:modelValue":r[10]||=e=>C.value.note=e,rows:`3`,maxlength:`300`,placeholder:t(a)(`可选,写下真实的安排或缘由`)},null,8,mn),[[f,C.value.note]])]),o(`p`,hn,i(t(a)(`绑定称呼不会凭空增加相处经历、信任或对方的同意。私下关系只在与对方的私聊中使用。`)),1),o(`button`,{class:`primary`,type:`submit`,disabled:x.value},i(x.value?t(a)(`正在保存…`):t(a)(`保存关系`)),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=C(w({__name:`PeoplePage`,setup(e){let n=N(null),r=l(_(`/mind/bonds`)||null),s=N(`galaxy`),c=N(``),d=N(D.sub&&D.sub!==`list`?D.sub:null);D.sub===`list`&&(s.value=`list`);let v=E(()=>{let e=c.value.trim(),t=r.value?.people||[];return e?t.filter(t=>`${t.name}${t.userId}${t.impression||``}`.includes(e)):t}),S=0;async function C(){let e=++S,t=await L.bonds();e===S&&(r.value=t)}function w(e){d.value=e,T(e)}function A(){d.value=null,T(s.value===`list`?`list`:``)}return x(s,e=>{D.page===`people`&&(d.value||T(e===`list`?`list`:``))}),x(()=>[D.page,D.sub],([e,t])=>{e===`people`&&(t===`list`&&(s.value=`list`),d.value=t&&t!==`list`?t:null)}),W(`people`,C),(e,l)=>(k(),g(`div`,vn,[o(`div`,yn,[b(X,{modelValue:s.value,"onUpdate:modelValue":l[0]||=e=>s.value=e,label:t(a)(`人际的视图`),items:[{key:`galaxy`,label:t(a)(`相遇之间`),count:r.value?.people.length??``},{key:`list`,label:t(a)(`列表`)}]},null,8,[`modelValue`,`label`,`items`]),P(o(`input`,{"onUpdate:modelValue":l[1]||=e=>c.value=e,class:`people-search`,type:`search`,placeholder:t(a)(`找一个人`),"aria-label":t(a)(`找一个人`)},null,8,bn),[[f,c.value]]),o(`p`,xn,i(t(a)(`她记得相遇,也记得关系会随着时间改变。`)),1)]),r.value?(k(),g(p,{key:0},[b(_n,{ref_key:`relations`,ref:n,onChanged:C,onOpen:w},null,512),v.value.length?(k(),g(p,{key:0},[s.value===`galaxy`?(k(),h(ye,{key:0,people:v.value,activity:t(G).data?.activity?.kind,onOpen:w,onList:l[2]||=e=>s.value=`list`},null,8,[`people`,`activity`])):(k(),g(`div`,Sn,[(k(!0),g(p,null,y(v.value,e=>(k(),g(`button`,{key:e.userId,class:`card person-card`,"data-person":e.userId,onClick:t=>w(e.userId)},[o(`header`,null,[o(`span`,{class:`avatar`,style:u({"--hue":t(q)(e.name||e.userId)})},i(t(Q)(e.name)),5),o(`div`,null,[o(`h3`,null,i(e.name),1),o(`small`,wn,`QQ `+i(e.userId),1),o(`small`,Tn,i(e.feel),1)])]),o(`div`,En,[(k(!0),g(p,null,y(t(z),([t,n])=>(k(),h(ne,{key:t,label:n,value:e[t],warn:t===`tension`},null,8,[`label`,`value`,`warn`]))),128))]),o(`small`,Dn,i(t(a)(`在 {length} 个地方见过 · 上次说上话 {v}`,{length:e.sessions.length,v:e.lastTalkedAt?t(Y)(e.lastTalkedAt,t(G).data?.now):t(a)(`还没有`)})),1)],8,Cn))),128))]))],64)):(k(),h(O,{key:1,title:t(a)(`TA 还没有认识谁`),text:t(a)(`有人和 TA 说话、TA 细看过群聊之后,这里会出现 TA 对每个人的感觉。`)},null,8,[`title`,`text`])),b(Gt,{groups:r.value.groups,onChanged:C},null,8,[`groups`])],64)):m(``,!0),b(yt,{id:d.value,now:t(G).data?.now,onClose:A,onChanged:C,onRelationship:l[3]||=(e,t)=>{A(),n.value?.edit(e,t)}},null,8,[`id`,`now`])]))}}),[[`__scopeId`,`data-v-4c6f1adb`]]);export{On as default};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{$ as e,Ct as t,Et as n,I as r,J as i,U as a,V as o,W as s,X as c,Y as l,Z as u,ct as d,dt as f,et as p,gt as m,lt as ee,m as h,n as te,nt as g,o as ne,q as re,s as _,t as v,ut as y,vt as b,xt as x,yt as S,z as ie}from"./Empty-DSurzLFZ.js";import{i as C,n as ae,o as oe}from"./index-Cn6TppEV.js";import{t as w}from"./Field-GuXyA_aS.js";var se={class:`page plugins`},ce={class:`plugins-intro`},le={class:`eyebrow`},ue={key:0,class:`warn-text`,role:`alert`},de={key:1,class:`stack`},fe={class:`lead`},pe={class:`grid`},me={class:`muted`},he={key:0},ge={class:`row`},_e=[`onClick`],ve=[`onClick`],ye=[`onClick`],be={key:2,class:`grid`},T=[`onClick`],E={key:3,class:`grid`},D={class:`row`},O=[`onClick`],k=[`onClick`],A={key:4,class:`grid`},j={key:0,class:`switch`},M=[`onUpdate:modelValue`],N=[`onUpdate:modelValue`,`placeholder`],xe=[`onUpdate:modelValue`,`placeholder`],Se=[`onUpdate:modelValue`],Ce={class:`row`},we={class:`ghost`,type:`submit`},Te=[`src`],Ee={key:1,class:`row`},P=te(g({__name:`PluginsPage`,setup(te){let g=[`installed`,`market`,`actions`,`import`],P=x(g.includes(_.sub)?_.sub:`installed`),F=x([]),I=x([]),L=x(!1),R=x(!1),z=x([]),B=x(``),V=x(``),H=x(null),U=x({}),W=x({url:``,sha256:``}),G=x(``),K=x(``),q=x(``),J=x(null),Y=re(()=>F.value.find(e=>e.id===V.value));async function X(){F.value=(await h(`/plugins`)).plugins||[];try{z.value=(await h(`/plugins/actions/pending`)).actions||[]}catch{z.value=[]}}function Z(){R.value=!0,h(`/plugins/market`).then(e=>{I.value=e.plugins||[],L.value=!!e.unavailable}).catch(()=>{I.value=[],L.value=!0}).finally(()=>{R.value=!1})}m(P,e=>{ne(e),e===`market`&&Z()}),m(()=>_.sub,e=>{g.includes(e)&&(P.value=e)}),m(V,async e=>{if(!e)return;let t=await h(`/plugins/${e}/settings`),n={};for(let e of t.fields||[]){let r=t.values?.[e.key]??e.default;e.type===`boolean`?n[e.key]=r===!0:e.type===`urls`?n[e.key]=Array.isArray(r)?r.join(`
|
|
2
|
+
`):r??``:n[e.key]=r??``}U.value=n});async function De(){Y.value&&(B.value=``,await h(`/plugins/${Y.value.id}/settings`,{method:`PUT`,body:JSON.stringify({values:U.value})}))}async function Oe(e){B.value=``;try{V.value===e.id&&await h(`/plugins/${e.id}/settings`,{method:`PUT`,body:JSON.stringify({values:U.value})}),await h(`/plugins/${e.id}/grant`,{method:`POST`,body:JSON.stringify({permissions:e.permissions})}),await h(`/plugins/${e.id}/enable`,{method:`POST`,body:`{}`}),await X()}catch(e){B.value=e.message}}async function Q(e,t){B.value=``;try{H.value=await h(e,{method:`POST`,body:JSON.stringify(t)})}catch(e){B.value=e.message}}async function ke(){if(!H.value)return;await h(`/plugins/import/commit`,{method:`POST`,body:JSON.stringify({token:H.value.token})});let e=H.value;H.value=null,await h(`/plugins/${e.manifest.id}/grant`,{method:`POST`,body:JSON.stringify({permissions:e.permissions})}),P.value=`installed`,await X()}function $(e){let t=e.data||{};if(t.luckytri!==1||!Y.value||e.source!==J.value?.contentWindow)return;let n=String(t.path||`/`);n.startsWith(`/`)&&h(`/plugins/${Y.value.id}/x${n}`,{method:t.method||`GET`,body:t.body?JSON.stringify(t.body):void 0}).then(e=>J.value?.contentWindow?.postMessage({id:t.id,ok:!0,result:e},location.origin)).catch(e=>J.value?.contentWindow?.postMessage({id:t.id,ok:!1,error:e.message},location.origin))}d(()=>{X().catch(e=>B.value=e.message),P.value===`market`&&Z(),window.addEventListener(`message`,$)}),ee(()=>window.removeEventListener(`message`,$));function Ae(e){return r(e===`high`?`高风险`:e===`medium`?`中风险`:`低风险`)}function je(e){return e.running?r(`运行中`):e.state===`error`?r(`出错`):e.enabled?r(`正在启动`):e.source===`builtin`?r(`内置,未启用`):r(`已安装,未启用`)}return(d,m)=>(y(),u(`div`,se,[i(`header`,ce,[i(`span`,le,n(t(r)(`THE WORLD SHE CAN TOUCH · 插件`)),1),i(`h1`,null,[e(n(t(r)(`核心是她。`)),1),i(`em`,null,n(t(r)(`插件是世界。`)),1)]),i(`p`,null,n(t(r)(`插件只能经她同意接触世界。它们读不到她的数据库,也不能替她开口。`)),1)]),B.value?(y(),u(`p`,ue,n(B.value),1)):c(``,!0),p(ae,{"model-value":P.value,"onUpdate:modelValue":m[0]||=e=>P.value=e,label:t(r)(`插件的分区`),items:[{key:`installed`,label:t(r)(`插件列表`)},{key:`market`,label:t(r)(`插件市场`)},{key:`actions`,label:t(r)(`她想做的事`),count:z.value.length},{key:`import`,label:t(r)(`导入与开发`)}]},null,8,[`model-value`,`label`,`items`]),P.value===`installed`?(y(),u(`section`,de,[i(`p`,fe,n(t(r)(`天气随 LuckyTri 附带,默认关闭。启用前会先列出它要的权限。`)),1),i(`div`,pe,[F.value.length?c(``,!0):(y(),l(v,{key:0,title:t(r)(`还没有接上插件`),text:t(r)(`内置的天气可以在这里启用,也可以从市场安装。`)},null,8,[`title`,`text`])),(y(!0),u(s,null,f(F.value,a=>(y(),l(C,{key:a.id,title:a.manifest.name||a.id},{default:b(()=>[i(`p`,null,n(a.manifest.description),1),i(`p`,me,[e(n(a.version)+` · `+n(je(a))+` `,1),a.status?.text?(y(),u(`span`,he,` · `+n(a.status.text),1)):c(``,!0)]),i(`div`,ge,[a.enabled?(y(),u(`button`,{key:1,class:`ghost`,onClick:e=>t(h)(`/plugins/${a.id}/disable`,{method:`POST`,body:`{}`}).then(X)},n(t(r)(`停用`)),9,ve)):(y(),u(`button`,{key:0,class:`primary`,onClick:e=>V.value=a.id},n(t(r)(`查看权限并启用`)),9,_e)),i(`button`,{class:`ghost`,onClick:e=>V.value=a.id},n(t(r)(`详情`)),9,ye)])]),_:2},1032,[`title`]))),128))])])):P.value===`market`?(y(),u(`section`,be,[R.value?(y(),l(v,{key:0,title:t(r)(`正在查看市场`),text:t(r)(`连不上的话,这里会说明,不会再显示一串英文错误。`)},null,8,[`title`,`text`])):I.value.length?c(``,!0):(y(),l(v,{key:1,title:t(r)(`市场暂时没有条目`),text:L.value?t(r)(`插件市场的索引还没有发布,或现在连不上。随程序附带的插件在「插件列表」里,默认关闭。`):t(r)(`索引仓库还是空的,或者现在连不上。你仍然可以导入一个插件包。`)},null,8,[`title`,`text`])),R.value?c(``,!0):(y(!0),u(s,{key:2},f(I.value,e=>(y(),l(C,{key:e.id||e.source,title:e.name||e.id},{default:b(()=>[i(`p`,null,n(e.description),1),e.latest?(y(),u(`button`,{key:0,class:`primary`,onClick:t=>Q(`/plugins/market/stage`,{url:e.latest.url,sha256:e.latest.sha256,id:e.id})},n(t(r)(`安装`))+` `+n(e.latest.version),9,T)):c(``,!0)]),_:2},1032,[`title`]))),128))])):P.value===`actions`?(y(),u(`section`,E,[z.value.length?c(``,!0):(y(),l(v,{key:0,title:t(r)(`没有等待同意的事`),text:t(r)(`高风险的行动会先停在这里,等你点头。过一天就不再算数。`)},null,8,[`title`,`text`])),(y(!0),u(s,null,f(z.value,e=>(y(),l(C,{key:e.id,title:e.label},{default:b(()=>[i(`p`,null,n(e.reason),1),i(`div`,D,[i(`button`,{class:`primary`,onClick:n=>t(h)(`/plugins/actions/${e.id}/approve`,{method:`POST`,body:`{}`}).then(X)},n(t(r)(`同意`)),9,O),i(`button`,{class:`ghost`,onClick:n=>t(h)(`/plugins/actions/${e.id}/reject`,{method:`POST`,body:`{}`}).then(X)},n(t(r)(`拒绝`)),9,k)])]),_:2},1032,[`title`]))),128))])):(y(),u(`section`,A,[p(C,{title:t(r)(`从链接导入`)},{default:b(()=>[p(w,{label:t(r)(`插件包地址`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[1]||=e=>W.value.url=e},null,512),[[o,W.value.url]])]),_:1},8,[`label`]),p(w,{label:t(r)(`校验值,可留空`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[2]||=e=>W.value.sha256=e},null,512),[[o,W.value.sha256]])]),_:1},8,[`label`]),i(`button`,{class:`primary`,onClick:m[3]||=e=>Q(`/plugins/import/url`,W.value)},n(t(r)(`检查这个包`)),1)]),_:1},8,[`title`]),p(C,{title:t(r)(`从 GitHub 导入`)},{default:b(()=>[p(w,{label:t(r)(`仓库地址`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[4]||=e=>G.value=e,placeholder:`https://github.com/owner/name`},null,512),[[o,G.value]])]),_:1},8,[`label`]),i(`button`,{class:`primary`,onClick:m[5]||=e=>Q(`/plugins/import/github`,{repository:G.value})},n(t(r)(`检查这个仓库`)),1)]),_:1},8,[`title`]),p(C,{title:t(r)(`本机目录(开发)`)},{default:b(()=>[p(w,{label:t(r)(`目录`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[6]||=e=>K.value=e},null,512),[[o,K.value]])]),_:1},8,[`label`]),i(`button`,{class:`ghost`,onClick:m[7]||=e=>Q(`/plugins/import/dir`,{dir:K.value})},n(t(r)(`按开发插件接上`)),1)]),_:1},8,[`title`]),p(C,{title:t(r)(`索引源`)},{default:b(()=>[p(w,{label:t(r)(`索引地址`)},{default:b(()=>[S(i(`input`,{"onUpdate:modelValue":m[8]||=e=>q.value=e},null,512),[[o,q.value]])]),_:1},8,[`label`]),i(`button`,{class:`ghost`,onClick:m[9]||=e=>t(h)(`/plugins/sources`,{method:`POST`,body:JSON.stringify({url:q.value})})},n(t(r)(`添加索引`)),1)]),_:1},8,[`title`])])),H.value?(y(),l(C,{key:5,title:t(r)(`先看清它要什么`)},{default:b(()=>[i(`p`,null,n(H.value.manifest?.name)+` `+n(H.value.manifest?.version)+` · `+n(H.value.trusted?t(r)(`校验通过`):t(r)(`未登记来源`)),1),i(`ul`,null,[(y(!0),u(s,null,f(H.value.permissions,e=>(y(),u(`li`,{key:e},n(e),1))),128))]),i(`button`,{class:`primary`,onClick:ke},n(t(r)(`同意这些权限并安装`)),1)]),_:1},8,[`title`])):c(``,!0),p(oe,{open:!!Y.value,title:Y.value?.manifest.name||``,onClose:m[13]||=e=>V.value=``},{default:b(()=>[Y.value?(y(),u(s,{key:0},[i(`p`,null,n(Y.value.manifest.description),1),i(`ul`,null,[(y(!0),u(s,null,f(Y.value.risk,e=>(y(),u(`li`,{key:e.name},n(Ae(e.risk))+` · `+n(e.label),1))),128))]),i(`form`,{class:`settings`,onSubmit:m[11]||=a(e=>De().catch(e=>B.value.value=e.message),[`prevent`])},[(y(!0),u(s,null,f(Y.value.manifest.settings||[],e=>(y(),u(s,{key:e.key},[e.type===`boolean`?(y(),u(`label`,j,[i(`span`,null,n(e.label),1),S(i(`input`,{"onUpdate:modelValue":t=>U.value[e.key]=t,type:`checkbox`},null,8,M),[[ie,U.value[e.key]]])])):(y(),l(w,{key:1,label:e.label},{default:b(()=>[e.type===`secret`?S((y(),u(`input`,{key:0,type:`password`,"onUpdate:modelValue":t=>U.value[e.key]=t,placeholder:t(r)(`已保存的不会回显`)},null,8,N)),[[o,U.value[e.key]]]):e.type===`textarea`||e.type===`urls`?S((y(),u(`textarea`,{key:1,"onUpdate:modelValue":t=>U.value[e.key]=t,rows:`4`,placeholder:e.type===`urls`?t(r)(`一行一个地址`):void 0},null,8,xe)),[[o,U.value[e.key]]]):S((y(),u(`input`,{key:2,"onUpdate:modelValue":t=>U.value[e.key]=t},null,8,Se)),[[o,U.value[e.key]]])]),_:2},1032,[`label`]))],64))),128)),i(`div`,Ce,[i(`button`,we,n(t(r)(`保存设置`)),1),Y.value.enabled?c(``,!0):(y(),u(`button`,{key:0,class:`primary`,type:`button`,onClick:m[10]||=e=>Oe(Y.value)},n(t(r)(`同意这些权限并启用`)),1))])],32),Y.value.enabled&&Y.value.manifest.contributes?.page?(y(),u(`iframe`,{key:0,ref_key:`frame`,ref:J,class:`plugin-frame`,sandbox:`allow-scripts allow-forms`,src:`/plugin-ui/${Y.value.id}/index.html`},null,8,Te)):c(``,!0),Y.value.source===`builtin`?c(``,!0):(y(),u(`div`,Ee,[i(`button`,{class:`ghost`,onClick:m[12]||=e=>{t(h)(`/plugins/${Y.value.id}`,{method:`DELETE`,body:`{}`}).then(()=>{V.value=``,X()})}},n(t(r)(`卸载`)),1)]))],64)):c(``,!0)]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-042ad318`]]);export{P as default};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{$ as e,Ct as t,E as n,Et as r,I as i,J as a,M as o,N as s,P as c,S as l,T as u,Tt as d,U as f,V as p,W as m,X as h,Y as g,Z as _,a as v,b as y,bt as b,ct as x,dt as S,et as C,f as w,ft as T,gt as E,h as D,ht as O,i as k,j as A,lt as j,m as M,n as N,nt as P,o as F,ot as I,p as L,q as R,rt as ee,s as z,t as te,ut as B,v as V,vt as H,w as U,wt as W,xt as G,yt as K,z as q}from"./Empty-DSurzLFZ.js";import{v as J}from"./mind-BMcoPQNd.js";import{c as Y,f as ne,l as re,n as ie,o as ae}from"./index-Cn6TppEV.js";var oe={class:`connect`},se={class:`card connection`},X={class:`card-head`},Z={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`},he={class:`muted note`},Q={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=N(P({__name:`ConnectQQ`,emits:[`open`],setup(o,{emit:s}){let l=s,u=R(()=>z.health.connection||{}),d=R(()=>u.value.channel===`qqbot`?`qqbot`:`onebot`),g=R(()=>!!u.value.locked),y=R(()=>!!u.value.online);R(()=>u.value.onebot||{});let x=R(()=>u.value.qqbot||{}),w=R(()=>String(z.health.settings.qqbotAppId||``)),T=R(()=>!!z.health.settings.hasQqbotSecret),D=G(d.value);E(d,e=>D.value=e);let O=R(()=>`${location.protocol===`https:`?`wss`:`ws`}://${location.host}/onebot/v11/ws`),N=R(()=>[{key:`onebot`,label:i(`OneBot 11`),count:d.value===`onebot`?i(`使用中`):``},{key:`qqbot`,label:i(`QQ 官方机器人`),count:d.value===`qqbot`?i(`使用中`):``}]),P=b({appId:w.value,secret:``}),F=G(!1),I=R(()=>P.appId.trim()!==w.value||!!P.secret.trim());E(I,e=>{z.dirty=e}),E(w,e=>{I.value||(P.appId=e)}),j(()=>{z.dirty=!1});let L=R(()=>!!P.appId.trim()&&(T.value||!!P.secret.trim())),ee=c({idle:A(`未启用`),unconfigured:A(`尚未填写 AppID 与 AppSecret`),connecting:A(`正在连接开放平台`),ready:A(`已连接`),closed:A(`连接已断开,正在重连`),error:A(`连接出错`)}),te=c({all:A(`全部群消息`),mentions:A(`只有 @ 她的消息`),unknown:A(`尚未收到群消息`)}),H=R(()=>ee[x.value.state||`idle`]??ee.idle),U=R(()=>te[x.value.groupMessages||`unknown`]??te.unknown),q=R(()=>d.value===`qqbot`&&x.value.groupMessages===`mentions`);async function J(e){if(F.value||g.value||e===d.value)return;let t=i(e===`qqbot`?`QQ 官方机器人`:`OneBot 11`);if(!y.value||await n(i(`切换后会断开当前连接。原来方式下的会话仍可查看,但不能再向它们发送消息。`),{title:i(`切换连接方式`),confirmText:i(`切换`),cancelText:i(`先不切换`)})){F.value=!0;try{await M(`/settings`,`PATCH`,{channel:e}),await v(),V(i(`已切换为 {name}`,{name:t}))}catch(e){V(e.message,!0)}finally{F.value=!1}}}async function Y(){if(!F.value){if(!L.value){V(i(`请填写 AppID 和 AppSecret`),!0);return}F.value=!0;try{let e={qqbotAppId:P.appId.trim()};P.secret.trim()&&(e.qqbotSecret=P.secret.trim()),d.value!==`qqbot`&&!g.value&&(e.channel=`qqbot`),await M(`/settings`,`PATCH`,e),P.secret=``,await v(),V(i(`已保存`))}catch(e){V(e.message,!0)}finally{F.value=!1}}}let ne={token:[``,`connect`],credentials:[``,`connect`],qq:[``,`connect`],model:[``,`models`],mode:[``,`runtime`],session:[`chats`,``],persona:[`nature`,``]};function ae(e){let[t,n]=ne[e]||[``,`connect`];t?k(t):l(`open`,n)}return(n,o)=>(B(),_(`div`,oe,[a(`section`,se,[a(`div`,X,[a(`div`,null,[a(`span`,Z,r(t(i)(`QQ`)),1),a(`h2`,null,r(t(i)(`连接 QQ`)),1),a(`p`,null,r(t(i)(`两种连接方式二选一,同一时间只使用一种。她的记忆、心情和行为完全一致,区别只在消息怎么到达。`)),1)]),a(`span`,ce,[a(`span`,{class:W([`dot`,{off:!y.value}])},null,2),e(` `+r(y.value?t(i)(`QQ 已连接`):t(i)(`等待连接`)),1)])]),C(ie,{modelValue:D.value,"onUpdate:modelValue":o[0]||=e=>D.value=e,label:t(i)(`连接方式`),items:N.value},null,8,[`modelValue`,`label`,`items`]),g.value?(B(),_(`p`,le,r(t(i)(`连接方式由环境变量 LUCKYTRI_CHANNEL 指定,在这里不能更改。去掉该变量后即可在此选择。`)),1)):h(``,!0),D.value===`onebot`?(B(),_(m,{key:1},[a(`p`,ue,r(t(i)(`自备接入端,通过反向 WebSocket 连接。能看到全部群消息。`)),1),a(`div`,de,[a(`div`,fe,[a(`span`,null,r(t(i)(`反向 WebSocket 地址`)),1),a(`code`,null,r(O.value),1)])]),a(`ol`,pe,[a(`li`,null,r(t(i)(`同一台电脑上的接入端无需单独配置连接令牌。`)),1),a(`li`,null,r(t(i)(`在接入端启用反向 WebSocket 客户端,填写上方地址,消息格式选择数组。已有的地址配置可以继续使用。`)),1),a(`li`,null,r(t(i)(`在接入端完成 QQ 登录。连接成功后,本页状态会更新;新会话仍需在「对话」中开启参与。`)),1)]),a(`p`,me,r(t(i)(`远程接入时,连接密码使用管理密码;已有的远程连接令牌仍兼容。`)),1),a(`p`,he,r(t(i)(`LuckyTri 只负责接收,不提供、不安装也不管理接入端。`)),1),d.value===`onebot`?h(``,!0):(B(),_(`div`,Q,[a(`button`,{class:`primary`,"data-use":`onebot`,disabled:F.value||g.value,onClick:o[1]||=e=>J(`onebot`)},r(t(i)(`改用这种方式`)),9,ge)]))],64)):(B(),_(m,{key:2},[a(`p`,_e,r(t(i)(`只需 AppID 与 AppSecret,无需额外软件。群里默认只收到 @ 她的消息。`)),1),a(`form`,{class:`stack tight`,onSubmit:f(Y,[`prevent`])},[a(`label`,null,[e(r(t(i)(`AppID`))+` `,1),K(a(`input`,{"onUpdate:modelValue":o[2]||=e=>P.appId=e,name:`qqbotAppId`,autocomplete:`off`,inputmode:`numeric`,maxlength:`40`,disabled:F.value||x.value.appIdFromEnv,placeholder:t(i)(`机器人的 AppID`)},null,8,ve),[[p,P.appId]]),x.value.appIdFromEnv?(B(),_(`small`,ye,r(t(i)(`由环境变量指定,在这里不能修改`)),1)):h(``,!0)]),a(`label`,null,[e(r(t(i)(`AppSecret`))+` `,1),K(a(`input`,{"onUpdate:modelValue":o[3]||=e=>P.secret=e,name:`qqbotSecret`,type:`password`,autocomplete:`new-password`,maxlength:`200`,disabled:F.value||x.value.secretFromEnv,placeholder:T.value||x.value.secretFromEnv?t(i)(`已保存,留空保留`):t(i)(`机器人的 AppSecret`)},null,8,be),[[p,P.secret]]),x.value.secretFromEnv?(B(),_(`small`,xe,r(t(i)(`由环境变量指定,在这里不能修改`)),1)):h(``,!0)]),a(`div`,Se,[a(`button`,{class:`primary`,"data-save":`qqbot`,disabled:F.value||x.value.appIdFromEnv&&x.value.secretFromEnv},r(d.value===`qqbot`||g.value?t(i)(`保存`):t(i)(`保存并使用`)),9,Ce),I.value?(B(),_(`span`,we,r(t(i)(`有尚未保存的修改`)),1)):h(``,!0)])],32),d.value===`qqbot`?(B(),_(`div`,Te,[a(`div`,Ee,[a(`span`,null,r(t(i)(`连接状态`)),1),a(`strong`,De,r(H.value),1)]),x.value.error?(B(),_(`div`,Oe,[o[4]||=a(`span`,null,null,-1),a(`small`,ke,r(x.value.error),1)])):h(``,!0),x.value.botName?(B(),_(`div`,Ae,[a(`span`,null,r(t(i)(`机器人`)),1),a(`strong`,null,r(x.value.botName),1)])):h(``,!0),a(`div`,je,[a(`span`,null,r(t(i)(`最近收到消息`)),1),a(`strong`,null,r(x.value.lastEventAt?t(re)(x.value.lastEventAt):t(i)(`还没有`)),1)]),a(`div`,Me,[a(`span`,null,r(t(i)(`群消息范围`)),1),a(`strong`,null,r(U.value),1)])])):h(``,!0),q.value?(B(),_(`p`,Ne,r(t(i)(`目前只收到 @ 她的群消息。想让她看到群里的全部消息,请在开放平台的机器人设置里开启「接收所有消息」。`)),1)):h(``,!0),a(`ol`,Pe,[a(`li`,null,r(t(i)(`在 QQ 开放平台创建机器人,取得 AppID 与 AppSecret。`)),1),a(`li`,null,r(t(i)(`把运行 LuckyTri 的这台机器的出口 IP 加入机器人的 IP 白名单。`)),1),a(`li`,null,r(t(i)(`可选:开启「接收所有消息」,她才能看到群里没有 @ 她的话;不开启时只会收到 @ 她的消息。`)),1),a(`li`,null,r(t(i)(`填写上方的 AppID 与 AppSecret 并保存。状态变为「已连接」后,在群里 @ 她或私聊她,新会话会出现在「对话」中。`)),1)]),a(`ul`,Fe,[a(`li`,null,r(t(i)(`官方平台不提供群名称:新会话以占位名出现,可以在「对话」中为它改名。`)),1),a(`li`,null,r(t(i)(`官方平台上,同一个人在不同的群里标识不同。像只在不同的房间见过对方一样,平台给出统一身份之前,她不会把两处的人当成同一个人。`)),1),a(`li`,null,r(t(i)(`对方关闭了机器人的主动消息时,她不会去打扰,会等对方来找她。`)),1)])],64))]),a(`section`,Ie,[a(`div`,Le,[a(`div`,null,[a(`span`,Re,r(t(i)(`就绪检查`)),1),a(`h2`,null,r(t(i)(`还差哪一步`)),1)]),a(`span`,ze,r(t(z).health.readiness?.completed??0)+` / `+r(t(z).health.readiness?.total??0),1)]),a(`ol`,Be,[(B(!0),_(m,null,S(t(z).health.readiness?.checks||[],e=>(B(),_(`li`,{key:e.id,class:W({done:e.done})},[a(`span`,Ve,r(e.done?`✓`:``),1),a(`div`,null,[a(`b`,null,r(e.name),1),a(`small`,He,r(e.detail),1)]),a(`button`,{class:`small`,"data-fix":e.id,onClick:t=>ae(e.id)},r(e.done?t(i)(`查看`):t(i)(`去处理`)),9,Ue)],2))),128))])])]))}}),[[`__scopeId`,`data-v-6f4553ed`]]);async function Ge(e){return M(`/core/models`,`PUT`,{models:e})}async function Ke(e){return M(`/core/models/`+encodeURIComponent(e),`DELETE`,{})}async function qe(e){return M(`/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=[`required`],tt=[`placeholder`],nt=[`placeholder`],rt={class:`fields`},it={class:`save-bar`},at=[`disabled`],ot=[`disabled`],st={class:`faint`},ct={key:2,role:`status`},lt=N(P({__name:`EmbeddingProfile`,setup(n){let o=b({enabled:!1,label:i(`知识向量`),baseUrl:``,model:``,apiKey:``,dimensions:0,batchSize:10,timeoutMs:9e4,protocol:`openai`}),s=G(!1),c=G(!1),l=G(!1),u=G(``);async function d(){try{Object.assign(o,await M(`/core/knowledge/embedding`),{apiKey:``}),l.value=!0}catch(e){u.value=e.message}}async function m(){s.value=!0;try{Object.assign(o,await M(`/core/knowledge/embedding`,`PATCH`,o),{apiKey:``}),c.value=!1,V(i(`知识向量模型已保存`))}catch(e){V(e.message,!0)}finally{s.value=!1}}async function g(){s.value=!0;try{let e=await M(`/core/knowledge/embedding/test`,`POST`,{});u.value=i(`连接成功,向量维度 {dimensions}`,{dimensions:e.dimensions})}catch(e){u.value=e.message}finally{s.value=!1}}return x(d),(n,d)=>(B(),_(`section`,Je,[a(`h2`,Ye,r(t(i)(`知识向量模型`)),1),a(`p`,Xe,r(t(i)(`填写任意 OpenAI 兼容向量服务(/embeddings)的请求地址、模型名和密钥。火山方舟地址可以不填模型名,会用 doubao-embedding-vision。维度填 0 表示用模型自己的长度(doubao-embedding-vision 是 2048),写明长度就按写的请求。不启用或连不上时,对话和关键词回忆照常进行。`)),1),l.value&&!o.configured?(B(),_(`p`,Ze,r(t(i)(`当前兼容旧配置,跟随默认模型。保存后改用独立配置。`)),1)):h(``,!0),l.value?(B(),_(`form`,{key:1,autocomplete:`off`,onSubmit:f(m,[`prevent`]),onInput:d[7]||=e=>c.value=!0,onChange:d[8]||=e=>c.value=!0},[a(`label`,Qe,[K(a(`input`,{"onUpdate:modelValue":d[0]||=e=>o.enabled=e,type:`checkbox`,name:`embeddingEnabled`},null,512),[[q,o.enabled]]),e(r(t(i)(`启用知识向量`)),1)]),a(`div`,$e,[a(`label`,null,[e(r(t(i)(`请求地址`)),1),K(a(`input`,{"onUpdate:modelValue":d[1]||=e=>o.baseUrl=e,name:`embeddingBaseUrl`,type:`url`,inputmode:`url`,autocomplete:`off`,spellcheck:`false`,placeholder:`https://example.com/v1`,required:o.enabled},null,8,et),[[p,o.baseUrl]])]),a(`label`,null,[e(r(t(i)(`模型名称`)),1),K(a(`input`,{"onUpdate:modelValue":d[2]||=e=>o.model=e,name:`embeddingModelName`,autocomplete:`off`,spellcheck:`false`,placeholder:t(i)(`火山方舟可留空`)},null,8,tt),[[p,o.model]])]),a(`label`,null,[e(r(t(i)(`向量服务密钥`)),1),K(a(`input`,{"onUpdate:modelValue":d[3]||=e=>o.apiKey=e,name:`embeddingApiKey`,type:`text`,class:`secret`,autocomplete:`off`,spellcheck:`false`,"data-1p-ignore":``,"data-lpignore":`true`,placeholder:o.hasApiKey?t(i)(`已保存,留空保留`):t(i)(`填写向量服务密钥`)},null,8,nt),[[p,o.apiKey]])])]),a(`details`,null,[a(`summary`,null,r(t(i)(`自动选择的细节`)),1),a(`div`,rt,[a(`label`,null,[e(r(t(i)(`向量维度(0 表示自动)`)),1),K(a(`input`,{"onUpdate:modelValue":d[4]||=e=>o.dimensions=e,name:`embeddingDimensions`,type:`number`,min:`0`,max:`65536`},null,512),[[p,o.dimensions,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`每批段落数`)),1),K(a(`input`,{"onUpdate:modelValue":d[5]||=e=>o.batchSize=e,name:`embeddingBatchSize`,type:`number`,min:`1`,max:`128`},null,512),[[p,o.batchSize,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`请求格式`)),1),C(Y,{modelValue:o.protocol,"onUpdate:modelValue":d[6]||=e=>o.protocol=e,name:`embeddingProtocol`,"aria-label":t(i)(`请求格式`),options:[{value:`openai`,label:t(i)(`OpenAI 兼容(可批量)`)},{value:`multimodal`,label:t(i)(`方舟多模态接口(逐条)`)}]},null,8,[`modelValue`,`aria-label`,`options`])])])]),a(`div`,it,[a(`button`,{class:`primary`,disabled:s.value},r(t(i)(`保存向量模型`)),9,at),a(`button`,{type:`button`,disabled:s.value||c.value||!o.enabled||!o.configured,onClick:g},r(t(i)(`测试向量连接`)),9,ot),a(`small`,st,r(c.value?t(i)(`有未保存的修改`):t(i)(`配置已载入`)),1)])],32)):h(``,!0),u.value?(B(),_(`p`,ct,r(u.value),1)):h(``,!0)]))}}),[[`__scopeId`,`data-v-2f67d847`]]),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=[`placeholder`],bt=[`disabled`],xt={key:3,role:`status`},St={key:4,class:`result`},Ct={class:`faint`},wt={class:`faint`},Tt={key:0,class:`faint`},Et=N(P({__name:`RecallPanel`,setup(n){let o=G(null),s=G(``),c=R(()=>z.core?.sessions||[]),l=G(``),u=G(``),d=G(null),g=G(!1),v={fact:i(`事实`),episode:i(`情景`),meeting:i(`相遇`),self:i(`自我线索`),thought:i(`念头`),diary:i(`日记`),period:i(`回顾`),anticipation:i(`约定`),message:i(`原话`)},y={meaning:i(`意思相关`),words:i(`说到了`),person:i(`关于这个人`)},b=R(()=>{let e=o.value?.coverage;return e?.total?`${e.embedded||0} / ${e.total}`:``});async function w(){try{o.value=await M(`/mind/recall`),s.value=``}catch(e){s.value=e.message}}async function T(){if(l.value&&u.value.trim()){g.value=!0;try{d.value=await M(`/mind/recall/probe`,`POST`,{session:l.value,text:u.value}),s.value=``}catch(e){s.value=e.message}finally{g.value=!1}}}return x(w),(n,x)=>(B(),_(`section`,ut,[a(`h2`,dt,r(t(i)(`回忆索引`)),1),a(`p`,ft,r(t(i)(`她的事实、情景、自我线索和近一个月的原话都在同一个索引里,按意思、字词和相关的人一起检索。向量还没覆盖的部分先按字词找。`)),1),o.value?(B(),_(`div`,pt,[(B(!0),_(m,null,S(o.value.items,e=>(B(),_(`span`,{key:e.kind,class:`pill`},r(v[e.kind]||e.kind)+` `+r(e.n),1))),128)),b.value?(B(),_(`span`,mt,r(t(i)(`已有向量`))+` `+r(b.value),1)):h(``,!0),o.value.embedding?.latencyMs?(B(),_(`span`,ht,r(t(i)(`向量延迟`))+` `+r(o.value.embedding.latencyMs.p50)+` ms`,1)):h(``,!0),o.value.embedding?.lastError?(B(),_(`span`,gt,r(o.value.embedding.lastError),1)):h(``,!0)])):h(``,!0),o.value?.waiting?.length?(B(),_(`ul`,_t,[(B(!0),_(m,null,S(o.value.waiting,e=>(B(),_(`li`,{key:e.key},r(t(i)(`等待重试`))+` `+r(e.key)+` × `+r(e.failures)+`:`+r(e.lastError),1))),128))])):h(``,!0),o.value?.unavailableModels?.length?(B(),_(`ul`,vt,[(B(!0),_(m,null,S(o.value.unavailableModels,e=>(B(),_(`li`,{key:e.key},r(t(i)(`暂时停用的备用模型`))+` `+r(e.label)+`:`+r(e.reason),1))),128))])):h(``,!0),a(`form`,{class:`probe`,onSubmit:f(T,[`prevent`])},[C(Y,{modelValue:l.value,"onUpdate:modelValue":x[0]||=e=>l.value=e,name:`recallSession`,"aria-label":t(i)(`选择会话`),options:[{value:``,label:t(i)(`选择会话`),disabled:!0},...c.value.map(e=>({value:e.id,label:e.name||e.id}))]},null,8,[`modelValue`,`aria-label`,`options`]),K(a(`input`,{"onUpdate:modelValue":x[1]||=e=>u.value=e,name:`recallText`,maxlength:`500`,placeholder:t(i)(`输入一句话,看她会想起什么`)},null,8,yt),[[p,u.value]]),a(`button`,{disabled:g.value||!l.value||!u.value.trim()},r(t(i)(`试试回忆`)),9,bt)],32),s.value?(B(),_(`p`,xt,r(s.value),1)):h(``,!0),d.value?(B(),_(`div`,St,[a(`p`,Ct,r(d.value.mode===`hybrid`?t(i)(`意思与字词一起`):t(i)(`仅字词`))+` · `+r(t(i)(`候选`))+` `+r(d.value.candidates),1),a(`ol`,null,[(B(!0),_(m,null,S(d.value.items,n=>(B(),_(`li`,{key:n.id},[a(`strong`,null,r(v[n.kind]||n.kind),1),e(` `+r(n.text)+` `,1),a(`small`,wt,[e(r(y[n.why])+` `,1),n.standsOut===null?h(``,!0):(B(),_(m,{key:0},[e(` · `+r(t(i)(`突出度`))+` `+r(n.standsOut),1)],64)),e(` · `+r(t(i)(`共有字词`))+` `+r(n.sharedWords),1)])]))),128))]),d.value.items.length?h(``,!0):(B(),_(`p`,Tt,r(t(i)(`没有想起什么`)),1))])):h(``,!0)]))}}),[[`__scopeId`,`data-v-1e0fb3c1`]]),Dt={class:`library`},Ot={class:`model-workspace`},kt={class:`card shelf`},At={class:`shelf-head`},jt={class:`faint`},Mt={class:`rows`},Nt={key:0,class:`muted`},Pt=[`open`,`data-saved-vendor`,`onToggle`],Ft={class:`vendor-models`},It=[`onClick`],Lt={class:`who`},Rt={key:0,class:`card detail`},zt={class:`card-head`},Bt={class:`eyebrow`},Vt=[`data-tone`],Ht={class:`form-grid`},Ut={key:0},Wt=[`placeholder`],Gt={class:`wide`},Kt=[`placeholder`],qt={class:`faint`},Jt={class:`form-grid`},Yt={key:0},Xt={key:1},Zt={class:`advanced`},Qt={class:`form-grid`},$t=[`placeholder`],en={class:`faint`},tn={class:`caps`},nn=[`onUpdate:modelValue`,`name`],rn={key:0,id:`modelTestResult`,class:`notice`,role:`status`},an={class:`actions`},on=[`disabled`],sn={class:`faint`},cn={key:0,class:`check`},ln=[`checked`],un=[`disabled`],dn={key:1,class:`card detail`},fn={class:`card usage-panel`,"aria-labelledby":`token-usage-title`},pn={class:`usage-intro`},mn={class:`eyebrow`},hn={id:`token-usage-title`},gn={class:`usage-total`},_n={class:`usage-detail`},vn={class:`usage-stat`},yn={class:`usage-stat`},bn={class:`usage-stat cache-stat`},xn={class:`usage-stat`},Sn={class:`usage-foot`},Cn={key:0},wn={key:1,class:`usage-error`},Tn={key:2},En=[`disabled`],Dn={class:`model-picker`},On={class:`muted`},kn={class:`catalog-search`},An=[`placeholder`],jn=[`data-vendor`],Mn={class:`vendor-summary`},Nn={class:`vendor-name`},Pn={class:`presets`},Fn=[`data-preset`,`onClick`],In={key:0,class:`muted search-empty`},Ln=N(P({__name:`ModelLibrary`,setup(s){let c=R(()=>z.health?.modelCatalog||[]),l=R(()=>z.health?.effortLabels||{none:i(`关闭`),minimal:i(`极低`),low:i(`低`),medium:i(`中`),high:i(`高`),xhigh:i(`极高`),max:i(`最深`)}),u=G(z.core.models.map(e=>({...e}))),g=G(u.value.length?0:-1),y=G(u.value.length?Z(u.value[0]):``),w=G(!1),T=G(!1),D=G(!1),O=G(``),k=G(``),A=G(null),j=G(!1),N=G(``),P=b(X());u.value[0]&&Object.assign(P,u.value[0],{apiKey:``});let F=R(()=>g.value>=0&&!!P.id),I=R(()=>{let e=[];for(let t of c.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}),L=R(()=>{let e=O.value.trim().toLocaleLowerCase();return e?I.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):I.value}),ee=R(()=>{let e=[];return u.value.forEach((t,n)=>{let r=Z(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=R(()=>c.value.find(e=>e.id===`custom`)),J=R(()=>c.value.filter(e=>e.vendor&&e.vendor===P.vendor)),re=R(()=>c.value.find(e=>e.id===P.presetId)||c.value.find(e=>e.model&&e.model===P.model&&e.baseUrl===P.baseUrl)),ie=R(()=>{let e=re.value?.contextWindows||[];if(e.length<2)return[];let t=Number(P.contextWindow);return e.some(e=>e.contextWindow===t)?e:[...e,{label:i(`已保存 {value}`,{value:pe(t)}),contextWindow:t,maxInputTokens:Number(P.maxInputTokens),maxOutputTokens:Number(P.maxOutputTokens)}]}),oe=R(()=>{let e=Array.isArray(P.reasoningEfforts)&&P.reasoningEfforts.length?[...P.reasoningEfforts]:[`none`,`minimal`,`low`,`medium`,`high`,`xhigh`,`max`];return P.reasoningEffort&&!e.includes(P.reasoningEffort)&&e.unshift(P.reasoningEffort),e}),se=R(()=>z.core.models.some(e=>e.id===P.id));function X(){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 Z(e){let t={"volcengine-coding-plan":i(`火山方舟 Coding Plan`),"opencode-go":`OpenCode Go`,"opencode-zen":`OpenCode Zen`,deepseek:`DeepSeek`,openai:`OpenAI`,bedrock:i(`亚马逊 Bedrock`),qwen:i(`通义千问`),moonshot:`Kimi`,kimi:`Kimi`,zhipu:i(`智谱 GLM`),glm:i(`智谱 GLM`),mimo:i(`小米 MiMo`),siliconflow:`SiliconFlow`,openrouter:`OpenRouter`};return String(e?.vendor||``).trim()||t[String(e?.provider||``).toLowerCase()]||String(e?.provider||i(`自定义供应商`))}function ce(e,t){let n=t.currentTarget;y.value=n.open?e:``}function le(e){let{summary:t,contextWindows:n,...r}=e;return{...r,presetId:e.id}}function ue(e){let{contextWindows:t,...n}=e;return n}function de(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 fe(e){let t=Number(e.target.value),n=ie.value.find(e=>e.contextWindow===t);n&&(P.contextWindow=n.contextWindow,P.maxInputTokens=n.maxInputTokens,P.maxOutputTokens=n.maxOutputTokens,z.dirty=!0)}function pe(e){let t=Number(e)||0;return t>=1e6?(t%1048576==0?t/1048576:Number((t/1e6).toFixed(2)))+`M`:t>=1e3?(t%1e3==0?t/1e3:t%1024==0?t/1024:Math.round(t/1e3))+`K`:String(t)}function me(e){if(e.id===`openrouter`)return i(`按所选模型填写上下文和输出参数`);if(!e.model)return i(`填写模型 ID 和对应参数`);let t=e.contextWindows||[],n=t.length?t.map(e=>e.label).join(` / `):pe(e.contextWindow);return i(`上下文 {context} · 输出 {v}`,{context:n,v:pe(e.maxOutputTokens)})}function he(e){return[`mimo`,`qwen`,`kimi-toggle`].includes(P.thinkingStyle)?i(e===`none`?`关闭`:`开启`):`${l.value[e]||e} / ${e}`}function Q(e){return new Intl.NumberFormat(o()).format(Number(e)||0)}async function ge(){if(!j.value){j.value=!0;try{A.value=await M(`/core/usage`),N.value=``}catch(e){N.value=e.message}finally{j.value=!1}}}x(()=>void ge()),E(()=>z.tick,()=>void ge());async function _e(){return z.dirty?await n(i(`放弃当前模型草稿?`),{title:i(`草稿还没保存`),confirmText:i(`放弃`),cancelText:i(`留下`)})?(z.dirty=!1,!0):!1:!0}async function ve(e){let t=u.value[e];t&&t.id!==P.id&&await _e()&&(u.value=u.value.filter(e=>e.id===t.id||z.core.models.some(t=>t.id===e.id)),g.value=u.value.findIndex(e=>e.id===t.id),y.value=Z(t),Object.assign(P,X(),t,{apiKey:``}),k.value=``)}async function ye(){if(!await _e())return;u.value=z.core.models.map(e=>({...e})),u.value.length?u.value.some(e=>e.id===P.id)||(g.value=0,Object.assign(P,X(),u.value[0],{apiKey:``})):(g.value=-1,Object.assign(P,X()));let e=u.value[g.value]||u.value[0];y.value=e?Z(e):``,O.value=``,D.value=!0}function be(e){u.value=z.core.models.map(e=>({...e}));let t={...X(),...le(e),id:`model-`+Date.now(),apiKey:``,hasApiKey:!1,isDefault:u.value.length===0};u.value.push(t),g.value=u.value.length-1,y.value=Z(t),Object.assign(P,t),k.value=``,D.value=!1,z.dirty=!0}function xe(e){let t=e.target.value,n=c.value.find(e=>e.id===t);if(!n)return;Object.assign(P,X(),le(n),{id:P.id,apiKey:P.apiKey,hasApiKey:P.hasApiKey,isDefault:P.isDefault});let r=u.value[g.value];r&&(r.label=P.label),z.dirty=!0}function Se(){for(let e of u.value)e.isDefault=e.id===P.id;P.isDefault=!0,z.dirty=!0}async function Ce(){let e=de(P),t=u.value.map((t,n)=>ue(n===g.value?{...P,...e,isDefault:!!P.isDefault,enabled:P.isDefault?!0:P.enabled!==!1,timeoutMs:Number(P.timeoutMs),temperature:Number(P.temperature),topP:Number(P.topP)}:{...t,isDefault:!!t.isDefault&&t.id!==P.id}));if(!t.some(e=>e.isDefault)&&t.length&&(t[0].isDefault=!0),!w.value){w.value=!0;try{await Ge(t),z.dirty=!1,await v(),u.value=z.core.models.map(e=>({...e})),Object.assign(P,X(),u.value[g.value],{apiKey:``}),V(i(`已保存并应用`))}catch(e){V(e.message,!0)}finally{w.value=!1}}}async function we(){if(await n(i(`确定删除这个模型?`),{title:i(`删除模型`),confirmText:i(`删除`),danger:!0})){if(z.core.models.some(e=>e.id===P.id)&&await Ke(P.id),z.dirty=!1,await v(),u.value=z.core.models.map(e=>({...e})),k.value=``,!u.value.length){g.value=-1,y.value=``,Object.assign(P,X());return}g.value=0,y.value=Z(u.value[0]),Object.assign(P,X(),u.value[0],{apiKey:``})}}async function Te(){if(!(!se.value||z.dirty||T.value)){T.value=!0,k.value=i(`正在测试「{v}」…`,{v:P.label||P.model});try{let e=await qe(P.id);k.value=i(`✓ {v} 连接成功 · {latency} ms`,{v:P.label||e.model,latency:e.latency}),await v()}catch(e){k.value=e.message}finally{T.value=!1}}}return(n,s)=>(B(),_(`div`,Dt,[a(`div`,Ot,[a(`aside`,kt,[a(`div`,At,[a(`h2`,null,[e(r(t(i)(`模型库`))+` `,1),a(`small`,null,r(u.value.length),1)]),a(`button`,{id:`addModel`,class:`small primary`,onClick:ye},r(t(i)(`+ 新增模型`)),1)]),a(`p`,jt,r(t(i)(`群聊、私聊和独处都使用默认模型。其余已启用的模型按这里的顺序作为备用。关掉的模型不会被调用。`)),1),a(`div`,Mt,[u.value.length?h(``,!0):(B(),_(`p`,Nt,r(t(i)(`还没有模型。`)),1)),(B(!0),_(m,null,S(ee.value,e=>(B(),_(`details`,{key:e.vendor,class:`saved-vendor`,open:y.value===e.vendor,"data-saved-vendor":e.vendor,onToggle:t=>ce(e.vendor,t)},[a(`summary`,null,[a(`span`,null,r(e.vendor),1),a(`small`,null,r(t(i)(`{length} 个模型`,{length:e.models.length})),1)]),a(`div`,Ft,[(B(!0),_(m,null,S(e.models,e=>(B(),_(`button`,{key:e.model.id,class:W([`entity-row`,{selected:g.value===e.index}]),onClick:t=>ve(e.index)},[a(`span`,{class:`badge`,style:d({"--hue":t(ne)(e.model.label||e.model.model||e.model.id)})},r(String(e.model.label||e.model.model||`?`).slice(0,1).toUpperCase()),5),a(`span`,Lt,[a(`b`,null,r(e.model.label||e.model.model),1),a(`small`,null,r(e.model.enabled===!1?t(i)(`已关闭`):e.model.isDefault?t(i)(`默认模型`):t(i)(`备用模型`)),1)])],10,It))),128))])],40,Pt))),128))])]),F.value?(B(),_(`section`,Rt,[a(`div`,zt,[a(`div`,null,[a(`span`,Bt,r(t(i)(`模型档案`)),1),a(`h2`,null,r(P.label||t(i)(`新模型`)),1)]),a(`span`,{class:`chip`,"data-tone":P.hasApiKey?`ok`:`warn`},r((P.isDefault?t(i)(`默认模型 · `):``)+(P.hasApiKey?t(i)(`密钥已保存`):t(i)(`待填写密钥`))),9,Vt)]),a(`form`,{id:`modelForm`,class:`stack`,onSubmit:f(Ce,[`prevent`]),onInput:s[14]||=e=>t(z).dirty=!0},[a(`fieldset`,null,[a(`legend`,null,r(t(i)(`连接`)),1),a(`div`,Ht,[J.value.length>1?(B(),_(`label`,Ut,[e(r(t(i)(`同厂商模型`))+` `,1),C(Y,{"model-value":P.presetId,"aria-label":t(i)(`同厂商模型`),options:J.value.map(e=>({value:e.id,label:e.label})),onChange:xe},null,8,[`model-value`,`aria-label`,`options`])])):h(``,!0),a(`label`,null,[e(r(t(i)(`显示名称`)),1),K(a(`input`,{"onUpdate:modelValue":s[0]||=e=>P.label=e,name:`label`,required:``},null,512),[[p,P.label]])]),a(`label`,null,[e(r(t(i)(`供应商`)),1),K(a(`input`,{"onUpdate:modelValue":s[1]||=e=>P.provider=e,name:`provider`,placeholder:t(i)(`例如 deepseek、openai`)},null,8,Wt),[[p,P.provider]])]),a(`label`,null,[e(r(t(i)(`API 地址`)),1),K(a(`input`,{"onUpdate:modelValue":s[2]||=e=>P.baseUrl=e,name:`baseUrl`,type:`url`,required:``},null,512),[[p,P.baseUrl]])]),a(`label`,null,[e(r(t(i)(`模型名称`)),1),K(a(`input`,{"onUpdate:modelValue":s[3]||=e=>P.model=e,name:`model`,required:``},null,512),[[p,P.model]])]),a(`label`,Gt,[s[18]||=e(` API Key `,-1),K(a(`input`,{"onUpdate:modelValue":s[4]||=e=>P.apiKey=e,name:`apiKey`,type:`password`,autocomplete:`new-password`,placeholder:P.hasApiKey?t(i)(`已保存,留空则保留`):t(i)(`填写供应商提供的密钥`)},null,8,Kt),[[p,P.apiKey]])])])]),a(`fieldset`,null,[a(`legend`,null,r(t(i)(`容量与思考`)),1),a(`p`,qt,r(t(i)(`官方按输入长度分档计价的模型可以在标准和百万之间切换;输出上限默认是官方最大值,思考强度只列出这个模型支持的档位。`)),1),a(`div`,Jt,[ie.value.length?(B(),_(`label`,Yt,[e(r(t(i)(`上下文容量`))+` `,1),C(Y,{name:`contextWindow`,"model-value":P.contextWindow,options:ie.value.map(e=>({value:e.contextWindow,label:e.label})),onChange:fe},null,8,[`model-value`,`options`])])):(B(),_(`label`,Xt,[e(r(t(i)(`上下文容量`)),1),K(a(`input`,{"onUpdate:modelValue":s[5]||=e=>P.contextWindow=e,name:`contextWindow`,type:`number`},null,512),[[p,P.contextWindow,void 0,{number:!0}]])])),a(`label`,null,[e(r(t(i)(`最大输入 Token`)),1),K(a(`input`,{"onUpdate:modelValue":s[6]||=e=>P.maxInputTokens=e,name:`maxInputTokens`,type:`number`},null,512),[[p,P.maxInputTokens,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`最大输出 Token`)),1),K(a(`input`,{"onUpdate:modelValue":s[7]||=e=>P.maxOutputTokens=e,name:`maxOutputTokens`,type:`number`},null,512),[[p,P.maxOutputTokens,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`思考强度`))+` `,1),C(Y,{modelValue:P.reasoningEffort,"onUpdate:modelValue":s[8]||=e=>P.reasoningEffort=e,name:`reasoningEffort`,"aria-label":t(i)(`思考强度`),options:oe.value.map(e=>({value:e,label:he(e)}))},null,8,[`modelValue`,`aria-label`,`options`])])])]),a(`details`,Zt,[a(`summary`,null,r(t(i)(`高级参数与模型能力`)),1),a(`div`,Qt,[a(`label`,null,[e(r(t(i)(`随机程度 Temperature`)),1),K(a(`input`,{"onUpdate:modelValue":s[9]||=e=>P.temperature=e,name:`temperature`,type:`number`,step:`0.05`},null,512),[[p,P.temperature,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`采样范围 Top P`)),1),K(a(`input`,{"onUpdate:modelValue":s[10]||=e=>P.topP=e,name:`topP`,type:`number`,step:`0.05`},null,512),[[p,P.topP,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`超时(毫秒)`)),1),K(a(`input`,{"onUpdate:modelValue":s[11]||=e=>P.timeoutMs=e,name:`timeoutMs`,type:`number`},null,512),[[p,P.timeoutMs,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`知识检索模型`)),1),K(a(`input`,{"onUpdate:modelValue":s[12]||=e=>P.embeddingModel=e,name:`embeddingModel`,placeholder:t(i)(`留空跟随对话模型`)},null,8,$t),[[p,P.embeddingModel]])])]),a(`p`,en,r(t(i)(`打开图片理解后,聊天里的图片会先在本机读取,再连同画面交给这个模型。主模型不能看图时,到会话设置另选一个打开了图片理解的视觉兼容模型。`)),1),a(`div`,tn,[(B(!0),_(m,null,S({vision:t(i)(`图片理解`),system:`System Prompt`,json:t(i)(`JSON 输出`),tools:t(i)(`工具调用`),embedding:t(i)(`知识向量`)},(t,n)=>(B(),_(`label`,{key:n,class:`check`},[K(a(`input`,{"onUpdate:modelValue":e=>P[n]=e,name:n,type:`checkbox`},null,8,nn),[[q,P[n]]]),e(r(t),1)]))),128))])]),k.value?(B(),_(`div`,rn,r(k.value),1)):h(``,!0),a(`div`,an,[a(`button`,{class:`primary`,disabled:w.value},r(w.value?t(i)(`正在保存…`):t(i)(`保存模型`)),9,on),a(`small`,sn,r(t(z).dirty?t(i)(`有未保存的修改`):t(i)(`已保存的模型才会用来测试和回复`)),1),P.isDefault?h(``,!0):(B(),_(`label`,cn,[a(`input`,{type:`checkbox`,checked:P.enabled!==!1,onChange:s[13]||=e=>{P.enabled=e.target.checked,t(z).dirty=!0}},null,40,ln),e(r(t(i)(`启用这个备用模型`)),1)])),P.isDefault?h(``,!0):(B(),_(`button`,{key:1,id:`setDefaultModel`,type:`button`,onClick:Se},r(t(i)(`设为默认模型`)),1)),se.value?(B(),_(`button`,{key:2,id:`testModel`,type:`button`,disabled:w.value||T.value||t(z).dirty,onClick:Te},r(T.value?t(i)(`正在测试…`):t(z).dirty?t(i)(`保存后测试此模型`):t(i)(`测试此模型连接`)),9,un)):h(``,!0),a(`button`,{id:`deleteModel`,type:`button`,class:`danger push`,onClick:we},r(t(i)(`删除模型`)),1)])],32)])):(B(),_(`section`,dn,[C(te,{title:t(i)(`还没有模型`),text:t(i)(`常见厂商会预填模型参数;OpenRouter 可选 GPT-6 预设,也可用自选模型手动填写模型 ID 和参数。`)},{default:H(()=>[a(`button`,{class:`primary`,onClick:ye},r(t(i)(`+ 新增模型`)),1)]),_:1},8,[`title`,`text`])]))]),C(lt),C(Et),a(`section`,fn,[a(`div`,pn,[a(`div`,null,[a(`span`,mn,r(t(i)(`TOKEN LEDGER · 累计用量`)),1),a(`h2`,hn,r(t(i)(`一路聊到现在`)),1),a(`p`,null,r(t(i)(`统计本机账本记录的模型调用;缓存 Token 已包含在输入量里。`)),1)]),a(`div`,gn,[a(`strong`,null,r(Q(A.value?.total)),1),a(`span`,null,r(t(i)(`累计 Token`)),1)])]),a(`div`,_n,[a(`div`,vn,[a(`span`,null,r(t(i)(`输入`)),1),a(`b`,null,r(Q(A.value?.input)),1)]),a(`div`,yn,[a(`span`,null,r(t(i)(`输出`)),1),a(`b`,null,r(Q(A.value?.output)),1)]),a(`div`,bn,[a(`span`,null,[e(r(t(i)(`缓存命中`))+` `,1),a(`small`,null,r(t(i)(`(输入子项)`)),1)]),a(`b`,null,r(Q(A.value?.cached)),1)]),a(`div`,xn,[a(`span`,null,r(t(i)(`调用次数`)),1),a(`b`,null,r(Q(A.value?.calls)),1)])]),a(`div`,Sn,[A.value?.since?(B(),_(`small`,Cn,[e(r(t(i)(`从 {v} 开始记录 · {v2} 为模型返回用量`,{v:new Date(A.value.since).toLocaleDateString(t(o)()),v2:Q(A.value.reportedTokens)}))+` `,1),A.value.estimatedCalls?(B(),_(m,{key:0},[e(r(t(i)(`· {v} 次调用按文本估算`,{v:Q(A.value.estimatedCalls)})),1)],64)):h(``,!0)])):N.value?(B(),_(`small`,wn,r(N.value),1)):(B(),_(`small`,Tn,r(t(i)(`还没有模型调用记录。`)),1)),a(`button`,{type:`button`,class:`usage-refresh`,disabled:j.value,onClick:ge},r(j.value?t(i)(`更新中…`):t(i)(`刷新统计 ↻`)),9,En)])]),C(ae,{open:D.value,title:t(i)(`选择模型`),eyebrow:`MODELS`,width:`880px`,onClose:s[17]||=e=>D.value=!1},{default:H(()=>[a(`div`,Dn,[a(`p`,On,r(t(i)(`先选供应商,再挑具体模型;支持搜索。火山方舟 Coding Plan 已预填套餐专用接口与型号参数,请勿换成普通推理 API 地址。`)),1),a(`label`,kn,[a(`span`,null,r(t(i)(`搜索模型或供应商`)),1),K(a(`input`,{"onUpdate:modelValue":s[15]||=e=>O.value=e,type:`search`,placeholder:t(i)(`例如:火山方舟、Kimi K3、DeepSeek`)},null,8,An),[[p,O.value]])]),(B(!0),_(m,null,S(L.value,e=>(B(),_(`details`,{key:e.vendor,class:`vendor`,"data-vendor":e.vendor},[a(`summary`,Mn,[a(`span`,Nn,[a(`b`,null,r(e.vendor),1),a(`small`,null,r(t(i)(`{length} 个预设`,{length:e.models.length})),1)]),s[19]||=a(`span`,{class:`vendor-chevron`,"aria-hidden":`true`},`⌄`,-1)]),a(`div`,Pn,[(B(!0),_(m,null,S(e.models,e=>(B(),_(`button`,{key:e.id,type:`button`,class:`preset-card`,"data-preset":e.id,onClick:t=>be(e)},[a(`b`,null,r(e.label),1),a(`small`,null,r(e.model||t(i)(`填写你在 OpenRouter 选择的模型 ID`)),1),a(`small`,null,r(me(e)),1),a(`small`,null,r(e.summary),1)],8,Fn))),128))])],8,jn))),128)),L.value.length?h(``,!0):(B(),_(`p`,In,r(t(i)(`没有找到匹配的模型预设。`)),1)),U.value?(B(),_(`button`,{key:1,type:`button`,class:`preset-card custom`,"data-preset":`custom`,onClick:s[16]||=e=>be(U.value)},[a(`b`,null,r(U.value.label),1),a(`small`,null,r(U.value.summary),1)])):h(``,!0)])]),_:1},8,[`open`,`title`])]))}}),[[`__scopeId`,`data-v-8a9bd858`]]),Rn={class:`switch`},zn=[`name`,`disabled`],$=P({__name:`Toggle`,props:ee({name:{},disabled:{type:Boolean}},{modelValue:{type:Boolean,default:!1},modelModifiers:{}}),emits:[`update:modelValue`],setup(e){let t=O(e,`modelValue`);return(n,r)=>(B(),_(`label`,Rn,[K(a(`input`,{"onUpdate:modelValue":r[0]||=e=>t.value=e,type:`checkbox`,name:e.name,disabled:e.disabled},null,8,zn),[[q,t.value]]),a(`span`,null,[T(n.$slots,`default`)])]))}}),Bn={class:`runtime-grid`},Vn={class:`card-head`},Hn={class:`eyebrow`},Un={class:`switches`},Wn={class:`save-bar`},Gn={class:`primary`,type:`submit`},Kn={class:`faint`},qn={class:`card numbers`},Jn=[`title`],Yn=N(P({__name:`Runtime`,setup(e){let n=G(!!z.health.settings.enabled),o=G(!!z.health.settings.demo),s=R(()=>(z.core.sessions||[]).filter(e=>e.enabled&&!e.archived).length),c=R(()=>{let e=z.health.backup;if(!e)return null;if(!e.enabled)return{value:i(`已关闭`),caption:i(`自动备份`),tone:`warn`,title:``};if(e.lastError)return{value:i(`失败`),caption:i(`自动备份出错,稍后重试`),tone:`danger`,title:e.lastError.message};if(!e.latest)return{value:i(`还没有`),caption:i(`自动备份,运行一阵后会做第一份`),tone:``,title:``};let t=Math.max(1,Math.round(e.latest.bytes/1048576));return{value:re(e.latest.at),caption:i(`上次自动备份 · {mb} MB · 已留 {count}/{keep} 份`,{mb:t,count:e.count,keep:e.keep}),tone:``,title:e.latest.name}});async function l(){try{await L({enabled:n.value,demo:o.value}),z.dirty=!1,z.health=await w(),V(i(`已保存并应用`))}catch(e){V(e.message,!0)}}return(e,u)=>(B(),_(`div`,Bn,[a(`form`,{id:`runtime`,class:`card`,onSubmit:f(l,[`prevent`]),onChange:u[2]||=e=>t(z).dirty=!0},[a(`div`,Vn,[a(`div`,null,[a(`span`,Hn,r(t(i)(`运行开关`)),1),a(`h2`,null,r(t(i)(`TA 现在可以说话吗`)),1)])]),a(`div`,Un,[C($,{modelValue:n.value,"onUpdate:modelValue":u[0]||=e=>n.value=e,name:`enabled`},{default:H(()=>[a(`b`,null,r(t(i)(`允许参与聊天`)),1),a(`small`,null,r(t(i)(`总开关。关掉后 TA 不看也不回任何会话,心智照常保存。`)),1)]),_:1},8,[`modelValue`]),C($,{modelValue:o.value,"onUpdate:modelValue":u[1]||=e=>o.value=e,name:`demo`},{default:H(()=>[a(`b`,null,r(t(i)(`仅模拟运行,不向 QQ 发送`)),1),a(`small`,null,r(t(i)(`模拟模式下,「对话」里可以发模拟消息走完整流程;它们写进模拟会话,不进入真实记忆。`)),1)]),_:1},8,[`modelValue`])]),a(`div`,Wn,[a(`button`,Gn,r(t(i)(`保存运行状态`)),1),a(`small`,Kn,r(t(z).dirty?t(i)(`有未保存的修改`):t(i)(`已保存,立刻生效`)),1)])],32),a(`section`,qn,[a(`button`,{onClick:u[3]||=e=>t(k)(`chats`)},[a(`b`,null,r(s.value),1),a(`span`,null,r(t(i)(`参与中的会话`)),1)]),a(`button`,{onClick:u[4]||=e=>t(k)(`system`,`models`)},[a(`b`,null,r(t(z).core.models.length),1),a(`span`,null,r(t(i)(`可用模型`)),1)]),a(`button`,{onClick:u[5]||=e=>t(k)(`system`,`connect`)},[a(`b`,null,r(t(z).health.connection?.online?t(i)(`在线`):t(i)(`离线`)),1),a(`span`,null,r(t(i)(`QQ 连接`)),1)]),c.value?(B(),_(`button`,{key:0,class:W([`stat`,c.value.tone]),title:c.value.title,"data-testid":`backup-status`,type:`button`,onClick:u[6]||=e=>t(k)(`system`,`storage`)},[a(`b`,null,r(c.value.value),1),a(`span`,null,r(c.value.caption),1)],10,Jn)):h(``,!0)])]))}}),[[`__scopeId`,`data-v-76173390`]]),Xn={class:`card search-profile`},Zn={class:`eyebrow`},Qn={class:`muted`},$n={key:0,class:`faint`},er={class:`check`},tr=[`disabled`],nr={class:`search-fields`},rr=[`disabled`],ir=[`disabled`,`placeholder`],ar=[`disabled`],or=[`disabled`],sr=[`disabled`],cr={class:`faint`},lr={class:`search-usage`,role:`status`},ur={class:`chip`},dr={class:`faint`},fr={class:`faint`},pr={class:`row`},mr=[`disabled`],hr=[`disabled`],gr={key:0,class:`faint`},_r=[`role`],vr=N(P({__name:`SearchProfile`,setup(n){let o=[`provider`,`enabled`,`baseUrl`,`timeoutMs`,`maxResults`,`dailyLimit`],s=b({provider:`tavily`,enabled:!0,baseUrl:``,apiKey:``,timeoutMs:2e4,maxResults:5,dailyLimit:12}),c=G(null),l=G(!1),u=G(!1),d=G(``),m=G(!1),g=new Map,v=`tavily`,y=R(()=>u.value&&(!!s.apiKey.trim()||o.some(e=>s[e]!==c.value?.[e]))),S=e=>e===`brave`?`Brave`:`Tavily`,w=R(()=>c.value?.dailyLimit===0?i(`不限`):c.value?.dailyLimit??12);E(y,e=>{z.dirty=e}),E(()=>[z.tick,z.pulse],()=>{u.value&&!l.value&&z.page===`system`&&z.sub===`search`&&T().catch(()=>{})});async function T(){c.value=await M(`/mind/time/search`)}async function D(){try{await T(),Object.assign(s,c.value,{apiKey:``}),v=s.provider,u.value=!0}catch(e){V(e.message,!0)}}async function O(){if(l.value)return;l.value=!0;let e=s.provider;g.set(v,{...s,provider:v});try{Object.assign(s,g.get(e)||{...await M(`/mind/time/search?provider=`+e),apiKey:``}),v=e,d.value=``}catch(e){s.provider=v,V(e.message,!0)}finally{l.value=!1}}function k(){return Object.fromEntries([...o,`apiKey`].map(e=>[e,s[e]]))}async function A(){if(!l.value){l.value=!0;try{let e=await M(`/mind/time/search`,`PATCH`,k());c.value=e,Object.assign(s,e,{apiKey:``}),g.set(s.provider,{...s}),v=s.provider,V(i(`搜索配置已保存并生效`))}catch(e){V(e.message,!0)}finally{l.value=!1}}}async function N(){if(!l.value){l.value=!0,d.value=``,m.value=!1;try{let e=await M(`/mind/time/search/test`,`POST`,k()),t={source:e.profile.mode===`web`?i(`{provider} 联网检索`,{provider:S(e.profile.provider)}):e.profile.materialLabel,count:e.results.length};d.value=y.value?i(`{source}测试通过,返回 {count} 条资料。测试不占用每日查询额度;当前填写的配置尚未保存。`,t):i(`{source}测试通过,返回 {count} 条资料。测试不占用每日查询额度。`,t)}catch(e){m.value=!0,d.value=i(`{error}。本次测试不占用每日查询额度。`,{error:e.message})}finally{try{await T()}catch{}l.value=!1}}}return x(D),j(()=>{z.dirty=!1}),(n,o)=>(B(),_(`section`,Xn,[a(`span`,Zn,r(t(i)(`SEARCH · 独立搜索`)),1),a(`h2`,null,r(t(i)(`接触世界的资料`)),1),a(`p`,Qn,r(t(i)(`配置后优先联网检索。未配置密钥或关闭独立搜索时,使用当前模型整理已有知识。`)),1),u.value?(B(),_(`p`,$n,r(t(i)(`当前生效:{v}。表单修改保存后生效。`,{v:c.value.mode===`web`?t(i)(`{provider} · 联网检索资料`,{provider:S(c.value.provider)}):c.value.materialLabel})),1)):h(``,!0),u.value?(B(),_(`form`,{key:1,onSubmit:f(A,[`prevent`])},[a(`label`,er,[K(a(`input`,{"onUpdate:modelValue":o[0]||=e=>s.enabled=e,type:`checkbox`,disabled:l.value},null,8,tr),[[q,s.enabled]]),e(r(t(i)(`启用独立搜索`)),1)]),a(`div`,nr,[a(`label`,null,[e(r(t(i)(`提供方`)),1),C(Y,{modelValue:s.provider,"onUpdate:modelValue":o[1]||=e=>s.provider=e,"aria-label":t(i)(`搜索提供方`),disabled:l.value,options:[{value:`tavily`,label:`Tavily`},{value:`brave`,label:`Brave`}],onChange:O},null,8,[`modelValue`,`aria-label`,`disabled`])]),a(`label`,null,[e(r(t(i)(`搜索地址`)),1),K(a(`input`,{"onUpdate:modelValue":o[2]||=e=>s.baseUrl=e,type:`url`,required:``,name:`searchUrl`,disabled:l.value},null,8,rr),[[p,s.baseUrl]])]),a(`label`,null,[e(r(t(i)(`独立密钥`)),1),K(a(`input`,{"onUpdate:modelValue":o[3]||=e=>s.apiKey=e,type:`password`,autocomplete:`new-password`,name:`searchKey`,disabled:l.value,placeholder:s.hasApiKey?t(i)(`已保存,留空保留`):t(i)(`填写该提供方的搜索密钥`)},null,8,ir),[[p,s.apiKey]])]),a(`label`,null,[e(r(t(i)(`超时(毫秒)`)),1),K(a(`input`,{"onUpdate:modelValue":o[4]||=e=>s.timeoutMs=e,type:`number`,min:`1000`,max:`120000`,disabled:l.value},null,8,ar),[[p,s.timeoutMs,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`每次结果数`)),1),K(a(`input`,{"onUpdate:modelValue":o[5]||=e=>s.maxResults=e,type:`number`,min:`1`,max:`20`,disabled:l.value},null,8,or),[[p,s.maxResults,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`每日查询上限`)),1),K(a(`input`,{"onUpdate:modelValue":o[6]||=e=>s.dailyLimit=e,name:`searchDailyLimit`,type:`number`,min:`0`,max:`100000`,disabled:l.value},null,8,sr),[[p,s.dailyLimit,void 0,{number:!0}]]),a(`small`,cr,r(t(i)(`可手动调整;0 表示不限。保存后立即生效。`)),1)])]),a(`div`,lr,[a(`span`,ur,r(t(i)(`今日有效查询 {v} / {limitLabel}`,{v:c.value.used||0,limitLabel:w.value})),1),a(`small`,dr,r(t(i)(`{v} 次进行中 · {v2} 次失败 · {v3} 次测试`,{v:c.value.usage?.running||0,v2:c.value.usage?.failed||0,v3:c.value.usage?.diagnostics||0})),1)]),a(`p`,fr,r(t(i)(`测试当前填写的配置,不会自动保存。失败与连接测试不占本地每日额度;提供方的账户额度由提供方管理。`)),1),a(`div`,pr,[a(`button`,{class:`primary`,disabled:l.value},r(t(i)(`保存搜索`)),9,mr),a(`button`,{type:`button`,disabled:l.value,onClick:N},r(l.value?t(i)(`处理中…`):t(i)(`测试连接`)),9,hr),y.value?(B(),_(`span`,gr,r(t(i)(`有尚未保存的修改`)),1)):h(``,!0)]),d.value?(B(),_(`p`,{key:0,role:m.value?`alert`:`status`,class:W([`search-result`,{failed:m.value}])},r(d.value),11,_r)):h(``,!0)],32)):h(``,!0)]))}}),[[`__scopeId`,`data-v-e874d8b6`]]),yr={key:0,class:`card data-transfer`,"aria-labelledby":`data-transfer-title`},br={class:`eyebrow`},xr={id:`data-transfer-title`},Sr={class:`transfer-note`},Cr={class:`transfer-note`},wr={class:`transfer-actions`},Tr=[`disabled`],Er=[`disabled`],Dr=[`aria-label`],Or={class:`transfer-note`},kr={key:0,class:`transfer-progress`,role:`status`},Ar={key:1,class:`transfer-error`,role:`alert`},jr={key:2,class:`transfer-note`},Mr={key:3,class:`transfer-preview`},Nr={class:`eyebrow`},Pr={class:`transfer-note`},Fr={class:`transfer-counts`},Ir={class:`transfer-actions`},Lr=[`disabled`],Rr=[`disabled`],zr=N(P({__name:`DataTransfer`,setup(e){let o=G(null),c=G(null),d=G(),f=G(``),p=G(``),g=!0,v=null,y=R(()=>!!f.value),b=R(()=>f.value===`restarting`?i(`正在保留快照并重启加载,请等待…`):f.value===`uploading`?i(`正在上传数据文件…`):f.value===`exporting`?i(`正在生成完整数据包…`):i(`正在校验数据文件…`)),C=R(()=>{let e=c.value?.summary?.tables||{};return[[i(`聊天记录`),e.core_events||e.messages||0],[i(`记忆`),e.core_memories||e.memories||0],[i(`待办`),e.mind_time_tasks||0],[i(`作品`),e.mind_time_works||0],[i(`日记`),e.mind_diary||0]]}),w=()=>new Promise(e=>setTimeout(e,800));async function T(e,t=!1){for(let n=0;n<4500&&g;n++){try{let n=await M(`/storage/transfer/jobs/`+e);if(n.status===`error`)throw Error(n.error||i(`数据处理失败`));if(n.status===(t?`done`:`ready`))return n;if(n.status===`expired`)throw Error(i(`数据文件已过期,请重新选择`))}catch(e){if(!t||!(e instanceof TypeError)&&e.message!==i(`请求失败`))throw e}await w()}throw Error(i(`等待数据处理超时,请检查实例运行状态`))}async function E(){if(!y.value){f.value=`exporting`,p.value=``;try{let e=await M(`/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(),V(i(`数据包已生成,浏览器将开始下载`))}catch(e){g&&(p.value=e.message)}finally{g&&(f.value=``)}}}async function O(e){let t=e.target,n=t.files?.[0];if(t.value=``,n&&!y.value){if(p.value=``,c.value=null,n.size>(o.value?.maxBytes||0)){p.value=i(`数据文件超过导入大小限制`);return}f.value=`uploading`,v=new AbortController;try{await u();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":s.value},body:n,signal:v.signal});if(e.status===401)throw l(),Error(i(`请先登录管理台`));let t=await e.json().catch(()=>({}));if(!e.ok)throw Error(t.error||i(`数据上传失败`));f.value=`checking`;let r=await T(t.id);g&&(c.value=r)}catch(e){g&&(p.value=e.message)}finally{v=null,g&&(f.value=``)}}}async function k(){if(c.value&&!y.value)try{await M(`/storage/transfer/jobs/`+c.value.id,`DELETE`),c.value=null}catch(e){p.value=e.message}}async function A(){if(!c.value||y.value||!await n(i(`用这份数据替换当前数据,并保留导入前快照。实例将重启,导入后自动回复关闭。本机管理密码与 QQ 连接配置保持不变。`),{title:i(`确认导入数据`),confirmText:i(`导入并重启`),danger:!0}))return;f.value=`restarting`,p.value=``;let e=c.value.id;try{if(await M(`/storage/transfer/import`,`POST`,{id:e}),await T(e,!0),!g)return;D(),location.reload()}catch(e){g&&(p.value=e.message)}finally{g&&(f.value=``)}}return x(async()=>{try{o.value=await M(`/storage/transfer`)}catch(e){g&&(p.value=e.message)}}),I(()=>{g=!1,v?.abort()}),(e,n)=>o.value?.available?(B(),_(`section`,yr,[a(`span`,br,r(t(i)(`DATA · 导入与导出`)),1),a(`h2`,xr,r(t(i)(`带上记忆,继续生活。`)),1),a(`p`,Sr,r(t(i)(`导出数据库内的聊天、记忆、待办、作品、知识与设置。插件文件、知识库原始文件和本机 .env 不在数据包中。`)),1),a(`p`,Cr,r(t(i)(`数据包包含私聊内容和模型设置中的密钥,请存放在你信任的位置。导入前会校验,确认后才替换当前数据。`)),1),a(`div`,wr,[a(`button`,{class:`primary`,type:`button`,disabled:y.value,onClick:E},r(t(i)(`导出数据包`)),9,Tr),a(`button`,{type:`button`,disabled:y.value,onClick:n[0]||=e=>d.value?.click()},r(t(i)(`选择导入文件`)),9,Er),a(`input`,{ref_key:`input`,ref:d,class:`transfer-file`,type:`file`,accept:`.luckytri,.db,.sqlite,.sqlite3`,"aria-label":t(i)(`导入数据文件`),onChange:O},null,40,Dr)]),a(`p`,Or,r(t(i)(`支持 .luckytri 数据包和已有 SQLite 备份,单个文件最多 {size} GiB。`,{size:(o.value.maxBytes/1073741824).toFixed(0)})),1),y.value?(B(),_(`p`,kr,r(b.value),1)):h(``,!0),p.value?(B(),_(`p`,Ar,r(p.value),1)):h(``,!0),o.value.lastImport?.status===`done`?(B(),_(`p`,jr,r(t(i)(`上次数据导入已完成,自动回复在导入时关闭。请检查连接、模型和待办后再开启;插件需重新安装或确认权限。`)),1)):h(``,!0),c.value?(B(),_(`div`,Mr,[a(`span`,Nr,r(t(i)(`校验通过 · 尚未导入`)),1),a(`h3`,null,r(c.value.summary?.name),1),a(`p`,Pr,r(c.value.name)+` · `+r(t(i)(`数据库版本 {from} → {to}`,{from:c.value.originalVersion,to:c.value.summary?.schemaVersion})),1),a(`div`,Fr,[(B(!0),_(m,null,S(C.value,([e,t])=>(B(),_(`div`,{key:e},[a(`b`,null,r(t),1),a(`span`,null,r(e),1)]))),128))]),a(`div`,Ir,[a(`button`,{class:`primary`,type:`button`,disabled:y.value,onClick:A},r(t(i)(`导入并重启`)),9,Lr),a(`button`,{type:`button`,disabled:y.value,onClick:k},r(t(i)(`取消导入`)),9,Rr)])])):h(``,!0)])):h(``,!0)}}),[[`__scopeId`,`data-v-ea16c0c1`]]),Br={class:`storage-page`},Vr={class:`card storage-overview`},Hr={class:`eyebrow`},Ur={key:0,class:`storage-metrics`},Wr={key:0,class:`storage-error`,role:`alert`},Gr={key:1,class:`storage-grid`},Kr={class:`card-head`},qr={class:`eyebrow`},Jr={class:`storage-check`},Yr={class:`storage-fields`},Xr=[`aria-label`],Zr=[`aria-label`],Qr=[`aria-label`],$r={class:`storage-note`},ei={key:0,class:`storage-note`},ti={key:1,class:`storage-error`},ni=[`disabled`],ri={class:`card storage-list`},ii={class:`card-head`},ai={class:`eyebrow`},oi={class:`storage-note`},si={class:`storage-actions`},ci=[`disabled`],li=[`disabled`],ui=[`disabled`],di={class:`storage-scroll`},fi=[`checked`,`disabled`,`aria-label`,`onChange`],pi={class:`storage-item`},mi={key:0,class:`storage-error`,role:`alert`},hi={class:`storage-footer`},gi=[`disabled`],_i=N(P({__name:`BackupManager`,setup(s){let c=G(null),l=G({enabled:!0,time:`04:30`,retainDays:14,keepFull:2}),u=G([]),d=G(!1),g=G(``),v=G([]),y=!0,b=e=>`${e.scope}:${e.name}`,w=R(()=>c.value?.entries.filter(e=>u.value.includes(b(e)))||[]),T=R(()=>w.value.reduce((e,t)=>e+t.bytes,0)),E=e=>e===0?`0 B`:e>=1073741824?`${(e/1073741824).toFixed(2)} GiB`:`${Math.max(.01,e/1048576).toFixed(2)} MiB`,D=e=>new Date(e).toLocaleString(o()),O=e=>({auto:i(`自动备份`),full:i(`完整备份`),migration:i(`迁移快照`),legacy:i(`旧版本备份`),snapshot:i(`升级前快照`),import:i(`导入前快照`)})[e];async function k(e=!1){try{g.value=``;let t=await M(`/storage/cleanup`);if(!y)return;if(c.value=t,e)l.value={...c.value.policy},u.value=[],z.dirty=!1;else{let e=new Set(c.value.entries.filter(e=>!e.protected).map(b));u.value=u.value.filter(t=>e.has(t))}}catch(e){y&&(g.value=e.message)}}function A(){z.dirty=!0}function j(e){let t=b(e);u.value=u.value.includes(t)?u.value.filter(e=>e!==t):[...u.value,t]}function N(){u.value=(c.value?.plan.items||[]).map(b)}function P(){u.value=(c.value?.entries||[]).filter(e=>e.kind===`full`&&!e.protected).map(b)}async function F(){if(!d.value){d.value=!0;try{let e=await M(`/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},z.dirty=!1,V(i(`备份整理规则已保存`))}catch(e){V(e.message,!0)}finally{d.value=!1}}}async function L(){if(!w.value.length||d.value)return;let e=w.value.map(({scope:e,name:t,bytes:n,modified:r})=>({scope:e,name:t,bytes:n,modified:r}));if(await n(i(`将清理选中的 {count} 份备份,释放约 {size}。这些历史恢复点清理后无法从本机找回。`,{count:e.length,size:E(T.value)}),{title:i(`清理所选备份`),confirmText:i(`清理所选`),danger:!0})){d.value=!0;try{let t=await M(`/storage/cleanup/manual`,`POST`,{items:e});v.value=t.failures||[];let n=new Set((t.failures||[]).map(e=>`${e.scope}:${e.name}`));u.value=u.value.filter(e=>n.has(e)),await k(),V(i(`已清理 {count} 份备份,释放 {size}`,{count:t.removed.length,size:E(t.bytes)})+(v.value.length?i(`;部分未清理,详情见列表`):``),v.value.length>0)}catch(e){V(e.message,!0),await k()}finally{d.value=!1}}}return x(()=>k(!0)),I(()=>{y=!1}),(n,o)=>(B(),_(`div`,Br,[a(`section`,Vr,[a(`span`,Hr,r(t(i)(`DATA · 数据与备份`)),1),a(`h2`,null,r(t(i)(`留住重要的,整理重复的。`)),1),a(`p`,null,r(t(i)(`这里管理历史备份。聊天、记忆和作品仍在正在运行的数据库里,不会被列入清理。`)),1),c.value?(B(),_(`div`,Ur,[a(`div`,null,[a(`b`,null,r(E(c.value.totalBytes)),1),a(`span`,null,r(t(i)(`可管理的历史备份`)),1)]),a(`div`,null,[a(`b`,null,r(c.value.entries.length),1),a(`span`,null,r(t(i)(`份数据库副本`)),1)]),a(`div`,null,[a(`b`,null,r(E(c.value.plan.bytes)),1),a(`span`,null,r(t(i)(`按当前规则可定时整理`)),1)])])):h(``,!0)]),g.value?(B(),_(`p`,Wr,r(g.value),1)):h(``,!0),C(zr),c.value?(B(),_(`div`,Gr,[a(`form`,{class:`card storage-policy`,onSubmit:f(F,[`prevent`])},[a(`div`,Kr,[a(`div`,null,[a(`span`,qr,r(t(i)(`定时整理`)),1),a(`h2`,null,r(t(i)(`每天给备份留一点空间`)),1)])]),a(`label`,Jr,[K(a(`input`,{"onUpdate:modelValue":o[0]||=e=>l.value.enabled=e,type:`checkbox`,onChange:A},null,544),[[q,l.value.enabled]]),e(r(t(i)(`启用定时整理`)),1)]),a(`div`,Yr,[a(`label`,null,[e(r(t(i)(`每天执行时间`)),1),K(a(`input`,{"onUpdate:modelValue":o[1]||=e=>l.value.time=e,type:`text`,inputmode:`numeric`,maxlength:`5`,placeholder:`04:30`,"aria-label":t(i)(`每天执行时间`),onInput:A},null,40,Xr),[[p,l.value.time]])]),a(`label`,null,[e(r(t(i)(`完整备份保留天数`)),1),K(a(`input`,{"onUpdate:modelValue":o[2]||=e=>l.value.retainDays=e,type:`number`,min:`1`,max:`3650`,"aria-label":t(i)(`完整备份保留天数`),onInput:A},null,40,Zr),[[p,l.value.retainDays,void 0,{number:!0}]])]),a(`label`,null,[e(r(t(i)(`完整备份最多保留份数`)),1),K(a(`input`,{"onUpdate:modelValue":o[3]||=e=>l.value.keepFull=e,type:`number`,min:`0`,max:`100`,"aria-label":t(i)(`完整备份最多保留份数`),onInput:A},null,40,Qr),[[p,l.value.keepFull,void 0,{number:!0}]])])]),a(`p`,$r,r(t(i)(`时间按服务器本地时区 {zone}。完整备份超过保留天数或数量上限便会定时整理;数量填 0 表示不保留完整备份。手动清理可选择完整备份和迁移快照,执行前会校验同一实例的近期自动恢复点。`,{zone:c.value.serverTimeZone})),1),c.value.last?(B(),_(`p`,ei,r(c.value.last.error&&c.value.last.removed===0?t(i)(`上次整理未执行:{error}`,{error:c.value.last.error}):t(i)(`上次整理:{time} · {count} 份 · {size}`,{time:D(c.value.last.at),count:c.value.last.removed,size:E(c.value.last.bytes)})),1)):h(``,!0),c.value.last?.error&&c.value.last.removed>0?(B(),_(`p`,ti,r(c.value.last.error),1)):h(``,!0),a(`button`,{class:`primary`,type:`submit`,disabled:d.value},r(d.value?t(i)(`处理中…`):t(i)(`保存整理规则`)),9,ni)],32),a(`section`,ri,[a(`div`,ii,[a(`div`,null,[a(`span`,ai,r(t(i)(`手动整理`)),1),a(`h2`,null,r(t(i)(`挑选历史恢复点`)),1)])]),a(`p`,oi,r(t(i)(`自动备份已有自己的轮换规则。迁移、旧版本和升级前快照只由你手动挑选;清理前会再次核对文件和恢复点。`)),1),a(`div`,si,[a(`button`,{type:`button`,disabled:d.value||!c.value.plan.items.length,onClick:N},r(t(i)(`选中规则建议`)),9,ci),a(`button`,{type:`button`,disabled:d.value,onClick:P},r(t(i)(`选中完整备份`)),9,li),a(`button`,{type:`button`,disabled:d.value||!u.value.length,onClick:o[4]||=e=>u.value=[]},r(t(i)(`取消选择`)),9,ui)]),a(`div`,di,[(B(!0),_(m,null,S(c.value.entries,e=>(B(),_(`label`,{key:b(e),class:W([`storage-row`,{protected:e.protected}])},[a(`input`,{type:`checkbox`,checked:u.value.includes(b(e)),disabled:d.value||e.protected||c.value.running,"aria-label":e.name,onChange:t=>j(e)},null,40,fi),a(`span`,pi,[a(`strong`,null,r(e.name),1),a(`small`,null,r(O(e.kind))+` · `+r(D(e.at))+` · `+r(e.manifest?t(i)(`有校验清单`):t(i)(`旧备份无清单`))+r(e.protected?` · `+(e.protectionReason||t(i)(`保留恢复点`)):``),1)]),a(`b`,null,r(E(e.bytes)),1)],2))),128))]),v.value.length?(B(),_(`div`,mi,[a(`p`,null,r(t(i)(`部分备份未清理,请刷新列表后重试`)),1),(B(!0),_(m,null,S(v.value,e=>(B(),_(`p`,{key:e.name},r(e.name)+` · `+r(e.error),1))),128))])):h(``,!0),a(`div`,hi,[a(`span`,null,r(t(i)(`已选 {count} 份 · 约 {size}`,{count:w.value.length,size:E(T.value)})),1),a(`button`,{class:`primary`,type:`button`,disabled:d.value||c.value.running||!w.value.length,onClick:L},r(t(i)(`清理所选`)),9,gi)])])])):h(``,!0)]))}}),[[`__scopeId`,`data-v-4593780e`]]),vi={class:`card password-settings`},yi={class:`card-head`},bi={class:`row`},xi=[`disabled`],Si=N(P({__name:`PasswordSettings`,setup(n){let o=G(``),s=G(``),c=G(``),l=G(!1);async function u(){if(!l.value){if(s.value!==c.value){V(i(`两次输入的密码不一致`),!0);return}l.value=!0;try{await y(`password`,{currentPassword:o.value,password:s.value}),o.value=s.value=c.value=``,V(i(`管理密码已更新`))}catch(e){V(e.message,!0)}finally{l.value=!1}}}return(n,d)=>(B(),_(`section`,vi,[a(`div`,yi,[a(`div`,null,[a(`h2`,null,r(t(i)(`管理密码`)),1),a(`p`,null,r(t(i)(`一个密码管理这个小世界。修改后,其他浏览器需要重新登录。`)),1)])]),a(`form`,{onSubmit:f(u,[`prevent`])},[a(`label`,null,[e(r(t(i)(`当前密码`)),1),K(a(`input`,{"onUpdate:modelValue":d[0]||=e=>o.value=e,name:`currentPassword`,type:`password`,autocomplete:`current-password`,required:``},null,512),[[p,o.value]])]),a(`label`,null,[e(r(t(i)(`新密码`)),1),K(a(`input`,{"onUpdate:modelValue":d[1]||=e=>s.value=e,name:`newPassword`,type:`password`,autocomplete:`new-password`,minlength:`8`,maxlength:`256`,required:``},null,512),[[p,s.value]])]),a(`label`,null,[e(r(t(i)(`确认密码`)),1),K(a(`input`,{"onUpdate:modelValue":d[2]||=e=>c.value=e,name:`confirmNewPassword`,type:`password`,autocomplete:`new-password`,minlength:`8`,maxlength:`256`,required:``},null,512),[[p,c.value]])]),a(`div`,bi,[a(`button`,{class:`primary`,disabled:l.value},r(t(i)(`修改密码`)),9,xi),a(`button`,{type:`button`,onClick:d[3]||=(...e)=>t(U)&&t(U)(...e)},r(t(i)(`退出登录`)),1)])],32)]))}}),[[`__scopeId`,`data-v-415fadf7`]]),Ci={class:`card update-settings`,"aria-labelledby":`update-title`},wi={id:`update-title`},Ti=[`disabled`],Ei={class:`kv`},Di={key:0,class:`muted`,role:`alert`},Oi={class:`muted small-text`},ki={key:1,class:`update-how stack tight`},Ai=[`disabled`],ji={key:1,role:`status`},Mi={key:2,class:`error-text`,role:`alert`},Ni={key:0,class:`error-text`},Pi={key:1,class:`error-text`},Fi={key:2,class:`error-text`},Ii={key:4,class:`muted`},Li={key:2,class:`update-how stack tight auto-update`},Ri={key:0},zi={key:1},Bi={key:2,class:`muted`,role:`status`},Vi={key:3,class:`muted small-text`},Hi={class:`update-links`},Ui=[`href`],Wi=[`href`],Gi=N(P({__name:`UpdateSettings`,setup(o){let s=G(null),l=G(!1),u=G(!1),d,f=!1,g=c({queued:A(`更新已开始`),downloading:A(`正在下载新版本…`),checking:A(`正在检查新程序…`),stopping:A(`正在保存当下并停止实例…`),backup:A(`正在保留更新前的校验备份…`),migrating:A(`正在整理并校验记忆与数据…`),restarting:A(`正在切换版本并重启…`),verifying:A(`正在确认新实例就绪…`),restoring:A(`正在恢复原版本和数据…`),done:A(`更新与重启已完成`),error:A(`更新未完成`)}),v=c({queued:A(`准备更新`),downloading:A(`下载新版本`),checking:A(`检查新程序`),stopping:A(`停止旧实例`),backup:A(`保存校验备份`),migrating:A(`迁移记忆与数据`),restarting:A(`切换并重启`),verifying:A(`检查新实例`),restoring:A(`恢复原版本`)});function y(e){return e&&![`done`,`error`].includes(e.status)}async function b(){if(!f){try{let e=await M(`/system/update`);if(s.value=e,e.operation?.status===`done`){u.value=!1,location.reload();return}u.value=!!y(e.operation)}catch{}u.value&&!f&&(d=setTimeout(b,1800))}}j(()=>{f=!0,clearTimeout(d)});let w=c({unchecked:A(`尚未检查更新`),available:A(`有新版本可用`),current:A(`已是最新发布版本`),ahead:A(`当前版本领先于 npm 发布版本`),unavailable:A(`暂时无法检查更新`)});x(async()=>{try{O(await M(`/system/update`)),u.value=!!y(s.value.operation),u.value&&(d=setTimeout(b,1800))}catch(e){V(e.message,!0)}});async function T(){if(!l.value){l.value=!0;try{s.value=await M(`/system/update/check`,`POST`,{})}catch(e){V(e.message,!0)}finally{l.value=!1}}}let E=G({enabled:!1,mode:`daily`,at:`04:00`,everyHours:24,install:`notify`,window:``}),D=c({current:A(`已是最新`),available:A(`发现新版本,已提醒`),started:A(`已开始自动更新`),failed:A(`自动更新失败`),"rolled-back":A(`更新失败,已恢复原版本`),deferred:A(`一直没有合适时机,本次放弃`),skipped:A(`该版本失败过,不再自动重试`),"check-failed":A(`检查失败`)});function O(e){s.value=e,e?.auto?.settings&&(E.value={...e.auto.settings})}async function k(){try{O(await M(`/system/update/auto`,`POST`,E.value)),V(i(`自动更新设置已保存`))}catch(e){V(e.message,!0)}}async function N(){if(!(u.value||l.value||s.value?.status!==`available`)&&await n(i(`更新到 {version} 并重启当前实例?先下载校验,再保留数据恢复点;启动失败时尝试恢复原版本。`,{version:s.value.latest}),{title:i(`更新并重启`),confirmText:i(`开始更新`)})){u.value=!0;try{s.value.operation=await M(`/system/update/install`,`POST`,{version:s.value.latest}),d=setTimeout(b,800)}catch(e){u.value=!1,V(e.message,!0)}}}return(n,o)=>(B(),_(`section`,Ci,[a(`header`,null,[a(`div`,null,[o[6]||=a(`span`,{class:`eyebrow`},`LUCKYTRI / VERSION`,-1),a(`h2`,wi,r(t(i)(`版本与更新`)),1)]),a(`button`,{disabled:l.value||u.value||!s.value,onClick:T},r(l.value?t(i)(`正在检查…`):t(i)(`检查更新`)),9,Ti)]),s.value?(B(),_(m,{key:0},[a(`p`,{class:W([`version-state`,{available:s.value.status===`available`}]),role:`status`},r(t(w)[s.value.status]||t(w).unchecked),3),a(`dl`,Ei,[a(`dt`,null,r(t(i)(`当前版本`)),1),a(`dd`,null,r(s.value.current),1),a(`dt`,null,r(t(i)(`npm 最新版本`)),1),a(`dd`,null,r(s.value.latest||`—`),1),a(`dt`,null,r(t(i)(`上次成功检查`)),1),a(`dd`,null,r(s.value.checkedAt?t(J)(s.value.checkedAt):`—`),1)]),s.value.error?(B(),_(`p`,Di,r(t(i)(`暂时无法连接 npm 或读取版本信息,请稍后重试。`)),1)):h(``,!0),a(`p`,Oi,r(t(i)(`点击时才检查,五分钟内复用结果。检查更新不会自动安装或重启。`)),1),s.value.status===`available`||s.value.operation?(B(),_(`div`,ki,[a(`p`,null,r(t(i)(`下载期间继续运行,切换前保留数据恢复点。更新完成后此页面会自动重新连接。`)),1),s.value.status===`available`?(B(),_(`button`,{key:0,class:`primary`,disabled:u.value||l.value,onClick:N},r(u.value?t(i)(`正在更新…`):t(i)(`更新并重启`)),9,Ai)):h(``,!0),s.value.operation?(B(),_(`p`,ji,r(t(g)[s.value.operation.status])+` · `+r(s.value.operation.version),1)):h(``,!0),s.value.operation?.error?(B(),_(`p`,Mi,r(s.value.operation.error),1)):h(``,!0),s.value.operation?.status===`error`?(B(),_(m,{key:3},[t(v)[s.value.operation.failedStage]?(B(),_(`p`,Ni,r(t(i)(`失败阶段:{stage}`,{stage:t(v)[s.value.operation.failedStage]})),1)):h(``,!0),s.value.operation.detail?(B(),_(`p`,Pi,r(s.value.operation.detail),1)):h(``,!0),s.value.operation.recoveryDetail?(B(),_(`p`,Fi,r(s.value.operation.recoveryDetail),1)):h(``,!0)],64)):h(``,!0),s.value.operation?.restored?(B(),_(`p`,Ii,r(t(i)(`已恢复原版本和更新前的数据。`)),1)):h(``,!0)])):h(``,!0),s.value.auto?(B(),_(`div`,Li,[C($,{modelValue:E.value.enabled,"onUpdate:modelValue":o[0]||=e=>E.value.enabled=e,name:`auto-update`,onChange:k},{default:H(()=>[a(`b`,null,r(t(i)(`自动检查更新`)),1),a(`small`,null,r(t(i)(`默认关闭。到点检查;自动安装会等 TA 不在聊天、没有备份或迁移时再进行,失败自动恢复原版本。`)),1)]),_:1},8,[`modelValue`]),E.value.enabled?(B(),_(m,{key:0},[a(`label`,null,[e(r(t(i)(`检查方式`))+` `,1),C(Y,{modelValue:E.value.mode,"onUpdate:modelValue":[o[1]||=e=>E.value.mode=e,k],"aria-label":t(i)(`检查方式`),options:[{value:`daily`,label:t(i)(`每天固定时间`)},{value:`interval`,label:t(i)(`每隔一段时间`)}]},null,8,[`modelValue`,`aria-label`,`options`])]),E.value.mode===`daily`?(B(),_(`label`,Ri,[e(r(t(i)(`检查时间`))+` `,1),K(a(`input`,{"onUpdate:modelValue":o[2]||=e=>E.value.at=e,type:`time`,onChange:k},null,544),[[p,E.value.at]])])):(B(),_(`label`,zi,[e(r(t(i)(`间隔`))+` `,1),C(Y,{modelValue:E.value.everyHours,"onUpdate:modelValue":[o[3]||=e=>E.value.everyHours=e,k],"aria-label":t(i)(`间隔`),options:[6,12,24,72].map(e=>({value:e,label:t(i)(`{hours} 小时`,{hours:e})}))},null,8,[`modelValue`,`aria-label`,`options`])])),a(`label`,null,[e(r(t(i)(`发现新版本时`))+` `,1),C(Y,{modelValue:E.value.install,"onUpdate:modelValue":[o[4]||=e=>E.value.install=e,k],"aria-label":t(i)(`发现新版本时`),disabled:s.value.installation!==`npm`,options:[{value:`notify`,label:t(i)(`只提醒`)},{value:`auto`,label:t(i)(`自动安全更新`)}]},null,8,[`modelValue`,`aria-label`,`disabled`,`options`])]),a(`label`,null,[e(r(t(i)(`允许更新的时段(可空,如 02:00-06:00)`))+` `,1),K(a(`input`,{"onUpdate:modelValue":o[5]||=e=>E.value.window=e,placeholder:`02:00-06:00`,onChange:k},null,544),[[p,E.value.window]])]),s.value.auto.waiting?(B(),_(`p`,Bi,r(t(i)(`等待合适时机:{reason}`,{reason:s.value.auto.waiting.reason||`—`})),1)):h(``,!0),s.value.auto.history.length?(B(),_(`ul`,Vi,[(B(!0),_(m,null,S(s.value.auto.history.slice(0,5),e=>(B(),_(`li`,{key:e.time},r(t(J)(e.time))+` · `+r(t(D)[e.result]||e.result)+` `+r(e.to?`· ${e.to}`:``),1))),128))])):h(``,!0)],64)):h(``,!0)])):h(``,!0),a(`nav`,Hi,[a(`a`,{href:s.value.npmUrl,target:`_blank`,rel:`noopener noreferrer`},`npm`,8,Ui),a(`a`,{href:s.value.releaseUrl,target:`_blank`,rel:`noopener noreferrer`},r(t(i)(`发布说明`))+` ↗`,9,Wi)])],64)):h(``,!0)]))}}),[[`__scopeId`,`data-v-7c071438`]]),Ki={class:`card stickers`},qi={class:`card-head`},Ji={class:`eyebrow`},Yi={class:`faint`},Xi={class:`toolbar`},Zi=[`placeholder`],Qi=[`placeholder`],$i={key:0,class:`faint`,"data-testid":`sticker-summary`},ea={key:1,class:`faint`,"data-testid":`sticker-progress`},ta={key:1,class:`grid`},na=[`onClick`],ra=[`src`,`alt`],ia={class:`caption`},aa={key:0,class:`badge`},oa={key:1,class:`badge gif`},sa={key:2,class:`editor card`,role:`dialog`},ca={class:`editor-head`},la=[`src`],ua={key:0,class:`danger`},da={class:`fields`},fa={class:`wide`},pa={class:`wide`},ma={class:`wide`},ha={class:`wide`},ga={class:`check`},_a={class:`save-bar`},va=N(P({__name:`StickerLibrary`,setup(o){let c=G([]),d=G([]),v=G(``),y=G(``),b=G(``),w=G(!0),T=G(null),E=e=>/\.zip$/i.test(e.name)||/zip/.test(e.type),D=G(``),O=G(null),k=G({}),A=G(),N=R(()=>c.value.filter(e=>e.status===`pending`).length);async function P(){let e=new URLSearchParams;v.value.trim()&&e.set(`q`,v.value.trim()),y.value&&e.set(`category`,y.value);let t=await M(`/core/stickers?${e}`);c.value=t.items,d.value=t.categories}let F;function I(){clearTimeout(F),N.value&&(F=setTimeout(()=>P().then(I).catch(()=>{}),3e3))}x(()=>P().then(I).catch(e=>V(e.message,!0))),j(()=>clearTimeout(F));async function L(e){let t=Array.from(e||[]);if(!t.length)return;let n=0,r=0;await u();let a=0,o=0;for(let e of t){if(E(e)){D.value=i(`正在导入压缩包 {name}`,{name:e.name});let t=new URLSearchParams({folderCategory:w.value?`1`:`0`,job:`${Date.now()}-${Math.random().toString(36).slice(2)}`}),c=setInterval(async()=>{let n=await fetch(`/api/core/stickers/upload-zip/progress?job=${t.get(`job`)}`,{credentials:`same-origin`}).then(e=>e.json()).catch(()=>null);n?.phase===`receiving`&&n.size?D.value=i(`正在上传压缩包 {name} {pct}%`,{name:e.name,pct:Math.floor(n.received/n.size*100)}):n?.phase===`importing`&&(D.value=i(`正在导入压缩包 {name} {done}/{total}`,{name:e.name,done:n.done,total:n.total}))},1e3);b.value.trim()&&t.set(`category`,b.value.trim());let u=await fetch(`/api/core/stickers/upload-zip?${t}`,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/zip`,"X-LuckyTri-Locale":s.value},body:e}).finally(()=>clearInterval(c));if(u.status===401){l();break}let d=await u.json().catch(()=>({}));if(!u.ok){r++,V(`${e.name}:${d.error||i(`上传失败`)}`,!0);continue}n+=d.imported,a+=d.duplicates,o+=d.skipped.length,r+=d.failed.length;continue}D.value=i(`正在上传 {done}/{total}`,{done:n,total:t.length});let c=new URLSearchParams({name:e.name});b.value.trim()&&c.set(`category`,b.value.trim());let u=await fetch(`/api/core/stickers/upload?${c}`,{method:`POST`,credentials:`same-origin`,headers:{"Content-Type":`application/octet-stream`,"X-LuckyTri-Locale":s.value},body:e});if(u.status===401){l();break}let d=await u.json().catch(()=>({}));u.ok?d.duplicate?a++:n++:(r++,V(`${e.name}:${d.error||i(`上传失败`)}`,!0))}D.value=``,V(i(`已上传 {done} 张,正在自动识别含义`,{done:n})+(a?i(`,{duplicates} 张重复已跳过`,{duplicates:a}):``)+(o?i(`,{skipped} 个非图片或过大已跳过`,{skipped:o}):``)+(r?i(`,{failed} 张未通过`,{failed:r}):``)),T.value={done:n,duplicates:a,skipped:o,failed:r},A.value&&(A.value.value=``),await P(),I()}function ee(e){e.preventDefault(),L(e.dataTransfer?.files||null)}function z(e){O.value=e,k.value={...e,tags:e.tags.join(`、`)}}async function U(){if(O.value)try{await M(`/core/stickers/${O.value.id}`,`PATCH`,{name:k.value.name,category:k.value.category,tags:k.value.tags,description:k.value.description,words:k.value.words,emotion:k.value.emotion,meaning:k.value.meaning,scenes:k.value.scenes,enabled:k.value.enabled}),O.value=null,V(i(`已保存`)),await P()}catch(e){V(e.message,!0)}}async function J(e){await M(`/core/stickers/${e.id}/describe`,`POST`,{}),V(i(`已重新识别,稍后刷新查看`)),await P(),I()}async function ne(e){await n(i(`删除这张表情?它和大家一起用过的记录也会一并删除。`),{title:i(`删除表情`),confirmText:i(`删除`),cancelText:i(`取消`)})&&(await M(`/core/stickers/${e.id}`,`DELETE`),O.value=null,await P())}let re=e=>e.status===`pending`?i(`识别中`):e.status===`failed`?i(`识别失败`):e.status===`manual`?i(`待手动填写`):``;return(n,o)=>(B(),_(`section`,Ki,[a(`div`,qi,[a(`div`,null,[a(`span`,Ji,r(t(i)(`表情包`)),1),a(`h2`,null,r(t(i)(`TA 收藏的表情`)),1),a(`p`,Yi,r(t(i)(`上传后会自动看懂画面、文字、情绪和用法,你可以随时修改。TA 只在觉得合适时才用,也会记得和谁用过、对方怎么回应。`)),1)])]),a(`div`,{class:`drop`,"data-testid":`sticker-drop`,onDragover:o[1]||=f(()=>{},[`prevent`]),onDrop:ee,onClick:o[2]||=e=>A.value?.click()},[a(`b`,null,r(D.value||t(i)(`拖入或点击选择图片或 ZIP,可一次选多张`)),1),a(`small`,null,r(t(i)(`PNG、JPEG、GIF、WebP,每张不超过 4MB;ZIP 会自动解压导入`)),1),a(`input`,{ref_key:`fileInput`,ref:A,type:`file`,accept:`image/png,image/jpeg,image/gif,image/webp,.zip,application/zip`,multiple:``,hidden:``,onChange:o[0]||=e=>L(e.target.files)},null,544)],32),a(`div`,Xi,[K(a(`input`,{"onUpdate:modelValue":o[3]||=e=>v.value=e,type:`search`,placeholder:t(i)(`搜索描述、标签、情绪…`),onInput:o[4]||=e=>P()},null,40,Zi),[[p,v.value]]),C(Y,{modelValue:y.value,"onUpdate:modelValue":[o[5]||=e=>y.value=e,o[6]||=e=>P()],"aria-label":t(i)(`全部分类`),options:[{value:``,label:t(i)(`全部分类`)},...d.value.map(e=>({value:e.category,label:`${e.category} · ${e.n}`}))]},null,8,[`modelValue`,`aria-label`,`options`]),K(a(`input`,{"onUpdate:modelValue":o[7]||=e=>b.value=e,placeholder:t(i)(`上传到分类(可选)`)},null,8,Qi),[[p,b.value]]),C($,{modelValue:w.value,"onUpdate:modelValue":o[8]||=e=>w.value=e,class:`faint folder-cat`},{default:H(()=>[e(r(t(i)(`ZIP 里的文件夹名作分类`)),1)]),_:1},8,[`modelValue`]),T.value?(B(),_(`small`,$i,r(t(i)(`导入 {done} · 重复 {duplicates} · 跳过 {skipped} · 失败 {failed}`,T.value)),1)):h(``,!0),N.value?(B(),_(`small`,ea,r(t(i)(`{n} 张识别中`,{n:N.value})),1)):h(``,!0)]),c.value.length?(B(),_(`div`,ta,[(B(!0),_(m,null,S(c.value,e=>(B(),_(`button`,{key:e.id,class:W([`tile`,{off:!e.enabled}]),type:`button`,onClick:t=>z(e)},[a(`img`,{src:`/api/core/stickers/${e.id}/image`,alt:e.description||e.name,loading:`lazy`},null,8,ra),a(`span`,ia,r(e.meaning||e.description||e.name),1),re(e)?(B(),_(`span`,aa,r(re(e)),1)):h(``,!0),e.animated?(B(),_(`span`,oa,`GIF`)):h(``,!0)],10,na))),128))])):(B(),g(te,{key:0,title:t(i)(`还没有表情`),text:t(i)(`上传几张常用的表情,TA 就能在聊天里自己挑着用。`)},null,8,[`title`,`text`])),O.value?(B(),_(`div`,sa,[a(`div`,ca,[a(`img`,{src:`/api/core/stickers/${O.value.id}/image`,alt:``},null,8,la),a(`div`,null,[a(`b`,null,r(O.value.name||t(i)(`未命名`)),1),O.value.error?(B(),_(`small`,ua,r(O.value.error),1)):h(``,!0)])]),a(`div`,da,[a(`label`,null,[e(r(t(i)(`名称`)),1),K(a(`input`,{"onUpdate:modelValue":o[9]||=e=>k.value.name=e,maxlength:`60`},null,512),[[p,k.value.name]])]),a(`label`,null,[e(r(t(i)(`分类`)),1),K(a(`input`,{"onUpdate:modelValue":o[10]||=e=>k.value.category=e,maxlength:`24`},null,512),[[p,k.value.category]])]),a(`label`,fa,[e(r(t(i)(`标签(用顿号或逗号分隔)`)),1),K(a(`input`,{"onUpdate:modelValue":o[11]||=e=>k.value.tags=e},null,512),[[p,k.value.tags]])]),a(`label`,pa,[e(r(t(i)(`画面`)),1),K(a(`textarea`,{"onUpdate:modelValue":o[12]||=e=>k.value.description=e,rows:`2`},null,512),[[p,k.value.description]])]),a(`label`,null,[e(r(t(i)(`图上的字`)),1),K(a(`input`,{"onUpdate:modelValue":o[13]||=e=>k.value.words=e,maxlength:`100`},null,512),[[p,k.value.words]])]),a(`label`,null,[e(r(t(i)(`情绪`)),1),K(a(`input`,{"onUpdate:modelValue":o[14]||=e=>k.value.emotion=e,maxlength:`40`},null,512),[[p,k.value.emotion]])]),a(`label`,ma,[e(r(t(i)(`意思或梗`)),1),K(a(`textarea`,{"onUpdate:modelValue":o[15]||=e=>k.value.meaning=e,rows:`2`},null,512),[[p,k.value.meaning]])]),a(`label`,ha,[e(r(t(i)(`适合的情境`)),1),K(a(`textarea`,{"onUpdate:modelValue":o[16]||=e=>k.value.scenes=e,rows:`2`},null,512),[[p,k.value.scenes]])]),a(`label`,ga,[K(a(`input`,{"onUpdate:modelValue":o[17]||=e=>k.value.enabled=e,type:`checkbox`},null,512),[[q,k.value.enabled]]),e(r(t(i)(`TA 可以使用这张`)),1)])]),a(`div`,_a,[a(`button`,{class:`primary`,type:`button`,onClick:U},r(t(i)(`保存`)),1),a(`button`,{type:`button`,onClick:o[18]||=e=>J(O.value)},r(t(i)(`重新识别`)),1),a(`button`,{type:`button`,class:`danger`,onClick:o[19]||=e=>ne(O.value)},r(t(i)(`删除`)),1),a(`button`,{type:`button`,onClick:o[20]||=e=>O.value=null},r(t(i)(`关闭`)),1)])])):h(``,!0)]))}}),[[`__scopeId`,`data-v-b2565288`]]),ya={class:`card-head`},ba={class:`eyebrow`},xa={class:`fields`},Sa={class:`faint`},Ca={class:`faint`},wa={class:`faint`},Ta={class:`faint`},Ea={class:`switches`},Da={class:`save-bar`},Oa={class:`primary`,type:`submit`},ka=N(P({__name:`MediaSettings`,setup(n){let o=G(2048),s=G(3),c=G(20),l=G(!0),u=G(``);x(async()=>{try{let e=await M(`/core/media-settings`);o.value=e.visionMaxSide,s.value=e.visionMaxMB,c.value=e.visionSourceMaxMB??20;let t=await M(`/core/stickers`);l.value=t.settings.enabled!==!1,u.value=t.settings.taggingModelId||``}catch(e){V(e.message,!0)}});async function d(){try{await M(`/core/media-settings`,`PUT`,{visionMaxSide:Number(o.value),visionMaxMB:Number(s.value),visionSourceMaxMB:Number(c.value)}),await M(`/core/stickers-settings`,`PUT`,{enabled:l.value,taggingModelId:u.value}),z.dirty=!1,V(i(`已保存并应用`))}catch(e){V(e.message,!0)}}return(n,m)=>(B(),_(`form`,{class:`card media`,"data-testid":`media-settings`,onSubmit:f(d,[`prevent`]),onChange:m[5]||=e=>t(z).dirty=!0},[a(`div`,ya,[a(`div`,null,[a(`span`,ba,r(t(i)(`图片与表情`)),1),a(`h2`,null,r(t(i)(`TA 怎样看图、用表情`)),1)])]),a(`div`,xa,[a(`label`,null,[e(r(t(i)(`可接收的图片大小上限(MB)`))+` `,1),K(a(`input`,{"onUpdate:modelValue":m[0]||=e=>c.value=e,type:`number`,min:`1`,max:`64`,step:`1`},null,512),[[p,c.value,void 0,{number:!0}]]),a(`small`,Sa,r(t(i)(`聊天里不超过这个大小的图片都会先缩小压缩再看。默认 20。`)),1)]),a(`label`,null,[e(r(t(i)(`图片理解的最长边(像素)`))+` `,1),K(a(`input`,{"onUpdate:modelValue":m[1]||=e=>o.value=e,type:`number`,min:`512`,max:`8192`,step:`64`},null,512),[[p,o.value,void 0,{number:!0}]]),a(`small`,Ca,r(t(i)(`更大的图会先缩小再交给视觉模型,避免大图失败或超时。默认 2048。`)),1)]),a(`label`,null,[e(r(t(i)(`图片理解的大小上限(MB)`))+` `,1),K(a(`input`,{"onUpdate:modelValue":m[2]||=e=>s.value=e,type:`number`,min:`0.5`,max:`4`,step:`0.5`},null,512),[[p,s.value,void 0,{number:!0}]]),a(`small`,wa,r(t(i)(`超过时会重新压缩。部分服务商对单张图片有更严格的限制。`)),1)]),a(`label`,null,[e(r(t(i)(`表情识别用的模型`))+` `,1),C(Y,{modelValue:u.value,"onUpdate:modelValue":m[3]||=e=>u.value=e,"aria-label":t(i)(`表情识别用的模型`),options:[{value:``,label:t(i)(`自动选择开启视觉的模型`)},...(t(z).core.models||[]).filter(e=>e.vision).map(e=>({value:e.id,label:e.label||e.model||e.id}))]},null,8,[`modelValue`,`aria-label`,`options`]),a(`small`,Ta,r(t(i)(`每张表情只识别一次,可选一个便宜的视觉模型。`)),1)])]),a(`div`,Ea,[C($,{modelValue:l.value,"onUpdate:modelValue":m[4]||=e=>l.value=e,name:`stickers`},{default:H(()=>[a(`b`,null,r(t(i)(`允许 TA 在聊天里用表情`)),1),a(`small`,null,r(t(i)(`关掉后表情库保留,TA 不再使用。`)),1)]),_:1},8,[`modelValue`])]),a(`div`,Da,[a(`button`,Oa,r(t(i)(`保存`)),1)])],32))}}),[[`__scopeId`,`data-v-91ea5b7f`]]),Aa={class:`card-head`},ja={class:`eyebrow`},Ma={class:`faint`},Na={class:`fields`},Pa=[`placeholder`],Fa={key:0},Ia={key:1},La=[`placeholder`],Ra={class:`fields`},za=[`placeholder`],Ba={key:0},Va={key:1},Ha={class:`switches`},Ua={class:`save-bar`},Wa={class:`primary`,type:`submit`},Ga=[`disabled`],Ka=N(P({__name:`VoiceSettings`,setup(n){let o=G(null),s=G(``),c=G(``),l=G(!1);x(async()=>{try{o.value=await M(`/core/voice`)}catch(e){V(e.message,!0)}});async function u(){try{o.value=await M(`/core/voice`,`PUT`,{...o.value,...s.value.trim()?{apiKey:s.value.trim()}:{},...c.value.trim()?{asrApiKey:c.value.trim()}:{}}),s.value=``,c.value=``,V(i(`已保存并应用`))}catch(e){V(e.message,!0)}}async function d(){l.value=!0;try{let e=await M(`/core/voice/test`,`POST`,{});new Audio(`data:audio/${e.format||`mp3`};base64,${e.base64}`).play()}catch(e){V(e.message,!0)}finally{l.value=!1}}return(n,m)=>o.value?(B(),_(`form`,{key:0,class:`card media`,onSubmit:f(u,[`prevent`])},[a(`div`,Aa,[a(`div`,null,[a(`span`,ja,r(t(i)(`语音`)),1),a(`h2`,null,r(t(i)(`TA 的声音`)),1)])]),a(`p`,Ma,r(t(i)(`配好语音服务后才能打开。打开只是“可以”:要不要用语音、要不要唱歌,由 TA 自己决定。`)),1),a(`div`,Na,[a(`label`,null,[e(r(t(i)(`协议`))+` `,1),C(Y,{modelValue:o.value.protocol,"onUpdate:modelValue":m[0]||=e=>o.value.protocol=e,"aria-label":t(i)(`协议`),options:[{value:`volc-openspeech-v3`,label:t(i)(`火山语音 v3(Agent Plan)`)},{value:`openai-audio`,label:t(i)(`OpenAI 兼容 /audio/speech`)}]},null,8,[`modelValue`,`aria-label`,`options`])]),a(`label`,null,[e(r(t(i)(`服务地址`)),1),K(a(`input`,{"onUpdate:modelValue":m[1]||=e=>o.value.baseUrl=e},null,512),[[p,o.value.baseUrl]])]),a(`label`,null,[e(r(t(i)(`API Key`))+` `,1),K(a(`input`,{"onUpdate:modelValue":m[2]||=e=>s.value=e,type:`password`,autocomplete:`off`,placeholder:o.value.hasApiKey?t(i)(`已保存,留空不变`):``},null,8,Pa),[[p,s.value]])]),o.value.protocol===`volc-openspeech-v3`?(B(),_(`label`,Fa,[e(r(t(i)(`资源 ID`)),1),K(a(`input`,{"onUpdate:modelValue":m[3]||=e=>o.value.resourceId=e},null,512),[[p,o.value.resourceId]])])):(B(),_(`label`,Ia,[e(r(t(i)(`模型`)),1),K(a(`input`,{"onUpdate:modelValue":m[4]||=e=>o.value.model=e},null,512),[[p,o.value.model]])])),a(`label`,null,[e(r(t(i)(`TA 的音色`)),1),K(a(`input`,{"onUpdate:modelValue":m[5]||=e=>o.value.speaker=e},null,512),[[p,o.value.speaker]])]),a(`label`,null,[e(r(t(i)(`声音的样子(可选)`))+` `,1),K(a(`input`,{"onUpdate:modelValue":m[6]||=e=>o.value.style=e,maxlength:`200`,placeholder:t(i)(`例如:轻快、带点笑意`)},null,8,La),[[p,o.value.style]])])]),a(`h3`,null,r(t(i)(`听语音`)),1),a(`div`,Ra,[a(`label`,null,[e(r(t(i)(`识别协议`))+` `,1),C(Y,{modelValue:o.value.asrProtocol,"onUpdate:modelValue":m[7]||=e=>o.value.asrProtocol=e,"aria-label":t(i)(`识别协议`),options:[{value:`volc-plan-sauc`,label:t(i)(`火山语音识别(Agent Plan)`)},{value:`volc-flash`,label:t(i)(`火山录音文件极速版`)},{value:`openai-audio`,label:t(i)(`OpenAI 兼容 /audio/transcriptions`)}]},null,8,[`modelValue`,`aria-label`,`options`])]),a(`label`,null,[e(r(t(i)(`识别服务地址`)),1),K(a(`input`,{"onUpdate:modelValue":m[8]||=e=>o.value.asrBaseUrl=e},null,512),[[p,o.value.asrBaseUrl]])]),a(`label`,null,[e(r(t(i)(`识别 API Key`))+` `,1),K(a(`input`,{"onUpdate:modelValue":m[9]||=e=>c.value=e,type:`password`,autocomplete:`off`,placeholder:o.value.hasAsrApiKey?t(i)(`已保存,留空不变`):t(i)(`留空则用上面的 Key`)},null,8,za),[[p,c.value]])]),o.value.asrProtocol===`openai-audio`?(B(),_(`label`,Ba,[e(r(t(i)(`识别模型`)),1),K(a(`input`,{"onUpdate:modelValue":m[10]||=e=>o.value.asrModel=e},null,512),[[p,o.value.asrModel]])])):(B(),_(`label`,Va,[e(r(t(i)(`识别资源 ID`)),1),K(a(`input`,{"onUpdate:modelValue":m[11]||=e=>o.value.asrResourceId=e},null,512),[[p,o.value.asrResourceId]])]))]),a(`div`,Ha,[C($,{modelValue:o.value.listen,"onUpdate:modelValue":m[12]||=e=>o.value.listen=e,name:`listen`,disabled:!o.value.hearingReady},{default:H(()=>[a(`b`,null,r(t(i)(`听懂别人发来的语音`)),1),a(`small`,null,r(t(i)(`默认关闭;打开后语音会先转成文字再给 TA 看。`)),1)]),_:1},8,[`modelValue`,`disabled`]),C($,{modelValue:o.value.enabled,"onUpdate:modelValue":m[13]||=e=>o.value.enabled=e,name:`voice`,disabled:!o.value.ready},{default:H(()=>[a(`b`,null,r(t(i)(`允许 TA 发语音`)),1),a(`small`,null,r(t(i)(`默认关闭;没有可用语音服务时保持关闭。`)),1)]),_:1},8,[`modelValue`,`disabled`])]),a(`div`,Ua,[a(`button`,Wa,r(t(i)(`保存`)),1),a(`button`,{type:`button`,disabled:!o.value.ready||l.value,onClick:d},r(l.value?t(i)(`正在合成…`):t(i)(`试听`)),9,Ga)])],32)):h(``,!0)}}),[[`__scopeId`,`data-v-6d373426`]]),qa={class:`page system`},Ja={class:`system-intro`},Ya={class:`eyebrow`},Xa={class:`system-status`},Za=N(P({__name:`SystemPage`,setup(o){let s=[`connect`,`models`,`stickers`,`settings`,`storage`],c=e=>e===`runtime`?`settings`:e===`search`?`models`:e,l=G(s.includes(c(z.sub))?c(z.sub):`connect`);async function u(e){e!==l.value&&(!z.dirty||await n(i(`当前设置还没保存,离开这个分区吗?`),{title:i(`未保存的修改`),confirmText:i(`放弃修改`),cancelText:i(`继续编辑`)}))&&(z.dirty=!1,l.value=e)}return E(l,e=>F(e)),E(()=>z.sub,e=>{s.includes(c(e))&&(l.value=c(e))}),(n,o)=>(B(),_(`div`,qa,[a(`header`,Ja,[a(`div`,null,[a(`span`,Ya,r(t(i)(`THE WORLD AROUND HER · 系统`)),1),a(`h1`,null,[e(r(t(i)(`让她与世界,`)),1),a(`em`,null,r(t(i)(`温柔相连。`)),1)]),a(`p`,null,r(t(i)(`连接、模型与运行方式都在这里。每一处改变,都可以看见结果。`)),1)]),a(`span`,Xa,[a(`i`,{class:W({off:!t(z).health.connection?.online})},null,2),e(` `+r(t(z).health.connection?.online?t(i)(`正在与 QQ 相连`):t(i)(`等待 QQ 连接`)),1)])]),C(ie,{"model-value":l.value,"onUpdate:modelValue":u,label:t(i)(`系统的分区`),items:[{key:`connect`,label:t(i)(`连接 QQ`)},{key:`models`,label:t(i)(`模型库`)},{key:`stickers`,label:t(i)(`表情包`)},{key:`settings`,label:t(i)(`各项设置`)},{key:`storage`,label:t(i)(`数据与备份`)}]},null,8,[`model-value`,`label`,`items`]),l.value===`connect`?(B(),g(We,{key:0,onOpen:u})):l.value===`models`?(B(),_(m,{key:1},[C(Ln),C(vr)],64)):l.value===`stickers`?(B(),g(va,{key:2})):l.value===`settings`?(B(),_(m,{key:3},[C(Yn),C(ka),C(Ka),C(Gi),C(Si)],64)):(B(),g(_i,{key:4}))]))}}),[[`__scopeId`,`data-v-5234ea2c`]]);export{Za as default};
|