dsh-tiddlywiki 0.28.2 → 0.28.3

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/lib/client.js CHANGED
@@ -15,6 +15,9 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});var e=Object.
15
15
  }
16
16
  .dsh-tw-entry:hover { background: var(--dsw-alias-interactive-bg-hover, rgba(128,128,128,.12)); color: var(--dsw-alias-label-primary, inherit); }
17
17
  .dsh-tw-entry[data-active="true"] { background: var(--dsw-alias-interactive-bg-active, rgba(128,128,128,.18)); color: var(--dsw-alias-label-primary, inherit); font-weight: 500; }
18
+ /* 多库(v0.28.2):每库一个入口行,当前焦点库加一条左侧标线,和「面板正打开哪个库」区分开
19
+ —— 面板是同一个,但焦点库决定它加载谁。 */
20
+ .dsh-tw-entry[data-focus="true"] { box-shadow: inset 2px 0 0 0 var(--dsw-alias-brand-primary, #3e63dd); }
18
21
  .dsh-tw-entry svg { flex: none; }
19
22
  .dsh-tw-entry .dsh-tw-entry-label { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
20
23
  /* Collapsed rail: the shell narrows the sidebar to a 56px icon rail (dual
@@ -492,8 +495,13 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
492
495
  /* ── 会话级知识库选择器(v0.28.0,同一个 conversation.input.dock 槽位)──
493
496
  与快速笔记按钮同区、纵向 flex 排列;只在"多于一个可见库"时渲染(组件自己返回
494
497
  null),所以单库安装这一整块都不存在。 */
498
+ /* ── 会话级知识库选择器(v0.28.0,同一个 conversation.input.dock 槽位)──
499
+ 与快速笔记按钮同区、纵向 flex 排列;只在"多于一个可见库"时渲染(组件自己返回
500
+ null),所以单库安装这一整块都不存在。
501
+ justify-content: flex-end 与 JS 测得的 paddingRight 一起把右缘对齐 composer
502
+ 输入框(见 client/dock-align.ts)—— 与 .dsh-tw-dock-note 同一套做法。 */
495
503
  .dsh-tw-scope-dock {
496
- display: flex; align-items: center; gap: 8px; flex-wrap: wrap;
504
+ display: flex; align-items: center; justify-content: flex-end; gap: 8px; flex-wrap: wrap;
497
505
  padding: 4px 8px 0; box-sizing: border-box; width: 100%; font-size: 12px;
498
506
  }
499
507
  .dsh-tw-scope-label { opacity: .7; }
@@ -506,6 +514,11 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
506
514
  .dsh-tw-scope-note { opacity: .75; }
507
515
  /* 快速笔记卡片的目标库选择(v0.28.0,R7):只在多库时出现。 */
508
516
  .dsh-tw-note-wiki { display: inline-flex; align-items: center; gap: 6px; font-size: 12px; }
517
+ /* ⚠️ hidden 属性在 CSS 里只是 display:none,**任何显式 display 都能盖掉它** ——
518
+ 上面那条 display:inline-flex 就盖掉了,于是单库模式下这个空下拉照样显示出来
519
+ (作者 2026-09-28 报障:"有个写入下拉,但是没有选项")。显式尊重 hidden,
520
+ 并把这一条写在后面(同优先级靠后者生效)。 */
521
+ .dsh-tw-note-wiki[hidden] { display: none; }
509
522
  .dsh-tw-note-wiki-label { opacity: .7; }
510
523
  .dsh-tw-note-wiki-select {
511
524
  border: 1px solid var(--dsw-alias-border-l2, rgba(0,0,0,.18));
@@ -513,6 +526,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
513
526
  padding: 2px 6px; border-radius: 999px; max-width: 220px;
514
527
  }
515
528
  .dsh-tw-note-wiki-hint { font-size: 12px; opacity: .75; }
529
+ .dsh-tw-note-wiki-hint[hidden] { display: none; }
516
530
 
517
531
  /* ── input-dock quick-note button(聊天输入框上方,conversation.input.dock)──
518
532
  该槽位渲染为「输入框上方的全宽条目」纵向 flex 排列(todo/cost-meter/goal/
@@ -767,7 +781,7 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
767
781
  .dsh-tw-note-card,
768
782
  .dsh-tw-fab-menu { animation: none; }
769
783
  }
770
- `;function d(){if(typeof document>`u`)return()=>{};let e=document.getElementById(l);e===null?(e=document.createElement(`style`),e.id=l,e.dataset.plugin=`dsh-tiddlywiki`,e.textContent=u,document.head.append(e)):e.textContent!==u&&(e.textContent=u);let t=String(Date.now())+`:`+Math.random().toString(36).slice(2);return e.dataset.instance=t,()=>{e?.dataset.instance===t&&e.remove()}}var f=class{open=!1;listeners=new Set;isOpen(){return this.open}toggle(){this.set(!this.open)}openPanel(){this.set(!0)}closePanel(){this.set(!1)}set(e){if(this.open!==e){this.open=e;for(let t of[...this.listeners])t(e)}}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}};const p=`/dsh-tiddlywiki`,m=`${p}/tw/`,h=`${p}/status`,g=`${p}/get`,_=`${p}/render`,v=`${p}/note`,y=`${p}/edit`,b=`${p}/tags`,x=`${p}/recent`,S=`${p}/search`,ee=`${p}/upload`,te=`${p}/sync`,ne=`${p}/restart`,C=`${p}/session/summary`,re=`${p}/admin/state`,ie=`${p}/admin/prompt`,w=`${p}/admin/info`,ae=`${p}/admin/config`,T=`${p}/admin/restart`,oe=`${p}/admin/seeds`,se=`${p}/admin/seeds/run`,ce=`${p}/admin/seeds/remove`,le=`${p}/admin/wiki/location`,ue=`${p}/admin/wiki/switch`,de=`${p}/admin/wiki/reset`,fe=`${p}/admin/wikis`,E=`${p}/session/wiki`;function pe(e,t){let n=typeof location>`u`?``:location.protocol,r=typeof location>`u`?void 0:location.origin;return n!==`http:`&&n!==`https:`&&typeof t==`string`&&t.length>0?t:new URL(e,r).href}function me(e,t,n,r){if(e!==`multi`||typeof t!=`string`||t.length===0)return{relative:n,...r===void 0?{}:{absolute:r}};let i=`${encodeURIComponent(t)}/`;return{relative:`${n}${i}`,...r===void 0?{}:{absolute:`${r}${i}`}}}function he(e,t){return typeof t!=`string`||t.length===0?e:`${e}${e.includes(`?`)?`&`:`?`}wiki=${encodeURIComponent(t)}`}function ge(e,t){if(e===null||e.ok!==!0)return{ok:!1,message:e?.error??e?.message??`HTTP ${t}`};let n=``;return typeof e.push==`string`&&e.push.length>0&&e.push!==`nothing to commit`&&(n=`(${e.push})`),e.changed===!0&&(n+=e.restarted===!0?`,TW 已重启`:`,TW 未自动重启`,typeof e.restartError==`string`&&e.restartError.length>0&&(n+=`(${e.restartError})`)),{ok:!0,message:`${e.message??`OK`}${n}`}}let _e;function ve(){if(_e!==void 0&&Date.now()-_e.at<2e3)return _e.value;let e=(async()=>{try{let e=await fetch(h,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}})();return _e={at:Date.now(),value:e},e.then(t=>{t===null&&_e?.value===e&&(_e=void 0)}),e}function ye(){_e=void 0}const be={showQuickNoteDock:!0,quickNoteMode:`native`,sidebarLabel:`TiddlyWiki`,tabLabel:`知识库`,showSessionTab:!0,showRightbarTab:!0,showQuickNote:!0,showPanelStatus:!0,showSyncButton:!0};let xe;const Se=new Set;function Ce(e){return Se.add(e),()=>{Se.delete(e)}}function we(){xe=void 0,ye();for(let e of[...Se])e()}function Te(){if(xe!==void 0&&Date.now()-xe.at<15e3)return xe.value;let e=(async()=>{let e=await ve(),t=e?.ui;return e===null||t===void 0?be:{showQuickNoteDock:t.showQuickNoteDock!==!1,quickNoteMode:t.quickNoteMode===`card`?`card`:`native`,sidebarLabel:typeof t.sidebarLabel==`string`&&t.sidebarLabel.trim().length>0?t.sidebarLabel.trim():`TiddlyWiki`,tabLabel:typeof t.tabLabel==`string`&&t.tabLabel.trim().length>0?t.tabLabel.trim():`知识库`,showSessionTab:t.showSessionTab!==!1,showRightbarTab:t.showRightbarTab!==!1,showQuickNote:t.showQuickNote!==!1,showPanelStatus:t.showPanelStatus!==!1,showSyncButton:t.showSyncButton!==!1}})();return xe={at:Date.now(),value:e},e}function Ee(){let e=document.querySelector(`[data-pane="sidebar"], [class*="sidebarCol"], .dshDesktopUpstreamSidebar, .dshDesktopSidebarSurface`);if(e!==null)return e.querySelector(`[class*="logoRow"]`)?.parentElement??e.firstElementChild}function De(e){let t=e.querySelector(`button[class*="newSession"]`);if(t!==null)return t;for(let t of e.children)if(t instanceof HTMLButtonElement&&!t.matches(`[data-dsh-tw-entry]`))return t;let n=e.querySelector(`button[aria-label="新建会话"], button[aria-label="New Session"], button[aria-label*="新会话"], button[aria-label*="new session" i]`);return n===null?Array.from(e.querySelectorAll(`button`)).find(e=>!e.matches(`[data-dsh-tw-entry]`)&&/新会话|新建会话|new session/i.test(e.textContent??``)):n}function Oe(e,t){let n=document.createElement(`button`);n.type=`button`,n.dataset.dshTwEntry=``,n.className=`dsh-tw-entry`,n.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let r=document.createElement(`span`);r.className=`dsh-tw-entry-icon`,r.innerHTML=`<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z"/><path d="M6 6h4M6 8.5h2.5"/></svg>`;let i=document.createElement(`span`);return i.className=`dsh-tw-entry-label`,i.textContent=t,n.append(r,i),n.addEventListener(`click`,()=>{e.toggle()}),{entry:n,labelEl:i}}function ke(e,t){try{let n=De(e);if(n===void 0)return!1;if(t.parentElement!==e){let r=n.closest(`[class*="logoRow"]`),i=r!==null&&r.parentElement===e?r:n,a=Array.from(e.children).filter(e=>e instanceof HTMLElement&&e.matches(`[data-dsh-tw-entry], [data-dsh-atb-entry], [data-dsh-taskboard-entry], [data-dsh-ssh-entry]`)),o=a.length>0?a[0]??null:i.nextElementSibling;o!==null&&o.parentElement!==e&&(o=null),e.insertBefore(t,o)}return!0}catch(e){return console.error(`[dsh-tiddlywiki] sidebar entry placement failed:`,e),!1}}function Ae(e){let{entry:t,labelEl:n}=Oe(e,`TiddlyWiki`),r=!1,i=async()=>{let e=await Te();r||e.sidebarLabel.length===0||(n.textContent=e.sidebarLabel,t.setAttribute(`aria-label`,e.sidebarLabel))};i();let a=Ce(()=>{i()}),o,s=!1,c,l=0,u=()=>{c!==void 0&&(clearInterval(c),c=void 0)},d=()=>{c===void 0&&(l=15,c=setInterval(()=>{f(),l--,(s||l<=0)&&u()},2e3))},f=()=>{if(o!==void 0&&!o.isConnected&&(m.disconnect(),o=void 0,s=!1,d()),s){if(document.body.contains(t))return;m.disconnect(),o=void 0,s=!1,d()}o??=Ee(),o!==void 0&&(s=ke(o,t),s&&(u(),m.observe(o,{childList:!0,subtree:!0})))},p=new MutationObserver(()=>{f()});p.observe(document.body,{childList:!0,subtree:!0});let m=new MutationObserver(()=>{if(o===void 0||!o.isConnected){s=!1,d(),f();return}o.contains(t)||(s=ke(o,t))});d();let h=()=>{e.isOpen()?t.dataset.active=`true`:delete t.dataset.active},g=e.subscribe(h);return h(),f(),()=>{r=!0,clearInterval(c),p.disconnect(),m.disconnect(),g(),a(),t.remove()}}const je=`dsh-tiddlywiki.focusWiki`;function Me(){try{let e=window.localStorage.getItem(je);return e!==null&&e.length>0?e:void 0}catch{return}}let Ne=Me();const Pe=new Set;function Fe(){return Ne}function Ie(e){if(e!==Ne){Ne=e;try{e===void 0?window.localStorage.removeItem(je):window.localStorage.setItem(je,e)}catch{}for(let t of[...Pe])t(e)}}function Le(e){return Pe.add(e),()=>{Pe.delete(e)}}function Re(e,t){return e.length===0||Ne!==void 0&&e.some(e=>e.id===Ne)?Ne:t!==void 0&&e.some(e=>e.id===t)?t:e[0]?.id}const ze=`$:/palettes/CupertinoDark`,Be=`$:/palettes/Vanilla`,Ve=`data-ds-dark-theme`,He=`$:/palette`,Ue=new Set,We=new WeakSet;let Ge=``,Ke=!0,qe=ze;function Je(){try{let e=document.documentElement,t=document.body;if(t!==null&&t.hasAttribute(Ve))return!0;if(e!==null){let t=e.style.getPropertyValue(`color-scheme`).trim().toLowerCase();if(t===`dark`)return!0;if(t===`light`)return!1}}catch{}try{return window.matchMedia(`(prefers-color-scheme: dark)`).matches}catch{return!1}}function Ye(e){try{let t=e.wiki.getTiddlerText(He);return typeof t==`string`&&t.trim().length>0?t.trim():Be}catch{return Be}}function Xe(e){try{let t=e.wiki.getTiddler(Ye(e))?.fields;return t!==void 0&&t[`color-scheme`]===`dark`}catch{return!1}}function Ze(e){try{let t=e.syncer;if(t?.tiddlerInfo===void 0)return;let n=e.wiki.getChangeCount(He),r=t.tiddlerInfo[He];r===void 0?t.tiddlerInfo[He]={changeCount:n}:r.changeCount=n}catch{}}function Qe(e){try{let t=e.syncer,n=t?.syncadaptor;if(t===void 0||n===void 0||We.has(t))return;let r=n.saveTiddler.bind(n);n.saveTiddler=(e,t)=>{if(Ke&&Ge.length>0&&e?.fields?.title===He&&e?.fields?.text===qe){t(null,{},0);return}r(e,t)},We.add(t)}catch{}}function $e(e,t){try{if(Ye(e)===t)return;e.wiki.setText(He,`text`,void 0,t),Ze(e)}catch{}}function et(e,t){let n=Ye(e);if(t){if(Xe(e))return;n!==qe&&(Ge=n),$e(e,qe)}else Xe(e)&&n===qe&&Ge.length>0&&$e(e,Ge)}function tt(e,t){try{let n=t.contentDocument?.documentElement;if(n==null)return;let r=Xe(e)?`dark`:`light`;n.style.getPropertyValue(`color-scheme`)!==r&&n.style.setProperty(`color-scheme`,r)}catch{}}function nt(e){try{let t=e.contentWindow?.$tw;if(t===void 0||t.wiki===void 0)return;Qe(t),Ke?et(t,Je()):et(t,!1),tt(t,e)}catch{}}function rt(e){let t=e.enabled!==!1,n=typeof e.darkPalette==`string`&&e.darkPalette.trim().length>0?e.darkPalette.trim():ze,r=t!==Ke||n!==qe;if(Ke=t,qe=n,r)for(let e of[...Ue])e()}function it(e){if(e===null)return()=>{};let t=()=>nt(e);Ue.add(t);let n=()=>t();e.addEventListener(`load`,n);let r=window.matchMedia(`(prefers-color-scheme: dark)`),i=()=>t();try{r.addEventListener(`change`,i)}catch{r.addListener?.(i)}let a;try{a=new MutationObserver(()=>t()),document.body!==null&&a.observe(document.body,{attributes:!0,attributeFilter:[Ve]}),document.documentElement!==null&&a.observe(document.documentElement,{attributes:!0,attributeFilter:[`style`]})}catch{a=void 0}let o=[150,600,1500,3e3].map(e=>window.setTimeout(t,e));return t(),()=>{Ue.delete(t),e.removeEventListener(`load`,n);for(let e of o)window.clearTimeout(e);try{r.removeEventListener(`change`,i)}catch{r.removeListener?.(i)}try{a?.disconnect()}catch{}}}const at=`dsh-panel-activate`,ot=`dsh-tw-panel-reload`;let st=`知识库`;function ct(e){let t=typeof e==`string`?e.trim():``;t.length>0&&(st=t)}function lt(){return st}async function ut(){try{return(await fetch(ne,{method:`POST`,signal:AbortSignal.timeout(8e3)})).ok}catch{return!1}}function dt({size:e=16,className:t}){return c.createElement(`svg`,{width:e,height:e,className:t,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.3,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":!0},c.createElement(`path`,{d:`M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z`}),c.createElement(`path`,{d:`M6 6h4M6 8.5h2.5`}))}function ft(e){let t=e.loaded;return t===void 0||t.length===0?null:t}function pt(e,t={}){let n=!1,r=!1,i=!1,a,o,s,c,l=new Set,u=0,d=!1,f=null,p,m=()=>{c!==void 0&&(window.clearTimeout(c),c=void 0)},h=e=>{if(o===void 0||s===void 0)return;o.hidden=!0,s.hidden=!1,s.replaceChildren();let t=document.createElement(`div`);t.textContent=`TiddlyWiki 服务不可用`;let n=document.createElement(`code`);n.textContent=e;let r=document.createElement(`button`);r.type=`button`,r.textContent=`重试`,r.addEventListener(`click`,()=>{r.disabled=!0,r.textContent=`重启中…`,ut().finally(()=>{b()})}),s.append(t,n,r)},g=()=>{if(o===void 0||s===void 0)return;o.hidden=!0,s.hidden=!1,s.replaceChildren();let e=document.createElement(`div`);e.textContent=`TiddlyWiki 服务正在启动…`,s.append(e)},_=e=>{o===void 0||s===void 0||(s.hidden=!0,o.hidden=!n,o.dataset.loaded!==e&&(o.dataset.loaded=e,d=!1,o.src=e))},v=()=>{if(f===null||o===void 0||!d)return;let e=f,t=o.contentWindow;if(t===null){y(e);return}let n=r=>{if(i||f!==e)return;let a=!1;try{let e=t;a=typeof e.$tw==`object`&&e.$tw!==null}catch{y(e);return}if(!a){if(r<40){let e=window.setTimeout(()=>{l.delete(e),n(r+1)},150);l.add(e);return}y(e);return}f=null;try{t.location.hash!==e&&(t.location.hash=e)}catch{y(e)}};n(0)},y=e=>{if(i||o===void 0)return;f===e&&(f=null);let t=ft(o.dataset);if(t===null)return;let n=`${t.split(`#`)[0]}${e}`;o.src!==n&&(o.src=n)},b=async()=>{m();let e=await ve();if(!i&&n){if(e===null){h(`无法访问 /dsh-tiddlywiki/status`);return}if(e.ui!==void 0&&(ct(e.ui.tabLabel??st),rt({enabled:e.ui.followDshTheme!==!1,darkPalette:e.ui.darkPalette})),e.status===`running`){if(u=0,typeof e.twProxy==`string`){let n=me(e.mode,t.wikiId?.(),e.twProxy,e.twProxyAbsolute);_(pe(n.relative,n.absolute))}else typeof e.url==`string`?_(e.url):h(`服务未返回编辑器地址`);return}if(e.status===`starting`){g(),u<30&&(u++,c=window.setTimeout(()=>{b()},1500));return}u=0,h(e.error??`服务状态:${e.status}`)}},x=()=>{if(o===void 0)return;let e=ft(o.dataset);e!==null&&(o.src=e)};document.addEventListener(ot,x);let S=Le(()=>{!i&&n&&b()});return{build:()=>{if(a!==void 0)return a;let t=document.createElement(`div`);if(t.className=e.view,e.viewDataset!==void 0)for(let[n,r]of Object.entries(e.viewDataset))t.dataset[n]=r;let r=document.createElement(`div`);r.className=e.frameWrap,e.frameWrapStyle!==void 0&&(r.style.cssText=e.frameWrapStyle);let i=document.createElement(`iframe`);i.className=e.frame,i.title=`TiddlyWiki`,i.hidden=!0,r.append(i);let c=document.createElement(`div`);return c.className=e.error,c.hidden=!0,t.append(r,c),a=t,o=i,s=c,i.addEventListener(`load`,()=>{d=!0,v()}),p=it(i),n&&b(),t},setVisible(e){i||(n=e,e&&!r&&(r=!0),o!==void 0&&(o.hidden=!e||ft(o.dataset)===null),e?b():(m(),u=0))},openTiddler(e){return i||!n?!1:(f=`#${encodeURIComponent(e)}`,r?v():(r=!0,b()),!0)},dispose(){if(!i){i=!0,document.removeEventListener(ot,x),S(),m();for(let e of l)window.clearTimeout(e);l.clear(),p?.(),a?.remove()}}}}function mt(){return{setVisible(){},openTiddler(){return!1},dispose(){}}}const ht=new Set;function gt(e){for(let t of ht)if(t.openTiddler(e))return!0;return!1}function _t(){ve().then(e=>{e?.ui!==void 0&&ct(e.ui.tabLabel??st)})}const vt={view:`dsh-tw-rightbar-view`,frameWrap:`dsh-tw-rightbar-frame-wrap`,frame:`dsh-tw-rightbar-frame`,error:`dsh-tw-rightbar-error`};function yt(e,t){if(t.aborted)return mt();let n=pt(vt,{wikiId:Fe});e.append(n.build());let r=!1,i=()=>a.dispose();t.addEventListener(`abort`,i,{once:!0});let a={setVisible(e){n.setVisible(e)},openTiddler(e){return n.openTiddler(e)},dispose(){r||(r=!0,ht.delete(a),t.removeEventListener(`abort`,i),n.dispose())}};return ht.add(a),a}const bt=[`[class*="centerCol"]`,`[data-pane="conversation"]`,`.dshDesktopConversationSurface`],xt=`data-dsh-tw-active`,St=[`data-dsh-atb-active`,`data-dsh-taskboard-active`,`data-dsh-ssh-active`],Ct=`dsh-tiddlywiki`,wt=`[data-dsh-panel-host]`,Tt={view:`dsh-tw-view`,viewDataset:{dshTwView:``},frameWrap:`dsh-tw-panel-frame-wrap`,frameWrapStyle:`flex:1;min-height:0;display:flex;flex-direction:column`,frame:`dsh-tw-panel-frame`,error:`dsh-tw-panel-error`},Et=`dsh-tw-open-tiddler`;function Dt(e){typeof document>`u`||typeof e!=`string`||e.length===0||document.dispatchEvent(new CustomEvent(Et,{detail:{title:e}}))}function Ot(){let e=document.querySelector(wt);if(e===null)return 40;let t=parseInt(getComputedStyle(e).zIndex,10);return Number.isFinite(t)?Math.max(20,Math.min(40,t-1)):40}function kt(){for(let e of bt){let t=document.querySelector(e);if(t!==null)return t}}function At(e){let t,n,r=!1,i,a=pt(Tt,{wikiId:Fe}),o=()=>{if(!e.isOpen()||t===void 0||n===void 0)return;let r=n.getBoundingClientRect();if(r.width===0&&r.height===0)return;let i=`${r.left}px`,a=`${r.top}px`,o=`${r.width}px`,s=`${r.height}px`;t.style.left!==i&&(t.style.left=i),t.style.top!==a&&(t.style.top=a),t.style.width!==o&&(t.style.width=o),t.style.height!==s&&(t.style.height=s)},s=(n=!1)=>{if(t===void 0)return;let r=document.querySelector(wt)!==null;!n&&!e.isOpen()&&r===i||(i=r,t.style.zIndex=String(Ot()),r?t.dataset.sidebarHost=`1`:delete t.dataset.sidebarHost)},c=()=>{(n===void 0||!n.isConnected)&&(n=kt()),t===void 0&&n!==void 0&&(t=a.build(),t.style.position=`fixed`,s(!0),document.body.append(t),o())},l=t=>{let n=t.detail,r=typeof n?.title==`string`&&n.title.length>0?n.title:``;r.length!==0&&(gt(r)||(e.openPanel(),a.openTiddler(r)))},u=()=>{if(e.isOpen()){for(let e of St)document.documentElement.removeAttribute(e);document.documentElement.setAttribute(xt,``),document.dispatchEvent(new CustomEvent(at,{detail:Ct})),m()}else document.documentElement.removeAttribute(xt);a.setVisible(e.isOpen())},d=t=>{t.detail!==Ct&&e.isOpen()&&e.closePanel()},f=t=>{if(!e.isOpen())return;let n=t.target;n!==null&&n.closest(`[data-dsh-tw-entry]`)===null&&n.closest(`[class*="sessionRow"], [class*="projectRow"], [class*="searchResultRow"], [class*="searchResultWorkspace"], [class*="newSession"]`)!==null&&e.closePanel()},p,m=()=>{r||p!==void 0||(p=window.requestAnimationFrame(()=>{p=void 0,!r&&(c(),o(),s())}))},h=new MutationObserver(()=>{m()});h.observe(document.body,{childList:!0,subtree:!0});let g=new ResizeObserver(()=>{m()});g.observe(document.body);let _=window.setInterval(o,2e3),v=()=>{m()};window.addEventListener(`resize`,v);let y=()=>{m()};window.addEventListener(`scroll`,y,!0),document.addEventListener(`click`,f,!0),document.addEventListener(at,d);let b=e.subscribe(u);return c(),u(),document.addEventListener(Et,l),()=>{r=!0,p!==void 0&&window.cancelAnimationFrame(p),p=void 0,window.clearInterval(_),window.removeEventListener(`resize`,v),window.removeEventListener(`scroll`,y,!0),g.disconnect(),document.removeEventListener(`click`,f,!0),document.removeEventListener(at,d),document.removeEventListener(Et,l),h.disconnect(),b(),document.documentElement.removeAttribute(xt),a.dispose(),t?.remove()}}function D(e){let t=document.querySelector(`.dsh-tw-toast`);t===null&&(t=document.createElement(`div`),t.className=`dsh-tw-toast`,document.body.append(t)),t.textContent=e,t.classList.add(`dsh-tw-toast-show`),clearTimeout(t.__twToastTimer),t.__twToastTimer=window.setTimeout(()=>{t?.classList.remove(`dsh-tw-toast-show`)},2500)}const jt=`dsh-tiddlywiki/editor-popup`;let O,k,Mt,Nt,Pt,Ft;function It(e,t){Ht(),!(O===void 0||k===void 0)&&(Mt!==void 0&&(Mt.textContent=`TiddlyWiki 编辑器 · ${t}`),O.style.display=``,document.dispatchEvent(new CustomEvent(at,{detail:jt})),(k.dataset.loaded!==e||Rt())&&(k.dataset.loaded=e,k.src=e),zt())}function Lt(){return O!==void 0&&O.style.display!==`none`}function Rt(){if(k===void 0)return!1;let e=null;try{e=k.contentDocument}catch{return!1}if(e===null||e.readyState===`loading`)return!1;let t=e.querySelector(`.tc-story-river`);return t===null||t.querySelector(`.tc-tiddler-frame`)===null}function zt(){O!==void 0&&O.querySelector(`button, [href], input, select, textarea, iframe, [tabindex]:not([tabindex="-1"])`)?.focus()}function Bt(){O!==void 0&&(O.style.display=`none`),k!==void 0&&(k.dataset.loaded=``)}function Vt(){Nt?.(),Nt=void 0,Pt!==void 0&&(document.removeEventListener(`keydown`,Pt),Pt=void 0),Ft!==void 0&&(document.removeEventListener(at,Ft),Ft=void 0),O?.remove(),O=void 0,k=void 0,Mt=void 0}function Ht(){if(O!==void 0&&k!==void 0)return;O=document.createElement(`div`),O.className=`dsh-tw-editor-popup`,O.style.display=`none`,O.setAttribute(`role`,`dialog`),O.setAttribute(`aria-modal`,`true`),O.setAttribute(`aria-label`,`TiddlyWiki 编辑器`);let e=document.createElement(`div`);e.className=`dsh-tw-editor-bar`,Mt=document.createElement(`span`),Mt.className=`dsh-tw-editor-title`,Mt.textContent=`TiddlyWiki 编辑器`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-editor-close`,t.textContent=`✕`,t.title=`关闭`,e.append(Mt,t),k=document.createElement(`iframe`),k.className=`dsh-tw-editor-frame`,k.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms allow-popups`),k.title=`TiddlyWiki 编辑器`,Nt=it(k);let n=document.createElement(`div`);n.className=`dsh-tw-editor-resize`,n.title=`拖拽调整大小`,O.append(e,k,n),document.body.append(O),t.addEventListener(`click`,()=>Bt()),Pt=e=>{e.key===`Escape`&&Lt()&&Bt()},document.addEventListener(`keydown`,Pt),Ft=e=>{e.detail!==jt&&Lt()&&Bt()},document.addEventListener(at,Ft),e.addEventListener(`pointerdown`,n=>{if(n.button!==0||O===void 0)return;let r=n.target;if(t.contains(r))return;n.preventDefault(),e.setPointerCapture(n.pointerId);let i=O.getBoundingClientRect(),a=n.clientX,o=n.clientY,s=i.left,c=i.top,l=e=>{O!==void 0&&(O.style.left=`${s+e.clientX-a}px`,O.style.top=`${c+e.clientY-o}px`,O.style.margin=`0`,O.style.right=`auto`,O.style.bottom=`auto`)},u=()=>{e.removeEventListener(`pointermove`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)};e.addEventListener(`pointermove`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u)}),n.addEventListener(`pointerdown`,e=>{if(e.button!==0||O===void 0)return;e.preventDefault(),e.stopPropagation(),n.setPointerCapture(e.pointerId);let t=O.getBoundingClientRect(),r=e.clientX,i=e.clientY,a=t.width,o=t.height,s=e=>{O!==void 0&&(O.style.width=`${Math.max(360,a+e.clientX-r)}px`,O.style.height=`${Math.max(260,o+e.clientY-i)}px`,O.style.right=`auto`,O.style.bottom=`auto`)},c=()=>{n.removeEventListener(`pointermove`,s),n.removeEventListener(`pointerup`,c),n.removeEventListener(`pointercancel`,c)};n.addEventListener(`pointermove`,s),n.addEventListener(`pointerup`,c),n.addEventListener(`pointercancel`,c)})}let Ut=[],Wt=[];(()=>{let e=`lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5`.split(`,`).map(e=>e?parseInt(e,36):1);for(let t=0,n=0;t<e.length;t++)(t%2?Wt:Ut).push(n+=e[t])})();function Gt(e){if(e<768)return!1;for(let t=0,n=Ut.length;;){let r=t+n>>1;if(e<Ut[r])n=r;else if(e>=Wt[r])t=r+1;else return!0;if(t==n)return!1}}function Kt(e){return e>=127462&&e<=127487}const qt=8205;function Jt(e,t,n=!0,r=!0){return(n?Yt:Xt)(e,t,r)}function Yt(e,t,n){if(t==e.length)return t;t&&Qt(e.charCodeAt(t))&&$t(e.charCodeAt(t-1))&&t--;let r=Zt(e,t);for(t+=en(r);t<e.length;){let i=Zt(e,t);if(r==qt||i==qt||n&&Gt(i))t+=en(i),r=i;else if(Kt(i)){let n=0,r=t-2;for(;r>=0&&Kt(Zt(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function Xt(e,t,n){for(;t>1;){let r=Yt(e,t-2,n);if(r<t)return r;t--}return 0}function Zt(e,t){let n=e.charCodeAt(t);if(!$t(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return Qt(r)?(n-55296<<10)+(r-56320)+65536:n}function Qt(e){return e>=56320&&e<57344}function $t(e){return e>=55296&&e<56320}function en(e){return e<65536?1:2}var A=class e{lineAt(e){if(e<0||e>this.length)throw RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=dn(this,e,t);let r=[];return this.decompose(0,e,r,2),n.length&&n.decompose(0,n.length,r,3),this.decompose(t,this.length,r,1),nn.from(r,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=dn(this,e,t);let n=[];return this.decompose(e,t,n,0),nn.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),r=new sn(this),i=new sn(e);for(let e=t,a=t;;){if(r.next(e),i.next(e),e=0,r.lineBreak!=i.lineBreak||r.done!=i.done||r.value!=i.value)return!1;if(a+=r.value.length,r.done||a>=n)return!0}}iter(e=1){return new sn(this,e)}iterRange(e,t=this.length){return new cn(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t??=this.lines+1;let r=this.line(e).from;n=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new ln(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(t){if(t.length==0)throw RangeError(`A document must have at least one line`);return t.length==1&&!t[0]?e.empty:t.length<=32?new tn(t):nn.from(tn.split(t,[]))}},tn=class e extends A{constructor(e,t=rn(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.text[i],o=r+a.length;if((t?n:o)>=e)return new un(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(on(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=an(a.text,t.text.slice(),0,a.length);if(n.length<=32)r.push(new e(n,t.length+a.length));else{let t=n.length>>1;r.push(new e(n.slice(0,t)),new e(n.slice(t)))}}else r.push(a)}replace(t,n,r){if(!(r instanceof e))return super.replace(t,n,r);[t,n]=dn(this,t,n);let i=an(this.text,an(r.text,on(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):nn.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
784
+ `;function d(){if(typeof document>`u`)return()=>{};let e=document.getElementById(l);e===null?(e=document.createElement(`style`),e.id=l,e.dataset.plugin=`dsh-tiddlywiki`,e.textContent=u,document.head.append(e)):e.textContent!==u&&(e.textContent=u);let t=String(Date.now())+`:`+Math.random().toString(36).slice(2);return e.dataset.instance=t,()=>{e?.dataset.instance===t&&e.remove()}}var f=class{open=!1;listeners=new Set;isOpen(){return this.open}toggle(){this.set(!this.open)}openPanel(){this.set(!0)}closePanel(){this.set(!1)}set(e){if(this.open!==e){this.open=e;for(let t of[...this.listeners])t(e)}}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}};const p=`/dsh-tiddlywiki`,m=`${p}/tw/`,h=`${p}/status`,g=`${p}/get`,_=`${p}/render`,v=`${p}/note`,y=`${p}/edit`,b=`${p}/tags`,x=`${p}/recent`,S=`${p}/search`,ee=`${p}/upload`,te=`${p}/sync`,ne=`${p}/restart`,C=`${p}/session/summary`,re=`${p}/admin/state`,ie=`${p}/admin/prompt`,w=`${p}/admin/info`,ae=`${p}/admin/config`,T=`${p}/admin/restart`,oe=`${p}/admin/seeds`,se=`${p}/admin/seeds/run`,ce=`${p}/admin/seeds/remove`,le=`${p}/admin/wiki/location`,ue=`${p}/admin/wiki/switch`,de=`${p}/admin/wiki/reset`,fe=`${p}/admin/wikis`,E=`${p}/session/wiki`;function pe(e,t){let n=typeof location>`u`?``:location.protocol,r=typeof location>`u`?void 0:location.origin;return n!==`http:`&&n!==`https:`&&typeof t==`string`&&t.length>0?t:new URL(e,r).href}function me(e,t,n,r){if(e!==`multi`||typeof t!=`string`||t.length===0)return{relative:n,...r===void 0?{}:{absolute:r}};let i=`${encodeURIComponent(t)}/`;return{relative:`${n}${i}`,...r===void 0?{}:{absolute:`${r}${i}`}}}function he(e,t){return typeof t!=`string`||t.length===0?e:`${e}${e.includes(`?`)?`&`:`?`}wiki=${encodeURIComponent(t)}`}function ge(e,t){if(e===null||e.ok!==!0)return{ok:!1,message:e?.error??e?.message??`HTTP ${t}`};let n=``;return typeof e.push==`string`&&e.push.length>0&&e.push!==`nothing to commit`&&(n=`(${e.push})`),e.changed===!0&&(n+=e.restarted===!0?`,TW 已重启`:`,TW 未自动重启`,typeof e.restartError==`string`&&e.restartError.length>0&&(n+=`(${e.restartError})`)),{ok:!0,message:`${e.message??`OK`}${n}`}}let _e;function ve(){if(_e!==void 0&&Date.now()-_e.at<2e3)return _e.value;let e=(async()=>{try{let e=await fetch(h,{signal:AbortSignal.timeout(8e3)});return e.ok?await e.json():null}catch{return null}})();return _e={at:Date.now(),value:e},e.then(t=>{t===null&&_e?.value===e&&(_e=void 0)}),e}function ye(){_e=void 0}const be={showQuickNoteDock:!0,quickNoteMode:`native`,sidebarLabel:`TiddlyWiki`,tabLabel:`知识库`,showSessionTab:!0,showRightbarTab:!0,showQuickNote:!0,showPanelStatus:!0,showSyncButton:!0};let xe;const Se=new Set;function Ce(e){return Se.add(e),()=>{Se.delete(e)}}function we(){xe=void 0,ye();for(let e of[...Se])e()}function Te(){if(xe!==void 0&&Date.now()-xe.at<15e3)return xe.value;let e=(async()=>{let e=await ve(),t=e?.ui;return e===null||t===void 0?be:{showQuickNoteDock:t.showQuickNoteDock!==!1,quickNoteMode:t.quickNoteMode===`card`?`card`:`native`,sidebarLabel:typeof t.sidebarLabel==`string`&&t.sidebarLabel.trim().length>0?t.sidebarLabel.trim():`TiddlyWiki`,tabLabel:typeof t.tabLabel==`string`&&t.tabLabel.trim().length>0?t.tabLabel.trim():`知识库`,showSessionTab:t.showSessionTab!==!1,showRightbarTab:t.showRightbarTab!==!1,showQuickNote:t.showQuickNote!==!1,showPanelStatus:t.showPanelStatus!==!1,showSyncButton:t.showSyncButton!==!1}})();return xe={at:Date.now(),value:e},e}const Ee=`dsh-tiddlywiki.focusWiki`;function De(){try{let e=window.localStorage.getItem(Ee);return e!==null&&e.length>0?e:void 0}catch{return}}let Oe=De();const ke=new Set;function Ae(){return Oe}function je(e){if(e!==Oe){Oe=e;try{e===void 0?window.localStorage.removeItem(Ee):window.localStorage.setItem(Ee,e)}catch{}for(let t of[...ke])t(e)}}function Me(e){return ke.add(e),()=>{ke.delete(e)}}function Ne(e,t){return e.length===0||Oe!==void 0&&e.some(e=>e.id===Oe)?Oe:t!==void 0&&e.some(e=>e.id===t)?t:e[0]?.id}function Pe(){let e=document.querySelector(`[data-pane="sidebar"], [class*="sidebarCol"], .dshDesktopUpstreamSidebar, .dshDesktopSidebarSurface`);if(e!==null)return e.querySelector(`[class*="logoRow"]`)?.parentElement??e.firstElementChild}function Fe(e){let t=e.querySelector(`button[class*="newSession"]`);if(t!==null)return t;for(let t of e.children)if(t instanceof HTMLButtonElement&&!t.matches(`[data-dsh-tw-entry]`))return t;let n=e.querySelector(`button[aria-label="新建会话"], button[aria-label="New Session"], button[aria-label*="新会话"], button[aria-label*="new session" i]`);return n===null?Array.from(e.querySelectorAll(`button`)).find(e=>!e.matches(`[data-dsh-tw-entry]`)&&/新会话|新建会话|new session/i.test(e.textContent??``)):n}function Ie(e,t,n){let r=document.createElement(`button`);r.type=`button`,r.dataset.dshTwEntry=``,r.className=`dsh-tw-entry`,n!==void 0&&(r.dataset.wiki=n),r.setAttribute(`aria-label`,`TiddlyWiki 知识库:${t}`);let i=document.createElement(`span`);i.className=`dsh-tw-entry-icon`,i.innerHTML=`<svg viewBox="0 0 16 16" width="14" height="14" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z"/><path d="M6 6h4M6 8.5h2.5"/></svg>`;let a=document.createElement(`span`);return a.className=`dsh-tw-entry-label`,a.textContent=t,r.append(i,a),r.addEventListener(`click`,()=>{n!==void 0&&je(n),e.toggle()}),{entry:r,labelEl:a}}function Le(e,t){try{let n=Fe(e);if(n===void 0)return!1;if(t.parentElement!==e){let r=n.closest(`[class*="logoRow"]`),i=r!==null&&r.parentElement===e?r:n,a=Array.from(e.children).filter(e=>e instanceof HTMLElement&&e.matches(`[data-dsh-tw-entry], [data-dsh-atb-entry], [data-dsh-taskboard-entry], [data-dsh-ssh-entry]`)),o=a.length>0?a[0]??null:i.nextElementSibling;o!==null&&o.parentElement!==e&&(o=null),e.insertBefore(t,o)}return!0}catch(e){return console.error(`[dsh-tiddlywiki] sidebar entry placement failed:`,e),!1}}function Re(e){let t=new Map,{entry:n,labelEl:r}=Ie(e,`TiddlyWiki`);t.set(``,{entry:n,labelEl:r});let i=!1,a=async()=>{let e=await Te();i||e.sidebarLabel.length===0||(r.textContent=e.sidebarLabel,n.setAttribute(`aria-label`,e.sidebarLabel))};a();let o=Ce(()=>{a()}),s=async()=>{let r=await ve();if(i)return;let a=(Array.isArray(r?.wikis)?r.wikis:[]).filter(e=>e.running);if(a.length<=1){for(let[e,n]of t)e!==``&&(n.entry.remove(),t.delete(e));n.hidden=!1;return}n.hidden=!0;let o=new Set(a.map(e=>e.id));for(let[e,n]of t)e===``||o.has(e)||(n.entry.remove(),t.delete(e));for(let n of a){let i=t.get(n.id);i===void 0&&(i=Ie(e,n.label,n.id),t.set(n.id,i)),i.labelEl.textContent=n.label,i.entry.setAttribute(`aria-label`,`TiddlyWiki 知识库:${n.label}`),Ne(a,r?.defaultId)===n.id?i.entry.dataset.focus=`true`:delete i.entry.dataset.focus}u!==void 0&&(d=!1,_())};s();let c=Me(()=>{s()}),l=window.setInterval(()=>{s()},1e4),u,d=!1,f,p=0,m=()=>{f!==void 0&&(clearInterval(f),f=void 0)},h=()=>{f===void 0&&(p=15,f=setInterval(()=>{_(),p--,(d||p<=0)&&m()},2e3))},g=()=>[...t.values()].map(e=>e.entry).filter(e=>!e.hidden),_=()=>{if(u!==void 0&&!u.isConnected&&(y.disconnect(),u=void 0,d=!1,h()),d){if(g().every(e=>document.body.contains(e)))return;y.disconnect(),u=void 0,d=!1,h()}if(u??=Pe(),u===void 0)return;let e=!1;for(let t of g())Le(u,t)&&(e=!0);d=e,d&&(m(),y.observe(u,{childList:!0,subtree:!0}))},v=new MutationObserver(()=>{_()});v.observe(document.body,{childList:!0,subtree:!0});let y=new MutationObserver(()=>{if(u===void 0||!u.isConnected){d=!1,h(),_();return}for(let e of g())u.contains(e)||Le(u,e)});h();let b=()=>{for(let t of g())e.isOpen()?t.dataset.active=`true`:delete t.dataset.active},x=e.subscribe(b);return b(),_(),()=>{i=!0,clearInterval(f),window.clearInterval(l),v.disconnect(),y.disconnect(),x(),o(),c();for(let e of t.values())e.entry.remove();t.clear()}}const ze=`$:/palettes/CupertinoDark`,Be=`$:/palettes/Vanilla`,Ve=`data-ds-dark-theme`,He=`$:/palette`,Ue=new Set,We=new WeakSet;let Ge=``,Ke=!0,qe=ze;function Je(){try{let e=document.documentElement,t=document.body;if(t!==null&&t.hasAttribute(Ve))return!0;if(e!==null){let t=e.style.getPropertyValue(`color-scheme`).trim().toLowerCase();if(t===`dark`)return!0;if(t===`light`)return!1}}catch{}try{return window.matchMedia(`(prefers-color-scheme: dark)`).matches}catch{return!1}}function Ye(e){try{let t=e.wiki.getTiddlerText(He);return typeof t==`string`&&t.trim().length>0?t.trim():Be}catch{return Be}}function Xe(e){try{let t=e.wiki.getTiddler(Ye(e))?.fields;return t!==void 0&&t[`color-scheme`]===`dark`}catch{return!1}}function Ze(e){try{let t=e.syncer;if(t?.tiddlerInfo===void 0)return;let n=e.wiki.getChangeCount(He),r=t.tiddlerInfo[He];r===void 0?t.tiddlerInfo[He]={changeCount:n}:r.changeCount=n}catch{}}function Qe(e){try{let t=e.syncer,n=t?.syncadaptor;if(t===void 0||n===void 0||We.has(t))return;let r=n.saveTiddler.bind(n);n.saveTiddler=(e,t)=>{if(Ke&&Ge.length>0&&e?.fields?.title===He&&e?.fields?.text===qe){t(null,{},0);return}r(e,t)},We.add(t)}catch{}}function $e(e,t){try{if(Ye(e)===t)return;e.wiki.setText(He,`text`,void 0,t),Ze(e)}catch{}}function et(e,t){let n=Ye(e);if(t){if(Xe(e))return;n!==qe&&(Ge=n),$e(e,qe)}else Xe(e)&&n===qe&&Ge.length>0&&$e(e,Ge)}function tt(e,t){try{let n=t.contentDocument?.documentElement;if(n==null)return;let r=Xe(e)?`dark`:`light`;n.style.getPropertyValue(`color-scheme`)!==r&&n.style.setProperty(`color-scheme`,r)}catch{}}function nt(e){try{let t=e.contentWindow?.$tw;if(t===void 0||t.wiki===void 0)return;Qe(t),Ke?et(t,Je()):et(t,!1),tt(t,e)}catch{}}function rt(e){let t=e.enabled!==!1,n=typeof e.darkPalette==`string`&&e.darkPalette.trim().length>0?e.darkPalette.trim():ze,r=t!==Ke||n!==qe;if(Ke=t,qe=n,r)for(let e of[...Ue])e()}function it(e){if(e===null)return()=>{};let t=()=>nt(e);Ue.add(t);let n=()=>t();e.addEventListener(`load`,n);let r=window.matchMedia(`(prefers-color-scheme: dark)`),i=()=>t();try{r.addEventListener(`change`,i)}catch{r.addListener?.(i)}let a;try{a=new MutationObserver(()=>t()),document.body!==null&&a.observe(document.body,{attributes:!0,attributeFilter:[Ve]}),document.documentElement!==null&&a.observe(document.documentElement,{attributes:!0,attributeFilter:[`style`]})}catch{a=void 0}let o=[150,600,1500,3e3].map(e=>window.setTimeout(t,e));return t(),()=>{Ue.delete(t),e.removeEventListener(`load`,n);for(let e of o)window.clearTimeout(e);try{r.removeEventListener(`change`,i)}catch{r.removeListener?.(i)}try{a?.disconnect()}catch{}}}const at=`dsh-panel-activate`,ot=`dsh-tw-panel-reload`;let st=`知识库`;function ct(e){let t=typeof e==`string`?e.trim():``;t.length>0&&(st=t)}function lt(){return st}async function ut(){try{return(await fetch(ne,{method:`POST`,signal:AbortSignal.timeout(8e3)})).ok}catch{return!1}}function dt({size:e=16,className:t}){return c.createElement(`svg`,{width:e,height:e,className:t,viewBox:`0 0 16 16`,fill:`none`,stroke:`currentColor`,strokeWidth:1.3,strokeLinecap:`round`,strokeLinejoin:`round`,"aria-hidden":!0},c.createElement(`path`,{d:`M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z`}),c.createElement(`path`,{d:`M6 6h4M6 8.5h2.5`}))}function ft(e){let t=e.loaded;return t===void 0||t.length===0?null:t}function pt(e,t={}){let n=!1,r=!1,i=!1,a,o,s,c,l=new Set,u=0,d=!1,f=null,p,m=()=>{c!==void 0&&(window.clearTimeout(c),c=void 0)},h=e=>{if(o===void 0||s===void 0)return;o.hidden=!0,s.hidden=!1,s.replaceChildren();let t=document.createElement(`div`);t.textContent=`TiddlyWiki 服务不可用`;let n=document.createElement(`code`);n.textContent=e;let r=document.createElement(`button`);r.type=`button`,r.textContent=`重试`,r.addEventListener(`click`,()=>{r.disabled=!0,r.textContent=`重启中…`,ut().finally(()=>{b()})}),s.append(t,n,r)},g=()=>{if(o===void 0||s===void 0)return;o.hidden=!0,s.hidden=!1,s.replaceChildren();let e=document.createElement(`div`);e.textContent=`TiddlyWiki 服务正在启动…`,s.append(e)},_=e=>{o===void 0||s===void 0||(s.hidden=!0,o.hidden=!n,o.dataset.loaded!==e&&(o.dataset.loaded=e,d=!1,o.src=e))},v=()=>{if(f===null||o===void 0||!d)return;let e=f,t=o.contentWindow;if(t===null){y(e);return}let n=r=>{if(i||f!==e)return;let a=!1;try{let e=t;a=typeof e.$tw==`object`&&e.$tw!==null}catch{y(e);return}if(!a){if(r<40){let e=window.setTimeout(()=>{l.delete(e),n(r+1)},150);l.add(e);return}y(e);return}f=null;try{t.location.hash!==e&&(t.location.hash=e)}catch{y(e)}};n(0)},y=e=>{if(i||o===void 0)return;f===e&&(f=null);let t=ft(o.dataset);if(t===null)return;let n=`${t.split(`#`)[0]}${e}`;o.src!==n&&(o.src=n)},b=async()=>{m();let e=await ve();if(!i&&n){if(e===null){h(`无法访问 /dsh-tiddlywiki/status`);return}if(e.ui!==void 0&&(ct(e.ui.tabLabel??st),rt({enabled:e.ui.followDshTheme!==!1,darkPalette:e.ui.darkPalette})),e.status===`running`){if(u=0,typeof e.twProxy==`string`){let n=me(e.mode,t.wikiId?.(),e.twProxy,e.twProxyAbsolute);_(pe(n.relative,n.absolute))}else typeof e.url==`string`?_(e.url):h(`服务未返回编辑器地址`);return}if(e.status===`starting`){g(),u<30&&(u++,c=window.setTimeout(()=>{b()},1500));return}u=0,h(e.error??`服务状态:${e.status}`)}},x=()=>{if(o===void 0)return;let e=ft(o.dataset);e!==null&&(o.src=e)};document.addEventListener(ot,x);let S=Me(()=>{!i&&n&&b()});return{build:()=>{if(a!==void 0)return a;let t=document.createElement(`div`);if(t.className=e.view,e.viewDataset!==void 0)for(let[n,r]of Object.entries(e.viewDataset))t.dataset[n]=r;let r=document.createElement(`div`);r.className=e.frameWrap,e.frameWrapStyle!==void 0&&(r.style.cssText=e.frameWrapStyle);let i=document.createElement(`iframe`);i.className=e.frame,i.title=`TiddlyWiki`,i.hidden=!0,r.append(i);let c=document.createElement(`div`);return c.className=e.error,c.hidden=!0,t.append(r,c),a=t,o=i,s=c,i.addEventListener(`load`,()=>{d=!0,v()}),p=it(i),n&&b(),t},setVisible(e){i||(n=e,e&&!r&&(r=!0),o!==void 0&&(o.hidden=!e||ft(o.dataset)===null),e?b():(m(),u=0))},openTiddler(e){return i||!n?!1:(f=`#${encodeURIComponent(e)}`,r?v():(r=!0,b()),!0)},dispose(){if(!i){i=!0,document.removeEventListener(ot,x),S(),m();for(let e of l)window.clearTimeout(e);l.clear(),p?.(),a?.remove()}}}}function mt(){return{setVisible(){},openTiddler(){return!1},dispose(){}}}const ht=new Set;function gt(e){for(let t of ht)if(t.openTiddler(e))return!0;return!1}function _t(){ve().then(e=>{e?.ui!==void 0&&ct(e.ui.tabLabel??st)})}const vt={view:`dsh-tw-rightbar-view`,frameWrap:`dsh-tw-rightbar-frame-wrap`,frame:`dsh-tw-rightbar-frame`,error:`dsh-tw-rightbar-error`};function yt(e,t){if(t.aborted)return mt();let n=pt(vt,{wikiId:Ae});e.append(n.build());let r=!1,i=()=>a.dispose();t.addEventListener(`abort`,i,{once:!0});let a={setVisible(e){n.setVisible(e)},openTiddler(e){return n.openTiddler(e)},dispose(){r||(r=!0,ht.delete(a),t.removeEventListener(`abort`,i),n.dispose())}};return ht.add(a),a}const bt=[`[class*="centerCol"]`,`[data-pane="conversation"]`,`.dshDesktopConversationSurface`],xt=`data-dsh-tw-active`,St=[`data-dsh-atb-active`,`data-dsh-taskboard-active`,`data-dsh-ssh-active`],Ct=`dsh-tiddlywiki`,wt=`[data-dsh-panel-host]`,Tt={view:`dsh-tw-view`,viewDataset:{dshTwView:``},frameWrap:`dsh-tw-panel-frame-wrap`,frameWrapStyle:`flex:1;min-height:0;display:flex;flex-direction:column`,frame:`dsh-tw-panel-frame`,error:`dsh-tw-panel-error`},Et=`dsh-tw-open-tiddler`;function Dt(e){typeof document>`u`||typeof e!=`string`||e.length===0||document.dispatchEvent(new CustomEvent(Et,{detail:{title:e}}))}function Ot(){let e=document.querySelector(wt);if(e===null)return 40;let t=parseInt(getComputedStyle(e).zIndex,10);return Number.isFinite(t)?Math.max(20,Math.min(40,t-1)):40}function kt(){for(let e of bt){let t=document.querySelector(e);if(t!==null)return t}}function At(e){let t,n,r=!1,i,a=pt(Tt,{wikiId:Ae}),o=()=>{if(!e.isOpen()||t===void 0||n===void 0)return;let r=n.getBoundingClientRect();if(r.width===0&&r.height===0)return;let i=`${r.left}px`,a=`${r.top}px`,o=`${r.width}px`,s=`${r.height}px`;t.style.left!==i&&(t.style.left=i),t.style.top!==a&&(t.style.top=a),t.style.width!==o&&(t.style.width=o),t.style.height!==s&&(t.style.height=s)},s=(n=!1)=>{if(t===void 0)return;let r=document.querySelector(wt)!==null;!n&&!e.isOpen()&&r===i||(i=r,t.style.zIndex=String(Ot()),r?t.dataset.sidebarHost=`1`:delete t.dataset.sidebarHost)},c=()=>{(n===void 0||!n.isConnected)&&(n=kt()),t===void 0&&n!==void 0&&(t=a.build(),t.style.position=`fixed`,s(!0),document.body.append(t),o())},l=t=>{let n=t.detail,r=typeof n?.title==`string`&&n.title.length>0?n.title:``;r.length!==0&&(gt(r)||(e.openPanel(),a.openTiddler(r)))},u=()=>{if(e.isOpen()){for(let e of St)document.documentElement.removeAttribute(e);document.documentElement.setAttribute(xt,``),document.dispatchEvent(new CustomEvent(at,{detail:Ct})),m()}else document.documentElement.removeAttribute(xt);a.setVisible(e.isOpen())},d=t=>{t.detail!==Ct&&e.isOpen()&&e.closePanel()},f=t=>{if(!e.isOpen())return;let n=t.target;n!==null&&n.closest(`[data-dsh-tw-entry]`)===null&&n.closest(`[class*="sessionRow"], [class*="projectRow"], [class*="searchResultRow"], [class*="searchResultWorkspace"], [class*="newSession"]`)!==null&&e.closePanel()},p,m=()=>{r||p!==void 0||(p=window.requestAnimationFrame(()=>{p=void 0,!r&&(c(),o(),s())}))},h=new MutationObserver(()=>{m()});h.observe(document.body,{childList:!0,subtree:!0});let g=new ResizeObserver(()=>{m()});g.observe(document.body);let _=window.setInterval(o,2e3),v=()=>{m()};window.addEventListener(`resize`,v);let y=()=>{m()};window.addEventListener(`scroll`,y,!0),document.addEventListener(`click`,f,!0),document.addEventListener(at,d);let b=e.subscribe(u);return c(),u(),document.addEventListener(Et,l),()=>{r=!0,p!==void 0&&window.cancelAnimationFrame(p),p=void 0,window.clearInterval(_),window.removeEventListener(`resize`,v),window.removeEventListener(`scroll`,y,!0),g.disconnect(),document.removeEventListener(`click`,f,!0),document.removeEventListener(at,d),document.removeEventListener(Et,l),h.disconnect(),b(),document.documentElement.removeAttribute(xt),a.dispose(),t?.remove()}}function D(e){let t=document.querySelector(`.dsh-tw-toast`);t===null&&(t=document.createElement(`div`),t.className=`dsh-tw-toast`,document.body.append(t)),t.textContent=e,t.classList.add(`dsh-tw-toast-show`),clearTimeout(t.__twToastTimer),t.__twToastTimer=window.setTimeout(()=>{t?.classList.remove(`dsh-tw-toast-show`)},2500)}const jt=`dsh-tiddlywiki/editor-popup`;let O,k,Mt,Nt,Pt,Ft;function It(e,t){Ht(),!(O===void 0||k===void 0)&&(Mt!==void 0&&(Mt.textContent=`TiddlyWiki 编辑器 · ${t}`),O.style.display=``,document.dispatchEvent(new CustomEvent(at,{detail:jt})),(k.dataset.loaded!==e||Rt())&&(k.dataset.loaded=e,k.src=e),zt())}function Lt(){return O!==void 0&&O.style.display!==`none`}function Rt(){if(k===void 0)return!1;let e=null;try{e=k.contentDocument}catch{return!1}if(e===null||e.readyState===`loading`)return!1;let t=e.querySelector(`.tc-story-river`);return t===null||t.querySelector(`.tc-tiddler-frame`)===null}function zt(){O!==void 0&&O.querySelector(`button, [href], input, select, textarea, iframe, [tabindex]:not([tabindex="-1"])`)?.focus()}function Bt(){O!==void 0&&(O.style.display=`none`),k!==void 0&&(k.dataset.loaded=``)}function Vt(){Nt?.(),Nt=void 0,Pt!==void 0&&(document.removeEventListener(`keydown`,Pt),Pt=void 0),Ft!==void 0&&(document.removeEventListener(at,Ft),Ft=void 0),O?.remove(),O=void 0,k=void 0,Mt=void 0}function Ht(){if(O!==void 0&&k!==void 0)return;O=document.createElement(`div`),O.className=`dsh-tw-editor-popup`,O.style.display=`none`,O.setAttribute(`role`,`dialog`),O.setAttribute(`aria-modal`,`true`),O.setAttribute(`aria-label`,`TiddlyWiki 编辑器`);let e=document.createElement(`div`);e.className=`dsh-tw-editor-bar`,Mt=document.createElement(`span`),Mt.className=`dsh-tw-editor-title`,Mt.textContent=`TiddlyWiki 编辑器`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-editor-close`,t.textContent=`✕`,t.title=`关闭`,e.append(Mt,t),k=document.createElement(`iframe`),k.className=`dsh-tw-editor-frame`,k.setAttribute(`sandbox`,`allow-scripts allow-same-origin allow-forms allow-popups`),k.title=`TiddlyWiki 编辑器`,Nt=it(k);let n=document.createElement(`div`);n.className=`dsh-tw-editor-resize`,n.title=`拖拽调整大小`,O.append(e,k,n),document.body.append(O),t.addEventListener(`click`,()=>Bt()),Pt=e=>{e.key===`Escape`&&Lt()&&Bt()},document.addEventListener(`keydown`,Pt),Ft=e=>{e.detail!==jt&&Lt()&&Bt()},document.addEventListener(at,Ft),e.addEventListener(`pointerdown`,n=>{if(n.button!==0||O===void 0)return;let r=n.target;if(t.contains(r))return;n.preventDefault(),e.setPointerCapture(n.pointerId);let i=O.getBoundingClientRect(),a=n.clientX,o=n.clientY,s=i.left,c=i.top,l=e=>{O!==void 0&&(O.style.left=`${s+e.clientX-a}px`,O.style.top=`${c+e.clientY-o}px`,O.style.margin=`0`,O.style.right=`auto`,O.style.bottom=`auto`)},u=()=>{e.removeEventListener(`pointermove`,l),e.removeEventListener(`pointerup`,u),e.removeEventListener(`pointercancel`,u)};e.addEventListener(`pointermove`,l),e.addEventListener(`pointerup`,u),e.addEventListener(`pointercancel`,u)}),n.addEventListener(`pointerdown`,e=>{if(e.button!==0||O===void 0)return;e.preventDefault(),e.stopPropagation(),n.setPointerCapture(e.pointerId);let t=O.getBoundingClientRect(),r=e.clientX,i=e.clientY,a=t.width,o=t.height,s=e=>{O!==void 0&&(O.style.width=`${Math.max(360,a+e.clientX-r)}px`,O.style.height=`${Math.max(260,o+e.clientY-i)}px`,O.style.right=`auto`,O.style.bottom=`auto`)},c=()=>{n.removeEventListener(`pointermove`,s),n.removeEventListener(`pointerup`,c),n.removeEventListener(`pointercancel`,c)};n.addEventListener(`pointermove`,s),n.addEventListener(`pointerup`,c),n.addEventListener(`pointercancel`,c)})}let Ut=[],Wt=[];(()=>{let e=`lc,34,7n,7,7b,19,,,,2,,2,,,20,b,1c,l,g,,2t,7,2,6,2,2,,4,z,,u,r,2j,b,1m,9,9,,o,4,,9,,3,,5,17,3,1n,9,16,o,,x,1i,3,,i,,7,a,2,t,3,1k,,,7,2,2,2,3,9,,a,2,q,,2,3,1k,,,5,4,2,2,3,3,,u,2,3,,b,3,1k,,,8,,3,,3,k,2,m,6,,3,1k,,,7,2,2,2,3,7,3,a,2,u,,1n,5,3,3,,4,9,,14,5,1j,,,7,,3,,4,7,2,b,2,t,3,1k,,,7,,3,,4,7,2,b,2,f,,c,4,1j,2,,7,,3,,4,9,,a,2,t,3,1y,,4,6,,,,8,i,2,1p,,,8,c,8,2q,,,a,b,7,21,2,r,,,,,,4,2,1d,k,,2,5,b,,10,9,,2u,b,,6,n,4,4,3,g,4,d,,,3,6,,f,,jj,3,qa,4,s,3,t,2,u,2,1s,w,9,,19,3,,,39,2,y,,3a,c,4,c,63,5,1l,a,,,,,2,o,2,,1c,1a,2,c,k,5,1b,h,12,9,c,3,u,d,1k,e,1c,k,48,3,,l,4,,6,,2,3,5i,1s,ek,,5f,x,2da,3,3x,,2o,w,fe,6,2x,2,n9w,4,,a,w,2,28,2,7k,,3,,4,,n,5,4,,2b,2,1e,i,q,i,d,,12,8,p,d,18,4,1b,e,10,,1v,e,c,,8,2,1a,,1f,,,3,2,2,5,2,,,15,5,5,2,6k,8,,2,fn4,,kh,g,g,g,a6,2,gt,,6a,,45,5,1ae,3,,2,5,4,14,3,4,,4l,2,fx,4,1t,5,8t,2,25,6,1y,b,1d,4,3e,3,1h,f,15,,2,2,a,4,19,b,7,,1p,3,10,e,g,2,18,,c,3,1c,e,8,4,,2,2k,c,6,,2,,4d,c,l,4,1j,2,,7,2,2,2,3,9,,a,2,2,7,3,5,1v,9,,,2,,,4,,5,,,e,2,2a,i,n,,29,k,6j,7,2,9,r,2,2a,h,2y,d,2t,3,2,a,74,f,6t,6,,2,2,4,,,,2,3x,7,2,7,3,,s,a,14,7,,4,8,,9,b,1a,g,5i,8,5j,8,,8,2a,m,,e,3e,6,3,,,2,,7,,,1u,5,,2,,5,9n,4,9,2,,,1c,7,3,5,n,,44l,,6,f,8ug,i,1xc,5,1n,7,t4,,,1j,7,4,29,,b,2,f57,2,3mp,1a,2,n,f2,5,3,6,8,8,2,7,u,4,44,3,1iz,1j,4,1e,8,,e,,m,5,,f,11s,7,,h,2,7,,2,,5,2s,,4g,7,af,,1p,4,e4,4,72,2,6r,,2,,7,2,5,,d6,7,31,7,240,5`.split(`,`).map(e=>e?parseInt(e,36):1);for(let t=0,n=0;t<e.length;t++)(t%2?Wt:Ut).push(n+=e[t])})();function Gt(e){if(e<768)return!1;for(let t=0,n=Ut.length;;){let r=t+n>>1;if(e<Ut[r])n=r;else if(e>=Wt[r])t=r+1;else return!0;if(t==n)return!1}}function Kt(e){return e>=127462&&e<=127487}const qt=8205;function Jt(e,t,n=!0,r=!0){return(n?Yt:Xt)(e,t,r)}function Yt(e,t,n){if(t==e.length)return t;t&&Qt(e.charCodeAt(t))&&$t(e.charCodeAt(t-1))&&t--;let r=Zt(e,t);for(t+=en(r);t<e.length;){let i=Zt(e,t);if(r==qt||i==qt||n&&Gt(i))t+=en(i),r=i;else if(Kt(i)){let n=0,r=t-2;for(;r>=0&&Kt(Zt(e,r));)n++,r-=2;if(n%2==0)break;t+=2}else break}return t}function Xt(e,t,n){for(;t>1;){let r=Yt(e,t-2,n);if(r<t)return r;t--}return 0}function Zt(e,t){let n=e.charCodeAt(t);if(!$t(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return Qt(r)?(n-55296<<10)+(r-56320)+65536:n}function Qt(e){return e>=56320&&e<57344}function $t(e){return e>=55296&&e<56320}function en(e){return e<65536?1:2}var A=class e{lineAt(e){if(e<0||e>this.length)throw RangeError(`Invalid position ${e} in document of length ${this.length}`);return this.lineInner(e,!1,1,0)}line(e){if(e<1||e>this.lines)throw RangeError(`Invalid line number ${e} in ${this.lines}-line document`);return this.lineInner(e,!0,1,0)}replace(e,t,n){[e,t]=dn(this,e,t);let r=[];return this.decompose(0,e,r,2),n.length&&n.decompose(0,n.length,r,3),this.decompose(t,this.length,r,1),nn.from(r,this.length-(t-e)+n.length)}append(e){return this.replace(this.length,this.length,e)}slice(e,t=this.length){[e,t]=dn(this,e,t);let n=[];return this.decompose(e,t,n,0),nn.from(n,t-e)}eq(e){if(e==this)return!0;if(e.length!=this.length||e.lines!=this.lines)return!1;let t=this.scanIdentical(e,1),n=this.length-this.scanIdentical(e,-1),r=new sn(this),i=new sn(e);for(let e=t,a=t;;){if(r.next(e),i.next(e),e=0,r.lineBreak!=i.lineBreak||r.done!=i.done||r.value!=i.value)return!1;if(a+=r.value.length,r.done||a>=n)return!0}}iter(e=1){return new sn(this,e)}iterRange(e,t=this.length){return new cn(this,e,t)}iterLines(e,t){let n;if(e==null)n=this.iter();else{t??=this.lines+1;let r=this.line(e).from;n=this.iterRange(r,Math.max(r,t==this.lines+1?this.length:t<=1?0:this.line(t-1).to))}return new ln(n)}toString(){return this.sliceString(0)}toJSON(){let e=[];return this.flatten(e),e}constructor(){}static of(t){if(t.length==0)throw RangeError(`A document must have at least one line`);return t.length==1&&!t[0]?e.empty:t.length<=32?new tn(t):nn.from(tn.split(t,[]))}},tn=class e extends A{constructor(e,t=rn(e)){super(),this.text=e,this.length=t}get lines(){return this.text.length}get children(){return null}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.text[i],o=r+a.length;if((t?n:o)>=e)return new un(r,o,n,a);r=o+1,n++}}decompose(t,n,r,i){let a=t<=0&&n>=this.length?this:new e(on(this.text,t,n),Math.min(n,this.length)-Math.max(0,t));if(i&1){let t=r.pop(),n=an(a.text,t.text.slice(),0,a.length);if(n.length<=32)r.push(new e(n,t.length+a.length));else{let t=n.length>>1;r.push(new e(n.slice(0,t)),new e(n.slice(t)))}}else r.push(a)}replace(t,n,r){if(!(r instanceof e))return super.replace(t,n,r);[t,n]=dn(this,t,n);let i=an(this.text,an(r.text,on(this.text,0,t)),n),a=this.length+r.length-(n-t);return i.length<=32?new e(i,a):nn.from(e.split(i,[]),a)}sliceString(e,t=this.length,n=`
771
785
  `){[e,t]=dn(this,e,t);let r=``;for(let i=0,a=0;i<=t&&a<this.text.length;a++){let o=this.text[a],s=i+o.length;i>e&&a&&(r+=n),e<s&&t>i&&(r+=o.slice(Math.max(0,e-i),t-i)),i=s+1}return r}flatten(e){for(let t of this.text)e.push(t)}scanIdentical(){return 0}static split(t,n){let r=[],i=-1;for(let a of t)r.push(a),i+=a.length+1,r.length==32&&(n.push(new e(r,i)),r=[],i=-1);return i>-1&&n.push(new e(r,i)),n}},nn=class e extends A{constructor(e,t){super(),this.children=e,this.length=t,this.lines=0;for(let t of e)this.lines+=t.lines}lineInner(e,t,n,r){for(let i=0;;i++){let a=this.children[i],o=r+a.length,s=n+a.lines-1;if((t?s:o)>=e)return a.lineInner(e,t,n,r);r=o+1,n=s+1}}decompose(e,t,n,r){for(let i=0,a=0;a<=t&&i<this.children.length;i++){let o=this.children[i],s=a+o.length;if(e<=s&&t>=a){let i=r&(a<=e|(s>=t?2:0));a>=e&&s<=t&&!i?n.push(o):o.decompose(e-a,t-a,n,i)}a=s+1}}replace(t,n,r){if([t,n]=dn(this,t,n),r.lines<this.lines)for(let i=0,a=0;i<this.children.length;i++){let o=this.children[i],s=a+o.length;if(t>=a&&n<=s){let c=o.replace(t-a,n-a,r),l=this.lines-o.lines+c.lines;if(c.lines<l>>4&&c.lines>l>>6){let a=this.children.slice();return a[i]=c,new e(a,this.length-(n-t)+r.length)}return super.replace(a,s,c)}a=s+1}return super.replace(t,n,r)}sliceString(e,t=this.length,n=`
772
786
  `){[e,t]=dn(this,e,t);let r=``;for(let i=0,a=0;i<this.children.length&&a<=t;i++){let o=this.children[i],s=a+o.length;a>e&&i&&(r+=n),e<s&&t>a&&(r+=o.sliceString(e-a,t-a,n)),a=s+1}return r}flatten(e){for(let t of this.children)t.flatten(e)}scanIdentical(t,n){if(!(t instanceof e))return 0;let r=0,[i,a,o,s]=n>0?[0,0,this.children.length,t.children.length]:[this.children.length-1,t.children.length-1,-1,-1];for(;;i+=n,a+=n){if(i==o||a==s)return r;let e=this.children[i],c=t.children[a];if(e!=c)return r+e.scanIdentical(c,n);r+=e.length+1}}static from(t,n=t.reduce((e,t)=>e+t.length+1,-1)){let r=0;for(let e of t)r+=e.lines;if(r<32){let e=[];for(let n of t)n.flatten(e);return new tn(e,n)}let i=Math.max(32,r>>5),a=i<<1,o=i>>1,s=[],c=0,l=-1,u=[];function d(t){let n;if(t.lines>a&&t instanceof e)for(let e of t.children)d(e);else t.lines>o&&(c>o||!c)?(f(),s.push(t)):t instanceof tn&&c&&(n=u[u.length-1])instanceof tn&&t.lines+n.lines<=32?(c+=t.lines,l+=t.length+1,u[u.length-1]=new tn(n.text.concat(t.text),n.length+1+t.length)):(c+t.lines>i&&f(),c+=t.lines,l+=t.length+1,u.push(t))}function f(){c!=0&&(s.push(u.length==1?u[0]:e.from(u,l)),l=-1,c=u.length=0)}for(let e of t)d(e);return f(),s.length==1?s[0]:new e(s,n)}};A.empty=new tn([``],0);function rn(e){let t=-1;for(let n of e)t+=n.length+1;return t}function an(e,t,n=0,r=1e9){for(let i=0,a=0,o=!0;a<e.length&&i<=r;a++){let s=e[a],c=i+s.length;c>=n&&(c>r&&(s=s.slice(0,r-i)),i<n&&(s=s.slice(n-i)),o?(t[t.length-1]+=s,o=!1):t.push(s)),i=c+1}return t}function on(e,t,n){return an(e,[``],t,n)}var sn=class{constructor(e,t=1){this.dir=t,this.done=!1,this.lineBreak=!1,this.value=``,this.nodes=[e],this.offsets=[t>0?1:(e instanceof tn?e.text.length:e.children.length)<<1]}nextInner(e,t){for(this.done=this.lineBreak=!1;;){let n=this.nodes.length-1,r=this.nodes[n],i=this.offsets[n],a=i>>1,o=r instanceof tn?r.text.length:r.children.length;if(a==(t>0?o:0)){if(n==0)return this.done=!0,this.value=``,this;t>0&&this.offsets[n-1]++,this.nodes.pop(),this.offsets.pop()}else if((i&1)==(t>0?0:1)){if(this.offsets[n]+=t,e==0)return this.lineBreak=!0,this.value=`
773
787
  `,this;e--}else if(r instanceof tn){let i=r.text[a+(t<0?-1:0)];if(this.offsets[n]+=t,i.length>Math.max(0,e))return this.value=e==0?i:t>0?i.slice(e):i.slice(0,i.length-e),this;e-=i.length}else{let i=r.children[a+(t<0?-1:0)];e>i.length?(e-=i.length,this.offsets[n]+=t):(t<0&&this.offsets[n]--,this.nodes.push(i),this.offsets.push(t>0?1:(i instanceof tn?i.text.length:i.children.length)<<1))}}}next(e=0){return e<0&&(this.nextInner(-e,-this.dir),e=this.value.length),this.nextInner(e,this.dir)}},cn=class{constructor(e,t,n){this.value=``,this.done=!1,this.cursor=new sn(e,t>n?-1:1),this.pos=t>n?e.length:0,this.from=Math.min(t,n),this.to=Math.max(t,n)}nextInner(e,t){if(t<0?this.pos<=this.from:this.pos>=this.to)return this.value=``,this.done=!0,this;e+=Math.max(0,t<0?this.pos-this.to:this.from-this.pos);let n=t<0?this.pos-this.from:this.to-this.pos;e>n&&(e=n),n-=e;let{value:r}=this.cursor.next(e);return this.pos+=(r.length+e)*t,this.value=r.length<=n?r:t<0?r.slice(r.length-n):r.slice(0,n),this.done=!this.value,this}next(e=0){return e<0?e=Math.max(e,this.from-this.pos):e>0&&(e=Math.min(e,this.to-this.pos)),this.nextInner(e,this.cursor.dir)}get lineBreak(){return this.cursor.lineBreak&&this.value!=``}},ln=class{constructor(e){this.inner=e,this.afterBreak=!0,this.value=``,this.done=!1}next(e=0){let{done:t,lineBreak:n,value:r}=this.inner.next(e);return t&&this.afterBreak?(this.value=``,this.afterBreak=!1):t?(this.done=!0,this.value=``):n?this.afterBreak?this.value=``:(this.afterBreak=!0,this.next()):(this.value=r,this.afterBreak=!1),this}get lineBreak(){return!1}};typeof Symbol<`u`&&(A.prototype[Symbol.iterator]=function(){return this.iter()},sn.prototype[Symbol.iterator]=cn.prototype[Symbol.iterator]=ln.prototype[Symbol.iterator]=function(){return this});var un=class{constructor(e,t,n,r){this.from=e,this.to=t,this.number=n,this.text=r}get length(){return this.to-this.from}};function dn(e,t,n){return t=Math.max(0,Math.min(e.length,t)),[t,Math.max(t,Math.min(e.length,n))]}function fn(e,t,n=!0,r=!0){return Jt(e,t,n,r)}function pn(e){return e>=56320&&e<57344}function mn(e){return e>=55296&&e<56320}function hn(e,t){let n=e.charCodeAt(t);if(!mn(n)||t+1==e.length)return n;let r=e.charCodeAt(t+1);return pn(r)?(n-55296<<10)+(r-56320)+65536:n}function gn(e){return e<65536?1:2}const _n=/\r\n?|\n/;var vn=(function(e){return e[e.Simple=0]=`Simple`,e[e.TrackDel=1]=`TrackDel`,e[e.TrackBefore=2]=`TrackBefore`,e[e.TrackAfter=3]=`TrackAfter`,e})(vn||={}),yn=class e{constructor(e){this.sections=e}get length(){let e=0;for(let t=0;t<this.sections.length;t+=2)e+=this.sections[t];return e}get newLength(){let e=0;for(let t=0;t<this.sections.length;t+=2){let n=this.sections[t+1];e+=n<0?this.sections[t]:n}return e}get empty(){return this.sections.length==0||this.sections.length==2&&this.sections[1]<0}iterGaps(e){for(let t=0,n=0,r=0;t<this.sections.length;){let i=this.sections[t++],a=this.sections[t++];a<0?(e(n,r,i),r+=i):r+=a,n+=i}}iterChangedRanges(e,t=!1){Cn(this,e,t)}get invertedDesc(){let t=[];for(let e=0;e<this.sections.length;){let n=this.sections[e++],r=this.sections[e++];r<0?t.push(n,r):t.push(r,n)}return new e(t)}composeDesc(e){return this.empty?e:e.empty?this:Tn(this,e)}mapDesc(e,t=!1){return e.empty?this:wn(this,e,t)}mapPos(e,t=-1,n=vn.Simple){let r=0,i=0;for(let a=0;a<this.sections.length;){let o=this.sections[a++],s=this.sections[a++],c=r+o;if(s<0){if(c>e)return i+(e-r);i+=o}else{if(n!=vn.Simple&&c>=e&&(n==vn.TrackDel&&r<e&&c>e||n==vn.TrackBefore&&r<e||n==vn.TrackAfter&&c>e))return null;if(c>e||c==e&&t<0&&!o)return e==r||t<0?i:i+s;i+=s}r=c}if(e>r)throw RangeError(`Position ${e} is out of range for changeset of length ${r}`);return i}touchesRange(e,t=e){for(let n=0,r=0;n<this.sections.length&&r<=t;){let i=this.sections[n++],a=this.sections[n++],o=r+i;if(a>=0&&r<=t&&o>=e)return r<e&&o>t?`cover`:!0;r=o}return!1}toString(){let e=``;for(let t=0;t<this.sections.length;){let n=this.sections[t++],r=this.sections[t++];e+=(e?` `:``)+n+(r>=0?`:`+r:``)}return e}toJSON(){return this.sections}static fromJSON(t){if(!Array.isArray(t)||t.length%2||t.some(e=>typeof e!=`number`))throw RangeError(`Invalid JSON representation of ChangeDesc`);return new e(t)}static create(t){return new e(t)}},bn=class e extends yn{constructor(e,t){super(e),this.inserted=t}apply(e){if(this.length!=e.length)throw RangeError(`Applying change set to a document with the wrong length`);return Cn(this,(t,n,r,i,a)=>e=e.replace(r,r+(n-t),a),!1),e}mapDesc(e,t=!1){return wn(this,e,t,!0)}invert(t){let n=this.sections.slice(),r=[];for(let e=0,i=0;e<n.length;e+=2){let a=n[e],o=n[e+1];if(o>=0){n[e]=o,n[e+1]=a;let s=e>>1;for(;r.length<s;)r.push(A.empty);r.push(a?t.slice(i,i+a):A.empty)}i+=a}return new e(n,r)}compose(e){return this.empty?e:e.empty?this:Tn(this,e,!0)}map(e,t=!1){return e.empty?this:wn(this,e,t,!0)}iterChanges(e,t=!1){Cn(this,e,t)}get desc(){return yn.create(this.sections)}filter(t){let n=[],r=[],i=[],a=new En(this);done:for(let e=0,o=0;;){let s=e==t.length?1e9:t[e++];for(;o<s||o==s&&a.len==0;){if(a.done)break done;let e=Math.min(a.len,s-o);xn(i,e,-1);let t=a.ins==-1?-1:a.off==0?a.ins:0;xn(n,e,t),t>0&&Sn(r,n,a.text),a.forward(e),o+=e}let c=t[e++];for(;o<c;){if(a.done)break done;let e=Math.min(a.len,c-o);xn(n,e,-1),xn(i,e,a.ins==-1?-1:a.off==0?a.ins:0),a.forward(e),o+=e}}return{changes:new e(n,r),filtered:yn.create(i)}}toJSON(){let e=[];for(let t=0;t<this.sections.length;t+=2){let n=this.sections[t],r=this.sections[t+1];r<0?e.push(n):r==0?e.push([n]):e.push([n].concat(this.inserted[t>>1].toJSON()))}return e}static of(t,n,r){let i=[],a=[],o=0,s=null;function c(t=!1){if(!t&&!i.length)return;o<n&&xn(i,n-o,-1);let r=new e(i,a);s=s?s.compose(r.map(s)):r,i=[],a=[],o=0}function l(t){if(Array.isArray(t))for(let e of t)l(e);else if(t instanceof e){if(t.length!=n)throw RangeError(`Mismatched change set length (got ${t.length}, expected ${n})`);c(),s=s?s.compose(t.map(s)):t}else{let{from:e,to:s=e,insert:l}=t;if(e>s||e<0||s>n)throw RangeError(`Invalid change range ${e} to ${s} (in doc of length ${n})`);let u=l?typeof l==`string`?A.of(l.split(r||_n)):l:A.empty,d=u.length;if(e==s&&d==0)return;e<o&&c(),e>o&&xn(i,e-o,-1),xn(i,s-e,d),Sn(a,i,u),o=s}}return l(t),c(!s),s}static empty(t){return new e(t?[t,-1]:[],[])}static fromJSON(t){if(!Array.isArray(t))throw RangeError(`Invalid JSON representation of ChangeSet`);let n=[],r=[];for(let e=0;e<t.length;e++){let i=t[e];if(typeof i==`number`)n.push(i,-1);else if(!Array.isArray(i)||typeof i[0]!=`number`||i.some((e,t)=>t&&typeof e!=`string`))throw RangeError(`Invalid JSON representation of ChangeSet`);else if(i.length==1)n.push(i[0],0);else{for(;r.length<e;)r.push(A.empty);r[e]=A.of(i.slice(1)),n.push(i[0],r[e].length)}}return new e(n,r)}static createSet(t,n){return new e(t,n)}};function xn(e,t,n,r=!1){if(t==0&&n<=0)return;let i=e.length-2;i>=0&&n<=0&&n==e[i+1]?e[i]+=t:i>=0&&t==0&&e[i]==0?e[i+1]+=n:r?(e[i]+=t,e[i+1]+=n):e.push(t,n)}function Sn(e,t,n){if(n.length==0)return;let r=t.length-2>>1;if(r<e.length)e[e.length-1]=e[e.length-1].append(n);else{for(;e.length<r;)e.push(A.empty);e.push(n)}}function Cn(e,t,n){let r=e.inserted;for(let i=0,a=0,o=0;o<e.sections.length;){let s=e.sections[o++],c=e.sections[o++];if(c<0)i+=s,a+=s;else{let l=i,u=a,d=A.empty;for(;l+=s,u+=c,c&&r&&(d=d.append(r[o-2>>1])),!(n||o==e.sections.length||e.sections[o+1]<0);)s=e.sections[o++],c=e.sections[o++];t(i,l,a,u,d),i=l,a=u}}}function wn(e,t,n,r=!1){let i=[],a=r?[]:null,o=new En(e),s=new En(t);for(let e=-1;;)if(o.done&&s.len||s.done&&o.len)throw Error(`Mismatched change set lengths`);else if(o.ins==-1&&s.ins==-1){let e=Math.min(o.len,s.len);xn(i,e,-1),o.forward(e),s.forward(e)}else if(s.ins>=0&&(o.ins<0||e==o.i||o.off==0&&(s.len<o.len||s.len==o.len&&!n))){let t=s.len;for(xn(i,s.ins,-1);t;){let n=Math.min(o.len,t);o.ins>=0&&e<o.i&&o.len<=n&&(xn(i,0,o.ins),a&&Sn(a,i,o.text),e=o.i),o.forward(n),t-=n}s.next()}else if(o.ins>=0){let t=0,n=o.len;for(;n;)if(s.ins==-1){let e=Math.min(n,s.len);t+=e,n-=e,s.forward(e)}else if(s.ins==0&&s.len<n)n-=s.len,s.next();else break;xn(i,t,e<o.i?o.ins:0),a&&e<o.i&&Sn(a,i,o.text),e=o.i,o.forward(o.len-n)}else if(o.done&&s.done)return a?bn.createSet(i,a):yn.create(i);else throw Error(`Mismatched change set lengths`)}function Tn(e,t,n=!1){let r=[],i=n?[]:null,a=new En(e),o=new En(t);for(let e=!1;;)if(a.done&&o.done)return i?bn.createSet(r,i):yn.create(r);else if(a.ins==0)xn(r,a.len,0,e),a.next();else if(o.len==0&&!o.done)xn(r,0,o.ins,e),i&&Sn(i,r,o.text),o.next();else if(a.done||o.done)throw Error(`Mismatched change set lengths`);else{let t=Math.min(a.len2,o.len),n=r.length;if(a.ins==-1){let n=o.ins==-1?-1:o.off?0:o.ins;xn(r,t,n,e),i&&n&&Sn(i,r,o.text)}else o.ins==-1?(xn(r,a.off?0:a.len,t,e),i&&Sn(i,r,a.textBit(t))):(xn(r,a.off?0:a.len,o.off?0:o.ins,e),i&&!o.off&&Sn(i,r,o.text));e=(a.ins>t||o.ins>=0&&o.len>t)&&(e||r.length>n),a.forward2(t),o.forward(t)}}var En=class{constructor(e){this.set=e,this.i=0,this.next()}next(){let{sections:e}=this.set;this.i<e.length?(this.len=e[this.i++],this.ins=e[this.i++]):(this.len=0,this.ins=-2),this.off=0}get done(){return this.ins==-2}get len2(){return this.ins<0?this.len:this.ins}get text(){let{inserted:e}=this.set,t=this.i-2>>1;return t>=e.length?A.empty:e[t]}textBit(e){let{inserted:t}=this.set,n=this.i-2>>1;return n>=t.length&&!e?A.empty:t[n].slice(this.off,e==null?void 0:this.off+e)}forward(e){e==this.len?this.next():(this.len-=e,this.off+=e)}forward2(e){this.ins==-1?this.forward(e):e==this.ins?this.next():(this.ins-=e,this.off+=e)}},Dn=class e{constructor(e,t,n,r){this.from=e,this.to=t,this.flags=n,this.goalColumn=r}get anchor(){return this.flags&32?this.to:this.from}get head(){return this.flags&32?this.from:this.to}get empty(){return this.from==this.to}get assoc(){return this.flags&8?-1:this.flags&16?1:0}get undirectional(){return(this.flags&64)>0}get bidiLevel(){let e=this.flags&7;return e==7?null:e}map(t,n=-1){let r,i;return this.empty?r=i=t.mapPos(this.from,n):(r=t.mapPos(this.from,1),i=t.mapPos(this.to,-1)),r==this.from&&i==this.to?this:new e(r,i,this.flags,this.goalColumn)}extend(e,t=e,n=0){if(e<=this.anchor&&t>=this.anchor)return j.range(e,t,void 0,void 0,n);let r=Math.abs(e-this.anchor)>Math.abs(t-this.anchor)?e:t;return j.range(this.anchor,r,void 0,void 0,n)}eq(e,t=!1){return this.anchor==e.anchor&&this.head==e.head&&this.goalColumn==e.goalColumn&&(!t||!this.empty||this.assoc==e.assoc)}toJSON(){return{anchor:this.anchor,head:this.head}}static fromJSON(e){if(!e||typeof e.anchor!=`number`||typeof e.head!=`number`)throw RangeError(`Invalid JSON representation for SelectionRange`);return j.range(e.anchor,e.head)}static create(t,n,r,i){return new e(t,n,r,i)}},j=class e{constructor(e,t){this.ranges=e,this.mainIndex=t}map(t,n=-1){return t.empty?this:e.create(this.ranges.map(e=>e.map(t,n)),this.mainIndex)}eq(e,t=!1){if(this.ranges.length!=e.ranges.length||this.mainIndex!=e.mainIndex)return!1;for(let n=0;n<this.ranges.length;n++)if(!this.ranges[n].eq(e.ranges[n],t))return!1;return!0}get main(){return this.ranges[this.mainIndex]}asSingle(){return this.ranges.length==1?this:new e([this.main],0)}addRange(t,n=!0){return e.create([t].concat(this.ranges),n?0:this.mainIndex+1)}replaceRange(t,n=this.mainIndex){let r=this.ranges.slice();return r[n]=t,e.create(r,this.mainIndex)}toJSON(){return{ranges:this.ranges.map(e=>e.toJSON()),main:this.mainIndex}}static fromJSON(t){if(!t||!Array.isArray(t.ranges)||typeof t.main!=`number`||t.main>=t.ranges.length)throw RangeError(`Invalid JSON representation for EditorSelection`);return new e(t.ranges.map(e=>Dn.fromJSON(e)),t.main)}static single(t,n=t){return new e([e.range(t,n)],0)}static create(t,n=0){if(t.length==0)throw RangeError(`A selection needs at least one range`);for(let r=0,i=0;i<t.length;i++){let a=t[i];if(a.empty?a.from<=r:a.from<r)return e.normalized(t.slice(),n);r=a.to}return new e(t,n)}static cursor(e,t=0,n,r){return Dn.create(e,e,(t==0?0:t<0?8:16)|(n==null?7:Math.min(6,n)),r)}static range(e,t,n,r,i){let a=r==null?7:Math.min(6,r);return!i&&e!=t&&(i=t<e?1:-1),i&&(a|=i<0?8:16),t<e?Dn.create(t,e,a|32,n):Dn.create(e,t,a,n)}static undirectionalRange(e,t){return Dn.create(e,t,64,void 0)}static normalized(t,n=0){let r=t[n];t.sort((e,t)=>e.from-t.from),n=t.indexOf(r);for(let r=1;r<t.length;r++){let i=t[r],a=t[r-1];if(i.empty?i.from<=a.to:i.from<a.to){let o=a.from,s=Math.max(i.to,a.to);r<=n&&n--,t.splice(--r,2,i.anchor>i.head?e.range(s,o):e.range(o,s))}}return new e(t,n)}};function On(e,t){for(let n of e.ranges)if(n.to>t)throw RangeError(`Selection points outside of document`)}let kn=0;var M=class e{constructor(e,t,n,r,i){this.combine=e,this.compareInput=t,this.compare=n,this.isStatic=r,this.id=kn++,this.default=e([]),this.extensions=typeof i==`function`?i(this):i}get reader(){return this}static define(t={}){return new e(t.combine||(e=>e),t.compareInput||((e,t)=>e===t),t.compare||(t.combine?(e,t)=>e===t:An),!!t.static,t.enables)}of(e){return new jn([],this,0,e)}compute(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new jn(e,this,1,t)}computeN(e,t){if(this.isStatic)throw Error(`Can't compute a static facet`);return new jn(e,this,2,t)}from(e,t){return t||=e=>e,this.compute([e],n=>t(n.field(e)))}};function An(e,t){return e==t||e.length==t.length&&e.every((e,n)=>e===t[n])}var jn=class{constructor(e,t,n,r){this.dependencies=e,this.facet=t,this.type=n,this.value=r,this.id=kn++}dynamicSlot(e){let t=this.value,n=this.facet.compareInput,r=this.id,i=e[r]>>1,a=this.type==2,o=!1,s=!1,c=[];for(let t of this.dependencies)t==`doc`?o=!0:t==`selection`?s=!0:(e[t.id]??1)&1||c.push(e[t.id]);return{create(e){return e.values[i]=t(e),1},update(e,r){if(o&&r.docChanged||s&&(r.docChanged||r.selection)||Nn(e,c)){let r=t(e);if(a?!Mn(r,e.values[i],n):!n(r,e.values[i]))return e.values[i]=r,1}return 0},reconfigure:(e,o)=>{let s,c=o.config.address[r];if(c!=null){let r=Kn(o,c);if(this.dependencies.every(t=>t instanceof M?o.facet(t)===e.facet(t):t instanceof In?o.field(t,!1)==e.field(t,!1):!0)||(a?Mn(s=t(e),r,n):n(s=t(e),r)))return e.values[i]=r,0}else s=t(e);return e.values[i]=s,1}}}get extension(){return this}};function Mn(e,t,n){if(e.length!=t.length)return!1;for(let r=0;r<e.length;r++)if(!n(e[r],t[r]))return!1;return!0}function Nn(e,t){let n=!1;for(let r of t)Gn(e,r)&1&&(n=!0);return n}function Pn(e,t,n){let r=n.map(t=>e[t.id]),i=n.map(e=>e.type),a=r.filter(e=>!(e&1)),o=e[t.id]>>1;function s(e){let n=[];for(let t=0;t<r.length;t++){let a=Kn(e,r[t]);if(i[t]==2)for(let e of a)n.push(e);else n.push(a)}return t.combine(n)}return{create(e){for(let t of r)Gn(e,t);return e.values[o]=s(e),1},update(e,n){if(!Nn(e,a))return 0;let r=s(e);return t.compare(r,e.values[o])?0:(e.values[o]=r,1)},reconfigure(e,i){let a=Nn(e,r),c=i.config.facets[t.id],l=i.facet(t);if(c&&!a&&An(n,c))return e.values[o]=l,0;let u=s(e);return t.compare(u,l)?(e.values[o]=l,0):(e.values[o]=u,1)}}}const Fn=M.define({static:!0});var In=class e{constructor(e,t,n,r,i){this.id=e,this.createF=t,this.updateF=n,this.compareF=r,this.spec=i,this.provides=void 0}static define(t){let n=new e(kn++,t.create,t.update,t.compare||((e,t)=>e===t),t);return t.provide&&(n.provides=t.provide(n)),n}create(e){return(e.facet(Fn).find(e=>e.field==this)?.create||this.createF)(e)}slot(e){let t=e[this.id]>>1;return{create:e=>(e.values[t]=this.create(e),1),update:(e,n)=>{let r=e.values[t],i=this.updateF(r,n);return this.compareF(r,i)?0:(e.values[t]=i,1)},reconfigure:(e,n)=>{let r=e.facet(Fn),i=n.facet(Fn),a;return(a=r.find(e=>e.field==this))&&a!=i.find(e=>e.field==this)?(e.values[t]=a.create(e),1):n.config.address[this.id]==null?(e.values[t]=this.create(e),1):(e.values[t]=n.field(this),0)}}}init(e){return[this,Fn.of({field:this,create:e})]}get extension(){return this}};const Ln={lowest:4,low:3,default:2,high:1,highest:0};function Rn(e){return t=>new Bn(t,e)}const zn={highest:Rn(Ln.highest),high:Rn(Ln.high),default:Rn(Ln.default),low:Rn(Ln.low),lowest:Rn(Ln.lowest)};var Bn=class{constructor(e,t){this.inner=e,this.prec=t}get extension(){return this}},Vn=class e{of(e){return new Hn(this,e)}reconfigure(t){return e.reconfigure.of({compartment:this,extension:t})}get(e){return e.config.compartments.get(this)}},Hn=class{constructor(e,t){this.compartment=e,this.inner=t}get extension(){return this}},Un=class e{constructor(e,t,n,r,i,a){for(this.base=e,this.compartments=t,this.dynamicSlots=n,this.address=r,this.staticValues=i,this.facets=a,this.statusTemplate=[];this.statusTemplate.length<n.length;)this.statusTemplate.push(0)}staticFacet(e){let t=this.address[e.id];return t==null?e.default:this.staticValues[t>>1]}static resolve(t,n,r){let i=[],a=Object.create(null),o=new Map;for(let e of Wn(t,n,o))e instanceof In?i.push(e):(a[e.facet.id]||(a[e.facet.id]=[])).push(e);let s=Object.create(null),c=[],l=[];for(let e of i)s[e.id]=l.length<<1,l.push(t=>e.slot(t));let u=r?.config.facets;for(let e in a){let t=a[e],n=t[0].facet,i=u&&u[e]||[];if(t.every(e=>e.type==0))if(s[n.id]=c.length<<1|1,An(i,t))c.push(r.facet(n));else{let e=n.combine(t.map(e=>e.value));c.push(r&&n.compare(e,r.facet(n))?r.facet(n):e)}else{for(let e of t)e.type==0?(s[e.id]=c.length<<1|1,c.push(e.value)):(s[e.id]=l.length<<1,l.push(t=>e.dynamicSlot(t)));s[n.id]=l.length<<1,l.push(e=>Pn(e,n,t))}}let d=l.map(e=>e(s));return new e(t,o,d,s,c,a)}};function Wn(e,t,n){let r=[[],[],[],[],[]],i=new Map;function a(e,o){let s=i.get(e);if(s!=null){if(s<=o)return;let t=r[s].indexOf(e);t>-1&&r[s].splice(t,1),e instanceof Hn&&n.delete(e.compartment)}if(i.set(e,o),Array.isArray(e))for(let t of e)a(t,o);else if(e instanceof Hn){if(n.has(e.compartment))throw RangeError(`Duplicate use of compartment in extensions`);let r=t.get(e.compartment)||e.inner;n.set(e.compartment,r),a(r,o)}else if(e instanceof Bn)a(e.inner,e.prec);else if(e instanceof In)r[o].push(e),e.provides&&a(e.provides,o);else if(e instanceof jn)r[o].push(e),e.facet.extensions&&a(e.facet.extensions,Ln.default);else{let t=e.extension;if(!t)throw Error(`Unrecognized extension value in extension set (${e}).`);if(t==e)throw Error(`Unrecognized extension value in extension set (${e}). This sometimes happens because multiple instances of @codemirror/state are loaded, breaking instanceof checks.`);a(t,o)}}return a(e,Ln.default),r.reduce((e,t)=>e.concat(t))}function Gn(e,t){if(t&1)return 2;let n=t>>1,r=e.status[n];if(r==4)throw Error(`Cyclic dependency between fields and/or facets`);if(r&2)return r;e.status[n]=4;let i=e.computeSlot(e,e.config.dynamicSlots[n]);return e.status[n]=2|i}function Kn(e,t){return t&1?e.config.staticValues[t>>1]:e.values[t>>1]}const qn=M.define(),Jn=M.define({combine:e=>e.some(e=>e),static:!0}),Yn=M.define({combine:e=>e.length?e[0]:void 0,static:!0}),Xn=M.define(),Zn=M.define(),Qn=M.define(),$n=M.define({combine:e=>e.length?e[0]:!1});var er=class{constructor(e,t){this.type=e,this.value=t}static define(){return new tr}},tr=class{of(e){return new er(this,e)}},nr=class{constructor(e){this.map=e}of(e){return new N(this,e)}},N=class e{constructor(e,t){this.type=e,this.value=t}map(t){let n=this.type.map(this.value,t);return n===void 0?void 0:n==this.value?this:new e(this.type,n)}is(e){return this.type==e}static define(e={}){return new nr(e.map||(e=>e))}static mapEffects(e,t){if(!e.length)return e;let n=[];for(let r of e){let e=r.map(t);e&&n.push(e)}return n}};N.reconfigure=N.define(),N.appendConfig=N.define();var rr=class e{constructor(t,n,r,i,a,o){this.startState=t,this.changes=n,this.selection=r,this.effects=i,this.annotations=a,this.scrollIntoView=o,this._doc=null,this._state=null,r&&On(r,n.newLength),a.some(t=>t.type==e.time)||(this.annotations=a.concat(e.time.of(Date.now())))}static create(t,n,r,i,a,o){return new e(t,n,r,i,a,o)}get newDoc(){return this._doc||=this.changes.apply(this.startState.doc)}get newSelection(){return this.selection||this.startState.selection.map(this.changes)}get state(){return this._state||this.startState.applyTransaction(this),this._state}annotation(e){for(let t of this.annotations)if(t.type==e)return t.value}get docChanged(){return!this.changes.empty}get reconfigured(){return this.startState.config!=this.state.config}isUserEvent(t){let n=this.annotation(e.userEvent);return!!(n&&(n==t||n.length>t.length&&n.slice(0,t.length)==t&&n[t.length]==`.`))}};rr.time=er.define(),rr.userEvent=er.define(),rr.addToHistory=er.define(),rr.remote=er.define();function ir(e,t){let n=[];for(let r=0,i=0;;){let a,o;if(r<e.length&&(i==t.length||t[i]>=e[r]))a=e[r++],o=e[r++];else if(i<t.length)a=t[i++],o=t[i++];else return n;!n.length||n[n.length-1]<a?n.push(a,o):n[n.length-1]<o&&(n[n.length-1]=o)}}function ar(e,t,n){let r,i,a;return n?(r=t.changes,i=bn.empty(t.changes.length),a=e.changes.compose(t.changes)):(r=t.changes.map(e.changes),i=e.changes.mapDesc(t.changes,!0),a=e.changes.compose(r)),{changes:a,selection:t.selection?t.selection.map(i):e.selection?.map(r),effects:N.mapEffects(e.effects,r).concat(N.mapEffects(t.effects,i)),annotations:e.annotations.length?e.annotations.concat(t.annotations):t.annotations,scrollIntoView:e.scrollIntoView||t.scrollIntoView}}function or(e,t,n){let r=t.selection,i=dr(t.annotations);return t.userEvent&&(i=i.concat(rr.userEvent.of(t.userEvent))),{changes:t.changes instanceof bn?t.changes:bn.of(t.changes||[],n,e.facet(Yn)),selection:r&&(r instanceof j?r:j.single(r.anchor,r.head)),effects:dr(t.effects),annotations:i,scrollIntoView:!!t.scrollIntoView}}function sr(e,t,n){let r=or(e,t.length?t[0]:{},e.doc.length);t.length&&t[0].filter===!1&&(n=!1);for(let i=1;i<t.length;i++){t[i].filter===!1&&(n=!1);let a=!!t[i].sequential;r=ar(r,or(e,t[i],a?r.changes.newLength:e.doc.length),a)}let i=rr.create(e,r.changes,r.selection,r.effects,r.annotations,r.scrollIntoView);return lr(n?cr(i):i)}function cr(e){let t=e.startState,n=!0;for(let r of t.facet(Xn)){let t=r(e);if(t===!1){n=!1;break}Array.isArray(t)&&(n=n===!0?t:ir(n,t))}if(n!==!0){let r,i;if(n===!1)i=e.changes.invertedDesc,r=bn.empty(t.doc.length);else{let t=e.changes.filter(n);r=t.changes,i=t.filtered.mapDesc(t.changes).invertedDesc}e=rr.create(t,r,e.selection&&e.selection.map(i),N.mapEffects(e.effects,i),e.annotations,e.scrollIntoView)}let r=t.facet(Zn);for(let n=r.length-1;n>=0;n--){let i=r[n](e);e=i instanceof rr?i:Array.isArray(i)&&i.length==1&&i[0]instanceof rr?i[0]:sr(t,dr(i),!1)}return e}function lr(e){let t=e.startState,n=t.facet(Qn),r=e;for(let i=n.length-1;i>=0;i--){let a=n[i](e);a&&Object.keys(a).length&&(r=ar(r,or(t,a,e.changes.newLength),!0))}return r==e?e:rr.create(t,e.changes,e.selection,r.effects,r.annotations,r.scrollIntoView)}const ur=[];function dr(e){return e==null?ur:Array.isArray(e)?e:[e]}var fr=(function(e){return e[e.Word=0]=`Word`,e[e.Space=1]=`Space`,e[e.Other=2]=`Other`,e})(fr||={});const pr=/[\u00df\u0587\u0590-\u05f4\u0600-\u06ff\u3040-\u309f\u30a0-\u30ff\u3400-\u4db5\u4e00-\u9fcc\uac00-\ud7af]/;let mr;try{mr=RegExp(`[\\p{Alphabetic}\\p{Number}_]`,`u`)}catch{}function hr(e){if(mr)return mr.test(e);for(let t=0;t<e.length;t++){let n=e[t];if(/\w/.test(n)||n>`€`&&(n.toUpperCase()!=n.toLowerCase()||pr.test(n)))return!0}return!1}function gr(e){return t=>{if(!/\S/.test(t))return fr.Space;if(hr(t))return fr.Word;for(let n=0;n<e.length;n++)if(t.indexOf(e[n])>-1)return fr.Word;return fr.Other}}var P=class e{constructor(e,t,n,r,i,a){this.config=e,this.doc=t,this.selection=n,this.values=r,this.status=e.statusTemplate.slice(),this.computeSlot=i,a&&(a._state=this);for(let e=0;e<this.config.dynamicSlots.length;e++)Gn(this,e<<1);this.computeSlot=null}field(e,t=!0){let n=this.config.address[e.id];if(n==null){if(t)throw RangeError(`Field is not present in this state`);return}return Gn(this,n),Kn(this,n)}update(...e){return sr(this,e,!0)}applyTransaction(t){let n=this.config,{base:r,compartments:i}=n;for(let e of t.effects)e.is(Vn.reconfigure)?(n&&=(i=new Map,n.compartments.forEach((e,t)=>i.set(t,e)),null),i.set(e.value.compartment,e.value.extension)):e.is(N.reconfigure)?(n=null,r=e.value):e.is(N.appendConfig)&&(n=null,r=dr(r).concat(e.value));let a;n?a=t.startState.values.slice():(n=Un.resolve(r,i,this),a=new e(n,this.doc,this.selection,n.dynamicSlots.map(()=>null),(e,t)=>t.reconfigure(e,this),null).values);let o=t.startState.facet(Jn)?t.newSelection:t.newSelection.asSingle();new e(n,t.newDoc,o,a,(e,n)=>n.update(e,t),t)}replaceSelection(e){return typeof e==`string`&&(e=this.toText(e)),this.changeByRange(t=>({changes:{from:t.from,to:t.to,insert:e},range:j.cursor(t.from+e.length)}))}changeByRange(e){let t=this.selection,n=e(t.ranges[0]),r=this.changes(n.changes),i=[n.range],a=dr(n.effects);for(let n=1;n<t.ranges.length;n++){let o=e(t.ranges[n]),s=this.changes(o.changes),c=s.map(r);for(let e=0;e<n;e++)i[e]=i[e].map(c);let l=r.mapDesc(s,!0);i.push(o.range.map(l)),r=r.compose(c),a=N.mapEffects(a,c).concat(N.mapEffects(dr(o.effects),l))}return{changes:r,selection:j.create(i,t.mainIndex),effects:a}}changes(t=[]){return t instanceof bn?t:bn.of(t,this.doc.length,this.facet(e.lineSeparator))}toText(t){return A.of(t.split(this.facet(e.lineSeparator)||_n))}sliceDoc(e=0,t=this.doc.length){return this.doc.sliceString(e,t,this.lineBreak)}facet(e){let t=this.config.address[e.id];return t==null?e.default:(Gn(this,t),Kn(this,t))}toJSON(e){let t={doc:this.sliceDoc(),selection:this.selection.toJSON()};if(e)for(let n in e){let r=e[n];r instanceof In&&this.config.address[r.id]!=null&&(t[n]=r.spec.toJSON(this.field(e[n]),this))}return t}static fromJSON(t,n={},r){if(!t||typeof t.doc!=`string`)throw RangeError(`Invalid JSON representation for EditorState`);let i=[];if(r){for(let e in r)if(Object.prototype.hasOwnProperty.call(t,e)){let n=r[e],a=t[e];i.push(n.init(e=>n.spec.fromJSON(a,e)))}}return e.create({doc:t.doc,selection:j.fromJSON(t.selection),extensions:n.extensions?i.concat([n.extensions]):i})}static create(t={}){let n=Un.resolve(t.extensions||[],new Map),r=t.doc instanceof A?t.doc:A.of((t.doc||``).split(n.staticFacet(e.lineSeparator)||_n)),i=t.selection?t.selection instanceof j?t.selection:j.single(t.selection.anchor,t.selection.head):j.single(0);return On(i,r.length),n.staticFacet(Jn)||(i=i.asSingle()),new e(n,r,i,n.dynamicSlots.map(()=>null),(e,t)=>t.create(e),null)}get tabSize(){return this.facet(e.tabSize)}get lineBreak(){return this.facet(e.lineSeparator)||`
@@ -804,12 +818,12 @@ html[data-dsh-tw-active] .dshDesktopConversationSurface > :not([data-dsh-tw-view
804
818
  }`,{label:`interface`,detail:`definition`,type:`keyword`}),gf("type ${name} = ${type}",{label:`type`,detail:`definition`,type:`keyword`}),gf(`enum \${name} {
805
819
  \${}
806
820
  }`,{label:`enum`,detail:`definition`,type:`keyword`})]),Hh=new Yl,Uh=new Set([`Script`,`Block`,`FunctionExpression`,`FunctionDeclaration`,`ArrowFunction`,`MethodDeclaration`,`ForStatement`]);function Wh(e){return(t,n)=>{let r=t.node.getChild(`VariableDefinition`);return r&&n(r,e),!0}}const Gh=[`FunctionDeclaration`],Kh={FunctionDeclaration:Wh(`function`),ClassDeclaration:Wh(`class`),ClassExpression:()=>!0,EnumDeclaration:Wh(`constant`),TypeAliasDeclaration:Wh(`type`),NamespaceDeclaration:Wh(`namespace`),VariableDefinition(e,t){e.matchContext(Gh)||t(e,`variable`)},TypeDefinition(e,t){t(e,`type`)},__proto__:null};function qh(e,t){let n=Hh.get(t);if(n)return n;let r=[],i=!0;function a(t,n){let i=e.sliceString(t.from,t.to);r.push({label:i,type:n})}return t.cursor(G.IncludeAnonymous).iterate(t=>{if(i)i=!1;else if(t.name){let e=Kh[t.name];if(e&&e(t,a)||Uh.has(t.name))return!1}else if(t.to-t.from>8192){for(let n of qh(e,t.node))r.push(n);return!1}}),Hh.set(t,r),r}const Jh=/^[\w$\xa1-\uffff][\w$\d\xa1-\uffff]*$/,Yh=[`TemplateString`,`String`,`RegExp`,`LineComment`,`BlockComment`,`VariableDefinition`,`TypeDefinition`,`Label`,`PropertyDefinition`,`PropertyName`,`PrivatePropertyDefinition`,`PrivatePropertyName`,`JSXText`,`JSXAttributeValue`,`JSXOpenTag`,`JSXCloseTag`,`JSXSelfClosingTag`,`.`,`?.`];function Xh(e){let t=Y(e.state).resolveInner(e.pos,-1);if(Yh.indexOf(t.name)>-1)return null;let n=t.name==`VariableName`||t.to-t.from<20&&Jh.test(e.state.sliceDoc(t.from,t.to));if(!n&&!e.explicit)return null;let r=[];for(let n=t;n;n=n.parent)Uh.has(n.name)&&(r=r.concat(qh(e.state.doc,n)));return{options:r,from:n?t.from:e.pos,validFor:Jh}}const Zh=Ku.define({name:`javascript`,parser:zh.configure({props:[ud.add({IfStatement:Sd({except:/^\s*({|else\b)/}),TryStatement:Sd({except:/^\s*({|catch\b|finally\b)/}),LabeledStatement:xd,SwitchBody:e=>{let t=e.textAfter,n=/^\s*\}/.test(t),r=/^\s*(case|default)\b/.test(t);return e.baseIndent+(n?0:r?1:2)*e.unit},Block:yd({closing:`}`}),ArrowFunction:e=>e.baseIndent+e.unit,"TemplateString BlockComment":()=>null,"Statement Property":Sd({except:/^\s*{/}),JSXElement(e){let t=/^\s*<\//.test(e.textAfter);return e.lineIndent(e.node.from)+(t?0:e.unit)},JSXEscape(e){let t=/\s*\}/.test(e.textAfter);return e.lineIndent(e.node.from)+(t?0:e.unit)},"JSXOpenTag JSXSelfClosingTag"(e){return e.column(e.node.from)+e.unit}}),wd.add({"Block ClassBody SwitchBody EnumBody ObjectExpression ArrayExpression ObjectType":Td,BlockComment(e){return{from:e.from+2,to:e.to-2}},JSXElement(e){let t=e.firstChild;if(!t||t.name==`JSXSelfClosingTag`)return null;let n=e.lastChild;return{from:t.to,to:n.type.isError?e.to:n.from}},"JSXSelfClosingTag JSXOpenTag"(e){let t=e.firstChild?.nextSibling,n=e.lastChild;return!t||t.type.isError?null:{from:t.to,to:n.type.isError?e.to:n.from}}})]}),languageData:{closeBrackets:{brackets:[`(`,`[`,`{`,`'`,`"`,"`"]},commentTokens:{line:`//`,block:{open:`/*`,close:`*/`}},indentOnInput:/^\s*(?:case |default:|\{|\}|<\/)$/,wordChars:`$`}}),Qh={test:e=>/^JSX/.test(e.name),facet:Hu({commentTokens:{block:{open:`{/*`,close:`*/}`}}})},$h=Zh.configure({dialect:`ts`},`typescript`),eg=Zh.configure({dialect:`jsx`,props:[Uu.add(e=>e.isTop?[Qh]:void 0)]}),tg=Zh.configure({dialect:`jsx ts`,props:[Uu.add(e=>e.isTop?[Qh]:void 0)]},`typescript`);let ng=e=>({label:e,type:`keyword`});const rg=`break case const continue default delete export extends false finally in instanceof let new return static super switch this throw true typeof var yield`.split(` `).map(ng),ig=rg.concat([`declare`,`implements`,`private`,`protected`,`public`].map(ng));function ag(e={}){let t=e.jsx?e.typescript?tg:eg:e.typescript?$h:Zh,n=e.typescript?Vh.concat(ig):Bh.concat(rg);return new nd(t,[Zh.data.of({autocomplete:Xd(Yh,Yd(n))}),Zh.data.of({autocomplete:Xh}),e.jsx?lg:[]])}function og(e){for(;;){if(e.name==`JSXOpenTag`||e.name==`JSXSelfClosingTag`||e.name==`JSXFragmentTag`)return e;if(e.name==`JSXEscape`||!e.parent)return null;e=e.parent}}function sg(e,t,n=e.length){for(let r=t?.firstChild;r;r=r.nextSibling)if(r.name==`JSXIdentifier`||r.name==`JSXBuiltin`||r.name==`JSXNamespacedName`||r.name==`JSXMemberExpression`)return e.sliceString(r.from,Math.min(r.to,n));return``}const cg=typeof navigator==`object`&&/Android\b/.test(navigator.userAgent),lg=H.inputHandler.of((e,t,n,r,i)=>{if((cg?e.composing:e.compositionStarted)||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!Zh.isActiveAt(e.state,t,-1))return!1;let a=i(),{state:o}=a,s=o.changeByRange(e=>{let{head:t}=e,n=Y(o).resolveInner(t-1,-1),i;if(n.name==`JSXStartTag`&&(n=n.parent),!(o.doc.sliceString(t-1,t)!=r||n.name==`JSXAttributeValue`&&n.to>t)){if(r==`>`&&n.name==`JSXFragmentTag`)return{range:e,changes:{from:t,insert:`</>`}};if(r==`/`&&n.name==`JSXStartCloseTag`){let e=n.parent,r=e.parent;if(r&&e.from==t-2&&((i=sg(o.doc,r.firstChild,t))||r.firstChild?.name==`JSXFragmentTag`)){let e=`${i}>`;return{range:j.cursor(t+e.length,-1),changes:{from:t,insert:e}}}}else if(r==`>`){let r=og(n);if(r&&r.name==`JSXOpenTag`&&!/^\/?>|^<\//.test(o.doc.sliceString(t,t+2))&&(i=sg(o.doc,r,t)))return{range:e,changes:{from:t,insert:`</${i}>`}}}}return{range:e}});return s.changes.empty?!1:(e.dispatch([a,o.update(s,{userEvent:`input.complete`,scrollIntoView:!0})]),!0)}),ug=[`_blank`,`_self`,`_top`,`_parent`],dg=[`ascii`,`utf-8`,`utf-16`,`latin1`,`latin1`],fg=[`get`,`post`,`put`,`delete`],pg=[`application/x-www-form-urlencoded`,`multipart/form-data`,`text/plain`],mg=[`true`,`false`],Q={},hg={a:{attrs:{href:null,ping:null,type:null,media:null,target:ug,hreflang:null}},abbr:Q,address:Q,area:{attrs:{alt:null,coords:null,href:null,target:null,ping:null,media:null,hreflang:null,type:null,shape:[`default`,`rect`,`circle`,`poly`]}},article:Q,aside:Q,audio:{attrs:{src:null,mediagroup:null,crossorigin:[`anonymous`,`use-credentials`],preload:[`none`,`metadata`,`auto`],autoplay:[`autoplay`],loop:[`loop`],controls:[`controls`]}},b:Q,base:{attrs:{href:null,target:ug}},bdi:Q,bdo:Q,blockquote:{attrs:{cite:null}},body:Q,br:Q,button:{attrs:{form:null,formaction:null,name:null,value:null,autofocus:[`autofocus`],disabled:[`autofocus`],formenctype:pg,formmethod:fg,formnovalidate:[`novalidate`],formtarget:ug,type:[`submit`,`reset`,`button`]}},canvas:{attrs:{width:null,height:null}},caption:Q,center:Q,cite:Q,code:Q,col:{attrs:{span:null}},colgroup:{attrs:{span:null}},command:{attrs:{type:[`command`,`checkbox`,`radio`],label:null,icon:null,radiogroup:null,command:null,title:null,disabled:[`disabled`],checked:[`checked`]}},data:{attrs:{value:null}},datagrid:{attrs:{disabled:[`disabled`],multiple:[`multiple`]}},datalist:{attrs:{data:null}},dd:Q,del:{attrs:{cite:null,datetime:null}},details:{attrs:{open:[`open`]}},dfn:Q,div:Q,dl:Q,dt:Q,em:Q,embed:{attrs:{src:null,type:null,width:null,height:null}},eventsource:{attrs:{src:null}},fieldset:{attrs:{disabled:[`disabled`],form:null,name:null}},figcaption:Q,figure:Q,footer:Q,form:{attrs:{action:null,name:null,"accept-charset":dg,autocomplete:[`on`,`off`],enctype:pg,method:fg,novalidate:[`novalidate`],target:ug}},h1:Q,h2:Q,h3:Q,h4:Q,h5:Q,h6:Q,head:{children:[`title`,`base`,`link`,`style`,`meta`,`script`,`noscript`,`command`]},header:Q,hgroup:Q,hr:Q,html:{attrs:{manifest:null}},i:Q,iframe:{attrs:{src:null,srcdoc:null,name:null,width:null,height:null,sandbox:[`allow-top-navigation`,`allow-same-origin`,`allow-forms`,`allow-scripts`],seamless:[`seamless`]}},img:{attrs:{alt:null,src:null,ismap:null,usemap:null,width:null,height:null,crossorigin:[`anonymous`,`use-credentials`]}},input:{attrs:{alt:null,dirname:null,form:null,formaction:null,height:null,list:null,max:null,maxlength:null,min:null,name:null,pattern:null,placeholder:null,size:null,src:null,step:null,value:null,width:null,accept:[`audio/*`,`video/*`,`image/*`],autocomplete:[`on`,`off`],autofocus:[`autofocus`],checked:[`checked`],disabled:[`disabled`],formenctype:pg,formmethod:fg,formnovalidate:[`novalidate`],formtarget:ug,multiple:[`multiple`],readonly:[`readonly`],required:[`required`],type:[`hidden`,`text`,`search`,`tel`,`url`,`email`,`password`,`datetime`,`date`,`month`,`week`,`time`,`datetime-local`,`number`,`range`,`color`,`checkbox`,`radio`,`file`,`submit`,`image`,`reset`,`button`]}},ins:{attrs:{cite:null,datetime:null}},kbd:Q,keygen:{attrs:{challenge:null,form:null,name:null,autofocus:[`autofocus`],disabled:[`disabled`],keytype:[`RSA`]}},label:{attrs:{for:null,form:null}},legend:Q,li:{attrs:{value:null}},link:{attrs:{href:null,type:null,hreflang:null,media:null,sizes:[`all`,`16x16`,`16x16 32x32`,`16x16 32x32 64x64`]}},map:{attrs:{name:null}},mark:Q,menu:{attrs:{label:null,type:[`list`,`context`,`toolbar`]}},meta:{attrs:{content:null,charset:dg,name:[`viewport`,`application-name`,`author`,`description`,`generator`,`keywords`],"http-equiv":[`content-language`,`content-type`,`default-style`,`refresh`]}},meter:{attrs:{value:null,min:null,low:null,high:null,max:null,optimum:null}},nav:Q,noscript:Q,object:{attrs:{data:null,type:null,name:null,usemap:null,form:null,width:null,height:null,typemustmatch:[`typemustmatch`]}},ol:{attrs:{reversed:[`reversed`],start:null,type:[`1`,`a`,`A`,`i`,`I`]},children:[`li`,`script`,`template`,`ul`,`ol`]},optgroup:{attrs:{disabled:[`disabled`],label:null}},option:{attrs:{disabled:[`disabled`],label:null,selected:[`selected`],value:null}},output:{attrs:{for:null,form:null,name:null}},p:Q,param:{attrs:{name:null,value:null}},pre:Q,progress:{attrs:{value:null,max:null}},q:{attrs:{cite:null}},rp:Q,rt:Q,ruby:Q,samp:Q,script:{attrs:{type:[`text/javascript`],src:null,async:[`async`],defer:[`defer`],charset:dg}},section:Q,select:{attrs:{form:null,name:null,size:null,autofocus:[`autofocus`],disabled:[`disabled`],multiple:[`multiple`]}},slot:{attrs:{name:null}},small:Q,source:{attrs:{src:null,type:null,media:null}},span:Q,strong:Q,style:{attrs:{type:[`text/css`],media:null,scoped:null}},sub:Q,summary:Q,sup:Q,table:Q,tbody:Q,td:{attrs:{colspan:null,rowspan:null,headers:null}},template:Q,textarea:{attrs:{dirname:null,form:null,maxlength:null,name:null,placeholder:null,rows:null,cols:null,autofocus:[`autofocus`],disabled:[`disabled`],readonly:[`readonly`],required:[`required`],wrap:[`soft`,`hard`]}},tfoot:Q,th:{attrs:{colspan:null,rowspan:null,headers:null,scope:[`row`,`col`,`rowgroup`,`colgroup`]}},thead:Q,time:{attrs:{datetime:null}},title:Q,tr:Q,track:{attrs:{src:null,label:null,default:null,kind:[`subtitles`,`captions`,`descriptions`,`chapters`,`metadata`],srclang:null}},ul:{children:[`li`,`script`,`template`,`ul`,`ol`]},var:Q,video:{attrs:{src:null,poster:null,width:null,height:null,crossorigin:[`anonymous`,`use-credentials`],preload:[`auto`,`metadata`,`none`],autoplay:[`autoplay`],mediagroup:[`movie`],muted:[`muted`],controls:[`controls`]}},wbr:Q},gg={accesskey:null,class:null,contenteditable:mg,contextmenu:null,dir:[`ltr`,`rtl`,`auto`],draggable:[`true`,`false`,`auto`],dropzone:[`copy`,`move`,`link`,`string:`,`file:`],hidden:[`hidden`],id:null,inert:[`inert`],itemid:null,itemprop:null,itemref:null,itemscope:[`itemscope`],itemtype:null,lang:[`ar`,`bn`,`de`,`en-GB`,`en-US`,`es`,`fr`,`hi`,`id`,`ja`,`pa`,`pt`,`ru`,`tr`,`zh`],spellcheck:mg,autocorrect:mg,autocapitalize:mg,style:null,tabindex:null,title:null,translate:[`yes`,`no`],rel:[`stylesheet`,`alternate`,`author`,`bookmark`,`help`,`license`,`next`,`nofollow`,`noreferrer`,`prefetch`,`prev`,`search`,`tag`],role:`alert application article banner button cell checkbox complementary contentinfo dialog document feed figure form grid gridcell heading img list listbox listitem main navigation region row rowgroup search switch tab table tabpanel textbox timer`.split(` `),"aria-activedescendant":null,"aria-atomic":mg,"aria-autocomplete":[`inline`,`list`,`both`,`none`],"aria-busy":mg,"aria-checked":[`true`,`false`,`mixed`,`undefined`],"aria-controls":null,"aria-describedby":null,"aria-disabled":mg,"aria-dropeffect":null,"aria-expanded":[`true`,`false`,`undefined`],"aria-flowto":null,"aria-grabbed":[`true`,`false`,`undefined`],"aria-haspopup":mg,"aria-hidden":mg,"aria-invalid":[`true`,`false`,`grammar`,`spelling`],"aria-label":null,"aria-labelledby":null,"aria-level":null,"aria-live":[`off`,`polite`,`assertive`],"aria-multiline":mg,"aria-multiselectable":mg,"aria-owns":null,"aria-posinset":null,"aria-pressed":[`true`,`false`,`mixed`,`undefined`],"aria-readonly":mg,"aria-relevant":null,"aria-required":mg,"aria-selected":[`true`,`false`,`undefined`],"aria-setsize":null,"aria-sort":[`ascending`,`descending`,`none`,`other`],"aria-valuemax":null,"aria-valuemin":null,"aria-valuenow":null,"aria-valuetext":null},_g=`beforeunload copy cut dragstart dragover dragleave dragenter dragend drag paste focus blur change click load mousedown mouseenter mouseleave mouseup keydown keyup resize scroll unload`.split(` `).map(e=>`on`+e);for(let e of _g)gg[e]=null;var vg=class{constructor(e,t){this.tags={...hg,...e},this.globalAttrs={...gg,...t},this.allTags=Object.keys(this.tags),this.globalAttrNames=Object.keys(this.globalAttrs)}};vg.default=new vg;function yg(e,t,n=e.length){if(!t)return``;let r=t.firstChild,i=r&&r.getChild(`TagName`);return i?e.sliceString(i.from,Math.min(i.to,n)):``}function bg(e,t=!1){for(;e;e=e.parent)if(e.name==`Element`)if(t)t=!1;else return e;return null}function xg(e,t,n){return n.tags[yg(e,bg(t))]?.children||n.allTags}function Sg(e,t){let n=[];for(let r=bg(t);r&&!r.type.isTop;r=bg(r.parent)){let i=yg(e,r);if(i&&r.lastChild.name==`CloseTag`)break;i&&n.indexOf(i)<0&&(t.name==`EndTag`||t.from>=r.firstChild.to)&&n.push(i)}return n}const Cg=/^[:\-\.\w\u00b7-\uffff]*$/;function wg(e,t,n,r,i){let a=/\s*>/.test(e.sliceDoc(i,i+5))?``:`>`,o=bg(n,n.name==`StartTag`||n.name==`TagName`);return{from:r,to:i,options:xg(e.doc,o,t).map(e=>({label:e,type:`type`})).concat(Sg(e.doc,n).map((e,t)=>({label:`/`+e,apply:`/`+e+a,type:`type`,boost:99-t}))),validFor:/^\/?[:\-\.\w\u00b7-\uffff]*$/}}function Tg(e,t,n,r){let i=/\s*>/.test(e.sliceDoc(r,r+5))?``:`>`;return{from:n,to:r,options:Sg(e.doc,t).map((e,t)=>({label:e,apply:e+i,type:`type`,boost:99-t})),validFor:Cg}}function Eg(e,t,n,r){let i=[],a=0;for(let r of xg(e.doc,n,t))i.push({label:`<`+r,type:`type`});for(let t of Sg(e.doc,n))i.push({label:`</`+t+`>`,type:`type`,boost:99-a++});return{from:r,to:r,options:i,validFor:/^<\/?[:\-\.\w\u00b7-\uffff]*$/}}function Dg(e,t,n,r,i){let a=bg(n),o=a?t.tags[yg(e.doc,a)]:null,s=o&&o.attrs?Object.keys(o.attrs):[];return{from:r,to:i,options:(o&&o.globalAttrs===!1?s:s.length?s.concat(t.globalAttrNames):t.globalAttrNames).map(e=>({label:e,type:`property`})),validFor:Cg}}function Og(e,t,n,r,i){let a=n.parent?.getChild(`AttributeName`),o=[],s;if(a){let c=e.sliceDoc(a.from,a.to),l=t.globalAttrs[c];if(!l){let r=bg(n),i=r?t.tags[yg(e.doc,r)]:null;l=i?.attrs&&i.attrs[c]}if(l){let t=e.sliceDoc(r,i).toLowerCase(),n=`"`,a=`"`;/^['"]/.test(t)?(s=t[0]==`"`?/^[^"]*$/:/^[^']*$/,n=``,a=e.sliceDoc(i,i+1)==t[0]?``:t[0],t=t.slice(1),r++):s=/^[^\s<>='"]*$/;for(let e of l)o.push({label:e,apply:n+e+a,type:`constant`})}}return{from:r,to:i,options:o,validFor:s}}function kg(e,t){let{state:n,pos:r}=t,i=Y(n).resolveInner(r,-1),a=i.resolve(r);for(let e=r,t;a==i&&(t=i.childBefore(e));){let n=t.lastChild;if(!n||!n.type.isError||n.from<n.to)break;a=i=t,e=n.from}return i.name==`TagName`?i.parent&&/CloseTag$/.test(i.parent.name)?Tg(n,i,i.from,r):wg(n,e,i,i.from,r):i.name==`StartTag`||i.name==`IncompleteTag`?wg(n,e,i,r,r):i.name==`StartCloseTag`||i.name==`IncompleteCloseTag`?Tg(n,i,r,r):i.name==`OpenTag`||i.name==`SelfClosingTag`||i.name==`AttributeName`?Dg(n,e,i,i.name==`AttributeName`?i.from:r,r):i.name==`Is`||i.name==`AttributeValue`||i.name==`UnquotedAttributeValue`?Og(n,e,i,i.name==`Is`?r:i.from,r):t.explicit&&(a.name==`Element`||a.name==`Text`||a.name==`Document`)?Eg(n,e,i,r):null}function Ag(e){return kg(vg.default,e)}function jg(e){let{extraTags:t,extraGlobalAttributes:n}=e,r=n||t?new vg(t,n):vg.default;return e=>kg(r,e)}const Mg=Zh.parser.configure({top:`SingleExpression`}),Ng=[{tag:`script`,attrs:e=>e.type==`text/typescript`||e.lang==`ts`,parser:$h.parser},{tag:`script`,attrs:e=>e.type==`text/babel`||e.type==`text/jsx`,parser:eg.parser},{tag:`script`,attrs:e=>e.type==`text/typescript-jsx`,parser:tg.parser},{tag:`script`,attrs(e){return/^(importmap|speculationrules|application\/(.+\+)?json)$/i.test(e.type)},parser:Mg},{tag:`script`,attrs(e){return!e.type||/^(?:text|application)\/(?:x-)?(?:java|ecma)script$|^module$|^$/i.test(e.type)},parser:Zh.parser},{tag:`style`,attrs(e){return(!e.lang||e.lang==`css`)&&(!e.type||/^(text\/)?(x-)?(stylesheet|css)$/i.test(e.type))},parser:Th.parser}],Pg=[{name:`style`,parser:Th.parser.configure({top:`Styles`})}].concat(_g.map(e=>({name:e,parser:Zh.parser}))),Fg=Ku.define({name:`html`,parser:Wm.configure({props:[ud.add({Element(e){let t=/^(\s*)(<\/)?/.exec(e.textAfter);return e.node.to<=e.pos+t[0].length?e.continue():e.lineIndent(e.node.from)+(t[2]?0:e.unit)},"OpenTag CloseTag SelfClosingTag"(e){return e.column(e.node.from)+e.unit},Document(e){if(e.pos+/\s*/.exec(e.textAfter)[0].length<e.node.to)return e.continue();let t=null,n;for(let n=e.node;;){let e=n.lastChild;if(!e||e.name!=`Element`||e.to!=n.to)break;t=n=e}return t&&!((n=t.lastChild)&&(n.name==`CloseTag`||n.name==`SelfClosingTag`))?e.lineIndent(t.from)+e.unit:null}}),wd.add({Element(e){let t=e.firstChild,n=e.lastChild;return!t||t.name!=`OpenTag`?null:{from:t.to,to:n.name==`CloseTag`?n.from:e.to}}}),Nd.add({"OpenTag CloseTag":e=>e.getChild(`TagName`)})]}),languageData:{commentTokens:{block:{open:`<!--`,close:`-->`}},indentOnInput:/^\s*<\/\w+\W$/,wordChars:`-_`}}),Ig=Fg.configure({wrap:Jm(Ng,Pg)});function Lg(e={}){let t=``,n;return e.matchClosingTags===!1&&(t=`noMatch`),e.selfClosingTags===!0&&(t=(t?t+` `:``)+`selfClosing`),(e.nestedLanguages&&e.nestedLanguages.length||e.nestedAttributes&&e.nestedAttributes.length)&&(n=Jm((e.nestedLanguages||[]).concat(Ng),(e.nestedAttributes||[]).concat(Pg))),new nd(n?Fg.configure({wrap:n,dialect:t}):t?Ig.configure({dialect:t}):Ig,[Ig.data.of({autocomplete:jg(e)}),e.autoCloseTags===!1?[]:Bg,ag().support,Eh().support])}const Rg=new Set(`area base br col command embed frame hr img input keygen link meta param source track wbr menuitem`.split(` `));function zg(e,t,n){for(;;){if(t.lastChild?.name!=`CloseTag`)return!1;let r=t.parent;if(!r||yg(e,r)!=n)return!0;t=r}}const Bg=H.inputHandler.of((e,t,n,r,i)=>{if(e.composing||e.state.readOnly||t!=n||r!=`>`&&r!=`/`||!Ig.isActiveAt(e.state,t,-1))return!1;let a=i(),{state:o}=a,s=o.changeByRange(e=>{let t=o.doc.sliceString(e.from-1,e.to)==r,{head:n}=e,i=Y(o).resolveInner(n,-1),a;if(t&&r==`>`&&i.name==`EndTag`){let t=i.parent;if((a=yg(o.doc,t.parent,n))&&!Rg.has(a)&&!zg(o.doc,t.parent,a))return{range:e,changes:{from:n,to:n+ +(o.doc.sliceString(n,n+1)===`>`),insert:`</${a}>`}}}else if(t&&r==`/`&&i.name==`IncompleteCloseTag`){let e=i.parent;if(i.from==n-2&&e.lastChild?.name!=`CloseTag`&&(a=yg(o.doc,e,n))&&!Rg.has(a)){let e=n+ +(o.doc.sliceString(n,n+1)===`>`),t=`${a}>`;return{range:j.cursor(n+t.length,-1),changes:{from:n,to:e,insert:t}}}}return{range:e}});return s.changes.empty?!1:(e.dispatch([a,o.update(s,{userEvent:`input.complete`,scrollIntoView:!0})]),!0)}),Vg=Hu({commentTokens:{block:{open:`<!--`,close:`-->`}}}),Hg=new U,Ug=Cp.configure({props:[wd.add(e=>!e.is(`Block`)||e.is(`Document`)||Wg(e)!=null||Gg(e)?void 0:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})),Hg.add(Wg),ud.add({Document:()=>null}),Vu.add({Document:Vg})]});function Wg(e){let t=/^(?:ATX|Setext)Heading(\d)$/.exec(e.name);return t?+t[1]:void 0}function Gg(e){return e.name==`OrderedList`||e.name==`BulletList`}function Kg(e,t){let n=e;for(;;){let e=n.nextSibling,r;if(!e||(r=Wg(e.type))!=null&&r<=t)break;n=e}return n.to}const qg=Cd.of((e,t,n)=>{for(let r=Y(e).resolveInner(n,-1);r&&!(r.from<t);r=r.parent){let e=r.type.prop(Hg);if(e==null)continue;let t=Kg(r,e);if(t>n)return{from:n,to:t}}return null});function Jg(e){return new Wu(Vg,e,[],`markdown`)}const Yg=Jg(Ug),Xg=Jg(Ug.configure([Up,Kp,Gp,qp,{props:[wd.add({Table:(e,t)=>({from:t.doc.lineAt(e.from).to,to:e.to})})]}]));function Zg(e,t){return n=>{if(n&&e){let t=null;if(n=/\S*/.exec(n)[0],t=typeof e==`function`?e(n):rd.matchLanguageName(e,n,!0),t instanceof rd)return t.support?t.support.language.parser:Yu.getSkippingParser(t.load());if(t)return t.parser}return t?t.parser:null}}var Qg=class{constructor(e,t,n,r,i,a,o){this.node=e,this.from=t,this.to=n,this.spaceBefore=r,this.spaceAfter=i,this.type=a,this.item=o}blank(e,t=!0){let n=this.spaceBefore+(this.node.name==`Blockquote`?`>`:``);if(e!=null){for(;n.length<e;)n+=` `;return n}else{for(let e=this.to-this.from-n.length-this.spaceAfter.length;e>0;e--)n+=` `;return n+(t?this.spaceAfter:``)}}marker(e,t){let n=this.node.name==`OrderedList`?String(+e_(this.item,e)[2]+t):``;return this.spaceBefore+n+this.type+this.spaceAfter}};function $g(e,t){let n=[],r=[];for(let t=e;t;t=t.parent){if(t.name==`FencedCode`)return r;(t.name==`ListItem`||t.name==`Blockquote`)&&n.push(t)}for(let e=n.length-1;e>=0;e--){let i=n[e],a,o=t.lineAt(i.from),s=i.from-o.from;if(i.name==`Blockquote`&&(a=/^ *>( ?)/.exec(o.text.slice(s))))r.push(new Qg(i,s,s+a[0].length,``,a[1],`>`,null));else if(i.name==`ListItem`&&i.parent.name==`OrderedList`&&(a=/^( *)\d+([.)])( *)/.exec(o.text.slice(s)))){let e=a[3],t=a[0].length;e.length>=4&&(e=e.slice(0,e.length-4),t-=4),r.push(new Qg(i.parent,s,s+t,a[1],e,a[2],i))}else if(i.name==`ListItem`&&i.parent.name==`BulletList`&&(a=/^( *)([-+*])( {1,4}\[[ xX]\])?( +)/.exec(o.text.slice(s)))){let e=a[4],t=a[0].length;e.length>4&&(e=e.slice(0,e.length-4),t-=4);let n=a[2];a[3]&&(n+=a[3].replace(/[xX]/,` `)),r.push(new Qg(i.parent,s,s+t,a[1],e,n,i))}}return r}function e_(e,t){return/^(\s*)(\d+)(?=[.)])/.exec(t.sliceString(e.from,e.from+10))}function t_(e,t,n,r=0){for(let i=-1,a=e;;){if(a.name==`ListItem`){let e=e_(a,t),o=+e[2];if(i>=0){if(o!=i+1)return;n.push({from:a.from+e[1].length,to:a.from+e[0].length,insert:String(i+2+r)})}i=o}let e=a.nextSibling;if(!e)break;a=e}}function n_(e,t){let n=/^[ \t]*/.exec(e)[0].length;if(!n||t.facet(ad)!=` `)return e;let r=Ir(e,4,n),i=``;for(let e=r;e>0;)e>=4?(i+=` `,e-=4):(i+=` `,e--);return i+e.slice(n)}const r_=((e={})=>({state:t,dispatch:n})=>{let r=Y(t),{doc:i}=t,a=null,o=t.changeByRange(n=>{if(!n.empty||!Xg.isActiveAt(t,n.from,-1)&&!Xg.isActiveAt(t,n.from,1))return a={range:n};let o=n.from,s=i.lineAt(o),c=$g(r.resolveInner(o,-1),i);for(;c.length&&c[c.length-1].from>o-s.from;)c.pop();if(!c.length)return a={range:n};let l=c[c.length-1];if(l.to-l.spaceAfter.length>o-s.from)return a={range:n};let u=o>=l.to-l.spaceAfter.length&&!/\S/.test(s.text.slice(l.to));if(l.item&&u){if(l.item.from<s.from&&!/^[\s>]*$/.test(s.text.slice(0,l.to)))return a={range:n};let r=l.node.firstChild,u=l.node.getChild(`ListItem`,`ListItem`);if(r.to>=o||u&&u.to<o||s.from>0&&!/[^\s>]/.test(i.lineAt(s.from-1).text)||e.nonTightLists===!1){let e=c.length>1?c[c.length-2]:null,t,n=``;e&&e.item?(t=s.from+e.from,n=e.marker(i,1)):t=s.from+(e?e.to:0);let r=[{from:t,to:o,insert:n}];return l.node.name==`OrderedList`&&t_(l.item,i,r,-2),e&&e.node.name==`OrderedList`&&t_(e.item,i,r),{range:j.cursor(t+n.length),changes:r}}else{let e=o_(c,t,s);return{range:j.cursor(o+e.length+1),changes:{from:s.from,insert:e+t.lineBreak}}}}if(l.node.name==`Blockquote`&&u&&s.from){let e=i.lineAt(s.from-1),r=/>\s*$/.exec(e.text);if(r&&r.index==l.from){let i=t.changes([{from:e.from+r.index,to:e.to},{from:s.from+l.from,to:s.to}]);return{range:n.map(i),changes:i}}}let d=[];l.node.name==`OrderedList`&&t_(l.item,i,d);let f=l.item&&l.item.from<s.from,p=``;if(!f||/^[\s\d.)\-+*>]*/.exec(s.text)[0].length>=l.to)for(let e=0,t=c.length-1;e<=t;e++)p+=e==t&&!f?c[e].marker(i,1):c[e].blank(e<t?Ir(s.text,4,c[e+1].from)-p.length:null);let m=o;for(;m>s.from&&/\s/.test(s.text.charAt(m-s.from-1));)m--;return p=n_(p,t),a_(l.node,t.doc)&&(p=o_(c,t,s)+t.lineBreak+p),d.push({from:m,to:o,insert:t.lineBreak+p}),{range:j.cursor(m+p.length+1),changes:d}});return a?!1:(n(t.update(o,{scrollIntoView:!0,userEvent:`input`})),!0)})();function i_(e){return e.name==`QuoteMark`||e.name==`ListMark`}function a_(e,t){if(e.name!=`OrderedList`&&e.name!=`BulletList`)return!1;let n=e.firstChild,r=e.getChild(`ListItem`,`ListItem`);if(!r)return!1;let i=t.lineAt(n.to),a=t.lineAt(r.from),o=/^[\s>]*$/.test(i.text);return i.number+ +!o<a.number}function o_(e,t,n){let r=``;for(let t=0,i=e.length-2;t<=i;t++)r+=e[t].blank(t<i?Ir(n.text,4,e[t+1].from)-r.length:null,t<i);return n_(r,t)}function s_(e,t){let n=e.resolveInner(t,-1),r=t;i_(n)&&(r=n.from,n=n.parent);for(let e;e=n.childBefore(r);)if(i_(e))r=e.from;else if(e.name==`OrderedList`||e.name==`BulletList`)n=e.lastChild,r=n.to;else break;return n}const c_=[{key:`Enter`,run:r_},{key:`Backspace`,run:({state:e,dispatch:t})=>{let n=Y(e),r=null,i=e.changeByRange(t=>{let i=t.from,{doc:a}=e;if(t.empty&&Xg.isActiveAt(e,t.from)){let t=a.lineAt(i),r=$g(s_(n,i),a);if(r.length){let n=r[r.length-1],a=n.to-n.spaceAfter.length+ +!!n.spaceAfter;if(i-t.from>a&&!/\S/.test(t.text.slice(a,i-t.from)))return{range:j.cursor(t.from+a),changes:{from:t.from+a,to:i}};if(i-t.from==a&&(n.item&&t.from<=n.item.from||/^[\s>]*$/.test(t.text.slice(0,n.to)))){let r=t.from+n.from;if(n.item&&n.node.from<n.item.from&&/\S/.test(t.text.slice(n.from,n.to))){let i=n.blank(Ir(t.text,4,n.to)-Ir(t.text,4,n.from));return r==t.from&&(i=n_(i,e)),{range:j.cursor(r+i.length),changes:{from:r,to:t.from+n.to,insert:i}}}if(r<i)return{range:j.cursor(r),changes:{from:r,to:i}}}}}return r={range:t}});return r?!1:(t(e.update(i,{scrollIntoView:!0,userEvent:`delete`})),!0)}}],l_=Lg({matchClosingTags:!1});function u_(e={}){let{codeLanguages:t,defaultCodeLanguage:n,addKeymap:r=!0,base:{parser:i}=Yg,completeHTMLTags:a=!0,pasteURLAsLink:o=!0,htmlTagLanguage:s=l_}=e;if(!(i instanceof Zf))throw RangeError("Base parser provided to `markdown` should be a Markdown parser");let c=e.extensions?[e.extensions]:[],l=[s.support,qg],u;o&&l.push(h_),n instanceof nd?(l.push(n.support),u=n.language):n&&(u=n);let d=t||u?Zg(t,u):void 0;c.push(Tp({codeParser:d,htmlParser:s.language.parser})),r&&l.push(zn.high(Xc.of(c_)));let f=Jg(i.configure(c));return a&&l.push(f.data.of({autocomplete:d_})),new nd(f,l)}function d_(e){let{state:t,pos:n}=e,r=/<[:\-\.\w\u00b7-\uffff]*$/.exec(t.sliceDoc(n-25,n));if(!r)return null;let i=Y(t).resolveInner(n,-1);for(;i&&!i.type.isTop;){if(i.name==`CodeBlock`||i.name==`FencedCode`||i.name==`ProcessingInstructionBlock`||i.name==`CommentBlock`||i.name==`Link`||i.name==`Image`)return null;i=i.parent}return{from:n-r[0].length,to:n,options:p_(),validFor:/^<[:\-\.\w\u00b7-\uffff]*$/}}let f_=null;function p_(){if(f_)return f_;let e=Ag(new Kd(P.create({extensions:l_}),0,!0));return f_=e?e.options:[]}const m_=/code|horizontalrule|html|link|comment|processing|escape|entity|image|mark|url/i,h_=H.domEventHandlers({paste:(e,t)=>{let{main:n}=t.state.selection;if(n.empty)return!1;let r=e.clipboardData?.getData(`text/plain`);if(!r||!/^(https?:\/\/|mailto:|xmpp:|www\.)/.test(r)||(/^www\./.test(r)&&(r=`https://`+r),!Xg.isActiveAt(t.state,n.from,1)))return!1;let i=Y(t.state),a=!1;return i.iterate({from:n.from,to:n.to,enter:e=>{(e.from>n.from||m_.test(e.name))&&(a=!0)},leave:e=>{e.to<n.to&&(a=!0)}}),a?!1:(t.dispatch({changes:[{from:n.from,insert:`[`},{from:n.to,insert:`](${r})`}],userEvent:`input.paste`,scrollIntoView:!0}),!0)}}),g_=e=>{let{state:t}=e,n=t.doc.lineAt(t.selection.main.from),r=x_(e.state,n.from);return r.line?v_(e):r.block?b_(e):!1};function __(e,t){return({state:n,dispatch:r})=>{if(n.readOnly)return!1;let i=e(t,n);return i?(r(n.update(i)),!0):!1}}const v_=__(T_,0),y_=__(w_,0),b_=__((e,t)=>w_(e,t,C_(t)),0);function x_(e,t){let n=e.languageDataAt(`commentTokens`,t,1);return n.length?n[0]:{}}function S_(e,{open:t,close:n},r,i){let a=e.sliceDoc(r-50,r),o=e.sliceDoc(i,i+50),s=/\s*$/.exec(a)[0].length,c=/^\s*/.exec(o)[0].length,l=a.length-s;if(a.slice(l-t.length,l)==t&&o.slice(c,c+n.length)==n)return{open:{pos:r-s,margin:s&&1},close:{pos:i+c,margin:c&&1}};let u,d;i-r<=100?u=d=e.sliceDoc(r,i):(u=e.sliceDoc(r,r+50),d=e.sliceDoc(i-50,i));let f=/^\s*/.exec(u)[0].length,p=/\s*$/.exec(d)[0].length,m=d.length-p-n.length;return u.slice(f,f+t.length)==t&&d.slice(m,m+n.length)==n?{open:{pos:r+f+t.length,margin:+!!/\s/.test(u.charAt(f+t.length))},close:{pos:i-p-n.length,margin:+!!/\s/.test(d.charAt(m-1))}}:null}function C_(e){let t=[];for(let n of e.selection.ranges){let r=e.doc.lineAt(n.from),i=n.to<=r.to?r:e.doc.lineAt(n.to);i.from>r.from&&i.from==n.to&&(i=n.to==r.to+1?r:e.doc.lineAt(n.to-1));let a=t.length-1;a>=0&&t[a].to>r.from?t[a].to=i.to:t.push({from:r.from+/^\s*/.exec(r.text)[0].length,to:i.to})}return t}function w_(e,t,n=t.selection.ranges){let r=n.map(e=>x_(t,e.from).block);if(!r.every(e=>e))return null;let i=n.map((e,n)=>S_(t,r[n],e.from,e.to));if(e!=2&&!i.every(e=>e))return{changes:t.changes(n.map((e,t)=>i[t]?[]:[{from:e.from,insert:r[t].open+` `},{from:e.to,insert:` `+r[t].close}]))};if(e!=1&&i.some(e=>e)){let e=[];for(let t=0,n;t<i.length;t++)if(n=i[t]){let i=r[t],{open:a,close:o}=n;e.push({from:a.pos-i.open.length,to:a.pos+a.margin},{from:o.pos-o.margin,to:o.pos+i.close.length})}return{changes:e}}return null}function T_(e,t,n=t.selection.ranges){let r=[],i=-1;ranges:for(let{from:e,to:a}of n){let n=r.length,o=1e9,s;for(let n=e;n<=a;){let c=t.doc.lineAt(n);if(s==null&&(s=x_(t,c.from).line,!s))continue ranges;if(c.from>i&&(e==a||a>c.from)){i=c.from;let e=/^\s*/.exec(c.text)[0].length,t=e==c.length,n=c.text.slice(e,e+s.length)==s?e:-1;e<c.text.length&&e<o&&(o=e),r.push({line:c,comment:n,token:s,indent:e,empty:t,single:!1})}n=c.to+1}if(o<1e9)for(let e=n;e<r.length;e++)r[e].indent<r[e].line.text.length&&(r[e].indent=o);r.length==n+1&&(r[n].single=!0)}if(e!=2&&r.some(e=>e.comment<0&&(!e.empty||e.single))){let e=[];for(let{line:t,token:n,indent:i,empty:a,single:o}of r)(o||!a)&&e.push({from:t.from+i,insert:n+` `});let n=t.changes(e);return{changes:n,selection:t.selection.map(n,1)}}else if(e!=1&&r.some(e=>e.comment>=0)){let e=[];for(let{line:t,comment:n,token:i}of r)if(n>=0){let r=t.from+n,a=r+i.length;t.text[a-t.from]==` `&&a++,e.push({from:r,to:a})}return{changes:e}}return null}const E_=er.define(),D_=er.define(),O_=M.define(),k_=M.define({combine(e){return _r(e,{minDepth:100,newGroupDelay:500,joinToEvent:(e,t)=>t},{minDepth:Math.max,newGroupDelay:Math.min,joinToEvent:(e,t)=>(n,r)=>e(n,r)||t(n,r)})}}),A_=In.define({create(){return J_.empty},update(e,t){let n=t.state.facet(k_),r=t.annotation(E_);if(r){let i=L_.fromTransaction(t,r.selection),a=r.side,o=a==0?e.undone:e.done;return o=i?R_(o,o.length,n.minDepth,i):U_(o,t.startState.selection),new J_(a==0?r.rest:o,a==0?o:r.rest)}let i=t.annotation(D_);if((i==`full`||i==`before`)&&(e=e.isolate()),t.annotation(rr.addToHistory)===!1)return t.changes.empty?e:e.addMapping(t.changes.desc);let a=L_.fromTransaction(t),o=t.annotation(rr.time),s=t.annotation(rr.userEvent);return a?e=e.addChanges(a,o,s,n,t):t.selection&&(e=e.addSelection(t.startState.selection,o,s,n.newGroupDelay)),(i==`full`||i==`after`)&&(e=e.isolate()),e},toJSON(e){return{done:e.done.map(e=>e.toJSON()),undone:e.undone.map(e=>e.toJSON())}},fromJSON(e){return new J_(e.done.map(L_.fromJSON),e.undone.map(L_.fromJSON))}});function j_(e={}){return[A_,k_.of(e),H.domEventHandlers({beforeinput(e,t){let n=e.inputType==`historyUndo`?N_:e.inputType==`historyRedo`?P_:null;return n?(e.preventDefault(),n(t)):!1}})]}function M_(e,t){return function({state:n,dispatch:r}){if(!t&&n.readOnly)return!1;let i=n.field(A_,!1);if(!i)return!1;let a=i.pop(e,n,t);return a?(r(a),!0):!1}}const N_=M_(0,!1),P_=M_(1,!1),F_=M_(0,!0),I_=M_(1,!0);var L_=class e{constructor(e,t,n,r,i){this.changes=e,this.effects=t,this.mapped=n,this.startSelection=r,this.selectionsAfter=i}setSelAfter(t){return new e(this.changes,this.effects,this.mapped,this.startSelection,t)}toJSON(){return{changes:this.changes?.toJSON(),mapped:this.mapped?.toJSON(),startSelection:this.startSelection?.toJSON(),selectionsAfter:this.selectionsAfter.map(e=>e.toJSON())}}static fromJSON(t){return new e(t.changes&&bn.fromJSON(t.changes),[],t.mapped&&yn.fromJSON(t.mapped),t.startSelection&&j.fromJSON(t.startSelection),t.selectionsAfter.map(j.fromJSON))}static fromTransaction(t,n){let r=H_;for(let e of t.startState.facet(O_)){let n=e(t);n.length&&(r=r.concat(n))}return!r.length&&t.changes.empty?null:new e(t.changes.invert(t.startState.doc),r,void 0,n||t.startState.selection,H_)}static selection(t){return new e(void 0,H_,void 0,void 0,t)}};function R_(e,t,n,r){let i=t+1>n+20?t-n-1:0,a=e.slice(i,t);return a.push(r),a}function z_(e,t){let n=[],r=!1;return e.iterChangedRanges((e,t)=>n.push(e,t)),t.iterChangedRanges((e,t,i,a)=>{for(let e=0;e<n.length;){let t=n[e++],o=n[e++];a>=t&&i<=o&&(r=!0)}}),r}function B_(e,t){return e.ranges.length==t.ranges.length&&e.ranges.filter((e,n)=>e.empty!=t.ranges[n].empty).length===0}function V_(e,t){return e.length?t.length?e.concat(t):e:t}const H_=[];function U_(e,t){if(e.length){let n=e[e.length-1],r=n.selectionsAfter.slice(Math.max(0,n.selectionsAfter.length-200));return r.length&&r[r.length-1].eq(t)?e:(r.push(t),R_(e,e.length-1,1e9,n.setSelAfter(r)))}else return[L_.selection([t])]}function W_(e){let t=e[e.length-1],n=e.slice();return n[e.length-1]=t.setSelAfter(t.selectionsAfter.slice(0,t.selectionsAfter.length-1)),n}function G_(e,t){if(!e.length)return e;let n=e.length,r=H_;for(;n;){let i=K_(e[n-1],t,r);if(i.changes&&!i.changes.empty||i.effects.length){let t=e.slice(0,n);return t[n-1]=i,t}else t=i.mapped,n--,r=i.selectionsAfter}return r.length?[L_.selection(r)]:H_}function K_(e,t,n){let r=V_(e.selectionsAfter.length?e.selectionsAfter.map(e=>e.map(t)):H_,n);if(!e.changes)return L_.selection(r);let i=e.changes.map(t),a=t.mapDesc(e.changes,!0),o=e.mapped?e.mapped.composeDesc(a):a;return new L_(i,N.mapEffects(e.effects,t),o,e.startSelection.map(a),r)}const q_=/^(input\.type|delete)($|\.)/;var J_=class e{constructor(e,t,n=0,r=void 0){this.done=e,this.undone=t,this.prevTime=n,this.prevUserEvent=r}isolate(){return this.prevTime?new e(this.done,this.undone):this}addChanges(t,n,r,i,a){let o=this.done,s=o[o.length-1];return o=s&&s.changes&&!s.changes.empty&&t.changes&&(!r||q_.test(r))&&(!s.selectionsAfter.length&&n-this.prevTime<i.newGroupDelay&&i.joinToEvent(a,z_(s.changes,t.changes))||r==`input.type.compose`)?R_(o,o.length-1,i.minDepth,new L_(t.changes.compose(s.changes),V_(N.mapEffects(t.effects,s.changes),s.effects),s.mapped,s.startSelection,H_)):R_(o,o.length,i.minDepth,t),new e(o,H_,n,r)}addSelection(t,n,r,i){let a=this.done.length?this.done[this.done.length-1].selectionsAfter:H_;return a.length>0&&n-this.prevTime<i&&r==this.prevUserEvent&&r&&/^select($|\.)/.test(r)&&B_(a[a.length-1],t)?this:new e(U_(this.done,t),this.undone,n,r)}addMapping(t){return new e(G_(this.done,t),G_(this.undone,t),this.prevTime,this.prevUserEvent)}pop(e,t,n){let r=e==0?this.done:this.undone;if(r.length==0)return null;let i=r[r.length-1],a=i.selectionsAfter[0]||(i.startSelection?i.startSelection.map(i.changes.invertedDesc,1):t.selection);if(n&&i.selectionsAfter.length)return t.update({selection:i.selectionsAfter[i.selectionsAfter.length-1],annotations:E_.of({side:e,rest:W_(r),selection:a}),userEvent:e==0?`select.undo`:`select.redo`,scrollIntoView:!0});if(i.changes){let n=r.length==1?H_:r.slice(0,r.length-1);return i.mapped&&(n=G_(n,i.mapped)),t.update({changes:i.changes,selection:i.startSelection,effects:i.effects,annotations:E_.of({side:e,rest:n,selection:a}),filter:!1,userEvent:e==0?`undo`:`redo`,scrollIntoView:!0})}else return null}};J_.empty=new J_(H_,H_);const Y_=[{key:`Mod-z`,run:N_,preventDefault:!0},{key:`Mod-y`,mac:`Mod-Shift-z`,run:P_,preventDefault:!0},{linux:`Ctrl-Shift-z`,run:P_,preventDefault:!0},{key:`Mod-u`,run:F_,preventDefault:!0},{key:`Alt-u`,mac:`Mod-Shift-u`,run:I_,preventDefault:!0}];function X_(e,t){return j.create(e.ranges.map(t),e.mainIndex)}function Z_(e,t){return e.update({selection:t,scrollIntoView:!0,userEvent:`select`})}function Q_({state:e,dispatch:t},n){let r=X_(e.selection,n);return r.eq(e.selection,!0)?!1:(t(Z_(e,r)),!0)}function $_(e,t){return j.cursor(t?e.to:e.from)}function ev(e,t){return Q_(e,n=>n.empty?e.moveByChar(n,t):$_(n,t))}function tv(e){return e.textDirectionAt(e.state.selection.main.head)==R.LTR}const nv=e=>ev(e,!tv(e)),rv=e=>ev(e,tv(e));function iv(e,t){return Q_(e,n=>n.empty?e.moveByGroup(n,t):$_(n,t))}const av=e=>iv(e,!tv(e)),ov=e=>iv(e,tv(e));typeof Intl<`u`&&Intl.Segmenter;function sv(e,t,n){if(t.type.prop(n))return!0;let r=t.to-t.from;return r&&(r>2||/[^\s,.;:]/.test(e.sliceDoc(t.from,t.to)))||t.firstChild}function cv(e,t,n){let r=Y(e).resolveInner(t.head),i=n?U.closedBy:U.openedBy;for(let a=t.head;;){let t=n?r.childAfter(a):r.childBefore(a);if(!t)break;sv(e,t,i)?r=t:a=n?t.to:t.from}let a=r.type.prop(i),o,s;return s=a&&(o=n?Id(e,r.from,1):Id(e,r.to,-1))&&o.matched?n?o.end.to:o.end.from:n?r.to:r.from,j.cursor(s,n?-1:1)}const lv=e=>Q_(e,t=>cv(e.state,t,!tv(e))),uv=e=>Q_(e,t=>cv(e.state,t,tv(e)));function dv(e,t){return Q_(e,n=>{if(!n.empty)return $_(n,t);let r=e.moveVertically(n,t);return r.head==n.head?e.moveToLineBoundary(n,t):r})}const fv=e=>dv(e,!1),pv=e=>dv(e,!0);function mv(e){let t=e.scrollDOM.clientHeight<e.scrollDOM.scrollHeight-2,n=0,r=0,i;if(t){for(let t of e.state.facet(H.scrollMargins)){let i=t(e);i?.top&&(n=Math.max(i?.top,n)),i?.bottom&&(r=Math.max(i?.bottom,r))}i=e.scrollDOM.clientHeight-n-r}else i=(e.dom.ownerDocument.defaultView||window).innerHeight;return{marginTop:n,marginBottom:r,selfScroll:t,height:Math.max(e.defaultLineHeight,i-5)}}function hv(e,t){let n=mv(e),{state:r}=e,i=X_(r.selection,r=>r.empty?e.moveVertically(r,t,n.height):$_(r,t));if(i.eq(r.selection))return!1;let a;if(n.selfScroll){let t=e.coordsAtPos(r.selection.main.head),o=e.scrollDOM.getBoundingClientRect(),s=o.top+n.marginTop,c=o.bottom-n.marginBottom;t&&t.top>s&&t.bottom<c&&(a=H.scrollIntoView(i.main.head,{y:`start`,yMargin:t.top-s}))}return e.dispatch(Z_(r,i),{effects:a}),!0}const gv=e=>hv(e,!1),_v=e=>hv(e,!0);function vv(e,t,n){let r=e.lineBlockAt(t.head),i=e.moveToLineBoundary(t,n);if(i.head==t.head&&i.head!=(n?r.to:r.from)&&(i=e.moveToLineBoundary(t,n,!1)),!n&&i.head==r.from&&r.length){let n=/^\s*/.exec(e.state.sliceDoc(r.from,Math.min(r.from+100,r.to)))[0].length;n&&t.head!=r.from+n&&(i=j.cursor(r.from+n))}return i}const yv=e=>Q_(e,t=>vv(e,t,!0)),bv=e=>Q_(e,t=>vv(e,t,!1)),xv=e=>Q_(e,t=>vv(e,t,!tv(e))),Sv=e=>Q_(e,t=>vv(e,t,tv(e))),Cv=e=>Q_(e,t=>j.cursor(e.lineBlockAt(t.head).from,1)),wv=e=>Q_(e,t=>j.cursor(e.lineBlockAt(t.head).to,-1));function Tv(e,t,n){let r=!1,i=X_(e.selection,t=>{let i=Id(e,t.head,-1)||Id(e,t.head,1)||t.head>0&&Id(e,t.head-1,1)||t.head<e.doc.length&&Id(e,t.head+1,-1);if(!i||!i.end)return t;r=!0;let a=i.start.from==t.head?i.end.to:i.end.from;return n?j.range(t.anchor,a):j.cursor(a)});return r?(t(Z_(e,i)),!0):!1}const Ev=({state:e,dispatch:t})=>Tv(e,t,!1);function Dv(e,t,n){let r=X_(e.state.selection,e=>{e.undirectional&&e.head>=e.anchor!=t&&(e=j.range(e.head,e.anchor));let r=n(e);return j.range(e.anchor,r.head,r.goalColumn,r.bidiLevel||void 0,r.assoc)});return r.eq(e.state.selection)?!1:(e.dispatch(Z_(e.state,r)),!0)}function Ov(e,t){return Dv(e,t,n=>e.moveByChar(n,t))}const kv=e=>Ov(e,!tv(e)),Av=e=>Ov(e,tv(e));function jv(e,t){return Dv(e,t,n=>e.moveByGroup(n,t))}const Mv=e=>jv(e,!tv(e)),Nv=e=>jv(e,tv(e)),Pv=e=>{let t=!tv(e);return Dv(e,t,n=>cv(e.state,n,t))},Fv=e=>{let t=tv(e);return Dv(e,t,n=>cv(e.state,n,t))};function Iv(e,t){return Dv(e,t,n=>e.moveVertically(n,t))}const Lv=e=>Iv(e,!1),Rv=e=>Iv(e,!0);function zv(e,t){return Dv(e,t,n=>e.moveVertically(n,t,mv(e).height))}const Bv=e=>zv(e,!1),Vv=e=>zv(e,!0),Hv=e=>Dv(e,!0,t=>vv(e,t,!0)),Uv=e=>Dv(e,!1,t=>vv(e,t,!1)),Wv=e=>{let t=!tv(e);return Dv(e,t,n=>vv(e,n,t))},Gv=e=>{let t=tv(e);return Dv(e,t,n=>vv(e,n,t))},Kv=e=>Dv(e,!1,t=>j.cursor(e.lineBlockAt(t.head).from)),qv=e=>Dv(e,!0,t=>j.cursor(e.lineBlockAt(t.head).to)),Jv=({state:e,dispatch:t})=>(t(Z_(e,{anchor:0})),!0),Yv=({state:e,dispatch:t})=>(t(Z_(e,{anchor:e.doc.length})),!0),Xv=({state:e,dispatch:t})=>(t(Z_(e,{anchor:e.selection.main.anchor,head:0})),!0),Zv=({state:e,dispatch:t})=>(t(Z_(e,{anchor:e.selection.main.anchor,head:e.doc.length})),!0),Qv=({state:e,dispatch:t})=>(t(e.update({selection:{anchor:0,head:e.doc.length},userEvent:`select`})),!0),$v=({state:e,dispatch:t})=>{let n=vy(e).map(({from:t,to:n})=>j.undirectionalRange(t,Math.min(n+1,e.doc.length)));return t(e.update({selection:j.create(n),userEvent:`select`})),!0},ey=({state:e,dispatch:t})=>{let n=X_(e.selection,t=>{let n=Y(e),r=n.resolveStack(t.from,1);if(t.empty){let e=n.resolveStack(t.from,-1);e.node.from>=r.node.from&&e.node.to<=r.node.to&&(r=e)}for(let e=r;e;e=e.next){let{node:n}=e;if((n.from<t.from&&n.to>=t.to||n.to>t.to&&n.from<=t.from)&&e.next)return j.undirectionalRange(n.from,n.to)}return t});return n.eq(e.selection)?!1:(t(Z_(e,n)),!0)};function ty(e,t){let{state:n}=e,r=n.selection,i=n.selection.ranges.slice();for(let r of n.selection.ranges){let a=n.doc.lineAt(r.head);if(t?a.to<e.state.doc.length:a.from>0)for(let n=r;;){let r=e.moveVertically(n,t);if(r.head<a.from||r.head>a.to){i.some(e=>e.head==r.head)||i.push(r);break}else if(r.head==n.head)break;else n=r}}return i.length==r.ranges.length?!1:(e.dispatch(Z_(n,j.create(i,i.length-1))),!0)}const ny=e=>ty(e,!1),ry=e=>ty(e,!0),iy=({state:e,dispatch:t})=>{let n=e.selection,r=null;return n.ranges.length>1?r=j.create([n.main]):n.main.empty||(r=j.create([j.cursor(n.main.head)])),r?(t(Z_(e,r)),!0):!1};function ay(e,t){if(e.state.readOnly)return!1;let n=`delete.selection`,{state:r}=e,i=r.changeByRange(r=>{let{from:i,to:a}=r;if(i==a){let o=t(r);o<i?(n=`delete.backward`,o=oy(e,o,!1)):o>i&&(n=`delete.forward`,o=oy(e,o,!0)),i=Math.min(i,o),a=Math.max(a,o)}else i=oy(e,i,!1),a=oy(e,a,!0);return i==a?{range:r}:{changes:{from:i,to:a},range:j.cursor(i,i<r.head?-1:1)}});return i.changes.empty?!1:(e.dispatch(r.update(i,{scrollIntoView:!0,userEvent:n,effects:n==`delete.selection`?H.announce.of(r.phrase(`Selection deleted`)):void 0})),!0)}function oy(e,t,n){if(e instanceof H)for(let r of e.state.facet(H.atomicRanges).map(t=>t(e)))r.between(t,t,(e,r)=>{e<t&&r>t&&(t=n?r:e)});return t}const sy=(e,t,n)=>ay(e,r=>{let i=r.from,{state:a}=e,o=a.doc.lineAt(i),s,c;if(n&&!t&&i>o.from&&i<o.from+200&&!/[^ \t]/.test(s=o.text.slice(0,i-o.from))){if(s[s.length-1]==` `)return i-1;let e=Ir(s,a.tabSize)%od(a)||od(a);for(let t=0;t<e&&s[s.length-1-t]==` `;t++)i--;c=i}else c=fn(o.text,i-o.from,t,t)+o.from,c==i&&o.number!=(t?a.doc.lines:1)?c+=t?1:-1:!t&&/[\ufe00-\ufe0f]/.test(o.text.slice(c-o.from,i-o.from))&&(c=fn(o.text,c-o.from,!1,!1)+o.from);return c}),cy=e=>sy(e,!1,!0),ly=e=>sy(e,!0,!1),uy=(e,t)=>ay(e,n=>{let r=n.head,{state:i}=e,a=i.doc.lineAt(r),o=i.charCategorizer(r);for(let e=null;;){if(r==(t?a.to:a.from)){r==n.head&&a.number!=(t?i.doc.lines:1)&&(r+=t?1:-1);break}let s=fn(a.text,r-a.from,t)+a.from,c=a.text.slice(Math.min(r,s)-a.from,Math.max(r,s)-a.from),l=o(c);if(e!=null&&l!=e)break;(c!=` `||r!=n.head)&&(e=l),r=s}return r}),dy=e=>uy(e,!1),fy=e=>uy(e,!0),py=e=>ay(e,t=>{let n=e.lineBlockAt(t.head).to;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),my=e=>ay(e,t=>{let n=e.moveToLineBoundary(t,!1).head;return t.head>n?n:Math.max(0,t.head-1)}),hy=e=>ay(e,t=>{let n=e.moveToLineBoundary(t,!0).head;return t.head<n?n:Math.min(e.state.doc.length,t.head+1)}),gy=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange(e=>({changes:{from:e.from,to:e.to,insert:A.of([``,``])},range:j.cursor(e.from)}));return t(e.update(n,{scrollIntoView:!0,userEvent:`input`})),!0},_y=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=e.changeByRange(t=>{if(!t.empty||t.from==0||t.from==e.doc.length)return{range:t};let n=t.from,r=e.doc.lineAt(n),i=n==r.from?n-1:fn(r.text,n-r.from,!1)+r.from,a=n==r.to?n+1:fn(r.text,n-r.from,!0)+r.from;return{changes:{from:i,to:a,insert:e.doc.slice(n,a).append(e.doc.slice(i,n))},range:j.cursor(a)}});return n.changes.empty?!1:(t(e.update(n,{scrollIntoView:!0,userEvent:`move.character`})),!0)};function vy(e){let t=[],n=-1;for(let r of e.selection.ranges){let i=e.doc.lineAt(r.from),a=e.doc.lineAt(r.to);if(!r.empty&&r.to==a.from&&(a=e.doc.lineAt(r.to-1)),n>=i.number){let e=t[t.length-1];e.to=a.to,e.ranges.push(r)}else t.push({from:i.from,to:a.to,ranges:[r]});n=a.number+1}return t}function yy(e,t,n){if(e.readOnly)return!1;let r=[],i=[];for(let t of vy(e)){if(n?t.to==e.doc.length:t.from==0)continue;let a=e.doc.lineAt(n?t.to+1:t.from-1),o=a.length+1;if(n){r.push({from:t.to,to:a.to},{from:t.from,insert:a.text+e.lineBreak});for(let n of t.ranges)i.push(j.range(Math.min(e.doc.length,n.anchor+o),Math.min(e.doc.length,n.head+o)))}else{r.push({from:a.from,to:t.from},{from:t.to,insert:e.lineBreak+a.text});for(let e of t.ranges)i.push(j.range(e.anchor-o,e.head-o))}}return r.length?(t(e.update({changes:r,scrollIntoView:!0,selection:j.create(i,e.selection.mainIndex),userEvent:`move.line`})),!0):!1}const by=({state:e,dispatch:t})=>yy(e,t,!1),xy=({state:e,dispatch:t})=>yy(e,t,!0);function Sy(e,t,n){if(e.readOnly)return!1;let r=[];for(let t of vy(e))n?r.push({from:t.from,insert:e.doc.slice(t.from,t.to)+e.lineBreak}):r.push({from:t.to,insert:e.lineBreak+e.doc.slice(t.from,t.to)});let i=e.changes(r);return t(e.update({changes:i,selection:e.selection.map(i,n?1:-1),scrollIntoView:!0,userEvent:`input.copyline`})),!0}const Cy=({state:e,dispatch:t})=>Sy(e,t,!1),wy=({state:e,dispatch:t})=>Sy(e,t,!0),Ty=e=>{if(e.state.readOnly)return!1;let{state:t}=e,n=t.changes(vy(t).map(({from:e,to:n})=>(e>0?e--:n<t.doc.length&&n++,{from:e,to:n}))),r=X_(t.selection,t=>{let n;if(e.lineWrapping){let r=e.lineBlockAt(t.head),i=e.coordsAtPos(t.head,t.assoc||1);i&&(n=r.bottom+e.documentTop-i.bottom+e.defaultLineHeight/2)}return e.moveVertically(t,!0,n)}).map(n);return e.dispatch({changes:n,selection:r,scrollIntoView:!0,userEvent:`delete.line`}),!0};function Ey(e,t){if(/\(\)|\[\]|\{\}/.test(e.sliceDoc(t-1,t+1)))return{from:t,to:t};let n=Y(e).resolveInner(t),r=n.childBefore(t),i=n.childAfter(t),a;return r&&i&&r.to<=t&&i.from>=t&&(a=r.type.prop(U.closedBy))&&a.indexOf(i.name)>-1&&e.doc.lineAt(r.to).from==e.doc.lineAt(i.from).from&&!/\S/.test(e.sliceDoc(r.to,i.from))?{from:r.to,to:i.from}:null}const Dy=ky(!1),Oy=ky(!0);function ky(e){return({state:t,dispatch:n})=>{if(t.readOnly)return!1;let r=t.changeByRange(n=>{let{from:r,to:i}=n,a=t.doc.lineAt(r),o=!e&&r==i&&Ey(t,r);e&&(r=i=(i<=a.to?a:t.doc.lineAt(i)).to);let s=new ld(t,{simulateBreak:r,simulateDoubleBreak:!!o}),c=cd(s,r);for(c??=Ir(/^\s*/.exec(t.doc.lineAt(r).text)[0],t.tabSize);i<a.to&&/\s/.test(a.text[i-a.from]);)i++;o?{from:r,to:i}=o:r>a.from&&r<a.from+100&&!/\S/.test(a.text.slice(0,r))&&(r=a.from);let l=[``,sd(t,c)];return o&&l.push(sd(t,s.lineIndent(a.from,-1))),{changes:{from:r,to:i,insert:A.of(l)},range:j.cursor(r+1+l[1].length)}});return n(t.update(r,{scrollIntoView:!0,userEvent:`input`})),!0}}function Ay(e,t){let n=-1;return e.changeByRange(r=>{let i=[];for(let a=r.from;a<=r.to;){let o=e.doc.lineAt(a);o.number>n&&(r.empty||r.to>o.from)&&(t(o,i,r),n=o.number),a=o.to+1}let a=e.changes(i);return{changes:i,range:j.range(a.mapPos(r.anchor,1),a.mapPos(r.head,1))}})}const jy=({state:e,dispatch:t})=>{if(e.readOnly)return!1;let n=Object.create(null),r=new ld(e,{overrideIndentation:e=>n[e]??-1}),i=Ay(e,(t,i,a)=>{let o=cd(r,t.from);if(o==null)return;/\S/.test(t.text)||(o=0);let s=/^\s*/.exec(t.text)[0],c=sd(e,o);(s!=c||a.from<t.from+s.length)&&(n[t.from]=o,i.push({from:t.from,to:t.from+s.length,insert:c}))});return i.changes.empty||t(e.update(i,{userEvent:`indent`})),!0},My=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(Ay(e,(t,n)=>{n.push({from:t.from,insert:e.facet(ad)})}),{userEvent:`input.indent`})),!0),Ny=({state:e,dispatch:t})=>e.readOnly?!1:(t(e.update(Ay(e,(t,n)=>{let r=/^\s*/.exec(t.text)[0];if(!r)return;let i=Ir(r,e.tabSize),a=0,o=sd(e,Math.max(0,i-od(e)));for(;a<r.length&&a<o.length&&r.charCodeAt(a)==o.charCodeAt(a);)a++;n.push({from:t.from+a,to:t.from+r.length,insert:o.slice(a)})}),{userEvent:`delete.dedent`})),!0),Py=e=>(e.setTabFocusMode(),!0),Fy=[{key:`Ctrl-b`,run:nv,shift:kv,preventDefault:!0},{key:`Ctrl-f`,run:rv,shift:Av},{key:`Ctrl-p`,run:fv,shift:Lv},{key:`Ctrl-n`,run:pv,shift:Rv},{key:`Ctrl-a`,run:Cv,shift:Kv},{key:`Ctrl-e`,run:wv,shift:qv},{key:`Ctrl-d`,run:ly},{key:`Ctrl-h`,run:cy},{key:`Ctrl-k`,run:py},{key:`Ctrl-Alt-h`,run:dy},{key:`Ctrl-o`,run:gy},{key:`Ctrl-t`,run:_y},{key:`Ctrl-v`,run:_v}],Iy=[{key:`ArrowLeft`,run:nv,shift:kv,preventDefault:!0},{key:`Mod-ArrowLeft`,mac:`Alt-ArrowLeft`,run:av,shift:Mv,preventDefault:!0},{mac:`Cmd-ArrowLeft`,run:xv,shift:Wv,preventDefault:!0},{key:`ArrowRight`,run:rv,shift:Av,preventDefault:!0},{key:`Mod-ArrowRight`,mac:`Alt-ArrowRight`,run:ov,shift:Nv,preventDefault:!0},{mac:`Cmd-ArrowRight`,run:Sv,shift:Gv,preventDefault:!0},{key:`ArrowUp`,run:fv,shift:Lv,preventDefault:!0},{mac:`Cmd-ArrowUp`,run:Jv,shift:Xv},{mac:`Ctrl-ArrowUp`,run:gv,shift:Bv},{key:`ArrowDown`,run:pv,shift:Rv,preventDefault:!0},{mac:`Cmd-ArrowDown`,run:Yv,shift:Zv},{mac:`Ctrl-ArrowDown`,run:_v,shift:Vv},{key:`PageUp`,run:gv,shift:Bv},{key:`PageDown`,run:_v,shift:Vv},{key:`Home`,run:bv,shift:Uv,preventDefault:!0},{key:`Mod-Home`,run:Jv,shift:Xv},{key:`End`,run:yv,shift:Hv,preventDefault:!0},{key:`Mod-End`,run:Yv,shift:Zv},{key:`Enter`,run:Dy,shift:Dy},{key:`Mod-a`,run:Qv},{key:`Backspace`,run:cy,shift:cy,preventDefault:!0},{key:`Delete`,run:ly,preventDefault:!0},{key:`Mod-Backspace`,mac:`Alt-Backspace`,run:dy,preventDefault:!0},{key:`Mod-Delete`,mac:`Alt-Delete`,run:fy,preventDefault:!0},{mac:`Mod-Backspace`,run:my,preventDefault:!0},{mac:`Mod-Delete`,run:hy,preventDefault:!0}].concat(Fy.map(e=>({mac:e.key,run:e.run,shift:e.shift}))),Ly=[{key:`Alt-ArrowLeft`,mac:`Ctrl-ArrowLeft`,run:lv,shift:Pv},{key:`Alt-ArrowRight`,mac:`Ctrl-ArrowRight`,run:uv,shift:Fv},{key:`Alt-ArrowUp`,run:by},{key:`Shift-Alt-ArrowUp`,run:Cy},{key:`Alt-ArrowDown`,run:xy},{key:`Shift-Alt-ArrowDown`,run:wy},{key:`Mod-Alt-ArrowUp`,run:ny},{key:`Mod-Alt-ArrowDown`,run:ry},{key:`Escape`,run:iy},{key:`Mod-Enter`,run:Oy},{key:`Alt-l`,mac:`Ctrl-l`,run:$v},{key:`Mod-i`,run:ey,preventDefault:!0},{key:`Mod-[`,run:Ny},{key:`Mod-]`,run:My},{key:`Mod-Alt-\\`,run:jy},{key:`Shift-Mod-k`,run:Ty},{key:`Shift-Mod-\\`,run:Ev},{key:`Mod-/`,run:g_},{key:`Alt-A`,mac:`Ctrl-A`,run:y_},{key:`Ctrl-m`,mac:`Shift-Alt-m`,run:Py}].concat(Iy),Ry=`var(--dsw-alias-brand-primary, #3e63dd)`,zy=`color-mix(in srgb, var(--dsw-alias-brand-primary, #3e63dd) 55%, transparent)`,By=`var(--dsw-alias-label-dimmed, #999)`,Vy=`ui-monospace, "Cascadia Mono", Consolas, "SF Mono", Menlo, monospace`,Hy=Ed.define([{tag:[J.heading1,J.heading2,J.heading3,J.heading4,J.heading5,J.heading6],color:Ry,fontWeight:`700`},{tag:J.processingInstruction,color:zy},{tag:J.monospace,fontFamily:Vy,backgroundColor:`color-mix(in srgb, var(--dsw-alias-label-secondary, #888) 12%, transparent)`,borderRadius:`4px`,padding:`0 3px`},{tag:J.content,fontFamily:Vy,backgroundColor:`color-mix(in srgb, var(--dsw-alias-label-secondary, #888) 8%, transparent)`},{tag:J.strong,fontWeight:`700`},{tag:J.emphasis,fontStyle:`italic`},{tag:J.strikethrough,textDecoration:`line-through`,opacity:`.75`},{tag:J.link,color:Ry,textDecoration:`underline`},{tag:J.url,color:zy,textDecoration:`underline dotted`},{tag:J.quote,fontStyle:`italic`,color:`var(--dsw-alias-label-secondary, #888)`},{tag:J.contentSeparator,color:By,textDecoration:`line-through`},{tag:J.comment,color:By}]);function Uy(e={}){let t=document.createElement(`div`);t.className=`dsh-tw-note-editor`;let n=new H({parent:t,state:P.create({doc:``,extensions:[H.lineWrapping,j_(),u_({base:Xg}),Ad(Hy),fl(),bl(e.placeholder??``),Xc.of([...Ly,...Y_,{key:`Mod-Enter`,run:()=>(e.onSave?.(),!0)}]),H.updateListener.of(t=>{t.docChanged&&e.onChange?.()})]})});return{el:t,view:n,getValue:()=>n.state.doc.toString(),setValue(e){n.dispatch({changes:{from:0,to:n.state.doc.length,insert:e}})},insertAtCaret(e){let{from:t}=n.state.selection.main,r=`${t===n.state.doc.lineAt(t).from?``:`
807
- `}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const Wy=`dsh-tw-note-state`,Gy=`dsh-tw-note-draft-v1`,Ky=`dsh-tw-note-window-id`,qy=(()=>{try{let e=sessionStorage.getItem(Ky);if(e!==null&&e.length>0)return e;let t=Math.random().toString(36).slice(2,10);return sessionStorage.setItem(Ky,t),t}catch{return Math.random().toString(36).slice(2,10)}})();function Jy(){return`dsh-tw-note-draft-v1:${qy}`}function Yy(e){if(e===null)return null;try{let t=JSON.parse(e);return typeof t.text!=`string`||typeof t.title!=`string`?null:{text:t.text,title:t.title,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e==`string`):[],savedAt:typeof t.savedAt==`number`?t.savedAt:0,windowId:typeof t.windowId==`string`?t.windowId:void 0}}catch{return null}}function Xy(e){try{return Yy(localStorage.getItem(e))}catch{return null}}function Zy(){let e=Xy(Jy());if(e!==null)return{draft:e,foreign:e.windowId!==void 0&&e.windowId!==qy};let t=Xy(Gy);if(t===null)return null;let n={...t,windowId:qy};$y(n);try{localStorage.removeItem(Gy)}catch{}return{draft:n,foreign:!0}}function Qy(e){$y({...e,windowId:qy})}function $y(e){try{localStorage.setItem(Jy(),JSON.stringify({...e,windowId:qy}))}catch{}}function eb(){try{localStorage.removeItem(Jy())}catch{}}function tb(e,t,n){return`${e}\u0000${t}\u0000${n.join(``)}`}function nb(e){return e<10?`0${e}`:String(e)}function rb(e=new Date){return`${e.getFullYear()}-${nb(e.getMonth()+1)}-${nb(e.getDate())} ${nb(e.getHours())}:${nb(e.getMinutes())}`}function ib(e){if(e===null)return``;let t=new Date(e).getTime();if(Number.isNaN(t))return``;let n=Date.now()-t,r=Math.floor(n/6e4);if(r<1)return`刚刚`;if(r<60)return`${r}分钟前`;let i=Math.floor(r/60);if(i<24)return`${i}小时前`;let a=Math.floor(i/24);return a<30?`${a}天前`:new Date(t).toLocaleDateString(`zh-CN`)}async function ab(){let e=await ve();return typeof e?.note?.tag==`string`&&e.note.tag.length>0?e.note.tag:`inbox`}function ob(e={}){let t=document.createElement(`div`);t.className=`dsh-tw-note-tags`;let n=document.createElement(`div`);n.className=`dsh-tw-note-chips`;let r=document.createElement(`input`);r.className=`dsh-tw-note-taginput`,r.placeholder=`tag(可多选,自动补全)`;let i=document.createElement(`div`);i.className=`dsh-tw-note-tagsuggest`,i.hidden=!0,t.append(n,r,i);let a=[],o=()=>{i.hidden=!0},s=()=>{e.onChange?.()},c=()=>{n.replaceChildren();for(let e of a){let t=document.createElement(`span`);t.className=`dsh-tw-note-tagchip`,t.textContent=e;let r=document.createElement(`span`);r.className=`dsh-tw-note-tagchip-x`,r.textContent=`×`,r.title=`移除 tag「${e}」`,r.addEventListener(`click`,t=>{t.stopPropagation();let n=a.indexOf(e);n>=0&&(a.splice(n,1),c(),s())}),t.append(r),n.append(t)}},l=e=>{let t=e.trim();t.length===0||a.includes(t)||(a.push(t),r.value=``,c(),o(),r.focus(),s())},u=()=>{for(let e of r.value.split(/\s+/))l(e)},d=[],f,p,m=()=>{let t=e.wikiQuery?.(b)??b;return(f===void 0||p!==t)&&(p=t,f=fetch(t,{signal:AbortSignal.timeout(5e3)}).then(e=>e.ok?e.json():Promise.resolve({})).then(e=>[...e.tags??[]].sort((e,t)=>e.localeCompare(t,`zh`))).catch(()=>[]),f.then(e=>{d=e})),f},h=()=>{let e=r.value.trim().toLowerCase(),t=d.filter(t=>!a.includes(t)&&(e.length===0||t.toLowerCase().includes(e))).slice(0,8);i.replaceChildren();for(let e of t){let t=document.createElement(`div`);t.className=`dsh-tw-note-tagsuggest-item`,t.textContent=e,t.setAttribute(`role`,`button`),t.tabIndex=0,t.setAttribute(`aria-label`,`添加标签「${e}」`),t.addEventListener(`mousedown`,t=>{t.preventDefault(),l(e)}),t.addEventListener(`keydown`,t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(e))}),i.append(t)}i.hidden=t.length===0};r.addEventListener(`focus`,()=>{m().then(h)}),r.addEventListener(`input`,()=>{d.length===0?m().then(h):h()}),r.addEventListener(`keydown`,e=>{e.key===`Enter`||e.key===`,`?(e.preventDefault(),u()):e.key===`Backspace`&&r.value.length===0&&a.length>0?(a.pop(),c(),s()):e.key===`Escape`&&o()});let g=e=>{t.contains(e.target)||o()};return document.addEventListener(`click`,g,!0),{el:t,getTags:()=>(u(),[...a]),peekTags:()=>[...a],setDefault:e=>{if(a.length===0){let t=e.trim();t.length>0&&(a.push(t),c())}},setTags:e=>{a.length=0;for(let t of Array.isArray(e)?e:[]){let e=typeof t==`string`?t.trim():``;e.length>0&&!a.includes(e)&&a.push(e)}r.value=``,c(),o()},dispose:()=>document.removeEventListener(`click`,g,!0)}}async function sb(e,t,n=e=>e){if(e.size>67108864){D(`文件过大(≤ 64MB)`);return}try{let r=await fetch(n(`${ee}?name=${encodeURIComponent(e.name)}`),{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0){D(`上传失败:${i?.error??`HTTP ${r.status}`}`);return}let a=i.name??e.name,o=e.type.startsWith(`image/`)?`![${a}](${i.url})`:`[${a}](${i.url})`;t.insertAtCaret(o),D(`已上传「${a}」并插入链接`)}catch(e){D(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function cb(){let e,t=!1,n=!1,r=!1,i,a=`inbox`,o,s=!1,c=`single`,l=[],u,d=e=>he(e,o),f,p=!1,m=null,h=null,_=e=>{try{window.dispatchEvent(new CustomEvent(Wy,{detail:{open:e}}))}catch{}},b=t=>{if(e===void 0)return;let n=e.root,r=e.card;if(t!==void 0){let e=t.getBoundingClientRect(),i=r.offsetWidth||340,a=r.offsetHeight||260,o=window.innerWidth,s=window.innerHeight,c=Math.min(Math.max(e.left+e.width/2-i/2,8),Math.max(8,o-i-8)),l=s-e.top+10,u=Math.min(Math.max(8,l),Math.max(8,s-a-8));n.style.right=`auto`,n.style.top=`auto`,n.style.left=`${c}px`,n.style.bottom=`${u}px`}else n.style.right=`24px`,n.style.bottom=`88px`,n.style.left=`auto`,n.style.top=`auto`},S=null,ee=()=>{e!==void 0&&(S=rb(),e.titleInput.value=S)},te=()=>{if(e===void 0)return;let t=e.editor.getValue(),n=e.titleInput.value.trim();if(t.trim().length===0&&(n.length===0||n===S)){eb();return}let r=tb(n,t,e.tagEditor.peekTags());h!==null&&r===h||$y({text:t,title:n,tags:e.tagEditor.peekTags(),savedAt:Date.now()})},ne=()=>{t||!n||e===void 0||(f!==void 0&&(clearTimeout(f),f=void 0),f=window.setTimeout(()=>{f=void 0,te()},500))},C=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},re=async(e,t,n)=>{try{let r=await fetch(d(y),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:e,tags:n,text:t}),signal:AbortSignal.timeout(1e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0)return D(`打开失败:${i?.error??`HTTP ${r.status}`}`),!1;if(typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`)return D(`打开失败:服务未返回编辑器地址`),!1;eb(),C(),h=tb(e,t,n),m=null;let a=me(c,o,i.twUrl,i.twUrlAbsolute);return It(`${pe(a.relative,a.absolute)}#${encodeURIComponent(i.draftTitle)}`,i.title??e),D(`已在弹出窗口打开「${i.title??e}」编辑器`),!0}catch(e){return D(`打开失败:${e instanceof Error?e.message:String(e)}`),!1}},ie=()=>{p=!1,e!==void 0&&(e.recentWrap.hidden=!0)},w=async t=>{try{let n=await fetch(d(`${g}?title=${encodeURIComponent(t)}`),{signal:AbortSignal.timeout(1e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0||typeof r.title!=`string`){D(`读取失败:${r?.notFound===!0?`不存在`:r?.error??`HTTP ${n.status}`}`);return}if(e===void 0)return;e.editor.setValue(r.text??``),e.titleInput.value=r.title,e.tagEditor.setTags(r.tags??[]),m={title:r.title,...typeof r.modified==`string`&&r.modified.length>0?{modified:r.modified}:{},...typeof r.revision==`number`?{revision:r.revision}:{}},h=tb(r.title,r.text??``,r.tags??[]),C(),ie(),D(`已载入「${r.title}」`),e.editor.focus()}catch(e){D(`读取失败:${e instanceof Error?e.message:String(e)}`)}},ae=()=>{if(e===void 0)return;if(p){ie();return}p=!0,e.recentWrap.hidden=!1,e.recentWrap.textContent=``;let t=document.createElement(`div`);t.className=`dsh-tw-note-recent-muted`,t.textContent=`加载中…`,e.recentWrap.append(t),(async()=>{try{let t=await(await fetch(d(`${x}?limit=15`),{signal:AbortSignal.timeout(1e4)})).json().catch(()=>null);if(!p||e===void 0)return;e.recentWrap.replaceChildren();let n=[];if(t?.ok===!0)for(let e of t.items??[]){if(typeof e!=`object`||!e)continue;let t=e,r=typeof t.title==`string`?t.title:``;r.length!==0&&n.push({title:r,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e==`string`):[],modified:typeof t.modified==`string`?t.modified:null,snippet:typeof t.snippet==`string`?t.snippet:``})}if(n.length===0){let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-muted`,n.textContent=t?.ok===!0?`暂无笔记`:`加载失败:${t?.error??`未知`}`,e.recentWrap.append(n);return}for(let t of n){let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-item`,n.title=t.snippet||t.title,n.setAttribute(`role`,`button`),n.tabIndex=0,n.setAttribute(`aria-label`,`载入笔记「${t.title}」`);let r=document.createElement(`span`);r.className=`dsh-tw-note-recent-name`,r.textContent=t.title;let i=document.createElement(`span`);i.className=`dsh-tw-note-recent-meta`;let a=[ib(t.modified)];t.tags.length>0&&a.unshift(t.tags.slice(0,3).join(`,`)),i.textContent=a.join(` · `),n.append(r,i),n.addEventListener(`click`,()=>{w(t.title)}),n.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),w(t.title))}),e.recentWrap.append(n)}}catch(t){if(!p||e===void 0)return;e.recentWrap.replaceChildren();let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-muted`,n.textContent=`加载失败:${t instanceof Error?t.message:String(t)}`,e.recentWrap.append(n)}})()},T=()=>{if(e!==void 0)return;let r=document.createElement(`div`);r.className=`dsh-tw-note`,r.hidden=!0;let a=document.createElement(`div`);a.className=`dsh-tw-note-card`;let p=document.createElement(`div`);p.className=`dsh-tw-note-head`;let g=document.createElement(`span`);g.className=`dsh-tw-note-label`,g.textContent=`📝 快速笔记`;let y=document.createElement(`button`);y.type=`button`,y.className=`dsh-tw-note-close`,y.title=`收起`,y.textContent=`✕`,p.append(g,y);let b=document.createElement(`div`);b.className=`dsh-tw-note-draft`,b.hidden=!0;let x=document.createElement(`span`);x.className=`dsh-tw-note-draft-text`,x.textContent=`已恢复未保存草稿`;let ee=document.createElement(`button`);ee.type=`button`,ee.className=`dsh-tw-note-draft-discard`,ee.textContent=`丢弃`,b.append(x,ee);let w=document.createElement(`div`);w.className=`dsh-tw-note-fields`;let T=document.createElement(`input`);T.className=`dsh-tw-note-title`,T.placeholder=`标题(默认时间戳)`,T.setAttribute(`aria-label`,`笔记标题(默认时间戳)`);let oe=ob({onChange:ne});w.append(T,oe.el);let se=document.createElement(`label`);se.className=`dsh-tw-note-wiki`,se.hidden=!0;let ce=document.createElement(`span`);ce.className=`dsh-tw-note-wiki-label`,ce.textContent=`写入`;let le=document.createElement(`select`);le.className=`dsh-tw-note-wiki-select`,le.setAttribute(`aria-label`,`这条笔记写进哪个知识库`),se.append(ce,le);let ue=document.createElement(`span`);ue.className=`dsh-tw-note-wiki-hint`,ue.hidden=!0,w.append(se,ue);let de=()=>{let e=l.find(e=>e.id===o),t=e!==void 0&&!e.running;ue.hidden=!t,ue.textContent=t?`${e.label} 当前没在运行:先在右下角「知识库」菜单里打开它`:``};le.addEventListener(`change`,()=>{s=!0,o=le.value.length>0?le.value:void 0,de()}),ve().then(e=>{if(t||(c=typeof e?.mode==`string`?e.mode:`single`,l=(Array.isArray(e?.wikis)?e.wikis:[]).map(e=>({id:e.id,label:e.label,running:e.running})),l.length<=1))return;let n=typeof e?.defaultId==`string`?e.defaultId:void 0,r=()=>{s||(o=Re(l,n))};r(),le.replaceChildren(...l.map(e=>{let t=document.createElement(`option`);return t.value=e.id,t.textContent=e.running?e.label:`${e.label}(未运行)`,t}));let i=document.createElement(`option`);i.value=``,i.textContent=`默认库`,le.append(i),le.value=o??``,se.hidden=!1,de(),u=Le(()=>{r(),le.value=o??``,de()})}),T.addEventListener(`input`,ne);let fe,E=Uy({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
808
- Ctrl+Enter 保存`,onSave:()=>{fe?.()},onChange:ne}),pe=document.createElement(`button`);pe.type=`button`,pe.className=`dsh-tw-note-upload`,pe.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,pe.textContent=`📎 上传`;let me=document.createElement(`input`);me.type=`file`,me.multiple=!0,me.hidden=!0,pe.addEventListener(`click`,()=>{me.click()}),me.addEventListener(`change`,()=>{for(let e of Array.from(me.files??[]))sb(e,E,d);me.value=``});let he=0;E.el.addEventListener(`dragenter`,e=>{e.preventDefault(),he++,E.el.classList.add(`dsh-tw-note-drop`)}),E.el.addEventListener(`dragover`,e=>{e.preventDefault()}),E.el.addEventListener(`dragleave`,e=>{e.preventDefault(),he=Math.max(0,he-1),he===0&&E.el.classList.remove(`dsh-tw-note-drop`)}),E.el.addEventListener(`drop`,e=>{e.preventDefault(),he=0,E.el.classList.remove(`dsh-tw-note-drop`);let t=e.dataTransfer?.files;if(!(t===void 0||t.length===0))for(let e of Array.from(t))sb(e,E,d)});let ge=document.createElement(`div`);ge.className=`dsh-tw-note-foot`;let _e=document.createElement(`div`);_e.className=`dsh-tw-note-foot-left`;let ye=document.createElement(`span`);ye.className=`dsh-tw-note-hint`,ye.textContent=`Ctrl+Enter`;let be=document.createElement(`button`);be.type=`button`,be.className=`dsh-tw-note-recent-btn`,be.title=`最近修改的笔记,点击载入继续编辑`,be.textContent=`🕘 最近`,be.addEventListener(`click`,ae),_e.append(pe,be,ye);let xe=document.createElement(`div`);xe.className=`dsh-tw-note-foot-right`;let Se=document.createElement(`button`);Se.type=`button`,Se.className=`dsh-tw-note-edit`,Se.title=`保存并在 TiddlyWiki 原生编辑器中打开`,Se.textContent=`✏️ 在 TW 中编辑`;let Ce=document.createElement(`button`);Ce.type=`button`,Ce.className=`dsh-tw-note-save`,Ce.textContent=`保存`,xe.append(Se,Ce),ge.append(_e,xe);let we=document.createElement(`div`);we.className=`dsh-tw-note-recent`,we.hidden=!0,a.append(p,b,w,E.el,ge),r.append(a,we),document.body.append(r),e={root:r,card:a,editor:E,titleInput:T,tagEditor:oe,saveBtn:Ce,editBtn:Se,draftBanner:b,bannerText:x,recentWrap:we};let Te=()=>{n=!1,r.hidden=!0,ie(),_(!1)},Ee=()=>{f!==void 0&&(clearTimeout(f),f=void 0),E.setValue(``),T.value=rb(),S=T.value,oe.setTags([]),h=tb(T.value.trim(),``,[])},De=()=>{eb(),C(),h=tb(T.value.trim(),E.getValue(),oe.getTags()),m=null,Ee(),Te()},Oe=!1;fe=async()=>{if(Oe)return;let e=E.getValue().trim();if(e.length===0){D(`内容为空,未保存`);return}Oe=!0,Ce.disabled=!0,Ce.textContent=`保存中…`;try{let t=T.value.trim(),n={title:t,tags:oe.getTags(),text:e};m!==null&&m.title===t&&(m.modified!==void 0&&(n.expectedModified=m.modified),m.revision!==void 0&&(n.expectedRevision=m.revision));let r=await fetch(d(v),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n),signal:AbortSignal.timeout(1e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0){if(r.status===409||i?.conflict===!0){D(`保存被拒绝:这篇笔记在你读取之后被改动过。请用「🕘 最近」重新载入后再保存。`);return}D(`保存失败:${i?.error??`HTTP ${r.status}`}`);return}De(),D(`已保存「${i.title??T.value}」`)}catch(e){D(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{Oe=!1,Ce.disabled=!1,Ce.textContent=`保存`}},Ce.addEventListener(`click`,()=>{fe?.()});let ke=async()=>{let e=T.value.trim().length>0?T.value.trim():rb(),t=E.getValue(),n=oe.getTags();Se.disabled=!0,Se.textContent=`打开中…`;try{await re(e,t,n)}finally{Se.disabled=!1,Se.textContent=`✏️ 在 TW 中编辑`}};Se.addEventListener(`click`,()=>{ke()}),y.addEventListener(`click`,Te);let Ae=null,je=(e,t)=>{let n=window.innerWidth,i=window.innerHeight,o=a.offsetWidth||340,s=a.offsetHeight||260,c=Math.min(Math.max(e,8),Math.max(8,n-o-8)),l=Math.min(Math.max(t,8),Math.max(8,i-s-8));r.style.right=`auto`,r.style.bottom=`auto`,r.style.left=`${c}px`,r.style.top=`${l}px`};p.addEventListener(`pointerdown`,e=>{if(y.contains(e.target))return;e.preventDefault();let t=r.getBoundingClientRect();Ae={startX:e.clientX,startY:e.clientY,origLeft:t.left,origTop:t.top,moved:!1};try{p.setPointerCapture(e.pointerId)}catch{}p.classList.add(`dsh-tw-note-head-dragging`)}),p.addEventListener(`pointermove`,e=>{if(Ae===null)return;let t=e.clientX-Ae.startX,n=e.clientY-Ae.startY;!Ae.moved&&Math.abs(t)<4&&Math.abs(n)<4||(Ae.moved=!0,je(Ae.origLeft+t,Ae.origTop+n))});let Me=e=>{if(Ae!==null){try{p.releasePointerCapture(e.pointerId)}catch{}Ae=null,p.classList.remove(`dsh-tw-note-head-dragging`)}};p.addEventListener(`pointerup`,Me),p.addEventListener(`pointercancel`,Me),ee.addEventListener(`click`,()=>{eb(),C(),Ee(),D(`已丢弃草稿`)}),i=()=>{te()},window.addEventListener(`pagehide`,i)};return{async open(r){if(t||(T(),e===void 0||n))return;n=!0,e.root.hidden=!1,b(r),_(!0);let i=Zy(),o=i?.draft??null;if(o!==null&&(o.text.trim().length>0||o.title.trim().length>0))e.editor.setValue(o.text),e.titleInput.value=o.title,e.tagEditor.setTags(o.tags),e.bannerText.textContent=i?.foreign===!0?`已恢复未保存草稿(来自其它窗口)`:`已恢复未保存草稿`,e.draftBanner.hidden=!1,i?.foreign===!0&&(D(`已恢复其它窗口的未保存草稿`),Qy(o));else{if(ee(),a=await ab(),t||e===void 0)return;e.tagEditor.setDefault(a)}e!==void 0&&e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,ie(),_(!1))},async openNative(){if(!(t||r)&&!(Lt()&&!Rt())){r=!0;try{let e=Zy(),n=e!==null&&(e.draft.text.trim().length>0||e.draft.title.trim().length>0),r=n&&e.draft.title.trim().length>0?e.draft.title.trim():rb(),i=n?e.draft.text:``,o=[];if(n)o=e.draft.tags;else{if(a=await ab(),t)return;o=[a]}e!==null&&e.foreign&&(e.draft.text.trim().length>0||e.draft.title.trim().length>0)&&(D(`已恢复其它窗口的未保存草稿`),Qy(e.draft)),await re(r,i,o)}finally{r=!1}}},isOpen(){return n},dispose(){t=!0,u?.(),u=void 0,i!==void 0&&(window.removeEventListener(`pagehide`,i),i=void 0),f!==void 0&&(clearTimeout(f),f=void 0),te(),e?.tagEditor.dispose(),e?.editor.view.destroy(),e?.root.remove(),e=void 0}}}function lb(e){return e<10?`0${e}`:String(e)}function ub(e){return`${lb(e.getHours())}:${lb(e.getMinutes())}`}function db(e,t){let n=e?.git,r=[`同步知识库`],i=`offline`;if(n==null||n.exists!==!0)r.push(`git 仓库不可用`);else{r.push(`分支 ${n.branch??`?`}`),typeof n.lastCommit==`string`&&r.push(n.lastCommit);let e=typeof n.behind==`number`?n.behind:0,t=typeof n.ahead==`number`?n.ahead:0;t>0&&r.push(`领先 ${t}`),e>0&&r.push(`落后 ${e}`),n.dirty===!0?(i=`dirty`,r.push(`有 ${n.dirtyFiles?.length??0} 个未提交改动`)):i=e>0?`behind`:`clean`}return t!==void 0&&r.push(`上次同步 ${ub(t)}`),{state:i,tooltip:r.join(` · `)}}function fb(){let e={state:`offline`,tooltip:`同步知识库`},t,n,r=!1,i=!1,a=new Set,o=()=>{for(let e of[...a])e()},s=n=>{if(r)return;let i=db(n,t);(i.state!==e.state||i.tooltip!==e.tooltip)&&(e=i,o())},c=async()=>{if(i)return;let e=await ve();i||s(e)};return c(),n=window.setInterval(()=>{c()},3e4),{getState:()=>e,trigger:async()=>{if(i)return e;if(r)return D(`同步进行中…`),e;r=!0,e={...e,state:`syncing`},o();try{let e=await fetch(te,{method:`POST`,signal:AbortSignal.timeout(12e4)}),n=ge(await e.json().catch(()=>null),e.status);n.ok?(t=new Date,D(`同步完成:${n.message}`)):D(`同步失败:${n.message}`)}catch(e){D(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{r=!1,await c()}return e},subscribe(e){return a.add(e),()=>{a.delete(e)}},dispose(){i=!0,n!==void 0&&(clearInterval(n),n=void 0),a.clear()}}}async function pb(){let e=await ve(),t=Array.isArray(e?.wikis)?e.wikis.map(e=>({id:e.id,label:e.label,running:e.running,path:e.path})):[];return{mode:typeof e?.mode==`string`?e.mode:`single`,...typeof e?.defaultId==`string`?{defaultId:e.defaultId}:{},wikis:t}}async function mb(){let e=await Te();return{showQuickNote:e.showQuickNote,showPanelStatus:e.showPanelStatus,showSyncButton:e.showSyncButton}}async function hb(){let e=await ve();if(e===null)return{state:`failed`,text:`状态不可达`,logs:[]};let t=Array.isArray(e.logs)?e.logs.filter(e=>typeof e==`string`):[];return e.status===`running`?{state:`running`,text:`TW 在线 · ${e.url??``}`,logs:t}:e.status===`starting`?{state:`starting`,text:`TW 启动中…`,logs:t}:{state:`failed`,text:e.error??`TW 状态:${e.status??`?`}`,logs:t}}function gb(e,t,n){let r=!1,i,a,o,s,c,l,u,d,f=!1,m={state:`unknown`,text:`TiddlyWiki 服务…`,logs:[]},h=()=>{f=!1,s!==void 0&&(s.hidden=!0),u!==void 0&&(u.hidden=!0)},g=e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||h()},_=()=>{if(u===void 0)return;let e=[`TiddlyWiki 服务:${m.text}`];e.push(`知识库同步:${n.getState().tooltip}`),m.logs.length>0&&(e.push(`最近日志:`),e.push(...m.logs.slice(-3))),u.textContent=e.join(`
809
- `)},v=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),_()},y=async()=>{m=await hb(),!r&&(c!==void 0&&(c.textContent=m.text),l!==void 0&&(l.dataset.state=m.state),_())},b=(m,b)=>{if(r)return;if(i=document.createElement(`div`),i.className=`dsh-tw-fab-wrap`,s=document.createElement(`div`),s.className=`dsh-tw-fab-menu`,s.hidden=!0,m.showPanelStatus){let e=document.createElement(`div`);e.className=`dsh-tw-fab-status dsh-tw-fab-status-tiprow`,l=document.createElement(`span`),l.className=`dsh-tw-fab-status-dot`,l.dataset.state=`unknown`,c=document.createElement(`span`),c.className=`dsh-tw-fab-status-text`,c.textContent=`TiddlyWiki 服务…`,e.append(l,c),u=document.createElement(`div`),u.className=`dsh-tw-fab-tip`,u.hidden=!0,e.append(u),e.addEventListener(`mouseenter`,()=>{_(),u!==void 0&&(u.hidden=!1)}),e.addEventListener(`mouseleave`,()=>{u!==void 0&&(u.hidden=!0)}),s.append(e)}if(m.showQuickNote){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`📝 快速笔记`,e.title=`ui.quickNoteMode=native 时直接打开 TW 原生编辑器;card 时打开 Markdown 卡片`,e.addEventListener(`click`,()=>{h(),Te().then(e=>{e.quickNoteMode===`native`?t.openNative():t.open()})}),s.append(e)}if(m.showPanelStatus){if(b.wikis.length>1){let t=Re(b.wikis,b.defaultId),n=document.createElement(`div`);n.className=`dsh-tw-fab-group`,n.textContent=`知识库`,s.append(n);for(let n of b.wikis){let r=document.createElement(`button`);r.type=`button`,r.className=`dsh-tw-fab-item`,r.dataset.current=n.id===t?`1`:`0`,r.textContent=`${n.id===t?`●`:`○`} ${n.label}`,r.title=`${n.path}${n.running?``:`(未运行,打开会启动)`}`,r.addEventListener(`click`,()=>{h(),Ie(n.id),n.running||fetch(`${p}/admin/wikis`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`start`,id:n.id}),signal:AbortSignal.timeout(12e4)}).catch(()=>void 0),e.openPanel()}),s.append(r)}}d=document.createElement(`span`),d.textContent=`打开 TW 面板`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-fab-item`,t.append(document.createTextNode(`🖥 `),d),t.addEventListener(`click`,()=>{h(),e.toggle()}),s.append(t);let n=document.createElement(`button`);n.type=`button`,n.className=`dsh-tw-fab-item`,n.textContent=`🔄 重载 TW 面板`,n.addEventListener(`click`,()=>{h(),document.dispatchEvent(new CustomEvent(ot)),y()}),s.append(n)}if(m.showSyncButton){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`🔁 同步`,e.addEventListener(`click`,()=>{h(),n.trigger()}),s.append(e)}a=document.createElement(`button`),a.type=`button`,a.className=`dsh-tw-fab`,a.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let x=document.createElement(`span`);x.className=`dsh-tw-fab-icon`,x.innerHTML=`<svg viewBox="0 0 16 16" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z"/><path d="M6 6h4M6 8.5h2.5"/></svg>`,o=document.createElement(`span`),o.className=`dsh-tw-fab-dot`,o.dataset.state=n.getState().state,a.append(x,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){h();return}f=!0,s.hidden=!1,v(),y()}}),i.append(s,a),document.body.append(i),v(),document.addEventListener(`click`,g,!0)},x=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),S=n.subscribe(v);return(async()=>{let[e,t]=await Promise.all([mb(),pb()]);r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||b(e,t)})(),()=>{r=!0,document.removeEventListener(`click`,g,!0),x(),S(),i?.remove()}}function _b(e){return function(){let[t,n]=c.useState(!1),[r,i]=c.useState(null),a=c.useRef(null),o=c.useRef(null);c.useEffect(()=>{let e=!0,t=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(Wy,t),Te().then(t=>{e&&i(t.quickNoteMode)}),()=>{e=!1,window.removeEventListener(Wy,t)}},[]),c.useLayoutEffect(()=>{let e=a.current;if(e===null)return;let t=()=>{let t=null,n=null,r=e;for(;r!==null&&r!==document.documentElement&&(r=r.parentElement,r!==null);){for(let e of r.querySelectorAll(`textarea, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`))if(e.getBoundingClientRect().width>300){t=e,n=r;break}if(n!==null)break}if(t===null||n===null)return null;let i=n.getBoundingClientRect().width,a=t,o=null,s=0;for(;a!==null&&a!==n;){let e=a.getBoundingClientRect().width;e>0&&e<i-8&&e>=s&&(s=e,o=a),a=a.parentElement}return o},n=()=>{let n=e.getBoundingClientRect(),r=t(),i=r===null?n.right:r.getBoundingClientRect().right,a=Math.max(0,n.right-i);return e.style.paddingRight!==`${a}px`&&(e.style.paddingRight=`${a}px`),r!==null};n();let r=new ResizeObserver(n),i=e;for(;i!==null&&i!==document.documentElement&&(r.observe(i),!(i instanceof HTMLElement&&i.hasAttribute(`data-phase`)));)i=i.parentElement;window.addEventListener(`resize`,n),document.addEventListener(`visibilitychange`,n);let o=0,s=0,c=window.setInterval(()=>{if(s++,!n()){s>=20&&window.clearInterval(c);return}o++,o>=3&&window.clearInterval(c)},1500),l=window.setTimeout(n,120),u=window.setTimeout(n,600);return()=>{r.disconnect(),window.removeEventListener(`resize`,n),document.removeEventListener(`visibilitychange`,n),window.clearInterval(c),window.clearTimeout(l),window.clearTimeout(u)}},[]);let s=r===`native`,l=s?`快速笔记`:t?`快速笔记(已打开)`:`快速笔记`,u=s?`快速笔记:直接打开 TiddlyWiki 原生编辑器(再次点击可收起弹窗)`:t?`快速笔记已打开(点此按钮或卡片右上角 ✕ 收起)`:`打开快速笔记(在按钮上方弹出,可拖动标题栏移动)`;return c.createElement(`div`,{ref:a,className:`dsh-tw-dock-note`},c.createElement(`button`,{ref:o,type:`button`,className:t?`dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active`:`dsh-tw-dock-note-btn`,title:u,onClick:()=>{Te().then(t=>{t.quickNoteMode===`native`?Lt()&&!Rt()?Bt():e.openNative():e.isOpen()?e.close():e.open(o.current??void 0)})}},c.createElement(`span`,{className:`dsh-tw-dock-note-icon`,"aria-hidden":`true`},`📝`),c.createElement(`span`,{className:`dsh-tw-dock-note-label`},l)))}}function vb(){return function(e){let t=typeof e.sessionId==`string`&&e.sessionId.length>0?e.sessionId:void 0,[n,r]=c.useState([]),[i,a]=c.useState(``),[o,s]=c.useState(void 0),[l,u]=c.useState(!1);if(c.useEffect(()=>{if(t===void 0)return;let e=!0;return(async()=>{let[n,i]=await Promise.all([ve(),fetch(`${E}?session=${encodeURIComponent(t)}`,{signal:AbortSignal.timeout(8e3)}).then(e=>e.ok?e.json():null).catch(()=>null)]);if(!e)return;let o=(n?.wikis??[]).filter(e=>e.agentVisible);r(o.map(e=>({id:e.id,label:e.label,running:e.running}))),a(typeof i?.scope==`string`?i.scope:``),s(typeof i?.reason==`string`?i.reason:void 0)})(),()=>{e=!1}},[t]),t===void 0||n.length<=1)return null;let d=e=>{u(!0),(async()=>{try{let n=await fetch(E,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t,wiki:e.length>0?e:null}),signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>({}));if(!n.ok||r.ok!==!0){s(r.error??`切换失败(HTTP ${n.status})`);return}a(typeof r.scope==`string`?r.scope:e),s(typeof r.reason==`string`?r.reason:void 0)}catch(e){s(e instanceof Error?e.message:String(e))}finally{u(!1)}})()};return c.createElement(`div`,{className:`dsh-tw-scope-dock`},c.createElement(`span`,{className:`dsh-tw-scope-label`},`知识库`),c.createElement(`select`,{className:`dsh-tw-scope-select`,value:i,disabled:l,"aria-label":`本会话使用的知识库`,title:`本会话的 tiddlywiki_* 工具与注入提示词都作用于这个知识库(下一个模型步骤生效)`,onChange:e=>{d(e.target.value)}},c.createElement(`option`,{value:``},`默认库`),...n.map(e=>c.createElement(`option`,{key:e.id,value:e.id},`${e.label}${e.running?``:`(未运行,选中会启动)`}`))),o===void 0?null:c.createElement(`span`,{className:`dsh-tw-scope-note`},o))}}async function yb(e,t=15e3){try{let n=await fetch(_,{method:`POST`,headers:{"content-type":`application/json`,"x-requested-with":`TiddlyWiki`},body:JSON.stringify({title:e}),signal:AbortSignal.timeout(t)});if(!n.ok)return null;let r=await n.text();return r.trim().length>0?r:null}catch{return null}}function bb(){return lt()}async function xb(e){try{let t=await fetch(`${g}?title=${encodeURIComponent(e)}`,{signal:AbortSignal.timeout(8e3)});if(t.status===404)return`no`;if(!t.ok)return`unknown`;let n=await t.json().catch(()=>null);return n===null?`unknown`:n.notFound===!0?`no`:`yes`}catch{return`unknown`}}function Sb(e){let{sessionId:t,viewRequest:n,completeViewRequest:r}=e,[i,a]=c.useState(`loading`),[o,s]=c.useState(null),[l,u]=c.useState(null),[d,f]=c.useState(``),[p,m]=c.useState(!1),h=c.useRef(0),g=c.useRef(!0),_=c.useRef(0),v=c.useRef(0),y=c.useCallback(async e=>{let n=++h.current;if(!g.current)return;let r=e?.silent===!0;r||a(`loading`);let i=e=>{if(_.current++,r){m(!0);return}a(`error`),f(e)};if(typeof t!=`string`||t.length===0){a(`error`),f(`缺少会话 ID`);return}if(_.current>=3){if(r){m(!0);return}a(`error`),f(`连续 3 次生成失败,已停止自动重试,请点「🔄 刷新」`);return}try{let e=await fetch(C,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t}),signal:AbortSignal.timeout(25e3)}),o=await e.json().catch(()=>null);if(!g.current||n!==h.current)return;if(!e.ok||o?.ok!==!0){i(o?.error??`HTTP ${e.status}`);return}if(typeof o.title!=`string`||o.title.length===0){i(`汇总生成失败:缺少标题`);return}u(o.title);let c=await yb(o.title);if(!g.current||n!==h.current)return;if(c===null){let e=await xb(o.title);if(!g.current||n!==h.current)return;if(e===`no`){if(_.current++,_.current<3){y();return}a(`error`),f(`汇总条目不存在,自动重建失败,请重试`);return}if(e===`unknown`){if(r){m(!0);return}a(`error`),f(`渲染失败:wiki 渲染服务不可用(host /render),条目状态未知`);return}i(`渲染失败:wiki 渲染服务不可用(host /render)`);return}_.current=0,v.current=Date.now(),m(!1),s(c),a(`ready`)}catch(e){if(!g.current||n!==h.current)return;i(e instanceof Error?e.message:String(e))}},[t]);c.useEffect(()=>(g.current=!0,_.current=0,v.current=Date.now(),m(!1),y(),()=>{g.current=!1}),[y]),c.useEffect(()=>{if(l===null)return;let e=!0,t=window.setInterval(()=>{(async()=>{if(!e||typeof document<`u`&&document.hidden)return;let t=await xb(l);if(e){if(t===`unknown`){m(!0);return}if(t===`no`){if(_.current++,_.current<3){y();return}a(`error`),f(`汇总条目已失效且自动重建多次失败,请点「🔄 刷新」重试`);return}if(Date.now()-v.current>18e4){y({silent:!0});return}_.current=0,m(!1)}})()},3e4);return()=>{e=!1,window.clearInterval(t)}},[l,y]),c.useEffect(()=>{n!=null&&r?.()},[n,r]);let b=()=>{_.current=0,y()},x;return x=i===`loading`?c.createElement(`div`,{className:`dsh-tw-summary-state`},c.createElement(`div`,{className:`dsh-tw-summary-state-spin`},`⏳`),c.createElement(`div`,null,`正在生成会话 wiki 汇总…`)):i===`error`?c.createElement(`div`,{className:`dsh-tw-summary-state`},c.createElement(`div`,{className:`dsh-tw-summary-state-title`},`知识库汇总暂不可用`),c.createElement(`div`,{className:`dsh-tw-summary-state-detail`},d),c.createElement(`button`,{type:`button`,className:`dsh-tw-summary-btn`,onClick:b},`重试`)):c.createElement(`div`,{className:`dsh-tw-summary-native dsh-tw-toolcard-native`},p?c.createElement(`div`,{className:`dsh-tw-summary-state-detail`},`⚠️ 未能确认最新状态(wiki 查询或刷新失败),以下是上次生成的内容`):null,c.createElement(`div`,{dangerouslySetInnerHTML:{__html:o??``}})),c.createElement(`div`,{className:`dsh-tw-summary`,"data-dsh-tw-summary":`true`},c.createElement(`div`,{className:`dsh-tw-summary-bar`},c.createElement(`span`,{className:`dsh-tw-summary-bar-title`},`📚 本会话知识库`),c.createElement(`span`,{className:`dsh-tw-summary-bar-hint`},`产生 / 读取 / 检索过的笔记(含子代理)`),c.createElement(`span`,{className:`dsh-tw-summary-bar-spacer`}),c.createElement(`button`,{type:`button`,className:`dsh-tw-summary-btn`,onClick:b,disabled:i===`loading`,title:`重新生成并刷新汇总`},`🔄 刷新`)),x)}function Cb(e,t){if(!(e===void 0||t.showSessionTab===!1))return ct(t.tabLabel),e.inject(`conversation.view`,()=>e.register({name:`conversation.view`,id:`dsh-tiddlywiki-summary`,order:20,label:bb},Sb))}function $(e,t,n){let r=document.createElement(e);return t!==void 0&&(r.className=t),n!==void 0&&(r.textContent=n),r}function wb(e){let t=$(`div`,`dsh-tw-settings-banner`);return t.dataset.tone=`error`,t.setAttribute(`style`,`border:1px solid #c0392b;background:#fdecea;color:#8c1c13;border-radius:6px;padding:10px 12px;margin:0 0 12px;font-size:12px;line-height:1.6;white-space:pre-wrap;`),t.textContent=e,t}async function Tb(e,t){let n=await fetch(e,{...t,signal:t?.signal??AbortSignal.timeout(15e3)}),r=await n.json().catch(()=>({}));if(!n.ok){let e=r.error??`HTTP ${n.status}`;throw Error(e)}return r}function Eb(e){let t=!1;e.classList.add(`dsh-tw-settings`);let n=$(`div`,`dsh-tw-settings-error`);n.hidden=!0;let r=$(`div`,`dsh-tw-settings-row dsh-tw-settings-status`),i=$(`div`,`dsh-tw-settings-body`);e.append(n,r,i);let a=[],o={},s={},c=!1,l=async()=>{c||i.replaceChildren($(`div`,`dsh-tw-settings-muted`,`加载中…`));try{let e=await Tb(Mb(re));if(t)return;c=!0,n.hidden=!0,n.replaceChildren(),Db(r,e,l),Ib(i,e,l,()=>t,o,s)}catch(e){if(t)return;c||i.replaceChildren($(`div`,`dsh-tw-settings-muted`,`配置尚未加载。`));let r=$(`button`,`dsh-tw-settings-btn`,`重试`);r.type=`button`,r.addEventListener(`click`,()=>{l()}),n.replaceChildren($(`span`,void 0,`加载配置失败:${e instanceof Error?e.message:String(e)} `),r),n.hidden=!1}};return l(),a.push(()=>{t=!0,e.replaceChildren(),e.classList.remove(`dsh-tw-settings`)}),()=>{for(let e of a.splice(0))e()}}function Db(e,t,n){e.replaceChildren();let r=t.server??{},i=r.status??`unknown`,a=$(`span`,`dsh-tw-settings-chip`,i);a.dataset.state=i;let o=$(`span`,`dsh-tw-settings-muted`,[r.url===void 0?``:`TW ${r.url}`,t.git?.branch===void 0?``:`git ${t.git.branch}`,t.git?.lastCommit===void 0?``:t.git.lastCommit,t.git?.conflict===void 0?t.git?.dirty===!0?`有未提交改动`:``:`⚠️ 冲突未解决(${t.git.conflict.files.length} 个文件,已阻止提交)`].filter(Boolean).join(` · `)),s=$(`button`,`dsh-tw-settings-btn`,`同步`);s.type=`button`,s.title=`git 同步(pull → commit → push)`,s.addEventListener(`click`,()=>{s.disabled=!0,s.textContent=`同步中…`,(async()=>{try{let e=await fetch(te,{method:`POST`,signal:AbortSignal.timeout(12e4)}),t=ge(await e.json().catch(()=>null),e.status);D(t.ok?`同步完成:${t.message}`:`同步失败:${t.message}`)}catch(e){D(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{s.disabled=!1,s.textContent=`同步`,n()}})()});let c=$(`button`,`dsh-tw-settings-btn`,`重启 TW`);c.type=`button`,c.addEventListener(`click`,()=>{c.disabled=!0,c.textContent=`重启中…`,(async()=>{try{await Tb(T,{method:`POST`,signal:AbortSignal.timeout(12e4)}),D(`TW 已重启`)}catch(e){D(`重启失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`重启 TW`,n()}})()}),e.append(a,o,s,c)}function Ob(e,t,n,r){let i=$(`section`,`dsh-tw-settings-section`);i.append($(`h3`,`dsh-tw-settings-h`,`常规配置`));let a=t.note??{},o=t.git??{},s=t.ui??{},c=[],l=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-input`);r.autocomplete=`off`,r.value=n;let a=$(`label`,`dsh-tw-settings-field`);a.append($(`span`,`dsh-tw-settings-label`,t),r),c.push({key:e,initial:n,read:()=>r.value.trim(),changed:()=>r.value.trim()!==n}),i.append(a)},u=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-input`);r.type=`password`,r.value=n,r.autocomplete=`off`;let a=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`👁`);a.type=`button`,a.title=`显示 / 隐藏`,a.setAttribute(`aria-label`,`显示 / 隐藏`),a.addEventListener(`click`,e=>{e.preventDefault();let t=r.type===`password`;r.type=t?`text`:`password`,a.textContent=t?`🙈`:`👁`});let o=$(`label`,`dsh-tw-settings-field`);o.append($(`span`,`dsh-tw-settings-label`,t),r,a),c.push({key:e,initial:n,read:()=>r.value.trim(),changed:()=>r.value.trim()!==n}),i.append(o)},d=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-check`);r.type=`checkbox`,r.checked=n;let a=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-check`);return a.append(r,$(`span`,`dsh-tw-settings-label`,t)),c.push({key:e,initial:n,read:()=>r.checked,changed:()=>r.checked!==n}),i.append(a),r},f=(e,t,n,r)=>{let a=$(`input`,`dsh-tw-settings-input`);a.type=`number`,a.value=String(n),r?.min!==void 0&&(a.min=String(r.min)),r?.max!==void 0&&(a.max=String(r.max)),r?.step!==void 0&&(a.step=String(r.step));let o=$(`div`,`dsh-tw-settings-error`);o.hidden=!0;let s=()=>{let e=a.value.trim();if(e.length===0)return`不能为空`;let t=Number(e);if(!Number.isFinite(t))return`请输入数字`;if(r?.integer===!0&&!Number.isInteger(t))return`必须是整数`;if(r?.min!==void 0&&t<r.min)return`不能小于 ${r.min}`;if(r?.max!==void 0&&t>r.max)return`不能大于 ${r.max}`},l=()=>{let e=s();o.textContent=e===void 0?``:`⚠️ ${e}(保存会被拒绝)`,o.hidden=e===void 0,e===void 0?a.removeAttribute(`aria-invalid`):a.setAttribute(`aria-invalid`,`true`)};a.addEventListener(`input`,l);let u=()=>{let e=a.value.trim(),t=Number(e);return e.length===0||!Number.isFinite(t)?e:t},d=$(`label`,`dsh-tw-settings-field`);d.append($(`span`,`dsh-tw-settings-label`,t),a,o),c.push({key:e,initial:n,read:u,changed:()=>u()!==n,invalid:s}),l(),i.append(d)},p=(e,t,n,r)=>{let a=$(`select`,`dsh-tw-settings-input`);for(let e of r){let t=document.createElement(`option`);t.value=e.value,t.textContent=e.label,e.value===n&&(t.selected=!0),a.append(t)}let o=$(`label`,`dsh-tw-settings-field`);return o.append($(`span`,`dsh-tw-settings-label`,t),a),c.push({key:e,initial:n,read:()=>a.value,changed:()=>a.value!==n}),i.append(o),a},m=(e,t,n,r)=>{let a=$(`textarea`,`dsh-tw-settings-input dsh-tw-settings-area`);a.rows=r,a.value=n;let o=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-area`);return o.append($(`span`,`dsh-tw-settings-label`,t),a),c.push({key:e,initial:n,read:()=>a.value.trim(),changed:()=>a.value.trim()!==n}),i.append(o),a};l(`note.tag`,`快速笔记默认 tag`,typeof a.tag==`string`?a.tag:`inbox`),d(`note.workspaceMark`,`新建笔记自动标工作区(ws/<项目名> 标签 + workspace 字段,取自当前会话工作目录)`,a.workspaceMark!==!1),d(`git.autoCommit`,`自动 commit(防抖)`,o.autoCommit!==!1),f(`git.debounceMs`,`自动 commit 防抖(ms;范围 0–3600000)`,typeof o.debounceMs==`number`?o.debounceMs:6e4,{min:0,max:36e5,step:1e3,integer:!0}),l(`git.remote`,`git 远端(空=仅本地;保存后即时生效,但**清空不会删除已配置的 origin**,需要时请用 git 命令处理)`,typeof o.remote==`string`?o.remote:``),l(`git.branch`,`git 分支(**只在仓库首次初始化时生效**;已有仓库请用 git 命令改分支——上面的状态行显示的是真实分支)`,typeof o.branch==`string`?o.branch:`main`);let h=t.startup??{};f(`startup.readyTimeoutMs`,`TW 启动就绪等待(ms;默认 60000,范围 5000–600000,超时上限为其 3 倍,对下次启动/重启生效)`,typeof h.readyTimeoutMs==`number`&&h.readyTimeoutMs>0?h.readyTimeoutMs:6e4,{min:5e3,max:6e5,step:1e3}),d(`ui.showQuickNote`,`显示「知识库」按钮里的「快速笔记」入口`,s.showQuickNote!==!1),d(`ui.showQuickNoteDock`,`显示聊天输入框上方的「快速笔记」快捷按钮`,s.showQuickNoteDock!==!1),p(`ui.quickNoteMode`,`点击「快速笔记」的打开方式`,typeof s.quickNoteMode==`string`&&s.quickNoteMode===`card`?`card`:`native`,[{value:`native`,label:`原生编辑器:直接弹出 TW 原生编辑页(新建/恢复草稿)`},{value:`card`,label:`Markdown 卡片:弹出现有快速笔记卡片(CodeMirror 编辑器)`}]),l(`ui.sidebarLabel`,`侧边栏 TW 入口显示名称`,typeof s.sidebarLabel==`string`&&s.sidebarLabel.trim().length>0?s.sidebarLabel.trim():`TiddlyWiki`),d(`ui.showPanelStatus`,`显示「知识库」按钮里的 TW 面板/重载入口与状态行`,s.showPanelStatus!==!1),d(`ui.showSyncButton`,`显示「知识库」按钮里的「同步」入口与 git 状态点`,s.showSyncButton!==!1),d(`ui.followDshTheme`,`嵌入式 TW 跟随 DSH 深浅主题(暗色时自动切深色 palette,不写回 wiki)`,s.followDshTheme!==!1),l(`ui.darkPalette`,`暗色时 TW palette(tiddler 标题)`,typeof s.darkPalette==`string`&&s.darkPalette.trim().length>0?s.darkPalette.trim():`$:/palettes/CupertinoDark`),l(`ui.tabLabel`,`会话顶部「知识库」Tab 名称`,typeof s.tabLabel==`string`&&s.tabLabel.trim().length>0?s.tabLabel.trim():`知识库`),d(`ui.showSessionTab`,`显示会话顶部「知识库」Tab(本会话相关 wiki 笔记汇总)`,s.showSessionTab!==!1),d(`ui.showRightbarTab`,`在 DSH 右侧边栏提供 TiddlyWiki 入口/Tab(与聊天并排)`,s.showRightbarTab!==!1);let g=s.sendToAgent??{};d(`ui.sendToAgent.enabled`,`启用「发送给 Agent」(TW 笔记 → DSH 会话注入)`,g.enabled!==!1),l(`ui.sendToAgent.endpoint`,`TW 端请求基址(空=自动取当前 DSH origin)`,typeof g.endpoint==`string`?g.endpoint:``),u(`ui.sendToAgent.token`,`共享 token(非空时路由校验 x-send-to-agent-token 头;已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof g.token==`string`?g.token:``);let _=s.allArticles??{};f(`ui.allArticles.pageSize`,`「所有文章」每页条数(1–200)`,typeof _.pageSize==`number`?_.pageSize:10,{min:1,max:200,step:1,integer:!0}),i.append($(`h3`,`dsh-tw-settings-h`,`可选功能:微信公众号发布`)),i.append($(`div`,`dsh-tw-settings-muted`,`把 wiki 笔记一键发到公众号草稿箱(可选点发表)。**需要额外安装**:opencli 与 Browser Bridge 浏览器扩展,并让浏览器登录 mp.weixin.qq.com;adapter 在本仓库 tools/wechat/,安装与排错见 docs/wechat-publish-setup.md。不安装/不开启它,插件其他功能完全不受影响。开启后:注入提示词会多一条「发布前先读发布元数据规范」的约定,并在启动时把「发布元数据规范」与「微信公众号发布指南」(安装/换机还原步骤,等于仓库 docs/wechat-publish-setup.md)两篇文档写进 wiki(同名不覆盖)。`));let v=t.wechat??{},y=d(`wechat.enabled`,`启用微信公众号发布(默认关;需先按 docs/wechat-publish-setup.md 安装 opencli + 浏览器扩展)`,v.enabled===!0);l(`wechat.command`,`opencli 命令(默认 opencli;用别名或绝对路径时填这里。仅在启用微信发布时生效)`,typeof v.command==`string`&&v.command.trim().length>0?v.command.trim():`opencli`),p(`wechat.adapter`,`发布适配器(仅在启用微信发布时生效)`,v.adapter===`publish-note-imgs`?`publish-note-imgs`:`publish-note`,[{value:`publish-note`,label:`publish-note(默认):图文排版,封面单图`},{value:`publish-note-imgs`,label:`publish-note-imgs:正文内嵌图全部上传 CDN(需先重跑 install-wechat-adapters.mjs)`}]),u(`wechat.token`,`发布 token(非空时 /wechat/* 校验 x-wechat-publish-token 头,强烈建议设置,否则任何能打开本页的人都能替你发文;已设置时显示为 ********,原样保存=不改,清空=删除。仅在启用微信发布时生效)`,typeof v.token==`string`?v.token:``),l(`wechat.dsn`,`渲染基址 dsn(adapter 回连 DSH 用,形如 http://127.0.0.1:<端口>/dsh-tiddlywiki;留空=按请求自动推导。仅在启用微信发布时生效)`,typeof v.dsn==`string`?v.dsn:``);let b=t.prompt??{};i.append($(`h3`,`dsh-tw-settings-h`,`系统提示词(注入每个会话)`)),i.append($(`div`,`dsh-tw-settings-muted`,`插件把自己的约定(同步纪律 / 标签约定 / 链接格式等)注入每个会话的系统提示词。保存后**无需重启 dsh web**:section 会即时重新注册,当前会话从下一步起就使用新文本。`));let x=d(`prompt.enabled`,`注入 TiddlyWiki 提示词(关闭后本插件不再注入任何文本)`,b.enabled!==!1),S=p(`prompt.mode`,`内置文本形态`,b.mode===`full`?`full`:`slim`,[{value:`slim`,label:`精简(默认):只保留工具 schema 表达不了的约定`},{value:`full`,label:`完整:额外附一份由工具注册表实时生成的参数索引`}]),ee=m(`prompt.extra`,`附加说明(永远追加在末尾,可放团队/个人规范)`,typeof b.extra==`string`?b.extra:``,5),te=m(`prompt.override`,`整段替换(非空时取代上面的内置文本,附加说明仍会追加)`,typeof b.override==`string`?b.override:``,8),ne=()=>c.some(e=>(e.key.startsWith(`prompt.`)||e.key===`wechat.enabled`)&&e.changed()),C=$(`button`,`dsh-tw-settings-btn`,`预览注入文本(按表单当前值)`);C.type=`button`,C.title=`按表单当前值渲染注入文本(不用先保存);点「保存配置」后这就是实际注入的内容`;let re=$(`pre`,`dsh-tw-settings-prompt-preview`);re.hidden=!0,C.addEventListener(`click`,()=>{if(!re.hidden){re.hidden=!0,re.textContent=``;return}C.disabled=!0,(async()=>{try{let e=await Tb(Mb(ie),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:x.checked,mode:S.value,extra:ee.value,override:te.value,wechat:y.checked})});if(e.ok!==!0)throw Error(e.error??`获取失败`);re.textContent=e.enabled===!1?`(已关闭:不会注入任何提示词)`:`# 形态 ${e.mode??``} · ${e.length??0} 字符${ne()?`(含未保存的修改,保存后才真正注入)`:``}\n\n${e.text??``}`,re.hidden=!1}catch(e){D(`读取提示词失败:${e instanceof Error?e.message:String(e)}`)}finally{C.disabled=!1}})()}),i.append(C,re);let w=t.bridge??{};d(`bridge.enabled`,`启用「本地剪藏桥」(书签小工具后端监听 127.0.0.1 端口,保存后立即生效)`,w.enabled===!0),f(`bridge.port`,`剪藏桥端口(整数 1–65535;改端口需重启 dsh web 生效)`,typeof w.port==`number`&&w.port>0?w.port:8618,{min:1,max:65535,step:1,integer:!0}),u(`bridge.token`,`剪藏桥 token(非空时校验书签的 x-clip-token 头;强烈建议设置。已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof w.token==`string`?w.token:``),l(`bridge.tag`,`剪藏笔记默认 tag`,typeof w.tag==`string`&&w.tag.trim().length>0?w.tag.trim():`clip`);let T=wb(r.saveError??``);T.hidden=r.saveError===void 0;let oe=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);oe.type=`button`,oe.addEventListener(`click`,()=>{oe.disabled=!0,(async()=>{let e=c.filter(e=>e.invalid?.()!==void 0);if(e.length>0){D(`有 ${e.length} 个字段填得不对(见字段旁的红色提示),未保存`),oe.disabled=!1;return}let t={};for(let e of c){if(!e.changed())continue;let n=e.key.split(`.`),r=t;for(let t=0;t<n.length;t++){let i=n[t];if(i===void 0)break;if(t===n.length-1)r[i]=e.read();else{let e=r[i]??{};r[i]=e,r=e}}}if(Object.keys(t).length===0){D(`没有改动`),oe.disabled=!1;return}try{await Tb(Mb(ae),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),we(),r.saveError=void 0,T.hidden=!0,T.textContent=``,D(`配置已保存`),n()}catch(e){r.saveError=`保存失败:${e instanceof Error?e.message:String(e)}`,T.textContent=r.saveError,T.hidden=!1,n()}finally{oe.disabled=!1}})()}),r.isDirty=()=>c.some(e=>e.changed()),i.append(T,oe),e.append(i)}function kb(e,t,n,r,i,a){let o=n?.plugins??[],s=n?.themes??[],c=n?.languages??[],l=t?.plugins??[],u=new Set(t?.themes??[]),d=t?.languages??[],f=()=>a.plugins??new Set(l),p=()=>a.themes??new Set(u),m=()=>a.languages??new Set(d),h=new Set(r?.disabled??[]),g=new Set((r?.wikiPlugins??[]).map(e=>e.title)),_=$(`section`,`dsh-tw-settings-section`);_.append($(`h3`,`dsh-tw-settings-h`,`插件管理(自带官方插件)`));let v=$(`div`,`dsh-tw-settings-muted`,`勾选 = 写入 tiddlywiki.info 的启动安装清单(离线、与引擎版本配套),应用后重启 TW。这里只管引擎自带插件;在 TW 控制面板里安装/禁用/卸载的插件见下方「wiki 内插件」。`);_.append(v);let y=$(`input`,`dsh-tw-settings-input dsh-tw-settings-search`);y.placeholder=`搜索插件…`;let b=$(`div`,`dsh-tw-settings-list`),x=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用插件(重启 TW)`);x.type=`button`;let S=()=>{x.disabled=a.plugins===void 0},ee=e=>{b.replaceChildren();let t=e.toLowerCase();for(let e of o){if(t.length>0&&!`${e.label} ${e.name} ${e.description}`.toLowerCase().includes(t))continue;let n=$(`input`,`dsh-tw-settings-check`);n.type=`checkbox`,n.checked=f().has(e.name),n.addEventListener(`change`,()=>{let t=f();n.checked?t.add(e.name):t.delete(e.name),a.plugins=t,S()});let i=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),o=$(`span`,`dsh-tw-settings-name`,e.label);o.title=e.name;let s=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);if(i.append(n,o),r!=null&&h.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`TW 内已禁用`);e.dataset.state=`disabled`,e.title=`该插件在 tiddlywiki.info 里,但已在 TW 控制面板被禁用($:/config/Plugins/Disabled)——去 TW 面板重新启用`,i.append(e)}else if(r!=null&&!l.includes(e.name)&&g.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`wiki 内已装`);e.dataset.state=`update`,e.title=`不在启动清单,但 wiki 里存在同名插件 tiddler(经 TW 原生安装),TW 运行时已在用`,i.append(e)}i.append(s),b.append(i)}};if(y.addEventListener(`input`,()=>ee(y.value)),x.addEventListener(`click`,()=>{a.plugins!==void 0&&(x.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({plugins:[...f()]})}),a.plugins=void 0,D(`插件已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),S()}})())}),ee(``),S(),_.append(y,b,x),e.append(_),r!=null){let t=new Set(o.map(e=>e.title)),n=(r.wikiPlugins??[]).filter(e=>!t.has(e.title)||h.has(e.title));if(n.length>0){let t=$(`section`,`dsh-tw-settings-section`);t.append($(`h3`,`dsh-tw-settings-h`,`wiki 内插件(经 TW 原生安装,只读)`)),t.append($(`div`,`dsh-tw-settings-muted`,`下列插件以 tiddler 形式随 wiki 文件保存(TW 控制面板 → 插件 安装/导入),不受上面勾选影响。启用 / 禁用 / 卸载请到 TW 控制面板操作。`));let r=$(`div`,`dsh-tw-settings-list`);for(let e of n){let t=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`),n=$(`span`,`dsh-tw-settings-name`,e.name||e.title);if(n.title=e.title,t.append(n),h.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`已禁用`);e.dataset.state=`disabled`,e.title=`该插件已在 TW 控制面板被禁用`,t.append(e)}else if(e.version){let n=$(`span`,`dsh-tw-settings-chip`,`v${e.version}`);n.dataset.state=`ok`,t.append(n)}let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.title);i.title=e.title,t.append(i),r.append(t)}t.append(r),e.append(t)}}let te=$(`section`,`dsh-tw-settings-section`);te.append($(`h3`,`dsh-tw-settings-h`,`主题管理(自带主题)`));let ne=$(`div`,`dsh-tw-settings-muted`,`「加载」= TW 里可用的主题(可多选,依赖链自动带上,如 heavier 会带 snowwhite+vanilla);「活动」= 当前视觉主题(单选,自动加入加载集)。应用后重启 TW。`),C=$(`div`,`dsh-tw-settings-row dsh-tw-settings-head`);C.append($(`span`,`dsh-tw-settings-col`,`加载`),$(`span`,`dsh-tw-settings-col`,`活动`),$(`span`,`dsh-tw-settings-name`,`主题`));let re=t?.themes??[],ie=t?.themeActive,ae=re[re.length-1],T=typeof ie==`string`&&s.some(e=>e.name===ie)?ie:ae??`tiddlywiki/vanilla`,oe=()=>a.themeActive??T,se=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用主题(重启 TW)`);se.type=`button`;let ce=()=>{se.disabled=a.themes===void 0&&a.themeActive===void 0},le=$(`div`,`dsh-tw-settings-list`);for(let e of s){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=p().has(e.name),t.title=`加载该主题`,t.addEventListener(`change`,()=>{let n=p();t.checked?n.add(e.name):n.delete(e.name),a.themes=n,ce()});let n=$(`input`,`dsh-tw-settings-check`);n.type=`radio`,n.name=`dsh-tw-active-theme`,n.checked=e.name===oe(),n.title=`设为活动主题`,n.addEventListener(`change`,()=>{n.checked&&(a.themeActive=e.name),ce()});let r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name),o=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);o.append(t,n,r,i),le.append(o)}se.addEventListener(`click`,()=>{a.themes===void 0&&a.themeActive===void 0||(se.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({themes:[...p()],themeActive:oe()})}),a.themes=void 0,a.themeActive=void 0,D(`主题已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),ce()}})())}),ce(),te.append(ne,C,le,se),e.append(te);let ue=$(`section`,`dsh-tw-settings-section`);ue.append($(`h3`,`dsh-tw-settings-h`,`语言管理(自带官方语言包)`));let de=$(`div`,`dsh-tw-settings-muted`,`勾选启用语言插件并重启 TW;如中文请选 zh-Hans(简体)或 zh-CN。`),fe=$(`div`,`dsh-tw-settings-list`),E=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);E.type=`button`;let pe=()=>{E.disabled=a.languages===void 0};for(let e of c){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=m().has(e.name),t.addEventListener(`change`,()=>{let n=m();t.checked?n.add(e.name):n.delete(e.name),a.languages=n,pe()});let n=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);n.append(t,r,i),fe.append(n)}E.addEventListener(`click`,()=>{a.languages!==void 0&&(E.disabled=!0,(async()=>{try{await Tb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({languages:[...m()]})}),a.languages=void 0,D(`语言已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),pe()}})())}),pe(),ue.append(de,fe,E),e.append(ue)}function Ab(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`知识库列表`));let i=$(`div`,`dsh-tw-settings-muted`,`读取中…`),a=$(`div`,`dsh-tw-settings-row`),o=$(`div`),s=$(`input`,`dsh-tw-settings-input`);s.placeholder=`根目录(绝对路径,如 D:\\notes)`;let c=$(`input`,`dsh-tw-settings-input`);c.placeholder=`文件夹名(如 books)`;let l=$(`input`,`dsh-tw-settings-input`);l.placeholder=`显示名(留空用文件夹名)`;let u=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`添加知识库`);u.type=`button`;let d=$(`div`,`dsh-tw-settings-row dsh-tw-settings-field`);d.append(s,c,l,u);let f=$(`div`,`dsh-tw-settings-muted`,`多库模式下每个知识库是一个独立的 TW 子进程(约 150MB):标了「开局自启」的随 DSH 一起起,其余在你打开或选中它时启动。对 Agent 隐身的库不进会话选择器,检索/工具也永远不碰它。`);r.append(i,a,o,d,f),e.append(r);let p=async(e,r)=>{i.textContent=r;try{let r=await Tb(fe,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:AbortSignal.timeout(18e4)});if(t())return;let i=r.change?.errors??[];i.length>0&&D(`部分操作失败:${i.map(e=>`${e.id}:${e.message}`).join(`;`)}`),h(r),await n()}catch(e){if(t())return;D(`操作失败:${e instanceof Error?e.message:String(e)}`),await g()}},m=async(e,r,a)=>{i.textContent=a;try{let i=await Tb(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.timeout(18e4)});if(t())return;i.ok!==!0&&D(`失败:${i.error??`未知错误`}`),await g(),await n()}catch(e){if(t())return;D(`失败:${e instanceof Error?e.message:String(e)}`),await g()}},h=e=>{i.textContent=e.error!==void 0&&e.error.length>0?`⚠️ ${e.error}`:``,a.replaceChildren($(`span`,`dsh-tw-settings-label`,`运行模式:`));for(let[t,n]of[[`single`,`单库(只跑默认库)`],[`multi`,`多库(清单里的库都可用)`]]){let r=e.mode===t,i=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn${r?` dsh-tw-settings-primary`:``}`,n);i.type=`button`,i.disabled=r,i.addEventListener(`click`,()=>{window.confirm(t===`multi`?`切换到多库模式:清单里标了「开局自启」的知识库都会启动(每个库一个 TW 子进程)。继续?`:`切换到单库模式:除默认库外的知识库会被停掉(内容与清单都不受影响)。继续?`)&&p({action:`set-mode`,mode:t},`切换模式中…`)}),a.append(i)}o.replaceChildren();let t=e.wikis??[];for(let r of t){let i=$(`div`,`dsh-tw-settings-kbrow`),a=r.id===e.defaultId;i.append($(`div`,`dsh-tw-settings-label`,`${a?`★ `:``}${r.label}(${r.id})`)),i.append($(`div`,`dsh-tw-settings-muted`,[r.running?`运行中`:`未运行`,r.agentVisible?`Agent 可见`:`Agent 隐身`,r.autostart?`开局自启`:`按需启动`,r.path].join(` · `)));let s=$(`div`,`dsh-tw-settings-row`),c=jb===r.id,l=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn${c?` dsh-tw-settings-primary`:``}`,c?`正在配置`:`配置`);l.type=`button`,l.disabled=c,l.addEventListener(`click`,()=>{jb=r.id,n()});let u=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.running?`停止`:`启动`);u.type=`button`,u.addEventListener(`click`,()=>{p({action:r.running?`stop`:`start`,id:r.id},r.running?`停止中…`:`启动中…`)});let d=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`设为默认`);d.type=`button`,d.disabled=a,d.addEventListener(`click`,()=>{p({action:`set-default`,id:r.id},`保存中…`)});let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.agentVisible?`对 Agent 隐身`:`对 Agent 可见`);f.type=`button`,f.addEventListener(`click`,()=>{p({action:`update`,wiki:{...r,agentVisible:!r.agentVisible}},`保存中…`)});let h=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.autostart?`取消开局自启`:`开局自启`);h.type=`button`,h.addEventListener(`click`,()=>{p({action:`update`,wiki:{...r,autostart:!r.autostart}},`保存中…`)});let g=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`移出列表`);if(g.type=`button`,g.disabled=t.length<=1,g.addEventListener(`click`,()=>{window.confirm(`把「${r.label}」移出清单?\n\n**目录与内容不会被删除**(仍在 ${r.path}),只是插件不再管理它。`)&&p({action:`remove`,id:r.id},`移出中…`)}),e.mode===`multi`){let e=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`改目录`);e.type=`button`,e.addEventListener(`click`,()=>{let e=window.prompt(`把「${r.label}」的根目录换成?\n\n当前:${r.root}`,r.root);if(e===null)return;if(e.trim().length===0){D(`根目录不能为空`);return}let t=window.prompt(`文件夹名(当前:${r.name};填 . 表示直接用上面这个根目录)`,r.name);if(t===null)return;let n={root:e.trim(),name:t.trim().length>0?t.trim():r.name};a?m(ue,n,`搬动中(会停/起这个库)…`):p({action:`update`,wiki:{...r,...n}},`保存中…`)}),s.append(e)}s.append(l,u,d,f,h,g),i.append(s),o.append(i)}s.value.length===0&&typeof t[0]?.root==`string`&&(s.value=t[0].root)};u.addEventListener(`click`,()=>{let e=s.value.trim(),t=c.value.trim();if(e.length===0||t.length===0){D(`请填写根目录与文件夹名`);return}let n={root:e,name:t},r=l.value.trim();r.length>0&&(n.label=r),p({action:`add`,wiki:n},`添加中(新库需要初始化与冷启动,请稍候)…`)});let g=async()=>{if(!t())try{let e=await Tb(fe);if(t())return;h(e)}catch(e){if(t())return;i.textContent=`读取知识库列表失败:${e instanceof Error?e.message:String(e)}`}};g()}let jb;function Mb(e){return jb===void 0?e:`${e}?wiki=${encodeURIComponent(jb)}`}function Nb(e,t,n){(async()=>{try{let e=await Tb(fe);if(t()||e.mode===`multi`)return}catch{}t()||Pb(e,t,n)})()}function Pb(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`知识库位置(可切换)`));let i=$(`div`,`dsh-tw-settings-muted`,`读取中…`),a=$(`div`,`dsh-tw-settings-muted`),o=$(`div`,`dsh-tw-settings-muted`),s=$(`div`,`dsh-tw-settings-muted`),c=$(`input`,`dsh-tw-settings-input`),l=$(`input`,`dsh-tw-settings-input`);c.placeholder=`绝对路径,如 D:\\notes 或 $DSH_HOME/tiddlywiki`,l.placeholder=`文件夹名(默认 main;填 . 表示直接用上面这个目录)`;let u=$(`label`,`dsh-tw-settings-field`);u.append($(`span`,`dsh-tw-settings-label`,`根目录(wikiRoot)`),c);let d=$(`label`,`dsh-tw-settings-field`);d.append($(`span`,`dsh-tw-settings-label`,`文件夹名(wiki)`),l);let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`切换到这个位置`);f.type=`button`;let p=$(`button`,`dsh-tw-settings-btn`,`恢复为配置默认`);p.type=`button`;let m=$(`div`,`dsh-tw-settings-row`);m.append(f,p);let h=$(`div`,`dsh-tw-settings-row dsh-tw-settings-candidates`),g=$(`div`,`dsh-tw-settings-muted`,"切换会停掉并就地重启 TW 子进程(几秒);新目录若还没有 tiddlywiki.info,插件会自动 `--init server` 初始化一个全新知识库。选中的位置会记在 $DSH_HOME 下的指针文件里(不进 wiki),可用「恢复为配置默认」清除。"),_=(e,t)=>{f.disabled=e,p.disabled=e,f.textContent=e?t:`切换到这个位置`},v=async()=>{if(!t())try{let e=await Tb(le);if(t())return;if(e.ok!==!0)throw Error(e.error??`获取失败`);let n=e.current??{};i.textContent=`当前:${n.path??`(未知)`}`;let r=n.source===`state`?`来源:指针文件(在设置页切换过)`:n.source===`config`?`来源:cordis 配置(config.wikiRoot / config.wiki)`:`来源:默认值($DSH_HOME/tiddlywiki + main)`;a.textContent=`${r} · 配置默认:${e.default?.path??`(未知)`}`,o.textContent=e.stateFile===void 0?``:`指针文件:${e.stateFile}(不存在=使用配置默认)`,s.textContent=e.error===void 0?``:`⚠️ ${e.error}`,c.value.length===0&&typeof n.root==`string`&&(c.value=n.root),l.value.length===0&&typeof n.name==`string`&&(l.value=n.name),h.replaceChildren();let u=e.candidates??[];if(u.length>0){h.append($(`span`,`dsh-tw-settings-label`,`同目录下可选的 wiki:`));for(let e of u){let t=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,e===`.`?`(根目录本身)`:e);t.type=`button`,t.title=`填入文件夹名「${e}」`,t.addEventListener(`click`,()=>{l.value=e}),h.append(t)}}}catch(e){if(t())return;i.textContent=`读取位置失败:${e instanceof Error?e.message:String(e)}`}};f.addEventListener(`click`,()=>{let e=c.value.trim(),t=l.value.trim().length>0?l.value.trim():`main`;if(e.length===0){D(`请先填写根目录(绝对路径)`);return}window.confirm(`切换知识库到:\n${e}\\${t}\n\n会停止并重启 TW 子进程;当前对话/工具随后读写的是新知识库。确定继续?`)&&(_(!0,`切换中…(重启 TW)`),(async()=>{try{let r=await Tb(ue,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({root:e,name:t}),signal:AbortSignal.timeout(12e4)});r.warning===void 0?D(`已切换到 ${r.path??``}`):D(`已切换到 ${r.path??``}(注意:${r.warning})`),we(),await v(),await n()}catch(e){D(`切换失败:${e instanceof Error?e.message:String(e)}`),await v()}finally{_(!1,``)}})())}),p.addEventListener(`click`,()=>{window.confirm(`恢复为配置默认位置?会删除位置指针文件,并(必要时)切回配置里的知识库。`)&&(_(!0,`切换中…(重启 TW)`),(async()=>{try{let e=await Tb(de,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`,signal:AbortSignal.timeout(12e4)});D(e.warning===void 0?`已恢复为配置默认:${e.path??``}`:`已恢复默认(注意:${e.warning})`),we(),await v(),await n()}catch(e){D(`恢复失败:${e instanceof Error?e.message:String(e)}`),await v()}finally{_(!1,``)}})())}),r.append(i,a,o,u,d,m,h,s,g),e.append(r),v()}function Fb(e,t){let n=$(`section`,`dsh-tw-settings-section`);n.append($(`h3`,`dsh-tw-settings-h`,`初始化(一次性预置)`));let r=$(`div`,`dsh-tw-settings-muted`,`这些是插件与 dsh 联动、需要在 wiki 里预置的 tiddler/配置。「发送给 Agent 按钮」和「TW 前端 API 基址」是功能必需项,启动时自动写入(只写缺失,不覆盖你的改动);其余为可选项,默认不自动写入、也不会强绑定——需要时点「重新初始化」写入,不想要了可随时「反初始化」移除。`),i=$(`div`,`dsh-tw-settings-list`),a=$(`div`,`dsh-tw-settings-muted`),o=async()=>{if(!t())try{let e=await Tb(oe);if(t())return;if(e.ok!==!0||!Array.isArray(e.items))throw Error(e.error??`获取失败`);i.replaceChildren();let n=0,r=0;for(let t of e.items){t.present&&(n+=1),t.removable&&(r+=1);let e=$(`span`,`dsh-tw-settings-chip`,t.present?`✓`:`✗`);e.dataset.state=t.present?`ok`:`missing`,e.title=t.present?`已存在`:`缺失`;let a=$(`span`,`dsh-tw-settings-name`,t.title);a.title=t.id;let s=$(`span`,`dsh-tw-settings-muted`,t.detail??t.description),c=t.updateAvailable===!0?$(`span`,`dsh-tw-settings-chip`,`⬆ 有更新`):void 0;c!==void 0&&(c.dataset.state=`update`,c.title=`内置内容在本 wiki 预置之后更新过,可点「重新初始化」取用`);let l=t.userModified===!0?$(`span`,`dsh-tw-settings-chip`,`✏️ 本地已修改`):void 0;l!==void 0&&(l.dataset.state=`missing`,l.title=`这篇是你的内容:重新初始化会覆盖它`);let u=$(`button`,`dsh-tw-settings-btn`,t.updateAvailable===!0?`更新到内置版本`:`重新初始化`);u.type=`button`,u.title=`强制重写「${t.title}」的内置内容(会覆盖当前 tiddler)`,u.addEventListener(`click`,()=>{if(t.updateAvailable===!0){let e=t.userModified===!0?`「${t.title}」有你的本地修改,更新会覆盖它。`:t.userModified===void 0?`无法确认「${t.title}」是否被你编辑过(旧格式标记),更新可能覆盖你的改动。`:``;if(!window.confirm(`${e}${e.length>0?`
821
+ `}${e}\n`;n.dispatch({changes:{from:t,insert:r},selection:{anchor:t+r.length},scrollIntoView:!0}),n.focus()},focus:()=>n.focus()}}const Wy=`dsh-tw-note-state`,Gy=`dsh-tw-note-draft-v1`,Ky=`dsh-tw-note-window-id`,qy=(()=>{try{let e=sessionStorage.getItem(Ky);if(e!==null&&e.length>0)return e;let t=Math.random().toString(36).slice(2,10);return sessionStorage.setItem(Ky,t),t}catch{return Math.random().toString(36).slice(2,10)}})();function Jy(){return`dsh-tw-note-draft-v1:${qy}`}function Yy(e){if(e===null)return null;try{let t=JSON.parse(e);return typeof t.text!=`string`||typeof t.title!=`string`?null:{text:t.text,title:t.title,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e==`string`):[],savedAt:typeof t.savedAt==`number`?t.savedAt:0,windowId:typeof t.windowId==`string`?t.windowId:void 0}}catch{return null}}function Xy(e){try{return Yy(localStorage.getItem(e))}catch{return null}}function Zy(){let e=Xy(Jy());if(e!==null)return{draft:e,foreign:e.windowId!==void 0&&e.windowId!==qy};let t=Xy(Gy);if(t===null)return null;let n={...t,windowId:qy};$y(n);try{localStorage.removeItem(Gy)}catch{}return{draft:n,foreign:!0}}function Qy(e){$y({...e,windowId:qy})}function $y(e){try{localStorage.setItem(Jy(),JSON.stringify({...e,windowId:qy}))}catch{}}function eb(){try{localStorage.removeItem(Jy())}catch{}}function tb(e,t,n){return`${e}\u0000${t}\u0000${n.join(``)}`}function nb(e){return e<10?`0${e}`:String(e)}function rb(e=new Date){return`${e.getFullYear()}-${nb(e.getMonth()+1)}-${nb(e.getDate())} ${nb(e.getHours())}:${nb(e.getMinutes())}`}function ib(e){if(e===null)return``;let t=new Date(e).getTime();if(Number.isNaN(t))return``;let n=Date.now()-t,r=Math.floor(n/6e4);if(r<1)return`刚刚`;if(r<60)return`${r}分钟前`;let i=Math.floor(r/60);if(i<24)return`${i}小时前`;let a=Math.floor(i/24);return a<30?`${a}天前`:new Date(t).toLocaleDateString(`zh-CN`)}async function ab(){let e=await ve();return typeof e?.note?.tag==`string`&&e.note.tag.length>0?e.note.tag:`inbox`}function ob(e={}){let t=document.createElement(`div`);t.className=`dsh-tw-note-tags`;let n=document.createElement(`div`);n.className=`dsh-tw-note-chips`;let r=document.createElement(`input`);r.className=`dsh-tw-note-taginput`,r.placeholder=`tag(可多选,自动补全)`;let i=document.createElement(`div`);i.className=`dsh-tw-note-tagsuggest`,i.hidden=!0,t.append(n,r,i);let a=[],o=()=>{i.hidden=!0},s=()=>{e.onChange?.()},c=()=>{n.replaceChildren();for(let e of a){let t=document.createElement(`span`);t.className=`dsh-tw-note-tagchip`,t.textContent=e;let r=document.createElement(`span`);r.className=`dsh-tw-note-tagchip-x`,r.textContent=`×`,r.title=`移除 tag「${e}」`,r.addEventListener(`click`,t=>{t.stopPropagation();let n=a.indexOf(e);n>=0&&(a.splice(n,1),c(),s())}),t.append(r),n.append(t)}},l=e=>{let t=e.trim();t.length===0||a.includes(t)||(a.push(t),r.value=``,c(),o(),r.focus(),s())},u=()=>{for(let e of r.value.split(/\s+/))l(e)},d=[],f,p,m=()=>{let t=e.wikiQuery?.(b)??b;return(f===void 0||p!==t)&&(p=t,f=fetch(t,{signal:AbortSignal.timeout(5e3)}).then(e=>e.ok?e.json():Promise.resolve({})).then(e=>[...e.tags??[]].sort((e,t)=>e.localeCompare(t,`zh`))).catch(()=>[]),f.then(e=>{d=e})),f},h=()=>{let e=r.value.trim().toLowerCase(),t=d.filter(t=>!a.includes(t)&&(e.length===0||t.toLowerCase().includes(e))).slice(0,8);i.replaceChildren();for(let e of t){let t=document.createElement(`div`);t.className=`dsh-tw-note-tagsuggest-item`,t.textContent=e,t.setAttribute(`role`,`button`),t.tabIndex=0,t.setAttribute(`aria-label`,`添加标签「${e}」`),t.addEventListener(`mousedown`,t=>{t.preventDefault(),l(e)}),t.addEventListener(`keydown`,t=>{(t.key===`Enter`||t.key===` `)&&(t.preventDefault(),l(e))}),i.append(t)}i.hidden=t.length===0};r.addEventListener(`focus`,()=>{m().then(h)}),r.addEventListener(`input`,()=>{d.length===0?m().then(h):h()}),r.addEventListener(`keydown`,e=>{e.key===`Enter`||e.key===`,`?(e.preventDefault(),u()):e.key===`Backspace`&&r.value.length===0&&a.length>0?(a.pop(),c(),s()):e.key===`Escape`&&o()});let g=e=>{t.contains(e.target)||o()};return document.addEventListener(`click`,g,!0),{el:t,getTags:()=>(u(),[...a]),peekTags:()=>[...a],setDefault:e=>{if(a.length===0){let t=e.trim();t.length>0&&(a.push(t),c())}},setTags:e=>{a.length=0;for(let t of Array.isArray(e)?e:[]){let e=typeof t==`string`?t.trim():``;e.length>0&&!a.includes(e)&&a.push(e)}r.value=``,c(),o()},dispose:()=>document.removeEventListener(`click`,g,!0)}}async function sb(e,t,n=e=>e){if(e.size>67108864){D(`文件过大(≤ 64MB)`);return}try{let r=await fetch(n(`${ee}?name=${encodeURIComponent(e.name)}`),{method:`POST`,headers:{"content-type":e.type||`application/octet-stream`},body:e,signal:AbortSignal.timeout(12e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0){D(`上传失败:${i?.error??`HTTP ${r.status}`}`);return}let a=i.name??e.name,o=e.type.startsWith(`image/`)?`![${a}](${i.url})`:`[${a}](${i.url})`;t.insertAtCaret(o),D(`已上传「${a}」并插入链接`)}catch(e){D(`上传失败:${e instanceof Error?e.message:String(e)}`)}}function cb(){let e,t=!1,n=!1,r=!1,i,a=`inbox`,o,s=!1,c=`single`,l=[],u,d=e=>he(e,o),f,p=!1,m=null,h=null,_=e=>{try{window.dispatchEvent(new CustomEvent(Wy,{detail:{open:e}}))}catch{}},b=t=>{if(e===void 0)return;let n=e.root,r=e.card;if(t!==void 0){let e=t.getBoundingClientRect(),i=r.offsetWidth||340,a=r.offsetHeight||260,o=window.innerWidth,s=window.innerHeight,c=Math.min(Math.max(e.left+e.width/2-i/2,8),Math.max(8,o-i-8)),l=s-e.top+10,u=Math.min(Math.max(8,l),Math.max(8,s-a-8));n.style.right=`auto`,n.style.top=`auto`,n.style.left=`${c}px`,n.style.bottom=`${u}px`}else n.style.right=`24px`,n.style.bottom=`88px`,n.style.left=`auto`,n.style.top=`auto`},S=null,ee=()=>{e!==void 0&&(S=rb(),e.titleInput.value=S)},te=()=>{if(e===void 0)return;let t=e.editor.getValue(),n=e.titleInput.value.trim();if(t.trim().length===0&&(n.length===0||n===S)){eb();return}let r=tb(n,t,e.tagEditor.peekTags());h!==null&&r===h||$y({text:t,title:n,tags:e.tagEditor.peekTags(),savedAt:Date.now()})},ne=()=>{t||!n||e===void 0||(f!==void 0&&(clearTimeout(f),f=void 0),f=window.setTimeout(()=>{f=void 0,te()},500))},C=()=>{e!==void 0&&(e.draftBanner.hidden=!0)},re=async(e,t,n)=>{try{let r=await fetch(d(y),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({title:e,tags:n,text:t}),signal:AbortSignal.timeout(1e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0)return D(`打开失败:${i?.error??`HTTP ${r.status}`}`),!1;if(typeof i.twUrl!=`string`||typeof i.draftTitle!=`string`)return D(`打开失败:服务未返回编辑器地址`),!1;eb(),C(),h=tb(e,t,n),m=null;let a=me(c,o,i.twUrl,i.twUrlAbsolute);return It(`${pe(a.relative,a.absolute)}#${encodeURIComponent(i.draftTitle)}`,i.title??e),D(`已在弹出窗口打开「${i.title??e}」编辑器`),!0}catch(e){return D(`打开失败:${e instanceof Error?e.message:String(e)}`),!1}},ie=()=>{p=!1,e!==void 0&&(e.recentWrap.hidden=!0)},w=async t=>{try{let n=await fetch(d(`${g}?title=${encodeURIComponent(t)}`),{signal:AbortSignal.timeout(1e4)}),r=await n.json().catch(()=>null);if(!n.ok||r?.ok!==!0||typeof r.title!=`string`){D(`读取失败:${r?.notFound===!0?`不存在`:r?.error??`HTTP ${n.status}`}`);return}if(e===void 0)return;e.editor.setValue(r.text??``),e.titleInput.value=r.title,e.tagEditor.setTags(r.tags??[]),m={title:r.title,...typeof r.modified==`string`&&r.modified.length>0?{modified:r.modified}:{},...typeof r.revision==`number`?{revision:r.revision}:{}},h=tb(r.title,r.text??``,r.tags??[]),C(),ie(),D(`已载入「${r.title}」`),e.editor.focus()}catch(e){D(`读取失败:${e instanceof Error?e.message:String(e)}`)}},ae=()=>{if(e===void 0)return;if(p){ie();return}p=!0,e.recentWrap.hidden=!1,e.recentWrap.textContent=``;let t=document.createElement(`div`);t.className=`dsh-tw-note-recent-muted`,t.textContent=`加载中…`,e.recentWrap.append(t),(async()=>{try{let t=await(await fetch(d(`${x}?limit=15`),{signal:AbortSignal.timeout(1e4)})).json().catch(()=>null);if(!p||e===void 0)return;e.recentWrap.replaceChildren();let n=[];if(t?.ok===!0)for(let e of t.items??[]){if(typeof e!=`object`||!e)continue;let t=e,r=typeof t.title==`string`?t.title:``;r.length!==0&&n.push({title:r,tags:Array.isArray(t.tags)?t.tags.filter(e=>typeof e==`string`):[],modified:typeof t.modified==`string`?t.modified:null,snippet:typeof t.snippet==`string`?t.snippet:``})}if(n.length===0){let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-muted`,n.textContent=t?.ok===!0?`暂无笔记`:`加载失败:${t?.error??`未知`}`,e.recentWrap.append(n);return}for(let t of n){let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-item`,n.title=t.snippet||t.title,n.setAttribute(`role`,`button`),n.tabIndex=0,n.setAttribute(`aria-label`,`载入笔记「${t.title}」`);let r=document.createElement(`span`);r.className=`dsh-tw-note-recent-name`,r.textContent=t.title;let i=document.createElement(`span`);i.className=`dsh-tw-note-recent-meta`;let a=[ib(t.modified)];t.tags.length>0&&a.unshift(t.tags.slice(0,3).join(`,`)),i.textContent=a.join(` · `),n.append(r,i),n.addEventListener(`click`,()=>{w(t.title)}),n.addEventListener(`keydown`,e=>{(e.key===`Enter`||e.key===` `)&&(e.preventDefault(),w(t.title))}),e.recentWrap.append(n)}}catch(t){if(!p||e===void 0)return;e.recentWrap.replaceChildren();let n=document.createElement(`div`);n.className=`dsh-tw-note-recent-muted`,n.textContent=`加载失败:${t instanceof Error?t.message:String(t)}`,e.recentWrap.append(n)}})()},T=()=>{if(e!==void 0)return;let r=document.createElement(`div`);r.className=`dsh-tw-note`,r.hidden=!0;let a=document.createElement(`div`);a.className=`dsh-tw-note-card`;let p=document.createElement(`div`);p.className=`dsh-tw-note-head`;let g=document.createElement(`span`);g.className=`dsh-tw-note-label`,g.textContent=`📝 快速笔记`;let y=document.createElement(`button`);y.type=`button`,y.className=`dsh-tw-note-close`,y.title=`收起`,y.textContent=`✕`,p.append(g,y);let b=document.createElement(`div`);b.className=`dsh-tw-note-draft`,b.hidden=!0;let x=document.createElement(`span`);x.className=`dsh-tw-note-draft-text`,x.textContent=`已恢复未保存草稿`;let ee=document.createElement(`button`);ee.type=`button`,ee.className=`dsh-tw-note-draft-discard`,ee.textContent=`丢弃`,b.append(x,ee);let w=document.createElement(`div`);w.className=`dsh-tw-note-fields`;let T=document.createElement(`input`);T.className=`dsh-tw-note-title`,T.placeholder=`标题(默认时间戳)`,T.setAttribute(`aria-label`,`笔记标题(默认时间戳)`);let oe=ob({onChange:ne});w.append(T,oe.el);let se=document.createElement(`label`);se.className=`dsh-tw-note-wiki`,se.hidden=!0;let ce=document.createElement(`span`);ce.className=`dsh-tw-note-wiki-label`,ce.textContent=`写入`;let le=document.createElement(`select`);le.className=`dsh-tw-note-wiki-select`,le.setAttribute(`aria-label`,`这条笔记写进哪个知识库`),se.append(ce,le);let ue=document.createElement(`span`);ue.className=`dsh-tw-note-wiki-hint`,ue.hidden=!0,w.append(se,ue);let de=()=>{let e=l.find(e=>e.id===o),t=e!==void 0&&!e.running;ue.hidden=!t,ue.textContent=t?`${e.label} 当前没在运行:先在右下角「知识库」菜单里打开它`:``};le.addEventListener(`change`,()=>{s=!0,o=le.value.length>0?le.value:void 0,de()}),ve().then(e=>{if(t)return;if(c=typeof e?.mode==`string`?e.mode:`single`,l=(Array.isArray(e?.wikis)?e.wikis:[]).map(e=>({id:e.id,label:e.label,running:e.running})),l.length<=1){se.hidden=!0,se.style.display=`none`,le.disabled=!0;return}se.style.display=``,le.disabled=!1;let n=typeof e?.defaultId==`string`?e.defaultId:void 0,r=()=>{s||(o=Ne(l,n))};r(),le.replaceChildren(...l.map(e=>{let t=document.createElement(`option`);return t.value=e.id,t.textContent=e.running?e.label:`${e.label}(未运行)`,t}));let i=document.createElement(`option`);i.value=``,i.textContent=`默认库`,le.append(i),le.value=o??``,se.hidden=!1,de(),u=Me(()=>{r(),le.value=o??``,de()})}),T.addEventListener(`input`,ne);let fe,E=Uy({placeholder:`写点东西… Markdown 高亮,可 📎/拖入文件
822
+ Ctrl+Enter 保存`,onSave:()=>{fe?.()},onChange:ne}),pe=document.createElement(`button`);pe.type=`button`,pe.className=`dsh-tw-note-upload`,pe.title=`上传文件到 wiki 并插入 Markdown 链接(也可直接拖入编辑器)`,pe.textContent=`📎 上传`;let me=document.createElement(`input`);me.type=`file`,me.multiple=!0,me.hidden=!0,pe.addEventListener(`click`,()=>{me.click()}),me.addEventListener(`change`,()=>{for(let e of Array.from(me.files??[]))sb(e,E,d);me.value=``});let he=0;E.el.addEventListener(`dragenter`,e=>{e.preventDefault(),he++,E.el.classList.add(`dsh-tw-note-drop`)}),E.el.addEventListener(`dragover`,e=>{e.preventDefault()}),E.el.addEventListener(`dragleave`,e=>{e.preventDefault(),he=Math.max(0,he-1),he===0&&E.el.classList.remove(`dsh-tw-note-drop`)}),E.el.addEventListener(`drop`,e=>{e.preventDefault(),he=0,E.el.classList.remove(`dsh-tw-note-drop`);let t=e.dataTransfer?.files;if(!(t===void 0||t.length===0))for(let e of Array.from(t))sb(e,E,d)});let ge=document.createElement(`div`);ge.className=`dsh-tw-note-foot`;let _e=document.createElement(`div`);_e.className=`dsh-tw-note-foot-left`;let ye=document.createElement(`span`);ye.className=`dsh-tw-note-hint`,ye.textContent=`Ctrl+Enter`;let be=document.createElement(`button`);be.type=`button`,be.className=`dsh-tw-note-recent-btn`,be.title=`最近修改的笔记,点击载入继续编辑`,be.textContent=`🕘 最近`,be.addEventListener(`click`,ae),_e.append(pe,be,ye);let xe=document.createElement(`div`);xe.className=`dsh-tw-note-foot-right`;let Se=document.createElement(`button`);Se.type=`button`,Se.className=`dsh-tw-note-edit`,Se.title=`保存并在 TiddlyWiki 原生编辑器中打开`,Se.textContent=`✏️ 在 TW 中编辑`;let Ce=document.createElement(`button`);Ce.type=`button`,Ce.className=`dsh-tw-note-save`,Ce.textContent=`保存`,xe.append(Se,Ce),ge.append(_e,xe);let we=document.createElement(`div`);we.className=`dsh-tw-note-recent`,we.hidden=!0,a.append(p,b,w,E.el,ge),r.append(a,we),document.body.append(r),e={root:r,card:a,editor:E,titleInput:T,tagEditor:oe,saveBtn:Ce,editBtn:Se,draftBanner:b,bannerText:x,recentWrap:we};let Te=()=>{n=!1,r.hidden=!0,ie(),_(!1)},Ee=()=>{f!==void 0&&(clearTimeout(f),f=void 0),E.setValue(``),T.value=rb(),S=T.value,oe.setTags([]),h=tb(T.value.trim(),``,[])},De=()=>{eb(),C(),h=tb(T.value.trim(),E.getValue(),oe.getTags()),m=null,Ee(),Te()},Oe=!1;fe=async()=>{if(Oe)return;let e=E.getValue().trim();if(e.length===0){D(`内容为空,未保存`);return}Oe=!0,Ce.disabled=!0,Ce.textContent=`保存中…`;try{let t=T.value.trim(),n={title:t,tags:oe.getTags(),text:e};m!==null&&m.title===t&&(m.modified!==void 0&&(n.expectedModified=m.modified),m.revision!==void 0&&(n.expectedRevision=m.revision));let r=await fetch(d(v),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(n),signal:AbortSignal.timeout(1e4)}),i=await r.json().catch(()=>null);if(!r.ok||i?.ok!==!0){if(r.status===409||i?.conflict===!0){D(`保存被拒绝:这篇笔记在你读取之后被改动过。请用「🕘 最近」重新载入后再保存。`);return}D(`保存失败:${i?.error??`HTTP ${r.status}`}`);return}De(),D(`已保存「${i.title??T.value}」`)}catch(e){D(`保存失败:${e instanceof Error?e.message:String(e)}`)}finally{Oe=!1,Ce.disabled=!1,Ce.textContent=`保存`}},Ce.addEventListener(`click`,()=>{fe?.()});let ke=async()=>{let e=T.value.trim().length>0?T.value.trim():rb(),t=E.getValue(),n=oe.getTags();Se.disabled=!0,Se.textContent=`打开中…`;try{await re(e,t,n)}finally{Se.disabled=!1,Se.textContent=`✏️ 在 TW 中编辑`}};Se.addEventListener(`click`,()=>{ke()}),y.addEventListener(`click`,Te);let Ae=null,je=(e,t)=>{let n=window.innerWidth,i=window.innerHeight,o=a.offsetWidth||340,s=a.offsetHeight||260,c=Math.min(Math.max(e,8),Math.max(8,n-o-8)),l=Math.min(Math.max(t,8),Math.max(8,i-s-8));r.style.right=`auto`,r.style.bottom=`auto`,r.style.left=`${c}px`,r.style.top=`${l}px`};p.addEventListener(`pointerdown`,e=>{if(y.contains(e.target))return;e.preventDefault();let t=r.getBoundingClientRect();Ae={startX:e.clientX,startY:e.clientY,origLeft:t.left,origTop:t.top,moved:!1};try{p.setPointerCapture(e.pointerId)}catch{}p.classList.add(`dsh-tw-note-head-dragging`)}),p.addEventListener(`pointermove`,e=>{if(Ae===null)return;let t=e.clientX-Ae.startX,n=e.clientY-Ae.startY;!Ae.moved&&Math.abs(t)<4&&Math.abs(n)<4||(Ae.moved=!0,je(Ae.origLeft+t,Ae.origTop+n))});let Pe=e=>{if(Ae!==null){try{p.releasePointerCapture(e.pointerId)}catch{}Ae=null,p.classList.remove(`dsh-tw-note-head-dragging`)}};p.addEventListener(`pointerup`,Pe),p.addEventListener(`pointercancel`,Pe),ee.addEventListener(`click`,()=>{eb(),C(),Ee(),D(`已丢弃草稿`)}),i=()=>{te()},window.addEventListener(`pagehide`,i)};return{async open(r){if(t||(T(),e===void 0||n))return;n=!0,e.root.hidden=!1,b(r),_(!0);let i=Zy(),o=i?.draft??null;if(o!==null&&(o.text.trim().length>0||o.title.trim().length>0))e.editor.setValue(o.text),e.titleInput.value=o.title,e.tagEditor.setTags(o.tags),e.bannerText.textContent=i?.foreign===!0?`已恢复未保存草稿(来自其它窗口)`:`已恢复未保存草稿`,e.draftBanner.hidden=!1,i?.foreign===!0&&(D(`已恢复其它窗口的未保存草稿`),Qy(o));else{if(ee(),a=await ab(),t||e===void 0)return;e.tagEditor.setDefault(a)}e!==void 0&&e.editor.focus()},close(){e!==void 0&&(n=!1,e.root.hidden=!0,ie(),_(!1))},async openNative(){if(!(t||r)&&!(Lt()&&!Rt())){r=!0;try{let e=Zy(),n=e!==null&&(e.draft.text.trim().length>0||e.draft.title.trim().length>0),r=n&&e.draft.title.trim().length>0?e.draft.title.trim():rb(),i=n?e.draft.text:``,o=[];if(n)o=e.draft.tags;else{if(a=await ab(),t)return;o=[a]}e!==null&&e.foreign&&(e.draft.text.trim().length>0||e.draft.title.trim().length>0)&&(D(`已恢复其它窗口的未保存草稿`),Qy(e.draft)),await re(r,i,o)}finally{r=!1}}},isOpen(){return n},dispose(){t=!0,u?.(),u=void 0,i!==void 0&&(window.removeEventListener(`pagehide`,i),i=void 0),f!==void 0&&(clearTimeout(f),f=void 0),te(),e?.tagEditor.dispose(),e?.editor.view.destroy(),e?.root.remove(),e=void 0}}}function lb(e){return e<10?`0${e}`:String(e)}function ub(e){return`${lb(e.getHours())}:${lb(e.getMinutes())}`}function db(e,t){let n=e?.git,r=[`同步知识库`],i=`offline`;if(n==null||n.exists!==!0)r.push(`git 仓库不可用`);else{r.push(`分支 ${n.branch??`?`}`),typeof n.lastCommit==`string`&&r.push(n.lastCommit);let e=typeof n.behind==`number`?n.behind:0,t=typeof n.ahead==`number`?n.ahead:0;t>0&&r.push(`领先 ${t}`),e>0&&r.push(`落后 ${e}`),n.dirty===!0?(i=`dirty`,r.push(`有 ${n.dirtyFiles?.length??0} 个未提交改动`)):i=e>0?`behind`:`clean`}return t!==void 0&&r.push(`上次同步 ${ub(t)}`),{state:i,tooltip:r.join(` · `)}}function fb(){let e={state:`offline`,tooltip:`同步知识库`},t,n,r=!1,i=!1,a=new Set,o=()=>{for(let e of[...a])e()},s=n=>{if(r)return;let i=db(n,t);(i.state!==e.state||i.tooltip!==e.tooltip)&&(e=i,o())},c=async()=>{if(i)return;let e=await ve();i||s(e)};return c(),n=window.setInterval(()=>{c()},3e4),{getState:()=>e,trigger:async()=>{if(i)return e;if(r)return D(`同步进行中…`),e;r=!0,e={...e,state:`syncing`},o();try{let e=await fetch(te,{method:`POST`,signal:AbortSignal.timeout(12e4)}),n=ge(await e.json().catch(()=>null),e.status);n.ok?(t=new Date,D(`同步完成:${n.message}`)):D(`同步失败:${n.message}`)}catch(e){D(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{r=!1,await c()}return e},subscribe(e){return a.add(e),()=>{a.delete(e)}},dispose(){i=!0,n!==void 0&&(clearInterval(n),n=void 0),a.clear()}}}async function pb(){let e=await ve(),t=Array.isArray(e?.wikis)?e.wikis.map(e=>({id:e.id,label:e.label,running:e.running,path:e.path})):[];return{mode:typeof e?.mode==`string`?e.mode:`single`,...typeof e?.defaultId==`string`?{defaultId:e.defaultId}:{},wikis:t}}async function mb(){let e=await Te();return{showQuickNote:e.showQuickNote,showPanelStatus:e.showPanelStatus,showSyncButton:e.showSyncButton}}async function hb(){let e=await ve();if(e===null)return{state:`failed`,text:`状态不可达`,logs:[]};let t=Array.isArray(e.logs)?e.logs.filter(e=>typeof e==`string`):[];return e.status===`running`?{state:`running`,text:`TW 在线 · ${e.url??``}`,logs:t}:e.status===`starting`?{state:`starting`,text:`TW 启动中…`,logs:t}:{state:`failed`,text:e.error??`TW 状态:${e.status??`?`}`,logs:t}}function gb(e,t,n){let r=!1,i,a,o,s,c,l,u,d,f=!1,m={state:`unknown`,text:`TiddlyWiki 服务…`,logs:[]},h=()=>{f=!1,s!==void 0&&(s.hidden=!0),u!==void 0&&(u.hidden=!0)},g=e=>{if(!f)return;let t=e.target;i!==void 0&&i.contains(t)||h()},_=()=>{if(u===void 0)return;let e=[`TiddlyWiki 服务:${m.text}`];e.push(`知识库同步:${n.getState().tooltip}`),m.logs.length>0&&(e.push(`最近日志:`),e.push(...m.logs.slice(-3))),u.textContent=e.join(`
823
+ `)},v=()=>{let e=n.getState();o!==void 0&&(o.dataset.state=e.state),a!==void 0&&(a.title=`知识库 · ${e.tooltip}`),_()},y=async()=>{m=await hb(),!r&&(c!==void 0&&(c.textContent=m.text),l!==void 0&&(l.dataset.state=m.state),_())},b=(m,b)=>{if(r)return;if(i=document.createElement(`div`),i.className=`dsh-tw-fab-wrap`,s=document.createElement(`div`),s.className=`dsh-tw-fab-menu`,s.hidden=!0,m.showPanelStatus){let e=document.createElement(`div`);e.className=`dsh-tw-fab-status dsh-tw-fab-status-tiprow`,l=document.createElement(`span`),l.className=`dsh-tw-fab-status-dot`,l.dataset.state=`unknown`,c=document.createElement(`span`),c.className=`dsh-tw-fab-status-text`,c.textContent=`TiddlyWiki 服务…`,e.append(l,c),u=document.createElement(`div`),u.className=`dsh-tw-fab-tip`,u.hidden=!0,e.append(u),e.addEventListener(`mouseenter`,()=>{_(),u!==void 0&&(u.hidden=!1)}),e.addEventListener(`mouseleave`,()=>{u!==void 0&&(u.hidden=!0)}),s.append(e)}if(m.showQuickNote){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`📝 快速笔记`,e.title=`ui.quickNoteMode=native 时直接打开 TW 原生编辑器;card 时打开 Markdown 卡片`,e.addEventListener(`click`,()=>{h(),Te().then(e=>{e.quickNoteMode===`native`?t.openNative():t.open()})}),s.append(e)}if(m.showPanelStatus){if(b.wikis.length>1){let t=Ne(b.wikis,b.defaultId),n=document.createElement(`div`);n.className=`dsh-tw-fab-group`,n.textContent=`知识库`,s.append(n);for(let n of b.wikis){let r=document.createElement(`button`);r.type=`button`,r.className=`dsh-tw-fab-item`,r.dataset.current=n.id===t?`1`:`0`,r.textContent=`${n.id===t?`●`:`○`} ${n.label}`,r.title=`${n.path}${n.running?``:`(未运行,打开会启动)`}`,r.addEventListener(`click`,()=>{h(),je(n.id),n.running||fetch(`${p}/admin/wikis`,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({action:`start`,id:n.id}),signal:AbortSignal.timeout(12e4)}).catch(()=>void 0),e.openPanel()}),s.append(r)}}d=document.createElement(`span`),d.textContent=`打开 TW 面板`;let t=document.createElement(`button`);t.type=`button`,t.className=`dsh-tw-fab-item`,t.append(document.createTextNode(`🖥 `),d),t.addEventListener(`click`,()=>{h(),e.toggle()}),s.append(t);let n=document.createElement(`button`);n.type=`button`,n.className=`dsh-tw-fab-item`,n.textContent=`🔄 重载 TW 面板`,n.addEventListener(`click`,()=>{h(),document.dispatchEvent(new CustomEvent(ot)),y()}),s.append(n)}if(m.showSyncButton){let e=document.createElement(`button`);e.type=`button`,e.className=`dsh-tw-fab-item`,e.textContent=`🔁 同步`,e.addEventListener(`click`,()=>{h(),n.trigger()}),s.append(e)}a=document.createElement(`button`),a.type=`button`,a.className=`dsh-tw-fab`,a.setAttribute(`aria-label`,`TiddlyWiki 知识库`);let x=document.createElement(`span`);x.className=`dsh-tw-fab-icon`,x.innerHTML=`<svg viewBox="0 0 16 16" width="17" height="17" fill="none" stroke="currentColor" stroke-width="1.3" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M4 2.5h8a1 1 0 0 1 1 1v9a1 1 0 0 1-1 1H4a1 1 0 0 1-1-1v-9a1 1 0 0 1 1-1z"/><path d="M6 6h4M6 8.5h2.5"/></svg>`,o=document.createElement(`span`),o.className=`dsh-tw-fab-dot`,o.dataset.state=n.getState().state,a.append(x,o),a.addEventListener(`click`,()=>{if(s!==void 0){if(f){h();return}f=!0,s.hidden=!1,v(),y()}}),i.append(s,a),document.body.append(i),v(),document.addEventListener(`click`,g,!0)},x=e.subscribe(()=>{d!==void 0&&(d.textContent=e.isOpen()?`收起 TW 面板`:`打开 TW 面板`)}),S=n.subscribe(v);return(async()=>{let[e,t]=await Promise.all([mb(),pb()]);r||!e.showQuickNote&&!e.showPanelStatus&&!e.showSyncButton||b(e,t)})(),()=>{r=!0,document.removeEventListener(`click`,g,!0),x(),S(),i?.remove()}}function _b(e){let t=()=>{let t=null,n=null,r=e;for(;r!==null&&r!==document.documentElement&&(r=r.parentElement,r!==null);){for(let e of r.querySelectorAll(`textarea, [contenteditable]:not([contenteditable="false"]), [role="textbox"]`))if(e.getBoundingClientRect().width>300){t=e,n=r;break}if(n!==null)break}if(t===null||n===null)return null;let i=n.getBoundingClientRect().width,a=t,o=null,s=0;for(;a!==null&&a!==n;){let e=a.getBoundingClientRect().width;e>0&&e<i-8&&e>=s&&(s=e,o=a),a=a.parentElement}return o},n=()=>{let n=e.getBoundingClientRect(),r=t(),i=r===null?n.right:r.getBoundingClientRect().right,a=Math.max(0,n.right-i);return e.style.paddingRight!==`${a}px`&&(e.style.paddingRight=`${a}px`),r!==null};n();let r=new ResizeObserver(()=>{n()}),i=e;for(;i!==null&&i!==document.documentElement&&(r.observe(i),!(i instanceof HTMLElement&&i.hasAttribute(`data-phase`)));)i=i.parentElement;window.addEventListener(`resize`,n),document.addEventListener(`visibilitychange`,n);let a=0,o=0,s=window.setInterval(()=>{if(o++,!n()){o>=20&&window.clearInterval(s);return}a++,a>=3&&window.clearInterval(s)},1500),c=window.setTimeout(n,120),l=window.setTimeout(n,600);return()=>{r.disconnect(),window.removeEventListener(`resize`,n),document.removeEventListener(`visibilitychange`,n),window.clearInterval(s),window.clearTimeout(c),window.clearTimeout(l)}}function vb(e){return function(){let[t,n]=c.useState(!1),[r,i]=c.useState(null),a=c.useRef(null),o=c.useRef(null);c.useEffect(()=>{let e=!0,t=e=>{let t=e.detail;n(t?.open===!0)};return window.addEventListener(Wy,t),Te().then(t=>{e&&i(t.quickNoteMode)}),()=>{e=!1,window.removeEventListener(Wy,t)}},[]),c.useLayoutEffect(()=>{let e=a.current;if(e!==null)return _b(e)},[]);let s=r===`native`,l=s?`快速笔记`:t?`快速笔记(已打开)`:`快速笔记`,u=s?`快速笔记:直接打开 TiddlyWiki 原生编辑器(再次点击可收起弹窗)`:t?`快速笔记已打开(点此按钮或卡片右上角 ✕ 收起)`:`打开快速笔记(在按钮上方弹出,可拖动标题栏移动)`;return c.createElement(`div`,{ref:a,className:`dsh-tw-dock-note`},c.createElement(`button`,{ref:o,type:`button`,className:t?`dsh-tw-dock-note-btn dsh-tw-dock-note-btn-active`:`dsh-tw-dock-note-btn`,title:u,onClick:()=>{Te().then(t=>{t.quickNoteMode===`native`?Lt()&&!Rt()?Bt():e.openNative():e.isOpen()?e.close():e.open(o.current??void 0)})}},c.createElement(`span`,{className:`dsh-tw-dock-note-icon`,"aria-hidden":`true`},`📝`),c.createElement(`span`,{className:`dsh-tw-dock-note-label`},l)))}}function yb(){return function(e){let t=typeof e.sessionId==`string`&&e.sessionId.length>0?e.sessionId:void 0,[n,r]=c.useState([]),[i,a]=c.useState(``),[o,s]=c.useState(void 0),[l,u]=c.useState(!1),d=c.useRef(null);if(c.useLayoutEffect(()=>{let e=d.current;if(e!==null)return _b(e)},[]),c.useEffect(()=>{if(t===void 0)return;let e=!0;return(async()=>{let[n,i]=await Promise.all([ve(),fetch(`${E}?session=${encodeURIComponent(t)}`,{signal:AbortSignal.timeout(8e3)}).then(e=>e.ok?e.json():null).catch(()=>null)]);if(!e)return;let o=(n?.wikis??[]).filter(e=>e.agentVisible);r(o.map(e=>({id:e.id,label:e.label,running:e.running}))),a(typeof i?.scope==`string`?i.scope:``),s(typeof i?.reason==`string`?i.reason:void 0)})(),()=>{e=!1}},[t]),t===void 0||n.length<=1)return null;let f=e=>{u(!0),(async()=>{try{let n=await fetch(E,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t,wiki:e.length>0?e:null}),signal:AbortSignal.timeout(12e4)}),r=await n.json().catch(()=>({}));if(!n.ok||r.ok!==!0){s(r.error??`切换失败(HTTP ${n.status})`);return}a(typeof r.scope==`string`?r.scope:e),s(typeof r.reason==`string`?r.reason:void 0)}catch(e){s(e instanceof Error?e.message:String(e))}finally{u(!1)}})()};return c.createElement(`div`,{ref:d,className:`dsh-tw-scope-dock`},c.createElement(`span`,{className:`dsh-tw-scope-label`},`知识库`),c.createElement(`select`,{className:`dsh-tw-scope-select`,value:i,disabled:l,"aria-label":`本会话使用的知识库`,title:`本会话的 tiddlywiki_* 工具与注入提示词都作用于这个知识库(下一个模型步骤生效)`,onChange:e=>{f(e.target.value)}},c.createElement(`option`,{value:``},`默认库`),...n.map(e=>c.createElement(`option`,{key:e.id,value:e.id},`${e.label}${e.running?``:`(未运行,选中会启动)`}`))),o===void 0?null:c.createElement(`span`,{className:`dsh-tw-scope-note`},o))}}async function bb(e,t=15e3){try{let n=await fetch(_,{method:`POST`,headers:{"content-type":`application/json`,"x-requested-with":`TiddlyWiki`},body:JSON.stringify({title:e}),signal:AbortSignal.timeout(t)});if(!n.ok)return null;let r=await n.text();return r.trim().length>0?r:null}catch{return null}}function xb(){return lt()}async function Sb(e){try{let t=await fetch(`${g}?title=${encodeURIComponent(e)}`,{signal:AbortSignal.timeout(8e3)});if(t.status===404)return`no`;if(!t.ok)return`unknown`;let n=await t.json().catch(()=>null);return n===null?`unknown`:n.notFound===!0?`no`:`yes`}catch{return`unknown`}}function Cb(e){let{sessionId:t,viewRequest:n,completeViewRequest:r}=e,[i,a]=c.useState(`loading`),[o,s]=c.useState(null),[l,u]=c.useState(null),[d,f]=c.useState(``),[p,m]=c.useState(!1),h=c.useRef(0),g=c.useRef(!0),_=c.useRef(0),v=c.useRef(0),y=c.useCallback(async e=>{let n=++h.current;if(!g.current)return;let r=e?.silent===!0;r||a(`loading`);let i=e=>{if(_.current++,r){m(!0);return}a(`error`),f(e)};if(typeof t!=`string`||t.length===0){a(`error`),f(`缺少会话 ID`);return}if(_.current>=3){if(r){m(!0);return}a(`error`),f(`连续 3 次生成失败,已停止自动重试,请点「🔄 刷新」`);return}try{let e=await fetch(C,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({session:t}),signal:AbortSignal.timeout(25e3)}),o=await e.json().catch(()=>null);if(!g.current||n!==h.current)return;if(!e.ok||o?.ok!==!0){i(o?.error??`HTTP ${e.status}`);return}if(typeof o.title!=`string`||o.title.length===0){i(`汇总生成失败:缺少标题`);return}u(o.title);let c=await bb(o.title);if(!g.current||n!==h.current)return;if(c===null){let e=await Sb(o.title);if(!g.current||n!==h.current)return;if(e===`no`){if(_.current++,_.current<3){y();return}a(`error`),f(`汇总条目不存在,自动重建失败,请重试`);return}if(e===`unknown`){if(r){m(!0);return}a(`error`),f(`渲染失败:wiki 渲染服务不可用(host /render),条目状态未知`);return}i(`渲染失败:wiki 渲染服务不可用(host /render)`);return}_.current=0,v.current=Date.now(),m(!1),s(c),a(`ready`)}catch(e){if(!g.current||n!==h.current)return;i(e instanceof Error?e.message:String(e))}},[t]);c.useEffect(()=>(g.current=!0,_.current=0,v.current=Date.now(),m(!1),y(),()=>{g.current=!1}),[y]),c.useEffect(()=>{if(l===null)return;let e=!0,t=window.setInterval(()=>{(async()=>{if(!e||typeof document<`u`&&document.hidden)return;let t=await Sb(l);if(e){if(t===`unknown`){m(!0);return}if(t===`no`){if(_.current++,_.current<3){y();return}a(`error`),f(`汇总条目已失效且自动重建多次失败,请点「🔄 刷新」重试`);return}if(Date.now()-v.current>18e4){y({silent:!0});return}_.current=0,m(!1)}})()},3e4);return()=>{e=!1,window.clearInterval(t)}},[l,y]),c.useEffect(()=>{n!=null&&r?.()},[n,r]);let b=()=>{_.current=0,y()},x;return x=i===`loading`?c.createElement(`div`,{className:`dsh-tw-summary-state`},c.createElement(`div`,{className:`dsh-tw-summary-state-spin`},`⏳`),c.createElement(`div`,null,`正在生成会话 wiki 汇总…`)):i===`error`?c.createElement(`div`,{className:`dsh-tw-summary-state`},c.createElement(`div`,{className:`dsh-tw-summary-state-title`},`知识库汇总暂不可用`),c.createElement(`div`,{className:`dsh-tw-summary-state-detail`},d),c.createElement(`button`,{type:`button`,className:`dsh-tw-summary-btn`,onClick:b},`重试`)):c.createElement(`div`,{className:`dsh-tw-summary-native dsh-tw-toolcard-native`},p?c.createElement(`div`,{className:`dsh-tw-summary-state-detail`},`⚠️ 未能确认最新状态(wiki 查询或刷新失败),以下是上次生成的内容`):null,c.createElement(`div`,{dangerouslySetInnerHTML:{__html:o??``}})),c.createElement(`div`,{className:`dsh-tw-summary`,"data-dsh-tw-summary":`true`},c.createElement(`div`,{className:`dsh-tw-summary-bar`},c.createElement(`span`,{className:`dsh-tw-summary-bar-title`},`📚 本会话知识库`),c.createElement(`span`,{className:`dsh-tw-summary-bar-hint`},`产生 / 读取 / 检索过的笔记(含子代理)`),c.createElement(`span`,{className:`dsh-tw-summary-bar-spacer`}),c.createElement(`button`,{type:`button`,className:`dsh-tw-summary-btn`,onClick:b,disabled:i===`loading`,title:`重新生成并刷新汇总`},`🔄 刷新`)),x)}function wb(e,t){if(!(e===void 0||t.showSessionTab===!1))return ct(t.tabLabel),e.inject(`conversation.view`,()=>e.register({name:`conversation.view`,id:`dsh-tiddlywiki-summary`,order:20,label:xb},Cb))}function $(e,t,n){let r=document.createElement(e);return t!==void 0&&(r.className=t),n!==void 0&&(r.textContent=n),r}function Tb(e){let t=$(`div`,`dsh-tw-settings-banner`);return t.dataset.tone=`error`,t.setAttribute(`style`,`border:1px solid #c0392b;background:#fdecea;color:#8c1c13;border-radius:6px;padding:10px 12px;margin:0 0 12px;font-size:12px;line-height:1.6;white-space:pre-wrap;`),t.textContent=e,t}async function Eb(e,t){let n=await fetch(e,{...t,signal:t?.signal??AbortSignal.timeout(15e3)}),r=await n.json().catch(()=>({}));if(!n.ok){let e=r.error??`HTTP ${n.status}`;throw Error(e)}return r}function Db(e){let t=!1;e.classList.add(`dsh-tw-settings`);let n=$(`div`,`dsh-tw-settings-error`);n.hidden=!0;let r=$(`div`,`dsh-tw-settings-row dsh-tw-settings-status`),i=$(`div`,`dsh-tw-settings-body`);e.append(n,r,i);let a=[],o={},s={},c=!1,l=async()=>{c||i.replaceChildren($(`div`,`dsh-tw-settings-muted`,`加载中…`));try{let e=await Eb(Nb(re));if(t)return;c=!0,n.hidden=!0,n.replaceChildren(),Ob(r,e,l),Lb(i,e,l,()=>t,o,s)}catch(e){if(t)return;c||i.replaceChildren($(`div`,`dsh-tw-settings-muted`,`配置尚未加载。`));let r=$(`button`,`dsh-tw-settings-btn`,`重试`);r.type=`button`,r.addEventListener(`click`,()=>{l()}),n.replaceChildren($(`span`,void 0,`加载配置失败:${e instanceof Error?e.message:String(e)} `),r),n.hidden=!1}};return l(),a.push(()=>{t=!0,e.replaceChildren(),e.classList.remove(`dsh-tw-settings`)}),()=>{for(let e of a.splice(0))e()}}function Ob(e,t,n){e.replaceChildren();let r=t.server??{},i=r.status??`unknown`,a=$(`span`,`dsh-tw-settings-chip`,i);a.dataset.state=i;let o=$(`span`,`dsh-tw-settings-muted`,[r.url===void 0?``:`TW ${r.url}`,t.git?.branch===void 0?``:`git ${t.git.branch}`,t.git?.lastCommit===void 0?``:t.git.lastCommit,t.git?.conflict===void 0?t.git?.dirty===!0?`有未提交改动`:``:`⚠️ 冲突未解决(${t.git.conflict.files.length} 个文件,已阻止提交)`].filter(Boolean).join(` · `)),s=$(`button`,`dsh-tw-settings-btn`,`同步`);s.type=`button`,s.title=`git 同步(pull → commit → push)`,s.addEventListener(`click`,()=>{s.disabled=!0,s.textContent=`同步中…`,(async()=>{try{let e=await fetch(te,{method:`POST`,signal:AbortSignal.timeout(12e4)}),t=ge(await e.json().catch(()=>null),e.status);D(t.ok?`同步完成:${t.message}`:`同步失败:${t.message}`)}catch(e){D(`同步失败:${e instanceof Error?e.message:String(e)}`)}finally{s.disabled=!1,s.textContent=`同步`,n()}})()});let c=$(`button`,`dsh-tw-settings-btn`,`重启 TW`);c.type=`button`,c.addEventListener(`click`,()=>{c.disabled=!0,c.textContent=`重启中…`,(async()=>{try{await Eb(T,{method:`POST`,signal:AbortSignal.timeout(12e4)}),D(`TW 已重启`)}catch(e){D(`重启失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`重启 TW`,n()}})()}),e.append(a,o,s,c)}function kb(e,t,n,r){let i=$(`section`,`dsh-tw-settings-section`);i.append($(`h3`,`dsh-tw-settings-h`,`常规配置`));let a=t.note??{},o=t.git??{},s=t.ui??{},c=[],l=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-input`);r.autocomplete=`off`,r.value=n;let a=$(`label`,`dsh-tw-settings-field`);a.append($(`span`,`dsh-tw-settings-label`,t),r),c.push({key:e,initial:n,read:()=>r.value.trim(),changed:()=>r.value.trim()!==n}),i.append(a)},u=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-input`);r.type=`password`,r.value=n,r.autocomplete=`off`;let a=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`👁`);a.type=`button`,a.title=`显示 / 隐藏`,a.setAttribute(`aria-label`,`显示 / 隐藏`),a.addEventListener(`click`,e=>{e.preventDefault();let t=r.type===`password`;r.type=t?`text`:`password`,a.textContent=t?`🙈`:`👁`});let o=$(`label`,`dsh-tw-settings-field`);o.append($(`span`,`dsh-tw-settings-label`,t),r,a),c.push({key:e,initial:n,read:()=>r.value.trim(),changed:()=>r.value.trim()!==n}),i.append(o)},d=(e,t,n)=>{let r=$(`input`,`dsh-tw-settings-check`);r.type=`checkbox`,r.checked=n;let a=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-check`);return a.append(r,$(`span`,`dsh-tw-settings-label`,t)),c.push({key:e,initial:n,read:()=>r.checked,changed:()=>r.checked!==n}),i.append(a),r},f=(e,t,n,r)=>{let a=$(`input`,`dsh-tw-settings-input`);a.type=`number`,a.value=String(n),r?.min!==void 0&&(a.min=String(r.min)),r?.max!==void 0&&(a.max=String(r.max)),r?.step!==void 0&&(a.step=String(r.step));let o=$(`div`,`dsh-tw-settings-error`);o.hidden=!0;let s=()=>{let e=a.value.trim();if(e.length===0)return`不能为空`;let t=Number(e);if(!Number.isFinite(t))return`请输入数字`;if(r?.integer===!0&&!Number.isInteger(t))return`必须是整数`;if(r?.min!==void 0&&t<r.min)return`不能小于 ${r.min}`;if(r?.max!==void 0&&t>r.max)return`不能大于 ${r.max}`},l=()=>{let e=s();o.textContent=e===void 0?``:`⚠️ ${e}(保存会被拒绝)`,o.hidden=e===void 0,e===void 0?a.removeAttribute(`aria-invalid`):a.setAttribute(`aria-invalid`,`true`)};a.addEventListener(`input`,l);let u=()=>{let e=a.value.trim(),t=Number(e);return e.length===0||!Number.isFinite(t)?e:t},d=$(`label`,`dsh-tw-settings-field`);d.append($(`span`,`dsh-tw-settings-label`,t),a,o),c.push({key:e,initial:n,read:u,changed:()=>u()!==n,invalid:s}),l(),i.append(d)},p=(e,t,n,r)=>{let a=$(`select`,`dsh-tw-settings-input`);for(let e of r){let t=document.createElement(`option`);t.value=e.value,t.textContent=e.label,e.value===n&&(t.selected=!0),a.append(t)}let o=$(`label`,`dsh-tw-settings-field`);return o.append($(`span`,`dsh-tw-settings-label`,t),a),c.push({key:e,initial:n,read:()=>a.value,changed:()=>a.value!==n}),i.append(o),a},m=(e,t,n,r)=>{let a=$(`textarea`,`dsh-tw-settings-input dsh-tw-settings-area`);a.rows=r,a.value=n;let o=$(`label`,`dsh-tw-settings-field dsh-tw-settings-field-area`);return o.append($(`span`,`dsh-tw-settings-label`,t),a),c.push({key:e,initial:n,read:()=>a.value.trim(),changed:()=>a.value.trim()!==n}),i.append(o),a};l(`note.tag`,`快速笔记默认 tag`,typeof a.tag==`string`?a.tag:`inbox`),d(`note.workspaceMark`,`新建笔记自动标工作区(ws/<项目名> 标签 + workspace 字段,取自当前会话工作目录)`,a.workspaceMark!==!1),d(`git.autoCommit`,`自动 commit(防抖)`,o.autoCommit!==!1),f(`git.debounceMs`,`自动 commit 防抖(ms;范围 0–3600000)`,typeof o.debounceMs==`number`?o.debounceMs:6e4,{min:0,max:36e5,step:1e3,integer:!0}),l(`git.remote`,`git 远端(空=仅本地;保存后即时生效,但**清空不会删除已配置的 origin**,需要时请用 git 命令处理)`,typeof o.remote==`string`?o.remote:``),l(`git.branch`,`git 分支(**只在仓库首次初始化时生效**;已有仓库请用 git 命令改分支——上面的状态行显示的是真实分支)`,typeof o.branch==`string`?o.branch:`main`);let h=t.startup??{};f(`startup.readyTimeoutMs`,`TW 启动就绪等待(ms;默认 60000,范围 5000–600000,超时上限为其 3 倍,对下次启动/重启生效)`,typeof h.readyTimeoutMs==`number`&&h.readyTimeoutMs>0?h.readyTimeoutMs:6e4,{min:5e3,max:6e5,step:1e3}),d(`ui.showQuickNote`,`显示「知识库」按钮里的「快速笔记」入口`,s.showQuickNote!==!1),d(`ui.showQuickNoteDock`,`显示聊天输入框上方的「快速笔记」快捷按钮`,s.showQuickNoteDock!==!1),p(`ui.quickNoteMode`,`点击「快速笔记」的打开方式`,typeof s.quickNoteMode==`string`&&s.quickNoteMode===`card`?`card`:`native`,[{value:`native`,label:`原生编辑器:直接弹出 TW 原生编辑页(新建/恢复草稿)`},{value:`card`,label:`Markdown 卡片:弹出现有快速笔记卡片(CodeMirror 编辑器)`}]),l(`ui.sidebarLabel`,`侧边栏 TW 入口显示名称`,typeof s.sidebarLabel==`string`&&s.sidebarLabel.trim().length>0?s.sidebarLabel.trim():`TiddlyWiki`),d(`ui.showPanelStatus`,`显示「知识库」按钮里的 TW 面板/重载入口与状态行`,s.showPanelStatus!==!1),d(`ui.showSyncButton`,`显示「知识库」按钮里的「同步」入口与 git 状态点`,s.showSyncButton!==!1),d(`ui.followDshTheme`,`嵌入式 TW 跟随 DSH 深浅主题(暗色时自动切深色 palette,不写回 wiki)`,s.followDshTheme!==!1),l(`ui.darkPalette`,`暗色时 TW palette(tiddler 标题)`,typeof s.darkPalette==`string`&&s.darkPalette.trim().length>0?s.darkPalette.trim():`$:/palettes/CupertinoDark`),l(`ui.tabLabel`,`会话顶部「知识库」Tab 名称`,typeof s.tabLabel==`string`&&s.tabLabel.trim().length>0?s.tabLabel.trim():`知识库`),d(`ui.showSessionTab`,`显示会话顶部「知识库」Tab(本会话相关 wiki 笔记汇总)`,s.showSessionTab!==!1),d(`ui.showRightbarTab`,`在 DSH 右侧边栏提供 TiddlyWiki 入口/Tab(与聊天并排)`,s.showRightbarTab!==!1);let g=s.sendToAgent??{};d(`ui.sendToAgent.enabled`,`启用「发送给 Agent」(TW 笔记 → DSH 会话注入)`,g.enabled!==!1),l(`ui.sendToAgent.endpoint`,`TW 端请求基址(空=自动取当前 DSH origin)`,typeof g.endpoint==`string`?g.endpoint:``),u(`ui.sendToAgent.token`,`共享 token(非空时路由校验 x-send-to-agent-token 头;已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof g.token==`string`?g.token:``);let _=s.allArticles??{};f(`ui.allArticles.pageSize`,`「所有文章」每页条数(1–200)`,typeof _.pageSize==`number`?_.pageSize:10,{min:1,max:200,step:1,integer:!0}),i.append($(`h3`,`dsh-tw-settings-h`,`可选功能:微信公众号发布`)),i.append($(`div`,`dsh-tw-settings-muted`,`把 wiki 笔记一键发到公众号草稿箱(可选点发表)。**需要额外安装**:opencli 与 Browser Bridge 浏览器扩展,并让浏览器登录 mp.weixin.qq.com;adapter 在本仓库 tools/wechat/,安装与排错见 docs/wechat-publish-setup.md。不安装/不开启它,插件其他功能完全不受影响。开启后:注入提示词会多一条「发布前先读发布元数据规范」的约定,并在启动时把「发布元数据规范」与「微信公众号发布指南」(安装/换机还原步骤,等于仓库 docs/wechat-publish-setup.md)两篇文档写进 wiki(同名不覆盖)。`));let v=t.wechat??{},y=d(`wechat.enabled`,`启用微信公众号发布(默认关;需先按 docs/wechat-publish-setup.md 安装 opencli + 浏览器扩展)`,v.enabled===!0);l(`wechat.command`,`opencli 命令(默认 opencli;用别名或绝对路径时填这里。仅在启用微信发布时生效)`,typeof v.command==`string`&&v.command.trim().length>0?v.command.trim():`opencli`),p(`wechat.adapter`,`发布适配器(仅在启用微信发布时生效)`,v.adapter===`publish-note-imgs`?`publish-note-imgs`:`publish-note`,[{value:`publish-note`,label:`publish-note(默认):图文排版,封面单图`},{value:`publish-note-imgs`,label:`publish-note-imgs:正文内嵌图全部上传 CDN(需先重跑 install-wechat-adapters.mjs)`}]),u(`wechat.token`,`发布 token(非空时 /wechat/* 校验 x-wechat-publish-token 头,强烈建议设置,否则任何能打开本页的人都能替你发文;已设置时显示为 ********,原样保存=不改,清空=删除。仅在启用微信发布时生效)`,typeof v.token==`string`?v.token:``),l(`wechat.dsn`,`渲染基址 dsn(adapter 回连 DSH 用,形如 http://127.0.0.1:<端口>/dsh-tiddlywiki;留空=按请求自动推导。仅在启用微信发布时生效)`,typeof v.dsn==`string`?v.dsn:``);let b=t.prompt??{};i.append($(`h3`,`dsh-tw-settings-h`,`系统提示词(注入每个会话)`)),i.append($(`div`,`dsh-tw-settings-muted`,`插件把自己的约定(同步纪律 / 标签约定 / 链接格式等)注入每个会话的系统提示词。保存后**无需重启 dsh web**:section 会即时重新注册,当前会话从下一步起就使用新文本。`));let x=d(`prompt.enabled`,`注入 TiddlyWiki 提示词(关闭后本插件不再注入任何文本)`,b.enabled!==!1),S=p(`prompt.mode`,`内置文本形态`,b.mode===`full`?`full`:`slim`,[{value:`slim`,label:`精简(默认):只保留工具 schema 表达不了的约定`},{value:`full`,label:`完整:额外附一份由工具注册表实时生成的参数索引`}]),ee=m(`prompt.extra`,`附加说明(永远追加在末尾,可放团队/个人规范)`,typeof b.extra==`string`?b.extra:``,5),te=m(`prompt.override`,`整段替换(非空时取代上面的内置文本,附加说明仍会追加)`,typeof b.override==`string`?b.override:``,8),ne=()=>c.some(e=>(e.key.startsWith(`prompt.`)||e.key===`wechat.enabled`)&&e.changed()),C=$(`button`,`dsh-tw-settings-btn`,`预览注入文本(按表单当前值)`);C.type=`button`,C.title=`按表单当前值渲染注入文本(不用先保存);点「保存配置」后这就是实际注入的内容`;let re=$(`pre`,`dsh-tw-settings-prompt-preview`);re.hidden=!0,C.addEventListener(`click`,()=>{if(!re.hidden){re.hidden=!0,re.textContent=``;return}C.disabled=!0,(async()=>{try{let e=await Eb(Nb(ie),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({enabled:x.checked,mode:S.value,extra:ee.value,override:te.value,wechat:y.checked})});if(e.ok!==!0)throw Error(e.error??`获取失败`);re.textContent=e.enabled===!1?`(已关闭:不会注入任何提示词)`:`# 形态 ${e.mode??``} · ${e.length??0} 字符${ne()?`(含未保存的修改,保存后才真正注入)`:``}\n\n${e.text??``}`,re.hidden=!1}catch(e){D(`读取提示词失败:${e instanceof Error?e.message:String(e)}`)}finally{C.disabled=!1}})()}),i.append(C,re);let w=t.bridge??{};d(`bridge.enabled`,`启用「本地剪藏桥」(书签小工具后端监听 127.0.0.1 端口,保存后立即生效)`,w.enabled===!0),f(`bridge.port`,`剪藏桥端口(整数 1–65535;改端口需重启 dsh web 生效)`,typeof w.port==`number`&&w.port>0?w.port:8618,{min:1,max:65535,step:1,integer:!0}),u(`bridge.token`,`剪藏桥 token(非空时校验书签的 x-clip-token 头;强烈建议设置。已设置时显示为 ********,原样保存=不改,清空=删除)`,typeof w.token==`string`?w.token:``),l(`bridge.tag`,`剪藏笔记默认 tag`,typeof w.tag==`string`&&w.tag.trim().length>0?w.tag.trim():`clip`);let T=Tb(r.saveError??``);T.hidden=r.saveError===void 0;let oe=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`保存配置`);oe.type=`button`,oe.addEventListener(`click`,()=>{oe.disabled=!0,(async()=>{let e=c.filter(e=>e.invalid?.()!==void 0);if(e.length>0){D(`有 ${e.length} 个字段填得不对(见字段旁的红色提示),未保存`),oe.disabled=!1;return}let t={};for(let e of c){if(!e.changed())continue;let n=e.key.split(`.`),r=t;for(let t=0;t<n.length;t++){let i=n[t];if(i===void 0)break;if(t===n.length-1)r[i]=e.read();else{let e=r[i]??{};r[i]=e,r=e}}}if(Object.keys(t).length===0){D(`没有改动`),oe.disabled=!1;return}try{await Eb(Nb(ae),{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),we(),r.saveError=void 0,T.hidden=!0,T.textContent=``,D(`配置已保存`),n()}catch(e){r.saveError=`保存失败:${e instanceof Error?e.message:String(e)}`,T.textContent=r.saveError,T.hidden=!1,n()}finally{oe.disabled=!1}})()}),r.isDirty=()=>c.some(e=>e.changed()),i.append(T,oe),e.append(i)}function Ab(e,t,n,r,i,a){let o=n?.plugins??[],s=n?.themes??[],c=n?.languages??[],l=t?.plugins??[],u=new Set(t?.themes??[]),d=t?.languages??[],f=()=>a.plugins??new Set(l),p=()=>a.themes??new Set(u),m=()=>a.languages??new Set(d),h=new Set(r?.disabled??[]),g=new Set((r?.wikiPlugins??[]).map(e=>e.title)),_=$(`section`,`dsh-tw-settings-section`);_.append($(`h3`,`dsh-tw-settings-h`,`插件管理(自带官方插件)`));let v=$(`div`,`dsh-tw-settings-muted`,`勾选 = 写入 tiddlywiki.info 的启动安装清单(离线、与引擎版本配套),应用后重启 TW。这里只管引擎自带插件;在 TW 控制面板里安装/禁用/卸载的插件见下方「wiki 内插件」。`);_.append(v);let y=$(`input`,`dsh-tw-settings-input dsh-tw-settings-search`);y.placeholder=`搜索插件…`;let b=$(`div`,`dsh-tw-settings-list`),x=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用插件(重启 TW)`);x.type=`button`;let S=()=>{x.disabled=a.plugins===void 0},ee=e=>{b.replaceChildren();let t=e.toLowerCase();for(let e of o){if(t.length>0&&!`${e.label} ${e.name} ${e.description}`.toLowerCase().includes(t))continue;let n=$(`input`,`dsh-tw-settings-check`);n.type=`checkbox`,n.checked=f().has(e.name),n.addEventListener(`change`,()=>{let t=f();n.checked?t.add(e.name):t.delete(e.name),a.plugins=t,S()});let i=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),o=$(`span`,`dsh-tw-settings-name`,e.label);o.title=e.name;let s=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);if(i.append(n,o),r!=null&&h.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`TW 内已禁用`);e.dataset.state=`disabled`,e.title=`该插件在 tiddlywiki.info 里,但已在 TW 控制面板被禁用($:/config/Plugins/Disabled)——去 TW 面板重新启用`,i.append(e)}else if(r!=null&&!l.includes(e.name)&&g.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`wiki 内已装`);e.dataset.state=`update`,e.title=`不在启动清单,但 wiki 里存在同名插件 tiddler(经 TW 原生安装),TW 运行时已在用`,i.append(e)}i.append(s),b.append(i)}};if(y.addEventListener(`input`,()=>ee(y.value)),x.addEventListener(`click`,()=>{a.plugins!==void 0&&(x.disabled=!0,(async()=>{try{await Eb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({plugins:[...f()]})}),a.plugins=void 0,D(`插件已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),S()}})())}),ee(``),S(),_.append(y,b,x),e.append(_),r!=null){let t=new Set(o.map(e=>e.title)),n=(r.wikiPlugins??[]).filter(e=>!t.has(e.title)||h.has(e.title));if(n.length>0){let t=$(`section`,`dsh-tw-settings-section`);t.append($(`h3`,`dsh-tw-settings-h`,`wiki 内插件(经 TW 原生安装,只读)`)),t.append($(`div`,`dsh-tw-settings-muted`,`下列插件以 tiddler 形式随 wiki 文件保存(TW 控制面板 → 插件 安装/导入),不受上面勾选影响。启用 / 禁用 / 卸载请到 TW 控制面板操作。`));let r=$(`div`,`dsh-tw-settings-list`);for(let e of n){let t=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`),n=$(`span`,`dsh-tw-settings-name`,e.name||e.title);if(n.title=e.title,t.append(n),h.has(e.title)){let e=$(`span`,`dsh-tw-settings-chip`,`已禁用`);e.dataset.state=`disabled`,e.title=`该插件已在 TW 控制面板被禁用`,t.append(e)}else if(e.version){let n=$(`span`,`dsh-tw-settings-chip`,`v${e.version}`);n.dataset.state=`ok`,t.append(n)}let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.title);i.title=e.title,t.append(i),r.append(t)}t.append(r),e.append(t)}}let te=$(`section`,`dsh-tw-settings-section`);te.append($(`h3`,`dsh-tw-settings-h`,`主题管理(自带主题)`));let ne=$(`div`,`dsh-tw-settings-muted`,`「加载」= TW 里可用的主题(可多选,依赖链自动带上,如 heavier 会带 snowwhite+vanilla);「活动」= 当前视觉主题(单选,自动加入加载集)。应用后重启 TW。`),C=$(`div`,`dsh-tw-settings-row dsh-tw-settings-head`);C.append($(`span`,`dsh-tw-settings-col`,`加载`),$(`span`,`dsh-tw-settings-col`,`活动`),$(`span`,`dsh-tw-settings-name`,`主题`));let re=t?.themes??[],ie=t?.themeActive,ae=re[re.length-1],T=typeof ie==`string`&&s.some(e=>e.name===ie)?ie:ae??`tiddlywiki/vanilla`,oe=()=>a.themeActive??T,se=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用主题(重启 TW)`);se.type=`button`;let ce=()=>{se.disabled=a.themes===void 0&&a.themeActive===void 0},le=$(`div`,`dsh-tw-settings-list`);for(let e of s){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=p().has(e.name),t.title=`加载该主题`,t.addEventListener(`change`,()=>{let n=p();t.checked?n.add(e.name):n.delete(e.name),a.themes=n,ce()});let n=$(`input`,`dsh-tw-settings-check`);n.type=`radio`,n.name=`dsh-tw-active-theme`,n.checked=e.name===oe(),n.title=`设为活动主题`,n.addEventListener(`change`,()=>{n.checked&&(a.themeActive=e.name),ce()});let r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name),o=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);o.append(t,n,r,i),le.append(o)}se.addEventListener(`click`,()=>{a.themes===void 0&&a.themeActive===void 0||(se.disabled=!0,(async()=>{try{await Eb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({themes:[...p()],themeActive:oe()})}),a.themes=void 0,a.themeActive=void 0,D(`主题已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),ce()}})())}),ce(),te.append(ne,C,le,se),e.append(te);let ue=$(`section`,`dsh-tw-settings-section`);ue.append($(`h3`,`dsh-tw-settings-h`,`语言管理(自带官方语言包)`));let de=$(`div`,`dsh-tw-settings-muted`,`勾选启用语言插件并重启 TW;如中文请选 zh-Hans(简体)或 zh-CN。`),fe=$(`div`,`dsh-tw-settings-list`),E=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`应用语言(重启 TW)`);E.type=`button`;let pe=()=>{E.disabled=a.languages===void 0};for(let e of c){let t=$(`input`,`dsh-tw-settings-check`);t.type=`checkbox`,t.checked=m().has(e.name),t.addEventListener(`change`,()=>{let n=m();t.checked?n.add(e.name):n.delete(e.name),a.languages=n,pe()});let n=$(`label`,`dsh-tw-settings-row dsh-tw-settings-plugin`),r=$(`span`,`dsh-tw-settings-name`,e.label);r.title=e.name;let i=$(`span`,`dsh-tw-settings-muted`,e.description||e.name);n.append(t,r,i),fe.append(n)}E.addEventListener(`click`,()=>{a.languages!==void 0&&(E.disabled=!0,(async()=>{try{await Eb(w,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({languages:[...m()]})}),a.languages=void 0,D(`语言已应用,TW 已重启`),i()}catch(e){D(`应用失败:${e instanceof Error?e.message:String(e)}`),pe()}})())}),pe(),ue.append(de,fe,E),e.append(ue)}function jb(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`知识库列表`));let i=$(`div`,`dsh-tw-settings-muted`,`读取中…`),a=$(`div`,`dsh-tw-settings-row`),o=$(`div`),s=$(`input`,`dsh-tw-settings-input`);s.placeholder=`根目录(绝对路径,如 D:\\notes)`;let c=$(`input`,`dsh-tw-settings-input`);c.placeholder=`文件夹名(如 books)`;let l=$(`input`,`dsh-tw-settings-input`);l.placeholder=`显示名(留空用文件夹名)`;let u=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`添加知识库`);u.type=`button`;let d=$(`div`,`dsh-tw-settings-row dsh-tw-settings-field`);d.append(s,c,l,u);let f=$(`div`,`dsh-tw-settings-muted`,`多库模式下每个知识库是一个独立的 TW 子进程(约 150MB):标了「开局自启」的随 DSH 一起起,其余在你打开或选中它时启动。对 Agent 隐身的库不进会话选择器,检索/工具也永远不碰它。`);r.append(i,a,o,d,f),e.append(r);let p=async(e,r)=>{i.textContent=r;try{let r=await Eb(fe,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(e),signal:AbortSignal.timeout(18e4)});if(t())return;let i=r.change?.errors??[];i.length>0&&D(`部分操作失败:${i.map(e=>`${e.id}:${e.message}`).join(`;`)}`),h(r),await n()}catch(e){if(t())return;D(`操作失败:${e instanceof Error?e.message:String(e)}`),await g()}},m=async(e,r,a)=>{i.textContent=a;try{let i=await Eb(e,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(r),signal:AbortSignal.timeout(18e4)});if(t())return;i.ok!==!0&&D(`失败:${i.error??`未知错误`}`),await g(),await n()}catch(e){if(t())return;D(`失败:${e instanceof Error?e.message:String(e)}`),await g()}},h=e=>{i.textContent=e.error!==void 0&&e.error.length>0?`⚠️ ${e.error}`:``,a.replaceChildren($(`span`,`dsh-tw-settings-label`,`运行模式:`));for(let[t,n]of[[`single`,`单库(只跑默认库)`],[`multi`,`多库(清单里的库都可用)`]]){let r=e.mode===t,i=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn${r?` dsh-tw-settings-primary`:``}`,n);i.type=`button`,i.disabled=r,i.addEventListener(`click`,()=>{window.confirm(t===`multi`?`切换到多库模式:清单里标了「开局自启」的知识库都会启动(每个库一个 TW 子进程)。继续?`:`切换到单库模式:除默认库外的知识库会被停掉(内容与清单都不受影响)。继续?`)&&p({action:`set-mode`,mode:t},`切换模式中…`)}),a.append(i)}o.replaceChildren();let t=e.wikis??[];for(let r of t){let i=$(`div`,`dsh-tw-settings-kbrow`),a=r.id===e.defaultId;i.append($(`div`,`dsh-tw-settings-label`,`${a?`★ `:``}${r.label}(${r.id})`)),i.append($(`div`,`dsh-tw-settings-muted`,[r.running?`运行中`:`未运行`,r.agentVisible?`Agent 可见`:`Agent 隐身`,r.autostart?`开局自启`:`按需启动`,r.path].join(` · `)));let s=$(`div`,`dsh-tw-settings-row`),c=Mb===r.id,l=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn${c?` dsh-tw-settings-primary`:``}`,c?`正在配置`:`配置`);l.type=`button`,l.disabled=c,l.addEventListener(`click`,()=>{Mb=r.id,n()});let u=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.running?`停止`:`启动`);u.type=`button`,u.addEventListener(`click`,()=>{p({action:r.running?`stop`:`start`,id:r.id},r.running?`停止中…`:`启动中…`)});let d=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`设为默认`);d.type=`button`,d.disabled=a,d.addEventListener(`click`,()=>{p({action:`set-default`,id:r.id},`保存中…`)});let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.agentVisible?`对 Agent 隐身`:`对 Agent 可见`);f.type=`button`,f.addEventListener(`click`,()=>{p({action:`update`,wiki:{...r,agentVisible:!r.agentVisible}},`保存中…`)});let h=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,r.autostart?`取消开局自启`:`开局自启`);h.type=`button`,h.addEventListener(`click`,()=>{p({action:`update`,wiki:{...r,autostart:!r.autostart}},`保存中…`)});let g=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`移出列表`);if(g.type=`button`,g.disabled=t.length<=1,g.addEventListener(`click`,()=>{window.confirm(`把「${r.label}」移出清单?\n\n**目录与内容不会被删除**(仍在 ${r.path}),只是插件不再管理它。`)&&p({action:`remove`,id:r.id},`移出中…`)}),e.mode===`multi`){let e=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,`改目录`);e.type=`button`,e.addEventListener(`click`,()=>{let e=window.prompt(`把「${r.label}」的根目录换成?\n\n当前:${r.root}`,r.root);if(e===null)return;if(e.trim().length===0){D(`根目录不能为空`);return}let t=window.prompt(`文件夹名(当前:${r.name};填 . 表示直接用上面这个根目录)`,r.name);if(t===null)return;let n={root:e.trim(),name:t.trim().length>0?t.trim():r.name};a?m(ue,n,`搬动中(会停/起这个库)…`):p({action:`update`,wiki:{...r,...n}},`保存中…`)}),s.append(e)}s.append(l,u,d,f,h,g),i.append(s),o.append(i)}s.value.length===0&&typeof t[0]?.root==`string`&&(s.value=t[0].root)};u.addEventListener(`click`,()=>{let e=s.value.trim(),t=c.value.trim();if(e.length===0||t.length===0){D(`请填写根目录与文件夹名`);return}let n={root:e,name:t},r=l.value.trim();r.length>0&&(n.label=r),p({action:`add`,wiki:n},`添加中(新库需要初始化与冷启动,请稍候)…`)});let g=async()=>{if(!t())try{let e=await Eb(fe);if(t())return;h(e)}catch(e){if(t())return;i.textContent=`读取知识库列表失败:${e instanceof Error?e.message:String(e)}`}};g()}let Mb;function Nb(e){return Mb===void 0?e:`${e}?wiki=${encodeURIComponent(Mb)}`}function Pb(e,t,n){(async()=>{try{let e=await Eb(fe);if(t()||e.mode===`multi`)return}catch{}t()||Fb(e,t,n)})()}function Fb(e,t,n){let r=$(`section`,`dsh-tw-settings-section`);r.append($(`h3`,`dsh-tw-settings-h`,`知识库位置(可切换)`));let i=$(`div`,`dsh-tw-settings-muted`,`读取中…`),a=$(`div`,`dsh-tw-settings-muted`),o=$(`div`,`dsh-tw-settings-muted`),s=$(`div`,`dsh-tw-settings-muted`),c=$(`input`,`dsh-tw-settings-input`),l=$(`input`,`dsh-tw-settings-input`);c.placeholder=`绝对路径,如 D:\\notes 或 $DSH_HOME/tiddlywiki`,l.placeholder=`文件夹名(默认 main;填 . 表示直接用上面这个目录)`;let u=$(`label`,`dsh-tw-settings-field`);u.append($(`span`,`dsh-tw-settings-label`,`根目录(wikiRoot)`),c);let d=$(`label`,`dsh-tw-settings-field`);d.append($(`span`,`dsh-tw-settings-label`,`文件夹名(wiki)`),l);let f=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`切换到这个位置`);f.type=`button`;let p=$(`button`,`dsh-tw-settings-btn`,`恢复为配置默认`);p.type=`button`;let m=$(`div`,`dsh-tw-settings-row`);m.append(f,p);let h=$(`div`,`dsh-tw-settings-row dsh-tw-settings-candidates`),g=$(`div`,`dsh-tw-settings-muted`,"切换会停掉并就地重启 TW 子进程(几秒);新目录若还没有 tiddlywiki.info,插件会自动 `--init server` 初始化一个全新知识库。选中的位置会记在 $DSH_HOME 下的指针文件里(不进 wiki),可用「恢复为配置默认」清除。"),_=(e,t)=>{f.disabled=e,p.disabled=e,f.textContent=e?t:`切换到这个位置`},v=async()=>{if(!t())try{let e=await Eb(le);if(t())return;if(e.ok!==!0)throw Error(e.error??`获取失败`);let n=e.current??{};i.textContent=`当前:${n.path??`(未知)`}`;let r=n.source===`state`?`来源:指针文件(在设置页切换过)`:n.source===`config`?`来源:cordis 配置(config.wikiRoot / config.wiki)`:`来源:默认值($DSH_HOME/tiddlywiki + main)`;a.textContent=`${r} · 配置默认:${e.default?.path??`(未知)`}`,o.textContent=e.stateFile===void 0?``:`指针文件:${e.stateFile}(不存在=使用配置默认)`,s.textContent=e.error===void 0?``:`⚠️ ${e.error}`,c.value.length===0&&typeof n.root==`string`&&(c.value=n.root),l.value.length===0&&typeof n.name==`string`&&(l.value=n.name),h.replaceChildren();let u=e.candidates??[];if(u.length>0){h.append($(`span`,`dsh-tw-settings-label`,`同目录下可选的 wiki:`));for(let e of u){let t=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-chipbtn`,e===`.`?`(根目录本身)`:e);t.type=`button`,t.title=`填入文件夹名「${e}」`,t.addEventListener(`click`,()=>{l.value=e}),h.append(t)}}}catch(e){if(t())return;i.textContent=`读取位置失败:${e instanceof Error?e.message:String(e)}`}};f.addEventListener(`click`,()=>{let e=c.value.trim(),t=l.value.trim().length>0?l.value.trim():`main`;if(e.length===0){D(`请先填写根目录(绝对路径)`);return}window.confirm(`切换知识库到:\n${e}\\${t}\n\n会停止并重启 TW 子进程;当前对话/工具随后读写的是新知识库。确定继续?`)&&(_(!0,`切换中…(重启 TW)`),(async()=>{try{let r=await Eb(ue,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({root:e,name:t}),signal:AbortSignal.timeout(12e4)});r.warning===void 0?D(`已切换到 ${r.path??``}`):D(`已切换到 ${r.path??``}(注意:${r.warning})`),we(),await v(),await n()}catch(e){D(`切换失败:${e instanceof Error?e.message:String(e)}`),await v()}finally{_(!1,``)}})())}),p.addEventListener(`click`,()=>{window.confirm(`恢复为配置默认位置?会删除位置指针文件,并(必要时)切回配置里的知识库。`)&&(_(!0,`切换中…(重启 TW)`),(async()=>{try{let e=await Eb(de,{method:`POST`,headers:{"content-type":`application/json`},body:`{}`,signal:AbortSignal.timeout(12e4)});D(e.warning===void 0?`已恢复为配置默认:${e.path??``}`:`已恢复默认(注意:${e.warning})`),we(),await v(),await n()}catch(e){D(`恢复失败:${e instanceof Error?e.message:String(e)}`),await v()}finally{_(!1,``)}})())}),r.append(i,a,o,u,d,m,h,s,g),e.append(r),v()}function Ib(e,t){let n=$(`section`,`dsh-tw-settings-section`);n.append($(`h3`,`dsh-tw-settings-h`,`初始化(一次性预置)`));let r=$(`div`,`dsh-tw-settings-muted`,`这些是插件与 dsh 联动、需要在 wiki 里预置的 tiddler/配置。「发送给 Agent 按钮」和「TW 前端 API 基址」是功能必需项,启动时自动写入(只写缺失,不覆盖你的改动);其余为可选项,默认不自动写入、也不会强绑定——需要时点「重新初始化」写入,不想要了可随时「反初始化」移除。`),i=$(`div`,`dsh-tw-settings-list`),a=$(`div`,`dsh-tw-settings-muted`),o=async()=>{if(!t())try{let e=await Eb(oe);if(t())return;if(e.ok!==!0||!Array.isArray(e.items))throw Error(e.error??`获取失败`);i.replaceChildren();let n=0,r=0;for(let t of e.items){t.present&&(n+=1),t.removable&&(r+=1);let e=$(`span`,`dsh-tw-settings-chip`,t.present?`✓`:`✗`);e.dataset.state=t.present?`ok`:`missing`,e.title=t.present?`已存在`:`缺失`;let a=$(`span`,`dsh-tw-settings-name`,t.title);a.title=t.id;let s=$(`span`,`dsh-tw-settings-muted`,t.detail??t.description),c=t.updateAvailable===!0?$(`span`,`dsh-tw-settings-chip`,`⬆ 有更新`):void 0;c!==void 0&&(c.dataset.state=`update`,c.title=`内置内容在本 wiki 预置之后更新过,可点「重新初始化」取用`);let l=t.userModified===!0?$(`span`,`dsh-tw-settings-chip`,`✏️ 本地已修改`):void 0;l!==void 0&&(l.dataset.state=`missing`,l.title=`这篇是你的内容:重新初始化会覆盖它`);let u=$(`button`,`dsh-tw-settings-btn`,t.updateAvailable===!0?`更新到内置版本`:`重新初始化`);u.type=`button`,u.title=`强制重写「${t.title}」的内置内容(会覆盖当前 tiddler)`,u.addEventListener(`click`,()=>{if(t.updateAvailable===!0){let e=t.userModified===!0?`「${t.title}」有你的本地修改,更新会覆盖它。`:t.userModified===void 0?`无法确认「${t.title}」是否被你编辑过(旧格式标记),更新可能覆盖你的改动。`:``;if(!window.confirm(`${e}${e.length>0?`
810
824
 
811
- `:``}用内置版本覆盖?`))return}u.disabled=!0,u.textContent=`执行中…`,(async()=>{try{let e=await fetch(se,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id,force:!0}),signal:AbortSignal.timeout(3e4)}),n=await e.json().catch(()=>null);!e.ok||n?.ok!==!0?D(`重新初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):D(`已重新初始化「${t.title}」`),o()}catch(e){D(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{u.disabled=!1,u.textContent=t.updateAvailable===!0?`更新到内置版本`:`重新初始化`}})()});let d=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);if(d.append(e,a),c!==void 0&&d.append(c),l!==void 0&&d.append(l),d.append(s,u),t.removable){let e=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`反初始化`);e.type=`button`,e.title=`移除「${t.title}」写入的 tiddler 与 marker(恢复未初始化状态)`,e.addEventListener(`click`,()=>{window.confirm(`确定反初始化「${t.title}」?将删除它写入的 tiddler(含其一次性 marker),需要时可用「重新初始化」恢复。`)&&(e.disabled=!0,e.textContent=`移除中…`,(async()=>{try{let e=await fetch(ce,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id}),signal:AbortSignal.timeout(3e4)}),n=await e.json().catch(()=>null);!e.ok||n?.ok!==!0?D(`反初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):D(`已反初始化「${t.title}」`),o()}catch(e){D(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{e.disabled=!1,e.textContent=`反初始化`}})())}),d.append(e)}i.append(d)}a.textContent=`共 ${e.items.length} 项,${n} 项已就绪;可移除 ${r} 项`}catch(e){if(t())return;a.textContent=`加载初始化状态失败:${e instanceof Error?e.message:String(e)}`}},s=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`全部重新初始化`);s.type=`button`,s.title=`强制重写所有一次性预置内容(含可选 seed,会覆盖当前 tiddler/配置)`,s.addEventListener(`click`,()=>{s.disabled=!0,s.textContent=`执行中…`,(async()=>{try{let e=await fetch(se,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({force:!0}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?D(`重新初始化失败:${t?.error??`HTTP ${e.status}`}`):D(`全部已重新初始化`),o()}catch(e){D(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{s.disabled=!1,s.textContent=`全部重新初始化`}})()});let c=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`全部反初始化`);c.type=`button`,c.title=`移除所有可选 seed 写入的 tiddler 与 marker(功能必需项保留)`,c.addEventListener(`click`,()=>{window.confirm(`确定全部反初始化?将删除所有可选 seed 写入的 tiddler(含一次性 marker)。功能必需项(发送给 Agent 按钮 / TW 前端 API 基址)会保留。`)&&(c.disabled=!0,c.textContent=`移除中…`,(async()=>{try{let e=await fetch(ce,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?D(`反初始化失败:${t?.error??`HTTP ${e.status}`}`):D(`全部可选 seed 已反初始化`),o()}catch(e){D(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`全部反初始化`}})())}),n.append(r,a,i,s,c),e.append(n),o()}function Ib(e,t,n,r,i,a){e.replaceChildren(),typeof t.configError==`string`&&t.configError.length>0&&e.append(wb(`⚠️ 配置未生效:${t.configError}`));let o=JSON.stringify(t.config??{}),s=i.host!==void 0&&i.signature!==o,c=i.isDirty?.()===!0;if(s&&c&&e.append(wb(`⚠️ 服务器上的配置在别处被改动过(另一个标签页保存 / 语言管理等),当前表单仍是旧值:直接点「保存配置」会以本页内容覆盖那些改动。`)),i.host===void 0||s&&!c){let e=$(`div`,`dsh-tw-settings-confighost`);Ob(e,t.config??{},n,i),i.host=e,i.signature=o}e.append($(`div`,`dsh-tw-settings-muted`,jb===void 0?`配置作用域:默认知识库(在「知识库列表」里点某行的「配置」可切到那个库)`:`配置作用域:${jb}(在「知识库列表」里改;编辑的是该库自己的配置 tiddler)`)),e.append(i.host),Ab(e,r,n),Nb(e,r,n),kb(e,t.info,t.catalog,t.runtimePlugins,n,a),Fb(e,r)}function Lb(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:Eb(t)},[]),c.createElement(`div`,{ref:e})}const Rb={tiddlywiki_get:`读取笔记`,tiddlywiki_search:`检索笔记`,tiddlywiki_recent:`最近修改`,tiddlywiki_list_tags:`标签列表`,tiddlywiki_put:`写入笔记`,tiddlywiki_batch_put:`批量写入`,tiddlywiki_append:`增量写入`,tiddlywiki_rename:`重命名笔记`,tiddlywiki_delete:`删除笔记`,tiddlywiki_trash:`回收站`,tiddlywiki_backlinks:`反向链接`,tiddlywiki_attach:`保存附件`,tiddlywiki_lint:`知识库体检`,tiddlywiki_git_sync:`git 同步`,tiddlywiki_git_resolve:`git 冲突解决`};function zb(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function Bb(e){if(typeof e!=`object`||!e)return null;let t=e;if(typeof t.call==`object`&&t.call!==null){let e=t.call;if(typeof e.name==`string`&&typeof e.argsRaw==`string`)return e}let n=e;return typeof n.name==`string`&&typeof n.argsRaw==`string`?{name:n.name,argsRaw:n.argsRaw}:null}function Vb(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function Hb(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
812
- `):``}function Ub(e){return typeof e==`string`?e:``}async function Wb(e){try{let t=await fetch(e,{signal:AbortSignal.timeout(1e4)});if(t.status===404){let e=await t.json().catch(()=>null);return typeof e==`object`&&e?e:{notFound:!0}}if(!t.ok)return null;let n=await t.json();return typeof n==`object`&&n?n:null}catch{return null}}async function Gb(e){return yb(e,1e4)}function Kb(e,t){let[n,r]=c.useState({loading:!0,data:null});return c.useEffect(()=>{let t=!0;return r({loading:!0,data:null}),Promise.resolve(e()).then(e=>{t&&r({loading:!1,data:e})},()=>{t&&r({loading:!1,data:null})}),()=>{t=!1}},t),n}function qb(e){return t=>{t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||(t.preventDefault(),t.stopPropagation(),Dt(e))}}function Jb(e){let t=Rb[e.toolName]??e.toolName,n=c.createElement(`div`,{className:`dsh-tw-toolcard-head`},c.createElement(`span`,{className:`dsh-tw-toolcard-badge`},t),e.title!==void 0&&e.title.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-title`,title:e.title},e.title):null,e.onOpen===void 0?null:c.createElement(`button`,{type:`button`,className:`dsh-tw-toolcard-open`,onClick:e.onOpen},`在 TW 打开`)),r=e.subtitle!==void 0||e.tags!==void 0&&e.tags.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-meta`},e.subtitle===void 0?null:c.createElement(`span`,{className:`dsh-tw-toolcard-sub`},e.subtitle),e.tags!==void 0&&e.tags.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-tags`},...e.tags.map((e,t)=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:`${t}-${e}`},e))):null):null;return c.createElement(`div`,{className:`dsh-tw-toolcard`},n,r,c.createElement(`div`,{className:`dsh-tw-toolcard-body`},e.children),e.foot!==void 0&&e.foot!==null?c.createElement(`div`,{className:`dsh-tw-toolcard-foot`},e.foot):null)}const Yb=new Map;function Xb(e){let t=Yb.get(e);if(t!==void 0){if(Date.now()-t.at>3e5){Yb.delete(e);return}return Yb.delete(e),Yb.set(e,t),t}}function Zb(e,t){for(Yb.delete(e),Yb.set(e,{at:Date.now(),...t});Yb.size>50;){let e=Yb.keys().next().value;if(e===void 0)break;Yb.delete(e)}}function Qb(e){e.length>0&&Yb.delete(e)}function $b(e){let t=e.join(`\0`);c.useEffect(()=>{for(let e of t.split(`\0`))Qb(e)},[t])}function ex(e){let{title:t,fresh:n}=e,{loading:r,data:i}=Kb(async()=>{n===!0&&Qb(t);let e=Xb(t);if(e!==void 0)return{get:e.get,html:e.html};let[r,i]=await Promise.all([Wb(`${g}?title=${encodeURIComponent(t)}`),Gb(t)]);return typeof i==`string`&&i.length>0&&Zb(t,{get:r,html:i}),{get:r,html:i}},[t,n]),a=i?.get??null,o=i?.html??null,s;s=r?c.createElement(`div`,{className:`dsh-tw-toolcard-loading`},`渲染中…`):a!==null&&a.notFound===!0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`tiddler「${t}」不存在`):typeof o==`string`&&o.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-native`,dangerouslySetInnerHTML:{__html:o}}):a!==null&&typeof a.text==`string`&&a.text.length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},a.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`wiki 服务不可用`);let l=Array.isArray(a?.tags)?a.tags.filter(e=>typeof e==`string`):[],u=typeof a?.modified==`string`?a.modified:void 0;return c.createElement(Jb,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:l,onOpen:qb(t),foot:u===void 0?void 0:`修改于 ${u}`},s)}function tx(e){let t=c.createElement(`span`,{className:`dsh-tw-toolcard-row-head`},c.createElement(`span`,{className:`dsh-tw-toolcard-row-title`},e.title),e.tags!==void 0&&e.tags.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-row-tags`},e.tags.slice(0,4).join(` · `)):null,typeof e.modified==`string`&&e.modified.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-row-meta`},e.modified):null),n=typeof e.snippet==`string`&&e.snippet.trim().length>0?e.snippet:null;return c.createElement(`a`,{className:`dsh-tw-toolcard-row`,href:`${m}#${encodeURIComponent(e.title)}`,onClick:qb(e.title),title:n===null?e.title:`${e.title}\n${n}`},t,n===null?null:c.createElement(`span`,{className:`dsh-tw-toolcard-row-snippet`},n))}function nx(e){let t=e.rows.slice(0,60),n;return n=t.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},e.fallbackText):c.createElement(`div`,{className:`dsh-tw-toolcard-list`},...t.map((e,t)=>c.createElement(tx,{key:`${e.title}-${t}`,...e}))),c.createElement(Jb,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function rx(e){let t=/工作区\s+(ws\/[^\s((]+)/.exec(e);if(t===null||t[1]===void 0)return null;let n=t[1].slice(3);return n.length>0?n:null}function ix(e){let t=Ub(e.args.query),n=new URLSearchParams;if(t.length>0&&n.set(`query`,t),Array.isArray(e.args.tags))for(let t of e.args.tags)typeof t==`string`&&t.length>0&&n.append(`tags`,t);typeof e.args.tag==`string`&&e.args.tag.length>0&&n.set(`tag`,e.args.tag),typeof e.args.since==`string`&&e.args.since.length>0&&n.set(`since`,e.args.since),typeof e.args.type==`string`&&e.args.type.length>0&&n.set(`type`,e.args.type),typeof e.args.field==`string`&&e.args.field.length>0&&n.set(`field`,e.args.field),typeof e.args.value==`string`&&e.args.value.length>0&&n.set(`value`,e.args.value),typeof e.args.limit==`number`&&n.set(`limit`,String(e.args.limit));let r=rx(e.text);r!==null&&n.set(`workspace`,r);let i=n.toString(),a=Kb(()=>Wb(`${S}?${i}`),[i]).data,o=(Array.isArray(a?.items)?a.items:[]).map(e=>({title:Ub(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null,snippet:typeof e.snippet==`string`?e.snippet:``})),s=typeof a?.total==`number`?a.total:void 0,l=typeof a?.workspace==`string`&&a.workspace.length>0?a.workspace:null,u=``;l!==null&&a?.scope===`workspace`?u=` · 已在工作区 ws/${l} 内缩小范围`:l!==null&&a?.fellBack===!0&&(u=` · 工作区 ws/${l} 内 0 条,已扩大到全库`);let d=`关键词「${t||`(全部)`}」${s===void 0?``:` · 共 ${s} 条`}${u}`;return c.createElement(nx,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:d,rows:o,fallbackText:`没有匹配的笔记`})}function ax(e){let t=e.title.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`附件已保存进 wiki(二进制条目,卡片不内联渲染)。`):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`附件已保存。`);return c.createElement(Jb,{toolName:e.toolName,title:e.title.length>0?e.title:void 0,...e.title.length>0?{onOpen:qb(e.title)}:{}},t)}function ox(e){let t=new URLSearchParams;typeof e.args.limit==`number`&&t.set(`limit`,String(e.args.limit)),typeof e.args.since==`string`&&e.args.since.length>0&&t.set(`since`,e.args.since);let n=t.toString(),r=Kb(()=>Wb(`${x}?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:Ub(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null,snippet:typeof e.snippet==`string`?e.snippet:``}));return c.createElement(nx,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function sx(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?Ub(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return $b(t.map(e=>e.title)),c.createElement(nx,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function cx(e){let t=Kb(()=>Wb(`${b}?limit=60&sort=count`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:Ub(e.tag),count:typeof e.count==`number`?e.count:0})),r=n.slice(0,60),i=typeof t?.total==`number`?t.total:n.length,a;return a=n.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`暂无标签`):c.createElement(`div`,{className:`dsh-tw-toolcard-tags-wrap`},...r.map(e=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:e.tag},`${e.tag} · ${e.count}`)),...i>r.length?[c.createElement(`span`,{className:`dsh-tw-toolcard-tag-more`,key:`__more`},`…另有 ${i-r.length} 个`)]:[]),c.createElement(Jb,{toolName:e.toolName,title:`标签`,subtitle:`共 ${i} 个`},a)}function lx(e){let t=e.text.trim().length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},e.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`(无结果)`);return c.createElement(Jb,{toolName:e.toolName},t)}function ux(e){$b([e.title]);let t=e.title.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`已删除 tiddler「${e.title}」`):c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},e.text||`(已删除)`);return c.createElement(Jb,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function dx(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_append`:case`tiddlywiki_delete`:case`tiddlywiki_attach`:case`tiddlywiki_backlinks`:return Ub(t.title);case`tiddlywiki_rename`:return Ub(t.newTitle);case`tiddlywiki_search`:return Ub(t.query);default:return``}}function fx(e){let t=e.block,n=e.toolName,r=zb(t),i=Bb(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=Vb(i?.argsRaw??``),s=r?Hb(t.content):``;if(i===null)return c.createElement(Jb,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(Jb,{toolName:a,title:dx(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(Jb,{toolName:a,title:dx(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement(ex,{toolName:a,title:Ub(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement(ex,{toolName:a,title:Ub(o.title),subtitle:`已写入`,fresh:!0});case`tiddlywiki_append`:return c.createElement(ex,{toolName:a,title:Ub(o.title),subtitle:`已增量写入`,fresh:!0});case`tiddlywiki_rename`:return c.createElement(ex,{toolName:a,title:Ub(o.newTitle),subtitle:`已重命名「${Ub(o.oldTitle)}」→`,fresh:!0});case`tiddlywiki_delete`:return c.createElement(ux,{toolName:a,title:Ub(o.title),text:s});case`tiddlywiki_attach`:return c.createElement(ax,{toolName:a,title:Ub(o.title)});case`tiddlywiki_batch_put`:return c.createElement(sx,{toolName:a,args:o});case`tiddlywiki_search`:return c.createElement(ix,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(ox,{toolName:a,args:o});case`tiddlywiki_list_tags`:return c.createElement(cx,{toolName:a});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement(lx,{toolName:a,text:s});default:return c.createElement(Jb,{toolName:a,title:dx(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const px=[`tiddlywiki_get`,`tiddlywiki_search`,`tiddlywiki_recent`,`tiddlywiki_list_tags`,`tiddlywiki_put`,`tiddlywiki_batch_put`,`tiddlywiki_append`,`tiddlywiki_rename`,`tiddlywiki_delete`,`tiddlywiki_trash`,`tiddlywiki_backlinks`,`tiddlywiki_attach`,`tiddlywiki_lint`,`tiddlywiki_git_sync`,`tiddlywiki_git_resolve`];function mx(e){let t=[];for(let n of px)try{let r=e.inject(`tool.call.toolview`,()=>e.register({name:`tool.call.toolview`,id:`dsh-tiddlywiki-toolview-${n}`,key:n,order:20,label:`TiddlyWiki: ${n}`},fx));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function hx(){let e=e=>{if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`a`);if(n===null)return;let r=n.getAttribute(`href`)??``,i=null;try{let e=new URL(r,window.location.origin);e.origin===window.location.origin&&e.pathname===m&&e.hash.length>1&&(i=e.hash.substring(1))}catch{}if(i!==null){e.preventDefault(),e.stopPropagation();try{i=decodeURIComponent(i)}catch{}Dt(i)}};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const gx=`dsh-tiddlywiki`,_x=`dsh-tiddlywiki/rightbar`;function vx(e){let{useTabInfo:t}=e,n=t().tab,r=c.useRef(null),i=c.useRef(null);c.useEffect(()=>{let e=r.current;if(e===null)return;let t=yt(e,n.signal);return i.current=t,()=>{t.dispose(),i.current=null}},[n.id,n.signal]),c.useEffect(()=>{i.current?.setVisible(n.visible)},[n.visible]);let a=n.visible,o=n.actions.close;return c.useEffect(()=>{if(!a)return;document.dispatchEvent(new CustomEvent(at,{detail:_x}));let e=e=>{e.detail!==_x&&o()};return document.addEventListener(at,e),()=>document.removeEventListener(at,e)},[a,o]),c.createElement(`div`,{ref:r,className:`dsh-tw-rightbar-tab`})}function yx(){return{id:gx,kind:`dsh-tiddlywiki`,title:()=>lt(),guide:[{order:10,title:()=>`TiddlyWiki 知识库`,description:()=>`在右侧边栏打开 TiddlyWiki 编辑器(与聊天并排)`,icon:dt}]}}function bx(e,t){let n=[];try{n.push(e.register(yx()));let r=t.inject(`sidebar.right.pane.tab`,()=>t.register({name:`sidebar.right.pane.tab`,key:gx},vx));r!==void 0&&n.push(r)}catch(e){for(let e of n.splice(0))e();console.error(`[dsh-tiddlywiki] rightbar tab mount failed:`,e);return}return _t(),()=>{for(let e of n.splice(0))e()}}const xx=[`slots`];function Sx(e){try{let t=[],n=!1,r=()=>{n=!0;for(let e of t.splice(0))e()},i=(e,t)=>{try{t()}catch(t){console.error(`[dsh-tiddlywiki] ${e} failed:`,t)}};i(`styles`,()=>t.push(d()));let a=new f,o,s;if(i(`quick-note widget`,()=>{o=cb(),t.push(()=>o?.dispose())}),i(`sync controller`,()=>{s=fb(),t.push(()=>s?.dispose())}),i(`sidebar entry`,()=>t.push(Ae(a))),i(`center panel`,()=>t.push(At(a))),o!==void 0&&s!==void 0){let e=o,n=s;i(`knowledge FAB`,()=>t.push(gb(a,e,n)))}i(`editor popup`,()=>t.push(Vt)),i(`wiki scope dock`,()=>{let n=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`wiki-scope`,order:4,label:`知识库作用域`},vb()));n!==void 0&&t.push(n)}),e.slots!==void 0&&Te().then(r=>{if(n)return;let a=o;r.showQuickNoteDock&&a!==void 0&&i(`quick-note dock`,()=>{let n=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`quick-note`,order:8,label:`快速笔记`},_b(a)));n!==void 0&&t.push(n)}),i(`session summary tab`,()=>{let n=Cb(e.slots,r);n!==void 0&&t.push(n)})}).catch(e=>{console.error(`[dsh-tiddlywiki] ui config load failed:`,e)}),i(`rightbar mount`,()=>{let r,i=a=>{let o=e.get?.(`sidebarRightTabs`);if(o===void 0){a<6&&!n&&(r=window.setTimeout(()=>i(a+1),500*(a+1)));return}Te().then(r=>{if(n||!r.showRightbarTab)return;let i=bx(o,e.slots);i!==void 0&&t.push(i)}).catch(e=>{console.error(`[dsh-tiddlywiki] rightbar config load failed:`,e)})};t.push(()=>{r!==void 0&&window.clearTimeout(r)}),i(0)}),i(`tool views`,()=>{e.slots!==void 0&&t.push(...mx(e.slots))}),i(`wiki link interceptor`,()=>t.push(hx())),i(`settings section`,()=>{let n=e.slots?.inject(`settings.section`,()=>e.slots?.register({name:`settings.section`,id:`dsh-tiddlywiki`,order:50,label:`TiddlyWiki 知识库`},Lb));n!==void 0&&t.push(n)}),e.effect===void 0?window.addEventListener(`pagehide`,r,{once:!0}):e.effect(()=>r,`dsh-tiddlywiki: client mount`)}catch(e){console.error(`[dsh-tiddlywiki] client half failed to start:`,e)}}exports.apply=Sx,exports.inject=xx,exports.name=`dsh-tiddlywiki/client`;
825
+ `:``}用内置版本覆盖?`))return}u.disabled=!0,u.textContent=`执行中…`,(async()=>{try{let e=await fetch(se,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id,force:!0}),signal:AbortSignal.timeout(3e4)}),n=await e.json().catch(()=>null);!e.ok||n?.ok!==!0?D(`重新初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):D(`已重新初始化「${t.title}」`),o()}catch(e){D(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{u.disabled=!1,u.textContent=t.updateAvailable===!0?`更新到内置版本`:`重新初始化`}})()});let d=$(`div`,`dsh-tw-settings-row dsh-tw-settings-plugin`);if(d.append(e,a),c!==void 0&&d.append(c),l!==void 0&&d.append(l),d.append(s,u),t.removable){let e=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`反初始化`);e.type=`button`,e.title=`移除「${t.title}」写入的 tiddler 与 marker(恢复未初始化状态)`,e.addEventListener(`click`,()=>{window.confirm(`确定反初始化「${t.title}」?将删除它写入的 tiddler(含其一次性 marker),需要时可用「重新初始化」恢复。`)&&(e.disabled=!0,e.textContent=`移除中…`,(async()=>{try{let e=await fetch(ce,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({id:t.id}),signal:AbortSignal.timeout(3e4)}),n=await e.json().catch(()=>null);!e.ok||n?.ok!==!0?D(`反初始化失败:${n?.error??n?.results?.[0]?.error??`HTTP ${e.status}`}`):D(`已反初始化「${t.title}」`),o()}catch(e){D(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{e.disabled=!1,e.textContent=`反初始化`}})())}),d.append(e)}i.append(d)}a.textContent=`共 ${e.items.length} 项,${n} 项已就绪;可移除 ${r} 项`}catch(e){if(t())return;a.textContent=`加载初始化状态失败:${e instanceof Error?e.message:String(e)}`}},s=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-primary`,`全部重新初始化`);s.type=`button`,s.title=`强制重写所有一次性预置内容(含可选 seed,会覆盖当前 tiddler/配置)`,s.addEventListener(`click`,()=>{s.disabled=!0,s.textContent=`执行中…`,(async()=>{try{let e=await fetch(se,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({force:!0}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?D(`重新初始化失败:${t?.error??`HTTP ${e.status}`}`):D(`全部已重新初始化`),o()}catch(e){D(`重新初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{s.disabled=!1,s.textContent=`全部重新初始化`}})()});let c=$(`button`,`dsh-tw-settings-btn dsh-tw-settings-danger`,`全部反初始化`);c.type=`button`,c.title=`移除所有可选 seed 写入的 tiddler 与 marker(功能必需项保留)`,c.addEventListener(`click`,()=>{window.confirm(`确定全部反初始化?将删除所有可选 seed 写入的 tiddler(含一次性 marker)。功能必需项(发送给 Agent 按钮 / TW 前端 API 基址)会保留。`)&&(c.disabled=!0,c.textContent=`移除中…`,(async()=>{try{let e=await fetch(ce,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({}),signal:AbortSignal.timeout(6e4)}),t=await e.json().catch(()=>null);!e.ok||t?.ok!==!0?D(`反初始化失败:${t?.error??`HTTP ${e.status}`}`):D(`全部可选 seed 已反初始化`),o()}catch(e){D(`反初始化失败:${e instanceof Error?e.message:String(e)}`)}finally{c.disabled=!1,c.textContent=`全部反初始化`}})())}),n.append(r,a,i,s,c),e.append(n),o()}function Lb(e,t,n,r,i,a){e.replaceChildren(),typeof t.configError==`string`&&t.configError.length>0&&e.append(Tb(`⚠️ 配置未生效:${t.configError}`));let o=JSON.stringify(t.config??{}),s=i.host!==void 0&&i.signature!==o,c=i.isDirty?.()===!0;if(s&&c&&e.append(Tb(`⚠️ 服务器上的配置在别处被改动过(另一个标签页保存 / 语言管理等),当前表单仍是旧值:直接点「保存配置」会以本页内容覆盖那些改动。`)),i.host===void 0||s&&!c){let e=$(`div`,`dsh-tw-settings-confighost`);kb(e,t.config??{},n,i),i.host=e,i.signature=o}e.append($(`div`,`dsh-tw-settings-muted`,Mb===void 0?`配置作用域:默认知识库(在「知识库列表」里点某行的「配置」可切到那个库)`:`配置作用域:${Mb}(在「知识库列表」里改;编辑的是该库自己的配置 tiddler)`)),e.append(i.host),jb(e,r,n),Pb(e,r,n),Ab(e,t.info,t.catalog,t.runtimePlugins,n,a),Ib(e,r)}function Rb(){let e=c.useRef(null);return c.useEffect(()=>{let t=e.current;return t===null?void 0:Db(t)},[]),c.createElement(`div`,{ref:e})}const zb={tiddlywiki_get:`读取笔记`,tiddlywiki_search:`检索笔记`,tiddlywiki_recent:`最近修改`,tiddlywiki_list_tags:`标签列表`,tiddlywiki_put:`写入笔记`,tiddlywiki_batch_put:`批量写入`,tiddlywiki_append:`增量写入`,tiddlywiki_rename:`重命名笔记`,tiddlywiki_delete:`删除笔记`,tiddlywiki_trash:`回收站`,tiddlywiki_backlinks:`反向链接`,tiddlywiki_attach:`保存附件`,tiddlywiki_lint:`知识库体检`,tiddlywiki_git_sync:`git 同步`,tiddlywiki_git_resolve:`git 冲突解决`};function Bb(e){return typeof e==`object`&&!!e&&e.kind===`tool-result`}function Vb(e){if(typeof e!=`object`||!e)return null;let t=e;if(typeof t.call==`object`&&t.call!==null){let e=t.call;if(typeof e.name==`string`&&typeof e.argsRaw==`string`)return e}let n=e;return typeof n.name==`string`&&typeof n.argsRaw==`string`?{name:n.name,argsRaw:n.argsRaw}:null}function Hb(e){try{let t=JSON.parse(e);return typeof t==`object`&&t&&!Array.isArray(t)?t:{}}catch{return{}}}function Ub(e){return Array.isArray(e)?e.filter(e=>typeof e?.text==`string`).map(e=>e.text).join(`
826
+ `):``}function Wb(e){return typeof e==`string`?e:``}async function Gb(e){try{let t=await fetch(e,{signal:AbortSignal.timeout(1e4)});if(t.status===404){let e=await t.json().catch(()=>null);return typeof e==`object`&&e?e:{notFound:!0}}if(!t.ok)return null;let n=await t.json();return typeof n==`object`&&n?n:null}catch{return null}}async function Kb(e){return bb(e,1e4)}function qb(e,t){let[n,r]=c.useState({loading:!0,data:null});return c.useEffect(()=>{let t=!0;return r({loading:!0,data:null}),Promise.resolve(e()).then(e=>{t&&r({loading:!1,data:e})},()=>{t&&r({loading:!1,data:null})}),()=>{t=!1}},t),n}function Jb(e){return t=>{t.defaultPrevented||t.button!==0||t.metaKey||t.ctrlKey||t.shiftKey||t.altKey||(t.preventDefault(),t.stopPropagation(),Dt(e))}}function Yb(e){let t=zb[e.toolName]??e.toolName,n=c.createElement(`div`,{className:`dsh-tw-toolcard-head`},c.createElement(`span`,{className:`dsh-tw-toolcard-badge`},t),e.title!==void 0&&e.title.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-title`,title:e.title},e.title):null,e.onOpen===void 0?null:c.createElement(`button`,{type:`button`,className:`dsh-tw-toolcard-open`,onClick:e.onOpen},`在 TW 打开`)),r=e.subtitle!==void 0||e.tags!==void 0&&e.tags.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-meta`},e.subtitle===void 0?null:c.createElement(`span`,{className:`dsh-tw-toolcard-sub`},e.subtitle),e.tags!==void 0&&e.tags.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-tags`},...e.tags.map((e,t)=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:`${t}-${e}`},e))):null):null;return c.createElement(`div`,{className:`dsh-tw-toolcard`},n,r,c.createElement(`div`,{className:`dsh-tw-toolcard-body`},e.children),e.foot!==void 0&&e.foot!==null?c.createElement(`div`,{className:`dsh-tw-toolcard-foot`},e.foot):null)}const Xb=new Map;function Zb(e){let t=Xb.get(e);if(t!==void 0){if(Date.now()-t.at>3e5){Xb.delete(e);return}return Xb.delete(e),Xb.set(e,t),t}}function Qb(e,t){for(Xb.delete(e),Xb.set(e,{at:Date.now(),...t});Xb.size>50;){let e=Xb.keys().next().value;if(e===void 0)break;Xb.delete(e)}}function $b(e){e.length>0&&Xb.delete(e)}function ex(e){let t=e.join(`\0`);c.useEffect(()=>{for(let e of t.split(`\0`))$b(e)},[t])}function tx(e){let{title:t,fresh:n}=e,{loading:r,data:i}=qb(async()=>{n===!0&&$b(t);let e=Zb(t);if(e!==void 0)return{get:e.get,html:e.html};let[r,i]=await Promise.all([Gb(`${g}?title=${encodeURIComponent(t)}`),Kb(t)]);return typeof i==`string`&&i.length>0&&Qb(t,{get:r,html:i}),{get:r,html:i}},[t,n]),a=i?.get??null,o=i?.html??null,s;s=r?c.createElement(`div`,{className:`dsh-tw-toolcard-loading`},`渲染中…`):a!==null&&a.notFound===!0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`tiddler「${t}」不存在`):typeof o==`string`&&o.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-native`,dangerouslySetInnerHTML:{__html:o}}):a!==null&&typeof a.text==`string`&&a.text.length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},a.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`wiki 服务不可用`);let l=Array.isArray(a?.tags)?a.tags.filter(e=>typeof e==`string`):[],u=typeof a?.modified==`string`?a.modified:void 0;return c.createElement(Yb,{toolName:e.toolName,title:t,subtitle:e.subtitle,tags:l,onOpen:Jb(t),foot:u===void 0?void 0:`修改于 ${u}`},s)}function nx(e){let t=c.createElement(`span`,{className:`dsh-tw-toolcard-row-head`},c.createElement(`span`,{className:`dsh-tw-toolcard-row-title`},e.title),e.tags!==void 0&&e.tags.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-row-tags`},e.tags.slice(0,4).join(` · `)):null,typeof e.modified==`string`&&e.modified.length>0?c.createElement(`span`,{className:`dsh-tw-toolcard-row-meta`},e.modified):null),n=typeof e.snippet==`string`&&e.snippet.trim().length>0?e.snippet:null;return c.createElement(`a`,{className:`dsh-tw-toolcard-row`,href:`${m}#${encodeURIComponent(e.title)}`,onClick:Jb(e.title),title:n===null?e.title:`${e.title}\n${n}`},t,n===null?null:c.createElement(`span`,{className:`dsh-tw-toolcard-row-snippet`},n))}function rx(e){let t=e.rows.slice(0,60),n;return n=t.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},e.fallbackText):c.createElement(`div`,{className:`dsh-tw-toolcard-list`},...t.map((e,t)=>c.createElement(nx,{key:`${e.title}-${t}`,...e}))),c.createElement(Yb,{toolName:e.toolName,title:e.title,subtitle:e.subtitle},n)}function ix(e){let t=/工作区\s+(ws\/[^\s((]+)/.exec(e);if(t===null||t[1]===void 0)return null;let n=t[1].slice(3);return n.length>0?n:null}function ax(e){let t=Wb(e.args.query),n=new URLSearchParams;if(t.length>0&&n.set(`query`,t),Array.isArray(e.args.tags))for(let t of e.args.tags)typeof t==`string`&&t.length>0&&n.append(`tags`,t);typeof e.args.tag==`string`&&e.args.tag.length>0&&n.set(`tag`,e.args.tag),typeof e.args.since==`string`&&e.args.since.length>0&&n.set(`since`,e.args.since),typeof e.args.type==`string`&&e.args.type.length>0&&n.set(`type`,e.args.type),typeof e.args.field==`string`&&e.args.field.length>0&&n.set(`field`,e.args.field),typeof e.args.value==`string`&&e.args.value.length>0&&n.set(`value`,e.args.value),typeof e.args.limit==`number`&&n.set(`limit`,String(e.args.limit));let r=ix(e.text);r!==null&&n.set(`workspace`,r);let i=n.toString(),a=qb(()=>Gb(`${S}?${i}`),[i]).data,o=(Array.isArray(a?.items)?a.items:[]).map(e=>({title:Wb(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null,snippet:typeof e.snippet==`string`?e.snippet:``})),s=typeof a?.total==`number`?a.total:void 0,l=typeof a?.workspace==`string`&&a.workspace.length>0?a.workspace:null,u=``;l!==null&&a?.scope===`workspace`?u=` · 已在工作区 ws/${l} 内缩小范围`:l!==null&&a?.fellBack===!0&&(u=` · 工作区 ws/${l} 内 0 条,已扩大到全库`);let d=`关键词「${t||`(全部)`}」${s===void 0?``:` · 共 ${s} 条`}${u}`;return c.createElement(rx,{toolName:e.toolName,title:t.length>0?t:`检索`,subtitle:d,rows:o,fallbackText:`没有匹配的笔记`})}function ox(e){let t=e.title.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`附件已保存进 wiki(二进制条目,卡片不内联渲染)。`):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`附件已保存。`);return c.createElement(Yb,{toolName:e.toolName,title:e.title.length>0?e.title:void 0,...e.title.length>0?{onOpen:Jb(e.title)}:{}},t)}function sx(e){let t=new URLSearchParams;typeof e.args.limit==`number`&&t.set(`limit`,String(e.args.limit)),typeof e.args.since==`string`&&e.args.since.length>0&&t.set(`since`,e.args.since);let n=t.toString(),r=qb(()=>Gb(`${x}?${n}`),[n]).data,i=(Array.isArray(r?.items)?r.items:[]).map(e=>({title:Wb(e.title),tags:Array.isArray(e.tags)?e.tags.filter(e=>typeof e==`string`):[],modified:typeof e.modified==`string`?e.modified:null,snippet:typeof e.snippet==`string`?e.snippet:``}));return c.createElement(rx,{toolName:e.toolName,title:`最近修改`,subtitle:i.length>0?`最近 ${i.length} 条`:``,rows:i,fallbackText:`暂无笔记`})}function cx(e){let t=(Array.isArray(e.args.items)?e.args.items:[]).map(e=>typeof e==`object`&&e&&typeof e.title==`string`?Wb(e.title):null).filter(e=>e!==null&&e.length>0).map(e=>({title:e}));return ex(t.map(e=>e.title)),c.createElement(rx,{toolName:e.toolName,title:`批量写入`,subtitle:t.length>0?`写入 ${t.length} 篇`:`(参数中没有可解析的 items)`,rows:t,fallbackText:`没有可展示的笔记`})}function lx(e){let t=qb(()=>Gb(`${b}?limit=60&sort=count`),[]).data,n=(Array.isArray(t?.items)?t.items:[]).map(e=>({tag:Wb(e.tag),count:typeof e.count==`number`?e.count:0})),r=n.slice(0,60),i=typeof t?.total==`number`?t.total:n.length,a;return a=n.length===0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`暂无标签`):c.createElement(`div`,{className:`dsh-tw-toolcard-tags-wrap`},...r.map(e=>c.createElement(`span`,{className:`dsh-tw-toolcard-tag`,key:e.tag},`${e.tag} · ${e.count}`)),...i>r.length?[c.createElement(`span`,{className:`dsh-tw-toolcard-tag-more`,key:`__more`},`…另有 ${i-r.length} 个`)]:[]),c.createElement(Yb,{toolName:e.toolName,title:`标签`,subtitle:`共 ${i} 个`},a)}function ux(e){let t=e.text.trim().length>0?c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},e.text):c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`(无结果)`);return c.createElement(Yb,{toolName:e.toolName},t)}function dx(e){ex([e.title]);let t=e.title.length>0?c.createElement(`div`,{className:`dsh-tw-toolcard-empty`},`已删除 tiddler「${e.title}」`):c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},e.text||`(已删除)`);return c.createElement(Yb,{toolName:e.toolName,title:e.title.length>0?e.title:void 0},t)}function fx(e,t){switch(e){case`tiddlywiki_get`:case`tiddlywiki_put`:case`tiddlywiki_append`:case`tiddlywiki_delete`:case`tiddlywiki_attach`:case`tiddlywiki_backlinks`:return Wb(t.title);case`tiddlywiki_rename`:return Wb(t.newTitle);case`tiddlywiki_search`:return Wb(t.query);default:return``}}function px(e){let t=e.block,n=e.toolName,r=Bb(t),i=Vb(t),a=n!==void 0&&n.length>0?n:i?.name??``,o=Hb(i?.argsRaw??``),s=r?Ub(t.content):``;if(i===null)return c.createElement(Yb,{toolName:a},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(无调用信息)`));if(!r)return c.createElement(Yb,{toolName:a,title:fx(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-pending`},`处理中…`));if(t.isError===!0)return c.createElement(Yb,{toolName:a,title:fx(a,o)},c.createElement(`div`,{className:`dsh-tw-toolcard-error`},s||`工具调用失败`));switch(a){case`tiddlywiki_get`:return c.createElement(tx,{toolName:a,title:Wb(o.title),subtitle:`读取`});case`tiddlywiki_put`:return c.createElement(tx,{toolName:a,title:Wb(o.title),subtitle:`已写入`,fresh:!0});case`tiddlywiki_append`:return c.createElement(tx,{toolName:a,title:Wb(o.title),subtitle:`已增量写入`,fresh:!0});case`tiddlywiki_rename`:return c.createElement(tx,{toolName:a,title:Wb(o.newTitle),subtitle:`已重命名「${Wb(o.oldTitle)}」→`,fresh:!0});case`tiddlywiki_delete`:return c.createElement(dx,{toolName:a,title:Wb(o.title),text:s});case`tiddlywiki_attach`:return c.createElement(ox,{toolName:a,title:Wb(o.title)});case`tiddlywiki_batch_put`:return c.createElement(cx,{toolName:a,args:o});case`tiddlywiki_search`:return c.createElement(ax,{toolName:a,args:o,text:s});case`tiddlywiki_recent`:return c.createElement(sx,{toolName:a,args:o});case`tiddlywiki_list_tags`:return c.createElement(lx,{toolName:a});case`tiddlywiki_git_sync`:case`tiddlywiki_git_resolve`:return c.createElement(ux,{toolName:a,text:s});default:return c.createElement(Yb,{toolName:a,title:fx(a,o)},c.createElement(`pre`,{className:`dsh-tw-toolcard-fallback`},s||`(完成)`))}}const mx=[`tiddlywiki_get`,`tiddlywiki_search`,`tiddlywiki_recent`,`tiddlywiki_list_tags`,`tiddlywiki_put`,`tiddlywiki_batch_put`,`tiddlywiki_append`,`tiddlywiki_rename`,`tiddlywiki_delete`,`tiddlywiki_trash`,`tiddlywiki_backlinks`,`tiddlywiki_attach`,`tiddlywiki_lint`,`tiddlywiki_git_sync`,`tiddlywiki_git_resolve`];function hx(e){let t=[];for(let n of mx)try{let r=e.inject(`tool.call.toolview`,()=>e.register({name:`tool.call.toolview`,id:`dsh-tiddlywiki-toolview-${n}`,key:n,order:20,label:`TiddlyWiki: ${n}`},px));r!==void 0&&t.push(r)}catch(e){console.error(`[dsh-tiddlywiki] register toolview ${n} failed:`,e)}return t}function gx(){let e=e=>{if(e.defaultPrevented||e.button!==0||e.metaKey||e.ctrlKey||e.shiftKey||e.altKey)return;let t=e.target;if(!(t instanceof Element))return;let n=t.closest(`a`);if(n===null)return;let r=n.getAttribute(`href`)??``,i=null;try{let e=new URL(r,window.location.origin);e.origin===window.location.origin&&e.pathname===m&&e.hash.length>1&&(i=e.hash.substring(1))}catch{}if(i!==null){e.preventDefault(),e.stopPropagation();try{i=decodeURIComponent(i)}catch{}Dt(i)}};return document.addEventListener(`click`,e,!0),()=>document.removeEventListener(`click`,e,!0)}const _x=`dsh-tiddlywiki`,vx=`dsh-tiddlywiki/rightbar`;function yx(e){let{useTabInfo:t}=e,n=t().tab,r=c.useRef(null),i=c.useRef(null);c.useEffect(()=>{let e=r.current;if(e===null)return;let t=yt(e,n.signal);return i.current=t,()=>{t.dispose(),i.current=null}},[n.id,n.signal]),c.useEffect(()=>{i.current?.setVisible(n.visible)},[n.visible]);let a=n.visible,o=n.actions.close;return c.useEffect(()=>{if(!a)return;document.dispatchEvent(new CustomEvent(at,{detail:vx}));let e=e=>{e.detail!==vx&&o()};return document.addEventListener(at,e),()=>document.removeEventListener(at,e)},[a,o]),c.createElement(`div`,{ref:r,className:`dsh-tw-rightbar-tab`})}function bx(){return{id:_x,kind:`dsh-tiddlywiki`,title:()=>lt(),guide:[{order:10,title:()=>`TiddlyWiki 知识库`,description:()=>`在右侧边栏打开 TiddlyWiki 编辑器(与聊天并排)`,icon:dt}]}}function xx(e,t){let n=[];try{n.push(e.register(bx()));let r=t.inject(`sidebar.right.pane.tab`,()=>t.register({name:`sidebar.right.pane.tab`,key:_x},yx));r!==void 0&&n.push(r)}catch(e){for(let e of n.splice(0))e();console.error(`[dsh-tiddlywiki] rightbar tab mount failed:`,e);return}return _t(),()=>{for(let e of n.splice(0))e()}}const Sx=[`slots`];function Cx(e){try{let t=[],n=!1,r=()=>{n=!0;for(let e of t.splice(0))e()},i=(e,t)=>{try{t()}catch(t){console.error(`[dsh-tiddlywiki] ${e} failed:`,t)}};i(`styles`,()=>t.push(d()));let a=new f,o,s;if(i(`quick-note widget`,()=>{o=cb(),t.push(()=>o?.dispose())}),i(`sync controller`,()=>{s=fb(),t.push(()=>s?.dispose())}),i(`sidebar entry`,()=>t.push(Re(a))),i(`center panel`,()=>t.push(At(a))),o!==void 0&&s!==void 0){let e=o,n=s;i(`knowledge FAB`,()=>t.push(gb(a,e,n)))}i(`editor popup`,()=>t.push(Vt)),i(`wiki scope dock`,()=>{let n=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`wiki-scope`,order:4,label:`知识库作用域`},yb()));n!==void 0&&t.push(n)}),e.slots!==void 0&&Te().then(r=>{if(n)return;let a=o;r.showQuickNoteDock&&a!==void 0&&i(`quick-note dock`,()=>{let n=e.slots?.inject(`conversation.input.dock`,()=>e.slots?.register({name:`conversation.input.dock`,id:`quick-note`,order:8,label:`快速笔记`},vb(a)));n!==void 0&&t.push(n)}),i(`session summary tab`,()=>{let n=wb(e.slots,r);n!==void 0&&t.push(n)})}).catch(e=>{console.error(`[dsh-tiddlywiki] ui config load failed:`,e)}),i(`rightbar mount`,()=>{let r,i=a=>{let o=e.get?.(`sidebarRightTabs`);if(o===void 0){a<6&&!n&&(r=window.setTimeout(()=>i(a+1),500*(a+1)));return}Te().then(r=>{if(n||!r.showRightbarTab)return;let i=xx(o,e.slots);i!==void 0&&t.push(i)}).catch(e=>{console.error(`[dsh-tiddlywiki] rightbar config load failed:`,e)})};t.push(()=>{r!==void 0&&window.clearTimeout(r)}),i(0)}),i(`tool views`,()=>{e.slots!==void 0&&t.push(...hx(e.slots))}),i(`wiki link interceptor`,()=>t.push(gx())),i(`settings section`,()=>{let n=e.slots?.inject(`settings.section`,()=>e.slots?.register({name:`settings.section`,id:`dsh-tiddlywiki`,order:50,label:`TiddlyWiki 知识库`},Rb));n!==void 0&&t.push(n)}),e.effect===void 0?window.addEventListener(`pagehide`,r,{once:!0}):e.effect(()=>r,`dsh-tiddlywiki: client mount`)}catch(e){console.error(`[dsh-tiddlywiki] client half failed to start:`,e)}}exports.apply=Cx,exports.inject=Sx,exports.name=`dsh-tiddlywiki/client`;
813
827
  return module.exports;
814
828
  }
815
829
  });